From fbd197146a5f99af0bf127cb93537bba2b2272b7 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 1 Apr 2020 20:48:32 +0200 Subject: [PATCH 001/653] Add MQTT debug info for remaining MQTT integrations (#33506) --- .../components/mqtt/alarm_control_panel.py | 2 ++ homeassistant/components/mqtt/binary_sensor.py | 2 ++ homeassistant/components/mqtt/camera.py | 2 ++ homeassistant/components/mqtt/climate.py | 12 ++++++++++++ homeassistant/components/mqtt/cover.py | 8 ++++++-- homeassistant/components/mqtt/fan.py | 4 ++++ .../components/mqtt/light/schema_basic.py | 9 +++++++++ .../components/mqtt/light/schema_json.py | 2 ++ .../components/mqtt/light/schema_template.py | 2 ++ homeassistant/components/mqtt/lock.py | 2 ++ homeassistant/components/mqtt/switch.py | 2 ++ .../components/mqtt/vacuum/schema_legacy.py | 2 ++ .../components/mqtt/vacuum/schema_state.py | 2 ++ .../mqtt/test_alarm_control_panel.py | 8 ++++++++ tests/components/mqtt/test_binary_sensor.py | 8 ++++++++ tests/components/mqtt/test_camera.py | 8 ++++++++ tests/components/mqtt/test_climate.py | 15 +++++++++++++++ tests/components/mqtt/test_cover.py | 8 ++++++++ tests/components/mqtt/test_fan.py | 8 ++++++++ tests/components/mqtt/test_legacy_vacuum.py | 18 ++++++++++++++++++ tests/components/mqtt/test_light.py | 8 ++++++++ tests/components/mqtt/test_light_json.py | 8 ++++++++ tests/components/mqtt/test_light_template.py | 8 ++++++++ tests/components/mqtt/test_lock.py | 8 ++++++++ tests/components/mqtt/test_state_vacuum.py | 8 ++++++++ tests/components/mqtt/test_switch.py | 8 ++++++++ 26 files changed, 170 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mqtt/alarm_control_panel.py b/homeassistant/components/mqtt/alarm_control_panel.py index 043fa62f6eff..09f735c72a06 100644 --- a/homeassistant/components/mqtt/alarm_control_panel.py +++ b/homeassistant/components/mqtt/alarm_control_panel.py @@ -41,6 +41,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -167,6 +168,7 @@ class MqttAlarm( command_template.hass = self.hass @callback + @log_messages(self.hass, self.entity_id) def message_received(msg): """Run when new MQTT message has been received.""" payload = msg.payload diff --git a/homeassistant/components/mqtt/binary_sensor.py b/homeassistant/components/mqtt/binary_sensor.py index d268c12aa877..c7595de0eebb 100644 --- a/homeassistant/components/mqtt/binary_sensor.py +++ b/homeassistant/components/mqtt/binary_sensor.py @@ -37,6 +37,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -155,6 +156,7 @@ class MqttBinarySensor( self.async_write_ha_state() @callback + @log_messages(self.hass, self.entity_id) def state_message_received(msg): """Handle a new received MQTT state message.""" payload = msg.payload diff --git a/homeassistant/components/mqtt/camera.py b/homeassistant/components/mqtt/camera.py index a75ae33f8619..1bfb248d94ad 100644 --- a/homeassistant/components/mqtt/camera.py +++ b/homeassistant/components/mqtt/camera.py @@ -21,6 +21,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -116,6 +117,7 @@ class MqttCamera( """(Re)Subscribe to topics.""" @callback + @log_messages(self.hass, self.entity_id) def message_received(msg): """Handle new MQTT messages.""" self._last_image = msg.payload diff --git a/homeassistant/components/mqtt/climate.py b/homeassistant/components/mqtt/climate.py index 46404de0c8a7..0216302c6515 100644 --- a/homeassistant/components/mqtt/climate.py +++ b/homeassistant/components/mqtt/climate.py @@ -60,6 +60,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -384,6 +385,7 @@ class MqttClimate( return template(msg.payload) @callback + @log_messages(self.hass, self.entity_id) def handle_action_received(msg): """Handle receiving action via MQTT.""" payload = render_template(msg, CONF_ACTION_TEMPLATE) @@ -405,6 +407,7 @@ class MqttClimate( _LOGGER.error("Could not parse temperature from %s", payload) @callback + @log_messages(self.hass, self.entity_id) def handle_current_temperature_received(msg): """Handle current temperature coming via MQTT.""" handle_temperature_received( @@ -416,6 +419,7 @@ class MqttClimate( ) @callback + @log_messages(self.hass, self.entity_id) def handle_target_temperature_received(msg): """Handle target temperature coming via MQTT.""" handle_temperature_received(msg, CONF_TEMP_STATE_TEMPLATE, "_target_temp") @@ -425,6 +429,7 @@ class MqttClimate( ) @callback + @log_messages(self.hass, self.entity_id) def handle_temperature_low_received(msg): """Handle target temperature low coming via MQTT.""" handle_temperature_received( @@ -436,6 +441,7 @@ class MqttClimate( ) @callback + @log_messages(self.hass, self.entity_id) def handle_temperature_high_received(msg): """Handle target temperature high coming via MQTT.""" handle_temperature_received( @@ -458,6 +464,7 @@ class MqttClimate( self.async_write_ha_state() @callback + @log_messages(self.hass, self.entity_id) def handle_current_mode_received(msg): """Handle receiving mode via MQTT.""" handle_mode_received( @@ -467,6 +474,7 @@ class MqttClimate( add_subscription(topics, CONF_MODE_STATE_TOPIC, handle_current_mode_received) @callback + @log_messages(self.hass, self.entity_id) def handle_fan_mode_received(msg): """Handle receiving fan mode via MQTT.""" handle_mode_received( @@ -479,6 +487,7 @@ class MqttClimate( add_subscription(topics, CONF_FAN_MODE_STATE_TOPIC, handle_fan_mode_received) @callback + @log_messages(self.hass, self.entity_id) def handle_swing_mode_received(msg): """Handle receiving swing mode via MQTT.""" handle_mode_received( @@ -514,6 +523,7 @@ class MqttClimate( self.async_write_ha_state() @callback + @log_messages(self.hass, self.entity_id) def handle_away_mode_received(msg): """Handle receiving away mode via MQTT.""" handle_onoff_mode_received(msg, CONF_AWAY_MODE_STATE_TEMPLATE, "_away") @@ -521,6 +531,7 @@ class MqttClimate( add_subscription(topics, CONF_AWAY_MODE_STATE_TOPIC, handle_away_mode_received) @callback + @log_messages(self.hass, self.entity_id) def handle_aux_mode_received(msg): """Handle receiving aux mode via MQTT.""" handle_onoff_mode_received(msg, CONF_AUX_STATE_TEMPLATE, "_aux") @@ -528,6 +539,7 @@ class MqttClimate( add_subscription(topics, CONF_AUX_STATE_TOPIC, handle_aux_mode_received) @callback + @log_messages(self.hass, self.entity_id) def handle_hold_mode_received(msg): """Handle receiving hold mode via MQTT.""" payload = render_template(msg, CONF_HOLD_STATE_TEMPLATE) diff --git a/homeassistant/components/mqtt/cover.py b/homeassistant/components/mqtt/cover.py index a7a396781928..3081c1d0d9ff 100644 --- a/homeassistant/components/mqtt/cover.py +++ b/homeassistant/components/mqtt/cover.py @@ -49,6 +49,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -268,7 +269,8 @@ class MqttCover( topics = {} @callback - def tilt_updated(msg): + @log_messages(self.hass, self.entity_id) + def tilt_message_received(msg): """Handle tilt updates.""" payload = msg.payload if tilt_status_template is not None: @@ -287,6 +289,7 @@ class MqttCover( self.async_write_ha_state() @callback + @log_messages(self.hass, self.entity_id) def state_message_received(msg): """Handle new MQTT state messages.""" payload = msg.payload @@ -311,6 +314,7 @@ class MqttCover( self.async_write_ha_state() @callback + @log_messages(self.hass, self.entity_id) def position_message_received(msg): """Handle new MQTT state messages.""" payload = msg.payload @@ -354,7 +358,7 @@ class MqttCover( self._tilt_value = STATE_UNKNOWN topics["tilt_status_topic"] = { "topic": self._config.get(CONF_TILT_STATUS_TOPIC), - "msg_callback": tilt_updated, + "msg_callback": tilt_message_received, "qos": self._config[CONF_QOS], } diff --git a/homeassistant/components/mqtt/fan.py b/homeassistant/components/mqtt/fan.py index b50bdf9734bb..ec7c729d5976 100644 --- a/homeassistant/components/mqtt/fan.py +++ b/homeassistant/components/mqtt/fan.py @@ -40,6 +40,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -249,6 +250,7 @@ class MqttFan( templates[key] = tpl.async_render_with_possible_json_value @callback + @log_messages(self.hass, self.entity_id) def state_received(msg): """Handle new received MQTT message.""" payload = templates[CONF_STATE](msg.payload) @@ -266,6 +268,7 @@ class MqttFan( } @callback + @log_messages(self.hass, self.entity_id) def speed_received(msg): """Handle new received MQTT message for the speed.""" payload = templates[ATTR_SPEED](msg.payload) @@ -288,6 +291,7 @@ class MqttFan( self._speed = SPEED_OFF @callback + @log_messages(self.hass, self.entity_id) def oscillation_received(msg): """Handle new received MQTT message for the oscillation.""" payload = templates[OSCILLATION](msg.payload) diff --git a/homeassistant/components/mqtt/light/schema_basic.py b/homeassistant/components/mqtt/light/schema_basic.py index 4b47014af486..e6a7f827f1e2 100644 --- a/homeassistant/components/mqtt/light/schema_basic.py +++ b/homeassistant/components/mqtt/light/schema_basic.py @@ -51,6 +51,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.restore_state import RestoreEntity import homeassistant.util.color as color_util +from ..debug_info import log_messages from .schema import MQTT_LIGHT_SCHEMA_SCHEMA _LOGGER = logging.getLogger(__name__) @@ -292,6 +293,7 @@ class MqttLight( last_state = await self.async_get_last_state() @callback + @log_messages(self.hass, self.entity_id) def state_received(msg): """Handle new MQTT messages.""" payload = templates[CONF_STATE](msg.payload) @@ -315,6 +317,7 @@ class MqttLight( self._state = last_state.state == STATE_ON @callback + @log_messages(self.hass, self.entity_id) def brightness_received(msg): """Handle new MQTT messages for the brightness.""" payload = templates[CONF_BRIGHTNESS](msg.payload) @@ -346,6 +349,7 @@ class MqttLight( self._brightness = None @callback + @log_messages(self.hass, self.entity_id) def rgb_received(msg): """Handle new MQTT messages for RGB.""" payload = templates[CONF_RGB](msg.payload) @@ -377,6 +381,7 @@ class MqttLight( self._hs = (0, 0) @callback + @log_messages(self.hass, self.entity_id) def color_temp_received(msg): """Handle new MQTT messages for color temperature.""" payload = templates[CONF_COLOR_TEMP](msg.payload) @@ -406,6 +411,7 @@ class MqttLight( self._color_temp = None @callback + @log_messages(self.hass, self.entity_id) def effect_received(msg): """Handle new MQTT messages for effect.""" payload = templates[CONF_EFFECT](msg.payload) @@ -435,6 +441,7 @@ class MqttLight( self._effect = None @callback + @log_messages(self.hass, self.entity_id) def hs_received(msg): """Handle new MQTT messages for hs color.""" payload = templates[CONF_HS](msg.payload) @@ -466,6 +473,7 @@ class MqttLight( self._hs = (0, 0) @callback + @log_messages(self.hass, self.entity_id) def white_value_received(msg): """Handle new MQTT messages for white value.""" payload = templates[CONF_WHITE_VALUE](msg.payload) @@ -497,6 +505,7 @@ class MqttLight( self._white_value = None @callback + @log_messages(self.hass, self.entity_id) def xy_received(msg): """Handle new MQTT messages for xy color.""" payload = templates[CONF_XY](msg.payload) diff --git a/homeassistant/components/mqtt/light/schema_json.py b/homeassistant/components/mqtt/light/schema_json.py index 0af5aaf2c76e..924559e3e904 100644 --- a/homeassistant/components/mqtt/light/schema_json.py +++ b/homeassistant/components/mqtt/light/schema_json.py @@ -54,6 +54,7 @@ from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.typing import ConfigType import homeassistant.util.color as color_util +from ..debug_info import log_messages from .schema import MQTT_LIGHT_SCHEMA_SCHEMA from .schema_basic import CONF_BRIGHTNESS_SCALE @@ -234,6 +235,7 @@ class MqttLightJson( last_state = await self.async_get_last_state() @callback + @log_messages(self.hass, self.entity_id) def state_received(msg): """Handle new MQTT messages.""" values = json.loads(msg.payload) diff --git a/homeassistant/components/mqtt/light/schema_template.py b/homeassistant/components/mqtt/light/schema_template.py index cd3e704f624a..25de6862bdb6 100644 --- a/homeassistant/components/mqtt/light/schema_template.py +++ b/homeassistant/components/mqtt/light/schema_template.py @@ -45,6 +45,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.restore_state import RestoreEntity import homeassistant.util.color as color_util +from ..debug_info import log_messages from .schema import MQTT_LIGHT_SCHEMA_SCHEMA _LOGGER = logging.getLogger(__name__) @@ -215,6 +216,7 @@ class MqttTemplate( last_state = await self.async_get_last_state() @callback + @log_messages(self.hass, self.entity_id) def state_received(msg): """Handle new MQTT messages.""" state = self._templates[ diff --git a/homeassistant/components/mqtt/lock.py b/homeassistant/components/mqtt/lock.py index 89f005b74694..378f1b8fbcb6 100644 --- a/homeassistant/components/mqtt/lock.py +++ b/homeassistant/components/mqtt/lock.py @@ -29,6 +29,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -156,6 +157,7 @@ class MqttLock( value_template.hass = self.hass @callback + @log_messages(self.hass, self.entity_id) def message_received(msg): """Handle new MQTT messages.""" payload = msg.payload diff --git a/homeassistant/components/mqtt/switch.py b/homeassistant/components/mqtt/switch.py index 32066c67b7ac..bc1f4a038b42 100644 --- a/homeassistant/components/mqtt/switch.py +++ b/homeassistant/components/mqtt/switch.py @@ -34,6 +34,7 @@ from . import ( MqttEntityDeviceInfo, subscription, ) +from .debug_info import log_messages from .discovery import MQTT_DISCOVERY_NEW, clear_discovery_hash _LOGGER = logging.getLogger(__name__) @@ -162,6 +163,7 @@ class MqttSwitch( template.hass = self.hass @callback + @log_messages(self.hass, self.entity_id) def state_message_received(msg): """Handle new MQTT state messages.""" payload = msg.payload diff --git a/homeassistant/components/mqtt/vacuum/schema_legacy.py b/homeassistant/components/mqtt/vacuum/schema_legacy.py index 7679b97d62e4..687fefa94e21 100644 --- a/homeassistant/components/mqtt/vacuum/schema_legacy.py +++ b/homeassistant/components/mqtt/vacuum/schema_legacy.py @@ -32,6 +32,7 @@ from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.icon import icon_for_battery_level +from ..debug_info import log_messages from .schema import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services _LOGGER = logging.getLogger(__name__) @@ -280,6 +281,7 @@ class MqttVacuum( tpl.hass = self.hass @callback + @log_messages(self.hass, self.entity_id) def message_received(msg): """Handle new MQTT message.""" if ( diff --git a/homeassistant/components/mqtt/vacuum/schema_state.py b/homeassistant/components/mqtt/vacuum/schema_state.py index 126a2432cb09..cbaf8d43a77e 100644 --- a/homeassistant/components/mqtt/vacuum/schema_state.py +++ b/homeassistant/components/mqtt/vacuum/schema_state.py @@ -45,6 +45,7 @@ from homeassistant.const import ( from homeassistant.core import callback import homeassistant.helpers.config_validation as cv +from ..debug_info import log_messages from .schema import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services _LOGGER = logging.getLogger(__name__) @@ -246,6 +247,7 @@ class MqttStateVacuum( topics = {} @callback + @log_messages(self.hass, self.entity_id) def state_message_received(msg): """Handle state MQTT message.""" payload = msg.payload diff --git a/tests/components/mqtt/test_alarm_control_panel.py b/tests/components/mqtt/test_alarm_control_panel.py index 45c123fa2fe4..ba1855247fe4 100644 --- a/tests/components/mqtt/test_alarm_control_panel.py +++ b/tests/components/mqtt/test_alarm_control_panel.py @@ -21,6 +21,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -494,3 +495,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, alarm_control_panel.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, alarm_control_panel.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_binary_sensor.py b/tests/components/mqtt/test_binary_sensor.py index a73919844c1c..07a1c8b6e5f9 100644 --- a/tests/components/mqtt/test_binary_sensor.py +++ b/tests/components/mqtt/test_binary_sensor.py @@ -23,6 +23,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -508,3 +509,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, binary_sensor.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, binary_sensor.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_camera.py b/tests/components/mqtt/test_camera.py index 21f552b4163f..cefeda040978 100644 --- a/tests/components/mqtt/test_camera.py +++ b/tests/components/mqtt/test_camera.py @@ -13,6 +13,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -207,3 +208,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, camera.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, camera.DOMAIN, DEFAULT_CONFIG, "test_topic", b"ON" + ) diff --git a/tests/components/mqtt/test_climate.py b/tests/components/mqtt/test_climate.py index ce21aa53d275..d5b303a51f07 100644 --- a/tests/components/mqtt/test_climate.py +++ b/tests/components/mqtt/test_climate.py @@ -33,6 +33,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -908,6 +909,20 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): ) +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + config = { + CLIMATE_DOMAIN: { + "platform": "mqtt", + "name": "test", + "mode_state_topic": "test-topic", + } + } + await help_test_entity_debug_info_message( + hass, mqtt_mock, CLIMATE_DOMAIN, config, "test-topic" + ) + + async def test_precision_default(hass, mqtt_mock): """Test that setting precision to tenths works as intended.""" assert await async_setup_component(hass, CLIMATE_DOMAIN, DEFAULT_CONFIG) diff --git a/tests/components/mqtt/test_cover.py b/tests/components/mqtt/test_cover.py index 7749c419ca03..7d0753a9de2e 100644 --- a/tests/components/mqtt/test_cover.py +++ b/tests/components/mqtt/test_cover.py @@ -30,6 +30,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -1762,3 +1763,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, cover.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, cover.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_fan.py b/tests/components/mqtt/test_fan.py index 460c99618bd4..6b774e9d5ce4 100644 --- a/tests/components/mqtt/test_fan.py +++ b/tests/components/mqtt/test_fan.py @@ -11,6 +11,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -509,3 +510,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, fan.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, fan.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_legacy_vacuum.py b/tests/components/mqtt/test_legacy_vacuum.py index 14ab79b2d202..0ddb661cf857 100644 --- a/tests/components/mqtt/test_legacy_vacuum.py +++ b/tests/components/mqtt/test_legacy_vacuum.py @@ -27,6 +27,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -629,3 +630,20 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, vacuum.DOMAIN, DEFAULT_CONFIG_2 ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + config = { + vacuum.DOMAIN: { + "platform": "mqtt", + "name": "test", + "battery_level_topic": "test-topic", + "battery_level_template": "{{ value_json.battery_level }}", + "command_topic": "command-topic", + "availability_topic": "avty-topic", + } + } + await help_test_entity_debug_info_message( + hass, mqtt_mock, vacuum.DOMAIN, config, "test-topic" + ) diff --git a/tests/components/mqtt/test_light.py b/tests/components/mqtt/test_light.py index bc4f5fc33939..45473d6f448e 100644 --- a/tests/components/mqtt/test_light.py +++ b/tests/components/mqtt/test_light.py @@ -170,6 +170,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -1358,3 +1359,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_light_json.py b/tests/components/mqtt/test_light_json.py index f71791e019fc..1223f3525c4e 100644 --- a/tests/components/mqtt/test_light_json.py +++ b/tests/components/mqtt/test_light_json.py @@ -109,6 +109,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -1134,3 +1135,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_light_template.py b/tests/components/mqtt/test_light_template.py index c9612a7ded78..37617192dd56 100644 --- a/tests/components/mqtt/test_light_template.py +++ b/tests/components/mqtt/test_light_template.py @@ -46,6 +46,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -957,3 +958,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, light.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_lock.py b/tests/components/mqtt/test_lock.py index 151021a45f80..803fd6c3ab38 100644 --- a/tests/components/mqtt/test_lock.py +++ b/tests/components/mqtt/test_lock.py @@ -11,6 +11,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -399,3 +400,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + ) diff --git a/tests/components/mqtt/test_state_vacuum.py b/tests/components/mqtt/test_state_vacuum.py index ecb38ef5774e..367b9ceda8a8 100644 --- a/tests/components/mqtt/test_state_vacuum.py +++ b/tests/components/mqtt/test_state_vacuum.py @@ -38,6 +38,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -454,3 +455,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, vacuum.DOMAIN, DEFAULT_CONFIG_2 ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, vacuum.DOMAIN, DEFAULT_CONFIG_2 + ) diff --git a/tests/components/mqtt/test_switch.py b/tests/components/mqtt/test_switch.py index d8ca80313901..1aaeb154dc25 100644 --- a/tests/components/mqtt/test_switch.py +++ b/tests/components/mqtt/test_switch.py @@ -15,6 +15,7 @@ from .test_common import ( help_test_discovery_removal, help_test_discovery_update, help_test_discovery_update_attr, + help_test_entity_debug_info_message, help_test_entity_device_info_remove, help_test_entity_device_info_update, help_test_entity_device_info_with_connection, @@ -366,3 +367,10 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock): await help_test_entity_id_update_discovery_update( hass, mqtt_mock, switch.DOMAIN, DEFAULT_CONFIG ) + + +async def test_entity_debug_info_message(hass, mqtt_mock): + """Test MQTT debug info.""" + await help_test_entity_debug_info_message( + hass, mqtt_mock, switch.DOMAIN, DEFAULT_CONFIG + ) From 775010f16084a9a26e736e35ff9c70dcd2bce186 Mon Sep 17 00:00:00 2001 From: Brian Rogers Date: Wed, 1 Apr 2020 15:27:56 -0400 Subject: [PATCH 002/653] Add Rachio Schedules (#33421) * Add Rachio Scheudles * Add Rachio Schedules * Revert "Add Rachio Schedules" This reverts commit ffe1e3d1c231703804077417acc4e7fbe837e98a. * Revert "Add Rachio Scheudles" This reverts commit a015ec4a1994e40981d3642097caf0b5a305533c. * Add Rachio Schedules * Update Logger * Remove person * Remove unneeded call * Black * Fix typo * fix lint * Replace old commits * Revert "Replace old commits" This reverts commit cc8a2a332a0dd9b9a49af30a22490e27bf31b45e. * Replace Schedules * Fix Tests * Missing unsubscribe * Update homeassistant/components/rachio/switch.py Co-authored-by: J. Nick Koston --- homeassistant/components/rachio/const.py | 3 + homeassistant/components/rachio/device.py | 6 ++ homeassistant/components/rachio/switch.py | 109 +++++++++++++++++++- homeassistant/components/rachio/webhooks.py | 6 +- 4 files changed, 122 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/rachio/const.py b/homeassistant/components/rachio/const.py index 13e8029b512a..2c439407c71d 100644 --- a/homeassistant/components/rachio/const.py +++ b/homeassistant/components/rachio/const.py @@ -22,6 +22,7 @@ KEY_ID = "id" KEY_NAME = "name" KEY_MODEL = "model" KEY_ON = "on" +KEY_DURATION = "totalDuration" KEY_STATUS = "status" KEY_SUBTYPE = "subType" KEY_SUMMARY = "summary" @@ -33,6 +34,8 @@ KEY_USERNAME = "username" KEY_ZONE_ID = "zoneId" KEY_ZONE_NUMBER = "zoneNumber" KEY_ZONES = "zones" +KEY_SCHEDULES = "scheduleRules" +KEY_SCHEDULE_ID = "scheduleId" KEY_CUSTOM_SHADE = "customShade" KEY_CUSTOM_CROP = "customCrop" diff --git a/homeassistant/components/rachio/device.py b/homeassistant/components/rachio/device.py index 949957ae8ec5..fbf49ffc67f1 100644 --- a/homeassistant/components/rachio/device.py +++ b/homeassistant/components/rachio/device.py @@ -13,6 +13,7 @@ from .const import ( KEY_MAC_ADDRESS, KEY_MODEL, KEY_NAME, + KEY_SCHEDULES, KEY_SERIAL_NUMBER, KEY_STATUS, KEY_USERNAME, @@ -90,6 +91,7 @@ class RachioIro: self.mac_address = data[KEY_MAC_ADDRESS] self.model = data[KEY_MODEL] self._zones = data[KEY_ZONES] + self._schedules = data[KEY_SCHEDULES] self._init_data = data self._webhooks = webhooks _LOGGER.debug('%s has ID "%s"', str(self), self.controller_id) @@ -174,6 +176,10 @@ class RachioIro: return None + def list_schedules(self) -> list: + """Return a list of schedules.""" + return self._schedules + def stop_watering(self) -> None: """Stop watering all zones connected to this controller.""" self.rachio.device.stopWater(self.controller_id) diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index 5df084a11a41..a4ba1a41fee0 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -15,20 +15,26 @@ from .const import ( KEY_CUSTOM_CROP, KEY_CUSTOM_SHADE, KEY_DEVICE_ID, + KEY_DURATION, KEY_ENABLED, KEY_ID, KEY_IMAGE_URL, KEY_NAME, KEY_ON, + KEY_SCHEDULE_ID, KEY_SUBTYPE, KEY_SUMMARY, KEY_ZONE_ID, KEY_ZONE_NUMBER, SIGNAL_RACHIO_CONTROLLER_UPDATE, + SIGNAL_RACHIO_SCHEDULE_UPDATE, SIGNAL_RACHIO_ZONE_UPDATE, ) from .entity import RachioDevice from .webhooks import ( + SUBTYPE_SCHEDULE_COMPLETED, + SUBTYPE_SCHEDULE_STARTED, + SUBTYPE_SCHEDULE_STOPPED, SUBTYPE_SLEEP_MODE_OFF, SUBTYPE_SLEEP_MODE_ON, SUBTYPE_ZONE_COMPLETED, @@ -40,6 +46,9 @@ _LOGGER = logging.getLogger(__name__) ATTR_ZONE_SUMMARY = "Summary" ATTR_ZONE_NUMBER = "Zone number" +ATTR_SCHEDULE_SUMMARY = "Summary" +ATTR_SCHEDULE_ENABLED = "Enabled" +ATTR_SCHEDULE_DURATION = "Duration" async def async_setup_entry(hass, config_entry, async_add_entities): @@ -58,11 +67,14 @@ def _create_entities(hass, config_entry): for controller in person.controllers: entities.append(RachioStandbySwitch(controller)) zones = controller.list_zones() + schedules = controller.list_schedules() current_schedule = controller.current_schedule - _LOGGER.debug("Rachio setting up zones: %s", zones) for zone in zones: _LOGGER.debug("Rachio setting up zone: %s", zone) entities.append(RachioZone(person, controller, zone, current_schedule)) + for sched in schedules: + _LOGGER.debug("Added schedule: %s", sched) + entities.append(RachioSchedule(person, controller, sched, current_schedule)) return entities @@ -276,3 +288,98 @@ class RachioZone(RachioSwitch): """Unsubscribe from updates.""" if self._undo_dispatcher: self._undo_dispatcher() + + +class RachioSchedule(RachioSwitch): + """Representation of one fixed schedule on the Rachio Iro.""" + + def __init__(self, person, controller, data, current_schedule): + """Initialize a new Rachio Schedule.""" + self._id = data[KEY_ID] + self._schedule_name = data[KEY_NAME] + self._duration = data[KEY_DURATION] + self._schedule_enabled = data[KEY_ENABLED] + self._summary = data[KEY_SUMMARY] + self._current_schedule = current_schedule + super().__init__(controller, poll=False) + self._state = self.schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) + self._undo_dispatcher = None + + @property + def schedule_id(self) -> str: + """How the Rachio API refers to the schedule.""" + return self._id + + @property + def name(self) -> str: + """Return the friendly name of the schedule.""" + return f"{self._schedule_name} Schedule" + + @property + def unique_id(self) -> str: + """Return a unique id by combining controller id and schedule.""" + return f"{self._controller.controller_id}-schedule-{self.schedule_id}" + + @property + def icon(self) -> str: + """Return the icon to display.""" + return "mdi:water" + + @property + def device_state_attributes(self) -> dict: + """Return the optional state attributes.""" + return { + ATTR_SCHEDULE_SUMMARY: self._summary, + ATTR_SCHEDULE_ENABLED: self.schedule_is_enabled, + ATTR_SCHEDULE_DURATION: self._duration / 60, + } + + @property + def schedule_is_enabled(self) -> bool: + """Return whether the schedule is allowed to run.""" + return self._schedule_enabled + + def turn_on(self, **kwargs) -> None: + """Start this schedule.""" + + self._controller.rachio.schedulerule.start(self.schedule_id) + _LOGGER.debug( + "Schedule %s started on %s", self.name, self._controller.name, + ) + + def turn_off(self, **kwargs) -> None: + """Stop watering all zones.""" + self._controller.stop_watering() + + def _poll_update(self, data=None) -> bool: + """Poll the API to check whether the schedule is running.""" + self._current_schedule = self._controller.current_schedule + return self.schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) + + def _handle_update(self, *args, **kwargs) -> None: + """Handle incoming webhook schedule data.""" + # Schedule ID not passed when running individual zones, so we catch that error + try: + if args[0][KEY_SCHEDULE_ID] == self.schedule_id: + if args[0][KEY_SUBTYPE] in [SUBTYPE_SCHEDULE_STARTED]: + self._state = True + elif args[0][KEY_SUBTYPE] in [ + SUBTYPE_SCHEDULE_STOPPED, + SUBTYPE_SCHEDULE_COMPLETED, + ]: + self._state = False + except KeyError: + pass + + self.schedule_update_ha_state() + + async def async_added_to_hass(self): + """Subscribe to updates.""" + self._undo_dispatcher = async_dispatcher_connect( + self.hass, SIGNAL_RACHIO_SCHEDULE_UPDATE, self._handle_update + ) + + async def async_will_remove_from_hass(self): + """Unsubscribe from updates.""" + if self._undo_dispatcher: + self._undo_dispatcher() diff --git a/homeassistant/components/rachio/webhooks.py b/homeassistant/components/rachio/webhooks.py index c12f2ccfd3ed..7051ec046d84 100644 --- a/homeassistant/components/rachio/webhooks.py +++ b/homeassistant/components/rachio/webhooks.py @@ -50,7 +50,11 @@ SUBTYPE_ZONE_CYCLING = "ZONE_CYCLING" SUBTYPE_ZONE_CYCLING_COMPLETED = "ZONE_CYCLING_COMPLETED" # Webhook callbacks -LISTEN_EVENT_TYPES = ["DEVICE_STATUS_EVENT", "ZONE_STATUS_EVENT"] +LISTEN_EVENT_TYPES = [ + "DEVICE_STATUS_EVENT", + "ZONE_STATUS_EVENT", + "SCHEDULE_STATUS_EVENT", +] WEBHOOK_CONST_ID = "homeassistant.rachio:" WEBHOOK_PATH = URL_API + DOMAIN From 4e043b312343523564080bb8f960f5929aea0dea Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 1 Apr 2020 22:11:29 +0200 Subject: [PATCH 003/653] Update azure-pipelines-wheels.yml for Azure Pipelines --- azure-pipelines-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines-wheels.yml b/azure-pipelines-wheels.yml index b4ad0a556b28..2f9944db3e02 100644 --- a/azure-pipelines-wheels.yml +++ b/azure-pipelines-wheels.yml @@ -73,4 +73,4 @@ jobs: sed -i "s|# bme680|bme680|g" ${requirement_file} sed -i "s|# python-gammu|python-gammu|g" ${requirement_file} done - displayName: 'Prepare requirements files for Hass.io' + displayName: 'Prepare requirements files for Home Assistant wheels' From aaa1d068091162bf351805273330bb936382594b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 1 Apr 2020 14:19:51 -0700 Subject: [PATCH 004/653] Directly call async_write_ha_state (#33508) * Directly call async_write_ha_state * Address comments * Fix tests --- homeassistant/components/alert/__init__.py | 4 ++-- .../components/android_ip_webcam/switch.py | 4 ++-- .../components/apple_tv/media_player.py | 4 ++-- homeassistant/components/aqualogic/sensor.py | 2 +- homeassistant/components/aqualogic/switch.py | 15 ++++++------ .../components/arcam_fmj/media_player.py | 14 +++++------ homeassistant/components/arlo/camera.py | 14 ++++++----- homeassistant/components/arwn/sensor.py | 2 +- homeassistant/components/axis/axis_base.py | 2 +- .../components/axis/binary_sensor.py | 4 ++-- .../components/bluesound/media_player.py | 4 ++-- homeassistant/components/cast/media_player.py | 10 ++++---- .../components/cloud/binary_sensor.py | 2 +- .../components/deconz/binary_sensor.py | 2 +- .../components/deconz/deconz_device.py | 2 +- homeassistant/components/deconz/sensor.py | 4 ++-- homeassistant/components/derivative/sensor.py | 2 +- .../components/dsmr_reader/sensor.py | 2 +- homeassistant/components/emby/media_player.py | 2 +- .../envisalink/alarm_control_panel.py | 2 +- .../components/envisalink/binary_sensor.py | 2 +- homeassistant/components/envisalink/sensor.py | 2 +- homeassistant/components/esphome/__init__.py | 4 ++-- homeassistant/components/ffmpeg/__init__.py | 2 +- .../components/ffmpeg_motion/binary_sensor.py | 2 +- homeassistant/components/filter/sensor.py | 2 +- homeassistant/components/flux/switch.py | 4 ++-- .../components/generic_thermostat/climate.py | 2 +- .../components/greeneye_monitor/sensor.py | 7 ++---- homeassistant/components/harmony/remote.py | 4 ++-- homeassistant/components/hive/__init__.py | 14 ++++++----- homeassistant/components/hlk_sw16/__init__.py | 4 ++-- .../homematicip_cloud/alarm_control_panel.py | 2 +- .../components/homematicip_cloud/device.py | 2 +- homeassistant/components/homeworks/light.py | 2 +- .../components/iaqualink/__init__.py | 13 ++++++---- .../components/insteon/insteon_entity.py | 2 +- .../components/integration/sensor.py | 2 +- homeassistant/components/izone/climate.py | 12 +++++----- homeassistant/components/kiwi/lock.py | 2 +- homeassistant/components/knx/cover.py | 2 +- homeassistant/components/kodi/media_player.py | 6 ++--- .../components/konnected/binary_sensor.py | 2 +- homeassistant/components/konnected/sensor.py | 2 +- homeassistant/components/konnected/switch.py | 2 +- homeassistant/components/lacrosse/sensor.py | 2 +- homeassistant/components/lcn/binary_sensor.py | 6 ++--- homeassistant/components/lcn/climate.py | 6 ++--- homeassistant/components/lcn/cover.py | 4 ++-- homeassistant/components/lcn/light.py | 4 ++-- homeassistant/components/lcn/sensor.py | 4 ++-- homeassistant/components/lcn/switch.py | 4 ++-- homeassistant/components/lightwave/light.py | 4 ++-- homeassistant/components/lightwave/switch.py | 4 ++-- .../components/mediaroom/media_player.py | 24 +++++++++---------- homeassistant/components/mobile_app/entity.py | 2 +- homeassistant/components/mqtt_room/sensor.py | 2 +- .../components/mychevy/binary_sensor.py | 2 +- homeassistant/components/mychevy/sensor.py | 6 ++--- homeassistant/components/mysensors/climate.py | 6 ++--- homeassistant/components/mysensors/cover.py | 6 ++--- homeassistant/components/mysensors/light.py | 8 +++---- homeassistant/components/mysensors/switch.py | 8 +++---- .../components/mystrom/binary_sensor.py | 2 +- .../ness_alarm/alarm_control_panel.py | 2 +- .../components/ness_alarm/binary_sensor.py | 2 +- .../components/opentherm_gw/binary_sensor.py | 2 +- .../components/opentherm_gw/climate.py | 6 ++--- .../components/opentherm_gw/sensor.py | 2 +- homeassistant/components/otp/sensor.py | 2 +- homeassistant/components/person/__init__.py | 2 +- homeassistant/components/plant/__init__.py | 4 ++-- .../components/point/alarm_control_panel.py | 2 +- .../components/point/binary_sensor.py | 4 ++-- homeassistant/components/point/sensor.py | 2 +- homeassistant/components/push/camera.py | 4 ++-- .../components/qwikswitch/__init__.py | 2 +- .../components/qwikswitch/binary_sensor.py | 2 +- homeassistant/components/qwikswitch/sensor.py | 2 +- homeassistant/components/rflink/__init__.py | 4 ++-- .../components/rflink/binary_sensor.py | 2 +- homeassistant/components/ring/light.py | 2 +- .../satel_integra/alarm_control_panel.py | 2 +- .../components/satel_integra/binary_sensor.py | 2 +- .../components/satel_integra/switch.py | 6 ++--- homeassistant/components/serial/sensor.py | 2 +- homeassistant/components/sisyphus/light.py | 2 +- .../components/sisyphus/media_player.py | 2 +- .../components/smartthings/climate.py | 10 ++++---- homeassistant/components/smartthings/fan.py | 6 ++--- homeassistant/components/smartthings/lock.py | 4 ++-- .../components/smartthings/switch.py | 4 ++-- .../components/snapcast/media_player.py | 16 ++++++------- .../components/sonos/media_player.py | 6 ++--- .../components/switcher_kis/switch.py | 4 ++-- homeassistant/components/tellduslive/entry.py | 2 +- .../template/alarm_control_panel.py | 2 +- .../components/template/binary_sensor.py | 2 +- homeassistant/components/template/cover.py | 12 +++++----- homeassistant/components/template/light.py | 4 ++-- homeassistant/components/template/lock.py | 4 ++-- homeassistant/components/tibber/sensor.py | 2 +- homeassistant/components/time_date/sensor.py | 2 +- homeassistant/components/tod/binary_sensor.py | 2 +- homeassistant/components/torque/sensor.py | 2 +- .../components/tradfri/base_class.py | 4 ++-- .../components/unifi/device_tracker.py | 4 ++-- .../components/unifi/unifi_client.py | 2 +- .../components/utility_meter/sensor.py | 4 ++-- .../components/w800rf32/binary_sensor.py | 2 +- .../components/waterfurnace/sensor.py | 2 +- .../components/webostv/media_player.py | 2 +- .../components/websocket_api/sensor.py | 2 +- .../components/wemo/binary_sensor.py | 2 +- homeassistant/components/wemo/fan.py | 2 +- homeassistant/components/wemo/light.py | 2 +- homeassistant/components/wemo/switch.py | 2 +- .../components/wirelesstag/binary_sensor.py | 2 +- .../components/wirelesstag/sensor.py | 2 +- .../components/xiaomi_aqara/__init__.py | 4 ++-- .../components/xiaomi_aqara/binary_sensor.py | 2 +- homeassistant/components/xiaomi_aqara/lock.py | 2 +- .../components/yeelight/binary_sensor.py | 15 ++++++------ homeassistant/components/zwave/__init__.py | 2 +- homeassistant/components/zwave/node_entity.py | 2 +- tests/components/arcam_fmj/conftest.py | 2 +- .../components/arcam_fmj/test_media_player.py | 6 ++--- tests/components/default_config/test_init.py | 19 --------------- .../components/owntracks/test_config_flow.py | 4 ++-- 129 files changed, 263 insertions(+), 278 deletions(-) diff --git a/homeassistant/components/alert/__init__.py b/homeassistant/components/alert/__init__.py index 9aa3c62e76c9..1f8176968d80 100644 --- a/homeassistant/components/alert/__init__.py +++ b/homeassistant/components/alert/__init__.py @@ -249,7 +249,7 @@ class Alert(ToggleEntity): else: await self._schedule_notify() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def end_alerting(self): """End the alert procedures.""" @@ -259,7 +259,7 @@ class Alert(ToggleEntity): self._firing = False if self._send_done_message: await self._notify_done_message() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def _schedule_notify(self): """Schedule a notification.""" diff --git a/homeassistant/components/android_ip_webcam/switch.py b/homeassistant/components/android_ip_webcam/switch.py index 2d5f2412d852..a494e78bdc76 100644 --- a/homeassistant/components/android_ip_webcam/switch.py +++ b/homeassistant/components/android_ip_webcam/switch.py @@ -67,7 +67,7 @@ class IPWebcamSettingsSwitch(AndroidIPCamEntity, SwitchDevice): else: await self._ipcam.change_setting(self._setting, True) self._state = True - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn device off.""" @@ -80,7 +80,7 @@ class IPWebcamSettingsSwitch(AndroidIPCamEntity, SwitchDevice): else: await self._ipcam.change_setting(self._setting, False) self._state = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def icon(self): diff --git a/homeassistant/components/apple_tv/media_player.py b/homeassistant/components/apple_tv/media_player.py index c34a46a8b827..8b9f33559309 100644 --- a/homeassistant/components/apple_tv/media_player.py +++ b/homeassistant/components/apple_tv/media_player.py @@ -138,7 +138,7 @@ class AppleTvDevice(MediaPlayerDevice): def playstatus_update(self, updater, playing): """Print what is currently playing when it changes.""" self._playing = playing - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def playstatus_error(self, updater, exception): @@ -151,7 +151,7 @@ class AppleTvDevice(MediaPlayerDevice): # implemented here later. updater.start(initial_delay=10) self._playing = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def media_content_type(self): diff --git a/homeassistant/components/aqualogic/sensor.py b/homeassistant/components/aqualogic/sensor.py index dde092dd1fa3..002b032fa92b 100644 --- a/homeassistant/components/aqualogic/sensor.py +++ b/homeassistant/components/aqualogic/sensor.py @@ -109,4 +109,4 @@ class AquaLogicSensor(Entity): panel = self._processor.panel if panel is not None: self._state = getattr(panel, self._type) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/aqualogic/switch.py b/homeassistant/components/aqualogic/switch.py index 6950929ee807..e54fcff139d5 100644 --- a/homeassistant/components/aqualogic/switch.py +++ b/homeassistant/components/aqualogic/switch.py @@ -6,7 +6,6 @@ import voluptuous as vol from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice from homeassistant.const import CONF_MONITORED_CONDITIONS -from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from . import DOMAIN, UPDATE_TOPIC @@ -51,7 +50,6 @@ class AquaLogicSwitch(SwitchDevice): def __init__(self, processor, switch_type): """Initialize switch.""" - self._processor = processor self._type = switch_type self._state_name = { @@ -66,6 +64,7 @@ class AquaLogicSwitch(SwitchDevice): "aux_6": States.AUX_6, "aux_7": States.AUX_7, }[switch_type] + self._unsub_disp = None @property def name(self): @@ -102,11 +101,11 @@ class AquaLogicSwitch(SwitchDevice): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.async_update_callback + self._unsub_disp = self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.async_write_ha_state ) - @callback - def async_update_callback(self): - """Update callback.""" - self.async_schedule_update_ha_state() + async def async_will_remove_from_hass(self): + """When entity will be removed from hass.""" + self._unsub_disp() + self._unsub_disp = None diff --git a/homeassistant/components/arcam_fmj/media_player.py b/homeassistant/components/arcam_fmj/media_player.py index 8a54c745695e..a49802ea96fa 100644 --- a/homeassistant/components/arcam_fmj/media_player.py +++ b/homeassistant/components/arcam_fmj/media_player.py @@ -130,7 +130,7 @@ class ArcamFmj(MediaPlayerDevice): @callback def _data(host): if host == self._state.client.host: - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _started(host): @@ -160,7 +160,7 @@ class ArcamFmj(MediaPlayerDevice): async def async_mute_volume(self, mute): """Send mute command.""" await self._state.set_mute(mute) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_select_source(self, source): """Select a specific source.""" @@ -171,7 +171,7 @@ class ArcamFmj(MediaPlayerDevice): return await self._state.set_source(value) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_select_sound_mode(self, sound_mode): """Select a specific source.""" @@ -184,22 +184,22 @@ class ArcamFmj(MediaPlayerDevice): _LOGGER.error("Unsupported sound_mode %s", sound_mode) return - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_volume_level(self, volume): """Set volume level, range 0..1.""" await self._state.set_volume(round(volume * 99.0)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_volume_up(self): """Turn volume up for media player.""" await self._state.inc_volume() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_volume_down(self): """Turn volume up for media player.""" await self._state.dec_volume() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self): """Turn the media player on.""" diff --git a/homeassistant/components/arlo/camera.py b/homeassistant/components/arlo/camera.py index 8152a76feecc..e2bb85c9f840 100644 --- a/homeassistant/components/arlo/camera.py +++ b/homeassistant/components/arlo/camera.py @@ -7,7 +7,6 @@ import voluptuous as vol from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from homeassistant.components.ffmpeg import DATA_FFMPEG from homeassistant.const import ATTR_BATTERY_LEVEL -from homeassistant.core import callback from homeassistant.helpers.aiohttp_client import async_aiohttp_proxy_stream import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -62,6 +61,7 @@ class ArloCam(Camera): self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) self._last_refresh = None self.attrs = {} + self._unsub_disp = None def camera_image(self): """Return a still image response from the camera.""" @@ -69,12 +69,14 @@ class ArloCam(Camera): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_ARLO, self._update_callback) + self._unsub_disp = async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_ARLO, self.async_write_ha_state + ) - @callback - def _update_callback(self): - """Call update method.""" - self.async_schedule_update_ha_state() + async def async_will_remove_from_hass(self): + """When entity will be removed from hass.""" + self._unsub_disp() + self._unsub_disp = None async def handle_async_mjpeg_stream(self, request): """Generate an HTTP MJPEG stream from the camera.""" diff --git a/homeassistant/components/arwn/sensor.py b/homeassistant/components/arwn/sensor.py index 014c46fd73c8..6684a5b882b8 100644 --- a/homeassistant/components/arwn/sensor.py +++ b/homeassistant/components/arwn/sensor.py @@ -119,7 +119,7 @@ class ArwnSensor(Entity): """Update the sensor with the most recent event.""" self.event = {} self.event.update(event) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def state(self): diff --git a/homeassistant/components/axis/axis_base.py b/homeassistant/components/axis/axis_base.py index f22a169a1023..e61c4cea6b03 100644 --- a/homeassistant/components/axis/axis_base.py +++ b/homeassistant/components/axis/axis_base.py @@ -41,7 +41,7 @@ class AxisEntityBase(Entity): @callback def update_callback(self, no_delay=None): """Update the entities state.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() class AxisEventBase(AxisEntityBase): diff --git a/homeassistant/components/axis/binary_sensor.py b/homeassistant/components/axis/binary_sensor.py index d7551abebc13..d992c28746c3 100644 --- a/homeassistant/components/axis/binary_sensor.py +++ b/homeassistant/components/axis/binary_sensor.py @@ -53,13 +53,13 @@ class AxisBinarySensor(AxisEventBase, BinarySensorDevice): self.remove_timer = None if self.is_on or delay == 0 or no_delay: - self.async_schedule_update_ha_state() + self.async_write_ha_state() return @callback def _delay_update(now): """Timer callback for sensor update.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() self.remove_timer = None self.remove_timer = async_track_point_in_utc_time( diff --git a/homeassistant/components/bluesound/media_player.py b/homeassistant/components/bluesound/media_player.py index e2cc0dd31e27..300927abefab 100644 --- a/homeassistant/components/bluesound/media_player.py +++ b/homeassistant/components/bluesound/media_player.py @@ -426,7 +426,7 @@ class BluesoundPlayer(MediaPlayerDevice): # communication is moved to a separate library await self.force_update_sync_status() - self.async_schedule_update_ha_state() + self.async_write_ha_state() elif response.status == 595: _LOGGER.info("Status 595 returned, treating as timeout") raise BluesoundPlayer._TimeoutException() @@ -439,7 +439,7 @@ class BluesoundPlayer(MediaPlayerDevice): self._is_online = False self._last_status_update = None self._status = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() _LOGGER.info("Client connection error, marking %s as offline", self._name) raise diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index e0c48062dfbb..edac0e6e3ec8 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -356,7 +356,7 @@ class CastDevice(MediaPlayerDevice): self.cast_status = chromecast.status self.media_status = chromecast.media_controller.status self._chromecast.start() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_del_cast_info(self, cast_info): """Remove the service.""" @@ -411,7 +411,7 @@ class CastDevice(MediaPlayerDevice): self._dynamic_group_available = False self.dynamic_group_media_status = chromecast.media_controller.status self._dynamic_group_cast.start() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_del_dynamic_group(self): """Remove the dynamic group.""" @@ -432,7 +432,7 @@ class CastDevice(MediaPlayerDevice): self._dynamic_group_invalidate() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def _async_disconnect(self): """Disconnect Chromecast object if it is set.""" @@ -447,7 +447,7 @@ class CastDevice(MediaPlayerDevice): self._cast_info.port, ) self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() await self.hass.async_add_executor_job(self._chromecast.disconnect) if self._dynamic_group_cast is not None: @@ -455,7 +455,7 @@ class CastDevice(MediaPlayerDevice): self._invalidate() - self.async_schedule_update_ha_state() + self.async_write_ha_state() def _invalidate(self): """Invalidate some attributes.""" diff --git a/homeassistant/components/cloud/binary_sensor.py b/homeassistant/components/cloud/binary_sensor.py index 056105f80710..c2974678faae 100644 --- a/homeassistant/components/cloud/binary_sensor.py +++ b/homeassistant/components/cloud/binary_sensor.py @@ -62,7 +62,7 @@ class CloudRemoteBinary(BinarySensorDevice): async def async_state_update(data): """Update callback.""" await asyncio.sleep(WAIT_UNTIL_CHANGE) - self.async_schedule_update_ha_state() + self.async_write_ha_state() self._unsub_dispatcher = async_dispatcher_connect( self.hass, DISPATCHER_REMOTE_UPDATE, async_state_update diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index 6a528a66ba64..d16722525f92 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -64,7 +64,7 @@ class DeconzBinarySensor(DeconzDevice, BinarySensorDevice): keys = {"on", "reachable", "state"} if force_update or self._device.changed_keys.intersection(keys): - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): diff --git a/homeassistant/components/deconz/deconz_device.py b/homeassistant/components/deconz/deconz_device.py index 0724f9f9b451..80557caeca68 100644 --- a/homeassistant/components/deconz/deconz_device.py +++ b/homeassistant/components/deconz/deconz_device.py @@ -106,7 +106,7 @@ class DeconzDevice(DeconzBase, Entity): if ignore_update: return - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def available(self): diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index fd8ffeeaaf0c..ae0e55ae51f4 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -109,7 +109,7 @@ class DeconzSensor(DeconzDevice): keys = {"on", "reachable", "state"} if force_update or self._device.changed_keys.intersection(keys): - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def state(self): @@ -174,7 +174,7 @@ class DeconzBattery(DeconzDevice): keys = {"battery", "reachable"} if force_update or self._device.changed_keys.intersection(keys): - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def unique_id(self): diff --git a/homeassistant/components/derivative/sensor.py b/homeassistant/components/derivative/sensor.py index 202c58858871..65bbd9affee4 100644 --- a/homeassistant/components/derivative/sensor.py +++ b/homeassistant/components/derivative/sensor.py @@ -182,7 +182,7 @@ class DerivativeSensor(RestoreEntity): _LOGGER.error("Could not calculate derivative: %s", err) else: self._state = derivative - self.async_schedule_update_ha_state() + self.async_write_ha_state() async_track_state_change(self.hass, self._sensor_source_id, calc_derivative) diff --git a/homeassistant/components/dsmr_reader/sensor.py b/homeassistant/components/dsmr_reader/sensor.py index 01c010c4971a..341451522d4e 100644 --- a/homeassistant/components/dsmr_reader/sensor.py +++ b/homeassistant/components/dsmr_reader/sensor.py @@ -48,7 +48,7 @@ class DSMRSensor(Entity): else: self._state = message.payload - self.async_schedule_update_ha_state() + self.async_write_ha_state() await mqtt.async_subscribe(self.hass, self._topic, message_received, 1) diff --git a/homeassistant/components/emby/media_player.py b/homeassistant/components/emby/media_player.py index e063fc49f2fd..19fad984b27b 100644 --- a/homeassistant/components/emby/media_player.py +++ b/homeassistant/components/emby/media_player.py @@ -166,7 +166,7 @@ class EmbyDevice(MediaPlayerDevice): self.media_status_last_position = None self.media_status_received = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def available(self): diff --git a/homeassistant/components/envisalink/alarm_control_panel.py b/homeassistant/components/envisalink/alarm_control_panel.py index 7630169dcada..beb1c1cda822 100644 --- a/homeassistant/components/envisalink/alarm_control_panel.py +++ b/homeassistant/components/envisalink/alarm_control_panel.py @@ -121,7 +121,7 @@ class EnvisalinkAlarm(EnvisalinkDevice, AlarmControlPanel): def _update_callback(self, partition): """Update Home Assistant state, if needed.""" if partition is None or int(partition) == self._partition_number: - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def code_format(self): diff --git a/homeassistant/components/envisalink/binary_sensor.py b/homeassistant/components/envisalink/binary_sensor.py index fbe9824d0673..f698a9d27d92 100644 --- a/homeassistant/components/envisalink/binary_sensor.py +++ b/homeassistant/components/envisalink/binary_sensor.py @@ -94,4 +94,4 @@ class EnvisalinkBinarySensor(EnvisalinkDevice, BinarySensorDevice): def _update_callback(self, zone): """Update the zone's state, if needed.""" if zone is None or int(zone) == self._zone_number: - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/envisalink/sensor.py b/homeassistant/components/envisalink/sensor.py index 05ad0783facd..b4f15a2999e2 100644 --- a/homeassistant/components/envisalink/sensor.py +++ b/homeassistant/components/envisalink/sensor.py @@ -74,4 +74,4 @@ class EnvisalinkSensor(EnvisalinkDevice, Entity): def _update_callback(self, partition): """Update the partition state in HA, if needed.""" if partition is None or int(partition) == self._partition_number: - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/esphome/__init__.py b/homeassistant/components/esphome/__init__.py index 9fbe3eff8227..3895e172024e 100644 --- a/homeassistant/components/esphome/__init__.py +++ b/homeassistant/components/esphome/__init__.py @@ -510,7 +510,7 @@ class EsphomeEntity(Entity): async def _on_state_update(self) -> None: """Update the entity state when state or static info changed.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def _on_device_update(self) -> None: """Update the entity state when device info has changed.""" @@ -519,7 +519,7 @@ class EsphomeEntity(Entity): # Only update the HA state when the full state arrives # through the next entity state packet. return - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_will_remove_from_hass(self) -> None: """Unregister callbacks.""" diff --git a/homeassistant/components/ffmpeg/__init__.py b/homeassistant/components/ffmpeg/__init__.py index bc402b46fb21..ad0c590b87db 100644 --- a/homeassistant/components/ffmpeg/__init__.py +++ b/homeassistant/components/ffmpeg/__init__.py @@ -202,6 +202,6 @@ class FFmpegBase(Entity): async def async_start_handle(event): """Start FFmpeg process.""" await self._async_start_ffmpeg(None) - self.async_schedule_update_ha_state() + self.async_write_ha_state() self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, async_start_handle) diff --git a/homeassistant/components/ffmpeg_motion/binary_sensor.py b/homeassistant/components/ffmpeg_motion/binary_sensor.py index 294fcc2518fa..e3a9c09b5d97 100644 --- a/homeassistant/components/ffmpeg_motion/binary_sensor.py +++ b/homeassistant/components/ffmpeg_motion/binary_sensor.py @@ -70,7 +70,7 @@ class FFmpegBinarySensor(FFmpegBase, BinarySensorDevice): def _async_callback(self, state): """HA-FFmpeg callback for noise detection.""" self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): diff --git a/homeassistant/components/filter/sensor.py b/homeassistant/components/filter/sensor.py index 4d508ce2d817..7c2a35938b26 100644 --- a/homeassistant/components/filter/sensor.py +++ b/homeassistant/components/filter/sensor.py @@ -212,7 +212,7 @@ class SensorFilter(Entity): ) if update_ha: - self.async_schedule_update_ha_state() + self.async_write_ha_state() if "recorder" in self.hass.config.components: history_list = [] diff --git a/homeassistant/components/flux/switch.py b/homeassistant/components/flux/switch.py index 0205bb308be6..61bdb9a28621 100644 --- a/homeassistant/components/flux/switch.py +++ b/homeassistant/components/flux/switch.py @@ -233,7 +233,7 @@ class FluxSwitch(SwitchDevice, RestoreEntity): # Make initial update await self.async_flux_update() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn off flux.""" @@ -241,7 +241,7 @@ class FluxSwitch(SwitchDevice, RestoreEntity): self.unsub_tracker() self.unsub_tracker = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_flux_update(self, utcnow=None): """Update all the lights using flux.""" diff --git a/homeassistant/components/generic_thermostat/climate.py b/homeassistant/components/generic_thermostat/climate.py index a7ddcc083149..09af5ad5c44f 100644 --- a/homeassistant/components/generic_thermostat/climate.py +++ b/homeassistant/components/generic_thermostat/climate.py @@ -368,7 +368,7 @@ class GenericThermostat(ClimateDevice, RestoreEntity): """Handle heater switch state changes.""" if new_state is None: return - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _async_update_temp(self, state): diff --git a/homeassistant/components/greeneye_monitor/sensor.py b/homeassistant/components/greeneye_monitor/sensor.py index 1d53525ab373..ff5aff6fe500 100644 --- a/homeassistant/components/greeneye_monitor/sensor.py +++ b/homeassistant/components/greeneye_monitor/sensor.py @@ -129,7 +129,7 @@ class GEMSensor(Entity): async def async_will_remove_from_hass(self): """Remove listener from the sensor.""" if self._sensor: - self._sensor.remove_listener(self._schedule_update) + self._sensor.remove_listener(self.async_write_ha_state) else: monitors = self.hass.data[DATA_GREENEYE_MONITOR] monitors.remove_listener(self._on_new_monitor) @@ -140,16 +140,13 @@ class GEMSensor(Entity): return False self._sensor = self._get_sensor(monitor) - self._sensor.add_listener(self._schedule_update) + self._sensor.add_listener(self.async_write_ha_state) return True def _get_sensor(self, monitor): raise NotImplementedError() - def _schedule_update(self): - self.async_schedule_update_ha_state(False) - class CurrentSensor(GEMSensor): """Entity showing power usage on one channel of the monitor.""" diff --git a/homeassistant/components/harmony/remote.py b/homeassistant/components/harmony/remote.py index 7d23e15a4e70..024af9b15804 100644 --- a/homeassistant/components/harmony/remote.py +++ b/homeassistant/components/harmony/remote.py @@ -264,7 +264,7 @@ class HarmonyRemote(remote.RemoteDevice): self._current_activity = activity_name self._state = bool(activity_id != -1) self._available = True - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def new_config(self, _=None): """Call for updating the current activity.""" @@ -289,7 +289,7 @@ class HarmonyRemote(remote.RemoteDevice): if not self._available: # Still disconnected. Let the state engine know. - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self, **kwargs): """Start an activity from the Harmony device.""" diff --git a/homeassistant/components/hive/__init__.py b/homeassistant/components/hive/__init__.py index edd3388e74f5..88103ec94c14 100644 --- a/homeassistant/components/hive/__init__.py +++ b/homeassistant/components/hive/__init__.py @@ -12,7 +12,6 @@ from homeassistant.const import ( CONF_SCAN_INTERVAL, CONF_USERNAME, ) -from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import load_platform from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send @@ -183,14 +182,17 @@ class HiveEntity(Entity): self.session = session self.attributes = {} self._unique_id = f"{self.node_id}-{self.device_type}" + self._unsub_disp = None async def async_added_to_hass(self): """When entity is added to Home Assistant.""" - async_dispatcher_connect(self.hass, DOMAIN, self._update_callback) + self._unsub_disp = async_dispatcher_connect( + self.hass, DOMAIN, self.async_write_ha_state + ) if self.device_type in SERVICES: self.session.entity_lookup[self.entity_id] = self.node_id - @callback - def _update_callback(self): - """Call update method.""" - self.async_schedule_update_ha_state() + async def async_will_remove_from_hass(self): + """When entity will be removed from hass.""" + self._unsub_disp() + self._unsub_disp = None diff --git a/homeassistant/components/hlk_sw16/__init__.py b/homeassistant/components/hlk_sw16/__init__.py index 1750e9b0ff45..52a82184dccf 100644 --- a/homeassistant/components/hlk_sw16/__init__.py +++ b/homeassistant/components/hlk_sw16/__init__.py @@ -136,7 +136,7 @@ class SW16Device(Entity): """Propagate changes through ha.""" _LOGGER.debug("Relay %s new state callback: %r", self._device_port, event) self._is_on = event - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def should_poll(self): @@ -156,7 +156,7 @@ class SW16Device(Entity): @callback def _availability_callback(self, availability): """Update availability state.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Register update callback.""" diff --git a/homeassistant/components/homematicip_cloud/alarm_control_panel.py b/homeassistant/components/homematicip_cloud/alarm_control_panel.py index f5316350091e..fd3958344f50 100644 --- a/homeassistant/components/homematicip_cloud/alarm_control_panel.py +++ b/homeassistant/components/homematicip_cloud/alarm_control_panel.py @@ -102,7 +102,7 @@ class HomematicipAlarmControlPanel(AlarmControlPanel): # Don't update disabled entities if self.enabled: _LOGGER.debug("Event %s (%s)", self.name, CONST_ALARM_CONTROL_PANEL_NAME) - self.async_schedule_update_ha_state() + self.async_write_ha_state() else: _LOGGER.debug( "Device Changed Event for %s (Alarm Control Panel) not fired. Entity is disabled.", diff --git a/homeassistant/components/homematicip_cloud/device.py b/homeassistant/components/homematicip_cloud/device.py index 0407a1a0fe27..c2b67758152a 100644 --- a/homeassistant/components/homematicip_cloud/device.py +++ b/homeassistant/components/homematicip_cloud/device.py @@ -108,7 +108,7 @@ class HomematicipGenericDevice(Entity): # Don't update disabled entities if self.enabled: _LOGGER.debug("Event %s (%s)", self.name, self._device.modelType) - self.async_schedule_update_ha_state() + self.async_write_ha_state() else: _LOGGER.debug( "Device Changed Event for %s (%s) not fired. Entity is disabled.", diff --git a/homeassistant/components/homeworks/light.py b/homeassistant/components/homeworks/light.py index 56d5bcacc476..4cfb2b0a26d8 100644 --- a/homeassistant/components/homeworks/light.py +++ b/homeassistant/components/homeworks/light.py @@ -93,4 +93,4 @@ class HomeworksLight(HomeworksDevice, Light): self._level = int((values[1] * 255.0) / 100.0) if self._level != 0: self._prev_level = self._level - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/iaqualink/__init__.py b/homeassistant/components/iaqualink/__init__.py index 16c8deac72e7..214bdf302ea2 100644 --- a/homeassistant/components/iaqualink/__init__.py +++ b/homeassistant/components/iaqualink/__init__.py @@ -25,7 +25,6 @@ from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME -from homeassistant.core import callback from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -203,14 +202,18 @@ class AqualinkEntity(Entity): def __init__(self, dev: AqualinkDevice): """Initialize the entity.""" self.dev = dev + self._unsub_disp = None async def async_added_to_hass(self) -> None: """Set up a listener when this entity is added to HA.""" - async_dispatcher_connect(self.hass, DOMAIN, self._update_callback) + self._unsub_disp = async_dispatcher_connect( + self.hass, DOMAIN, self.async_write_ha_state + ) - @callback - def _update_callback(self) -> None: - self.async_schedule_update_ha_state() + async def async_will_remove_from_hass(self): + """When entity will be removed from hass.""" + self._unsub_disp() + self._unsub_disp = None @property def should_poll(self) -> bool: diff --git a/homeassistant/components/insteon/insteon_entity.py b/homeassistant/components/insteon/insteon_entity.py index c489dd8e3825..e411cd82045d 100644 --- a/homeassistant/components/insteon/insteon_entity.py +++ b/homeassistant/components/insteon/insteon_entity.py @@ -80,7 +80,7 @@ class InsteonEntity(Entity): group, val, ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Register INSTEON update events.""" diff --git a/homeassistant/components/integration/sensor.py b/homeassistant/components/integration/sensor.py index 6201348f21c0..3365e5b10c82 100644 --- a/homeassistant/components/integration/sensor.py +++ b/homeassistant/components/integration/sensor.py @@ -172,7 +172,7 @@ class IntegrationSensor(RestoreEntity): _LOGGER.error("Could not calculate integral: %s", err) else: self._state += integral - self.async_schedule_update_ha_state() + self.async_write_ha_state() async_track_state_change(self.hass, self._sensor_source_id, calc_integration) diff --git a/homeassistant/components/izone/climate.py b/homeassistant/components/izone/climate.py index dde71d14a9c6..b17313925a8f 100644 --- a/homeassistant/components/izone/climate.py +++ b/homeassistant/components/izone/climate.py @@ -175,7 +175,7 @@ class ControllerDevice(ClimateDevice): """Handle controller data updates.""" if ctrl is not self._controller: return - self.async_schedule_update_ha_state() + self.async_write_ha_state() for zone in self.zones.values(): zone.async_schedule_update_ha_state() @@ -210,7 +210,7 @@ class ControllerDevice(ClimateDevice): ) self._available = available - self.async_schedule_update_ha_state() + self.async_write_ha_state() for zone in self.zones.values(): zone.async_schedule_update_ha_state() @@ -439,7 +439,7 @@ class ZoneDevice(ClimateDevice): if zone is not self._zone: return self._name = zone.name.title() - self.async_schedule_update_ha_state() + self.async_write_ha_state() self.async_on_remove( async_dispatcher_connect(self.hass, DISPATCH_ZONE_UPDATE, zone_update) @@ -549,7 +549,7 @@ class ZoneDevice(ClimateDevice): """Set new target operation mode.""" mode = self._state_to_pizone[hvac_mode] await self._controller.wrap_and_catch(self._zone.set_mode(mode)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): @@ -562,9 +562,9 @@ class ZoneDevice(ClimateDevice): await self._controller.wrap_and_catch(self._zone.set_mode(Zone.Mode.AUTO)) else: await self._controller.wrap_and_catch(self._zone.set_mode(Zone.Mode.OPEN)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self): """Turn device off (close zone).""" await self._controller.wrap_and_catch(self._zone.set_mode(Zone.Mode.CLOSE)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/kiwi/lock.py b/homeassistant/components/kiwi/lock.py index b13906b44f5c..4a58f8f43c23 100644 --- a/homeassistant/components/kiwi/lock.py +++ b/homeassistant/components/kiwi/lock.py @@ -94,7 +94,7 @@ class KiwiLock(LockDevice): def clear_unlock_state(self, _): """Clear unlock state automatically.""" self._state = STATE_LOCKED - self.async_schedule_update_ha_state() + self.async_write_ha_state() def unlock(self, **kwargs): """Unlock the device.""" diff --git a/homeassistant/components/knx/cover.py b/homeassistant/components/knx/cover.py index d0b8d8c1163f..3c67e2fd5589 100644 --- a/homeassistant/components/knx/cover.py +++ b/homeassistant/components/knx/cover.py @@ -204,7 +204,7 @@ class KNXCover(CoverDevice): @callback def auto_updater_hook(self, now): """Call for the autoupdater.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() if self.device.position_reached(): self.stop_auto_updater() diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index 4fd86d078a06..dccc4ac07653 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -364,14 +364,14 @@ class KodiDevice(MediaPlayerDevice): self._item = {} self._media_position_updated_at = None self._media_position = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def async_on_volume_changed(self, sender, data): """Handle the volume changes.""" self._app_properties["volume"] = data["volume"] self._app_properties["muted"] = data["muted"] - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def async_on_quit(self, sender, data): @@ -429,7 +429,7 @@ class KodiDevice(MediaPlayerDevice): # to reconnect on the next poll. pass # Update HA state after Kodi disconnects - self.async_schedule_update_ha_state() + self.async_write_ha_state() # Create a task instead of adding a tracking job, since this task will # run until the websocket connection is closed. diff --git a/homeassistant/components/konnected/binary_sensor.py b/homeassistant/components/konnected/binary_sensor.py index 50f897e3a85a..f2f79f5ed7d6 100644 --- a/homeassistant/components/konnected/binary_sensor.py +++ b/homeassistant/components/konnected/binary_sensor.py @@ -87,4 +87,4 @@ class KonnectedBinarySensor(BinarySensorDevice): def async_set_state(self, state): """Update the sensor's state.""" self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/konnected/sensor.py b/homeassistant/components/konnected/sensor.py index e936898d7fbb..74554f2afc2b 100644 --- a/homeassistant/components/konnected/sensor.py +++ b/homeassistant/components/konnected/sensor.py @@ -137,4 +137,4 @@ class KonnectedSensor(Entity): self._state = int(float(state)) else: self._state = round(float(state), 1) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/konnected/switch.py b/homeassistant/components/konnected/switch.py index b8ddec20440c..afc83458aaf3 100644 --- a/homeassistant/components/konnected/switch.py +++ b/homeassistant/components/konnected/switch.py @@ -117,7 +117,7 @@ class KonnectedSwitch(ToggleEntity): def _set_state(self, state): self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() _LOGGER.debug( "Setting status of %s actuator zone %s to %s", self._device_id, diff --git a/homeassistant/components/lacrosse/sensor.py b/homeassistant/components/lacrosse/sensor.py index 1d38764710a4..f0ec885a8fe2 100644 --- a/homeassistant/components/lacrosse/sensor.py +++ b/homeassistant/components/lacrosse/sensor.py @@ -171,7 +171,7 @@ class LaCrosseSensor(Entity): """Triggered when value is expired.""" self._expiration_trigger = None self._value = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LaCrosseTemperature(LaCrosseSensor): diff --git a/homeassistant/components/lcn/binary_sensor.py b/homeassistant/components/lcn/binary_sensor.py index e0039f29e584..249adf04af8f 100644 --- a/homeassistant/components/lcn/binary_sensor.py +++ b/homeassistant/components/lcn/binary_sensor.py @@ -68,7 +68,7 @@ class LcnRegulatorLockSensor(LcnDevice, BinarySensorDevice): return self._value = input_obj.get_value().is_locked_regulator() - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnBinarySensor(LcnDevice, BinarySensorDevice): @@ -100,7 +100,7 @@ class LcnBinarySensor(LcnDevice, BinarySensorDevice): return self._value = input_obj.get_state(self.bin_sensor_port.value) - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnLockKeysSensor(LcnDevice, BinarySensorDevice): @@ -135,4 +135,4 @@ class LcnLockKeysSensor(LcnDevice, BinarySensorDevice): key_id = int(self.source.name[1]) - 1 self._value = input_obj.get_state(table_id, key_id) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lcn/climate.py b/homeassistant/components/lcn/climate.py index aec68af6076e..12fff2f479b8 100644 --- a/homeassistant/components/lcn/climate.py +++ b/homeassistant/components/lcn/climate.py @@ -125,7 +125,7 @@ class LcnClimate(LcnDevice, ClimateDevice): self.address_connection.lock_regulator(self.regulator_id, True) self._target_temperature = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_temperature(self, **kwargs): """Set new target temperature.""" @@ -137,7 +137,7 @@ class LcnClimate(LcnDevice, ClimateDevice): self.address_connection.var_abs( self.setpoint, self._target_temperature, self.unit ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set temperature value when LCN input object is received.""" @@ -151,4 +151,4 @@ class LcnClimate(LcnDevice, ClimateDevice): if self._is_on: self._target_temperature = input_obj.get_value().to_var_unit(self.unit) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lcn/cover.py b/homeassistant/components/lcn/cover.py index c1bd7070f538..ba831c3a1a92 100644 --- a/homeassistant/components/lcn/cover.py +++ b/homeassistant/components/lcn/cover.py @@ -108,7 +108,7 @@ class LcnOutputsCover(LcnDevice, CoverDevice): elif self.state_down and not self.state_up: self._closed = True # Cover closed - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnRelayCover(LcnDevice, CoverDevice): @@ -167,4 +167,4 @@ class LcnRelayCover(LcnDevice, CoverDevice): if states[self.motor_port_onoff]: # motor is on self._closed = states[self.motor_port_updown] # set direction - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lcn/light.py b/homeassistant/components/lcn/light.py index 4c67156c7873..40a592f89c92 100644 --- a/homeassistant/components/lcn/light.py +++ b/homeassistant/components/lcn/light.py @@ -132,7 +132,7 @@ class LcnOutputLight(LcnDevice, Light): self._is_dimming_to_zero = False if not self._is_dimming_to_zero: self._is_on = self.brightness > 0 - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnRelayLight(LcnDevice, Light): @@ -182,4 +182,4 @@ class LcnRelayLight(LcnDevice, Light): return self._is_on = input_obj.get_state(self.output.value) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lcn/sensor.py b/homeassistant/components/lcn/sensor.py index d4bb5566e34c..ddf7e61a3f60 100644 --- a/homeassistant/components/lcn/sensor.py +++ b/homeassistant/components/lcn/sensor.py @@ -78,7 +78,7 @@ class LcnVariableSensor(LcnDevice): return self._value = input_obj.get_value().to_var_unit(self.unit) - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnLedLogicSensor(LcnDevice): @@ -115,4 +115,4 @@ class LcnLedLogicSensor(LcnDevice): elif self.source in pypck.lcn_defs.LogicOpPort: self._value = input_obj.get_logic_op_state(self.source.value).name.lower() - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lcn/switch.py b/homeassistant/components/lcn/switch.py index f19548c4aee2..b0e16e412b32 100644 --- a/homeassistant/components/lcn/switch.py +++ b/homeassistant/components/lcn/switch.py @@ -76,7 +76,7 @@ class LcnOutputSwitch(LcnDevice, SwitchDevice): return self._is_on = input_obj.get_percent() > 0 - self.async_schedule_update_ha_state() + self.async_write_ha_state() class LcnRelaySwitch(LcnDevice, SwitchDevice): @@ -124,4 +124,4 @@ class LcnRelaySwitch(LcnDevice, SwitchDevice): return self._is_on = input_obj.get_state(self.output.value) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lightwave/light.py b/homeassistant/components/lightwave/light.py index 4aabcbc75c52..78e4c43a0e77 100644 --- a/homeassistant/components/lightwave/light.py +++ b/homeassistant/components/lightwave/light.py @@ -72,10 +72,10 @@ class LWRFLight(Light): else: self._lwlink.turn_on_light(self._device_id, self._name) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the LightWave light off.""" self._state = False self._lwlink.turn_off(self._device_id, self._name) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/lightwave/switch.py b/homeassistant/components/lightwave/switch.py index bfc4407458a3..16c2aa534627 100644 --- a/homeassistant/components/lightwave/switch.py +++ b/homeassistant/components/lightwave/switch.py @@ -49,10 +49,10 @@ class LWRFSwitch(SwitchDevice): """Turn the LightWave switch on.""" self._state = True self._lwlink.turn_on_switch(self._device_id, self._name) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the LightWave switch off.""" self._state = False self._lwlink.turn_off(self._device_id, self._name) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/mediaroom/media_player.py b/homeassistant/components/mediaroom/media_player.py index 28d20d0db4b5..8db9cb6fa37c 100644 --- a/homeassistant/components/mediaroom/media_player.py +++ b/homeassistant/components/mediaroom/media_player.py @@ -176,7 +176,7 @@ class MediaroomDevice(MediaPlayerDevice): self.set_state(stb_state) _LOGGER.debug("STB(%s) is [%s]", self.host, self._state) self._available = True - self.async_schedule_update_ha_state() + self.async_write_ha_state() async_dispatcher_connect(self.hass, SIGNAL_STB_NOTIFY, async_notify_received) @@ -200,7 +200,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def unique_id(self): @@ -242,7 +242,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self): """Turn off the receiver.""" @@ -254,7 +254,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_media_play(self): """Send play command.""" @@ -267,7 +267,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_media_pause(self): """Send pause command.""" @@ -279,7 +279,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_media_stop(self): """Send stop command.""" @@ -291,7 +291,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_media_previous_track(self): """Send Program Down command.""" @@ -303,7 +303,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_media_next_track(self): """Send Program Up command.""" @@ -315,7 +315,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_volume_up(self): """Send volume up command.""" @@ -325,7 +325,7 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_volume_down(self): """Send volume up command.""" @@ -334,7 +334,7 @@ class MediaroomDevice(MediaPlayerDevice): await self.stb.send_cmd("VolDown") except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_mute_volume(self, mute): """Send mute command.""" @@ -343,4 +343,4 @@ class MediaroomDevice(MediaPlayerDevice): await self.stb.send_cmd("Mute") except PyMediaroomError: self._available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/mobile_app/entity.py b/homeassistant/components/mobile_app/entity.py index 5200c6b0c124..7a12f617740e 100644 --- a/homeassistant/components/mobile_app/entity.py +++ b/homeassistant/components/mobile_app/entity.py @@ -103,4 +103,4 @@ class MobileAppEntity(Entity): return self._config = data - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/mqtt_room/sensor.py b/homeassistant/components/mqtt_room/sensor.py index 580ffd606f37..0d07133b3965 100644 --- a/homeassistant/components/mqtt_room/sensor.py +++ b/homeassistant/components/mqtt_room/sensor.py @@ -92,7 +92,7 @@ class MQTTRoomSensor(Entity): self._distance = distance self._updated = dt.utcnow() - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def message_received(msg): diff --git a/homeassistant/components/mychevy/binary_sensor.py b/homeassistant/components/mychevy/binary_sensor.py index e5b0dc8b6eaa..822a7988d0d2 100644 --- a/homeassistant/components/mychevy/binary_sensor.py +++ b/homeassistant/components/mychevy/binary_sensor.py @@ -73,7 +73,7 @@ class EVBinarySensor(BinarySensorDevice): """Update state.""" if self._car is not None: self._is_on = getattr(self._car, self._attr, None) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def should_poll(self): diff --git a/homeassistant/components/mychevy/sensor.py b/homeassistant/components/mychevy/sensor.py index f45c81a00072..9f8ea5607d9d 100644 --- a/homeassistant/components/mychevy/sensor.py +++ b/homeassistant/components/mychevy/sensor.py @@ -70,7 +70,7 @@ class MyChevyStatus(Entity): if self._state != MYCHEVY_SUCCESS: _LOGGER.debug("Successfully connected to mychevy website") self._state = MYCHEVY_SUCCESS - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def error(self): @@ -80,7 +80,7 @@ class MyChevyStatus(Entity): "This probably means the mychevy to OnStar link is down" ) self._state = MYCHEVY_ERROR - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def icon(self): @@ -156,7 +156,7 @@ class EVSensor(Entity): self._state = getattr(self._car, self._attr, None) for attr in self._extra_attrs: self._state_attributes[attr] = getattr(self._car, attr) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def state(self): diff --git a/homeassistant/components/mysensors/climate.py b/homeassistant/components/mysensors/climate.py index 4939c0c83e56..b00a0d0d9d54 100644 --- a/homeassistant/components/mysensors/climate.py +++ b/homeassistant/components/mysensors/climate.py @@ -162,7 +162,7 @@ class MySensorsHVAC(mysensors.device.MySensorsEntity, ClimateDevice): if self.gateway.optimistic: # Optimistically assume that device has changed state self._values[value_type] = value - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_fan_mode(self, fan_mode): """Set new target temperature.""" @@ -173,7 +173,7 @@ class MySensorsHVAC(mysensors.device.MySensorsEntity, ClimateDevice): if self.gateway.optimistic: # Optimistically assume that device has changed state self._values[set_req.V_HVAC_SPEED] = fan_mode - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_hvac_mode(self, hvac_mode): """Set new target temperature.""" @@ -187,7 +187,7 @@ class MySensorsHVAC(mysensors.device.MySensorsEntity, ClimateDevice): if self.gateway.optimistic: # Optimistically assume that device has changed state self._values[self.value_type] = hvac_mode - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the controller with the latest value from a sensor.""" diff --git a/homeassistant/components/mysensors/cover.py b/homeassistant/components/mysensors/cover.py index 6c02e430ba46..b60cf9457a95 100644 --- a/homeassistant/components/mysensors/cover.py +++ b/homeassistant/components/mysensors/cover.py @@ -52,7 +52,7 @@ class MySensorsCover(mysensors.device.MySensorsEntity, CoverDevice): self._values[set_req.V_DIMMER] = 100 else: self._values[set_req.V_LIGHT] = STATE_ON - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_close_cover(self, **kwargs): """Move the cover down.""" @@ -66,7 +66,7 @@ class MySensorsCover(mysensors.device.MySensorsEntity, CoverDevice): self._values[set_req.V_DIMMER] = 0 else: self._values[set_req.V_LIGHT] = STATE_OFF - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_cover_position(self, **kwargs): """Move the cover to a specific position.""" @@ -78,7 +78,7 @@ class MySensorsCover(mysensors.device.MySensorsEntity, CoverDevice): if self.gateway.optimistic: # Optimistically assume that cover has changed state. self._values[set_req.V_DIMMER] = position - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_stop_cover(self, **kwargs): """Stop the device.""" diff --git a/homeassistant/components/mysensors/light.py b/homeassistant/components/mysensors/light.py index b25cf977d83b..1585de4b4626 100644 --- a/homeassistant/components/mysensors/light.py +++ b/homeassistant/components/mysensors/light.py @@ -149,7 +149,7 @@ class MySensorsLight(mysensors.device.MySensorsEntity, Light): # optimistically assume that light has changed state self._state = False self._values[value_type] = STATE_OFF - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _async_update_light(self): @@ -189,7 +189,7 @@ class MySensorsLightDimmer(MySensorsLight): self._turn_on_light() self._turn_on_dimmer(**kwargs) if self.gateway.optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the controller with the latest value from a sensor.""" @@ -215,7 +215,7 @@ class MySensorsLightRGB(MySensorsLight): self._turn_on_dimmer(**kwargs) self._turn_on_rgb_and_w("%02x%02x%02x", **kwargs) if self.gateway.optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the controller with the latest value from a sensor.""" @@ -242,4 +242,4 @@ class MySensorsLightRGBW(MySensorsLightRGB): self._turn_on_dimmer(**kwargs) self._turn_on_rgb_and_w("%02x%02x%02x%02x", **kwargs) if self.gateway.optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/mysensors/switch.py b/homeassistant/components/mysensors/switch.py index ec28649d70f6..16bb1ee6deb0 100644 --- a/homeassistant/components/mysensors/switch.py +++ b/homeassistant/components/mysensors/switch.py @@ -99,7 +99,7 @@ class MySensorsSwitch(mysensors.device.MySensorsEntity, SwitchDevice): if self.gateway.optimistic: # Optimistically assume that switch has changed state self._values[self.value_type] = STATE_ON - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the switch off.""" @@ -109,7 +109,7 @@ class MySensorsSwitch(mysensors.device.MySensorsEntity, SwitchDevice): if self.gateway.optimistic: # Optimistically assume that switch has changed state self._values[self.value_type] = STATE_OFF - self.async_schedule_update_ha_state() + self.async_write_ha_state() class MySensorsIRSwitch(MySensorsSwitch): @@ -141,7 +141,7 @@ class MySensorsIRSwitch(MySensorsSwitch): # Optimistically assume that switch has changed state self._values[self.value_type] = self._ir_code self._values[set_req.V_LIGHT] = STATE_ON - self.async_schedule_update_ha_state() + self.async_write_ha_state() # Turn off switch after switch was turned on await self.async_turn_off() @@ -154,7 +154,7 @@ class MySensorsIRSwitch(MySensorsSwitch): if self.gateway.optimistic: # Optimistically assume that switch has changed state self._values[set_req.V_LIGHT] = STATE_OFF - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the controller with the latest value from a sensor.""" diff --git a/homeassistant/components/mystrom/binary_sensor.py b/homeassistant/components/mystrom/binary_sensor.py index 3da77d6d943b..c584440874a2 100644 --- a/homeassistant/components/mystrom/binary_sensor.py +++ b/homeassistant/components/mystrom/binary_sensor.py @@ -86,4 +86,4 @@ class MyStromBinarySensor(BinarySensorDevice): def async_on_update(self, value): """Receive an update.""" self._state = value - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/ness_alarm/alarm_control_panel.py b/homeassistant/components/ness_alarm/alarm_control_panel.py index f77244a584ed..8b7867fdc062 100644 --- a/homeassistant/components/ness_alarm/alarm_control_panel.py +++ b/homeassistant/components/ness_alarm/alarm_control_panel.py @@ -111,4 +111,4 @@ class NessAlarmPanel(alarm.AlarmControlPanel): else: _LOGGER.warning("Unhandled arming state: %s", arming_state) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/ness_alarm/binary_sensor.py b/homeassistant/components/ness_alarm/binary_sensor.py index 0f15b6e937b1..69acc97130d2 100644 --- a/homeassistant/components/ness_alarm/binary_sensor.py +++ b/homeassistant/components/ness_alarm/binary_sensor.py @@ -79,4 +79,4 @@ class NessZoneBinarySensor(BinarySensorDevice): """Handle zone state update.""" if self._zone_id == data.zone_id: self._state = data.state - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/opentherm_gw/binary_sensor.py b/homeassistant/components/opentherm_gw/binary_sensor.py index eff11554a397..663635cd06a4 100644 --- a/homeassistant/components/opentherm_gw/binary_sensor.py +++ b/homeassistant/components/opentherm_gw/binary_sensor.py @@ -69,7 +69,7 @@ class OpenThermBinarySensor(BinarySensorDevice): def receive_report(self, status): """Handle status updates from the component.""" self._state = bool(status.get(self._var)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def name(self): diff --git a/homeassistant/components/opentherm_gw/climate.py b/homeassistant/components/opentherm_gw/climate.py index 2db20662a774..b447018e7992 100644 --- a/homeassistant/components/opentherm_gw/climate.py +++ b/homeassistant/components/opentherm_gw/climate.py @@ -80,7 +80,7 @@ class OpenThermClimate(ClimateDevice): """Update climate entity options.""" self.floor_temp = entry.options[CONF_FLOOR_TEMP] self.temp_precision = entry.options[CONF_PRECISION] - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Connect to the OpenTherm Gateway device.""" @@ -144,7 +144,7 @@ class OpenThermClimate(ClimateDevice): self._away_state_b = ( status.get(gw_vars.OTGW_GPIO_B_STATE) == self._away_mode_b ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def name(self): @@ -253,7 +253,7 @@ class OpenThermClimate(ClimateDevice): self._new_target_temperature = await self._gateway.gateway.set_target_temp( temp ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def supported_features(self): diff --git a/homeassistant/components/opentherm_gw/sensor.py b/homeassistant/components/opentherm_gw/sensor.py index 3739f77e69df..c82cf14228b4 100644 --- a/homeassistant/components/opentherm_gw/sensor.py +++ b/homeassistant/components/opentherm_gw/sensor.py @@ -73,7 +73,7 @@ class OpenThermSensor(Entity): if isinstance(value, float): value = f"{value:2.1f}" self._value = value - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def name(self): diff --git a/homeassistant/components/otp/sensor.py b/homeassistant/components/otp/sensor.py index 3c4cd464d444..df5f6af16957 100644 --- a/homeassistant/components/otp/sensor.py +++ b/homeassistant/components/otp/sensor.py @@ -54,7 +54,7 @@ class TOTPSensor(Entity): @callback def _call_loop(self): self._state = self._otp.now() - self.async_schedule_update_ha_state() + self.async_write_ha_state() # Update must occur at even TIME_STEP, e.g. 12:00:00, 12:00:30, # 12:01:00, etc. in order to have synced time (see RFC6238) diff --git a/homeassistant/components/person/__init__.py b/homeassistant/components/person/__init__.py index 006929c7345f..8399719e861b 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -484,7 +484,7 @@ class Person(RestoreEntity): self._longitude = None self._gps_accuracy = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _parse_source_state(self, state): diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index 30542db5e237..c26c3f5e68a8 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -255,7 +255,7 @@ class Plant(Entity): self._state = STATE_OK self._problems = PROBLEM_NONE _LOGGER.debug("New data processed") - self.async_schedule_update_ha_state() + self.async_write_ha_state() def _check_min(self, sensor_name, value, params): """If configured, check the value against the defined minimum value.""" @@ -322,7 +322,7 @@ class Plant(Entity): except ValueError: pass _LOGGER.debug("Initializing from database completed") - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def should_poll(self): diff --git a/homeassistant/components/point/alarm_control_panel.py b/homeassistant/components/point/alarm_control_panel.py index e86b3dd42e87..d84c408e43a4 100644 --- a/homeassistant/components/point/alarm_control_panel.py +++ b/homeassistant/components/point/alarm_control_panel.py @@ -72,7 +72,7 @@ class MinutPointAlarmControl(AlarmControlPanel): _LOGGER.debug("Received webhook: %s", _type) self._home["alarm_status"] = _type self._changed_by = _changed_by - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def _home(self): diff --git a/homeassistant/components/point/binary_sensor.py b/homeassistant/components/point/binary_sensor.py index a08f7dbedc40..b417c128913d 100644 --- a/homeassistant/components/point/binary_sensor.py +++ b/homeassistant/components/point/binary_sensor.py @@ -95,7 +95,7 @@ class MinutPointBinarySensor(MinutPointEntity, BinarySensorDevice): self._is_on = True else: self._is_on = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _webhook_event(self, data, webhook): @@ -111,7 +111,7 @@ class MinutPointBinarySensor(MinutPointEntity, BinarySensorDevice): self._is_on = True if _type == self._events[1]: self._is_on = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): diff --git a/homeassistant/components/point/sensor.py b/homeassistant/components/point/sensor.py index 324565aae50c..70fe1ef0b6dc 100644 --- a/homeassistant/components/point/sensor.py +++ b/homeassistant/components/point/sensor.py @@ -62,7 +62,7 @@ class MinutPointSensor(MinutPointEntity): self.device.sensor, self.device_class ) self._updated = parse_datetime(self.device.last_update) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def icon(self): diff --git a/homeassistant/components/push/camera.py b/homeassistant/components/push/camera.py index f78966253b7c..31f2f88dac72 100644 --- a/homeassistant/components/push/camera.py +++ b/homeassistant/components/push/camera.py @@ -144,7 +144,7 @@ class PushCamera(Camera): self._state = STATE_IDLE self._expired_listener = None _LOGGER.debug("Reset state") - self.async_schedule_update_ha_state() + self.async_write_ha_state() if self._expired_listener: self._expired_listener() @@ -153,7 +153,7 @@ class PushCamera(Camera): self.hass, reset_state, dt_util.utcnow() + self._timeout ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_camera_image(self): """Return a still image response.""" diff --git a/homeassistant/components/qwikswitch/__init__.py b/homeassistant/components/qwikswitch/__init__.py index 33392c51be8e..c2d938f6ed77 100644 --- a/homeassistant/components/qwikswitch/__init__.py +++ b/homeassistant/components/qwikswitch/__init__.py @@ -87,7 +87,7 @@ class QSEntity(Entity): @callback def update_packet(self, packet): """Receive update packet from QSUSB. Match dispather_send signature.""" - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Listen for updates from QSUSb via dispatcher.""" diff --git a/homeassistant/components/qwikswitch/binary_sensor.py b/homeassistant/components/qwikswitch/binary_sensor.py index 054028b5629e..b3635dcb1f47 100644 --- a/homeassistant/components/qwikswitch/binary_sensor.py +++ b/homeassistant/components/qwikswitch/binary_sensor.py @@ -52,7 +52,7 @@ class QSBinarySensor(QSEntity, BinarySensorDevice): ) if val is not None: self._val = bool(val) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): diff --git a/homeassistant/components/qwikswitch/sensor.py b/homeassistant/components/qwikswitch/sensor.py index 4674da420b22..9609af42f654 100644 --- a/homeassistant/components/qwikswitch/sensor.py +++ b/homeassistant/components/qwikswitch/sensor.py @@ -51,7 +51,7 @@ class QSSensor(QSEntity): ) if val is not None: self._val = val - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def state(self): diff --git a/homeassistant/components/rflink/__init__.py b/homeassistant/components/rflink/__init__.py index b8665fae9ef2..9ba008a56ef5 100644 --- a/homeassistant/components/rflink/__init__.py +++ b/homeassistant/components/rflink/__init__.py @@ -313,7 +313,7 @@ class RflinkDevice(Entity): self._handle_event(event) # Propagate changes through ha - self.async_schedule_update_ha_state() + self.async_write_ha_state() # Put command onto bus for user to subscribe to if self._should_fire_event and identify_event_type(event) == EVENT_KEY_COMMAND: @@ -360,7 +360,7 @@ class RflinkDevice(Entity): def _availability_callback(self, availability): """Update availability state.""" self._available = availability - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Register update callback.""" diff --git a/homeassistant/components/rflink/binary_sensor.py b/homeassistant/components/rflink/binary_sensor.py index 148a7db2b64c..ab50e6dcc4b3 100644 --- a/homeassistant/components/rflink/binary_sensor.py +++ b/homeassistant/components/rflink/binary_sensor.py @@ -84,7 +84,7 @@ class RflinkBinarySensor(RflinkDevice, BinarySensorDevice): """Switch device off after a delay.""" self._delay_listener = None self._state = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() if self._delay_listener is not None: self._delay_listener() diff --git a/homeassistant/components/ring/light.py b/homeassistant/components/ring/light.py index fa47ac35ee37..3340e0ad603f 100644 --- a/homeassistant/components/ring/light.py +++ b/homeassistant/components/ring/light.py @@ -82,7 +82,7 @@ class RingLight(RingEntityMixin, Light): self._light_on = new_state == ON_STATE self._no_updates_until = dt_util.utcnow() + SKIP_UPDATES_DELAY - self.async_schedule_update_ha_state() + self.async_write_ha_state() def turn_on(self, **kwargs): """Turn the light on for 30 seconds.""" diff --git a/homeassistant/components/satel_integra/alarm_control_panel.py b/homeassistant/components/satel_integra/alarm_control_panel.py index d4294788fdda..6034c24e31a7 100644 --- a/homeassistant/components/satel_integra/alarm_control_panel.py +++ b/homeassistant/components/satel_integra/alarm_control_panel.py @@ -78,7 +78,7 @@ class SatelIntegraAlarmPanel(alarm.AlarmControlPanel): _LOGGER.debug("Got status update, current status: %s", state) if state != self._state: self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() else: _LOGGER.debug("Ignoring alarm status message, same state") diff --git a/homeassistant/components/satel_integra/binary_sensor.py b/homeassistant/components/satel_integra/binary_sensor.py index cbe760c06bf1..5b268266dda1 100644 --- a/homeassistant/components/satel_integra/binary_sensor.py +++ b/homeassistant/components/satel_integra/binary_sensor.py @@ -110,4 +110,4 @@ class SatelIntegraBinarySensor(BinarySensorDevice): """Update the zone's state, if needed.""" if self._device_number in zones and self._state != zones[self._device_number]: self._state = zones[self._device_number] - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/satel_integra/switch.py b/homeassistant/components/satel_integra/switch.py index 9233b3d152d9..46f4de2784f4 100644 --- a/homeassistant/components/satel_integra/switch.py +++ b/homeassistant/components/satel_integra/switch.py @@ -65,13 +65,13 @@ class SatelIntegraSwitch(SwitchDevice): _LOGGER.debug("New state: %s", new_state) if new_state != self._state: self._state = new_state - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self, **kwargs): """Turn the device on.""" _LOGGER.debug("Switch: %s status: %s, turning on", self._name, self._state) await self._satel.set_output(self._code, self._device_number, True) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the device off.""" @@ -79,7 +79,7 @@ class SatelIntegraSwitch(SwitchDevice): "Switch name: %s status: %s, turning off", self._name, self._state ) await self._satel.set_output(self._code, self._device_number, False) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self): diff --git a/homeassistant/components/serial/sensor.py b/homeassistant/components/serial/sensor.py index a08f9522c4b9..bc9ef9f9e794 100644 --- a/homeassistant/components/serial/sensor.py +++ b/homeassistant/components/serial/sensor.py @@ -84,7 +84,7 @@ class SerialSensor(Entity): _LOGGER.debug("Received: %s", line) self._state = line - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def stop_serial_read(self): """Close resources.""" diff --git a/homeassistant/components/sisyphus/light.py b/homeassistant/components/sisyphus/light.py index 7c1b0ece4bf2..271db41ac225 100644 --- a/homeassistant/components/sisyphus/light.py +++ b/homeassistant/components/sisyphus/light.py @@ -36,7 +36,7 @@ class SisyphusLight(Light): async def async_added_to_hass(self): """Add listeners after this object has been initialized.""" - self._table.add_listener(lambda: self.async_schedule_update_ha_state(False)) + self._table.add_listener(self.async_write_ha_state) @property def available(self): diff --git a/homeassistant/components/sisyphus/media_player.py b/homeassistant/components/sisyphus/media_player.py index e708504ff7ed..103ec694d83e 100644 --- a/homeassistant/components/sisyphus/media_player.py +++ b/homeassistant/components/sisyphus/media_player.py @@ -67,7 +67,7 @@ class SisyphusPlayer(MediaPlayerDevice): async def async_added_to_hass(self): """Add listeners after this object has been initialized.""" - self._table.add_listener(lambda: self.async_schedule_update_ha_state(False)) + self._table.add_listener(self.async_write_ha_state) @property def unique_id(self): diff --git a/homeassistant/components/smartthings/climate.py b/homeassistant/components/smartthings/climate.py index 232540ee47b0..83a1af981db8 100644 --- a/homeassistant/components/smartthings/climate.py +++ b/homeassistant/components/smartthings/climate.py @@ -336,7 +336,7 @@ class SmartThingsAirConditioner(SmartThingsEntity, ClimateDevice): await self._device.set_fan_mode(fan_mode, set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_hvac_mode(self, hvac_mode): """Set new target operation mode.""" @@ -355,7 +355,7 @@ class SmartThingsAirConditioner(SmartThingsEntity, ClimateDevice): await asyncio.gather(*tasks) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_temperature(self, **kwargs): """Set new target temperature.""" @@ -376,21 +376,21 @@ class SmartThingsAirConditioner(SmartThingsEntity, ClimateDevice): await asyncio.gather(*tasks) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self): """Turn device on.""" await self._device.switch_on(set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self): """Turn device off.""" await self._device.switch_off(set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the calculated fields of the AC.""" diff --git a/homeassistant/components/smartthings/fan.py b/homeassistant/components/smartthings/fan.py index aad62aed486c..e366f6bb3e3e 100644 --- a/homeassistant/components/smartthings/fan.py +++ b/homeassistant/components/smartthings/fan.py @@ -48,7 +48,7 @@ class SmartThingsFan(SmartThingsEntity, FanEntity): await self._device.set_fan_speed(value, set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self, speed: str = None, **kwargs) -> None: """Turn the fan on.""" @@ -59,14 +59,14 @@ class SmartThingsFan(SmartThingsEntity, FanEntity): await self._device.switch_on(set_status=True) # State is set optimistically in the commands above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs) -> None: """Turn the fan off.""" await self._device.switch_off(set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_on(self) -> bool: diff --git a/homeassistant/components/smartthings/lock.py b/homeassistant/components/smartthings/lock.py index 2895bde0bf71..d249cc5ac947 100644 --- a/homeassistant/components/smartthings/lock.py +++ b/homeassistant/components/smartthings/lock.py @@ -44,12 +44,12 @@ class SmartThingsLock(SmartThingsEntity, LockDevice): async def async_lock(self, **kwargs): """Lock the device.""" await self._device.lock(set_status=True) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_unlock(self, **kwargs): """Unlock the device.""" await self._device.unlock(set_status=True) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_locked(self): diff --git a/homeassistant/components/smartthings/switch.py b/homeassistant/components/smartthings/switch.py index ace47a56d2cc..eb9c9c90c4ba 100644 --- a/homeassistant/components/smartthings/switch.py +++ b/homeassistant/components/smartthings/switch.py @@ -37,14 +37,14 @@ class SmartThingsSwitch(SmartThingsEntity, SwitchDevice): await self._device.switch_off(set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self, **kwargs) -> None: """Turn the switch on.""" await self._device.switch_on(set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def current_power_w(self): diff --git a/homeassistant/components/snapcast/media_player.py b/homeassistant/components/snapcast/media_player.py index c3c9138eb89c..004dd36ed4a9 100644 --- a/homeassistant/components/snapcast/media_player.py +++ b/homeassistant/components/snapcast/media_player.py @@ -176,17 +176,17 @@ class SnapcastGroupDevice(MediaPlayerDevice): streams = self._group.streams_by_name() if source in streams: await self._group.set_stream(streams[source].identifier) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_mute_volume(self, mute): """Send the mute command.""" await self._group.set_muted(mute) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_volume_level(self, volume): """Set the volume level.""" await self._group.set_volume(round(volume * 100)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() def snapshot(self): """Snapshot the group state.""" @@ -273,17 +273,17 @@ class SnapcastClientDevice(MediaPlayerDevice): streams = self._client.group.streams_by_name() if source in streams: await self._client.group.set_stream(streams[source].identifier) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_mute_volume(self, mute): """Send the mute command.""" await self._client.set_muted(mute) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_volume_level(self, volume): """Set the volume level.""" await self._client.set_volume(round(volume * 100)) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_join(self, master): """Join the group of the master player.""" @@ -293,12 +293,12 @@ class SnapcastClientDevice(MediaPlayerDevice): if master.identifier in group.clients ] await master_group[0].add_client(self._client.identifier) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_unjoin(self): """Unjoin the group the player is currently in.""" await self._client.group.remove_client(self._client.identifier) - self.async_schedule_update_ha_state() + self.async_write_ha_state() def snapshot(self): """Snapshot the client state.""" diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index bb1179bb1e70..d54e6dd968f9 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -464,7 +464,7 @@ class SonosEntity(MediaPlayerDevice): self._seen_timer() self.async_unseen() - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def async_unseen(self, now=None): @@ -483,7 +483,7 @@ class SonosEntity(MediaPlayerDevice): self._subscriptions = [] - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def available(self) -> bool: @@ -725,7 +725,7 @@ class SonosEntity(MediaPlayerDevice): self._coordinator = None self._sonos_group = sonos_group - self.async_schedule_update_ha_state() + self.async_write_ha_state() for slave_uid in group[1:]: slave = _get_entity_from_soco_uid(self.hass, slave_uid) diff --git a/homeassistant/components/switcher_kis/switch.py b/homeassistant/components/switcher_kis/switch.py index 8c9c9e1a6fa3..4ace2c6eea1f 100644 --- a/homeassistant/components/switcher_kis/switch.py +++ b/homeassistant/components/switcher_kis/switch.py @@ -121,7 +121,7 @@ class SwitcherControl(SwitchDevice): else: self._device_data = device_data self._state = self._device_data.state - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_on(self, **kwargs: Dict) -> None: """Turn the entity on.""" @@ -149,4 +149,4 @@ class SwitcherControl(SwitchDevice): if response and response.successful: self._self_initiated = True self._state = SWITCHER_STATE_ON if send_on else SWITCHER_STATE_OFF - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/tellduslive/entry.py b/homeassistant/components/tellduslive/entry.py index 50a219bf7a15..851823385dc4 100644 --- a/homeassistant/components/tellduslive/entry.py +++ b/homeassistant/components/tellduslive/entry.py @@ -43,7 +43,7 @@ class TelldusLiveEntity(Entity): """Return the property of the device might have changed.""" if self.device.name: self._name = self.device.name - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def device_id(self): diff --git a/homeassistant/components/template/alarm_control_panel.py b/homeassistant/components/template/alarm_control_panel.py index 45cccef9766e..937119ff6d40 100644 --- a/homeassistant/components/template/alarm_control_panel.py +++ b/homeassistant/components/template/alarm_control_panel.py @@ -236,7 +236,7 @@ class AlarmControlPanelTemplate(AlarmControlPanel): _LOGGER.error("No script action defined for %s", state) if optimistic_set: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_alarm_arm_away(self, code=None): """Arm the panel to Away.""" diff --git a/homeassistant/components/template/binary_sensor.py b/homeassistant/components/template/binary_sensor.py index 8991ce4c65b7..df918d3dd776 100644 --- a/homeassistant/components/template/binary_sensor.py +++ b/homeassistant/components/template/binary_sensor.py @@ -283,7 +283,7 @@ class BinarySensorTemplate(BinarySensorDevice): def set_state(): """Set state of template binary sensor.""" self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() # state without delay if (state and not self._delay_on) or (not state and not self._delay_off): diff --git a/homeassistant/components/template/cover.py b/homeassistant/components/template/cover.py index 14fc69963787..3e3232f2b911 100644 --- a/homeassistant/components/template/cover.py +++ b/homeassistant/components/template/cover.py @@ -322,7 +322,7 @@ class CoverTemplate(CoverDevice): ) if self._optimistic: self._position = 100 - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_close_cover(self, **kwargs): """Move the cover down.""" @@ -334,7 +334,7 @@ class CoverTemplate(CoverDevice): ) if self._optimistic: self._position = 0 - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_stop_cover(self, **kwargs): """Fire the stop action.""" @@ -348,7 +348,7 @@ class CoverTemplate(CoverDevice): {"position": self._position}, context=self._context ) if self._optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_open_cover_tilt(self, **kwargs): """Tilt the cover open.""" @@ -357,7 +357,7 @@ class CoverTemplate(CoverDevice): {"tilt": self._tilt_value}, context=self._context ) if self._tilt_optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_close_cover_tilt(self, **kwargs): """Tilt the cover closed.""" @@ -366,7 +366,7 @@ class CoverTemplate(CoverDevice): {"tilt": self._tilt_value}, context=self._context ) if self._tilt_optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_set_cover_tilt_position(self, **kwargs): """Move the cover tilt to a specific position.""" @@ -375,7 +375,7 @@ class CoverTemplate(CoverDevice): {"tilt": self._tilt_value}, context=self._context ) if self._tilt_optimistic: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update the state from the template.""" diff --git a/homeassistant/components/template/light.py b/homeassistant/components/template/light.py index 7948782479b7..52560ea27329 100644 --- a/homeassistant/components/template/light.py +++ b/homeassistant/components/template/light.py @@ -316,14 +316,14 @@ class LightTemplate(Light): await self._on_script.async_run() if optimistic_set: - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the light off.""" await self._off_script.async_run(context=self._context) if self._template is None: self._state = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_update(self): """Update from templates.""" diff --git a/homeassistant/components/template/lock.py b/homeassistant/components/template/lock.py index f4a6b55dd18f..a5caac001231 100644 --- a/homeassistant/components/template/lock.py +++ b/homeassistant/components/template/lock.py @@ -174,12 +174,12 @@ class TemplateLock(LockDevice): """Lock the device.""" if self._optimistic: self._state = True - self.async_schedule_update_ha_state() + self.async_write_ha_state() await self._command_lock.async_run(context=self._context) async def async_unlock(self, **kwargs): """Unlock the device.""" if self._optimistic: self._state = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() await self._command_unlock.async_run(context=self._context) diff --git a/homeassistant/components/tibber/sensor.py b/homeassistant/components/tibber/sensor.py index a5a7f320d933..9e95f3cc05b1 100644 --- a/homeassistant/components/tibber/sensor.py +++ b/homeassistant/components/tibber/sensor.py @@ -169,7 +169,7 @@ class TibberSensorRT(TibberSensor): continue self._device_state_attributes[key] = value - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def available(self): diff --git a/homeassistant/components/time_date/sensor.py b/homeassistant/components/time_date/sensor.py index 1deb564133ed..6081f1dfca64 100644 --- a/homeassistant/components/time_date/sensor.py +++ b/homeassistant/components/time_date/sensor.py @@ -136,7 +136,7 @@ class TimeDateSensor(Entity): def point_in_time_listener(self, time_date): """Get the latest data and update state.""" self._update_internal_state(time_date) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async_track_point_in_utc_time( self.hass, self.point_in_time_listener, self.get_next_interval() ) diff --git a/homeassistant/components/tod/binary_sensor.py b/homeassistant/components/tod/binary_sensor.py index 72507b3d1481..ee9969c9974a 100644 --- a/homeassistant/components/tod/binary_sensor.py +++ b/homeassistant/components/tod/binary_sensor.py @@ -234,7 +234,7 @@ class TodSensor(BinarySensorDevice): def _point_in_time_listener(self, now): """Run when the state of the sensor should be updated.""" self._calculate_next_update() - self.async_schedule_update_ha_state() + self.async_write_ha_state() async_track_point_in_utc_time( self.hass, self._point_in_time_listener, self.next_update diff --git a/homeassistant/components/torque/sensor.py b/homeassistant/components/torque/sensor.py index f084c135e474..dbb650a8b48d 100644 --- a/homeassistant/components/torque/sensor.py +++ b/homeassistant/components/torque/sensor.py @@ -143,4 +143,4 @@ class TorqueSensor(Entity): def async_on_update(self, value): """Receive an update.""" self._state = value - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/tradfri/base_class.py b/homeassistant/components/tradfri/base_class.py index 358056d7ef60..0850bec6c9bc 100644 --- a/homeassistant/components/tradfri/base_class.py +++ b/homeassistant/components/tradfri/base_class.py @@ -33,7 +33,7 @@ class TradfriBaseClass(Entity): def _async_start_observe(self, exc=None): """Start observation of device.""" if exc: - self.async_schedule_update_ha_state() + self.async_write_ha_state() _LOGGER.warning("Observation failed for %s", self._name, exc_info=exc) try: @@ -70,7 +70,7 @@ class TradfriBaseClass(Entity): def _observe_update(self, device): """Receive new state data for this device.""" self._refresh(device) - self.async_schedule_update_ha_state() + self.async_write_ha_state() def _refresh(self, device): """Refresh the device data.""" diff --git a/homeassistant/components/unifi/device_tracker.py b/homeassistant/components/unifi/device_tracker.py index 07e96a45fce5..43494ec485fc 100644 --- a/homeassistant/components/unifi/device_tracker.py +++ b/homeassistant/components/unifi/device_tracker.py @@ -217,7 +217,7 @@ class UniFiClientTracker(UniFiClient, ScannerEntity): """Scheduled callback for update.""" self.is_disconnected = True self.cancel_scheduled_update = None - self.async_schedule_update_ha_state() + self.async_write_ha_state() if ( not self.is_wired @@ -323,7 +323,7 @@ class UniFiDeviceTracker(ScannerEntity): """Update the sensor's state.""" LOGGER.debug("Updating UniFi tracked device %s", self.entity_id) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def is_connected(self): diff --git a/homeassistant/components/unifi/unifi_client.py b/homeassistant/components/unifi/unifi_client.py index b46771e574bc..5efb73c2a01f 100644 --- a/homeassistant/components/unifi/unifi_client.py +++ b/homeassistant/components/unifi/unifi_client.py @@ -79,7 +79,7 @@ class UniFiClient(Entity): self.is_blocked = self.client.event.event in CLIENT_BLOCKED LOGGER.debug("Updating client %s %s", self.entity_id, self.client.mac) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def name(self) -> str: diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index ad82cd9e79f5..ad1b27f1fe09 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -163,7 +163,7 @@ class UtilityMeterSensor(RestoreEntity): _LOGGER.warning( "Invalid state (%s > %s): %s", old_state.state, new_state.state, err ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def async_tariff_change(self, entity, old_state, new_state): @@ -184,7 +184,7 @@ class UtilityMeterSensor(RestoreEntity): self._sensor_source_id, ) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def _async_reset_meter(self, event): """Determine cycle - Helper function for larger than daily cycles.""" diff --git a/homeassistant/components/w800rf32/binary_sensor.py b/homeassistant/components/w800rf32/binary_sensor.py index 9c83dbce804f..16239e0c98ca 100644 --- a/homeassistant/components/w800rf32/binary_sensor.py +++ b/homeassistant/components/w800rf32/binary_sensor.py @@ -130,7 +130,7 @@ class W800rf32BinarySensor(BinarySensorDevice): def update_state(self, state): """Update the state of the device.""" self._state = state - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Register update callback.""" diff --git a/homeassistant/components/waterfurnace/sensor.py b/homeassistant/components/waterfurnace/sensor.py index e2c92d07f9c0..14f3549b2a37 100644 --- a/homeassistant/components/waterfurnace/sensor.py +++ b/homeassistant/components/waterfurnace/sensor.py @@ -114,4 +114,4 @@ class WaterFurnaceSensor(Entity): """Update state.""" if self.client.data is not None: self._state = getattr(self.client.data, self._attr, None) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/webostv/media_player.py b/homeassistant/components/webostv/media_player.py index f4d9f97fe423..87f55fd6b2d6 100644 --- a/homeassistant/components/webostv/media_player.py +++ b/homeassistant/components/webostv/media_player.py @@ -153,7 +153,7 @@ class LgWebOSMediaPlayerEntity(MediaPlayerDevice): """Update state from WebOsClient.""" self.update_sources() - self.async_schedule_update_ha_state(False) + self.async_write_ha_state() def update_sources(self): """Update list of sources from current source, apps, inputs and configured list.""" diff --git a/homeassistant/components/websocket_api/sensor.py b/homeassistant/components/websocket_api/sensor.py index 4ae39787335a..a74381b8a856 100644 --- a/homeassistant/components/websocket_api/sensor.py +++ b/homeassistant/components/websocket_api/sensor.py @@ -54,4 +54,4 @@ class APICount(Entity): @callback def _update_count(self): self.count = self.hass.data.get(DATA_CONNECTIONS, 0) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/wemo/binary_sensor.py b/homeassistant/components/wemo/binary_sensor.py index db1ba60364e6..0ca1f950448f 100644 --- a/homeassistant/components/wemo/binary_sensor.py +++ b/homeassistant/components/wemo/binary_sensor.py @@ -55,7 +55,7 @@ class WemoBinarySensor(BinarySensorDevice): return await self._async_locked_update(force_update) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Wemo sensor added to Home Assistant.""" diff --git a/homeassistant/components/wemo/fan.py b/homeassistant/components/wemo/fan.py index cec481a2eb4a..24ed68c792de 100644 --- a/homeassistant/components/wemo/fan.py +++ b/homeassistant/components/wemo/fan.py @@ -172,7 +172,7 @@ class WemoHumidifier(FanEntity): return await self._async_locked_update(force_update) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def unique_id(self): diff --git a/homeassistant/components/wemo/light.py b/homeassistant/components/wemo/light.py index 5988019e66f8..b8c05ead0763 100644 --- a/homeassistant/components/wemo/light.py +++ b/homeassistant/components/wemo/light.py @@ -236,7 +236,7 @@ class WemoDimmer(Light): return await self._async_locked_update(force_update) - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Wemo dimmer added to Home Assistant.""" diff --git a/homeassistant/components/wemo/switch.py b/homeassistant/components/wemo/switch.py index ad8ea45ffd6b..4b6d99da200c 100644 --- a/homeassistant/components/wemo/switch.py +++ b/homeassistant/components/wemo/switch.py @@ -77,7 +77,7 @@ class WemoSwitch(SwitchDevice): return await self._async_locked_update(force_update) - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def unique_id(self): diff --git a/homeassistant/components/wirelesstag/binary_sensor.py b/homeassistant/components/wirelesstag/binary_sensor.py index 4fcebe73478c..07acf6057a10 100644 --- a/homeassistant/components/wirelesstag/binary_sensor.py +++ b/homeassistant/components/wirelesstag/binary_sensor.py @@ -140,4 +140,4 @@ class WirelessTagBinarySensor(WirelessTagBaseSensor, BinarySensorDevice): """Update state from arrived push notification.""" # state should be 'on' or 'off' self._state = event.data.get("state") - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/wirelesstag/sensor.py b/homeassistant/components/wirelesstag/sensor.py index fa72ab184e16..7a41d2377816 100644 --- a/homeassistant/components/wirelesstag/sensor.py +++ b/homeassistant/components/wirelesstag/sensor.py @@ -111,4 +111,4 @@ class WirelessTagSensor(WirelessTagBaseSensor): _LOGGER.debug("Entity to update state: %s event data: %s", self, event.data) new_value = self._sensor.value_from_update_event(event.data) self._state = self.decorate_value(new_value) - self.async_schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/xiaomi_aqara/__init__.py b/homeassistant/components/xiaomi_aqara/__init__.py index ae032a8b35f2..533238ac5e76 100644 --- a/homeassistant/components/xiaomi_aqara/__init__.py +++ b/homeassistant/components/xiaomi_aqara/__init__.py @@ -286,7 +286,7 @@ class XiaomiDevice(Entity): """Set state to UNAVAILABLE.""" self._remove_unavailability_tracker = None self._is_available = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() @callback def _async_track_unavailable(self): @@ -308,7 +308,7 @@ class XiaomiDevice(Entity): is_data = self.parse_data(data, raw_data) is_voltage = self.parse_voltage(data) if is_data or is_voltage or was_unavailable: - self.async_schedule_update_ha_state() + self.async_write_ha_state() def parse_voltage(self, data): """Parse battery level data sent by gateway.""" diff --git a/homeassistant/components/xiaomi_aqara/binary_sensor.py b/homeassistant/components/xiaomi_aqara/binary_sensor.py index a7e49f681c49..2c95198f3486 100644 --- a/homeassistant/components/xiaomi_aqara/binary_sensor.py +++ b/homeassistant/components/xiaomi_aqara/binary_sensor.py @@ -197,7 +197,7 @@ class XiaomiMotionSensor(XiaomiBinarySensor): """Set state to False.""" self._unsub_set_no_motion = None self._state = False - self.async_schedule_update_ha_state() + self.async_write_ha_state() def parse_data(self, data, raw_data): """Parse data sent by gateway. diff --git a/homeassistant/components/xiaomi_aqara/lock.py b/homeassistant/components/xiaomi_aqara/lock.py index befbfc001ba4..ed71e05bf5f0 100644 --- a/homeassistant/components/xiaomi_aqara/lock.py +++ b/homeassistant/components/xiaomi_aqara/lock.py @@ -63,7 +63,7 @@ class XiaomiAqaraLock(LockDevice, XiaomiDevice): def clear_unlock_state(self, _): """Clear unlock state automatically.""" self._state = STATE_LOCKED - self.async_schedule_update_ha_state() + self.async_write_ha_state() def parse_data(self, data, raw_data): """Parse data sent by gateway.""" diff --git a/homeassistant/components/yeelight/binary_sensor.py b/homeassistant/components/yeelight/binary_sensor.py index 29e24b510e55..3c06a75fb71a 100644 --- a/homeassistant/components/yeelight/binary_sensor.py +++ b/homeassistant/components/yeelight/binary_sensor.py @@ -2,7 +2,6 @@ import logging from homeassistant.components.binary_sensor import BinarySensorDevice -from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from . import DATA_UPDATED, DATA_YEELIGHT @@ -28,19 +27,21 @@ class YeelightNightlightModeSensor(BinarySensorDevice): def __init__(self, device): """Initialize nightlight mode sensor.""" self._device = device - - @callback - def _schedule_immediate_update(self): - self.async_schedule_update_ha_state() + self._unsub_disp = None async def async_added_to_hass(self): """Handle entity which will be added.""" - async_dispatcher_connect( + self._unsub_disp = async_dispatcher_connect( self.hass, DATA_UPDATED.format(self._device.ipaddr), - self._schedule_immediate_update, + self.async_write_ha_state, ) + async def async_will_remove_from_hass(self): + """When entity will be removed from hass.""" + self._unsub_disp() + self._unsub_disp = None + @property def should_poll(self): """No polling needed.""" diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 1491c10777ff..57c4fbe61998 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -1234,7 +1234,7 @@ class ZWaveDeviceEntity(ZWaveBaseEntity): ent_reg.async_update_entity(self.entity_id, new_entity_id=new_entity_id) return # else for the above two ifs, update if not using update_entity - self.async_schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Add device to dict.""" diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index 3b94991312a6..3fb5491ea626 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -273,7 +273,7 @@ class ZWaveNodeEntity(ZWaveBaseEntity): ent_reg.async_update_entity(self.entity_id, new_entity_id=new_entity_id) return # else for the above two ifs, update if not using update_entity - self.async_schedule_update_ha_state() + self.async_write_ha_state() def network_node_event(self, node, value): """Handle a node activated event on the network.""" diff --git a/tests/components/arcam_fmj/conftest.py b/tests/components/arcam_fmj/conftest.py index 6611cbaf9eb5..ec9c6bb1f368 100644 --- a/tests/components/arcam_fmj/conftest.py +++ b/tests/components/arcam_fmj/conftest.py @@ -55,5 +55,5 @@ def player_fixture(hass, state): player = ArcamFmj(state, MOCK_NAME, None) player.entity_id = MOCK_ENTITY_ID player.hass = hass - player.async_schedule_update_ha_state = Mock() + player.async_write_ha_state = Mock() return player diff --git a/tests/components/arcam_fmj/test_media_player.py b/tests/components/arcam_fmj/test_media_player.py index 2ff31a8fd4f1..a6b36a71d1cf 100644 --- a/tests/components/arcam_fmj/test_media_player.py +++ b/tests/components/arcam_fmj/test_media_player.py @@ -126,7 +126,7 @@ async def test_mute_volume(player, state, mute): """Test mute functionality.""" await player.async_mute_volume(mute) state.set_mute.assert_called_with(mute) - player.async_schedule_update_ha_state.assert_called_with() + player.async_write_ha_state.assert_called_with() async def test_name(player): @@ -203,14 +203,14 @@ async def test_volume_up(player, state): """Test mute functionality.""" await player.async_volume_up() state.inc_volume.assert_called_with() - player.async_schedule_update_ha_state.assert_called_with() + player.async_write_ha_state.assert_called_with() async def test_volume_down(player, state): """Test mute functionality.""" await player.async_volume_down() state.dec_volume.assert_called_with() - player.async_schedule_update_ha_state.assert_called_with() + player.async_write_ha_state.assert_called_with() @pytest.mark.parametrize( diff --git a/tests/components/default_config/test_init.py b/tests/components/default_config/test_init.py index 6b9004595bb0..2ec3467e0db2 100644 --- a/tests/components/default_config/test_init.py +++ b/tests/components/default_config/test_init.py @@ -5,25 +5,6 @@ import pytest from homeassistant.setup import async_setup_component -from tests.common import MockDependency, mock_coro - - -@pytest.fixture(autouse=True) -def zeroconf_mock(): - """Mock zeroconf.""" - with MockDependency("zeroconf") as mocked_zeroconf: - mocked_zeroconf.Zeroconf.return_value.register_service.return_value = mock_coro( - True - ) - yield - - -@pytest.fixture(autouse=True) -def netdisco_mock(): - """Mock netdisco.""" - with MockDependency("netdisco", "discovery"): - yield - @pytest.fixture(autouse=True) def recorder_url_mock(): diff --git a/tests/components/owntracks/test_config_flow.py b/tests/components/owntracks/test_config_flow.py index 21bb5bcf9939..ae999afe3056 100644 --- a/tests/components/owntracks/test_config_flow.py +++ b/tests/components/owntracks/test_config_flow.py @@ -16,7 +16,7 @@ CONF_WEBHOOK_URL = "webhook_url" BASE_URL = "http://example.com" CLOUDHOOK = False -SECRET = "secret" +SECRET = "test-secret" WEBHOOK_ID = "webhook_id" WEBHOOK_URL = f"{BASE_URL}/api/webhook/webhook_id" @@ -33,7 +33,7 @@ def mock_webhook_id(): @pytest.fixture(name="secret") def mock_secret(): """Mock secret.""" - with patch("binascii.hexlify", return_value=str.encode(SECRET)): + with patch("secrets.token_hex", return_value=SECRET): yield From 7ae802bb0db1169cb8a0264585c95cf70f7693ea Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 1 Apr 2020 15:25:04 -0700 Subject: [PATCH 005/653] Cloud do checks during setup (#33507) * Update cloud to do more tasks during async_setup * Upgrade hass_nabucasa to 0.33 --- homeassistant/components/cloud/__init__.py | 21 +++--------- homeassistant/components/cloud/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/cloud/test_binary_sensor.py | 34 ++++++++++---------- tests/components/cloud/test_init.py | 8 +---- 7 files changed, 27 insertions(+), 44 deletions(-) diff --git a/homeassistant/components/cloud/__init__.py b/homeassistant/components/cloud/__init__.py index 0a0b9f0fe889..a40529b6fe4a 100644 --- a/homeassistant/components/cloud/__init__.py +++ b/homeassistant/components/cloud/__init__.py @@ -10,7 +10,6 @@ from homeassistant.const import ( CONF_MODE, CONF_NAME, CONF_REGION, - EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, ) from homeassistant.core import callback @@ -191,11 +190,7 @@ async def async_setup(hass, config): client = CloudClient(hass, prefs, websession, alexa_conf, google_conf) cloud = hass.data[DOMAIN] = Cloud(client, **kwargs) - async def _startup(event): - """Startup event.""" - await cloud.start() - - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, _startup) + await cloud.start() async def _shutdown(event): """Shutdown event.""" @@ -230,17 +225,11 @@ async def async_setup(hass, config): return loaded = True - hass.async_create_task( - hass.helpers.discovery.async_load_platform( - "binary_sensor", DOMAIN, {}, config - ) - ) - hass.async_create_task( - hass.helpers.discovery.async_load_platform("stt", DOMAIN, {}, config) - ) - hass.async_create_task( - hass.helpers.discovery.async_load_platform("tts", DOMAIN, {}, config) + await hass.helpers.discovery.async_load_platform( + "binary_sensor", DOMAIN, {}, config ) + await hass.helpers.discovery.async_load_platform("stt", DOMAIN, {}, config) + await hass.helpers.discovery.async_load_platform("tts", DOMAIN, {}, config) cloud.iot.register_on_connect(_on_connect) diff --git a/homeassistant/components/cloud/manifest.json b/homeassistant/components/cloud/manifest.json index cfbb221c164e..b8c2bc277f09 100644 --- a/homeassistant/components/cloud/manifest.json +++ b/homeassistant/components/cloud/manifest.json @@ -2,7 +2,7 @@ "domain": "cloud", "name": "Home Assistant Cloud", "documentation": "https://www.home-assistant.io/integrations/cloud", - "requirements": ["hass-nabucasa==0.32.2"], + "requirements": ["hass-nabucasa==0.33.0"], "dependencies": ["http", "webhook", "alexa"], "after_dependencies": ["google_assistant"], "codeowners": ["@home-assistant/cloud"] diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index ca19feba5efb..f450fb6283c9 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -11,7 +11,7 @@ ciso8601==2.1.3 cryptography==2.8 defusedxml==0.6.0 distro==1.4.0 -hass-nabucasa==0.32.2 +hass-nabucasa==0.33.0 home-assistant-frontend==20200401.0 importlib-metadata==1.5.0 jinja2>=2.11.1 diff --git a/requirements_all.txt b/requirements_all.txt index 0cbc59f76c4f..3239eef2b2e4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -674,7 +674,7 @@ habitipy==0.2.0 hangups==0.4.9 # homeassistant.components.cloud -hass-nabucasa==0.32.2 +hass-nabucasa==0.33.0 # homeassistant.components.mqtt hbmqtt==0.9.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a5d9daf91d94..e4419872e5a3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -264,7 +264,7 @@ ha-ffmpeg==2.0 hangups==0.4.9 # homeassistant.components.cloud -hass-nabucasa==0.32.2 +hass-nabucasa==0.33.0 # homeassistant.components.mqtt hbmqtt==0.9.5 diff --git a/tests/components/cloud/test_binary_sensor.py b/tests/components/cloud/test_binary_sensor.py index 24b0563890bf..c4ad22abb2f2 100644 --- a/tests/components/cloud/test_binary_sensor.py +++ b/tests/components/cloud/test_binary_sensor.py @@ -1,24 +1,23 @@ """Tests for the cloud binary sensor.""" from unittest.mock import Mock +from asynctest import patch + from homeassistant.components.cloud.const import DISPATCHER_REMOTE_UPDATE from homeassistant.setup import async_setup_component async def test_remote_connection_sensor(hass): """Test the remote connection sensor.""" - from homeassistant.components.cloud import binary_sensor as bin_sensor - - bin_sensor.WAIT_UNTIL_CHANGE = 0 - assert await async_setup_component(hass, "cloud", {"cloud": {}}) await hass.async_block_till_done() assert hass.states.get("binary_sensor.remote_ui") is None # Fake connection/discovery - org_cloud = hass.data["cloud"] - await org_cloud.iot._on_connect[-1]() + await hass.helpers.discovery.async_load_platform( + "binary_sensor", "cloud", {}, {"cloud": {}} + ) # Mock test env cloud = hass.data["cloud"] = Mock() @@ -29,17 +28,18 @@ async def test_remote_connection_sensor(hass): assert state is not None assert state.state == "unavailable" - cloud.remote.is_connected = False - cloud.remote.certificate = object() - hass.helpers.dispatcher.async_dispatcher_send(DISPATCHER_REMOTE_UPDATE, {}) - await hass.async_block_till_done() + with patch("homeassistant.components.cloud.binary_sensor.WAIT_UNTIL_CHANGE", 0): + cloud.remote.is_connected = False + cloud.remote.certificate = object() + hass.helpers.dispatcher.async_dispatcher_send(DISPATCHER_REMOTE_UPDATE, {}) + await hass.async_block_till_done() - state = hass.states.get("binary_sensor.remote_ui") - assert state.state == "off" + state = hass.states.get("binary_sensor.remote_ui") + assert state.state == "off" - cloud.remote.is_connected = True - hass.helpers.dispatcher.async_dispatcher_send(DISPATCHER_REMOTE_UPDATE, {}) - await hass.async_block_till_done() + cloud.remote.is_connected = True + hass.helpers.dispatcher.async_dispatcher_send(DISPATCHER_REMOTE_UPDATE, {}) + await hass.async_block_till_done() - state = hass.states.get("binary_sensor.remote_ui") - assert state.state == "on" + state = hass.states.get("binary_sensor.remote_ui") + assert state.state == "on" diff --git a/tests/components/cloud/test_init.py b/tests/components/cloud/test_init.py index 9dd8695b9b21..10a7bc38c057 100644 --- a/tests/components/cloud/test_init.py +++ b/tests/components/cloud/test_init.py @@ -6,7 +6,7 @@ import pytest from homeassistant.components import cloud from homeassistant.components.cloud.const import DOMAIN from homeassistant.components.cloud.prefs import STORAGE_KEY -from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP +from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import Context from homeassistant.exceptions import Unauthorized from homeassistant.setup import async_setup_component @@ -103,12 +103,6 @@ async def test_remote_services(hass, mock_cloud_fixture, hass_read_only_user): async def test_startup_shutdown_events(hass, mock_cloud_fixture): """Test if the cloud will start on startup event.""" - with patch("hass_nabucasa.Cloud.start", return_value=mock_coro()) as mock_start: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - await hass.async_block_till_done() - - assert mock_start.called - with patch("hass_nabucasa.Cloud.stop", return_value=mock_coro()) as mock_stop: hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) await hass.async_block_till_done() From 4a4496b21d29830b30852c64ee3d5f3a481a5ff2 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 2 Apr 2020 00:04:41 +0000 Subject: [PATCH 006/653] [ci skip] Translation update --- .../components/hue/.translations/da.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/homeassistant/components/hue/.translations/da.json b/homeassistant/components/hue/.translations/da.json index afcfd7071e7e..c00c19be42a6 100644 --- a/homeassistant/components/hue/.translations/da.json +++ b/homeassistant/components/hue/.translations/da.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "F\u00f8rste knap", + "button_2": "Anden knap", + "button_3": "Tredje knap", + "button_4": "Fjerde knap", + "dim_down": "D\u00e6mp ned", + "dim_up": "D\u00e6mp op", + "turn_off": "Sluk", + "turn_on": "T\u00e6nd" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\"-knappen frigivet efter langt tryk", + "remote_button_short_press": "\"{subtype}\"-knappen trykket p\u00e5", + "remote_button_short_release": "\"{subtype}\"-knappen frigivet" + } } } \ No newline at end of file From e28bcb52d906378de6f7874416f06fc691ca5cbd Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Thu, 2 Apr 2020 09:38:43 +0200 Subject: [PATCH 007/653] Update azure-pipelines-wheels.yml for Azure Pipelines --- azure-pipelines-wheels.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/azure-pipelines-wheels.yml b/azure-pipelines-wheels.yml index 2f9944db3e02..9bc22ae66898 100644 --- a/azure-pipelines-wheels.yml +++ b/azure-pipelines-wheels.yml @@ -1,7 +1,6 @@ # https://dev.azure.com/home-assistant trigger: - batch: true branches: include: - dev @@ -16,7 +15,6 @@ schedules: branches: include: - dev - always: true variables: - name: versionWheels value: '1.10.1-3.7-alpine3.11' From be3cf52613a89e0794d9bcde9fef0a67b9e5629a Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 2 Apr 2020 03:09:59 -0500 Subject: [PATCH 008/653] Update to roku==4.1.0 (#33520) * Update manifest.json * Update requirements_test_all.txt * Update requirements_all.txt --- homeassistant/components/roku/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/roku/manifest.json b/homeassistant/components/roku/manifest.json index e9cdb8971159..43ccb6b8ad3a 100644 --- a/homeassistant/components/roku/manifest.json +++ b/homeassistant/components/roku/manifest.json @@ -2,7 +2,7 @@ "domain": "roku", "name": "Roku", "documentation": "https://www.home-assistant.io/integrations/roku", - "requirements": ["roku==4.0.0"], + "requirements": ["roku==4.1.0"], "dependencies": [], "ssdp": [ { diff --git a/requirements_all.txt b/requirements_all.txt index 3239eef2b2e4..2b87df584b21 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1807,7 +1807,7 @@ rjpl==0.3.5 rocketchat-API==0.6.1 # homeassistant.components.roku -roku==4.0.0 +roku==4.1.0 # homeassistant.components.roomba roombapy==1.4.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e4419872e5a3..543c0a006834 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -668,7 +668,7 @@ rflink==0.0.52 ring_doorbell==0.6.0 # homeassistant.components.roku -roku==4.0.0 +roku==4.1.0 # homeassistant.components.yamaha rxv==0.6.0 From 58ae117bb415e949a65d61abe3b1a19bca9ebca0 Mon Sep 17 00:00:00 2001 From: mvn23 Date: Thu, 2 Apr 2020 11:28:39 +0200 Subject: [PATCH 009/653] Add availability to opentherm_gw entities (#32408) * Add availability to opentherm_gw entities * Address PR comment --- homeassistant/components/opentherm_gw/binary_sensor.py | 8 +++++++- homeassistant/components/opentherm_gw/climate.py | 7 +++++++ homeassistant/components/opentherm_gw/sensor.py | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/opentherm_gw/binary_sensor.py b/homeassistant/components/opentherm_gw/binary_sensor.py index 663635cd06a4..62c0d3dd2c11 100644 --- a/homeassistant/components/opentherm_gw/binary_sensor.py +++ b/homeassistant/components/opentherm_gw/binary_sensor.py @@ -60,6 +60,11 @@ class OpenThermBinarySensor(BinarySensorDevice): ) self._unsub_updates() + @property + def available(self): + """Return availability of the sensor.""" + return self._state is not None + @property def entity_registry_enabled_default(self): """Disable binary_sensors by default.""" @@ -68,7 +73,8 @@ class OpenThermBinarySensor(BinarySensorDevice): @callback def receive_report(self, status): """Handle status updates from the component.""" - self._state = bool(status.get(self._var)) + state = status.get(self._var) + self._state = None if state is None else bool(state) self.async_write_ha_state() @property diff --git a/homeassistant/components/opentherm_gw/climate.py b/homeassistant/components/opentherm_gw/climate.py index b447018e7992..a7e7eedef34d 100644 --- a/homeassistant/components/opentherm_gw/climate.py +++ b/homeassistant/components/opentherm_gw/climate.py @@ -63,6 +63,7 @@ class OpenThermClimate(ClimateDevice): self.friendly_name = gw_dev.name self.floor_temp = options.get(CONF_FLOOR_TEMP, DEFAULT_FLOOR_TEMP) self.temp_precision = options.get(CONF_PRECISION, DEFAULT_PRECISION) + self._available = False self._current_operation = None self._current_temperature = None self._hvac_mode = HVAC_MODE_HEAT @@ -101,6 +102,7 @@ class OpenThermClimate(ClimateDevice): @callback def receive_report(self, status): """Receive and handle a new report from the Gateway.""" + self._available = bool(status) ch_active = status.get(gw_vars.DATA_SLAVE_CH_ACTIVE) flame_on = status.get(gw_vars.DATA_SLAVE_FLAME_ON) cooling_active = status.get(gw_vars.DATA_SLAVE_COOLING_ACTIVE) @@ -146,6 +148,11 @@ class OpenThermClimate(ClimateDevice): ) self.async_write_ha_state() + @property + def available(self): + """Return availability of the sensor.""" + return self._available + @property def name(self): """Return the friendly name.""" diff --git a/homeassistant/components/opentherm_gw/sensor.py b/homeassistant/components/opentherm_gw/sensor.py index c82cf14228b4..b2f8e2729837 100644 --- a/homeassistant/components/opentherm_gw/sensor.py +++ b/homeassistant/components/opentherm_gw/sensor.py @@ -61,6 +61,11 @@ class OpenThermSensor(Entity): _LOGGER.debug("Removing OpenTherm Gateway sensor %s", self._friendly_name) self._unsub_updates() + @property + def available(self): + """Return availability of the sensor.""" + return self._value is not None + @property def entity_registry_enabled_default(self): """Disable sensors by default.""" From 5a55d508791aae65f16396691d014c73fb2095f0 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Thu, 2 Apr 2020 13:52:03 +0200 Subject: [PATCH 010/653] Bump brother to 0.1.11 (#33526) --- homeassistant/components/brother/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/fixtures/brother_printer_data.json | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/brother/manifest.json b/homeassistant/components/brother/manifest.json index 24150c513dfd..7f48c7ee22c1 100644 --- a/homeassistant/components/brother/manifest.json +++ b/homeassistant/components/brother/manifest.json @@ -4,7 +4,7 @@ "documentation": "https://www.home-assistant.io/integrations/brother", "dependencies": [], "codeowners": ["@bieniu"], - "requirements": ["brother==0.1.9"], + "requirements": ["brother==0.1.11"], "zeroconf": ["_printer._tcp.local."], "config_flow": true, "quality_scale": "platinum" diff --git a/requirements_all.txt b/requirements_all.txt index 2b87df584b21..d3d1f669df95 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -358,7 +358,7 @@ bravia-tv==1.0.1 broadlink==0.13.0 # homeassistant.components.brother -brother==0.1.9 +brother==0.1.11 # homeassistant.components.brottsplatskartan brottsplatskartan==0.0.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 543c0a006834..24986a574a17 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -140,7 +140,7 @@ bomradarloop==0.1.4 broadlink==0.13.0 # homeassistant.components.brother -brother==0.1.9 +brother==0.1.11 # homeassistant.components.buienradar buienradar==1.0.4 diff --git a/tests/fixtures/brother_printer_data.json b/tests/fixtures/brother_printer_data.json index f4c36d988b1e..a70d87673d0e 100644 --- a/tests/fixtures/brother_printer_data.json +++ b/tests/fixtures/brother_printer_data.json @@ -71,5 +71,6 @@ "a60100a70100a0" ], "1.3.6.1.4.1.2435.2.3.9.4.2.1.5.5.1.0": "0123456789", - "1.3.6.1.4.1.2435.2.3.9.4.2.1.5.4.5.2.0": "WAITING " + "1.3.6.1.4.1.2435.2.3.9.4.2.1.5.4.5.2.0": "WAITING ", + "1.3.6.1.2.1.43.7.1.1.4.1.1": "2004" } \ No newline at end of file From f8f05c4d0d491e8d4c9b17a885fd71f1498017dd Mon Sep 17 00:00:00 2001 From: Jonathan Keljo Date: Thu, 2 Apr 2020 07:33:54 -0700 Subject: [PATCH 011/653] Enable sisyphus to recover from bad DNS without restart (#32846) --- homeassistant/components/sisyphus/__init__.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/sisyphus/__init__.py b/homeassistant/components/sisyphus/__init__.py index 5ad59da5dee3..841fbb68178a 100644 --- a/homeassistant/components/sisyphus/__init__.py +++ b/homeassistant/components/sisyphus/__init__.py @@ -99,18 +99,23 @@ class TableHolder: async def get_table(self): """Return the Table held by this holder, connecting to it if needed.""" + if self._table: + return self._table + if not self._table_task: self._table_task = self._hass.async_create_task(self._connect_table()) return await self._table_task async def _connect_table(self): - - self._table = await Table.connect(self._host, self._session) - if self._name is None: - self._name = self._table.name - _LOGGER.debug("Connected to %s at %s", self._name, self._host) - return self._table + try: + self._table = await Table.connect(self._host, self._session) + if self._name is None: + self._name = self._table.name + _LOGGER.debug("Connected to %s at %s", self._name, self._host) + return self._table + finally: + self._table_task = None async def close(self): """Close the table held by this holder, if any.""" From 23e091696e50e29034f4dde450f6ab20dad0803b Mon Sep 17 00:00:00 2001 From: cgtobi Date: Thu, 2 Apr 2020 17:35:25 +0200 Subject: [PATCH 012/653] Fix netatmo device unavailable and services (#33509) * Handle unavailabe entities * Remove some logging * Set valve to lowest temp when turned off * Remove some logging * Address comments * Report entity as connected if update is successful * Fix stupidness * Fix --- homeassistant/components/netatmo/climate.py | 59 ++++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 1f1b7088b295..fe6526a16eb0 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -56,6 +56,7 @@ STATE_NETATMO_MAX = "max" STATE_NETATMO_AWAY = PRESET_AWAY STATE_NETATMO_OFF = STATE_OFF STATE_NETATMO_MANUAL = "manual" +STATE_NETATMO_HOME = "home" PRESET_MAP_NETATMO = { PRESET_FROST_GUARD: STATE_NETATMO_HG, @@ -173,8 +174,11 @@ class NetatmoThermostat(ClimateDevice): self._support_flags = SUPPORT_FLAGS self._hvac_mode = None self._battery_level = None + self._connected = None self.update_without_throttle = False - self._module_type = self._data.room_status.get(room_id, {}).get("module_type") + self._module_type = self._data.room_status.get(room_id, {}).get( + "module_type", NA_VALVE + ) if self._module_type == NA_THERM: self._operation_list.append(HVAC_MODE_OFF) @@ -252,25 +256,20 @@ class NetatmoThermostat(ClimateDevice): def set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - mode = None - if hvac_mode == HVAC_MODE_OFF: - mode = STATE_NETATMO_OFF + self.turn_off() elif hvac_mode == HVAC_MODE_AUTO: - mode = PRESET_SCHEDULE + if self.hvac_mode == HVAC_MODE_OFF: + self.turn_on() + self.set_preset_mode(PRESET_SCHEDULE) elif hvac_mode == HVAC_MODE_HEAT: - mode = PRESET_BOOST - - self.set_preset_mode(mode) + self.set_preset_mode(PRESET_BOOST) def set_preset_mode(self, preset_mode: str) -> None: """Set new preset mode.""" if self.target_temperature == 0: self._data.homestatus.setroomThermpoint( - self._data.home_id, - self._room_id, - STATE_NETATMO_MANUAL, - DEFAULT_MIN_TEMP, + self._data.home_id, self._room_id, STATE_NETATMO_HOME, ) if ( @@ -283,7 +282,7 @@ class NetatmoThermostat(ClimateDevice): STATE_NETATMO_MANUAL, DEFAULT_MAX_TEMP, ) - elif preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX, STATE_NETATMO_OFF]: + elif preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX]: self._data.homestatus.setroomThermpoint( self._data.home_id, self._room_id, PRESET_MAP_NETATMO[preset_mode] ) @@ -293,6 +292,7 @@ class NetatmoThermostat(ClimateDevice): ) else: _LOGGER.error("Preset mode '%s' not available", preset_mode) + self.update_without_throttle = True self.schedule_update_ha_state() @@ -328,6 +328,35 @@ class NetatmoThermostat(ClimateDevice): return attr + def turn_off(self): + """Turn the entity off.""" + if self._module_type == NA_VALVE: + self._data.homestatus.setroomThermpoint( + self._data.home_id, + self._room_id, + STATE_NETATMO_MANUAL, + DEFAULT_MIN_TEMP, + ) + elif self.hvac_mode != HVAC_MODE_OFF: + self._data.homestatus.setroomThermpoint( + self._data.home_id, self._room_id, STATE_NETATMO_OFF + ) + self.update_without_throttle = True + self.schedule_update_ha_state() + + def turn_on(self): + """Turn the entity on.""" + self._data.homestatus.setroomThermpoint( + self._data.home_id, self._room_id, STATE_NETATMO_HOME + ) + self.update_without_throttle = True + self.schedule_update_ha_state() + + @property + def available(self) -> bool: + """If the device hasn't been able to connect, mark as unavailable.""" + return bool(self._connected) + def update(self): """Get the latest data from NetAtmo API and updates the states.""" try: @@ -355,12 +384,14 @@ class NetatmoThermostat(ClimateDevice): self._battery_level = self._data.room_status[self._room_id].get( "battery_level" ) + self._connected = True except KeyError as err: - _LOGGER.error( + _LOGGER.debug( "The thermostat in room %s seems to be out of reach. (%s)", self._room_name, err, ) + self._connected = False self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY] From 314bc07cee616c9408bfa01b8db1fd6c8d71f6b1 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Thu, 2 Apr 2020 17:53:33 +0200 Subject: [PATCH 013/653] UniFi - Make POE control switches configurable (#32781) * Allow control whether POE switches are to be created or not * Fix options flow and test --- .../components/unifi/.translations/en.json | 3 +- homeassistant/components/unifi/config_flow.py | 6 ++ homeassistant/components/unifi/const.py | 2 + homeassistant/components/unifi/controller.py | 7 ++ homeassistant/components/unifi/strings.json | 3 +- homeassistant/components/unifi/switch.py | 97 +++++++++++-------- tests/components/unifi/test_config_flow.py | 3 + 7 files changed, 76 insertions(+), 45 deletions(-) diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index 8fdde34470b0..0124ca1cc244 100644 --- a/homeassistant/components/unifi/.translations/en.json +++ b/homeassistant/components/unifi/.translations/en.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "Network access controlled clients", - "new_client": "Add new client for network access control" + "new_client": "Add new client (MAC) for network access control", + "poe_clients": "Allow POE control of clients" }, "description": "Configure client controls\n\nCreate switches for serial numbers you want to control network access for.", "title": "UniFi options 2/3" diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index e0bb1c3bb9fc..781fcdeae828 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -19,12 +19,14 @@ from .const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, CONF_TRACK_CLIENTS, CONF_TRACK_DEVICES, CONF_TRACK_WIRED_CLIENTS, CONTROLLER_ID, + DEFAULT_POE_CLIENTS, DOMAIN, LOGGER, ) @@ -262,6 +264,10 @@ class UnifiOptionsFlowHandler(config_entries.OptionsFlow): step_id="client_control", data_schema=vol.Schema( { + vol.Optional( + CONF_POE_CLIENTS, + default=self.options.get(CONF_POE_CLIENTS, DEFAULT_POE_CLIENTS), + ): bool, vol.Optional( CONF_BLOCK_CLIENT, default=self.options[CONF_BLOCK_CLIENT] ): cv.multi_select(clients_to_block), diff --git a/homeassistant/components/unifi/const.py b/homeassistant/components/unifi/const.py index fd94601db50b..4acf75fbdd9f 100644 --- a/homeassistant/components/unifi/const.py +++ b/homeassistant/components/unifi/const.py @@ -14,12 +14,14 @@ UNIFI_WIRELESS_CLIENTS = "unifi_wireless_clients" CONF_ALLOW_BANDWIDTH_SENSORS = "allow_bandwidth_sensors" CONF_BLOCK_CLIENT = "block_client" CONF_DETECTION_TIME = "detection_time" +CONF_POE_CLIENTS = "poe_clients" CONF_TRACK_CLIENTS = "track_clients" CONF_TRACK_DEVICES = "track_devices" CONF_TRACK_WIRED_CLIENTS = "track_wired_clients" CONF_SSID_FILTER = "ssid_filter" DEFAULT_ALLOW_BANDWIDTH_SENSORS = False +DEFAULT_POE_CLIENTS = True DEFAULT_TRACK_CLIENTS = True DEFAULT_TRACK_DEVICES = True DEFAULT_TRACK_WIRED_CLIENTS = True diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index 50b758f01af6..03e079c01707 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -24,6 +24,7 @@ from .const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, CONF_TRACK_CLIENTS, @@ -32,6 +33,7 @@ from .const import ( CONTROLLER_ID, DEFAULT_ALLOW_BANDWIDTH_SENSORS, DEFAULT_DETECTION_TIME, + DEFAULT_POE_CLIENTS, DEFAULT_TRACK_CLIENTS, DEFAULT_TRACK_DEVICES, DEFAULT_TRACK_WIRED_CLIENTS, @@ -98,6 +100,11 @@ class UniFiController: """Config entry option with list of clients to control network access.""" return self.config_entry.options.get(CONF_BLOCK_CLIENT, []) + @property + def option_poe_clients(self): + """Config entry option to control poe clients.""" + return self.config_entry.options.get(CONF_POE_CLIENTS, DEFAULT_POE_CLIENTS) + @property def option_track_clients(self): """Config entry option to not track clients.""" diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index 58728225de7d..61116adfb60a 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -43,7 +43,8 @@ "client_control": { "data": { "block_client": "Network access controlled clients", - "new_client": "Add new client for network access control" + "new_client": "Add new client for network access control", + "poe_clients": "Allow POE control of clients" }, "description": "Configure client controls\n\nCreate switches for serial numbers you want to control network access for.", "title": "UniFi options 2/3" diff --git a/homeassistant/components/unifi/switch.py b/homeassistant/components/unifi/switch.py index 0df019de02cc..0547e35f064b 100644 --- a/homeassistant/components/unifi/switch.py +++ b/homeassistant/components/unifi/switch.py @@ -30,6 +30,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): switches_off = [] option_block_clients = controller.option_block_clients + option_poe_clients = controller.option_poe_clients entity_registry = await hass.helpers.entity_registry.async_get_registry() @@ -66,6 +67,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): def options_updated(): """Manage entities affected by config entry options.""" nonlocal option_block_clients + nonlocal option_poe_clients update = set() remove = set() @@ -82,16 +84,26 @@ async def async_setup_entry(hass, config_entry, async_add_entities): else: remove.add(block_client_id) - for block_client_id in remove: - entity = switches.pop(block_client_id) + if option_poe_clients != controller.option_poe_clients: + option_poe_clients = controller.option_poe_clients - if entity_registry.async_is_registered(entity.entity_id): - entity_registry.async_remove(entity.entity_id) + if option_poe_clients: + update.add("poe_clients_enabled") + else: + for poe_client_id, entity in switches.items(): + if isinstance(entity, UniFiPOEClientSwitch): + remove.add(poe_client_id) - hass.async_create_task(entity.async_remove()) + for client_id in remove: + entity = switches.pop(client_id) - if len(update) != len(option_block_clients): - update_controller() + if entity_registry.async_is_registered(entity.entity_id): + entity_registry.async_remove(entity.entity_id) + + hass.async_create_task(entity.async_remove()) + + if len(update) != len(option_block_clients): + update_controller() controller.listeners.append( async_dispatcher_connect( @@ -109,7 +121,6 @@ def add_entities(controller, async_add_entities, switches, switches_off): new_switches = [] devices = controller.api.devices - # block client for client_id in controller.option_block_clients: client = None @@ -130,49 +141,49 @@ def add_entities(controller, async_add_entities, switches, switches_off): switches[block_client_id] = UniFiBlockClientSwitch(client, controller) new_switches.append(switches[block_client_id]) - # control POE - for client_id in controller.api.clients: + if controller.option_poe_clients: + for client_id in controller.api.clients: - poe_client_id = f"poe-{client_id}" + poe_client_id = f"poe-{client_id}" - if poe_client_id in switches: - continue + if poe_client_id in switches: + continue - client = controller.api.clients[client_id] - - if poe_client_id in switches_off: - pass - # Network device with active POE - elif ( - client_id in controller.wireless_clients - or client.sw_mac not in devices - or not devices[client.sw_mac].ports[client.sw_port].port_poe - or not devices[client.sw_mac].ports[client.sw_port].poe_enable - or controller.mac == client.mac - ): - continue - - # Multiple POE-devices on same port means non UniFi POE driven switch - multi_clients_on_port = False - for client2 in controller.api.clients.values(): + client = controller.api.clients[client_id] if poe_client_id in switches_off: - break - - if ( - client2.is_wired - and client.mac != client2.mac - and client.sw_mac == client2.sw_mac - and client.sw_port == client2.sw_port + pass + # Network device with active POE + elif ( + client_id in controller.wireless_clients + or client.sw_mac not in devices + or not devices[client.sw_mac].ports[client.sw_port].port_poe + or not devices[client.sw_mac].ports[client.sw_port].poe_enable + or controller.mac == client.mac ): - multi_clients_on_port = True - break + continue - if multi_clients_on_port: - continue + # Multiple POE-devices on same port means non UniFi POE driven switch + multi_clients_on_port = False + for client2 in controller.api.clients.values(): - switches[poe_client_id] = UniFiPOEClientSwitch(client, controller) - new_switches.append(switches[poe_client_id]) + if poe_client_id in switches_off: + break + + if ( + client2.is_wired + and client.mac != client2.mac + and client.sw_mac == client2.sw_mac + and client.sw_port == client2.sw_port + ): + multi_clients_on_port = True + break + + if multi_clients_on_port: + continue + + switches[poe_client_id] = UniFiPOEClientSwitch(client, controller) + new_switches.append(switches[poe_client_id]) if new_switches: async_add_entities(new_switches) diff --git a/tests/components/unifi/test_config_flow.py b/tests/components/unifi/test_config_flow.py index 9a280ffe9e69..b89dbfeb700e 100644 --- a/tests/components/unifi/test_config_flow.py +++ b/tests/components/unifi/test_config_flow.py @@ -11,6 +11,7 @@ from homeassistant.components.unifi.const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, CONF_TRACK_CLIENTS, @@ -287,6 +288,7 @@ async def test_option_flow(hass): user_input={ CONF_BLOCK_CLIENT: clients_to_block, CONF_NEW_CLIENT: "00:00:00:00:00:01", + CONF_POE_CLIENTS: False, }, ) @@ -327,5 +329,6 @@ async def test_option_flow(hass): CONF_DETECTION_TIME: 100, CONF_SSID_FILTER: ["SSID 1"], CONF_BLOCK_CLIENT: ["00:00:00:00:00:01"], + CONF_POE_CLIENTS: False, CONF_ALLOW_BANDWIDTH_SENSORS: True, } From 4ebbabcdd162046e71ea642220e5b7c4bb8e89f3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Apr 2020 09:25:33 -0700 Subject: [PATCH 014/653] Unsub dispatcher when removing entity from hass (#33510) * Unsub dispatcher when removing entity from hass * Update homeassistant/components/plaato/sensor.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/volvooncall/__init__.py Co-Authored-By: Martin Hjelmare Co-authored-by: Martin Hjelmare --- homeassistant/components/abode/camera.py | 2 +- homeassistant/components/abode/switch.py | 2 +- homeassistant/components/aftership/sensor.py | 6 +++-- .../alarmdecoder/alarm_control_panel.py | 6 +++-- .../components/alarmdecoder/binary_sensor.py | 24 ++++++++++++------- .../components/alarmdecoder/sensor.py | 6 +++-- .../components/android_ip_webcam/__init__.py | 4 +++- homeassistant/components/aqualogic/sensor.py | 6 +++-- homeassistant/components/aqualogic/switch.py | 12 ++++------ .../components/arcam_fmj/media_player.py | 20 +++++++++++----- .../components/arlo/alarm_control_panel.py | 6 ++++- homeassistant/components/arlo/camera.py | 12 ++++------ homeassistant/components/arlo/sensor.py | 6 ++++- homeassistant/components/axis/axis_base.py | 8 +------ homeassistant/components/axis/camera.py | 2 +- homeassistant/components/comfoconnect/fan.py | 10 ++++---- .../components/comfoconnect/sensor.py | 10 ++++---- .../components/denonavr/media_player.py | 4 +++- .../components/eight_sleep/__init__.py | 12 ++++++++-- homeassistant/components/enocean/__init__.py | 6 +++-- .../envisalink/alarm_control_panel.py | 12 +++++++--- homeassistant/components/fastdotcom/sensor.py | 11 +++++---- homeassistant/components/ffmpeg/__init__.py | 18 ++++++++++---- .../components/geniushub/__init__.py | 2 +- homeassistant/components/hive/__init__.py | 10 ++------ homeassistant/components/hlk_sw16/__init__.py | 10 ++++---- homeassistant/components/homeworks/light.py | 4 +++- .../components/hydrawise/__init__.py | 6 +++-- .../components/iaqualink/__init__.py | 10 ++------ .../components/incomfort/__init__.py | 2 +- .../components/insteon/insteon_entity.py | 8 +++++-- homeassistant/components/iperf3/sensor.py | 11 +++++---- .../components/kaiterra/air_quality.py | 6 +++-- homeassistant/components/kaiterra/sensor.py | 6 +++-- .../components/konnected/binary_sensor.py | 6 +++-- .../components/mediaroom/media_player.py | 6 ++++- .../components/mychevy/binary_sensor.py | 6 +++-- homeassistant/components/mychevy/sensor.py | 12 +++++++--- homeassistant/components/mysensors/device.py | 16 ++++++++----- .../ness_alarm/alarm_control_panel.py | 6 +++-- .../components/ness_alarm/binary_sensor.py | 6 +++-- homeassistant/components/nest/__init__.py | 4 +++- homeassistant/components/nest/climate.py | 4 +++- .../components/netgear_lte/__init__.py | 6 +++-- .../components/nissan_leaf/__init__.py | 6 +++-- homeassistant/components/nzbget/sensor.py | 6 +++-- homeassistant/components/plaato/sensor.py | 6 +++-- .../components/qwikswitch/__init__.py | 6 +++-- homeassistant/components/rachio/switch.py | 6 +++-- .../components/raincloud/__init__.py | 6 +++-- homeassistant/components/repetier/sensor.py | 4 +++- homeassistant/components/rflink/__init__.py | 16 ++++++++----- homeassistant/components/rflink/sensor.py | 16 ++++++++----- homeassistant/components/sabnzbd/sensor.py | 6 ++++- .../satel_integra/alarm_control_panel.py | 6 +++-- .../components/satel_integra/binary_sensor.py | 6 +++-- .../components/spc/alarm_control_panel.py | 8 +++++-- homeassistant/components/spc/binary_sensor.py | 8 +++++-- .../components/speedtestdotnet/sensor.py | 6 +++-- .../components/switcher_kis/switch.py | 6 +++-- .../components/tellstick/__init__.py | 6 +++-- homeassistant/components/upnp/sensor.py | 6 +++-- homeassistant/components/vallox/fan.py | 6 +++-- homeassistant/components/vallox/sensor.py | 6 +++-- .../components/volvooncall/__init__.py | 6 +++-- .../components/waterfurnace/sensor.py | 6 +++-- .../components/websocket_api/sensor.py | 12 ++++++---- .../components/wirelesstag/binary_sensor.py | 10 ++++---- .../components/wirelesstag/sensor.py | 10 ++++---- .../components/yeelight/binary_sensor.py | 16 +++++-------- homeassistant/components/yeelight/light.py | 10 ++++---- 71 files changed, 355 insertions(+), 209 deletions(-) diff --git a/homeassistant/components/abode/camera.py b/homeassistant/components/abode/camera.py index bee736448900..e733bbd8abbe 100644 --- a/homeassistant/components/abode/camera.py +++ b/homeassistant/components/abode/camera.py @@ -48,7 +48,7 @@ class AbodeCamera(AbodeDevice, Camera): ) signal = f"abode_camera_capture_{self.entity_id}" - async_dispatcher_connect(self.hass, signal, self.capture) + self.async_on_remove(async_dispatcher_connect(self.hass, signal, self.capture)) def capture(self): """Request a new image capture.""" diff --git a/homeassistant/components/abode/switch.py b/homeassistant/components/abode/switch.py index b57f3fbe1430..bbd90442cd9e 100644 --- a/homeassistant/components/abode/switch.py +++ b/homeassistant/components/abode/switch.py @@ -53,7 +53,7 @@ class AbodeAutomationSwitch(AbodeAutomation, SwitchDevice): await super().async_added_to_hass() signal = f"abode_trigger_automation_{self.entity_id}" - async_dispatcher_connect(self.hass, signal, self.trigger) + self.async_on_remove(async_dispatcher_connect(self.hass, signal, self.trigger)) def turn_on(self, **kwargs): """Enable the automation.""" diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index eb0236cf3be7..293fe4c647a2 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -145,8 +145,10 @@ class AfterShipSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self._force_update + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self._force_update + ) ) async def _force_update(self): diff --git a/homeassistant/components/alarmdecoder/alarm_control_panel.py b/homeassistant/components/alarmdecoder/alarm_control_panel.py index 57004191064b..5625204c762f 100644 --- a/homeassistant/components/alarmdecoder/alarm_control_panel.py +++ b/homeassistant/components/alarmdecoder/alarm_control_panel.py @@ -96,8 +96,10 @@ class AlarmDecoderAlarmPanel(AlarmControlPanel): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_PANEL_MESSAGE, self._message_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_PANEL_MESSAGE, self._message_callback + ) ) def _message_callback(self, message): diff --git a/homeassistant/components/alarmdecoder/binary_sensor.py b/homeassistant/components/alarmdecoder/binary_sensor.py index 13a7913e1908..b34c90bc35ad 100644 --- a/homeassistant/components/alarmdecoder/binary_sensor.py +++ b/homeassistant/components/alarmdecoder/binary_sensor.py @@ -79,20 +79,28 @@ class AlarmDecoderBinarySensor(BinarySensorDevice): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_ZONE_FAULT, self._fault_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_ZONE_FAULT, self._fault_callback + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_ZONE_RESTORE, self._restore_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_ZONE_RESTORE, self._restore_callback + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_RFX_MESSAGE, self._rfx_message_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_RFX_MESSAGE, self._rfx_message_callback + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_REL_MESSAGE, self._rel_message_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_REL_MESSAGE, self._rel_message_callback + ) ) @property diff --git a/homeassistant/components/alarmdecoder/sensor.py b/homeassistant/components/alarmdecoder/sensor.py index 196e8d704e15..96e5feb532d3 100644 --- a/homeassistant/components/alarmdecoder/sensor.py +++ b/homeassistant/components/alarmdecoder/sensor.py @@ -29,8 +29,10 @@ class AlarmDecoderSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_PANEL_MESSAGE, self._message_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_PANEL_MESSAGE, self._message_callback + ) ) def _message_callback(self, message): diff --git a/homeassistant/components/android_ip_webcam/__init__.py b/homeassistant/components/android_ip_webcam/__init__.py index 1f9df527c282..333da7dceea8 100644 --- a/homeassistant/components/android_ip_webcam/__init__.py +++ b/homeassistant/components/android_ip_webcam/__init__.py @@ -309,7 +309,9 @@ class AndroidIPCamEntity(Entity): return self.async_schedule_update_ha_state(True) - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_DATA, async_ipcam_update) + self.async_on_remove( + async_dispatcher_connect(self.hass, SIGNAL_UPDATE_DATA, async_ipcam_update) + ) @property def should_poll(self): diff --git a/homeassistant/components/aqualogic/sensor.py b/homeassistant/components/aqualogic/sensor.py index 002b032fa92b..ce2ecb89d8f2 100644 --- a/homeassistant/components/aqualogic/sensor.py +++ b/homeassistant/components/aqualogic/sensor.py @@ -99,8 +99,10 @@ class AquaLogicSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.async_update_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.async_update_callback + ) ) @callback diff --git a/homeassistant/components/aqualogic/switch.py b/homeassistant/components/aqualogic/switch.py index e54fcff139d5..c00510b563a2 100644 --- a/homeassistant/components/aqualogic/switch.py +++ b/homeassistant/components/aqualogic/switch.py @@ -64,7 +64,6 @@ class AquaLogicSwitch(SwitchDevice): "aux_6": States.AUX_6, "aux_7": States.AUX_7, }[switch_type] - self._unsub_disp = None @property def name(self): @@ -101,11 +100,8 @@ class AquaLogicSwitch(SwitchDevice): async def async_added_to_hass(self): """Register callbacks.""" - self._unsub_disp = self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.async_write_ha_state + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.async_write_ha_state + ) ) - - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self._unsub_disp() - self._unsub_disp = None diff --git a/homeassistant/components/arcam_fmj/media_player.py b/homeassistant/components/arcam_fmj/media_player.py index a49802ea96fa..92e07a0547e9 100644 --- a/homeassistant/components/arcam_fmj/media_player.py +++ b/homeassistant/components/arcam_fmj/media_player.py @@ -142,14 +142,22 @@ class ArcamFmj(MediaPlayerDevice): if host == self._state.client.host: self.async_schedule_update_ha_state(force_refresh=True) - self.hass.helpers.dispatcher.async_dispatcher_connect(SIGNAL_CLIENT_DATA, _data) - - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_CLIENT_STARTED, _started + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_CLIENT_DATA, _data + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_CLIENT_STOPPED, _stopped + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_CLIENT_STARTED, _started + ) + ) + + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_CLIENT_STOPPED, _stopped + ) ) async def async_update(self): diff --git a/homeassistant/components/arlo/alarm_control_panel.py b/homeassistant/components/arlo/alarm_control_panel.py index 49a1bced5779..5e5597f50dab 100644 --- a/homeassistant/components/arlo/alarm_control_panel.py +++ b/homeassistant/components/arlo/alarm_control_panel.py @@ -84,7 +84,11 @@ class ArloBaseStation(AlarmControlPanel): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_ARLO, self._update_callback) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_ARLO, self._update_callback + ) + ) @callback def _update_callback(self): diff --git a/homeassistant/components/arlo/camera.py b/homeassistant/components/arlo/camera.py index e2bb85c9f840..6f7e3796309d 100644 --- a/homeassistant/components/arlo/camera.py +++ b/homeassistant/components/arlo/camera.py @@ -61,7 +61,6 @@ class ArloCam(Camera): self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) self._last_refresh = None self.attrs = {} - self._unsub_disp = None def camera_image(self): """Return a still image response from the camera.""" @@ -69,15 +68,12 @@ class ArloCam(Camera): async def async_added_to_hass(self): """Register callbacks.""" - self._unsub_disp = async_dispatcher_connect( - self.hass, SIGNAL_UPDATE_ARLO, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_ARLO, self.async_write_ha_state + ) ) - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self._unsub_disp() - self._unsub_disp = None - async def handle_async_mjpeg_stream(self, request): """Generate an HTTP MJPEG stream from the camera.""" video = await self.hass.async_add_executor_job( diff --git a/homeassistant/components/arlo/sensor.py b/homeassistant/components/arlo/sensor.py index 03e4437b257e..10f8d6701089 100644 --- a/homeassistant/components/arlo/sensor.py +++ b/homeassistant/components/arlo/sensor.py @@ -92,7 +92,11 @@ class ArloSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_ARLO, self._update_callback) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_ARLO, self._update_callback + ) + ) @callback def _update_callback(self): diff --git a/homeassistant/components/axis/axis_base.py b/homeassistant/components/axis/axis_base.py index e61c4cea6b03..2e848168b492 100644 --- a/homeassistant/components/axis/axis_base.py +++ b/homeassistant/components/axis/axis_base.py @@ -13,21 +13,15 @@ class AxisEntityBase(Entity): def __init__(self, device): """Initialize the Axis event.""" self.device = device - self.unsub_dispatcher = [] async def async_added_to_hass(self): """Subscribe device events.""" - self.unsub_dispatcher.append( + self.async_on_remove( async_dispatcher_connect( self.hass, self.device.event_reachable, self.update_callback ) ) - async def async_will_remove_from_hass(self) -> None: - """Unsubscribe device events when removed.""" - for unsub_dispatcher in self.unsub_dispatcher: - unsub_dispatcher() - @property def available(self): """Return True if device is available.""" diff --git a/homeassistant/components/axis/camera.py b/homeassistant/components/axis/camera.py index c914319aa424..ca76552a4ccd 100644 --- a/homeassistant/components/axis/camera.py +++ b/homeassistant/components/axis/camera.py @@ -57,7 +57,7 @@ class AxisCamera(AxisEntityBase, MjpegCamera): async def async_added_to_hass(self): """Subscribe camera events.""" - self.unsub_dispatcher.append( + self.async_on_remove( async_dispatcher_connect( self.hass, self.device.event_new_address, self._new_address ) diff --git a/homeassistant/components/comfoconnect/fan.py b/homeassistant/components/comfoconnect/fan.py index 432b25ac602b..b5eac4f9afea 100644 --- a/homeassistant/components/comfoconnect/fan.py +++ b/homeassistant/components/comfoconnect/fan.py @@ -44,10 +44,12 @@ class ComfoConnectFan(FanEntity): async def async_added_to_hass(self): """Register for sensor updates.""" _LOGGER.debug("Registering for fan speed") - async_dispatcher_connect( - self.hass, - SIGNAL_COMFOCONNECT_UPDATE_RECEIVED.format(SENSOR_FAN_SPEED_MODE), - self._handle_update, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_COMFOCONNECT_UPDATE_RECEIVED.format(SENSOR_FAN_SPEED_MODE), + self._handle_update, + ) ) await self.hass.async_add_executor_job( self._ccb.comfoconnect.register_sensor, SENSOR_FAN_SPEED_MODE diff --git a/homeassistant/components/comfoconnect/sensor.py b/homeassistant/components/comfoconnect/sensor.py index 5c8c0d6a75c9..cea09e97dbae 100644 --- a/homeassistant/components/comfoconnect/sensor.py +++ b/homeassistant/components/comfoconnect/sensor.py @@ -234,10 +234,12 @@ class ComfoConnectSensor(Entity): _LOGGER.debug( "Registering for sensor %s (%d)", self._sensor_type, self._sensor_id ) - async_dispatcher_connect( - self.hass, - SIGNAL_COMFOCONNECT_UPDATE_RECEIVED.format(self._sensor_id), - self._handle_update, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_COMFOCONNECT_UPDATE_RECEIVED.format(self._sensor_id), + self._handle_update, + ) ) await self.hass.async_add_executor_job( self._ccb.comfoconnect.register_sensor, self._sensor_id diff --git a/homeassistant/components/denonavr/media_player.py b/homeassistant/components/denonavr/media_player.py index b14592d1b78d..67dc07f68df7 100644 --- a/homeassistant/components/denonavr/media_player.py +++ b/homeassistant/components/denonavr/media_player.py @@ -197,7 +197,9 @@ class DenonDevice(MediaPlayerDevice): async def async_added_to_hass(self): """Register signal handler.""" - async_dispatcher_connect(self.hass, DOMAIN, self.signal_handler) + self.async_on_remove( + async_dispatcher_connect(self.hass, DOMAIN, self.signal_handler) + ) def signal_handler(self, data): """Handle domain-specific signal by calling appropriate method.""" diff --git a/homeassistant/components/eight_sleep/__init__.py b/homeassistant/components/eight_sleep/__init__.py index 595144013b6b..022878c8276d 100644 --- a/homeassistant/components/eight_sleep/__init__.py +++ b/homeassistant/components/eight_sleep/__init__.py @@ -214,7 +214,11 @@ class EightSleepUserEntity(Entity): """Update callback.""" self.async_schedule_update_ha_state(True) - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_USER, async_eight_user_update) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_USER, async_eight_user_update + ) + ) @property def should_poll(self): @@ -237,7 +241,11 @@ class EightSleepHeatEntity(Entity): """Update callback.""" self.async_schedule_update_ha_state(True) - async_dispatcher_connect(self.hass, SIGNAL_UPDATE_HEAT, async_eight_heat_update) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_HEAT, async_eight_heat_update + ) + ) @property def should_poll(self): diff --git a/homeassistant/components/enocean/__init__.py b/homeassistant/components/enocean/__init__.py index 876c7a1f05ba..90ab40877541 100644 --- a/homeassistant/components/enocean/__init__.py +++ b/homeassistant/components/enocean/__init__.py @@ -71,8 +71,10 @@ class EnOceanDevice(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_RECEIVE_MESSAGE, self._message_received_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_RECEIVE_MESSAGE, self._message_received_callback + ) ) def _message_received_callback(self, packet): diff --git a/homeassistant/components/envisalink/alarm_control_panel.py b/homeassistant/components/envisalink/alarm_control_panel.py index beb1c1cda822..62c57daf19d7 100644 --- a/homeassistant/components/envisalink/alarm_control_panel.py +++ b/homeassistant/components/envisalink/alarm_control_panel.py @@ -112,9 +112,15 @@ class EnvisalinkAlarm(EnvisalinkDevice, AlarmControlPanel): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect(self.hass, SIGNAL_KEYPAD_UPDATE, self._update_callback) - async_dispatcher_connect( - self.hass, SIGNAL_PARTITION_UPDATE, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_KEYPAD_UPDATE, self._update_callback + ) + ) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_PARTITION_UPDATE, self._update_callback + ) ) @callback diff --git a/homeassistant/components/fastdotcom/sensor.py b/homeassistant/components/fastdotcom/sensor.py index a6eaa21ae35e..fe131e4dab48 100644 --- a/homeassistant/components/fastdotcom/sensor.py +++ b/homeassistant/components/fastdotcom/sensor.py @@ -55,15 +55,18 @@ class SpeedtestSensor(RestoreEntity): async def async_added_to_hass(self): """Handle entity which will be added.""" await super().async_added_to_hass() + + self.async_on_remove( + async_dispatcher_connect( + self.hass, DATA_UPDATED, self._schedule_immediate_update + ) + ) + state = await self.async_get_last_state() if not state: return self._state = state.state - async_dispatcher_connect( - self.hass, DATA_UPDATED, self._schedule_immediate_update - ) - def update(self): """Get the latest data and update the states.""" data = self.speedtest_client.data diff --git a/homeassistant/components/ffmpeg/__init__.py b/homeassistant/components/ffmpeg/__init__.py index ad0c590b87db..f109103a99c9 100644 --- a/homeassistant/components/ffmpeg/__init__.py +++ b/homeassistant/components/ffmpeg/__init__.py @@ -140,12 +140,20 @@ class FFmpegBase(Entity): This method is a coroutine. """ - async_dispatcher_connect( - self.hass, SIGNAL_FFMPEG_START, self._async_start_ffmpeg + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_FFMPEG_START, self._async_start_ffmpeg + ) ) - async_dispatcher_connect(self.hass, SIGNAL_FFMPEG_STOP, self._async_stop_ffmpeg) - async_dispatcher_connect( - self.hass, SIGNAL_FFMPEG_RESTART, self._async_restart_ffmpeg + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_FFMPEG_STOP, self._async_stop_ffmpeg + ) + ) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_FFMPEG_RESTART, self._async_restart_ffmpeg + ) ) # register start/stop diff --git a/homeassistant/components/geniushub/__init__.py b/homeassistant/components/geniushub/__init__.py index bb25d2d619d1..0b99224bf7f2 100644 --- a/homeassistant/components/geniushub/__init__.py +++ b/homeassistant/components/geniushub/__init__.py @@ -204,7 +204,7 @@ class GeniusEntity(Entity): async def async_added_to_hass(self) -> None: """Set up a listener when this entity is added to HA.""" - async_dispatcher_connect(self.hass, DOMAIN, self._refresh) + self.async_on_remove(async_dispatcher_connect(self.hass, DOMAIN, self._refresh)) async def _refresh(self, payload: Optional[dict] = None) -> None: """Process any signals.""" diff --git a/homeassistant/components/hive/__init__.py b/homeassistant/components/hive/__init__.py index 88103ec94c14..98d625cbb1d2 100644 --- a/homeassistant/components/hive/__init__.py +++ b/homeassistant/components/hive/__init__.py @@ -182,17 +182,11 @@ class HiveEntity(Entity): self.session = session self.attributes = {} self._unique_id = f"{self.node_id}-{self.device_type}" - self._unsub_disp = None async def async_added_to_hass(self): """When entity is added to Home Assistant.""" - self._unsub_disp = async_dispatcher_connect( - self.hass, DOMAIN, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect(self.hass, DOMAIN, self.async_write_ha_state) ) if self.device_type in SERVICES: self.session.entity_lookup[self.entity_id] = self.node_id - - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self._unsub_disp() - self._unsub_disp = None diff --git a/homeassistant/components/hlk_sw16/__init__.py b/homeassistant/components/hlk_sw16/__init__.py index 52a82184dccf..3319ce6bee7b 100644 --- a/homeassistant/components/hlk_sw16/__init__.py +++ b/homeassistant/components/hlk_sw16/__init__.py @@ -164,8 +164,10 @@ class SW16Device(Entity): self.handle_event_callback, self._device_port ) self._is_on = await self._client.status(self._device_port) - async_dispatcher_connect( - self.hass, - f"hlk_sw16_device_available_{self._device_id}", - self._availability_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + f"hlk_sw16_device_available_{self._device_id}", + self._availability_callback, + ) ) diff --git a/homeassistant/components/homeworks/light.py b/homeassistant/components/homeworks/light.py index 4cfb2b0a26d8..db72c87a4a33 100644 --- a/homeassistant/components/homeworks/light.py +++ b/homeassistant/components/homeworks/light.py @@ -42,7 +42,9 @@ class HomeworksLight(HomeworksDevice, Light): """Call when entity is added to hass.""" signal = f"homeworks_entity_{self._addr}" _LOGGER.debug("connecting %s", signal) - async_dispatcher_connect(self.hass, signal, self._update_callback) + self.async_on_remove( + async_dispatcher_connect(self.hass, signal, self._update_callback) + ) self._controller.request_dimmer_level(self._addr) @property diff --git a/homeassistant/components/hydrawise/__init__.py b/homeassistant/components/hydrawise/__init__.py index 65b7b1f6f6e7..28b577354d29 100644 --- a/homeassistant/components/hydrawise/__init__.py +++ b/homeassistant/components/hydrawise/__init__.py @@ -127,8 +127,10 @@ class HydrawiseEntity(Entity): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect( - self.hass, SIGNAL_UPDATE_HYDRAWISE, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_HYDRAWISE, self._update_callback + ) ) @callback diff --git a/homeassistant/components/iaqualink/__init__.py b/homeassistant/components/iaqualink/__init__.py index 214bdf302ea2..97ddd95f50c2 100644 --- a/homeassistant/components/iaqualink/__init__.py +++ b/homeassistant/components/iaqualink/__init__.py @@ -202,19 +202,13 @@ class AqualinkEntity(Entity): def __init__(self, dev: AqualinkDevice): """Initialize the entity.""" self.dev = dev - self._unsub_disp = None async def async_added_to_hass(self) -> None: """Set up a listener when this entity is added to HA.""" - self._unsub_disp = async_dispatcher_connect( - self.hass, DOMAIN, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect(self.hass, DOMAIN, self.async_write_ha_state) ) - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self._unsub_disp() - self._unsub_disp = None - @property def should_poll(self) -> bool: """Return False as entities shouldn't be polled. diff --git a/homeassistant/components/incomfort/__init__.py b/homeassistant/components/incomfort/__init__.py index bb1156500614..cec550d24d95 100644 --- a/homeassistant/components/incomfort/__init__.py +++ b/homeassistant/components/incomfort/__init__.py @@ -83,7 +83,7 @@ class IncomfortChild(IncomfortEntity): async def async_added_to_hass(self) -> None: """Set up a listener when this entity is added to HA.""" - async_dispatcher_connect(self.hass, DOMAIN, self._refresh) + self.async_on_remove(async_dispatcher_connect(self.hass, DOMAIN, self._refresh)) @callback def _refresh(self) -> None: diff --git a/homeassistant/components/insteon/insteon_entity.py b/homeassistant/components/insteon/insteon_entity.py index e411cd82045d..19f3344fb81e 100644 --- a/homeassistant/components/insteon/insteon_entity.py +++ b/homeassistant/components/insteon/insteon_entity.py @@ -93,9 +93,13 @@ class InsteonEntity(Entity): self._insteon_device_state.register_updates(self.async_entity_update) self.hass.data[DOMAIN][INSTEON_ENTITIES].add(self.entity_id) load_signal = f"{self.entity_id}_{SIGNAL_LOAD_ALDB}" - async_dispatcher_connect(self.hass, load_signal, self._load_aldb) + self.async_on_remove( + async_dispatcher_connect(self.hass, load_signal, self._load_aldb) + ) print_signal = f"{self.entity_id}_{SIGNAL_PRINT_ALDB}" - async_dispatcher_connect(self.hass, print_signal, self._print_aldb) + self.async_on_remove( + async_dispatcher_connect(self.hass, print_signal, self._print_aldb) + ) def _load_aldb(self, reload=False): """Load the device All-Link Database.""" diff --git a/homeassistant/components/iperf3/sensor.py b/homeassistant/components/iperf3/sensor.py index 70a15a0dac51..749a3e83217a 100644 --- a/homeassistant/components/iperf3/sensor.py +++ b/homeassistant/components/iperf3/sensor.py @@ -73,15 +73,18 @@ class Iperf3Sensor(RestoreEntity): async def async_added_to_hass(self): """Handle entity which will be added.""" await super().async_added_to_hass() + + self.async_on_remove( + async_dispatcher_connect( + self.hass, DATA_UPDATED, self._schedule_immediate_update + ) + ) + state = await self.async_get_last_state() if not state: return self._state = state.state - async_dispatcher_connect( - self.hass, DATA_UPDATED, self._schedule_immediate_update - ) - def update(self): """Get the latest data and update the states.""" data = self._iperf3_data.data.get(self._sensor_type) diff --git a/homeassistant/components/kaiterra/air_quality.py b/homeassistant/components/kaiterra/air_quality.py index 1de1a4bd6c5b..ae5df387884f 100644 --- a/homeassistant/components/kaiterra/air_quality.py +++ b/homeassistant/components/kaiterra/air_quality.py @@ -113,6 +113,8 @@ class KaiterraAirQuality(AirQualityEntity): async def async_added_to_hass(self): """Register callback.""" - async_dispatcher_connect( - self.hass, DISPATCHER_KAITERRA, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, DISPATCHER_KAITERRA, self.async_write_ha_state + ) ) diff --git a/homeassistant/components/kaiterra/sensor.py b/homeassistant/components/kaiterra/sensor.py index e86d6f7d8364..d9500c7a0006 100644 --- a/homeassistant/components/kaiterra/sensor.py +++ b/homeassistant/components/kaiterra/sensor.py @@ -88,6 +88,8 @@ class KaiterraSensor(Entity): async def async_added_to_hass(self): """Register callback.""" - async_dispatcher_connect( - self.hass, DISPATCHER_KAITERRA, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, DISPATCHER_KAITERRA, self.async_write_ha_state + ) ) diff --git a/homeassistant/components/konnected/binary_sensor.py b/homeassistant/components/konnected/binary_sensor.py index f2f79f5ed7d6..5cd270d50083 100644 --- a/homeassistant/components/konnected/binary_sensor.py +++ b/homeassistant/components/konnected/binary_sensor.py @@ -79,8 +79,10 @@ class KonnectedBinarySensor(BinarySensorDevice): async def async_added_to_hass(self): """Store entity_id and register state change callback.""" self._data[ATTR_ENTITY_ID] = self.entity_id - async_dispatcher_connect( - self.hass, f"konnected.{self.entity_id}.update", self.async_set_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, f"konnected.{self.entity_id}.update", self.async_set_state + ) ) @callback diff --git a/homeassistant/components/mediaroom/media_player.py b/homeassistant/components/mediaroom/media_player.py index 8db9cb6fa37c..dd67cc287832 100644 --- a/homeassistant/components/mediaroom/media_player.py +++ b/homeassistant/components/mediaroom/media_player.py @@ -178,7 +178,11 @@ class MediaroomDevice(MediaPlayerDevice): self._available = True self.async_write_ha_state() - async_dispatcher_connect(self.hass, SIGNAL_STB_NOTIFY, async_notify_received) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_STB_NOTIFY, async_notify_received + ) + ) async def async_play_media(self, media_type, media_id, **kwargs): """Play media.""" diff --git a/homeassistant/components/mychevy/binary_sensor.py b/homeassistant/components/mychevy/binary_sensor.py index 822a7988d0d2..702f3146f8e4 100644 --- a/homeassistant/components/mychevy/binary_sensor.py +++ b/homeassistant/components/mychevy/binary_sensor.py @@ -64,8 +64,10 @@ class EVBinarySensor(BinarySensorDevice): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.async_update_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.async_update_callback + ) ) @callback diff --git a/homeassistant/components/mychevy/sensor.py b/homeassistant/components/mychevy/sensor.py index 9f8ea5607d9d..96e0eef68ad2 100644 --- a/homeassistant/components/mychevy/sensor.py +++ b/homeassistant/components/mychevy/sensor.py @@ -58,11 +58,17 @@ class MyChevyStatus(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.success + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.success + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect(ERROR_TOPIC, self.error) + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + ERROR_TOPIC, self.error + ) + ) @callback def success(self): diff --git a/homeassistant/components/mysensors/device.py b/homeassistant/components/mysensors/device.py index e5853fce5ca7..9c1c4b543676 100644 --- a/homeassistant/components/mysensors/device.py +++ b/homeassistant/components/mysensors/device.py @@ -137,11 +137,15 @@ class MySensorsEntity(MySensorsDevice, Entity): """Register update callback.""" gateway_id = id(self.gateway) dev_id = gateway_id, self.node_id, self.child_id, self.value_type - async_dispatcher_connect( - self.hass, CHILD_CALLBACK.format(*dev_id), self.async_update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, CHILD_CALLBACK.format(*dev_id), self.async_update_callback + ) ) - async_dispatcher_connect( - self.hass, - NODE_CALLBACK.format(gateway_id, self.node_id), - self.async_update_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + NODE_CALLBACK.format(gateway_id, self.node_id), + self.async_update_callback, + ) ) diff --git a/homeassistant/components/ness_alarm/alarm_control_panel.py b/homeassistant/components/ness_alarm/alarm_control_panel.py index 8b7867fdc062..8181e54640d3 100644 --- a/homeassistant/components/ness_alarm/alarm_control_panel.py +++ b/homeassistant/components/ness_alarm/alarm_control_panel.py @@ -45,8 +45,10 @@ class NessAlarmPanel(alarm.AlarmControlPanel): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect( - self.hass, SIGNAL_ARMING_STATE_CHANGED, self._handle_arming_state_change + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_ARMING_STATE_CHANGED, self._handle_arming_state_change + ) ) @property diff --git a/homeassistant/components/ness_alarm/binary_sensor.py b/homeassistant/components/ness_alarm/binary_sensor.py index 69acc97130d2..c719febdb58f 100644 --- a/homeassistant/components/ness_alarm/binary_sensor.py +++ b/homeassistant/components/ness_alarm/binary_sensor.py @@ -50,8 +50,10 @@ class NessZoneBinarySensor(BinarySensorDevice): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect( - self.hass, SIGNAL_ZONE_CHANGED, self._handle_zone_change + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_ZONE_CHANGED, self._handle_zone_change + ) ) @property diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index 73a28aa121f2..b486e907ee3b 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -437,4 +437,6 @@ class NestSensorDevice(Entity): """Update sensor state.""" await self.async_update_ha_state(True) - async_dispatcher_connect(self.hass, SIGNAL_NEST_UPDATE, async_update_state) + self.async_on_remove( + async_dispatcher_connect(self.hass, SIGNAL_NEST_UPDATE, async_update_state) + ) diff --git a/homeassistant/components/nest/climate.py b/homeassistant/components/nest/climate.py index f75e3a692f31..92442479091d 100644 --- a/homeassistant/components/nest/climate.py +++ b/homeassistant/components/nest/climate.py @@ -151,7 +151,9 @@ class NestThermostat(ClimateDevice): """Update device state.""" await self.async_update_ha_state(True) - async_dispatcher_connect(self.hass, SIGNAL_NEST_UPDATE, async_update_state) + self.async_on_remove( + async_dispatcher_connect(self.hass, SIGNAL_NEST_UPDATE, async_update_state) + ) @property def supported_features(self): diff --git a/homeassistant/components/netgear_lte/__init__.py b/homeassistant/components/netgear_lte/__init__.py index ac36cc1eb44d..aedfe9018f7c 100644 --- a/homeassistant/components/netgear_lte/__init__.py +++ b/homeassistant/components/netgear_lte/__init__.py @@ -352,8 +352,10 @@ class LTEEntity(Entity): async def async_added_to_hass(self): """Register callback.""" - async_dispatcher_connect( - self.hass, DISPATCHER_NETGEAR_LTE, self.async_write_ha_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, DISPATCHER_NETGEAR_LTE, self.async_write_ha_state + ) ) async def async_update(self): diff --git a/homeassistant/components/nissan_leaf/__init__.py b/homeassistant/components/nissan_leaf/__init__.py index 57b9bdb61fa6..f5f23f2f1140 100644 --- a/homeassistant/components/nissan_leaf/__init__.py +++ b/homeassistant/components/nissan_leaf/__init__.py @@ -467,8 +467,10 @@ class LeafEntity(Entity): async def async_added_to_hass(self): """Register callbacks.""" self.log_registration() - async_dispatcher_connect( - self.car.hass, SIGNAL_UPDATE_LEAF, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.car.hass, SIGNAL_UPDATE_LEAF, self._update_callback + ) ) @callback diff --git a/homeassistant/components/nzbget/sensor.py b/homeassistant/components/nzbget/sensor.py index 89d2c1c01da4..a0f1dc57c94b 100644 --- a/homeassistant/components/nzbget/sensor.py +++ b/homeassistant/components/nzbget/sensor.py @@ -89,8 +89,10 @@ class NZBGetSensor(Entity): async def async_added_to_hass(self): """Handle entity which will be added.""" - async_dispatcher_connect( - self.hass, DATA_UPDATED, self._schedule_immediate_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, DATA_UPDATED, self._schedule_immediate_update + ) ) @callback diff --git a/homeassistant/components/plaato/sensor.py b/homeassistant/components/plaato/sensor.py index 34a2a1a42b66..07b0453fca69 100644 --- a/homeassistant/components/plaato/sensor.py +++ b/homeassistant/components/plaato/sensor.py @@ -157,6 +157,8 @@ class PlaatoSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - f"{PLAATO_DOMAIN}_{self.unique_id}", self.async_schedule_update_ha_state + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + f"{PLAATO_DOMAIN}_{self.unique_id}", self.async_write_ha_state + ) ) diff --git a/homeassistant/components/qwikswitch/__init__.py b/homeassistant/components/qwikswitch/__init__.py index c2d938f6ed77..6ad030078b11 100644 --- a/homeassistant/components/qwikswitch/__init__.py +++ b/homeassistant/components/qwikswitch/__init__.py @@ -91,8 +91,10 @@ class QSEntity(Entity): async def async_added_to_hass(self): """Listen for updates from QSUSb via dispatcher.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - self.qsid, self.update_packet + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + self.qsid, self.update_packet + ) ) diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index a4ba1a41fee0..7be0c64ee1ba 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -167,8 +167,10 @@ class RachioStandbySwitch(RachioSwitch): async def async_added_to_hass(self): """Subscribe to updates.""" - async_dispatcher_connect( - self.hass, SIGNAL_RACHIO_CONTROLLER_UPDATE, self._handle_any_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_RACHIO_CONTROLLER_UPDATE, self._handle_any_update + ) ) diff --git a/homeassistant/components/raincloud/__init__.py b/homeassistant/components/raincloud/__init__.py index 4f9ae7fb7333..971b8174993a 100644 --- a/homeassistant/components/raincloud/__init__.py +++ b/homeassistant/components/raincloud/__init__.py @@ -152,8 +152,10 @@ class RainCloudEntity(Entity): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect( - self.hass, SIGNAL_UPDATE_RAINCLOUD, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_UPDATE_RAINCLOUD, self._update_callback + ) ) def _update_callback(self): diff --git a/homeassistant/components/repetier/sensor.py b/homeassistant/components/repetier/sensor.py index 5936b5c33436..e342b2d341ed 100644 --- a/homeassistant/components/repetier/sensor.py +++ b/homeassistant/components/repetier/sensor.py @@ -102,7 +102,9 @@ class RepetierSensor(Entity): async def async_added_to_hass(self): """Connect update callbacks.""" - async_dispatcher_connect(self.hass, UPDATE_SIGNAL, self.update_callback) + self.async_on_remove( + async_dispatcher_connect(self.hass, UPDATE_SIGNAL, self.update_callback) + ) def _get_data(self): """Return new data from the api cache.""" diff --git a/homeassistant/components/rflink/__init__.py b/homeassistant/components/rflink/__init__.py index 9ba008a56ef5..b33f2623b9d6 100644 --- a/homeassistant/components/rflink/__init__.py +++ b/homeassistant/components/rflink/__init__.py @@ -404,13 +404,17 @@ class RflinkDevice(Entity): self.hass.data[DATA_ENTITY_LOOKUP][EVENT_KEY_COMMAND][_id].append( self.entity_id ) - async_dispatcher_connect( - self.hass, SIGNAL_AVAILABILITY, self._availability_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_AVAILABILITY, self._availability_callback + ) ) - async_dispatcher_connect( - self.hass, - SIGNAL_HANDLE_EVENT.format(self.entity_id), - self.handle_event_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_HANDLE_EVENT.format(self.entity_id), + self.handle_event_callback, + ) ) # Process the initial event now that the entity is created diff --git a/homeassistant/components/rflink/sensor.py b/homeassistant/components/rflink/sensor.py index bc736a1ede61..9394c568a73b 100644 --- a/homeassistant/components/rflink/sensor.py +++ b/homeassistant/components/rflink/sensor.py @@ -139,13 +139,17 @@ class RflinkSensor(RflinkDevice): self.hass.data[DATA_ENTITY_LOOKUP][EVENT_KEY_SENSOR][_id].append( self.entity_id ) - async_dispatcher_connect( - self.hass, SIGNAL_AVAILABILITY, self._availability_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_AVAILABILITY, self._availability_callback + ) ) - async_dispatcher_connect( - self.hass, - SIGNAL_HANDLE_EVENT.format(self.entity_id), - self.handle_event_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_HANDLE_EVENT.format(self.entity_id), + self.handle_event_callback, + ) ) # Process the initial event now that the entity is created diff --git a/homeassistant/components/sabnzbd/sensor.py b/homeassistant/components/sabnzbd/sensor.py index 21ac9eefdb29..b232e2e63c58 100644 --- a/homeassistant/components/sabnzbd/sensor.py +++ b/homeassistant/components/sabnzbd/sensor.py @@ -37,7 +37,11 @@ class SabnzbdSensor(Entity): async def async_added_to_hass(self): """Call when entity about to be added to hass.""" - async_dispatcher_connect(self.hass, SIGNAL_SABNZBD_UPDATED, self.update_state) + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_SABNZBD_UPDATED, self.update_state + ) + ) @property def name(self): diff --git a/homeassistant/components/satel_integra/alarm_control_panel.py b/homeassistant/components/satel_integra/alarm_control_panel.py index 6034c24e31a7..8a240794580c 100644 --- a/homeassistant/components/satel_integra/alarm_control_panel.py +++ b/homeassistant/components/satel_integra/alarm_control_panel.py @@ -67,8 +67,10 @@ class SatelIntegraAlarmPanel(alarm.AlarmControlPanel): """Update alarm status and register callbacks for future updates.""" _LOGGER.debug("Starts listening for panel messages") self._update_alarm_status() - async_dispatcher_connect( - self.hass, SIGNAL_PANEL_MESSAGE, self._update_alarm_status + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_PANEL_MESSAGE, self._update_alarm_status + ) ) @callback diff --git a/homeassistant/components/satel_integra/binary_sensor.py b/homeassistant/components/satel_integra/binary_sensor.py index 5b268266dda1..4a9be339a1cd 100644 --- a/homeassistant/components/satel_integra/binary_sensor.py +++ b/homeassistant/components/satel_integra/binary_sensor.py @@ -75,8 +75,10 @@ class SatelIntegraBinarySensor(BinarySensorDevice): self._state = 1 else: self._state = 0 - async_dispatcher_connect( - self.hass, self._react_to_signal, self._devices_updated + self.async_on_remove( + async_dispatcher_connect( + self.hass, self._react_to_signal, self._devices_updated + ) ) @property diff --git a/homeassistant/components/spc/alarm_control_panel.py b/homeassistant/components/spc/alarm_control_panel.py index ca5d77b2a828..982c0fe2bab5 100644 --- a/homeassistant/components/spc/alarm_control_panel.py +++ b/homeassistant/components/spc/alarm_control_panel.py @@ -57,8 +57,12 @@ class SpcAlarm(alarm.AlarmControlPanel): async def async_added_to_hass(self): """Call for adding new entities.""" - async_dispatcher_connect( - self.hass, SIGNAL_UPDATE_ALARM.format(self._area.id), self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_UPDATE_ALARM.format(self._area.id), + self._update_callback, + ) ) @callback diff --git a/homeassistant/components/spc/binary_sensor.py b/homeassistant/components/spc/binary_sensor.py index 34689c4dccfd..3149ae560638 100644 --- a/homeassistant/components/spc/binary_sensor.py +++ b/homeassistant/components/spc/binary_sensor.py @@ -46,8 +46,12 @@ class SpcBinarySensor(BinarySensorDevice): async def async_added_to_hass(self): """Call for adding new entities.""" - async_dispatcher_connect( - self.hass, SIGNAL_UPDATE_SENSOR.format(self._zone.id), self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_UPDATE_SENSOR.format(self._zone.id), + self._update_callback, + ) ) @callback diff --git a/homeassistant/components/speedtestdotnet/sensor.py b/homeassistant/components/speedtestdotnet/sensor.py index c1f51ab269ac..41db6c26930f 100644 --- a/homeassistant/components/speedtestdotnet/sensor.py +++ b/homeassistant/components/speedtestdotnet/sensor.py @@ -91,8 +91,10 @@ class SpeedtestSensor(RestoreEntity): return self._state = state.state - async_dispatcher_connect( - self.hass, DATA_UPDATED, self._schedule_immediate_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, DATA_UPDATED, self._schedule_immediate_update + ) ) def update(self): diff --git a/homeassistant/components/switcher_kis/switch.py b/homeassistant/components/switcher_kis/switch.py index 4ace2c6eea1f..ea32183b511b 100644 --- a/homeassistant/components/switcher_kis/switch.py +++ b/homeassistant/components/switcher_kis/switch.py @@ -109,8 +109,10 @@ class SwitcherControl(SwitchDevice): async def async_added_to_hass(self) -> None: """Run when entity about to be added to hass.""" - async_dispatcher_connect( - self.hass, SIGNAL_SWITCHER_DEVICE_UPDATE, self.async_update_data + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_SWITCHER_DEVICE_UPDATE, self.async_update_data + ) ) async def async_update_data(self, device_data: "SwitcherV2Device") -> None: diff --git a/homeassistant/components/tellstick/__init__.py b/homeassistant/components/tellstick/__init__.py index e7f341c90b26..db37f4669d3b 100644 --- a/homeassistant/components/tellstick/__init__.py +++ b/homeassistant/components/tellstick/__init__.py @@ -182,8 +182,10 @@ class TellstickDevice(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_TELLCORE_CALLBACK, self.update_from_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_TELLCORE_CALLBACK, self.update_from_callback + ) ) @property diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index 9632997ac1b1..88d6681a8049 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -82,8 +82,10 @@ class UpnpSensor(Entity): async def async_added_to_hass(self): """Subscribe to sensors events.""" - async_dispatcher_connect( - self.hass, SIGNAL_REMOVE_SENSOR, self._upnp_remove_sensor + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_REMOVE_SENSOR, self._upnp_remove_sensor + ) ) @callback diff --git a/homeassistant/components/vallox/fan.py b/homeassistant/components/vallox/fan.py index 5277a3309762..c79ee15db598 100644 --- a/homeassistant/components/vallox/fan.py +++ b/homeassistant/components/vallox/fan.py @@ -93,8 +93,10 @@ class ValloxFan(FanEntity): async def async_added_to_hass(self): """Call to update.""" - async_dispatcher_connect( - self.hass, SIGNAL_VALLOX_STATE_UPDATE, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_VALLOX_STATE_UPDATE, self._update_callback + ) ) @callback diff --git a/homeassistant/components/vallox/sensor.py b/homeassistant/components/vallox/sensor.py index 5bf9b8061ad1..b3a7e8758a02 100644 --- a/homeassistant/components/vallox/sensor.py +++ b/homeassistant/components/vallox/sensor.py @@ -149,8 +149,10 @@ class ValloxSensor(Entity): async def async_added_to_hass(self): """Call to update.""" - async_dispatcher_connect( - self.hass, SIGNAL_VALLOX_STATE_UPDATE, self._update_callback + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_VALLOX_STATE_UPDATE, self._update_callback + ) ) @callback diff --git a/homeassistant/components/volvooncall/__init__.py b/homeassistant/components/volvooncall/__init__.py index c621a12943b8..c408080524eb 100644 --- a/homeassistant/components/volvooncall/__init__.py +++ b/homeassistant/components/volvooncall/__init__.py @@ -230,8 +230,10 @@ class VolvoEntity(Entity): async def async_added_to_hass(self): """Register update dispatcher.""" - async_dispatcher_connect( - self.hass, SIGNAL_STATE_UPDATED, self.async_schedule_update_ha_state + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_STATE_UPDATED, self.async_write_ha_state + ) ) @property diff --git a/homeassistant/components/waterfurnace/sensor.py b/homeassistant/components/waterfurnace/sensor.py index 14f3549b2a37..b2b8aaa6f358 100644 --- a/homeassistant/components/waterfurnace/sensor.py +++ b/homeassistant/components/waterfurnace/sensor.py @@ -105,8 +105,10 @@ class WaterFurnaceSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - UPDATE_TOPIC, self.async_update_callback + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + UPDATE_TOPIC, self.async_update_callback + ) ) @callback diff --git a/homeassistant/components/websocket_api/sensor.py b/homeassistant/components/websocket_api/sensor.py index a74381b8a856..6be07dfb1f42 100644 --- a/homeassistant/components/websocket_api/sensor.py +++ b/homeassistant/components/websocket_api/sensor.py @@ -28,11 +28,15 @@ class APICount(Entity): async def async_added_to_hass(self): """Added to hass.""" - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_WEBSOCKET_CONNECTED, self._update_count + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_WEBSOCKET_CONNECTED, self._update_count + ) ) - self.hass.helpers.dispatcher.async_dispatcher_connect( - SIGNAL_WEBSOCKET_DISCONNECTED, self._update_count + self.async_on_remove( + self.hass.helpers.dispatcher.async_dispatcher_connect( + SIGNAL_WEBSOCKET_DISCONNECTED, self._update_count + ) ) self._update_count() diff --git a/homeassistant/components/wirelesstag/binary_sensor.py b/homeassistant/components/wirelesstag/binary_sensor.py index 07acf6057a10..eae8c17edcd3 100644 --- a/homeassistant/components/wirelesstag/binary_sensor.py +++ b/homeassistant/components/wirelesstag/binary_sensor.py @@ -102,10 +102,12 @@ class WirelessTagBinarySensor(WirelessTagBaseSensor, BinarySensorDevice): tag_id = self.tag_id event_type = self.device_class mac = self.tag_manager_mac - async_dispatcher_connect( - self.hass, - SIGNAL_BINARY_EVENT_UPDATE.format(tag_id, event_type, mac), - self._on_binary_event_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_BINARY_EVENT_UPDATE.format(tag_id, event_type, mac), + self._on_binary_event_callback, + ) ) @property diff --git a/homeassistant/components/wirelesstag/sensor.py b/homeassistant/components/wirelesstag/sensor.py index 7a41d2377816..14f630847098 100644 --- a/homeassistant/components/wirelesstag/sensor.py +++ b/homeassistant/components/wirelesstag/sensor.py @@ -64,10 +64,12 @@ class WirelessTagSensor(WirelessTagBaseSensor): async def async_added_to_hass(self): """Register callbacks.""" - async_dispatcher_connect( - self.hass, - SIGNAL_TAG_UPDATE.format(self.tag_id, self.tag_manager_mac), - self._update_tag_info_callback, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_TAG_UPDATE.format(self.tag_id, self.tag_manager_mac), + self._update_tag_info_callback, + ) ) @property diff --git a/homeassistant/components/yeelight/binary_sensor.py b/homeassistant/components/yeelight/binary_sensor.py index 3c06a75fb71a..f5f3e03b7650 100644 --- a/homeassistant/components/yeelight/binary_sensor.py +++ b/homeassistant/components/yeelight/binary_sensor.py @@ -27,21 +27,17 @@ class YeelightNightlightModeSensor(BinarySensorDevice): def __init__(self, device): """Initialize nightlight mode sensor.""" self._device = device - self._unsub_disp = None async def async_added_to_hass(self): """Handle entity which will be added.""" - self._unsub_disp = async_dispatcher_connect( - self.hass, - DATA_UPDATED.format(self._device.ipaddr), - self.async_write_ha_state, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + DATA_UPDATED.format(self._device.ipaddr), + self.async_write_ha_state, + ) ) - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self._unsub_disp() - self._unsub_disp = None - @property def should_poll(self): """No polling needed.""" diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 59863464d21e..2f69b98bcbcf 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -456,10 +456,12 @@ class YeelightGenericLight(Light): async def async_added_to_hass(self): """Handle entity which will be added.""" - async_dispatcher_connect( - self.hass, - DATA_UPDATED.format(self._device.ipaddr), - self._schedule_immediate_update, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + DATA_UPDATED.format(self._device.ipaddr), + self._schedule_immediate_update, + ) ) @property From 590e7140217b13b6356e57a0012b1cdeccc8e075 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 2 Apr 2020 11:46:10 -0500 Subject: [PATCH 015/653] Ensure harmony hub is ready before importing (#33537) If the harmony hub was not ready for connection or was busy when importing from yaml, the import validation would fail would not be retried. To mitigate this scenario we now do the validation in async_setup_platform which allows us to raise PlatformNotReady so we can retry later. --- .../components/harmony/config_flow.py | 58 +++++++------------ homeassistant/components/harmony/remote.py | 27 ++++++++- homeassistant/components/harmony/util.py | 44 +++++++++++++- tests/components/harmony/test_config_flow.py | 17 +++--- 4 files changed, 95 insertions(+), 51 deletions(-) diff --git a/homeassistant/components/harmony/config_flow.py b/homeassistant/components/harmony/config_flow.py index ff7b47d60107..9d9c9dfb8e97 100644 --- a/homeassistant/components/harmony/config_flow.py +++ b/homeassistant/components/harmony/config_flow.py @@ -2,11 +2,9 @@ import logging from urllib.parse import urlparse -import aioharmony.exceptions as harmony_exceptions -from aioharmony.harmonyapi import HarmonyAPI import voluptuous as vol -from homeassistant import config_entries, core, exceptions +from homeassistant import config_entries, exceptions from homeassistant.components import ssdp from homeassistant.components.remote import ( ATTR_ACTIVITY, @@ -17,7 +15,11 @@ from homeassistant.const import CONF_HOST, CONF_NAME from homeassistant.core import callback from .const import DOMAIN, UNIQUE_ID -from .util import find_unique_id_for_remote +from .util import ( + find_best_name_for_remote, + find_unique_id_for_remote, + get_harmony_client_if_available, +) _LOGGER = logging.getLogger(__name__) @@ -26,43 +28,19 @@ DATA_SCHEMA = vol.Schema( ) -async def get_harmony_client_if_available(hass: core.HomeAssistant, ip_address): - """Connect to a harmony hub and fetch info.""" - harmony = HarmonyAPI(ip_address=ip_address) - - try: - if not await harmony.connect(): - await harmony.close() - return None - except harmony_exceptions.TimeOut: - return None - - await harmony.close() - - return harmony - - -async def validate_input(hass: core.HomeAssistant, data): +async def validate_input(data): """Validate the user input allows us to connect. Data has the keys from DATA_SCHEMA with values provided by the user. """ - harmony = await get_harmony_client_if_available(hass, data[CONF_HOST]) + harmony = await get_harmony_client_if_available(data[CONF_HOST]) if not harmony: raise CannotConnect - unique_id = find_unique_id_for_remote(harmony) - - # As a last resort we get the name from the harmony client - # in the event a name was not provided. harmony.name is - # usually the ip address but it can be an empty string. - if CONF_NAME not in data or data[CONF_NAME] is None or data[CONF_NAME] == "": - data[CONF_NAME] = harmony.name - return { - CONF_NAME: data[CONF_NAME], + CONF_NAME: find_best_name_for_remote(data, harmony), CONF_HOST: data[CONF_HOST], - UNIQUE_ID: unique_id, + UNIQUE_ID: find_unique_id_for_remote(harmony), } @@ -82,7 +60,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if user_input is not None: try: - validated = await validate_input(self.hass, user_input) + validated = await validate_input(user_input) except CannotConnect: errors["base"] = "cannot_connect" except Exception: # pylint: disable=broad-except @@ -116,9 +94,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): CONF_NAME: friendly_name, } - harmony = await get_harmony_client_if_available( - self.hass, self.harmony_config[CONF_HOST] - ) + harmony = await get_harmony_client_if_available(parsed_url.hostname) if harmony: unique_id = find_unique_id_for_remote(harmony) @@ -150,9 +126,15 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): }, ) - async def async_step_import(self, user_input): + async def async_step_import(self, validated_input): """Handle import.""" - return await self.async_step_user(user_input) + await self.async_set_unique_id(validated_input[UNIQUE_ID]) + self._abort_if_unique_id_configured() + # Everything was validated in remote async_setup_platform + # all we do now is create. + return await self._async_create_entry_from_valid_input( + validated_input, validated_input + ) @staticmethod @callback diff --git a/homeassistant/components/harmony/remote.py b/homeassistant/components/harmony/remote.py index 024af9b15804..5af8d1eb65a3 100644 --- a/homeassistant/components/harmony/remote.py +++ b/homeassistant/components/harmony/remote.py @@ -24,6 +24,7 @@ from homeassistant.components.remote import ( from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ATTR_ENTITY_ID, CONF_HOST, CONF_NAME from homeassistant.core import HomeAssistant +from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -33,6 +34,13 @@ from .const import ( HARMONY_OPTIONS_UPDATE, SERVICE_CHANGE_CHANNEL, SERVICE_SYNC, + UNIQUE_ID, +) +from .util import ( + find_best_name_for_remote, + find_matching_config_entries_for_host, + find_unique_id_for_remote, + get_harmony_client_if_available, ) _LOGGER = logging.getLogger(__name__) @@ -51,6 +59,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( extra=vol.ALLOW_EXTRA, ) + HARMONY_SYNC_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) HARMONY_CHANGE_CHANNEL_SCHEMA = vol.Schema( @@ -68,9 +77,25 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= # Now handled by ssdp in the config flow return + if find_matching_config_entries_for_host(hass, config[CONF_HOST]): + return + + # We do the validation to verify we can connect + # so we can raise PlatformNotReady to force + # a retry so we can avoid a scenario where the config + # entry cannot be created via import because hub + # is not yet ready. + harmony = await get_harmony_client_if_available(config[CONF_HOST]) + if not harmony: + raise PlatformNotReady + + validated_config = config.copy() + validated_config[UNIQUE_ID] = find_unique_id_for_remote(harmony) + validated_config[CONF_NAME] = find_best_name_for_remote(config, harmony) + hass.async_create_task( hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data=config + DOMAIN, context={"source": SOURCE_IMPORT}, data=validated_config ) ) diff --git a/homeassistant/components/harmony/util.py b/homeassistant/components/harmony/util.py index 5f7e46510f9f..69ed44cb7dac 100644 --- a/homeassistant/components/harmony/util.py +++ b/homeassistant/components/harmony/util.py @@ -1,8 +1,13 @@ """The Logitech Harmony Hub integration utils.""" -from aioharmony.harmonyapi import HarmonyAPI as HarmonyClient +import aioharmony.exceptions as harmony_exceptions +from aioharmony.harmonyapi import HarmonyAPI + +from homeassistant.const import CONF_HOST, CONF_NAME + +from .const import DOMAIN -def find_unique_id_for_remote(harmony: HarmonyClient): +def find_unique_id_for_remote(harmony: HarmonyAPI): """Find the unique id for both websocket and xmpp clients.""" websocket_unique_id = harmony.hub_config.info.get("activeRemoteId") if websocket_unique_id is not None: @@ -10,3 +15,38 @@ def find_unique_id_for_remote(harmony: HarmonyClient): # fallback to the xmpp unique id if websocket is not available return harmony.config["global"]["timeStampHash"].split(";")[-1] + + +def find_best_name_for_remote(data: dict, harmony: HarmonyAPI): + """Find the best name from config or fallback to the remote.""" + # As a last resort we get the name from the harmony client + # in the event a name was not provided. harmony.name is + # usually the ip address but it can be an empty string. + if CONF_NAME not in data or data[CONF_NAME] is None or data[CONF_NAME] == "": + return harmony.name + + return data[CONF_NAME] + + +async def get_harmony_client_if_available(ip_address: str): + """Connect to a harmony hub and fetch info.""" + harmony = HarmonyAPI(ip_address=ip_address) + + try: + if not await harmony.connect(): + await harmony.close() + return None + except harmony_exceptions.TimeOut: + return None + + await harmony.close() + + return harmony + + +def find_matching_config_entries_for_host(hass, host): + """Search existing config entries for one matching the host.""" + for entry in hass.config_entries.async_entries(DOMAIN): + if entry.data[CONF_HOST] == host: + return entry + return None diff --git a/tests/components/harmony/test_config_flow.py b/tests/components/harmony/test_config_flow.py index 18c0825b6a1d..30421756d225 100644 --- a/tests/components/harmony/test_config_flow.py +++ b/tests/components/harmony/test_config_flow.py @@ -25,8 +25,7 @@ async def test_user_form(hass): harmonyapi = _get_mock_harmonyapi(connect=True) with patch( - "homeassistant.components.harmony.config_flow.HarmonyAPI", - return_value=harmonyapi, + "homeassistant.components.harmony.util.HarmonyAPI", return_value=harmonyapi, ), patch( "homeassistant.components.harmony.async_setup", return_value=True ) as mock_setup, patch( @@ -53,8 +52,7 @@ async def test_form_import(hass): harmonyapi = _get_mock_harmonyapi(connect=True) with patch( - "homeassistant.components.harmony.config_flow.HarmonyAPI", - return_value=harmonyapi, + "homeassistant.components.harmony.util.HarmonyAPI", return_value=harmonyapi, ), patch( "homeassistant.components.harmony.async_setup", return_value=True ) as mock_setup, patch( @@ -68,9 +66,11 @@ async def test_form_import(hass): "name": "friend", "activity": "Watch TV", "delay_secs": 0.9, + "unique_id": "555234534543", }, ) + assert result["result"].unique_id == "555234534543" assert result["type"] == "create_entry" assert result["title"] == "friend" assert result["data"] == { @@ -94,8 +94,7 @@ async def test_form_ssdp(hass): harmonyapi = _get_mock_harmonyapi(connect=True) with patch( - "homeassistant.components.harmony.config_flow.HarmonyAPI", - return_value=harmonyapi, + "homeassistant.components.harmony.util.HarmonyAPI", return_value=harmonyapi, ): result = await hass.config_entries.flow.async_init( DOMAIN, @@ -114,8 +113,7 @@ async def test_form_ssdp(hass): } with patch( - "homeassistant.components.harmony.config_flow.HarmonyAPI", - return_value=harmonyapi, + "homeassistant.components.harmony.util.HarmonyAPI", return_value=harmonyapi, ), patch( "homeassistant.components.harmony.async_setup", return_value=True ) as mock_setup, patch( @@ -141,8 +139,7 @@ async def test_form_cannot_connect(hass): ) with patch( - "homeassistant.components.harmony.config_flow.HarmonyAPI", - side_effect=CannotConnect, + "homeassistant.components.harmony.util.HarmonyAPI", side_effect=CannotConnect, ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], From 457d439e24e64a73c610d723662e5aefc6bc5e03 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 2 Apr 2020 18:52:05 +0200 Subject: [PATCH 016/653] Fix MQTT cleanup regression from #32184. (#33532) --- homeassistant/components/mqtt/__init__.py | 21 +++++++++++++-------- tests/ignore_uncaught_exceptions.py | 4 ---- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index bc59be0d1f3e..734f67906ceb 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -1162,7 +1162,7 @@ class MqttAvailability(Entity): async def cleanup_device_registry(hass, device_id): - """Remove device registry entry if there are no entities or triggers.""" + """Remove device registry entry if there are no remaining entities or triggers.""" # Local import to avoid circular dependencies from . import device_trigger @@ -1196,8 +1196,12 @@ class MqttDiscoveryUpdate(Entity): self._discovery_data[ATTR_DISCOVERY_HASH] if self._discovery_data else None ) - async def async_remove_from_registry(self) -> None: - """Remove entity from entity registry.""" + async def _async_remove_state_and_registry_entry(self) -> None: + """Remove entity's state and entity registry entry. + + Remove entity from entity registry if it is registered, this also removes the state. + If the entity is not in the entity registry, just remove the state. + """ entity_registry = ( await self.hass.helpers.entity_registry.async_get_registry() ) @@ -1205,6 +1209,8 @@ class MqttDiscoveryUpdate(Entity): entity_entry = entity_registry.async_get(self.entity_id) entity_registry.async_remove(self.entity_id) await cleanup_device_registry(self.hass, entity_entry.device_id) + else: + await self.async_remove() @callback async def discovery_callback(payload): @@ -1216,9 +1222,8 @@ class MqttDiscoveryUpdate(Entity): if not payload: # Empty payload: Remove component _LOGGER.info("Removing component: %s", self.entity_id) - self._cleanup_on_remove() - await async_remove_from_registry(self) - await self.async_remove() + self._cleanup_discovery_on_remove() + await _async_remove_state_and_registry_entry(self) elif self._discovery_update: # Non-empty payload: Notify component _LOGGER.info("Updating component: %s", self.entity_id) @@ -1246,9 +1251,9 @@ class MqttDiscoveryUpdate(Entity): async def async_will_remove_from_hass(self) -> None: """Stop listening to signal and cleanup discovery data..""" - self._cleanup_on_remove() + self._cleanup_discovery_on_remove() - def _cleanup_on_remove(self) -> None: + def _cleanup_discovery_on_remove(self) -> None: """Stop listening to signal and cleanup discovery data.""" if self._discovery_data and not self._removed_from_hass: debug_info.remove_entity_data(self.hass, self.entity_id) diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 428de1a683c1..df623a2fc20f 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -68,10 +68,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ "tests.components.mqtt.test_init", "test_setup_with_tls_config_of_v1_under_python36_only_uses_v1", ), - ("tests.components.mqtt.test_light", "test_entity_device_info_remove"), - ("tests.components.mqtt.test_light_json", "test_entity_device_info_remove"), - ("tests.components.mqtt.test_light_template", "test_entity_device_info_remove"), - ("tests.components.mqtt.test_switch", "test_entity_device_info_remove"), ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), ("tests.components.qwikswitch.test_init", "test_sensor_device"), ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), From 1d2713b0ea1c2d93a88010695a2e9b9bd8d5eda6 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Thu, 2 Apr 2020 18:52:46 +0200 Subject: [PATCH 017/653] Clarify light reproduce state deprecation warning (#33531) --- homeassistant/components/light/reproduce_state.py | 10 +++++++--- tests/components/light/test_reproduce_state.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/reproduce_state.py b/homeassistant/components/light/reproduce_state.py index 59a4b0306d08..9a6b22b51a2d 100644 --- a/homeassistant/components/light/reproduce_state.py +++ b/homeassistant/components/light/reproduce_state.py @@ -64,7 +64,10 @@ DEPRECATED_GROUP = [ ATTR_TRANSITION, ] -DEPRECATION_WARNING = "The use of other attributes than device state attributes is deprecated and will be removed in a future release. Read the logs for further details: https://www.home-assistant.io/integrations/scene/" +DEPRECATION_WARNING = ( + "The use of other attributes than device state attributes is deprecated and will be removed in a future release. " + "Invalid attributes are %s. Read the logs for further details: https://www.home-assistant.io/integrations/scene/" +) async def _async_reproduce_state( @@ -84,8 +87,9 @@ async def _async_reproduce_state( return # Warn if deprecated attributes are used - if any(attr in DEPRECATED_GROUP for attr in state.attributes): - _LOGGER.warning(DEPRECATION_WARNING) + deprecated_attrs = [attr for attr in state.attributes if attr in DEPRECATED_GROUP] + if deprecated_attrs: + _LOGGER.warning(DEPRECATION_WARNING, deprecated_attrs) # Return if we are already at the right state. if cur_state.state == state.state and all( diff --git a/tests/components/light/test_reproduce_state.py b/tests/components/light/test_reproduce_state.py index 250a0fe26a82..1c40f352ff01 100644 --- a/tests/components/light/test_reproduce_state.py +++ b/tests/components/light/test_reproduce_state.py @@ -166,4 +166,4 @@ async def test_deprecation_warning(hass, caplog): [State("light.entity_off", "on", {"brightness_pct": 80})], blocking=True ) assert len(turn_on_calls) == 1 - assert DEPRECATION_WARNING in caplog.text + assert DEPRECATION_WARNING % ["brightness_pct"] in caplog.text From b10319f69ea59024ed0d6cdbfd21e2306e422992 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Apr 2020 09:55:34 -0700 Subject: [PATCH 018/653] Convert TTS tests to async (#33517) * Convert TTS tests to async * Address comments --- homeassistant/components/tts/__init__.py | 76 +- tests/common.py | 16 +- tests/components/tts/test_init.py | 941 +++++++++++------------ 3 files changed, 501 insertions(+), 532 deletions(-) diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index 3a456dec531a..d9d513198ce4 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -133,7 +133,7 @@ async def async_setup(hass, config): hass, p_config, discovery_info ) else: - provider = await hass.async_add_job( + provider = await hass.async_add_executor_job( platform.get_engine, hass, p_config, discovery_info ) @@ -226,41 +226,17 @@ class SpeechManager: self.time_memory = time_memory self.base_url = base_url - def init_tts_cache_dir(cache_dir): - """Init cache folder.""" - if not os.path.isabs(cache_dir): - cache_dir = self.hass.config.path(cache_dir) - if not os.path.isdir(cache_dir): - _LOGGER.info("Create cache dir %s.", cache_dir) - os.mkdir(cache_dir) - return cache_dir - try: - self.cache_dir = await self.hass.async_add_job( - init_tts_cache_dir, cache_dir + self.cache_dir = await self.hass.async_add_executor_job( + _init_tts_cache_dir, self.hass, cache_dir ) except OSError as err: raise HomeAssistantError(f"Can't init cache dir {err}") - def get_cache_files(): - """Return a dict of given engine files.""" - cache = {} - - folder_data = os.listdir(self.cache_dir) - for file_data in folder_data: - record = _RE_VOICE_FILE.match(file_data) - if record: - key = KEY_PATTERN.format( - record.group(1), - record.group(2), - record.group(3), - record.group(4), - ) - cache[key.lower()] = file_data.lower() - return cache - try: - cache_files = await self.hass.async_add_job(get_cache_files) + cache_files = await self.hass.async_add_executor_job( + _get_cache_files, self.cache_dir + ) except OSError as err: raise HomeAssistantError(f"Can't read cache dir {err}") @@ -273,13 +249,13 @@ class SpeechManager: def remove_files(): """Remove files from filesystem.""" - for _, filename in self.file_cache.items(): + for filename in self.file_cache.values(): try: os.remove(os.path.join(self.cache_dir, filename)) except OSError as err: _LOGGER.warning("Can't remove cache file '%s': %s", filename, err) - await self.hass.async_add_job(remove_files) + await self.hass.async_add_executor_job(remove_files) self.file_cache = {} @callback @@ -312,6 +288,7 @@ class SpeechManager: merged_options.update(options) options = merged_options options = options or provider.default_options + if options is not None: invalid_opts = [ opt_name @@ -378,10 +355,10 @@ class SpeechManager: speech.write(data) try: - await self.hass.async_add_job(save_speech) + await self.hass.async_add_executor_job(save_speech) self.file_cache[key] = filename - except OSError: - _LOGGER.error("Can't write %s", filename) + except OSError as err: + _LOGGER.error("Can't write %s: %s", filename, err) async def async_file_to_mem(self, key): """Load voice from file cache into memory. @@ -400,7 +377,7 @@ class SpeechManager: return speech.read() try: - data = await self.hass.async_add_job(load_speech) + data = await self.hass.async_add_executor_job(load_speech) except OSError: del self.file_cache[key] raise HomeAssistantError(f"Can't read {voice_file}") @@ -506,11 +483,36 @@ class Provider: Return a tuple of file extension and data as bytes. """ - return await self.hass.async_add_job( + return await self.hass.async_add_executor_job( ft.partial(self.get_tts_audio, message, language, options=options) ) +def _init_tts_cache_dir(hass, cache_dir): + """Init cache folder.""" + if not os.path.isabs(cache_dir): + cache_dir = hass.config.path(cache_dir) + if not os.path.isdir(cache_dir): + _LOGGER.info("Create cache dir %s", cache_dir) + os.mkdir(cache_dir) + return cache_dir + + +def _get_cache_files(cache_dir): + """Return a dict of given engine files.""" + cache = {} + + folder_data = os.listdir(cache_dir) + for file_data in folder_data: + record = _RE_VOICE_FILE.match(file_data) + if record: + key = KEY_PATTERN.format( + record.group(1), record.group(2), record.group(3), record.group(4), + ) + cache[key.lower()] = file_data.lower() + return cache + + class TextToSpeechUrlView(HomeAssistantView): """TTS view to get a url to a generated speech file.""" diff --git a/tests/common.py b/tests/common.py index 8fdcc9b8f860..9790a8a7131a 100644 --- a/tests/common.py +++ b/tests/common.py @@ -14,6 +14,8 @@ import threading from unittest.mock import MagicMock, Mock, patch import uuid +from aiohttp.test_utils import unused_port as get_test_instance_port # noqa + from homeassistant import auth, config_entries, core as ha, loader from homeassistant.auth import ( auth_store, @@ -37,7 +39,6 @@ from homeassistant.const import ( EVENT_PLATFORM_DISCOVERED, EVENT_STATE_CHANGED, EVENT_TIME_CHANGED, - SERVER_PORT, STATE_OFF, STATE_ON, ) @@ -59,7 +60,6 @@ import homeassistant.util.dt as date_util from homeassistant.util.unit_system import METRIC_SYSTEM import homeassistant.util.yaml.loader as yaml_loader -_TEST_INSTANCE_PORT = SERVER_PORT _LOGGER = logging.getLogger(__name__) INSTANCES = [] CLIENT_ID = "https://example.com/app" @@ -217,18 +217,6 @@ async def async_test_home_assistant(loop): return hass -def get_test_instance_port(): - """Return unused port for running test instance. - - The socket that holds the default port does not get released when we stop - HA in a different test case. Until I have figured out what is going on, - let's run each test on a different port. - """ - global _TEST_INSTANCE_PORT - _TEST_INSTANCE_PORT += 1 - return _TEST_INSTANCE_PORT - - def async_mock_service(hass, domain, service, schema=None): """Set up a fake service & return a calls log list to this service.""" calls = [] diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index 62c4bc3a0655..ab5d562ffc80 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -1,14 +1,12 @@ """The tests for the TTS component.""" import ctypes import os -import shutil from unittest.mock import PropertyMock, patch import pytest -import requests +import yarl from homeassistant.components.demo.tts import DemoProvider -import homeassistant.components.http as http from homeassistant.components.media_player.const import ( ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_TYPE, @@ -17,15 +15,52 @@ from homeassistant.components.media_player.const import ( SERVICE_PLAY_MEDIA, ) import homeassistant.components.tts as tts -from homeassistant.setup import async_setup_component, setup_component +from homeassistant.components.tts import _get_cache_files +from homeassistant.setup import async_setup_component -from tests.common import ( - assert_setup_component, - get_test_home_assistant, - get_test_instance_port, - mock_service, - mock_storage, -) +from tests.common import assert_setup_component, async_mock_service + + +def relative_url(url): + """Convert an absolute url to a relative one.""" + return str(yarl.URL(url).relative()) + + +@pytest.fixture +def demo_provider(): + """Demo TTS provider.""" + return DemoProvider("en") + + +@pytest.fixture(autouse=True) +def mock_get_cache_files(): + """Mock the list TTS cache function.""" + with patch( + "homeassistant.components.tts._get_cache_files", return_value={} + ) as mock_cache_files: + yield mock_cache_files + + +@pytest.fixture(autouse=True) +def mock_init_cache_dir(): + """Mock the TTS cache dir in memory.""" + with patch( + "homeassistant.components.tts._init_tts_cache_dir", + side_effect=lambda hass, cache_dir: hass.config.path(cache_dir), + ) as mock_cache_dir: + yield mock_cache_dir + + +@pytest.fixture +def empty_cache_dir(tmp_path, mock_init_cache_dir, mock_get_cache_files): + """Mock the TTS cache dir with empty dir.""" + mock_init_cache_dir.side_effect = None + mock_init_cache_dir.return_value = str(tmp_path) + + # Restore original get cache files behavior, we're working with a real dir. + mock_get_cache_files.side_effect = _get_cache_files + + return tmp_path @pytest.fixture(autouse=True) @@ -38,239 +73,209 @@ def mutagen_mock(): yield -class TestTTS: - """Test the Google speech component.""" +async def test_setup_component_demo(hass): + """Set up the demo platform with defaults.""" + config = {tts.DOMAIN: {"platform": "demo"}} - def setup_method(self): - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - self.demo_provider = DemoProvider("en") - self.default_tts_cache = self.hass.config.path(tts.DEFAULT_CACHE_DIR) - self.mock_storage = mock_storage() - self.mock_storage.__enter__() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - setup_component( - self.hass, - http.DOMAIN, - {http.DOMAIN: {http.CONF_SERVER_PORT: get_test_instance_port()}}, - ) + assert hass.services.has_service(tts.DOMAIN, "demo_say") + assert hass.services.has_service(tts.DOMAIN, "clear_cache") - def teardown_method(self): - """Stop everything that was started.""" - self.hass.stop() - self.mock_storage.__exit__(None, None, None) - if os.path.isdir(self.default_tts_cache): - shutil.rmtree(self.default_tts_cache) +async def test_setup_component_demo_no_access_cache_folder(hass, mock_init_cache_dir): + """Set up the demo platform with defaults.""" + config = {tts.DOMAIN: {"platform": "demo"}} - def test_setup_component_demo(self): - """Set up the demo platform with defaults.""" - config = {tts.DOMAIN: {"platform": "demo"}} + mock_init_cache_dir.side_effect = OSError(2, "No access") + assert not await async_setup_component(hass, tts.DOMAIN, config) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + assert not hass.services.has_service(tts.DOMAIN, "demo_say") + assert not hass.services.has_service(tts.DOMAIN, "clear_cache") - assert self.hass.services.has_service(tts.DOMAIN, "demo_say") - assert self.hass.services.has_service(tts.DOMAIN, "clear_cache") - @patch("os.mkdir", side_effect=OSError(2, "No access")) - def test_setup_component_demo_no_access_cache_folder(self, mock_mkdir): - """Set up the demo platform with defaults.""" - config = {tts.DOMAIN: {"platform": "demo"}} +async def test_setup_component_and_test_service(hass, empty_cache_dir): + """Set up the demo platform and call service.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - assert not setup_component(self.hass, tts.DOMAIN, config) + config = {tts.DOMAIN: {"platform": "demo"}} - assert not self.hass.services.has_service(tts.DOMAIN, "demo_say") - assert not self.hass.services.has_service(tts.DOMAIN, "clear_cache") + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - def test_setup_component_and_test_service(self): - """Set up the demo platform and call service.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) - config = {tts.DOMAIN: {"platform": "demo"}} + assert len(calls) == 1 + assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC + assert calls[0].data[ + ATTR_MEDIA_CONTENT_ID + ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3".format( + hass.config.api.base_url + ) + assert ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ).is_file() - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() +async def test_setup_component_and_test_service_with_config_language( + hass, empty_cache_dir +): + """Set up the demo platform and call service.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - assert len(calls) == 1 - assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC - assert calls[0].data[ - ATTR_MEDIA_CONTENT_ID - ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3".format( - self.hass.config.api.base_url - ) - assert os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) - ) + config = {tts.DOMAIN: {"platform": "demo", "language": "de"}} - def test_setup_component_and_test_service_with_config_language(self): - """Set up the demo platform and call service.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - config = {tts.DOMAIN: {"platform": "demo", "language": "de"}} + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + assert len(calls) == 1 + assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC + assert calls[0].data[ + ATTR_MEDIA_CONTENT_ID + ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( + hass.config.api.base_url + ) + assert ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3" + ).is_file() - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() +async def test_setup_component_and_test_service_with_wrong_conf_language(hass): + """Set up the demo platform and call service with wrong config.""" + config = {tts.DOMAIN: {"platform": "demo", "language": "ru"}} - assert len(calls) == 1 - assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC - assert calls[0].data[ - ATTR_MEDIA_CONTENT_ID - ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( - self.hass.config.api.base_url - ) - assert os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3", - ) - ) + with assert_setup_component(0, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - def test_setup_component_and_test_service_with_wrong_conf_language(self): - """Set up the demo platform and call service with wrong config.""" - config = {tts.DOMAIN: {"platform": "demo", "language": "ru"}} - with assert_setup_component(0, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) +async def test_setup_component_and_test_service_with_service_language( + hass, empty_cache_dir +): + """Set up the demo platform and call service.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - def test_setup_component_and_test_service_with_service_language(self): - """Set up the demo platform and call service.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + config = {tts.DOMAIN: {"platform": "demo"}} - config = {tts.DOMAIN: {"platform": "demo"}} + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + tts.ATTR_LANGUAGE: "de", + }, + blocking=True, + ) + assert len(calls) == 1 + assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC + assert calls[0].data[ + ATTR_MEDIA_CONTENT_ID + ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( + hass.config.api.base_url + ) + assert ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3" + ).is_file() - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - tts.ATTR_LANGUAGE: "de", - }, - ) - self.hass.block_till_done() - assert len(calls) == 1 - assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC - assert calls[0].data[ - ATTR_MEDIA_CONTENT_ID - ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( - self.hass.config.api.base_url - ) - assert os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3", - ) - ) +async def test_setup_component_test_service_with_wrong_service_language( + hass, empty_cache_dir +): + """Set up the demo platform and call service.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - def test_setup_component_test_service_with_wrong_service_language(self): - """Set up the demo platform and call service.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + config = {tts.DOMAIN: {"platform": "demo"}} - config = {tts.DOMAIN: {"platform": "demo"}} + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + tts.ATTR_LANGUAGE: "lang", + }, + blocking=True, + ) + assert len(calls) == 0 + assert not ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_lang_-_demo.mp3" + ).is_file() - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - tts.ATTR_LANGUAGE: "lang", - }, - ) - self.hass.block_till_done() - assert len(calls) == 0 - assert not os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_lang_-_demo.mp3", - ) - ) +async def test_setup_component_and_test_service_with_service_options( + hass, empty_cache_dir +): + """Set up the demo platform and call service with options.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - def test_setup_component_and_test_service_with_service_options(self): - """Set up the demo platform and call service with options.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + config = {tts.DOMAIN: {"platform": "demo"}} - config = {tts.DOMAIN: {"platform": "demo"}} + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + tts.ATTR_LANGUAGE: "de", + tts.ATTR_OPTIONS: {"voice": "alex"}, + }, + blocking=True, + ) + opt_hash = ctypes.c_size_t(hash(frozenset({"voice": "alex"}))).value - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - tts.ATTR_LANGUAGE: "de", - tts.ATTR_OPTIONS: {"voice": "alex"}, - }, - ) - self.hass.block_till_done() + assert len(calls) == 1 + assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC + assert calls[0].data[ + ATTR_MEDIA_CONTENT_ID + ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{}_demo.mp3".format( + hass.config.api.base_url, opt_hash + ) + assert ( + empty_cache_dir + / f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3" + ).is_file() - opt_hash = ctypes.c_size_t(hash(frozenset({"voice": "alex"}))).value - assert len(calls) == 1 - assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC - assert calls[0].data[ - ATTR_MEDIA_CONTENT_ID - ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{}_demo.mp3".format( - self.hass.config.api.base_url, opt_hash - ) - assert os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{0}_demo.mp3".format( - opt_hash - ), - ) - ) +async def test_setup_component_and_test_with_service_options_def(hass, empty_cache_dir): + """Set up the demo platform and call service with default options.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - @patch( + config = {tts.DOMAIN: {"platform": "demo"}} + + with assert_setup_component(1, tts.DOMAIN), patch( "homeassistant.components.demo.tts.DemoProvider.default_options", new_callable=PropertyMock(return_value={"voice": "alex"}), - ) - def test_setup_component_and_test_with_service_options_def(self, def_mock): - """Set up the demo platform and call service with default options.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + ): + assert await async_setup_component(hass, tts.DOMAIN, config) - config = {tts.DOMAIN: {"platform": "demo"}} - - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) - - self.hass.services.call( + await hass.services.async_call( tts.DOMAIN, "demo_say", { @@ -278,9 +283,8 @@ class TestTTS: tts.ATTR_MESSAGE: "There is someone at the door.", tts.ATTR_LANGUAGE: "de", }, + blocking=True, ) - self.hass.block_till_done() - opt_hash = ctypes.c_size_t(hash(frozenset({"voice": "alex"}))).value assert len(calls) == 1 @@ -288,362 +292,341 @@ class TestTTS: assert calls[0].data[ ATTR_MEDIA_CONTENT_ID ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{}_demo.mp3".format( - self.hass.config.api.base_url, opt_hash + hass.config.api.base_url, opt_hash ) assert os.path.isfile( os.path.join( - self.default_tts_cache, + empty_cache_dir, "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{0}_demo.mp3".format( opt_hash ), ) ) - def test_setup_component_and_test_service_with_service_options_wrong(self): - """Set up the demo platform and call service with wrong options.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - config = {tts.DOMAIN: {"platform": "demo"}} +async def test_setup_component_and_test_service_with_service_options_wrong( + hass, empty_cache_dir +): + """Set up the demo platform and call service with wrong options.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + config = {tts.DOMAIN: {"platform": "demo"}} - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - tts.ATTR_LANGUAGE: "de", - tts.ATTR_OPTIONS: {"speed": 1}, - }, - ) - self.hass.block_till_done() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - opt_hash = ctypes.c_size_t(hash(frozenset({"speed": 1}))).value + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + tts.ATTR_LANGUAGE: "de", + tts.ATTR_OPTIONS: {"speed": 1}, + }, + blocking=True, + ) + opt_hash = ctypes.c_size_t(hash(frozenset({"speed": 1}))).value - assert len(calls) == 0 - assert not os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{0}_demo.mp3".format( - opt_hash - ), - ) - ) + assert len(calls) == 0 + assert not ( + empty_cache_dir + / f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3" + ).is_file() - def test_setup_component_and_test_service_with_base_url_set(self): - """Set up the demo platform with ``base_url`` set and call service.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - config = {tts.DOMAIN: {"platform": "demo", "base_url": "http://fnord"}} +async def test_setup_component_and_test_service_with_base_url_set(hass): + """Set up the demo platform with ``base_url`` set and call service.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + config = {tts.DOMAIN: {"platform": "demo", "base_url": "http://fnord"}} - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - assert len(calls) == 1 - assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC - assert ( - calls[0].data[ATTR_MEDIA_CONTENT_ID] == "http://fnord" - "/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491" - "_en_-_demo.mp3" - ) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + assert len(calls) == 1 + assert calls[0].data[ATTR_MEDIA_CONTENT_TYPE] == MEDIA_TYPE_MUSIC + assert ( + calls[0].data[ATTR_MEDIA_CONTENT_ID] == "http://fnord" + "/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491" + "_en_-_demo.mp3" + ) - def test_setup_component_and_test_service_clear_cache(self): - """Set up the demo platform and call service clear cache.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - config = {tts.DOMAIN: {"platform": "demo"}} +async def test_setup_component_and_test_service_clear_cache(hass, empty_cache_dir): + """Set up the demo platform and call service clear cache.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + config = {tts.DOMAIN: {"platform": "demo"}} - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - assert len(calls) == 1 - assert os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) - ) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + # To make sure the file is persisted + await hass.async_block_till_done() + assert len(calls) == 1 + assert ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ).is_file() - self.hass.services.call(tts.DOMAIN, tts.SERVICE_CLEAR_CACHE, {}) - self.hass.block_till_done() + await hass.services.async_call( + tts.DOMAIN, tts.SERVICE_CLEAR_CACHE, {}, blocking=True + ) - assert not os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) - ) + assert not ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ).is_file() - def test_setup_component_and_test_service_with_receive_voice(self): - """Set up the demo platform and call service and receive voice.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - config = {tts.DOMAIN: {"platform": "demo"}} +async def test_setup_component_and_test_service_with_receive_voice( + hass, demo_provider, hass_client +): + """Set up the demo platform and call service and receive voice.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + config = {tts.DOMAIN: {"platform": "demo"}} - self.hass.start() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() + client = await hass_client() - assert len(calls) == 1 - req = requests.get(calls[0].data[ATTR_MEDIA_CONTENT_ID]) - _, demo_data = self.demo_provider.get_tts_audio("bla", "en") - demo_data = tts.SpeechManager.write_tags( - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - demo_data, - self.demo_provider, - "AI person is in front of your door.", - "en", - None, - ) - assert req.status_code == 200 - assert req.content == demo_data + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + assert len(calls) == 1 - def test_setup_component_and_test_service_with_receive_voice_german(self): - """Set up the demo platform and call service and receive voice.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + req = await client.get(relative_url(calls[0].data[ATTR_MEDIA_CONTENT_ID])) + _, demo_data = demo_provider.get_tts_audio("bla", "en") + demo_data = tts.SpeechManager.write_tags( + "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", + demo_data, + demo_provider, + "AI person is in front of your door.", + "en", + None, + ) + assert req.status == 200 + assert await req.read() == demo_data - config = {tts.DOMAIN: {"platform": "demo", "language": "de"}} - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) +async def test_setup_component_and_test_service_with_receive_voice_german( + hass, demo_provider, hass_client +): + """Set up the demo platform and call service and receive voice.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - self.hass.start() + config = {tts.DOMAIN: {"platform": "demo", "language": "de"}} - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - assert len(calls) == 1 - req = requests.get(calls[0].data[ATTR_MEDIA_CONTENT_ID]) - _, demo_data = self.demo_provider.get_tts_audio("bla", "de") - demo_data = tts.SpeechManager.write_tags( - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3", - demo_data, - self.demo_provider, - "There is someone at the door.", - "de", - None, - ) - assert req.status_code == 200 - assert req.content == demo_data + client = await hass_client() - def test_setup_component_and_web_view_wrong_file(self): - """Set up the demo platform and receive wrong file from web.""" - config = {tts.DOMAIN: {"platform": "demo"}} + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + assert len(calls) == 1 + req = await client.get(relative_url(calls[0].data[ATTR_MEDIA_CONTENT_ID])) + _, demo_data = demo_provider.get_tts_audio("bla", "de") + demo_data = tts.SpeechManager.write_tags( + "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3", + demo_data, + demo_provider, + "There is someone at the door.", + "de", + None, + ) + assert req.status == 200 + assert await req.read() == demo_data - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) - self.hass.start() +async def test_setup_component_and_web_view_wrong_file(hass, hass_client): + """Set up the demo platform and receive wrong file from web.""" + config = {tts.DOMAIN: {"platform": "demo"}} - url = ( - "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" - ).format(self.hass.config.api.base_url) + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - req = requests.get(url) - assert req.status_code == 404 + client = await hass_client() - def test_setup_component_and_web_view_wrong_filename(self): - """Set up the demo platform and receive wrong filename from web.""" - config = {tts.DOMAIN: {"platform": "demo"}} + url = "/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + req = await client.get(url) + assert req.status == 404 - self.hass.start() - url = ( - "{}/api/tts_proxy/265944dsk32c1b2a621be5930510bb2cd_en_-_demo.mp3" - ).format(self.hass.config.api.base_url) +async def test_setup_component_and_web_view_wrong_filename(hass, hass_client): + """Set up the demo platform and receive wrong filename from web.""" + config = {tts.DOMAIN: {"platform": "demo"}} - req = requests.get(url) - assert req.status_code == 404 + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - def test_setup_component_test_without_cache(self): - """Set up demo platform without cache.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + client = await hass_client() - config = {tts.DOMAIN: {"platform": "demo", "cache": False}} + url = "/api/tts_proxy/265944dsk32c1b2a621be5930510bb2cd_en_-_demo.mp3" - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + req = await client.get(url) + assert req.status == 404 - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() - assert len(calls) == 1 - assert not os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) - ) +async def test_setup_component_test_without_cache(hass, empty_cache_dir): + """Set up demo platform without cache.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - def test_setup_component_test_with_cache_call_service_without_cache(self): - """Set up demo platform with cache and call service without cache.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + config = {tts.DOMAIN: {"platform": "demo", "cache": False}} - config = {tts.DOMAIN: {"platform": "demo", "cache": True}} + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + }, + blocking=True, + ) + assert len(calls) == 1 + assert not ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ).is_file() - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - tts.ATTR_CACHE: False, - }, - ) - self.hass.block_till_done() - assert len(calls) == 1 - assert not os.path.isfile( - os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) - ) +async def test_setup_component_test_with_cache_call_service_without_cache( + hass, empty_cache_dir +): + """Set up demo platform with cache and call service without cache.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - def test_setup_component_test_with_cache_dir(self): - """Set up demo platform with cache and call service without cache.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + config = {tts.DOMAIN: {"platform": "demo", "cache": True}} - _, demo_data = self.demo_provider.get_tts_audio("bla", "en") - cache_file = os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) - os.mkdir(self.default_tts_cache) - with open(cache_file, "wb") as voice_file: - voice_file.write(demo_data) + await hass.services.async_call( + tts.DOMAIN, + "demo_say", + { + "entity_id": "media_player.something", + tts.ATTR_MESSAGE: "There is someone at the door.", + tts.ATTR_CACHE: False, + }, + blocking=True, + ) + assert len(calls) == 1 + assert not ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ).is_file() - config = {tts.DOMAIN: {"platform": "demo", "cache": True}} - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) +async def test_setup_component_test_with_cache_dir( + hass, empty_cache_dir, demo_provider +): + """Set up demo platform with cache and call service without cache.""" + calls = async_mock_service(hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - with patch( - "homeassistant.components.demo.tts.DemoProvider.get_tts_audio", - return_value=(None, None), - ): - self.hass.services.call( - tts.DOMAIN, - "demo_say", - { - "entity_id": "media_player.something", - tts.ATTR_MESSAGE: "There is someone at the door.", - }, - ) - self.hass.block_till_done() + _, demo_data = demo_provider.get_tts_audio("bla", "en") + cache_file = ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ) - assert len(calls) == 1 - assert calls[0].data[ - ATTR_MEDIA_CONTENT_ID - ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3".format( - self.hass.config.api.base_url - ) + with open(cache_file, "wb") as voice_file: + voice_file.write(demo_data) - @patch( + config = {tts.DOMAIN: {"platform": "demo", "cache": True}} + + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) + + with patch( "homeassistant.components.demo.tts.DemoProvider.get_tts_audio", return_value=(None, None), - ) - def test_setup_component_test_with_error_on_get_tts(self, tts_mock): - """Set up demo platform with wrong get_tts_audio.""" - calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) - - config = {tts.DOMAIN: {"platform": "demo"}} - - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) - - self.hass.services.call( + ): + await hass.services.async_call( tts.DOMAIN, "demo_say", { "entity_id": "media_player.something", tts.ATTR_MESSAGE: "There is someone at the door.", }, + blocking=True, ) - self.hass.block_till_done() + assert len(calls) == 1 + assert calls[0].data[ + ATTR_MEDIA_CONTENT_ID + ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3".format( + hass.config.api.base_url + ) - assert len(calls) == 0 - def test_setup_component_load_cache_retrieve_without_mem_cache(self): - """Set up component and load cache and get without mem cache.""" - _, demo_data = self.demo_provider.get_tts_audio("bla", "en") - cache_file = os.path.join( - self.default_tts_cache, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3", - ) +async def test_setup_component_test_with_error_on_get_tts(hass): + """Set up demo platform with wrong get_tts_audio.""" + config = {tts.DOMAIN: {"platform": "demo"}} - os.mkdir(self.default_tts_cache) - with open(cache_file, "wb") as voice_file: - voice_file.write(demo_data) + with assert_setup_component(1, tts.DOMAIN), patch( + "homeassistant.components.demo.tts.DemoProvider.get_tts_audio", + return_value=(None, None), + ): + assert await async_setup_component(hass, tts.DOMAIN, config) - config = {tts.DOMAIN: {"platform": "demo", "cache": True}} - with assert_setup_component(1, tts.DOMAIN): - setup_component(self.hass, tts.DOMAIN, config) +async def test_setup_component_load_cache_retrieve_without_mem_cache( + hass, demo_provider, empty_cache_dir, hass_client +): + """Set up component and load cache and get without mem cache.""" + _, demo_data = demo_provider.get_tts_audio("bla", "en") + cache_file = ( + empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + ) - self.hass.start() + with open(cache_file, "wb") as voice_file: + voice_file.write(demo_data) - url = ( - "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" - ).format(self.hass.config.api.base_url) + config = {tts.DOMAIN: {"platform": "demo", "cache": True}} - req = requests.get(url) - assert req.status_code == 200 - assert req.content == demo_data + with assert_setup_component(1, tts.DOMAIN): + assert await async_setup_component(hass, tts.DOMAIN, config) + + client = await hass_client() + + url = "/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" + + req = await client.get(url) + assert req.status == 200 + assert await req.read() == demo_data async def test_setup_component_and_web_get_url(hass, hass_client): @@ -666,10 +649,6 @@ async def test_setup_component_and_web_get_url(hass, hass_client): ) ) - tts_cache = hass.config.path(tts.DEFAULT_CACHE_DIR) - if os.path.isdir(tts_cache): - shutil.rmtree(tts_cache) - async def test_setup_component_and_web_get_url_bad_config(hass, hass_client): """Set up the demo platform and receive wrong file from web.""" From 30fd9950e225e99eee0677d28f19c86bbfd988ec Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 2 Apr 2020 12:18:53 -0500 Subject: [PATCH 019/653] Add remote platform to directv (#32790) * add remote platform to directv. * Update __init__.py * Update .coveragerc * Rename remote py to remote.py * Update remote.py * squash. * Update remote.py * squash. * Update remote.py --- homeassistant/components/directv/__init__.py | 2 +- .../components/directv/manifest.json | 2 +- homeassistant/components/directv/remote.py | 106 ++++++++++++++ requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/directv/test_remote.py | 130 ++++++++++++++++++ 6 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 homeassistant/components/directv/remote.py create mode 100644 tests/components/directv/test_remote.py diff --git a/homeassistant/components/directv/__init__.py b/homeassistant/components/directv/__init__.py index 0be5957a29a2..677487945be8 100644 --- a/homeassistant/components/directv/__init__.py +++ b/homeassistant/components/directv/__init__.py @@ -32,7 +32,7 @@ CONFIG_SCHEMA = vol.Schema( extra=vol.ALLOW_EXTRA, ) -PLATFORMS = ["media_player"] +PLATFORMS = ["media_player", "remote"] SCAN_INTERVAL = timedelta(seconds=30) diff --git a/homeassistant/components/directv/manifest.json b/homeassistant/components/directv/manifest.json index 4a712ba053ec..8474849bdaa5 100644 --- a/homeassistant/components/directv/manifest.json +++ b/homeassistant/components/directv/manifest.json @@ -2,7 +2,7 @@ "domain": "directv", "name": "DirecTV", "documentation": "https://www.home-assistant.io/integrations/directv", - "requirements": ["directv==0.2.0"], + "requirements": ["directv==0.3.0"], "dependencies": [], "codeowners": ["@ctalkington"], "quality_scale": "gold", diff --git a/homeassistant/components/directv/remote.py b/homeassistant/components/directv/remote.py new file mode 100644 index 000000000000..8bc7c2208338 --- /dev/null +++ b/homeassistant/components/directv/remote.py @@ -0,0 +1,106 @@ +"""Support for the DIRECTV remote.""" +from datetime import timedelta +import logging +from typing import Any, Callable, Iterable, List + +from directv import DIRECTV, DIRECTVError + +from homeassistant.components.remote import RemoteDevice +from homeassistant.config_entries import ConfigEntry +from homeassistant.helpers.typing import HomeAssistantType + +from . import DIRECTVEntity +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + +SCAN_INTERVAL = timedelta(minutes=2) + + +async def async_setup_entry( + hass: HomeAssistantType, + entry: ConfigEntry, + async_add_entities: Callable[[List, bool], None], +) -> bool: + """Load DirecTV remote based on a config entry.""" + dtv = hass.data[DOMAIN][entry.entry_id] + entities = [] + + for location in dtv.device.locations: + entities.append( + DIRECTVRemote( + dtv=dtv, name=str.title(location.name), address=location.address, + ) + ) + + async_add_entities(entities, True) + + +class DIRECTVRemote(DIRECTVEntity, RemoteDevice): + """Device that sends commands to a DirecTV receiver.""" + + def __init__(self, *, dtv: DIRECTV, name: str, address: str = "0") -> None: + """Initialize DirecTV remote.""" + super().__init__( + dtv=dtv, name=name, address=address, + ) + + self._available = False + self._is_on = True + + @property + def available(self): + """Return if able to retrieve information from device or not.""" + return self._available + + @property + def unique_id(self): + """Return a unique ID.""" + if self._address == "0": + return self.dtv.device.info.receiver_id + + return self._address + + @property + def is_on(self) -> bool: + """Return True if entity is on.""" + return self._is_on + + async def async_update(self) -> None: + """Update device state.""" + status = await self.dtv.status(self._address) + + if status in ("active", "standby"): + self._available = True + self._is_on = status == "active" + else: + self._available = False + self._is_on = False + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn the device on.""" + await self.dtv.remote("poweron", self._address) + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn the device off.""" + await self.dtv.remote("poweroff", self._address) + + async def async_send_command(self, command: Iterable[str], **kwargs: Any) -> None: + """Send a command to a device. + + Supported keys: power, poweron, poweroff, format, + pause, rew, replay, stop, advance, ffwd, record, + play, guide, active, list, exit, back, menu, info, + up, down, left, right, select, red, green, yellow, + blue, chanup, chandown, prev, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, dash, enter + """ + for single_command in command: + try: + await self.dtv.remote(single_command, self._address) + except DIRECTVError: + _LOGGER.exception( + "Sending command %s to device %s failed", + single_command, + self._device_id, + ) diff --git a/requirements_all.txt b/requirements_all.txt index d3d1f669df95..e5916a146fe9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -447,7 +447,7 @@ deluge-client==1.7.1 denonavr==0.8.1 # homeassistant.components.directv -directv==0.2.0 +directv==0.3.0 # homeassistant.components.discogs discogs_client==2.2.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 24986a574a17..d1bfa69bbd6a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -178,7 +178,7 @@ defusedxml==0.6.0 denonavr==0.8.1 # homeassistant.components.directv -directv==0.2.0 +directv==0.3.0 # homeassistant.components.updater distro==1.4.0 diff --git a/tests/components/directv/test_remote.py b/tests/components/directv/test_remote.py new file mode 100644 index 000000000000..1e598b358928 --- /dev/null +++ b/tests/components/directv/test_remote.py @@ -0,0 +1,130 @@ +"""The tests for the DirecTV remote platform.""" +from typing import Any, List + +from asynctest import patch + +from homeassistant.components.remote import ( + ATTR_COMMAND, + ATTR_DELAY_SECS, + ATTR_DEVICE, + ATTR_NUM_REPEATS, + DOMAIN as REMOTE_DOMAIN, + SERVICE_SEND_COMMAND, +) +from homeassistant.const import ( + ATTR_ENTITY_ID, + ENTITY_MATCH_ALL, + SERVICE_TURN_OFF, + SERVICE_TURN_ON, +) +from homeassistant.helpers.typing import HomeAssistantType + +from tests.components.directv import setup_integration +from tests.test_util.aiohttp import AiohttpClientMocker + +ATTR_UNIQUE_ID = "unique_id" +CLIENT_ENTITY_ID = f"{REMOTE_DOMAIN}.client" +MAIN_ENTITY_ID = f"{REMOTE_DOMAIN}.host" +UNAVAILABLE_ENTITY_ID = f"{REMOTE_DOMAIN}.unavailable_client" + +# pylint: disable=redefined-outer-name + + +async def async_send_command( + hass: HomeAssistantType, + command: List[str], + entity_id: Any = ENTITY_MATCH_ALL, + device: str = None, + num_repeats: str = None, + delay_secs: str = None, +) -> None: + """Send a command to a device.""" + data = {ATTR_COMMAND: command} + + if entity_id: + data[ATTR_ENTITY_ID] = entity_id + + if device: + data[ATTR_DEVICE] = device + + if num_repeats: + data[ATTR_NUM_REPEATS] = num_repeats + + if delay_secs: + data[ATTR_DELAY_SECS] = delay_secs + + await hass.services.async_call(REMOTE_DOMAIN, SERVICE_SEND_COMMAND, data) + + +async def async_turn_on( + hass: HomeAssistantType, entity_id: Any = ENTITY_MATCH_ALL +) -> None: + """Turn on device.""" + data = {} + + if entity_id: + data[ATTR_ENTITY_ID] = entity_id + + await hass.services.async_call(REMOTE_DOMAIN, SERVICE_TURN_ON, data) + + +async def async_turn_off( + hass: HomeAssistantType, entity_id: Any = ENTITY_MATCH_ALL +) -> None: + """Turn off remote.""" + data = {} + + if entity_id: + data[ATTR_ENTITY_ID] = entity_id + + await hass.services.async_call(REMOTE_DOMAIN, SERVICE_TURN_OFF, data) + + +async def test_setup( + hass: HomeAssistantType, aioclient_mock: AiohttpClientMocker +) -> None: + """Test setup with basic config.""" + await setup_integration(hass, aioclient_mock) + assert hass.states.get(MAIN_ENTITY_ID) + assert hass.states.get(CLIENT_ENTITY_ID) + assert hass.states.get(UNAVAILABLE_ENTITY_ID) + + +async def test_unique_id( + hass: HomeAssistantType, aioclient_mock: AiohttpClientMocker +) -> None: + """Test unique id.""" + await setup_integration(hass, aioclient_mock) + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + + main = entity_registry.async_get(MAIN_ENTITY_ID) + assert main.unique_id == "028877455858" + + client = entity_registry.async_get(CLIENT_ENTITY_ID) + assert client.unique_id == "2CA17D1CD30X" + + unavailable_client = entity_registry.async_get(UNAVAILABLE_ENTITY_ID) + assert unavailable_client.unique_id == "9XXXXXXXXXX9" + + +async def test_main_services( + hass: HomeAssistantType, aioclient_mock: AiohttpClientMocker +) -> None: + """Test the different services.""" + await setup_integration(hass, aioclient_mock) + + with patch("directv.DIRECTV.remote") as remote_mock: + await async_turn_off(hass, MAIN_ENTITY_ID) + await hass.async_block_till_done() + remote_mock.assert_called_once_with("poweroff", "0") + + with patch("directv.DIRECTV.remote") as remote_mock: + await async_turn_on(hass, MAIN_ENTITY_ID) + await hass.async_block_till_done() + remote_mock.assert_called_once_with("poweron", "0") + + with patch("directv.DIRECTV.remote") as remote_mock: + await async_send_command(hass, ["dash"], MAIN_ENTITY_ID) + await hass.async_block_till_done() + remote_mock.assert_called_once_with("dash", "0") From 9fd019244121434fe43ee4b4fe1e7712791ac7b0 Mon Sep 17 00:00:00 2001 From: AJ Schmidt Date: Thu, 2 Apr 2020 13:22:54 -0400 Subject: [PATCH 020/653] Remove extraneous parameter from AlarmDecoder services (#33516) --- homeassistant/components/alarmdecoder/services.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/homeassistant/components/alarmdecoder/services.yaml b/homeassistant/components/alarmdecoder/services.yaml index 12268d48bb71..1193f90ff8e6 100644 --- a/homeassistant/components/alarmdecoder/services.yaml +++ b/homeassistant/components/alarmdecoder/services.yaml @@ -1,9 +1,6 @@ alarm_keypress: description: Send custom keypresses to the alarm. fields: - entity_id: - description: Name of the alarm control panel to trigger. - example: 'alarm_control_panel.downstairs' keypress: description: 'String to send to the alarm panel.' example: '*71' @@ -11,9 +8,6 @@ alarm_keypress: alarm_toggle_chime: description: Send the alarm the toggle chime command. fields: - entity_id: - description: Name of the alarm control panel to trigger. - example: 'alarm_control_panel.downstairs' code: description: A required code to toggle the alarm control panel chime with. example: 1234 From 8b0a0ee521e97df1637b860b464263109fa9cff4 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Thu, 2 Apr 2020 13:25:28 -0400 Subject: [PATCH 021/653] Don't write storage to disk while stopping (#33456) * Don't write storage to disk while stopping * rework change * lint * remove delay save and schedule final write at stop * update tests * fix test component using private methods * cleanup * always listen * use stop in restore state again * whitelist JSON exceptions for later * review comment * make zwave tests use mock storage --- homeassistant/core.py | 6 +-- homeassistant/helpers/restore_state.py | 9 +---- homeassistant/helpers/storage.py | 47 ++++++++++++++-------- tests/common.py | 4 +- tests/components/zwave/test_init.py | 7 ++++ tests/conftest.py | 14 ++++++- tests/helpers/test_storage.py | 55 ++++++++++++++++++++++++-- tests/ignore_uncaught_exceptions.py | 39 ++++++++++++++++++ 8 files changed, 147 insertions(+), 34 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 9265c57bbf34..d9155ece2d3e 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -152,7 +152,7 @@ class CoreState(enum.Enum): starting = "STARTING" running = "RUNNING" stopping = "STOPPING" - writing_data = "WRITING_DATA" + final_write = "FINAL_WRITE" def __str__(self) -> str: """Return the event.""" @@ -414,7 +414,7 @@ class HomeAssistant: # regardless of the state of the loop. if self.state == CoreState.not_running: # just ignore return - if self.state == CoreState.stopping or self.state == CoreState.writing_data: + if self.state == CoreState.stopping or self.state == CoreState.final_write: _LOGGER.info("async_stop called twice: ignored") return if self.state == CoreState.starting: @@ -428,7 +428,7 @@ class HomeAssistant: await self.async_block_till_done() # stage 2 - self.state = CoreState.writing_data + self.state = CoreState.final_write self.bus.async_fire(EVENT_HOMEASSISTANT_FINAL_WRITE) await self.async_block_till_done() diff --git a/homeassistant/helpers/restore_state.py b/homeassistant/helpers/restore_state.py index 0757770d2f78..d57d3ad99207 100644 --- a/homeassistant/helpers/restore_state.py +++ b/homeassistant/helpers/restore_state.py @@ -4,10 +4,7 @@ from datetime import datetime, timedelta import logging from typing import Any, Awaitable, Dict, List, Optional, Set, cast -from homeassistant.const import ( - EVENT_HOMEASSISTANT_FINAL_WRITE, - EVENT_HOMEASSISTANT_START, -) +from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP from homeassistant.core import ( CoreState, HomeAssistant, @@ -187,9 +184,7 @@ class RestoreStateData: async_track_time_interval(self.hass, _async_dump_states, STATE_DUMP_INTERVAL) # Dump states when stopping hass - self.hass.bus.async_listen_once( - EVENT_HOMEASSISTANT_FINAL_WRITE, _async_dump_states - ) + self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_dump_states) @callback def async_restore_entity_added(self, entity_id: str) -> None: diff --git a/homeassistant/helpers/storage.py b/homeassistant/helpers/storage.py index 5885aa01e6fb..00df728fb36d 100644 --- a/homeassistant/helpers/storage.py +++ b/homeassistant/helpers/storage.py @@ -6,7 +6,7 @@ import os from typing import Any, Callable, Dict, List, Optional, Type, Union from homeassistant.const import EVENT_HOMEASSISTANT_FINAL_WRITE -from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback +from homeassistant.core import CALLBACK_TYPE, CoreState, HomeAssistant, callback from homeassistant.helpers.event import async_call_later from homeassistant.loader import bind_hass from homeassistant.util import json as json_util @@ -72,7 +72,7 @@ class Store: self._private = private self._data: Optional[Dict[str, Any]] = None self._unsub_delay_listener: Optional[CALLBACK_TYPE] = None - self._unsub_stop_listener: Optional[CALLBACK_TYPE] = None + self._unsub_final_write_listener: Optional[CALLBACK_TYPE] = None self._write_lock = asyncio.Lock() self._load_task: Optional[asyncio.Future] = None self._encoder = encoder @@ -132,7 +132,12 @@ class Store: self._data = {"version": self.version, "key": self.key, "data": data} self._async_cleanup_delay_listener() - self._async_cleanup_stop_listener() + self._async_cleanup_final_write_listener() + + if self.hass.state == CoreState.stopping: + self._async_ensure_final_write_listener() + return + await self._async_handle_write_data() @callback @@ -141,27 +146,31 @@ class Store: self._data = {"version": self.version, "key": self.key, "data_func": data_func} self._async_cleanup_delay_listener() + self._async_cleanup_final_write_listener() + + if self.hass.state == CoreState.stopping: + self._async_ensure_final_write_listener() + return self._unsub_delay_listener = async_call_later( self.hass, delay, self._async_callback_delayed_write ) - - self._async_ensure_stop_listener() + self._async_ensure_final_write_listener() @callback - def _async_ensure_stop_listener(self): + def _async_ensure_final_write_listener(self): """Ensure that we write if we quit before delay has passed.""" - if self._unsub_stop_listener is None: - self._unsub_stop_listener = self.hass.bus.async_listen_once( - EVENT_HOMEASSISTANT_FINAL_WRITE, self._async_callback_stop_write + if self._unsub_final_write_listener is None: + self._unsub_final_write_listener = self.hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_FINAL_WRITE, self._async_callback_final_write ) @callback - def _async_cleanup_stop_listener(self): + def _async_cleanup_final_write_listener(self): """Clean up a stop listener.""" - if self._unsub_stop_listener is not None: - self._unsub_stop_listener() - self._unsub_stop_listener = None + if self._unsub_final_write_listener is not None: + self._unsub_final_write_listener() + self._unsub_final_write_listener = None @callback def _async_cleanup_delay_listener(self): @@ -172,13 +181,17 @@ class Store: async def _async_callback_delayed_write(self, _now): """Handle a delayed write callback.""" + # catch the case where a call is scheduled and then we stop Home Assistant + if self.hass.state == CoreState.stopping: + self._async_ensure_final_write_listener() + return self._unsub_delay_listener = None - self._async_cleanup_stop_listener() + self._async_cleanup_final_write_listener() await self._async_handle_write_data() - async def _async_callback_stop_write(self, _event): - """Handle a write because Home Assistant is stopping.""" - self._unsub_stop_listener = None + async def _async_callback_final_write(self, _event): + """Handle a write because Home Assistant is in final write state.""" + self._unsub_final_write_listener = None self._async_cleanup_delay_listener() await self._async_handle_write_data() diff --git a/tests/common.py b/tests/common.py index 9790a8a7131a..f39d458bbe0d 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1005,7 +1005,7 @@ async def flush_store(store): if store._data is None: return - store._async_cleanup_stop_listener() + store._async_cleanup_final_write_listener() store._async_cleanup_delay_listener() await store._async_handle_write_data() @@ -1018,7 +1018,7 @@ async def get_system_health_info(hass, domain): def mock_integration(hass, module): """Mock an integration.""" integration = loader.Integration( - hass, f"homeassistant.components.{module.DOMAIN}", None, module.mock_manifest(), + hass, f"homeassistant.components.{module.DOMAIN}", None, module.mock_manifest() ) _LOGGER.info("Adding mock integration: %s", module.DOMAIN) diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 4d358bde770c..6d19022f9592 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -28,6 +28,7 @@ from tests.common import ( get_test_home_assistant, mock_coro, mock_registry, + mock_storage, ) from tests.mock.zwave import MockEntityValues, MockNetwork, MockNode, MockValue @@ -827,6 +828,8 @@ class TestZWaveDeviceEntityValues(unittest.TestCase): def setUp(self): """Initialize values for this testcase class.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() self.hass.start() self.registry = mock_registry(self.hass) @@ -862,6 +865,7 @@ class TestZWaveDeviceEntityValues(unittest.TestCase): def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) @patch.object(zwave, "import_module") @patch.object(zwave, "discovery") @@ -1194,6 +1198,8 @@ class TestZWaveServices(unittest.TestCase): def setUp(self): """Initialize values for this testcase class.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() self.hass.start() # Initialize zwave @@ -1209,6 +1215,7 @@ class TestZWaveServices(unittest.TestCase): self.hass.services.call("zwave", "stop_network", {}) self.hass.block_till_done() self.hass.stop() + self.mock_storage.__exit__(None, None, None) def test_add_node(self): """Test zwave add_node service.""" diff --git a/tests/conftest.py b/tests/conftest.py index 0963d1514904..f93d51903506 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,7 +19,10 @@ from homeassistant.exceptions import ServiceNotFound from homeassistant.setup import async_setup_component from homeassistant.util import location -from tests.ignore_uncaught_exceptions import IGNORE_UNCAUGHT_EXCEPTIONS +from tests.ignore_uncaught_exceptions import ( + IGNORE_UNCAUGHT_EXCEPTIONS, + IGNORE_UNCAUGHT_JSON_EXCEPTIONS, +) pytest.register_assert_rewrite("tests.common") @@ -104,6 +107,13 @@ def hass(loop, hass_storage, request): continue if isinstance(ex, ServiceNotFound): continue + if ( + isinstance(ex, TypeError) + and "is not JSON serializable" in str(ex) + and (request.module.__name__, request.function.__name__) + in IGNORE_UNCAUGHT_JSON_EXCEPTIONS + ): + continue raise ex @@ -211,7 +221,7 @@ def hass_client(hass, aiohttp_client, hass_access_token): async def auth_client(): """Return an authenticated client.""" return await aiohttp_client( - hass.http.app, headers={"Authorization": f"Bearer {hass_access_token}"}, + hass.http.app, headers={"Authorization": f"Bearer {hass_access_token}"} ) return auth_client diff --git a/tests/helpers/test_storage.py b/tests/helpers/test_storage.py index dcadd4d4369f..61648c85ada9 100644 --- a/tests/helpers/test_storage.py +++ b/tests/helpers/test_storage.py @@ -6,7 +6,11 @@ from unittest.mock import Mock, patch import pytest -from homeassistant.const import EVENT_HOMEASSISTANT_FINAL_WRITE +from homeassistant.const import ( + EVENT_HOMEASSISTANT_FINAL_WRITE, + EVENT_HOMEASSISTANT_STOP, +) +from homeassistant.core import CoreState from homeassistant.helpers import storage from homeassistant.util import dt @@ -79,10 +83,18 @@ async def test_saving_with_delay(hass, store, hass_storage): } -async def test_saving_on_stop(hass, hass_storage): +async def test_saving_on_final_write(hass, hass_storage): """Test delayed saves trigger when we quit Home Assistant.""" store = storage.Store(hass, MOCK_VERSION, MOCK_KEY) - store.async_delay_save(lambda: MOCK_DATA, 1) + store.async_delay_save(lambda: MOCK_DATA, 5) + assert store.key not in hass_storage + + hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) + hass.state = CoreState.stopping + await hass.async_block_till_done() + + async_fire_time_changed(hass, dt.utcnow() + timedelta(seconds=10)) + await hass.async_block_till_done() assert store.key not in hass_storage hass.bus.async_fire(EVENT_HOMEASSISTANT_FINAL_WRITE) @@ -94,6 +106,43 @@ async def test_saving_on_stop(hass, hass_storage): } +async def test_not_delayed_saving_while_stopping(hass, hass_storage): + """Test delayed saves don't write after the stop event has fired.""" + store = storage.Store(hass, MOCK_VERSION, MOCK_KEY) + hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) + await hass.async_block_till_done() + hass.state = CoreState.stopping + + store.async_delay_save(lambda: MOCK_DATA, 1) + async_fire_time_changed(hass, dt.utcnow() + timedelta(seconds=2)) + await hass.async_block_till_done() + assert store.key not in hass_storage + + +async def test_not_delayed_saving_after_stopping(hass, hass_storage): + """Test delayed saves don't write after stop if issued before stopping Home Assistant.""" + store = storage.Store(hass, MOCK_VERSION, MOCK_KEY) + store.async_delay_save(lambda: MOCK_DATA, 10) + assert store.key not in hass_storage + + hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) + hass.state = CoreState.stopping + await hass.async_block_till_done() + assert store.key not in hass_storage + + async_fire_time_changed(hass, dt.utcnow() + timedelta(seconds=15)) + await hass.async_block_till_done() + assert store.key not in hass_storage + + +async def test_not_saving_while_stopping(hass, hass_storage): + """Test saves don't write when stopping Home Assistant.""" + store = storage.Store(hass, MOCK_VERSION, MOCK_KEY) + hass.state = CoreState.stopping + await store.async_save(MOCK_DATA) + assert store.key not in hass_storage + + async def test_loading_while_delay(hass, store, hass_storage): """Test we load new data even if not written yet.""" await store.async_save({"delay": "no"}) diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index df623a2fc20f..126cb37f14fd 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -89,3 +89,42 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.yr.test_sensor", "test_forecast_setup"), ("tests.components.zwave.test_init", "test_power_schemes"), ] + +IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [ + ("tests.components.spotify.test_config_flow", "test_full_flow"), + ("tests.components.smartthings.test_init", "test_config_entry_loads_platforms"), + ( + "tests.components.smartthings.test_init", + "test_scenes_unauthorized_loads_platforms", + ), + ( + "tests.components.smartthings.test_init", + "test_config_entry_loads_unconnected_cloud", + ), + ("tests.components.samsungtv.test_config_flow", "test_ssdp"), + ("tests.components.samsungtv.test_config_flow", "test_user_websocket"), + ("tests.components.samsungtv.test_config_flow", "test_user_already_configured"), + ("tests.components.samsungtv.test_config_flow", "test_autodetect_websocket"), + ("tests.components.samsungtv.test_config_flow", "test_autodetect_websocket_ssl"), + ("tests.components.samsungtv.test_config_flow", "test_ssdp_already_configured"), + ("tests.components.samsungtv.test_config_flow", "test_ssdp_noprefix"), + ("tests.components.samsungtv.test_config_flow", "test_user_legacy"), + ("tests.components.samsungtv.test_config_flow", "test_autodetect_legacy"), + ( + "tests.components.samsungtv.test_media_player", + "test_select_source_invalid_source", + ), + ( + "tests.components.samsungtv.test_media_player", + "test_play_media_channel_as_string", + ), + ( + "tests.components.samsungtv.test_media_player", + "test_play_media_channel_as_non_positive", + ), + ("tests.components.samsungtv.test_media_player", "test_turn_off_websocket"), + ("tests.components.samsungtv.test_media_player", "test_play_media_invalid_type"), + ("tests.components.harmony.test_config_flow", "test_form_import"), + ("tests.components.harmony.test_config_flow", "test_form_ssdp"), + ("tests.components.harmony.test_config_flow", "test_user_form"), +] From 1d89d22a381e10944ed3420b435beeae32f4fa5e Mon Sep 17 00:00:00 2001 From: mvn23 Date: Thu, 2 Apr 2020 19:29:41 +0200 Subject: [PATCH 022/653] Update pyotgw to 0.6b1 (#33529) --- homeassistant/components/opentherm_gw/config_flow.py | 3 ++- homeassistant/components/opentherm_gw/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/opentherm_gw/test_config_flow.py | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/opentherm_gw/config_flow.py b/homeassistant/components/opentherm_gw/config_flow.py index b52641105e44..dc1b943686f2 100644 --- a/homeassistant/components/opentherm_gw/config_flow.py +++ b/homeassistant/components/opentherm_gw/config_flow.py @@ -2,6 +2,7 @@ import asyncio import pyotgw +from pyotgw import vars as gw_vars from serial import SerialException import voluptuous as vol @@ -53,7 +54,7 @@ class OpenThermGwConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): otgw = pyotgw.pyotgw() status = await otgw.connect(self.hass.loop, device) await otgw.disconnect() - return status.get(pyotgw.OTGW_ABOUT) + return status.get(gw_vars.OTGW_ABOUT) try: res = await asyncio.wait_for(test_connection(), timeout=10) diff --git a/homeassistant/components/opentherm_gw/manifest.json b/homeassistant/components/opentherm_gw/manifest.json index 81a41b8fb47b..d0cbb4351c73 100644 --- a/homeassistant/components/opentherm_gw/manifest.json +++ b/homeassistant/components/opentherm_gw/manifest.json @@ -2,7 +2,7 @@ "domain": "opentherm_gw", "name": "OpenTherm Gateway", "documentation": "https://www.home-assistant.io/integrations/opentherm_gw", - "requirements": ["pyotgw==0.5b1"], + "requirements": ["pyotgw==0.6b1"], "dependencies": [], "codeowners": ["@mvn23"], "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index e5916a146fe9..520101471315 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1465,7 +1465,7 @@ pyoppleio==1.0.5 pyota==2.0.5 # homeassistant.components.opentherm_gw -pyotgw==0.5b1 +pyotgw==0.6b1 # homeassistant.auth.mfa_modules.notify # homeassistant.auth.mfa_modules.totp diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d1bfa69bbd6a..b1977b187aa3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -570,7 +570,7 @@ pyopenuv==1.0.9 pyopnsense==0.2.0 # homeassistant.components.opentherm_gw -pyotgw==0.5b1 +pyotgw==0.6b1 # homeassistant.auth.mfa_modules.notify # homeassistant.auth.mfa_modules.totp diff --git a/tests/components/opentherm_gw/test_config_flow.py b/tests/components/opentherm_gw/test_config_flow.py index 0adcdb188d08..f57ad20f5d5d 100644 --- a/tests/components/opentherm_gw/test_config_flow.py +++ b/tests/components/opentherm_gw/test_config_flow.py @@ -2,7 +2,7 @@ import asyncio from unittest.mock import patch -from pyotgw import OTGW_ABOUT +from pyotgw.vars import OTGW_ABOUT from serial import SerialException from homeassistant import config_entries, data_entry_flow, setup From 39408ab2408207ced5b13d181e59e0b316f3f1c5 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Thu, 2 Apr 2020 21:26:36 +0300 Subject: [PATCH 023/653] Add cover platform to Dynalite (#32594) * lib version * unit-test refactoring * added type hints * added cover * added test to see that consts have the same value as library consts * Update tests/components/dynalite/test_init.py Co-Authored-By: Martin Hjelmare * removed trigger template * Update homeassistant/components/dynalite/__init__.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/dynalite/const.py Co-Authored-By: Martin Hjelmare * removed CONF_TRIGGER from const corrected type hints - not clear why mypy didn't catch it * conversion of the config to library CONFs * moved to use the value since it should come from the library * taking CONF_HOST from homeassistant.const instead of module const * use dict.get removed leftover log * force device_class to be from homeassistant consts * move dict.get to inline * removed CONF from values changed "channelcover" to "channel_cover" * moved some CONF values out of const.py and taking them from homeassistant.const * verifying that device class is a valid HA device class * moved shutter to home assistant const Co-authored-by: Martin Hjelmare --- homeassistant/components/dynalite/__init__.py | 110 ++++++++++++++---- homeassistant/components/dynalite/bridge.py | 33 ++++-- .../components/dynalite/config_flow.py | 6 +- homeassistant/components/dynalite/const.py | 41 +++++-- .../components/dynalite/convert_config.py | 78 +++++++++++++ homeassistant/components/dynalite/cover.py | 98 ++++++++++++++++ .../components/dynalite/dynalitebase.py | 31 +++-- homeassistant/components/dynalite/light.py | 18 ++- .../components/dynalite/manifest.json | 2 +- homeassistant/components/dynalite/switch.py | 14 ++- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/dynalite/common.py | 1 + tests/components/dynalite/test_bridge.py | 8 ++ tests/components/dynalite/test_config_flow.py | 66 ++++++----- tests/components/dynalite/test_cover.py | 100 ++++++++++++++++ tests/components/dynalite/test_init.py | 83 +++++++++++-- 17 files changed, 587 insertions(+), 106 deletions(-) create mode 100644 homeassistant/components/dynalite/convert_config.py create mode 100644 homeassistant/components/dynalite/cover.py create mode 100644 tests/components/dynalite/test_cover.py diff --git a/homeassistant/components/dynalite/__init__.py b/homeassistant/components/dynalite/__init__.py index 973d09a384f1..2f2ed8f2fa22 100755 --- a/homeassistant/components/dynalite/__init__.py +++ b/homeassistant/components/dynalite/__init__.py @@ -1,43 +1,55 @@ """Support for the Dynalite networks.""" import asyncio +from typing import Any, Dict, Union import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import CONF_HOST +from homeassistant.components.cover import DEVICE_CLASSES_SCHEMA +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_TYPE +from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import config_validation as cv # Loading the config flow file will register the flow from .bridge import DynaliteBridge from .const import ( + ACTIVE_INIT, + ACTIVE_OFF, + ACTIVE_ON, CONF_ACTIVE, - CONF_ACTIVE_INIT, - CONF_ACTIVE_OFF, - CONF_ACTIVE_ON, CONF_AREA, CONF_AUTO_DISCOVER, CONF_BRIDGES, CONF_CHANNEL, - CONF_CHANNEL_TYPE, + CONF_CHANNEL_COVER, + CONF_CLOSE_PRESET, CONF_DEFAULT, + CONF_DEVICE_CLASS, + CONF_DURATION, CONF_FADE, - CONF_NAME, CONF_NO_DEFAULT, - CONF_POLLTIMER, - CONF_PORT, + CONF_OPEN_PRESET, + CONF_POLL_TIMER, CONF_PRESET, + CONF_ROOM_OFF, + CONF_ROOM_ON, + CONF_STOP_PRESET, + CONF_TEMPLATE, + CONF_TILT_TIME, DEFAULT_CHANNEL_TYPE, DEFAULT_NAME, DEFAULT_PORT, + DEFAULT_TEMPLATES, DOMAIN, ENTITY_PLATFORMS, LOGGER, ) -def num_string(value): +def num_string(value: Union[int, str]) -> str: """Test if value is a string of digits, aka an integer.""" new_value = str(value) if new_value.isdigit(): @@ -49,7 +61,7 @@ CHANNEL_DATA_SCHEMA = vol.Schema( { vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_FADE): vol.Coerce(float), - vol.Optional(CONF_CHANNEL_TYPE, default=DEFAULT_CHANNEL_TYPE): vol.Any( + vol.Optional(CONF_TYPE, default=DEFAULT_CHANNEL_TYPE): vol.Any( "light", "switch" ), } @@ -63,15 +75,66 @@ PRESET_DATA_SCHEMA = vol.Schema( PRESET_SCHEMA = vol.Schema({num_string: vol.Any(PRESET_DATA_SCHEMA, None)}) +TEMPLATE_ROOM_SCHEMA = vol.Schema( + {vol.Optional(CONF_ROOM_ON): num_string, vol.Optional(CONF_ROOM_OFF): num_string} +) + +TEMPLATE_TIMECOVER_SCHEMA = vol.Schema( + { + vol.Optional(CONF_CHANNEL_COVER): num_string, + vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + vol.Optional(CONF_OPEN_PRESET): num_string, + vol.Optional(CONF_CLOSE_PRESET): num_string, + vol.Optional(CONF_STOP_PRESET): num_string, + vol.Optional(CONF_DURATION): vol.Coerce(float), + vol.Optional(CONF_TILT_TIME): vol.Coerce(float), + } +) + +TEMPLATE_DATA_SCHEMA = vol.Any(TEMPLATE_ROOM_SCHEMA, TEMPLATE_TIMECOVER_SCHEMA) + +TEMPLATE_SCHEMA = vol.Schema({str: TEMPLATE_DATA_SCHEMA}) + + +def validate_area(config: Dict[str, Any]) -> Dict[str, Any]: + """Validate that template parameters are only used if area is using the relevant template.""" + conf_set = set() + for template in DEFAULT_TEMPLATES: + for conf in DEFAULT_TEMPLATES[template]: + conf_set.add(conf) + if config.get(CONF_TEMPLATE): + for conf in DEFAULT_TEMPLATES[config[CONF_TEMPLATE]]: + conf_set.remove(conf) + for conf in conf_set: + if config.get(conf): + raise vol.Invalid( + f"{conf} should not be part of area {config[CONF_NAME]} config" + ) + return config + AREA_DATA_SCHEMA = vol.Schema( - { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_FADE): vol.Coerce(float), - vol.Optional(CONF_NO_DEFAULT): vol.Coerce(bool), - vol.Optional(CONF_CHANNEL): CHANNEL_SCHEMA, - vol.Optional(CONF_PRESET): PRESET_SCHEMA, - }, + vol.All( + { + vol.Required(CONF_NAME): cv.string, + vol.Optional(CONF_TEMPLATE): cv.string, + vol.Optional(CONF_FADE): vol.Coerce(float), + vol.Optional(CONF_NO_DEFAULT): cv.boolean, + vol.Optional(CONF_CHANNEL): CHANNEL_SCHEMA, + vol.Optional(CONF_PRESET): PRESET_SCHEMA, + # the next ones can be part of the templates + vol.Optional(CONF_ROOM_ON): num_string, + vol.Optional(CONF_ROOM_OFF): num_string, + vol.Optional(CONF_CHANNEL_COVER): num_string, + vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + vol.Optional(CONF_OPEN_PRESET): num_string, + vol.Optional(CONF_CLOSE_PRESET): num_string, + vol.Optional(CONF_STOP_PRESET): num_string, + vol.Optional(CONF_DURATION): vol.Coerce(float), + vol.Optional(CONF_TILT_TIME): vol.Coerce(float), + }, + validate_area, + ) ) AREA_SCHEMA = vol.Schema({num_string: vol.Any(AREA_DATA_SCHEMA, None)}) @@ -85,13 +148,14 @@ BRIDGE_SCHEMA = vol.Schema( vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, vol.Optional(CONF_AUTO_DISCOVER, default=False): vol.Coerce(bool), - vol.Optional(CONF_POLLTIMER, default=1.0): vol.Coerce(float), + vol.Optional(CONF_POLL_TIMER, default=1.0): vol.Coerce(float), vol.Optional(CONF_AREA): AREA_SCHEMA, vol.Optional(CONF_DEFAULT): PLATFORM_DEFAULTS_SCHEMA, vol.Optional(CONF_ACTIVE, default=False): vol.Any( - CONF_ACTIVE_ON, CONF_ACTIVE_OFF, CONF_ACTIVE_INIT, cv.boolean + ACTIVE_ON, ACTIVE_OFF, ACTIVE_INIT, cv.boolean ), vol.Optional(CONF_PRESET): PRESET_SCHEMA, + vol.Optional(CONF_TEMPLATE): TEMPLATE_SCHEMA, } ) @@ -105,7 +169,7 @@ CONFIG_SCHEMA = vol.Schema( ) -async def async_setup(hass, config): +async def async_setup(hass: HomeAssistant, config: Dict[str, Any]) -> bool: """Set up the Dynalite platform.""" conf = config.get(DOMAIN) @@ -137,7 +201,7 @@ async def async_setup(hass, config): return True -async def async_entry_changed(hass, entry): +async def async_entry_changed(hass: HomeAssistant, entry: ConfigEntry) -> None: """Reload entry since the data has changed.""" LOGGER.debug("Reconfiguring entry %s", entry.data) bridge = hass.data[DOMAIN][entry.entry_id] @@ -145,7 +209,7 @@ async def async_entry_changed(hass, entry): LOGGER.debug("Reconfiguring entry finished %s", entry.data) -async def async_setup_entry(hass, entry): +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a bridge from a config entry.""" LOGGER.debug("Setting up entry %s", entry.data) bridge = DynaliteBridge(hass, entry.data) @@ -163,7 +227,7 @@ async def async_setup_entry(hass, entry): return True -async def async_unload_entry(hass, entry): +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" LOGGER.debug("Unloading entry %s", entry.data) hass.data[DOMAIN].pop(entry.entry_id) diff --git a/homeassistant/components/dynalite/bridge.py b/homeassistant/components/dynalite/bridge.py index fa0a91bfab1c..09cf8e25a105 100755 --- a/homeassistant/components/dynalite/bridge.py +++ b/homeassistant/components/dynalite/bridge.py @@ -1,17 +1,26 @@ """Code to handle a Dynalite bridge.""" +from typing import TYPE_CHECKING, Any, Callable, Dict, List + from dynalite_devices_lib.dynalite_devices import DynaliteDevices -from homeassistant.core import callback +from homeassistant.const import CONF_HOST +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_send -from .const import CONF_ALL, CONF_HOST, ENTITY_PLATFORMS, LOGGER +from .const import CONF_ALL, ENTITY_PLATFORMS, LOGGER +from .convert_config import convert_config + +if TYPE_CHECKING: # pragma: no cover + from dynalite_devices_lib.dynalite_devices import ( # pylint: disable=ungrouped-imports + DynaliteBaseDevice, + ) class DynaliteBridge: """Manages a single Dynalite bridge.""" - def __init__(self, hass, config): + def __init__(self, hass: HomeAssistant, config: Dict[str, Any]) -> None: """Initialize the system based on host parameter.""" self.hass = hass self.area = {} @@ -23,20 +32,20 @@ class DynaliteBridge: new_device_func=self.add_devices_when_registered, update_device_func=self.update_device, ) - self.dynalite_devices.configure(config) + self.dynalite_devices.configure(convert_config(config)) - async def async_setup(self): + async def async_setup(self) -> bool: """Set up a Dynalite bridge.""" # Configure the dynalite devices LOGGER.debug("Setting up bridge - host %s", self.host) return await self.dynalite_devices.async_setup() - def reload_config(self, config): + def reload_config(self, config: Dict[str, Any]) -> None: """Reconfigure a bridge when config changes.""" LOGGER.debug("Reloading bridge - host %s, config %s", self.host, config) - self.dynalite_devices.configure(config) + self.dynalite_devices.configure(convert_config(config)) - def update_signal(self, device=None): + def update_signal(self, device: "DynaliteBaseDevice" = None) -> str: """Create signal to use to trigger entity update.""" if device: signal = f"dynalite-update-{self.host}-{device.unique_id}" @@ -45,12 +54,12 @@ class DynaliteBridge: return signal @callback - def update_device(self, device): + def update_device(self, device: "DynaliteBaseDevice") -> None: """Call when a device or all devices should be updated.""" if device == CONF_ALL: # This is used to signal connection or disconnection, so all devices may become available or not. log_string = ( - "Connected" if self.dynalite_devices.available else "Disconnected" + "Connected" if self.dynalite_devices.connected else "Disconnected" ) LOGGER.info("%s to dynalite host", log_string) async_dispatcher_send(self.hass, self.update_signal()) @@ -58,13 +67,13 @@ class DynaliteBridge: async_dispatcher_send(self.hass, self.update_signal(device)) @callback - def register_add_devices(self, platform, async_add_devices): + def register_add_devices(self, platform: str, async_add_devices: Callable) -> None: """Add an async_add_entities for a category.""" self.async_add_devices[platform] = async_add_devices if platform in self.waiting_devices: self.async_add_devices[platform](self.waiting_devices[platform]) - def add_devices_when_registered(self, devices): + def add_devices_when_registered(self, devices: List["DynaliteBaseDevice"]) -> None: """Add the devices to HA if the add devices callback was registered, otherwise queue until it is.""" for platform in ENTITY_PLATFORMS: platform_devices = [ diff --git a/homeassistant/components/dynalite/config_flow.py b/homeassistant/components/dynalite/config_flow.py index ca95c0754a6f..4c5b2ceb7d88 100755 --- a/homeassistant/components/dynalite/config_flow.py +++ b/homeassistant/components/dynalite/config_flow.py @@ -1,4 +1,6 @@ """Config flow to configure Dynalite hub.""" +from typing import Any, Dict + from homeassistant import config_entries from homeassistant.const import CONF_HOST @@ -12,11 +14,11 @@ class DynaliteFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): VERSION = 1 CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL - def __init__(self): + def __init__(self) -> None: """Initialize the Dynalite flow.""" self.host = None - async def async_step_import(self, import_info): + async def async_step_import(self, import_info: Dict[str, Any]) -> Any: """Import a new bridge as a config entry.""" LOGGER.debug("Starting async_step_import - %s", import_info) host = import_info[CONF_HOST] diff --git a/homeassistant/components/dynalite/const.py b/homeassistant/components/dynalite/const.py index 267b5727b83d..ade167e1b3e7 100755 --- a/homeassistant/components/dynalite/const.py +++ b/homeassistant/components/dynalite/const.py @@ -1,31 +1,54 @@ """Constants for the Dynalite component.""" import logging +from homeassistant.components.cover import DEVICE_CLASS_SHUTTER +from homeassistant.const import CONF_ROOM + LOGGER = logging.getLogger(__package__) DOMAIN = "dynalite" -ENTITY_PLATFORMS = ["light", "switch"] +ENTITY_PLATFORMS = ["light", "switch", "cover"] CONF_ACTIVE = "active" -CONF_ACTIVE_INIT = "init" -CONF_ACTIVE_OFF = "off" -CONF_ACTIVE_ON = "on" +ACTIVE_INIT = "init" +ACTIVE_OFF = "off" +ACTIVE_ON = "on" CONF_ALL = "ALL" CONF_AREA = "area" CONF_AUTO_DISCOVER = "autodiscover" CONF_BRIDGES = "bridges" CONF_CHANNEL = "channel" -CONF_CHANNEL_TYPE = "type" +CONF_CHANNEL_COVER = "channel_cover" +CONF_CLOSE_PRESET = "close" CONF_DEFAULT = "default" +CONF_DEVICE_CLASS = "class" +CONF_DURATION = "duration" CONF_FADE = "fade" -CONF_HOST = "host" -CONF_NAME = "name" CONF_NO_DEFAULT = "nodefault" -CONF_POLLTIMER = "polltimer" -CONF_PORT = "port" +CONF_OPEN_PRESET = "open" +CONF_POLL_TIMER = "polltimer" CONF_PRESET = "preset" +CONF_ROOM_OFF = "room_off" +CONF_ROOM_ON = "room_on" +CONF_STOP_PRESET = "stop" +CONF_TEMPLATE = "template" +CONF_TILT_TIME = "tilt" +CONF_TIME_COVER = "time_cover" DEFAULT_CHANNEL_TYPE = "light" +DEFAULT_COVER_CLASS = DEVICE_CLASS_SHUTTER DEFAULT_NAME = "dynalite" DEFAULT_PORT = 12345 +DEFAULT_TEMPLATES = { + CONF_ROOM: [CONF_ROOM_ON, CONF_ROOM_OFF], + CONF_TIME_COVER: [ + CONF_CHANNEL_COVER, + CONF_DEVICE_CLASS, + CONF_OPEN_PRESET, + CONF_CLOSE_PRESET, + CONF_STOP_PRESET, + CONF_DURATION, + CONF_TILT_TIME, + ], +} diff --git a/homeassistant/components/dynalite/convert_config.py b/homeassistant/components/dynalite/convert_config.py new file mode 100644 index 000000000000..03ece744d413 --- /dev/null +++ b/homeassistant/components/dynalite/convert_config.py @@ -0,0 +1,78 @@ +"""Convert the HA config to the dynalite config.""" + +from typing import Any, Dict + +from dynalite_devices_lib import const as dyn_const + +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_ROOM, CONF_TYPE + +from .const import ( + ACTIVE_INIT, + ACTIVE_OFF, + ACTIVE_ON, + CONF_ACTIVE, + CONF_AREA, + CONF_AUTO_DISCOVER, + CONF_CHANNEL, + CONF_CHANNEL_COVER, + CONF_CLOSE_PRESET, + CONF_DEFAULT, + CONF_DEVICE_CLASS, + CONF_DURATION, + CONF_FADE, + CONF_NO_DEFAULT, + CONF_OPEN_PRESET, + CONF_POLL_TIMER, + CONF_PRESET, + CONF_ROOM_OFF, + CONF_ROOM_ON, + CONF_STOP_PRESET, + CONF_TEMPLATE, + CONF_TILT_TIME, + CONF_TIME_COVER, +) + +CONF_MAP = { + CONF_ACTIVE: dyn_const.CONF_ACTIVE, + ACTIVE_INIT: dyn_const.CONF_ACTIVE_INIT, + ACTIVE_OFF: dyn_const.CONF_ACTIVE_OFF, + ACTIVE_ON: dyn_const.CONF_ACTIVE_ON, + CONF_AREA: dyn_const.CONF_AREA, + CONF_AUTO_DISCOVER: dyn_const.CONF_AUTO_DISCOVER, + CONF_CHANNEL: dyn_const.CONF_CHANNEL, + CONF_CHANNEL_COVER: dyn_const.CONF_CHANNEL_COVER, + CONF_TYPE: dyn_const.CONF_CHANNEL_TYPE, + CONF_CLOSE_PRESET: dyn_const.CONF_CLOSE_PRESET, + CONF_DEFAULT: dyn_const.CONF_DEFAULT, + CONF_DEVICE_CLASS: dyn_const.CONF_DEVICE_CLASS, + CONF_DURATION: dyn_const.CONF_DURATION, + CONF_FADE: dyn_const.CONF_FADE, + CONF_HOST: dyn_const.CONF_HOST, + CONF_NAME: dyn_const.CONF_NAME, + CONF_NO_DEFAULT: dyn_const.CONF_NO_DEFAULT, + CONF_OPEN_PRESET: dyn_const.CONF_OPEN_PRESET, + CONF_POLL_TIMER: dyn_const.CONF_POLL_TIMER, + CONF_PORT: dyn_const.CONF_PORT, + CONF_PRESET: dyn_const.CONF_PRESET, + CONF_ROOM: dyn_const.CONF_ROOM, + CONF_ROOM_OFF: dyn_const.CONF_ROOM_OFF, + CONF_ROOM_ON: dyn_const.CONF_ROOM_ON, + CONF_STOP_PRESET: dyn_const.CONF_STOP_PRESET, + CONF_TEMPLATE: dyn_const.CONF_TEMPLATE, + CONF_TILT_TIME: dyn_const.CONF_TILT_TIME, + CONF_TIME_COVER: dyn_const.CONF_TIME_COVER, +} + + +def convert_config(config: Dict[str, Any]) -> Dict[str, Any]: + """Convert a config dict by replacing component consts with library consts.""" + result = {} + for (key, value) in config.items(): + if isinstance(value, dict): + new_value = convert_config(value) + elif isinstance(value, str): + new_value = CONF_MAP.get(value, value) + else: + new_value = value + result[CONF_MAP.get(key, key)] = new_value + return result diff --git a/homeassistant/components/dynalite/cover.py b/homeassistant/components/dynalite/cover.py new file mode 100644 index 000000000000..dcf16ede58c3 --- /dev/null +++ b/homeassistant/components/dynalite/cover.py @@ -0,0 +1,98 @@ +"""Support for the Dynalite channels as covers.""" +from typing import Callable + +from homeassistant.components.cover import DEVICE_CLASSES, CoverDevice +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant, callback + +from .const import DEFAULT_COVER_CLASS +from .dynalitebase import DynaliteBase, async_setup_entry_base + + +async def async_setup_entry( + hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: Callable +) -> None: + """Record the async_add_entities function to add them later when received from Dynalite.""" + + @callback + def cover_from_device(device, bridge): + if device.has_tilt: + return DynaliteCoverWithTilt(device, bridge) + return DynaliteCover(device, bridge) + + async_setup_entry_base( + hass, config_entry, async_add_entities, "cover", cover_from_device + ) + + +class DynaliteCover(DynaliteBase, CoverDevice): + """Representation of a Dynalite Channel as a Home Assistant Cover.""" + + @property + def device_class(self) -> str: + """Return the class of the device.""" + dev_cls = self._device.device_class + if dev_cls in DEVICE_CLASSES: + return dev_cls + return DEFAULT_COVER_CLASS + + @property + def current_cover_position(self) -> int: + """Return the position of the cover from 0 to 100.""" + return self._device.current_cover_position + + @property + def is_opening(self) -> bool: + """Return true if cover is opening.""" + return self._device.is_opening + + @property + def is_closing(self) -> bool: + """Return true if cover is closing.""" + return self._device.is_closing + + @property + def is_closed(self) -> bool: + """Return true if cover is closed.""" + return self._device.is_closed + + async def async_open_cover(self, **kwargs) -> None: + """Open the cover.""" + await self._device.async_open_cover(**kwargs) + + async def async_close_cover(self, **kwargs) -> None: + """Close the cover.""" + await self._device.async_close_cover(**kwargs) + + async def async_set_cover_position(self, **kwargs) -> None: + """Set the cover position.""" + await self._device.async_set_cover_position(**kwargs) + + async def async_stop_cover(self, **kwargs) -> None: + """Stop the cover.""" + await self._device.async_stop_cover(**kwargs) + + +class DynaliteCoverWithTilt(DynaliteCover): + """Representation of a Dynalite Channel as a Home Assistant Cover that uses up and down for tilt.""" + + @property + def current_cover_tilt_position(self) -> int: + """Return the current tilt position.""" + return self._device.current_cover_tilt_position + + async def async_open_cover_tilt(self, **kwargs) -> None: + """Open cover tilt.""" + await self._device.async_open_cover_tilt(**kwargs) + + async def async_close_cover_tilt(self, **kwargs) -> None: + """Close cover tilt.""" + await self._device.async_close_cover_tilt(**kwargs) + + async def async_set_cover_tilt_position(self, **kwargs) -> None: + """Set the cover tilt position.""" + await self._device.async_set_cover_tilt_position(**kwargs) + + async def async_stop_cover_tilt(self, **kwargs) -> None: + """Stop the cover tilt.""" + await self._device.async_stop_cover_tilt(**kwargs) diff --git a/homeassistant/components/dynalite/dynalitebase.py b/homeassistant/components/dynalite/dynalitebase.py index 8bb1ab2dc42a..31879c5c118f 100755 --- a/homeassistant/components/dynalite/dynalitebase.py +++ b/homeassistant/components/dynalite/dynalitebase.py @@ -1,5 +1,9 @@ """Support for the Dynalite devices as entities.""" -from homeassistant.core import callback +from typing import Any, Callable, Dict + +from homeassistant.components.dynalite.bridge import DynaliteBridge +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity @@ -7,8 +11,12 @@ from .const import DOMAIN, LOGGER def async_setup_entry_base( - hass, config_entry, async_add_entities, platform, entity_from_device -): + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: Callable, + platform: str, + entity_from_device: Callable, +) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" LOGGER.debug("Setting up %s entry = %s", platform, config_entry.data) bridge = hass.data[DOMAIN][config_entry.entry_id] @@ -18,8 +26,7 @@ def async_setup_entry_base( # assumes it is called with a single platform added_entities = [] for device in devices: - if device.category == platform: - added_entities.append(entity_from_device(device, bridge)) + added_entities.append(entity_from_device(device, bridge)) if added_entities: async_add_entities(added_entities) @@ -29,29 +36,29 @@ def async_setup_entry_base( class DynaliteBase(Entity): """Base class for the Dynalite entities.""" - def __init__(self, device, bridge): + def __init__(self, device: Any, bridge: DynaliteBridge) -> None: """Initialize the base class.""" self._device = device self._bridge = bridge self._unsub_dispatchers = [] @property - def name(self): + def name(self) -> str: """Return the name of the entity.""" return self._device.name @property - def unique_id(self): + def unique_id(self) -> str: """Return the unique ID of the entity.""" return self._device.unique_id @property - def available(self): + def available(self) -> bool: """Return if entity is available.""" return self._device.available @property - def device_info(self): + def device_info(self) -> Dict[str, Any]: """Device info for this entity.""" return { "identifiers": {(DOMAIN, self._device.unique_id)}, @@ -59,7 +66,7 @@ class DynaliteBase(Entity): "manufacturer": "Dynalite", } - async def async_added_to_hass(self): + async def async_added_to_hass(self) -> None: """Added to hass so need to register to dispatch.""" # register for device specific update self._unsub_dispatchers.append( @@ -78,7 +85,7 @@ class DynaliteBase(Entity): ) ) - async def async_will_remove_from_hass(self): + async def async_will_remove_from_hass(self) -> None: """Unregister signal dispatch listeners when being removed.""" for unsub in self._unsub_dispatchers: unsub() diff --git a/homeassistant/components/dynalite/light.py b/homeassistant/components/dynalite/light.py index a5b7139803c1..283b1ee22861 100755 --- a/homeassistant/components/dynalite/light.py +++ b/homeassistant/components/dynalite/light.py @@ -1,10 +1,16 @@ """Support for Dynalite channels as lights.""" +from typing import Callable + from homeassistant.components.light import SUPPORT_BRIGHTNESS, Light +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant from .dynalitebase import DynaliteBase, async_setup_entry_base -async def async_setup_entry(hass, config_entry, async_add_entities): +async def async_setup_entry( + hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: Callable +) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" async_setup_entry_base( @@ -16,24 +22,24 @@ class DynaliteLight(DynaliteBase, Light): """Representation of a Dynalite Channel as a Home Assistant Light.""" @property - def brightness(self): + def brightness(self) -> int: """Return the brightness of this light between 0..255.""" return self._device.brightness @property - def is_on(self): + def is_on(self) -> bool: """Return true if device is on.""" return self._device.is_on - async def async_turn_on(self, **kwargs): + async def async_turn_on(self, **kwargs) -> None: """Turn the light on.""" await self._device.async_turn_on(**kwargs) - async def async_turn_off(self, **kwargs): + async def async_turn_off(self, **kwargs) -> None: """Turn the light off.""" await self._device.async_turn_off(**kwargs) @property - def supported_features(self): + def supported_features(self) -> int: """Flag supported features.""" return SUPPORT_BRIGHTNESS diff --git a/homeassistant/components/dynalite/manifest.json b/homeassistant/components/dynalite/manifest.json index d6351db17b24..a6ae0e96c459 100755 --- a/homeassistant/components/dynalite/manifest.json +++ b/homeassistant/components/dynalite/manifest.json @@ -5,5 +5,5 @@ "documentation": "https://www.home-assistant.io/integrations/dynalite", "dependencies": [], "codeowners": ["@ziv1234"], - "requirements": ["dynalite_devices==0.1.32"] + "requirements": ["dynalite_devices==0.1.39"] } diff --git a/homeassistant/components/dynalite/switch.py b/homeassistant/components/dynalite/switch.py index 84be74cee36e..45e24d8193ab 100755 --- a/homeassistant/components/dynalite/switch.py +++ b/homeassistant/components/dynalite/switch.py @@ -1,10 +1,16 @@ """Support for the Dynalite channels and presets as switches.""" +from typing import Callable + from homeassistant.components.switch import SwitchDevice +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant from .dynalitebase import DynaliteBase, async_setup_entry_base -async def async_setup_entry(hass, config_entry, async_add_entities): +async def async_setup_entry( + hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: Callable +) -> None: """Record the async_add_entities function to add them later when received from Dynalite.""" async_setup_entry_base( @@ -16,14 +22,14 @@ class DynaliteSwitch(DynaliteBase, SwitchDevice): """Representation of a Dynalite Channel as a Home Assistant Switch.""" @property - def is_on(self): + def is_on(self) -> bool: """Return true if switch is on.""" return self._device.is_on - async def async_turn_on(self, **kwargs): + async def async_turn_on(self, **kwargs) -> None: """Turn the switch on.""" await self._device.async_turn_on() - async def async_turn_off(self, **kwargs): + async def async_turn_off(self, **kwargs) -> None: """Turn the switch off.""" await self._device.async_turn_off() diff --git a/requirements_all.txt b/requirements_all.txt index 520101471315..66254138e51a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -474,7 +474,7 @@ dsmr_parser==0.18 dweepy==0.3.0 # homeassistant.components.dynalite -dynalite_devices==0.1.32 +dynalite_devices==0.1.39 # homeassistant.components.rainforest_eagle eagle200_reader==0.2.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b1977b187aa3..73cea897aa4f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -190,7 +190,7 @@ doorbirdpy==2.0.8 dsmr_parser==0.18 # homeassistant.components.dynalite -dynalite_devices==0.1.32 +dynalite_devices==0.1.39 # homeassistant.components.ee_brightbox eebrightbox==0.0.4 diff --git a/tests/components/dynalite/common.py b/tests/components/dynalite/common.py index 56554efaa071..b90e61204441 100755 --- a/tests/components/dynalite/common.py +++ b/tests/components/dynalite/common.py @@ -44,6 +44,7 @@ async def create_entity_from_device(hass, device): new_device_func = mock_dyn_dev.mock_calls[1][2]["new_device_func"] new_device_func([device]) await hass.async_block_till_done() + return mock_dyn_dev.mock_calls[1][2]["update_device_func"] async def run_service_tests(hass, device, platform, services): diff --git a/tests/components/dynalite/test_bridge.py b/tests/components/dynalite/test_bridge.py index 97759e96b699..938bc09f59a5 100755 --- a/tests/components/dynalite/test_bridge.py +++ b/tests/components/dynalite/test_bridge.py @@ -61,8 +61,15 @@ async def test_add_devices_then_register(hass): device2.name = "NAME2" device2.unique_id = "unique2" new_device_func([device1, device2]) + device3 = Mock() + device3.category = "switch" + device3.name = "NAME3" + device3.unique_id = "unique3" + new_device_func([device3]) await hass.async_block_till_done() assert hass.states.get("light.name") + assert hass.states.get("switch.name2") + assert hass.states.get("switch.name3") async def test_register_then_add_devices(hass): @@ -89,3 +96,4 @@ async def test_register_then_add_devices(hass): new_device_func([device1, device2]) await hass.async_block_till_done() assert hass.states.get("light.name") + assert hass.states.get("switch.name2") diff --git a/tests/components/dynalite/test_config_flow.py b/tests/components/dynalite/test_config_flow.py index 96e361e260f8..1a1cdc16f49a 100755 --- a/tests/components/dynalite/test_config_flow.py +++ b/tests/components/dynalite/test_config_flow.py @@ -1,6 +1,7 @@ """Test Dynalite config flow.""" from asynctest import CoroutineMock, patch +import pytest from homeassistant import config_entries from homeassistant.components import dynalite @@ -8,12 +9,20 @@ from homeassistant.components import dynalite from tests.common import MockConfigEntry -async def run_flow(hass, connection): +@pytest.mark.parametrize( + "first_con, second_con,exp_type, exp_result, exp_reason", + [ + (True, True, "create_entry", "loaded", ""), + (False, False, "abort", "", "no_connection"), + (True, False, "create_entry", "setup_retry", ""), + ], +) +async def test_flow(hass, first_con, second_con, exp_type, exp_result, exp_reason): """Run a flow with or without errors and return result.""" host = "1.2.3.4" with patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", - side_effect=connection, + side_effect=[first_con, second_con], ): result = await hass.config_entries.flow.async_init( dynalite.DOMAIN, @@ -21,35 +30,18 @@ async def run_flow(hass, connection): data={dynalite.CONF_HOST: host}, ) await hass.async_block_till_done() - return result - - -async def test_flow_works(hass): - """Test a successful config flow.""" - result = await run_flow(hass, [True, True]) - assert result["type"] == "create_entry" - assert result["result"].state == "loaded" - - -async def test_flow_setup_fails(hass): - """Test a flow where async_setup fails.""" - result = await run_flow(hass, [False]) - assert result["type"] == "abort" - assert result["reason"] == "no_connection" - - -async def test_flow_setup_fails_in_setup_entry(hass): - """Test a flow where the initial check works but inside setup_entry, the bridge setup fails.""" - result = await run_flow(hass, [True, False]) - assert result["type"] == "create_entry" - assert result["result"].state == "setup_retry" + assert result["type"] == exp_type + if exp_result: + assert result["result"].state == exp_result + if exp_reason: + assert result["reason"] == exp_reason async def test_existing(hass): """Test when the entry exists with the same config.""" host = "1.2.3.4" MockConfigEntry( - domain=dynalite.DOMAIN, unique_id=host, data={dynalite.CONF_HOST: host} + domain=dynalite.DOMAIN, data={dynalite.CONF_HOST: host} ).add_to_hass(hass) with patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", @@ -81,7 +73,7 @@ async def test_existing_update(hass): assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() mock_dyn_dev().configure.assert_called_once() - assert mock_dyn_dev().configure.mock_calls[0][1][0][dynalite.CONF_PORT] == port1 + assert mock_dyn_dev().configure.mock_calls[0][1][0]["port"] == port1 result = await hass.config_entries.flow.async_init( dynalite.DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, @@ -89,6 +81,26 @@ async def test_existing_update(hass): ) await hass.async_block_till_done() assert mock_dyn_dev().configure.call_count == 2 - assert mock_dyn_dev().configure.mock_calls[1][1][0][dynalite.CONF_PORT] == port2 + assert mock_dyn_dev().configure.mock_calls[1][1][0]["port"] == port2 assert result["type"] == "abort" assert result["reason"] == "already_configured" + + +async def test_two_entries(hass): + """Test when two different entries exist with different hosts.""" + host1 = "1.2.3.4" + host2 = "5.6.7.8" + MockConfigEntry( + domain=dynalite.DOMAIN, data={dynalite.CONF_HOST: host1} + ).add_to_hass(hass) + with patch( + "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", + return_value=True, + ): + result = await hass.config_entries.flow.async_init( + dynalite.DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={dynalite.CONF_HOST: host2}, + ) + assert result["type"] == "create_entry" + assert result["result"].state == "loaded" diff --git a/tests/components/dynalite/test_cover.py b/tests/components/dynalite/test_cover.py new file mode 100644 index 000000000000..cef4081c6071 --- /dev/null +++ b/tests/components/dynalite/test_cover.py @@ -0,0 +1,100 @@ +"""Test Dynalite cover.""" +from dynalite_devices_lib.cover import DynaliteTimeCoverWithTiltDevice +import pytest + +from .common import ( + ATTR_ARGS, + ATTR_METHOD, + ATTR_SERVICE, + create_entity_from_device, + create_mock_device, + run_service_tests, +) + + +@pytest.fixture +def mock_device(): + """Mock a Dynalite device.""" + mock_dev = create_mock_device("cover", DynaliteTimeCoverWithTiltDevice) + mock_dev.device_class = "blind" + return mock_dev + + +async def test_cover_setup(hass, mock_device): + """Test a successful setup.""" + await create_entity_from_device(hass, mock_device) + entity_state = hass.states.get("cover.name") + assert entity_state.attributes["friendly_name"] == mock_device.name + assert ( + entity_state.attributes["current_position"] + == mock_device.current_cover_position + ) + assert ( + entity_state.attributes["current_tilt_position"] + == mock_device.current_cover_tilt_position + ) + assert entity_state.attributes["device_class"] == mock_device.device_class + await run_service_tests( + hass, + mock_device, + "cover", + [ + {ATTR_SERVICE: "open_cover", ATTR_METHOD: "async_open_cover"}, + {ATTR_SERVICE: "close_cover", ATTR_METHOD: "async_close_cover"}, + {ATTR_SERVICE: "stop_cover", ATTR_METHOD: "async_stop_cover"}, + { + ATTR_SERVICE: "set_cover_position", + ATTR_METHOD: "async_set_cover_position", + ATTR_ARGS: {"position": 50}, + }, + {ATTR_SERVICE: "open_cover_tilt", ATTR_METHOD: "async_open_cover_tilt"}, + {ATTR_SERVICE: "close_cover_tilt", ATTR_METHOD: "async_close_cover_tilt"}, + {ATTR_SERVICE: "stop_cover_tilt", ATTR_METHOD: "async_stop_cover_tilt"}, + { + ATTR_SERVICE: "set_cover_tilt_position", + ATTR_METHOD: "async_set_cover_tilt_position", + ATTR_ARGS: {"tilt_position": 50}, + }, + ], + ) + + +async def test_cover_without_tilt(hass, mock_device): + """Test a cover with no tilt.""" + mock_device.has_tilt = False + await create_entity_from_device(hass, mock_device) + await hass.services.async_call( + "cover", "open_cover_tilt", {"entity_id": "cover.name"}, blocking=True + ) + await hass.async_block_till_done() + mock_device.async_open_cover_tilt.assert_not_called() + + +async def check_cover_position( + hass, update_func, device, closing, opening, closed, expected +): + """Check that a given position behaves correctly.""" + device.is_closing = closing + device.is_opening = opening + device.is_closed = closed + update_func(device) + await hass.async_block_till_done() + entity_state = hass.states.get("cover.name") + assert entity_state.state == expected + + +async def test_cover_positions(hass, mock_device): + """Test that the state updates in the various positions.""" + update_func = await create_entity_from_device(hass, mock_device) + await check_cover_position( + hass, update_func, mock_device, True, False, False, "closing" + ) + await check_cover_position( + hass, update_func, mock_device, False, True, False, "opening" + ) + await check_cover_position( + hass, update_func, mock_device, False, False, True, "closed" + ) + await check_cover_position( + hass, update_func, mock_device, False, False, False, "open" + ) diff --git a/tests/components/dynalite/test_init.py b/tests/components/dynalite/test_init.py index b74fcd64da02..8e2290a9c407 100755 --- a/tests/components/dynalite/test_init.py +++ b/tests/components/dynalite/test_init.py @@ -3,7 +3,8 @@ from asynctest import call, patch -from homeassistant.components import dynalite +import homeassistant.components.dynalite.const as dynalite +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_ROOM from homeassistant.setup import async_setup_component from tests.common import MockConfigEntry @@ -17,8 +18,7 @@ async def test_empty_config(hass): async def test_async_setup(hass): - """Test a successful setup.""" - host = "1.2.3.4" + """Test a successful setup with all of the different options.""" with patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", return_value=True, @@ -30,8 +30,46 @@ async def test_async_setup(hass): dynalite.DOMAIN: { dynalite.CONF_BRIDGES: [ { - dynalite.CONF_HOST: host, - dynalite.CONF_AREA: {"1": {dynalite.CONF_NAME: "Name"}}, + CONF_HOST: "1.2.3.4", + CONF_PORT: 1234, + dynalite.CONF_AUTO_DISCOVER: True, + dynalite.CONF_POLL_TIMER: 5.5, + dynalite.CONF_AREA: { + "1": { + CONF_NAME: "Name1", + dynalite.CONF_CHANNEL: {"4": {}}, + dynalite.CONF_NO_DEFAULT: True, + }, + "2": {CONF_NAME: "Name2"}, + "3": { + CONF_NAME: "Name3", + dynalite.CONF_TEMPLATE: CONF_ROOM, + }, + "4": { + CONF_NAME: "Name4", + dynalite.CONF_TEMPLATE: dynalite.CONF_TIME_COVER, + }, + }, + dynalite.CONF_DEFAULT: {dynalite.CONF_FADE: 2.3}, + dynalite.CONF_ACTIVE: dynalite.ACTIVE_INIT, + dynalite.CONF_PRESET: { + "5": {CONF_NAME: "pres5", dynalite.CONF_FADE: 4.5} + }, + dynalite.CONF_TEMPLATE: { + CONF_ROOM: { + dynalite.CONF_ROOM_ON: 6, + dynalite.CONF_ROOM_OFF: 7, + }, + dynalite.CONF_TIME_COVER: { + dynalite.CONF_OPEN_PRESET: 8, + dynalite.CONF_CLOSE_PRESET: 9, + dynalite.CONF_STOP_PRESET: 10, + dynalite.CONF_CHANNEL_COVER: 3, + dynalite.CONF_DURATION: 2.2, + dynalite.CONF_TILT_TIME: 3.3, + dynalite.CONF_DEVICE_CLASS: "awning", + }, + }, } ] } @@ -41,6 +79,35 @@ async def test_async_setup(hass): assert len(hass.config_entries.async_entries(dynalite.DOMAIN)) == 1 +async def test_async_setup_bad_config1(hass): + """Test a successful with bad config on templates.""" + with patch( + "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", + return_value=True, + ): + assert not await async_setup_component( + hass, + dynalite.DOMAIN, + { + dynalite.DOMAIN: { + dynalite.CONF_BRIDGES: [ + { + CONF_HOST: "1.2.3.4", + dynalite.CONF_AREA: { + "1": { + dynalite.CONF_TEMPLATE: dynalite.CONF_TIME_COVER, + CONF_NAME: "Name", + dynalite.CONF_ROOM_ON: 7, + } + }, + } + ] + } + }, + ) + await hass.async_block_till_done() + + async def test_async_setup_bad_config2(hass): """Test a successful with bad config on numbers.""" host = "1.2.3.4" @@ -55,8 +122,8 @@ async def test_async_setup_bad_config2(hass): dynalite.DOMAIN: { dynalite.CONF_BRIDGES: [ { - dynalite.CONF_HOST: host, - dynalite.CONF_AREA: {"WRONG": {dynalite.CONF_NAME: "Name"}}, + CONF_HOST: host, + dynalite.CONF_AREA: {"WRONG": {CONF_NAME: "Name"}}, } ] } @@ -69,7 +136,7 @@ async def test_async_setup_bad_config2(hass): async def test_unload_entry(hass): """Test being able to unload an entry.""" host = "1.2.3.4" - entry = MockConfigEntry(domain=dynalite.DOMAIN, data={dynalite.CONF_HOST: host}) + entry = MockConfigEntry(domain=dynalite.DOMAIN, data={CONF_HOST: host}) entry.add_to_hass(hass) with patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", From 4caf65dc971f1ba8aa5ca6f92ec7844e96e07b6a Mon Sep 17 00:00:00 2001 From: Brian Rogers Date: Thu, 2 Apr 2020 14:43:40 -0400 Subject: [PATCH 024/653] Add Rachio Flex Schedules (#33533) * Add Rachio Flex Schedules * Remove Duration Property * Missed duration call * Black formatting --- homeassistant/components/rachio/const.py | 1 + homeassistant/components/rachio/device.py | 8 +++++- homeassistant/components/rachio/switch.py | 30 ++++++++++------------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/rachio/const.py b/homeassistant/components/rachio/const.py index 2c439407c71d..587cd85a2a50 100644 --- a/homeassistant/components/rachio/const.py +++ b/homeassistant/components/rachio/const.py @@ -35,6 +35,7 @@ KEY_ZONE_ID = "zoneId" KEY_ZONE_NUMBER = "zoneNumber" KEY_ZONES = "zones" KEY_SCHEDULES = "scheduleRules" +KEY_FLEX_SCHEDULES = "flexScheduleRules" KEY_SCHEDULE_ID = "scheduleId" KEY_CUSTOM_SHADE = "customShade" KEY_CUSTOM_CROP = "customCrop" diff --git a/homeassistant/components/rachio/device.py b/homeassistant/components/rachio/device.py index fbf49ffc67f1..7ff47f7a2215 100644 --- a/homeassistant/components/rachio/device.py +++ b/homeassistant/components/rachio/device.py @@ -9,6 +9,7 @@ from .const import ( KEY_DEVICES, KEY_ENABLED, KEY_EXTERNAL_ID, + KEY_FLEX_SCHEDULES, KEY_ID, KEY_MAC_ADDRESS, KEY_MODEL, @@ -92,6 +93,7 @@ class RachioIro: self.model = data[KEY_MODEL] self._zones = data[KEY_ZONES] self._schedules = data[KEY_SCHEDULES] + self._flex_schedules = data[KEY_FLEX_SCHEDULES] self._init_data = data self._webhooks = webhooks _LOGGER.debug('%s has ID "%s"', str(self), self.controller_id) @@ -177,9 +179,13 @@ class RachioIro: return None def list_schedules(self) -> list: - """Return a list of schedules.""" + """Return a list of fixed schedules.""" return self._schedules + def list_flex_schedules(self) -> list: + """Return a list of flex schedules.""" + return self._flex_schedules + def stop_watering(self) -> None: """Stop watering all zones connected to this controller.""" self.rachio.device.stopWater(self.controller_id) diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index 7be0c64ee1ba..86b6097ad13f 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -4,6 +4,7 @@ from datetime import timedelta import logging from homeassistant.components.switch import SwitchDevice +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from .const import ( @@ -68,13 +69,13 @@ def _create_entities(hass, config_entry): entities.append(RachioStandbySwitch(controller)) zones = controller.list_zones() schedules = controller.list_schedules() + flex_schedules = controller.list_flex_schedules() current_schedule = controller.current_schedule for zone in zones: - _LOGGER.debug("Rachio setting up zone: %s", zone) entities.append(RachioZone(person, controller, zone, current_schedule)) - for sched in schedules: - _LOGGER.debug("Added schedule: %s", sched) + for sched in schedules + flex_schedules: entities.append(RachioSchedule(person, controller, sched, current_schedule)) + _LOGGER.debug("Added %s", entities) return entities @@ -180,7 +181,6 @@ class RachioZone(RachioSwitch): def __init__(self, person, controller, data, current_schedule): """Initialize a new Rachio Zone.""" self._id = data[KEY_ID] - _LOGGER.debug("zone_data: %s", data) self._zone_name = data[KEY_NAME] self._zone_number = data[KEY_ZONE_NUMBER] self._zone_enabled = data[KEY_ENABLED] @@ -297,21 +297,16 @@ class RachioSchedule(RachioSwitch): def __init__(self, person, controller, data, current_schedule): """Initialize a new Rachio Schedule.""" - self._id = data[KEY_ID] + self._schedule_id = data[KEY_ID] self._schedule_name = data[KEY_NAME] self._duration = data[KEY_DURATION] self._schedule_enabled = data[KEY_ENABLED] self._summary = data[KEY_SUMMARY] self._current_schedule = current_schedule super().__init__(controller, poll=False) - self._state = self.schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) + self._state = self._schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) self._undo_dispatcher = None - @property - def schedule_id(self) -> str: - """How the Rachio API refers to the schedule.""" - return self._id - @property def name(self) -> str: """Return the friendly name of the schedule.""" @@ -320,7 +315,7 @@ class RachioSchedule(RachioSwitch): @property def unique_id(self) -> str: """Return a unique id by combining controller id and schedule.""" - return f"{self._controller.controller_id}-schedule-{self.schedule_id}" + return f"{self._controller.controller_id}-schedule-{self._schedule_id}" @property def icon(self) -> str: @@ -333,7 +328,7 @@ class RachioSchedule(RachioSwitch): return { ATTR_SCHEDULE_SUMMARY: self._summary, ATTR_SCHEDULE_ENABLED: self.schedule_is_enabled, - ATTR_SCHEDULE_DURATION: self._duration / 60, + ATTR_SCHEDULE_DURATION: f"{round(self._duration / 60)} minutes", } @property @@ -344,7 +339,7 @@ class RachioSchedule(RachioSwitch): def turn_on(self, **kwargs) -> None: """Start this schedule.""" - self._controller.rachio.schedulerule.start(self.schedule_id) + self._controller.rachio.schedulerule.start(self._schedule_id) _LOGGER.debug( "Schedule %s started on %s", self.name, self._controller.name, ) @@ -356,13 +351,14 @@ class RachioSchedule(RachioSwitch): def _poll_update(self, data=None) -> bool: """Poll the API to check whether the schedule is running.""" self._current_schedule = self._controller.current_schedule - return self.schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) + return self._schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) - def _handle_update(self, *args, **kwargs) -> None: + @callback + async def _handle_update(self, *args, **kwargs) -> None: """Handle incoming webhook schedule data.""" # Schedule ID not passed when running individual zones, so we catch that error try: - if args[0][KEY_SCHEDULE_ID] == self.schedule_id: + if args[0][KEY_SCHEDULE_ID] == self._schedule_id: if args[0][KEY_SUBTYPE] in [SUBTYPE_SCHEDULE_STARTED]: self._state = True elif args[0][KEY_SUBTYPE] in [ From 4b2c45e668aaec938650438c5b7a9746d718b90b Mon Sep 17 00:00:00 2001 From: Vilppu Vuorinen Date: Thu, 2 Apr 2020 22:56:41 +0300 Subject: [PATCH 025/653] Add melcloud AtaDevice vane control (#32672) * Add melcloud AtaDevice vane control * Return empty dict when no vane states available Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Use constants for services and conf * Split state attribute assignment and fix suggested changes * Log valid positions when called with an invalid position * Improve service description Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> Co-authored-by: springstan <46536646+springstan@users.noreply.github.com> --- homeassistant/components/melcloud/climate.py | 67 ++++++++++++++++++- homeassistant/components/melcloud/const.py | 9 +++ .../components/melcloud/services.yaml | 23 +++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/melcloud/services.yaml diff --git a/homeassistant/components/melcloud/climate.py b/homeassistant/components/melcloud/climate.py index c661b1a59ade..df3d9e893923 100644 --- a/homeassistant/components/melcloud/climate.py +++ b/homeassistant/components/melcloud/climate.py @@ -11,6 +11,7 @@ from pymelcloud.atw_device import ( PROPERTY_ZONE_2_OPERATION_MODE, Zone, ) +import voluptuous as vol from homeassistant.components.climate import ClimateDevice from homeassistant.components.climate.const import ( @@ -27,11 +28,23 @@ from homeassistant.components.climate.const import ( ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import TEMP_CELSIUS +from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.typing import HomeAssistantType from homeassistant.util.temperature import convert as convert_temperature from . import MelCloudDevice -from .const import ATTR_STATUS, DOMAIN, TEMP_UNIT_LOOKUP +from .const import ( + ATTR_STATUS, + ATTR_VANE_HORIZONTAL, + ATTR_VANE_HORIZONTAL_POSITIONS, + ATTR_VANE_VERTICAL, + ATTR_VANE_VERTICAL_POSITIONS, + CONF_POSITION, + DOMAIN, + SERVICE_SET_VANE_HORIZONTAL, + SERVICE_SET_VANE_VERTICAL, + TEMP_UNIT_LOOKUP, +) SCAN_INTERVAL = timedelta(seconds=60) @@ -73,6 +86,18 @@ async def async_setup_entry( True, ) + platform = entity_platform.current_platform.get() + platform.async_register_entity_service( + SERVICE_SET_VANE_HORIZONTAL, + {vol.Required(CONF_POSITION): cv.string}, + "async_set_vane_horizontal", + ) + platform.async_register_entity_service( + SERVICE_SET_VANE_VERTICAL, + {vol.Required(CONF_POSITION): cv.string}, + "async_set_vane_vertical", + ) + class MelCloudClimate(ClimateDevice): """Base climate device.""" @@ -116,6 +141,30 @@ class AtaDeviceClimate(MelCloudClimate): """Return the display name of this entity.""" return self._name + @property + def device_state_attributes(self) -> Optional[Dict[str, Any]]: + """Return the optional state attributes with device specific additions.""" + attr = {} + + vane_horizontal = self._device.vane_horizontal + if vane_horizontal: + attr.update( + { + ATTR_VANE_HORIZONTAL: vane_horizontal, + ATTR_VANE_HORIZONTAL_POSITIONS: self._device.vane_horizontal_positions, + } + ) + + vane_vertical = self._device.vane_vertical + if vane_horizontal: + attr.update( + { + ATTR_VANE_VERTICAL: vane_vertical, + ATTR_VANE_VERTICAL_POSITIONS: self._device.vane_vertical_positions, + } + ) + return attr + @property def temperature_unit(self) -> str: """Return the unit of measurement used by the platform.""" @@ -181,6 +230,22 @@ class AtaDeviceClimate(MelCloudClimate): """Return the list of available fan modes.""" return self._device.fan_speeds + async def async_set_vane_horizontal(self, position: str) -> None: + """Set horizontal vane position.""" + if position not in self._device.vane_horizontal_positions: + raise ValueError( + f"Invalid horizontal vane position {position}. Valid positions: [{self._device.vane_horizontal_positions}]." + ) + await self._device.set({ata.PROPERTY_VANE_HORIZONTAL: position}) + + async def async_set_vane_vertical(self, position: str) -> None: + """Set vertical vane position.""" + if position not in self._device.vane_vertical_positions: + raise ValueError( + f"Invalid vertical vane position {position}. Valid positions: [{self._device.vane_vertical_positions}]." + ) + await self._device.set({ata.PROPERTY_VANE_VERTICAL: position}) + @property def supported_features(self) -> int: """Return the list of supported features.""" diff --git a/homeassistant/components/melcloud/const.py b/homeassistant/components/melcloud/const.py index c6ce4391294a..d58f483d441e 100644 --- a/homeassistant/components/melcloud/const.py +++ b/homeassistant/components/melcloud/const.py @@ -5,7 +5,16 @@ from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT DOMAIN = "melcloud" +CONF_POSITION = "position" + ATTR_STATUS = "status" +ATTR_VANE_HORIZONTAL = "vane_horizontal" +ATTR_VANE_HORIZONTAL_POSITIONS = "vane_horizontal_positions" +ATTR_VANE_VERTICAL = "vane_vertical" +ATTR_VANE_VERTICAL_POSITIONS = "vane_vertical_positions" + +SERVICE_SET_VANE_HORIZONTAL = "set_vane_horizontal" +SERVICE_SET_VANE_VERTICAL = "set_vane_vertical" TEMP_UNIT_LOOKUP = { UNIT_TEMP_CELSIUS: TEMP_CELSIUS, diff --git a/homeassistant/components/melcloud/services.yaml b/homeassistant/components/melcloud/services.yaml new file mode 100644 index 000000000000..40faa097d9b6 --- /dev/null +++ b/homeassistant/components/melcloud/services.yaml @@ -0,0 +1,23 @@ +set_vane_horizontal: + description: Sets horizontal vane position. + fields: + entity_id: + description: Name of the target entity + example: "climate.ac_1" + position: + description: > + Horizontal vane position. Possible options can be found in the + vane_horizontal_positions state attribute. + example: "auto" + +set_vane_vertical: + description: Sets vertical vane position. + fields: + entity_id: + description: Name of the target entity + example: "climate.ac_1" + position: + description: > + Vertical vane position. Possible options can be found in the + vane_vertical_positions state attribute. + example: "auto" From 6afe6acb6c5092353016cb75570034f10154cd44 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Apr 2020 13:02:59 -0700 Subject: [PATCH 026/653] Mark new gate device class as 2FA (#33541) --- homeassistant/components/google_assistant/trait.py | 6 +++++- tests/components/google_assistant/test_trait.py | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index 1c47be45651c..2bc5f5040d41 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -1247,7 +1247,11 @@ class OpenCloseTrait(_Trait): """ # Cover device classes that require 2FA - COVER_2FA = (cover.DEVICE_CLASS_DOOR, cover.DEVICE_CLASS_GARAGE) + COVER_2FA = ( + cover.DEVICE_CLASS_DOOR, + cover.DEVICE_CLASS_GARAGE, + cover.DEVICE_CLASS_GATE, + ) name = TRAIT_OPENCLOSE commands = [COMMAND_OPENCLOSE] diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index ec1848bf1ed5..d0ed9a9d33c2 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -1532,7 +1532,8 @@ async def test_openclose_cover_no_position(hass): @pytest.mark.parametrize( - "device_class", (cover.DEVICE_CLASS_DOOR, cover.DEVICE_CLASS_GARAGE) + "device_class", + (cover.DEVICE_CLASS_DOOR, cover.DEVICE_CLASS_GARAGE, cover.DEVICE_CLASS_GATE), ) async def test_openclose_cover_secure(hass, device_class): """Test OpenClose trait support for cover domain.""" From b719a77503f0cb6d3828083cecd4f6526913bf7e Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 2 Apr 2020 15:46:31 -0500 Subject: [PATCH 027/653] Bump pyipp to 0.8.2 (#33544) --- homeassistant/components/ipp/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index beb6679e308d..2eae581bdc70 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.8.1"], + "requirements": ["pyipp==0.8.2"], "dependencies": [], "codeowners": ["@ctalkington"], "config_flow": true, diff --git a/requirements_all.txt b/requirements_all.txt index 66254138e51a..87228d52078a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1336,7 +1336,7 @@ pyintesishome==1.7.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.1 +pyipp==0.8.2 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 73cea897aa4f..8e408e1d24a1 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -519,7 +519,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.1 +pyipp==0.8.2 # homeassistant.components.iqvia pyiqvia==0.2.1 From 36a606f81d7ade3d8c0a5485bc861f6a0f627250 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 2 Apr 2020 16:09:35 -0500 Subject: [PATCH 028/653] Bump HAP-python to 2.8.0 (#33539) --- homeassistant/components/homekit/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index bbbc6561a878..eb8d16d0c0ad 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -2,7 +2,7 @@ "domain": "homekit", "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", - "requirements": ["HAP-python==2.7.0"], + "requirements": ["HAP-python==2.8.0"], "dependencies": [], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 87228d52078a..95bdb6f7bc13 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -35,7 +35,7 @@ Adafruit-SHT31==1.0.2 # Adafruit_BBIO==1.1.1 # homeassistant.components.homekit -HAP-python==2.7.0 +HAP-python==2.8.0 # homeassistant.components.mastodon Mastodon.py==1.5.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8e408e1d24a1..c7278c57b38b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -4,7 +4,7 @@ -r requirements_test.txt # homeassistant.components.homekit -HAP-python==2.7.0 +HAP-python==2.8.0 # homeassistant.components.mobile_app # homeassistant.components.owntracks From 201e9588548f0e5bf7bac8a35b5ac7e49e1d24d4 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Thu, 2 Apr 2020 18:13:44 -0400 Subject: [PATCH 029/653] Use mock storage for MQTT tests (#33553) * mock storage for MQTT * more mqtt storage mocks --- tests/components/mqtt/test_init.py | 7 +++++++ tests/components/mqtt/test_server.py | 5 ++++- tests/components/mqtt_eventstream/test_init.py | 4 ++++ tests/components/mqtt_statestream/test_init.py | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 7aa185c2c391..29cece92e640 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -33,6 +33,7 @@ from tests.common import ( mock_device_registry, mock_mqtt_component, mock_registry, + mock_storage, threadsafe_coroutine_factory, ) @@ -83,12 +84,15 @@ class TestMQTTComponent(unittest.TestCase): def setUp(self): # pylint: disable=invalid-name """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() mock_mqtt_component(self.hass) self.calls = [] def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) @callback def record_calls(self, *args): @@ -298,12 +302,15 @@ class TestMQTTCallbacks(unittest.TestCase): def setUp(self): # pylint: disable=invalid-name """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() mock_mqtt_client(self.hass) self.calls = [] def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) @callback def record_calls(self, *args): diff --git a/tests/components/mqtt/test_server.py b/tests/components/mqtt/test_server.py index 95f31b678263..a9b5656a0b3a 100644 --- a/tests/components/mqtt/test_server.py +++ b/tests/components/mqtt/test_server.py @@ -7,7 +7,7 @@ import homeassistant.components.mqtt as mqtt from homeassistant.const import CONF_PASSWORD from homeassistant.setup import setup_component -from tests.common import get_test_home_assistant, mock_coro +from tests.common import get_test_home_assistant, mock_coro, mock_storage class TestMQTT: @@ -16,10 +16,13 @@ class TestMQTT: def setup_method(self, method): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() def teardown_method(self, method): """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) @patch("passlib.apps.custom_app_context", Mock(return_value="")) @patch("tempfile.NamedTemporaryFile", Mock(return_value=MagicMock())) diff --git a/tests/components/mqtt_eventstream/test_init.py b/tests/components/mqtt_eventstream/test_init.py index f4062458d91e..36698db87e18 100644 --- a/tests/components/mqtt_eventstream/test_init.py +++ b/tests/components/mqtt_eventstream/test_init.py @@ -15,6 +15,7 @@ from tests.common import ( get_test_home_assistant, mock_mqtt_component, mock_state_change_event, + mock_storage, ) @@ -24,11 +25,14 @@ class TestMqttEventStream: def setup_method(self): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() self.mock_mqtt = mock_mqtt_component(self.hass) def teardown_method(self): """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) def add_eventstream(self, sub_topic=None, pub_topic=None, ignore_event=None): """Add a mqtt_eventstream component.""" diff --git a/tests/components/mqtt_statestream/test_init.py b/tests/components/mqtt_statestream/test_init.py index ffab0e0846f0..af9a721f1a4f 100644 --- a/tests/components/mqtt_statestream/test_init.py +++ b/tests/components/mqtt_statestream/test_init.py @@ -9,6 +9,7 @@ from tests.common import ( get_test_home_assistant, mock_mqtt_component, mock_state_change_event, + mock_storage, ) @@ -18,11 +19,14 @@ class TestMqttStateStream: def setup_method(self): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() + self.mock_storage = mock_storage() + self.mock_storage.__enter__() self.mock_mqtt = mock_mqtt_component(self.hass) def teardown_method(self): """Stop everything that was started.""" self.hass.stop() + self.mock_storage.__exit__(None, None, None) def add_statestream( self, From 8fbdc703e015e4c9e582d498e154b675c7aab938 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Fri, 3 Apr 2020 01:18:30 +0300 Subject: [PATCH 030/653] Fix uncaught exceptions for mqtt (#33547) now all mqtt tests pass --- tests/components/mqtt/test_init.py | 1 + tests/ignore_uncaught_exceptions.py | 20 -------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 29cece92e640..60ca91b00520 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -55,6 +55,7 @@ def mock_MQTT(): """Make sure connection is established.""" with mock.patch("homeassistant.components.mqtt.MQTT") as mock_MQTT: mock_MQTT.return_value.async_connect.return_value = mock_coro(True) + mock_MQTT.return_value.async_disconnect.return_value = mock_coro(True) yield mock_MQTT diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 126cb37f14fd..ad8ec114eafe 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -48,26 +48,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.ios.test_init", "test_creating_entry_sets_up_sensor"), ("tests.components.ios.test_init", "test_not_configuring_ios_not_creates_entry"), ("tests.components.local_file.test_camera", "test_file_not_readable"), - ( - "tests.components.mqtt.test_init", - "test_setup_uses_certificate_on_certificate_set_to_auto", - ), - ( - "tests.components.mqtt.test_init", - "test_setup_does_not_use_certificate_on_mqtts_port", - ), - ( - "tests.components.mqtt.test_init", - "test_setup_without_tls_config_uses_tlsv1_under_python36", - ), - ( - "tests.components.mqtt.test_init", - "test_setup_with_tls_config_uses_tls_version1_2", - ), - ( - "tests.components.mqtt.test_init", - "test_setup_with_tls_config_of_v1_under_python36_only_uses_v1", - ), ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), ("tests.components.qwikswitch.test_init", "test_sensor_device"), ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), From 3db9d6a6aa01ccd32231d0a4bff8f1c7c730b9e7 Mon Sep 17 00:00:00 2001 From: Alistair Galbraith Date: Thu, 2 Apr 2020 15:41:19 -0700 Subject: [PATCH 031/653] Fix template light returning NULL in color or temperature (#33498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support for returning NULL in color or temperature. Fixes #33469 * Added further support for ‘None’ returns in level template * Removed assumption that template render may not be a string * Streamlined code per cloud pylint * Updates per code review suggestions * Added improved error handling and logging for brightness * Additional exception handling for temperature --- homeassistant/components/template/light.py | 39 +++++++++++++++++----- tests/components/template/test_light.py | 19 +++++++++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/template/light.py b/homeassistant/components/template/light.py index 52560ea27329..c6d6656f1343 100644 --- a/homeassistant/components/template/light.py +++ b/homeassistant/components/template/light.py @@ -378,6 +378,9 @@ class LightTemplate(Light): return try: brightness = self._level_template.async_render() + if brightness in ("None", ""): + self._brightness = None + return if 0 <= int(brightness) <= 255: self._brightness = int(brightness) else: @@ -385,9 +388,15 @@ class LightTemplate(Light): "Received invalid brightness : %s. Expected: 0-255", brightness ) self._brightness = None - except TemplateError as ex: - _LOGGER.error(ex) - self._state = None + except ValueError: + _LOGGER.error( + "Template must supply an integer brightness from 0-255, or 'None'", + exc_info=True, + ) + self._brightness = None + except TemplateError: + _LOGGER.error("Invalid template", exc_info=True) + self._brightness = None @callback def update_state(self): @@ -415,7 +424,11 @@ class LightTemplate(Light): if self._temperature_template is None: return try: - temperature = int(self._temperature_template.async_render()) + render = self._temperature_template.async_render() + if render in ("None", ""): + self._temperature = None + return + temperature = int(render) if self.min_mireds <= temperature <= self.max_mireds: self._temperature = temperature else: @@ -425,6 +438,12 @@ class LightTemplate(Light): self.max_mireds, ) self._temperature = None + except ValueError: + _LOGGER.error( + "Template must supply an integer temperature within the range for this light, or 'None'", + exc_info=True, + ) + self._temperature = None except TemplateError: _LOGGER.error("Cannot evaluate temperature template", exc_info=True) self._temperature = None @@ -435,10 +454,11 @@ class LightTemplate(Light): if self._color_template is None: return - self._color = None - try: render = self._color_template.async_render() + if render in ("None", ""): + self._color = None + return h_str, s_str = map( float, render.replace("(", "").replace(")", "").split(",", 1) ) @@ -455,7 +475,10 @@ class LightTemplate(Light): h_str, s_str, ) + self._color = None else: _LOGGER.error("Received invalid hs_color : (%s)", render) - except TemplateError as ex: - _LOGGER.error(ex) + self._color = None + except TemplateError: + _LOGGER.error("Cannot evaluate hs_color template", exc_info=True) + self._color = None diff --git a/tests/components/template/test_light.py b/tests/components/template/test_light.py index dccca97a1cc9..d9adf6015c90 100644 --- a/tests/components/template/test_light.py +++ b/tests/components/template/test_light.py @@ -543,7 +543,13 @@ class TestTemplateLight: @pytest.mark.parametrize( "expected_level,template", - [(255, "{{255}}"), (None, "{{256}}"), (None, "{{x - 12}}")], + [ + (255, "{{255}}"), + (None, "{{256}}"), + (None, "{{x - 12}}"), + (None, "{{ none }}"), + (None, ""), + ], ) def test_level_template(self, expected_level, template): """Test the template for the level.""" @@ -588,7 +594,14 @@ class TestTemplateLight: @pytest.mark.parametrize( "expected_temp,template", - [(500, "{{500}}"), (None, "{{501}}"), (None, "{{x - 12}}")], + [ + (500, "{{500}}"), + (None, "{{501}}"), + (None, "{{x - 12}}"), + (None, "None"), + (None, "{{ none }}"), + (None, ""), + ], ) def test_temperature_template(self, expected_temp, template): """Test the template for the temperature.""" @@ -894,6 +907,8 @@ class TestTemplateLight: (None, "{{(361, 100)}}"), (None, "{{(360, 101)}}"), (None, "{{x - 12}}"), + (None, ""), + (None, "{{ none }}"), ], ) def test_color_template(self, expected_hs, template): From f2dad7905d796192c8bd5b08c6bacfc151c70dc4 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Fri, 3 Apr 2020 01:55:04 +0300 Subject: [PATCH 032/653] fixed uncaught exceptions for tradfri (#33550) was caused by device_info being mocks, so write to storage failed --- tests/components/tradfri/test_light.py | 6 +++++- tests/ignore_uncaught_exceptions.py | 5 ----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/components/tradfri/test_light.py b/tests/components/tradfri/test_light.py index 365f84cf7a32..e4bdd140faa9 100644 --- a/tests/components/tradfri/test_light.py +++ b/tests/components/tradfri/test_light.py @@ -155,11 +155,15 @@ def mock_light(test_features={}, test_state={}, n=0): """Mock a tradfri light.""" mock_light_data = Mock(**test_state) + dev_info_mock = MagicMock() + dev_info_mock.manufacturer = "manufacturer" + dev_info_mock.model_number = "model" + dev_info_mock.firmware_version = "1.2.3" mock_light = Mock( id=f"mock-light-id-{n}", reachable=True, observe=Mock(), - device_info=MagicMock(), + device_info=dev_info_mock, ) mock_light.name = f"tradfri_light_{n}" diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index ad8ec114eafe..6f7910f91204 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -56,11 +56,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ "tests.components.tplink.test_init", "test_configuring_devices_from_multiple_sources", ), - ("tests.components.tradfri.test_light", "test_light"), - ("tests.components.tradfri.test_light", "test_light_observed"), - ("tests.components.tradfri.test_light", "test_light_available"), - ("tests.components.tradfri.test_light", "test_turn_on"), - ("tests.components.tradfri.test_light", "test_turn_off"), ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), ("tests.components.upnp.test_init", "test_async_setup_entry_default"), ("tests.components.upnp.test_init", "test_async_setup_entry_port_mapping"), From a30e217bb513f7fe80f11baa40d42c0b68e1bc4d Mon Sep 17 00:00:00 2001 From: Richard Powell Date: Thu, 2 Apr 2020 16:07:21 -0700 Subject: [PATCH 033/653] Add support to the Econet integration for new attributes: lower_temp, upper_temp, ambient_temp & is_enabled (#33363) --- homeassistant/components/econet/water_heater.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/homeassistant/components/econet/water_heater.py b/homeassistant/components/econet/water_heater.py index 26ee7cb8bd42..97be043402f9 100644 --- a/homeassistant/components/econet/water_heater.py +++ b/homeassistant/components/econet/water_heater.py @@ -40,6 +40,11 @@ ATTR_IN_USE = "in_use" ATTR_START_DATE = "start_date" ATTR_END_DATE = "end_date" +ATTR_LOWER_TEMP = "lower_temp" +ATTR_UPPER_TEMP = "upper_temp" +ATTR_AMBIENT_TEMP = "ambient_temp" +ATTR_IS_ENABLED = "is_enabled" + SUPPORT_FLAGS_HEATER = SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE ADD_VACATION_SCHEMA = vol.Schema( @@ -168,6 +173,11 @@ class EcoNetWaterHeater(WaterHeaterDevice): data[ATTR_TODAYS_ENERGY_USAGE] = todays_usage data[ATTR_IN_USE] = self.water_heater.in_use + data[ATTR_LOWER_TEMP] = round(self.water_heater.lower_temp, 2) + data[ATTR_UPPER_TEMP] = round(self.water_heater.upper_temp, 2) + data[ATTR_AMBIENT_TEMP] = round(self.water_heater.ambient_temp, 2) + data[ATTR_IS_ENABLED] = self.water_heater.is_enabled + return data @property From 9165ea5fbd5034cb79a0c6be85664fe1c62b780a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 2 Apr 2020 18:23:45 -0500 Subject: [PATCH 034/653] Revert "Add support to the Econet integration for new attributes: lower_temp, upper_temp, ambient_temp & is_enabled (#33363)" (#33555) This reverts commit a30e217bb513f7fe80f11baa40d42c0b68e1bc4d. --- homeassistant/components/econet/water_heater.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/homeassistant/components/econet/water_heater.py b/homeassistant/components/econet/water_heater.py index 97be043402f9..26ee7cb8bd42 100644 --- a/homeassistant/components/econet/water_heater.py +++ b/homeassistant/components/econet/water_heater.py @@ -40,11 +40,6 @@ ATTR_IN_USE = "in_use" ATTR_START_DATE = "start_date" ATTR_END_DATE = "end_date" -ATTR_LOWER_TEMP = "lower_temp" -ATTR_UPPER_TEMP = "upper_temp" -ATTR_AMBIENT_TEMP = "ambient_temp" -ATTR_IS_ENABLED = "is_enabled" - SUPPORT_FLAGS_HEATER = SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE ADD_VACATION_SCHEMA = vol.Schema( @@ -173,11 +168,6 @@ class EcoNetWaterHeater(WaterHeaterDevice): data[ATTR_TODAYS_ENERGY_USAGE] = todays_usage data[ATTR_IN_USE] = self.water_heater.in_use - data[ATTR_LOWER_TEMP] = round(self.water_heater.lower_temp, 2) - data[ATTR_UPPER_TEMP] = round(self.water_heater.upper_temp, 2) - data[ATTR_AMBIENT_TEMP] = round(self.water_heater.ambient_temp, 2) - data[ATTR_IS_ENABLED] = self.water_heater.is_enabled - return data @property From 3df46cd70acfe474c4147f9d5a72d3a0911ac97d Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 3 Apr 2020 01:46:18 +0200 Subject: [PATCH 035/653] Remove MQTT state vacuum value_template support. (#33536) * Fix MQTT state vacuum value_template support. * Remove support for state_template --- .../components/mqtt/vacuum/schema_state.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/mqtt/vacuum/schema_state.py b/homeassistant/components/mqtt/vacuum/schema_state.py index cbaf8d43a77e..254d841aebcd 100644 --- a/homeassistant/components/mqtt/vacuum/schema_state.py +++ b/homeassistant/components/mqtt/vacuum/schema_state.py @@ -36,12 +36,7 @@ from homeassistant.components.vacuum import ( SUPPORT_STOP, StateVacuumDevice, ) -from homeassistant.const import ( - ATTR_SUPPORTED_FEATURES, - CONF_DEVICE, - CONF_NAME, - CONF_VALUE_TEMPLATE, -) +from homeassistant.const import ATTR_SUPPORTED_FEATURES, CONF_DEVICE, CONF_NAME from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -104,7 +99,6 @@ CONF_PAYLOAD_CLEAN_SPOT = "payload_clean_spot" CONF_PAYLOAD_LOCATE = "payload_locate" CONF_PAYLOAD_START = "payload_start" CONF_PAYLOAD_PAUSE = "payload_pause" -CONF_STATE_TEMPLATE = "state_template" CONF_SET_FAN_SPEED_TOPIC = "set_fan_speed_topic" CONF_FAN_SPEED_LIST = "fan_speed_list" CONF_SEND_COMMAND_TOPIC = "send_command_topic" @@ -141,7 +135,6 @@ PLATFORM_SCHEMA_STATE = ( vol.Optional(CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP): cv.string, vol.Optional(CONF_SEND_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_SET_FAN_SPEED_TOPIC): mqtt.valid_publish_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, vol.Optional(CONF_STATE_TOPIC): mqtt.valid_publish_topic, vol.Optional( CONF_SUPPORTED_FEATURES, default=DEFAULT_SERVICE_STRINGS @@ -241,20 +234,13 @@ class MqttStateVacuum( async def _subscribe_topics(self): """(Re)Subscribe to topics.""" - template = self._config.get(CONF_VALUE_TEMPLATE) - if template is not None: - template.hass = self.hass topics = {} @callback @log_messages(self.hass, self.entity_id) def state_message_received(msg): """Handle state MQTT message.""" - payload = msg.payload - if template is not None: - payload = template.async_render_with_possible_json_value(payload) - else: - payload = json.loads(payload) + payload = json.loads(msg.payload) if STATE in payload and payload[STATE] in POSSIBLE_STATES: self._state = POSSIBLE_STATES[payload[STATE]] del payload[STATE] From 55870aec3156df052aaa67dc99172325f995defa Mon Sep 17 00:00:00 2001 From: jjlawren Date: Thu, 2 Apr 2020 18:47:58 -0500 Subject: [PATCH 036/653] Temporary Plex play_media workaround (#33542) * Temporary playMedia() workaround on plexapi 3.3.0 * Use constants for strings * Style cleanup --- homeassistant/components/plex/media_player.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index 1be06876baf0..5325544bf15a 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -11,6 +11,7 @@ from homeassistant.components.media_player.const import ( MEDIA_TYPE_MOVIE, MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, + MEDIA_TYPE_VIDEO, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PLAY, @@ -575,9 +576,11 @@ class PlexMediaPlayer(MediaPlayerDevice): shuffle = src.get("shuffle", 0) media = None + command_media_type = MEDIA_TYPE_VIDEO if media_type == "MUSIC": media = self._get_music_media(library, src) + command_media_type = MEDIA_TYPE_MUSIC elif media_type == "EPISODE": media = self._get_tv_media(library, src) elif media_type == "PLAYLIST": @@ -591,7 +594,7 @@ class PlexMediaPlayer(MediaPlayerDevice): playqueue = self.plex_server.create_playqueue(media, shuffle=shuffle) try: - self.device.playMedia(playqueue) + self.device.playMedia(playqueue, type=command_media_type) except ParseError: # Temporary workaround for Plexamp / plexapi issue pass From cb058ff6c08d9a80f53d04e8c88019b4506249eb Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Thu, 2 Apr 2020 17:54:11 -0600 Subject: [PATCH 037/653] Add config entry for Flu Near You (#32858) * Add config flow for Flu Near You * Cleanup * Cleanup * Add tests * Add test requirements * Code review * Reduce unnecessary async-ness * Handle API registration * Cleanup * Update homeassistant/components/flunearyou/.translations/en.json Co-Authored-By: Paulus Schoutsen * Code review * Ensure config schema allows additional keys Co-authored-by: Paulus Schoutsen --- .coveragerc | 1 + .../flunearyou/.translations/en.json | 21 ++ .../components/flunearyou/__init__.py | 215 ++++++++++++++++++ .../components/flunearyou/config_flow.py | 60 +++++ homeassistant/components/flunearyou/const.py | 38 ++++ .../components/flunearyou/manifest.json | 3 +- homeassistant/components/flunearyou/sensor.py | 193 ++++++---------- .../components/flunearyou/strings.json | 21 ++ homeassistant/generated/config_flows.py | 1 + requirements_all.txt | 2 +- requirements_test_all.txt | 3 + tests/components/flunearyou/__init__.py | 1 + .../components/flunearyou/test_config_flow.py | 87 +++++++ 13 files changed, 521 insertions(+), 125 deletions(-) create mode 100644 homeassistant/components/flunearyou/.translations/en.json create mode 100644 homeassistant/components/flunearyou/config_flow.py create mode 100644 homeassistant/components/flunearyou/const.py create mode 100644 homeassistant/components/flunearyou/strings.json create mode 100644 tests/components/flunearyou/__init__.py create mode 100644 tests/components/flunearyou/test_config_flow.py diff --git a/.coveragerc b/.coveragerc index 851922e4f3a9..c41d5afe169c 100644 --- a/.coveragerc +++ b/.coveragerc @@ -219,6 +219,7 @@ omit = homeassistant/components/flic/binary_sensor.py homeassistant/components/flock/notify.py homeassistant/components/flume/* + homeassistant/components/flunearyou/__init__.py homeassistant/components/flunearyou/sensor.py homeassistant/components/flux_led/light.py homeassistant/components/folder/sensor.py diff --git a/homeassistant/components/flunearyou/.translations/en.json b/homeassistant/components/flunearyou/.translations/en.json new file mode 100644 index 000000000000..cd8c0d27c363 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/en.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "These coordinates are already registered." + }, + "error": { + "general_error": "There was an unknown error." + }, + "step": { + "user": { + "data": { + "latitude": "Latitude", + "longitude": "Longitude" + }, + "description": "Monitor user-based and CDC flu reports.", + "title": "Configure Flu Near You" + } + }, + "title": "Flu Near You" + } +} diff --git a/homeassistant/components/flunearyou/__init__.py b/homeassistant/components/flunearyou/__init__.py index 5657e646be50..ce59c959133f 100644 --- a/homeassistant/components/flunearyou/__init__.py +++ b/homeassistant/components/flunearyou/__init__.py @@ -1 +1,216 @@ """The flunearyou component.""" +import asyncio +from datetime import timedelta + +from pyflunearyou import Client +from pyflunearyou.errors import FluNearYouError +import voluptuous as vol + +from homeassistant.config_entries import SOURCE_IMPORT +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.core import callback +from homeassistant.exceptions import ConfigEntryNotReady +from homeassistant.helpers import aiohttp_client, config_validation as cv +from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.event import async_track_time_interval + +from .const import ( + CATEGORY_CDC_REPORT, + CATEGORY_USER_REPORT, + DATA_CLIENT, + DOMAIN, + LOGGER, + SENSORS, + TOPIC_UPDATE, +) + +DATA_LISTENER = "listener" + +DEFAULT_SCAN_INTERVAL = timedelta(minutes=30) + +CONFIG_SCHEMA = vol.Schema( + { + vol.Optional(DOMAIN): vol.Schema( + { + vol.Optional(CONF_LATITUDE): cv.latitude, + vol.Optional(CONF_LONGITUDE): cv.longitude, + } + ) + }, + extra=vol.ALLOW_EXTRA, +) + + +@callback +def async_get_api_category(sensor_type): + """Get the category that a particular sensor type belongs to.""" + try: + return next( + ( + category + for category, sensors in SENSORS.items() + for sensor in sensors + if sensor[0] == sensor_type + ) + ) + except StopIteration: + raise ValueError(f"Can't find category sensor type: {sensor_type}") + + +async def async_setup(hass, config): + """Set up the Flu Near You component.""" + hass.data[DOMAIN] = {DATA_CLIENT: {}, DATA_LISTENER: {}} + + if DOMAIN not in config: + return True + + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={ + CONF_LATITUDE: config[DOMAIN].get(CONF_LATITUDE, hass.config.latitude), + CONF_LONGITUDE: config[DOMAIN].get( + CONF_LATITUDE, hass.config.longitude + ), + }, + ) + ) + + return True + + +async def async_setup_entry(hass, config_entry): + """Set up Flu Near You as config entry.""" + websession = aiohttp_client.async_get_clientsession(hass) + + fny = FluNearYouData( + hass, + Client(websession), + config_entry.data.get(CONF_LATITUDE, hass.config.latitude), + config_entry.data.get(CONF_LONGITUDE, hass.config.longitude), + ) + + try: + await fny.async_update() + except FluNearYouError as err: + LOGGER.error("Error while setting up integration: %s", err) + raise ConfigEntryNotReady + + hass.data[DOMAIN][DATA_CLIENT][config_entry.entry_id] = fny + + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(config_entry, "sensor") + ) + + async def refresh(event_time): + """Refresh data from Flu Near You.""" + await fny.async_update() + + hass.data[DOMAIN][DATA_LISTENER][config_entry.entry_id] = async_track_time_interval( + hass, refresh, DEFAULT_SCAN_INTERVAL + ) + + return True + + +async def async_unload_entry(hass, config_entry): + """Unload an Flu Near You config entry.""" + hass.data[DOMAIN][DATA_CLIENT].pop(config_entry.entry_id) + + remove_listener = hass.data[DOMAIN][DATA_LISTENER].pop(config_entry.entry_id) + remove_listener() + + await hass.config_entries.async_forward_entry_unload(config_entry, "sensor") + + return True + + +class FluNearYouData: + """Define a data object to retrieve info from Flu Near You.""" + + def __init__(self, hass, client, latitude, longitude): + """Initialize.""" + self._async_cancel_time_interval_listener = None + self._client = client + self._hass = hass + self.data = {} + self.latitude = latitude + self.longitude = longitude + + self._api_coros = { + CATEGORY_CDC_REPORT: self._client.cdc_reports.status_by_coordinates( + latitude, longitude + ), + CATEGORY_USER_REPORT: self._client.user_reports.status_by_coordinates( + latitude, longitude + ), + } + + self._api_category_count = { + CATEGORY_CDC_REPORT: 0, + CATEGORY_USER_REPORT: 0, + } + + self._api_category_locks = { + CATEGORY_CDC_REPORT: asyncio.Lock(), + CATEGORY_USER_REPORT: asyncio.Lock(), + } + + async def _async_get_data_from_api(self, api_category): + """Update and save data for a particular API category.""" + if self._api_category_count[api_category] == 0: + return + + try: + self.data[api_category] = await self._api_coros[api_category] + except FluNearYouError as err: + LOGGER.error("Unable to get %s data: %s", api_category, err) + self.data[api_category] = None + + async def _async_update_listener_action(self, now): + """Define an async_track_time_interval action to update data.""" + await self.async_update() + + @callback + def async_deregister_api_interest(self, sensor_type): + """Decrement the number of entities with data needs from an API category.""" + # If this deregistration should leave us with no registration at all, remove the + # time interval: + if sum(self._api_category_count.values()) == 0: + if self._async_cancel_time_interval_listener: + self._async_cancel_time_interval_listener() + self._async_cancel_time_interval_listener = None + return + + api_category = async_get_api_category(sensor_type) + self._api_category_count[api_category] -= 1 + + async def async_register_api_interest(self, sensor_type): + """Increment the number of entities with data needs from an API category.""" + # If this is the first registration we have, start a time interval: + if not self._async_cancel_time_interval_listener: + self._async_cancel_time_interval_listener = async_track_time_interval( + self._hass, self._async_update_listener_action, DEFAULT_SCAN_INTERVAL, + ) + + api_category = async_get_api_category(sensor_type) + self._api_category_count[api_category] += 1 + + # If a sensor registers interest in a particular API call and the data doesn't + # exist for it yet, make the API call and grab the data: + async with self._api_category_locks[api_category]: + if api_category not in self.data: + await self._async_get_data_from_api(api_category) + + async def async_update(self): + """Update Flu Near You data.""" + tasks = [ + self._async_get_data_from_api(api_category) + for api_category in self._api_coros + ] + + await asyncio.gather(*tasks) + + LOGGER.debug("Received new data") + async_dispatcher_send(self._hass, TOPIC_UPDATE) diff --git a/homeassistant/components/flunearyou/config_flow.py b/homeassistant/components/flunearyou/config_flow.py new file mode 100644 index 000000000000..2c48b14bb033 --- /dev/null +++ b/homeassistant/components/flunearyou/config_flow.py @@ -0,0 +1,60 @@ +"""Define a config flow manager for flunearyou.""" +from pyflunearyou import Client +from pyflunearyou.errors import FluNearYouError +import voluptuous as vol + +from homeassistant import config_entries +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.helpers import aiohttp_client, config_validation as cv + +from .const import DOMAIN, LOGGER # pylint: disable=unused-import + + +class FluNearYouFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): + """Handle an FluNearYou config flow.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + + @property + def data_schema(self): + """Return the data schema for integration.""" + return vol.Schema( + { + vol.Required( + CONF_LATITUDE, default=self.hass.config.latitude + ): cv.latitude, + vol.Required( + CONF_LONGITUDE, default=self.hass.config.longitude + ): cv.longitude, + } + ) + + async def async_step_import(self, import_config): + """Import a config entry from configuration.yaml.""" + return await self.async_step_user(import_config) + + async def async_step_user(self, user_input=None): + """Handle the start of the config flow.""" + if not user_input: + return self.async_show_form(step_id="user", data_schema=self.data_schema) + + unique_id = f"{user_input[CONF_LATITUDE]}, {user_input[CONF_LONGITUDE]}" + + await self.async_set_unique_id(unique_id) + self._abort_if_unique_id_configured() + + websession = aiohttp_client.async_get_clientsession(self.hass) + client = Client(websession) + + try: + await client.cdc_reports.status_by_coordinates( + user_input[CONF_LATITUDE], user_input[CONF_LONGITUDE] + ) + except FluNearYouError as err: + LOGGER.error("Error while setting up integration: %s", err) + return self.async_show_form( + step_id="user", errors={"base": "general_error"} + ) + + return self.async_create_entry(title=unique_id, data=user_input) diff --git a/homeassistant/components/flunearyou/const.py b/homeassistant/components/flunearyou/const.py new file mode 100644 index 000000000000..9693d59fc6e7 --- /dev/null +++ b/homeassistant/components/flunearyou/const.py @@ -0,0 +1,38 @@ +"""Define flunearyou constants.""" +import logging + +DOMAIN = "flunearyou" +LOGGER = logging.getLogger("homeassistant.components.flunearyou") + +DATA_CLIENT = "client" + +CATEGORY_CDC_REPORT = "cdc_report" +CATEGORY_USER_REPORT = "user_report" + +TOPIC_UPDATE = "flunearyou_update" + +TYPE_CDC_LEVEL = "level" +TYPE_CDC_LEVEL2 = "level2" +TYPE_USER_CHICK = "chick" +TYPE_USER_DENGUE = "dengue" +TYPE_USER_FLU = "flu" +TYPE_USER_LEPTO = "lepto" +TYPE_USER_NO_SYMPTOMS = "none" +TYPE_USER_SYMPTOMS = "symptoms" +TYPE_USER_TOTAL = "total" + +SENSORS = { + CATEGORY_CDC_REPORT: [ + (TYPE_CDC_LEVEL, "CDC Level", "mdi:biohazard", None), + (TYPE_CDC_LEVEL2, "CDC Level 2", "mdi:biohazard", None), + ], + CATEGORY_USER_REPORT: [ + (TYPE_USER_CHICK, "Avian Flu Symptoms", "mdi:alert", "reports"), + (TYPE_USER_DENGUE, "Dengue Fever Symptoms", "mdi:alert", "reports"), + (TYPE_USER_FLU, "Flu Symptoms", "mdi:alert", "reports"), + (TYPE_USER_LEPTO, "Leptospirosis Symptoms", "mdi:alert", "reports"), + (TYPE_USER_NO_SYMPTOMS, "No Symptoms", "mdi:alert", "reports"), + (TYPE_USER_SYMPTOMS, "Flu-like Symptoms", "mdi:alert", "reports"), + (TYPE_USER_TOTAL, "Total Symptoms", "mdi:alert", "reports"), + ], +} diff --git a/homeassistant/components/flunearyou/manifest.json b/homeassistant/components/flunearyou/manifest.json index e7394356c64d..1a28c3076e71 100644 --- a/homeassistant/components/flunearyou/manifest.json +++ b/homeassistant/components/flunearyou/manifest.json @@ -1,8 +1,9 @@ { "domain": "flunearyou", "name": "Flu Near You", + "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/flunearyou", - "requirements": ["pyflunearyou==1.0.3"], + "requirements": ["pyflunearyou==1.0.7"], "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/flunearyou/sensor.py b/homeassistant/components/flunearyou/sensor.py index e06eb3a8ef49..6868d21ce1fc 100644 --- a/homeassistant/components/flunearyou/sensor.py +++ b/homeassistant/components/flunearyou/sensor.py @@ -1,25 +1,24 @@ """Support for user- and CDC-based flu info sensors from Flu Near You.""" -from datetime import timedelta -import logging - -from pyflunearyou import Client -from pyflunearyou.errors import FluNearYouError -import voluptuous as vol - -from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ( - ATTR_ATTRIBUTION, - ATTR_STATE, - CONF_LATITUDE, - CONF_LONGITUDE, - CONF_MONITORED_CONDITIONS, -) -from homeassistant.helpers import aiohttp_client -import homeassistant.helpers.config_validation as cv +from homeassistant.const import ATTR_ATTRIBUTION, ATTR_STATE +from homeassistant.core import callback +from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity -from homeassistant.util import Throttle -_LOGGER = logging.getLogger(__name__) +from .const import ( + CATEGORY_CDC_REPORT, + CATEGORY_USER_REPORT, + DATA_CLIENT, + DOMAIN, + SENSORS, + TOPIC_UPDATE, + TYPE_USER_CHICK, + TYPE_USER_DENGUE, + TYPE_USER_FLU, + TYPE_USER_LEPTO, + TYPE_USER_NO_SYMPTOMS, + TYPE_USER_SYMPTOMS, + TYPE_USER_TOTAL, +) ATTR_CITY = "city" ATTR_REPORTED_DATE = "reported_date" @@ -31,94 +30,46 @@ ATTR_ZIP_CODE = "zip_code" DEFAULT_ATTRIBUTION = "Data provided by Flu Near You" -MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10) -SCAN_INTERVAL = timedelta(minutes=30) - -CATEGORY_CDC_REPORT = "cdc_report" -CATEGORY_USER_REPORT = "user_report" - -TYPE_CDC_LEVEL = "level" -TYPE_CDC_LEVEL2 = "level2" -TYPE_USER_CHICK = "chick" -TYPE_USER_DENGUE = "dengue" -TYPE_USER_FLU = "flu" -TYPE_USER_LEPTO = "lepto" -TYPE_USER_NO_SYMPTOMS = "none" -TYPE_USER_SYMPTOMS = "symptoms" -TYPE_USER_TOTAL = "total" - EXTENDED_TYPE_MAPPING = { TYPE_USER_FLU: "ili", TYPE_USER_NO_SYMPTOMS: "no_symptoms", TYPE_USER_TOTAL: "total_surveys", } -SENSORS = { - CATEGORY_CDC_REPORT: [ - (TYPE_CDC_LEVEL, "CDC Level", "mdi:biohazard", None), - (TYPE_CDC_LEVEL2, "CDC Level 2", "mdi:biohazard", None), - ], - CATEGORY_USER_REPORT: [ - (TYPE_USER_CHICK, "Avian Flu Symptoms", "mdi:alert", "reports"), - (TYPE_USER_DENGUE, "Dengue Fever Symptoms", "mdi:alert", "reports"), - (TYPE_USER_FLU, "Flu Symptoms", "mdi:alert", "reports"), - (TYPE_USER_LEPTO, "Leptospirosis Symptoms", "mdi:alert", "reports"), - (TYPE_USER_NO_SYMPTOMS, "No Symptoms", "mdi:alert", "reports"), - (TYPE_USER_SYMPTOMS, "Flu-like Symptoms", "mdi:alert", "reports"), - (TYPE_USER_TOTAL, "Total Symptoms", "mdi:alert", "reports"), - ], -} -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - { - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Required(CONF_MONITORED_CONDITIONS, default=list(SENSORS)): vol.All( - cv.ensure_list, [vol.In(SENSORS)] - ), - } -) +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up Flu Near You sensors based on a config entry.""" + fny = hass.data[DOMAIN][DATA_CLIENT][config_entry.entry_id] - -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Configure the platform and add the sensors.""" - websession = aiohttp_client.async_get_clientsession(hass) - - latitude = config.get(CONF_LATITUDE, hass.config.latitude) - longitude = config.get(CONF_LONGITUDE, hass.config.longitude) - - fny = FluNearYouData( - Client(websession), latitude, longitude, config[CONF_MONITORED_CONDITIONS] + async_add_entities( + [ + FluNearYouSensor(fny, sensor_type, name, category, icon, unit) + for category, sensors in SENSORS.items() + for sensor_type, name, icon, unit in sensors + ], + True, ) - await fny.async_update() - - sensors = [ - FluNearYouSensor(fny, kind, name, category, icon, unit) - for category in config[CONF_MONITORED_CONDITIONS] - for kind, name, icon, unit in SENSORS[category] - ] - - async_add_entities(sensors, True) class FluNearYouSensor(Entity): """Define a base Flu Near You sensor.""" - def __init__(self, fny, kind, name, category, icon, unit): + def __init__(self, fny, sensor_type, name, category, icon, unit): """Initialize the sensor.""" + self._async_unsub_dispatcher_connect = None self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._category = category + self._fny = fny self._icon = icon - self._kind = kind self._name = name + self._sensor_type = sensor_type self._state = None self._unit = unit - self.fny = fny @property def available(self): """Return True if entity is available.""" - return bool(self.fny.data[self._category]) + return bool(self._fny.data[self._category]) @property def device_state_attributes(self): @@ -143,19 +94,43 @@ class FluNearYouSensor(Entity): @property def unique_id(self): """Return a unique, Home Assistant friendly identifier for this entity.""" - return f"{self.fny.latitude},{self.fny.longitude}_{self._kind}" + return f"{self._fny.latitude},{self._fny.longitude}_{self._sensor_type}" @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" return self._unit - async def async_update(self): - """Update the sensor.""" - await self.fny.async_update() + async def async_added_to_hass(self): + """Register callbacks.""" - cdc_data = self.fny.data.get(CATEGORY_CDC_REPORT) - user_data = self.fny.data.get(CATEGORY_USER_REPORT) + @callback + def update(): + """Update the state.""" + self.update_from_latest_data() + self.async_write_ha_state() + + self._async_unsub_dispatcher_connect = async_dispatcher_connect( + self.hass, TOPIC_UPDATE, update + ) + + await self._fny.async_register_api_interest(self._sensor_type) + + self.update_from_latest_data() + + async def async_will_remove_from_hass(self) -> None: + """Disconnect dispatcher listener when removed.""" + if self._async_unsub_dispatcher_connect: + self._async_unsub_dispatcher_connect() + self._async_unsub_dispatcher_connect = None + + self._fny.async_deregister_api_interest(self._sensor_type) + + @callback + def update_from_latest_data(self): + """Update the sensor.""" + cdc_data = self._fny.data.get(CATEGORY_CDC_REPORT) + user_data = self._fny.data.get(CATEGORY_USER_REPORT) if self._category == CATEGORY_CDC_REPORT and cdc_data: self._attrs.update( @@ -164,7 +139,7 @@ class FluNearYouSensor(Entity): ATTR_STATE: cdc_data["name"], } ) - self._state = cdc_data[self._kind] + self._state = cdc_data[self._sensor_type] elif self._category == CATEGORY_USER_REPORT and user_data: self._attrs.update( { @@ -176,10 +151,10 @@ class FluNearYouSensor(Entity): } ) - if self._kind in user_data["state"]["data"]: - states_key = self._kind - elif self._kind in EXTENDED_TYPE_MAPPING: - states_key = EXTENDED_TYPE_MAPPING[self._kind] + if self._sensor_type in user_data["state"]["data"]: + states_key = self._sensor_type + elif self._sensor_type in EXTENDED_TYPE_MAPPING: + states_key = EXTENDED_TYPE_MAPPING[self._sensor_type] self._attrs[ATTR_STATE_REPORTS_THIS_WEEK] = user_data["state"]["data"][ states_key @@ -188,7 +163,7 @@ class FluNearYouSensor(Entity): "last_week_data" ][states_key] - if self._kind == TYPE_USER_TOTAL: + if self._sensor_type == TYPE_USER_TOTAL: self._state = sum( v for k, v in user_data["local"].items() @@ -202,32 +177,4 @@ class FluNearYouSensor(Entity): ) ) else: - self._state = user_data["local"][self._kind] - - -class FluNearYouData: - """Define a data object to retrieve info from Flu Near You.""" - - def __init__(self, client, latitude, longitude, sensor_types): - """Initialize.""" - self._client = client - self._sensor_types = sensor_types - self.data = {} - self.latitude = latitude - self.longitude = longitude - - @Throttle(MIN_TIME_BETWEEN_UPDATES) - async def async_update(self): - """Update Flu Near You data.""" - for key, method in [ - (CATEGORY_CDC_REPORT, self._client.cdc_reports.status_by_coordinates), - (CATEGORY_USER_REPORT, self._client.user_reports.status_by_coordinates), - ]: - if key in self._sensor_types: - try: - self.data[key] = await method(self.latitude, self.longitude) - except FluNearYouError as err: - _LOGGER.error('There was an error with "%s" data: %s', key, err) - self.data[key] = {} - - _LOGGER.debug("New data stored: %s", self.data) + self._state = user_data["local"][self._sensor_type] diff --git a/homeassistant/components/flunearyou/strings.json b/homeassistant/components/flunearyou/strings.json new file mode 100644 index 000000000000..5539c6f82df7 --- /dev/null +++ b/homeassistant/components/flunearyou/strings.json @@ -0,0 +1,21 @@ +{ + "config": { + "title": "Flu Near You", + "step": { + "user": { + "title": "Configure Flu Near You", + "description": "Monitor user-based and CDC repots for a pair of coordinates.", + "data": { + "latitude": "Latitude", + "longitude": "Longitude" + } + } + }, + "error": { + "general_error": "There was an unknown error." + }, + "abort": { + "already_configured": "These coordinates are already registered." + } + } +} diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index dd0342a06a31..1584d342db4f 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -31,6 +31,7 @@ FLOWS = [ "elkm1", "emulated_roku", "esphome", + "flunearyou", "freebox", "garmin_connect", "gdacs", diff --git a/requirements_all.txt b/requirements_all.txt index 95bdb6f7bc13..a820ea3423d8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1281,7 +1281,7 @@ pyflic-homeassistant==0.4.dev0 pyflume==0.3.0 # homeassistant.components.flunearyou -pyflunearyou==1.0.3 +pyflunearyou==1.0.7 # homeassistant.components.futurenow pyfnip==0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c7278c57b38b..9d050e7288b6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -493,6 +493,9 @@ pyeverlights==0.1.0 # homeassistant.components.fido pyfido==2.1.1 +# homeassistant.components.flunearyou +pyflunearyou==1.0.7 + # homeassistant.components.fritzbox pyfritzhome==0.4.0 diff --git a/tests/components/flunearyou/__init__.py b/tests/components/flunearyou/__init__.py new file mode 100644 index 000000000000..21252facd759 --- /dev/null +++ b/tests/components/flunearyou/__init__.py @@ -0,0 +1 @@ +"""Define tests for the flunearyou component.""" diff --git a/tests/components/flunearyou/test_config_flow.py b/tests/components/flunearyou/test_config_flow.py new file mode 100644 index 000000000000..21fcb4798db3 --- /dev/null +++ b/tests/components/flunearyou/test_config_flow.py @@ -0,0 +1,87 @@ +"""Define tests for the flunearyou config flow.""" +from asynctest import patch +from pyflunearyou.errors import FluNearYouError + +from homeassistant import data_entry_flow +from homeassistant.components.flunearyou import DOMAIN +from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE + +from tests.common import MockConfigEntry + + +async def test_duplicate_error(hass): + """Test that an error is shown when duplicates are added.""" + conf = {CONF_LATITUDE: "51.528308", CONF_LONGITUDE: "-0.3817765"} + + MockConfigEntry( + domain=DOMAIN, unique_id="51.528308, -0.3817765", data=conf + ).add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=conf + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_general_error(hass): + """Test that an error is shown on a library error.""" + conf = {CONF_LATITUDE: "51.528308", CONF_LONGITUDE: "-0.3817765"} + + with patch( + "pyflunearyou.cdc.CdcReport.status_by_coordinates", side_effect=FluNearYouError, + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=conf + ) + assert result["errors"] == {"base": "general_error"} + + +async def test_show_form(hass): + """Test that the form is served with no input.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + +async def test_step_import(hass): + """Test that the import step works.""" + conf = {CONF_LATITUDE: "51.528308", CONF_LONGITUDE: "-0.3817765"} + + with patch( + "homeassistant.components.flunearyou.async_setup_entry", return_value=True + ), patch("pyflunearyou.cdc.CdcReport.status_by_coordinates"): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=conf + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == "51.528308, -0.3817765" + assert result["data"] == { + CONF_LATITUDE: "51.528308", + CONF_LONGITUDE: "-0.3817765", + } + + +async def test_step_user(hass): + """Test that the user step works.""" + conf = {CONF_LATITUDE: "51.528308", CONF_LONGITUDE: "-0.3817765"} + + with patch( + "homeassistant.components.flunearyou.async_setup_entry", return_value=True + ), patch("pyflunearyou.cdc.CdcReport.status_by_coordinates"): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=conf + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == "51.528308, -0.3817765" + assert result["data"] == { + CONF_LATITUDE: "51.528308", + CONF_LONGITUDE: "-0.3817765", + } From e64104300f75f19f66da6de724cb6c6f9ba131c9 Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 3 Apr 2020 01:55:44 +0200 Subject: [PATCH 038/653] =?UTF-8?q?Use=20backend-provided=20fan=20speed=20?= =?UTF-8?q?presets=20for=20Xiaomi=20vacuums,=20bum=E2=80=A6=20(#32850)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use backend-provided fan speed presets for Xiaomi vacuums This needs input from Xiaomi vacuum owners to verify that it does not break anything. I have personally tested this on rockrobo v1 (old mapping). Related issues/PRs: home-assistant/core#32821 home-assistant/core#31268 home-assistant/core#27268 This is a WIP as it requires a new upstream release. The PR is https://github.com/rytilahti/python-miio/pull/643 * Bump version requirement for 0.5.0 * Bump requirements_test_all.txt, too * Fix linting; missing setup.cfg on local checkout caused wrong settings for black.. * Add tests for both fan speed types * Remove useless else.. * bump python-miio to 0.5.0.1 due to broken 0.5.0 packaging --- .../components/xiaomi_miio/manifest.json | 2 +- .../components/xiaomi_miio/vacuum.py | 20 ++- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/xiaomi_miio/test_vacuum.py | 144 ++++++++++++------ 5 files changed, 110 insertions(+), 60 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/manifest.json b/homeassistant/components/xiaomi_miio/manifest.json index 3d179c63adbd..4d88cdef0f2a 100644 --- a/homeassistant/components/xiaomi_miio/manifest.json +++ b/homeassistant/components/xiaomi_miio/manifest.json @@ -2,7 +2,7 @@ "domain": "xiaomi_miio", "name": "Xiaomi miio", "documentation": "https://www.home-assistant.io/integrations/xiaomi_miio", - "requirements": ["construct==2.9.45", "python-miio==0.4.8"], + "requirements": ["construct==2.9.45", "python-miio==0.5.0.1"], "dependencies": [], "codeowners": ["@rytilahti", "@syssi"] } diff --git a/homeassistant/components/xiaomi_miio/vacuum.py b/homeassistant/components/xiaomi_miio/vacuum.py index a32a28993cac..416918e6f436 100644 --- a/homeassistant/components/xiaomi_miio/vacuum.py +++ b/homeassistant/components/xiaomi_miio/vacuum.py @@ -60,8 +60,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( extra=vol.ALLOW_EXTRA, ) -FAN_SPEEDS = {"Silent": 38, "Standard": 60, "Medium": 77, "Turbo": 90, "Gentle": 105} - ATTR_CLEAN_START = "clean_start" ATTR_CLEAN_STOP = "clean_stop" ATTR_CLEANING_TIME = "cleaning_time" @@ -246,6 +244,8 @@ class MiroboVacuum(StateVacuumDevice): self.clean_history = None self.dnd_state = None self.last_clean = None + self._fan_speeds = None + self._fan_speeds_reverse = None @property def name(self): @@ -281,14 +281,17 @@ class MiroboVacuum(StateVacuumDevice): """Return the fan speed of the vacuum cleaner.""" if self.vacuum_state is not None: speed = self.vacuum_state.fanspeed - if speed in FAN_SPEEDS.values(): - return [key for key, value in FAN_SPEEDS.items() if value == speed][0] + if speed in self._fan_speeds_reverse: + return self._fan_speeds_reverse[speed] + + _LOGGER.debug("Unable to find reverse for %s", speed) + return speed @property def fan_speed_list(self): """Get the list of available fan speed steps of the vacuum cleaner.""" - return list(sorted(FAN_SPEEDS.keys(), key=lambda s: FAN_SPEEDS[s])) + return list(self._fan_speeds) @property def device_state_attributes(self): @@ -372,8 +375,8 @@ class MiroboVacuum(StateVacuumDevice): async def async_set_fan_speed(self, fan_speed, **kwargs): """Set fan speed.""" - if fan_speed.capitalize() in FAN_SPEEDS: - fan_speed = FAN_SPEEDS[fan_speed.capitalize()] + if fan_speed in self._fan_speeds: + fan_speed = self._fan_speeds[fan_speed] else: try: fan_speed = int(fan_speed) @@ -453,6 +456,9 @@ class MiroboVacuum(StateVacuumDevice): state = self._vacuum.status() self.vacuum_state = state + self._fan_speeds = self._vacuum.fan_speed_presets() + self._fan_speeds_reverse = {v: k for k, v in self._fan_speeds.items()} + self.consumable_state = self._vacuum.consumable_status() self.clean_history = self._vacuum.clean_history() self.last_clean = self._vacuum.last_clean_details() diff --git a/requirements_all.txt b/requirements_all.txt index a820ea3423d8..e1d63b4b7541 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1638,7 +1638,7 @@ python-juicenet==0.1.6 # python-lirc==1.2.3 # homeassistant.components.xiaomi_miio -python-miio==0.4.8 +python-miio==0.5.0.1 # homeassistant.components.mpd python-mpd2==1.0.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9d050e7288b6..e5b86bf59da8 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -620,7 +620,7 @@ python-forecastio==1.4.0 python-izone==1.1.2 # homeassistant.components.xiaomi_miio -python-miio==0.4.8 +python-miio==0.5.0.1 # homeassistant.components.nest python-nest==4.1.0 diff --git a/tests/components/xiaomi_miio/test_vacuum.py b/tests/components/xiaomi_miio/test_vacuum.py index 47c7a98023ce..d497aec0dca3 100644 --- a/tests/components/xiaomi_miio/test_vacuum.py +++ b/tests/components/xiaomi_miio/test_vacuum.py @@ -100,6 +100,36 @@ def mirobo_is_got_error_fixture(): yield mock_vacuum +old_fanspeeds = { + "Silent": 38, + "Standard": 60, + "Medium": 77, + "Turbo": 90, +} +new_fanspeeds = { + "Silent": 101, + "Standard": 102, + "Medium": 103, + "Turbo": 104, + "Gentle": 105, +} + + +@pytest.fixture(name="mock_mirobo_fanspeeds", params=[old_fanspeeds, new_fanspeeds]) +def mirobo_old_speeds_fixture(request): + """Fixture for testing both types of fanspeeds.""" + mock_vacuum = mock.MagicMock() + mock_vacuum.status().battery = 32 + mock_vacuum.fan_speed_presets.return_value = request.param + mock_vacuum.status().fanspeed = list(request.param.values())[0] + + with mock.patch( + "homeassistant.components.xiaomi_miio.vacuum.Vacuum" + ) as mock_vaccum_cls: + mock_vaccum_cls.return_value = mock_vacuum + yield mock_vacuum + + @pytest.fixture(name="mock_mirobo_is_on") def mirobo_is_on_fixture(): """Mock mock_mirobo.""" @@ -204,14 +234,6 @@ async def test_xiaomi_vacuum_services(hass, caplog, mock_mirobo_is_got_error): assert state.attributes.get(ATTR_BATTERY_ICON) == "mdi:battery-80" assert state.attributes.get(ATTR_CLEANING_TIME) == 155 assert state.attributes.get(ATTR_CLEANED_AREA) == 123 - assert state.attributes.get(ATTR_FAN_SPEED) == "Silent" - assert state.attributes.get(ATTR_FAN_SPEED_LIST) == [ - "Silent", - "Standard", - "Medium", - "Turbo", - "Gentle", - ] assert state.attributes.get(ATTR_MAIN_BRUSH_LEFT) == 12 assert state.attributes.get(ATTR_SIDE_BRUSH_LEFT) == 12 assert state.attributes.get(ATTR_FILTER_LEFT) == 12 @@ -257,40 +279,6 @@ async def test_xiaomi_vacuum_services(hass, caplog, mock_mirobo_is_got_error): mock_mirobo_is_got_error.assert_has_calls(STATUS_CALLS, any_order=True) mock_mirobo_is_got_error.reset_mock() - # Set speed service: - await hass.services.async_call( - DOMAIN, - SERVICE_SET_FAN_SPEED, - {"entity_id": entity_id, "fan_speed": 60}, - blocking=True, - ) - mock_mirobo_is_got_error.assert_has_calls( - [mock.call.set_fan_speed(60)], any_order=True - ) - mock_mirobo_is_got_error.assert_has_calls(STATUS_CALLS, any_order=True) - mock_mirobo_is_got_error.reset_mock() - - await hass.services.async_call( - DOMAIN, - SERVICE_SET_FAN_SPEED, - {"entity_id": entity_id, "fan_speed": "Medium"}, - blocking=True, - ) - mock_mirobo_is_got_error.assert_has_calls( - [mock.call.set_fan_speed(77)], any_order=True - ) - mock_mirobo_is_got_error.assert_has_calls(STATUS_CALLS, any_order=True) - mock_mirobo_is_got_error.reset_mock() - - assert "ERROR" not in caplog.text - await hass.services.async_call( - DOMAIN, - SERVICE_SET_FAN_SPEED, - {"entity_id": entity_id, "fan_speed": "invent"}, - blocking=True, - ) - assert "ERROR" in caplog.text - await hass.services.async_call( DOMAIN, SERVICE_SEND_COMMAND, @@ -346,14 +334,6 @@ async def test_xiaomi_specific_services(hass, caplog, mock_mirobo_is_on): assert state.attributes.get(ATTR_BATTERY_ICON) == "mdi:battery-30" assert state.attributes.get(ATTR_CLEANING_TIME) == 175 assert state.attributes.get(ATTR_CLEANED_AREA) == 133 - assert state.attributes.get(ATTR_FAN_SPEED) == 99 - assert state.attributes.get(ATTR_FAN_SPEED_LIST) == [ - "Silent", - "Standard", - "Medium", - "Turbo", - "Gentle", - ] assert state.attributes.get(ATTR_MAIN_BRUSH_LEFT) == 11 assert state.attributes.get(ATTR_SIDE_BRUSH_LEFT) == 11 assert state.attributes.get(ATTR_FILTER_LEFT) == 11 @@ -409,3 +389,67 @@ async def test_xiaomi_specific_services(hass, caplog, mock_mirobo_is_on): ) mock_mirobo_is_on.assert_has_calls(STATUS_CALLS, any_order=True) mock_mirobo_is_on.reset_mock() + + +async def test_xiaomi_vacuum_fanspeeds(hass, caplog, mock_mirobo_fanspeeds): + """Test Xiaomi vacuum fanspeeds.""" + entity_name = "test_vacuum_cleaner_2" + entity_id = f"{DOMAIN}.{entity_name}" + + await async_setup_component( + hass, + DOMAIN, + { + DOMAIN: { + CONF_PLATFORM: PLATFORM, + CONF_HOST: "192.168.1.100", + CONF_NAME: entity_name, + CONF_TOKEN: "12345678901234567890123456789012", + } + }, + ) + await hass.async_block_till_done() + + assert "Initializing with host 192.168.1.100 (token 12345" in caplog.text + + state = hass.states.get(entity_id) + assert state.attributes.get(ATTR_FAN_SPEED) == "Silent" + fanspeeds = state.attributes.get(ATTR_FAN_SPEED_LIST) + for speed in ["Silent", "Standard", "Medium", "Turbo"]: + assert speed in fanspeeds + + # Set speed service: + await hass.services.async_call( + DOMAIN, + SERVICE_SET_FAN_SPEED, + {"entity_id": entity_id, "fan_speed": 60}, + blocking=True, + ) + mock_mirobo_fanspeeds.assert_has_calls( + [mock.call.set_fan_speed(60)], any_order=True + ) + mock_mirobo_fanspeeds.assert_has_calls(STATUS_CALLS, any_order=True) + mock_mirobo_fanspeeds.reset_mock() + + fan_speed_dict = mock_mirobo_fanspeeds.fan_speed_presets() + + await hass.services.async_call( + DOMAIN, + SERVICE_SET_FAN_SPEED, + {"entity_id": entity_id, "fan_speed": "Medium"}, + blocking=True, + ) + mock_mirobo_fanspeeds.assert_has_calls( + [mock.call.set_fan_speed(fan_speed_dict["Medium"])], any_order=True + ) + mock_mirobo_fanspeeds.assert_has_calls(STATUS_CALLS, any_order=True) + mock_mirobo_fanspeeds.reset_mock() + + assert "ERROR" not in caplog.text + await hass.services.async_call( + DOMAIN, + SERVICE_SET_FAN_SPEED, + {"entity_id": entity_id, "fan_speed": "invent"}, + blocking=True, + ) + assert "ERROR" in caplog.text From 08c9ceb752e2f884afbf7daa689b85bb50407aa4 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 3 Apr 2020 00:04:03 +0000 Subject: [PATCH 039/653] [ci skip] Translation update --- .../airvisual/.translations/ko.json | 2 +- .../components/doorbird/.translations/ko.json | 4 +- .../flunearyou/.translations/en.json | 4 +- .../components/hue/.translations/de.json | 17 +++++++++ .../components/hue/.translations/es.json | 17 +++++++++ .../components/hue/.translations/ko.json | 17 +++++++++ .../components/hue/.translations/zh-Hant.json | 17 +++++++++ .../components/ipp/.translations/ko.json | 32 ++++++++++++++++ .../konnected/.translations/ko.json | 10 ++++- .../components/nut/.translations/ko.json | 37 +++++++++++++++++++ .../components/unifi/.translations/de.json | 3 +- .../components/unifi/.translations/en.json | 2 +- .../components/unifi/.translations/ko.json | 3 +- 13 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 homeassistant/components/ipp/.translations/ko.json create mode 100644 homeassistant/components/nut/.translations/ko.json diff --git a/homeassistant/components/airvisual/.translations/ko.json b/homeassistant/components/airvisual/.translations/ko.json index 8f1155aa5f91..bb01114a5e3e 100644 --- a/homeassistant/components/airvisual/.translations/ko.json +++ b/homeassistant/components/airvisual/.translations/ko.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\uc774 API \ud0a4\ub294 \uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4." + "already_configured": "\uc88c\ud45c\uac12\uc774 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4" }, "error": { "invalid_api_key": "\uc798\ubabb\ub41c API \ud0a4" diff --git a/homeassistant/components/doorbird/.translations/ko.json b/homeassistant/components/doorbird/.translations/ko.json index 121262065fd6..fcdee98a74d3 100644 --- a/homeassistant/components/doorbird/.translations/ko.json +++ b/homeassistant/components/doorbird/.translations/ko.json @@ -1,7 +1,9 @@ { "config": { "abort": { - "already_configured": "\uc774 DoorBird \ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + "already_configured": "\uc774 DoorBird \ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "link_local_address": "\ub85c\uceec \uc8fc\uc18c \uc5f0\uacb0\uc740 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4", + "not_doorbird_device": "\uc774 \uae30\uae30\ub294 DoorBird \uac00 \uc544\ub2d9\ub2c8\ub2e4" }, "error": { "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", diff --git a/homeassistant/components/flunearyou/.translations/en.json b/homeassistant/components/flunearyou/.translations/en.json index cd8c0d27c363..ca868b8ebd91 100644 --- a/homeassistant/components/flunearyou/.translations/en.json +++ b/homeassistant/components/flunearyou/.translations/en.json @@ -12,10 +12,10 @@ "latitude": "Latitude", "longitude": "Longitude" }, - "description": "Monitor user-based and CDC flu reports.", + "description": "Monitor user-based and CDC repots for a pair of coordinates.", "title": "Configure Flu Near You" } }, "title": "Flu Near You" } -} +} \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/de.json b/homeassistant/components/hue/.translations/de.json index 1907d9d23ca5..a4ab9123b48a 100644 --- a/homeassistant/components/hue/.translations/de.json +++ b/homeassistant/components/hue/.translations/de.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "Erste Taste", + "button_2": "Zweite Taste", + "button_3": "Dritte Taste", + "button_4": "Vierte Taste", + "dim_down": "Dimmer runter", + "dim_up": "Dimmer hoch", + "turn_off": "Ausschalten", + "turn_on": "Einschalten" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" Taste nach langem Dr\u00fccken losgelassen", + "remote_button_short_press": "\"{subtype}\" Taste gedr\u00fcckt", + "remote_button_short_release": "\"{subtype}\" Taste losgelassen" + } } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es.json b/homeassistant/components/hue/.translations/es.json index bc41d3d2df0f..6a5074c6e4a2 100644 --- a/homeassistant/components/hue/.translations/es.json +++ b/homeassistant/components/hue/.translations/es.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "Primer bot\u00f3n", + "button_2": "Segundo bot\u00f3n", + "button_3": "Tercer bot\u00f3n", + "button_4": "Cuarto bot\u00f3n", + "dim_down": "Bajar la intensidad", + "dim_up": "Subir la intensidad", + "turn_off": "Apagar", + "turn_on": "Encender" + }, + "trigger_type": { + "remote_button_long_release": "Bot\u00f3n \"{subtype}\" soltado despu\u00e9s de una pulsaci\u00f3n larga", + "remote_button_short_press": "Bot\u00f3n \"{subtype}\" pulsado", + "remote_button_short_release": "Bot\u00f3n \"{subtype}\" soltado" + } } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ko.json b/homeassistant/components/hue/.translations/ko.json index 7e837ca5ff94..8b1c413b2053 100644 --- a/homeassistant/components/hue/.translations/ko.json +++ b/homeassistant/components/hue/.translations/ko.json @@ -27,5 +27,22 @@ } }, "title": "\ud544\ub9bd\uc2a4 Hue \ube0c\ub9bf\uc9c0" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "\uccab \ubc88\uc9f8 \ubc84\ud2bc", + "button_2": "\ub450 \ubc88\uc9f8 \ubc84\ud2bc", + "button_3": "\uc138 \ubc88\uc9f8 \ubc84\ud2bc", + "button_4": "\ub124 \ubc88\uc9f8 \ubc84\ud2bc", + "dim_down": "\uc5b4\ub461\uac8c \ud558\uae30", + "dim_up": "\ubc1d\uac8c \ud558\uae30", + "turn_off": "\ub044\uae30", + "turn_on": "\ucf1c\uae30" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" \ubc84\ud2bc\uc774 \uae38\uac8c \ub20c\ub838\ub2e4\uac00 \uc190\uc744 \ub5c4 \ub54c", + "remote_button_short_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \ub20c\ub9b4 \ub54c", + "remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c" + } } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/zh-Hant.json b/homeassistant/components/hue/.translations/zh-Hant.json index 6bbe75a8019b..0aa75438f7bb 100644 --- a/homeassistant/components/hue/.translations/zh-Hant.json +++ b/homeassistant/components/hue/.translations/zh-Hant.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "\u7b2c\u4e00\u500b\u6309\u9215", + "button_2": "\u7b2c\u4e8c\u500b\u6309\u9215", + "button_3": "\u7b2c\u4e09\u500b\u6309\u9215", + "button_4": "\u7b2c\u56db\u500b\u6309\u9215", + "dim_down": "\u8abf\u6697", + "dim_up": "\u8abf\u4eae", + "turn_off": "\u95dc\u9589", + "turn_on": "\u958b\u555f" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" \u6309\u9215\u9577\u6309\u5f8c\u91cb\u653e", + "remote_button_short_press": "\"{subtype}\" \u6309\u9215\u5df2\u6309\u4e0b", + "remote_button_short_release": "\"{subtype}\" \u6309\u9215\u5df2\u91cb\u653e" + } } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ko.json b/homeassistant/components/ipp/.translations/ko.json new file mode 100644 index 000000000000..ab556519e078 --- /dev/null +++ b/homeassistant/components/ipp/.translations/ko.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "\uc774 \ud504\ub9b0\ud130\ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "connection_error": "\ud504\ub9b0\ud130\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "connection_upgrade": "\ud504\ub9b0\ud130\uc5d0 \uc5f0\uacb0\ud558\ub824\uba74 \uc5f0\uacb0\uc744 \uc5c5\uadf8\ub808\uc774\ub4dc\ud574\uc57c \ud569\ub2c8\ub2e4." + }, + "error": { + "connection_error": "\ud504\ub9b0\ud130\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "connection_upgrade": "\ud504\ub9b0\ud130\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. SSL/TLS \uc635\uc158\uc744 \ud655\uc778\ud558\uace0 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694." + }, + "flow_title": "\ud504\ub9b0\ud130: {name}", + "step": { + "user": { + "data": { + "base_path": "\ud504\ub9b0\ud130\uc758 \uc0c1\ub300 \uacbd\ub85c", + "host": "\ud638\uc2a4\ud2b8 \ub610\ub294 IP \uc8fc\uc18c", + "port": "\ud3ec\ud2b8", + "ssl": "\ud504\ub9b0\ud130\ub294 SSL/TLS \ub97c \ud1b5\ud55c \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4", + "verify_ssl": "\ud504\ub9b0\ud130\ub294 \uc62c\ubc14\ub978 SSL \uc778\uc99d\uc11c\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4" + }, + "description": "\uc778\ud130\ub137 \uc778\uc1c4 \ud504\ub85c\ud1a0\ucf5c (IPP) \ub97c \ud1b5\ud574 \ud504\ub9b0\ud130\ub97c \uc124\uc815\ud558\uc5ec Home Assistant \uc640 \uc5f0\ub3d9\ud569\ub2c8\ub2e4.", + "title": "\ud504\ub9b0\ud130 \uc5f0\uacb0" + }, + "zeroconf_confirm": { + "description": "Home Assistant \uc5d0 `{name}` \ud504\ub9b0\ud130\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", + "title": "\ubc1c\uacac\ub41c \ud504\ub9b0\ud130" + } + }, + "title": "\uc778\ud130\ub137 \uc778\uc1c4 \ud504\ub85c\ud1a0\ucf5c (IPP)" + } +} \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ko.json b/homeassistant/components/konnected/.translations/ko.json index 0c5e213ea0d1..34dd01d06b62 100644 --- a/homeassistant/components/konnected/.translations/ko.json +++ b/homeassistant/components/konnected/.translations/ko.json @@ -33,6 +33,9 @@ "abort": { "not_konn_panel": "\uc778\uc2dd\ub41c Konnected.io \uae30\uae30\uac00 \uc544\ub2d9\ub2c8\ub2e4" }, + "error": { + "bad_host": "API \ud638\uc2a4\ud2b8 URL \uc7ac\uc815\uc758\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + }, "step": { "options_binary": { "data": { @@ -82,7 +85,9 @@ }, "options_misc": { "data": { - "blink": "\uc0c1\ud0dc \ubcc0\uacbd\uc744 \ubcf4\ub0bc \ub54c \uae5c\ubc15\uc784 \ud328\ub110 LED \ub97c \ucf2d\ub2c8\ub2e4" + "api_host": "API \ud638\uc2a4\ud2b8 URL \uc7ac\uc815\uc758 (\uc120\ud0dd \uc0ac\ud56d)", + "blink": "\uc0c1\ud0dc \ubcc0\uacbd\uc744 \ubcf4\ub0bc \ub54c \uae5c\ubc15\uc784 \ud328\ub110 LED \ub97c \ucf2d\ub2c8\ub2e4", + "override_api_host": "\uae30\ubcf8 Home Assistant API \ud638\uc2a4\ud2b8 \ud328\ub110 URL \uc7ac\uc815\uc758" }, "description": "\ud328\ub110\uc5d0 \uc6d0\ud558\ub294 \ub3d9\uc791\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694", "title": "\uae30\ud0c0 \uad6c\uc131" @@ -91,11 +96,12 @@ "data": { "activation": "\uc2a4\uc704\uce58\uac00 \ucf1c\uc9c8 \ub54c \ucd9c\ub825", "momentary": "\ud384\uc2a4 \uc9c0\uc18d\uc2dc\uac04 (ms) (\uc120\ud0dd \uc0ac\ud56d)", + "more_states": "\uc774 \uad6c\uc5ed\uc5d0 \ub300\ud55c \ucd94\uac00 \uc0c1\ud0dc \uad6c\uc131", "name": "\uc774\ub984 (\uc120\ud0dd \uc0ac\ud56d)", "pause": "\ud384\uc2a4 \uac04 \uc77c\uc2dc\uc815\uc9c0 \uc2dc\uac04 (ms) (\uc120\ud0dd \uc0ac\ud56d)", "repeat": "\ubc18\ubcf5 \uc2dc\uac04 (-1 = \ubb34\ud55c) (\uc120\ud0dd \uc0ac\ud56d)" }, - "description": "{zone} \ub300\ud55c \ucd9c\ub825 \uc635\uc158\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694", + "description": "{zone} \uad6c\uc5ed\uc5d0 \ub300\ud55c \ucd9c\ub825 \uc635\uc158\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694: \uc0c1\ud0dc {state}", "title": "\uc2a4\uc704\uce58 \ucd9c\ub825 \uad6c\uc131" } }, diff --git a/homeassistant/components/nut/.translations/ko.json b/homeassistant/components/nut/.translations/ko.json new file mode 100644 index 000000000000..f9fa46b6667b --- /dev/null +++ b/homeassistant/components/nut/.translations/ko.json @@ -0,0 +1,37 @@ +{ + "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. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", + "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + }, + "step": { + "user": { + "data": { + "alias": "\ubcc4\uba85", + "host": "\ud638\uc2a4\ud2b8", + "name": "\uc774\ub984", + "password": "\ube44\ubc00\ubc88\ud638", + "port": "\ud3ec\ud2b8", + "resources": "\ub9ac\uc18c\uc2a4", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + }, + "description": "NUT \uc11c\ubc84\uc5d0 UPS \uac00 \uc5ec\ub7ec \uac1c \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 '\ubcc4\uba85' \uc785\ub825\ub780\uc5d0 \uc870\ud68c\ud560 UPS \uc774\ub984\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", + "title": "NUT \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud558\uae30" + } + }, + "title": "\ub124\ud2b8\uc6cc\ud06c UPS \ub3c4\uad6c (NUT)" + }, + "options": { + "step": { + "init": { + "data": { + "resources": "\ub9ac\uc18c\uc2a4" + }, + "description": "\uc13c\uc11c \ub9ac\uc18c\uc2a4 \uc120\ud0dd" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/de.json b/homeassistant/components/unifi/.translations/de.json index 655000662ec8..afdea87956b3 100644 --- a/homeassistant/components/unifi/.translations/de.json +++ b/homeassistant/components/unifi/.translations/de.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "Clients mit Netzwerkzugriffskontrolle", - "new_client": "F\u00fcgen Sie einen neuen Client f\u00fcr die Netzwerkzugangskontrolle hinzu" + "new_client": "F\u00fcgen Sie einen neuen Client f\u00fcr die Netzwerkzugangskontrolle hinzu", + "poe_clients": "POE-Kontrolle von Clients zulassen" }, "description": "Konfigurieren Sie Client-Steuerelemente \n\nErstellen Sie Switches f\u00fcr Seriennummern, f\u00fcr die Sie den Netzwerkzugriff steuern m\u00f6chten.", "title": "UniFi-Optionen 2/3" diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index 0124ca1cc244..d42a647c82fe 100644 --- a/homeassistant/components/unifi/.translations/en.json +++ b/homeassistant/components/unifi/.translations/en.json @@ -32,7 +32,7 @@ "client_control": { "data": { "block_client": "Network access controlled clients", - "new_client": "Add new client (MAC) for network access control", + "new_client": "Add new client for network access control", "poe_clients": "Allow POE control of clients" }, "description": "Configure client controls\n\nCreate switches for serial numbers you want to control network access for.", diff --git a/homeassistant/components/unifi/.translations/ko.json b/homeassistant/components/unifi/.translations/ko.json index 5c45e272e917..d57d80c79114 100644 --- a/homeassistant/components/unifi/.translations/ko.json +++ b/homeassistant/components/unifi/.translations/ko.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "\ub124\ud2b8\uc6cc\ud06c \uc561\uc138\uc2a4 \uc81c\uc5b4 \ud074\ub77c\uc774\uc5b8\ud2b8", - "new_client": "\ub124\ud2b8\uc6cc\ud06c \uc561\uc138\uc2a4 \uc81c\uc5b4\ub97c \uc704\ud55c \uc0c8\ub85c\uc6b4 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucd94\uac00" + "new_client": "\ub124\ud2b8\uc6cc\ud06c \uc561\uc138\uc2a4 \uc81c\uc5b4\ub97c \uc704\ud55c \uc0c8\ub85c\uc6b4 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucd94\uac00", + "poe_clients": "\ud074\ub77c\uc774\uc5b8\ud2b8\uc758 POE \uc81c\uc5b4 \ud5c8\uc6a9" }, "description": "\ud074\ub77c\uc774\uc5b8\ud2b8 \ucee8\ud2b8\ub864 \uad6c\uc131 \n\n\ub124\ud2b8\uc6cc\ud06c \uc561\uc138\uc2a4\ub97c \uc81c\uc5b4\ud558\ub824\ub294 \uc2dc\ub9ac\uc5bc \ubc88\ud638\uc5d0 \ub300\ud55c \uc2a4\uc704\uce58\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.", "title": "UniFi \uc635\uc158 2/3" From 2b0bdd580cd9caf7cfe4c05a00c16ec3a3a2f3ec Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 2 Apr 2020 19:09:38 -0500 Subject: [PATCH 040/653] Update to pyipp==0.8.3 (#33554) * Update manifest.json * Update requirements_all.txt * Update requirements_test_all.txt --- homeassistant/components/ipp/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 2eae581bdc70..0cb788eeee7f 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.8.2"], + "requirements": ["pyipp==0.8.3"], "dependencies": [], "codeowners": ["@ctalkington"], "config_flow": true, diff --git a/requirements_all.txt b/requirements_all.txt index e1d63b4b7541..6724b83d8b42 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1336,7 +1336,7 @@ pyintesishome==1.7.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.2 +pyipp==0.8.3 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e5b86bf59da8..83255df57145 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -522,7 +522,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.2 +pyipp==0.8.3 # homeassistant.components.iqvia pyiqvia==0.2.1 From f25321e010b2ced0efa07324a4002e443c0218cc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 2 Apr 2020 20:06:13 -0500 Subject: [PATCH 041/653] Use homekit service callbacks for lights to resolve out of sync states (#32348) * Switch homekit lights to use service callbacks Service callbacks allow us to get the on/off, brightness, etc all in one call so we remove all the complexity that was previously needed to handle the out of sync states We now get the on event and brightness event at the same time which allows us to prevent lights from flashing up to 100% before the requested brightness. * Fix STATE_OFF -> STATE_ON,brightness:0 --- .../components/homekit/type_lights.py | 159 ++++----- tests/components/homekit/test_type_lights.py | 312 ++++++++++++++++-- 2 files changed, 343 insertions(+), 128 deletions(-) diff --git a/homeassistant/components/homekit/type_lights.py b/homeassistant/components/homekit/type_lights.py index 734568606b21..1720c2c58c8e 100644 --- a/homeassistant/components/homekit/type_lights.py +++ b/homeassistant/components/homekit/type_lights.py @@ -25,7 +25,7 @@ from homeassistant.const import ( ) from . import TYPES -from .accessories import HomeAccessory, debounce +from .accessories import HomeAccessory from .const import ( CHAR_BRIGHTNESS, CHAR_COLOR_TEMPERATURE, @@ -52,15 +52,6 @@ class Light(HomeAccessory): def __init__(self, *args): """Initialize a new Light accessory object.""" super().__init__(*args, category=CATEGORY_LIGHTBULB) - self._flag = { - CHAR_ON: False, - CHAR_BRIGHTNESS: False, - CHAR_HUE: False, - CHAR_SATURATION: False, - CHAR_COLOR_TEMPERATURE: False, - RGB_COLOR: False, - } - self._state = 0 self.chars = [] self._features = self.hass.states.get(self.entity_id).attributes.get( @@ -82,17 +73,14 @@ class Light(HomeAccessory): self.chars.append(CHAR_COLOR_TEMPERATURE) serv_light = self.add_preload_service(SERV_LIGHTBULB, self.chars) - self.char_on = serv_light.configure_char( - CHAR_ON, value=self._state, setter_callback=self.set_state - ) + + self.char_on = serv_light.configure_char(CHAR_ON, value=0) if CHAR_BRIGHTNESS in self.chars: # Initial value is set to 100 because 0 is a special value (off). 100 is # an arbitrary non-zero value. It is updated immediately by update_state # to set to the correct initial value. - self.char_brightness = serv_light.configure_char( - CHAR_BRIGHTNESS, value=100, setter_callback=self.set_brightness - ) + self.char_brightness = serv_light.configure_char(CHAR_BRIGHTNESS, value=100) if CHAR_COLOR_TEMPERATURE in self.chars: min_mireds = self.hass.states.get(self.entity_id).attributes.get( @@ -105,133 +93,98 @@ class Light(HomeAccessory): CHAR_COLOR_TEMPERATURE, value=min_mireds, properties={PROP_MIN_VALUE: min_mireds, PROP_MAX_VALUE: max_mireds}, - setter_callback=self.set_color_temperature, ) if CHAR_HUE in self.chars: - self.char_hue = serv_light.configure_char( - CHAR_HUE, value=0, setter_callback=self.set_hue - ) + self.char_hue = serv_light.configure_char(CHAR_HUE, value=0) if CHAR_SATURATION in self.chars: - self.char_saturation = serv_light.configure_char( - CHAR_SATURATION, value=75, setter_callback=self.set_saturation - ) + self.char_saturation = serv_light.configure_char(CHAR_SATURATION, value=75) - def set_state(self, value): - """Set state if call came from HomeKit.""" - if self._state == value: - return + serv_light.setter_callback = self._set_chars - _LOGGER.debug("%s: Set state to %d", self.entity_id, value) - self._flag[CHAR_ON] = True + def _set_chars(self, char_values): + _LOGGER.debug("_set_chars: %s", char_values) + events = [] + service = SERVICE_TURN_ON params = {ATTR_ENTITY_ID: self.entity_id} - service = SERVICE_TURN_ON if value == 1 else SERVICE_TURN_OFF - self.call_service(DOMAIN, service, params) + if CHAR_ON in char_values: + if not char_values[CHAR_ON]: + service = SERVICE_TURN_OFF + events.append(f"Set state to {char_values[CHAR_ON]}") - @debounce - def set_brightness(self, value): - """Set brightness if call came from HomeKit.""" - _LOGGER.debug("%s: Set brightness to %d", self.entity_id, value) - self._flag[CHAR_BRIGHTNESS] = True - if value == 0: - self.set_state(0) # Turn off light - return - params = {ATTR_ENTITY_ID: self.entity_id, ATTR_BRIGHTNESS_PCT: value} - self.call_service(DOMAIN, SERVICE_TURN_ON, params, f"brightness at {value}%") + if CHAR_BRIGHTNESS in char_values: + if char_values[CHAR_BRIGHTNESS] == 0: + events[-1] = f"Set state to 0" + service = SERVICE_TURN_OFF + else: + params[ATTR_BRIGHTNESS_PCT] = char_values[CHAR_BRIGHTNESS] + events.append(f"brightness at {char_values[CHAR_BRIGHTNESS]}%") - def set_color_temperature(self, value): - """Set color temperature if call came from HomeKit.""" - _LOGGER.debug("%s: Set color temp to %s", self.entity_id, value) - self._flag[CHAR_COLOR_TEMPERATURE] = True - params = {ATTR_ENTITY_ID: self.entity_id, ATTR_COLOR_TEMP: value} - self.call_service( - DOMAIN, SERVICE_TURN_ON, params, f"color temperature at {value}" - ) + if CHAR_COLOR_TEMPERATURE in char_values: + params[ATTR_COLOR_TEMP] = char_values[CHAR_COLOR_TEMPERATURE] + events.append(f"color temperature at {char_values[CHAR_COLOR_TEMPERATURE]}") - def set_saturation(self, value): - """Set saturation if call came from HomeKit.""" - _LOGGER.debug("%s: Set saturation to %d", self.entity_id, value) - self._flag[CHAR_SATURATION] = True - self._saturation = value - self.set_color() - - def set_hue(self, value): - """Set hue if call came from HomeKit.""" - _LOGGER.debug("%s: Set hue to %d", self.entity_id, value) - self._flag[CHAR_HUE] = True - self._hue = value - self.set_color() - - def set_color(self): - """Set color if call came from HomeKit.""" if ( self._features & SUPPORT_COLOR - and self._flag[CHAR_HUE] - and self._flag[CHAR_SATURATION] + and CHAR_HUE in char_values + and CHAR_SATURATION in char_values ): - color = (self._hue, self._saturation) + color = (char_values[CHAR_HUE], char_values[CHAR_SATURATION]) _LOGGER.debug("%s: Set hs_color to %s", self.entity_id, color) - self._flag.update( - {CHAR_HUE: False, CHAR_SATURATION: False, RGB_COLOR: True} - ) - params = {ATTR_ENTITY_ID: self.entity_id, ATTR_HS_COLOR: color} - self.call_service(DOMAIN, SERVICE_TURN_ON, params, f"set color at {color}") + params[ATTR_HS_COLOR] = color + events.append(f"set color at {color}") + + self.call_service(DOMAIN, service, params, ", ".join(events)) def update_state(self, new_state): """Update light after state change.""" # Handle State state = new_state.state - if state in (STATE_ON, STATE_OFF): - self._state = 1 if state == STATE_ON else 0 - if not self._flag[CHAR_ON] and self.char_on.value != self._state: - self.char_on.set_value(self._state) - self._flag[CHAR_ON] = False + if state == STATE_ON and self.char_on.value != 1: + self.char_on.set_value(1) + elif state == STATE_OFF and self.char_on.value != 0: + self.char_on.set_value(0) # Handle Brightness if CHAR_BRIGHTNESS in self.chars: brightness = new_state.attributes.get(ATTR_BRIGHTNESS) - if not self._flag[CHAR_BRIGHTNESS] and isinstance(brightness, int): + if isinstance(brightness, int): brightness = round(brightness / 255 * 100, 0) + # The homeassistant component might report its brightness as 0 but is + # not off. But 0 is a special value in homekit. When you turn on a + # homekit accessory it will try to restore the last brightness state + # which will be the last value saved by char_brightness.set_value. + # But if it is set to 0, HomeKit will update the brightness to 100 as + # it thinks 0 is off. + # + # Therefore, if the the brightness is 0 and the device is still on, + # the brightness is mapped to 1 otherwise the update is ignored in + # order to avoid this incorrect behavior. + if brightness == 0 and state == STATE_ON: + brightness = 1 if self.char_brightness.value != brightness: - # The homeassistant component might report its brightness as 0 but is - # not off. But 0 is a special value in homekit. When you turn on a - # homekit accessory it will try to restore the last brightness state - # which will be the last value saved by char_brightness.set_value. - # But if it is set to 0, HomeKit will update the brightness to 100 as - # it thinks 0 is off. - # - # Therefore, if the the brightness is 0 and the device is still on, - # the brightness is mapped to 1 otherwise the update is ignored in - # order to avoid this incorrect behavior. - if brightness == 0: - if state == STATE_ON: - self.char_brightness.set_value(1) - else: - self.char_brightness.set_value(brightness) - self._flag[CHAR_BRIGHTNESS] = False + self.char_brightness.set_value(brightness) # Handle color temperature if CHAR_COLOR_TEMPERATURE in self.chars: color_temperature = new_state.attributes.get(ATTR_COLOR_TEMP) if ( - not self._flag[CHAR_COLOR_TEMPERATURE] - and isinstance(color_temperature, int) + isinstance(color_temperature, int) and self.char_color_temperature.value != color_temperature ): self.char_color_temperature.set_value(color_temperature) - self._flag[CHAR_COLOR_TEMPERATURE] = False # Handle Color if CHAR_SATURATION in self.chars and CHAR_HUE in self.chars: hue, saturation = new_state.attributes.get(ATTR_HS_COLOR, (None, None)) if ( - not self._flag[RGB_COLOR] - and (hue != self._hue or saturation != self._saturation) - and isinstance(hue, (int, float)) + isinstance(hue, (int, float)) and isinstance(saturation, (int, float)) + and ( + hue != self.char_hue.value + or saturation != self.char_saturation.value + ) ): self.char_hue.set_value(hue) self.char_saturation.set_value(saturation) - self._hue, self._saturation = (hue, saturation) - self._flag[RGB_COLOR] = False diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index 8834f730bcea..888ad87a848a 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -1,6 +1,9 @@ """Test different accessory types: Lights.""" from collections import namedtuple +from asynctest import patch +from pyhap.accessory_driver import AccessoryDriver +from pyhap.const import HAP_REPR_AID, HAP_REPR_CHARS, HAP_REPR_IID, HAP_REPR_VALUE import pytest from homeassistant.components.homekit.const import ATTR_VALUE @@ -30,6 +33,15 @@ from tests.common import async_mock_service from tests.components.homekit.common import patch_debounce +@pytest.fixture +def driver(): + """Patch AccessoryDriver without zeroconf or HAPServer.""" + with patch("pyhap.accessory_driver.HAPServer"), patch( + "pyhap.accessory_driver.Zeroconf" + ), patch("pyhap.accessory_driver.AccessoryDriver.persist"): + yield AccessoryDriver() + + @pytest.fixture(scope="module") def cls(): """Patch debounce decorator during import of type_lights.""" @@ -43,15 +55,16 @@ def cls(): patcher.stop() -async def test_light_basic(hass, hk_driver, cls, events): +async def test_light_basic(hass, hk_driver, cls, events, driver): """Test light with char state.""" entity_id = "light.demo" hass.states.async_set(entity_id, STATE_ON, {ATTR_SUPPORTED_FEATURES: 0}) await hass.async_block_till_done() - acc = cls.light(hass, hk_driver, "Light", entity_id, 2, None) + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) - assert acc.aid == 2 + assert acc.aid == 1 assert acc.category == 5 # Lightbulb assert acc.char_on.value == 0 @@ -75,25 +88,43 @@ async def test_light_basic(hass, hk_driver, cls, events): call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") + char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1} + ] + }, + "mock_addr", + ) + await hass.async_add_job(acc.char_on.client_update_value, 1) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] is None + assert events[-1].data[ATTR_VALUE] == "Set state to 1" hass.states.async_set(entity_id, STATE_ON) await hass.async_block_till_done() - await hass.async_add_job(acc.char_on.client_update_value, 0) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 0} + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] is None + assert events[-1].data[ATTR_VALUE] == "Set state to 0" -async def test_light_brightness(hass, hk_driver, cls, events): +async def test_light_brightness(hass, hk_driver, cls, events, driver): """Test light with brightness.""" entity_id = "light.demo" @@ -103,11 +134,14 @@ async def test_light_brightness(hass, hk_driver, cls, events): {ATTR_SUPPORTED_FEATURES: SUPPORT_BRIGHTNESS, ATTR_BRIGHTNESS: 255}, ) await hass.async_block_till_done() - acc = cls.light(hass, hk_driver, "Light", entity_id, 2, None) + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the # brightness to 100 when turning on a light on a freshly booted up server. assert acc.char_brightness.value != 0 + char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] + char_brightness_iid = acc.char_brightness.to_HAP()[HAP_REPR_IID] await hass.async_add_job(acc.run) await hass.async_block_till_done() @@ -121,34 +155,88 @@ async def test_light_brightness(hass, hk_driver, cls, events): call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") - await hass.async_add_job(acc.char_brightness.client_update_value, 20) - await hass.async_add_job(acc.char_on.client_update_value, 1) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_brightness_iid, + HAP_REPR_VALUE: 20, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_on[0] assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert call_turn_on[0].data[ATTR_BRIGHTNESS_PCT] == 20 assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == f"brightness at 20{UNIT_PERCENTAGE}" + assert ( + events[-1].data[ATTR_VALUE] + == f"Set state to 1, brightness at 20{UNIT_PERCENTAGE}" + ) - await hass.async_add_job(acc.char_on.client_update_value, 1) - await hass.async_add_job(acc.char_brightness.client_update_value, 40) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_brightness_iid, + HAP_REPR_VALUE: 40, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_on[1] assert call_turn_on[1].data[ATTR_ENTITY_ID] == entity_id assert call_turn_on[1].data[ATTR_BRIGHTNESS_PCT] == 40 assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] == f"brightness at 40{UNIT_PERCENTAGE}" + assert ( + events[-1].data[ATTR_VALUE] + == f"Set state to 1, brightness at 40{UNIT_PERCENTAGE}" + ) - await hass.async_add_job(acc.char_on.client_update_value, 1) - await hass.async_add_job(acc.char_brightness.client_update_value, 0) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_brightness_iid, + HAP_REPR_VALUE: 0, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 3 - assert events[-1].data[ATTR_VALUE] is None + assert ( + events[-1].data[ATTR_VALUE] + == f"Set state to 0, brightness at 0{UNIT_PERCENTAGE}" + ) + + # 0 is a special case for homekit, see "Handle Brightness" + # in update_state + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 0}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 1 + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 255}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 100 + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 0}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 1 -async def test_light_color_temperature(hass, hk_driver, cls, events): +async def test_light_color_temperature(hass, hk_driver, cls, events, driver): """Test light with color temperature.""" entity_id = "light.demo" @@ -158,7 +246,8 @@ async def test_light_color_temperature(hass, hk_driver, cls, events): {ATTR_SUPPORTED_FEATURES: SUPPORT_COLOR_TEMP, ATTR_COLOR_TEMP: 190}, ) await hass.async_block_till_done() - acc = cls.light(hass, hk_driver, "Light", entity_id, 2, None) + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) assert acc.char_color_temperature.value == 153 @@ -169,6 +258,20 @@ async def test_light_color_temperature(hass, hk_driver, cls, events): # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") + char_color_temperature_iid = acc.char_color_temperature.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_color_temperature_iid, + HAP_REPR_VALUE: 250, + } + ] + }, + "mock_addr", + ) await hass.async_add_job(acc.char_color_temperature.client_update_value, 250) await hass.async_block_till_done() assert call_turn_on @@ -197,7 +300,7 @@ async def test_light_color_temperature_and_rgb_color(hass, hk_driver, cls, event assert not hasattr(acc, "char_color_temperature") -async def test_light_rgb_color(hass, hk_driver, cls, events): +async def test_light_rgb_color(hass, hk_driver, cls, events, driver): """Test light with rgb_color.""" entity_id = "light.demo" @@ -207,7 +310,8 @@ async def test_light_rgb_color(hass, hk_driver, cls, events): {ATTR_SUPPORTED_FEATURES: SUPPORT_COLOR, ATTR_HS_COLOR: (260, 90)}, ) await hass.async_block_till_done() - acc = cls.light(hass, hk_driver, "Light", entity_id, 2, None) + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) assert acc.char_hue.value == 0 assert acc.char_saturation.value == 75 @@ -220,8 +324,26 @@ async def test_light_rgb_color(hass, hk_driver, cls, events): # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") - await hass.async_add_job(acc.char_hue.client_update_value, 145) - await hass.async_add_job(acc.char_saturation.client_update_value, 75) + char_hue_iid = acc.char_hue.to_HAP()[HAP_REPR_IID] + char_saturation_iid = acc.char_saturation.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_hue_iid, + HAP_REPR_VALUE: 145, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_saturation_iid, + HAP_REPR_VALUE: 75, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id @@ -230,7 +352,7 @@ async def test_light_rgb_color(hass, hk_driver, cls, events): assert events[-1].data[ATTR_VALUE] == "set color at (145, 75)" -async def test_light_restore(hass, hk_driver, cls, events): +async def test_light_restore(hass, hk_driver, cls, events, driver): """Test setting up an entity from state in the event registry.""" hass.state = CoreState.not_running @@ -250,7 +372,9 @@ async def test_light_restore(hass, hk_driver, cls, events): hass.bus.async_fire(EVENT_HOMEASSISTANT_START, {}) await hass.async_block_till_done() - acc = cls.light(hass, hk_driver, "Light", "light.simple", 2, None) + acc = cls.light(hass, hk_driver, "Light", "light.simple", 1, None) + driver.add_accessory(acc) + assert acc.category == 5 # Lightbulb assert acc.chars == [] assert acc.char_on.value == 0 @@ -259,3 +383,141 @@ async def test_light_restore(hass, hk_driver, cls, events): assert acc.category == 5 # Lightbulb assert acc.chars == ["Brightness"] assert acc.char_on.value == 0 + + +async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driver): + """Test light with all chars in one go.""" + entity_id = "light.demo" + + hass.states.async_set( + entity_id, + STATE_ON, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_BRIGHTNESS | SUPPORT_COLOR, + ATTR_BRIGHTNESS: 255, + }, + ) + await hass.async_block_till_done() + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) + + # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the + # brightness to 100 when turning on a light on a freshly booted up server. + assert acc.char_brightness.value != 0 + char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] + char_brightness_iid = acc.char_brightness.to_HAP()[HAP_REPR_IID] + char_hue_iid = acc.char_hue.to_HAP()[HAP_REPR_IID] + char_saturation_iid = acc.char_saturation.to_HAP()[HAP_REPR_IID] + + await hass.async_add_job(acc.run) + await hass.async_block_till_done() + assert acc.char_brightness.value == 100 + + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 102}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 40 + + # Set from HomeKit + call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_brightness_iid, + HAP_REPR_VALUE: 20, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_hue_iid, + HAP_REPR_VALUE: 145, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_saturation_iid, + HAP_REPR_VALUE: 75, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() + assert call_turn_on[0] + assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id + assert call_turn_on[0].data[ATTR_BRIGHTNESS_PCT] == 20 + assert call_turn_on[0].data[ATTR_HS_COLOR] == (145, 75) + + assert len(events) == 1 + assert ( + events[-1].data[ATTR_VALUE] + == f"Set state to 1, brightness at 20{UNIT_PERCENTAGE}, set color at (145, 75)" + ) + + +async def test_light_set_brightness_and_color_temp( + hass, hk_driver, cls, events, driver +): + """Test light with all chars in one go.""" + entity_id = "light.demo" + + hass.states.async_set( + entity_id, + STATE_ON, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP, + ATTR_BRIGHTNESS: 255, + }, + ) + await hass.async_block_till_done() + acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) + driver.add_accessory(acc) + + # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the + # brightness to 100 when turning on a light on a freshly booted up server. + assert acc.char_brightness.value != 0 + char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] + char_brightness_iid = acc.char_brightness.to_HAP()[HAP_REPR_IID] + char_color_temperature_iid = acc.char_color_temperature.to_HAP()[HAP_REPR_IID] + + await hass.async_add_job(acc.run) + await hass.async_block_till_done() + assert acc.char_brightness.value == 100 + + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 102}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 40 + + # Set from HomeKit + call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_brightness_iid, + HAP_REPR_VALUE: 20, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_color_temperature_iid, + HAP_REPR_VALUE: 250, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() + assert call_turn_on[0] + assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id + assert call_turn_on[0].data[ATTR_BRIGHTNESS_PCT] == 20 + assert call_turn_on[0].data[ATTR_COLOR_TEMP] == 250 + + assert len(events) == 1 + assert ( + events[-1].data[ATTR_VALUE] + == f"Set state to 1, brightness at 20{UNIT_PERCENTAGE}, color temperature at 250" + ) From 081b822d25a05b7e16c3e34e729e0ceb7459bbcc Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 2 Apr 2020 22:48:19 -0400 Subject: [PATCH 042/653] Add support for Vizio sound mode (#33200) * add sound mode support for devices that support it * make setting and unsetting flag better * move eq and audio settings into constants * fix missed statement to use constant instead of hardcoded string * further fixes based on review * bump pyvizio version to include newly identified app --- homeassistant/components/vizio/const.py | 3 ++ homeassistant/components/vizio/manifest.json | 2 +- .../components/vizio/media_player.py | 42 +++++++++++++++++-- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/vizio/conftest.py | 8 +++- tests/components/vizio/const.py | 3 ++ tests/components/vizio/test_media_player.py | 28 +++++++++++-- 8 files changed, 79 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/vizio/const.py b/homeassistant/components/vizio/const.py index 795f12266fb4..43cb993cec3f 100644 --- a/homeassistant/components/vizio/const.py +++ b/homeassistant/components/vizio/const.py @@ -63,6 +63,9 @@ SUPPORTED_COMMANDS = { ), } +VIZIO_SOUND_MODE = "eq" +VIZIO_AUDIO_SETTINGS = "audio" + # Since Vizio component relies on device class, this dict will ensure that changes to # the values of DEVICE_CLASS_SPEAKER or DEVICE_CLASS_TV don't require changes to pyvizio. VIZIO_DEVICE_CLASSES = { diff --git a/homeassistant/components/vizio/manifest.json b/homeassistant/components/vizio/manifest.json index 885cfacca415..2436ce6298b3 100644 --- a/homeassistant/components/vizio/manifest.json +++ b/homeassistant/components/vizio/manifest.json @@ -2,7 +2,7 @@ "domain": "vizio", "name": "VIZIO SmartCast", "documentation": "https://www.home-assistant.io/integrations/vizio", - "requirements": ["pyvizio==0.1.44"], + "requirements": ["pyvizio==0.1.45"], "dependencies": [], "codeowners": ["@raman325"], "config_flow": true, diff --git a/homeassistant/components/vizio/media_player.py b/homeassistant/components/vizio/media_player.py index d463ebca36a4..bb7ae3f75b05 100644 --- a/homeassistant/components/vizio/media_player.py +++ b/homeassistant/components/vizio/media_player.py @@ -9,6 +9,7 @@ from pyvizio.const import APP_HOME, APPS, INPUT_APPS, NO_APP_RUNNING, UNKNOWN_AP from homeassistant.components.media_player import ( DEVICE_CLASS_SPEAKER, + SUPPORT_SELECT_SOUND_MODE, MediaPlayerDevice, ) from homeassistant.config_entries import ConfigEntry @@ -41,7 +42,9 @@ from .const import ( DOMAIN, ICON, SUPPORTED_COMMANDS, + VIZIO_AUDIO_SETTINGS, VIZIO_DEVICE_CLASSES, + VIZIO_SOUND_MODE, ) _LOGGER = logging.getLogger(__name__) @@ -133,6 +136,8 @@ class VizioDevice(MediaPlayerDevice): self._current_input = None self._current_app = None self._current_app_config = None + self._current_sound_mode = None + self._available_sound_modes = None self._available_inputs = [] self._available_apps = [] self._conf_apps = config_entry.options.get(CONF_APPS, {}) @@ -191,17 +196,29 @@ class VizioDevice(MediaPlayerDevice): self._current_app = None self._current_app_config = None self._available_apps = None + self._current_sound_mode = None + self._available_sound_modes = None return self._state = STATE_ON - audio_settings = await self._device.get_all_audio_settings( - log_api_exception=False + audio_settings = await self._device.get_all_settings( + VIZIO_AUDIO_SETTINGS, log_api_exception=False ) if audio_settings is not None: self._volume_level = float(audio_settings["volume"]) / self._max_volume self._is_muted = audio_settings["mute"].lower() == "on" + if VIZIO_SOUND_MODE in audio_settings: + self._supported_commands |= SUPPORT_SELECT_SOUND_MODE + self._current_sound_mode = audio_settings[VIZIO_SOUND_MODE] + if self._available_sound_modes is None: + self._available_sound_modes = await self._device.get_setting_options( + VIZIO_AUDIO_SETTINGS, VIZIO_SOUND_MODE + ) + else: + self._supported_commands ^= SUPPORT_SELECT_SOUND_MODE + input_ = await self._device.get_current_input(log_api_exception=False) if input_ is not None: self._current_input = input_ @@ -367,7 +384,7 @@ class VizioDevice(MediaPlayerDevice): return self._config_entry.unique_id @property - def device_info(self): + def device_info(self) -> Dict[str, Any]: """Return device registry information.""" return { "identifiers": {(DOMAIN, self._config_entry.unique_id)}, @@ -378,10 +395,27 @@ class VizioDevice(MediaPlayerDevice): } @property - def device_class(self): + def device_class(self) -> str: """Return device class for entity.""" return self._device_class + @property + def sound_mode(self) -> Optional[str]: + """Name of the current sound mode.""" + return self._current_sound_mode + + @property + def sound_mode_list(self) -> Optional[List[str]]: + """List of available sound modes.""" + return self._available_sound_modes + + async def async_select_sound_mode(self, sound_mode): + """Select sound mode.""" + if sound_mode in self._available_sound_modes: + await self._device.set_setting( + VIZIO_AUDIO_SETTINGS, VIZIO_SOUND_MODE, sound_mode + ) + async def async_turn_on(self) -> None: """Turn the device on.""" await self._device.pow_on() diff --git a/requirements_all.txt b/requirements_all.txt index 6724b83d8b42..6ebf1213c633 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1738,7 +1738,7 @@ pyversasense==0.0.6 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.44 +pyvizio==0.1.45 # homeassistant.components.velux pyvlx==0.2.12 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 83255df57145..307113e9b182 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -650,7 +650,7 @@ pyvera==0.3.7 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.44 +pyvizio==0.1.45 # homeassistant.components.html5 pywebpush==1.9.2 diff --git a/tests/components/vizio/conftest.py b/tests/components/vizio/conftest.py index 868bf44a11ba..e630f201e121 100644 --- a/tests/components/vizio/conftest.py +++ b/tests/components/vizio/conftest.py @@ -8,7 +8,9 @@ from .const import ( APP_LIST, CH_TYPE, CURRENT_APP_CONFIG, + CURRENT_EQ, CURRENT_INPUT, + EQ_LIST, INPUT_LIST, INPUT_LIST_WITH_APPS, MODEL, @@ -135,11 +137,15 @@ def vizio_update_fixture(): "homeassistant.components.vizio.media_player.VizioAsync.can_connect_with_auth_check", return_value=True, ), patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_all_audio_settings", + "homeassistant.components.vizio.media_player.VizioAsync.get_all_settings", return_value={ "volume": int(MAX_VOLUME[DEVICE_CLASS_SPEAKER] / 2), + "eq": CURRENT_EQ, "mute": "Off", }, + ), patch( + "homeassistant.components.vizio.media_player.VizioAsync.get_setting_options", + return_value=EQ_LIST, ), patch( "homeassistant.components.vizio.media_player.VizioAsync.get_current_input", return_value=CURRENT_INPUT, diff --git a/tests/components/vizio/const.py b/tests/components/vizio/const.py index f1ddc4abba69..034fa23a3af2 100644 --- a/tests/components/vizio/const.py +++ b/tests/components/vizio/const.py @@ -64,6 +64,9 @@ class MockCompletePairingResponse(object): self.auth_token = auth_token +CURRENT_EQ = "Music" +EQ_LIST = ["Music", "Movie"] + CURRENT_INPUT = "HDMI" INPUT_LIST = ["HDMI", "USB", "Bluetooth", "AUX"] diff --git a/tests/components/vizio/test_media_player.py b/tests/components/vizio/test_media_player.py index f860c1cec4fd..7678712db515 100644 --- a/tests/components/vizio/test_media_player.py +++ b/tests/components/vizio/test_media_player.py @@ -21,11 +21,13 @@ from homeassistant.components.media_player import ( ATTR_INPUT_SOURCE, ATTR_MEDIA_VOLUME_LEVEL, ATTR_MEDIA_VOLUME_MUTED, + ATTR_SOUND_MODE, DEVICE_CLASS_SPEAKER, DEVICE_CLASS_TV, DOMAIN as MP_DOMAIN, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PREVIOUS_TRACK, + SERVICE_SELECT_SOUND_MODE, SERVICE_SELECT_SOURCE, SERVICE_TURN_OFF, SERVICE_TURN_ON, @@ -58,9 +60,11 @@ from .const import ( APP_LIST, CURRENT_APP, CURRENT_APP_CONFIG, + CURRENT_EQ, CURRENT_INPUT, CUSTOM_CONFIG, ENTITY_ID, + EQ_LIST, INPUT_LIST, INPUT_LIST_WITH_APPS, MOCK_SPEAKER_APPS_FAILURE, @@ -99,6 +103,11 @@ async def _test_setup( data=vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG), unique_id=UNIQUE_ID, ) + dict_to_return = { + "volume": int(MAX_VOLUME[vizio_device_class] / 2), + "mute": "Off", + "eq": CURRENT_EQ, + } else: vizio_device_class = VIZIO_DEVICE_CLASS_TV config_entry = MockConfigEntry( @@ -106,10 +115,17 @@ async def _test_setup( data=vol.Schema(VIZIO_SCHEMA)(MOCK_USER_VALID_TV_CONFIG), unique_id=UNIQUE_ID, ) + dict_to_return = { + "volume": int(MAX_VOLUME[vizio_device_class] / 2), + "mute": "Off", + } with patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_all_audio_settings", - return_value={"volume": int(MAX_VOLUME[vizio_device_class] / 2), "mute": "Off"}, + "homeassistant.components.vizio.media_player.VizioAsync.get_all_settings", + return_value=dict_to_return, + ), patch( + "homeassistant.components.vizio.media_player.VizioAsync.get_setting_options", + return_value=EQ_LIST, ), patch( "homeassistant.components.vizio.media_player.VizioAsync.get_power_state", return_value=vizio_power_state, @@ -130,6 +146,9 @@ async def _test_setup( assert attr["source"] == CURRENT_INPUT if ha_device_class == DEVICE_CLASS_SPEAKER: assert not service_call.called + assert "sound_mode" in attr + else: + assert "sound_mode" not in attr assert ( attr["volume_level"] == float(int(MAX_VOLUME[vizio_device_class] / 2)) @@ -149,7 +168,7 @@ async def _test_setup_with_apps( ) with patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_all_audio_settings", + "homeassistant.components.vizio.media_player.VizioAsync.get_all_settings", return_value={ "volume": int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2), "mute": "Off", @@ -351,6 +370,9 @@ async def test_services( ) await _test_service(hass, "ch_up", SERVICE_MEDIA_NEXT_TRACK, None) await _test_service(hass, "ch_down", SERVICE_MEDIA_PREVIOUS_TRACK, None) + await _test_service( + hass, "set_setting", SERVICE_SELECT_SOUND_MODE, {ATTR_SOUND_MODE: "Music"} + ) async def test_options_update( From 2065039f653e4e746d072d16152b194ce12a005b Mon Sep 17 00:00:00 2001 From: Brian Rogers Date: Thu, 2 Apr 2020 23:55:17 -0400 Subject: [PATCH 043/653] Rachio Async fixes (#33549) * Async fix * Update homeassistant/components/rachio/switch.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/rachio/switch.py Co-Authored-By: J. Nick Koston * Fix format * Remove from hass * undo dispatcher Co-authored-by: J. Nick Koston --- homeassistant/components/rachio/switch.py | 51 +++++++++++------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index 86b6097ad13f..2b9a959deb2c 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -105,17 +105,18 @@ class RachioSwitch(RachioDevice, SwitchDevice): def _poll_update(self, data=None) -> bool: """Poll the API.""" - def _handle_any_update(self, *args, **kwargs) -> None: + @callback + def _async_handle_any_update(self, *args, **kwargs) -> None: """Determine whether an update event applies to this device.""" if args[0][KEY_DEVICE_ID] != self._controller.controller_id: # For another device return # For this device - self._handle_update(args, kwargs) + self._async_handle_update(args, kwargs) @abstractmethod - def _handle_update(self, *args, **kwargs) -> None: + def _async_handle_update(self, *args, **kwargs) -> None: """Handle incoming webhook data.""" @@ -149,14 +150,15 @@ class RachioStandbySwitch(RachioSwitch): return not data[KEY_ON] - def _handle_update(self, *args, **kwargs) -> None: + @callback + def _async_handle_update(self, *args, **kwargs) -> None: """Update the state using webhook data.""" if args[0][0][KEY_SUBTYPE] == SUBTYPE_SLEEP_MODE_ON: self._state = True elif args[0][0][KEY_SUBTYPE] == SUBTYPE_SLEEP_MODE_OFF: self._state = False - self.schedule_update_ha_state() + self.async_write_ha_state() def turn_on(self, **kwargs) -> None: """Put the controller in standby mode.""" @@ -170,7 +172,9 @@ class RachioStandbySwitch(RachioSwitch): """Subscribe to updates.""" self.async_on_remove( async_dispatcher_connect( - self.hass, SIGNAL_RACHIO_CONTROLLER_UPDATE, self._handle_any_update + self.hass, + SIGNAL_RACHIO_CONTROLLER_UPDATE, + self._async_handle_any_update, ) ) @@ -192,7 +196,6 @@ class RachioZone(RachioSwitch): self._current_schedule = current_schedule super().__init__(controller, poll=False) self._state = self.zone_id == self._current_schedule.get(KEY_ZONE_ID) - self._undo_dispatcher = None def __str__(self): """Display the zone as a string.""" @@ -229,7 +232,7 @@ class RachioZone(RachioSwitch): return self._entity_picture @property - def state_attributes(self) -> dict: + def device_state_attributes(self) -> dict: """Return the optional state attributes.""" props = {ATTR_ZONE_NUMBER: self._zone_number, ATTR_ZONE_SUMMARY: self._summary} if self._shade_type: @@ -266,7 +269,8 @@ class RachioZone(RachioSwitch): self._current_schedule = self._controller.current_schedule return self.zone_id == self._current_schedule.get(KEY_ZONE_ID) - def _handle_update(self, *args, **kwargs) -> None: + @callback + def _async_handle_update(self, *args, **kwargs) -> None: """Handle incoming webhook zone data.""" if args[0][KEY_ZONE_ID] != self.zone_id: return @@ -278,19 +282,16 @@ class RachioZone(RachioSwitch): elif args[0][KEY_SUBTYPE] in [SUBTYPE_ZONE_STOPPED, SUBTYPE_ZONE_COMPLETED]: self._state = False - self.schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Subscribe to updates.""" - self._undo_dispatcher = async_dispatcher_connect( - self.hass, SIGNAL_RACHIO_ZONE_UPDATE, self._handle_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_RACHIO_ZONE_UPDATE, self._async_handle_update + ) ) - async def async_will_remove_from_hass(self): - """Unsubscribe from updates.""" - if self._undo_dispatcher: - self._undo_dispatcher() - class RachioSchedule(RachioSwitch): """Representation of one fixed schedule on the Rachio Iro.""" @@ -305,7 +306,6 @@ class RachioSchedule(RachioSwitch): self._current_schedule = current_schedule super().__init__(controller, poll=False) self._state = self._schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) - self._undo_dispatcher = None @property def name(self) -> str: @@ -354,7 +354,7 @@ class RachioSchedule(RachioSwitch): return self._schedule_id == self._current_schedule.get(KEY_SCHEDULE_ID) @callback - async def _handle_update(self, *args, **kwargs) -> None: + def _async_handle_update(self, *args, **kwargs) -> None: """Handle incoming webhook schedule data.""" # Schedule ID not passed when running individual zones, so we catch that error try: @@ -369,15 +369,12 @@ class RachioSchedule(RachioSwitch): except KeyError: pass - self.schedule_update_ha_state() + self.async_write_ha_state() async def async_added_to_hass(self): """Subscribe to updates.""" - self._undo_dispatcher = async_dispatcher_connect( - self.hass, SIGNAL_RACHIO_SCHEDULE_UPDATE, self._handle_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, SIGNAL_RACHIO_SCHEDULE_UPDATE, self._async_handle_update + ) ) - - async def async_will_remove_from_hass(self): - """Unsubscribe from updates.""" - if self._undo_dispatcher: - self._undo_dispatcher() From d98171ed05e68de1bf8e5a38b37b42c1e014375d Mon Sep 17 00:00:00 2001 From: jjlawren Date: Thu, 2 Apr 2020 23:02:27 -0500 Subject: [PATCH 044/653] Plex followup to #33542 (#33558) --- homeassistant/components/plex/const.py | 3 +++ homeassistant/components/plex/media_player.py | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/plex/const.py b/homeassistant/components/plex/const.py index d5cb3db3aba7..44bb25b3fd98 100644 --- a/homeassistant/components/plex/const.py +++ b/homeassistant/components/plex/const.py @@ -38,3 +38,6 @@ X_PLEX_DEVICE_NAME = "Home Assistant" X_PLEX_PLATFORM = "Home Assistant" X_PLEX_PRODUCT = "Home Assistant" X_PLEX_VERSION = __version__ + +COMMAND_MEDIA_TYPE_MUSIC = "music" +COMMAND_MEDIA_TYPE_VIDEO = "video" diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index 5325544bf15a..aea8ecadaff2 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -11,7 +11,6 @@ from homeassistant.components.media_player.const import ( MEDIA_TYPE_MOVIE, MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, - MEDIA_TYPE_VIDEO, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PLAY, @@ -28,6 +27,8 @@ from homeassistant.helpers.entity_registry import async_get_registry from homeassistant.util import dt as dt_util from .const import ( + COMMAND_MEDIA_TYPE_MUSIC, + COMMAND_MEDIA_TYPE_VIDEO, COMMON_PLAYERS, CONF_SERVER_IDENTIFIER, DISPATCHERS, @@ -576,11 +577,11 @@ class PlexMediaPlayer(MediaPlayerDevice): shuffle = src.get("shuffle", 0) media = None - command_media_type = MEDIA_TYPE_VIDEO + command_media_type = COMMAND_MEDIA_TYPE_VIDEO if media_type == "MUSIC": media = self._get_music_media(library, src) - command_media_type = MEDIA_TYPE_MUSIC + command_media_type = COMMAND_MEDIA_TYPE_MUSIC elif media_type == "EPISODE": media = self._get_tv_media(library, src) elif media_type == "PLAYLIST": From d2cd5575234fe538000665ed34e5c84612af38e0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 2 Apr 2020 23:02:50 -0500 Subject: [PATCH 045/653] Add missing flow_title to doorbird (#33557) When placeholders are in use, flow_title needs to be set in the json to prevent an empty name in the integrations dashboard. This affected doorbirds that were found via ssdp. --- homeassistant/components/doorbird/.translations/en.json | 5 +++-- homeassistant/components/doorbird/strings.json | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/doorbird/.translations/en.json b/homeassistant/components/doorbird/.translations/en.json index 27c16fac3a17..f933b9c99295 100644 --- a/homeassistant/components/doorbird/.translations/en.json +++ b/homeassistant/components/doorbird/.translations/en.json @@ -21,7 +21,8 @@ "title": "Connect to the DoorBird" } }, - "title": "DoorBird" + "title": "DoorBird", + "flow_title" : "DoorBird {name} ({host})" }, "options": { "step": { @@ -33,4 +34,4 @@ } } } -} \ No newline at end of file +} diff --git a/homeassistant/components/doorbird/strings.json b/homeassistant/components/doorbird/strings.json index 9b2c95dd7c98..e4fb72db91ba 100644 --- a/homeassistant/components/doorbird/strings.json +++ b/homeassistant/components/doorbird/strings.json @@ -27,6 +27,7 @@ "not_doorbird_device": "This device is not a DoorBird" }, "title" : "DoorBird", + "flow_title" : "DoorBird {name} ({host})", "error" : { "invalid_auth" : "Invalid authentication", "unknown" : "Unexpected error", From 83cc871edfb49850e686e65969c28e3004a05ea6 Mon Sep 17 00:00:00 2001 From: akasma74 Date: Fri, 3 Apr 2020 07:48:41 +0100 Subject: [PATCH 046/653] Add force_update to timer integration (#31646) * force_update added As per this discussion we need to update last_changed when active timer restarted. One way to do that is to force HA update the state on each request even if it remains the same. More details here - https://github.com/home-assistant/architecture/issues/345 * add test for force_update make sure state_change event fired every time timer (re)started * remove whitespaces * remove whitespace * Update tests/components/timer/test_init.py Co-Authored-By: Alexei Chetroi * fix lint * fix isort Co-authored-by: Alexei Chetroi --- homeassistant/components/timer/__init__.py | 5 +++ tests/components/timer/test_init.py | 42 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/homeassistant/components/timer/__init__.py b/homeassistant/components/timer/__init__.py index 5172322a63d2..e47ac69be5bd 100644 --- a/homeassistant/components/timer/__init__.py +++ b/homeassistant/components/timer/__init__.py @@ -201,6 +201,11 @@ class Timer(RestoreEntity): """If entity should be polled.""" return False + @property + def force_update(self) -> bool: + """Return True to fix restart issues.""" + return True + @property def name(self): """Return name of the timer.""" diff --git a/tests/components/timer/test_init.py b/tests/components/timer/test_init.py index dcf9c36474fc..dea116b3905a 100644 --- a/tests/components/timer/test_init.py +++ b/tests/components/timer/test_init.py @@ -33,6 +33,7 @@ from homeassistant.const import ( ATTR_ID, ATTR_NAME, CONF_ENTITY_ID, + EVENT_STATE_CHANGED, SERVICE_RELOAD, ) from homeassistant.core import Context, CoreState @@ -406,6 +407,47 @@ async def test_timer_restarted_event(hass): assert len(results) == 4 +async def test_state_changed_when_timer_restarted(hass): + """Ensure timer's state changes when it restarted.""" + hass.state = CoreState.starting + + await async_setup_component(hass, DOMAIN, {DOMAIN: {"test1": {CONF_DURATION: 10}}}) + + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_IDLE + + results = [] + + def fake_event_listener(event): + """Fake event listener for trigger.""" + results.append(event) + + hass.bus.async_listen(EVENT_STATE_CHANGED, fake_event_listener) + + await hass.services.async_call( + DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_ACTIVE + + assert results[-1].event_type == EVENT_STATE_CHANGED + assert len(results) == 1 + + await hass.services.async_call( + DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_ACTIVE + + assert results[-1].event_type == EVENT_STATE_CHANGED + assert len(results) == 2 + + async def test_load_from_storage(hass, storage_setup): """Test set up from storage.""" assert await storage_setup() From aef06a35448935693ac02ddbb13667c5bd066710 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Apr 2020 00:34:50 -0700 Subject: [PATCH 047/653] Directly call write state 2 (#33513) * Directly call async_write_ha_state pt2 * Directly call async_write_ha_state pt2 * Fix mock * Address comments --- homeassistant/components/aftership/sensor.py | 2 +- homeassistant/components/alert/__init__.py | 10 +++---- .../components/anthemav/media_player.py | 12 ++++++++- .../components/automation/__init__.py | 2 +- homeassistant/components/buienradar/sensor.py | 10 ++++++- homeassistant/components/buienradar/util.py | 13 ++++----- homeassistant/components/camera/__init__.py | 2 +- .../components/device_tracker/legacy.py | 6 ++--- homeassistant/components/dsmr/sensor.py | 27 +++++++++++++------ .../components/generic_thermostat/climate.py | 6 ++--- homeassistant/components/group/__init__.py | 4 +-- homeassistant/components/imap/sensor.py | 4 +-- .../components/input_boolean/__init__.py | 4 +-- homeassistant/components/knx/binary_sensor.py | 2 +- homeassistant/components/knx/climate.py | 8 +++--- homeassistant/components/knx/cover.py | 2 +- homeassistant/components/knx/light.py | 2 +- homeassistant/components/knx/sensor.py | 2 +- homeassistant/components/knx/switch.py | 2 +- homeassistant/components/lcn/cover.py | 12 ++++----- homeassistant/components/lcn/light.py | 8 +++--- homeassistant/components/lcn/switch.py | 8 +++--- homeassistant/components/lifx/light.py | 4 +-- .../components/microsoft_face/__init__.py | 6 ++--- homeassistant/components/netio/switch.py | 3 +-- .../components/owntracks/messages.py | 2 +- homeassistant/components/rflink/__init__.py | 2 +- homeassistant/components/saj/sensor.py | 13 +++------ homeassistant/components/script/__init__.py | 2 +- homeassistant/components/sma/sensor.py | 11 +++----- .../components/songpal/media_player.py | 8 +++--- .../components/utility_meter/__init__.py | 4 +-- .../components/utility_meter/sensor.py | 4 +-- homeassistant/components/velux/cover.py | 2 +- homeassistant/components/yr/sensor.py | 13 +++++---- homeassistant/components/zwave/node_entity.py | 2 +- homeassistant/helpers/entity_platform.py | 2 +- homeassistant/helpers/script.py | 6 +---- tests/components/zwave/test_node_entity.py | 7 ++--- tests/helpers/test_entity_component.py | 5 ++-- 40 files changed, 127 insertions(+), 117 deletions(-) diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index 293fe4c647a2..9b8a5637de20 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -154,7 +154,7 @@ class AfterShipSensor(Entity): async def _force_update(self): """Force update of data.""" await self.async_update(no_throttle=True) - await self.async_update_ha_state() + self.async_write_ha_state() @Throttle(MIN_TIME_BETWEEN_UPDATES) async def async_update(self, **kwargs): diff --git a/homeassistant/components/alert/__init__.py b/homeassistant/components/alert/__init__.py index 1f8176968d80..aa8d19dc40fe 100644 --- a/homeassistant/components/alert/__init__.py +++ b/homeassistant/components/alert/__init__.py @@ -1,5 +1,4 @@ """Support for repeating alerts when conditions are met.""" -import asyncio from datetime import timedelta import logging @@ -144,9 +143,8 @@ async def async_setup(hass, config): DOMAIN, SERVICE_TOGGLE, async_handle_alert_service, schema=ALERT_SERVICE_SCHEMA ) - tasks = [alert.async_update_ha_state() for alert in entities] - if tasks: - await asyncio.wait(tasks) + for alert in entities: + alert.async_write_ha_state() return True @@ -318,13 +316,13 @@ class Alert(ToggleEntity): """Async Unacknowledge alert.""" _LOGGER.debug("Reset Alert: %s", self._name) self._ack = False - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Async Acknowledge alert.""" _LOGGER.debug("Acknowledged Alert: %s", self._name) self._ack = True - await self.async_update_ha_state() + self.async_write_ha_state() async def async_toggle(self, **kwargs): """Async toggle alert.""" diff --git a/homeassistant/components/anthemav/media_player.py b/homeassistant/components/anthemav/media_player.py index f4efd0de3552..b7df82961c79 100644 --- a/homeassistant/components/anthemav/media_player.py +++ b/homeassistant/components/anthemav/media_player.py @@ -22,6 +22,10 @@ from homeassistant.const import ( ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.dispatcher import ( + async_dispatcher_connect, + async_dispatcher_send, +) _LOGGER = logging.getLogger(__name__) @@ -60,7 +64,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= def async_anthemav_update_callback(message): """Receive notification from transport that new data exists.""" _LOGGER.debug("Received update callback from AVR: %s", message) - hass.async_create_task(device.async_update_ha_state()) + async_dispatcher_send(hass, DOMAIN) avr = await anthemav.Connection.create( host=host, port=port, update_callback=async_anthemav_update_callback @@ -87,6 +91,12 @@ class AnthemAVR(MediaPlayerDevice): def _lookup(self, propname, dval=None): return getattr(self.avr.protocol, propname, dval) + async def async_added_to_hass(self): + """When entity is added to hass.""" + self.async_on_remove( + async_dispatcher_connect(self.hass, DOMAIN, self.async_write_ha_state) + ) + @property def supported_features(self): """Flag media player features that are supported.""" diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index c19a0033f863..76fe619cc1cc 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -389,7 +389,7 @@ class AutomationEntity(ToggleEntity, RestoreEntity): pass self._last_triggered = utcnow() - await self.async_update_ha_state() + self.async_write_ha_state() async def async_will_remove_from_hass(self): """Remove listeners when removing automation from Home Assistant.""" diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index 5d709ab1e63f..afa5013b339e 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -33,6 +33,7 @@ from homeassistant.const import ( TIME_HOURS, UNIT_PERCENTAGE, ) +from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import dt as dt_util @@ -260,7 +261,14 @@ class BrSensor(Entity): self.type, ) - def load_data(self, data): + @callback + def data_updated(self, data): + """Update data.""" + if self._load_data(data) and self.hass: + self.async_write_ha_state() + + @callback + def _load_data(self, data): """Load the sensor with relevant data.""" # Find sensor diff --git a/homeassistant/components/buienradar/util.py b/homeassistant/components/buienradar/util.py index 7d16f072b98e..900b1caaf979 100644 --- a/homeassistant/components/buienradar/util.py +++ b/homeassistant/components/buienradar/util.py @@ -67,15 +67,12 @@ class BrData: async def update_devices(self): """Update all devices/sensors.""" - if self.devices: - tasks = [] - # Update all devices - for dev in self.devices: - if dev.load_data(self.data): - tasks.append(dev.async_update_ha_state()) + if not self.devices: + return - if tasks: - await asyncio.wait(tasks) + # Update all devices + for dev in self.devices: + dev.data_updated(self.data) async def schedule_update(self, minute=1): """Schedule an update after minute minutes.""" diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 6bbf30b000e9..0fc3e55a5876 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -271,7 +271,7 @@ async def async_setup(hass, config): """Update tokens of the entities.""" for entity in component.entities: entity.async_update_token() - hass.async_create_task(entity.async_update_ha_state()) + entity.async_write_ha_state() hass.helpers.event.async_track_time_interval(update_tokens, TOKEN_CHANGE_INTERVAL) diff --git a/homeassistant/components/device_tracker/legacy.py b/homeassistant/components/device_tracker/legacy.py index 515b7cbc6141..3157a00aa9f0 100644 --- a/homeassistant/components/device_tracker/legacy.py +++ b/homeassistant/components/device_tracker/legacy.py @@ -175,7 +175,7 @@ class DeviceTracker: consider_home, ) if device.track: - await device.async_update_ha_state() + device.async_write_ha_state() return # Guard from calling see on entity registry entities. @@ -212,7 +212,7 @@ class DeviceTracker: ) if device.track: - await device.async_update_ha_state() + device.async_write_ha_state() self.hass.bus.async_fire( EVENT_NEW_DEVICE, @@ -259,7 +259,7 @@ class DeviceTracker: async def async_init_single_device(dev): """Init a single device_tracker entity.""" await dev.async_added_to_hass() - await dev.async_update_ha_state() + dev.async_write_ha_state() tasks = [] for device in self.devices.values(): diff --git a/homeassistant/components/dsmr/sensor.py b/homeassistant/components/dsmr/sensor.py index 257407bb7638..484bd708489c 100644 --- a/homeassistant/components/dsmr/sensor.py +++ b/homeassistant/components/dsmr/sensor.py @@ -15,8 +15,12 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_STOP, TIME_HOURS, ) -from homeassistant.core import CoreState -import homeassistant.helpers.config_validation as cv +from homeassistant.core import CoreState, callback +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.dispatcher import ( + async_dispatcher_connect, + async_dispatcher_send, +) from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) @@ -109,12 +113,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= async_add_entities(devices) - def update_entities_telegram(telegram): - """Update entities with latest telegram and trigger state update.""" - # Make all device entities aware of new telegram - for device in devices: - device.telegram = telegram - hass.async_create_task(device.async_update_ha_state()) + update_entities_telegram = partial(async_dispatcher_send, hass, DOMAIN) # Creates an asyncio.Protocol factory for reading DSMR telegrams from # serial and calls update_entities_telegram to update entities on arrival @@ -188,6 +187,18 @@ class DSMREntity(Entity): self._config = config self.telegram = {} + async def async_added_to_hass(self): + """When entity is added to hass.""" + self.async_on_remove( + async_dispatcher_connect(self.hass, DOMAIN, self.update_data) + ) + + @callback + def update_data(self, telegram): + """Update data.""" + self.telegram = telegram + self.async_write_ha_state() + def get_dsmr_object_attr(self, attribute): """Read attribute from last received telegram for this DSMR object.""" # Make sure telegram contains an object for this entities obis diff --git a/homeassistant/components/generic_thermostat/climate.py b/homeassistant/components/generic_thermostat/climate.py index 09af5ad5c44f..9a8d61772148 100644 --- a/homeassistant/components/generic_thermostat/climate.py +++ b/homeassistant/components/generic_thermostat/climate.py @@ -334,7 +334,7 @@ class GenericThermostat(ClimateDevice, RestoreEntity): return self._target_temp = temperature await self._async_control_heating(force=True) - await self.async_update_ha_state() + self.async_write_ha_state() @property def min_temp(self): @@ -361,7 +361,7 @@ class GenericThermostat(ClimateDevice, RestoreEntity): self._async_update_temp(new_state) await self._async_control_heating() - await self.async_update_ha_state() + self.async_write_ha_state() @callback def _async_switch_changed(self, entity_id, old_state, new_state): @@ -468,4 +468,4 @@ class GenericThermostat(ClimateDevice, RestoreEntity): self._target_temp = self._saved_target_temp await self._async_control_heating(force=True) - await self.async_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index f8a10017cab1..53ce1c0634b9 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -289,7 +289,7 @@ async def async_setup(hass, config): need_update = True if need_update: - await group.async_update_ha_state() + group.async_write_ha_state() return @@ -538,7 +538,7 @@ class Group(Entity): return self._async_update_group_state(new_state) - await self.async_update_ha_state() + self.async_write_ha_state() @property def _tracking_states(self): diff --git a/homeassistant/components/imap/sensor.py b/homeassistant/components/imap/sensor.py index ceef8acf7c3f..a824d5f8ee9c 100644 --- a/homeassistant/components/imap/sensor.py +++ b/homeassistant/components/imap/sensor.py @@ -130,7 +130,7 @@ class ImapSensor(Entity): try: if await self.connection(): await self.refresh_email_count() - await self.async_update_ha_state() + self.async_write_ha_state() idle = await self._connection.idle_start() await self._connection.wait_server_push() @@ -138,7 +138,7 @@ class ImapSensor(Entity): with async_timeout.timeout(10): await idle else: - await self.async_update_ha_state() + self.async_write_ha_state() except (AioImapException, asyncio.TimeoutError): self.disconnected() diff --git a/homeassistant/components/input_boolean/__init__.py b/homeassistant/components/input_boolean/__init__.py index 603aa8261230..88fe94eac48a 100644 --- a/homeassistant/components/input_boolean/__init__.py +++ b/homeassistant/components/input_boolean/__init__.py @@ -198,12 +198,12 @@ class InputBoolean(ToggleEntity, RestoreEntity): async def async_turn_on(self, **kwargs): """Turn the entity on.""" self._state = True - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the entity off.""" self._state = False - await self.async_update_ha_state() + self.async_write_ha_state() async def async_update_config(self, config: typing.Dict) -> None: """Handle when the config is updated.""" diff --git a/homeassistant/components/knx/binary_sensor.py b/homeassistant/components/knx/binary_sensor.py index 94a171d9c2a7..95e7e2cc400f 100644 --- a/homeassistant/components/knx/binary_sensor.py +++ b/homeassistant/components/knx/binary_sensor.py @@ -116,7 +116,7 @@ class KNXBinarySensor(BinarySensorDevice): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/knx/climate.py b/homeassistant/components/knx/climate.py index 554ae59f3972..919a20d0e4c7 100644 --- a/homeassistant/components/knx/climate.py +++ b/homeassistant/components/knx/climate.py @@ -210,7 +210,7 @@ class KNXClimate(ClimateDevice): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) self.device.mode.register_device_updated_cb(after_update_callback) @@ -266,7 +266,7 @@ class KNXClimate(ClimateDevice): if temperature is None: return await self.device.set_target_temperature(temperature) - await self.async_update_ha_state() + self.async_write_ha_state() @property def hvac_mode(self) -> Optional[str]: @@ -304,7 +304,7 @@ class KNXClimate(ClimateDevice): elif self.device.mode.supports_operation_mode: knx_operation_mode = HVACOperationMode(OPERATION_MODES_INV.get(hvac_mode)) await self.device.mode.set_operation_mode(knx_operation_mode) - await self.async_update_ha_state() + self.async_write_ha_state() @property def preset_mode(self) -> Optional[str]: @@ -334,4 +334,4 @@ class KNXClimate(ClimateDevice): if self.device.mode.supports_operation_mode: knx_operation_mode = HVACOperationMode(PRESET_MODES_INV.get(preset_mode)) await self.device.mode.set_operation_mode(knx_operation_mode) - await self.async_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/knx/cover.py b/homeassistant/components/knx/cover.py index 3c67e2fd5589..5c4aa762b5c2 100644 --- a/homeassistant/components/knx/cover.py +++ b/homeassistant/components/knx/cover.py @@ -108,7 +108,7 @@ class KNXCover(CoverDevice): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/knx/light.py b/homeassistant/components/knx/light.py index 6eb539c19ce4..efd1a74f5a2e 100644 --- a/homeassistant/components/knx/light.py +++ b/homeassistant/components/knx/light.py @@ -154,7 +154,7 @@ class KNXLight(Light): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/knx/sensor.py b/homeassistant/components/knx/sensor.py index a0a0f6ea18d0..2679170b03dd 100644 --- a/homeassistant/components/knx/sensor.py +++ b/homeassistant/components/knx/sensor.py @@ -69,7 +69,7 @@ class KNXSensor(Entity): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/knx/switch.py b/homeassistant/components/knx/switch.py index e9a0df5c9836..ae798bf4c082 100644 --- a/homeassistant/components/knx/switch.py +++ b/homeassistant/components/knx/switch.py @@ -65,7 +65,7 @@ class KNXSwitch(SwitchDevice): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.device.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/lcn/cover.py b/homeassistant/components/lcn/cover.py index ba831c3a1a92..61ae05fa010d 100644 --- a/homeassistant/components/lcn/cover.py +++ b/homeassistant/components/lcn/cover.py @@ -74,21 +74,21 @@ class LcnOutputsCover(LcnDevice, CoverDevice): state = pypck.lcn_defs.MotorStateModifier.DOWN self.address_connection.control_motors_outputs(state) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_open_cover(self, **kwargs): """Open the cover.""" self._closed = False state = pypck.lcn_defs.MotorStateModifier.UP self.address_connection.control_motors_outputs(state, self.reverse_time) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_stop_cover(self, **kwargs): """Stop the cover.""" self._closed = None state = pypck.lcn_defs.MotorStateModifier.STOP self.address_connection.control_motors_outputs(state, self.reverse_time) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set cover states when LCN input object (command) is received.""" @@ -140,7 +140,7 @@ class LcnRelayCover(LcnDevice, CoverDevice): states = [pypck.lcn_defs.MotorStateModifier.NOCHANGE] * 4 states[self.motor.value] = pypck.lcn_defs.MotorStateModifier.DOWN self.address_connection.control_motors_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_open_cover(self, **kwargs): """Open the cover.""" @@ -148,7 +148,7 @@ class LcnRelayCover(LcnDevice, CoverDevice): states = [pypck.lcn_defs.MotorStateModifier.NOCHANGE] * 4 states[self.motor.value] = pypck.lcn_defs.MotorStateModifier.UP self.address_connection.control_motors_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_stop_cover(self, **kwargs): """Stop the cover.""" @@ -156,7 +156,7 @@ class LcnRelayCover(LcnDevice, CoverDevice): states = [pypck.lcn_defs.MotorStateModifier.NOCHANGE] * 4 states[self.motor.value] = pypck.lcn_defs.MotorStateModifier.STOP self.address_connection.control_motors_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set cover states when LCN input object (command) is received.""" diff --git a/homeassistant/components/lcn/light.py b/homeassistant/components/lcn/light.py index 40a592f89c92..7f1cd547c02c 100644 --- a/homeassistant/components/lcn/light.py +++ b/homeassistant/components/lcn/light.py @@ -102,7 +102,7 @@ class LcnOutputLight(LcnDevice, Light): transition = self._transition self.address_connection.dim_output(self.output.value, percent, transition) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the entity off.""" @@ -117,7 +117,7 @@ class LcnOutputLight(LcnDevice, Light): self._is_dimming_to_zero = bool(transition) self.address_connection.dim_output(self.output.value, 0, transition) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set light state when LCN input object (command) is received.""" @@ -164,7 +164,7 @@ class LcnRelayLight(LcnDevice, Light): states[self.output.value] = pypck.lcn_defs.RelayStateModifier.ON self.address_connection.control_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the entity off.""" @@ -174,7 +174,7 @@ class LcnRelayLight(LcnDevice, Light): states[self.output.value] = pypck.lcn_defs.RelayStateModifier.OFF self.address_connection.control_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set light state when LCN input object (command) is received.""" diff --git a/homeassistant/components/lcn/switch.py b/homeassistant/components/lcn/switch.py index b0e16e412b32..a2adda95b3b0 100644 --- a/homeassistant/components/lcn/switch.py +++ b/homeassistant/components/lcn/switch.py @@ -59,13 +59,13 @@ class LcnOutputSwitch(LcnDevice, SwitchDevice): """Turn the entity on.""" self._is_on = True self.address_connection.dim_output(self.output.value, 100, 0) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the entity off.""" self._is_on = False self.address_connection.dim_output(self.output.value, 0, 0) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set switch state when LCN input object (command) is received.""" @@ -107,7 +107,7 @@ class LcnRelaySwitch(LcnDevice, SwitchDevice): states = [pypck.lcn_defs.RelayStateModifier.NOCHANGE] * 8 states[self.output.value] = pypck.lcn_defs.RelayStateModifier.ON self.address_connection.control_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Turn the entity off.""" @@ -116,7 +116,7 @@ class LcnRelaySwitch(LcnDevice, SwitchDevice): states = [pypck.lcn_defs.RelayStateModifier.NOCHANGE] * 8 states[self.output.value] = pypck.lcn_defs.RelayStateModifier.OFF self.address_connection.control_relays(states) - await self.async_update_ha_state() + self.async_write_ha_state() def input_received(self, input_obj): """Set switch state when LCN input object (command) is received.""" diff --git a/homeassistant/components/lifx/light.py b/homeassistant/components/lifx/light.py index 5bc0c1bc53b1..e5bbe88edfb8 100644 --- a/homeassistant/components/lifx/light.py +++ b/homeassistant/components/lifx/light.py @@ -435,7 +435,7 @@ class LIFXManager: entity = self.entities[bulb.mac_addr] _LOGGER.debug("%s unregister", entity.who) entity.registered = False - self.hass.async_create_task(entity.async_update_ha_state()) + entity.async_write_ha_state() class AwaitAioLIFX: @@ -573,7 +573,7 @@ class LIFXLight(Light): """Request new status and push it to hass.""" self.postponed_update = None await self.async_update() - await self.async_update_ha_state() + self.async_write_ha_state() async def update_during_transition(self, when): """Update state at the start and end of a transition.""" diff --git a/homeassistant/components/microsoft_face/__init__.py b/homeassistant/components/microsoft_face/__init__.py index 1bc9c116cda0..16b25e4f85de 100644 --- a/homeassistant/components/microsoft_face/__init__.py +++ b/homeassistant/components/microsoft_face/__init__.py @@ -96,7 +96,7 @@ async def async_setup(hass, config): face.store[g_id] = {} entities[g_id] = MicrosoftFaceGroupEntity(hass, face, g_id, name) - await entities[g_id].async_update_ha_state() + entities[g_id].async_write_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't create group '%s' with error: %s", g_id, err) @@ -145,7 +145,7 @@ async def async_setup(hass, config): ) face.store[g_id][name] = user_data["personId"] - await entities[g_id].async_update_ha_state() + entities[g_id].async_write_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't create person '%s' with error: %s", name, err) @@ -163,7 +163,7 @@ async def async_setup(hass, config): await face.call_api("delete", f"persongroups/{g_id}/persons/{p_id}") face.store[g_id].pop(name) - await entities[g_id].async_update_ha_state() + entities[g_id].async_write_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't delete person '%s' with error: %s", p_id, err) diff --git a/homeassistant/components/netio/switch.py b/homeassistant/components/netio/switch.py index 4c9b6343f2b9..6baa3a63f9fa 100644 --- a/homeassistant/components/netio/switch.py +++ b/homeassistant/components/netio/switch.py @@ -92,7 +92,6 @@ class NetioApiView(HomeAssistantView): @callback def get(self, request, host): """Request handler.""" - hass = request.app["hass"] data = request.query states, consumptions, cumulated_consumptions, start_dates = [], [], [], [] @@ -121,7 +120,7 @@ class NetioApiView(HomeAssistantView): ndev.start_dates = start_dates for dev in DEVICES[host].entities: - hass.async_create_task(dev.async_update_ha_state()) + dev.async_write_ha_state() return self.json(True) diff --git a/homeassistant/components/owntracks/messages.py b/homeassistant/components/owntracks/messages.py index 42f1f62d10a9..8814c8968a03 100644 --- a/homeassistant/components/owntracks/messages.py +++ b/homeassistant/components/owntracks/messages.py @@ -314,7 +314,7 @@ async def async_handle_waypoint(hass, name_base, waypoint): ) zone.hass = hass zone.entity_id = entity_id - await zone.async_update_ha_state() + zone.async_write_ha_state() @HANDLERS.register("waypoint") diff --git a/homeassistant/components/rflink/__init__.py b/homeassistant/components/rflink/__init__.py index b33f2623b9d6..76b225bd93ac 100644 --- a/homeassistant/components/rflink/__init__.py +++ b/homeassistant/components/rflink/__init__.py @@ -498,7 +498,7 @@ class RflinkCommand(RflinkDevice): await self._async_send_command(cmd, self._signal_repetitions) # Update state of entity - await self.async_update_ha_state() + self.async_write_ha_state() def cancel_queued_send_commands(self): """Cancel queued signal repetition commands. diff --git a/homeassistant/components/saj/sensor.py b/homeassistant/components/saj/sensor.py index 55c2371aabbf..fb0df36d4cb4 100644 --- a/homeassistant/components/saj/sensor.py +++ b/homeassistant/components/saj/sensor.py @@ -1,5 +1,4 @@ """SAJ solar inverter interface.""" -import asyncio from datetime import date import logging @@ -100,8 +99,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= async def async_saj(): """Update all the SAJ sensors.""" - tasks = [] - values = await saj.read(sensor_def) for sensor in hass_sensors: @@ -118,11 +115,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= not sensor.per_day_basis and not sensor.per_total_basis ): state_unknown = True - task = sensor.async_update_values(unknown_state=state_unknown) - if task: - tasks.append(task) - if tasks: - await asyncio.wait(tasks) + sensor.async_update_values(unknown_state=state_unknown) + return values def start_update_interval(event): @@ -237,7 +231,8 @@ class SAJsensor(Entity): update = True self._state = None - return self.async_update_ha_state() if update else None + if update: + self.async_write_ha_state() @property def unique_id(self): diff --git a/homeassistant/components/script/__init__.py b/homeassistant/components/script/__init__.py index 9384c58db817..6efd4c849aa5 100644 --- a/homeassistant/components/script/__init__.py +++ b/homeassistant/components/script/__init__.py @@ -243,7 +243,7 @@ class ScriptEntity(ToggleEntity): self.icon = icon self.entity_id = ENTITY_ID_FORMAT.format(object_id) self.script = Script( - hass, sequence, name, self.async_update_ha_state, logger=_LOGGER + hass, sequence, name, self.async_write_ha_state, logger=_LOGGER ) @property diff --git a/homeassistant/components/sma/sensor.py b/homeassistant/components/sma/sensor.py index 40ec4179cd1c..e5afa272c40e 100644 --- a/homeassistant/components/sma/sensor.py +++ b/homeassistant/components/sma/sensor.py @@ -1,5 +1,4 @@ """SMA Solar Webconnect interface.""" -import asyncio from datetime import timedelta import logging @@ -163,13 +162,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= return backoff_step = 0 - tasks = [] for sensor in hass_sensors: - task = sensor.async_update_values() - if task: - tasks.append(task) - if tasks: - await asyncio.wait(tasks) + sensor.async_update_values() interval = config.get(CONF_SCAN_INTERVAL) or timedelta(seconds=5) async_track_time_interval(hass, async_sma, interval) @@ -226,7 +220,8 @@ class SMAsensor(Entity): update = True self._state = self._sensor.value - return self.async_update_ha_state() if update else None + if update: + self.async_write_ha_state() @property def unique_id(self): diff --git a/homeassistant/components/songpal/media_player.py b/homeassistant/components/songpal/media_player.py index 27a81b2a667d..d11ff84a73ca 100644 --- a/homeassistant/components/songpal/media_player.py +++ b/homeassistant/components/songpal/media_player.py @@ -159,21 +159,21 @@ class SongpalDevice(MediaPlayerDevice): _LOGGER.debug("Volume changed: %s", volume) self._volume = volume.volume self._is_muted = volume.mute - await self.async_update_ha_state() + self.async_write_ha_state() async def _source_changed(content: ContentChange): _LOGGER.debug("Source changed: %s", content) if content.is_input: self._active_source = self._sources[content.source] _LOGGER.debug("New active source: %s", self._active_source) - await self.async_update_ha_state() + self.async_write_ha_state() else: _LOGGER.debug("Got non-handled content change: %s", content) async def _power_changed(power: PowerChange): _LOGGER.debug("Power changed: %s", power) self._state = power.status - await self.async_update_ha_state() + self.async_write_ha_state() async def _try_reconnect(connect: ConnectChange): _LOGGER.error( @@ -181,7 +181,7 @@ class SongpalDevice(MediaPlayerDevice): ) self._available = False self.dev.clear_notification_callbacks() - await self.async_update_ha_state() + self.async_write_ha_state() # Try to reconnect forever, a successful reconnect will initialize # the websocket connection again. diff --git a/homeassistant/components/utility_meter/__init__.py b/homeassistant/components/utility_meter/__init__.py index ef9d9b1ddcee..24bfd77f762f 100644 --- a/homeassistant/components/utility_meter/__init__.py +++ b/homeassistant/components/utility_meter/__init__.py @@ -184,11 +184,11 @@ class TariffSelect(RestoreEntity): ) return self._current_tariff = tariff - await self.async_update_ha_state() + self.async_write_ha_state() async def async_next_tariff(self): """Offset current index.""" current_index = self._tariffs.index(self._current_tariff) new_index = (current_index + 1) % len(self._tariffs) self._current_tariff = self._tariffs[new_index] - await self.async_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index ad1b27f1fe09..c891c698cf6f 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -217,7 +217,7 @@ class UtilityMeterSensor(RestoreEntity): self._last_reset = dt_util.now() self._last_period = str(self._state) self._state = 0 - await self.async_update_ha_state() + self.async_write_ha_state() async def async_calibrate(self, value): """Calibrate the Utility Meter with a given value.""" @@ -253,7 +253,7 @@ class UtilityMeterSensor(RestoreEntity): self._unit_of_measurement = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) self._last_period = state.attributes.get(ATTR_LAST_PERIOD) self._last_reset = state.attributes.get(ATTR_LAST_RESET) - await self.async_update_ha_state() + self.async_write_ha_state() if state.attributes.get(ATTR_STATUS) == PAUSED: # Fake cancellation function to init the meter paused self._collecting = lambda: None diff --git a/homeassistant/components/velux/cover.py b/homeassistant/components/velux/cover.py index c9b4aa53fe52..fe5b1dcf3afc 100644 --- a/homeassistant/components/velux/cover.py +++ b/homeassistant/components/velux/cover.py @@ -38,7 +38,7 @@ class VeluxCover(CoverDevice): async def after_update_callback(device): """Call after device was updated.""" - await self.async_update_ha_state() + self.async_write_ha_state() self.node.register_device_updated_cb(after_update_callback) diff --git a/homeassistant/components/yr/sensor.py b/homeassistant/components/yr/sensor.py index c6aaeea7ac9a..9955a650cd36 100644 --- a/homeassistant/components/yr/sensor.py +++ b/homeassistant/components/yr/sensor.py @@ -96,11 +96,13 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= dev = [] for sensor_type in config[CONF_MONITORED_CONDITIONS]: dev.append(YrSensor(name, sensor_type)) - async_add_entities(dev) weather = YrData(hass, coordinates, forecast, dev) - async_track_utc_time_change(hass, weather.updating_devices, minute=31, second=0) + async_track_utc_time_change( + hass, weather.updating_devices, minute=randrange(60), second=0 + ) await weather.fetching_data() + async_add_entities(dev) class YrSensor(Entity): @@ -234,7 +236,6 @@ class YrData: ordered_entries.sort(key=lambda item: item[0]) # Update all devices - tasks = [] if ordered_entries: for dev in self.devices: new_state = None @@ -274,7 +275,5 @@ class YrData: # pylint: disable=protected-access if new_state != dev._state: dev._state = new_state - tasks.append(dev.async_update_ha_state()) - - if tasks: - await asyncio.wait(tasks) + if dev.hass: + dev.async_write_ha_state() diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index 3fb5491ea626..f1b76075ae8b 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -87,7 +87,7 @@ class ZWaveBaseEntity(Entity): @callback def do_update(): """Really update.""" - self.hass.async_add_job(self.async_update_ha_state) + self.async_write_ha_state() self._update_scheduled = False self._update_scheduled = True diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index 4cbb7a23496c..bf6db55a2da4 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -444,7 +444,7 @@ class EntityPlatform: await entity.async_internal_added_to_hass() await entity.async_added_to_hass() - await entity.async_update_ha_state() + entity.async_write_ha_state() async def async_reset(self) -> None: """Remove all entities and reset data. diff --git a/homeassistant/helpers/script.py b/homeassistant/helpers/script.py index 145bb42af5bf..c724b9e890d0 100644 --- a/homeassistant/helpers/script.py +++ b/homeassistant/helpers/script.py @@ -36,7 +36,6 @@ from homeassistant.core import ( Context, HomeAssistant, callback, - is_callback, ) from homeassistant.helpers import ( condition, @@ -679,10 +678,7 @@ class Script: def _changed(self): if self.change_listener: - if is_callback(self.change_listener): - self.change_listener() - else: - self._hass.async_add_job(self.change_listener) + self._hass.async_run_job(self.change_listener) @property def is_running(self) -> bool: diff --git a/tests/components/zwave/test_node_entity.py b/tests/components/zwave/test_node_entity.py index 9136b53ff0b3..28161cfa18b6 100644 --- a/tests/components/zwave/test_node_entity.py +++ b/tests/components/zwave/test_node_entity.py @@ -13,6 +13,7 @@ import tests.mock.zwave as mock_zwave async def test_maybe_schedule_update(hass, mock_openzwave): """Test maybe schedule update.""" base_entity = node_entity.ZWaveBaseEntity() + base_entity.entity_id = "zwave.bla" base_entity.hass = hass with patch.object(hass.loop, "call_later") as mock_call_later: @@ -21,12 +22,12 @@ async def test_maybe_schedule_update(hass, mock_openzwave): base_entity._schedule_update() assert len(mock_call_later.mock_calls) == 1 + assert base_entity._update_scheduled is True do_update = mock_call_later.mock_calls[0][1][1] - with patch.object(hass, "async_add_job") as mock_add_job: - do_update() - assert mock_add_job.called + do_update() + assert base_entity._update_scheduled is False base_entity._schedule_update() assert len(mock_call_later.mock_calls) == 2 diff --git a/tests/helpers/test_entity_component.py b/tests/helpers/test_entity_component.py index 306402cd2b98..1c5224d89c3e 100644 --- a/tests/helpers/test_entity_component.py +++ b/tests/helpers/test_entity_component.py @@ -379,15 +379,16 @@ async def test_update_entity(hass): """Test that we can update an entity with the helper.""" component = EntityComponent(_LOGGER, DOMAIN, hass) entity = MockEntity() + entity.async_write_ha_state = Mock() entity.async_update_ha_state = Mock(return_value=mock_coro()) await component.async_add_entities([entity]) # Called as part of async_add_entities - assert len(entity.async_update_ha_state.mock_calls) == 1 + assert len(entity.async_write_ha_state.mock_calls) == 1 await hass.helpers.entity_component.async_update_entity(entity.entity_id) - assert len(entity.async_update_ha_state.mock_calls) == 2 + assert len(entity.async_update_ha_state.mock_calls) == 1 assert entity.async_update_ha_state.mock_calls[-1][1][0] is True From ae22b5187aaf189e45ff00081e17cf679ce67491 Mon Sep 17 00:00:00 2001 From: Robert Van Gorkom Date: Fri, 3 Apr 2020 00:49:50 -0700 Subject: [PATCH 048/653] Add vera config entries support (#29880) * Adding vera config entries support. * Fixing lint error. * Applying minimal changes necessary to get config entries working. * Addressing PR feedback by further reducing the scope of the change. * Addressing PR feedback. * Fixing pyvera import to make it easier to patch. Addressing PR feedback regarding creation of controller and scheduling of async config flow actions. * Updating code owners file. * Small fixes. * Adding a user config flow step. * Adding optional configs for user config flow. * Updating strings to be more clear to the user. * Adding options flow. Fixing some PR feedback. * Better handling of options. PR feedback changes. * Using config registry to update config options. * Better managing config from file or config from UI Disabling config through UI if config is provided from a file. More tests to account for these adjustments. * Address PR feedback. * Fixing test, merging with master. * Disabling all Vera UI for configs managed by configuration.yml. Adding more tests. * Updating config based on unique_id. Addressing additional PR feedback. * Rebasing off dev. Addressing feedback. * Addressing PR feedback. --- CODEOWNERS | 1 + homeassistant/components/vera/__init__.py | 125 ++++++++------ .../components/vera/binary_sensor.py | 31 +++- homeassistant/components/vera/climate.py | 31 +++- homeassistant/components/vera/common.py | 29 ++++ homeassistant/components/vera/config_flow.py | 130 ++++++++++++++ homeassistant/components/vera/const.py | 11 ++ homeassistant/components/vera/cover.py | 32 +++- homeassistant/components/vera/light.py | 26 ++- homeassistant/components/vera/lock.py | 31 +++- homeassistant/components/vera/manifest.json | 5 +- homeassistant/components/vera/scene.py | 24 ++- homeassistant/components/vera/sensor.py | 26 ++- homeassistant/components/vera/strings.json | 32 ++++ homeassistant/components/vera/switch.py | 31 +++- homeassistant/generated/config_flows.py | 1 + tests/components/vera/common.py | 122 +++++++++++--- tests/components/vera/conftest.py | 4 +- tests/components/vera/test_binary_sensor.py | 16 +- tests/components/vera/test_climate.py | 28 +-- tests/components/vera/test_config_flow.py | 159 ++++++++++++++++++ tests/components/vera/test_cover.py | 14 +- tests/components/vera/test_init.py | 156 ++++++++++------- tests/components/vera/test_light.py | 14 +- tests/components/vera/test_lock.py | 14 +- tests/components/vera/test_scene.py | 8 +- tests/components/vera/test_sensor.py | 55 +++--- tests/components/vera/test_switch.py | 14 +- 28 files changed, 876 insertions(+), 294 deletions(-) create mode 100644 homeassistant/components/vera/common.py create mode 100644 homeassistant/components/vera/config_flow.py create mode 100644 homeassistant/components/vera/const.py create mode 100644 homeassistant/components/vera/strings.json create mode 100644 tests/components/vera/test_config_flow.py diff --git a/CODEOWNERS b/CODEOWNERS index 4d4c7d3d9007..5cbf0d411a0f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -409,6 +409,7 @@ homeassistant/components/usgs_earthquakes_feed/* @exxamalte homeassistant/components/utility_meter/* @dgomes homeassistant/components/velbus/* @Cereal2nd @brefra homeassistant/components/velux/* @Julius2342 +homeassistant/components/vera/* @vangorra homeassistant/components/versasense/* @flamm3blemuff1n homeassistant/components/version/* @fabaff homeassistant/components/vesync/* @markperdue @webdjoe diff --git a/homeassistant/components/vera/__init__.py b/homeassistant/components/vera/__init__.py index 1c9d412d974d..c98833a7daa0 100644 --- a/homeassistant/components/vera/__init__.py +++ b/homeassistant/components/vera/__init__.py @@ -1,4 +1,5 @@ """Support for Vera devices.""" +import asyncio from collections import defaultdict import logging @@ -6,6 +7,8 @@ import pyvera as veraApi from requests.exceptions import RequestException import voluptuous as vol +from homeassistant import config_entries +from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_ARMED, ATTR_BATTERY_LEVEL, @@ -15,27 +18,24 @@ from homeassistant.const import ( CONF_LIGHTS, EVENT_HOMEASSISTANT_STOP, ) -from homeassistant.helpers import config_validation as cv, discovery +from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import convert, slugify from homeassistant.util.dt import utc_from_timestamp +from .common import ControllerData, get_configured_platforms +from .config_flow import new_options +from .const import ( + ATTR_CURRENT_ENERGY_KWH, + ATTR_CURRENT_POWER_W, + CONF_CONTROLLER, + DOMAIN, + VERA_ID_FORMAT, +) + _LOGGER = logging.getLogger(__name__) -DOMAIN = "vera" - -VERA_CONTROLLER = "vera_controller" - -CONF_CONTROLLER = "vera_controller_url" - -VERA_ID_FORMAT = "{}_{}" - -ATTR_CURRENT_POWER_W = "current_power_w" -ATTR_CURRENT_ENERGY_KWH = "current_energy_kwh" - -VERA_DEVICES = "vera_devices" -VERA_SCENES = "vera_scenes" - VERA_ID_LIST_SCHEMA = vol.Schema([int]) CONFIG_SCHEMA = vol.Schema( @@ -51,42 +51,53 @@ CONFIG_SCHEMA = vol.Schema( extra=vol.ALLOW_EXTRA, ) -VERA_COMPONENTS = [ - "binary_sensor", - "sensor", - "light", - "switch", - "lock", - "climate", - "cover", - "scene", -] - - -def setup(hass, base_config): - """Set up for Vera devices.""" - - def stop_subscription(event): - """Shutdown Vera subscriptions and subscription thread on exit.""" - _LOGGER.info("Shutting down subscriptions") - hass.data[VERA_CONTROLLER].stop() +async def async_setup(hass: HomeAssistant, base_config: dict) -> bool: + """Set up for Vera controllers.""" config = base_config.get(DOMAIN) - # Get Vera specific configuration. - base_url = config.get(CONF_CONTROLLER) - light_ids = config.get(CONF_LIGHTS) - exclude_ids = config.get(CONF_EXCLUDE) + if not config: + return True + + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=config, + ) + ) + + return True + + +async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: + """Do setup of vera.""" + # Use options entered during initial config flow or provided from configuration.yml + if config_entry.data.get(CONF_LIGHTS) or config_entry.data.get(CONF_EXCLUDE): + hass.config_entries.async_update_entry( + entry=config_entry, + data=config_entry.data, + options=new_options( + config_entry.data.get(CONF_LIGHTS, []), + config_entry.data.get(CONF_EXCLUDE, []), + ), + ) + + base_url = config_entry.data[CONF_CONTROLLER] + light_ids = config_entry.options.get(CONF_LIGHTS, []) + exclude_ids = config_entry.options.get(CONF_EXCLUDE, []) # Initialize the Vera controller. - controller, _ = veraApi.init_controller(base_url) - hass.data[VERA_CONTROLLER] = controller - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_subscription) + controller = veraApi.VeraController(base_url) + controller.start() + + hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_STOP, + lambda event: hass.async_add_executor_job(controller.stop), + ) try: - all_devices = controller.get_devices() + all_devices = await hass.async_add_executor_job(controller.get_devices) - all_scenes = controller.get_scenes() + all_scenes = await hass.async_add_executor_job(controller.get_scenes) except RequestException: # There was a network related error connecting to the Vera controller. _LOGGER.exception("Error communicating with Vera API") @@ -102,15 +113,35 @@ def setup(hass, base_config): continue vera_devices[device_type].append(device) - hass.data[VERA_DEVICES] = vera_devices vera_scenes = [] for scene in all_scenes: vera_scenes.append(scene) - hass.data[VERA_SCENES] = vera_scenes - for component in VERA_COMPONENTS: - discovery.load_platform(hass, component, DOMAIN, {}, base_config) + controller_data = ControllerData( + controller=controller, devices=vera_devices, scenes=vera_scenes + ) + + hass.data[DOMAIN] = controller_data + + # Forward the config data to the necessary platforms. + for platform in get_configured_platforms(controller_data): + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(config_entry, platform) + ) + + return True + + +async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: + """Unload Withings config entry.""" + controller_data = hass.data[DOMAIN] + + tasks = [ + hass.config_entries.async_forward_entry_unload(config_entry, platform) + for platform in get_configured_platforms(controller_data) + ] + await asyncio.gather(*tasks) return True diff --git a/homeassistant/components/vera/binary_sensor.py b/homeassistant/components/vera/binary_sensor.py index 061d2c5c99ae..621dc09930d9 100644 --- a/homeassistant/components/vera/binary_sensor.py +++ b/homeassistant/components/vera/binary_sensor.py @@ -1,21 +1,34 @@ """Support for Vera binary sensors.""" import logging +from typing import Callable, List -from homeassistant.components.binary_sensor import ENTITY_ID_FORMAT, BinarySensorDevice +from homeassistant.components.binary_sensor import ( + DOMAIN as PLATFORM_DOMAIN, + ENTITY_ID_FORMAT, + BinarySensorDevice, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Perform the setup for Vera controller devices.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraBinarySensor(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["binary_sensor"] - ], - True, + VeraBinarySensor(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/climate.py b/homeassistant/components/vera/climate.py index 60e73d48978c..520c3b516df3 100644 --- a/homeassistant/components/vera/climate.py +++ b/homeassistant/components/vera/climate.py @@ -1,7 +1,12 @@ """Support for Vera thermostats.""" import logging +from typing import Callable, List -from homeassistant.components.climate import ENTITY_ID_FORMAT, ClimateDevice +from homeassistant.components.climate import ( + DOMAIN as PLATFORM_DOMAIN, + ENTITY_ID_FORMAT, + ClimateDevice, +) from homeassistant.components.climate.const import ( FAN_AUTO, FAN_ON, @@ -12,10 +17,14 @@ from homeassistant.components.climate.const import ( SUPPORT_FAN_MODE, SUPPORT_TARGET_TEMPERATURE, ) +from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity from homeassistant.util import convert -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) @@ -25,14 +34,18 @@ SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE | SUPPORT_FAN_MODE SUPPORT_HVAC = [HVAC_MODE_COOL, HVAC_MODE_HEAT, HVAC_MODE_HEAT_COOL, HVAC_MODE_OFF] -def setup_platform(hass, config, add_entities_callback, discovery_info=None): - """Set up of Vera thermostats.""" - add_entities_callback( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraThermostat(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["climate"] - ], - True, + VeraThermostat(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/common.py b/homeassistant/components/vera/common.py new file mode 100644 index 000000000000..cdfdff404ec9 --- /dev/null +++ b/homeassistant/components/vera/common.py @@ -0,0 +1,29 @@ +"""Common vera code.""" +import logging +from typing import DefaultDict, List, NamedTuple, Set + +import pyvera as pv + +from homeassistant.components.scene import DOMAIN as SCENE_DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +class ControllerData(NamedTuple): + """Controller data.""" + + controller: pv.VeraController + devices: DefaultDict[str, List[pv.VeraDevice]] + scenes: List[pv.VeraScene] + + +def get_configured_platforms(controller_data: ControllerData) -> Set[str]: + """Get configured platforms for a controller.""" + platforms = [] + for platform in controller_data.devices: + platforms.append(platform) + + if controller_data.scenes: + platforms.append(SCENE_DOMAIN) + + return set(platforms) diff --git a/homeassistant/components/vera/config_flow.py b/homeassistant/components/vera/config_flow.py new file mode 100644 index 000000000000..3d2b30f1079f --- /dev/null +++ b/homeassistant/components/vera/config_flow.py @@ -0,0 +1,130 @@ +"""Config flow for Vera.""" +import logging +import re +from typing import List, cast + +import pyvera as pv +from requests.exceptions import RequestException +import voluptuous as vol + +from homeassistant import config_entries +from homeassistant.const import CONF_EXCLUDE, CONF_LIGHTS, CONF_SOURCE +from homeassistant.core import callback + +from .const import CONF_CONTROLLER, DOMAIN + +LIST_REGEX = re.compile("[^0-9]+") +_LOGGER = logging.getLogger(__name__) + + +def str_to_int_list(data: str) -> List[str]: + """Convert a string to an int list.""" + if isinstance(str, list): + return cast(List[str], data) + + return [s for s in LIST_REGEX.split(data) if len(s) > 0] + + +def int_list_to_str(data: List[str]) -> str: + """Convert an int list to a string.""" + return " ".join([str(i) for i in data]) + + +def new_options(lights: List[str], exclude: List[str]) -> dict: + """Create a standard options object.""" + return {CONF_LIGHTS: lights, CONF_EXCLUDE: exclude} + + +def options_schema(options: dict = None) -> dict: + """Return options schema.""" + options = options or {} + return { + vol.Optional( + CONF_LIGHTS, default=int_list_to_str(options.get(CONF_LIGHTS, [])), + ): str, + vol.Optional( + CONF_EXCLUDE, default=int_list_to_str(options.get(CONF_EXCLUDE, [])), + ): str, + } + + +def options_data(user_input: dict) -> dict: + """Return options dict.""" + return new_options( + str_to_int_list(user_input.get(CONF_LIGHTS, "")), + str_to_int_list(user_input.get(CONF_EXCLUDE, "")), + ) + + +class OptionsFlowHandler(config_entries.OptionsFlow): + """Options for the component.""" + + def __init__(self, config_entry: config_entries.ConfigEntry): + """Init object.""" + self.config_entry = config_entry + + async def async_step_init(self, user_input=None): + """Manage the options.""" + if user_input is not None: + return self.async_create_entry(title="", data=options_data(user_input),) + + return self.async_show_form( + step_id="init", + data_schema=vol.Schema(options_schema(self.config_entry.options)), + ) + + +class VeraFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): + """Vera config flow.""" + + @staticmethod + @callback + def async_get_options_flow(config_entry) -> OptionsFlowHandler: + """Get the options flow.""" + return OptionsFlowHandler(config_entry) + + async def async_step_user(self, user_input: dict = None): + """Handle user initiated flow.""" + if self.hass.config_entries.async_entries(DOMAIN): + return self.async_abort(reason="already_configured") + + if user_input is not None: + return await self.async_step_finish( + { + **user_input, + **options_data(user_input), + **{CONF_SOURCE: config_entries.SOURCE_USER}, + } + ) + + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + {**{vol.Required(CONF_CONTROLLER): str}, **options_schema()} + ), + ) + + async def async_step_import(self, config: dict): + """Handle a flow initialized by import.""" + return await self.async_step_finish( + {**config, **{CONF_SOURCE: config_entries.SOURCE_IMPORT}} + ) + + async def async_step_finish(self, config: dict): + """Validate and create config entry.""" + base_url = config[CONF_CONTROLLER] = config[CONF_CONTROLLER].rstrip("/") + controller = pv.VeraController(base_url) + + # Verify the controller is online and get the serial number. + try: + await self.hass.async_add_executor_job(controller.refresh_data) + except RequestException: + _LOGGER.error("Failed to connect to vera controller %s", base_url) + return self.async_abort( + reason="cannot_connect", description_placeholders={"base_url": base_url} + ) + + await self.async_set_unique_id(controller.serial_number) + self._abort_if_unique_id_configured(config) + + return self.async_create_entry(title=base_url, data=config) diff --git a/homeassistant/components/vera/const.py b/homeassistant/components/vera/const.py new file mode 100644 index 000000000000..c4f1d0efa3a0 --- /dev/null +++ b/homeassistant/components/vera/const.py @@ -0,0 +1,11 @@ +"""Vera constants.""" +DOMAIN = "vera" + +CONF_CONTROLLER = "vera_controller_url" + +VERA_ID_FORMAT = "{}_{}" + +ATTR_CURRENT_POWER_W = "current_power_w" +ATTR_CURRENT_ENERGY_KWH = "current_energy_kwh" + +CONTROLLER_DATAS = "controller_datas" diff --git a/homeassistant/components/vera/cover.py b/homeassistant/components/vera/cover.py index b90dd8a05311..0d0edb841c1e 100644 --- a/homeassistant/components/vera/cover.py +++ b/homeassistant/components/vera/cover.py @@ -1,21 +1,35 @@ """Support for Vera cover - curtains, rollershutters etc.""" import logging +from typing import Callable, List -from homeassistant.components.cover import ATTR_POSITION, ENTITY_ID_FORMAT, CoverDevice +from homeassistant.components.cover import ( + ATTR_POSITION, + DOMAIN as PLATFORM_DOMAIN, + ENTITY_ID_FORMAT, + CoverDevice, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Vera covers.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraCover(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["cover"] - ], - True, + VeraCover(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/light.py b/homeassistant/components/vera/light.py index fee992356816..877fdf51f0a4 100644 --- a/homeassistant/components/vera/light.py +++ b/homeassistant/components/vera/light.py @@ -1,29 +1,39 @@ """Support for Vera lights.""" import logging +from typing import Callable, List from homeassistant.components.light import ( ATTR_BRIGHTNESS, ATTR_HS_COLOR, + DOMAIN as PLATFORM_DOMAIN, ENTITY_ID_FORMAT, SUPPORT_BRIGHTNESS, SUPPORT_COLOR, Light, ) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity import homeassistant.util.color as color_util -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Vera lights.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraLight(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["light"] - ], - True, + VeraLight(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/lock.py b/homeassistant/components/vera/lock.py index 23b62bb03314..da3c432a6afa 100644 --- a/homeassistant/components/vera/lock.py +++ b/homeassistant/components/vera/lock.py @@ -1,10 +1,19 @@ """Support for Vera locks.""" import logging +from typing import Callable, List -from homeassistant.components.lock import ENTITY_ID_FORMAT, LockDevice +from homeassistant.components.lock import ( + DOMAIN as PLATFORM_DOMAIN, + ENTITY_ID_FORMAT, + LockDevice, +) +from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_LOCKED, STATE_UNLOCKED +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) @@ -12,14 +21,18 @@ ATTR_LAST_USER_NAME = "changed_by_name" ATTR_LOW_BATTERY = "low_battery" -def setup_platform(hass, config, add_entities, discovery_info=None): - """Find and return Vera locks.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraLock(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["lock"] - ], - True, + VeraLock(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/manifest.json b/homeassistant/components/vera/manifest.json index 63102c296878..4f585d964a86 100644 --- a/homeassistant/components/vera/manifest.json +++ b/homeassistant/components/vera/manifest.json @@ -1,8 +1,11 @@ { "domain": "vera", "name": "Vera", + "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/vera", "requirements": ["pyvera==0.3.7"], "dependencies": [], - "codeowners": [] + "codeowners": [ + "@vangorra" + ] } diff --git a/homeassistant/components/vera/scene.py b/homeassistant/components/vera/scene.py index af5266ed4b3d..7d09e2488938 100644 --- a/homeassistant/components/vera/scene.py +++ b/homeassistant/components/vera/scene.py @@ -1,22 +1,30 @@ """Support for Vera scenes.""" import logging +from typing import Callable, List from homeassistant.components.scene import Scene +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity from homeassistant.util import slugify -from . import VERA_CONTROLLER, VERA_ID_FORMAT, VERA_SCENES +from .const import DOMAIN, VERA_ID_FORMAT _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Vera scenes.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraScene(scene, hass.data[VERA_CONTROLLER]) - for scene in hass.data[VERA_SCENES] - ], - True, + VeraScene(device, controller_data.controller) + for device in controller_data.scenes + ] ) diff --git a/homeassistant/components/vera/sensor.py b/homeassistant/components/vera/sensor.py index 9ac0a36ff9cd..60ebeeb15665 100644 --- a/homeassistant/components/vera/sensor.py +++ b/homeassistant/components/vera/sensor.py @@ -1,29 +1,37 @@ """Support for Vera sensors.""" from datetime import timedelta import logging +from typing import Callable, List import pyvera as veraApi -from homeassistant.components.sensor import ENTITY_ID_FORMAT +from homeassistant.components.sensor import DOMAIN as PLATFORM_DOMAIN, ENTITY_ID_FORMAT +from homeassistant.config_entries import ConfigEntry from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE +from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import Entity from homeassistant.util import convert -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(seconds=5) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Vera controller devices.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraSensor(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["sensor"] - ], - True, + VeraSensor(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/components/vera/strings.json b/homeassistant/components/vera/strings.json new file mode 100644 index 000000000000..d8dec2c40cfa --- /dev/null +++ b/homeassistant/components/vera/strings.json @@ -0,0 +1,32 @@ +{ + "config": { + "title": "Vera", + "abort": { + "already_configured": "A controller is already configured.", + "cannot_connect": "Could not connect to controller with url {base_url}" + }, + "step": { + "user": { + "title": "Setup Vera controller", + "description": "Provide a Vera controller url below. It should look like this: http://192.168.1.161:3480.", + "data": { + "vera_controller_url": "Controller URL", + "lights": "Vera switch device ids to treat as lights in Home Assistant.", + "exclude": "Vera device ids to exclude from Home Assistant." + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Vera controller options", + "description": "See the vera documentation for details on optional parameters: https://www.home-assistant.io/integrations/vera/. Note: Any changes here will need a restart to the home assistant server. To clear values, provide a space.", + "data": { + "lights": "Vera switch device ids to treat as lights in Home Assistant.", + "exclude": "Vera device ids to exclude from Home Assistant." + } + } + } + } +} diff --git a/homeassistant/components/vera/switch.py b/homeassistant/components/vera/switch.py index ab3c3e6adb95..a7ae6d45573e 100644 --- a/homeassistant/components/vera/switch.py +++ b/homeassistant/components/vera/switch.py @@ -1,22 +1,35 @@ """Support for Vera switches.""" import logging +from typing import Callable, List -from homeassistant.components.switch import ENTITY_ID_FORMAT, SwitchDevice +from homeassistant.components.switch import ( + DOMAIN as PLATFORM_DOMAIN, + ENTITY_ID_FORMAT, + SwitchDevice, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import Entity from homeassistant.util import convert -from . import VERA_CONTROLLER, VERA_DEVICES, VeraDevice +from . import VeraDevice +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Vera switches.""" - add_entities( +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: Callable[[List[Entity], bool], None], +) -> None: + """Set up the sensor config entry.""" + controller_data = hass.data[DOMAIN] + async_add_entities( [ - VeraSwitch(device, hass.data[VERA_CONTROLLER]) - for device in hass.data[VERA_DEVICES]["switch"] - ], - True, + VeraSwitch(device, controller_data.controller) + for device in controller_data.devices.get(PLATFORM_DOMAIN) + ] ) diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 1584d342db4f..e00cd1b5936b 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -122,6 +122,7 @@ FLOWS = [ "unifi", "upnp", "velbus", + "vera", "vesync", "vilfo", "vizio", diff --git a/tests/components/vera/common.py b/tests/components/vera/common.py index 649cf9af6a54..5574c93c515d 100644 --- a/tests/components/vera/common.py +++ b/tests/components/vera/common.py @@ -1,47 +1,91 @@ """Common code for tests.""" -from typing import Callable, NamedTuple, Tuple +from typing import Callable, Dict, NamedTuple, Tuple from mock import MagicMock -from pyvera import VeraController, VeraDevice, VeraScene +import pyvera as pv -from homeassistant.components.vera import CONF_CONTROLLER, DOMAIN +from homeassistant.components.vera.const import CONF_CONTROLLER, DOMAIN from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component +from tests.common import MockConfigEntry + +SetupCallback = Callable[[pv.VeraController, dict], None] + + +class ControllerData(NamedTuple): + """Test data about a specific vera controller.""" + + controller: pv.VeraController + update_callback: Callable + class ComponentData(NamedTuple): - """Component data.""" + """Test data about the vera component.""" - controller: VeraController + controller_data: ControllerData + + +class ControllerConfig(NamedTuple): + """Test config for mocking a vera controller.""" + + config: Dict + options: Dict + config_from_file: bool + serial_number: str + devices: Tuple[pv.VeraDevice, ...] + scenes: Tuple[pv.VeraScene, ...] + setup_callback: SetupCallback + + +def new_simple_controller_config( + config: dict = None, + options: dict = None, + config_from_file=False, + serial_number="1111", + devices: Tuple[pv.VeraDevice, ...] = (), + scenes: Tuple[pv.VeraScene, ...] = (), + setup_callback: SetupCallback = None, +) -> ControllerConfig: + """Create simple contorller config.""" + return ControllerConfig( + config=config or {CONF_CONTROLLER: "http://127.0.0.1:123"}, + options=options, + config_from_file=config_from_file, + serial_number=serial_number, + devices=devices, + scenes=scenes, + setup_callback=setup_callback, + ) class ComponentFactory: """Factory class.""" - def __init__(self, init_controller_mock): - """Initialize component factory.""" - self.init_controller_mock = init_controller_mock + def __init__(self, vera_controller_class_mock): + """Initialize the factory.""" + self.vera_controller_class_mock = vera_controller_class_mock async def configure_component( - self, - hass: HomeAssistant, - devices: Tuple[VeraDevice] = (), - scenes: Tuple[VeraScene] = (), - setup_callback: Callable[[VeraController], None] = None, + self, hass: HomeAssistant, controller_config: ControllerConfig ) -> ComponentData: """Configure the component with specific mock data.""" - controller_url = "http://127.0.0.1:123" - - hass_config = { - DOMAIN: {CONF_CONTROLLER: controller_url}, + component_config = { + **(controller_config.config or {}), + **(controller_config.options or {}), } - controller = MagicMock(spec=VeraController) # type: VeraController - controller.base_url = controller_url + controller = MagicMock(spec=pv.VeraController) # type: pv.VeraController + controller.base_url = component_config.get(CONF_CONTROLLER) controller.register = MagicMock() - controller.get_devices = MagicMock(return_value=devices or ()) - controller.get_scenes = MagicMock(return_value=scenes or ()) + controller.start = MagicMock() + controller.stop = MagicMock() + controller.refresh_data = MagicMock() + controller.temperature_units = "C" + controller.serial_number = controller_config.serial_number + controller.get_devices = MagicMock(return_value=controller_config.devices) + controller.get_scenes = MagicMock(return_value=controller_config.scenes) for vera_obj in controller.get_devices() + controller.get_scenes(): vera_obj.vera_controller = controller @@ -49,17 +93,39 @@ class ComponentFactory: controller.get_devices.reset_mock() controller.get_scenes.reset_mock() - if setup_callback: - setup_callback(controller, hass_config) + if controller_config.setup_callback: + controller_config.setup_callback(controller) - def init_controller(base_url: str) -> list: - nonlocal controller - return [controller, True] + self.vera_controller_class_mock.return_value = controller - self.init_controller_mock.side_effect = init_controller + hass_config = {} + + # Setup component through config file import. + if controller_config.config_from_file: + hass_config[DOMAIN] = component_config # Setup Home Assistant. assert await async_setup_component(hass, DOMAIN, hass_config) await hass.async_block_till_done() - return ComponentData(controller=controller) + # Setup component through config flow. + if not controller_config.config_from_file: + entry = MockConfigEntry( + domain=DOMAIN, data=component_config, options={}, unique_id="12345" + ) + entry.add_to_hass(hass) + + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + update_callback = ( + controller.register.call_args_list[0][0][1] + if controller.register.call_args_list + else None + ) + + return ComponentData( + controller_data=ControllerData( + controller=controller, update_callback=update_callback + ) + ) diff --git a/tests/components/vera/conftest.py b/tests/components/vera/conftest.py index b94a40135d8b..2c15d3e4182f 100644 --- a/tests/components/vera/conftest.py +++ b/tests/components/vera/conftest.py @@ -9,5 +9,5 @@ from .common import ComponentFactory @pytest.fixture() def vera_component_factory(): """Return a factory for initializing the vera component.""" - with patch("pyvera.init_controller") as init_controller_mock: - yield ComponentFactory(init_controller_mock) + with patch("pyvera.VeraController") as vera_controller_class_mock: + yield ComponentFactory(vera_controller_class_mock) diff --git a/tests/components/vera/test_binary_sensor.py b/tests/components/vera/test_binary_sensor.py index 2c2e2b863881..72651d6eda4f 100644 --- a/tests/components/vera/test_binary_sensor.py +++ b/tests/components/vera/test_binary_sensor.py @@ -1,38 +1,36 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import VeraBinarySensor +import pyvera as pv from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_binary_sensor( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraBinarySensor) # type: VeraBinarySensor + vera_device = MagicMock(spec=pv.VeraBinarySensor) # type: pv.VeraBinarySensor vera_device.device_id = 1 + vera_device.vera_device_id = 1 vera_device.name = "dev1" vera_device.is_tripped = False entity_id = "binary_sensor.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,) + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback vera_device.is_tripped = False update_callback(vera_device) await hass.async_block_till_done() assert hass.states.get(entity_id).state == "off" - controller.register.reset_mock() vera_device.is_tripped = True update_callback(vera_device) await hass.async_block_till_done() assert hass.states.get(entity_id).state == "on" - controller.register.reset_mock() diff --git a/tests/components/vera/test_climate.py b/tests/components/vera/test_climate.py index c27a72865fd9..9e5fa983ed05 100644 --- a/tests/components/vera/test_climate.py +++ b/tests/components/vera/test_climate.py @@ -1,7 +1,7 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import CATEGORY_THERMOSTAT, VeraController, VeraThermostat +import pyvera as pv from homeassistant.components.climate.const import ( FAN_AUTO, @@ -13,17 +13,17 @@ from homeassistant.components.climate.const import ( ) from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_climate( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraThermostat) # type: VeraThermostat + vera_device = MagicMock(spec=pv.VeraThermostat) # type: pv.VeraThermostat vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_THERMOSTAT + vera_device.category = pv.CATEGORY_THERMOSTAT vera_device.power = 10 vera_device.get_current_temperature.return_value = 71 vera_device.get_hvac_mode.return_value = "Off" @@ -31,10 +31,10 @@ async def test_climate( entity_id = "climate.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback assert hass.states.get(entity_id).state == HVAC_MODE_OFF @@ -123,24 +123,26 @@ async def test_climate_f( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraThermostat) # type: VeraThermostat + vera_device = MagicMock(spec=pv.VeraThermostat) # type: pv.VeraThermostat vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_THERMOSTAT + vera_device.category = pv.CATEGORY_THERMOSTAT vera_device.power = 10 vera_device.get_current_temperature.return_value = 71 vera_device.get_hvac_mode.return_value = "Off" vera_device.get_current_goal_temperature.return_value = 72 entity_id = "climate.dev1_1" - def setup_callback(controller: VeraController, hass_config: dict) -> None: + def setup_callback(controller: pv.VeraController) -> None: controller.temperature_units = "F" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), setup_callback=setup_callback + hass=hass, + controller_config=new_simple_controller_config( + devices=(vera_device,), setup_callback=setup_callback + ), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback await hass.services.async_call( "climate", "set_temperature", {"entity_id": entity_id, "temperature": 30}, diff --git a/tests/components/vera/test_config_flow.py b/tests/components/vera/test_config_flow.py new file mode 100644 index 000000000000..52ba55b509c8 --- /dev/null +++ b/tests/components/vera/test_config_flow.py @@ -0,0 +1,159 @@ +"""Vera tests.""" +from unittest.mock import MagicMock + +from mock import patch +from requests.exceptions import RequestException + +from homeassistant import config_entries, data_entry_flow +from homeassistant.components.vera import CONF_CONTROLLER, DOMAIN +from homeassistant.const import CONF_EXCLUDE, CONF_LIGHTS, CONF_SOURCE +from homeassistant.core import HomeAssistant +from homeassistant.data_entry_flow import ( + RESULT_TYPE_ABORT, + RESULT_TYPE_CREATE_ENTRY, + RESULT_TYPE_FORM, +) + +from tests.common import MockConfigEntry + + +async def test_async_step_user_success(hass: HomeAssistant) -> None: + """Test user step success.""" + with patch("pyvera.VeraController") as vera_controller_class_mock: + controller = MagicMock() + controller.refresh_data = MagicMock() + controller.serial_number = "serial_number_0" + vera_controller_class_mock.return_value = controller + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == RESULT_TYPE_FORM + assert result["step_id"] == config_entries.SOURCE_USER + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={ + CONF_CONTROLLER: "http://127.0.0.1:123/", + CONF_LIGHTS: "12 13", + CONF_EXCLUDE: "14 15", + }, + ) + assert result["type"] == RESULT_TYPE_CREATE_ENTRY + assert result["title"] == "http://127.0.0.1:123" + assert result["data"] == { + CONF_CONTROLLER: "http://127.0.0.1:123", + CONF_SOURCE: config_entries.SOURCE_USER, + CONF_LIGHTS: ["12", "13"], + CONF_EXCLUDE: ["14", "15"], + } + assert result["result"].unique_id == controller.serial_number + + entries = hass.config_entries.async_entries(DOMAIN) + assert entries + + +async def test_async_step_user_already_configured(hass: HomeAssistant) -> None: + """Test user step with entry already configured.""" + entry = MockConfigEntry(domain=DOMAIN, data={}, options={}, unique_id="12345") + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_async_step_import_success(hass: HomeAssistant) -> None: + """Test import step success.""" + with patch("pyvera.VeraController") as vera_controller_class_mock: + controller = MagicMock() + controller.refresh_data = MagicMock() + controller.serial_number = "serial_number_1" + vera_controller_class_mock.return_value = controller + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={CONF_CONTROLLER: "http://127.0.0.1:123/"}, + ) + + assert result["type"] == RESULT_TYPE_CREATE_ENTRY + assert result["title"] == "http://127.0.0.1:123" + assert result["data"] == { + CONF_CONTROLLER: "http://127.0.0.1:123", + CONF_SOURCE: config_entries.SOURCE_IMPORT, + } + assert result["result"].unique_id == controller.serial_number + + +async def test_async_step_import_alredy_setup(hass: HomeAssistant) -> None: + """Test import step with entry already setup.""" + entry = MockConfigEntry(domain=DOMAIN, data={}, options={}, unique_id="12345") + entry.add_to_hass(hass) + + with patch("pyvera.VeraController") as vera_controller_class_mock: + controller = MagicMock() + controller.refresh_data = MagicMock() + controller.serial_number = "12345" + vera_controller_class_mock.return_value = controller + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={CONF_CONTROLLER: "http://localhost:445"}, + ) + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_async_step_finish_error(hass: HomeAssistant) -> None: + """Test finish step with error.""" + with patch("pyvera.VeraController") as vera_controller_class_mock: + controller = MagicMock() + controller.refresh_data = MagicMock(side_effect=RequestException()) + vera_controller_class_mock.return_value = controller + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={CONF_CONTROLLER: "http://127.0.0.1:123/"}, + ) + + assert result["type"] == "abort" + assert result["reason"] == "cannot_connect" + assert result["description_placeholders"] == { + "base_url": "http://127.0.0.1:123" + } + + +async def test_options(hass): + """Test updating options.""" + base_url = "http://127.0.0.1/" + entry = MockConfigEntry( + domain=DOMAIN, + title=base_url, + data={CONF_CONTROLLER: "http://127.0.0.1/"}, + options={CONF_LIGHTS: [1, 2, 3]}, + ) + entry.add_to_hass(hass) + + result = await hass.config_entries.options.async_init( + entry.entry_id, context={"source": "test"}, data=None + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "init" + + result = await hass.config_entries.options.async_configure( + result["flow_id"], + user_input={ + CONF_LIGHTS: "1,2;3 4 5_6bb7", + CONF_EXCLUDE: "8,9;10 11 12_13bb14", + }, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["data"] == { + CONF_LIGHTS: ["1", "2", "3", "4", "5", "6", "7"], + CONF_EXCLUDE: ["8", "9", "10", "11", "12", "13", "14"], + } diff --git a/tests/components/vera/test_cover.py b/tests/components/vera/test_cover.py index 79cb4adedfbc..62cd47f831cd 100644 --- a/tests/components/vera/test_cover.py +++ b/tests/components/vera/test_cover.py @@ -1,30 +1,30 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import CATEGORY_CURTAIN, VeraCurtain +import pyvera as pv from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_cover( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraCurtain) # type: VeraCurtain + vera_device = MagicMock(spec=pv.VeraCurtain) # type: pv.VeraCurtain vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_CURTAIN + vera_device.category = pv.CATEGORY_CURTAIN vera_device.is_closed = False vera_device.get_level.return_value = 0 entity_id = "cover.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback assert hass.states.get(entity_id).state == "closed" assert hass.states.get(entity_id).attributes["current_position"] == 0 diff --git a/tests/components/vera/test_init.py b/tests/components/vera/test_init.py index 9ff6cb4058b3..a6208726451b 100644 --- a/tests/components/vera/test_init.py +++ b/tests/components/vera/test_init.py @@ -1,78 +1,112 @@ """Vera tests.""" -from unittest.mock import MagicMock +from asynctest import MagicMock +import pyvera as pv +from requests.exceptions import RequestException -from pyvera import ( - VeraArmableDevice, - VeraBinarySensor, - VeraController, - VeraCurtain, - VeraDevice, - VeraDimmer, - VeraLock, - VeraScene, - VeraSceneController, - VeraSensor, - VeraSwitch, - VeraThermostat, -) - -from homeassistant.components.vera import ( - CONF_EXCLUDE, - CONF_LIGHTS, - DOMAIN, - VERA_DEVICES, -) +from homeassistant.components.vera import CONF_CONTROLLER, DOMAIN +from homeassistant.config_entries import ENTRY_STATE_NOT_LOADED from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config - -def new_vera_device(cls, device_id: int) -> VeraDevice: - """Create new mocked vera device..""" - vera_device = MagicMock(spec=cls) # type: VeraDevice - vera_device.device_id = device_id - vera_device.name = f"dev${device_id}" - return vera_device - - -def assert_hass_vera_devices(hass: HomeAssistant, platform: str, arr_len: int) -> None: - """Assert vera devices are present..""" - assert hass.data[VERA_DEVICES][platform] - assert len(hass.data[VERA_DEVICES][platform]) == arr_len +from tests.common import MockConfigEntry async def test_init( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - - def setup_callback(controller: VeraController, hass_config: dict) -> None: - hass_config[DOMAIN][CONF_EXCLUDE] = [11] - hass_config[DOMAIN][CONF_LIGHTS] = [10] + vera_device1 = MagicMock(spec=pv.VeraBinarySensor) # type: pv.VeraBinarySensor + vera_device1.device_id = 1 + vera_device1.vera_device_id = 1 + vera_device1.name = "first_dev" + vera_device1.is_tripped = False + entity1_id = "binary_sensor.first_dev_1" await vera_component_factory.configure_component( hass=hass, - devices=( - new_vera_device(VeraDimmer, 1), - new_vera_device(VeraBinarySensor, 2), - new_vera_device(VeraSensor, 3), - new_vera_device(VeraArmableDevice, 4), - new_vera_device(VeraLock, 5), - new_vera_device(VeraThermostat, 6), - new_vera_device(VeraCurtain, 7), - new_vera_device(VeraSceneController, 8), - new_vera_device(VeraSwitch, 9), - new_vera_device(VeraSwitch, 10), - new_vera_device(VeraSwitch, 11), + controller_config=new_simple_controller_config( + config={CONF_CONTROLLER: "http://127.0.0.1:111"}, + config_from_file=False, + serial_number="first_serial", + devices=(vera_device1,), ), - scenes=(MagicMock(spec=VeraScene),), - setup_callback=setup_callback, ) - assert_hass_vera_devices(hass, "light", 2) - assert_hass_vera_devices(hass, "binary_sensor", 1) - assert_hass_vera_devices(hass, "sensor", 2) - assert_hass_vera_devices(hass, "switch", 2) - assert_hass_vera_devices(hass, "lock", 1) - assert_hass_vera_devices(hass, "climate", 1) - assert_hass_vera_devices(hass, "cover", 1) + entity_registry = await hass.helpers.entity_registry.async_get_registry() + entry1 = entity_registry.async_get(entity1_id) + + assert entry1 + + +async def test_init_from_file( + hass: HomeAssistant, vera_component_factory: ComponentFactory +) -> None: + """Test function.""" + vera_device1 = MagicMock(spec=pv.VeraBinarySensor) # type: pv.VeraBinarySensor + vera_device1.device_id = 1 + vera_device1.vera_device_id = 1 + vera_device1.name = "first_dev" + vera_device1.is_tripped = False + entity1_id = "binary_sensor.first_dev_1" + + await vera_component_factory.configure_component( + hass=hass, + controller_config=new_simple_controller_config( + config={CONF_CONTROLLER: "http://127.0.0.1:111"}, + config_from_file=True, + serial_number="first_serial", + devices=(vera_device1,), + ), + ) + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + entry1 = entity_registry.async_get(entity1_id) + assert entry1 + + +async def test_unload( + hass: HomeAssistant, vera_component_factory: ComponentFactory +) -> None: + """Test function.""" + vera_device1 = MagicMock(spec=pv.VeraBinarySensor) # type: pv.VeraBinarySensor + vera_device1.device_id = 1 + vera_device1.vera_device_id = 1 + vera_device1.name = "first_dev" + vera_device1.is_tripped = False + + await vera_component_factory.configure_component( + hass=hass, controller_config=new_simple_controller_config() + ) + + entries = hass.config_entries.async_entries(DOMAIN) + assert entries + + for config_entry in entries: + assert await hass.config_entries.async_unload(config_entry.entry_id) + assert config_entry.state == ENTRY_STATE_NOT_LOADED + + +async def test_async_setup_entry_error( + hass: HomeAssistant, vera_component_factory: ComponentFactory +) -> None: + """Test function.""" + + def setup_callback(controller: pv.VeraController) -> None: + controller.get_devices.side_effect = RequestException() + controller.get_scenes.side_effect = RequestException() + + await vera_component_factory.configure_component( + hass=hass, + controller_config=new_simple_controller_config(setup_callback=setup_callback), + ) + + entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_CONTROLLER: "http://127.0.0.1"}, + options={}, + unique_id="12345", + ) + entry.add_to_hass(hass) + + assert not await hass.config_entries.async_setup(entry.entry_id) diff --git a/tests/components/vera/test_light.py b/tests/components/vera/test_light.py index fa63ce634544..fefa07ffa6ee 100644 --- a/tests/components/vera/test_light.py +++ b/tests/components/vera/test_light.py @@ -1,22 +1,22 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import CATEGORY_DIMMER, VeraDimmer +import pyvera as pv from homeassistant.components.light import ATTR_BRIGHTNESS, ATTR_HS_COLOR from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_light( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraDimmer) # type: VeraDimmer + vera_device = MagicMock(spec=pv.VeraDimmer) # type: pv.VeraDimmer vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_DIMMER + vera_device.category = pv.CATEGORY_DIMMER vera_device.is_switched_on = MagicMock(return_value=False) vera_device.get_brightness = MagicMock(return_value=0) vera_device.get_color = MagicMock(return_value=[0, 0, 0]) @@ -24,10 +24,10 @@ async def test_light( entity_id = "light.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback assert hass.states.get(entity_id).state == "off" diff --git a/tests/components/vera/test_lock.py b/tests/components/vera/test_lock.py index 362bdbeddc0f..d1b2209294a3 100644 --- a/tests/components/vera/test_lock.py +++ b/tests/components/vera/test_lock.py @@ -1,30 +1,30 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import CATEGORY_LOCK, VeraLock +import pyvera as pv from homeassistant.const import STATE_LOCKED, STATE_UNLOCKED from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_lock( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraLock) # type: VeraLock + vera_device = MagicMock(spec=pv.VeraLock) # type: pv.VeraLock vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_LOCK + vera_device.category = pv.CATEGORY_LOCK vera_device.is_locked = MagicMock(return_value=False) entity_id = "lock.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback assert hass.states.get(entity_id).state == STATE_UNLOCKED diff --git a/tests/components/vera/test_scene.py b/tests/components/vera/test_scene.py index 136227ffa712..732a331681bd 100644 --- a/tests/components/vera/test_scene.py +++ b/tests/components/vera/test_scene.py @@ -1,24 +1,24 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import VeraScene +import pyvera as pv from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_scene( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_scene = MagicMock(spec=VeraScene) # type: VeraScene + vera_scene = MagicMock(spec=pv.VeraScene) # type: pv.VeraScene vera_scene.scene_id = 1 vera_scene.name = "dev1" entity_id = "scene.dev1_1" await vera_component_factory.configure_component( - hass=hass, scenes=(vera_scene,), + hass=hass, controller_config=new_simple_controller_config(scenes=(vera_scene,)), ) await hass.services.async_call( diff --git a/tests/components/vera/test_sensor.py b/tests/components/vera/test_sensor.py index 9e84815d6362..c915c5ead0fd 100644 --- a/tests/components/vera/test_sensor.py +++ b/tests/components/vera/test_sensor.py @@ -2,21 +2,12 @@ from typing import Any, Callable, Tuple from unittest.mock import MagicMock -from pyvera import ( - CATEGORY_HUMIDITY_SENSOR, - CATEGORY_LIGHT_SENSOR, - CATEGORY_POWER_METER, - CATEGORY_SCENE_CONTROLLER, - CATEGORY_TEMPERATURE_SENSOR, - CATEGORY_UV_SENSOR, - VeraController, - VeraSensor, -) +import pyvera as pv from homeassistant.const import UNIT_PERCENTAGE from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def run_sensor_test( @@ -26,10 +17,10 @@ async def run_sensor_test( class_property: str, assert_states: Tuple[Tuple[Any, Any]], assert_unit_of_measurement: str = None, - setup_callback: Callable[[VeraController], None] = None, + setup_callback: Callable[[pv.VeraController], None] = None, ) -> None: """Test generic sensor.""" - vera_device = MagicMock(spec=VeraSensor) # type: VeraSensor + vera_device = MagicMock(spec=pv.VeraSensor) # type: pv.VeraSensor vera_device.device_id = 1 vera_device.name = "dev1" vera_device.category = category @@ -37,10 +28,12 @@ async def run_sensor_test( entity_id = "sensor.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), setup_callback=setup_callback + hass=hass, + controller_config=new_simple_controller_config( + devices=(vera_device,), setup_callback=setup_callback + ), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback for (initial_value, state_value) in assert_states: setattr(vera_device, class_property, initial_value) @@ -57,13 +50,13 @@ async def test_temperature_sensor_f( ) -> None: """Test function.""" - def setup_callback(controller: VeraController, hass_config: dict) -> None: + def setup_callback(controller: pv.VeraController) -> None: controller.temperature_units = "F" await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_TEMPERATURE_SENSOR, + category=pv.CATEGORY_TEMPERATURE_SENSOR, class_property="temperature", assert_states=(("33", "1"), ("44", "7")), setup_callback=setup_callback, @@ -77,7 +70,7 @@ async def test_temperature_sensor_c( await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_TEMPERATURE_SENSOR, + category=pv.CATEGORY_TEMPERATURE_SENSOR, class_property="temperature", assert_states=(("33", "33"), ("44", "44")), ) @@ -90,7 +83,7 @@ async def test_light_sensor( await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_LIGHT_SENSOR, + category=pv.CATEGORY_LIGHT_SENSOR, class_property="light", assert_states=(("12", "12"), ("13", "13")), assert_unit_of_measurement="lx", @@ -104,7 +97,7 @@ async def test_uv_sensor( await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_UV_SENSOR, + category=pv.CATEGORY_UV_SENSOR, class_property="light", assert_states=(("12", "12"), ("13", "13")), assert_unit_of_measurement="level", @@ -118,7 +111,7 @@ async def test_humidity_sensor( await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_HUMIDITY_SENSOR, + category=pv.CATEGORY_HUMIDITY_SENSOR, class_property="humidity", assert_states=(("12", "12"), ("13", "13")), assert_unit_of_measurement=UNIT_PERCENTAGE, @@ -132,7 +125,7 @@ async def test_power_meter_sensor( await run_sensor_test( hass=hass, vera_component_factory=vera_component_factory, - category=CATEGORY_POWER_METER, + category=pv.CATEGORY_POWER_METER, class_property="power", assert_states=(("12", "12"), ("13", "13")), assert_unit_of_measurement="watts", @@ -144,7 +137,7 @@ async def test_trippable_sensor( ) -> None: """Test function.""" - def setup_callback(controller: VeraController, hass_config: dict) -> None: + def setup_callback(controller: pv.VeraController) -> None: controller.get_devices()[0].is_trippable = True await run_sensor_test( @@ -162,7 +155,7 @@ async def test_unknown_sensor( ) -> None: """Test function.""" - def setup_callback(controller: VeraController, hass_config: dict) -> None: + def setup_callback(controller: pv.VeraController) -> None: controller.get_devices()[0].is_trippable = False await run_sensor_test( @@ -179,21 +172,21 @@ async def test_scene_controller_sensor( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraSensor) # type: VeraSensor + vera_device = MagicMock(spec=pv.VeraSensor) # type: pv.VeraSensor vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_SCENE_CONTROLLER + vera_device.category = pv.CATEGORY_SCENE_CONTROLLER vera_device.get_last_scene_id = MagicMock(return_value="id0") vera_device.get_last_scene_time = MagicMock(return_value="0000") entity_id = "sensor.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,) + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback - vera_device.get_last_scene_time = "1111" + vera_device.get_last_scene_time.return_value = "1111" update_callback(vera_device) await hass.async_block_till_done() assert hass.states.get(entity_id).state == "id0" diff --git a/tests/components/vera/test_switch.py b/tests/components/vera/test_switch.py index ba09068e7e60..c41afad4759f 100644 --- a/tests/components/vera/test_switch.py +++ b/tests/components/vera/test_switch.py @@ -1,29 +1,29 @@ """Vera tests.""" from unittest.mock import MagicMock -from pyvera import CATEGORY_SWITCH, VeraSwitch +import pyvera as pv from homeassistant.core import HomeAssistant -from .common import ComponentFactory +from .common import ComponentFactory, new_simple_controller_config async def test_switch( hass: HomeAssistant, vera_component_factory: ComponentFactory ) -> None: """Test function.""" - vera_device = MagicMock(spec=VeraSwitch) # type: VeraSwitch + vera_device = MagicMock(spec=pv.VeraSwitch) # type: pv.VeraSwitch vera_device.device_id = 1 vera_device.name = "dev1" - vera_device.category = CATEGORY_SWITCH + vera_device.category = pv.CATEGORY_SWITCH vera_device.is_switched_on = MagicMock(return_value=False) entity_id = "switch.dev1_1" component_data = await vera_component_factory.configure_component( - hass=hass, devices=(vera_device,), + hass=hass, + controller_config=new_simple_controller_config(devices=(vera_device,)), ) - controller = component_data.controller - update_callback = controller.register.call_args_list[0][0][1] + update_callback = component_data.controller_data.update_callback assert hass.states.get(entity_id).state == "off" From d1c1aa518d2e3f173d3156cb08857ab2b68c8b28 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Fri, 3 Apr 2020 10:11:08 +0200 Subject: [PATCH 049/653] Identify cameras in error logs for generic and mjpeg cameras (#33561) --- homeassistant/components/generic/camera.py | 10 +++++++--- homeassistant/components/mjpeg/camera.py | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/generic/camera.py b/homeassistant/components/generic/camera.py index 3abeab322620..768ef108969b 100644 --- a/homeassistant/components/generic/camera.py +++ b/homeassistant/components/generic/camera.py @@ -132,7 +132,9 @@ class GenericCamera(Camera): ) return response.content except requests.exceptions.RequestException as error: - _LOGGER.error("Error getting camera image: %s", error) + _LOGGER.error( + "Error getting new camera image from %s: %s", self._name, error + ) return self._last_image self._last_image = await self.hass.async_add_job(fetch) @@ -146,10 +148,12 @@ class GenericCamera(Camera): response = await websession.get(url, auth=self._auth) self._last_image = await response.read() except asyncio.TimeoutError: - _LOGGER.error("Timeout getting image from: %s", self._name) + _LOGGER.error("Timeout getting camera image from %s", self._name) return self._last_image except aiohttp.ClientError as err: - _LOGGER.error("Error getting new camera image: %s", err) + _LOGGER.error( + "Error getting new camera image from %s: %s", self._name, err + ) return self._last_image self._last_url = url diff --git a/homeassistant/components/mjpeg/camera.py b/homeassistant/components/mjpeg/camera.py index ab0409694d1b..c42901cd6c5a 100644 --- a/homeassistant/components/mjpeg/camera.py +++ b/homeassistant/components/mjpeg/camera.py @@ -122,10 +122,10 @@ class MjpegCamera(Camera): return image except asyncio.TimeoutError: - _LOGGER.error("Timeout getting camera image") + _LOGGER.error("Timeout getting camera image from %s", self._name) except aiohttp.ClientError as err: - _LOGGER.error("Error getting new camera image: %s", err) + _LOGGER.error("Error getting new camera image from %s: %s", self._name, err) def camera_image(self): """Return a still image response from the camera.""" From 2d751c1edd795a98b01d84c8fbdbab985188d5aa Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 3 Apr 2020 11:13:48 +0200 Subject: [PATCH 050/653] Upgrade luftdaten to 0.6.4 (#33564) --- homeassistant/components/luftdaten/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/luftdaten/manifest.json b/homeassistant/components/luftdaten/manifest.json index 13fa67a8b6b3..e6e9110b33a5 100644 --- a/homeassistant/components/luftdaten/manifest.json +++ b/homeassistant/components/luftdaten/manifest.json @@ -3,7 +3,7 @@ "name": "Luftdaten", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/luftdaten", - "requirements": ["luftdaten==0.6.3"], + "requirements": ["luftdaten==0.6.4"], "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "gold" diff --git a/requirements_all.txt b/requirements_all.txt index 6ebf1213c633..1eacae0399cf 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -840,7 +840,7 @@ logi_circle==0.2.2 london-tube-status==0.2 # homeassistant.components.luftdaten -luftdaten==0.6.3 +luftdaten==0.6.4 # homeassistant.components.lupusec lupupy==0.0.18 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 307113e9b182..65453aeff2be 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -329,7 +329,7 @@ libsoundtouch==0.7.2 logi_circle==0.2.2 # homeassistant.components.luftdaten -luftdaten==0.6.3 +luftdaten==0.6.4 # homeassistant.components.mythicbeastsdns mbddns==0.1.2 From b5c89b4ef47a265361c9b8139ce8a353944948d7 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Fri, 3 Apr 2020 11:58:37 +0200 Subject: [PATCH 051/653] Bump gios library to version 0.1.1 (#33569) --- homeassistant/components/gios/__init__.py | 9 +++++++-- homeassistant/components/gios/config_flow.py | 11 ++--------- homeassistant/components/gios/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/gios/__init__.py b/homeassistant/components/gios/__init__.py index 0a7973709c15..c7e708e3207e 100644 --- a/homeassistant/components/gios/__init__.py +++ b/homeassistant/components/gios/__init__.py @@ -3,7 +3,7 @@ import logging from aiohttp.client_exceptions import ClientConnectorError from async_timeout import timeout -from gios import ApiError, Gios, NoStationError +from gios import ApiError, Gios, InvalidSensorsData, NoStationError from homeassistant.core import Config, HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady @@ -63,7 +63,12 @@ class GiosDataUpdateCoordinator(DataUpdateCoordinator): try: with timeout(30): await self.gios.update() - except (ApiError, NoStationError, ClientConnectorError) as error: + except ( + ApiError, + NoStationError, + ClientConnectorError, + InvalidSensorsData, + ) as error: raise UpdateFailed(error) if not self.gios.data: raise UpdateFailed("Invalid sensors data") diff --git a/homeassistant/components/gios/config_flow.py b/homeassistant/components/gios/config_flow.py index 368d610c2264..5741af47a072 100644 --- a/homeassistant/components/gios/config_flow.py +++ b/homeassistant/components/gios/config_flow.py @@ -3,10 +3,10 @@ import asyncio from aiohttp.client_exceptions import ClientConnectorError from async_timeout import timeout -from gios import ApiError, Gios, NoStationError +from gios import ApiError, Gios, InvalidSensorsData, NoStationError import voluptuous as vol -from homeassistant import config_entries, exceptions +from homeassistant import config_entries from homeassistant.const import CONF_NAME from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -43,9 +43,6 @@ class GiosFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): gios = Gios(user_input[CONF_STATION_ID], websession) await gios.update() - if not gios.available: - raise InvalidSensorsData() - return self.async_create_entry( title=user_input[CONF_STATION_ID], data=user_input, ) @@ -59,7 +56,3 @@ class GiosFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): return self.async_show_form( step_id="user", data_schema=DATA_SCHEMA, errors=errors ) - - -class InvalidSensorsData(exceptions.HomeAssistantError): - """Error to indicate invalid sensors data.""" diff --git a/homeassistant/components/gios/manifest.json b/homeassistant/components/gios/manifest.json index 67fcbebe9a2c..3e3d63965d3f 100644 --- a/homeassistant/components/gios/manifest.json +++ b/homeassistant/components/gios/manifest.json @@ -4,6 +4,6 @@ "documentation": "https://www.home-assistant.io/integrations/gios", "dependencies": [], "codeowners": ["@bieniu"], - "requirements": ["gios==0.0.5"], + "requirements": ["gios==0.1.1"], "config_flow": true } diff --git a/requirements_all.txt b/requirements_all.txt index 1eacae0399cf..713679395a8b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -611,7 +611,7 @@ georss_qld_bushfire_alert_client==0.3 getmac==0.8.1 # homeassistant.components.gios -gios==0.0.5 +gios==0.1.1 # homeassistant.components.gitter gitterpy==0.1.7 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 65453aeff2be..d3ad10c676fd 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -243,7 +243,7 @@ georss_qld_bushfire_alert_client==0.3 getmac==0.8.1 # homeassistant.components.gios -gios==0.0.5 +gios==0.1.1 # homeassistant.components.glances glances_api==0.2.0 From eccab375a26c3776c787e08b79314d926a5cb72e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 3 Apr 2020 12:06:28 +0200 Subject: [PATCH 052/653] Upgrade Mastodon.py to 1.5.1 (#33243) * Upgrade Mastodon.py to 1.5.1 * Remove left-overs --- homeassistant/components/mastodon/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mastodon/manifest.json b/homeassistant/components/mastodon/manifest.json index c6430546bf23..b73b749cddf3 100644 --- a/homeassistant/components/mastodon/manifest.json +++ b/homeassistant/components/mastodon/manifest.json @@ -2,7 +2,7 @@ "domain": "mastodon", "name": "Mastodon", "documentation": "https://www.home-assistant.io/integrations/mastodon", - "requirements": ["Mastodon.py==1.5.0"], + "requirements": ["Mastodon.py==1.5.1"], "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/requirements_all.txt b/requirements_all.txt index 713679395a8b..9a03a72d30ba 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -38,7 +38,7 @@ Adafruit-SHT31==1.0.2 HAP-python==2.8.0 # homeassistant.components.mastodon -Mastodon.py==1.5.0 +Mastodon.py==1.5.1 # homeassistant.components.orangepi_gpio OPi.GPIO==0.4.0 From 730d90fb8c32a3d6c9c85ce253f988214eda48e2 Mon Sep 17 00:00:00 2001 From: Jc2k Date: Fri, 3 Apr 2020 13:36:10 +0100 Subject: [PATCH 053/653] Fix browsing regression (#33572) --- 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 b0808d83d68f..3171b8e953bc 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.24.5"], + "requirements": ["zeroconf==0.25.0"], "dependencies": ["api"], "codeowners": ["@robbiet480", "@Kane610"], "quality_scale": "internal" diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index f450fb6283c9..3258f0fb2f29 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -25,7 +25,7 @@ ruamel.yaml==0.15.100 sqlalchemy==1.3.15 voluptuous-serialize==2.3.0 voluptuous==0.11.7 -zeroconf==0.24.5 +zeroconf==0.25.0 pycryptodome>=3.6.6 diff --git a/requirements_all.txt b/requirements_all.txt index 9a03a72d30ba..ed8a0dd98e19 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2173,7 +2173,7 @@ youtube_dl==2020.03.24 zengge==0.2 # homeassistant.components.zeroconf -zeroconf==0.24.5 +zeroconf==0.25.0 # homeassistant.components.zha zha-quirks==0.0.38 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d3ad10c676fd..bc8276cf4587 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -798,7 +798,7 @@ ya_ma==0.3.8 yahooweather==0.10 # homeassistant.components.zeroconf -zeroconf==0.24.5 +zeroconf==0.25.0 # homeassistant.components.zha zha-quirks==0.0.38 From 62835f0536e323207d48b6257f01a47f86a1e1cf Mon Sep 17 00:00:00 2001 From: ollo69 <60491700+ollo69@users.noreply.github.com> Date: Fri, 3 Apr 2020 15:02:48 +0200 Subject: [PATCH 054/653] Fix asuswrt network failure startup (#33485) * Fix network failure startup Fix for issue ##33284 - Asuswrt component fail at startup after power failure * Removed comment * Removed bare except * is_connected moved out try-catch * Removed pointless-string-statement * Raise PlatformNotReady on "not is_connected" * Removed unnecessary check * Revert "Removed unnecessary check" This reverts commit a2ccddab2c4b1ba441f1d7482d802d9774527a26. * Implemented custom retry mechanism * Fix new line missing * Fix formatting * Fix indent * Reviewed check * Recoded based on tibber implementation * Formatting review * Changes requested * Fix tests for setup retry * Updated missing test * Fixed check on Tests * Return false if not exception * Format correction --- homeassistant/components/asuswrt/__init__.py | 30 +++++++++++++++++-- .../components/asuswrt/test_device_tracker.py | 12 ++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/asuswrt/__init__.py b/homeassistant/components/asuswrt/__init__.py index a0eee38c3f8a..446fe898aaaf 100644 --- a/homeassistant/components/asuswrt/__init__.py +++ b/homeassistant/components/asuswrt/__init__.py @@ -14,6 +14,7 @@ from homeassistant.const import ( ) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.discovery import async_load_platform +from homeassistant.helpers.event import async_call_later _LOGGER = logging.getLogger(__name__) @@ -31,6 +32,9 @@ DEFAULT_SSH_PORT = 22 DEFAULT_INTERFACE = "eth0" DEFAULT_DNSMASQ = "/var/lib/misc" +FIRST_RETRY_TIME = 60 +MAX_RETRY_TIME = 900 + SECRET_GROUP = "Password or SSH Key" SENSOR_TYPES = ["upload_speed", "download_speed", "download", "upload"] @@ -59,7 +63,7 @@ CONFIG_SCHEMA = vol.Schema( ) -async def async_setup(hass, config): +async def async_setup(hass, config, retry_delay=FIRST_RETRY_TIME): """Set up the asuswrt component.""" conf = config[DOMAIN] @@ -77,9 +81,29 @@ async def async_setup(hass, config): dnsmasq=conf[CONF_DNSMASQ], ) - await api.connection.async_connect() + try: + await api.connection.async_connect() + except OSError as ex: + _LOGGER.warning( + "Error [%s] connecting %s to %s. Will retry in %s seconds...", + str(ex), + DOMAIN, + conf[CONF_HOST], + retry_delay, + ) + + async def retry_setup(now): + """Retry setup if a error happens on asuswrt API.""" + await async_setup( + hass, config, retry_delay=min(2 * retry_delay, MAX_RETRY_TIME) + ) + + async_call_later(hass, retry_delay, retry_setup) + + return True + if not api.is_connected: - _LOGGER.error("Unable to setup component") + _LOGGER.error("Error connecting %s to %s.", DOMAIN, conf[CONF_HOST]) return False hass.data[DATA_ASUSWRT] = api diff --git a/tests/components/asuswrt/test_device_tracker.py b/tests/components/asuswrt/test_device_tracker.py index b91b815d58e8..62e5ed891ffa 100644 --- a/tests/components/asuswrt/test_device_tracker.py +++ b/tests/components/asuswrt/test_device_tracker.py @@ -24,6 +24,18 @@ async def test_password_or_pub_key_required(hass): assert not result +async def test_network_unreachable(hass): + """Test creating an AsusWRT scanner without a pass or pubkey.""" + with patch("homeassistant.components.asuswrt.AsusWrt") as AsusWrt: + AsusWrt().connection.async_connect = mock_coro_func(exception=OSError) + AsusWrt().is_connected = False + result = await async_setup_component( + hass, DOMAIN, {DOMAIN: {CONF_HOST: "fake_host", CONF_USERNAME: "fake_user"}} + ) + assert result + assert hass.data.get(DATA_ASUSWRT, None) is None + + async def test_get_scanner_with_password_no_pubkey(hass): """Test creating an AsusWRT scanner with a password and no pubkey.""" with patch("homeassistant.components.asuswrt.AsusWrt") as AsusWrt: From b7dd8cdf5052be745cca0caeaa0653ce36088e68 Mon Sep 17 00:00:00 2001 From: FlavorFx Date: Fri, 3 Apr 2020 15:14:42 +0200 Subject: [PATCH 055/653] Add unique id and show on map option in Tankerkoenig (#33400) * Add unique id to set friendly name by UI * Add ShowOnMap flag to show each/hide entity on map * Update homeassistant/components/tankerkoenig/sensor.py Co-Authored-By: guillempages * Update homeassistant/components/tankerkoenig/sensor.py Co-Authored-By: guillempages * Update homeassistant/components/tankerkoenig/sensor.py Co-Authored-By: guillempages * Update homeassistant/components/tankerkoenig/sensor.py Co-Authored-By: guillempages * Update homeassistant/components/tankerkoenig/sensor.py * Update homeassistant/components/tankerkoenig/__init__.py * Update homeassistant/components/tankerkoenig * Update homeassistant/components/tankerkoenig * Update homeassistant/components/tankerkoenig/sensor.py * Update homeassistant/components/tankerkoenig/sensor.py Co-authored-by: guillempages --- .../components/tankerkoenig/__init__.py | 3 +++ .../components/tankerkoenig/sensor.py | 21 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/tankerkoenig/__init__.py b/homeassistant/components/tankerkoenig/__init__.py index e8b4e92327c5..bf2468b704c5 100755 --- a/homeassistant/components/tankerkoenig/__init__.py +++ b/homeassistant/components/tankerkoenig/__init__.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_RADIUS, CONF_SCAN_INTERVAL, + CONF_SHOW_ON_MAP, ) from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv @@ -52,6 +53,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_STATIONS, default=[]): vol.All( cv.ensure_list, [cv.string] ), + vol.Optional(CONF_SHOW_ON_MAP, default=True): cv.boolean, } ) }, @@ -106,6 +108,7 @@ class TankerkoenigData: self.stations = {} self.fuel_types = conf[CONF_FUEL_TYPES] self.update_interval = conf[CONF_SCAN_INTERVAL] + self.show_on_map = conf[CONF_SHOW_ON_MAP] self._hass = hass def setup(self, latitude, longitude, radius, additional_stations): diff --git a/homeassistant/components/tankerkoenig/sensor.py b/homeassistant/components/tankerkoenig/sensor.py index 2fb184848eac..d78b5eb26419 100755 --- a/homeassistant/components/tankerkoenig/sensor.py +++ b/homeassistant/components/tankerkoenig/sensor.py @@ -59,7 +59,11 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) continue sensor = FuelPriceSensor( - fuel, station, coordinator, f"{NAME}_{station['name']}_{fuel}" + fuel, + station, + coordinator, + f"{NAME}_{station['name']}_{fuel}", + tankerkoenig.show_on_map, ) entities.append(sensor) _LOGGER.debug("Added sensors %s", entities) @@ -70,7 +74,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class FuelPriceSensor(Entity): """Contains prices for fuel in a given station.""" - def __init__(self, fuel_type, station, coordinator, name): + def __init__(self, fuel_type, station, coordinator, name, show_on_map): """Initialize the sensor.""" self._station = station self._station_id = station["id"] @@ -84,6 +88,7 @@ class FuelPriceSensor(Entity): self._postcode = station["postCode"] self._street = station["street"] self._price = station[fuel_type] + self._show_on_map = show_on_map @property def name(self): @@ -111,6 +116,11 @@ class FuelPriceSensor(Entity): # key Fuel_type is not available when the fuel station is closed, use "get" instead of "[]" to avoid exceptions return self._coordinator.data[self._station_id].get(self._fuel_type) + @property + def unique_id(self) -> str: + """Return a unique identifier for this entity.""" + return f"{self._station_id}_{self._fuel_type}" + @property def device_state_attributes(self): """Return the attributes of the device.""" @@ -125,9 +135,12 @@ class FuelPriceSensor(Entity): ATTR_HOUSE_NUMBER: self._house_number, ATTR_POSTCODE: self._postcode, ATTR_CITY: self._city, - ATTR_LATITUDE: self._latitude, - ATTR_LONGITUDE: self._longitude, } + + if self._show_on_map: + attrs[ATTR_LATITUDE] = self._latitude + attrs[ATTR_LONGITUDE] = self._longitude + if data is not None and "status" in data: attrs[ATTR_IS_OPEN] = data["status"] == "open" return attrs From c8e0daee24cda2dfff55916167e243fef0e35077 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 3 Apr 2020 15:19:52 +0200 Subject: [PATCH 056/653] Upgrade cryptography to 2.9 (#33571) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 3258f0fb2f29..d0253ad723eb 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -8,7 +8,7 @@ attrs==19.3.0 bcrypt==3.1.7 certifi>=2019.11.28 ciso8601==2.1.3 -cryptography==2.8 +cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 hass-nabucasa==0.33.0 diff --git a/requirements_all.txt b/requirements_all.txt index ed8a0dd98e19..9fd3e1a303bf 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -9,7 +9,7 @@ ciso8601==2.1.3 importlib-metadata==1.5.0 jinja2>=2.11.1 PyJWT==1.7.1 -cryptography==2.8 +cryptography==2.9 pip>=8.0.3 python-slugify==4.0.0 pytz>=2019.03 diff --git a/setup.py b/setup.py index e0daacd98bf3..89205d4ee8ae 100755 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ REQUIRES = [ "jinja2>=2.11.1", "PyJWT==1.7.1", # PyJWT has loose dependency. We want the latest one. - "cryptography==2.8", + "cryptography==2.9", "pip>=8.0.3", "python-slugify==4.0.0", "pytz>=2019.03", From 54dd77fe88f9bd8bf1296b7d836333f6aa2ff120 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 3 Apr 2020 15:39:22 +0200 Subject: [PATCH 057/653] Add default delay to Harmony config entries (#33576) --- homeassistant/components/harmony/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/harmony/__init__.py b/homeassistant/components/harmony/__init__.py index f7140bdb4009..540e39f8f441 100644 --- a/homeassistant/components/harmony/__init__.py +++ b/homeassistant/components/harmony/__init__.py @@ -2,7 +2,11 @@ import asyncio import logging -from homeassistant.components.remote import ATTR_ACTIVITY, ATTR_DELAY_SECS +from homeassistant.components.remote import ( + ATTR_ACTIVITY, + ATTR_DELAY_SECS, + DEFAULT_DELAY_SECS, +) from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, CONF_NAME from homeassistant.core import HomeAssistant, callback @@ -33,7 +37,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): address = entry.data[CONF_HOST] name = entry.data[CONF_NAME] activity = entry.options.get(ATTR_ACTIVITY) - delay_secs = entry.options.get(ATTR_DELAY_SECS) + delay_secs = entry.options.get(ATTR_DELAY_SECS, DEFAULT_DELAY_SECS) harmony_conf_file = hass.config.path(f"harmony_{entry.unique_id}.conf") try: From dd37c3f44756b807b33397482fb63ae1992804e1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 3 Apr 2020 15:51:28 +0200 Subject: [PATCH 058/653] Bump adguardhome to 0.4.2 (#33575) --- homeassistant/components/adguard/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/adguard/manifest.json b/homeassistant/components/adguard/manifest.json index c77e0b3254d7..02b0e2ea4554 100644 --- a/homeassistant/components/adguard/manifest.json +++ b/homeassistant/components/adguard/manifest.json @@ -3,7 +3,7 @@ "name": "AdGuard Home", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/adguard", - "requirements": ["adguardhome==0.4.1"], + "requirements": ["adguardhome==0.4.2"], "dependencies": [], "codeowners": ["@frenck"] } diff --git a/requirements_all.txt b/requirements_all.txt index 9fd3e1a303bf..358d8aa62e2b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -122,7 +122,7 @@ adafruit-circuitpython-mcp230xx==2.2.2 adb-shell==0.1.1 # homeassistant.components.adguard -adguardhome==0.4.1 +adguardhome==0.4.2 # homeassistant.components.frontier_silicon afsapi==0.0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index bc8276cf4587..4a6308c89080 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -32,7 +32,7 @@ abodepy==0.18.1 adb-shell==0.1.1 # homeassistant.components.adguard -adguardhome==0.4.1 +adguardhome==0.4.2 # homeassistant.components.geonetnz_quakes aio_geojson_geonetnz_quakes==0.12 From c0315e32bdc1733965a87ffa09c84f2c98fa1d11 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Fri, 3 Apr 2020 16:10:14 +0200 Subject: [PATCH 059/653] Fix source name (#33565) --- homeassistant/components/braviatv/media_player.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/braviatv/media_player.py b/homeassistant/components/braviatv/media_player.py index 6dd431aac695..f9362799224f 100644 --- a/homeassistant/components/braviatv/media_player.py +++ b/homeassistant/components/braviatv/media_player.py @@ -218,8 +218,8 @@ class BraviaTVDevice(MediaPlayerDevice): self._channel_name = playing_info.get("title") self._program_media_type = playing_info.get("programMediaType") self._channel_number = playing_info.get("dispNum") - self._source = playing_info.get("source") self._content_uri = playing_info.get("uri") + self._source = self._get_source() self._duration = playing_info.get("durationSec") self._start_date_time = playing_info.get("startDateTime") else: @@ -229,6 +229,12 @@ class BraviaTVDevice(MediaPlayerDevice): _LOGGER.error(exception_instance) self._state = STATE_OFF + def _get_source(self): + """Return the name of the source.""" + for key, value in self._content_mapping.items(): + if value == self._content_uri: + return key + def _reset_playing_info(self): self._program_name = None self._channel_name = None From 912eb321d95f87558329cca2110db416e648c15c Mon Sep 17 00:00:00 2001 From: Andrey Kupreychik Date: Fri, 3 Apr 2020 21:32:18 +0700 Subject: [PATCH 060/653] Add support for Mi AirPurifier 3 (#31729) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding support for Mi AirPurifier 3 * Adding support for Mi AirPurifier 3H * Enabled setting fan level for AirPurifier 3/3H * Get rid of isinstance for MIOT AirPurifier * Bumping xiaomi-miio dependency * Fixed lint error * Update manifest.json * Fixed requirements files for 0.5.0.1 Co-authored-by: Piotr Król --- homeassistant/components/xiaomi_miio/const.py | 1 + homeassistant/components/xiaomi_miio/fan.py | 112 +++++++++++++++++- .../components/xiaomi_miio/services.yaml | 10 ++ 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/const.py b/homeassistant/components/xiaomi_miio/const.py index 54dd684f6b11..aaeaf19c5f99 100644 --- a/homeassistant/components/xiaomi_miio/const.py +++ b/homeassistant/components/xiaomi_miio/const.py @@ -10,6 +10,7 @@ SERVICE_SET_CHILD_LOCK_ON = "fan_set_child_lock_on" SERVICE_SET_CHILD_LOCK_OFF = "fan_set_child_lock_off" SERVICE_SET_LED_BRIGHTNESS = "fan_set_led_brightness" SERVICE_SET_FAVORITE_LEVEL = "fan_set_favorite_level" +SERVICE_SET_FAN_LEVEL = "fan_set_fan_level" SERVICE_SET_AUTO_DETECT_ON = "fan_set_auto_detect_on" SERVICE_SET_AUTO_DETECT_OFF = "fan_set_auto_detect_off" SERVICE_SET_LEARN_MODE_ON = "fan_set_learn_mode_on" diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index 7cb452965066..bd5a0c720477 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -8,6 +8,7 @@ from miio import ( # pylint: disable=import-error AirFresh, AirHumidifier, AirPurifier, + AirPurifierMiot, Device, DeviceException, ) @@ -23,6 +24,10 @@ from miio.airpurifier import ( # pylint: disable=import-error, import-error LedBrightness as AirpurifierLedBrightness, OperationMode as AirpurifierOperationMode, ) +from miio.airpurifier_miot import ( # pylint: disable=import-error, import-error + LedBrightness as AirpurifierMiotLedBrightness, + OperationMode as AirpurifierMiotOperationMode, +) import voluptuous as vol from homeassistant.components.fan import PLATFORM_SCHEMA, SUPPORT_SET_SPEED, FanEntity @@ -48,6 +53,7 @@ from .const import ( SERVICE_SET_DRY_OFF, SERVICE_SET_DRY_ON, SERVICE_SET_EXTRA_FEATURES, + SERVICE_SET_FAN_LEVEL, SERVICE_SET_FAVORITE_LEVEL, SERVICE_SET_LEARN_MODE_OFF, SERVICE_SET_LEARN_MODE_ON, @@ -77,6 +83,8 @@ MODEL_AIRPURIFIER_MA2 = "zhimi.airpurifier.ma2" MODEL_AIRPURIFIER_SA1 = "zhimi.airpurifier.sa1" MODEL_AIRPURIFIER_SA2 = "zhimi.airpurifier.sa2" MODEL_AIRPURIFIER_2S = "zhimi.airpurifier.mc1" +MODEL_AIRPURIFIER_3 = "zhimi.airpurifier.ma4" +MODEL_AIRPURIFIER_3H = "zhimi.airpurifier.mb3" MODEL_AIRHUMIDIFIER_V1 = "zhimi.humidifier.v1" MODEL_AIRHUMIDIFIER_CA1 = "zhimi.humidifier.ca1" @@ -104,6 +112,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( MODEL_AIRPURIFIER_SA1, MODEL_AIRPURIFIER_SA2, MODEL_AIRPURIFIER_2S, + MODEL_AIRPURIFIER_3, + MODEL_AIRPURIFIER_3H, MODEL_AIRHUMIDIFIER_V1, MODEL_AIRHUMIDIFIER_CA1, MODEL_AIRHUMIDIFIER_CB1, @@ -131,6 +141,7 @@ ATTR_AVERAGE_AIR_QUALITY_INDEX = "average_aqi" ATTR_PURIFY_VOLUME = "purify_volume" ATTR_BRIGHTNESS = "brightness" ATTR_LEVEL = "level" +ATTR_FAN_LEVEL = "fan_level" ATTR_MOTOR2_SPEED = "motor2_speed" ATTR_ILLUMINANCE = "illuminance" ATTR_FILTER_RFID_PRODUCT_ID = "filter_rfid_product_id" @@ -154,13 +165,15 @@ ATTR_TRANS_LEVEL = "trans_level" ATTR_HARDWARE_VERSION = "hardware_version" # Air Humidifier CA -ATTR_MOTOR_SPEED = "motor_speed" +# ATTR_MOTOR_SPEED = "motor_speed" ATTR_DEPTH = "depth" ATTR_DRY = "dry" # Air Fresh ATTR_CO2 = "co2" +PURIFIER_MIOT = [MODEL_AIRPURIFIER_3, MODEL_AIRPURIFIER_3H] + # Map attributes to properties of the state object AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON = { ATTR_TEMPERATURE: "temperature", @@ -227,6 +240,28 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER_2S = { ATTR_ILLUMINANCE: "illuminance", } +AVAILABLE_ATTRIBUTES_AIRPURIFIER_3 = { + ATTR_TEMPERATURE: "temperature", + ATTR_HUMIDITY: "humidity", + ATTR_AIR_QUALITY_INDEX: "aqi", + ATTR_MODE: "mode", + ATTR_FILTER_HOURS_USED: "filter_hours_used", + ATTR_FILTER_LIFE: "filter_life_remaining", + ATTR_FAVORITE_LEVEL: "favorite_level", + ATTR_CHILD_LOCK: "child_lock", + ATTR_LED: "led", + ATTR_MOTOR_SPEED: "motor_speed", + ATTR_AVERAGE_AIR_QUALITY_INDEX: "average_aqi", + ATTR_PURIFY_VOLUME: "purify_volume", + ATTR_USE_TIME: "use_time", + ATTR_BUZZER: "buzzer", + ATTR_LED_BRIGHTNESS: "led_brightness", + ATTR_FILTER_RFID_PRODUCT_ID: "filter_rfid_product_id", + ATTR_FILTER_RFID_TAG: "filter_rfid_tag", + ATTR_FILTER_TYPE: "filter_type", + ATTR_FAN_LEVEL: "fan_level", +} + AVAILABLE_ATTRIBUTES_AIRPURIFIER_V3 = { # Common set isn't used here. It's a very basic version of the device. ATTR_AIR_QUALITY_INDEX: "aqi", @@ -302,6 +337,7 @@ OPERATION_MODES_AIRPURIFIER = ["Auto", "Silent", "Favorite", "Idle"] OPERATION_MODES_AIRPURIFIER_PRO = ["Auto", "Silent", "Favorite"] OPERATION_MODES_AIRPURIFIER_PRO_V7 = OPERATION_MODES_AIRPURIFIER_PRO OPERATION_MODES_AIRPURIFIER_2S = ["Auto", "Silent", "Favorite"] +OPERATION_MODES_AIRPURIFIER_3 = ["Auto", "Silent", "Favorite", "Fan"] OPERATION_MODES_AIRPURIFIER_V3 = [ "Auto", "Silent", @@ -327,6 +363,7 @@ FEATURE_RESET_FILTER = 256 FEATURE_SET_EXTRA_FEATURES = 512 FEATURE_SET_TARGET_HUMIDITY = 1024 FEATURE_SET_DRY = 2048 +FEATURE_SET_FAN_LEVEL = 4096 FEATURE_FLAGS_AIRPURIFIER = ( FEATURE_SET_BUZZER @@ -361,6 +398,15 @@ FEATURE_FLAGS_AIRPURIFIER_2S = ( | FEATURE_SET_FAVORITE_LEVEL ) +FEATURE_FLAGS_AIRPURIFIER_3 = ( + FEATURE_SET_BUZZER + | FEATURE_SET_CHILD_LOCK + | FEATURE_SET_LED + | FEATURE_SET_FAVORITE_LEVEL + | FEATURE_SET_FAN_LEVEL + | FEATURE_SET_LED_BRIGHTNESS +) + FEATURE_FLAGS_AIRPURIFIER_V3 = ( FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED ) @@ -394,6 +440,10 @@ SERVICE_SCHEMA_FAVORITE_LEVEL = AIRPURIFIER_SERVICE_SCHEMA.extend( {vol.Required(ATTR_LEVEL): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=17))} ) +SERVICE_SCHEMA_FAN_LEVEL = AIRPURIFIER_SERVICE_SCHEMA.extend( + {vol.Required(ATTR_LEVEL): vol.All(vol.Coerce(int), vol.Clamp(min=1, max=3))} +) + SERVICE_SCHEMA_VOLUME = AIRPURIFIER_SERVICE_SCHEMA.extend( {vol.Required(ATTR_VOLUME): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=100))} ) @@ -430,6 +480,10 @@ SERVICE_TO_METHOD = { "method": "async_set_favorite_level", "schema": SERVICE_SCHEMA_FAVORITE_LEVEL, }, + SERVICE_SET_FAN_LEVEL: { + "method": "async_set_fan_level", + "schema": SERVICE_SCHEMA_FAN_LEVEL, + }, SERVICE_SET_VOLUME: {"method": "async_set_volume", "schema": SERVICE_SCHEMA_VOLUME}, SERVICE_SET_EXTRA_FEATURES: { "method": "async_set_extra_features", @@ -472,7 +526,10 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= except DeviceException: raise PlatformNotReady - if model.startswith("zhimi.airpurifier."): + if model in PURIFIER_MIOT: + air_purifier = AirPurifierMiot(host, token) + device = XiaomiAirPurifierMiot(name, air_purifier, model, unique_id) + elif model.startswith("zhimi.airpurifier."): air_purifier = AirPurifier(host, token) device = XiaomiAirPurifier(name, air_purifier, model, unique_id) elif model.startswith("zhimi.humidifier."): @@ -690,6 +747,10 @@ class XiaomiAirPurifier(XiaomiGenericDevice): self._device_features = FEATURE_FLAGS_AIRPURIFIER_2S self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_2S self._speed_list = OPERATION_MODES_AIRPURIFIER_2S + elif self._model == MODEL_AIRPURIFIER_3 or self._model == MODEL_AIRPURIFIER_3H: + self._device_features = FEATURE_FLAGS_AIRPURIFIER_3 + self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_3 + self._speed_list = OPERATION_MODES_AIRPURIFIER_3 elif self._model == MODEL_AIRPURIFIER_V3: self._device_features = FEATURE_FLAGS_AIRPURIFIER_V3 self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_V3 @@ -795,6 +856,17 @@ class XiaomiAirPurifier(XiaomiGenericDevice): level, ) + async def async_set_fan_level(self, level: int = 1): + """Set the favorite level.""" + if self._device_features & FEATURE_SET_FAN_LEVEL == 0: + return + + await self._try_command( + "Setting the fan level of the miio device failed.", + self._device.set_fan_level, + level, + ) + async def async_set_auto_detect_on(self): """Turn the auto detect on.""" if self._device_features & FEATURE_SET_AUTO_DETECT == 0: @@ -872,6 +944,42 @@ class XiaomiAirPurifier(XiaomiGenericDevice): ) +class XiaomiAirPurifierMiot(XiaomiAirPurifier): + """Representation of a Xiaomi Air Purifier (MiOT protocol).""" + + @property + def speed(self): + """Return the current speed.""" + if self._state: + return AirpurifierMiotOperationMode(self._state_attrs[ATTR_MODE]).name + + return None + + async def async_set_speed(self, speed: str) -> None: + """Set the speed of the fan.""" + if self.supported_features & SUPPORT_SET_SPEED == 0: + return + + _LOGGER.debug("Setting the operation mode to: %s", speed) + + await self._try_command( + "Setting operation mode of the miio device failed.", + self._device.set_mode, + AirpurifierMiotOperationMode[speed.title()], + ) + + async def async_set_led_brightness(self, brightness: int = 2): + """Set the led brightness.""" + if self._device_features & FEATURE_SET_LED_BRIGHTNESS == 0: + return + + await self._try_command( + "Setting the led brightness of the miio device failed.", + self._device.set_led_brightness, + AirpurifierMiotLedBrightness(brightness), + ) + + class XiaomiAirHumidifier(XiaomiGenericDevice): """Representation of a Xiaomi Air Humidifier.""" diff --git a/homeassistant/components/xiaomi_miio/services.yaml b/homeassistant/components/xiaomi_miio/services.yaml index 36dcbc950be3..4306ce4e719f 100644 --- a/homeassistant/components/xiaomi_miio/services.yaml +++ b/homeassistant/components/xiaomi_miio/services.yaml @@ -50,6 +50,16 @@ fan_set_favorite_level: description: Level, between 0 and 16. example: 1 +fan_set_fan_level: + description: Set the fan level. + fields: + entity_id: + description: Name of the xiaomi miio entity. + example: 'fan.xiaomi_miio_device' + level: + description: Level, between 1 and 3. + example: 1 + fan_set_led_brightness: description: Set the led brightness. fields: From 066254afdfcc7cd513b9450e0693c1d188d12c4d Mon Sep 17 00:00:00 2001 From: Vilppu Vuorinen Date: Fri, 3 Apr 2020 18:45:09 +0300 Subject: [PATCH 061/653] Fix vertical/horizontal property mixup in melcloud (#33580) --- homeassistant/components/melcloud/climate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/melcloud/climate.py b/homeassistant/components/melcloud/climate.py index df3d9e893923..b79520772238 100644 --- a/homeassistant/components/melcloud/climate.py +++ b/homeassistant/components/melcloud/climate.py @@ -156,7 +156,7 @@ class AtaDeviceClimate(MelCloudClimate): ) vane_vertical = self._device.vane_vertical - if vane_horizontal: + if vane_vertical: attr.update( { ATTR_VANE_VERTICAL: vane_vertical, From a813847f6e9dcc0abc0d59994ac330593300909c Mon Sep 17 00:00:00 2001 From: Paul Beckcom <46651681+pbeckcom@users.noreply.github.com> Date: Fri, 3 Apr 2020 10:45:33 -0500 Subject: [PATCH 062/653] Automatic: fix OAuth2 redirect (#33581) Integration configuration cannot complete as it is currently looking for /states after authentication. Replacing with /lovelace to allow the script to complete after successful authentication with Automatic. --- homeassistant/components/automatic/device_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/automatic/device_tracker.py b/homeassistant/components/automatic/device_tracker.py index 0fc747ffaa97..0f48ef6376db 100644 --- a/homeassistant/components/automatic/device_tracker.py +++ b/homeassistant/components/automatic/device_tracker.py @@ -164,7 +164,7 @@ class AutomaticAuthCallbackView(HomeAssistantView): """Finish OAuth callback request.""" hass = request.app["hass"] params = request.query - response = web.HTTPFound("/states") + response = web.HTTPFound("/lovelace") if "state" not in params or "code" not in params: if "error" in params: From 4e6fd1962465eb7c1764532a9aed18b41d76ca14 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 3 Apr 2020 18:05:58 +0200 Subject: [PATCH 063/653] Improve MQTT test coverage and remove dead code (#33584) * Improve MQTT tests and remove dead code * Remove useless test. * Add more test --- homeassistant/components/mqtt/cover.py | 55 ++-- homeassistant/components/mqtt/discovery.py | 20 -- homeassistant/components/mqtt/fan.py | 6 - .../components/mqtt/vacuum/schema_legacy.py | 16 +- .../components/mqtt/vacuum/schema_state.py | 7 +- .../mqtt/test_alarm_control_panel.py | 31 ++- tests/components/mqtt/test_climate.py | 16 ++ tests/components/mqtt/test_cover.py | 201 +++++++++++--- tests/components/mqtt/test_discovery.py | 24 +- tests/components/mqtt/test_fan.py | 220 +++++++++++++++- tests/components/mqtt/test_init.py | 247 ++++++++++++++++++ tests/components/mqtt/test_legacy_vacuum.py | 43 ++- 12 files changed, 761 insertions(+), 125 deletions(-) diff --git a/homeassistant/components/mqtt/cover.py b/homeassistant/components/mqtt/cover.py index 3081c1d0d9ff..d5487bbe29f2 100644 --- a/homeassistant/components/mqtt/cover.py +++ b/homeassistant/components/mqtt/cover.py @@ -31,7 +31,6 @@ from homeassistant.const import ( STATE_UNKNOWN, ) from homeassistant.core import callback -from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.typing import ConfigType, HomeAssistantType @@ -531,9 +530,6 @@ class MqttCover( async def async_set_cover_tilt_position(self, **kwargs): """Move the cover tilt to a specific position.""" - if ATTR_TILT_POSITION not in kwargs: - return - position = float(kwargs[ATTR_TILT_POSITION]) # The position needs to be between min and max @@ -550,36 +546,31 @@ class MqttCover( async def async_set_cover_position(self, **kwargs): """Move the cover to a specific position.""" set_position_template = self._config.get(CONF_SET_POSITION_TEMPLATE) - if ATTR_POSITION in kwargs: - position = kwargs[ATTR_POSITION] - percentage_position = position - if set_position_template is not None: - try: - position = set_position_template.async_render(**kwargs) - except TemplateError as ex: - _LOGGER.error(ex) - self._state = None - elif ( - self._config[CONF_POSITION_OPEN] != 100 - and self._config[CONF_POSITION_CLOSED] != 0 - ): - position = self.find_in_range_from_percent(position, COVER_PAYLOAD) + position = kwargs[ATTR_POSITION] + percentage_position = position + if set_position_template is not None: + position = set_position_template.async_render(**kwargs) + elif ( + self._config[CONF_POSITION_OPEN] != 100 + and self._config[CONF_POSITION_CLOSED] != 0 + ): + position = self.find_in_range_from_percent(position, COVER_PAYLOAD) - mqtt.async_publish( - self.hass, - self._config.get(CONF_SET_POSITION_TOPIC), - position, - self._config[CONF_QOS], - self._config[CONF_RETAIN], + mqtt.async_publish( + self.hass, + self._config.get(CONF_SET_POSITION_TOPIC), + position, + self._config[CONF_QOS], + self._config[CONF_RETAIN], + ) + if self._optimistic: + self._state = ( + STATE_CLOSED + if percentage_position == self._config[CONF_POSITION_CLOSED] + else STATE_OPEN ) - if self._optimistic: - self._state = ( - STATE_CLOSED - if percentage_position == self._config[CONF_POSITION_CLOSED] - else STATE_OPEN - ) - self._position = percentage_position - self.async_write_ha_state() + self._position = percentage_position + self.async_write_ha_state() async def async_toggle_tilt(self, **kwargs): """Toggle the entity.""" diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index 689b279c5e77..47a7f5a20377 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -6,7 +6,6 @@ import re from homeassistant.components import mqtt from homeassistant.const import CONF_DEVICE, CONF_PLATFORM -from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.typing import HomeAssistantType @@ -35,21 +34,6 @@ SUPPORTED_COMPONENTS = [ "vacuum", ] -CONFIG_ENTRY_COMPONENTS = [ - "alarm_control_panel", - "binary_sensor", - "camera", - "climate", - "cover", - "device_automation", - "fan", - "light", - "lock", - "sensor", - "switch", - "vacuum", -] - ALREADY_DISCOVERED = "mqtt_discovered_components" DATA_CONFIG_ENTRY_LOCK = "mqtt_config_entry_lock" CONFIG_ENTRY_IS_SETUP = "mqtt_config_entry_is_setup" @@ -159,10 +143,6 @@ async def async_start( _LOGGER.info("Found new component: %s %s", component, discovery_id) hass.data[ALREADY_DISCOVERED][discovery_hash] = None - if component not in CONFIG_ENTRY_COMPONENTS: - await async_load_platform(hass, component, "mqtt", payload, hass_config) - return - config_entries_key = f"{component}.mqtt" async with hass.data[DATA_CONFIG_ENTRY_LOCK]: if config_entries_key not in hass.data[CONFIG_ENTRY_IS_SETUP]: diff --git a/homeassistant/components/mqtt/fan.py b/homeassistant/components/mqtt/fan.py index ec7c729d5976..9ce3809bfe84 100644 --- a/homeassistant/components/mqtt/fan.py +++ b/homeassistant/components/mqtt/fan.py @@ -401,9 +401,6 @@ class MqttFan( This method is a coroutine. """ - if self._topic[CONF_SPEED_COMMAND_TOPIC] is None: - return - if speed == SPEED_LOW: mqtt_payload = self._payload["SPEED_LOW"] elif speed == SPEED_MEDIUM: @@ -432,9 +429,6 @@ class MqttFan( This method is a coroutine. """ - if self._topic[CONF_OSCILLATION_COMMAND_TOPIC] is None: - return - if oscillating is False: payload = self._payload["OSCILLATE_OFF_PAYLOAD"] else: diff --git a/homeassistant/components/mqtt/vacuum/schema_legacy.py b/homeassistant/components/mqtt/vacuum/schema_legacy.py index 687fefa94e21..85851bcf696d 100644 --- a/homeassistant/components/mqtt/vacuum/schema_legacy.py +++ b/homeassistant/components/mqtt/vacuum/schema_legacy.py @@ -410,24 +410,26 @@ class MqttVacuum( @property def fan_speed_list(self): - """Return the status of the vacuum.""" - if self.supported_features & SUPPORT_FAN_SPEED == 0: - return [] + """Return the status of the vacuum. + + No need to check SUPPORT_FAN_SPEED, this won't be called if fan_speed is None. + """ return self._fan_speed_list @property def battery_level(self): """Return the status of the vacuum.""" if self.supported_features & SUPPORT_BATTERY == 0: - return + return None return max(0, min(100, self._battery_level)) @property def battery_icon(self): - """Return the battery icon for the vacuum cleaner.""" - if self.supported_features & SUPPORT_BATTERY == 0: - return + """Return the battery icon for the vacuum cleaner. + + No need to check SUPPORT_BATTERY, this won't be called if battery_level is None. + """ return icon_for_battery_level( battery_level=self.battery_level, charging=self._charging diff --git a/homeassistant/components/mqtt/vacuum/schema_state.py b/homeassistant/components/mqtt/vacuum/schema_state.py index 254d841aebcd..a59beae1d346 100644 --- a/homeassistant/components/mqtt/vacuum/schema_state.py +++ b/homeassistant/components/mqtt/vacuum/schema_state.py @@ -282,9 +282,10 @@ class MqttStateVacuum( @property def fan_speed_list(self): - """Return fan speed list of the vacuum.""" - if self.supported_features & SUPPORT_FAN_SPEED == 0: - return None + """Return fan speed list of the vacuum. + + No need to check SUPPORT_FAN_SPEED, this won't be called if fan_speed is None. + """ return self._fan_speed_list @property diff --git a/tests/components/mqtt/test_alarm_control_panel.py b/tests/components/mqtt/test_alarm_control_panel.py index ba1855247fe4..f8c10516f24a 100644 --- a/tests/components/mqtt/test_alarm_control_panel.py +++ b/tests/components/mqtt/test_alarm_control_panel.py @@ -42,7 +42,8 @@ from tests.common import ( ) from tests.components.alarm_control_panel import common -CODE = "HELLO_CODE" +CODE_NUMBER = "1234" +CODE_TEXT = "HELLO_CODE" DEFAULT_CONFIG = { alarm_control_panel.DOMAIN: { @@ -341,6 +342,34 @@ async def test_update_state_via_state_topic_template(hass, mqtt_mock): assert state.state == STATE_ALARM_ARMED_AWAY +async def test_attributes_code_number(hass, mqtt_mock): + """Test attributes which are not supported by the vacuum.""" + config = copy.deepcopy(DEFAULT_CONFIG) + config[alarm_control_panel.DOMAIN]["code"] = CODE_NUMBER + + assert await async_setup_component(hass, alarm_control_panel.DOMAIN, config) + + state = hass.states.get("alarm_control_panel.test") + assert ( + state.attributes.get(alarm_control_panel.ATTR_CODE_FORMAT) + == alarm_control_panel.FORMAT_NUMBER + ) + + +async def test_attributes_code_text(hass, mqtt_mock): + """Test attributes which are not supported by the vacuum.""" + config = copy.deepcopy(DEFAULT_CONFIG) + config[alarm_control_panel.DOMAIN]["code"] = CODE_TEXT + + assert await async_setup_component(hass, alarm_control_panel.DOMAIN, config) + + state = hass.states.get("alarm_control_panel.test") + assert ( + state.attributes.get(alarm_control_panel.ATTR_CODE_FORMAT) + == alarm_control_panel.FORMAT_TEXT + ) + + async def test_availability_without_topic(hass, mqtt_mock): """Test availability without defined availability topic.""" await help_test_availability_without_topic( diff --git a/tests/components/mqtt/test_climate.py b/tests/components/mqtt/test_climate.py index d5b303a51f07..03e22cd72e2e 100644 --- a/tests/components/mqtt/test_climate.py +++ b/tests/components/mqtt/test_climate.py @@ -534,6 +534,22 @@ async def test_set_hold(hass, mqtt_mock): assert state.attributes.get("preset_mode") is None +async def test_set_preset_mode_twice(hass, mqtt_mock): + """Test setting of the same mode twice only publishes once.""" + assert await async_setup_component(hass, CLIMATE_DOMAIN, DEFAULT_CONFIG) + + state = hass.states.get(ENTITY_CLIMATE) + assert state.attributes.get("preset_mode") is None + await common.async_set_preset_mode(hass, "hold-on", ENTITY_CLIMATE) + mqtt_mock.async_publish.assert_called_once_with("hold-topic", "hold-on", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get(ENTITY_CLIMATE) + assert state.attributes.get("preset_mode") == "hold-on" + + await common.async_set_preset_mode(hass, "hold-on", ENTITY_CLIMATE) + mqtt_mock.async_publish.assert_not_called() + + async def test_set_aux_pessimistic(hass, mqtt_mock): """Test setting of the aux heating in pessimistic mode.""" config = copy.deepcopy(DEFAULT_CONFIG) diff --git a/tests/components/mqtt/test_cover.py b/tests/components/mqtt/test_cover.py index 7d0753a9de2e..6de462b90202 100644 --- a/tests/components/mqtt/test_cover.py +++ b/tests/components/mqtt/test_cover.py @@ -1,6 +1,11 @@ """The tests for the MQTT cover platform.""" from homeassistant.components import cover -from homeassistant.components.cover import ATTR_POSITION, ATTR_TILT_POSITION +from homeassistant.components.cover import ( + ATTR_CURRENT_POSITION, + ATTR_CURRENT_TILT_POSITION, + ATTR_POSITION, + ATTR_TILT_POSITION, +) from homeassistant.components.mqtt.cover import MqttCover from homeassistant.const import ( ATTR_ASSUMED_STATE, @@ -335,6 +340,68 @@ async def test_optimistic_state_change(hass, mqtt_mock): assert state.state == STATE_CLOSED +async def test_optimistic_state_change_with_position(hass, mqtt_mock): + """Test changing state optimistically.""" + assert await async_setup_component( + hass, + cover.DOMAIN, + { + cover.DOMAIN: { + "platform": "mqtt", + "name": "test", + "optimistic": True, + "command_topic": "command-topic", + "position_topic": "position-topic", + "qos": 0, + } + }, + ) + + state = hass.states.get("cover.test") + assert state.state == STATE_UNKNOWN + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(ATTR_CURRENT_POSITION) is None + + await hass.services.async_call( + cover.DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: "cover.test"}, blocking=True + ) + + mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("cover.test") + assert state.state == STATE_OPEN + assert state.attributes.get(ATTR_CURRENT_POSITION) == 100 + + await hass.services.async_call( + cover.DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: "cover.test"}, blocking=True + ) + + mqtt_mock.async_publish.assert_called_once_with("command-topic", "CLOSE", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("cover.test") + assert STATE_CLOSED == state.state + assert state.attributes.get(ATTR_CURRENT_POSITION) == 0 + + await hass.services.async_call( + cover.DOMAIN, SERVICE_TOGGLE, {ATTR_ENTITY_ID: "cover.test"}, blocking=True + ) + + mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("cover.test") + assert STATE_OPEN == state.state + assert state.attributes.get(ATTR_CURRENT_POSITION) == 100 + + await hass.services.async_call( + cover.DOMAIN, SERVICE_TOGGLE, {ATTR_ENTITY_ID: "cover.test"}, blocking=True + ) + + mqtt_mock.async_publish.assert_called_once_with("command-topic", "CLOSE", 0, False) + state = hass.states.get("cover.test") + assert state.state == STATE_CLOSED + assert state.attributes.get(ATTR_CURRENT_POSITION) == 0 + + async def test_send_open_cover_command(hass, mqtt_mock): """Test the sending of open_cover.""" assert await async_setup_component( @@ -440,31 +507,31 @@ async def test_current_cover_position(hass, mqtt_mock): ) state_attributes_dict = hass.states.get("cover.test").attributes - assert not ("current_position" in state_attributes_dict) - assert not ("current_tilt_position" in state_attributes_dict) + assert not (ATTR_CURRENT_POSITION in state_attributes_dict) + assert not (ATTR_CURRENT_TILT_POSITION in state_attributes_dict) assert not (4 & hass.states.get("cover.test").attributes["supported_features"] == 4) async_fire_mqtt_message(hass, "get-position-topic", "0") current_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_cover_position == 0 async_fire_mqtt_message(hass, "get-position-topic", "50") current_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_cover_position == 50 async_fire_mqtt_message(hass, "get-position-topic", "non-numeric") current_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_cover_position == 50 async_fire_mqtt_message(hass, "get-position-topic", "101") current_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_cover_position == 100 @@ -490,48 +557,67 @@ async def test_current_cover_position_inverted(hass, mqtt_mock): ) state_attributes_dict = hass.states.get("cover.test").attributes - assert not ("current_position" in state_attributes_dict) - assert not ("current_tilt_position" in state_attributes_dict) + assert not (ATTR_CURRENT_POSITION in state_attributes_dict) + assert not (ATTR_CURRENT_TILT_POSITION in state_attributes_dict) assert not (4 & hass.states.get("cover.test").attributes["supported_features"] == 4) async_fire_mqtt_message(hass, "get-position-topic", "100") current_percentage_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_percentage_cover_position == 0 assert hass.states.get("cover.test").state == STATE_CLOSED async_fire_mqtt_message(hass, "get-position-topic", "0") current_percentage_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_percentage_cover_position == 100 assert hass.states.get("cover.test").state == STATE_OPEN async_fire_mqtt_message(hass, "get-position-topic", "50") current_percentage_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_percentage_cover_position == 50 assert hass.states.get("cover.test").state == STATE_OPEN async_fire_mqtt_message(hass, "get-position-topic", "non-numeric") current_percentage_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_percentage_cover_position == 50 assert hass.states.get("cover.test").state == STATE_OPEN async_fire_mqtt_message(hass, "get-position-topic", "101") current_percentage_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_percentage_cover_position == 0 assert hass.states.get("cover.test").state == STATE_CLOSED -async def test_set_cover_position(hass, mqtt_mock): - """Test setting cover position.""" +async def test_optimistic_position(hass, mqtt_mock): + """Test optimistic position is not supported.""" + assert await async_setup_component( + hass, + cover.DOMAIN, + { + cover.DOMAIN: { + "platform": "mqtt", + "name": "test", + "command_topic": "command-topic", + "set_position_topic": "set-position-topic", + } + }, + ) + + state = hass.states.get("cover.test") + assert state is None + + +async def test_position_update(hass, mqtt_mock): + """Test cover position update from received MQTT message.""" assert await async_setup_component( hass, cover.DOMAIN, @@ -552,16 +638,16 @@ async def test_set_cover_position(hass, mqtt_mock): ) state_attributes_dict = hass.states.get("cover.test").attributes - assert not ("current_position" in state_attributes_dict) - assert not ("current_tilt_position" in state_attributes_dict) + assert not (ATTR_CURRENT_POSITION in state_attributes_dict) + assert not (ATTR_CURRENT_TILT_POSITION in state_attributes_dict) assert 4 & hass.states.get("cover.test").attributes["supported_features"] == 4 async_fire_mqtt_message(hass, "get-position-topic", "22") state_attributes_dict = hass.states.get("cover.test").attributes - assert "current_position" in state_attributes_dict - assert not ("current_tilt_position" in state_attributes_dict) + assert ATTR_CURRENT_POSITION in state_attributes_dict + assert not (ATTR_CURRENT_TILT_POSITION in state_attributes_dict) current_cover_position = hass.states.get("cover.test").attributes[ - "current_position" + ATTR_CURRENT_POSITION ] assert current_cover_position == 22 @@ -629,6 +715,37 @@ async def test_set_position_untemplated(hass, mqtt_mock): mqtt_mock.async_publish.assert_called_once_with("position-topic", 62, 0, False) +async def test_set_position_untemplated_custom_percentage_range(hass, mqtt_mock): + """Test setting cover position via template.""" + assert await async_setup_component( + hass, + cover.DOMAIN, + { + cover.DOMAIN: { + "platform": "mqtt", + "name": "test", + "position_topic": "state-topic", + "command_topic": "command-topic", + "set_position_topic": "position-topic", + "position_open": 0, + "position_closed": 100, + "payload_open": "OPEN", + "payload_close": "CLOSE", + "payload_stop": "STOP", + } + }, + ) + + await hass.services.async_call( + cover.DOMAIN, + SERVICE_SET_COVER_POSITION, + {ATTR_ENTITY_ID: "cover.test", ATTR_POSITION: 38}, + blocking=True, + ) + + mqtt_mock.async_publish.assert_called_once_with("position-topic", 62, 0, False) + + async def test_no_command_topic(hass, mqtt_mock): """Test with no command topic.""" assert await async_setup_component( @@ -717,10 +834,10 @@ async def test_tilt_defaults(hass, mqtt_mock): ) state_attributes_dict = hass.states.get("cover.test").attributes - assert "current_tilt_position" in state_attributes_dict + assert ATTR_CURRENT_TILT_POSITION in state_attributes_dict current_cover_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_position == STATE_UNKNOWN @@ -770,7 +887,7 @@ async def test_tilt_via_invocation_defaults(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "0") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 @@ -788,7 +905,7 @@ async def test_tilt_via_invocation_defaults(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "100") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 100 @@ -849,7 +966,7 @@ async def test_tilt_given_value(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "25") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 25 @@ -867,7 +984,7 @@ async def test_tilt_given_value(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "80") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 80 @@ -913,7 +1030,7 @@ async def test_tilt_given_value_optimistic(hass, mqtt_mock): ) current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 80 @@ -928,7 +1045,7 @@ async def test_tilt_given_value_optimistic(hass, mqtt_mock): ) current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 25 @@ -969,7 +1086,7 @@ async def test_tilt_given_value_altered_range(hass, mqtt_mock): ) current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 @@ -984,7 +1101,7 @@ async def test_tilt_given_value_altered_range(hass, mqtt_mock): ) current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 @@ -999,7 +1116,7 @@ async def test_tilt_given_value_altered_range(hass, mqtt_mock): ) current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 @@ -1030,14 +1147,14 @@ async def test_tilt_via_topic(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "0") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 async_fire_mqtt_message(hass, "tilt-status-topic", "50") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 @@ -1069,14 +1186,14 @@ async def test_tilt_via_topic_template(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "99") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 async_fire_mqtt_message(hass, "tilt-status-topic", "5000") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 @@ -1107,21 +1224,21 @@ async def test_tilt_via_topic_altered_range(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "0") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 async_fire_mqtt_message(hass, "tilt-status-topic", "50") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 100 async_fire_mqtt_message(hass, "tilt-status-topic", "25") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 @@ -1155,21 +1272,21 @@ async def test_tilt_via_topic_template_altered_range(hass, mqtt_mock): async_fire_mqtt_message(hass, "tilt-status-topic", "99") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 0 async_fire_mqtt_message(hass, "tilt-status-topic", "5000") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 100 async_fire_mqtt_message(hass, "tilt-status-topic", "2500") current_cover_tilt_position = hass.states.get("cover.test").attributes[ - "current_tilt_position" + ATTR_CURRENT_TILT_POSITION ] assert current_cover_tilt_position == 50 diff --git a/tests/components/mqtt/test_discovery.py b/tests/components/mqtt/test_discovery.py index 8c925bdf3153..71e694f68078 100644 --- a/tests/components/mqtt/test_discovery.py +++ b/tests/components/mqtt/test_discovery.py @@ -51,32 +51,32 @@ async def test_subscribing_config_topic(hass, mqtt_mock): async def test_invalid_topic(hass, mqtt_mock): """Test sending to invalid topic.""" with patch( - "homeassistant.components.mqtt.discovery.async_load_platform" - ) as mock_load_platform: + "homeassistant.components.mqtt.discovery.async_dispatcher_send" + ) as mock_dispatcher_send: entry = MockConfigEntry( domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker"} ) - mock_load_platform.return_value = mock_coro() + mock_dispatcher_send.return_value = mock_coro() await async_start(hass, "homeassistant", {}, entry) async_fire_mqtt_message( hass, "homeassistant/binary_sensor/bla/not_config", "{}" ) await hass.async_block_till_done() - assert not mock_load_platform.called + assert not mock_dispatcher_send.called async def test_invalid_json(hass, mqtt_mock, caplog): """Test sending in invalid JSON.""" with patch( - "homeassistant.components.mqtt.discovery.async_load_platform" - ) as mock_load_platform: + "homeassistant.components.mqtt.discovery.async_dispatcher_send" + ) as mock_dispatcher_send: entry = MockConfigEntry( domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker"} ) - mock_load_platform.return_value = mock_coro() + mock_dispatcher_send.return_value = mock_coro() await async_start(hass, "homeassistant", {}, entry) async_fire_mqtt_message( @@ -84,19 +84,19 @@ async def test_invalid_json(hass, mqtt_mock, caplog): ) await hass.async_block_till_done() assert "Unable to parse JSON" in caplog.text - assert not mock_load_platform.called + assert not mock_dispatcher_send.called async def test_only_valid_components(hass, mqtt_mock, caplog): """Test for a valid component.""" with patch( - "homeassistant.components.mqtt.discovery.async_load_platform" - ) as mock_load_platform: + "homeassistant.components.mqtt.discovery.async_dispatcher_send" + ) as mock_dispatcher_send: entry = MockConfigEntry(domain=mqtt.DOMAIN) invalid_component = "timer" - mock_load_platform.return_value = mock_coro() + mock_dispatcher_send.return_value = mock_coro() await async_start(hass, "homeassistant", {}, entry) async_fire_mqtt_message( @@ -107,7 +107,7 @@ async def test_only_valid_components(hass, mqtt_mock, caplog): assert "Integration {} is not supported".format(invalid_component) in caplog.text - assert not mock_load_platform.called + assert not mock_dispatcher_send.called async def test_correct_config_discovery(hass, mqtt_mock, caplog): diff --git a/tests/components/mqtt/test_fan.py b/tests/components/mqtt/test_fan.py index 6b774e9d5ce4..6ef1c0aab860 100644 --- a/tests/components/mqtt/test_fan.py +++ b/tests/components/mqtt/test_fan.py @@ -1,6 +1,11 @@ """Test MQTT fans.""" from homeassistant.components import fan -from homeassistant.const import ATTR_ASSUMED_STATE, STATE_OFF, STATE_ON +from homeassistant.const import ( + ATTR_ASSUMED_STATE, + ATTR_SUPPORTED_FEATURES, + STATE_OFF, + STATE_ON, +) from homeassistant.setup import async_setup_component from .test_common import ( @@ -278,6 +283,54 @@ async def test_sending_mqtt_commands_and_optimistic(hass, mqtt_mock): assert state.attributes.get(ATTR_ASSUMED_STATE) +async def test_on_sending_mqtt_commands_and_optimistic(hass, mqtt_mock): + """Test on with speed.""" + assert await async_setup_component( + hass, + fan.DOMAIN, + { + fan.DOMAIN: { + "platform": "mqtt", + "name": "test", + "command_topic": "command-topic", + "oscillation_command_topic": "oscillation-command-topic", + "speed_command_topic": "speed-command-topic", + } + }, + ) + + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + + await common.async_turn_on(hass, "fan.test") + mqtt_mock.async_publish.assert_called_once_with("command-topic", "ON", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test") + assert state.state is STATE_ON + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) is None + assert state.attributes.get(fan.ATTR_OSCILLATING) is None + + await common.async_turn_off(hass, "fan.test") + mqtt_mock.async_publish.assert_called_once_with("command-topic", "OFF", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + + await common.async_turn_on(hass, "fan.test", speed="low") + assert mqtt_mock.async_publish.call_count == 2 + mqtt_mock.async_publish.assert_any_call("command-topic", "ON", 0, False) + mqtt_mock.async_publish.assert_any_call("speed-command-topic", "low", 0, False) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test") + assert state.state is STATE_ON + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "low" + assert state.attributes.get(fan.ATTR_OSCILLATING) is None + + async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): """Test optimistic mode with state topic.""" assert await async_setup_component( @@ -370,6 +423,171 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): assert state.state is STATE_OFF assert state.attributes.get(ATTR_ASSUMED_STATE) + await common.async_set_speed(hass, "fan.test", "cUsToM") + mqtt_mock.async_publish.assert_called_once_with( + "speed-command-topic", "cUsToM", 0, False + ) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + + +async def test_attributes(hass, mqtt_mock): + """Test attributes.""" + assert await async_setup_component( + hass, + fan.DOMAIN, + { + fan.DOMAIN: { + "platform": "mqtt", + "name": "test", + "command_topic": "command-topic", + "oscillation_command_topic": "oscillation-command-topic", + "speed_command_topic": "speed-command-topic", + } + }, + ) + + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(fan.ATTR_SPEED_LIST) == ["off", "low", "medium", "high"] + + await common.async_turn_on(hass, "fan.test") + state = hass.states.get("fan.test") + assert state.state is STATE_ON + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) is None + assert state.attributes.get(fan.ATTR_OSCILLATING) is None + + await common.async_turn_off(hass, "fan.test") + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) is None + assert state.attributes.get(fan.ATTR_OSCILLATING) is None + + await common.async_oscillate(hass, "fan.test", True) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) is None + assert state.attributes.get(fan.ATTR_OSCILLATING) is True + + await common.async_oscillate(hass, "fan.test", False) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) is None + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + await common.async_set_speed(hass, "fan.test", fan.SPEED_LOW) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "low" + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + await common.async_set_speed(hass, "fan.test", fan.SPEED_MEDIUM) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "medium" + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + await common.async_set_speed(hass, "fan.test", fan.SPEED_HIGH) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "high" + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + await common.async_set_speed(hass, "fan.test", fan.SPEED_OFF) + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "off" + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + await common.async_set_speed(hass, "fan.test", "cUsToM") + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(ATTR_ASSUMED_STATE) + assert state.attributes.get(fan.ATTR_SPEED) == "cUsToM" + assert state.attributes.get(fan.ATTR_OSCILLATING) is False + + +async def test_custom_speed_list(hass, mqtt_mock): + """Test optimistic mode without state topic.""" + assert await async_setup_component( + hass, + fan.DOMAIN, + { + fan.DOMAIN: { + "platform": "mqtt", + "name": "test", + "command_topic": "command-topic", + "oscillation_command_topic": "oscillation-command-topic", + "oscillation_state_topic": "oscillation-state-topic", + "speed_command_topic": "speed-command-topic", + "speed_state_topic": "speed-state-topic", + "speeds": ["off", "high"], + } + }, + ) + + state = hass.states.get("fan.test") + assert state.state is STATE_OFF + assert state.attributes.get(fan.ATTR_SPEED_LIST) == ["off", "high"] + + +async def test_supported_features(hass, mqtt_mock): + """Test optimistic mode without state topic.""" + assert await async_setup_component( + hass, + fan.DOMAIN, + { + fan.DOMAIN: [ + { + "platform": "mqtt", + "name": "test1", + "command_topic": "command-topic", + }, + { + "platform": "mqtt", + "name": "test2", + "command_topic": "command-topic", + "oscillation_command_topic": "oscillation-command-topic", + }, + { + "platform": "mqtt", + "name": "test3", + "command_topic": "command-topic", + "speed_command_topic": "speed-command-topic", + }, + { + "platform": "mqtt", + "name": "test4", + "command_topic": "command-topic", + "oscillation_command_topic": "oscillation-command-topic", + "speed_command_topic": "speed-command-topic", + }, + ] + }, + ) + + state = hass.states.get("fan.test1") + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 0 + state = hass.states.get("fan.test2") + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == fan.SUPPORT_OSCILLATE + state = hass.states.get("fan.test3") + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == fan.SUPPORT_SET_SPEED + state = hass.states.get("fan.test4") + assert ( + state.attributes.get(ATTR_SUPPORTED_FEATURES) + == fan.SUPPORT_OSCILLATE | fan.SUPPORT_SET_SPEED + ) + async def test_availability_without_topic(hass, mqtt_mock): """Test availability without defined availability topic.""" diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 60ca91b00520..861b2fa30e8d 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -9,6 +9,7 @@ import pytest import voluptuous as vol from homeassistant.components import mqtt, websocket_api +from homeassistant.components.mqtt import debug_info from homeassistant.components.mqtt.discovery import async_start from homeassistant.const import ( ATTR_DOMAIN, @@ -36,6 +37,7 @@ from tests.common import ( mock_storage, threadsafe_coroutine_factory, ) +from tests.testing_config.custom_components.test.sensor import DEVICE_CLASSES @pytest.fixture @@ -363,6 +365,56 @@ class TestMQTTCallbacks(unittest.TestCase): self.hass.block_till_done() assert len(self.calls) == 1 + def test_subscribe_deprecated(self): + """Test the subscription of a topic using deprecated callback signature.""" + calls = [] + + @callback + def record_calls(topic, payload, qos): + """Record calls.""" + calls.append((topic, payload, qos)) + + unsub = mqtt.subscribe(self.hass, "test-topic", record_calls) + + fire_mqtt_message(self.hass, "test-topic", "test-payload") + + self.hass.block_till_done() + assert len(calls) == 1 + assert calls[0][0] == "test-topic" + assert calls[0][1] == "test-payload" + + unsub() + + fire_mqtt_message(self.hass, "test-topic", "test-payload") + + self.hass.block_till_done() + assert len(calls) == 1 + + def test_subscribe_deprecated_async(self): + """Test the subscription of a topic using deprecated callback signature.""" + calls = [] + + @callback + async def record_calls(topic, payload, qos): + """Record calls.""" + calls.append((topic, payload, qos)) + + unsub = mqtt.subscribe(self.hass, "test-topic", record_calls) + + fire_mqtt_message(self.hass, "test-topic", "test-payload") + + self.hass.block_till_done() + assert len(calls) == 1 + assert calls[0][0] == "test-topic" + assert calls[0][1] == "test-payload" + + unsub() + + fire_mqtt_message(self.hass, "test-topic", "test-payload") + + self.hass.block_till_done() + assert len(calls) == 1 + def test_subscribe_topic_not_match(self): """Test if subscribed topic is not a match.""" mqtt.subscribe(self.hass, "test-topic", self.record_calls) @@ -988,3 +1040,198 @@ async def test_mqtt_ws_get_device_debug_info( "triggers": [], } assert response["result"] == expected_result + + +async def test_debug_info_multiple_devices(hass, mqtt_mock): + """Test we get correct debug_info when multiple devices are present.""" + devices = [ + { + "domain": "sensor", + "config": { + "device": {"identifiers": ["0AFFD0"]}, + "platform": "mqtt", + "state_topic": "test-topic-sensor", + "unique_id": "unique", + }, + }, + { + "domain": "binary_sensor", + "config": { + "device": {"identifiers": ["0AFFD1"]}, + "platform": "mqtt", + "state_topic": "test-topic-binary-sensor", + "unique_id": "unique", + }, + }, + { + "domain": "device_automation", + "config": { + "automation_type": "trigger", + "device": {"identifiers": ["0AFFD2"]}, + "platform": "mqtt", + "topic": "test-topic1", + "type": "foo", + "subtype": "bar", + }, + }, + { + "domain": "device_automation", + "config": { + "automation_type": "trigger", + "device": {"identifiers": ["0AFFD3"]}, + "platform": "mqtt", + "topic": "test-topic2", + "type": "ikk", + "subtype": "baz", + }, + }, + ] + + entry = MockConfigEntry(domain=mqtt.DOMAIN) + entry.add_to_hass(hass) + await async_start(hass, "homeassistant", {}, entry) + registry = await hass.helpers.device_registry.async_get_registry() + + for d in devices: + data = json.dumps(d["config"]) + domain = d["domain"] + id = d["config"]["device"]["identifiers"][0] + async_fire_mqtt_message(hass, f"homeassistant/{domain}/{id}/config", data) + await hass.async_block_till_done() + + for d in devices: + domain = d["domain"] + id = d["config"]["device"]["identifiers"][0] + device = registry.async_get_device({("mqtt", id)}, set()) + assert device is not None + + debug_info_data = await debug_info.info_for_device(hass, device.id) + if d["domain"] != "device_automation": + assert len(debug_info_data["entities"]) == 1 + assert len(debug_info_data["triggers"]) == 0 + discovery_data = debug_info_data["entities"][0]["discovery_data"] + assert len(debug_info_data["entities"][0]["topics"]) == 1 + topic = d["config"]["state_topic"] + assert {"topic": topic, "messages": []} in debug_info_data["entities"][0][ + "topics" + ] + else: + assert len(debug_info_data["entities"]) == 0 + assert len(debug_info_data["triggers"]) == 1 + discovery_data = debug_info_data["triggers"][0]["discovery_data"] + + assert discovery_data["topic"] == f"homeassistant/{domain}/{id}/config" + assert discovery_data["payload"] == d["config"] + + +async def test_debug_info_multiple_entities_triggers(hass, mqtt_mock): + """Test we get correct debug_info for a device with multiple entities and triggers.""" + config = [ + { + "domain": "sensor", + "config": { + "device": {"identifiers": ["0AFFD0"]}, + "platform": "mqtt", + "state_topic": "test-topic-sensor", + "unique_id": "unique", + }, + }, + { + "domain": "binary_sensor", + "config": { + "device": {"identifiers": ["0AFFD0"]}, + "platform": "mqtt", + "state_topic": "test-topic-binary-sensor", + "unique_id": "unique", + }, + }, + { + "domain": "device_automation", + "config": { + "automation_type": "trigger", + "device": {"identifiers": ["0AFFD0"]}, + "platform": "mqtt", + "topic": "test-topic1", + "type": "foo", + "subtype": "bar", + }, + }, + { + "domain": "device_automation", + "config": { + "automation_type": "trigger", + "device": {"identifiers": ["0AFFD0"]}, + "platform": "mqtt", + "topic": "test-topic2", + "type": "ikk", + "subtype": "baz", + }, + }, + ] + + entry = MockConfigEntry(domain=mqtt.DOMAIN) + entry.add_to_hass(hass) + await async_start(hass, "homeassistant", {}, entry) + registry = await hass.helpers.device_registry.async_get_registry() + + for c in config: + data = json.dumps(c["config"]) + domain = c["domain"] + # Use topic as discovery_id + id = c["config"].get("topic", c["config"].get("state_topic")) + async_fire_mqtt_message(hass, f"homeassistant/{domain}/{id}/config", data) + await hass.async_block_till_done() + + device_id = config[0]["config"]["device"]["identifiers"][0] + device = registry.async_get_device({("mqtt", device_id)}, set()) + assert device is not None + debug_info_data = await debug_info.info_for_device(hass, device.id) + assert len(debug_info_data["entities"]) == 2 + assert len(debug_info_data["triggers"]) == 2 + + for c in config: + # Test we get debug info for each entity and trigger + domain = c["domain"] + # Use topic as discovery_id + id = c["config"].get("topic", c["config"].get("state_topic")) + + if c["domain"] != "device_automation": + discovery_data = [e["discovery_data"] for e in debug_info_data["entities"]] + topic = c["config"]["state_topic"] + assert {"topic": topic, "messages": []} in [ + t for e in debug_info_data["entities"] for t in e["topics"] + ] + else: + discovery_data = [e["discovery_data"] for e in debug_info_data["triggers"]] + + assert { + "topic": f"homeassistant/{domain}/{id}/config", + "payload": c["config"], + } in discovery_data + + +async def test_debug_info_non_mqtt(hass, device_reg, entity_reg): + """Test we get empty debug_info for a device with non MQTT entities.""" + DOMAIN = "sensor" + platform = getattr(hass.components, f"test.{DOMAIN}") + platform.init() + + config_entry = MockConfigEntry(domain="test", data={}) + config_entry.add_to_hass(hass) + device_entry = device_reg.async_get_or_create( + config_entry_id=config_entry.entry_id, + connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")}, + ) + for device_class in DEVICE_CLASSES: + entity_reg.async_get_or_create( + DOMAIN, + "test", + platform.ENTITIES[device_class].unique_id, + device_id=device_entry.id, + ) + + assert await async_setup_component(hass, DOMAIN, {DOMAIN: {"platform": "test"}}) + + debug_info_data = await debug_info.info_for_device(hass, device_entry.id) + assert len(debug_info_data["entities"]) == 0 + assert len(debug_info_data["triggers"]) == 0 diff --git a/tests/components/mqtt/test_legacy_vacuum.py b/tests/components/mqtt/test_legacy_vacuum.py index 0ddb661cf857..9e774bfdf1ed 100644 --- a/tests/components/mqtt/test_legacy_vacuum.py +++ b/tests/components/mqtt/test_legacy_vacuum.py @@ -14,6 +14,7 @@ from homeassistant.components.vacuum import ( ATTR_BATTERY_ICON, ATTR_BATTERY_LEVEL, ATTR_FAN_SPEED, + ATTR_FAN_SPEED_LIST, ATTR_STATUS, ) from homeassistant.const import CONF_NAME, CONF_PLATFORM, STATE_OFF, STATE_ON @@ -223,10 +224,20 @@ async def test_attributes_without_supported_features(hass, mqtt_mock): assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config}) + message = """{ + "battery_level": 54, + "cleaning": true, + "docked": false, + "charging": false, + "fan_speed": "max" + }""" + async_fire_mqtt_message(hass, "vacuum/state", message) state = hass.states.get("vacuum.mqtttest") - assert state.state == STATE_OFF + assert state.state == STATE_ON assert state.attributes.get(ATTR_BATTERY_LEVEL) is None assert state.attributes.get(ATTR_BATTERY_ICON) is None + assert state.attributes.get(ATTR_FAN_SPEED) is None + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None async def test_status(hass, mqtt_mock): @@ -353,6 +364,36 @@ async def test_status_fan_speed(hass, mqtt_mock): assert state.attributes.get(ATTR_FAN_SPEED) == "max" +async def test_status_fan_speed_list(hass, mqtt_mock): + """Test status updates from the vacuum.""" + config = deepcopy(DEFAULT_CONFIG) + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( + ALL_SERVICES, SERVICE_TO_STRING + ) + + assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config}) + + state = hass.states.get("vacuum.mqtttest") + assert state.attributes.get(ATTR_FAN_SPEED_LIST) == ["min", "medium", "high", "max"] + + +async def test_status_no_fan_speed_list(hass, mqtt_mock): + """Test status updates from the vacuum. + + If the vacuum doesn't support fan speed, fan speed list should be None. + """ + config = deepcopy(DEFAULT_CONFIG) + services = ALL_SERVICES - mqttvacuum.SUPPORT_FAN_SPEED + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( + services, SERVICE_TO_STRING + ) + + assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config}) + + state = hass.states.get("vacuum.mqtttest") + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None + + async def test_status_error(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) From b8e9e3af2f40b15be52079e615ae72dca33f319f Mon Sep 17 00:00:00 2001 From: shred86 <32663154+shred86@users.noreply.github.com> Date: Fri, 3 Apr 2020 09:08:32 -0700 Subject: [PATCH 064/653] Add Abode entity available property (#32923) * Add available property and raise exception * Add entity available property * Refactoring and fixes * Refactoring and fix for multi sensor * Bump abodepy version --- homeassistant/components/abode/__init__.py | 92 +++++++++++++------- homeassistant/components/abode/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/abode/__init__.py b/homeassistant/components/abode/__init__.py index 687d0d31263c..9ecd2ffd1554 100644 --- a/homeassistant/components/abode/__init__.py +++ b/homeassistant/components/abode/__init__.py @@ -19,6 +19,7 @@ from homeassistant.const import ( CONF_USERNAME, EVENT_HOMEASSISTANT_STOP, ) +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import config_validation as cv from homeassistant.helpers.dispatcher import dispatcher_send from homeassistant.helpers.entity import Entity @@ -119,7 +120,7 @@ async def async_setup_entry(hass, config_entry): except (AbodeException, ConnectTimeout, HTTPError) as ex: LOGGER.error("Unable to connect to Abode: %s", str(ex)) - return False + raise ConfigEntryNotReady for platform in ABODE_PLATFORMS: hass.async_create_task( @@ -271,36 +272,72 @@ def setup_abode_events(hass): ) -class AbodeDevice(Entity): - """Representation of an Abode device.""" +class AbodeEntity(Entity): + """Representation of an Abode entity.""" - def __init__(self, data, device): - """Initialize Abode device.""" + def __init__(self, data): + """Initialize Abode entity.""" self._data = data - self._device = device + self._available = True - async def async_added_to_hass(self): - """Subscribe to device events.""" - self.hass.async_add_job( - self._data.abode.events.add_device_callback, - self._device.device_id, - self._update_callback, - ) - self.hass.data[DOMAIN].entity_ids.add(self.entity_id) - - async def async_will_remove_from_hass(self): - """Unsubscribe from device events.""" - self.hass.async_add_job( - self._data.abode.events.remove_all_device_callbacks, self._device.device_id - ) + @property + def available(self): + """Return the available state.""" + return self._available @property def should_poll(self): """Return the polling state.""" return self._data.polling + async def async_added_to_hass(self): + """Subscribe to Abode connection status updates.""" + self.hass.async_add_job( + self._data.abode.events.add_connection_status_callback, + self.unique_id, + self._update_connection_status, + ) + + self.hass.data[DOMAIN].entity_ids.add(self.entity_id) + + async def async_will_remove_from_hass(self): + """Unsubscribe from Abode connection status updates.""" + self.hass.async_add_job( + self._data.abode.events.remove_connection_status_callback, self.unique_id, + ) + + def _update_connection_status(self): + """Update the entity available property.""" + self._available = self._data.abode.events.connected + self.schedule_update_ha_state() + + +class AbodeDevice(AbodeEntity): + """Representation of an Abode device.""" + + def __init__(self, data, device): + """Initialize Abode device.""" + super().__init__(data) + self._device = device + + async def async_added_to_hass(self): + """Subscribe to device events.""" + await super().async_added_to_hass() + self.hass.async_add_job( + self._data.abode.events.add_device_callback, + self._device.device_id, + self._update_callback, + ) + + async def async_will_remove_from_hass(self): + """Unsubscribe from device events.""" + await super().async_will_remove_from_hass() + self.hass.async_add_job( + self._data.abode.events.remove_all_device_callbacks, self._device.device_id + ) + def update(self): - """Update device and automation states.""" + """Update device state.""" self._device.refresh() @property @@ -339,23 +376,14 @@ class AbodeDevice(Entity): self.schedule_update_ha_state() -class AbodeAutomation(Entity): +class AbodeAutomation(AbodeEntity): """Representation of an Abode automation.""" def __init__(self, data, automation): """Initialize for Abode automation.""" - self._data = data + super().__init__(data) self._automation = automation - async def async_added_to_hass(self): - """Set up automation entity.""" - self.hass.data[DOMAIN].entity_ids.add(self.entity_id) - - @property - def should_poll(self): - """Return the polling state.""" - return self._data.polling - def update(self): """Update automation state.""" self._automation.refresh() diff --git a/homeassistant/components/abode/manifest.json b/homeassistant/components/abode/manifest.json index eabd4a7f74f0..515031426924 100644 --- a/homeassistant/components/abode/manifest.json +++ b/homeassistant/components/abode/manifest.json @@ -3,7 +3,7 @@ "name": "Abode", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/abode", - "requirements": ["abodepy==0.18.1"], + "requirements": ["abodepy==0.19.0"], "dependencies": [], "codeowners": ["@shred86"] } diff --git a/requirements_all.txt b/requirements_all.txt index 358d8aa62e2b..0805d384c99b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -107,7 +107,7 @@ WazeRouteCalculator==0.12 YesssSMS==0.4.1 # homeassistant.components.abode -abodepy==0.18.1 +abodepy==0.19.0 # homeassistant.components.mcp23017 adafruit-blinka==3.9.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4a6308c89080..8f62b8427b79 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -26,7 +26,7 @@ RtmAPI==0.7.2 YesssSMS==0.4.1 # homeassistant.components.abode -abodepy==0.18.1 +abodepy==0.19.0 # homeassistant.components.androidtv adb-shell==0.1.1 From 3a7406652984073226ca76a69dc6a429fc348b54 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 3 Apr 2020 18:44:20 +0200 Subject: [PATCH 065/653] Small cleanup in async_process_ha_core_config (#33583) --- homeassistant/config.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/homeassistant/config.py b/homeassistant/config.py index b63acf4ab4c3..cdaa30dc0494 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -473,16 +473,14 @@ async def async_process_ha_core_config(hass: HomeAssistant, config: Dict) -> Non hac = hass.config if any( - [ - k in config - for k in [ - CONF_LATITUDE, - CONF_LONGITUDE, - CONF_NAME, - CONF_ELEVATION, - CONF_TIME_ZONE, - CONF_UNIT_SYSTEM, - ] + k in config + for k in [ + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, + CONF_ELEVATION, + CONF_TIME_ZONE, + CONF_UNIT_SYSTEM, ] ): hac.config_source = SOURCE_YAML From 6f7bd673fbd5790a043446136c88e12e809ca6f6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 3 Apr 2020 19:32:00 +0200 Subject: [PATCH 066/653] Updated frontend to 20200403.0 (#33586) --- 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 8a540a96b0ea..b0da48ab713b 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==20200401.0" + "home-assistant-frontend==20200403.0" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index d0253ad723eb..fdb7f8f18d92 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -12,7 +12,7 @@ cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 hass-nabucasa==0.33.0 -home-assistant-frontend==20200401.0 +home-assistant-frontend==20200403.0 importlib-metadata==1.5.0 jinja2>=2.11.1 netdisco==2.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index 0805d384c99b..cbac7186ed44 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -704,7 +704,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200401.0 +home-assistant-frontend==20200403.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8f62b8427b79..7a35896b4965 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -282,7 +282,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200401.0 +home-assistant-frontend==20200403.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From d1663f27334950965f75afbdd6c82ae658d91976 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Fri, 3 Apr 2020 11:47:42 -0600 Subject: [PATCH 067/653] Perform some small Flu Near You cleanup (#33590) --- homeassistant/components/flunearyou/__init__.py | 9 +-------- homeassistant/components/flunearyou/config_flow.py | 2 +- homeassistant/components/flunearyou/const.py | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/flunearyou/__init__.py b/homeassistant/components/flunearyou/__init__.py index ce59c959133f..1e8e2e20b2d1 100644 --- a/homeassistant/components/flunearyou/__init__.py +++ b/homeassistant/components/flunearyou/__init__.py @@ -9,7 +9,6 @@ import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE from homeassistant.core import callback -from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client, config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.event import async_track_time_interval @@ -90,13 +89,7 @@ async def async_setup_entry(hass, config_entry): config_entry.data.get(CONF_LATITUDE, hass.config.latitude), config_entry.data.get(CONF_LONGITUDE, hass.config.longitude), ) - - try: - await fny.async_update() - except FluNearYouError as err: - LOGGER.error("Error while setting up integration: %s", err) - raise ConfigEntryNotReady - + await fny.async_update() hass.data[DOMAIN][DATA_CLIENT][config_entry.entry_id] = fny hass.async_create_task( diff --git a/homeassistant/components/flunearyou/config_flow.py b/homeassistant/components/flunearyou/config_flow.py index 2c48b14bb033..0a55a21f6eda 100644 --- a/homeassistant/components/flunearyou/config_flow.py +++ b/homeassistant/components/flunearyou/config_flow.py @@ -52,7 +52,7 @@ class FluNearYouFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): user_input[CONF_LATITUDE], user_input[CONF_LONGITUDE] ) except FluNearYouError as err: - LOGGER.error("Error while setting up integration: %s", err) + LOGGER.error("Error while configuring integration: %s", err) return self.async_show_form( step_id="user", errors={"base": "general_error"} ) diff --git a/homeassistant/components/flunearyou/const.py b/homeassistant/components/flunearyou/const.py index 9693d59fc6e7..ac8008f7f9be 100644 --- a/homeassistant/components/flunearyou/const.py +++ b/homeassistant/components/flunearyou/const.py @@ -2,7 +2,7 @@ import logging DOMAIN = "flunearyou" -LOGGER = logging.getLogger("homeassistant.components.flunearyou") +LOGGER = logging.getLogger(__package__) DATA_CLIENT = "client" From dc7127aacfa92e80658684679174e72cd5f732ea Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Apr 2020 11:15:42 -0700 Subject: [PATCH 068/653] Data Coordinator to return unsub func (#33588) --- homeassistant/components/hue/hue_event.py | 14 ++++---------- homeassistant/components/hue/light.py | 20 +++++--------------- homeassistant/components/hue/sensor_base.py | 15 +++++---------- homeassistant/helpers/update_coordinator.py | 9 ++++++++- tests/helpers/test_update_coordinator.py | 20 ++++++++++++-------- 5 files changed, 34 insertions(+), 44 deletions(-) diff --git a/homeassistant/components/hue/hue_event.py b/homeassistant/components/hue/hue_event.py index ed1bc1c8f7d9..a588f68ea4e6 100644 --- a/homeassistant/components/hue/hue_event.py +++ b/homeassistant/components/hue/hue_event.py @@ -35,19 +35,13 @@ class HueEvent(GenericHueDevice): self._last_updated = self.sensor.lastupdated # Register callback in coordinator and add job to remove it on bridge reset. - self.bridge.sensor_manager.coordinator.async_add_listener( - self.async_update_callback + self.bridge.reset_jobs.append( + self.bridge.sensor_manager.coordinator.async_add_listener( + self.async_update_callback + ) ) - self.bridge.reset_jobs.append(self.async_will_remove_from_hass) _LOGGER.debug("Hue event created: %s", self.event_id) - @callback - def async_will_remove_from_hass(self): - """Remove listener on bridge reset.""" - self.bridge.sensor_manager.coordinator.async_remove_listener( - self.async_update_callback - ) - @callback def async_update_callback(self): """Fire the event if reason is that state is updated.""" diff --git a/homeassistant/components/hue/light.py b/homeassistant/components/hue/light.py index e468c5166765..649be55e94e9 100644 --- a/homeassistant/components/hue/light.py +++ b/homeassistant/components/hue/light.py @@ -118,13 +118,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) # We add a listener after fetching the data, so manually trigger listener - light_coordinator.async_add_listener(update_lights) + bridge.reset_jobs.append(light_coordinator.async_add_listener(update_lights)) update_lights() - bridge.reset_jobs.append( - lambda: light_coordinator.async_remove_listener(update_lights) - ) - api_version = tuple(int(v) for v in bridge.api.config.apiversion.split(".")) allow_groups = bridge.allow_groups @@ -155,13 +151,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): partial(create_light, HueLight, group_coordinator, bridge, True), ) - group_coordinator.async_add_listener(update_groups) + bridge.reset_jobs.append(group_coordinator.async_add_listener(update_groups)) await group_coordinator.async_refresh() - bridge.reset_jobs.append( - lambda: group_coordinator.async_remove_listener(update_groups) - ) - async def async_safe_fetch(bridge, fetch_method): """Safely fetch data.""" @@ -339,11 +331,9 @@ class HueLight(Light): async def async_added_to_hass(self): """When entity is added to hass.""" - self.coordinator.async_add_listener(self.async_write_ha_state) - - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self.coordinator.async_remove_listener(self.async_write_ha_state) + self.async_on_remove( + self.coordinator.async_add_listener(self.async_write_ha_state) + ) async def async_turn_on(self, **kwargs): """Turn the specified or all lights on.""" diff --git a/homeassistant/components/hue/sensor_base.py b/homeassistant/components/hue/sensor_base.py index 113957d140ef..93b98a7c9ce8 100644 --- a/homeassistant/components/hue/sensor_base.py +++ b/homeassistant/components/hue/sensor_base.py @@ -76,9 +76,8 @@ class SensorManager: return # We have all components available, start the updating. - self.coordinator.async_add_listener(self.async_update_items) self.bridge.reset_jobs.append( - lambda: self.coordinator.async_remove_listener(self.async_update_items) + self.coordinator.async_add_listener(self.async_update_items) ) await self.coordinator.async_refresh() @@ -178,14 +177,10 @@ class GenericHueSensor(GenericHueDevice, entity.Entity): async def async_added_to_hass(self): """When entity is added to hass.""" - self.bridge.sensor_manager.coordinator.async_add_listener( - self.async_write_ha_state - ) - - async def async_will_remove_from_hass(self): - """When entity will be removed from hass.""" - self.bridge.sensor_manager.coordinator.async_remove_listener( - self.async_write_ha_state + self.async_on_remove( + self.bridge.sensor_manager.coordinator.async_add_listener( + self.async_write_ha_state + ) ) async def async_update(self): diff --git a/homeassistant/helpers/update_coordinator.py b/homeassistant/helpers/update_coordinator.py index b2b048166168..d9a79d6555c1 100644 --- a/homeassistant/helpers/update_coordinator.py +++ b/homeassistant/helpers/update_coordinator.py @@ -62,7 +62,7 @@ class DataUpdateCoordinator: self._debounced_refresh = request_refresh_debouncer @callback - def async_add_listener(self, update_callback: CALLBACK_TYPE) -> None: + def async_add_listener(self, update_callback: CALLBACK_TYPE) -> Callable[[], None]: """Listen for data updates.""" schedule_refresh = not self._listeners @@ -72,6 +72,13 @@ class DataUpdateCoordinator: if schedule_refresh: self._schedule_refresh() + @callback + def remove_listener() -> None: + """Remove update listener.""" + self.async_remove_listener(update_callback) + + return remove_listener + @callback def async_remove_listener(self, update_callback: CALLBACK_TYPE) -> None: """Remove data update.""" diff --git a/tests/helpers/test_update_coordinator.py b/tests/helpers/test_update_coordinator.py index c17c79ccbc8a..17caa1f74786 100644 --- a/tests/helpers/test_update_coordinator.py +++ b/tests/helpers/test_update_coordinator.py @@ -18,11 +18,12 @@ LOGGER = logging.getLogger(__name__) @pytest.fixture def crd(hass): """Coordinator mock.""" - calls = [] + calls = 0 async def refresh(): - calls.append(None) - return len(calls) + nonlocal calls + calls += 1 + return calls crd = update_coordinator.DataUpdateCoordinator( hass, @@ -46,16 +47,19 @@ async def test_async_refresh(crd): def update_callback(): updates.append(crd.data) - crd.async_add_listener(update_callback) - + unsub = crd.async_add_listener(update_callback) await crd.async_refresh() - assert updates == [2] - crd.async_remove_listener(update_callback) - + # Test unsubscribing through function + unsub() await crd.async_refresh() + assert updates == [2] + # Test unsubscribing through method + crd.async_add_listener(update_callback) + crd.async_remove_listener(update_callback) + await crd.async_refresh() assert updates == [2] From cd300f54a8ab33490594795ebfe568b5666a8c79 Mon Sep 17 00:00:00 2001 From: cgtobi Date: Fri, 3 Apr 2020 20:59:27 +0200 Subject: [PATCH 069/653] Add Home Coach to zeroconf detection (#33593) --- homeassistant/components/netatmo/manifest.json | 1 + homeassistant/generated/zeroconf.py | 1 + 2 files changed, 2 insertions(+) diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index 6e1c3d9f8f48..fc140420d7b3 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -17,6 +17,7 @@ "config_flow": true, "homekit": { "models": [ + "Healty Home Coach", "Netatmo Relay", "Presence", "Welcome" diff --git a/homeassistant/generated/zeroconf.py b/homeassistant/generated/zeroconf.py index 46b3a9943f89..f5519ea903bf 100644 --- a/homeassistant/generated/zeroconf.py +++ b/homeassistant/generated/zeroconf.py @@ -48,6 +48,7 @@ ZEROCONF = { HOMEKIT = { "819LMB": "myq", "BSB002": "hue", + "Healty Home Coach": "netatmo", "LIFX": "lifx", "Netatmo Relay": "netatmo", "Presence": "netatmo", From f1d3c0d19b4065a1f6ec80ecdc080380f728196c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Apr 2020 12:58:19 -0700 Subject: [PATCH 070/653] Remove unused manifest fields (#33595) --- homeassistant/components/abode/manifest.json | 1 - homeassistant/components/acer_projector/manifest.json | 1 - homeassistant/components/actiontec/manifest.json | 2 -- homeassistant/components/adguard/manifest.json | 1 - homeassistant/components/ads/manifest.json | 1 - homeassistant/components/aftership/manifest.json | 1 - homeassistant/components/air_quality/manifest.json | 2 -- homeassistant/components/airly/manifest.json | 1 - homeassistant/components/airvisual/manifest.json | 1 - homeassistant/components/aladdin_connect/manifest.json | 1 - .../components/alarm_control_panel/manifest.json | 2 -- homeassistant/components/alarmdecoder/manifest.json | 1 - homeassistant/components/alert/manifest.json | 2 -- homeassistant/components/alexa/manifest.json | 1 - homeassistant/components/alpha_vantage/manifest.json | 1 - homeassistant/components/amazon_polly/manifest.json | 1 - homeassistant/components/ambient_station/manifest.json | 1 - homeassistant/components/ampio/manifest.json | 1 - .../components/android_ip_webcam/manifest.json | 1 - homeassistant/components/androidtv/manifest.json | 1 - homeassistant/components/anel_pwrctrl/manifest.json | 1 - homeassistant/components/anthemav/manifest.json | 1 - homeassistant/components/apache_kafka/manifest.json | 1 - homeassistant/components/apcupsd/manifest.json | 1 - homeassistant/components/api/manifest.json | 1 - homeassistant/components/apns/manifest.json | 1 - homeassistant/components/apprise/manifest.json | 1 - homeassistant/components/aprs/manifest.json | 1 - homeassistant/components/aqualogic/manifest.json | 1 - homeassistant/components/aquostv/manifest.json | 1 - homeassistant/components/arcam_fmj/manifest.json | 1 - homeassistant/components/arduino/manifest.json | 1 - homeassistant/components/arest/manifest.json | 2 -- homeassistant/components/aruba/manifest.json | 1 - homeassistant/components/arwn/manifest.json | 1 - homeassistant/components/asterisk_cdr/manifest.json | 1 - homeassistant/components/asterisk_mbox/manifest.json | 1 - homeassistant/components/asuswrt/manifest.json | 1 - homeassistant/components/aten_pe/manifest.json | 1 - homeassistant/components/atome/manifest.json | 1 - homeassistant/components/aurora/manifest.json | 2 -- .../components/aurora_abb_powerone/manifest.json | 1 - homeassistant/components/auth/manifest.json | 1 - homeassistant/components/automation/manifest.json | 2 -- homeassistant/components/avea/manifest.json | 1 - homeassistant/components/avion/manifest.json | 1 - homeassistant/components/avri/manifest.json | 1 - homeassistant/components/awair/manifest.json | 1 - homeassistant/components/aws/manifest.json | 1 - homeassistant/components/axis/manifest.json | 1 - homeassistant/components/azure_event_hub/manifest.json | 1 - .../components/azure_service_bus/manifest.json | 1 - homeassistant/components/baidu/manifest.json | 1 - homeassistant/components/bayesian/manifest.json | 2 -- homeassistant/components/bbb_gpio/manifest.json | 1 - homeassistant/components/bbox/manifest.json | 1 - homeassistant/components/beewi_smartclim/manifest.json | 1 - homeassistant/components/bh1750/manifest.json | 1 - homeassistant/components/binary_sensor/manifest.json | 2 -- homeassistant/components/bitcoin/manifest.json | 1 - homeassistant/components/bizkaibus/manifest.json | 1 - homeassistant/components/blackbird/manifest.json | 1 - homeassistant/components/blink/manifest.json | 1 - homeassistant/components/blinksticklight/manifest.json | 1 - homeassistant/components/blinkt/manifest.json | 1 - homeassistant/components/blockchain/manifest.json | 1 - homeassistant/components/bloomsky/manifest.json | 2 -- homeassistant/components/bluesound/manifest.json | 1 - .../components/bluetooth_le_tracker/manifest.json | 1 - .../components/bluetooth_tracker/manifest.json | 1 - homeassistant/components/bme280/manifest.json | 1 - homeassistant/components/bme680/manifest.json | 1 - homeassistant/components/bmp280/manifest.json | 1 - .../components/bmw_connected_drive/manifest.json | 1 - homeassistant/components/bom/manifest.json | 1 - homeassistant/components/broadlink/manifest.json | 1 - homeassistant/components/brother/manifest.json | 1 - .../components/brottsplatskartan/manifest.json | 1 - homeassistant/components/browser/manifest.json | 2 -- homeassistant/components/brunt/manifest.json | 1 - homeassistant/components/bt_home_hub_5/manifest.json | 1 - homeassistant/components/bt_smarthub/manifest.json | 1 - homeassistant/components/buienradar/manifest.json | 1 - homeassistant/components/caldav/manifest.json | 1 - homeassistant/components/calendar/manifest.json | 1 - homeassistant/components/camera/manifest.json | 1 - homeassistant/components/cast/manifest.json | 1 - homeassistant/components/cert_expiry/manifest.json | 2 -- homeassistant/components/channels/manifest.json | 1 - homeassistant/components/cisco_ios/manifest.json | 1 - .../components/cisco_mobility_express/manifest.json | 1 - .../components/cisco_webex_teams/manifest.json | 1 - homeassistant/components/citybikes/manifest.json | 2 -- homeassistant/components/clementine/manifest.json | 1 - homeassistant/components/clickatell/manifest.json | 2 -- homeassistant/components/clicksend/manifest.json | 2 -- homeassistant/components/clicksend_tts/manifest.json | 2 -- homeassistant/components/climate/manifest.json | 2 -- homeassistant/components/cloudflare/manifest.json | 1 - homeassistant/components/cmus/manifest.json | 1 - homeassistant/components/co2signal/manifest.json | 1 - homeassistant/components/coinbase/manifest.json | 1 - homeassistant/components/coinmarketcap/manifest.json | 1 - .../components/comed_hourly_pricing/manifest.json | 2 -- homeassistant/components/comfoconnect/manifest.json | 1 - homeassistant/components/command_line/manifest.json | 2 -- homeassistant/components/concord232/manifest.json | 1 - homeassistant/components/config/manifest.json | 1 - homeassistant/components/configurator/manifest.json | 2 -- homeassistant/components/conversation/manifest.json | 1 - homeassistant/components/coolmaster/manifest.json | 1 - homeassistant/components/coronavirus/manifest.json | 1 - homeassistant/components/counter/manifest.json | 2 -- homeassistant/components/cover/manifest.json | 2 -- homeassistant/components/cppm_tracker/manifest.json | 1 - homeassistant/components/cpuspeed/manifest.json | 1 - homeassistant/components/crimereports/manifest.json | 1 - homeassistant/components/cups/manifest.json | 1 - homeassistant/components/currencylayer/manifest.json | 2 -- homeassistant/components/daikin/manifest.json | 1 - homeassistant/components/danfoss_air/manifest.json | 1 - homeassistant/components/darksky/manifest.json | 1 - homeassistant/components/datadog/manifest.json | 1 - homeassistant/components/ddwrt/manifest.json | 2 -- homeassistant/components/deconz/manifest.json | 3 +-- homeassistant/components/decora/manifest.json | 1 - homeassistant/components/decora_wifi/manifest.json | 1 - homeassistant/components/default_config/manifest.json | 1 - homeassistant/components/delijn/manifest.json | 1 - homeassistant/components/deluge/manifest.json | 1 - homeassistant/components/demo/manifest.json | 1 - homeassistant/components/denon/manifest.json | 2 -- homeassistant/components/denonavr/manifest.json | 1 - homeassistant/components/derivative/manifest.json | 8 ++------ homeassistant/components/deutsche_bahn/manifest.json | 1 - .../components/device_automation/manifest.json | 1 - .../components/device_sun_light_trigger/manifest.json | 2 -- homeassistant/components/device_tracker/manifest.json | 1 - homeassistant/components/dht/manifest.json | 1 - homeassistant/components/dialogflow/manifest.json | 1 - homeassistant/components/digital_ocean/manifest.json | 1 - homeassistant/components/digitalloggers/manifest.json | 1 - homeassistant/components/directv/manifest.json | 1 - homeassistant/components/discogs/manifest.json | 1 - homeassistant/components/discord/manifest.json | 1 - homeassistant/components/discovery/manifest.json | 1 - .../components/dlib_face_detect/manifest.json | 1 - .../components/dlib_face_identify/manifest.json | 1 - homeassistant/components/dlink/manifest.json | 1 - homeassistant/components/dlna_dmr/manifest.json | 1 - homeassistant/components/dnsip/manifest.json | 1 - homeassistant/components/doods/manifest.json | 3 +-- homeassistant/components/dovado/manifest.json | 1 - homeassistant/components/downloader/manifest.json | 2 -- homeassistant/components/dsmr/manifest.json | 1 - homeassistant/components/dsmr_reader/manifest.json | 1 - .../components/dte_energy_bridge/manifest.json | 2 -- .../components/dublin_bus_transport/manifest.json | 2 -- homeassistant/components/duckdns/manifest.json | 2 -- homeassistant/components/dunehd/manifest.json | 1 - .../components/dwd_weather_warnings/manifest.json | 2 -- homeassistant/components/dweet/manifest.json | 1 - homeassistant/components/dynalite/manifest.json | 1 - homeassistant/components/dyson/manifest.json | 1 - homeassistant/components/ebox/manifest.json | 1 - homeassistant/components/ebusd/manifest.json | 1 - homeassistant/components/ecoal_boiler/manifest.json | 1 - homeassistant/components/ecobee/manifest.json | 1 - homeassistant/components/econet/manifest.json | 1 - homeassistant/components/ecovacs/manifest.json | 1 - .../components/eddystone_temperature/manifest.json | 1 - homeassistant/components/edimax/manifest.json | 1 - homeassistant/components/edl21/manifest.json | 1 - homeassistant/components/ee_brightbox/manifest.json | 1 - homeassistant/components/efergy/manifest.json | 2 -- homeassistant/components/egardia/manifest.json | 1 - homeassistant/components/eight_sleep/manifest.json | 1 - homeassistant/components/elgato/manifest.json | 1 - homeassistant/components/eliqonline/manifest.json | 1 - homeassistant/components/elkm1/manifest.json | 1 - homeassistant/components/elv/manifest.json | 1 - homeassistant/components/emby/manifest.json | 1 - homeassistant/components/emoncms/manifest.json | 2 -- homeassistant/components/emoncms_history/manifest.json | 2 -- homeassistant/components/emulated_hue/manifest.json | 1 - homeassistant/components/emulated_roku/manifest.json | 1 - homeassistant/components/enigma2/manifest.json | 1 - homeassistant/components/enocean/manifest.json | 1 - homeassistant/components/enphase_envoy/manifest.json | 1 - .../components/entur_public_transport/manifest.json | 1 - .../components/environment_canada/manifest.json | 1 - homeassistant/components/envirophat/manifest.json | 1 - homeassistant/components/envisalink/manifest.json | 1 - homeassistant/components/ephember/manifest.json | 1 - homeassistant/components/epson/manifest.json | 1 - homeassistant/components/epsonworkforce/manifest.json | 1 - homeassistant/components/eq3btsmart/manifest.json | 1 - homeassistant/components/esphome/manifest.json | 1 - homeassistant/components/essent/manifest.json | 1 - homeassistant/components/etherscan/manifest.json | 1 - homeassistant/components/eufy/manifest.json | 1 - homeassistant/components/everlights/manifest.json | 1 - homeassistant/components/evohome/manifest.json | 1 - homeassistant/components/ezviz/manifest.json | 1 - homeassistant/components/facebook/manifest.json | 2 -- homeassistant/components/facebox/manifest.json | 2 -- homeassistant/components/fail2ban/manifest.json | 2 -- homeassistant/components/familyhub/manifest.json | 1 - homeassistant/components/fan/manifest.json | 2 -- homeassistant/components/fastdotcom/manifest.json | 1 - homeassistant/components/feedreader/manifest.json | 1 - homeassistant/components/ffmpeg/manifest.json | 1 - homeassistant/components/ffmpeg_motion/manifest.json | 1 - homeassistant/components/ffmpeg_noise/manifest.json | 1 - homeassistant/components/fibaro/manifest.json | 1 - homeassistant/components/fido/manifest.json | 1 - homeassistant/components/file/manifest.json | 2 -- homeassistant/components/filesize/manifest.json | 2 -- homeassistant/components/filter/manifest.json | 1 - homeassistant/components/fints/manifest.json | 1 - homeassistant/components/fixer/manifest.json | 1 - homeassistant/components/fleetgo/manifest.json | 1 - homeassistant/components/flic/manifest.json | 1 - homeassistant/components/flock/manifest.json | 2 -- homeassistant/components/flume/manifest.json | 1 - homeassistant/components/flunearyou/manifest.json | 1 - homeassistant/components/flux/manifest.json | 2 -- homeassistant/components/flux_led/manifest.json | 1 - homeassistant/components/folder/manifest.json | 2 -- homeassistant/components/folder_watcher/manifest.json | 1 - homeassistant/components/foobot/manifest.json | 1 - homeassistant/components/fortigate/manifest.json | 1 - homeassistant/components/fortios/manifest.json | 1 - homeassistant/components/foscam/manifest.json | 1 - homeassistant/components/foursquare/manifest.json | 1 - homeassistant/components/free_mobile/manifest.json | 1 - homeassistant/components/freebox/manifest.json | 1 - homeassistant/components/freedns/manifest.json | 2 -- homeassistant/components/fritz/manifest.json | 1 - homeassistant/components/fritzbox/manifest.json | 1 - .../components/fritzbox_callmonitor/manifest.json | 1 - .../components/fritzbox_netmonitor/manifest.json | 1 - homeassistant/components/fronius/manifest.json | 1 - homeassistant/components/frontend/manifest.json | 2 +- .../components/frontier_silicon/manifest.json | 1 - homeassistant/components/futurenow/manifest.json | 1 - homeassistant/components/garadget/manifest.json | 2 -- homeassistant/components/garmin_connect/manifest.json | 1 - homeassistant/components/gc100/manifest.json | 1 - homeassistant/components/gdacs/manifest.json | 3 +-- homeassistant/components/gearbest/manifest.json | 1 - homeassistant/components/geizhals/manifest.json | 1 - homeassistant/components/generic/manifest.json | 2 -- .../components/generic_thermostat/manifest.json | 1 - homeassistant/components/geniushub/manifest.json | 1 - homeassistant/components/geo_json_events/manifest.json | 1 - homeassistant/components/geo_location/manifest.json | 2 -- homeassistant/components/geo_rss_events/manifest.json | 1 - homeassistant/components/geofency/manifest.json | 1 - homeassistant/components/geonetnz_quakes/manifest.json | 3 +-- .../components/geonetnz_volcano/manifest.json | 1 - homeassistant/components/gios/manifest.json | 1 - homeassistant/components/github/manifest.json | 1 - homeassistant/components/gitlab_ci/manifest.json | 1 - homeassistant/components/gitter/manifest.json | 1 - homeassistant/components/glances/manifest.json | 1 - homeassistant/components/gntp/manifest.json | 1 - homeassistant/components/goalfeed/manifest.json | 1 - homeassistant/components/gogogate2/manifest.json | 1 - homeassistant/components/google/manifest.json | 1 - .../components/google_assistant/manifest.json | 1 - homeassistant/components/google_cloud/manifest.json | 1 - homeassistant/components/google_domains/manifest.json | 2 -- homeassistant/components/google_maps/manifest.json | 1 - homeassistant/components/google_pubsub/manifest.json | 1 - .../components/google_translate/manifest.json | 1 - .../components/google_travel_time/manifest.json | 1 - homeassistant/components/google_wifi/manifest.json | 2 -- homeassistant/components/gpsd/manifest.json | 1 - homeassistant/components/gpslogger/manifest.json | 1 - homeassistant/components/graphite/manifest.json | 2 -- .../components/greeneye_monitor/manifest.json | 1 - homeassistant/components/greenwave/manifest.json | 1 - homeassistant/components/griddy/manifest.json | 1 - homeassistant/components/group/manifest.json | 2 -- homeassistant/components/growatt_server/manifest.json | 1 - homeassistant/components/gstreamer/manifest.json | 1 - homeassistant/components/gtfs/manifest.json | 1 - homeassistant/components/habitica/manifest.json | 1 - homeassistant/components/hangouts/manifest.json | 1 - .../components/harman_kardon_avr/manifest.json | 1 - homeassistant/components/harmony/manifest.json | 1 - homeassistant/components/hassio/manifest.json | 1 - homeassistant/components/haveibeenpwned/manifest.json | 2 -- homeassistant/components/hddtemp/manifest.json | 2 -- homeassistant/components/hdmi_cec/manifest.json | 1 - homeassistant/components/heatmiser/manifest.json | 1 - homeassistant/components/heos/manifest.json | 1 - .../components/here_travel_time/manifest.json | 1 - homeassistant/components/hikvision/manifest.json | 1 - homeassistant/components/hikvisioncam/manifest.json | 1 - homeassistant/components/hisense_aehw4a1/manifest.json | 1 - homeassistant/components/history/manifest.json | 1 - homeassistant/components/history_stats/manifest.json | 1 - homeassistant/components/hitron_coda/manifest.json | 2 -- homeassistant/components/hive/manifest.json | 1 - homeassistant/components/hlk_sw16/manifest.json | 1 - homeassistant/components/homeassistant/manifest.json | 2 -- homeassistant/components/homekit/manifest.json | 1 - .../components/homekit_controller/manifest.json | 1 - homeassistant/components/homematic/manifest.json | 1 - .../components/homematicip_cloud/manifest.json | 1 - homeassistant/components/homeworks/manifest.json | 1 - homeassistant/components/honeywell/manifest.json | 1 - homeassistant/components/horizon/manifest.json | 1 - homeassistant/components/hp_ilo/manifest.json | 1 - homeassistant/components/http/manifest.json | 1 - homeassistant/components/htu21d/manifest.json | 1 - homeassistant/components/huawei_lte/manifest.json | 1 - homeassistant/components/huawei_router/manifest.json | 2 -- homeassistant/components/hue/manifest.json | 1 - .../components/hunterdouglas_powerview/manifest.json | 1 - homeassistant/components/hydrawise/manifest.json | 1 - homeassistant/components/hyperion/manifest.json | 2 -- homeassistant/components/ialarm/manifest.json | 1 - homeassistant/components/iaqualink/manifest.json | 1 - homeassistant/components/icloud/manifest.json | 1 - homeassistant/components/idteck_prox/manifest.json | 1 - homeassistant/components/iglo/manifest.json | 1 - homeassistant/components/ign_sismologia/manifest.json | 1 - homeassistant/components/ihc/manifest.json | 1 - .../components/image_processing/manifest.json | 1 - homeassistant/components/imap/manifest.json | 1 - .../components/imap_email_content/manifest.json | 2 -- homeassistant/components/incomfort/manifest.json | 1 - homeassistant/components/influxdb/manifest.json | 1 - homeassistant/components/input_boolean/manifest.json | 2 -- homeassistant/components/input_datetime/manifest.json | 2 -- homeassistant/components/input_number/manifest.json | 2 -- homeassistant/components/input_select/manifest.json | 2 -- homeassistant/components/input_text/manifest.json | 2 -- homeassistant/components/insteon/manifest.json | 1 - homeassistant/components/integration/manifest.json | 2 -- homeassistant/components/intent/manifest.json | 1 - homeassistant/components/intent_script/manifest.json | 2 -- homeassistant/components/intesishome/manifest.json | 1 - homeassistant/components/ios/manifest.json | 1 - homeassistant/components/iota/manifest.json | 1 - homeassistant/components/iperf3/manifest.json | 1 - homeassistant/components/ipma/manifest.json | 1 - homeassistant/components/ipp/manifest.json | 1 - homeassistant/components/iqvia/manifest.json | 1 - .../components/irish_rail_transport/manifest.json | 1 - .../components/islamic_prayer_times/manifest.json | 1 - homeassistant/components/iss/manifest.json | 1 - homeassistant/components/isy994/manifest.json | 1 - homeassistant/components/itach/manifest.json | 1 - homeassistant/components/itunes/manifest.json | 2 -- homeassistant/components/izone/manifest.json | 1 - homeassistant/components/jewish_calendar/manifest.json | 1 - homeassistant/components/joaoapps_join/manifest.json | 1 - homeassistant/components/juicenet/manifest.json | 1 - homeassistant/components/kankun/manifest.json | 2 -- homeassistant/components/keba/manifest.json | 1 - homeassistant/components/keenetic_ndms2/manifest.json | 1 - homeassistant/components/kef/manifest.json | 1 - homeassistant/components/keyboard/manifest.json | 1 - homeassistant/components/keyboard_remote/manifest.json | 1 - homeassistant/components/kira/manifest.json | 1 - homeassistant/components/kiwi/manifest.json | 1 - homeassistant/components/knx/manifest.json | 1 - homeassistant/components/kodi/manifest.json | 1 - homeassistant/components/kwb/manifest.json | 1 - homeassistant/components/lacrosse/manifest.json | 1 - homeassistant/components/lametric/manifest.json | 1 - homeassistant/components/lannouncer/manifest.json | 2 -- homeassistant/components/lastfm/manifest.json | 1 - homeassistant/components/launch_library/manifest.json | 1 - homeassistant/components/lcn/manifest.json | 1 - homeassistant/components/lg_netcast/manifest.json | 1 - homeassistant/components/lg_soundbar/manifest.json | 1 - homeassistant/components/life360/manifest.json | 1 - homeassistant/components/lifx/manifest.json | 1 - homeassistant/components/lifx_cloud/manifest.json | 2 -- homeassistant/components/lifx_legacy/manifest.json | 1 - homeassistant/components/light/manifest.json | 2 -- homeassistant/components/lightwave/manifest.json | 1 - homeassistant/components/limitlessled/manifest.json | 1 - homeassistant/components/linksys_smart/manifest.json | 2 -- homeassistant/components/linky/manifest.json | 1 - homeassistant/components/linode/manifest.json | 1 - homeassistant/components/linux_battery/manifest.json | 1 - homeassistant/components/lirc/manifest.json | 1 - homeassistant/components/litejet/manifest.json | 1 - .../components/llamalab_automate/manifest.json | 2 -- homeassistant/components/local_file/manifest.json | 2 -- homeassistant/components/local_ip/manifest.json | 1 - homeassistant/components/locative/manifest.json | 1 - homeassistant/components/lock/manifest.json | 2 -- homeassistant/components/lockitron/manifest.json | 2 -- homeassistant/components/logbook/manifest.json | 1 - homeassistant/components/logentries/manifest.json | 2 -- homeassistant/components/logger/manifest.json | 2 -- homeassistant/components/london_air/manifest.json | 2 -- .../components/london_underground/manifest.json | 1 - homeassistant/components/loopenergy/manifest.json | 1 - homeassistant/components/lovelace/manifest.json | 2 -- homeassistant/components/luci/manifest.json | 1 - homeassistant/components/luftdaten/manifest.json | 1 - homeassistant/components/lupusec/manifest.json | 1 - homeassistant/components/lutron/manifest.json | 1 - homeassistant/components/lutron_caseta/manifest.json | 1 - homeassistant/components/lw12wifi/manifest.json | 1 - homeassistant/components/lyft/manifest.json | 1 - homeassistant/components/magicseaweed/manifest.json | 1 - homeassistant/components/mailbox/manifest.json | 1 - homeassistant/components/manual/manifest.json | 2 -- homeassistant/components/manual_mqtt/manifest.json | 1 - homeassistant/components/map/manifest.json | 1 - homeassistant/components/marytts/manifest.json | 1 - homeassistant/components/mastodon/manifest.json | 1 - homeassistant/components/matrix/manifest.json | 1 - homeassistant/components/maxcube/manifest.json | 1 - homeassistant/components/mcp23017/manifest.json | 1 - homeassistant/components/media_player/manifest.json | 1 - homeassistant/components/mediaroom/manifest.json | 1 - homeassistant/components/melcloud/manifest.json | 1 - homeassistant/components/melissa/manifest.json | 1 - homeassistant/components/meraki/manifest.json | 1 - homeassistant/components/message_bird/manifest.json | 1 - homeassistant/components/met/manifest.json | 1 - homeassistant/components/meteo_france/manifest.json | 1 - homeassistant/components/meteoalarm/manifest.json | 1 - homeassistant/components/metoffice/manifest.json | 1 - homeassistant/components/mfi/manifest.json | 1 - homeassistant/components/mhz19/manifest.json | 1 - homeassistant/components/microsoft/manifest.json | 1 - homeassistant/components/microsoft_face/manifest.json | 1 - .../components/microsoft_face_detect/manifest.json | 1 - .../components/microsoft_face_identify/manifest.json | 1 - homeassistant/components/miflora/manifest.json | 1 - homeassistant/components/mikrotik/manifest.json | 3 +-- homeassistant/components/mill/manifest.json | 1 - homeassistant/components/min_max/manifest.json | 2 -- .../components/minecraft_server/manifest.json | 3 +-- homeassistant/components/minio/manifest.json | 1 - homeassistant/components/mitemp_bt/manifest.json | 1 - homeassistant/components/mjpeg/manifest.json | 2 -- homeassistant/components/mochad/manifest.json | 1 - homeassistant/components/modbus/manifest.json | 1 - homeassistant/components/modem_callerid/manifest.json | 1 - homeassistant/components/mold_indicator/manifest.json | 2 -- homeassistant/components/monoprice/manifest.json | 1 - homeassistant/components/moon/manifest.json | 2 -- homeassistant/components/mpchc/manifest.json | 2 -- homeassistant/components/mpd/manifest.json | 1 - .../components/mqtt_eventstream/manifest.json | 1 - homeassistant/components/mqtt_json/manifest.json | 1 - homeassistant/components/mqtt_room/manifest.json | 1 - .../components/mqtt_statestream/manifest.json | 1 - homeassistant/components/msteams/manifest.json | 1 - homeassistant/components/mvglive/manifest.json | 1 - homeassistant/components/mychevy/manifest.json | 1 - homeassistant/components/mycroft/manifest.json | 1 - homeassistant/components/myq/manifest.json | 1 - homeassistant/components/mysensors/manifest.json | 1 - homeassistant/components/mythicbeastsdns/manifest.json | 1 - homeassistant/components/n26/manifest.json | 1 - homeassistant/components/nad/manifest.json | 1 - homeassistant/components/namecheapdns/manifest.json | 1 - homeassistant/components/nanoleaf/manifest.json | 1 - homeassistant/components/neato/manifest.json | 1 - .../components/nederlandse_spoorwegen/manifest.json | 1 - homeassistant/components/nello/manifest.json | 1 - homeassistant/components/ness_alarm/manifest.json | 1 - homeassistant/components/nest/manifest.json | 1 - homeassistant/components/netatmo/manifest.json | 2 +- homeassistant/components/netdata/manifest.json | 1 - homeassistant/components/netgear/manifest.json | 1 - homeassistant/components/netgear_lte/manifest.json | 1 - homeassistant/components/neurio_energy/manifest.json | 1 - homeassistant/components/nexia/manifest.json | 1 - homeassistant/components/nextbus/manifest.json | 1 - homeassistant/components/nextcloud/manifest.json | 3 +-- homeassistant/components/nfandroidtv/manifest.json | 2 -- .../components/niko_home_control/manifest.json | 1 - homeassistant/components/nilu/manifest.json | 1 - homeassistant/components/nissan_leaf/manifest.json | 1 - homeassistant/components/nmap_tracker/manifest.json | 1 - homeassistant/components/nmbs/manifest.json | 1 - homeassistant/components/no_ip/manifest.json | 2 -- homeassistant/components/noaa_tides/manifest.json | 1 - homeassistant/components/norway_air/manifest.json | 1 - homeassistant/components/notify/manifest.json | 2 -- homeassistant/components/notion/manifest.json | 1 - .../components/nsw_fuel_station/manifest.json | 1 - .../nsw_rural_fire_service_feed/manifest.json | 1 - homeassistant/components/nuheat/manifest.json | 1 - .../components/nuimo_controller/manifest.json | 1 - homeassistant/components/nuki/manifest.json | 1 - homeassistant/components/nut/manifest.json | 1 - homeassistant/components/nws/manifest.json | 1 - homeassistant/components/nx584/manifest.json | 1 - homeassistant/components/nzbget/manifest.json | 1 - homeassistant/components/oasa_telematics/manifest.json | 1 - homeassistant/components/obihai/manifest.json | 1 - homeassistant/components/octoprint/manifest.json | 2 -- homeassistant/components/oem/manifest.json | 1 - homeassistant/components/ohmconnect/manifest.json | 1 - homeassistant/components/ombi/manifest.json | 1 - homeassistant/components/onboarding/manifest.json | 1 - homeassistant/components/onewire/manifest.json | 1 - homeassistant/components/onkyo/manifest.json | 1 - homeassistant/components/openalpr_cloud/manifest.json | 2 -- homeassistant/components/openalpr_local/manifest.json | 2 -- homeassistant/components/opencv/manifest.json | 3 +-- homeassistant/components/openevse/manifest.json | 1 - .../components/openexchangerates/manifest.json | 2 -- homeassistant/components/opengarage/manifest.json | 2 -- .../components/openhardwaremonitor/manifest.json | 2 -- homeassistant/components/openhome/manifest.json | 1 - homeassistant/components/opensensemap/manifest.json | 1 - homeassistant/components/opensky/manifest.json | 2 -- homeassistant/components/opentherm_gw/manifest.json | 1 - homeassistant/components/openuv/manifest.json | 1 - homeassistant/components/openweathermap/manifest.json | 1 - homeassistant/components/opnsense/manifest.json | 1 - homeassistant/components/opple/manifest.json | 1 - homeassistant/components/orangepi_gpio/manifest.json | 1 - homeassistant/components/oru/manifest.json | 1 - homeassistant/components/orvibo/manifest.json | 1 - homeassistant/components/osramlightify/manifest.json | 1 - homeassistant/components/otp/manifest.json | 1 - .../components/panasonic_bluray/manifest.json | 1 - homeassistant/components/panasonic_viera/manifest.json | 1 - homeassistant/components/pandora/manifest.json | 1 - homeassistant/components/panel_custom/manifest.json | 1 - homeassistant/components/panel_iframe/manifest.json | 1 - homeassistant/components/pcal9535a/manifest.json | 1 - homeassistant/components/pencom/manifest.json | 1 - .../components/persistent_notification/manifest.json | 2 -- homeassistant/components/person/manifest.json | 2 -- homeassistant/components/philips_js/manifest.json | 1 - homeassistant/components/pi_hole/manifest.json | 1 - homeassistant/components/picotts/manifest.json | 2 -- homeassistant/components/piglow/manifest.json | 1 - homeassistant/components/pilight/manifest.json | 1 - homeassistant/components/ping/manifest.json | 2 -- homeassistant/components/pioneer/manifest.json | 2 -- homeassistant/components/pjlink/manifest.json | 1 - homeassistant/components/plant/manifest.json | 2 -- homeassistant/components/plugwise/manifest.json | 1 - homeassistant/components/plum_lightpad/manifest.json | 1 - homeassistant/components/pocketcasts/manifest.json | 1 - homeassistant/components/powerwall/manifest.json | 1 - homeassistant/components/prezzibenzina/manifest.json | 1 - homeassistant/components/proliphix/manifest.json | 1 - homeassistant/components/prowl/manifest.json | 2 -- homeassistant/components/proximity/manifest.json | 1 - homeassistant/components/proxmoxve/manifest.json | 1 - homeassistant/components/proxy/manifest.json | 3 +-- homeassistant/components/ps4/manifest.json | 1 - homeassistant/components/ptvsd/manifest.json | 1 - .../components/pulseaudio_loopback/manifest.json | 2 -- homeassistant/components/push/manifest.json | 1 - homeassistant/components/pushbullet/manifest.json | 1 - homeassistant/components/pushetta/manifest.json | 1 - homeassistant/components/pushover/manifest.json | 1 - homeassistant/components/pushsafer/manifest.json | 2 -- homeassistant/components/pvoutput/manifest.json | 2 -- .../components/pvpc_hourly_pricing/manifest.json | 1 - homeassistant/components/pyload/manifest.json | 2 -- homeassistant/components/python_script/manifest.json | 1 - homeassistant/components/qbittorrent/manifest.json | 1 - homeassistant/components/qld_bushfire/manifest.json | 1 - homeassistant/components/qnap/manifest.json | 1 - homeassistant/components/qrcode/manifest.json | 3 +-- homeassistant/components/quantum_gateway/manifest.json | 1 - homeassistant/components/qvr_pro/manifest.json | 1 - homeassistant/components/qwikswitch/manifest.json | 1 - homeassistant/components/radarr/manifest.json | 2 -- homeassistant/components/radiotherm/manifest.json | 1 - homeassistant/components/rainbird/manifest.json | 1 - homeassistant/components/raincloud/manifest.json | 1 - .../components/rainforest_eagle/manifest.json | 1 - homeassistant/components/rainmachine/manifest.json | 1 - homeassistant/components/random/manifest.json | 2 -- homeassistant/components/raspihats/manifest.json | 1 - homeassistant/components/raspyrfm/manifest.json | 1 - homeassistant/components/recollect_waste/manifest.json | 1 - homeassistant/components/recorder/manifest.json | 1 - homeassistant/components/recswitch/manifest.json | 1 - homeassistant/components/reddit/manifest.json | 1 - homeassistant/components/rejseplanen/manifest.json | 1 - homeassistant/components/remote/manifest.json | 2 -- homeassistant/components/remote_rpi_gpio/manifest.json | 1 - homeassistant/components/repetier/manifest.json | 1 - homeassistant/components/rest/manifest.json | 1 - homeassistant/components/rest_command/manifest.json | 2 -- homeassistant/components/rflink/manifest.json | 1 - homeassistant/components/rfxtrx/manifest.json | 1 - homeassistant/components/ripple/manifest.json | 1 - homeassistant/components/rmvtransport/manifest.json | 1 - homeassistant/components/rocketchat/manifest.json | 1 - homeassistant/components/roku/manifest.json | 1 - homeassistant/components/roomba/manifest.json | 1 - homeassistant/components/route53/manifest.json | 1 - homeassistant/components/rova/manifest.json | 1 - homeassistant/components/rpi_camera/manifest.json | 2 -- homeassistant/components/rpi_gpio/manifest.json | 1 - homeassistant/components/rpi_gpio_pwm/manifest.json | 1 - homeassistant/components/rpi_pfio/manifest.json | 1 - homeassistant/components/rpi_rf/manifest.json | 1 - .../components/rss_feed_template/manifest.json | 1 - homeassistant/components/rtorrent/manifest.json | 2 -- homeassistant/components/russound_rio/manifest.json | 1 - homeassistant/components/russound_rnet/manifest.json | 1 - homeassistant/components/safe_mode/manifest.json | 1 - homeassistant/components/saj/manifest.json | 1 - homeassistant/components/salt/manifest.json | 1 - homeassistant/components/samsungtv/manifest.json | 3 +-- homeassistant/components/satel_integra/manifest.json | 1 - homeassistant/components/scene/manifest.json | 2 -- homeassistant/components/schluter/manifest.json | 1 - homeassistant/components/scrape/manifest.json | 1 - homeassistant/components/script/manifest.json | 2 -- homeassistant/components/scsgate/manifest.json | 1 - homeassistant/components/search/manifest.json | 1 - homeassistant/components/season/manifest.json | 1 - homeassistant/components/sendgrid/manifest.json | 1 - homeassistant/components/sense/manifest.json | 1 - homeassistant/components/sensehat/manifest.json | 1 - homeassistant/components/sensibo/manifest.json | 1 - homeassistant/components/sensor/manifest.json | 2 -- homeassistant/components/sentry/manifest.json | 1 - homeassistant/components/serial/manifest.json | 1 - homeassistant/components/serial_pm/manifest.json | 1 - homeassistant/components/sesame/manifest.json | 1 - homeassistant/components/seven_segments/manifest.json | 3 +-- homeassistant/components/seventeentrack/manifest.json | 1 - homeassistant/components/shell_command/manifest.json | 2 -- homeassistant/components/shiftr/manifest.json | 1 - homeassistant/components/shodan/manifest.json | 1 - homeassistant/components/shopping_list/manifest.json | 1 - homeassistant/components/sht31/manifest.json | 1 - homeassistant/components/sigfox/manifest.json | 2 -- homeassistant/components/sighthound/manifest.json | 3 +-- .../components/signal_messenger/manifest.json | 1 - homeassistant/components/simplepush/manifest.json | 1 - homeassistant/components/simplisafe/manifest.json | 1 - homeassistant/components/simulated/manifest.json | 2 -- homeassistant/components/sinch/manifest.json | 1 - homeassistant/components/sisyphus/manifest.json | 1 - homeassistant/components/sky_hub/manifest.json | 2 -- homeassistant/components/skybeacon/manifest.json | 1 - homeassistant/components/skybell/manifest.json | 1 - homeassistant/components/slack/manifest.json | 1 - homeassistant/components/sleepiq/manifest.json | 1 - homeassistant/components/slide/manifest.json | 1 - homeassistant/components/sma/manifest.json | 1 - homeassistant/components/smappee/manifest.json | 1 - homeassistant/components/smarthab/manifest.json | 1 - homeassistant/components/smarty/manifest.json | 1 - homeassistant/components/smhi/manifest.json | 1 - homeassistant/components/sms/manifest.json | 1 - homeassistant/components/smtp/manifest.json | 2 -- homeassistant/components/snapcast/manifest.json | 1 - homeassistant/components/snips/manifest.json | 1 - homeassistant/components/snmp/manifest.json | 1 - homeassistant/components/sochain/manifest.json | 1 - homeassistant/components/socialblade/manifest.json | 1 - homeassistant/components/solaredge/manifest.json | 1 - homeassistant/components/solaredge_local/manifest.json | 1 - homeassistant/components/solarlog/manifest.json | 1 - homeassistant/components/solax/manifest.json | 1 - homeassistant/components/soma/manifest.json | 1 - homeassistant/components/somfy_mylink/manifest.json | 1 - homeassistant/components/sonarr/manifest.json | 2 -- homeassistant/components/songpal/manifest.json | 1 - homeassistant/components/sonos/manifest.json | 1 - homeassistant/components/sony_projector/manifest.json | 1 - homeassistant/components/soundtouch/manifest.json | 1 - homeassistant/components/spaceapi/manifest.json | 1 - homeassistant/components/spc/manifest.json | 1 - homeassistant/components/speedtestdotnet/manifest.json | 1 - homeassistant/components/spider/manifest.json | 1 - homeassistant/components/splunk/manifest.json | 2 -- homeassistant/components/spotcrime/manifest.json | 1 - homeassistant/components/sql/manifest.json | 1 - homeassistant/components/squeezebox/manifest.json | 2 -- homeassistant/components/ssdp/manifest.json | 1 - homeassistant/components/starline/manifest.json | 1 - homeassistant/components/starlingbank/manifest.json | 1 - homeassistant/components/startca/manifest.json | 1 - homeassistant/components/statistics/manifest.json | 2 -- homeassistant/components/statsd/manifest.json | 1 - homeassistant/components/steam_online/manifest.json | 1 - homeassistant/components/stookalert/manifest.json | 1 - homeassistant/components/streamlabswater/manifest.json | 1 - homeassistant/components/stt/manifest.json | 1 - homeassistant/components/suez_water/manifest.json | 1 - homeassistant/components/sun/manifest.json | 2 -- homeassistant/components/supervisord/manifest.json | 2 -- homeassistant/components/supla/manifest.json | 1 - homeassistant/components/surepetcare/manifest.json | 1 - .../components/swiss_hydrological_data/manifest.json | 1 - .../components/swiss_public_transport/manifest.json | 1 - homeassistant/components/swisscom/manifest.json | 2 -- homeassistant/components/switch/manifest.json | 2 -- homeassistant/components/switchbot/manifest.json | 1 - homeassistant/components/switchmate/manifest.json | 1 - homeassistant/components/syncthru/manifest.json | 1 - homeassistant/components/synology/manifest.json | 1 - homeassistant/components/synology_chat/manifest.json | 2 -- homeassistant/components/synology_srm/manifest.json | 1 - homeassistant/components/synologydsm/manifest.json | 1 - homeassistant/components/syslog/manifest.json | 2 -- homeassistant/components/system_health/manifest.json | 1 - homeassistant/components/system_log/manifest.json | 1 - homeassistant/components/systemmonitor/manifest.json | 1 - homeassistant/components/tado/manifest.json | 1 - homeassistant/components/tahoma/manifest.json | 1 - homeassistant/components/tank_utility/manifest.json | 1 - homeassistant/components/tankerkoenig/manifest.json | 1 - homeassistant/components/tapsaff/manifest.json | 1 - homeassistant/components/tautulli/manifest.json | 1 - homeassistant/components/tcp/manifest.json | 2 -- homeassistant/components/ted5000/manifest.json | 1 - homeassistant/components/teksavvy/manifest.json | 2 -- homeassistant/components/telegram/manifest.json | 1 - homeassistant/components/tellduslive/manifest.json | 1 - homeassistant/components/tellstick/manifest.json | 1 - homeassistant/components/telnet/manifest.json | 2 -- homeassistant/components/temper/manifest.json | 1 - homeassistant/components/template/manifest.json | 2 -- homeassistant/components/tensorflow/manifest.json | 3 +-- homeassistant/components/tesla/manifest.json | 3 +-- homeassistant/components/tfiac/manifest.json | 1 - .../components/thermoworks_smoke/manifest.json | 1 - .../components/thethingsnetwork/manifest.json | 2 -- homeassistant/components/thingspeak/manifest.json | 1 - homeassistant/components/thinkingcleaner/manifest.json | 1 - homeassistant/components/thomson/manifest.json | 2 -- homeassistant/components/threshold/manifest.json | 2 -- homeassistant/components/tibber/manifest.json | 1 - homeassistant/components/tikteck/manifest.json | 1 - homeassistant/components/tile/manifest.json | 1 - homeassistant/components/time_date/manifest.json | 2 -- homeassistant/components/timer/manifest.json | 2 -- homeassistant/components/tmb/manifest.json | 3 +-- homeassistant/components/tod/manifest.json | 2 -- homeassistant/components/todoist/manifest.json | 1 - homeassistant/components/tomato/manifest.json | 2 -- homeassistant/components/toon/manifest.json | 1 - homeassistant/components/torque/manifest.json | 1 - homeassistant/components/totalconnect/manifest.json | 1 - homeassistant/components/touchline/manifest.json | 1 - homeassistant/components/tplink/manifest.json | 1 - homeassistant/components/tplink_lte/manifest.json | 1 - homeassistant/components/trackr/manifest.json | 1 - homeassistant/components/tradfri/manifest.json | 1 - .../components/trafikverket_train/manifest.json | 3 +-- .../trafikverket_weatherstation/manifest.json | 3 +-- homeassistant/components/transmission/manifest.json | 1 - homeassistant/components/transport_nsw/manifest.json | 1 - homeassistant/components/travisci/manifest.json | 1 - homeassistant/components/trend/manifest.json | 1 - homeassistant/components/tuya/manifest.json | 1 - homeassistant/components/twentemilieu/manifest.json | 1 - homeassistant/components/twilio_call/manifest.json | 1 - homeassistant/components/twilio_sms/manifest.json | 1 - homeassistant/components/twitch/manifest.json | 1 - homeassistant/components/twitter/manifest.json | 1 - homeassistant/components/ubee/manifest.json | 1 - homeassistant/components/ubus/manifest.json | 2 -- homeassistant/components/ue_smart_radio/manifest.json | 2 -- homeassistant/components/uk_transport/manifest.json | 2 -- homeassistant/components/unifi/manifest.json | 3 +-- homeassistant/components/unifi_direct/manifest.json | 1 - homeassistant/components/unifiled/manifest.json | 1 - homeassistant/components/universal/manifest.json | 2 -- homeassistant/components/upc_connect/manifest.json | 1 - homeassistant/components/upcloud/manifest.json | 1 - homeassistant/components/updater/manifest.json | 1 - homeassistant/components/upnp/manifest.json | 1 - homeassistant/components/uptime/manifest.json | 2 -- homeassistant/components/uptimerobot/manifest.json | 1 - homeassistant/components/uscis/manifest.json | 1 - .../components/usgs_earthquakes_feed/manifest.json | 1 - homeassistant/components/utility_meter/manifest.json | 2 -- homeassistant/components/uvc/manifest.json | 1 - homeassistant/components/vacuum/manifest.json | 2 -- homeassistant/components/vallox/manifest.json | 1 - homeassistant/components/vasttrafik/manifest.json | 1 - homeassistant/components/velbus/manifest.json | 1 - homeassistant/components/velux/manifest.json | 1 - homeassistant/components/venstar/manifest.json | 1 - homeassistant/components/vera/manifest.json | 1 - homeassistant/components/verisure/manifest.json | 1 - homeassistant/components/versasense/manifest.json | 1 - homeassistant/components/version/manifest.json | 1 - homeassistant/components/vesync/manifest.json | 1 - homeassistant/components/viaggiatreno/manifest.json | 2 -- homeassistant/components/vicare/manifest.json | 1 - homeassistant/components/vilfo/manifest.json | 1 - homeassistant/components/vivotek/manifest.json | 1 - homeassistant/components/vizio/manifest.json | 1 - homeassistant/components/vlc/manifest.json | 1 - homeassistant/components/vlc_telnet/manifest.json | 1 - homeassistant/components/voicerss/manifest.json | 2 -- homeassistant/components/volkszaehler/manifest.json | 1 - homeassistant/components/volumio/manifest.json | 2 -- homeassistant/components/volvooncall/manifest.json | 1 - homeassistant/components/vultr/manifest.json | 1 - homeassistant/components/w800rf32/manifest.json | 1 - homeassistant/components/wake_on_lan/manifest.json | 1 - homeassistant/components/waqi/manifest.json | 1 - homeassistant/components/water_heater/manifest.json | 2 -- homeassistant/components/waterfurnace/manifest.json | 1 - homeassistant/components/watson_iot/manifest.json | 1 - homeassistant/components/watson_tts/manifest.json | 1 - .../components/waze_travel_time/manifest.json | 1 - homeassistant/components/weather/manifest.json | 2 -- homeassistant/components/webhook/manifest.json | 1 - homeassistant/components/websocket_api/manifest.json | 1 - homeassistant/components/wemo/manifest.json | 1 - homeassistant/components/whois/manifest.json | 1 - homeassistant/components/wirelesstag/manifest.json | 1 - homeassistant/components/wled/manifest.json | 1 - homeassistant/components/workday/manifest.json | 1 - homeassistant/components/worldclock/manifest.json | 2 -- homeassistant/components/worldtidesinfo/manifest.json | 2 -- homeassistant/components/worxlandroid/manifest.json | 2 -- homeassistant/components/wsdot/manifest.json | 2 -- homeassistant/components/wunderground/manifest.json | 2 -- homeassistant/components/wunderlist/manifest.json | 1 - homeassistant/components/wwlln/manifest.json | 1 - homeassistant/components/x10/manifest.json | 2 -- homeassistant/components/xbox_live/manifest.json | 1 - homeassistant/components/xeoma/manifest.json | 1 - homeassistant/components/xfinity/manifest.json | 1 - homeassistant/components/xiaomi/manifest.json | 1 - homeassistant/components/xiaomi_aqara/manifest.json | 1 - homeassistant/components/xiaomi_miio/manifest.json | 1 - homeassistant/components/xiaomi_tv/manifest.json | 1 - homeassistant/components/xmpp/manifest.json | 1 - homeassistant/components/xs1/manifest.json | 1 - .../components/yale_smart_alarm/manifest.json | 1 - homeassistant/components/yamaha/manifest.json | 1 - .../components/yamaha_musiccast/manifest.json | 1 - .../components/yandex_transport/manifest.json | 1 - homeassistant/components/yandextts/manifest.json | 2 -- homeassistant/components/yeelight/manifest.json | 1 - .../components/yeelightsunflower/manifest.json | 1 - homeassistant/components/yessssms/manifest.json | 1 - homeassistant/components/yr/manifest.json | 1 - homeassistant/components/yweather/manifest.json | 1 - homeassistant/components/zabbix/manifest.json | 1 - homeassistant/components/zamg/manifest.json | 2 -- homeassistant/components/zengge/manifest.json | 1 - homeassistant/components/zestimate/manifest.json | 1 - homeassistant/components/zha/manifest.json | 1 - homeassistant/components/zhong_hong/manifest.json | 1 - homeassistant/components/zigbee/manifest.json | 1 - .../components/ziggo_mediabox_xl/manifest.json | 1 - homeassistant/components/zone/manifest.json | 2 -- homeassistant/components/zoneminder/manifest.json | 1 - homeassistant/components/zwave/manifest.json | 1 - script/gen_requirements_all.py | 6 +++--- script/hassfest/model.py | 10 ++++++++++ 870 files changed, 36 insertions(+), 1057 deletions(-) diff --git a/homeassistant/components/abode/manifest.json b/homeassistant/components/abode/manifest.json index 515031426924..c8dace4e87bb 100644 --- a/homeassistant/components/abode/manifest.json +++ b/homeassistant/components/abode/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/abode", "requirements": ["abodepy==0.19.0"], - "dependencies": [], "codeowners": ["@shred86"] } diff --git a/homeassistant/components/acer_projector/manifest.json b/homeassistant/components/acer_projector/manifest.json index eac1c36401ae..85ff4a3f5b19 100644 --- a/homeassistant/components/acer_projector/manifest.json +++ b/homeassistant/components/acer_projector/manifest.json @@ -3,6 +3,5 @@ "name": "Acer Projector", "documentation": "https://www.home-assistant.io/integrations/acer_projector", "requirements": ["pyserial==3.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/actiontec/manifest.json b/homeassistant/components/actiontec/manifest.json index ddb4954794cb..8a3f2f3f96a8 100644 --- a/homeassistant/components/actiontec/manifest.json +++ b/homeassistant/components/actiontec/manifest.json @@ -2,7 +2,5 @@ "domain": "actiontec", "name": "Actiontec", "documentation": "https://www.home-assistant.io/integrations/actiontec", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/adguard/manifest.json b/homeassistant/components/adguard/manifest.json index 02b0e2ea4554..0bcd25569a5a 100644 --- a/homeassistant/components/adguard/manifest.json +++ b/homeassistant/components/adguard/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/adguard", "requirements": ["adguardhome==0.4.2"], - "dependencies": [], "codeowners": ["@frenck"] } diff --git a/homeassistant/components/ads/manifest.json b/homeassistant/components/ads/manifest.json index 1509402d7208..0414dd0e8d9e 100644 --- a/homeassistant/components/ads/manifest.json +++ b/homeassistant/components/ads/manifest.json @@ -3,6 +3,5 @@ "name": "ADS", "documentation": "https://www.home-assistant.io/integrations/ads", "requirements": ["pyads==3.0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/aftership/manifest.json b/homeassistant/components/aftership/manifest.json index 80dc959c1362..335befa937b2 100644 --- a/homeassistant/components/aftership/manifest.json +++ b/homeassistant/components/aftership/manifest.json @@ -3,6 +3,5 @@ "name": "AfterShip", "documentation": "https://www.home-assistant.io/integrations/aftership", "requirements": ["pyaftership==0.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/air_quality/manifest.json b/homeassistant/components/air_quality/manifest.json index 4c36cc0dd22d..c7086bb2e8f7 100644 --- a/homeassistant/components/air_quality/manifest.json +++ b/homeassistant/components/air_quality/manifest.json @@ -2,7 +2,5 @@ "domain": "air_quality", "name": "Air Quality", "documentation": "https://www.home-assistant.io/integrations/air_quality", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/airly/manifest.json b/homeassistant/components/airly/manifest.json index 1859f084bf1f..e86a187793fd 100644 --- a/homeassistant/components/airly/manifest.json +++ b/homeassistant/components/airly/manifest.json @@ -2,7 +2,6 @@ "domain": "airly", "name": "Airly", "documentation": "https://www.home-assistant.io/integrations/airly", - "dependencies": [], "codeowners": ["@bieniu"], "requirements": ["airly==0.0.2"], "config_flow": true diff --git a/homeassistant/components/airvisual/manifest.json b/homeassistant/components/airvisual/manifest.json index 756fb56acc19..d5c7dc6853d0 100644 --- a/homeassistant/components/airvisual/manifest.json +++ b/homeassistant/components/airvisual/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/airvisual", "requirements": ["pyairvisual==3.0.1"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/aladdin_connect/manifest.json b/homeassistant/components/aladdin_connect/manifest.json index ca38f26ff1f7..2eb72f6bd35d 100644 --- a/homeassistant/components/aladdin_connect/manifest.json +++ b/homeassistant/components/aladdin_connect/manifest.json @@ -3,6 +3,5 @@ "name": "Aladdin Connect", "documentation": "https://www.home-assistant.io/integrations/aladdin_connect", "requirements": ["aladdin_connect==0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/alarm_control_panel/manifest.json b/homeassistant/components/alarm_control_panel/manifest.json index 80c245b8d8f6..e4cd0e27a39f 100644 --- a/homeassistant/components/alarm_control_panel/manifest.json +++ b/homeassistant/components/alarm_control_panel/manifest.json @@ -2,8 +2,6 @@ "domain": "alarm_control_panel", "name": "Alarm Control Panel", "documentation": "https://www.home-assistant.io/integrations/alarm_control_panel", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/alarmdecoder/manifest.json b/homeassistant/components/alarmdecoder/manifest.json index 9824b20db2a9..06ab3ab14839 100644 --- a/homeassistant/components/alarmdecoder/manifest.json +++ b/homeassistant/components/alarmdecoder/manifest.json @@ -3,6 +3,5 @@ "name": "AlarmDecoder", "documentation": "https://www.home-assistant.io/integrations/alarmdecoder", "requirements": ["alarmdecoder==1.13.2"], - "dependencies": [], "codeowners": ["@ajschmidt8"] } diff --git a/homeassistant/components/alert/manifest.json b/homeassistant/components/alert/manifest.json index 93c88655d34b..ff1faf398278 100644 --- a/homeassistant/components/alert/manifest.json +++ b/homeassistant/components/alert/manifest.json @@ -2,8 +2,6 @@ "domain": "alert", "name": "Alert", "documentation": "https://www.home-assistant.io/integrations/alert", - "requirements": [], - "dependencies": [], "after_dependencies": ["notify"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/alexa/manifest.json b/homeassistant/components/alexa/manifest.json index d47e5dea96a9..6144ccc68703 100644 --- a/homeassistant/components/alexa/manifest.json +++ b/homeassistant/components/alexa/manifest.json @@ -2,7 +2,6 @@ "domain": "alexa", "name": "Amazon Alexa", "documentation": "https://www.home-assistant.io/integrations/alexa", - "requirements": [], "dependencies": ["http"], "after_dependencies": ["logbook", "camera"], "codeowners": ["@home-assistant/cloud", "@ochlocracy"] diff --git a/homeassistant/components/alpha_vantage/manifest.json b/homeassistant/components/alpha_vantage/manifest.json index c7220d8e0596..dad5fc88e804 100644 --- a/homeassistant/components/alpha_vantage/manifest.json +++ b/homeassistant/components/alpha_vantage/manifest.json @@ -3,6 +3,5 @@ "name": "Alpha Vantage", "documentation": "https://www.home-assistant.io/integrations/alpha_vantage", "requirements": ["alpha_vantage==2.1.3"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/amazon_polly/manifest.json b/homeassistant/components/amazon_polly/manifest.json index 4bfcff4ce761..abcc46cadad5 100644 --- a/homeassistant/components/amazon_polly/manifest.json +++ b/homeassistant/components/amazon_polly/manifest.json @@ -3,6 +3,5 @@ "name": "Amazon Polly", "documentation": "https://www.home-assistant.io/integrations/amazon_polly", "requirements": ["boto3==1.9.252"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/ambient_station/manifest.json b/homeassistant/components/ambient_station/manifest.json index 8c4bc1b3cc09..fd6950a88a57 100644 --- a/homeassistant/components/ambient_station/manifest.json +++ b/homeassistant/components/ambient_station/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ambient_station", "requirements": ["aioambient==1.1.0"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/ampio/manifest.json b/homeassistant/components/ampio/manifest.json index 99c84da63343..c92837d2417a 100644 --- a/homeassistant/components/ampio/manifest.json +++ b/homeassistant/components/ampio/manifest.json @@ -3,6 +3,5 @@ "name": "Ampio Smart Smog System", "documentation": "https://www.home-assistant.io/integrations/ampio", "requirements": ["asmog==0.0.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/android_ip_webcam/manifest.json b/homeassistant/components/android_ip_webcam/manifest.json index f5181a7d33fe..60fe72040341 100644 --- a/homeassistant/components/android_ip_webcam/manifest.json +++ b/homeassistant/components/android_ip_webcam/manifest.json @@ -3,6 +3,5 @@ "name": "Android IP Webcam", "documentation": "https://www.home-assistant.io/integrations/android_ip_webcam", "requirements": ["pydroid-ipcam==0.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/androidtv/manifest.json b/homeassistant/components/androidtv/manifest.json index 5fea6c3f2e29..9101e342a232 100644 --- a/homeassistant/components/androidtv/manifest.json +++ b/homeassistant/components/androidtv/manifest.json @@ -7,6 +7,5 @@ "androidtv==0.0.39", "pure-python-adb==0.2.2.dev0" ], - "dependencies": [], "codeowners": ["@JeffLIrion"] } diff --git a/homeassistant/components/anel_pwrctrl/manifest.json b/homeassistant/components/anel_pwrctrl/manifest.json index d076d71b24a6..891b485bd97f 100644 --- a/homeassistant/components/anel_pwrctrl/manifest.json +++ b/homeassistant/components/anel_pwrctrl/manifest.json @@ -3,6 +3,5 @@ "name": "Anel NET-PwrCtrl", "documentation": "https://www.home-assistant.io/integrations/anel_pwrctrl", "requirements": ["anel_pwrctrl-homeassistant==0.0.1.dev2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/anthemav/manifest.json b/homeassistant/components/anthemav/manifest.json index df0de2079de7..db9d8c7d3b9e 100644 --- a/homeassistant/components/anthemav/manifest.json +++ b/homeassistant/components/anthemav/manifest.json @@ -3,6 +3,5 @@ "name": "Anthem A/V Receivers", "documentation": "https://www.home-assistant.io/integrations/anthemav", "requirements": ["anthemav==1.1.10"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/apache_kafka/manifest.json b/homeassistant/components/apache_kafka/manifest.json index 0061aecade99..f4dd2cb6ae8d 100644 --- a/homeassistant/components/apache_kafka/manifest.json +++ b/homeassistant/components/apache_kafka/manifest.json @@ -3,6 +3,5 @@ "name": "Apache Kafka", "documentation": "https://www.home-assistant.io/integrations/apache_kafka", "requirements": ["aiokafka==0.5.1"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/apcupsd/manifest.json b/homeassistant/components/apcupsd/manifest.json index 5908523e6d89..643f42b42011 100644 --- a/homeassistant/components/apcupsd/manifest.json +++ b/homeassistant/components/apcupsd/manifest.json @@ -3,6 +3,5 @@ "name": "apcupsd", "documentation": "https://www.home-assistant.io/integrations/apcupsd", "requirements": ["apcaccess==0.0.13"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/api/manifest.json b/homeassistant/components/api/manifest.json index f5795a55f043..1f400470943e 100644 --- a/homeassistant/components/api/manifest.json +++ b/homeassistant/components/api/manifest.json @@ -2,7 +2,6 @@ "domain": "api", "name": "Home Assistant API", "documentation": "https://www.home-assistant.io/integrations/api", - "requirements": [], "dependencies": ["http"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/apns/manifest.json b/homeassistant/components/apns/manifest.json index b498e4476ec2..0d3639040f72 100644 --- a/homeassistant/components/apns/manifest.json +++ b/homeassistant/components/apns/manifest.json @@ -3,7 +3,6 @@ "name": "Apple Push Notification Service (APNS)", "documentation": "https://www.home-assistant.io/integrations/apns", "requirements": ["apns2==0.3.0"], - "dependencies": [], "after_dependencies": ["device_tracker"], "codeowners": [] } diff --git a/homeassistant/components/apprise/manifest.json b/homeassistant/components/apprise/manifest.json index ba934b804d7c..2f22b9f63445 100644 --- a/homeassistant/components/apprise/manifest.json +++ b/homeassistant/components/apprise/manifest.json @@ -3,6 +3,5 @@ "name": "Apprise", "documentation": "https://www.home-assistant.io/integrations/apprise", "requirements": ["apprise==0.8.5"], - "dependencies": [], "codeowners": ["@caronc"] } diff --git a/homeassistant/components/aprs/manifest.json b/homeassistant/components/aprs/manifest.json index bc887505cd7e..2b5c3c87a5df 100644 --- a/homeassistant/components/aprs/manifest.json +++ b/homeassistant/components/aprs/manifest.json @@ -2,7 +2,6 @@ "domain": "aprs", "name": "APRS", "documentation": "https://www.home-assistant.io/integrations/aprs", - "dependencies": [], "codeowners": ["@PhilRW"], "requirements": ["aprslib==0.6.46", "geopy==1.19.0"] } diff --git a/homeassistant/components/aqualogic/manifest.json b/homeassistant/components/aqualogic/manifest.json index f7f704e998b9..2a8e2a78cacd 100644 --- a/homeassistant/components/aqualogic/manifest.json +++ b/homeassistant/components/aqualogic/manifest.json @@ -3,6 +3,5 @@ "name": "AquaLogic", "documentation": "https://www.home-assistant.io/integrations/aqualogic", "requirements": ["aqualogic==1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/aquostv/manifest.json b/homeassistant/components/aquostv/manifest.json index 8922249e3fa4..cd402b3db90d 100644 --- a/homeassistant/components/aquostv/manifest.json +++ b/homeassistant/components/aquostv/manifest.json @@ -3,6 +3,5 @@ "name": "Sharp Aquos TV", "documentation": "https://www.home-assistant.io/integrations/aquostv", "requirements": ["sharp_aquos_rc==0.3.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/arcam_fmj/manifest.json b/homeassistant/components/arcam_fmj/manifest.json index cb063c4c0478..5508f4b68692 100644 --- a/homeassistant/components/arcam_fmj/manifest.json +++ b/homeassistant/components/arcam_fmj/manifest.json @@ -4,6 +4,5 @@ "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/arcam_fmj", "requirements": ["arcam-fmj==0.4.3"], - "dependencies": [], "codeowners": ["@elupus"] } diff --git a/homeassistant/components/arduino/manifest.json b/homeassistant/components/arduino/manifest.json index aded8c1c9ac3..4266d55926b6 100644 --- a/homeassistant/components/arduino/manifest.json +++ b/homeassistant/components/arduino/manifest.json @@ -3,6 +3,5 @@ "name": "Arduino", "documentation": "https://www.home-assistant.io/integrations/arduino", "requirements": ["PyMata==2.20"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/arest/manifest.json b/homeassistant/components/arest/manifest.json index 58eaad4648bf..9ed57d2d982f 100644 --- a/homeassistant/components/arest/manifest.json +++ b/homeassistant/components/arest/manifest.json @@ -2,7 +2,5 @@ "domain": "arest", "name": "aREST", "documentation": "https://www.home-assistant.io/integrations/arest", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/aruba/manifest.json b/homeassistant/components/aruba/manifest.json index b871fa029cf9..aa55cdba3556 100644 --- a/homeassistant/components/aruba/manifest.json +++ b/homeassistant/components/aruba/manifest.json @@ -3,6 +3,5 @@ "name": "Aruba", "documentation": "https://www.home-assistant.io/integrations/aruba", "requirements": ["pexpect==4.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/arwn/manifest.json b/homeassistant/components/arwn/manifest.json index d756fa457d3c..36ec1c79e585 100644 --- a/homeassistant/components/arwn/manifest.json +++ b/homeassistant/components/arwn/manifest.json @@ -2,7 +2,6 @@ "domain": "arwn", "name": "Ambient Radio Weather Network", "documentation": "https://www.home-assistant.io/integrations/arwn", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/asterisk_cdr/manifest.json b/homeassistant/components/asterisk_cdr/manifest.json index ac18b14682eb..8681c308ba3e 100644 --- a/homeassistant/components/asterisk_cdr/manifest.json +++ b/homeassistant/components/asterisk_cdr/manifest.json @@ -2,7 +2,6 @@ "domain": "asterisk_cdr", "name": "Asterisk Call Detail Records", "documentation": "https://www.home-assistant.io/integrations/asterisk_cdr", - "requirements": [], "dependencies": ["asterisk_mbox"], "codeowners": [] } diff --git a/homeassistant/components/asterisk_mbox/manifest.json b/homeassistant/components/asterisk_mbox/manifest.json index 6a3591b001bf..f02e964fb614 100644 --- a/homeassistant/components/asterisk_mbox/manifest.json +++ b/homeassistant/components/asterisk_mbox/manifest.json @@ -3,6 +3,5 @@ "name": "Asterisk Voicemail", "documentation": "https://www.home-assistant.io/integrations/asterisk_mbox", "requirements": ["asterisk_mbox==0.5.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/asuswrt/manifest.json b/homeassistant/components/asuswrt/manifest.json index 2e032dedfe71..6afeed701e86 100644 --- a/homeassistant/components/asuswrt/manifest.json +++ b/homeassistant/components/asuswrt/manifest.json @@ -3,6 +3,5 @@ "name": "ASUSWRT", "documentation": "https://www.home-assistant.io/integrations/asuswrt", "requirements": ["aioasuswrt==1.2.3"], - "dependencies": [], "codeowners": ["@kennedyshead"] } diff --git a/homeassistant/components/aten_pe/manifest.json b/homeassistant/components/aten_pe/manifest.json index c7910a1254bf..fdfcb4de0475 100644 --- a/homeassistant/components/aten_pe/manifest.json +++ b/homeassistant/components/aten_pe/manifest.json @@ -3,6 +3,5 @@ "name": "ATEN Rack PDU", "documentation": "https://www.home-assistant.io/integrations/aten_pe", "requirements": ["atenpdu==0.3.0"], - "dependencies": [], "codeowners": ["@mtdcr"] } diff --git a/homeassistant/components/atome/manifest.json b/homeassistant/components/atome/manifest.json index 493940329f8f..9479f76c7d82 100644 --- a/homeassistant/components/atome/manifest.json +++ b/homeassistant/components/atome/manifest.json @@ -2,7 +2,6 @@ "domain": "atome", "name": "Atome Linky", "documentation": "https://www.home-assistant.io/integrations/atome", - "dependencies": [], "codeowners": ["@baqs"], "requirements": ["pyatome==0.1.1"] } diff --git a/homeassistant/components/aurora/manifest.json b/homeassistant/components/aurora/manifest.json index 204327043f9c..3e7a93596144 100644 --- a/homeassistant/components/aurora/manifest.json +++ b/homeassistant/components/aurora/manifest.json @@ -2,7 +2,5 @@ "domain": "aurora", "name": "Aurora", "documentation": "https://www.home-assistant.io/integrations/aurora", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/aurora_abb_powerone/manifest.json b/homeassistant/components/aurora_abb_powerone/manifest.json index 18e5a4b5ed9a..55d700c64962 100644 --- a/homeassistant/components/aurora_abb_powerone/manifest.json +++ b/homeassistant/components/aurora_abb_powerone/manifest.json @@ -2,7 +2,6 @@ "domain": "aurora_abb_powerone", "name": "Aurora ABB Solar PV", "documentation": "https://www.home-assistant.io/integrations/aurora_abb_powerone/", - "dependencies": [], "codeowners": ["@davet2001"], "requirements": ["aurorapy==0.2.6"] } diff --git a/homeassistant/components/auth/manifest.json b/homeassistant/components/auth/manifest.json index e2b49ccfec13..b8c711c1dda9 100644 --- a/homeassistant/components/auth/manifest.json +++ b/homeassistant/components/auth/manifest.json @@ -2,7 +2,6 @@ "domain": "auth", "name": "Auth", "documentation": "https://www.home-assistant.io/integrations/auth", - "requirements": [], "dependencies": ["http"], "after_dependencies": ["onboarding"], "codeowners": ["@home-assistant/core"], diff --git a/homeassistant/components/automation/manifest.json b/homeassistant/components/automation/manifest.json index 48d8c58dfe10..1b5fad1b5888 100644 --- a/homeassistant/components/automation/manifest.json +++ b/homeassistant/components/automation/manifest.json @@ -2,8 +2,6 @@ "domain": "automation", "name": "Automation", "documentation": "https://www.home-assistant.io/integrations/automation", - "requirements": [], - "dependencies": [], "after_dependencies": ["device_automation", "webhook"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/avea/manifest.json b/homeassistant/components/avea/manifest.json index f6217eeed182..729219d8f1de 100644 --- a/homeassistant/components/avea/manifest.json +++ b/homeassistant/components/avea/manifest.json @@ -2,7 +2,6 @@ "domain": "avea", "name": "Elgato Avea", "documentation": "https://www.home-assistant.io/integrations/avea", - "dependencies": [], "codeowners": ["@pattyland"], "requirements": ["avea==1.4"] } diff --git a/homeassistant/components/avion/manifest.json b/homeassistant/components/avion/manifest.json index cfdda5a0d845..bd72cb8c06c6 100644 --- a/homeassistant/components/avion/manifest.json +++ b/homeassistant/components/avion/manifest.json @@ -3,6 +3,5 @@ "name": "Avi-on", "documentation": "https://www.home-assistant.io/integrations/avion", "requirements": ["avion==0.10"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/avri/manifest.json b/homeassistant/components/avri/manifest.json index 7c9e7bc348c5..41be3251b100 100644 --- a/homeassistant/components/avri/manifest.json +++ b/homeassistant/components/avri/manifest.json @@ -3,6 +3,5 @@ "name": "Avri", "documentation": "https://www.home-assistant.io/integrations/avri", "requirements": ["avri-api==0.1.7"], - "dependencies": [], "codeowners": ["@timvancann"] } diff --git a/homeassistant/components/awair/manifest.json b/homeassistant/components/awair/manifest.json index 2741ad358f69..2ead58c0fe80 100644 --- a/homeassistant/components/awair/manifest.json +++ b/homeassistant/components/awair/manifest.json @@ -3,6 +3,5 @@ "name": "Awair", "documentation": "https://www.home-assistant.io/integrations/awair", "requirements": ["python_awair==0.0.4"], - "dependencies": [], "codeowners": ["@danielsjf"] } diff --git a/homeassistant/components/aws/manifest.json b/homeassistant/components/aws/manifest.json index 3f9c0043a3e3..f6e88ce2899c 100644 --- a/homeassistant/components/aws/manifest.json +++ b/homeassistant/components/aws/manifest.json @@ -3,6 +3,5 @@ "name": "Amazon Web Services (AWS)", "documentation": "https://www.home-assistant.io/integrations/aws", "requirements": ["aiobotocore==0.11.1"], - "dependencies": [], "codeowners": ["@awarecan", "@robbiet480"] } diff --git a/homeassistant/components/axis/manifest.json b/homeassistant/components/axis/manifest.json index 348f61483863..6e8899c79d65 100644 --- a/homeassistant/components/axis/manifest.json +++ b/homeassistant/components/axis/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/axis", "requirements": ["axis==25"], - "dependencies": [], "zeroconf": ["_axis-video._tcp.local."], "codeowners": ["@kane610"] } diff --git a/homeassistant/components/azure_event_hub/manifest.json b/homeassistant/components/azure_event_hub/manifest.json index 614fb0d98ef7..f9d4cf09e048 100644 --- a/homeassistant/components/azure_event_hub/manifest.json +++ b/homeassistant/components/azure_event_hub/manifest.json @@ -3,6 +3,5 @@ "name": "Azure Event Hub", "documentation": "https://www.home-assistant.io/integrations/azure_event_hub", "requirements": ["azure-eventhub==1.3.1"], - "dependencies": [], "codeowners": ["@eavanvalkenburg"] } diff --git a/homeassistant/components/azure_service_bus/manifest.json b/homeassistant/components/azure_service_bus/manifest.json index af1d9d889df6..9e3f0e956e58 100644 --- a/homeassistant/components/azure_service_bus/manifest.json +++ b/homeassistant/components/azure_service_bus/manifest.json @@ -3,6 +3,5 @@ "name": "Azure Service Bus", "documentation": "https://www.home-assistant.io/integrations/azure_service_bus", "requirements": ["azure-servicebus==0.50.1"], - "dependencies": [], "codeowners": ["@hfurubotten"] } diff --git a/homeassistant/components/baidu/manifest.json b/homeassistant/components/baidu/manifest.json index 2448f87778ba..88443e867222 100644 --- a/homeassistant/components/baidu/manifest.json +++ b/homeassistant/components/baidu/manifest.json @@ -3,6 +3,5 @@ "name": "Baidu", "documentation": "https://www.home-assistant.io/integrations/baidu", "requirements": ["baidu-aip==1.6.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bayesian/manifest.json b/homeassistant/components/bayesian/manifest.json index 1b4dc73810fc..ca62e91f09ee 100644 --- a/homeassistant/components/bayesian/manifest.json +++ b/homeassistant/components/bayesian/manifest.json @@ -2,8 +2,6 @@ "domain": "bayesian", "name": "Bayesian", "documentation": "https://www.home-assistant.io/integrations/bayesian", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/bbb_gpio/manifest.json b/homeassistant/components/bbb_gpio/manifest.json index 42670d510daf..201c01fa7099 100644 --- a/homeassistant/components/bbb_gpio/manifest.json +++ b/homeassistant/components/bbb_gpio/manifest.json @@ -3,6 +3,5 @@ "name": "BeagleBone Black GPIO", "documentation": "https://www.home-assistant.io/integrations/bbb_gpio", "requirements": ["Adafruit_BBIO==1.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bbox/manifest.json b/homeassistant/components/bbox/manifest.json index ed7f7270bd5d..bdace6c35f5a 100644 --- a/homeassistant/components/bbox/manifest.json +++ b/homeassistant/components/bbox/manifest.json @@ -3,6 +3,5 @@ "name": "Bbox", "documentation": "https://www.home-assistant.io/integrations/bbox", "requirements": ["pybbox==0.0.5-alpha"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/beewi_smartclim/manifest.json b/homeassistant/components/beewi_smartclim/manifest.json index 69adb76d3cbc..169132515d26 100644 --- a/homeassistant/components/beewi_smartclim/manifest.json +++ b/homeassistant/components/beewi_smartclim/manifest.json @@ -3,6 +3,5 @@ "name": "BeeWi SmartClim BLE sensor", "documentation": "https://www.home-assistant.io/integrations/beewi_smartclim", "requirements": ["beewi_smartclim==0.0.7"], - "dependencies": [], "codeowners": ["@alemuro"] } diff --git a/homeassistant/components/bh1750/manifest.json b/homeassistant/components/bh1750/manifest.json index 1c9724b7dd85..e8473910abdf 100644 --- a/homeassistant/components/bh1750/manifest.json +++ b/homeassistant/components/bh1750/manifest.json @@ -3,6 +3,5 @@ "name": "BH1750", "documentation": "https://www.home-assistant.io/integrations/bh1750", "requirements": ["i2csense==0.0.4", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/binary_sensor/manifest.json b/homeassistant/components/binary_sensor/manifest.json index cbe956847152..be2feb9d207c 100644 --- a/homeassistant/components/binary_sensor/manifest.json +++ b/homeassistant/components/binary_sensor/manifest.json @@ -2,8 +2,6 @@ "domain": "binary_sensor", "name": "Binary Sensor", "documentation": "https://www.home-assistant.io/integrations/binary_sensor", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/bitcoin/manifest.json b/homeassistant/components/bitcoin/manifest.json index caf1aafcacff..e198813dbee7 100644 --- a/homeassistant/components/bitcoin/manifest.json +++ b/homeassistant/components/bitcoin/manifest.json @@ -3,6 +3,5 @@ "name": "Bitcoin", "documentation": "https://www.home-assistant.io/integrations/bitcoin", "requirements": ["blockchain==1.4.4"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/bizkaibus/manifest.json b/homeassistant/components/bizkaibus/manifest.json index 63c0494c2f18..d403d96ce6fb 100644 --- a/homeassistant/components/bizkaibus/manifest.json +++ b/homeassistant/components/bizkaibus/manifest.json @@ -2,7 +2,6 @@ "domain": "bizkaibus", "name": "Bizkaibus", "documentation": "https://www.home-assistant.io/integrations/bizkaibus", - "dependencies": [], "codeowners": ["@UgaitzEtxebarria"], "requirements": ["bizkaibus==0.1.1"] } diff --git a/homeassistant/components/blackbird/manifest.json b/homeassistant/components/blackbird/manifest.json index d68703eee84e..f094109ba849 100644 --- a/homeassistant/components/blackbird/manifest.json +++ b/homeassistant/components/blackbird/manifest.json @@ -3,6 +3,5 @@ "name": "Monoprice Blackbird Matrix Switch", "documentation": "https://www.home-assistant.io/integrations/blackbird", "requirements": ["pyblackbird==0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/blink/manifest.json b/homeassistant/components/blink/manifest.json index 4912f72b906d..ef1b91225f4e 100644 --- a/homeassistant/components/blink/manifest.json +++ b/homeassistant/components/blink/manifest.json @@ -3,6 +3,5 @@ "name": "Blink", "documentation": "https://www.home-assistant.io/integrations/blink", "requirements": ["blinkpy==0.14.2"], - "dependencies": [], "codeowners": ["@fronzbot"] } diff --git a/homeassistant/components/blinksticklight/manifest.json b/homeassistant/components/blinksticklight/manifest.json index 75ee7c8ad365..07726bc8cb08 100644 --- a/homeassistant/components/blinksticklight/manifest.json +++ b/homeassistant/components/blinksticklight/manifest.json @@ -3,6 +3,5 @@ "name": "BlinkStick", "documentation": "https://www.home-assistant.io/integrations/blinksticklight", "requirements": ["blinkstick==1.1.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/blinkt/manifest.json b/homeassistant/components/blinkt/manifest.json index f61b674aa3a2..4759a356d9d6 100644 --- a/homeassistant/components/blinkt/manifest.json +++ b/homeassistant/components/blinkt/manifest.json @@ -3,6 +3,5 @@ "name": "Blinkt!", "documentation": "https://www.home-assistant.io/integrations/blinkt", "requirements": ["blinkt==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/blockchain/manifest.json b/homeassistant/components/blockchain/manifest.json index 324abf792dfd..f30f7d041a0f 100644 --- a/homeassistant/components/blockchain/manifest.json +++ b/homeassistant/components/blockchain/manifest.json @@ -3,6 +3,5 @@ "name": "Blockchain.com", "documentation": "https://www.home-assistant.io/integrations/blockchain", "requirements": ["python-blockchain-api==0.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bloomsky/manifest.json b/homeassistant/components/bloomsky/manifest.json index fdaa649b344b..8dda93b16b90 100644 --- a/homeassistant/components/bloomsky/manifest.json +++ b/homeassistant/components/bloomsky/manifest.json @@ -2,7 +2,5 @@ "domain": "bloomsky", "name": "BloomSky", "documentation": "https://www.home-assistant.io/integrations/bloomsky", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bluesound/manifest.json b/homeassistant/components/bluesound/manifest.json index df6aa5b03dea..9ea32a9e5df0 100644 --- a/homeassistant/components/bluesound/manifest.json +++ b/homeassistant/components/bluesound/manifest.json @@ -3,6 +3,5 @@ "name": "Bluesound", "documentation": "https://www.home-assistant.io/integrations/bluesound", "requirements": ["xmltodict==0.12.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bluetooth_le_tracker/manifest.json b/homeassistant/components/bluetooth_le_tracker/manifest.json index 52d2d40a99ba..ca4a44c55c66 100644 --- a/homeassistant/components/bluetooth_le_tracker/manifest.json +++ b/homeassistant/components/bluetooth_le_tracker/manifest.json @@ -3,6 +3,5 @@ "name": "Bluetooth LE Tracker", "documentation": "https://www.home-assistant.io/integrations/bluetooth_le_tracker", "requirements": ["pygatt[GATTTOOL]==4.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bluetooth_tracker/manifest.json b/homeassistant/components/bluetooth_tracker/manifest.json index b6ae27346f25..9ef6fddcb0d0 100644 --- a/homeassistant/components/bluetooth_tracker/manifest.json +++ b/homeassistant/components/bluetooth_tracker/manifest.json @@ -3,6 +3,5 @@ "name": "Bluetooth Tracker", "documentation": "https://www.home-assistant.io/integrations/bluetooth_tracker", "requirements": ["bt_proximity==0.2", "pybluez==0.22"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bme280/manifest.json b/homeassistant/components/bme280/manifest.json index 393d3f451048..2402c41402e3 100644 --- a/homeassistant/components/bme280/manifest.json +++ b/homeassistant/components/bme280/manifest.json @@ -3,6 +3,5 @@ "name": "Bosch BME280 Environmental Sensor", "documentation": "https://www.home-assistant.io/integrations/bme280", "requirements": ["i2csense==0.0.4", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bme680/manifest.json b/homeassistant/components/bme680/manifest.json index 058bbf341e81..be59b2fbaf9f 100644 --- a/homeassistant/components/bme680/manifest.json +++ b/homeassistant/components/bme680/manifest.json @@ -3,6 +3,5 @@ "name": "Bosch BME680 Environmental Sensor", "documentation": "https://www.home-assistant.io/integrations/bme680", "requirements": ["bme680==1.0.5", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bmp280/manifest.json b/homeassistant/components/bmp280/manifest.json index d7d3752392ba..dbd798967189 100644 --- a/homeassistant/components/bmp280/manifest.json +++ b/homeassistant/components/bmp280/manifest.json @@ -2,7 +2,6 @@ "domain": "bmp280", "name": "Bosch BMP280 Environmental Sensor", "documentation": "https://www.home-assistant.io/integrations/bmp280", - "dependencies": [], "codeowners": ["@belidzs"], "requirements": ["adafruit-circuitpython-bmp280==3.1.1", "RPi.GPIO==0.7.0"], "quality_scale": "silver" diff --git a/homeassistant/components/bmw_connected_drive/manifest.json b/homeassistant/components/bmw_connected_drive/manifest.json index 6b6311c6b0d5..6dcfecefc227 100644 --- a/homeassistant/components/bmw_connected_drive/manifest.json +++ b/homeassistant/components/bmw_connected_drive/manifest.json @@ -3,6 +3,5 @@ "name": "BMW Connected Drive", "documentation": "https://www.home-assistant.io/integrations/bmw_connected_drive", "requirements": ["bimmer_connected==0.7.1"], - "dependencies": [], "codeowners": ["@gerard33"] } diff --git a/homeassistant/components/bom/manifest.json b/homeassistant/components/bom/manifest.json index 13537c53d0cb..854b42f68d39 100644 --- a/homeassistant/components/bom/manifest.json +++ b/homeassistant/components/bom/manifest.json @@ -3,6 +3,5 @@ "name": "Australian Bureau of Meteorology (BOM)", "documentation": "https://www.home-assistant.io/integrations/bom", "requirements": ["bomradarloop==0.1.4"], - "dependencies": [], "codeowners": ["@maddenp"] } diff --git a/homeassistant/components/broadlink/manifest.json b/homeassistant/components/broadlink/manifest.json index a179ca9c0662..74ec59195df0 100644 --- a/homeassistant/components/broadlink/manifest.json +++ b/homeassistant/components/broadlink/manifest.json @@ -3,6 +3,5 @@ "name": "Broadlink", "documentation": "https://www.home-assistant.io/integrations/broadlink", "requirements": ["broadlink==0.13.0"], - "dependencies": [], "codeowners": ["@danielhiversen", "@felipediel"] } diff --git a/homeassistant/components/brother/manifest.json b/homeassistant/components/brother/manifest.json index 7f48c7ee22c1..7dc77d958ada 100644 --- a/homeassistant/components/brother/manifest.json +++ b/homeassistant/components/brother/manifest.json @@ -2,7 +2,6 @@ "domain": "brother", "name": "Brother Printer", "documentation": "https://www.home-assistant.io/integrations/brother", - "dependencies": [], "codeowners": ["@bieniu"], "requirements": ["brother==0.1.11"], "zeroconf": ["_printer._tcp.local."], diff --git a/homeassistant/components/brottsplatskartan/manifest.json b/homeassistant/components/brottsplatskartan/manifest.json index dfc1a385c6b8..0737e506785c 100644 --- a/homeassistant/components/brottsplatskartan/manifest.json +++ b/homeassistant/components/brottsplatskartan/manifest.json @@ -3,6 +3,5 @@ "name": "Brottsplatskartan", "documentation": "https://www.home-assistant.io/integrations/brottsplatskartan", "requirements": ["brottsplatskartan==0.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/browser/manifest.json b/homeassistant/components/browser/manifest.json index bb6c5e783fd8..448e3af1d24e 100644 --- a/homeassistant/components/browser/manifest.json +++ b/homeassistant/components/browser/manifest.json @@ -2,8 +2,6 @@ "domain": "browser", "name": "Browser", "documentation": "https://www.home-assistant.io/integrations/browser", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/brunt/manifest.json b/homeassistant/components/brunt/manifest.json index 4af42fb28de8..68f0cf9e461d 100644 --- a/homeassistant/components/brunt/manifest.json +++ b/homeassistant/components/brunt/manifest.json @@ -3,6 +3,5 @@ "name": "Brunt Blind Engine", "documentation": "https://www.home-assistant.io/integrations/brunt", "requirements": ["brunt==0.1.3"], - "dependencies": [], "codeowners": ["@eavanvalkenburg"] } diff --git a/homeassistant/components/bt_home_hub_5/manifest.json b/homeassistant/components/bt_home_hub_5/manifest.json index fde6dc6e5462..adf3e74c7a60 100644 --- a/homeassistant/components/bt_home_hub_5/manifest.json +++ b/homeassistant/components/bt_home_hub_5/manifest.json @@ -3,6 +3,5 @@ "name": "BT Home Hub 5", "documentation": "https://www.home-assistant.io/integrations/bt_home_hub_5", "requirements": ["bthomehub5-devicelist==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/bt_smarthub/manifest.json b/homeassistant/components/bt_smarthub/manifest.json index 0c474584f364..5f677a433c8e 100644 --- a/homeassistant/components/bt_smarthub/manifest.json +++ b/homeassistant/components/bt_smarthub/manifest.json @@ -3,6 +3,5 @@ "name": "BT Smart Hub", "documentation": "https://www.home-assistant.io/integrations/bt_smarthub", "requirements": ["btsmarthub_devicelist==0.1.3"], - "dependencies": [], "codeowners": ["@jxwolstenholme"] } diff --git a/homeassistant/components/buienradar/manifest.json b/homeassistant/components/buienradar/manifest.json index 5f604322b161..359cb471adad 100644 --- a/homeassistant/components/buienradar/manifest.json +++ b/homeassistant/components/buienradar/manifest.json @@ -3,6 +3,5 @@ "name": "Buienradar", "documentation": "https://www.home-assistant.io/integrations/buienradar", "requirements": ["buienradar==1.0.4"], - "dependencies": [], "codeowners": ["@mjj4791", "@ties"] } diff --git a/homeassistant/components/caldav/manifest.json b/homeassistant/components/caldav/manifest.json index 85dc005a6a89..94d786c88255 100644 --- a/homeassistant/components/caldav/manifest.json +++ b/homeassistant/components/caldav/manifest.json @@ -3,6 +3,5 @@ "name": "CalDAV", "documentation": "https://www.home-assistant.io/integrations/caldav", "requirements": ["caldav==0.6.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/calendar/manifest.json b/homeassistant/components/calendar/manifest.json index abcff158bfb8..1ae68100c069 100644 --- a/homeassistant/components/calendar/manifest.json +++ b/homeassistant/components/calendar/manifest.json @@ -2,7 +2,6 @@ "domain": "calendar", "name": "Calendar", "documentation": "https://www.home-assistant.io/integrations/calendar", - "requirements": [], "dependencies": ["http"], "codeowners": [] } diff --git a/homeassistant/components/camera/manifest.json b/homeassistant/components/camera/manifest.json index e3a2400ac8b1..ed8e10c1956f 100644 --- a/homeassistant/components/camera/manifest.json +++ b/homeassistant/components/camera/manifest.json @@ -2,7 +2,6 @@ "domain": "camera", "name": "Camera", "documentation": "https://www.home-assistant.io/integrations/camera", - "requirements": [], "dependencies": ["http"], "after_dependencies": ["media_player"], "codeowners": [], diff --git a/homeassistant/components/cast/manifest.json b/homeassistant/components/cast/manifest.json index be0b64dc0b18..e88175076728 100644 --- a/homeassistant/components/cast/manifest.json +++ b/homeassistant/components/cast/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/cast", "requirements": ["pychromecast==4.2.0"], - "dependencies": [], "after_dependencies": ["cloud"], "zeroconf": ["_googlecast._tcp.local."], "codeowners": [] diff --git a/homeassistant/components/cert_expiry/manifest.json b/homeassistant/components/cert_expiry/manifest.json index dc26006d711d..62216290b805 100644 --- a/homeassistant/components/cert_expiry/manifest.json +++ b/homeassistant/components/cert_expiry/manifest.json @@ -2,8 +2,6 @@ "domain": "cert_expiry", "name": "Certificate Expiry", "documentation": "https://www.home-assistant.io/integrations/cert_expiry", - "requirements": [], "config_flow": true, - "dependencies": [], "codeowners": ["@Cereal2nd", "@jjlawren"] } diff --git a/homeassistant/components/channels/manifest.json b/homeassistant/components/channels/manifest.json index 3a61d0636bca..45248bf1e7d2 100644 --- a/homeassistant/components/channels/manifest.json +++ b/homeassistant/components/channels/manifest.json @@ -3,6 +3,5 @@ "name": "Channels", "documentation": "https://www.home-assistant.io/integrations/channels", "requirements": ["pychannels==1.0.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/cisco_ios/manifest.json b/homeassistant/components/cisco_ios/manifest.json index 0cdcddb56df8..b485cf831b17 100644 --- a/homeassistant/components/cisco_ios/manifest.json +++ b/homeassistant/components/cisco_ios/manifest.json @@ -3,6 +3,5 @@ "name": "Cisco IOS", "documentation": "https://www.home-assistant.io/integrations/cisco_ios", "requirements": ["pexpect==4.6.0"], - "dependencies": [], "codeowners": ["@fbradyirl"] } diff --git a/homeassistant/components/cisco_mobility_express/manifest.json b/homeassistant/components/cisco_mobility_express/manifest.json index 4c83116747ba..972903e53e6d 100644 --- a/homeassistant/components/cisco_mobility_express/manifest.json +++ b/homeassistant/components/cisco_mobility_express/manifest.json @@ -3,6 +3,5 @@ "name": "Cisco Mobility Express", "documentation": "https://www.home-assistant.io/integrations/cisco_mobility_express", "requirements": ["ciscomobilityexpress==0.3.3"], - "dependencies": [], "codeowners": ["@fbradyirl"] } diff --git a/homeassistant/components/cisco_webex_teams/manifest.json b/homeassistant/components/cisco_webex_teams/manifest.json index c9d6d14c1093..d10f9641846e 100644 --- a/homeassistant/components/cisco_webex_teams/manifest.json +++ b/homeassistant/components/cisco_webex_teams/manifest.json @@ -3,6 +3,5 @@ "name": "Cisco Webex Teams", "documentation": "https://www.home-assistant.io/integrations/cisco_webex_teams", "requirements": ["webexteamssdk==1.1.1"], - "dependencies": [], "codeowners": ["@fbradyirl"] } diff --git a/homeassistant/components/citybikes/manifest.json b/homeassistant/components/citybikes/manifest.json index 488997378ef9..1470832e899e 100644 --- a/homeassistant/components/citybikes/manifest.json +++ b/homeassistant/components/citybikes/manifest.json @@ -2,7 +2,5 @@ "domain": "citybikes", "name": "CityBikes", "documentation": "https://www.home-assistant.io/integrations/citybikes", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/clementine/manifest.json b/homeassistant/components/clementine/manifest.json index dadb28c0392b..53ae0cbe5332 100644 --- a/homeassistant/components/clementine/manifest.json +++ b/homeassistant/components/clementine/manifest.json @@ -3,6 +3,5 @@ "name": "Clementine Music Player", "documentation": "https://www.home-assistant.io/integrations/clementine", "requirements": ["python-clementine-remote==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/clickatell/manifest.json b/homeassistant/components/clickatell/manifest.json index a10da6e1cc0c..520fce157cda 100644 --- a/homeassistant/components/clickatell/manifest.json +++ b/homeassistant/components/clickatell/manifest.json @@ -2,7 +2,5 @@ "domain": "clickatell", "name": "Clickatell", "documentation": "https://www.home-assistant.io/integrations/clickatell", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/clicksend/manifest.json b/homeassistant/components/clicksend/manifest.json index 18f048d1efc9..ee72e056b30c 100644 --- a/homeassistant/components/clicksend/manifest.json +++ b/homeassistant/components/clicksend/manifest.json @@ -2,7 +2,5 @@ "domain": "clicksend", "name": "ClickSend SMS", "documentation": "https://www.home-assistant.io/integrations/clicksend", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/clicksend_tts/manifest.json b/homeassistant/components/clicksend_tts/manifest.json index 75b9ec2619fe..f5d3390d0057 100644 --- a/homeassistant/components/clicksend_tts/manifest.json +++ b/homeassistant/components/clicksend_tts/manifest.json @@ -2,7 +2,5 @@ "domain": "clicksend_tts", "name": "ClickSend TTS", "documentation": "https://www.home-assistant.io/integrations/clicksend_tts", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/climate/manifest.json b/homeassistant/components/climate/manifest.json index 4ac1f55b2b0c..5d950ccbe2da 100644 --- a/homeassistant/components/climate/manifest.json +++ b/homeassistant/components/climate/manifest.json @@ -2,8 +2,6 @@ "domain": "climate", "name": "Climate", "documentation": "https://www.home-assistant.io/integrations/climate", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/cloudflare/manifest.json b/homeassistant/components/cloudflare/manifest.json index 44beaaa213ae..d22d526d01c4 100644 --- a/homeassistant/components/cloudflare/manifest.json +++ b/homeassistant/components/cloudflare/manifest.json @@ -3,6 +3,5 @@ "name": "Cloudflare", "documentation": "https://www.home-assistant.io/integrations/cloudflare", "requirements": ["pycfdns==0.0.1"], - "dependencies": [], "codeowners": ["@ludeeus"] } diff --git a/homeassistant/components/cmus/manifest.json b/homeassistant/components/cmus/manifest.json index 22585f7766b0..5a062996ab97 100644 --- a/homeassistant/components/cmus/manifest.json +++ b/homeassistant/components/cmus/manifest.json @@ -3,6 +3,5 @@ "name": "cmus", "documentation": "https://www.home-assistant.io/integrations/cmus", "requirements": ["pycmus==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/co2signal/manifest.json b/homeassistant/components/co2signal/manifest.json index 5caab7fe89c8..9b7aa80e2ccd 100644 --- a/homeassistant/components/co2signal/manifest.json +++ b/homeassistant/components/co2signal/manifest.json @@ -3,6 +3,5 @@ "name": "CO2 Signal", "documentation": "https://www.home-assistant.io/integrations/co2signal", "requirements": ["co2signal==0.4.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/coinbase/manifest.json b/homeassistant/components/coinbase/manifest.json index dfd054757034..8d134792bbd0 100644 --- a/homeassistant/components/coinbase/manifest.json +++ b/homeassistant/components/coinbase/manifest.json @@ -3,6 +3,5 @@ "name": "Coinbase", "documentation": "https://www.home-assistant.io/integrations/coinbase", "requirements": ["coinbase==2.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/coinmarketcap/manifest.json b/homeassistant/components/coinmarketcap/manifest.json index 2aa7e64587a6..e3f827f2718b 100644 --- a/homeassistant/components/coinmarketcap/manifest.json +++ b/homeassistant/components/coinmarketcap/manifest.json @@ -3,6 +3,5 @@ "name": "CoinMarketCap", "documentation": "https://www.home-assistant.io/integrations/coinmarketcap", "requirements": ["coinmarketcap==5.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/comed_hourly_pricing/manifest.json b/homeassistant/components/comed_hourly_pricing/manifest.json index 27698a7b94a6..e0d2b2bd3b44 100644 --- a/homeassistant/components/comed_hourly_pricing/manifest.json +++ b/homeassistant/components/comed_hourly_pricing/manifest.json @@ -2,7 +2,5 @@ "domain": "comed_hourly_pricing", "name": "ComEd Hourly Pricing", "documentation": "https://www.home-assistant.io/integrations/comed_hourly_pricing", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/comfoconnect/manifest.json b/homeassistant/components/comfoconnect/manifest.json index c55b6895e80d..966de82f2190 100644 --- a/homeassistant/components/comfoconnect/manifest.json +++ b/homeassistant/components/comfoconnect/manifest.json @@ -3,6 +3,5 @@ "name": "Zehnder ComfoAir Q", "documentation": "https://www.home-assistant.io/integrations/comfoconnect", "requirements": ["pycomfoconnect==0.3"], - "dependencies": [], "codeowners": ["@michaelarnauts"] } diff --git a/homeassistant/components/command_line/manifest.json b/homeassistant/components/command_line/manifest.json index 9d625ebcc7e2..ffb1a33ed7bf 100644 --- a/homeassistant/components/command_line/manifest.json +++ b/homeassistant/components/command_line/manifest.json @@ -2,7 +2,5 @@ "domain": "command_line", "name": "Command Line", "documentation": "https://www.home-assistant.io/integrations/command_line", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/concord232/manifest.json b/homeassistant/components/concord232/manifest.json index e0060490cfe5..97ae62bc3b06 100644 --- a/homeassistant/components/concord232/manifest.json +++ b/homeassistant/components/concord232/manifest.json @@ -3,6 +3,5 @@ "name": "Concord232", "documentation": "https://www.home-assistant.io/integrations/concord232", "requirements": ["concord232==0.15"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/config/manifest.json b/homeassistant/components/config/manifest.json index 5d5db4b07417..57dfd0d360a2 100644 --- a/homeassistant/components/config/manifest.json +++ b/homeassistant/components/config/manifest.json @@ -2,7 +2,6 @@ "domain": "config", "name": "Configuration", "documentation": "https://www.home-assistant.io/integrations/config", - "requirements": [], "dependencies": ["http"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/configurator/manifest.json b/homeassistant/components/configurator/manifest.json index 560798874500..acd0fa80423b 100644 --- a/homeassistant/components/configurator/manifest.json +++ b/homeassistant/components/configurator/manifest.json @@ -2,8 +2,6 @@ "domain": "configurator", "name": "Configurator", "documentation": "https://www.home-assistant.io/integrations/configurator", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/conversation/manifest.json b/homeassistant/components/conversation/manifest.json index 7e2decb2bffc..4f7a8f489bf4 100644 --- a/homeassistant/components/conversation/manifest.json +++ b/homeassistant/components/conversation/manifest.json @@ -2,7 +2,6 @@ "domain": "conversation", "name": "Conversation", "documentation": "https://www.home-assistant.io/integrations/conversation", - "requirements": [], "dependencies": ["http"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/coolmaster/manifest.json b/homeassistant/components/coolmaster/manifest.json index 0041895a290a..bc0ebd17d40e 100644 --- a/homeassistant/components/coolmaster/manifest.json +++ b/homeassistant/components/coolmaster/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/coolmaster", "requirements": ["pycoolmasternet==0.0.4"], - "dependencies": [], "codeowners": ["@OnFreund"] } diff --git a/homeassistant/components/coronavirus/manifest.json b/homeassistant/components/coronavirus/manifest.json index 68e73525291d..3c106027d8b9 100644 --- a/homeassistant/components/coronavirus/manifest.json +++ b/homeassistant/components/coronavirus/manifest.json @@ -7,6 +7,5 @@ "ssdp": [], "zeroconf": [], "homekit": {}, - "dependencies": [], "codeowners": ["@home_assistant/core"] } diff --git a/homeassistant/components/counter/manifest.json b/homeassistant/components/counter/manifest.json index f22c7b252df9..ab1a4bf04389 100644 --- a/homeassistant/components/counter/manifest.json +++ b/homeassistant/components/counter/manifest.json @@ -2,8 +2,6 @@ "domain": "counter", "name": "Counter", "documentation": "https://www.home-assistant.io/integrations/counter", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/cover/manifest.json b/homeassistant/components/cover/manifest.json index 788d72b707fb..3da130fd7998 100644 --- a/homeassistant/components/cover/manifest.json +++ b/homeassistant/components/cover/manifest.json @@ -2,8 +2,6 @@ "domain": "cover", "name": "Cover", "documentation": "https://www.home-assistant.io/integrations/cover", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/cppm_tracker/manifest.json b/homeassistant/components/cppm_tracker/manifest.json index 8407aee07d5d..053e0ea0ba11 100644 --- a/homeassistant/components/cppm_tracker/manifest.json +++ b/homeassistant/components/cppm_tracker/manifest.json @@ -3,6 +3,5 @@ "name": "Aruba ClearPass", "documentation": "https://www.home-assistant.io/integrations/cppm_tracker", "requirements": ["clearpasspy==1.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/cpuspeed/manifest.json b/homeassistant/components/cpuspeed/manifest.json index 7e8f44648f1e..3cd4be6f9d3a 100644 --- a/homeassistant/components/cpuspeed/manifest.json +++ b/homeassistant/components/cpuspeed/manifest.json @@ -3,6 +3,5 @@ "name": "CPU Speed", "documentation": "https://www.home-assistant.io/integrations/cpuspeed", "requirements": ["py-cpuinfo==5.0.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/crimereports/manifest.json b/homeassistant/components/crimereports/manifest.json index 6d64c3130393..624d812f5f33 100644 --- a/homeassistant/components/crimereports/manifest.json +++ b/homeassistant/components/crimereports/manifest.json @@ -3,6 +3,5 @@ "name": "Crime Reports", "documentation": "https://www.home-assistant.io/integrations/crimereports", "requirements": ["crimereports==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/cups/manifest.json b/homeassistant/components/cups/manifest.json index d9b193e6dc64..5f63e7c6a506 100644 --- a/homeassistant/components/cups/manifest.json +++ b/homeassistant/components/cups/manifest.json @@ -3,6 +3,5 @@ "name": "CUPS", "documentation": "https://www.home-assistant.io/integrations/cups", "requirements": ["pycups==1.9.73"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/currencylayer/manifest.json b/homeassistant/components/currencylayer/manifest.json index 162091de9ad9..508483732fca 100644 --- a/homeassistant/components/currencylayer/manifest.json +++ b/homeassistant/components/currencylayer/manifest.json @@ -2,7 +2,5 @@ "domain": "currencylayer", "name": "currencylayer", "documentation": "https://www.home-assistant.io/integrations/currencylayer", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/daikin/manifest.json b/homeassistant/components/daikin/manifest.json index a752642335f1..a289004ffeb6 100644 --- a/homeassistant/components/daikin/manifest.json +++ b/homeassistant/components/daikin/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/daikin", "requirements": ["pydaikin==1.6.2"], - "dependencies": [], "codeowners": ["@fredrike", "@rofrantz"], "quality_scale": "platinum" } diff --git a/homeassistant/components/danfoss_air/manifest.json b/homeassistant/components/danfoss_air/manifest.json index bbfbd3791b25..bbecccf2a919 100644 --- a/homeassistant/components/danfoss_air/manifest.json +++ b/homeassistant/components/danfoss_air/manifest.json @@ -3,6 +3,5 @@ "name": "Danfoss Air", "documentation": "https://www.home-assistant.io/integrations/danfoss_air", "requirements": ["pydanfossair==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/darksky/manifest.json b/homeassistant/components/darksky/manifest.json index 94123ceba859..53f053888177 100644 --- a/homeassistant/components/darksky/manifest.json +++ b/homeassistant/components/darksky/manifest.json @@ -3,6 +3,5 @@ "name": "Dark Sky", "documentation": "https://www.home-assistant.io/integrations/darksky", "requirements": ["python-forecastio==1.4.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/datadog/manifest.json b/homeassistant/components/datadog/manifest.json index 4df780b200f3..7394c60804af 100644 --- a/homeassistant/components/datadog/manifest.json +++ b/homeassistant/components/datadog/manifest.json @@ -3,6 +3,5 @@ "name": "Datadog", "documentation": "https://www.home-assistant.io/integrations/datadog", "requirements": ["datadog==0.15.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ddwrt/manifest.json b/homeassistant/components/ddwrt/manifest.json index d50fd2627294..4c716929a86e 100644 --- a/homeassistant/components/ddwrt/manifest.json +++ b/homeassistant/components/ddwrt/manifest.json @@ -2,7 +2,5 @@ "domain": "ddwrt", "name": "DD-WRT", "documentation": "https://www.home-assistant.io/integrations/ddwrt", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/deconz/manifest.json b/homeassistant/components/deconz/manifest.json index 425a44bf0424..288946824302 100644 --- a/homeassistant/components/deconz/manifest.json +++ b/homeassistant/components/deconz/manifest.json @@ -11,9 +11,8 @@ "manufacturer": "Royal Philips Electronics" } ], - "dependencies": [], "codeowners": [ "@kane610" ], "quality_scale": "platinum" -} \ No newline at end of file +} diff --git a/homeassistant/components/decora/manifest.json b/homeassistant/components/decora/manifest.json index e16632718d19..247422bee73c 100644 --- a/homeassistant/components/decora/manifest.json +++ b/homeassistant/components/decora/manifest.json @@ -3,6 +3,5 @@ "name": "Leviton Decora", "documentation": "https://www.home-assistant.io/integrations/decora", "requirements": ["bluepy==1.3.0", "decora==0.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/decora_wifi/manifest.json b/homeassistant/components/decora_wifi/manifest.json index d340fb00d940..c2a7dc63e00e 100644 --- a/homeassistant/components/decora_wifi/manifest.json +++ b/homeassistant/components/decora_wifi/manifest.json @@ -3,6 +3,5 @@ "name": "Leviton Decora Wi-Fi", "documentation": "https://www.home-assistant.io/integrations/decora_wifi", "requirements": ["decora_wifi==1.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/default_config/manifest.json b/homeassistant/components/default_config/manifest.json index be9cb8dcc975..d324ac862e35 100644 --- a/homeassistant/components/default_config/manifest.json +++ b/homeassistant/components/default_config/manifest.json @@ -2,7 +2,6 @@ "domain": "default_config", "name": "Default Config", "documentation": "https://www.home-assistant.io/integrations/default_config", - "requirements": [], "dependencies": [ "automation", "cloud", diff --git a/homeassistant/components/delijn/manifest.json b/homeassistant/components/delijn/manifest.json index 2d550a0851f8..3f6efd0a3d75 100644 --- a/homeassistant/components/delijn/manifest.json +++ b/homeassistant/components/delijn/manifest.json @@ -2,7 +2,6 @@ "domain": "delijn", "name": "De Lijn", "documentation": "https://www.home-assistant.io/integrations/delijn", - "dependencies": [], "codeowners": ["@bollewolle"], "requirements": ["pydelijn==0.5.1"] } diff --git a/homeassistant/components/deluge/manifest.json b/homeassistant/components/deluge/manifest.json index cefc645725e4..53210a17f17a 100644 --- a/homeassistant/components/deluge/manifest.json +++ b/homeassistant/components/deluge/manifest.json @@ -3,6 +3,5 @@ "name": "Deluge", "documentation": "https://www.home-assistant.io/integrations/deluge", "requirements": ["deluge-client==1.7.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/demo/manifest.json b/homeassistant/components/demo/manifest.json index a3a647e09748..0abe5fb3347f 100644 --- a/homeassistant/components/demo/manifest.json +++ b/homeassistant/components/demo/manifest.json @@ -2,7 +2,6 @@ "domain": "demo", "name": "Demo", "documentation": "https://www.home-assistant.io/integrations/demo", - "requirements": [], "dependencies": ["conversation", "zone", "group", "configurator"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/denon/manifest.json b/homeassistant/components/denon/manifest.json index 1c4e8b652f5d..e1f8f309e60c 100644 --- a/homeassistant/components/denon/manifest.json +++ b/homeassistant/components/denon/manifest.json @@ -2,7 +2,5 @@ "domain": "denon", "name": "Denon Network Receivers", "documentation": "https://www.home-assistant.io/integrations/denon", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/denonavr/manifest.json b/homeassistant/components/denonavr/manifest.json index 7e06e7815633..a26bbdd58ab4 100644 --- a/homeassistant/components/denonavr/manifest.json +++ b/homeassistant/components/denonavr/manifest.json @@ -3,6 +3,5 @@ "name": "Denon AVR Network Receivers", "documentation": "https://www.home-assistant.io/integrations/denonavr", "requirements": ["denonavr==0.8.1"], - "dependencies": [], "codeowners": ["@scarface-4711", "@starkillerOG"] } diff --git a/homeassistant/components/derivative/manifest.json b/homeassistant/components/derivative/manifest.json index ae7eb4234b0a..15f5b71d5cbc 100644 --- a/homeassistant/components/derivative/manifest.json +++ b/homeassistant/components/derivative/manifest.json @@ -2,9 +2,5 @@ "domain": "derivative", "name": "Derivative", "documentation": "https://www.home-assistant.io/integrations/derivative", - "requirements": [], - "dependencies": [], - "codeowners": [ - "@afaucogney" - ] -} \ No newline at end of file + "codeowners": ["@afaucogney"] +} diff --git a/homeassistant/components/deutsche_bahn/manifest.json b/homeassistant/components/deutsche_bahn/manifest.json index 7bca10f761da..fa382b1b6a5c 100644 --- a/homeassistant/components/deutsche_bahn/manifest.json +++ b/homeassistant/components/deutsche_bahn/manifest.json @@ -3,6 +3,5 @@ "name": "Deutsche Bahn", "documentation": "https://www.home-assistant.io/integrations/deutsche_bahn", "requirements": ["schiene==0.23"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/device_automation/manifest.json b/homeassistant/components/device_automation/manifest.json index 291ade0f6079..2eadd214bc1b 100644 --- a/homeassistant/components/device_automation/manifest.json +++ b/homeassistant/components/device_automation/manifest.json @@ -2,7 +2,6 @@ "domain": "device_automation", "name": "Device Automation", "documentation": "https://www.home-assistant.io/integrations/device_automation", - "requirements": [], "dependencies": ["webhook"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/device_sun_light_trigger/manifest.json b/homeassistant/components/device_sun_light_trigger/manifest.json index edeb10dcec2e..777e8c5181ed 100644 --- a/homeassistant/components/device_sun_light_trigger/manifest.json +++ b/homeassistant/components/device_sun_light_trigger/manifest.json @@ -2,8 +2,6 @@ "domain": "device_sun_light_trigger", "name": "Presence-based Lights", "documentation": "https://www.home-assistant.io/integrations/device_sun_light_trigger", - "requirements": [], - "dependencies": [], "after_dependencies": ["device_tracker", "group", "light", "person"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/device_tracker/manifest.json b/homeassistant/components/device_tracker/manifest.json index 4bd9846f76df..6e29d977f660 100644 --- a/homeassistant/components/device_tracker/manifest.json +++ b/homeassistant/components/device_tracker/manifest.json @@ -2,7 +2,6 @@ "domain": "device_tracker", "name": "Device Tracker", "documentation": "https://www.home-assistant.io/integrations/device_tracker", - "requirements": [], "dependencies": ["zone"], "after_dependencies": [], "codeowners": [], diff --git a/homeassistant/components/dht/manifest.json b/homeassistant/components/dht/manifest.json index bb0e2b8f2482..5e747d947327 100644 --- a/homeassistant/components/dht/manifest.json +++ b/homeassistant/components/dht/manifest.json @@ -3,6 +3,5 @@ "name": "DHT Sensor", "documentation": "https://www.home-assistant.io/integrations/dht", "requirements": ["Adafruit-DHT==1.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dialogflow/manifest.json b/homeassistant/components/dialogflow/manifest.json index 493351c2641f..53aed42afaae 100644 --- a/homeassistant/components/dialogflow/manifest.json +++ b/homeassistant/components/dialogflow/manifest.json @@ -3,7 +3,6 @@ "name": "Dialogflow", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/dialogflow", - "requirements": [], "dependencies": ["webhook"], "codeowners": [] } diff --git a/homeassistant/components/digital_ocean/manifest.json b/homeassistant/components/digital_ocean/manifest.json index 8bf916a802dd..217803ef1957 100644 --- a/homeassistant/components/digital_ocean/manifest.json +++ b/homeassistant/components/digital_ocean/manifest.json @@ -3,6 +3,5 @@ "name": "Digital Ocean", "documentation": "https://www.home-assistant.io/integrations/digital_ocean", "requirements": ["python-digitalocean==1.13.2"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/digitalloggers/manifest.json b/homeassistant/components/digitalloggers/manifest.json index 723930666c4e..9e6bd5b7e5f9 100644 --- a/homeassistant/components/digitalloggers/manifest.json +++ b/homeassistant/components/digitalloggers/manifest.json @@ -3,6 +3,5 @@ "name": "Digital Loggers", "documentation": "https://www.home-assistant.io/integrations/digitalloggers", "requirements": ["dlipower==0.7.165"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/directv/manifest.json b/homeassistant/components/directv/manifest.json index 8474849bdaa5..e4be9cc3e25d 100644 --- a/homeassistant/components/directv/manifest.json +++ b/homeassistant/components/directv/manifest.json @@ -3,7 +3,6 @@ "name": "DirecTV", "documentation": "https://www.home-assistant.io/integrations/directv", "requirements": ["directv==0.3.0"], - "dependencies": [], "codeowners": ["@ctalkington"], "quality_scale": "gold", "config_flow": true, diff --git a/homeassistant/components/discogs/manifest.json b/homeassistant/components/discogs/manifest.json index 61080b12c20d..53dc30d6b392 100644 --- a/homeassistant/components/discogs/manifest.json +++ b/homeassistant/components/discogs/manifest.json @@ -3,6 +3,5 @@ "name": "Discogs", "documentation": "https://www.home-assistant.io/integrations/discogs", "requirements": ["discogs_client==2.2.2"], - "dependencies": [], "codeowners": ["@thibmaek"] } diff --git a/homeassistant/components/discord/manifest.json b/homeassistant/components/discord/manifest.json index 939138bf9995..c0de99654aca 100644 --- a/homeassistant/components/discord/manifest.json +++ b/homeassistant/components/discord/manifest.json @@ -3,6 +3,5 @@ "name": "Discord", "documentation": "https://www.home-assistant.io/integrations/discord", "requirements": ["discord.py==1.3.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/discovery/manifest.json b/homeassistant/components/discovery/manifest.json index 83a6222d3575..76e4ff701c52 100644 --- a/homeassistant/components/discovery/manifest.json +++ b/homeassistant/components/discovery/manifest.json @@ -3,7 +3,6 @@ "name": "Discovery", "documentation": "https://www.home-assistant.io/integrations/discovery", "requirements": ["netdisco==2.6.0"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/dlib_face_detect/manifest.json b/homeassistant/components/dlib_face_detect/manifest.json index 672368e0f8c8..e7bd53560bf6 100644 --- a/homeassistant/components/dlib_face_detect/manifest.json +++ b/homeassistant/components/dlib_face_detect/manifest.json @@ -3,6 +3,5 @@ "name": "Dlib Face Detect", "documentation": "https://www.home-assistant.io/integrations/dlib_face_detect", "requirements": ["face_recognition==1.2.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dlib_face_identify/manifest.json b/homeassistant/components/dlib_face_identify/manifest.json index f6c85a7e9a7e..a1e47f967c02 100644 --- a/homeassistant/components/dlib_face_identify/manifest.json +++ b/homeassistant/components/dlib_face_identify/manifest.json @@ -3,6 +3,5 @@ "name": "Dlib Face Identify", "documentation": "https://www.home-assistant.io/integrations/dlib_face_identify", "requirements": ["face_recognition==1.2.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dlink/manifest.json b/homeassistant/components/dlink/manifest.json index 7f5ff6cfd029..be4094cca6a6 100644 --- a/homeassistant/components/dlink/manifest.json +++ b/homeassistant/components/dlink/manifest.json @@ -3,6 +3,5 @@ "name": "D-Link Wi-Fi Smart Plugs", "documentation": "https://www.home-assistant.io/integrations/dlink", "requirements": ["pyW215==0.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 8380c3b10fba..621821fd2116 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -3,6 +3,5 @@ "name": "DLNA Digital Media Renderer", "documentation": "https://www.home-assistant.io/integrations/dlna_dmr", "requirements": ["async-upnp-client==0.14.12"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dnsip/manifest.json b/homeassistant/components/dnsip/manifest.json index 75d747da4ea6..6aeac70b4f39 100644 --- a/homeassistant/components/dnsip/manifest.json +++ b/homeassistant/components/dnsip/manifest.json @@ -3,6 +3,5 @@ "name": "DNS IP", "documentation": "https://www.home-assistant.io/integrations/dnsip", "requirements": ["aiodns==2.0.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/doods/manifest.json b/homeassistant/components/doods/manifest.json index 1ac905feac2d..253174972b17 100644 --- a/homeassistant/components/doods/manifest.json +++ b/homeassistant/components/doods/manifest.json @@ -6,6 +6,5 @@ "pydoods==1.0.2", "pillow==7.0.0" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/dovado/manifest.json b/homeassistant/components/dovado/manifest.json index cc18e48d3b51..0a2a52cb21d4 100644 --- a/homeassistant/components/dovado/manifest.json +++ b/homeassistant/components/dovado/manifest.json @@ -3,6 +3,5 @@ "name": "Dovado", "documentation": "https://www.home-assistant.io/integrations/dovado", "requirements": ["dovado==0.4.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/downloader/manifest.json b/homeassistant/components/downloader/manifest.json index fde980fa5ca1..6b447f270ccb 100644 --- a/homeassistant/components/downloader/manifest.json +++ b/homeassistant/components/downloader/manifest.json @@ -2,8 +2,6 @@ "domain": "downloader", "name": "Downloader", "documentation": "https://www.home-assistant.io/integrations/downloader", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/dsmr/manifest.json b/homeassistant/components/dsmr/manifest.json index 743bad148f0c..42e6b81dc1f7 100644 --- a/homeassistant/components/dsmr/manifest.json +++ b/homeassistant/components/dsmr/manifest.json @@ -3,6 +3,5 @@ "name": "DSMR Slimme Meter", "documentation": "https://www.home-assistant.io/integrations/dsmr", "requirements": ["dsmr_parser==0.18"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dsmr_reader/manifest.json b/homeassistant/components/dsmr_reader/manifest.json index 0ec70b027bac..59096d626e32 100644 --- a/homeassistant/components/dsmr_reader/manifest.json +++ b/homeassistant/components/dsmr_reader/manifest.json @@ -2,7 +2,6 @@ "domain": "dsmr_reader", "name": "DSMR Reader", "documentation": "https://www.home-assistant.io/integrations/dsmr_reader", - "requirements": [], "dependencies": ["mqtt"], "codeowners": ["@depl0y"] } diff --git a/homeassistant/components/dte_energy_bridge/manifest.json b/homeassistant/components/dte_energy_bridge/manifest.json index c056c7cbeb67..a63831498889 100644 --- a/homeassistant/components/dte_energy_bridge/manifest.json +++ b/homeassistant/components/dte_energy_bridge/manifest.json @@ -2,7 +2,5 @@ "domain": "dte_energy_bridge", "name": "DTE Energy Bridge", "documentation": "https://www.home-assistant.io/integrations/dte_energy_bridge", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dublin_bus_transport/manifest.json b/homeassistant/components/dublin_bus_transport/manifest.json index f4412b6933e5..a8ed951b1d9f 100644 --- a/homeassistant/components/dublin_bus_transport/manifest.json +++ b/homeassistant/components/dublin_bus_transport/manifest.json @@ -2,7 +2,5 @@ "domain": "dublin_bus_transport", "name": "Dublin Bus", "documentation": "https://www.home-assistant.io/integrations/dublin_bus_transport", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/duckdns/manifest.json b/homeassistant/components/duckdns/manifest.json index f6ab4e3a570c..bfa692c80f32 100644 --- a/homeassistant/components/duckdns/manifest.json +++ b/homeassistant/components/duckdns/manifest.json @@ -2,7 +2,5 @@ "domain": "duckdns", "name": "Duck DNS", "documentation": "https://www.home-assistant.io/integrations/duckdns", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dunehd/manifest.json b/homeassistant/components/dunehd/manifest.json index 0160d5ec9184..2dfafdf04514 100644 --- a/homeassistant/components/dunehd/manifest.json +++ b/homeassistant/components/dunehd/manifest.json @@ -3,6 +3,5 @@ "name": "DuneHD", "documentation": "https://www.home-assistant.io/integrations/dunehd", "requirements": ["pdunehd==1.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/dwd_weather_warnings/manifest.json b/homeassistant/components/dwd_weather_warnings/manifest.json index 0a9f972c84ee..52173f001e7b 100644 --- a/homeassistant/components/dwd_weather_warnings/manifest.json +++ b/homeassistant/components/dwd_weather_warnings/manifest.json @@ -2,8 +2,6 @@ "domain": "dwd_weather_warnings", "name": "Deutsche Wetter Dienst (DWD) Weather Warnings", "documentation": "https://www.home-assistant.io/integrations/dwd_weather_warnings", - "requirements": [], - "dependencies": [], "after_dependencies": ["rest"], "codeowners": [] } diff --git a/homeassistant/components/dweet/manifest.json b/homeassistant/components/dweet/manifest.json index be21605196ae..7849b2b33460 100644 --- a/homeassistant/components/dweet/manifest.json +++ b/homeassistant/components/dweet/manifest.json @@ -3,6 +3,5 @@ "name": "dweet.io", "documentation": "https://www.home-assistant.io/integrations/dweet", "requirements": ["dweepy==0.3.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/dynalite/manifest.json b/homeassistant/components/dynalite/manifest.json index a6ae0e96c459..5c18f0421cd1 100755 --- a/homeassistant/components/dynalite/manifest.json +++ b/homeassistant/components/dynalite/manifest.json @@ -3,7 +3,6 @@ "name": "Philips Dynalite", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/dynalite", - "dependencies": [], "codeowners": ["@ziv1234"], "requirements": ["dynalite_devices==0.1.39"] } diff --git a/homeassistant/components/dyson/manifest.json b/homeassistant/components/dyson/manifest.json index f6c0c187c8cd..60800963842d 100644 --- a/homeassistant/components/dyson/manifest.json +++ b/homeassistant/components/dyson/manifest.json @@ -3,6 +3,5 @@ "name": "Dyson", "documentation": "https://www.home-assistant.io/integrations/dyson", "requirements": ["libpurecool==0.6.1"], - "dependencies": [], "codeowners": ["@etheralm"] } diff --git a/homeassistant/components/ebox/manifest.json b/homeassistant/components/ebox/manifest.json index 706bca862dfd..18f26436981b 100644 --- a/homeassistant/components/ebox/manifest.json +++ b/homeassistant/components/ebox/manifest.json @@ -3,6 +3,5 @@ "name": "EBox", "documentation": "https://www.home-assistant.io/integrations/ebox", "requirements": ["pyebox==1.1.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ebusd/manifest.json b/homeassistant/components/ebusd/manifest.json index dc3f34e9ed93..482b69185185 100644 --- a/homeassistant/components/ebusd/manifest.json +++ b/homeassistant/components/ebusd/manifest.json @@ -3,6 +3,5 @@ "name": "ebusd", "documentation": "https://www.home-assistant.io/integrations/ebusd", "requirements": ["ebusdpy==0.0.16"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ecoal_boiler/manifest.json b/homeassistant/components/ecoal_boiler/manifest.json index 11820f781d77..c51f737cfd81 100644 --- a/homeassistant/components/ecoal_boiler/manifest.json +++ b/homeassistant/components/ecoal_boiler/manifest.json @@ -3,6 +3,5 @@ "name": "eSterownik eCoal.pl Boiler", "documentation": "https://www.home-assistant.io/integrations/ecoal_boiler", "requirements": ["ecoaliface==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ecobee/manifest.json b/homeassistant/components/ecobee/manifest.json index d6bc3b1eaa1c..f25bdca2fe60 100644 --- a/homeassistant/components/ecobee/manifest.json +++ b/homeassistant/components/ecobee/manifest.json @@ -3,7 +3,6 @@ "name": "ecobee", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ecobee", - "dependencies": [], "requirements": ["python-ecobee-api==0.2.5"], "codeowners": ["@marthoc"] } diff --git a/homeassistant/components/econet/manifest.json b/homeassistant/components/econet/manifest.json index d9ce5253e953..21476d2b7ff3 100644 --- a/homeassistant/components/econet/manifest.json +++ b/homeassistant/components/econet/manifest.json @@ -3,6 +3,5 @@ "name": "Rheem EcoNET Water Products", "documentation": "https://www.home-assistant.io/integrations/econet", "requirements": ["pyeconet==0.0.11"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ecovacs/manifest.json b/homeassistant/components/ecovacs/manifest.json index 637ee001ca3a..aa67be422c5c 100644 --- a/homeassistant/components/ecovacs/manifest.json +++ b/homeassistant/components/ecovacs/manifest.json @@ -3,6 +3,5 @@ "name": "Ecovacs", "documentation": "https://www.home-assistant.io/integrations/ecovacs", "requirements": ["sucks==0.9.4"], - "dependencies": [], "codeowners": ["@OverloadUT"] } diff --git a/homeassistant/components/eddystone_temperature/manifest.json b/homeassistant/components/eddystone_temperature/manifest.json index 7cc210c70536..c59cb6a9c7fc 100644 --- a/homeassistant/components/eddystone_temperature/manifest.json +++ b/homeassistant/components/eddystone_temperature/manifest.json @@ -3,6 +3,5 @@ "name": "Eddystone", "documentation": "https://www.home-assistant.io/integrations/eddystone_temperature", "requirements": ["beacontools[scan]==1.2.3", "construct==2.9.45"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/edimax/manifest.json b/homeassistant/components/edimax/manifest.json index de8b978b9f9d..20d72b30a6a6 100644 --- a/homeassistant/components/edimax/manifest.json +++ b/homeassistant/components/edimax/manifest.json @@ -3,6 +3,5 @@ "name": "Edimax", "documentation": "https://www.home-assistant.io/integrations/edimax", "requirements": ["pyedimax==0.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/edl21/manifest.json b/homeassistant/components/edl21/manifest.json index 313ac2c262ee..6eaf933b82bd 100644 --- a/homeassistant/components/edl21/manifest.json +++ b/homeassistant/components/edl21/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "pysml==0.0.2" ], - "dependencies": [], "codeowners": [ "@mtdcr" ] diff --git a/homeassistant/components/ee_brightbox/manifest.json b/homeassistant/components/ee_brightbox/manifest.json index b0a313a939f6..361df9575df4 100644 --- a/homeassistant/components/ee_brightbox/manifest.json +++ b/homeassistant/components/ee_brightbox/manifest.json @@ -3,6 +3,5 @@ "name": "EE Bright Box", "documentation": "https://www.home-assistant.io/integrations/ee_brightbox", "requirements": ["eebrightbox==0.0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/efergy/manifest.json b/homeassistant/components/efergy/manifest.json index 99b966c6c501..cb9cfb17ac55 100644 --- a/homeassistant/components/efergy/manifest.json +++ b/homeassistant/components/efergy/manifest.json @@ -2,7 +2,5 @@ "domain": "efergy", "name": "Efergy", "documentation": "https://www.home-assistant.io/integrations/efergy", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/egardia/manifest.json b/homeassistant/components/egardia/manifest.json index b0dfc63d929b..94953a773c29 100644 --- a/homeassistant/components/egardia/manifest.json +++ b/homeassistant/components/egardia/manifest.json @@ -3,6 +3,5 @@ "name": "Egardia", "documentation": "https://www.home-assistant.io/integrations/egardia", "requirements": ["pythonegardia==1.0.40"], - "dependencies": [], "codeowners": ["@jeroenterheerdt"] } diff --git a/homeassistant/components/eight_sleep/manifest.json b/homeassistant/components/eight_sleep/manifest.json index ac7a11eed3c8..b8be5757df95 100644 --- a/homeassistant/components/eight_sleep/manifest.json +++ b/homeassistant/components/eight_sleep/manifest.json @@ -3,6 +3,5 @@ "name": "Eight Sleep", "documentation": "https://www.home-assistant.io/integrations/eight_sleep", "requirements": ["pyeight==0.1.4"], - "dependencies": [], "codeowners": ["@mezz64"] } diff --git a/homeassistant/components/elgato/manifest.json b/homeassistant/components/elgato/manifest.json index 039b125e988a..f1a92ec727f7 100644 --- a/homeassistant/components/elgato/manifest.json +++ b/homeassistant/components/elgato/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/elgato", "requirements": ["elgato==0.2.0"], - "dependencies": [], "zeroconf": ["_elg._tcp.local."], "codeowners": ["@frenck"], "quality_scale": "platinum" diff --git a/homeassistant/components/eliqonline/manifest.json b/homeassistant/components/eliqonline/manifest.json index 1cbaa5fa1560..6860ff003c4d 100644 --- a/homeassistant/components/eliqonline/manifest.json +++ b/homeassistant/components/eliqonline/manifest.json @@ -3,6 +3,5 @@ "name": "Eliqonline", "documentation": "https://www.home-assistant.io/integrations/eliqonline", "requirements": ["eliqonline==1.2.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/elkm1/manifest.json b/homeassistant/components/elkm1/manifest.json index 17b016fcb8b1..d1ce5d28c249 100644 --- a/homeassistant/components/elkm1/manifest.json +++ b/homeassistant/components/elkm1/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "elkm1-lib==0.7.17" ], - "dependencies": [], "codeowners": [ "@bdraco" ], diff --git a/homeassistant/components/elv/manifest.json b/homeassistant/components/elv/manifest.json index d5fb1eb251b5..89b3751685a9 100644 --- a/homeassistant/components/elv/manifest.json +++ b/homeassistant/components/elv/manifest.json @@ -2,7 +2,6 @@ "domain": "elv", "name": "ELV PCA", "documentation": "https://www.home-assistant.io/integrations/pca", - "dependencies": [], "codeowners": ["@majuss"], "requirements": ["pypca==0.0.7"] } diff --git a/homeassistant/components/emby/manifest.json b/homeassistant/components/emby/manifest.json index ec50b663c019..c639d193298e 100644 --- a/homeassistant/components/emby/manifest.json +++ b/homeassistant/components/emby/manifest.json @@ -3,6 +3,5 @@ "name": "Emby", "documentation": "https://www.home-assistant.io/integrations/emby", "requirements": ["pyemby==1.6"], - "dependencies": [], "codeowners": ["@mezz64"] } diff --git a/homeassistant/components/emoncms/manifest.json b/homeassistant/components/emoncms/manifest.json index b9c012d6e730..6ea57cf37049 100644 --- a/homeassistant/components/emoncms/manifest.json +++ b/homeassistant/components/emoncms/manifest.json @@ -2,7 +2,5 @@ "domain": "emoncms", "name": "Emoncms", "documentation": "https://www.home-assistant.io/integrations/emoncms", - "requirements": [], - "dependencies": [], "codeowners": ["@borpin"] } diff --git a/homeassistant/components/emoncms_history/manifest.json b/homeassistant/components/emoncms_history/manifest.json index 34270b6e2094..9c3066db215e 100644 --- a/homeassistant/components/emoncms_history/manifest.json +++ b/homeassistant/components/emoncms_history/manifest.json @@ -2,7 +2,5 @@ "domain": "emoncms_history", "name": "Emoncms History", "documentation": "https://www.home-assistant.io/integrations/emoncms_history", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/emulated_hue/manifest.json b/homeassistant/components/emulated_hue/manifest.json index 37848e6f3060..fdff91630f3b 100644 --- a/homeassistant/components/emulated_hue/manifest.json +++ b/homeassistant/components/emulated_hue/manifest.json @@ -3,7 +3,6 @@ "name": "Emulated Hue", "documentation": "https://www.home-assistant.io/integrations/emulated_hue", "requirements": ["aiohttp_cors==0.7.0"], - "dependencies": [], "after_dependencies": ["http"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/emulated_roku/manifest.json b/homeassistant/components/emulated_roku/manifest.json index 39b8d40737da..78dfa78802f6 100644 --- a/homeassistant/components/emulated_roku/manifest.json +++ b/homeassistant/components/emulated_roku/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/emulated_roku", "requirements": ["emulated_roku==0.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/enigma2/manifest.json b/homeassistant/components/enigma2/manifest.json index a49f2aa0190c..86b061489770 100644 --- a/homeassistant/components/enigma2/manifest.json +++ b/homeassistant/components/enigma2/manifest.json @@ -3,6 +3,5 @@ "name": "Enigma2 (OpenWebif)", "documentation": "https://www.home-assistant.io/integrations/enigma2", "requirements": ["openwebifpy==3.1.1"], - "dependencies": [], "codeowners": ["@fbradyirl"] } diff --git a/homeassistant/components/enocean/manifest.json b/homeassistant/components/enocean/manifest.json index a1d2c4a92601..a02661f8883e 100644 --- a/homeassistant/components/enocean/manifest.json +++ b/homeassistant/components/enocean/manifest.json @@ -3,6 +3,5 @@ "name": "EnOcean", "documentation": "https://www.home-assistant.io/integrations/enocean", "requirements": ["enocean==0.50"], - "dependencies": [], "codeowners": ["@bdurrer"] } diff --git a/homeassistant/components/enphase_envoy/manifest.json b/homeassistant/components/enphase_envoy/manifest.json index 68f584c053e9..bde6c16bdfeb 100644 --- a/homeassistant/components/enphase_envoy/manifest.json +++ b/homeassistant/components/enphase_envoy/manifest.json @@ -3,6 +3,5 @@ "name": "Enphase Envoy", "documentation": "https://www.home-assistant.io/integrations/enphase_envoy", "requirements": ["envoy_reader==0.11.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/entur_public_transport/manifest.json b/homeassistant/components/entur_public_transport/manifest.json index 0d5f3e24f839..db5c68d2a4c4 100644 --- a/homeassistant/components/entur_public_transport/manifest.json +++ b/homeassistant/components/entur_public_transport/manifest.json @@ -3,6 +3,5 @@ "name": "Entur", "documentation": "https://www.home-assistant.io/integrations/entur_public_transport", "requirements": ["enturclient==0.2.1"], - "dependencies": [], "codeowners": ["@hfurubotten"] } diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index 9b208c452e5d..bdc38e90c0c4 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -3,6 +3,5 @@ "name": "Environment Canada", "documentation": "https://www.home-assistant.io/integrations/environment_canada", "requirements": ["env_canada==0.0.35"], - "dependencies": [], "codeowners": ["@michaeldavie"] } diff --git a/homeassistant/components/envirophat/manifest.json b/homeassistant/components/envirophat/manifest.json index 4cf443f4de66..911e7a2fc358 100644 --- a/homeassistant/components/envirophat/manifest.json +++ b/homeassistant/components/envirophat/manifest.json @@ -3,6 +3,5 @@ "name": "Enviro pHAT", "documentation": "https://www.home-assistant.io/integrations/envirophat", "requirements": ["envirophat==0.0.6", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/envisalink/manifest.json b/homeassistant/components/envisalink/manifest.json index 1bc9d38e998b..e45f8140df62 100644 --- a/homeassistant/components/envisalink/manifest.json +++ b/homeassistant/components/envisalink/manifest.json @@ -3,6 +3,5 @@ "name": "Envisalink", "documentation": "https://www.home-assistant.io/integrations/envisalink", "requirements": ["pyenvisalink==4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ephember/manifest.json b/homeassistant/components/ephember/manifest.json index 4df302ac2dd8..c03a45a58045 100644 --- a/homeassistant/components/ephember/manifest.json +++ b/homeassistant/components/ephember/manifest.json @@ -3,6 +3,5 @@ "name": "EPH Controls", "documentation": "https://www.home-assistant.io/integrations/ephember", "requirements": ["pyephember==0.3.1"], - "dependencies": [], "codeowners": ["@ttroy50"] } diff --git a/homeassistant/components/epson/manifest.json b/homeassistant/components/epson/manifest.json index 81d08d76dfb3..909efd5893e4 100644 --- a/homeassistant/components/epson/manifest.json +++ b/homeassistant/components/epson/manifest.json @@ -3,6 +3,5 @@ "name": "Epson", "documentation": "https://www.home-assistant.io/integrations/epson", "requirements": ["epson-projector==0.1.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/epsonworkforce/manifest.json b/homeassistant/components/epsonworkforce/manifest.json index 37620b66e7c7..cd989b9c6902 100644 --- a/homeassistant/components/epsonworkforce/manifest.json +++ b/homeassistant/components/epsonworkforce/manifest.json @@ -2,7 +2,6 @@ "domain": "epsonworkforce", "name": "Epson Workforce", "documentation": "https://www.home-assistant.io/integrations/epsonworkforce", - "dependencies": [], "codeowners": ["@ThaStealth"], "requirements": ["epsonprinter==0.0.9"] } diff --git a/homeassistant/components/eq3btsmart/manifest.json b/homeassistant/components/eq3btsmart/manifest.json index a7d9ee11f6fa..e15fd8d384bc 100644 --- a/homeassistant/components/eq3btsmart/manifest.json +++ b/homeassistant/components/eq3btsmart/manifest.json @@ -3,6 +3,5 @@ "name": "EQ3 Bluetooth Smart Thermostats", "documentation": "https://www.home-assistant.io/integrations/eq3btsmart", "requirements": ["construct==2.9.45", "python-eq3bt==0.1.11"], - "dependencies": [], "codeowners": ["@rytilahti"] } diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index c3d87bf836d4..19d00fbbff90 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/esphome", "requirements": ["aioesphomeapi==2.6.1"], - "dependencies": [], "zeroconf": ["_esphomelib._tcp.local."], "codeowners": ["@OttoWinter"] } diff --git a/homeassistant/components/essent/manifest.json b/homeassistant/components/essent/manifest.json index 914c8f1556fa..a46d37ccdc88 100644 --- a/homeassistant/components/essent/manifest.json +++ b/homeassistant/components/essent/manifest.json @@ -3,6 +3,5 @@ "name": "Essent", "documentation": "https://www.home-assistant.io/integrations/essent", "requirements": ["PyEssent==0.13"], - "dependencies": [], "codeowners": ["@TheLastProject"] } diff --git a/homeassistant/components/etherscan/manifest.json b/homeassistant/components/etherscan/manifest.json index 106ec6f1f967..b21f7d0e3fb6 100644 --- a/homeassistant/components/etherscan/manifest.json +++ b/homeassistant/components/etherscan/manifest.json @@ -3,6 +3,5 @@ "name": "Etherscan", "documentation": "https://www.home-assistant.io/integrations/etherscan", "requirements": ["python-etherscan-api==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/eufy/manifest.json b/homeassistant/components/eufy/manifest.json index dc9176db7b06..49956b9f0b2c 100644 --- a/homeassistant/components/eufy/manifest.json +++ b/homeassistant/components/eufy/manifest.json @@ -3,6 +3,5 @@ "name": "eufy", "documentation": "https://www.home-assistant.io/integrations/eufy", "requirements": ["lakeside==0.12"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/everlights/manifest.json b/homeassistant/components/everlights/manifest.json index 7ee6378af01b..83cb166296df 100644 --- a/homeassistant/components/everlights/manifest.json +++ b/homeassistant/components/everlights/manifest.json @@ -3,6 +3,5 @@ "name": "EverLights", "documentation": "https://www.home-assistant.io/integrations/everlights", "requirements": ["pyeverlights==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/evohome/manifest.json b/homeassistant/components/evohome/manifest.json index 16b27452c7ca..8bcecca551b1 100644 --- a/homeassistant/components/evohome/manifest.json +++ b/homeassistant/components/evohome/manifest.json @@ -3,6 +3,5 @@ "name": "Honeywell Total Connect Comfort (Europe)", "documentation": "https://www.home-assistant.io/integrations/evohome", "requirements": ["evohome-async==0.3.5.post1"], - "dependencies": [], "codeowners": ["@zxdavb"] } diff --git a/homeassistant/components/ezviz/manifest.json b/homeassistant/components/ezviz/manifest.json index 167f063c0f70..6b02dd4dbf70 100644 --- a/homeassistant/components/ezviz/manifest.json +++ b/homeassistant/components/ezviz/manifest.json @@ -2,7 +2,6 @@ "domain": "ezviz", "name": "Ezviz", "documentation": "https://www.home-assistant.io/integrations/ezviz", - "dependencies": [], "codeowners": ["@baqs"], "requirements": ["pyezviz==0.1.5"] } diff --git a/homeassistant/components/facebook/manifest.json b/homeassistant/components/facebook/manifest.json index dfdda34d39f0..5d44ccc40ce7 100644 --- a/homeassistant/components/facebook/manifest.json +++ b/homeassistant/components/facebook/manifest.json @@ -2,7 +2,5 @@ "domain": "facebook", "name": "Facebook Messenger", "documentation": "https://www.home-assistant.io/integrations/facebook", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/facebox/manifest.json b/homeassistant/components/facebox/manifest.json index 2c911eb04ef4..d8a8fb457ea8 100644 --- a/homeassistant/components/facebox/manifest.json +++ b/homeassistant/components/facebox/manifest.json @@ -2,7 +2,5 @@ "domain": "facebox", "name": "Facebox", "documentation": "https://www.home-assistant.io/integrations/facebox", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fail2ban/manifest.json b/homeassistant/components/fail2ban/manifest.json index 01afbb12b6f5..4d8e50d507b1 100644 --- a/homeassistant/components/fail2ban/manifest.json +++ b/homeassistant/components/fail2ban/manifest.json @@ -2,7 +2,5 @@ "domain": "fail2ban", "name": "Fail2Ban", "documentation": "https://www.home-assistant.io/integrations/fail2ban", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/familyhub/manifest.json b/homeassistant/components/familyhub/manifest.json index f0181ba79ed7..06acb922eeed 100644 --- a/homeassistant/components/familyhub/manifest.json +++ b/homeassistant/components/familyhub/manifest.json @@ -3,6 +3,5 @@ "name": "Samsung Family Hub", "documentation": "https://www.home-assistant.io/integrations/familyhub", "requirements": ["python-family-hub-local==0.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fan/manifest.json b/homeassistant/components/fan/manifest.json index 53b7873612cf..76573e08cbb0 100644 --- a/homeassistant/components/fan/manifest.json +++ b/homeassistant/components/fan/manifest.json @@ -2,8 +2,6 @@ "domain": "fan", "name": "Fan", "documentation": "https://www.home-assistant.io/integrations/fan", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/fastdotcom/manifest.json b/homeassistant/components/fastdotcom/manifest.json index d6fe4a07c59b..ca7a720668bf 100644 --- a/homeassistant/components/fastdotcom/manifest.json +++ b/homeassistant/components/fastdotcom/manifest.json @@ -3,6 +3,5 @@ "name": "Fast.com", "documentation": "https://www.home-assistant.io/integrations/fastdotcom", "requirements": ["fastdotcom==0.0.3"], - "dependencies": [], "codeowners": ["@rohankapoorcom"] } diff --git a/homeassistant/components/feedreader/manifest.json b/homeassistant/components/feedreader/manifest.json index 16c32bdd089e..30413d10e43c 100644 --- a/homeassistant/components/feedreader/manifest.json +++ b/homeassistant/components/feedreader/manifest.json @@ -3,6 +3,5 @@ "name": "Feedreader", "documentation": "https://www.home-assistant.io/integrations/feedreader", "requirements": ["feedparser-homeassistant==5.2.2.dev1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ffmpeg/manifest.json b/homeassistant/components/ffmpeg/manifest.json index bacfa498fe1c..aee0b85d056e 100644 --- a/homeassistant/components/ffmpeg/manifest.json +++ b/homeassistant/components/ffmpeg/manifest.json @@ -3,6 +3,5 @@ "name": "FFmpeg", "documentation": "https://www.home-assistant.io/integrations/ffmpeg", "requirements": ["ha-ffmpeg==2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ffmpeg_motion/manifest.json b/homeassistant/components/ffmpeg_motion/manifest.json index c1ae41e0f2b8..854bca7f9bdd 100644 --- a/homeassistant/components/ffmpeg_motion/manifest.json +++ b/homeassistant/components/ffmpeg_motion/manifest.json @@ -2,7 +2,6 @@ "domain": "ffmpeg_motion", "name": "FFmpeg Motion", "documentation": "https://www.home-assistant.io/integrations/ffmpeg_motion", - "requirements": [], "dependencies": ["ffmpeg"], "codeowners": [] } diff --git a/homeassistant/components/ffmpeg_noise/manifest.json b/homeassistant/components/ffmpeg_noise/manifest.json index ca7043c51a58..b2b4148a0229 100644 --- a/homeassistant/components/ffmpeg_noise/manifest.json +++ b/homeassistant/components/ffmpeg_noise/manifest.json @@ -2,7 +2,6 @@ "domain": "ffmpeg_noise", "name": "FFmpeg Noise", "documentation": "https://www.home-assistant.io/integrations/ffmpeg_noise", - "requirements": [], "dependencies": ["ffmpeg"], "codeowners": [] } diff --git a/homeassistant/components/fibaro/manifest.json b/homeassistant/components/fibaro/manifest.json index b4288afee711..ff6d881009df 100644 --- a/homeassistant/components/fibaro/manifest.json +++ b/homeassistant/components/fibaro/manifest.json @@ -3,6 +3,5 @@ "name": "Fibaro", "documentation": "https://www.home-assistant.io/integrations/fibaro", "requirements": ["fiblary3==0.1.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fido/manifest.json b/homeassistant/components/fido/manifest.json index 690fc3ed777e..9c150d479158 100644 --- a/homeassistant/components/fido/manifest.json +++ b/homeassistant/components/fido/manifest.json @@ -3,6 +3,5 @@ "name": "Fido", "documentation": "https://www.home-assistant.io/integrations/fido", "requirements": ["pyfido==2.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/file/manifest.json b/homeassistant/components/file/manifest.json index b0340eb271ee..cac7fc98fb1d 100644 --- a/homeassistant/components/file/manifest.json +++ b/homeassistant/components/file/manifest.json @@ -2,7 +2,5 @@ "domain": "file", "name": "File", "documentation": "https://www.home-assistant.io/integrations/file", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/filesize/manifest.json b/homeassistant/components/filesize/manifest.json index 4687e0745477..6ef52457eaaf 100644 --- a/homeassistant/components/filesize/manifest.json +++ b/homeassistant/components/filesize/manifest.json @@ -2,7 +2,5 @@ "domain": "filesize", "name": "File Size", "documentation": "https://www.home-assistant.io/integrations/filesize", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/filter/manifest.json b/homeassistant/components/filter/manifest.json index d1933507f4d6..7b474c2b53a6 100644 --- a/homeassistant/components/filter/manifest.json +++ b/homeassistant/components/filter/manifest.json @@ -2,7 +2,6 @@ "domain": "filter", "name": "Filter", "documentation": "https://www.home-assistant.io/integrations/filter", - "requirements": [], "dependencies": ["history"], "codeowners": ["@dgomes"], "quality_scale": "internal" diff --git a/homeassistant/components/fints/manifest.json b/homeassistant/components/fints/manifest.json index 8644124fde24..4a1a7b8f89d6 100644 --- a/homeassistant/components/fints/manifest.json +++ b/homeassistant/components/fints/manifest.json @@ -3,6 +3,5 @@ "name": "FinTS", "documentation": "https://www.home-assistant.io/integrations/fints", "requirements": ["fints==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fixer/manifest.json b/homeassistant/components/fixer/manifest.json index 4bb0b7ba1b74..6dbeae949f21 100644 --- a/homeassistant/components/fixer/manifest.json +++ b/homeassistant/components/fixer/manifest.json @@ -3,6 +3,5 @@ "name": "Fixer", "documentation": "https://www.home-assistant.io/integrations/fixer", "requirements": ["fixerio==1.0.0a0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/fleetgo/manifest.json b/homeassistant/components/fleetgo/manifest.json index 142d6ba00ed0..148d79f45c23 100644 --- a/homeassistant/components/fleetgo/manifest.json +++ b/homeassistant/components/fleetgo/manifest.json @@ -3,6 +3,5 @@ "name": "FleetGO", "documentation": "https://www.home-assistant.io/integrations/fleetgo", "requirements": ["ritassist==0.9.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/flic/manifest.json b/homeassistant/components/flic/manifest.json index 24170b34acf6..f638908a80f6 100644 --- a/homeassistant/components/flic/manifest.json +++ b/homeassistant/components/flic/manifest.json @@ -3,6 +3,5 @@ "name": "Flic", "documentation": "https://www.home-assistant.io/integrations/flic", "requirements": ["pyflic-homeassistant==0.4.dev0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/flock/manifest.json b/homeassistant/components/flock/manifest.json index 6bb3eaf9e690..29328cfd1f6c 100644 --- a/homeassistant/components/flock/manifest.json +++ b/homeassistant/components/flock/manifest.json @@ -2,7 +2,5 @@ "domain": "flock", "name": "Flock", "documentation": "https://www.home-assistant.io/integrations/flock", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/flume/manifest.json b/homeassistant/components/flume/manifest.json index 2264df2db060..71d0992e9fd9 100644 --- a/homeassistant/components/flume/manifest.json +++ b/homeassistant/components/flume/manifest.json @@ -3,6 +3,5 @@ "name": "flume", "documentation": "https://www.home-assistant.io/integrations/flume/", "requirements": ["pyflume==0.3.0"], - "dependencies": [], "codeowners": ["@ChrisMandich"] } diff --git a/homeassistant/components/flunearyou/manifest.json b/homeassistant/components/flunearyou/manifest.json index 1a28c3076e71..f6cc6714a38a 100644 --- a/homeassistant/components/flunearyou/manifest.json +++ b/homeassistant/components/flunearyou/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/flunearyou", "requirements": ["pyflunearyou==1.0.7"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/flux/manifest.json b/homeassistant/components/flux/manifest.json index 5195ed06bb30..400331f9f5fa 100644 --- a/homeassistant/components/flux/manifest.json +++ b/homeassistant/components/flux/manifest.json @@ -2,8 +2,6 @@ "domain": "flux", "name": "Flux", "documentation": "https://www.home-assistant.io/integrations/flux", - "requirements": [], - "dependencies": [], "after_dependencies": ["light"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/flux_led/manifest.json b/homeassistant/components/flux_led/manifest.json index 206991391790..378860229eeb 100644 --- a/homeassistant/components/flux_led/manifest.json +++ b/homeassistant/components/flux_led/manifest.json @@ -3,6 +3,5 @@ "name": "Flux LED/MagicLight", "documentation": "https://www.home-assistant.io/integrations/flux_led", "requirements": ["flux_led==0.22"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/folder/manifest.json b/homeassistant/components/folder/manifest.json index d4026e7689da..810a26bc1e05 100644 --- a/homeassistant/components/folder/manifest.json +++ b/homeassistant/components/folder/manifest.json @@ -2,7 +2,5 @@ "domain": "folder", "name": "Folder", "documentation": "https://www.home-assistant.io/integrations/folder", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/folder_watcher/manifest.json b/homeassistant/components/folder_watcher/manifest.json index 47edc4dccc0a..722b60a952dc 100644 --- a/homeassistant/components/folder_watcher/manifest.json +++ b/homeassistant/components/folder_watcher/manifest.json @@ -3,7 +3,6 @@ "name": "Folder Watcher", "documentation": "https://www.home-assistant.io/integrations/folder_watcher", "requirements": ["watchdog==0.8.3"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/foobot/manifest.json b/homeassistant/components/foobot/manifest.json index c30985225f45..190d3e9837f2 100644 --- a/homeassistant/components/foobot/manifest.json +++ b/homeassistant/components/foobot/manifest.json @@ -3,6 +3,5 @@ "name": "Foobot", "documentation": "https://www.home-assistant.io/integrations/foobot", "requirements": ["foobot_async==0.3.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fortigate/manifest.json b/homeassistant/components/fortigate/manifest.json index 1fdd28e256d7..395f8e058900 100644 --- a/homeassistant/components/fortigate/manifest.json +++ b/homeassistant/components/fortigate/manifest.json @@ -2,7 +2,6 @@ "domain": "fortigate", "name": "FortiGate", "documentation": "https://www.home-assistant.io/integrations/fortigate", - "dependencies": [], "codeowners": ["@kifeo"], "requirements": ["pyfgt==0.5.1"] } diff --git a/homeassistant/components/fortios/manifest.json b/homeassistant/components/fortios/manifest.json index 4073f1bbb362..e0ca2671b197 100644 --- a/homeassistant/components/fortios/manifest.json +++ b/homeassistant/components/fortios/manifest.json @@ -3,6 +3,5 @@ "name": "FortiOS", "documentation": "https://www.home-assistant.io/integrations/fortios/", "requirements": ["fortiosapi==0.10.8"], - "dependencies": [], "codeowners": ["@kimfrellsen"] } diff --git a/homeassistant/components/foscam/manifest.json b/homeassistant/components/foscam/manifest.json index 63d44fc04e93..8c7e8e7d77a6 100644 --- a/homeassistant/components/foscam/manifest.json +++ b/homeassistant/components/foscam/manifest.json @@ -3,6 +3,5 @@ "name": "Foscam", "documentation": "https://www.home-assistant.io/integrations/foscam", "requirements": ["libpyfoscam==1.0"], - "dependencies": [], "codeowners": ["@skgsergio"] } diff --git a/homeassistant/components/foursquare/manifest.json b/homeassistant/components/foursquare/manifest.json index 450759a59228..39e4f897d5fc 100644 --- a/homeassistant/components/foursquare/manifest.json +++ b/homeassistant/components/foursquare/manifest.json @@ -2,7 +2,6 @@ "domain": "foursquare", "name": "Foursquare", "documentation": "https://www.home-assistant.io/integrations/foursquare", - "requirements": [], "dependencies": ["http"], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/free_mobile/manifest.json b/homeassistant/components/free_mobile/manifest.json index 2bba216242f7..1cdef3d1162a 100644 --- a/homeassistant/components/free_mobile/manifest.json +++ b/homeassistant/components/free_mobile/manifest.json @@ -3,6 +3,5 @@ "name": "Free Mobile", "documentation": "https://www.home-assistant.io/integrations/free_mobile", "requirements": ["freesms==0.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/freebox/manifest.json b/homeassistant/components/freebox/manifest.json index 1bfb4924a78b..ae96f7f6510c 100644 --- a/homeassistant/components/freebox/manifest.json +++ b/homeassistant/components/freebox/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/freebox", "requirements": ["aiofreepybox==0.0.8"], - "dependencies": [], "after_dependencies": ["discovery"], "codeowners": ["@snoof85", "@Quentame"] } diff --git a/homeassistant/components/freedns/manifest.json b/homeassistant/components/freedns/manifest.json index ff4f9ec92029..58e8e9fdaf82 100644 --- a/homeassistant/components/freedns/manifest.json +++ b/homeassistant/components/freedns/manifest.json @@ -2,7 +2,5 @@ "domain": "freedns", "name": "FreeDNS", "documentation": "https://www.home-assistant.io/integrations/freedns", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fritz/manifest.json b/homeassistant/components/fritz/manifest.json index 5536e8fada30..3723bd7885ae 100644 --- a/homeassistant/components/fritz/manifest.json +++ b/homeassistant/components/fritz/manifest.json @@ -3,6 +3,5 @@ "name": "AVM FRITZ!Box", "documentation": "https://www.home-assistant.io/integrations/fritz", "requirements": ["fritzconnection==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fritzbox/manifest.json b/homeassistant/components/fritzbox/manifest.json index 494e70e8bccb..128ab935771d 100644 --- a/homeassistant/components/fritzbox/manifest.json +++ b/homeassistant/components/fritzbox/manifest.json @@ -3,6 +3,5 @@ "name": "AVM FRITZ!Box", "documentation": "https://www.home-assistant.io/integrations/fritzbox", "requirements": ["pyfritzhome==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fritzbox_callmonitor/manifest.json b/homeassistant/components/fritzbox_callmonitor/manifest.json index 777105f9143c..b5fa26c096ba 100644 --- a/homeassistant/components/fritzbox_callmonitor/manifest.json +++ b/homeassistant/components/fritzbox_callmonitor/manifest.json @@ -3,6 +3,5 @@ "name": "AVM FRITZ!Box Call Monitor", "documentation": "https://www.home-assistant.io/integrations/fritzbox_callmonitor", "requirements": ["fritzconnection==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fritzbox_netmonitor/manifest.json b/homeassistant/components/fritzbox_netmonitor/manifest.json index 89bc1e1fda62..dde4d6348679 100644 --- a/homeassistant/components/fritzbox_netmonitor/manifest.json +++ b/homeassistant/components/fritzbox_netmonitor/manifest.json @@ -3,6 +3,5 @@ "name": "AVM FRITZ!Box Net Monitor", "documentation": "https://www.home-assistant.io/integrations/fritzbox_netmonitor", "requirements": ["fritzconnection==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/fronius/manifest.json b/homeassistant/components/fronius/manifest.json index c7e919c95e56..8f94e816505c 100644 --- a/homeassistant/components/fronius/manifest.json +++ b/homeassistant/components/fronius/manifest.json @@ -3,6 +3,5 @@ "name": "Fronius", "documentation": "https://www.home-assistant.io/integrations/fronius", "requirements": ["pyfronius==0.4.6"], - "dependencies": [], "codeowners": ["@nielstron"] } diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index b0da48ab713b..d9f114777acd 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -20,4 +20,4 @@ "@home-assistant/frontend" ], "quality_scale": "internal" -} \ No newline at end of file +} diff --git a/homeassistant/components/frontier_silicon/manifest.json b/homeassistant/components/frontier_silicon/manifest.json index d8ca3148accc..4e52eee99549 100644 --- a/homeassistant/components/frontier_silicon/manifest.json +++ b/homeassistant/components/frontier_silicon/manifest.json @@ -3,6 +3,5 @@ "name": "Frontier Silicon", "documentation": "https://www.home-assistant.io/integrations/frontier_silicon", "requirements": ["afsapi==0.0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/futurenow/manifest.json b/homeassistant/components/futurenow/manifest.json index 6a4599ea942a..c8f07a106e2d 100644 --- a/homeassistant/components/futurenow/manifest.json +++ b/homeassistant/components/futurenow/manifest.json @@ -3,6 +3,5 @@ "name": "P5 FutureNow", "documentation": "https://www.home-assistant.io/integrations/futurenow", "requirements": ["pyfnip==0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/garadget/manifest.json b/homeassistant/components/garadget/manifest.json index b86f4e26b11f..21d33405c843 100644 --- a/homeassistant/components/garadget/manifest.json +++ b/homeassistant/components/garadget/manifest.json @@ -2,7 +2,5 @@ "domain": "garadget", "name": "Garadget", "documentation": "https://www.home-assistant.io/integrations/garadget", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/garmin_connect/manifest.json b/homeassistant/components/garmin_connect/manifest.json index ee534354cb30..09c916104df6 100644 --- a/homeassistant/components/garmin_connect/manifest.json +++ b/homeassistant/components/garmin_connect/manifest.json @@ -2,7 +2,6 @@ "domain": "garmin_connect", "name": "Garmin Connect", "documentation": "https://www.home-assistant.io/integrations/garmin_connect", - "dependencies": [], "requirements": ["garminconnect==0.1.10"], "codeowners": ["@cyberjunky"], "config_flow": true diff --git a/homeassistant/components/gc100/manifest.json b/homeassistant/components/gc100/manifest.json index e566643a4f8d..e2dffb1e0900 100644 --- a/homeassistant/components/gc100/manifest.json +++ b/homeassistant/components/gc100/manifest.json @@ -3,6 +3,5 @@ "name": "Global Caché GC-100", "documentation": "https://www.home-assistant.io/integrations/gc100", "requirements": ["python-gc100==1.0.3a"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gdacs/manifest.json b/homeassistant/components/gdacs/manifest.json index 45105b21ab43..3af46cc80670 100644 --- a/homeassistant/components/gdacs/manifest.json +++ b/homeassistant/components/gdacs/manifest.json @@ -6,9 +6,8 @@ "requirements": [ "aio_georss_gdacs==0.3" ], - "dependencies": [], "codeowners": [ "@exxamalte" ], "quality_scale": "platinum" -} \ No newline at end of file +} diff --git a/homeassistant/components/gearbest/manifest.json b/homeassistant/components/gearbest/manifest.json index 03f2b83cf3a3..4729fd6b6f30 100644 --- a/homeassistant/components/gearbest/manifest.json +++ b/homeassistant/components/gearbest/manifest.json @@ -3,6 +3,5 @@ "name": "Gearbest", "documentation": "https://www.home-assistant.io/integrations/gearbest", "requirements": ["gearbest_parser==1.0.7"], - "dependencies": [], "codeowners": ["@HerrHofrat"] } diff --git a/homeassistant/components/geizhals/manifest.json b/homeassistant/components/geizhals/manifest.json index 12ff42098207..17b4b5e9df04 100644 --- a/homeassistant/components/geizhals/manifest.json +++ b/homeassistant/components/geizhals/manifest.json @@ -3,6 +3,5 @@ "name": "Geizhals", "documentation": "https://www.home-assistant.io/integrations/geizhals", "requirements": ["geizhals==0.0.9"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/generic/manifest.json b/homeassistant/components/generic/manifest.json index 9d59d5b99193..a066333679d0 100644 --- a/homeassistant/components/generic/manifest.json +++ b/homeassistant/components/generic/manifest.json @@ -2,7 +2,5 @@ "domain": "generic", "name": "Generic", "documentation": "https://www.home-assistant.io/integrations/generic", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/generic_thermostat/manifest.json b/homeassistant/components/generic_thermostat/manifest.json index c601c1297d55..011c3f595927 100644 --- a/homeassistant/components/generic_thermostat/manifest.json +++ b/homeassistant/components/generic_thermostat/manifest.json @@ -2,7 +2,6 @@ "domain": "generic_thermostat", "name": "Generic Thermostat", "documentation": "https://www.home-assistant.io/integrations/generic_thermostat", - "requirements": [], "dependencies": ["sensor", "switch"], "codeowners": [] } diff --git a/homeassistant/components/geniushub/manifest.json b/homeassistant/components/geniushub/manifest.json index ab9349d14720..b4a72d883159 100644 --- a/homeassistant/components/geniushub/manifest.json +++ b/homeassistant/components/geniushub/manifest.json @@ -3,6 +3,5 @@ "name": "Genius Hub", "documentation": "https://www.home-assistant.io/integrations/geniushub", "requirements": ["geniushub-client==0.6.30"], - "dependencies": [], "codeowners": ["@zxdavb"] } diff --git a/homeassistant/components/geo_json_events/manifest.json b/homeassistant/components/geo_json_events/manifest.json index bb1e8f942ad4..4cf99155b37e 100644 --- a/homeassistant/components/geo_json_events/manifest.json +++ b/homeassistant/components/geo_json_events/manifest.json @@ -3,6 +3,5 @@ "name": "GeoJSON", "documentation": "https://www.home-assistant.io/integrations/geo_json_events", "requirements": ["geojson_client==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/geo_location/manifest.json b/homeassistant/components/geo_location/manifest.json index 80067b2b5b6c..c5d3a6eba2e7 100644 --- a/homeassistant/components/geo_location/manifest.json +++ b/homeassistant/components/geo_location/manifest.json @@ -2,7 +2,5 @@ "domain": "geo_location", "name": "Geolocation", "documentation": "https://www.home-assistant.io/integrations/geo_location", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/geo_rss_events/manifest.json b/homeassistant/components/geo_rss_events/manifest.json index 339032464636..77d38d58ad77 100644 --- a/homeassistant/components/geo_rss_events/manifest.json +++ b/homeassistant/components/geo_rss_events/manifest.json @@ -3,6 +3,5 @@ "name": "GeoRSS", "documentation": "https://www.home-assistant.io/integrations/geo_rss_events", "requirements": ["georss_generic_client==0.3"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/geofency/manifest.json b/homeassistant/components/geofency/manifest.json index c48474a2927e..0fbc30444557 100644 --- a/homeassistant/components/geofency/manifest.json +++ b/homeassistant/components/geofency/manifest.json @@ -3,7 +3,6 @@ "name": "Geofency", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/geofency", - "requirements": [], "dependencies": ["webhook"], "codeowners": [] } diff --git a/homeassistant/components/geonetnz_quakes/manifest.json b/homeassistant/components/geonetnz_quakes/manifest.json index 613af3133938..1e61d5260472 100644 --- a/homeassistant/components/geonetnz_quakes/manifest.json +++ b/homeassistant/components/geonetnz_quakes/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/geonetnz_quakes", "requirements": ["aio_geojson_geonetnz_quakes==0.12"], - "dependencies": [], "codeowners": ["@exxamalte"], "quality_scale": "platinum" -} \ No newline at end of file +} diff --git a/homeassistant/components/geonetnz_volcano/manifest.json b/homeassistant/components/geonetnz_volcano/manifest.json index e5153e9675ed..13e1e9baf3e9 100644 --- a/homeassistant/components/geonetnz_volcano/manifest.json +++ b/homeassistant/components/geonetnz_volcano/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/geonetnz_volcano", "requirements": ["aio_geojson_geonetnz_volcano==0.5"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/gios/manifest.json b/homeassistant/components/gios/manifest.json index 3e3d63965d3f..527bb7e116fd 100644 --- a/homeassistant/components/gios/manifest.json +++ b/homeassistant/components/gios/manifest.json @@ -2,7 +2,6 @@ "domain": "gios", "name": "GIOŚ", "documentation": "https://www.home-assistant.io/integrations/gios", - "dependencies": [], "codeowners": ["@bieniu"], "requirements": ["gios==0.1.1"], "config_flow": true diff --git a/homeassistant/components/github/manifest.json b/homeassistant/components/github/manifest.json index c2686346e5b2..1a9cd620b0e8 100644 --- a/homeassistant/components/github/manifest.json +++ b/homeassistant/components/github/manifest.json @@ -3,6 +3,5 @@ "name": "GitHub", "documentation": "https://www.home-assistant.io/integrations/github", "requirements": ["PyGithub==1.43.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gitlab_ci/manifest.json b/homeassistant/components/gitlab_ci/manifest.json index ba29f56cfba3..5061d35c1890 100644 --- a/homeassistant/components/gitlab_ci/manifest.json +++ b/homeassistant/components/gitlab_ci/manifest.json @@ -3,6 +3,5 @@ "name": "GitLab-CI", "documentation": "https://www.home-assistant.io/integrations/gitlab_ci", "requirements": ["python-gitlab==1.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gitter/manifest.json b/homeassistant/components/gitter/manifest.json index 35904b3a57b1..c1c13af792a1 100644 --- a/homeassistant/components/gitter/manifest.json +++ b/homeassistant/components/gitter/manifest.json @@ -3,6 +3,5 @@ "name": "Gitter", "documentation": "https://www.home-assistant.io/integrations/gitter", "requirements": ["gitterpy==0.1.7"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/glances/manifest.json b/homeassistant/components/glances/manifest.json index 761f77510b64..b50601ae835e 100644 --- a/homeassistant/components/glances/manifest.json +++ b/homeassistant/components/glances/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/glances", "requirements": ["glances_api==0.2.0"], - "dependencies": [], "codeowners": ["@fabaff", "@engrbm87"] } diff --git a/homeassistant/components/gntp/manifest.json b/homeassistant/components/gntp/manifest.json index 3433b369456d..bd2a260facaf 100644 --- a/homeassistant/components/gntp/manifest.json +++ b/homeassistant/components/gntp/manifest.json @@ -3,6 +3,5 @@ "name": "Growl (GnGNTP)", "documentation": "https://www.home-assistant.io/integrations/gntp", "requirements": ["gntp==1.0.3"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/goalfeed/manifest.json b/homeassistant/components/goalfeed/manifest.json index f0202dbb4f32..d07c7c2df7ef 100644 --- a/homeassistant/components/goalfeed/manifest.json +++ b/homeassistant/components/goalfeed/manifest.json @@ -3,6 +3,5 @@ "name": "Goalfeed", "documentation": "https://www.home-assistant.io/integrations/goalfeed", "requirements": ["pysher==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gogogate2/manifest.json b/homeassistant/components/gogogate2/manifest.json index 690f2098cac2..829df5a1c37f 100644 --- a/homeassistant/components/gogogate2/manifest.json +++ b/homeassistant/components/gogogate2/manifest.json @@ -3,6 +3,5 @@ "name": "Gogogate2", "documentation": "https://www.home-assistant.io/integrations/gogogate2", "requirements": ["pygogogate2==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/google/manifest.json b/homeassistant/components/google/manifest.json index 5c1be98bb568..1c14609f5086 100644 --- a/homeassistant/components/google/manifest.json +++ b/homeassistant/components/google/manifest.json @@ -7,6 +7,5 @@ "httplib2==0.10.3", "oauth2client==4.0.0" ], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/google_assistant/manifest.json b/homeassistant/components/google_assistant/manifest.json index 0f266801343a..eef58106bd0d 100644 --- a/homeassistant/components/google_assistant/manifest.json +++ b/homeassistant/components/google_assistant/manifest.json @@ -2,7 +2,6 @@ "domain": "google_assistant", "name": "Google Assistant", "documentation": "https://www.home-assistant.io/integrations/google_assistant", - "requirements": [], "dependencies": ["http"], "after_dependencies": ["camera"], "codeowners": ["@home-assistant/cloud"] diff --git a/homeassistant/components/google_cloud/manifest.json b/homeassistant/components/google_cloud/manifest.json index bef8a2f08a99..12d761786d3a 100644 --- a/homeassistant/components/google_cloud/manifest.json +++ b/homeassistant/components/google_cloud/manifest.json @@ -3,6 +3,5 @@ "name": "Google Cloud Platform", "documentation": "https://www.home-assistant.io/integrations/google_cloud", "requirements": ["google-cloud-texttospeech==0.4.0"], - "dependencies": [], "codeowners": ["@lufton"] } diff --git a/homeassistant/components/google_domains/manifest.json b/homeassistant/components/google_domains/manifest.json index 0d47135be50f..3372bb3f97df 100644 --- a/homeassistant/components/google_domains/manifest.json +++ b/homeassistant/components/google_domains/manifest.json @@ -2,7 +2,5 @@ "domain": "google_domains", "name": "Google Domains", "documentation": "https://www.home-assistant.io/integrations/google_domains", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/google_maps/manifest.json b/homeassistant/components/google_maps/manifest.json index dc93bbe5c94e..62791c212f9c 100644 --- a/homeassistant/components/google_maps/manifest.json +++ b/homeassistant/components/google_maps/manifest.json @@ -3,6 +3,5 @@ "name": "Google Maps", "documentation": "https://www.home-assistant.io/integrations/google_maps", "requirements": ["locationsharinglib==4.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/google_pubsub/manifest.json b/homeassistant/components/google_pubsub/manifest.json index 1a59e453c6e9..c879788f2c08 100644 --- a/homeassistant/components/google_pubsub/manifest.json +++ b/homeassistant/components/google_pubsub/manifest.json @@ -3,6 +3,5 @@ "name": "Google Pub/Sub", "documentation": "https://www.home-assistant.io/integrations/google_pubsub", "requirements": ["google-cloud-pubsub==0.39.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/google_translate/manifest.json b/homeassistant/components/google_translate/manifest.json index dba7020d076a..452a5352aac1 100644 --- a/homeassistant/components/google_translate/manifest.json +++ b/homeassistant/components/google_translate/manifest.json @@ -3,6 +3,5 @@ "name": "Google Translate Text-to-Speech", "documentation": "https://www.home-assistant.io/integrations/google_translate", "requirements": ["gTTS-token==1.1.3"], - "dependencies": [], "codeowners": ["@awarecan"] } diff --git a/homeassistant/components/google_travel_time/manifest.json b/homeassistant/components/google_travel_time/manifest.json index ce7ca9d10abe..8f235cf99478 100644 --- a/homeassistant/components/google_travel_time/manifest.json +++ b/homeassistant/components/google_travel_time/manifest.json @@ -3,6 +3,5 @@ "name": "Google Maps Travel Time", "documentation": "https://www.home-assistant.io/integrations/google_travel_time", "requirements": ["googlemaps==2.5.1"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/google_wifi/manifest.json b/homeassistant/components/google_wifi/manifest.json index b46cea0ca46e..285152239d38 100644 --- a/homeassistant/components/google_wifi/manifest.json +++ b/homeassistant/components/google_wifi/manifest.json @@ -2,7 +2,5 @@ "domain": "google_wifi", "name": "Google Wifi", "documentation": "https://www.home-assistant.io/integrations/google_wifi", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gpsd/manifest.json b/homeassistant/components/gpsd/manifest.json index 16a1bbd51df7..2a2bf0ffd366 100644 --- a/homeassistant/components/gpsd/manifest.json +++ b/homeassistant/components/gpsd/manifest.json @@ -3,6 +3,5 @@ "name": "GPSD", "documentation": "https://www.home-assistant.io/integrations/gpsd", "requirements": ["gps3==0.33.3"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/gpslogger/manifest.json b/homeassistant/components/gpslogger/manifest.json index f4fc556961bf..9afbed0d684b 100644 --- a/homeassistant/components/gpslogger/manifest.json +++ b/homeassistant/components/gpslogger/manifest.json @@ -3,7 +3,6 @@ "name": "GPSLogger", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/gpslogger", - "requirements": [], "dependencies": ["webhook"], "codeowners": [] } diff --git a/homeassistant/components/graphite/manifest.json b/homeassistant/components/graphite/manifest.json index 49748128258e..4fed46190778 100644 --- a/homeassistant/components/graphite/manifest.json +++ b/homeassistant/components/graphite/manifest.json @@ -2,7 +2,5 @@ "domain": "graphite", "name": "Graphite", "documentation": "https://www.home-assistant.io/integrations/graphite", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/greeneye_monitor/manifest.json b/homeassistant/components/greeneye_monitor/manifest.json index b10c4ad01a0c..304233438c57 100644 --- a/homeassistant/components/greeneye_monitor/manifest.json +++ b/homeassistant/components/greeneye_monitor/manifest.json @@ -3,6 +3,5 @@ "name": "GreenEye Monitor (GEM)", "documentation": "https://www.home-assistant.io/integrations/greeneye_monitor", "requirements": ["greeneye_monitor==2.0"], - "dependencies": [], "codeowners": ["@jkeljo"] } diff --git a/homeassistant/components/greenwave/manifest.json b/homeassistant/components/greenwave/manifest.json index f0cdd6590d85..b0076058833f 100644 --- a/homeassistant/components/greenwave/manifest.json +++ b/homeassistant/components/greenwave/manifest.json @@ -3,6 +3,5 @@ "name": "Greenwave Reality", "documentation": "https://www.home-assistant.io/integrations/greenwave", "requirements": ["greenwavereality==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/griddy/manifest.json b/homeassistant/components/griddy/manifest.json index d17ed846fd92..988c4289b529 100644 --- a/homeassistant/components/griddy/manifest.json +++ b/homeassistant/components/griddy/manifest.json @@ -7,7 +7,6 @@ "ssdp": [], "zeroconf": [], "homekit": {}, - "dependencies": [], "codeowners": [ "@bdraco" ] diff --git a/homeassistant/components/group/manifest.json b/homeassistant/components/group/manifest.json index bd117ac9a6ff..692267817f99 100644 --- a/homeassistant/components/group/manifest.json +++ b/homeassistant/components/group/manifest.json @@ -2,8 +2,6 @@ "domain": "group", "name": "Group", "documentation": "https://www.home-assistant.io/integrations/group", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/growatt_server/manifest.json b/homeassistant/components/growatt_server/manifest.json index 7457ef14254e..7d8a8a3852fa 100644 --- a/homeassistant/components/growatt_server/manifest.json +++ b/homeassistant/components/growatt_server/manifest.json @@ -3,6 +3,5 @@ "name": "Growatt", "documentation": "https://www.home-assistant.io/integrations/growatt_server/", "requirements": ["growattServer==0.0.1"], - "dependencies": [], "codeowners": ["@indykoning"] } diff --git a/homeassistant/components/gstreamer/manifest.json b/homeassistant/components/gstreamer/manifest.json index 81078b1a18b5..691d26ce009c 100644 --- a/homeassistant/components/gstreamer/manifest.json +++ b/homeassistant/components/gstreamer/manifest.json @@ -3,6 +3,5 @@ "name": "GStreamer", "documentation": "https://www.home-assistant.io/integrations/gstreamer", "requirements": ["gstreamer-player==1.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/gtfs/manifest.json b/homeassistant/components/gtfs/manifest.json index a79595845046..c3efd8cdaed4 100644 --- a/homeassistant/components/gtfs/manifest.json +++ b/homeassistant/components/gtfs/manifest.json @@ -3,6 +3,5 @@ "name": "General Transit Feed Specification (GTFS)", "documentation": "https://www.home-assistant.io/integrations/gtfs", "requirements": ["pygtfs==0.1.5"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/habitica/manifest.json b/homeassistant/components/habitica/manifest.json index ff0d0eb27ac1..50664d862ada 100644 --- a/homeassistant/components/habitica/manifest.json +++ b/homeassistant/components/habitica/manifest.json @@ -3,6 +3,5 @@ "name": "Habitica", "documentation": "https://www.home-assistant.io/integrations/habitica", "requirements": ["habitipy==0.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hangouts/manifest.json b/homeassistant/components/hangouts/manifest.json index b08387c7fd70..6eb62c3f5900 100644 --- a/homeassistant/components/hangouts/manifest.json +++ b/homeassistant/components/hangouts/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/hangouts", "requirements": ["hangups==0.4.9"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/harman_kardon_avr/manifest.json b/homeassistant/components/harman_kardon_avr/manifest.json index 060d78fbdeee..906b8ab26624 100644 --- a/homeassistant/components/harman_kardon_avr/manifest.json +++ b/homeassistant/components/harman_kardon_avr/manifest.json @@ -3,6 +3,5 @@ "name": "Harman Kardon AVR", "documentation": "https://www.home-assistant.io/integrations/harman_kardon_avr", "requirements": ["hkavr==0.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/harmony/manifest.json b/homeassistant/components/harmony/manifest.json index 870e3f150443..f3ed23282917 100644 --- a/homeassistant/components/harmony/manifest.json +++ b/homeassistant/components/harmony/manifest.json @@ -3,7 +3,6 @@ "name": "Logitech Harmony Hub", "documentation": "https://www.home-assistant.io/integrations/harmony", "requirements": ["aioharmony==0.1.13"], - "dependencies": [], "codeowners": ["@ehendrix23","@bramkragten","@bdraco"], "ssdp": [ { diff --git a/homeassistant/components/hassio/manifest.json b/homeassistant/components/hassio/manifest.json index cd004db4c93a..bc215932aa8f 100644 --- a/homeassistant/components/hassio/manifest.json +++ b/homeassistant/components/hassio/manifest.json @@ -2,7 +2,6 @@ "domain": "hassio", "name": "Hass.io", "documentation": "https://www.home-assistant.io/hassio", - "requirements": [], "dependencies": ["http"], "after_dependencies": ["panel_custom"], "codeowners": ["@home-assistant/hass-io"] diff --git a/homeassistant/components/haveibeenpwned/manifest.json b/homeassistant/components/haveibeenpwned/manifest.json index 0016bf586cd7..255124eb133a 100644 --- a/homeassistant/components/haveibeenpwned/manifest.json +++ b/homeassistant/components/haveibeenpwned/manifest.json @@ -2,7 +2,5 @@ "domain": "haveibeenpwned", "name": "HaveIBeenPwned", "documentation": "https://www.home-assistant.io/integrations/haveibeenpwned", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hddtemp/manifest.json b/homeassistant/components/hddtemp/manifest.json index 6f1d10a9355f..d72103f20264 100644 --- a/homeassistant/components/hddtemp/manifest.json +++ b/homeassistant/components/hddtemp/manifest.json @@ -2,7 +2,5 @@ "domain": "hddtemp", "name": "hddtemp", "documentation": "https://www.home-assistant.io/integrations/hddtemp", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hdmi_cec/manifest.json b/homeassistant/components/hdmi_cec/manifest.json index 683b735ec506..3d2ea355e02c 100644 --- a/homeassistant/components/hdmi_cec/manifest.json +++ b/homeassistant/components/hdmi_cec/manifest.json @@ -3,6 +3,5 @@ "name": "HDMI-CEC", "documentation": "https://www.home-assistant.io/integrations/hdmi_cec", "requirements": ["pyCEC==0.4.13"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/heatmiser/manifest.json b/homeassistant/components/heatmiser/manifest.json index d8ecb505390d..065cfc9f6a2e 100644 --- a/homeassistant/components/heatmiser/manifest.json +++ b/homeassistant/components/heatmiser/manifest.json @@ -3,6 +3,5 @@ "name": "Heatmiser", "documentation": "https://www.home-assistant.io/integrations/heatmiser", "requirements": ["heatmiserV3==1.1.18"], - "dependencies": [], "codeowners": ["@andylockran"] } diff --git a/homeassistant/components/heos/manifest.json b/homeassistant/components/heos/manifest.json index 02f3d03ae524..a6da3623da73 100644 --- a/homeassistant/components/heos/manifest.json +++ b/homeassistant/components/heos/manifest.json @@ -9,6 +9,5 @@ "st": "urn:schemas-denon-com:device:ACT-Denon:1" } ], - "dependencies": [], "codeowners": ["@andrewsayre"] } diff --git a/homeassistant/components/here_travel_time/manifest.json b/homeassistant/components/here_travel_time/manifest.json index fcef464aa88f..151211eef795 100644 --- a/homeassistant/components/here_travel_time/manifest.json +++ b/homeassistant/components/here_travel_time/manifest.json @@ -3,6 +3,5 @@ "name": "HERE Travel Time", "documentation": "https://www.home-assistant.io/integrations/here_travel_time", "requirements": ["herepy==2.0.0"], - "dependencies": [], "codeowners": ["@eifinger"] } diff --git a/homeassistant/components/hikvision/manifest.json b/homeassistant/components/hikvision/manifest.json index 45b2686ada25..8722d97e22a6 100644 --- a/homeassistant/components/hikvision/manifest.json +++ b/homeassistant/components/hikvision/manifest.json @@ -3,6 +3,5 @@ "name": "Hikvision", "documentation": "https://www.home-assistant.io/integrations/hikvision", "requirements": ["pyhik==0.2.5"], - "dependencies": [], "codeowners": ["@mezz64"] } diff --git a/homeassistant/components/hikvisioncam/manifest.json b/homeassistant/components/hikvisioncam/manifest.json index 277617a90320..1a08487fa3a1 100644 --- a/homeassistant/components/hikvisioncam/manifest.json +++ b/homeassistant/components/hikvisioncam/manifest.json @@ -3,6 +3,5 @@ "name": "Hikvision", "documentation": "https://www.home-assistant.io/integrations/hikvisioncam", "requirements": ["hikvision==0.4"], - "dependencies": [], "codeowners": ["@fbradyirl"] } diff --git a/homeassistant/components/hisense_aehw4a1/manifest.json b/homeassistant/components/hisense_aehw4a1/manifest.json index a101ab6dd9ff..02535142d1b4 100644 --- a/homeassistant/components/hisense_aehw4a1/manifest.json +++ b/homeassistant/components/hisense_aehw4a1/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/hisense_aehw4a1", "requirements": ["pyaehw4a1==0.3.4"], - "dependencies": [], "codeowners": ["@bannhead"] } diff --git a/homeassistant/components/history/manifest.json b/homeassistant/components/history/manifest.json index 47f74ec4fdef..7185a8b63c43 100644 --- a/homeassistant/components/history/manifest.json +++ b/homeassistant/components/history/manifest.json @@ -2,7 +2,6 @@ "domain": "history", "name": "History", "documentation": "https://www.home-assistant.io/integrations/history", - "requirements": [], "dependencies": ["http", "recorder"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/history_stats/manifest.json b/homeassistant/components/history_stats/manifest.json index e51fa20bb651..dad7cfa6a5a0 100644 --- a/homeassistant/components/history_stats/manifest.json +++ b/homeassistant/components/history_stats/manifest.json @@ -2,7 +2,6 @@ "domain": "history_stats", "name": "History Stats", "documentation": "https://www.home-assistant.io/integrations/history_stats", - "requirements": [], "dependencies": ["history"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/hitron_coda/manifest.json b/homeassistant/components/hitron_coda/manifest.json index 05f82999198f..609e21712806 100644 --- a/homeassistant/components/hitron_coda/manifest.json +++ b/homeassistant/components/hitron_coda/manifest.json @@ -2,7 +2,5 @@ "domain": "hitron_coda", "name": "Rogers Hitron CODA", "documentation": "https://www.home-assistant.io/integrations/hitron_coda", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hive/manifest.json b/homeassistant/components/hive/manifest.json index 96563d5ab3d7..060a1a0a200d 100644 --- a/homeassistant/components/hive/manifest.json +++ b/homeassistant/components/hive/manifest.json @@ -3,6 +3,5 @@ "name": "Hive", "documentation": "https://www.home-assistant.io/integrations/hive", "requirements": ["pyhiveapi==0.2.20.1"], - "dependencies": [], "codeowners": ["@Rendili", "@KJonline"] } diff --git a/homeassistant/components/hlk_sw16/manifest.json b/homeassistant/components/hlk_sw16/manifest.json index 7df3238e2879..7574076fd433 100644 --- a/homeassistant/components/hlk_sw16/manifest.json +++ b/homeassistant/components/hlk_sw16/manifest.json @@ -3,6 +3,5 @@ "name": "Hi-Link HLK-SW16", "documentation": "https://www.home-assistant.io/integrations/hlk_sw16", "requirements": ["hlk-sw16==0.0.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/homeassistant/manifest.json b/homeassistant/components/homeassistant/manifest.json index 50b771611d34..027d1b9376d6 100644 --- a/homeassistant/components/homeassistant/manifest.json +++ b/homeassistant/components/homeassistant/manifest.json @@ -2,8 +2,6 @@ "domain": "homeassistant", "name": "Home Assistant Core Integration", "documentation": "https://www.home-assistant.io/integrations/homeassistant", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index eb8d16d0c0ad..417ff9db5bcf 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -3,6 +3,5 @@ "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", "requirements": ["HAP-python==2.8.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/homekit_controller/manifest.json b/homeassistant/components/homekit_controller/manifest.json index 009dc2851500..07736f61c8e1 100644 --- a/homeassistant/components/homekit_controller/manifest.json +++ b/homeassistant/components/homekit_controller/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/homekit_controller", "requirements": ["aiohomekit[IP]==0.2.37"], - "dependencies": [], "zeroconf": ["_hap._tcp.local."], "codeowners": ["@Jc2k"] } diff --git a/homeassistant/components/homematic/manifest.json b/homeassistant/components/homematic/manifest.json index 20ea0d6acb15..9e1bf043f541 100644 --- a/homeassistant/components/homematic/manifest.json +++ b/homeassistant/components/homematic/manifest.json @@ -3,6 +3,5 @@ "name": "Homematic", "documentation": "https://www.home-assistant.io/integrations/homematic", "requirements": ["pyhomematic==0.1.65"], - "dependencies": [], "codeowners": ["@pvizeli", "@danielperna84"] } diff --git a/homeassistant/components/homematicip_cloud/manifest.json b/homeassistant/components/homematicip_cloud/manifest.json index 9ecdb0ad80da..ef362300c661 100644 --- a/homeassistant/components/homematicip_cloud/manifest.json +++ b/homeassistant/components/homematicip_cloud/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/homematicip_cloud", "requirements": ["homematicip==0.10.17"], - "dependencies": [], "codeowners": ["@SukramJ"], "quality_scale": "platinum" } diff --git a/homeassistant/components/homeworks/manifest.json b/homeassistant/components/homeworks/manifest.json index e28230662f8f..9432e80d04e7 100644 --- a/homeassistant/components/homeworks/manifest.json +++ b/homeassistant/components/homeworks/manifest.json @@ -3,6 +3,5 @@ "name": "Lutron Homeworks", "documentation": "https://www.home-assistant.io/integrations/homeworks", "requirements": ["pyhomeworks==0.0.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/honeywell/manifest.json b/homeassistant/components/honeywell/manifest.json index aed289495914..52abf20bb2fd 100644 --- a/homeassistant/components/honeywell/manifest.json +++ b/homeassistant/components/honeywell/manifest.json @@ -3,6 +3,5 @@ "name": "Honeywell Total Connect Comfort (US)", "documentation": "https://www.home-assistant.io/integrations/honeywell", "requirements": ["somecomfort==0.5.2"], - "dependencies": [], "codeowners": ["@zxdavb"] } diff --git a/homeassistant/components/horizon/manifest.json b/homeassistant/components/horizon/manifest.json index 620a90d6c095..0d89adb51093 100644 --- a/homeassistant/components/horizon/manifest.json +++ b/homeassistant/components/horizon/manifest.json @@ -3,6 +3,5 @@ "name": "Unitymedia Horizon HD Recorder", "documentation": "https://www.home-assistant.io/integrations/horizon", "requirements": ["horimote==0.4.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hp_ilo/manifest.json b/homeassistant/components/hp_ilo/manifest.json index c863651699ad..ea922edd59e1 100644 --- a/homeassistant/components/hp_ilo/manifest.json +++ b/homeassistant/components/hp_ilo/manifest.json @@ -3,6 +3,5 @@ "name": "HP Integrated Lights-Out (ILO)", "documentation": "https://www.home-assistant.io/integrations/hp_ilo", "requirements": ["python-hpilo==4.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/http/manifest.json b/homeassistant/components/http/manifest.json index 6f8328b33fb2..2fd0be87a8b8 100644 --- a/homeassistant/components/http/manifest.json +++ b/homeassistant/components/http/manifest.json @@ -3,7 +3,6 @@ "name": "HTTP", "documentation": "https://www.home-assistant.io/integrations/http", "requirements": ["aiohttp_cors==0.7.0"], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/htu21d/manifest.json b/homeassistant/components/htu21d/manifest.json index 2b36c4b66fb9..18109aa40e46 100644 --- a/homeassistant/components/htu21d/manifest.json +++ b/homeassistant/components/htu21d/manifest.json @@ -3,6 +3,5 @@ "name": "HTU21D(F) Sensor", "documentation": "https://www.home-assistant.io/integrations/htu21d", "requirements": ["i2csense==0.0.4", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/huawei_lte/manifest.json b/homeassistant/components/huawei_lte/manifest.json index 262ee118e0fd..d63387ce9f54 100644 --- a/homeassistant/components/huawei_lte/manifest.json +++ b/homeassistant/components/huawei_lte/manifest.json @@ -15,6 +15,5 @@ "manufacturer": "Huawei" } ], - "dependencies": [], "codeowners": ["@scop"] } diff --git a/homeassistant/components/huawei_router/manifest.json b/homeassistant/components/huawei_router/manifest.json index 32e366a5a5ad..56aafe8c3f04 100644 --- a/homeassistant/components/huawei_router/manifest.json +++ b/homeassistant/components/huawei_router/manifest.json @@ -2,7 +2,5 @@ "domain": "huawei_router", "name": "Huawei Router", "documentation": "https://www.home-assistant.io/integrations/huawei_router", - "requirements": [], - "dependencies": [], "codeowners": ["@abmantis"] } diff --git a/homeassistant/components/hue/manifest.json b/homeassistant/components/hue/manifest.json index a5c801f41245..687e0a7330ea 100644 --- a/homeassistant/components/hue/manifest.json +++ b/homeassistant/components/hue/manifest.json @@ -21,7 +21,6 @@ "homekit": { "models": ["BSB002"] }, - "dependencies": [], "codeowners": ["@balloob"], "quality_scale": "platinum" } diff --git a/homeassistant/components/hunterdouglas_powerview/manifest.json b/homeassistant/components/hunterdouglas_powerview/manifest.json index b72efc431c36..68fc6118a34e 100644 --- a/homeassistant/components/hunterdouglas_powerview/manifest.json +++ b/homeassistant/components/hunterdouglas_powerview/manifest.json @@ -3,6 +3,5 @@ "name": "Hunter Douglas PowerView", "documentation": "https://www.home-assistant.io/integrations/hunterdouglas_powerview", "requirements": ["aiopvapi==1.6.14"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hydrawise/manifest.json b/homeassistant/components/hydrawise/manifest.json index a9555beaa7bb..1d6a2ee85ea3 100644 --- a/homeassistant/components/hydrawise/manifest.json +++ b/homeassistant/components/hydrawise/manifest.json @@ -3,6 +3,5 @@ "name": "Hunter Hydrawise", "documentation": "https://www.home-assistant.io/integrations/hydrawise", "requirements": ["hydrawiser==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/hyperion/manifest.json b/homeassistant/components/hyperion/manifest.json index e4ac9c0897b9..6d9d0ae4d9de 100644 --- a/homeassistant/components/hyperion/manifest.json +++ b/homeassistant/components/hyperion/manifest.json @@ -2,7 +2,5 @@ "domain": "hyperion", "name": "Hyperion", "documentation": "https://www.home-assistant.io/integrations/hyperion", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ialarm/manifest.json b/homeassistant/components/ialarm/manifest.json index 5ddb0a1f907d..d5d32e28c59f 100644 --- a/homeassistant/components/ialarm/manifest.json +++ b/homeassistant/components/ialarm/manifest.json @@ -3,6 +3,5 @@ "name": "Antifurto365 iAlarm", "documentation": "https://www.home-assistant.io/integrations/ialarm", "requirements": ["pyialarm==0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/iaqualink/manifest.json b/homeassistant/components/iaqualink/manifest.json index ea3b1eef8d06..d9d16038d193 100644 --- a/homeassistant/components/iaqualink/manifest.json +++ b/homeassistant/components/iaqualink/manifest.json @@ -3,7 +3,6 @@ "name": "Jandy iAqualink", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/iaqualink/", - "dependencies": [], "codeowners": ["@flz"], "requirements": ["iaqualink==0.3.1"] } diff --git a/homeassistant/components/icloud/manifest.json b/homeassistant/components/icloud/manifest.json index fd970ce44410..2b8bc2fccaed 100644 --- a/homeassistant/components/icloud/manifest.json +++ b/homeassistant/components/icloud/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/icloud", "requirements": ["pyicloud==0.9.6.1"], - "dependencies": [], "codeowners": ["@Quentame"] } diff --git a/homeassistant/components/idteck_prox/manifest.json b/homeassistant/components/idteck_prox/manifest.json index a82cfc50263f..8eb95f2d083c 100644 --- a/homeassistant/components/idteck_prox/manifest.json +++ b/homeassistant/components/idteck_prox/manifest.json @@ -3,6 +3,5 @@ "name": "IDTECK Proximity Reader", "documentation": "https://www.home-assistant.io/integrations/idteck_prox", "requirements": ["rfk101py==0.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/iglo/manifest.json b/homeassistant/components/iglo/manifest.json index 5263d5db8bc4..98a1f8c4ee04 100644 --- a/homeassistant/components/iglo/manifest.json +++ b/homeassistant/components/iglo/manifest.json @@ -3,6 +3,5 @@ "name": "iGlo", "documentation": "https://www.home-assistant.io/integrations/iglo", "requirements": ["iglo==1.2.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ign_sismologia/manifest.json b/homeassistant/components/ign_sismologia/manifest.json index 3a969e7fa3f2..ba70cbcddf12 100644 --- a/homeassistant/components/ign_sismologia/manifest.json +++ b/homeassistant/components/ign_sismologia/manifest.json @@ -3,6 +3,5 @@ "name": "IGN Sismología", "documentation": "https://www.home-assistant.io/integrations/ign_sismologia", "requirements": ["georss_ign_sismologia_client==0.2"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/ihc/manifest.json b/homeassistant/components/ihc/manifest.json index 559ed7c90600..91086a4f8753 100644 --- a/homeassistant/components/ihc/manifest.json +++ b/homeassistant/components/ihc/manifest.json @@ -6,6 +6,5 @@ "defusedxml==0.6.0", "ihcsdk==2.6.0" ], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/image_processing/manifest.json b/homeassistant/components/image_processing/manifest.json index e50ea8d25fd5..3ff3fb372549 100644 --- a/homeassistant/components/image_processing/manifest.json +++ b/homeassistant/components/image_processing/manifest.json @@ -2,7 +2,6 @@ "domain": "image_processing", "name": "Image Processing", "documentation": "https://www.home-assistant.io/integrations/image_processing", - "requirements": [], "dependencies": ["camera"], "codeowners": [] } diff --git a/homeassistant/components/imap/manifest.json b/homeassistant/components/imap/manifest.json index c861588771e8..b2064742a924 100644 --- a/homeassistant/components/imap/manifest.json +++ b/homeassistant/components/imap/manifest.json @@ -3,6 +3,5 @@ "name": "IMAP", "documentation": "https://www.home-assistant.io/integrations/imap", "requirements": ["aioimaplib==0.7.15"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/imap_email_content/manifest.json b/homeassistant/components/imap_email_content/manifest.json index c11d6f49edbd..869d465b1b7a 100644 --- a/homeassistant/components/imap_email_content/manifest.json +++ b/homeassistant/components/imap_email_content/manifest.json @@ -2,7 +2,5 @@ "domain": "imap_email_content", "name": "IMAP Email Content", "documentation": "https://www.home-assistant.io/integrations/imap_email_content", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/incomfort/manifest.json b/homeassistant/components/incomfort/manifest.json index d69c916bda3d..80b6952c3836 100644 --- a/homeassistant/components/incomfort/manifest.json +++ b/homeassistant/components/incomfort/manifest.json @@ -3,6 +3,5 @@ "name": "Intergas InComfort/Intouch Lan2RF gateway", "documentation": "https://www.home-assistant.io/integrations/incomfort", "requirements": ["incomfort-client==0.4.0"], - "dependencies": [], "codeowners": ["@zxdavb"] } diff --git a/homeassistant/components/influxdb/manifest.json b/homeassistant/components/influxdb/manifest.json index bd5249a3858b..94577f5735fa 100644 --- a/homeassistant/components/influxdb/manifest.json +++ b/homeassistant/components/influxdb/manifest.json @@ -3,6 +3,5 @@ "name": "InfluxDB", "documentation": "https://www.home-assistant.io/integrations/influxdb", "requirements": ["influxdb==5.2.3"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/input_boolean/manifest.json b/homeassistant/components/input_boolean/manifest.json index f697d94c893f..7a27d475e6ea 100644 --- a/homeassistant/components/input_boolean/manifest.json +++ b/homeassistant/components/input_boolean/manifest.json @@ -2,8 +2,6 @@ "domain": "input_boolean", "name": "Input Boolean", "documentation": "https://www.home-assistant.io/integrations/input_boolean", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/input_datetime/manifest.json b/homeassistant/components/input_datetime/manifest.json index bde5b6e6b900..a394b77b72ed 100644 --- a/homeassistant/components/input_datetime/manifest.json +++ b/homeassistant/components/input_datetime/manifest.json @@ -2,8 +2,6 @@ "domain": "input_datetime", "name": "Input Datetime", "documentation": "https://www.home-assistant.io/integrations/input_datetime", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/input_number/manifest.json b/homeassistant/components/input_number/manifest.json index 98376e77d043..93081a7ed493 100644 --- a/homeassistant/components/input_number/manifest.json +++ b/homeassistant/components/input_number/manifest.json @@ -2,8 +2,6 @@ "domain": "input_number", "name": "Input Number", "documentation": "https://www.home-assistant.io/integrations/input_number", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/input_select/manifest.json b/homeassistant/components/input_select/manifest.json index 892794c26160..614ee18390d0 100644 --- a/homeassistant/components/input_select/manifest.json +++ b/homeassistant/components/input_select/manifest.json @@ -2,8 +2,6 @@ "domain": "input_select", "name": "Input Select", "documentation": "https://www.home-assistant.io/integrations/input_select", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/input_text/manifest.json b/homeassistant/components/input_text/manifest.json index 34fd0681e16e..3ca9a0b961ae 100644 --- a/homeassistant/components/input_text/manifest.json +++ b/homeassistant/components/input_text/manifest.json @@ -2,8 +2,6 @@ "domain": "input_text", "name": "Input Text", "documentation": "https://www.home-assistant.io/integrations/input_text", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/insteon/manifest.json b/homeassistant/components/insteon/manifest.json index 64c4b6a67bef..8410c6b6ef41 100644 --- a/homeassistant/components/insteon/manifest.json +++ b/homeassistant/components/insteon/manifest.json @@ -3,6 +3,5 @@ "name": "Insteon", "documentation": "https://www.home-assistant.io/integrations/insteon", "requirements": ["insteonplm==0.16.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/integration/manifest.json b/homeassistant/components/integration/manifest.json index d7063e12e9be..8d70a26ff7e8 100644 --- a/homeassistant/components/integration/manifest.json +++ b/homeassistant/components/integration/manifest.json @@ -2,8 +2,6 @@ "domain": "integration", "name": "Integration - Riemann sum integral", "documentation": "https://www.home-assistant.io/integrations/integration", - "requirements": [], - "dependencies": [], "codeowners": ["@dgomes"], "quality_scale": "internal" } diff --git a/homeassistant/components/intent/manifest.json b/homeassistant/components/intent/manifest.json index 005abde47d68..a1b9f819819a 100644 --- a/homeassistant/components/intent/manifest.json +++ b/homeassistant/components/intent/manifest.json @@ -3,7 +3,6 @@ "name": "Intent", "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/intent", - "requirements": [], "ssdp": [], "homekit": {}, "dependencies": ["http"], diff --git a/homeassistant/components/intent_script/manifest.json b/homeassistant/components/intent_script/manifest.json index 6b204d0e83c2..af64fda56776 100644 --- a/homeassistant/components/intent_script/manifest.json +++ b/homeassistant/components/intent_script/manifest.json @@ -2,8 +2,6 @@ "domain": "intent_script", "name": "Intent Script", "documentation": "https://www.home-assistant.io/integrations/intent_script", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/intesishome/manifest.json b/homeassistant/components/intesishome/manifest.json index f1647f5d97ef..36da85d6fb03 100644 --- a/homeassistant/components/intesishome/manifest.json +++ b/homeassistant/components/intesishome/manifest.json @@ -2,7 +2,6 @@ "domain": "intesishome", "name": "IntesisHome", "documentation": "https://www.home-assistant.io/integrations/intesishome", - "dependencies": [], "codeowners": ["@jnimmo"], "requirements": ["pyintesishome==1.7.1"] } diff --git a/homeassistant/components/ios/manifest.json b/homeassistant/components/ios/manifest.json index d55b1ef5c74f..f714cee825f6 100644 --- a/homeassistant/components/ios/manifest.json +++ b/homeassistant/components/ios/manifest.json @@ -3,7 +3,6 @@ "name": "Apple iOS", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ios", - "requirements": [], "dependencies": ["device_tracker", "http", "zeroconf"], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/iota/manifest.json b/homeassistant/components/iota/manifest.json index b49553dabd91..456f77a3690d 100644 --- a/homeassistant/components/iota/manifest.json +++ b/homeassistant/components/iota/manifest.json @@ -3,6 +3,5 @@ "name": "IOTA", "documentation": "https://www.home-assistant.io/integrations/iota", "requirements": ["pyota==2.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/iperf3/manifest.json b/homeassistant/components/iperf3/manifest.json index d98472f82361..6820953dc5d4 100644 --- a/homeassistant/components/iperf3/manifest.json +++ b/homeassistant/components/iperf3/manifest.json @@ -3,6 +3,5 @@ "name": "Iperf3", "documentation": "https://www.home-assistant.io/integrations/iperf3", "requirements": ["iperf3==0.1.11"], - "dependencies": [], "codeowners": ["@rohankapoorcom"] } diff --git a/homeassistant/components/ipma/manifest.json b/homeassistant/components/ipma/manifest.json index 63c041f28c35..3358bbe45e9d 100644 --- a/homeassistant/components/ipma/manifest.json +++ b/homeassistant/components/ipma/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ipma", "requirements": ["pyipma==2.0.5"], - "dependencies": [], "codeowners": ["@dgomes", "@abmantis"] } diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 0cb788eeee7f..268787043c51 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -3,7 +3,6 @@ "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", "requirements": ["pyipp==0.8.3"], - "dependencies": [], "codeowners": ["@ctalkington"], "config_flow": true, "quality_scale": "platinum", diff --git a/homeassistant/components/iqvia/manifest.json b/homeassistant/components/iqvia/manifest.json index 363269bc589c..48b246e6fc44 100644 --- a/homeassistant/components/iqvia/manifest.json +++ b/homeassistant/components/iqvia/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/iqvia", "requirements": ["numpy==1.18.1", "pyiqvia==0.2.1"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/irish_rail_transport/manifest.json b/homeassistant/components/irish_rail_transport/manifest.json index 2861a9dbbb10..a6c9554d6069 100644 --- a/homeassistant/components/irish_rail_transport/manifest.json +++ b/homeassistant/components/irish_rail_transport/manifest.json @@ -3,6 +3,5 @@ "name": "Irish Rail Transport", "documentation": "https://www.home-assistant.io/integrations/irish_rail_transport", "requirements": ["pyirishrail==0.0.2"], - "dependencies": [], "codeowners": ["@ttroy50"] } diff --git a/homeassistant/components/islamic_prayer_times/manifest.json b/homeassistant/components/islamic_prayer_times/manifest.json index b9245bf08125..da6318a09266 100644 --- a/homeassistant/components/islamic_prayer_times/manifest.json +++ b/homeassistant/components/islamic_prayer_times/manifest.json @@ -3,6 +3,5 @@ "name": "Islamic Prayer Times", "documentation": "https://www.home-assistant.io/integrations/islamic_prayer_times", "requirements": ["prayer_times_calculator==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/iss/manifest.json b/homeassistant/components/iss/manifest.json index d8324e490c30..7fd98ebcdde0 100644 --- a/homeassistant/components/iss/manifest.json +++ b/homeassistant/components/iss/manifest.json @@ -3,6 +3,5 @@ "name": "International Space Station (ISS)", "documentation": "https://www.home-assistant.io/integrations/iss", "requirements": ["pyiss==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/isy994/manifest.json b/homeassistant/components/isy994/manifest.json index 25793bfc0c07..0b48528335d5 100644 --- a/homeassistant/components/isy994/manifest.json +++ b/homeassistant/components/isy994/manifest.json @@ -3,6 +3,5 @@ "name": "Universal Devices ISY994", "documentation": "https://www.home-assistant.io/integrations/isy994", "requirements": ["PyISY==1.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/itach/manifest.json b/homeassistant/components/itach/manifest.json index 748bfe0a817e..90d69a9a9b15 100644 --- a/homeassistant/components/itach/manifest.json +++ b/homeassistant/components/itach/manifest.json @@ -3,6 +3,5 @@ "name": "Global Caché iTach TCP/IP to IR", "documentation": "https://www.home-assistant.io/integrations/itach", "requirements": ["pyitachip2ir==0.0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/itunes/manifest.json b/homeassistant/components/itunes/manifest.json index d7e9938eec86..206f6e0a1d2e 100644 --- a/homeassistant/components/itunes/manifest.json +++ b/homeassistant/components/itunes/manifest.json @@ -2,7 +2,5 @@ "domain": "itunes", "name": "Apple iTunes", "documentation": "https://www.home-assistant.io/integrations/itunes", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/izone/manifest.json b/homeassistant/components/izone/manifest.json index 9e982b19cf83..1db99b1a0e38 100644 --- a/homeassistant/components/izone/manifest.json +++ b/homeassistant/components/izone/manifest.json @@ -3,7 +3,6 @@ "name": "iZone", "documentation": "https://www.home-assistant.io/integrations/izone", "requirements": ["python-izone==1.1.2"], - "dependencies": [], "codeowners": ["@Swamp-Ig"], "config_flow": true } diff --git a/homeassistant/components/jewish_calendar/manifest.json b/homeassistant/components/jewish_calendar/manifest.json index c4ebb382a44c..9f0d55433f04 100644 --- a/homeassistant/components/jewish_calendar/manifest.json +++ b/homeassistant/components/jewish_calendar/manifest.json @@ -3,6 +3,5 @@ "name": "Jewish Calendar", "documentation": "https://www.home-assistant.io/integrations/jewish_calendar", "requirements": ["hdate==0.9.5"], - "dependencies": [], "codeowners": ["@tsvi"] } diff --git a/homeassistant/components/joaoapps_join/manifest.json b/homeassistant/components/joaoapps_join/manifest.json index 07f02e069d82..825e5597050a 100644 --- a/homeassistant/components/joaoapps_join/manifest.json +++ b/homeassistant/components/joaoapps_join/manifest.json @@ -3,6 +3,5 @@ "name": "Joaoapps Join", "documentation": "https://www.home-assistant.io/integrations/joaoapps_join", "requirements": ["python-join-api==0.0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/juicenet/manifest.json b/homeassistant/components/juicenet/manifest.json index 6f6836a16832..79ba6ba9ec52 100644 --- a/homeassistant/components/juicenet/manifest.json +++ b/homeassistant/components/juicenet/manifest.json @@ -3,6 +3,5 @@ "name": "JuiceNet", "documentation": "https://www.home-assistant.io/integrations/juicenet", "requirements": ["python-juicenet==0.1.6"], - "dependencies": [], "codeowners": ["@jesserockz"] } diff --git a/homeassistant/components/kankun/manifest.json b/homeassistant/components/kankun/manifest.json index ef6bcbf92e27..933111ebccac 100644 --- a/homeassistant/components/kankun/manifest.json +++ b/homeassistant/components/kankun/manifest.json @@ -2,7 +2,5 @@ "domain": "kankun", "name": "Kankun", "documentation": "https://www.home-assistant.io/integrations/kankun", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/keba/manifest.json b/homeassistant/components/keba/manifest.json index 1f845ff88951..0b1b72d99abb 100644 --- a/homeassistant/components/keba/manifest.json +++ b/homeassistant/components/keba/manifest.json @@ -3,6 +3,5 @@ "name": "Keba Charging Station", "documentation": "https://www.home-assistant.io/integrations/keba", "requirements": ["keba-kecontact==1.0.0"], - "dependencies": [], "codeowners": ["@dannerph"] } diff --git a/homeassistant/components/keenetic_ndms2/manifest.json b/homeassistant/components/keenetic_ndms2/manifest.json index a4f81bcf2be2..9d4c9f357162 100644 --- a/homeassistant/components/keenetic_ndms2/manifest.json +++ b/homeassistant/components/keenetic_ndms2/manifest.json @@ -3,6 +3,5 @@ "name": "Keenetic NDMS2 Routers", "documentation": "https://www.home-assistant.io/integrations/keenetic_ndms2", "requirements": ["ndms2_client==0.0.11"], - "dependencies": [], "codeowners": ["@foxel"] } diff --git a/homeassistant/components/kef/manifest.json b/homeassistant/components/kef/manifest.json index 4af0626ace95..156b495dcf8a 100644 --- a/homeassistant/components/kef/manifest.json +++ b/homeassistant/components/kef/manifest.json @@ -2,7 +2,6 @@ "domain": "kef", "name": "KEF", "documentation": "https://www.home-assistant.io/integrations/kef", - "dependencies": [], "codeowners": ["@basnijholt"], "requirements": ["aiokef==0.2.9", "getmac==0.8.1"] } diff --git a/homeassistant/components/keyboard/manifest.json b/homeassistant/components/keyboard/manifest.json index ca9f705ec460..c6379fac4a1c 100644 --- a/homeassistant/components/keyboard/manifest.json +++ b/homeassistant/components/keyboard/manifest.json @@ -3,6 +3,5 @@ "name": "Keyboard", "documentation": "https://www.home-assistant.io/integrations/keyboard", "requirements": ["pyuserinput==0.1.11"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/keyboard_remote/manifest.json b/homeassistant/components/keyboard_remote/manifest.json index 12779dc63338..5a803f95bb3f 100644 --- a/homeassistant/components/keyboard_remote/manifest.json +++ b/homeassistant/components/keyboard_remote/manifest.json @@ -3,6 +3,5 @@ "name": "Keyboard Remote", "documentation": "https://www.home-assistant.io/integrations/keyboard_remote", "requirements": ["evdev==1.1.2", "aionotify==0.2.0"], - "dependencies": [], "codeowners": ["@bendavid"] } diff --git a/homeassistant/components/kira/manifest.json b/homeassistant/components/kira/manifest.json index 38f629d8b830..04c6598adb7e 100644 --- a/homeassistant/components/kira/manifest.json +++ b/homeassistant/components/kira/manifest.json @@ -3,6 +3,5 @@ "name": "Kira", "documentation": "https://www.home-assistant.io/integrations/kira", "requirements": ["pykira==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/kiwi/manifest.json b/homeassistant/components/kiwi/manifest.json index ce754fc4c045..a80e279f9747 100644 --- a/homeassistant/components/kiwi/manifest.json +++ b/homeassistant/components/kiwi/manifest.json @@ -3,6 +3,5 @@ "name": "KIWI", "documentation": "https://www.home-assistant.io/integrations/kiwi", "requirements": ["kiwiki-client==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/knx/manifest.json b/homeassistant/components/knx/manifest.json index 16f55b5292d9..ab26c4b62876 100644 --- a/homeassistant/components/knx/manifest.json +++ b/homeassistant/components/knx/manifest.json @@ -3,6 +3,5 @@ "name": "KNX", "documentation": "https://www.home-assistant.io/integrations/knx", "requirements": ["xknx==0.11.2"], - "dependencies": [], "codeowners": ["@Julius2342"] } diff --git a/homeassistant/components/kodi/manifest.json b/homeassistant/components/kodi/manifest.json index 80bcda0c1dee..43b318d1584b 100644 --- a/homeassistant/components/kodi/manifest.json +++ b/homeassistant/components/kodi/manifest.json @@ -3,6 +3,5 @@ "name": "Kodi", "documentation": "https://www.home-assistant.io/integrations/kodi", "requirements": ["jsonrpc-async==0.6", "jsonrpc-websocket==0.6"], - "dependencies": [], "codeowners": ["@armills"] } diff --git a/homeassistant/components/kwb/manifest.json b/homeassistant/components/kwb/manifest.json index c13aee18ef49..2f816345a864 100644 --- a/homeassistant/components/kwb/manifest.json +++ b/homeassistant/components/kwb/manifest.json @@ -3,6 +3,5 @@ "name": "KWB Easyfire", "documentation": "https://www.home-assistant.io/integrations/kwb", "requirements": ["pykwb==0.0.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lacrosse/manifest.json b/homeassistant/components/lacrosse/manifest.json index 28262b1e42de..f31d4b9fea5e 100644 --- a/homeassistant/components/lacrosse/manifest.json +++ b/homeassistant/components/lacrosse/manifest.json @@ -3,6 +3,5 @@ "name": "LaCrosse", "documentation": "https://www.home-assistant.io/integrations/lacrosse", "requirements": ["pylacrosse==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lametric/manifest.json b/homeassistant/components/lametric/manifest.json index 8b81fb888fa1..4edcef1a1475 100644 --- a/homeassistant/components/lametric/manifest.json +++ b/homeassistant/components/lametric/manifest.json @@ -3,6 +3,5 @@ "name": "LaMetric", "documentation": "https://www.home-assistant.io/integrations/lametric", "requirements": ["lmnotify==0.0.4"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/lannouncer/manifest.json b/homeassistant/components/lannouncer/manifest.json index e803f2e56d2c..3c46672776d9 100644 --- a/homeassistant/components/lannouncer/manifest.json +++ b/homeassistant/components/lannouncer/manifest.json @@ -2,7 +2,5 @@ "domain": "lannouncer", "name": "LANnouncer", "documentation": "https://www.home-assistant.io/integrations/lannouncer", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lastfm/manifest.json b/homeassistant/components/lastfm/manifest.json index 681047a2431b..85d6c5ea8d21 100644 --- a/homeassistant/components/lastfm/manifest.json +++ b/homeassistant/components/lastfm/manifest.json @@ -3,6 +3,5 @@ "name": "Last.fm", "documentation": "https://www.home-assistant.io/integrations/lastfm", "requirements": ["pylast==3.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/launch_library/manifest.json b/homeassistant/components/launch_library/manifest.json index b5fc7b36713d..d1e4c17ec5a6 100644 --- a/homeassistant/components/launch_library/manifest.json +++ b/homeassistant/components/launch_library/manifest.json @@ -3,6 +3,5 @@ "name": "Launch Library", "documentation": "https://www.home-assistant.io/integrations/launch_library", "requirements": ["pylaunches==0.2.0"], - "dependencies": [], "codeowners": ["@ludeeus"] } diff --git a/homeassistant/components/lcn/manifest.json b/homeassistant/components/lcn/manifest.json index 58353697d180..74bfe1055555 100644 --- a/homeassistant/components/lcn/manifest.json +++ b/homeassistant/components/lcn/manifest.json @@ -3,6 +3,5 @@ "name": "LCN", "documentation": "https://www.home-assistant.io/integrations/lcn", "requirements": ["pypck==0.6.4"], - "dependencies": [], "codeowners": ["@alengwenus"] } diff --git a/homeassistant/components/lg_netcast/manifest.json b/homeassistant/components/lg_netcast/manifest.json index 87c73b772b8e..78cccdda3be0 100644 --- a/homeassistant/components/lg_netcast/manifest.json +++ b/homeassistant/components/lg_netcast/manifest.json @@ -3,6 +3,5 @@ "name": "LG Netcast", "documentation": "https://www.home-assistant.io/integrations/lg_netcast", "requirements": ["pylgnetcast-homeassistant==0.2.0.dev0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lg_soundbar/manifest.json b/homeassistant/components/lg_soundbar/manifest.json index 9f93f4e8f3f7..42b5e22570cd 100644 --- a/homeassistant/components/lg_soundbar/manifest.json +++ b/homeassistant/components/lg_soundbar/manifest.json @@ -3,6 +3,5 @@ "name": "LG Soundbars", "documentation": "https://www.home-assistant.io/integrations/lg_soundbar", "requirements": ["temescal==0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/life360/manifest.json b/homeassistant/components/life360/manifest.json index 016b9e13d636..c7a832f78e7c 100644 --- a/homeassistant/components/life360/manifest.json +++ b/homeassistant/components/life360/manifest.json @@ -3,7 +3,6 @@ "name": "Life360", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/life360", - "dependencies": [], "codeowners": ["@pnbruckner"], "requirements": ["life360==4.1.1"] } diff --git a/homeassistant/components/lifx/manifest.json b/homeassistant/components/lifx/manifest.json index 327eb1d4abdd..3f5ce03e6721 100644 --- a/homeassistant/components/lifx/manifest.json +++ b/homeassistant/components/lifx/manifest.json @@ -7,6 +7,5 @@ "homekit": { "models": ["LIFX"] }, - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lifx_cloud/manifest.json b/homeassistant/components/lifx_cloud/manifest.json index b2f169a28114..038282390caf 100644 --- a/homeassistant/components/lifx_cloud/manifest.json +++ b/homeassistant/components/lifx_cloud/manifest.json @@ -2,7 +2,5 @@ "domain": "lifx_cloud", "name": "LIFX Cloud", "documentation": "https://www.home-assistant.io/integrations/lifx_cloud", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lifx_legacy/manifest.json b/homeassistant/components/lifx_legacy/manifest.json index 67e510b2ba5c..4a42f44f4827 100644 --- a/homeassistant/components/lifx_legacy/manifest.json +++ b/homeassistant/components/lifx_legacy/manifest.json @@ -3,6 +3,5 @@ "name": "LIFX Legacy", "documentation": "https://www.home-assistant.io/integrations/lifx_legacy", "requirements": ["liffylights==0.9.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/light/manifest.json b/homeassistant/components/light/manifest.json index 64e21654afd2..27c504f6b913 100644 --- a/homeassistant/components/light/manifest.json +++ b/homeassistant/components/light/manifest.json @@ -2,8 +2,6 @@ "domain": "light", "name": "Light", "documentation": "https://www.home-assistant.io/integrations/light", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/lightwave/manifest.json b/homeassistant/components/lightwave/manifest.json index 9fea812d3210..ffda0e96c120 100644 --- a/homeassistant/components/lightwave/manifest.json +++ b/homeassistant/components/lightwave/manifest.json @@ -3,6 +3,5 @@ "name": "Lightwave", "documentation": "https://www.home-assistant.io/integrations/lightwave", "requirements": ["lightwave==0.17"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/limitlessled/manifest.json b/homeassistant/components/limitlessled/manifest.json index 6dd3101fabf2..3187b795e886 100644 --- a/homeassistant/components/limitlessled/manifest.json +++ b/homeassistant/components/limitlessled/manifest.json @@ -3,6 +3,5 @@ "name": "LimitlessLED", "documentation": "https://www.home-assistant.io/integrations/limitlessled", "requirements": ["limitlessled==1.1.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/linksys_smart/manifest.json b/homeassistant/components/linksys_smart/manifest.json index 32c6c1822ea0..e0fafcdce251 100644 --- a/homeassistant/components/linksys_smart/manifest.json +++ b/homeassistant/components/linksys_smart/manifest.json @@ -2,7 +2,5 @@ "domain": "linksys_smart", "name": "Linksys Smart Wi-Fi", "documentation": "https://www.home-assistant.io/integrations/linksys_smart", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/linky/manifest.json b/homeassistant/components/linky/manifest.json index e93d124dbda5..18ee74a78cee 100644 --- a/homeassistant/components/linky/manifest.json +++ b/homeassistant/components/linky/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/linky", "requirements": ["pylinky==0.4.0"], - "dependencies": [], "codeowners": ["@Quentame"] } diff --git a/homeassistant/components/linode/manifest.json b/homeassistant/components/linode/manifest.json index 5f486a44fa02..dbc1a6fb8aa9 100644 --- a/homeassistant/components/linode/manifest.json +++ b/homeassistant/components/linode/manifest.json @@ -3,6 +3,5 @@ "name": "Linode", "documentation": "https://www.home-assistant.io/integrations/linode", "requirements": ["linode-api==4.1.9b1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/linux_battery/manifest.json b/homeassistant/components/linux_battery/manifest.json index 3bed6ee598af..1f242dd791b2 100644 --- a/homeassistant/components/linux_battery/manifest.json +++ b/homeassistant/components/linux_battery/manifest.json @@ -3,6 +3,5 @@ "name": "Linux Battery", "documentation": "https://www.home-assistant.io/integrations/linux_battery", "requirements": ["batinfo==0.4.2"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/lirc/manifest.json b/homeassistant/components/lirc/manifest.json index 45a659b4ba21..16f2445d840e 100644 --- a/homeassistant/components/lirc/manifest.json +++ b/homeassistant/components/lirc/manifest.json @@ -3,6 +3,5 @@ "name": "LIRC", "documentation": "https://www.home-assistant.io/integrations/lirc", "requirements": ["python-lirc==1.2.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/litejet/manifest.json b/homeassistant/components/litejet/manifest.json index eb80539a2ad2..1e469370b433 100644 --- a/homeassistant/components/litejet/manifest.json +++ b/homeassistant/components/litejet/manifest.json @@ -3,6 +3,5 @@ "name": "LiteJet", "documentation": "https://www.home-assistant.io/integrations/litejet", "requirements": ["pylitejet==0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/llamalab_automate/manifest.json b/homeassistant/components/llamalab_automate/manifest.json index 6fd6c30401fa..777696f5c756 100644 --- a/homeassistant/components/llamalab_automate/manifest.json +++ b/homeassistant/components/llamalab_automate/manifest.json @@ -2,7 +2,5 @@ "domain": "llamalab_automate", "name": "LlamaLab Automate", "documentation": "https://www.home-assistant.io/integrations/llamalab_automate", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/local_file/manifest.json b/homeassistant/components/local_file/manifest.json index f4773fac8637..d7ec12801869 100644 --- a/homeassistant/components/local_file/manifest.json +++ b/homeassistant/components/local_file/manifest.json @@ -2,7 +2,5 @@ "domain": "local_file", "name": "Local File", "documentation": "https://www.home-assistant.io/integrations/local_file", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/local_ip/manifest.json b/homeassistant/components/local_ip/manifest.json index 4e97c32afa05..1dd1b1ed85c5 100644 --- a/homeassistant/components/local_ip/manifest.json +++ b/homeassistant/components/local_ip/manifest.json @@ -3,7 +3,6 @@ "name": "Local IP Address", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/local_ip", - "dependencies": [], "codeowners": ["@issacg"], "requirements": [] } diff --git a/homeassistant/components/locative/manifest.json b/homeassistant/components/locative/manifest.json index ab37ce2e4e62..653b27ce4d6e 100644 --- a/homeassistant/components/locative/manifest.json +++ b/homeassistant/components/locative/manifest.json @@ -3,7 +3,6 @@ "name": "Locative", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/locative", - "requirements": [], "dependencies": ["webhook"], "codeowners": [] } diff --git a/homeassistant/components/lock/manifest.json b/homeassistant/components/lock/manifest.json index cd2fdf27f2d0..b44a66613b0a 100644 --- a/homeassistant/components/lock/manifest.json +++ b/homeassistant/components/lock/manifest.json @@ -2,8 +2,6 @@ "domain": "lock", "name": "Lock", "documentation": "https://www.home-assistant.io/integrations/lock", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/lockitron/manifest.json b/homeassistant/components/lockitron/manifest.json index 18ab9036c5ec..088bc847621c 100644 --- a/homeassistant/components/lockitron/manifest.json +++ b/homeassistant/components/lockitron/manifest.json @@ -2,7 +2,5 @@ "domain": "lockitron", "name": "Lockitron", "documentation": "https://www.home-assistant.io/integrations/lockitron", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/logbook/manifest.json b/homeassistant/components/logbook/manifest.json index 9d5c78dc34d5..3980469c9c57 100644 --- a/homeassistant/components/logbook/manifest.json +++ b/homeassistant/components/logbook/manifest.json @@ -2,7 +2,6 @@ "domain": "logbook", "name": "Logbook", "documentation": "https://www.home-assistant.io/integrations/logbook", - "requirements": [], "dependencies": ["frontend", "http", "recorder"], "after_dependencies": ["homekit"], "codeowners": [] diff --git a/homeassistant/components/logentries/manifest.json b/homeassistant/components/logentries/manifest.json index c546030853fa..23500d66dd62 100644 --- a/homeassistant/components/logentries/manifest.json +++ b/homeassistant/components/logentries/manifest.json @@ -2,7 +2,5 @@ "domain": "logentries", "name": "Logentries", "documentation": "https://www.home-assistant.io/integrations/logentries", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/logger/manifest.json b/homeassistant/components/logger/manifest.json index 45f5cc934b21..2cb045382603 100644 --- a/homeassistant/components/logger/manifest.json +++ b/homeassistant/components/logger/manifest.json @@ -2,8 +2,6 @@ "domain": "logger", "name": "Logger", "documentation": "https://www.home-assistant.io/integrations/logger", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/london_air/manifest.json b/homeassistant/components/london_air/manifest.json index c5b9caffa88d..48ba49bee237 100644 --- a/homeassistant/components/london_air/manifest.json +++ b/homeassistant/components/london_air/manifest.json @@ -2,7 +2,5 @@ "domain": "london_air", "name": "London Air", "documentation": "https://www.home-assistant.io/integrations/london_air", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/london_underground/manifest.json b/homeassistant/components/london_underground/manifest.json index a81034e0718e..5dbccea27b10 100644 --- a/homeassistant/components/london_underground/manifest.json +++ b/homeassistant/components/london_underground/manifest.json @@ -3,6 +3,5 @@ "name": "London Underground", "documentation": "https://www.home-assistant.io/integrations/london_underground", "requirements": ["london-tube-status==0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/loopenergy/manifest.json b/homeassistant/components/loopenergy/manifest.json index 88b679fb071d..cf7343af6a43 100644 --- a/homeassistant/components/loopenergy/manifest.json +++ b/homeassistant/components/loopenergy/manifest.json @@ -3,6 +3,5 @@ "name": "Loop Energy", "documentation": "https://www.home-assistant.io/integrations/loopenergy", "requirements": ["pyloopenergy==0.1.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lovelace/manifest.json b/homeassistant/components/lovelace/manifest.json index aa0d706976a5..cc8f6ddab085 100644 --- a/homeassistant/components/lovelace/manifest.json +++ b/homeassistant/components/lovelace/manifest.json @@ -2,7 +2,5 @@ "domain": "lovelace", "name": "Lovelace", "documentation": "https://www.home-assistant.io/integrations/lovelace", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/frontend"] } diff --git a/homeassistant/components/luci/manifest.json b/homeassistant/components/luci/manifest.json index 7fefe89c1dfb..0e8cfb876095 100644 --- a/homeassistant/components/luci/manifest.json +++ b/homeassistant/components/luci/manifest.json @@ -3,6 +3,5 @@ "name": "OpenWRT (luci)", "documentation": "https://www.home-assistant.io/integrations/luci", "requirements": ["openwrt-luci-rpc==1.1.2"], - "dependencies": [], "codeowners": ["@fbradyirl", "@mzdrale"] } diff --git a/homeassistant/components/luftdaten/manifest.json b/homeassistant/components/luftdaten/manifest.json index e6e9110b33a5..e4670680b16c 100644 --- a/homeassistant/components/luftdaten/manifest.json +++ b/homeassistant/components/luftdaten/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/luftdaten", "requirements": ["luftdaten==0.6.4"], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "gold" } diff --git a/homeassistant/components/lupusec/manifest.json b/homeassistant/components/lupusec/manifest.json index 391de3cfc55a..fb9cf64545a1 100644 --- a/homeassistant/components/lupusec/manifest.json +++ b/homeassistant/components/lupusec/manifest.json @@ -3,6 +3,5 @@ "name": "Lupus Electronics LUPUSEC", "documentation": "https://www.home-assistant.io/integrations/lupusec", "requirements": ["lupupy==0.0.18"], - "dependencies": [], "codeowners": ["@majuss"] } diff --git a/homeassistant/components/lutron/manifest.json b/homeassistant/components/lutron/manifest.json index 9eb4fdeaa457..2dbeb51da58e 100644 --- a/homeassistant/components/lutron/manifest.json +++ b/homeassistant/components/lutron/manifest.json @@ -3,6 +3,5 @@ "name": "Lutron", "documentation": "https://www.home-assistant.io/integrations/lutron", "requirements": ["pylutron==0.2.5"], - "dependencies": [], "codeowners": ["@JonGilmore"] } diff --git a/homeassistant/components/lutron_caseta/manifest.json b/homeassistant/components/lutron_caseta/manifest.json index 856bf285a163..831f6ef8bf14 100644 --- a/homeassistant/components/lutron_caseta/manifest.json +++ b/homeassistant/components/lutron_caseta/manifest.json @@ -3,6 +3,5 @@ "name": "Lutron Caseta", "documentation": "https://www.home-assistant.io/integrations/lutron_caseta", "requirements": ["pylutron-caseta==0.6.0"], - "dependencies": [], "codeowners": ["@swails"] } diff --git a/homeassistant/components/lw12wifi/manifest.json b/homeassistant/components/lw12wifi/manifest.json index 014dde12fcb8..27523ccb7c2b 100644 --- a/homeassistant/components/lw12wifi/manifest.json +++ b/homeassistant/components/lw12wifi/manifest.json @@ -3,6 +3,5 @@ "name": "LAGUTE LW-12", "documentation": "https://www.home-assistant.io/integrations/lw12wifi", "requirements": ["lw12==0.9.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/lyft/manifest.json b/homeassistant/components/lyft/manifest.json index ec9fb422d214..7b5ad8df07cd 100644 --- a/homeassistant/components/lyft/manifest.json +++ b/homeassistant/components/lyft/manifest.json @@ -3,6 +3,5 @@ "name": "Lyft", "documentation": "https://www.home-assistant.io/integrations/lyft", "requirements": ["lyft_rides==0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/magicseaweed/manifest.json b/homeassistant/components/magicseaweed/manifest.json index ccd684e1f35d..2edac84c7f54 100644 --- a/homeassistant/components/magicseaweed/manifest.json +++ b/homeassistant/components/magicseaweed/manifest.json @@ -3,6 +3,5 @@ "name": "Magicseaweed", "documentation": "https://www.home-assistant.io/integrations/magicseaweed", "requirements": ["magicseaweed==1.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mailbox/manifest.json b/homeassistant/components/mailbox/manifest.json index 5202569d198c..7bbdcfa78cf3 100644 --- a/homeassistant/components/mailbox/manifest.json +++ b/homeassistant/components/mailbox/manifest.json @@ -2,7 +2,6 @@ "domain": "mailbox", "name": "Mailbox", "documentation": "https://www.home-assistant.io/integrations/mailbox", - "requirements": [], "dependencies": ["http"], "codeowners": [] } diff --git a/homeassistant/components/manual/manifest.json b/homeassistant/components/manual/manifest.json index 29d6cbdf8712..813dbf4e5705 100644 --- a/homeassistant/components/manual/manifest.json +++ b/homeassistant/components/manual/manifest.json @@ -2,8 +2,6 @@ "domain": "manual", "name": "Manual", "documentation": "https://www.home-assistant.io/integrations/manual", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/manual_mqtt/manifest.json b/homeassistant/components/manual_mqtt/manifest.json index 1ae597fecd9e..8189b167f934 100644 --- a/homeassistant/components/manual_mqtt/manifest.json +++ b/homeassistant/components/manual_mqtt/manifest.json @@ -2,7 +2,6 @@ "domain": "manual_mqtt", "name": "Manual MQTT", "documentation": "https://www.home-assistant.io/integrations/manual_mqtt", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/map/manifest.json b/homeassistant/components/map/manifest.json index 108ca8f1772b..f78dcfd20ba3 100644 --- a/homeassistant/components/map/manifest.json +++ b/homeassistant/components/map/manifest.json @@ -2,7 +2,6 @@ "domain": "map", "name": "Map", "documentation": "https://www.home-assistant.io/integrations/map", - "requirements": [], "dependencies": ["frontend"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/marytts/manifest.json b/homeassistant/components/marytts/manifest.json index 74f027fd0766..ba4cea8365fc 100644 --- a/homeassistant/components/marytts/manifest.json +++ b/homeassistant/components/marytts/manifest.json @@ -5,6 +5,5 @@ "requirements": [ "speak2mary==1.4.0" ], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mastodon/manifest.json b/homeassistant/components/mastodon/manifest.json index b73b749cddf3..8c29ba1da35c 100644 --- a/homeassistant/components/mastodon/manifest.json +++ b/homeassistant/components/mastodon/manifest.json @@ -3,6 +3,5 @@ "name": "Mastodon", "documentation": "https://www.home-assistant.io/integrations/mastodon", "requirements": ["Mastodon.py==1.5.1"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/matrix/manifest.json b/homeassistant/components/matrix/manifest.json index f4a92d7e1041..90571d239f62 100644 --- a/homeassistant/components/matrix/manifest.json +++ b/homeassistant/components/matrix/manifest.json @@ -3,6 +3,5 @@ "name": "Matrix", "documentation": "https://www.home-assistant.io/integrations/matrix", "requirements": ["matrix-client==0.3.2"], - "dependencies": [], "codeowners": ["@tinloaf"] } diff --git a/homeassistant/components/maxcube/manifest.json b/homeassistant/components/maxcube/manifest.json index b3ac6591f765..0aae92c2079a 100644 --- a/homeassistant/components/maxcube/manifest.json +++ b/homeassistant/components/maxcube/manifest.json @@ -3,6 +3,5 @@ "name": "eQ-3 MAX!", "documentation": "https://www.home-assistant.io/integrations/maxcube", "requirements": ["maxcube-api==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mcp23017/manifest.json b/homeassistant/components/mcp23017/manifest.json index 8bdd897d34eb..3f7cf97e64ef 100644 --- a/homeassistant/components/mcp23017/manifest.json +++ b/homeassistant/components/mcp23017/manifest.json @@ -7,6 +7,5 @@ "adafruit-blinka==3.9.0", "adafruit-circuitpython-mcp230xx==2.2.2" ], - "dependencies": [], "codeowners": ["@jardiamj"] } diff --git a/homeassistant/components/media_player/manifest.json b/homeassistant/components/media_player/manifest.json index 5c9a5cde0e48..7a8e47adf205 100644 --- a/homeassistant/components/media_player/manifest.json +++ b/homeassistant/components/media_player/manifest.json @@ -2,7 +2,6 @@ "domain": "media_player", "name": "Media Player", "documentation": "https://www.home-assistant.io/integrations/media_player", - "requirements": [], "dependencies": ["http"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/mediaroom/manifest.json b/homeassistant/components/mediaroom/manifest.json index 31a028db61c0..218715f81bf4 100644 --- a/homeassistant/components/mediaroom/manifest.json +++ b/homeassistant/components/mediaroom/manifest.json @@ -3,6 +3,5 @@ "name": "Mediaroom", "documentation": "https://www.home-assistant.io/integrations/mediaroom", "requirements": ["pymediaroom==0.6.4"], - "dependencies": [], "codeowners": ["@dgomes"] } diff --git a/homeassistant/components/melcloud/manifest.json b/homeassistant/components/melcloud/manifest.json index 61fc9e1b7300..04b8b2f5a1e6 100644 --- a/homeassistant/components/melcloud/manifest.json +++ b/homeassistant/components/melcloud/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/melcloud", "requirements": ["pymelcloud==2.4.0"], - "dependencies": [], "codeowners": ["@vilppuvuorinen"] } diff --git a/homeassistant/components/melissa/manifest.json b/homeassistant/components/melissa/manifest.json index bd69a1cc0b22..af29b0382c58 100644 --- a/homeassistant/components/melissa/manifest.json +++ b/homeassistant/components/melissa/manifest.json @@ -3,6 +3,5 @@ "name": "Melissa", "documentation": "https://www.home-assistant.io/integrations/melissa", "requirements": ["py-melissa-climate==2.0.0"], - "dependencies": [], "codeowners": ["@kennedyshead"] } diff --git a/homeassistant/components/meraki/manifest.json b/homeassistant/components/meraki/manifest.json index 2add8663555a..f0de1aa7c1de 100644 --- a/homeassistant/components/meraki/manifest.json +++ b/homeassistant/components/meraki/manifest.json @@ -2,7 +2,6 @@ "domain": "meraki", "name": "Meraki", "documentation": "https://www.home-assistant.io/integrations/meraki", - "requirements": [], "dependencies": ["http"], "codeowners": [] } diff --git a/homeassistant/components/message_bird/manifest.json b/homeassistant/components/message_bird/manifest.json index fb87d06edfbb..91018849449e 100644 --- a/homeassistant/components/message_bird/manifest.json +++ b/homeassistant/components/message_bird/manifest.json @@ -3,6 +3,5 @@ "name": "MessageBird", "documentation": "https://www.home-assistant.io/integrations/message_bird", "requirements": ["messagebird==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/met/manifest.json b/homeassistant/components/met/manifest.json index 62aeaf21de7a..baf2c1b7e3eb 100644 --- a/homeassistant/components/met/manifest.json +++ b/homeassistant/components/met/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/met", "requirements": ["pyMetno==0.4.6"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/meteo_france/manifest.json b/homeassistant/components/meteo_france/manifest.json index 77f8fca984d6..572fd29b5494 100644 --- a/homeassistant/components/meteo_france/manifest.json +++ b/homeassistant/components/meteo_france/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/meteo_france", "requirements": ["meteofrance==0.3.7", "vigilancemeteo==3.0.0"], - "dependencies": [], "codeowners": ["@victorcerutti", "@oncleben31", "@Quentame"] } diff --git a/homeassistant/components/meteoalarm/manifest.json b/homeassistant/components/meteoalarm/manifest.json index 5fc7e7c137cc..116bbdcac6df 100644 --- a/homeassistant/components/meteoalarm/manifest.json +++ b/homeassistant/components/meteoalarm/manifest.json @@ -3,6 +3,5 @@ "name": "MeteoAlarm", "documentation": "https://www.home-assistant.io/integrations/meteoalarm", "requirements": ["meteoalertapi==0.1.6"], - "dependencies": [], "codeowners": ["@rolfberkenbosch"] } diff --git a/homeassistant/components/metoffice/manifest.json b/homeassistant/components/metoffice/manifest.json index 9c16b7687a26..20120d90b182 100644 --- a/homeassistant/components/metoffice/manifest.json +++ b/homeassistant/components/metoffice/manifest.json @@ -3,6 +3,5 @@ "name": "Met Office", "documentation": "https://www.home-assistant.io/integrations/metoffice", "requirements": ["datapoint==0.9.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mfi/manifest.json b/homeassistant/components/mfi/manifest.json index 4e5ab31b1d50..29b9bb1ac697 100644 --- a/homeassistant/components/mfi/manifest.json +++ b/homeassistant/components/mfi/manifest.json @@ -3,6 +3,5 @@ "name": "Ubiquiti mFi mPort", "documentation": "https://www.home-assistant.io/integrations/mfi", "requirements": ["mficlient==0.3.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mhz19/manifest.json b/homeassistant/components/mhz19/manifest.json index 7f160a2e9a43..ea16ac697f1e 100644 --- a/homeassistant/components/mhz19/manifest.json +++ b/homeassistant/components/mhz19/manifest.json @@ -3,6 +3,5 @@ "name": "MH-Z19 CO2 Sensor", "documentation": "https://www.home-assistant.io/integrations/mhz19", "requirements": ["pmsensor==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/microsoft/manifest.json b/homeassistant/components/microsoft/manifest.json index d0947357a514..0e371199a185 100644 --- a/homeassistant/components/microsoft/manifest.json +++ b/homeassistant/components/microsoft/manifest.json @@ -3,6 +3,5 @@ "name": "Microsoft Text-to-Speech (TTS)", "documentation": "https://www.home-assistant.io/integrations/microsoft", "requirements": ["pycsspeechtts==1.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/microsoft_face/manifest.json b/homeassistant/components/microsoft_face/manifest.json index d4ff56d325b5..7677cc989b64 100644 --- a/homeassistant/components/microsoft_face/manifest.json +++ b/homeassistant/components/microsoft_face/manifest.json @@ -2,7 +2,6 @@ "domain": "microsoft_face", "name": "Microsoft Face", "documentation": "https://www.home-assistant.io/integrations/microsoft_face", - "requirements": [], "dependencies": ["camera"], "codeowners": [] } diff --git a/homeassistant/components/microsoft_face_detect/manifest.json b/homeassistant/components/microsoft_face_detect/manifest.json index 7e784fe988b6..ea57b2bb134e 100644 --- a/homeassistant/components/microsoft_face_detect/manifest.json +++ b/homeassistant/components/microsoft_face_detect/manifest.json @@ -2,7 +2,6 @@ "domain": "microsoft_face_detect", "name": "Microsoft Face Detect", "documentation": "https://www.home-assistant.io/integrations/microsoft_face_detect", - "requirements": [], "dependencies": ["microsoft_face"], "codeowners": [] } diff --git a/homeassistant/components/microsoft_face_identify/manifest.json b/homeassistant/components/microsoft_face_identify/manifest.json index dea16ed5afc8..866abde36736 100644 --- a/homeassistant/components/microsoft_face_identify/manifest.json +++ b/homeassistant/components/microsoft_face_identify/manifest.json @@ -2,7 +2,6 @@ "domain": "microsoft_face_identify", "name": "Microsoft Face Identify", "documentation": "https://www.home-assistant.io/integrations/microsoft_face_identify", - "requirements": [], "dependencies": ["microsoft_face"], "codeowners": [] } diff --git a/homeassistant/components/miflora/manifest.json b/homeassistant/components/miflora/manifest.json index 226339791283..fde971541945 100644 --- a/homeassistant/components/miflora/manifest.json +++ b/homeassistant/components/miflora/manifest.json @@ -3,6 +3,5 @@ "name": "Mi Flora", "documentation": "https://www.home-assistant.io/integrations/miflora", "requirements": ["bluepy==1.3.0", "miflora==0.6.0"], - "dependencies": [], "codeowners": ["@danielhiversen", "@ChristianKuehnel"] } diff --git a/homeassistant/components/mikrotik/manifest.json b/homeassistant/components/mikrotik/manifest.json index 72f98a11709c..c87b37685961 100644 --- a/homeassistant/components/mikrotik/manifest.json +++ b/homeassistant/components/mikrotik/manifest.json @@ -6,8 +6,7 @@ "requirements": [ "librouteros==3.0.0" ], - "dependencies": [], "codeowners": [ "@engrbm87" ] -} \ No newline at end of file +} diff --git a/homeassistant/components/mill/manifest.json b/homeassistant/components/mill/manifest.json index f5ca1835a673..07eec93bb657 100644 --- a/homeassistant/components/mill/manifest.json +++ b/homeassistant/components/mill/manifest.json @@ -3,6 +3,5 @@ "name": "Mill", "documentation": "https://www.home-assistant.io/integrations/mill", "requirements": ["millheater==0.3.4"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/min_max/manifest.json b/homeassistant/components/min_max/manifest.json index db3a896a1c38..d4eb6554405c 100644 --- a/homeassistant/components/min_max/manifest.json +++ b/homeassistant/components/min_max/manifest.json @@ -2,8 +2,6 @@ "domain": "min_max", "name": "Min/Max", "documentation": "https://www.home-assistant.io/integrations/min_max", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/minecraft_server/manifest.json b/homeassistant/components/minecraft_server/manifest.json index 0811c168f9f1..6f50b0587622 100644 --- a/homeassistant/components/minecraft_server/manifest.json +++ b/homeassistant/components/minecraft_server/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/minecraft_server", "requirements": ["aiodns==2.0.0", "getmac==0.8.1", "mcstatus==2.3.0"], - "dependencies": [], "codeowners": ["@elmurato"], "quality_scale": "silver" -} \ No newline at end of file +} diff --git a/homeassistant/components/minio/manifest.json b/homeassistant/components/minio/manifest.json index 35f2c56d3da3..ba31bbcb2de7 100644 --- a/homeassistant/components/minio/manifest.json +++ b/homeassistant/components/minio/manifest.json @@ -3,6 +3,5 @@ "name": "Minio", "documentation": "https://www.home-assistant.io/integrations/minio", "requirements": ["minio==4.0.9"], - "dependencies": [], "codeowners": ["@tkislan"] } diff --git a/homeassistant/components/mitemp_bt/manifest.json b/homeassistant/components/mitemp_bt/manifest.json index c87f4988adfa..d35e50a8657c 100644 --- a/homeassistant/components/mitemp_bt/manifest.json +++ b/homeassistant/components/mitemp_bt/manifest.json @@ -3,6 +3,5 @@ "name": "Xiaomi Mijia BLE Temperature and Humidity Sensor", "documentation": "https://www.home-assistant.io/integrations/mitemp_bt", "requirements": ["mitemp_bt==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mjpeg/manifest.json b/homeassistant/components/mjpeg/manifest.json index 6de13808991a..1e2bb33a24cb 100644 --- a/homeassistant/components/mjpeg/manifest.json +++ b/homeassistant/components/mjpeg/manifest.json @@ -2,7 +2,5 @@ "domain": "mjpeg", "name": "MJPEG IP Camera", "documentation": "https://www.home-assistant.io/integrations/mjpeg", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mochad/manifest.json b/homeassistant/components/mochad/manifest.json index c103b8d39226..63bd7405e007 100644 --- a/homeassistant/components/mochad/manifest.json +++ b/homeassistant/components/mochad/manifest.json @@ -3,6 +3,5 @@ "name": "Mochad", "documentation": "https://www.home-assistant.io/integrations/mochad", "requirements": ["pymochad==0.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/modbus/manifest.json b/homeassistant/components/modbus/manifest.json index d1d2a9db5507..a9155c7b628d 100644 --- a/homeassistant/components/modbus/manifest.json +++ b/homeassistant/components/modbus/manifest.json @@ -3,6 +3,5 @@ "name": "Modbus", "documentation": "https://www.home-assistant.io/integrations/modbus", "requirements": ["pymodbus==2.3.0"], - "dependencies": [], "codeowners": ["@adamchengtkc", "@janiversen"] } diff --git a/homeassistant/components/modem_callerid/manifest.json b/homeassistant/components/modem_callerid/manifest.json index a5d516c15ab0..21e9c94943d2 100644 --- a/homeassistant/components/modem_callerid/manifest.json +++ b/homeassistant/components/modem_callerid/manifest.json @@ -3,6 +3,5 @@ "name": "Modem Caller ID", "documentation": "https://www.home-assistant.io/integrations/modem_callerid", "requirements": ["basicmodem==0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mold_indicator/manifest.json b/homeassistant/components/mold_indicator/manifest.json index 3e5518c19306..764faf6e79a8 100644 --- a/homeassistant/components/mold_indicator/manifest.json +++ b/homeassistant/components/mold_indicator/manifest.json @@ -2,8 +2,6 @@ "domain": "mold_indicator", "name": "Mold Indicator", "documentation": "https://www.home-assistant.io/integrations/mold_indicator", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/monoprice/manifest.json b/homeassistant/components/monoprice/manifest.json index d9497c1c29c2..c88673b28553 100644 --- a/homeassistant/components/monoprice/manifest.json +++ b/homeassistant/components/monoprice/manifest.json @@ -3,7 +3,6 @@ "name": "Monoprice 6-Zone Amplifier", "documentation": "https://www.home-assistant.io/integrations/monoprice", "requirements": ["pymonoprice==0.3"], - "dependencies": [], "codeowners": ["@etsinko"], "config_flow": true } diff --git a/homeassistant/components/moon/manifest.json b/homeassistant/components/moon/manifest.json index 508cd8f8867e..8af5f40630c0 100644 --- a/homeassistant/components/moon/manifest.json +++ b/homeassistant/components/moon/manifest.json @@ -2,8 +2,6 @@ "domain": "moon", "name": "Moon", "documentation": "https://www.home-assistant.io/integrations/moon", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/mpchc/manifest.json b/homeassistant/components/mpchc/manifest.json index 89e4b8728713..2ff679315185 100644 --- a/homeassistant/components/mpchc/manifest.json +++ b/homeassistant/components/mpchc/manifest.json @@ -2,7 +2,5 @@ "domain": "mpchc", "name": "Media Player Classic Home Cinema (MPC-HC)", "documentation": "https://www.home-assistant.io/integrations/mpchc", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mpd/manifest.json b/homeassistant/components/mpd/manifest.json index f6230e73a1e9..de7b8b8f0d73 100644 --- a/homeassistant/components/mpd/manifest.json +++ b/homeassistant/components/mpd/manifest.json @@ -3,6 +3,5 @@ "name": "Music Player Daemon (MPD)", "documentation": "https://www.home-assistant.io/integrations/mpd", "requirements": ["python-mpd2==1.0.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/mqtt_eventstream/manifest.json b/homeassistant/components/mqtt_eventstream/manifest.json index 228269babe96..87eb6bee31e2 100644 --- a/homeassistant/components/mqtt_eventstream/manifest.json +++ b/homeassistant/components/mqtt_eventstream/manifest.json @@ -2,7 +2,6 @@ "domain": "mqtt_eventstream", "name": "MQTT Eventstream", "documentation": "https://www.home-assistant.io/integrations/mqtt_eventstream", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/mqtt_json/manifest.json b/homeassistant/components/mqtt_json/manifest.json index 7f3e21650857..353ca20d5d77 100644 --- a/homeassistant/components/mqtt_json/manifest.json +++ b/homeassistant/components/mqtt_json/manifest.json @@ -2,7 +2,6 @@ "domain": "mqtt_json", "name": "MQTT JSON", "documentation": "https://www.home-assistant.io/integrations/mqtt_json", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/mqtt_room/manifest.json b/homeassistant/components/mqtt_room/manifest.json index c3cd7de3a061..814435ea8355 100644 --- a/homeassistant/components/mqtt_room/manifest.json +++ b/homeassistant/components/mqtt_room/manifest.json @@ -2,7 +2,6 @@ "domain": "mqtt_room", "name": "MQTT Room Presence", "documentation": "https://www.home-assistant.io/integrations/mqtt_room", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/mqtt_statestream/manifest.json b/homeassistant/components/mqtt_statestream/manifest.json index fdf85d21fa50..eb8556d8d9ff 100644 --- a/homeassistant/components/mqtt_statestream/manifest.json +++ b/homeassistant/components/mqtt_statestream/manifest.json @@ -2,7 +2,6 @@ "domain": "mqtt_statestream", "name": "MQTT Statestream", "documentation": "https://www.home-assistant.io/integrations/mqtt_statestream", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/msteams/manifest.json b/homeassistant/components/msteams/manifest.json index f907cf570bb9..184e50915a55 100644 --- a/homeassistant/components/msteams/manifest.json +++ b/homeassistant/components/msteams/manifest.json @@ -3,6 +3,5 @@ "name": "Microsoft Teams", "documentation": "https://www.home-assistant.io/integrations/msteams", "requirements": ["pymsteams==0.1.12"], - "dependencies": [], "codeowners": ["@peroyvind"] } diff --git a/homeassistant/components/mvglive/manifest.json b/homeassistant/components/mvglive/manifest.json index 3df5234f9637..e676cb0438cf 100644 --- a/homeassistant/components/mvglive/manifest.json +++ b/homeassistant/components/mvglive/manifest.json @@ -3,6 +3,5 @@ "name": "MVG", "documentation": "https://www.home-assistant.io/integrations/mvglive", "requirements": ["PyMVGLive==1.1.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mychevy/manifest.json b/homeassistant/components/mychevy/manifest.json index 93382974005e..aa7440563da7 100644 --- a/homeassistant/components/mychevy/manifest.json +++ b/homeassistant/components/mychevy/manifest.json @@ -3,6 +3,5 @@ "name": "myChevrolet", "documentation": "https://www.home-assistant.io/integrations/mychevy", "requirements": ["mychevy==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/mycroft/manifest.json b/homeassistant/components/mycroft/manifest.json index 5b9dfad5d378..33fafacaa888 100644 --- a/homeassistant/components/mycroft/manifest.json +++ b/homeassistant/components/mycroft/manifest.json @@ -3,6 +3,5 @@ "name": "Mycroft", "documentation": "https://www.home-assistant.io/integrations/mycroft", "requirements": ["mycroftapi==2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/myq/manifest.json b/homeassistant/components/myq/manifest.json index afee7d4d77f6..460b6f50bd41 100644 --- a/homeassistant/components/myq/manifest.json +++ b/homeassistant/components/myq/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "pymyq==2.0.1" ], - "dependencies": [], "codeowners": ["@bdraco"], "config_flow": true, "homekit": { diff --git a/homeassistant/components/mysensors/manifest.json b/homeassistant/components/mysensors/manifest.json index b691bbafee24..afeeb5d57cc9 100644 --- a/homeassistant/components/mysensors/manifest.json +++ b/homeassistant/components/mysensors/manifest.json @@ -3,7 +3,6 @@ "name": "MySensors", "documentation": "https://www.home-assistant.io/integrations/mysensors", "requirements": ["pymysensors==0.18.0"], - "dependencies": [], "after_dependencies": ["mqtt"], "codeowners": ["@MartinHjelmare"] } diff --git a/homeassistant/components/mythicbeastsdns/manifest.json b/homeassistant/components/mythicbeastsdns/manifest.json index 2df68f084f88..b710cd05c130 100644 --- a/homeassistant/components/mythicbeastsdns/manifest.json +++ b/homeassistant/components/mythicbeastsdns/manifest.json @@ -3,6 +3,5 @@ "name": "Mythic Beasts DNS", "documentation": "https://www.home-assistant.io/integrations/mythicbeastsdns", "requirements": ["mbddns==0.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/n26/manifest.json b/homeassistant/components/n26/manifest.json index ff763b951a4c..2dec0e6ba2de 100644 --- a/homeassistant/components/n26/manifest.json +++ b/homeassistant/components/n26/manifest.json @@ -3,6 +3,5 @@ "name": "N26", "documentation": "https://www.home-assistant.io/integrations/n26", "requirements": ["n26==0.2.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nad/manifest.json b/homeassistant/components/nad/manifest.json index beb4a166f121..03742c8fb736 100644 --- a/homeassistant/components/nad/manifest.json +++ b/homeassistant/components/nad/manifest.json @@ -3,6 +3,5 @@ "name": "NAD", "documentation": "https://www.home-assistant.io/integrations/nad", "requirements": ["nad_receiver==0.0.11"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/namecheapdns/manifest.json b/homeassistant/components/namecheapdns/manifest.json index f743bfa5f42f..9015f2dc8470 100644 --- a/homeassistant/components/namecheapdns/manifest.json +++ b/homeassistant/components/namecheapdns/manifest.json @@ -3,6 +3,5 @@ "name": "Namecheap FreeDNS", "documentation": "https://www.home-assistant.io/integrations/namecheapdns", "requirements": ["defusedxml==0.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nanoleaf/manifest.json b/homeassistant/components/nanoleaf/manifest.json index 0da755e1663d..6d953335a346 100644 --- a/homeassistant/components/nanoleaf/manifest.json +++ b/homeassistant/components/nanoleaf/manifest.json @@ -3,6 +3,5 @@ "name": "Nanoleaf", "documentation": "https://www.home-assistant.io/integrations/nanoleaf", "requirements": ["pynanoleaf==0.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/neato/manifest.json b/homeassistant/components/neato/manifest.json index af44874799b9..d36e3fa503fb 100644 --- a/homeassistant/components/neato/manifest.json +++ b/homeassistant/components/neato/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/neato", "requirements": ["pybotvac==0.0.17"], - "dependencies": [], "codeowners": ["@dshokouhi", "@Santobert"] } diff --git a/homeassistant/components/nederlandse_spoorwegen/manifest.json b/homeassistant/components/nederlandse_spoorwegen/manifest.json index c6025abe0b52..10291802fed8 100644 --- a/homeassistant/components/nederlandse_spoorwegen/manifest.json +++ b/homeassistant/components/nederlandse_spoorwegen/manifest.json @@ -3,6 +3,5 @@ "name": "Nederlandse Spoorwegen (NS)", "documentation": "https://www.home-assistant.io/integrations/nederlandse_spoorwegen", "requirements": ["nsapi==3.0.3"], - "dependencies": [], "codeowners": ["@YarmoM"] } diff --git a/homeassistant/components/nello/manifest.json b/homeassistant/components/nello/manifest.json index 06ca6931bc7f..b7ae9237f3d7 100644 --- a/homeassistant/components/nello/manifest.json +++ b/homeassistant/components/nello/manifest.json @@ -3,6 +3,5 @@ "name": "Nello", "documentation": "https://www.home-assistant.io/integrations/nello", "requirements": ["pynello==2.0.2"], - "dependencies": [], "codeowners": ["@pschmitt"] } diff --git a/homeassistant/components/ness_alarm/manifest.json b/homeassistant/components/ness_alarm/manifest.json index 3cbed89b18cb..1977328c33a1 100644 --- a/homeassistant/components/ness_alarm/manifest.json +++ b/homeassistant/components/ness_alarm/manifest.json @@ -3,6 +3,5 @@ "name": "Ness Alarm", "documentation": "https://www.home-assistant.io/integrations/ness_alarm", "requirements": ["nessclient==0.9.15"], - "dependencies": [], "codeowners": ["@nickw444"] } diff --git a/homeassistant/components/nest/manifest.json b/homeassistant/components/nest/manifest.json index c14f5982da0b..610e80d9a6a1 100644 --- a/homeassistant/components/nest/manifest.json +++ b/homeassistant/components/nest/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/nest", "requirements": ["python-nest==4.1.0"], - "dependencies": [], "codeowners": ["@awarecan"] } diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index fc140420d7b3..4efefd061da8 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -23,4 +23,4 @@ "Welcome" ] } -} \ No newline at end of file +} diff --git a/homeassistant/components/netdata/manifest.json b/homeassistant/components/netdata/manifest.json index cfddfe9d208e..d1394f5526f1 100644 --- a/homeassistant/components/netdata/manifest.json +++ b/homeassistant/components/netdata/manifest.json @@ -3,6 +3,5 @@ "name": "Netdata", "documentation": "https://www.home-assistant.io/integrations/netdata", "requirements": ["netdata==0.1.2"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/netgear/manifest.json b/homeassistant/components/netgear/manifest.json index c5685411045a..1126bbe558f3 100644 --- a/homeassistant/components/netgear/manifest.json +++ b/homeassistant/components/netgear/manifest.json @@ -3,6 +3,5 @@ "name": "NETGEAR", "documentation": "https://www.home-assistant.io/integrations/netgear", "requirements": ["pynetgear==0.6.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/netgear_lte/manifest.json b/homeassistant/components/netgear_lte/manifest.json index 43cf6e34480c..9f91a3a66c07 100644 --- a/homeassistant/components/netgear_lte/manifest.json +++ b/homeassistant/components/netgear_lte/manifest.json @@ -3,6 +3,5 @@ "name": "NETGEAR LTE", "documentation": "https://www.home-assistant.io/integrations/netgear_lte", "requirements": ["eternalegypt==0.0.11"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/neurio_energy/manifest.json b/homeassistant/components/neurio_energy/manifest.json index 06b8b6bce831..bba814966dfd 100644 --- a/homeassistant/components/neurio_energy/manifest.json +++ b/homeassistant/components/neurio_energy/manifest.json @@ -3,6 +3,5 @@ "name": "Neurio energy", "documentation": "https://www.home-assistant.io/integrations/neurio_energy", "requirements": ["neurio==0.3.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index 06130f605ef1..5fb38f9b71d3 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -4,7 +4,6 @@ "requirements": [ "nexia==0.7.3" ], - "dependencies": [], "codeowners": [ "@ryannazaretian", "@bdraco" ], diff --git a/homeassistant/components/nextbus/manifest.json b/homeassistant/components/nextbus/manifest.json index 581d5d626930..0f32505536a7 100644 --- a/homeassistant/components/nextbus/manifest.json +++ b/homeassistant/components/nextbus/manifest.json @@ -2,7 +2,6 @@ "domain": "nextbus", "name": "NextBus", "documentation": "https://www.home-assistant.io/integrations/nextbus", - "dependencies": [], "codeowners": ["@vividboarder"], "requirements": ["py_nextbusnext==0.1.4"] } diff --git a/homeassistant/components/nextcloud/manifest.json b/homeassistant/components/nextcloud/manifest.json index 4db0019920d4..414d65fc3cce 100644 --- a/homeassistant/components/nextcloud/manifest.json +++ b/homeassistant/components/nextcloud/manifest.json @@ -5,8 +5,7 @@ "requirements": [ "nextcloudmonitor==1.1.0" ], - "dependencies": [], "codeowners": [ "@meichthys" ] -} \ No newline at end of file +} diff --git a/homeassistant/components/nfandroidtv/manifest.json b/homeassistant/components/nfandroidtv/manifest.json index 859a704cc63c..e727c47b1e32 100644 --- a/homeassistant/components/nfandroidtv/manifest.json +++ b/homeassistant/components/nfandroidtv/manifest.json @@ -2,7 +2,5 @@ "domain": "nfandroidtv", "name": "Notifications for Android TV / FireTV", "documentation": "https://www.home-assistant.io/integrations/nfandroidtv", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/niko_home_control/manifest.json b/homeassistant/components/niko_home_control/manifest.json index 2a8ec9ab2709..f9e3cf8573b9 100644 --- a/homeassistant/components/niko_home_control/manifest.json +++ b/homeassistant/components/niko_home_control/manifest.json @@ -3,6 +3,5 @@ "name": "Niko Home Control", "documentation": "https://www.home-assistant.io/integrations/niko_home_control", "requirements": ["niko-home-control==0.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nilu/manifest.json b/homeassistant/components/nilu/manifest.json index df4e704200f6..1eb946429027 100644 --- a/homeassistant/components/nilu/manifest.json +++ b/homeassistant/components/nilu/manifest.json @@ -3,6 +3,5 @@ "name": "Norwegian Institute for Air Research (NILU)", "documentation": "https://www.home-assistant.io/integrations/nilu", "requirements": ["niluclient==0.1.2"], - "dependencies": [], "codeowners": ["@hfurubotten"] } diff --git a/homeassistant/components/nissan_leaf/manifest.json b/homeassistant/components/nissan_leaf/manifest.json index 717eb0d1d6a2..339b5750036d 100644 --- a/homeassistant/components/nissan_leaf/manifest.json +++ b/homeassistant/components/nissan_leaf/manifest.json @@ -3,6 +3,5 @@ "name": "Nissan Leaf", "documentation": "https://www.home-assistant.io/integrations/nissan_leaf", "requirements": ["pycarwings2==2.9"], - "dependencies": [], "codeowners": ["@filcole"] } diff --git a/homeassistant/components/nmap_tracker/manifest.json b/homeassistant/components/nmap_tracker/manifest.json index 2d3aa0437fe5..4e1d7d9a8fda 100644 --- a/homeassistant/components/nmap_tracker/manifest.json +++ b/homeassistant/components/nmap_tracker/manifest.json @@ -3,6 +3,5 @@ "name": "Nmap Tracker", "documentation": "https://www.home-assistant.io/integrations/nmap_tracker", "requirements": ["python-nmap==0.6.1", "getmac==0.8.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nmbs/manifest.json b/homeassistant/components/nmbs/manifest.json index 89de2288c549..e9b1d1ecbf75 100644 --- a/homeassistant/components/nmbs/manifest.json +++ b/homeassistant/components/nmbs/manifest.json @@ -3,6 +3,5 @@ "name": "NMBS", "documentation": "https://www.home-assistant.io/integrations/nmbs", "requirements": ["pyrail==0.0.3"], - "dependencies": [], "codeowners": ["@thibmaek"] } diff --git a/homeassistant/components/no_ip/manifest.json b/homeassistant/components/no_ip/manifest.json index d192b7160085..8294ba650721 100644 --- a/homeassistant/components/no_ip/manifest.json +++ b/homeassistant/components/no_ip/manifest.json @@ -2,7 +2,5 @@ "domain": "no_ip", "name": "No-IP.com", "documentation": "https://www.home-assistant.io/integrations/no_ip", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/noaa_tides/manifest.json b/homeassistant/components/noaa_tides/manifest.json index 9bb9d7b2f1fd..3e95ff523b79 100644 --- a/homeassistant/components/noaa_tides/manifest.json +++ b/homeassistant/components/noaa_tides/manifest.json @@ -3,6 +3,5 @@ "name": "NOAA Tides", "documentation": "https://www.home-assistant.io/integrations/noaa_tides", "requirements": ["py_noaa==0.3.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/norway_air/manifest.json b/homeassistant/components/norway_air/manifest.json index 62218c52174f..515d4eea6bbe 100644 --- a/homeassistant/components/norway_air/manifest.json +++ b/homeassistant/components/norway_air/manifest.json @@ -3,6 +3,5 @@ "name": "Om Luftkvalitet i Norge (Norway Air)", "documentation": "https://www.home-assistant.io/integrations/norway_air", "requirements": ["pyMetno==0.4.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/notify/manifest.json b/homeassistant/components/notify/manifest.json index 5361947bfd9b..b32295a10a66 100644 --- a/homeassistant/components/notify/manifest.json +++ b/homeassistant/components/notify/manifest.json @@ -2,8 +2,6 @@ "domain": "notify", "name": "Notifications", "documentation": "https://www.home-assistant.io/integrations/notify", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/notion/manifest.json b/homeassistant/components/notion/manifest.json index 6afcc74a7131..94d123ed17f0 100644 --- a/homeassistant/components/notion/manifest.json +++ b/homeassistant/components/notion/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/notion", "requirements": ["aionotion==1.1.0"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/nsw_fuel_station/manifest.json b/homeassistant/components/nsw_fuel_station/manifest.json index 0a76c46ba2c3..bdc9847c14fc 100644 --- a/homeassistant/components/nsw_fuel_station/manifest.json +++ b/homeassistant/components/nsw_fuel_station/manifest.json @@ -3,6 +3,5 @@ "name": "NSW Fuel Station Price", "documentation": "https://www.home-assistant.io/integrations/nsw_fuel_station", "requirements": ["nsw-fuel-api-client==1.0.10"], - "dependencies": [], "codeowners": ["@nickw444"] } diff --git a/homeassistant/components/nsw_rural_fire_service_feed/manifest.json b/homeassistant/components/nsw_rural_fire_service_feed/manifest.json index 1c2aa268ca28..aa8275ad0842 100644 --- a/homeassistant/components/nsw_rural_fire_service_feed/manifest.json +++ b/homeassistant/components/nsw_rural_fire_service_feed/manifest.json @@ -3,6 +3,5 @@ "name": "NSW Rural Fire Service Incidents", "documentation": "https://www.home-assistant.io/integrations/nsw_rural_fire_service_feed", "requirements": ["aio_geojson_nsw_rfs_incidents==0.3"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/nuheat/manifest.json b/homeassistant/components/nuheat/manifest.json index ef78870854c3..7ca81862ca77 100644 --- a/homeassistant/components/nuheat/manifest.json +++ b/homeassistant/components/nuheat/manifest.json @@ -3,7 +3,6 @@ "name": "NuHeat", "documentation": "https://www.home-assistant.io/integrations/nuheat", "requirements": ["nuheat==0.3.0"], - "dependencies": [], "codeowners": ["@bdraco"], "config_flow": true } diff --git a/homeassistant/components/nuimo_controller/manifest.json b/homeassistant/components/nuimo_controller/manifest.json index 58969bcafe28..dddd4a975231 100644 --- a/homeassistant/components/nuimo_controller/manifest.json +++ b/homeassistant/components/nuimo_controller/manifest.json @@ -3,6 +3,5 @@ "name": "Nuimo controller", "documentation": "https://www.home-assistant.io/integrations/nuimo_controller", "requirements": ["--only-binary=all nuimo==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nuki/manifest.json b/homeassistant/components/nuki/manifest.json index 77043f37134f..a51ff3752a52 100644 --- a/homeassistant/components/nuki/manifest.json +++ b/homeassistant/components/nuki/manifest.json @@ -3,6 +3,5 @@ "name": "Nuki", "documentation": "https://www.home-assistant.io/integrations/nuki", "requirements": ["pynuki==1.3.3"], - "dependencies": [], "codeowners": ["@pvizeli"] } diff --git a/homeassistant/components/nut/manifest.json b/homeassistant/components/nut/manifest.json index 26accb5edb8d..ddd200dfa043 100644 --- a/homeassistant/components/nut/manifest.json +++ b/homeassistant/components/nut/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "pynut2==2.1.2" ], - "dependencies": [], "codeowners": ["@bdraco"], "config_flow": true } diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index 2bb77c2d95b5..17c4c9062668 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -2,7 +2,6 @@ "domain": "nws", "name": "National Weather Service (NWS)", "documentation": "https://www.home-assistant.io/integrations/nws", - "dependencies": [], "codeowners": ["@MatthewFlamm"], "requirements": ["pynws==0.10.4"] } diff --git a/homeassistant/components/nx584/manifest.json b/homeassistant/components/nx584/manifest.json index 72d9a2707751..3246280b63d7 100644 --- a/homeassistant/components/nx584/manifest.json +++ b/homeassistant/components/nx584/manifest.json @@ -3,6 +3,5 @@ "name": "NX584", "documentation": "https://www.home-assistant.io/integrations/nx584", "requirements": ["pynx584==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/nzbget/manifest.json b/homeassistant/components/nzbget/manifest.json index a72ede807e20..9aa84942cc57 100644 --- a/homeassistant/components/nzbget/manifest.json +++ b/homeassistant/components/nzbget/manifest.json @@ -3,6 +3,5 @@ "name": "NZBGet", "documentation": "https://www.home-assistant.io/integrations/nzbget", "requirements": ["pynzbgetapi==0.2.0"], - "dependencies": [], "codeowners": ["@chriscla"] } diff --git a/homeassistant/components/oasa_telematics/manifest.json b/homeassistant/components/oasa_telematics/manifest.json index 0d524094b102..84f5e78fec26 100644 --- a/homeassistant/components/oasa_telematics/manifest.json +++ b/homeassistant/components/oasa_telematics/manifest.json @@ -3,6 +3,5 @@ "name": "OASA Telematics", "documentation": "https://www.home-assistant.io/integrations/oasa_telematics/", "requirements": ["oasatelematics==0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/obihai/manifest.json b/homeassistant/components/obihai/manifest.json index de85a85842a0..bbcb2e4bc851 100644 --- a/homeassistant/components/obihai/manifest.json +++ b/homeassistant/components/obihai/manifest.json @@ -3,6 +3,5 @@ "name": "Obihai", "documentation": "https://www.home-assistant.io/integrations/obihai", "requirements": ["pyobihai==1.2.1"], - "dependencies": [], "codeowners": ["@dshokouhi"] } diff --git a/homeassistant/components/octoprint/manifest.json b/homeassistant/components/octoprint/manifest.json index 98e7c320a609..28e09cc7be95 100644 --- a/homeassistant/components/octoprint/manifest.json +++ b/homeassistant/components/octoprint/manifest.json @@ -2,8 +2,6 @@ "domain": "octoprint", "name": "OctoPrint", "documentation": "https://www.home-assistant.io/integrations/octoprint", - "requirements": [], - "dependencies": [], "after_dependencies": ["discovery"], "codeowners": [] } diff --git a/homeassistant/components/oem/manifest.json b/homeassistant/components/oem/manifest.json index 8be08a6e0dda..4609cf9e2f2b 100644 --- a/homeassistant/components/oem/manifest.json +++ b/homeassistant/components/oem/manifest.json @@ -3,6 +3,5 @@ "name": "OpenEnergyMonitor WiFi Thermostat", "documentation": "https://www.home-assistant.io/integrations/oem", "requirements": ["oemthermostat==1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ohmconnect/manifest.json b/homeassistant/components/ohmconnect/manifest.json index 0a3fbe678acb..3eb0d4758af1 100644 --- a/homeassistant/components/ohmconnect/manifest.json +++ b/homeassistant/components/ohmconnect/manifest.json @@ -3,6 +3,5 @@ "name": "OhmConnect", "documentation": "https://www.home-assistant.io/integrations/ohmconnect", "requirements": ["defusedxml==0.6.0"], - "dependencies": [], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/ombi/manifest.json b/homeassistant/components/ombi/manifest.json index a2629a8fdca0..f61555495c32 100644 --- a/homeassistant/components/ombi/manifest.json +++ b/homeassistant/components/ombi/manifest.json @@ -2,7 +2,6 @@ "domain": "ombi", "name": "Ombi", "documentation": "https://www.home-assistant.io/integrations/ombi/", - "dependencies": [], "codeowners": ["@larssont"], "requirements": ["pyombi==0.1.10"] } diff --git a/homeassistant/components/onboarding/manifest.json b/homeassistant/components/onboarding/manifest.json index 203918b98166..81e88e99edb2 100644 --- a/homeassistant/components/onboarding/manifest.json +++ b/homeassistant/components/onboarding/manifest.json @@ -2,7 +2,6 @@ "domain": "onboarding", "name": "Home Assistant Onboarding", "documentation": "https://www.home-assistant.io/integrations/onboarding", - "requirements": [], "dependencies": ["auth", "http", "person"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/onewire/manifest.json b/homeassistant/components/onewire/manifest.json index 13000caa8b11..f812454ae599 100644 --- a/homeassistant/components/onewire/manifest.json +++ b/homeassistant/components/onewire/manifest.json @@ -3,6 +3,5 @@ "name": "1-Wire", "documentation": "https://www.home-assistant.io/integrations/onewire", "requirements": ["pyownet==0.10.0.post1"], - "dependencies": [], "codeowners": ["@garbled1"] } diff --git a/homeassistant/components/onkyo/manifest.json b/homeassistant/components/onkyo/manifest.json index 857fc11f15f8..a1a7659bae50 100644 --- a/homeassistant/components/onkyo/manifest.json +++ b/homeassistant/components/onkyo/manifest.json @@ -3,6 +3,5 @@ "name": "Onkyo", "documentation": "https://www.home-assistant.io/integrations/onkyo", "requirements": ["onkyo-eiscp==1.2.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/openalpr_cloud/manifest.json b/homeassistant/components/openalpr_cloud/manifest.json index 00662f31ed8c..dbb8253ff96d 100644 --- a/homeassistant/components/openalpr_cloud/manifest.json +++ b/homeassistant/components/openalpr_cloud/manifest.json @@ -2,7 +2,5 @@ "domain": "openalpr_cloud", "name": "OpenALPR Cloud", "documentation": "https://www.home-assistant.io/integrations/openalpr_cloud", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/openalpr_local/manifest.json b/homeassistant/components/openalpr_local/manifest.json index c5521b056ced..29b9c3a07d80 100644 --- a/homeassistant/components/openalpr_local/manifest.json +++ b/homeassistant/components/openalpr_local/manifest.json @@ -2,7 +2,5 @@ "domain": "openalpr_local", "name": "OpenALPR Local", "documentation": "https://www.home-assistant.io/integrations/openalpr_local", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/opencv/manifest.json b/homeassistant/components/opencv/manifest.json index 0ba1ad6c9e37..fd7f2b4064ab 100644 --- a/homeassistant/components/opencv/manifest.json +++ b/homeassistant/components/opencv/manifest.json @@ -6,6 +6,5 @@ "numpy==1.18.1", "opencv-python-headless==4.2.0.32" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/openevse/manifest.json b/homeassistant/components/openevse/manifest.json index daa5d283b2be..c9b11a756907 100644 --- a/homeassistant/components/openevse/manifest.json +++ b/homeassistant/components/openevse/manifest.json @@ -3,6 +3,5 @@ "name": "OpenEVSE", "documentation": "https://www.home-assistant.io/integrations/openevse", "requirements": ["openevsewifi==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/openexchangerates/manifest.json b/homeassistant/components/openexchangerates/manifest.json index d707ded51884..60484aca77c7 100644 --- a/homeassistant/components/openexchangerates/manifest.json +++ b/homeassistant/components/openexchangerates/manifest.json @@ -2,7 +2,5 @@ "domain": "openexchangerates", "name": "Open Exchange Rates", "documentation": "https://www.home-assistant.io/integrations/openexchangerates", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/opengarage/manifest.json b/homeassistant/components/opengarage/manifest.json index 87b0e65dcd53..1cd5847dd9d3 100644 --- a/homeassistant/components/opengarage/manifest.json +++ b/homeassistant/components/opengarage/manifest.json @@ -2,7 +2,5 @@ "domain": "opengarage", "name": "OpenGarage", "documentation": "https://www.home-assistant.io/integrations/opengarage", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/openhardwaremonitor/manifest.json b/homeassistant/components/openhardwaremonitor/manifest.json index 069cac06f3cb..242b00175d85 100644 --- a/homeassistant/components/openhardwaremonitor/manifest.json +++ b/homeassistant/components/openhardwaremonitor/manifest.json @@ -2,7 +2,5 @@ "domain": "openhardwaremonitor", "name": "Open Hardware Monitor", "documentation": "https://www.home-assistant.io/integrations/openhardwaremonitor", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/openhome/manifest.json b/homeassistant/components/openhome/manifest.json index ed10387bda19..8105c01dfc5f 100644 --- a/homeassistant/components/openhome/manifest.json +++ b/homeassistant/components/openhome/manifest.json @@ -3,6 +3,5 @@ "name": "Linn / OpenHome", "documentation": "https://www.home-assistant.io/integrations/openhome", "requirements": ["openhomedevice==0.6.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/opensensemap/manifest.json b/homeassistant/components/opensensemap/manifest.json index ca783bbc465a..780f5f59020d 100644 --- a/homeassistant/components/opensensemap/manifest.json +++ b/homeassistant/components/opensensemap/manifest.json @@ -3,6 +3,5 @@ "name": "openSenseMap", "documentation": "https://www.home-assistant.io/integrations/opensensemap", "requirements": ["opensensemap-api==0.1.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/opensky/manifest.json b/homeassistant/components/opensky/manifest.json index 99ffd81a04e0..17479b70de78 100644 --- a/homeassistant/components/opensky/manifest.json +++ b/homeassistant/components/opensky/manifest.json @@ -2,7 +2,5 @@ "domain": "opensky", "name": "OpenSky Network", "documentation": "https://www.home-assistant.io/integrations/opensky", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/opentherm_gw/manifest.json b/homeassistant/components/opentherm_gw/manifest.json index d0cbb4351c73..558f4adced89 100644 --- a/homeassistant/components/opentherm_gw/manifest.json +++ b/homeassistant/components/opentherm_gw/manifest.json @@ -3,7 +3,6 @@ "name": "OpenTherm Gateway", "documentation": "https://www.home-assistant.io/integrations/opentherm_gw", "requirements": ["pyotgw==0.6b1"], - "dependencies": [], "codeowners": ["@mvn23"], "config_flow": true } diff --git a/homeassistant/components/openuv/manifest.json b/homeassistant/components/openuv/manifest.json index 2366542167d8..d1045e3eca96 100644 --- a/homeassistant/components/openuv/manifest.json +++ b/homeassistant/components/openuv/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/openuv", "requirements": ["pyopenuv==1.0.9"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/openweathermap/manifest.json b/homeassistant/components/openweathermap/manifest.json index 4424b53cf0d6..eafbfbe243cf 100644 --- a/homeassistant/components/openweathermap/manifest.json +++ b/homeassistant/components/openweathermap/manifest.json @@ -3,6 +3,5 @@ "name": "Openweathermap", "documentation": "https://www.home-assistant.io/integrations/openweathermap", "requirements": ["pyowm==2.10.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/opnsense/manifest.json b/homeassistant/components/opnsense/manifest.json index 858316801029..8cc77da7cfa1 100644 --- a/homeassistant/components/opnsense/manifest.json +++ b/homeassistant/components/opnsense/manifest.json @@ -5,6 +5,5 @@ "requirements": [ "pyopnsense==0.2.0" ], - "dependencies": [], "codeowners": ["@mtreinish"] } diff --git a/homeassistant/components/opple/manifest.json b/homeassistant/components/opple/manifest.json index 331db0eeaefe..bb6596c47ef9 100644 --- a/homeassistant/components/opple/manifest.json +++ b/homeassistant/components/opple/manifest.json @@ -3,6 +3,5 @@ "name": "Opple", "documentation": "https://www.home-assistant.io/integrations/opple", "requirements": ["pyoppleio==1.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/orangepi_gpio/manifest.json b/homeassistant/components/orangepi_gpio/manifest.json index 19f805f1132e..fd0945655d5c 100644 --- a/homeassistant/components/orangepi_gpio/manifest.json +++ b/homeassistant/components/orangepi_gpio/manifest.json @@ -3,6 +3,5 @@ "name": "Orangepi GPIO", "documentation": "https://www.home-assistant.io/integrations/orangepi_gpio", "requirements": ["OPi.GPIO==0.4.0"], - "dependencies": [], "codeowners": ["@pascallj"] } diff --git a/homeassistant/components/oru/manifest.json b/homeassistant/components/oru/manifest.json index 6d93d0407c4f..1be40a72d1c5 100644 --- a/homeassistant/components/oru/manifest.json +++ b/homeassistant/components/oru/manifest.json @@ -2,7 +2,6 @@ "domain": "oru", "name": "Orange and Rockland Utility (ORU)", "documentation": "https://www.home-assistant.io/integrations/oru", - "dependencies": [], "codeowners": ["@bvlaicu"], "requirements": ["oru==0.1.11"] } diff --git a/homeassistant/components/orvibo/manifest.json b/homeassistant/components/orvibo/manifest.json index 0c4a9f2d8202..83b5d644898f 100644 --- a/homeassistant/components/orvibo/manifest.json +++ b/homeassistant/components/orvibo/manifest.json @@ -3,6 +3,5 @@ "name": "Orvibo", "documentation": "https://www.home-assistant.io/integrations/orvibo", "requirements": ["orvibo==1.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/osramlightify/manifest.json b/homeassistant/components/osramlightify/manifest.json index 87a81e74bbbb..dfe71d4b9e1e 100644 --- a/homeassistant/components/osramlightify/manifest.json +++ b/homeassistant/components/osramlightify/manifest.json @@ -3,6 +3,5 @@ "name": "Osramlightify", "documentation": "https://www.home-assistant.io/integrations/osramlightify", "requirements": ["lightify==1.0.7.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/otp/manifest.json b/homeassistant/components/otp/manifest.json index 2230ea8a4785..cfd84eb20693 100644 --- a/homeassistant/components/otp/manifest.json +++ b/homeassistant/components/otp/manifest.json @@ -3,7 +3,6 @@ "name": "One-Time Password (OTP)", "documentation": "https://www.home-assistant.io/integrations/otp", "requirements": ["pyotp==2.3.0"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/panasonic_bluray/manifest.json b/homeassistant/components/panasonic_bluray/manifest.json index 03fb171fc6f2..c7e50c1c91a4 100644 --- a/homeassistant/components/panasonic_bluray/manifest.json +++ b/homeassistant/components/panasonic_bluray/manifest.json @@ -3,6 +3,5 @@ "name": "Panasonic Blu-Ray Player", "documentation": "https://www.home-assistant.io/integrations/panasonic_bluray", "requirements": ["panacotta==0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/panasonic_viera/manifest.json b/homeassistant/components/panasonic_viera/manifest.json index 5438ae1a2c56..674c720ec6af 100644 --- a/homeassistant/components/panasonic_viera/manifest.json +++ b/homeassistant/components/panasonic_viera/manifest.json @@ -3,6 +3,5 @@ "name": "Panasonic Viera TV", "documentation": "https://www.home-assistant.io/integrations/panasonic_viera", "requirements": ["panasonic_viera==0.3.2", "wakeonlan==1.1.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pandora/manifest.json b/homeassistant/components/pandora/manifest.json index f2d1cfbc23ba..9ecb5b4b29d2 100644 --- a/homeassistant/components/pandora/manifest.json +++ b/homeassistant/components/pandora/manifest.json @@ -3,6 +3,5 @@ "name": "Pandora", "documentation": "https://www.home-assistant.io/integrations/pandora", "requirements": ["pexpect==4.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/panel_custom/manifest.json b/homeassistant/components/panel_custom/manifest.json index 3aa0f1e3b296..59d20b677e94 100644 --- a/homeassistant/components/panel_custom/manifest.json +++ b/homeassistant/components/panel_custom/manifest.json @@ -2,7 +2,6 @@ "domain": "panel_custom", "name": "Custom Panel", "documentation": "https://www.home-assistant.io/integrations/panel_custom", - "requirements": [], "dependencies": ["frontend"], "codeowners": ["@home-assistant/frontend"], "quality_scale": "internal" diff --git a/homeassistant/components/panel_iframe/manifest.json b/homeassistant/components/panel_iframe/manifest.json index 6ccd444db261..7ade98eeb47c 100644 --- a/homeassistant/components/panel_iframe/manifest.json +++ b/homeassistant/components/panel_iframe/manifest.json @@ -2,7 +2,6 @@ "domain": "panel_iframe", "name": "iframe Panel", "documentation": "https://www.home-assistant.io/integrations/panel_iframe", - "requirements": [], "dependencies": ["frontend"], "codeowners": ["@home-assistant/frontend"], "quality_scale": "internal" diff --git a/homeassistant/components/pcal9535a/manifest.json b/homeassistant/components/pcal9535a/manifest.json index 510d9dbf1a78..81802af1084a 100644 --- a/homeassistant/components/pcal9535a/manifest.json +++ b/homeassistant/components/pcal9535a/manifest.json @@ -3,6 +3,5 @@ "name": "PCAL9535A I/O Expander", "documentation": "https://www.home-assistant.io/integrations/pcal9535a", "requirements": ["pcal9535a==0.7"], - "dependencies": [], "codeowners": ["@Shulyaka"] } diff --git a/homeassistant/components/pencom/manifest.json b/homeassistant/components/pencom/manifest.json index 33c91b811c78..0637c18b6474 100644 --- a/homeassistant/components/pencom/manifest.json +++ b/homeassistant/components/pencom/manifest.json @@ -3,6 +3,5 @@ "name": "Pencom", "documentation": "https://www.home-assistant.io/integrations/pencom", "requirements": ["pencompy==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/persistent_notification/manifest.json b/homeassistant/components/persistent_notification/manifest.json index 81fa8a9497b0..ff3ef06d97c8 100644 --- a/homeassistant/components/persistent_notification/manifest.json +++ b/homeassistant/components/persistent_notification/manifest.json @@ -2,8 +2,6 @@ "domain": "persistent_notification", "name": "Persistent Notification", "documentation": "https://www.home-assistant.io/integrations/persistent_notification", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/person/manifest.json b/homeassistant/components/person/manifest.json index df54743ce75a..bd1dfa6b5886 100644 --- a/homeassistant/components/person/manifest.json +++ b/homeassistant/components/person/manifest.json @@ -2,8 +2,6 @@ "domain": "person", "name": "Person", "documentation": "https://www.home-assistant.io/integrations/person", - "requirements": [], - "dependencies": [], "after_dependencies": ["device_tracker"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/philips_js/manifest.json b/homeassistant/components/philips_js/manifest.json index e8e347722a6d..74473827424f 100644 --- a/homeassistant/components/philips_js/manifest.json +++ b/homeassistant/components/philips_js/manifest.json @@ -3,6 +3,5 @@ "name": "Philips TV", "documentation": "https://www.home-assistant.io/integrations/philips_js", "requirements": ["ha-philipsjs==0.0.8"], - "dependencies": [], "codeowners": ["@elupus"] } diff --git a/homeassistant/components/pi_hole/manifest.json b/homeassistant/components/pi_hole/manifest.json index 5d8f85570992..1f4b46cc0d4b 100644 --- a/homeassistant/components/pi_hole/manifest.json +++ b/homeassistant/components/pi_hole/manifest.json @@ -3,6 +3,5 @@ "name": "Pi-hole", "documentation": "https://www.home-assistant.io/integrations/pi_hole", "requirements": ["hole==0.5.1"], - "dependencies": [], "codeowners": ["@fabaff", "@johnluetke"] } diff --git a/homeassistant/components/picotts/manifest.json b/homeassistant/components/picotts/manifest.json index 43963bb2cd8e..6f7a80be970d 100644 --- a/homeassistant/components/picotts/manifest.json +++ b/homeassistant/components/picotts/manifest.json @@ -2,7 +2,5 @@ "domain": "picotts", "name": "Pico TTS", "documentation": "https://www.home-assistant.io/integrations/picotts", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/piglow/manifest.json b/homeassistant/components/piglow/manifest.json index 1aa0ead9fd8b..14d25b1dc92a 100644 --- a/homeassistant/components/piglow/manifest.json +++ b/homeassistant/components/piglow/manifest.json @@ -3,6 +3,5 @@ "name": "Piglow", "documentation": "https://www.home-assistant.io/integrations/piglow", "requirements": ["piglow==1.2.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pilight/manifest.json b/homeassistant/components/pilight/manifest.json index b2b2b08f7ff2..8afafcd68b31 100644 --- a/homeassistant/components/pilight/manifest.json +++ b/homeassistant/components/pilight/manifest.json @@ -3,6 +3,5 @@ "name": "Pilight", "documentation": "https://www.home-assistant.io/integrations/pilight", "requirements": ["pilight==0.1.1"], - "dependencies": [], "codeowners": ["@trekky12"] } diff --git a/homeassistant/components/ping/manifest.json b/homeassistant/components/ping/manifest.json index 2ec00271fff3..887b48dbaaed 100644 --- a/homeassistant/components/ping/manifest.json +++ b/homeassistant/components/ping/manifest.json @@ -2,8 +2,6 @@ "domain": "ping", "name": "Ping (ICMP)", "documentation": "https://www.home-assistant.io/integrations/ping", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/pioneer/manifest.json b/homeassistant/components/pioneer/manifest.json index 3aa046f234d6..524f27644147 100644 --- a/homeassistant/components/pioneer/manifest.json +++ b/homeassistant/components/pioneer/manifest.json @@ -2,7 +2,5 @@ "domain": "pioneer", "name": "Pioneer", "documentation": "https://www.home-assistant.io/integrations/pioneer", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pjlink/manifest.json b/homeassistant/components/pjlink/manifest.json index a9b4a3bae86f..ca657923aa87 100644 --- a/homeassistant/components/pjlink/manifest.json +++ b/homeassistant/components/pjlink/manifest.json @@ -3,6 +3,5 @@ "name": "PJLink", "documentation": "https://www.home-assistant.io/integrations/pjlink", "requirements": ["pypjlink2==1.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/plant/manifest.json b/homeassistant/components/plant/manifest.json index f0ff20f37590..7318b222e45f 100644 --- a/homeassistant/components/plant/manifest.json +++ b/homeassistant/components/plant/manifest.json @@ -2,8 +2,6 @@ "domain": "plant", "name": "Plant Monitor", "documentation": "https://www.home-assistant.io/integrations/plant", - "requirements": [], - "dependencies": [], "after_dependencies": ["recorder"], "codeowners": ["@ChristianKuehnel"], "quality_scale": "internal" diff --git a/homeassistant/components/plugwise/manifest.json b/homeassistant/components/plugwise/manifest.json index 601f017d42f3..9f14f6c6e61c 100644 --- a/homeassistant/components/plugwise/manifest.json +++ b/homeassistant/components/plugwise/manifest.json @@ -2,7 +2,6 @@ "domain": "plugwise", "name": "Plugwise Anna", "documentation": "https://www.home-assistant.io/integrations/plugwise", - "dependencies": [], "codeowners": ["@laetificat", "@CoMPaTech", "@bouwew"], "requirements": ["haanna==0.14.3"] } diff --git a/homeassistant/components/plum_lightpad/manifest.json b/homeassistant/components/plum_lightpad/manifest.json index 1063d4b439ec..5c846d41ad19 100644 --- a/homeassistant/components/plum_lightpad/manifest.json +++ b/homeassistant/components/plum_lightpad/manifest.json @@ -3,6 +3,5 @@ "name": "Plum Lightpad", "documentation": "https://www.home-assistant.io/integrations/plum_lightpad", "requirements": ["plumlightpad==0.0.11"], - "dependencies": [], "codeowners": ["@ColinHarrington"] } diff --git a/homeassistant/components/pocketcasts/manifest.json b/homeassistant/components/pocketcasts/manifest.json index c56b9474996b..41b46ae5cb82 100644 --- a/homeassistant/components/pocketcasts/manifest.json +++ b/homeassistant/components/pocketcasts/manifest.json @@ -3,6 +3,5 @@ "name": "Pocket Casts", "documentation": "https://www.home-assistant.io/integrations/pocketcasts", "requirements": ["pocketcasts==0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/powerwall/manifest.json b/homeassistant/components/powerwall/manifest.json index 951ad960e145..2ab2d5199448 100644 --- a/homeassistant/components/powerwall/manifest.json +++ b/homeassistant/components/powerwall/manifest.json @@ -9,7 +9,6 @@ "ssdp": [], "zeroconf": [], "homekit": {}, - "dependencies": [], "codeowners": [ "@bdraco" ] diff --git a/homeassistant/components/prezzibenzina/manifest.json b/homeassistant/components/prezzibenzina/manifest.json index 2636e36ab140..5aa4a6ec77f2 100644 --- a/homeassistant/components/prezzibenzina/manifest.json +++ b/homeassistant/components/prezzibenzina/manifest.json @@ -3,6 +3,5 @@ "name": "Prezzi Benzina", "documentation": "https://www.home-assistant.io/integrations/prezzibenzina", "requirements": ["prezzibenzina-py==1.1.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/proliphix/manifest.json b/homeassistant/components/proliphix/manifest.json index 9014d9f8dc25..eb0b6e1b8576 100644 --- a/homeassistant/components/proliphix/manifest.json +++ b/homeassistant/components/proliphix/manifest.json @@ -3,6 +3,5 @@ "name": "Proliphix", "documentation": "https://www.home-assistant.io/integrations/proliphix", "requirements": ["proliphix==0.4.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/prowl/manifest.json b/homeassistant/components/prowl/manifest.json index 73aa818a2add..10bb7f8948e1 100644 --- a/homeassistant/components/prowl/manifest.json +++ b/homeassistant/components/prowl/manifest.json @@ -2,7 +2,5 @@ "domain": "prowl", "name": "Prowl", "documentation": "https://www.home-assistant.io/integrations/prowl", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/proximity/manifest.json b/homeassistant/components/proximity/manifest.json index 4d5f42720e07..a93da5f72d01 100644 --- a/homeassistant/components/proximity/manifest.json +++ b/homeassistant/components/proximity/manifest.json @@ -2,7 +2,6 @@ "domain": "proximity", "name": "Proximity", "documentation": "https://www.home-assistant.io/integrations/proximity", - "requirements": [], "dependencies": ["device_tracker", "zone"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/proxmoxve/manifest.json b/homeassistant/components/proxmoxve/manifest.json index c61d296587c2..2735bab1b045 100644 --- a/homeassistant/components/proxmoxve/manifest.json +++ b/homeassistant/components/proxmoxve/manifest.json @@ -2,7 +2,6 @@ "domain": "proxmoxve", "name": "Proxmox VE", "documentation": "https://www.home-assistant.io/integrations/proxmoxve", - "dependencies": [], "codeowners": ["@k4ds3"], "requirements": ["proxmoxer==1.0.4"] } diff --git a/homeassistant/components/proxy/manifest.json b/homeassistant/components/proxy/manifest.json index d12fbe2d3d77..246eb856bdcf 100644 --- a/homeassistant/components/proxy/manifest.json +++ b/homeassistant/components/proxy/manifest.json @@ -5,6 +5,5 @@ "requirements": [ "pillow==7.0.0" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/ps4/manifest.json b/homeassistant/components/ps4/manifest.json index 80c12cc746ca..cd27a587d7fa 100644 --- a/homeassistant/components/ps4/manifest.json +++ b/homeassistant/components/ps4/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ps4", "requirements": ["pyps4-2ndscreen==1.0.7"], - "dependencies": [], "codeowners": ["@ktnrg45"] } diff --git a/homeassistant/components/ptvsd/manifest.json b/homeassistant/components/ptvsd/manifest.json index dd3e61006321..0c487c4bb24e 100644 --- a/homeassistant/components/ptvsd/manifest.json +++ b/homeassistant/components/ptvsd/manifest.json @@ -3,6 +3,5 @@ "name": "PTVSD - Python Tools for Visual Studio Debug Server", "documentation": "https://www.home-assistant.io/integrations/ptvsd", "requirements": ["ptvsd==4.2.8"], - "dependencies": [], "codeowners": ["@swamp-ig"] } diff --git a/homeassistant/components/pulseaudio_loopback/manifest.json b/homeassistant/components/pulseaudio_loopback/manifest.json index 1c1a73ebb3f9..8775f5f0947b 100644 --- a/homeassistant/components/pulseaudio_loopback/manifest.json +++ b/homeassistant/components/pulseaudio_loopback/manifest.json @@ -2,7 +2,5 @@ "domain": "pulseaudio_loopback", "name": "PulseAudio Loopback", "documentation": "https://www.home-assistant.io/integrations/pulseaudio_loopback", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/push/manifest.json b/homeassistant/components/push/manifest.json index c0ad8263c66c..c4a419bcfd3a 100644 --- a/homeassistant/components/push/manifest.json +++ b/homeassistant/components/push/manifest.json @@ -2,7 +2,6 @@ "domain": "push", "name": "Push", "documentation": "https://www.home-assistant.io/integrations/push", - "requirements": [], "dependencies": ["webhook"], "codeowners": ["@dgomes"] } diff --git a/homeassistant/components/pushbullet/manifest.json b/homeassistant/components/pushbullet/manifest.json index bb19a77f1750..1453f9ffe735 100644 --- a/homeassistant/components/pushbullet/manifest.json +++ b/homeassistant/components/pushbullet/manifest.json @@ -3,6 +3,5 @@ "name": "Pushbullet", "documentation": "https://www.home-assistant.io/integrations/pushbullet", "requirements": ["pushbullet.py==0.11.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pushetta/manifest.json b/homeassistant/components/pushetta/manifest.json index 6bcad44958be..ea15e6e47ba9 100644 --- a/homeassistant/components/pushetta/manifest.json +++ b/homeassistant/components/pushetta/manifest.json @@ -3,6 +3,5 @@ "name": "Pushetta", "documentation": "https://www.home-assistant.io/integrations/pushetta", "requirements": ["pushetta==1.0.15"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pushover/manifest.json b/homeassistant/components/pushover/manifest.json index 9bdd1bb53f9f..222e7a22fdf4 100644 --- a/homeassistant/components/pushover/manifest.json +++ b/homeassistant/components/pushover/manifest.json @@ -3,6 +3,5 @@ "name": "Pushover", "documentation": "https://www.home-assistant.io/integrations/pushover", "requirements": ["pushover_complete==1.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pushsafer/manifest.json b/homeassistant/components/pushsafer/manifest.json index 18592124c24d..8932de99b5d6 100644 --- a/homeassistant/components/pushsafer/manifest.json +++ b/homeassistant/components/pushsafer/manifest.json @@ -2,7 +2,5 @@ "domain": "pushsafer", "name": "Pushsafer", "documentation": "https://www.home-assistant.io/integrations/pushsafer", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/pvoutput/manifest.json b/homeassistant/components/pvoutput/manifest.json index 0ca7af3485d1..93f9b45c62ad 100644 --- a/homeassistant/components/pvoutput/manifest.json +++ b/homeassistant/components/pvoutput/manifest.json @@ -2,8 +2,6 @@ "domain": "pvoutput", "name": "PVOutput", "documentation": "https://www.home-assistant.io/integrations/pvoutput", - "requirements": [], - "dependencies": [], "after_dependencies": ["rest"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/pvpc_hourly_pricing/manifest.json b/homeassistant/components/pvpc_hourly_pricing/manifest.json index a2f6ec12941d..023b22683f87 100644 --- a/homeassistant/components/pvpc_hourly_pricing/manifest.json +++ b/homeassistant/components/pvpc_hourly_pricing/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/pvpc_hourly_pricing", "requirements": ["aiopvpc==1.0.2"], - "dependencies": [], "codeowners": ["@azogue"], "quality_scale": "platinum" } diff --git a/homeassistant/components/pyload/manifest.json b/homeassistant/components/pyload/manifest.json index 98ad640d3ff9..8a446a032f84 100644 --- a/homeassistant/components/pyload/manifest.json +++ b/homeassistant/components/pyload/manifest.json @@ -2,7 +2,5 @@ "domain": "pyload", "name": "pyLoad", "documentation": "https://www.home-assistant.io/integrations/pyload", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/python_script/manifest.json b/homeassistant/components/python_script/manifest.json index f16213790c2c..fad88a19b34e 100644 --- a/homeassistant/components/python_script/manifest.json +++ b/homeassistant/components/python_script/manifest.json @@ -3,7 +3,6 @@ "name": "Python Scripts", "documentation": "https://www.home-assistant.io/integrations/python_script", "requirements": ["restrictedpython==5.0"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/qbittorrent/manifest.json b/homeassistant/components/qbittorrent/manifest.json index f1cd556f5d62..c839cb759333 100644 --- a/homeassistant/components/qbittorrent/manifest.json +++ b/homeassistant/components/qbittorrent/manifest.json @@ -3,6 +3,5 @@ "name": "qBittorrent", "documentation": "https://www.home-assistant.io/integrations/qbittorrent", "requirements": ["python-qbittorrent==0.4.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/qld_bushfire/manifest.json b/homeassistant/components/qld_bushfire/manifest.json index fb05d1638c33..db98e2f7338c 100644 --- a/homeassistant/components/qld_bushfire/manifest.json +++ b/homeassistant/components/qld_bushfire/manifest.json @@ -3,6 +3,5 @@ "name": "Queensland Bushfire Alert", "documentation": "https://www.home-assistant.io/integrations/qld_bushfire", "requirements": ["georss_qld_bushfire_alert_client==0.3"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/qnap/manifest.json b/homeassistant/components/qnap/manifest.json index 3c64986c2bca..b83d37f0d3c2 100644 --- a/homeassistant/components/qnap/manifest.json +++ b/homeassistant/components/qnap/manifest.json @@ -3,6 +3,5 @@ "name": "QNAP", "documentation": "https://www.home-assistant.io/integrations/qnap", "requirements": ["qnapstats==0.3.0"], - "dependencies": [], "codeowners": ["@colinodell"] } diff --git a/homeassistant/components/qrcode/manifest.json b/homeassistant/components/qrcode/manifest.json index cc2cde26aa52..f51f7150868f 100644 --- a/homeassistant/components/qrcode/manifest.json +++ b/homeassistant/components/qrcode/manifest.json @@ -6,6 +6,5 @@ "pillow==7.0.0", "pyzbar==0.1.7" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/quantum_gateway/manifest.json b/homeassistant/components/quantum_gateway/manifest.json index ca930dc9ca4b..1c4a7a13923e 100644 --- a/homeassistant/components/quantum_gateway/manifest.json +++ b/homeassistant/components/quantum_gateway/manifest.json @@ -3,6 +3,5 @@ "name": "Quantum Gateway", "documentation": "https://www.home-assistant.io/integrations/quantum_gateway", "requirements": ["quantum-gateway==0.0.5"], - "dependencies": [], "codeowners": ["@cisasteelersfan"] } diff --git a/homeassistant/components/qvr_pro/manifest.json b/homeassistant/components/qvr_pro/manifest.json index 3bef827a019e..5a81f1ce37ab 100644 --- a/homeassistant/components/qvr_pro/manifest.json +++ b/homeassistant/components/qvr_pro/manifest.json @@ -3,6 +3,5 @@ "name": "QVR Pro", "documentation": "https://www.home-assistant.io/integrations/qvr_pro", "requirements": ["pyqvrpro==0.51"], - "dependencies": [], "codeowners": ["@oblogic7"] } diff --git a/homeassistant/components/qwikswitch/manifest.json b/homeassistant/components/qwikswitch/manifest.json index 836bc611b837..31e84fccf9a2 100644 --- a/homeassistant/components/qwikswitch/manifest.json +++ b/homeassistant/components/qwikswitch/manifest.json @@ -3,6 +3,5 @@ "name": "QwikSwitch QSUSB", "documentation": "https://www.home-assistant.io/integrations/qwikswitch", "requirements": ["pyqwikswitch==0.93"], - "dependencies": [], "codeowners": ["@kellerza"] } diff --git a/homeassistant/components/radarr/manifest.json b/homeassistant/components/radarr/manifest.json index 2683525e7b44..8f752f035007 100644 --- a/homeassistant/components/radarr/manifest.json +++ b/homeassistant/components/radarr/manifest.json @@ -2,7 +2,5 @@ "domain": "radarr", "name": "Radarr", "documentation": "https://www.home-assistant.io/integrations/radarr", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/radiotherm/manifest.json b/homeassistant/components/radiotherm/manifest.json index 34aebee3e1db..6d4567c59d66 100644 --- a/homeassistant/components/radiotherm/manifest.json +++ b/homeassistant/components/radiotherm/manifest.json @@ -3,6 +3,5 @@ "name": "Radio Thermostat", "documentation": "https://www.home-assistant.io/integrations/radiotherm", "requirements": ["radiotherm==2.0.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rainbird/manifest.json b/homeassistant/components/rainbird/manifest.json index 4705ba30298c..cf604714106f 100644 --- a/homeassistant/components/rainbird/manifest.json +++ b/homeassistant/components/rainbird/manifest.json @@ -3,6 +3,5 @@ "name": "Rain Bird", "documentation": "https://www.home-assistant.io/integrations/rainbird", "requirements": ["pyrainbird==0.4.1"], - "dependencies": [], "codeowners": ["@konikvranik"] } diff --git a/homeassistant/components/raincloud/manifest.json b/homeassistant/components/raincloud/manifest.json index 79d197969d42..a0edaa87825f 100644 --- a/homeassistant/components/raincloud/manifest.json +++ b/homeassistant/components/raincloud/manifest.json @@ -3,6 +3,5 @@ "name": "Melnor RainCloud", "documentation": "https://www.home-assistant.io/integrations/raincloud", "requirements": ["raincloudy==0.0.7"], - "dependencies": [], "codeowners": ["@vanstinator"] } diff --git a/homeassistant/components/rainforest_eagle/manifest.json b/homeassistant/components/rainforest_eagle/manifest.json index 0649dfded999..b6db35347bcf 100644 --- a/homeassistant/components/rainforest_eagle/manifest.json +++ b/homeassistant/components/rainforest_eagle/manifest.json @@ -6,7 +6,6 @@ "eagle200_reader==0.2.4", "uEagle==0.0.1" ], - "dependencies": [], "codeowners": ["@gtdiehl", "@jcalbert"] } diff --git a/homeassistant/components/rainmachine/manifest.json b/homeassistant/components/rainmachine/manifest.json index 2c8a770137d1..aed0f030c258 100644 --- a/homeassistant/components/rainmachine/manifest.json +++ b/homeassistant/components/rainmachine/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/rainmachine", "requirements": ["regenmaschine==1.5.1"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/random/manifest.json b/homeassistant/components/random/manifest.json index bd265ef47594..5e73fbd44210 100644 --- a/homeassistant/components/random/manifest.json +++ b/homeassistant/components/random/manifest.json @@ -2,8 +2,6 @@ "domain": "random", "name": "Random", "documentation": "https://www.home-assistant.io/integrations/random", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/raspihats/manifest.json b/homeassistant/components/raspihats/manifest.json index f26da599cef1..400cd275dc12 100644 --- a/homeassistant/components/raspihats/manifest.json +++ b/homeassistant/components/raspihats/manifest.json @@ -3,6 +3,5 @@ "name": "Raspihats", "documentation": "https://www.home-assistant.io/integrations/raspihats", "requirements": ["raspihats==2.2.3", "smbus-cffi==0.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/raspyrfm/manifest.json b/homeassistant/components/raspyrfm/manifest.json index 20e3768705e7..ed840c708244 100644 --- a/homeassistant/components/raspyrfm/manifest.json +++ b/homeassistant/components/raspyrfm/manifest.json @@ -3,6 +3,5 @@ "name": "RaspyRFM", "documentation": "https://www.home-assistant.io/integrations/raspyrfm", "requirements": ["raspyrfm-client==1.2.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/recollect_waste/manifest.json b/homeassistant/components/recollect_waste/manifest.json index 634f6ad0c61e..b04917d450c2 100644 --- a/homeassistant/components/recollect_waste/manifest.json +++ b/homeassistant/components/recollect_waste/manifest.json @@ -3,6 +3,5 @@ "name": "ReCollect Waste", "documentation": "https://www.home-assistant.io/integrations/recollect_waste", "requirements": ["recollect-waste==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/recorder/manifest.json b/homeassistant/components/recorder/manifest.json index 04fabd28bc61..d21c46c9e62e 100644 --- a/homeassistant/components/recorder/manifest.json +++ b/homeassistant/components/recorder/manifest.json @@ -3,7 +3,6 @@ "name": "Recorder", "documentation": "https://www.home-assistant.io/integrations/recorder", "requirements": ["sqlalchemy==1.3.15"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/recswitch/manifest.json b/homeassistant/components/recswitch/manifest.json index 857658156190..4d155b6ec02d 100644 --- a/homeassistant/components/recswitch/manifest.json +++ b/homeassistant/components/recswitch/manifest.json @@ -3,6 +3,5 @@ "name": "Ankuoo REC Switch", "documentation": "https://www.home-assistant.io/integrations/recswitch", "requirements": ["pyrecswitch==1.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/reddit/manifest.json b/homeassistant/components/reddit/manifest.json index f1687d73e04b..189ffbbc4be2 100644 --- a/homeassistant/components/reddit/manifest.json +++ b/homeassistant/components/reddit/manifest.json @@ -3,6 +3,5 @@ "name": "Reddit", "documentation": "https://www.home-assistant.io/integrations/reddit", "requirements": ["praw==6.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rejseplanen/manifest.json b/homeassistant/components/rejseplanen/manifest.json index b5140110570f..cb58d83ff62c 100644 --- a/homeassistant/components/rejseplanen/manifest.json +++ b/homeassistant/components/rejseplanen/manifest.json @@ -3,6 +3,5 @@ "name": "Rejseplanen", "documentation": "https://www.home-assistant.io/integrations/rejseplanen", "requirements": ["rjpl==0.3.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/remote/manifest.json b/homeassistant/components/remote/manifest.json index 8f559b758d61..30c442b540b6 100644 --- a/homeassistant/components/remote/manifest.json +++ b/homeassistant/components/remote/manifest.json @@ -2,7 +2,5 @@ "domain": "remote", "name": "Remote", "documentation": "https://www.home-assistant.io/integrations/remote", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/remote_rpi_gpio/manifest.json b/homeassistant/components/remote_rpi_gpio/manifest.json index 4c5f63c7dea3..c69a9c92fde5 100644 --- a/homeassistant/components/remote_rpi_gpio/manifest.json +++ b/homeassistant/components/remote_rpi_gpio/manifest.json @@ -3,6 +3,5 @@ "name": "remote_rpi_gpio", "documentation": "https://www.home-assistant.io/integrations/remote_rpi_gpio", "requirements": ["gpiozero==1.5.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/repetier/manifest.json b/homeassistant/components/repetier/manifest.json index d24a8ed03e32..b6d48aded2f8 100644 --- a/homeassistant/components/repetier/manifest.json +++ b/homeassistant/components/repetier/manifest.json @@ -3,6 +3,5 @@ "name": "Repetier-Server", "documentation": "https://www.home-assistant.io/integrations/repetier", "requirements": ["pyrepetier==3.0.5"], - "dependencies": [], "codeowners": ["@MTrab"] } diff --git a/homeassistant/components/rest/manifest.json b/homeassistant/components/rest/manifest.json index fd7eea12f7e5..3ab926a3b132 100644 --- a/homeassistant/components/rest/manifest.json +++ b/homeassistant/components/rest/manifest.json @@ -3,6 +3,5 @@ "name": "RESTful", "documentation": "https://www.home-assistant.io/integrations/rest", "requirements": ["jsonpath==0.82", "xmltodict==0.12.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rest_command/manifest.json b/homeassistant/components/rest_command/manifest.json index 9611eea23c04..a4441a7afa00 100644 --- a/homeassistant/components/rest_command/manifest.json +++ b/homeassistant/components/rest_command/manifest.json @@ -2,7 +2,5 @@ "domain": "rest_command", "name": "RESTful Command", "documentation": "https://www.home-assistant.io/integrations/rest_command", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rflink/manifest.json b/homeassistant/components/rflink/manifest.json index 0386e0c5bf87..e9ddd17e60ad 100644 --- a/homeassistant/components/rflink/manifest.json +++ b/homeassistant/components/rflink/manifest.json @@ -3,6 +3,5 @@ "name": "RFLink", "documentation": "https://www.home-assistant.io/integrations/rflink", "requirements": ["rflink==0.0.52"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rfxtrx/manifest.json b/homeassistant/components/rfxtrx/manifest.json index a3c4d2fcb72c..3b5790ad4ee2 100644 --- a/homeassistant/components/rfxtrx/manifest.json +++ b/homeassistant/components/rfxtrx/manifest.json @@ -3,6 +3,5 @@ "name": "RFXCOM RFXtrx", "documentation": "https://www.home-assistant.io/integrations/rfxtrx", "requirements": ["pyRFXtrx==0.25"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/ripple/manifest.json b/homeassistant/components/ripple/manifest.json index 38a193e4a91d..d730093ed0f4 100644 --- a/homeassistant/components/ripple/manifest.json +++ b/homeassistant/components/ripple/manifest.json @@ -3,6 +3,5 @@ "name": "Ripple", "documentation": "https://www.home-assistant.io/integrations/ripple", "requirements": ["python-ripple-api==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rmvtransport/manifest.json b/homeassistant/components/rmvtransport/manifest.json index eae73a2de422..693134dfeca0 100644 --- a/homeassistant/components/rmvtransport/manifest.json +++ b/homeassistant/components/rmvtransport/manifest.json @@ -3,6 +3,5 @@ "name": "RMV", "documentation": "https://www.home-assistant.io/integrations/rmvtransport", "requirements": ["PyRMVtransport==0.2.9"], - "dependencies": [], "codeowners": ["@cgtobi"] } diff --git a/homeassistant/components/rocketchat/manifest.json b/homeassistant/components/rocketchat/manifest.json index a3fa11609e57..23798ff5df13 100644 --- a/homeassistant/components/rocketchat/manifest.json +++ b/homeassistant/components/rocketchat/manifest.json @@ -3,6 +3,5 @@ "name": "Rocket.Chat", "documentation": "https://www.home-assistant.io/integrations/rocketchat", "requirements": ["rocketchat-API==0.6.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/roku/manifest.json b/homeassistant/components/roku/manifest.json index 43ccb6b8ad3a..e0c7c9f5c498 100644 --- a/homeassistant/components/roku/manifest.json +++ b/homeassistant/components/roku/manifest.json @@ -3,7 +3,6 @@ "name": "Roku", "documentation": "https://www.home-assistant.io/integrations/roku", "requirements": ["roku==4.1.0"], - "dependencies": [], "ssdp": [ { "st": "roku:ecp", diff --git a/homeassistant/components/roomba/manifest.json b/homeassistant/components/roomba/manifest.json index bf048cadc8f1..c66cd3ecbdfc 100644 --- a/homeassistant/components/roomba/manifest.json +++ b/homeassistant/components/roomba/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "roombapy==1.4.3" ], - "dependencies": [], "codeowners": [ "@pschmitt" ] diff --git a/homeassistant/components/route53/manifest.json b/homeassistant/components/route53/manifest.json index 62edeafe7351..da2b6dc092c8 100644 --- a/homeassistant/components/route53/manifest.json +++ b/homeassistant/components/route53/manifest.json @@ -3,6 +3,5 @@ "name": "AWS Route53", "documentation": "https://www.home-assistant.io/integrations/route53", "requirements": ["boto3==1.9.252", "ipify==1.0.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rova/manifest.json b/homeassistant/components/rova/manifest.json index 0099513dea76..a4ba931da43d 100644 --- a/homeassistant/components/rova/manifest.json +++ b/homeassistant/components/rova/manifest.json @@ -3,6 +3,5 @@ "name": "ROVA", "documentation": "https://www.home-assistant.io/integrations/rova", "requirements": ["rova==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rpi_camera/manifest.json b/homeassistant/components/rpi_camera/manifest.json index dd777790db23..5f42be58ffe7 100644 --- a/homeassistant/components/rpi_camera/manifest.json +++ b/homeassistant/components/rpi_camera/manifest.json @@ -2,7 +2,5 @@ "domain": "rpi_camera", "name": "Raspberry Pi Camera", "documentation": "https://www.home-assistant.io/integrations/rpi_camera", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rpi_gpio/manifest.json b/homeassistant/components/rpi_gpio/manifest.json index 7b0f8e0f282a..523d98dfdb75 100644 --- a/homeassistant/components/rpi_gpio/manifest.json +++ b/homeassistant/components/rpi_gpio/manifest.json @@ -3,6 +3,5 @@ "name": "Raspberry Pi GPIO", "documentation": "https://www.home-assistant.io/integrations/rpi_gpio", "requirements": ["RPi.GPIO==0.7.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rpi_gpio_pwm/manifest.json b/homeassistant/components/rpi_gpio_pwm/manifest.json index 46fe96a64265..9cb082dc2b61 100644 --- a/homeassistant/components/rpi_gpio_pwm/manifest.json +++ b/homeassistant/components/rpi_gpio_pwm/manifest.json @@ -3,6 +3,5 @@ "name": "pigpio Daemon PWM LED", "documentation": "https://www.home-assistant.io/integrations/rpi_gpio_pwm", "requirements": ["pwmled==1.5.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rpi_pfio/manifest.json b/homeassistant/components/rpi_pfio/manifest.json index de2d70cc3a87..f40c34a11a4f 100644 --- a/homeassistant/components/rpi_pfio/manifest.json +++ b/homeassistant/components/rpi_pfio/manifest.json @@ -3,6 +3,5 @@ "name": "PiFace Digital I/O (PFIO)", "documentation": "https://www.home-assistant.io/integrations/rpi_pfio", "requirements": ["pifacecommon==4.2.2", "pifacedigitalio==3.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rpi_rf/manifest.json b/homeassistant/components/rpi_rf/manifest.json index defb18cfa982..0a2cc42b6335 100644 --- a/homeassistant/components/rpi_rf/manifest.json +++ b/homeassistant/components/rpi_rf/manifest.json @@ -3,6 +3,5 @@ "name": "Raspberry Pi RF", "documentation": "https://www.home-assistant.io/integrations/rpi_rf", "requirements": ["rpi-rf==0.9.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/rss_feed_template/manifest.json b/homeassistant/components/rss_feed_template/manifest.json index 0dfab2899204..1ae8fe58d7b0 100644 --- a/homeassistant/components/rss_feed_template/manifest.json +++ b/homeassistant/components/rss_feed_template/manifest.json @@ -2,7 +2,6 @@ "domain": "rss_feed_template", "name": "RSS Feed Template", "documentation": "https://www.home-assistant.io/integrations/rss_feed_template", - "requirements": [], "dependencies": ["http"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/rtorrent/manifest.json b/homeassistant/components/rtorrent/manifest.json index 67fd57fe1700..137a77b12942 100644 --- a/homeassistant/components/rtorrent/manifest.json +++ b/homeassistant/components/rtorrent/manifest.json @@ -2,7 +2,5 @@ "domain": "rtorrent", "name": "rTorrent", "documentation": "https://www.home-assistant.io/integrations/rtorrent", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/russound_rio/manifest.json b/homeassistant/components/russound_rio/manifest.json index 38ca2095cfb3..2fd9f039d53b 100644 --- a/homeassistant/components/russound_rio/manifest.json +++ b/homeassistant/components/russound_rio/manifest.json @@ -3,6 +3,5 @@ "name": "Russound RIO", "documentation": "https://www.home-assistant.io/integrations/russound_rio", "requirements": ["russound_rio==0.1.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/russound_rnet/manifest.json b/homeassistant/components/russound_rnet/manifest.json index bb417122f869..6379dd021f2a 100644 --- a/homeassistant/components/russound_rnet/manifest.json +++ b/homeassistant/components/russound_rnet/manifest.json @@ -3,6 +3,5 @@ "name": "Russound RNET", "documentation": "https://www.home-assistant.io/integrations/russound_rnet", "requirements": ["russound==0.1.9"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/safe_mode/manifest.json b/homeassistant/components/safe_mode/manifest.json index 372ec51de379..ebc450140fce 100644 --- a/homeassistant/components/safe_mode/manifest.json +++ b/homeassistant/components/safe_mode/manifest.json @@ -3,7 +3,6 @@ "name": "Safe Mode", "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/safe_mode", - "requirements": [], "ssdp": [], "zeroconf": [], "homekit": {}, diff --git a/homeassistant/components/saj/manifest.json b/homeassistant/components/saj/manifest.json index f1c50d5dbe34..c4002f252e84 100644 --- a/homeassistant/components/saj/manifest.json +++ b/homeassistant/components/saj/manifest.json @@ -3,6 +3,5 @@ "name": "SAJ Solar Inverter", "documentation": "https://www.home-assistant.io/integrations/saj", "requirements": ["pysaj==0.0.14"], - "dependencies": [], "codeowners": ["@fredericvl"] } diff --git a/homeassistant/components/salt/manifest.json b/homeassistant/components/salt/manifest.json index 019fdf9ae5f4..eefe901d2963 100644 --- a/homeassistant/components/salt/manifest.json +++ b/homeassistant/components/salt/manifest.json @@ -3,6 +3,5 @@ "name": "Salt Fiber Box", "documentation": "https://www.home-assistant.io/integrations/salt", "requirements": ["saltbox==0.1.3"], - "dependencies": [], "codeowners": ["@bjornorri"] } diff --git a/homeassistant/components/samsungtv/manifest.json b/homeassistant/components/samsungtv/manifest.json index 66f71b5c5daf..ea91fee481ac 100644 --- a/homeassistant/components/samsungtv/manifest.json +++ b/homeassistant/components/samsungtv/manifest.json @@ -11,9 +11,8 @@ "st": "urn:samsung.com:device:RemoteControlReceiver:1" } ], - "dependencies": [], "codeowners": [ "@escoand" ], "config_flow": true -} \ No newline at end of file +} diff --git a/homeassistant/components/satel_integra/manifest.json b/homeassistant/components/satel_integra/manifest.json index e9bbd9623c0f..0a157cd4deba 100644 --- a/homeassistant/components/satel_integra/manifest.json +++ b/homeassistant/components/satel_integra/manifest.json @@ -3,6 +3,5 @@ "name": "Satel Integra", "documentation": "https://www.home-assistant.io/integrations/satel_integra", "requirements": ["satel_integra==0.3.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/scene/manifest.json b/homeassistant/components/scene/manifest.json index 1b0361680f4e..3134a3100426 100644 --- a/homeassistant/components/scene/manifest.json +++ b/homeassistant/components/scene/manifest.json @@ -2,8 +2,6 @@ "domain": "scene", "name": "Scenes", "documentation": "https://www.home-assistant.io/integrations/scene", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/schluter/manifest.json b/homeassistant/components/schluter/manifest.json index 1a7cebcf06af..46eb2449e3d6 100644 --- a/homeassistant/components/schluter/manifest.json +++ b/homeassistant/components/schluter/manifest.json @@ -3,6 +3,5 @@ "name": "Schluter", "documentation": "https://www.home-assistant.io/integrations/schluter", "requirements": ["py-schluter==0.1.7"], - "dependencies": [], "codeowners": ["@prairieapps"] } diff --git a/homeassistant/components/scrape/manifest.json b/homeassistant/components/scrape/manifest.json index 90352bbd1088..c7536459a035 100644 --- a/homeassistant/components/scrape/manifest.json +++ b/homeassistant/components/scrape/manifest.json @@ -3,7 +3,6 @@ "name": "Scrape", "documentation": "https://www.home-assistant.io/integrations/scrape", "requirements": ["beautifulsoup4==4.8.2"], - "dependencies": [], "after_dependencies": ["rest"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/script/manifest.json b/homeassistant/components/script/manifest.json index ce9899f021c9..32acfcbb93b3 100644 --- a/homeassistant/components/script/manifest.json +++ b/homeassistant/components/script/manifest.json @@ -2,8 +2,6 @@ "domain": "script", "name": "Scripts", "documentation": "https://www.home-assistant.io/integrations/script", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/scsgate/manifest.json b/homeassistant/components/scsgate/manifest.json index a25dc2f88039..88b55bd6b330 100644 --- a/homeassistant/components/scsgate/manifest.json +++ b/homeassistant/components/scsgate/manifest.json @@ -3,6 +3,5 @@ "name": "SCSGate", "documentation": "https://www.home-assistant.io/integrations/scsgate", "requirements": ["scsgate==0.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/search/manifest.json b/homeassistant/components/search/manifest.json index 581a702f514d..c46426530a1c 100644 --- a/homeassistant/components/search/manifest.json +++ b/homeassistant/components/search/manifest.json @@ -2,7 +2,6 @@ "domain": "search", "name": "Search", "documentation": "https://www.home-assistant.io/integrations/search", - "requirements": [], "ssdp": [], "zeroconf": [], "homekit": {}, diff --git a/homeassistant/components/season/manifest.json b/homeassistant/components/season/manifest.json index ca4edaf76a94..e30c5684d2d9 100644 --- a/homeassistant/components/season/manifest.json +++ b/homeassistant/components/season/manifest.json @@ -3,7 +3,6 @@ "name": "Season", "documentation": "https://www.home-assistant.io/integrations/season", "requirements": ["ephem==3.7.7.0"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/sendgrid/manifest.json b/homeassistant/components/sendgrid/manifest.json index 63a511809d86..2309ae6f526f 100644 --- a/homeassistant/components/sendgrid/manifest.json +++ b/homeassistant/components/sendgrid/manifest.json @@ -3,6 +3,5 @@ "name": "SendGrid", "documentation": "https://www.home-assistant.io/integrations/sendgrid", "requirements": ["sendgrid==6.1.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sense/manifest.json b/homeassistant/components/sense/manifest.json index c07e1e4f5c3b..d4ec8ab8a1e1 100644 --- a/homeassistant/components/sense/manifest.json +++ b/homeassistant/components/sense/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "sense_energy==0.7.1" ], - "dependencies": [], "codeowners": [ "@kbickar" ], diff --git a/homeassistant/components/sensehat/manifest.json b/homeassistant/components/sensehat/manifest.json index a56c1c57765d..3ce37884cd0b 100644 --- a/homeassistant/components/sensehat/manifest.json +++ b/homeassistant/components/sensehat/manifest.json @@ -3,6 +3,5 @@ "name": "Sense HAT", "documentation": "https://www.home-assistant.io/integrations/sensehat", "requirements": ["sense-hat==2.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sensibo/manifest.json b/homeassistant/components/sensibo/manifest.json index bcc89e76a699..9d2e3e9e1878 100644 --- a/homeassistant/components/sensibo/manifest.json +++ b/homeassistant/components/sensibo/manifest.json @@ -3,6 +3,5 @@ "name": "Sensibo", "documentation": "https://www.home-assistant.io/integrations/sensibo", "requirements": ["pysensibo==1.0.3"], - "dependencies": [], "codeowners": ["@andrey-git"] } diff --git a/homeassistant/components/sensor/manifest.json b/homeassistant/components/sensor/manifest.json index b57022b963cd..dc62ae3b0316 100644 --- a/homeassistant/components/sensor/manifest.json +++ b/homeassistant/components/sensor/manifest.json @@ -2,8 +2,6 @@ "domain": "sensor", "name": "Sensor", "documentation": "https://www.home-assistant.io/integrations/sensor", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/sentry/manifest.json b/homeassistant/components/sentry/manifest.json index 6a7428f7ea19..a38a250a878f 100644 --- a/homeassistant/components/sentry/manifest.json +++ b/homeassistant/components/sentry/manifest.json @@ -7,6 +7,5 @@ "ssdp": [], "zeroconf": [], "homekit": {}, - "dependencies": [], "codeowners": ["@dcramer"] } diff --git a/homeassistant/components/serial/manifest.json b/homeassistant/components/serial/manifest.json index fa536a4c5081..d8305d10553c 100644 --- a/homeassistant/components/serial/manifest.json +++ b/homeassistant/components/serial/manifest.json @@ -3,6 +3,5 @@ "name": "Serial", "documentation": "https://www.home-assistant.io/integrations/serial", "requirements": ["pyserial-asyncio==0.4"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/serial_pm/manifest.json b/homeassistant/components/serial_pm/manifest.json index 9e8f39ced799..b40090ca4976 100644 --- a/homeassistant/components/serial_pm/manifest.json +++ b/homeassistant/components/serial_pm/manifest.json @@ -3,6 +3,5 @@ "name": "Serial Particulate Matter", "documentation": "https://www.home-assistant.io/integrations/serial_pm", "requirements": ["pmsensor==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sesame/manifest.json b/homeassistant/components/sesame/manifest.json index 720e33b9cd9e..0ba0fa8c8ebe 100644 --- a/homeassistant/components/sesame/manifest.json +++ b/homeassistant/components/sesame/manifest.json @@ -3,6 +3,5 @@ "name": "Sesame Smart Lock", "documentation": "https://www.home-assistant.io/integrations/sesame", "requirements": ["pysesame2==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/seven_segments/manifest.json b/homeassistant/components/seven_segments/manifest.json index eba33e75f717..2bee5379a1b9 100644 --- a/homeassistant/components/seven_segments/manifest.json +++ b/homeassistant/components/seven_segments/manifest.json @@ -5,6 +5,5 @@ "requirements": [ "pillow==7.0.0" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/seventeentrack/manifest.json b/homeassistant/components/seventeentrack/manifest.json index c5082b8c05f8..2cec9dea954a 100644 --- a/homeassistant/components/seventeentrack/manifest.json +++ b/homeassistant/components/seventeentrack/manifest.json @@ -3,6 +3,5 @@ "name": "17TRACK", "documentation": "https://www.home-assistant.io/integrations/seventeentrack", "requirements": ["py17track==2.2.2"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/shell_command/manifest.json b/homeassistant/components/shell_command/manifest.json index e05824a87a9d..bdef9467d855 100644 --- a/homeassistant/components/shell_command/manifest.json +++ b/homeassistant/components/shell_command/manifest.json @@ -2,8 +2,6 @@ "domain": "shell_command", "name": "Shell Command", "documentation": "https://www.home-assistant.io/integrations/shell_command", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/shiftr/manifest.json b/homeassistant/components/shiftr/manifest.json index dc9ec618a79c..79189e6b047f 100644 --- a/homeassistant/components/shiftr/manifest.json +++ b/homeassistant/components/shiftr/manifest.json @@ -3,6 +3,5 @@ "name": "shiftr.io", "documentation": "https://www.home-assistant.io/integrations/shiftr", "requirements": ["paho-mqtt==1.5.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/shodan/manifest.json b/homeassistant/components/shodan/manifest.json index 860061919422..0e8ce3dc963a 100644 --- a/homeassistant/components/shodan/manifest.json +++ b/homeassistant/components/shodan/manifest.json @@ -3,6 +3,5 @@ "name": "Shodan", "documentation": "https://www.home-assistant.io/integrations/shodan", "requirements": ["shodan==1.22.0"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/shopping_list/manifest.json b/homeassistant/components/shopping_list/manifest.json index ad060f16756a..38829d80f0ab 100644 --- a/homeassistant/components/shopping_list/manifest.json +++ b/homeassistant/components/shopping_list/manifest.json @@ -2,7 +2,6 @@ "domain": "shopping_list", "name": "Shopping List", "documentation": "https://www.home-assistant.io/integrations/shopping_list", - "requirements": [], "dependencies": ["http"], "codeowners": [], "config_flow": true, diff --git a/homeassistant/components/sht31/manifest.json b/homeassistant/components/sht31/manifest.json index 3d36e7f5797f..899215ffe71a 100644 --- a/homeassistant/components/sht31/manifest.json +++ b/homeassistant/components/sht31/manifest.json @@ -3,6 +3,5 @@ "name": "Sensirion SHT31", "documentation": "https://www.home-assistant.io/integrations/sht31", "requirements": ["Adafruit-GPIO==1.0.3", "Adafruit-SHT31==1.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sigfox/manifest.json b/homeassistant/components/sigfox/manifest.json index 689703302a79..b3ad57f3727a 100644 --- a/homeassistant/components/sigfox/manifest.json +++ b/homeassistant/components/sigfox/manifest.json @@ -2,7 +2,5 @@ "domain": "sigfox", "name": "Sigfox", "documentation": "https://www.home-assistant.io/integrations/sigfox", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sighthound/manifest.json b/homeassistant/components/sighthound/manifest.json index a891d807f57f..b4e80884484e 100644 --- a/homeassistant/components/sighthound/manifest.json +++ b/homeassistant/components/sighthound/manifest.json @@ -6,8 +6,7 @@ "pillow==7.0.0", "simplehound==0.3" ], - "dependencies": [], "codeowners": [ "@robmarkcole" ] -} \ No newline at end of file +} diff --git a/homeassistant/components/signal_messenger/manifest.json b/homeassistant/components/signal_messenger/manifest.json index 3efa1c33e854..f1db6a8af302 100644 --- a/homeassistant/components/signal_messenger/manifest.json +++ b/homeassistant/components/signal_messenger/manifest.json @@ -2,7 +2,6 @@ "domain": "signal_messenger", "name": "Signal Messenger", "documentation": "https://www.home-assistant.io/integrations/signal_messenger", - "dependencies": [], "codeowners": ["@bbernhard"], "requirements": ["pysignalclirestapi==0.2.4"] } diff --git a/homeassistant/components/simplepush/manifest.json b/homeassistant/components/simplepush/manifest.json index b6d8005431bf..70c4f1b4580e 100644 --- a/homeassistant/components/simplepush/manifest.json +++ b/homeassistant/components/simplepush/manifest.json @@ -3,6 +3,5 @@ "name": "Simplepush", "documentation": "https://www.home-assistant.io/integrations/simplepush", "requirements": ["simplepush==1.1.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/simplisafe/manifest.json b/homeassistant/components/simplisafe/manifest.json index 917722a61b81..3cf528adec1e 100644 --- a/homeassistant/components/simplisafe/manifest.json +++ b/homeassistant/components/simplisafe/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/simplisafe", "requirements": ["simplisafe-python==9.0.5"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/simulated/manifest.json b/homeassistant/components/simulated/manifest.json index 6a30f6a00cc1..72514c80f972 100644 --- a/homeassistant/components/simulated/manifest.json +++ b/homeassistant/components/simulated/manifest.json @@ -2,8 +2,6 @@ "domain": "simulated", "name": "Simulated", "documentation": "https://www.home-assistant.io/integrations/simulated", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/sinch/manifest.json b/homeassistant/components/sinch/manifest.json index d69362901ec9..c1968cff445c 100644 --- a/homeassistant/components/sinch/manifest.json +++ b/homeassistant/components/sinch/manifest.json @@ -2,7 +2,6 @@ "domain": "sinch", "name": "Sinch SMS", "documentation": "https://www.home-assistant.io/integrations/sinch", - "dependencies": [], "codeowners": ["@bendikrb"], "requirements": ["clx-sdk-xms==1.0.0"] } diff --git a/homeassistant/components/sisyphus/manifest.json b/homeassistant/components/sisyphus/manifest.json index c545adda2818..fdd5961d33ae 100644 --- a/homeassistant/components/sisyphus/manifest.json +++ b/homeassistant/components/sisyphus/manifest.json @@ -3,6 +3,5 @@ "name": "Sisyphus", "documentation": "https://www.home-assistant.io/integrations/sisyphus", "requirements": ["sisyphus-control==2.2.1"], - "dependencies": [], "codeowners": ["@jkeljo"] } diff --git a/homeassistant/components/sky_hub/manifest.json b/homeassistant/components/sky_hub/manifest.json index 4d2b3733a0c3..b358fa76fbfb 100644 --- a/homeassistant/components/sky_hub/manifest.json +++ b/homeassistant/components/sky_hub/manifest.json @@ -2,7 +2,5 @@ "domain": "sky_hub", "name": "Sky Hub", "documentation": "https://www.home-assistant.io/integrations/sky_hub", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/skybeacon/manifest.json b/homeassistant/components/skybeacon/manifest.json index 03ff593bb4ab..2ce19afc6c53 100644 --- a/homeassistant/components/skybeacon/manifest.json +++ b/homeassistant/components/skybeacon/manifest.json @@ -3,6 +3,5 @@ "name": "Skybeacon", "documentation": "https://www.home-assistant.io/integrations/skybeacon", "requirements": ["pygatt[GATTTOOL]==4.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/skybell/manifest.json b/homeassistant/components/skybell/manifest.json index 8e3ec66356c2..9e0a0be8905a 100644 --- a/homeassistant/components/skybell/manifest.json +++ b/homeassistant/components/skybell/manifest.json @@ -3,6 +3,5 @@ "name": "SkyBell", "documentation": "https://www.home-assistant.io/integrations/skybell", "requirements": ["skybellpy==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/slack/manifest.json b/homeassistant/components/slack/manifest.json index 86785868170f..ad45abbe3c0a 100644 --- a/homeassistant/components/slack/manifest.json +++ b/homeassistant/components/slack/manifest.json @@ -3,6 +3,5 @@ "name": "Slack", "documentation": "https://www.home-assistant.io/integrations/slack", "requirements": ["slackclient==2.5.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sleepiq/manifest.json b/homeassistant/components/sleepiq/manifest.json index e6b0fe5c34a5..44e519f57da4 100644 --- a/homeassistant/components/sleepiq/manifest.json +++ b/homeassistant/components/sleepiq/manifest.json @@ -3,6 +3,5 @@ "name": "SleepIQ", "documentation": "https://www.home-assistant.io/integrations/sleepiq", "requirements": ["sleepyq==0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/slide/manifest.json b/homeassistant/components/slide/manifest.json index 74dc562203fb..d5567b0d3474 100644 --- a/homeassistant/components/slide/manifest.json +++ b/homeassistant/components/slide/manifest.json @@ -3,6 +3,5 @@ "name": "Slide", "documentation": "https://www.home-assistant.io/integrations/slide", "requirements": ["goslide-api==0.5.1"], - "dependencies": [], "codeowners": ["@ualex73"] } diff --git a/homeassistant/components/sma/manifest.json b/homeassistant/components/sma/manifest.json index a56fe7ab1519..9cadec377a24 100644 --- a/homeassistant/components/sma/manifest.json +++ b/homeassistant/components/sma/manifest.json @@ -3,6 +3,5 @@ "name": "SMA Solar", "documentation": "https://www.home-assistant.io/integrations/sma", "requirements": ["pysma==0.3.5"], - "dependencies": [], "codeowners": ["@kellerza"] } diff --git a/homeassistant/components/smappee/manifest.json b/homeassistant/components/smappee/manifest.json index f3ed9c6e620c..e2c24bf6d715 100644 --- a/homeassistant/components/smappee/manifest.json +++ b/homeassistant/components/smappee/manifest.json @@ -3,6 +3,5 @@ "name": "Smappee", "documentation": "https://www.home-assistant.io/integrations/smappee", "requirements": ["smappy==0.2.16"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/smarthab/manifest.json b/homeassistant/components/smarthab/manifest.json index dc3a28576599..141928d2d921 100644 --- a/homeassistant/components/smarthab/manifest.json +++ b/homeassistant/components/smarthab/manifest.json @@ -3,6 +3,5 @@ "name": "SmartHab", "documentation": "https://www.home-assistant.io/integrations/smarthab", "requirements": ["smarthab==0.20"], - "dependencies": [], "codeowners": ["@outadoc"] } diff --git a/homeassistant/components/smarty/manifest.json b/homeassistant/components/smarty/manifest.json index 1e56cf84e476..b55f3f11c3e5 100644 --- a/homeassistant/components/smarty/manifest.json +++ b/homeassistant/components/smarty/manifest.json @@ -3,6 +3,5 @@ "name": "Salda Smarty", "documentation": "https://www.home-assistant.io/integrations/smarty", "requirements": ["pysmarty==0.8"], - "dependencies": [], "codeowners": ["@z0mbieprocess"] } diff --git a/homeassistant/components/smhi/manifest.json b/homeassistant/components/smhi/manifest.json index af8c64ac06f6..2e21f62a599c 100644 --- a/homeassistant/components/smhi/manifest.json +++ b/homeassistant/components/smhi/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/smhi", "requirements": ["smhi-pkg==1.0.13"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sms/manifest.json b/homeassistant/components/sms/manifest.json index c58139993bbf..8b65ac77e59b 100644 --- a/homeassistant/components/sms/manifest.json +++ b/homeassistant/components/sms/manifest.json @@ -3,6 +3,5 @@ "name": "SMS notifications via GSM-modem", "documentation": "https://www.home-assistant.io/integrations/sms", "requirements": ["python-gammu==2.12"], - "dependencies": [], "codeowners": ["@ocalvo"] } diff --git a/homeassistant/components/smtp/manifest.json b/homeassistant/components/smtp/manifest.json index 974eb6847655..334687a80478 100644 --- a/homeassistant/components/smtp/manifest.json +++ b/homeassistant/components/smtp/manifest.json @@ -2,7 +2,5 @@ "domain": "smtp", "name": "SMTP", "documentation": "https://www.home-assistant.io/integrations/smtp", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/snapcast/manifest.json b/homeassistant/components/snapcast/manifest.json index e64d062b3201..31eb0491eb4f 100644 --- a/homeassistant/components/snapcast/manifest.json +++ b/homeassistant/components/snapcast/manifest.json @@ -3,6 +3,5 @@ "name": "Snapcast", "documentation": "https://www.home-assistant.io/integrations/snapcast", "requirements": ["snapcast==2.0.10"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/snips/manifest.json b/homeassistant/components/snips/manifest.json index 8aeb5bbb1864..c704164c17ff 100644 --- a/homeassistant/components/snips/manifest.json +++ b/homeassistant/components/snips/manifest.json @@ -2,7 +2,6 @@ "domain": "snips", "name": "Snips", "documentation": "https://www.home-assistant.io/integrations/snips", - "requirements": [], "dependencies": ["mqtt"], "codeowners": [] } diff --git a/homeassistant/components/snmp/manifest.json b/homeassistant/components/snmp/manifest.json index a01bee29b33c..1dfdc36a0cb7 100644 --- a/homeassistant/components/snmp/manifest.json +++ b/homeassistant/components/snmp/manifest.json @@ -3,6 +3,5 @@ "name": "SNMP", "documentation": "https://www.home-assistant.io/integrations/snmp", "requirements": ["pysnmp==4.4.12"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sochain/manifest.json b/homeassistant/components/sochain/manifest.json index 1cc3a76c3be2..db89dfc219e3 100644 --- a/homeassistant/components/sochain/manifest.json +++ b/homeassistant/components/sochain/manifest.json @@ -3,6 +3,5 @@ "name": "SoChain", "documentation": "https://www.home-assistant.io/integrations/sochain", "requirements": ["python-sochain-api==0.0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/socialblade/manifest.json b/homeassistant/components/socialblade/manifest.json index 540febe7f2e6..d73e76869476 100644 --- a/homeassistant/components/socialblade/manifest.json +++ b/homeassistant/components/socialblade/manifest.json @@ -3,6 +3,5 @@ "name": "Social Blade", "documentation": "https://www.home-assistant.io/integrations/socialblade", "requirements": ["socialbladeclient==0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/solaredge/manifest.json b/homeassistant/components/solaredge/manifest.json index f3c10e98dcf4..59b8cba74462 100644 --- a/homeassistant/components/solaredge/manifest.json +++ b/homeassistant/components/solaredge/manifest.json @@ -4,6 +4,5 @@ "documentation": "https://www.home-assistant.io/integrations/solaredge", "requirements": ["solaredge==0.0.2", "stringcase==1.2.0"], "config_flow": true, - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/solaredge_local/manifest.json b/homeassistant/components/solaredge_local/manifest.json index 02fe4dad3985..8f8b80c2c659 100644 --- a/homeassistant/components/solaredge_local/manifest.json +++ b/homeassistant/components/solaredge_local/manifest.json @@ -3,6 +3,5 @@ "name": "SolarEdge Local", "documentation": "https://www.home-assistant.io/integrations/solaredge_local", "requirements": ["solaredge-local==0.2.0"], - "dependencies": [], "codeowners": ["@drobtravels", "@scheric"] } diff --git a/homeassistant/components/solarlog/manifest.json b/homeassistant/components/solarlog/manifest.json index b626da456a96..f24f9b9473c7 100644 --- a/homeassistant/components/solarlog/manifest.json +++ b/homeassistant/components/solarlog/manifest.json @@ -3,7 +3,6 @@ "name": "Solar-Log", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/solarlog", - "dependencies": [], "codeowners": ["@Ernst79"], "requirements": ["sunwatcher==0.2.1"] } diff --git a/homeassistant/components/solax/manifest.json b/homeassistant/components/solax/manifest.json index 6c0e9c3b01d4..296c1b73ba9f 100644 --- a/homeassistant/components/solax/manifest.json +++ b/homeassistant/components/solax/manifest.json @@ -3,6 +3,5 @@ "name": "SolaX Power", "documentation": "https://www.home-assistant.io/integrations/solax", "requirements": ["solax==0.2.2"], - "dependencies": [], "codeowners": ["@squishykid"] } diff --git a/homeassistant/components/soma/manifest.json b/homeassistant/components/soma/manifest.json index a724a3d4485a..3c96ef2efddc 100644 --- a/homeassistant/components/soma/manifest.json +++ b/homeassistant/components/soma/manifest.json @@ -3,7 +3,6 @@ "name": "Soma Connect", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/soma", - "dependencies": [], "codeowners": ["@ratsept"], "requirements": ["pysoma==0.0.10"] } diff --git a/homeassistant/components/somfy_mylink/manifest.json b/homeassistant/components/somfy_mylink/manifest.json index 03b69f070d05..c259f827d518 100644 --- a/homeassistant/components/somfy_mylink/manifest.json +++ b/homeassistant/components/somfy_mylink/manifest.json @@ -3,6 +3,5 @@ "name": "Somfy MyLink", "documentation": "https://www.home-assistant.io/integrations/somfy_mylink", "requirements": ["somfy-mylink-synergy==1.0.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sonarr/manifest.json b/homeassistant/components/sonarr/manifest.json index ae32083da39c..26a5c0095e40 100644 --- a/homeassistant/components/sonarr/manifest.json +++ b/homeassistant/components/sonarr/manifest.json @@ -2,7 +2,5 @@ "domain": "sonarr", "name": "Sonarr", "documentation": "https://www.home-assistant.io/integrations/sonarr", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/songpal/manifest.json b/homeassistant/components/songpal/manifest.json index a82ffc41e298..583f0dff6efe 100644 --- a/homeassistant/components/songpal/manifest.json +++ b/homeassistant/components/songpal/manifest.json @@ -3,6 +3,5 @@ "name": "Sony Songpal", "documentation": "https://www.home-assistant.io/integrations/songpal", "requirements": ["python-songpal==0.11.2"], - "dependencies": [], "codeowners": ["@rytilahti"] } diff --git a/homeassistant/components/sonos/manifest.json b/homeassistant/components/sonos/manifest.json index a015e7a5095c..ee035fb59c1d 100644 --- a/homeassistant/components/sonos/manifest.json +++ b/homeassistant/components/sonos/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/sonos", "requirements": ["pysonos==0.0.25"], - "dependencies": [], "ssdp": [ { "st": "urn:schemas-upnp-org:device:ZonePlayer:1" diff --git a/homeassistant/components/sony_projector/manifest.json b/homeassistant/components/sony_projector/manifest.json index b92d7bd204ed..3e86eae6b809 100644 --- a/homeassistant/components/sony_projector/manifest.json +++ b/homeassistant/components/sony_projector/manifest.json @@ -3,6 +3,5 @@ "name": "Sony Projector", "documentation": "https://www.home-assistant.io/integrations/sony_projector", "requirements": ["pysdcp==1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/soundtouch/manifest.json b/homeassistant/components/soundtouch/manifest.json index 25c4f7d1d1cf..6477983d94f8 100644 --- a/homeassistant/components/soundtouch/manifest.json +++ b/homeassistant/components/soundtouch/manifest.json @@ -3,6 +3,5 @@ "name": "Bose Soundtouch", "documentation": "https://www.home-assistant.io/integrations/soundtouch", "requirements": ["libsoundtouch==0.7.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/spaceapi/manifest.json b/homeassistant/components/spaceapi/manifest.json index 10580321c296..598ea05ace6f 100644 --- a/homeassistant/components/spaceapi/manifest.json +++ b/homeassistant/components/spaceapi/manifest.json @@ -2,7 +2,6 @@ "domain": "spaceapi", "name": "Space API", "documentation": "https://www.home-assistant.io/integrations/spaceapi", - "requirements": [], "dependencies": ["http"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/spc/manifest.json b/homeassistant/components/spc/manifest.json index 99e6bc480126..63fb359371f8 100644 --- a/homeassistant/components/spc/manifest.json +++ b/homeassistant/components/spc/manifest.json @@ -3,6 +3,5 @@ "name": "Vanderbilt SPC", "documentation": "https://www.home-assistant.io/integrations/spc", "requirements": ["pyspcwebgw==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/speedtestdotnet/manifest.json b/homeassistant/components/speedtestdotnet/manifest.json index c3c76101ce78..1ba5f418fc3e 100644 --- a/homeassistant/components/speedtestdotnet/manifest.json +++ b/homeassistant/components/speedtestdotnet/manifest.json @@ -3,6 +3,5 @@ "name": "Speedtest.net", "documentation": "https://www.home-assistant.io/integrations/speedtestdotnet", "requirements": ["speedtest-cli==2.1.2"], - "dependencies": [], "codeowners": ["@rohankapoorcom"] } diff --git a/homeassistant/components/spider/manifest.json b/homeassistant/components/spider/manifest.json index c61b41868478..8fa108f24f75 100644 --- a/homeassistant/components/spider/manifest.json +++ b/homeassistant/components/spider/manifest.json @@ -3,6 +3,5 @@ "name": "Itho Daalderop Spider", "documentation": "https://www.home-assistant.io/integrations/spider", "requirements": ["spiderpy==1.3.1"], - "dependencies": [], "codeowners": ["@peternijssen"] } diff --git a/homeassistant/components/splunk/manifest.json b/homeassistant/components/splunk/manifest.json index a6972e8881d3..337458b4c3f9 100644 --- a/homeassistant/components/splunk/manifest.json +++ b/homeassistant/components/splunk/manifest.json @@ -2,7 +2,5 @@ "domain": "splunk", "name": "Splunk", "documentation": "https://www.home-assistant.io/integrations/splunk", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/spotcrime/manifest.json b/homeassistant/components/spotcrime/manifest.json index 6fa2b10544dd..fd0184f1b21c 100644 --- a/homeassistant/components/spotcrime/manifest.json +++ b/homeassistant/components/spotcrime/manifest.json @@ -3,6 +3,5 @@ "name": "Spot Crime", "documentation": "https://www.home-assistant.io/integrations/spotcrime", "requirements": ["spotcrime==1.0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/sql/manifest.json b/homeassistant/components/sql/manifest.json index 9d6e7f7b62bc..306e65e04704 100644 --- a/homeassistant/components/sql/manifest.json +++ b/homeassistant/components/sql/manifest.json @@ -3,6 +3,5 @@ "name": "SQL", "documentation": "https://www.home-assistant.io/integrations/sql", "requirements": ["sqlalchemy==1.3.15"], - "dependencies": [], "codeowners": ["@dgomes"] } diff --git a/homeassistant/components/squeezebox/manifest.json b/homeassistant/components/squeezebox/manifest.json index b5297db96ce3..bbd32e9eefea 100644 --- a/homeassistant/components/squeezebox/manifest.json +++ b/homeassistant/components/squeezebox/manifest.json @@ -2,7 +2,5 @@ "domain": "squeezebox", "name": "Logitech Squeezebox", "documentation": "https://www.home-assistant.io/integrations/squeezebox", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ssdp/manifest.json b/homeassistant/components/ssdp/manifest.json index 77e212a08330..a2683346b638 100644 --- a/homeassistant/components/ssdp/manifest.json +++ b/homeassistant/components/ssdp/manifest.json @@ -3,6 +3,5 @@ "name": "Simple Service Discovery Protocol (SSDP)", "documentation": "https://www.home-assistant.io/integrations/ssdp", "requirements": ["defusedxml==0.6.0", "netdisco==2.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/starline/manifest.json b/homeassistant/components/starline/manifest.json index a7bdd241b559..d0cba0297876 100644 --- a/homeassistant/components/starline/manifest.json +++ b/homeassistant/components/starline/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/starline", "requirements": ["starline==0.1.3"], - "dependencies": [], "codeowners": ["@anonym-tsk"] } diff --git a/homeassistant/components/starlingbank/manifest.json b/homeassistant/components/starlingbank/manifest.json index 82ac665031e3..cb0ecc63d698 100644 --- a/homeassistant/components/starlingbank/manifest.json +++ b/homeassistant/components/starlingbank/manifest.json @@ -3,6 +3,5 @@ "name": "Starling Bank", "documentation": "https://www.home-assistant.io/integrations/starlingbank", "requirements": ["starlingbank==3.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/startca/manifest.json b/homeassistant/components/startca/manifest.json index a8aafee91acc..68ac1aeb65bc 100644 --- a/homeassistant/components/startca/manifest.json +++ b/homeassistant/components/startca/manifest.json @@ -3,6 +3,5 @@ "name": "Start.ca", "documentation": "https://www.home-assistant.io/integrations/startca", "requirements": ["xmltodict==0.12.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/statistics/manifest.json b/homeassistant/components/statistics/manifest.json index 8df384dd0bd3..bf0de54aa829 100644 --- a/homeassistant/components/statistics/manifest.json +++ b/homeassistant/components/statistics/manifest.json @@ -2,8 +2,6 @@ "domain": "statistics", "name": "Statistics", "documentation": "https://www.home-assistant.io/integrations/statistics", - "requirements": [], - "dependencies": [], "after_dependencies": ["recorder"], "codeowners": ["@fabaff"], "quality_scale": "internal" diff --git a/homeassistant/components/statsd/manifest.json b/homeassistant/components/statsd/manifest.json index 22478ee0fc7c..c2e5f0bc33f9 100644 --- a/homeassistant/components/statsd/manifest.json +++ b/homeassistant/components/statsd/manifest.json @@ -3,6 +3,5 @@ "name": "StatsD", "documentation": "https://www.home-assistant.io/integrations/statsd", "requirements": ["statsd==3.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/steam_online/manifest.json b/homeassistant/components/steam_online/manifest.json index d45aea513884..99015e54a4ce 100644 --- a/homeassistant/components/steam_online/manifest.json +++ b/homeassistant/components/steam_online/manifest.json @@ -3,6 +3,5 @@ "name": "Steam", "documentation": "https://www.home-assistant.io/integrations/steam_online", "requirements": ["steamodd==4.21"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/stookalert/manifest.json b/homeassistant/components/stookalert/manifest.json index 73e59c2eddb3..dc12512920e2 100644 --- a/homeassistant/components/stookalert/manifest.json +++ b/homeassistant/components/stookalert/manifest.json @@ -2,7 +2,6 @@ "domain": "stookalert", "name": "RIVM Stookalert", "documentation": "https://www.home-assistant.io/integrations/stookalert", - "dependencies": [], "codeowners": ["@fwestenberg"], "requirements": ["stookalert==0.1.4"] } diff --git a/homeassistant/components/streamlabswater/manifest.json b/homeassistant/components/streamlabswater/manifest.json index 52d6fb724f88..d1c01cb66b50 100644 --- a/homeassistant/components/streamlabswater/manifest.json +++ b/homeassistant/components/streamlabswater/manifest.json @@ -3,6 +3,5 @@ "name": "StreamLabs", "documentation": "https://www.home-assistant.io/integrations/streamlabswater", "requirements": ["streamlabswater==1.0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/stt/manifest.json b/homeassistant/components/stt/manifest.json index c25221f5baa7..a3529dcd0b55 100644 --- a/homeassistant/components/stt/manifest.json +++ b/homeassistant/components/stt/manifest.json @@ -2,7 +2,6 @@ "domain": "stt", "name": "Speech-to-Text (STT)", "documentation": "https://www.home-assistant.io/integrations/stt", - "requirements": [], "dependencies": ["http"], "codeowners": ["@pvizeli"] } diff --git a/homeassistant/components/suez_water/manifest.json b/homeassistant/components/suez_water/manifest.json index 90b6f2ebc73d..fface9b495a8 100644 --- a/homeassistant/components/suez_water/manifest.json +++ b/homeassistant/components/suez_water/manifest.json @@ -2,7 +2,6 @@ "domain": "suez_water", "name": "Suez Water", "documentation": "https://www.home-assistant.io/integrations/suez_water", - "dependencies": [], "codeowners": ["@ooii"], "requirements": ["pysuez==0.1.17"] } diff --git a/homeassistant/components/sun/manifest.json b/homeassistant/components/sun/manifest.json index f0fb80923b10..c406a339a5f9 100644 --- a/homeassistant/components/sun/manifest.json +++ b/homeassistant/components/sun/manifest.json @@ -2,8 +2,6 @@ "domain": "sun", "name": "Sun", "documentation": "https://www.home-assistant.io/integrations/sun", - "requirements": [], - "dependencies": [], "codeowners": ["@Swamp-Ig"], "quality_scale": "internal" } diff --git a/homeassistant/components/supervisord/manifest.json b/homeassistant/components/supervisord/manifest.json index eaf1e66cff45..82f4027d359a 100644 --- a/homeassistant/components/supervisord/manifest.json +++ b/homeassistant/components/supervisord/manifest.json @@ -2,7 +2,5 @@ "domain": "supervisord", "name": "Supervisord", "documentation": "https://www.home-assistant.io/integrations/supervisord", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/supla/manifest.json b/homeassistant/components/supla/manifest.json index 742e6a07c4a7..a4ab0e727194 100644 --- a/homeassistant/components/supla/manifest.json +++ b/homeassistant/components/supla/manifest.json @@ -3,6 +3,5 @@ "name": "Supla", "documentation": "https://www.home-assistant.io/integrations/supla", "requirements": ["pysupla==0.0.3"], - "dependencies": [], "codeowners": ["@mwegrzynek"] } diff --git a/homeassistant/components/surepetcare/manifest.json b/homeassistant/components/surepetcare/manifest.json index b1efa4ce639b..6d34ff477cea 100644 --- a/homeassistant/components/surepetcare/manifest.json +++ b/homeassistant/components/surepetcare/manifest.json @@ -2,7 +2,6 @@ "domain": "surepetcare", "name": "Sure Petcare", "documentation": "https://www.home-assistant.io/integrations/surepetcare", - "dependencies": [], "codeowners": ["@benleb"], "requirements": ["surepy==0.2.3"] } diff --git a/homeassistant/components/swiss_hydrological_data/manifest.json b/homeassistant/components/swiss_hydrological_data/manifest.json index 88d7bfe5104a..b293e5c2e1de 100644 --- a/homeassistant/components/swiss_hydrological_data/manifest.json +++ b/homeassistant/components/swiss_hydrological_data/manifest.json @@ -3,6 +3,5 @@ "name": "Swiss Hydrological Data", "documentation": "https://www.home-assistant.io/integrations/swiss_hydrological_data", "requirements": ["swisshydrodata==0.0.3"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/swiss_public_transport/manifest.json b/homeassistant/components/swiss_public_transport/manifest.json index 2ef1e8fa69db..ae7601ebc8e0 100644 --- a/homeassistant/components/swiss_public_transport/manifest.json +++ b/homeassistant/components/swiss_public_transport/manifest.json @@ -3,6 +3,5 @@ "name": "Swiss public transport", "documentation": "https://www.home-assistant.io/integrations/swiss_public_transport", "requirements": ["python_opendata_transport==0.2.1"], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/swisscom/manifest.json b/homeassistant/components/swisscom/manifest.json index caf18c8da3ec..f9f023e8e3cf 100644 --- a/homeassistant/components/swisscom/manifest.json +++ b/homeassistant/components/swisscom/manifest.json @@ -2,7 +2,5 @@ "domain": "swisscom", "name": "Swisscom Internet-Box", "documentation": "https://www.home-assistant.io/integrations/swisscom", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/switch/manifest.json b/homeassistant/components/switch/manifest.json index 37cdf77172ca..6f0113d1b9c1 100644 --- a/homeassistant/components/switch/manifest.json +++ b/homeassistant/components/switch/manifest.json @@ -2,8 +2,6 @@ "domain": "switch", "name": "Switch", "documentation": "https://www.home-assistant.io/integrations/switch", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/switchbot/manifest.json b/homeassistant/components/switchbot/manifest.json index b076b254b9f6..2bbca5ae50ae 100644 --- a/homeassistant/components/switchbot/manifest.json +++ b/homeassistant/components/switchbot/manifest.json @@ -3,6 +3,5 @@ "name": "SwitchBot", "documentation": "https://www.home-assistant.io/integrations/switchbot", "requirements": ["PySwitchbot==0.8.0"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/switchmate/manifest.json b/homeassistant/components/switchmate/manifest.json index 1035b86d6ce4..30dc08d1dce7 100644 --- a/homeassistant/components/switchmate/manifest.json +++ b/homeassistant/components/switchmate/manifest.json @@ -3,6 +3,5 @@ "name": "Switchmate SimplySmart Home", "documentation": "https://www.home-assistant.io/integrations/switchmate", "requirements": ["pySwitchmate==0.4.6"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/syncthru/manifest.json b/homeassistant/components/syncthru/manifest.json index ac9f6f8b2ccb..a891a00f41d5 100644 --- a/homeassistant/components/syncthru/manifest.json +++ b/homeassistant/components/syncthru/manifest.json @@ -3,6 +3,5 @@ "name": "Samsung SyncThru Printer", "documentation": "https://www.home-assistant.io/integrations/syncthru", "requirements": ["pysyncthru==0.5.0"], - "dependencies": [], "codeowners": ["@nielstron"] } diff --git a/homeassistant/components/synology/manifest.json b/homeassistant/components/synology/manifest.json index c541a4903c11..a29dccc2a782 100644 --- a/homeassistant/components/synology/manifest.json +++ b/homeassistant/components/synology/manifest.json @@ -3,6 +3,5 @@ "name": "Synology", "documentation": "https://www.home-assistant.io/integrations/synology", "requirements": ["py-synology==0.2.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/synology_chat/manifest.json b/homeassistant/components/synology_chat/manifest.json index bfc888b99d90..e11e7911488c 100644 --- a/homeassistant/components/synology_chat/manifest.json +++ b/homeassistant/components/synology_chat/manifest.json @@ -2,7 +2,5 @@ "domain": "synology_chat", "name": "Synology Chat", "documentation": "https://www.home-assistant.io/integrations/synology_chat", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/synology_srm/manifest.json b/homeassistant/components/synology_srm/manifest.json index 47c8c46fee13..d92759e5eec3 100644 --- a/homeassistant/components/synology_srm/manifest.json +++ b/homeassistant/components/synology_srm/manifest.json @@ -3,6 +3,5 @@ "name": "Synology SRM", "documentation": "https://www.home-assistant.io/integrations/synology_srm", "requirements": ["synology-srm==0.0.7"], - "dependencies": [], "codeowners": ["@aerialls"] } diff --git a/homeassistant/components/synologydsm/manifest.json b/homeassistant/components/synologydsm/manifest.json index 586fe75c6979..1173d2de699f 100644 --- a/homeassistant/components/synologydsm/manifest.json +++ b/homeassistant/components/synologydsm/manifest.json @@ -3,6 +3,5 @@ "name": "SynologyDSM", "documentation": "https://www.home-assistant.io/integrations/synologydsm", "requirements": ["python-synology==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/syslog/manifest.json b/homeassistant/components/syslog/manifest.json index d3964b747a20..07a74b663646 100644 --- a/homeassistant/components/syslog/manifest.json +++ b/homeassistant/components/syslog/manifest.json @@ -2,7 +2,5 @@ "domain": "syslog", "name": "Syslog", "documentation": "https://www.home-assistant.io/integrations/syslog", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/system_health/manifest.json b/homeassistant/components/system_health/manifest.json index c75054232bc5..4109855d466a 100644 --- a/homeassistant/components/system_health/manifest.json +++ b/homeassistant/components/system_health/manifest.json @@ -2,7 +2,6 @@ "domain": "system_health", "name": "System Health", "documentation": "https://www.home-assistant.io/integrations/system_health", - "requirements": [], "dependencies": ["http"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/system_log/manifest.json b/homeassistant/components/system_log/manifest.json index 77cfbd620594..f717af2ad854 100644 --- a/homeassistant/components/system_log/manifest.json +++ b/homeassistant/components/system_log/manifest.json @@ -2,7 +2,6 @@ "domain": "system_log", "name": "System Log", "documentation": "https://www.home-assistant.io/integrations/system_log", - "requirements": [], "dependencies": ["http"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/systemmonitor/manifest.json b/homeassistant/components/systemmonitor/manifest.json index de8228f09a9e..5753dbbf6820 100644 --- a/homeassistant/components/systemmonitor/manifest.json +++ b/homeassistant/components/systemmonitor/manifest.json @@ -3,6 +3,5 @@ "name": "System Monitor", "documentation": "https://www.home-assistant.io/integrations/systemmonitor", "requirements": ["psutil==5.7.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tado/manifest.json b/homeassistant/components/tado/manifest.json index ce4679a23e25..f0aa605f1644 100644 --- a/homeassistant/components/tado/manifest.json +++ b/homeassistant/components/tado/manifest.json @@ -5,7 +5,6 @@ "requirements": [ "python-tado==0.6.0" ], - "dependencies": [], "codeowners": [ "@michaelarnauts", "@bdraco" ] diff --git a/homeassistant/components/tahoma/manifest.json b/homeassistant/components/tahoma/manifest.json index f01d6740b563..12f1eb7d0a1c 100644 --- a/homeassistant/components/tahoma/manifest.json +++ b/homeassistant/components/tahoma/manifest.json @@ -3,6 +3,5 @@ "name": "Tahoma", "documentation": "https://www.home-assistant.io/integrations/tahoma", "requirements": ["tahoma-api==0.0.16"], - "dependencies": [], "codeowners": ["@philklei"] } diff --git a/homeassistant/components/tank_utility/manifest.json b/homeassistant/components/tank_utility/manifest.json index 68d487ce5c54..dafe90193f6f 100644 --- a/homeassistant/components/tank_utility/manifest.json +++ b/homeassistant/components/tank_utility/manifest.json @@ -3,6 +3,5 @@ "name": "Tank Utility", "documentation": "https://www.home-assistant.io/integrations/tank_utility", "requirements": ["tank_utility==1.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tankerkoenig/manifest.json b/homeassistant/components/tankerkoenig/manifest.json index 1b22e62d5efb..ee0c573b3cd7 100755 --- a/homeassistant/components/tankerkoenig/manifest.json +++ b/homeassistant/components/tankerkoenig/manifest.json @@ -3,7 +3,6 @@ "name": "Tankerkoenig", "documentation": "https://www.home-assistant.io/integrations/tankerkoenig", "requirements": ["pytankerkoenig==0.0.6"], - "dependencies": [], "codeowners": [ "@guillempages" ] diff --git a/homeassistant/components/tapsaff/manifest.json b/homeassistant/components/tapsaff/manifest.json index bfdb1adda79b..7d78491ad143 100644 --- a/homeassistant/components/tapsaff/manifest.json +++ b/homeassistant/components/tapsaff/manifest.json @@ -3,6 +3,5 @@ "name": "Taps Aff", "documentation": "https://www.home-assistant.io/integrations/tapsaff", "requirements": ["tapsaff==0.2.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tautulli/manifest.json b/homeassistant/components/tautulli/manifest.json index 338943a3e6cc..c821fb498535 100644 --- a/homeassistant/components/tautulli/manifest.json +++ b/homeassistant/components/tautulli/manifest.json @@ -3,6 +3,5 @@ "name": "Tautulli", "documentation": "https://www.home-assistant.io/integrations/tautulli", "requirements": ["pytautulli==0.5.0"], - "dependencies": [], "codeowners": ["@ludeeus"] } diff --git a/homeassistant/components/tcp/manifest.json b/homeassistant/components/tcp/manifest.json index fea16a087c82..b05a3ff58fbd 100644 --- a/homeassistant/components/tcp/manifest.json +++ b/homeassistant/components/tcp/manifest.json @@ -2,7 +2,5 @@ "domain": "tcp", "name": "TCP", "documentation": "https://www.home-assistant.io/integrations/tcp", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ted5000/manifest.json b/homeassistant/components/ted5000/manifest.json index 820ee348b3bc..d328d42b019f 100644 --- a/homeassistant/components/ted5000/manifest.json +++ b/homeassistant/components/ted5000/manifest.json @@ -3,6 +3,5 @@ "name": "The Energy Detective TED5000", "documentation": "https://www.home-assistant.io/integrations/ted5000", "requirements": ["xmltodict==0.12.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/teksavvy/manifest.json b/homeassistant/components/teksavvy/manifest.json index 9de98dcffb6d..e114efdce9f0 100644 --- a/homeassistant/components/teksavvy/manifest.json +++ b/homeassistant/components/teksavvy/manifest.json @@ -2,7 +2,5 @@ "domain": "teksavvy", "name": "TekSavvy", "documentation": "https://www.home-assistant.io/integrations/teksavvy", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/telegram/manifest.json b/homeassistant/components/telegram/manifest.json index 55700521cd5e..6f661ba57411 100644 --- a/homeassistant/components/telegram/manifest.json +++ b/homeassistant/components/telegram/manifest.json @@ -2,7 +2,6 @@ "domain": "telegram", "name": "Telegram", "documentation": "https://www.home-assistant.io/integrations/telegram", - "requirements": [], "dependencies": ["telegram_bot"], "codeowners": [] } diff --git a/homeassistant/components/tellduslive/manifest.json b/homeassistant/components/tellduslive/manifest.json index fda47109146b..551493694273 100644 --- a/homeassistant/components/tellduslive/manifest.json +++ b/homeassistant/components/tellduslive/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tellduslive", "requirements": ["tellduslive==0.10.10"], - "dependencies": [], "codeowners": ["@fredrike"], "quality_scale": "gold" } diff --git a/homeassistant/components/tellstick/manifest.json b/homeassistant/components/tellstick/manifest.json index 189a4e12c4ad..4a5a3dd15c69 100644 --- a/homeassistant/components/tellstick/manifest.json +++ b/homeassistant/components/tellstick/manifest.json @@ -3,6 +3,5 @@ "name": "TellStick", "documentation": "https://www.home-assistant.io/integrations/tellstick", "requirements": ["tellcore-net==0.4", "tellcore-py==1.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/telnet/manifest.json b/homeassistant/components/telnet/manifest.json index afba0e38301c..d4f070519932 100644 --- a/homeassistant/components/telnet/manifest.json +++ b/homeassistant/components/telnet/manifest.json @@ -2,7 +2,5 @@ "domain": "telnet", "name": "Telnet", "documentation": "https://www.home-assistant.io/integrations/telnet", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/temper/manifest.json b/homeassistant/components/temper/manifest.json index 4879ecddc165..e88cd1fb0432 100644 --- a/homeassistant/components/temper/manifest.json +++ b/homeassistant/components/temper/manifest.json @@ -3,6 +3,5 @@ "name": "TEMPer", "documentation": "https://www.home-assistant.io/integrations/temper", "requirements": ["temperusb==1.5.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/template/manifest.json b/homeassistant/components/template/manifest.json index 8dfe3441edd9..4ad03db22bb0 100644 --- a/homeassistant/components/template/manifest.json +++ b/homeassistant/components/template/manifest.json @@ -2,8 +2,6 @@ "domain": "template", "name": "Template", "documentation": "https://www.home-assistant.io/integrations/template", - "requirements": [], - "dependencies": [], "codeowners": ["@PhracturedBlue", "@tetienne"], "quality_scale": "internal" } diff --git a/homeassistant/components/tensorflow/manifest.json b/homeassistant/components/tensorflow/manifest.json index 024dc2b7bddc..2a5e39c79722 100644 --- a/homeassistant/components/tensorflow/manifest.json +++ b/homeassistant/components/tensorflow/manifest.json @@ -8,6 +8,5 @@ "protobuf==3.6.1", "pillow==7.0.0" ], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/tesla/manifest.json b/homeassistant/components/tesla/manifest.json index 1bba8436312d..b6c7f4658e92 100644 --- a/homeassistant/components/tesla/manifest.json +++ b/homeassistant/components/tesla/manifest.json @@ -6,9 +6,8 @@ "requirements": [ "teslajsonpy==0.6.0" ], - "dependencies": [], "codeowners": [ "@zabuldon", "@alandtse" ] -} \ No newline at end of file +} diff --git a/homeassistant/components/tfiac/manifest.json b/homeassistant/components/tfiac/manifest.json index d0b36598ce5a..1e86e6a0218c 100644 --- a/homeassistant/components/tfiac/manifest.json +++ b/homeassistant/components/tfiac/manifest.json @@ -3,6 +3,5 @@ "name": "Tfiac", "documentation": "https://www.home-assistant.io/integrations/tfiac", "requirements": ["pytfiac==0.4"], - "dependencies": [], "codeowners": ["@fredrike", "@mellado"] } diff --git a/homeassistant/components/thermoworks_smoke/manifest.json b/homeassistant/components/thermoworks_smoke/manifest.json index a11d3ac98ab1..e69b1d40874b 100644 --- a/homeassistant/components/thermoworks_smoke/manifest.json +++ b/homeassistant/components/thermoworks_smoke/manifest.json @@ -3,6 +3,5 @@ "name": "ThermoWorks Smoke", "documentation": "https://www.home-assistant.io/integrations/thermoworks_smoke", "requirements": ["stringcase==1.2.0", "thermoworks_smoke==0.1.8"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/thethingsnetwork/manifest.json b/homeassistant/components/thethingsnetwork/manifest.json index d121996cb4aa..ffd2291e158d 100644 --- a/homeassistant/components/thethingsnetwork/manifest.json +++ b/homeassistant/components/thethingsnetwork/manifest.json @@ -2,7 +2,5 @@ "domain": "thethingsnetwork", "name": "The Things Network", "documentation": "https://www.home-assistant.io/integrations/thethingsnetwork", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/thingspeak/manifest.json b/homeassistant/components/thingspeak/manifest.json index 9e6403e6eaf0..e22dfeb91661 100644 --- a/homeassistant/components/thingspeak/manifest.json +++ b/homeassistant/components/thingspeak/manifest.json @@ -3,6 +3,5 @@ "name": "ThingSpeak", "documentation": "https://www.home-assistant.io/integrations/thingspeak", "requirements": ["thingspeak==1.0.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/thinkingcleaner/manifest.json b/homeassistant/components/thinkingcleaner/manifest.json index c82859893b2a..4515f7f4ed30 100644 --- a/homeassistant/components/thinkingcleaner/manifest.json +++ b/homeassistant/components/thinkingcleaner/manifest.json @@ -3,6 +3,5 @@ "name": "Thinking Cleaner", "documentation": "https://www.home-assistant.io/integrations/thinkingcleaner", "requirements": ["pythinkingcleaner==0.0.3"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/thomson/manifest.json b/homeassistant/components/thomson/manifest.json index ac07a2f77ad5..cca5b05854be 100644 --- a/homeassistant/components/thomson/manifest.json +++ b/homeassistant/components/thomson/manifest.json @@ -2,7 +2,5 @@ "domain": "thomson", "name": "Thomson", "documentation": "https://www.home-assistant.io/integrations/thomson", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/threshold/manifest.json b/homeassistant/components/threshold/manifest.json index 939c1095c2b4..6cf871ee8a51 100644 --- a/homeassistant/components/threshold/manifest.json +++ b/homeassistant/components/threshold/manifest.json @@ -2,8 +2,6 @@ "domain": "threshold", "name": "Threshold", "documentation": "https://www.home-assistant.io/integrations/threshold", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/tibber/manifest.json b/homeassistant/components/tibber/manifest.json index 48ff76a2b34d..e7bca5ac4530 100644 --- a/homeassistant/components/tibber/manifest.json +++ b/homeassistant/components/tibber/manifest.json @@ -3,7 +3,6 @@ "name": "Tibber", "documentation": "https://www.home-assistant.io/integrations/tibber", "requirements": ["pyTibber==0.13.6"], - "dependencies": [], "codeowners": ["@danielhiversen"], "quality_scale": "silver" } diff --git a/homeassistant/components/tikteck/manifest.json b/homeassistant/components/tikteck/manifest.json index 2f6cec846fd4..4b64d3852134 100644 --- a/homeassistant/components/tikteck/manifest.json +++ b/homeassistant/components/tikteck/manifest.json @@ -3,6 +3,5 @@ "name": "Tikteck", "documentation": "https://www.home-assistant.io/integrations/tikteck", "requirements": ["tikteck==0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tile/manifest.json b/homeassistant/components/tile/manifest.json index b3f032e95e8b..553c1e508237 100644 --- a/homeassistant/components/tile/manifest.json +++ b/homeassistant/components/tile/manifest.json @@ -3,6 +3,5 @@ "name": "Tile", "documentation": "https://www.home-assistant.io/integrations/tile", "requirements": ["pytile==3.0.1"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/time_date/manifest.json b/homeassistant/components/time_date/manifest.json index 9acac2fa4bc6..e3f5c6d3cf4c 100644 --- a/homeassistant/components/time_date/manifest.json +++ b/homeassistant/components/time_date/manifest.json @@ -2,8 +2,6 @@ "domain": "time_date", "name": "Time & Date", "documentation": "https://www.home-assistant.io/integrations/time_date", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/timer/manifest.json b/homeassistant/components/timer/manifest.json index 6aa33f743cd6..197483322211 100644 --- a/homeassistant/components/timer/manifest.json +++ b/homeassistant/components/timer/manifest.json @@ -2,8 +2,6 @@ "domain": "timer", "name": "Timer", "documentation": "https://www.home-assistant.io/integrations/timer", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/tmb/manifest.json b/homeassistant/components/tmb/manifest.json index bb76b3193fc2..e35c266b6964 100644 --- a/homeassistant/components/tmb/manifest.json +++ b/homeassistant/components/tmb/manifest.json @@ -5,8 +5,7 @@ "requirements": [ "tmb==0.0.4" ], - "dependencies": [], "codeowners": [ "@alemuro" ] -} \ No newline at end of file +} diff --git a/homeassistant/components/tod/manifest.json b/homeassistant/components/tod/manifest.json index 8a3b3bc85400..d5f62562f838 100644 --- a/homeassistant/components/tod/manifest.json +++ b/homeassistant/components/tod/manifest.json @@ -2,8 +2,6 @@ "domain": "tod", "name": "Times of the Day", "documentation": "https://www.home-assistant.io/integrations/tod", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/todoist/manifest.json b/homeassistant/components/todoist/manifest.json index d9f14172ff19..eac7f761c50b 100644 --- a/homeassistant/components/todoist/manifest.json +++ b/homeassistant/components/todoist/manifest.json @@ -3,6 +3,5 @@ "name": "Todoist", "documentation": "https://www.home-assistant.io/integrations/todoist", "requirements": ["todoist-python==8.0.0"], - "dependencies": [], "codeowners": ["@boralyl"] } diff --git a/homeassistant/components/tomato/manifest.json b/homeassistant/components/tomato/manifest.json index 5f6584ce2501..54dd37a63dbc 100644 --- a/homeassistant/components/tomato/manifest.json +++ b/homeassistant/components/tomato/manifest.json @@ -2,7 +2,5 @@ "domain": "tomato", "name": "Tomato", "documentation": "https://www.home-assistant.io/integrations/tomato", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/toon/manifest.json b/homeassistant/components/toon/manifest.json index 78c0c6cf57f8..230b7986fbd6 100644 --- a/homeassistant/components/toon/manifest.json +++ b/homeassistant/components/toon/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/toon", "requirements": ["toonapilib==3.2.4"], - "dependencies": [], "codeowners": ["@frenck"] } diff --git a/homeassistant/components/torque/manifest.json b/homeassistant/components/torque/manifest.json index 14b41ed82de7..5350ae95f2d3 100644 --- a/homeassistant/components/torque/manifest.json +++ b/homeassistant/components/torque/manifest.json @@ -2,7 +2,6 @@ "domain": "torque", "name": "Torque", "documentation": "https://www.home-assistant.io/integrations/torque", - "requirements": [], "dependencies": ["http"], "codeowners": [] } diff --git a/homeassistant/components/totalconnect/manifest.json b/homeassistant/components/totalconnect/manifest.json index 4675ef0ffaf1..bd60e1331f41 100644 --- a/homeassistant/components/totalconnect/manifest.json +++ b/homeassistant/components/totalconnect/manifest.json @@ -3,6 +3,5 @@ "name": "Honeywell Total Connect Alarm", "documentation": "https://www.home-assistant.io/integrations/totalconnect", "requirements": ["total_connect_client==0.54.1"], - "dependencies": [], "codeowners": ["@austinmroczek"] } diff --git a/homeassistant/components/touchline/manifest.json b/homeassistant/components/touchline/manifest.json index 95415e70fa16..cbfb7d858397 100644 --- a/homeassistant/components/touchline/manifest.json +++ b/homeassistant/components/touchline/manifest.json @@ -3,6 +3,5 @@ "name": "Roth Touchline", "documentation": "https://www.home-assistant.io/integrations/touchline", "requirements": ["pytouchline==0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tplink/manifest.json b/homeassistant/components/tplink/manifest.json index 8b55ad7da719..62c9fcf5081a 100644 --- a/homeassistant/components/tplink/manifest.json +++ b/homeassistant/components/tplink/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tplink", "requirements": ["pyHS100==0.3.5"], - "dependencies": [], "codeowners": ["@rytilahti"] } diff --git a/homeassistant/components/tplink_lte/manifest.json b/homeassistant/components/tplink_lte/manifest.json index 249fb4db1fa4..a2602527b31d 100644 --- a/homeassistant/components/tplink_lte/manifest.json +++ b/homeassistant/components/tplink_lte/manifest.json @@ -3,6 +3,5 @@ "name": "TP-Link LTE", "documentation": "https://www.home-assistant.io/integrations/tplink_lte", "requirements": ["tp-connected==0.0.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/trackr/manifest.json b/homeassistant/components/trackr/manifest.json index 6b3368382c8b..d59d13102e22 100644 --- a/homeassistant/components/trackr/manifest.json +++ b/homeassistant/components/trackr/manifest.json @@ -3,6 +3,5 @@ "name": "TrackR", "documentation": "https://www.home-assistant.io/integrations/trackr", "requirements": ["pytrackr==0.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/tradfri/manifest.json b/homeassistant/components/tradfri/manifest.json index 7948b96d7e1a..9052a2280885 100644 --- a/homeassistant/components/tradfri/manifest.json +++ b/homeassistant/components/tradfri/manifest.json @@ -7,7 +7,6 @@ "homekit": { "models": ["TRADFRI"] }, - "dependencies": [], "zeroconf": ["_coap._udp.local."], "codeowners": ["@ggravlingen"] } diff --git a/homeassistant/components/trafikverket_train/manifest.json b/homeassistant/components/trafikverket_train/manifest.json index 1458b717fc6d..8e5cc6cb3d3b 100644 --- a/homeassistant/components/trafikverket_train/manifest.json +++ b/homeassistant/components/trafikverket_train/manifest.json @@ -3,6 +3,5 @@ "name": "Trafikverket Train", "documentation": "https://www.home-assistant.io/integrations/trafikverket_train", "requirements": ["pytrafikverket==0.1.6.1"], - "dependencies": [], "codeowners": ["@endor-force"] -} \ No newline at end of file +} diff --git a/homeassistant/components/trafikverket_weatherstation/manifest.json b/homeassistant/components/trafikverket_weatherstation/manifest.json index 3224df25c3fa..a34dcdca8749 100644 --- a/homeassistant/components/trafikverket_weatherstation/manifest.json +++ b/homeassistant/components/trafikverket_weatherstation/manifest.json @@ -3,6 +3,5 @@ "name": "Trafikverket Weather Station", "documentation": "https://www.home-assistant.io/integrations/trafikverket_weatherstation", "requirements": ["pytrafikverket==0.1.6.1"], - "dependencies": [], "codeowners": [] -} \ No newline at end of file +} diff --git a/homeassistant/components/transmission/manifest.json b/homeassistant/components/transmission/manifest.json index 117dd3cc2465..d0861baafb58 100644 --- a/homeassistant/components/transmission/manifest.json +++ b/homeassistant/components/transmission/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/transmission", "requirements": ["transmissionrpc==0.11"], - "dependencies": [], "codeowners": ["@engrbm87", "@JPHutchins"] } diff --git a/homeassistant/components/transport_nsw/manifest.json b/homeassistant/components/transport_nsw/manifest.json index 34baf54c9ff7..452bad9be8a3 100644 --- a/homeassistant/components/transport_nsw/manifest.json +++ b/homeassistant/components/transport_nsw/manifest.json @@ -3,6 +3,5 @@ "name": "Transport NSW", "documentation": "https://www.home-assistant.io/integrations/transport_nsw", "requirements": ["PyTransportNSW==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/travisci/manifest.json b/homeassistant/components/travisci/manifest.json index 3dba3733f707..c5f05fb6dae0 100644 --- a/homeassistant/components/travisci/manifest.json +++ b/homeassistant/components/travisci/manifest.json @@ -3,6 +3,5 @@ "name": "Travis-CI", "documentation": "https://www.home-assistant.io/integrations/travisci", "requirements": ["TravisPy==0.3.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/trend/manifest.json b/homeassistant/components/trend/manifest.json index 2026816c0905..76b3ae629e48 100644 --- a/homeassistant/components/trend/manifest.json +++ b/homeassistant/components/trend/manifest.json @@ -3,7 +3,6 @@ "name": "Trend", "documentation": "https://www.home-assistant.io/integrations/trend", "requirements": ["numpy==1.18.1"], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/tuya/manifest.json b/homeassistant/components/tuya/manifest.json index e249fb3f89f1..cd6cb3330202 100644 --- a/homeassistant/components/tuya/manifest.json +++ b/homeassistant/components/tuya/manifest.json @@ -3,6 +3,5 @@ "name": "Tuya", "documentation": "https://www.home-assistant.io/integrations/tuya", "requirements": ["tuyaha==0.0.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/twentemilieu/manifest.json b/homeassistant/components/twentemilieu/manifest.json index 9444e33700e7..940c751c3c64 100644 --- a/homeassistant/components/twentemilieu/manifest.json +++ b/homeassistant/components/twentemilieu/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/twentemilieu", "requirements": ["twentemilieu==0.2.0"], - "dependencies": [], "codeowners": ["@frenck"] } diff --git a/homeassistant/components/twilio_call/manifest.json b/homeassistant/components/twilio_call/manifest.json index 626a8fea89a8..2d66c463995b 100644 --- a/homeassistant/components/twilio_call/manifest.json +++ b/homeassistant/components/twilio_call/manifest.json @@ -2,7 +2,6 @@ "domain": "twilio_call", "name": "Twilio Call", "documentation": "https://www.home-assistant.io/integrations/twilio_call", - "requirements": [], "dependencies": ["twilio"], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/twilio_sms/manifest.json b/homeassistant/components/twilio_sms/manifest.json index 35d549c5268c..946b51961471 100644 --- a/homeassistant/components/twilio_sms/manifest.json +++ b/homeassistant/components/twilio_sms/manifest.json @@ -2,7 +2,6 @@ "domain": "twilio_sms", "name": "Twilio SMS", "documentation": "https://www.home-assistant.io/integrations/twilio_sms", - "requirements": [], "dependencies": ["twilio"], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/twitch/manifest.json b/homeassistant/components/twitch/manifest.json index 639624c352fc..2fc29fc9be84 100644 --- a/homeassistant/components/twitch/manifest.json +++ b/homeassistant/components/twitch/manifest.json @@ -3,6 +3,5 @@ "name": "Twitch", "documentation": "https://www.home-assistant.io/integrations/twitch", "requirements": ["python-twitch-client==0.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/twitter/manifest.json b/homeassistant/components/twitter/manifest.json index 514f976df347..844ed65c5c59 100644 --- a/homeassistant/components/twitter/manifest.json +++ b/homeassistant/components/twitter/manifest.json @@ -3,6 +3,5 @@ "name": "Twitter", "documentation": "https://www.home-assistant.io/integrations/twitter", "requirements": ["TwitterAPI==2.5.10"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ubee/manifest.json b/homeassistant/components/ubee/manifest.json index 446bc2c62d5b..0603ffe87574 100644 --- a/homeassistant/components/ubee/manifest.json +++ b/homeassistant/components/ubee/manifest.json @@ -3,6 +3,5 @@ "name": "Ubee Router", "documentation": "https://www.home-assistant.io/integrations/ubee", "requirements": ["pyubee==0.10"], - "dependencies": [], "codeowners": ["@mzdrale"] } diff --git a/homeassistant/components/ubus/manifest.json b/homeassistant/components/ubus/manifest.json index d48e55d5e2a3..af7fb50b6c49 100644 --- a/homeassistant/components/ubus/manifest.json +++ b/homeassistant/components/ubus/manifest.json @@ -2,7 +2,5 @@ "domain": "ubus", "name": "OpenWrt (ubus)", "documentation": "https://www.home-assistant.io/integrations/ubus", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ue_smart_radio/manifest.json b/homeassistant/components/ue_smart_radio/manifest.json index 7ddb8d692842..365bb9b822d9 100644 --- a/homeassistant/components/ue_smart_radio/manifest.json +++ b/homeassistant/components/ue_smart_radio/manifest.json @@ -2,7 +2,5 @@ "domain": "ue_smart_radio", "name": "Logitech UE Smart Radio", "documentation": "https://www.home-assistant.io/integrations/ue_smart_radio", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/uk_transport/manifest.json b/homeassistant/components/uk_transport/manifest.json index a99247153733..b7200a359940 100644 --- a/homeassistant/components/uk_transport/manifest.json +++ b/homeassistant/components/uk_transport/manifest.json @@ -2,7 +2,5 @@ "domain": "uk_transport", "name": "UK Transport", "documentation": "https://www.home-assistant.io/integrations/uk_transport", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index 01aa245f6081..e0f07d8d7ccc 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -6,9 +6,8 @@ "requirements": [ "aiounifi==15" ], - "dependencies": [], "codeowners": [ "@kane610" ], "quality_scale": "platinum" -} \ No newline at end of file +} diff --git a/homeassistant/components/unifi_direct/manifest.json b/homeassistant/components/unifi_direct/manifest.json index 3de376a831d4..206cf39f1497 100644 --- a/homeassistant/components/unifi_direct/manifest.json +++ b/homeassistant/components/unifi_direct/manifest.json @@ -3,6 +3,5 @@ "name": "Ubiquiti UniFi AP", "documentation": "https://www.home-assistant.io/integrations/unifi_direct", "requirements": ["pexpect==4.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/unifiled/manifest.json b/homeassistant/components/unifiled/manifest.json index a031b8b2ec31..ebbc825578b3 100644 --- a/homeassistant/components/unifiled/manifest.json +++ b/homeassistant/components/unifiled/manifest.json @@ -2,7 +2,6 @@ "domain": "unifiled", "name": "Ubiquiti UniFi LED", "documentation": "https://www.home-assistant.io/integrations/unifiled", - "dependencies": [], "codeowners": ["@florisvdk"], "requirements": ["unifiled==0.11"] } diff --git a/homeassistant/components/universal/manifest.json b/homeassistant/components/universal/manifest.json index 43acbadb4501..ab11e1e0b077 100644 --- a/homeassistant/components/universal/manifest.json +++ b/homeassistant/components/universal/manifest.json @@ -2,8 +2,6 @@ "domain": "universal", "name": "Universal Media Player", "documentation": "https://www.home-assistant.io/integrations/universal", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/upc_connect/manifest.json b/homeassistant/components/upc_connect/manifest.json index 904b48fbdd99..6236021f3c6f 100644 --- a/homeassistant/components/upc_connect/manifest.json +++ b/homeassistant/components/upc_connect/manifest.json @@ -3,6 +3,5 @@ "name": "UPC Connect Box", "documentation": "https://www.home-assistant.io/integrations/upc_connect", "requirements": ["connect-box==0.2.5"], - "dependencies": [], "codeowners": ["@pvizeli"] } diff --git a/homeassistant/components/upcloud/manifest.json b/homeassistant/components/upcloud/manifest.json index 14ad03593642..f5ff1b2dd1ea 100644 --- a/homeassistant/components/upcloud/manifest.json +++ b/homeassistant/components/upcloud/manifest.json @@ -3,6 +3,5 @@ "name": "UpCloud", "documentation": "https://www.home-assistant.io/integrations/upcloud", "requirements": ["upcloud-api==0.4.5"], - "dependencies": [], "codeowners": ["@scop"] } diff --git a/homeassistant/components/updater/manifest.json b/homeassistant/components/updater/manifest.json index 377ca24cd384..faf3bc2cc0ea 100644 --- a/homeassistant/components/updater/manifest.json +++ b/homeassistant/components/updater/manifest.json @@ -3,7 +3,6 @@ "name": "Updater", "documentation": "https://www.home-assistant.io/integrations/updater", "requirements": ["distro==1.4.0"], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/upnp/manifest.json b/homeassistant/components/upnp/manifest.json index 47ad465eb363..2ca4bc129e8d 100644 --- a/homeassistant/components/upnp/manifest.json +++ b/homeassistant/components/upnp/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/upnp", "requirements": ["async-upnp-client==0.14.12"], - "dependencies": [], "codeowners": ["@StevenLooman"] } diff --git a/homeassistant/components/uptime/manifest.json b/homeassistant/components/uptime/manifest.json index 4d42d2e5bcb0..e3d30345dc43 100644 --- a/homeassistant/components/uptime/manifest.json +++ b/homeassistant/components/uptime/manifest.json @@ -2,8 +2,6 @@ "domain": "uptime", "name": "Uptime", "documentation": "https://www.home-assistant.io/integrations/uptime", - "requirements": [], - "dependencies": [], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/uptimerobot/manifest.json b/homeassistant/components/uptimerobot/manifest.json index c835dd425fd3..88cbc8ad57fe 100644 --- a/homeassistant/components/uptimerobot/manifest.json +++ b/homeassistant/components/uptimerobot/manifest.json @@ -3,6 +3,5 @@ "name": "Uptime Robot", "documentation": "https://www.home-assistant.io/integrations/uptimerobot", "requirements": ["pyuptimerobot==0.0.5"], - "dependencies": [], "codeowners": ["@ludeeus"] } diff --git a/homeassistant/components/uscis/manifest.json b/homeassistant/components/uscis/manifest.json index 4a1b26d4e7af..aabcf344685c 100644 --- a/homeassistant/components/uscis/manifest.json +++ b/homeassistant/components/uscis/manifest.json @@ -3,6 +3,5 @@ "name": "U.S. Citizenship and Immigration Services (USCIS)", "documentation": "https://www.home-assistant.io/integrations/uscis", "requirements": ["uscisstatus==0.1.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/usgs_earthquakes_feed/manifest.json b/homeassistant/components/usgs_earthquakes_feed/manifest.json index 5e4dbba3fe47..4e30ac470d47 100644 --- a/homeassistant/components/usgs_earthquakes_feed/manifest.json +++ b/homeassistant/components/usgs_earthquakes_feed/manifest.json @@ -3,6 +3,5 @@ "name": "U.S. Geological Survey Earthquake Hazards (USGS)", "documentation": "https://www.home-assistant.io/integrations/usgs_earthquakes_feed", "requirements": ["geojson_client==0.4"], - "dependencies": [], "codeowners": ["@exxamalte"] } diff --git a/homeassistant/components/utility_meter/manifest.json b/homeassistant/components/utility_meter/manifest.json index b71bb324773c..ff3ce025f0eb 100644 --- a/homeassistant/components/utility_meter/manifest.json +++ b/homeassistant/components/utility_meter/manifest.json @@ -2,8 +2,6 @@ "domain": "utility_meter", "name": "Utility Meter", "documentation": "https://www.home-assistant.io/integrations/utility_meter", - "requirements": [], - "dependencies": [], "codeowners": ["@dgomes"], "quality_scale": "internal" } diff --git a/homeassistant/components/uvc/manifest.json b/homeassistant/components/uvc/manifest.json index 7c29edd51c65..b44cdd274b40 100644 --- a/homeassistant/components/uvc/manifest.json +++ b/homeassistant/components/uvc/manifest.json @@ -3,6 +3,5 @@ "name": "Ubiquiti UniFi Video", "documentation": "https://www.home-assistant.io/integrations/uvc", "requirements": ["uvcclient==0.11.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vacuum/manifest.json b/homeassistant/components/vacuum/manifest.json index a6f7ddb2bdaf..a497bab1380e 100644 --- a/homeassistant/components/vacuum/manifest.json +++ b/homeassistant/components/vacuum/manifest.json @@ -2,7 +2,5 @@ "domain": "vacuum", "name": "Vacuum", "documentation": "https://www.home-assistant.io/integrations/vacuum", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vallox/manifest.json b/homeassistant/components/vallox/manifest.json index 7a082200740a..97e3955792c2 100644 --- a/homeassistant/components/vallox/manifest.json +++ b/homeassistant/components/vallox/manifest.json @@ -3,6 +3,5 @@ "name": "Valloxs", "documentation": "https://www.home-assistant.io/integrations/vallox", "requirements": ["vallox-websocket-api==2.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vasttrafik/manifest.json b/homeassistant/components/vasttrafik/manifest.json index 9d339d64dd83..59e655c94f22 100644 --- a/homeassistant/components/vasttrafik/manifest.json +++ b/homeassistant/components/vasttrafik/manifest.json @@ -3,6 +3,5 @@ "name": "Västtrafik", "documentation": "https://www.home-assistant.io/integrations/vasttrafik", "requirements": ["vtjp==0.1.14"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/velbus/manifest.json b/homeassistant/components/velbus/manifest.json index fe3aee9a4cde..ca3ae2b0df6d 100644 --- a/homeassistant/components/velbus/manifest.json +++ b/homeassistant/components/velbus/manifest.json @@ -4,6 +4,5 @@ "documentation": "https://www.home-assistant.io/integrations/velbus", "requirements": ["python-velbus==2.0.43"], "config_flow": true, - "dependencies": [], "codeowners": ["@Cereal2nd", "@brefra"] } diff --git a/homeassistant/components/velux/manifest.json b/homeassistant/components/velux/manifest.json index 7ecc2ac6dede..d67e29af6931 100644 --- a/homeassistant/components/velux/manifest.json +++ b/homeassistant/components/velux/manifest.json @@ -3,6 +3,5 @@ "name": "Velux", "documentation": "https://www.home-assistant.io/integrations/velux", "requirements": ["pyvlx==0.2.12"], - "dependencies": [], "codeowners": ["@Julius2342"] } diff --git a/homeassistant/components/venstar/manifest.json b/homeassistant/components/venstar/manifest.json index e723e16d41d1..d9de9b9d5581 100644 --- a/homeassistant/components/venstar/manifest.json +++ b/homeassistant/components/venstar/manifest.json @@ -3,6 +3,5 @@ "name": "Venstar", "documentation": "https://www.home-assistant.io/integrations/venstar", "requirements": ["venstarcolortouch==0.12"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vera/manifest.json b/homeassistant/components/vera/manifest.json index 4f585d964a86..90f208ba915a 100644 --- a/homeassistant/components/vera/manifest.json +++ b/homeassistant/components/vera/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/vera", "requirements": ["pyvera==0.3.7"], - "dependencies": [], "codeowners": [ "@vangorra" ] diff --git a/homeassistant/components/verisure/manifest.json b/homeassistant/components/verisure/manifest.json index 3e0073c17701..13c293649755 100644 --- a/homeassistant/components/verisure/manifest.json +++ b/homeassistant/components/verisure/manifest.json @@ -3,6 +3,5 @@ "name": "Verisure", "documentation": "https://www.home-assistant.io/integrations/verisure", "requirements": ["jsonpath==0.82", "vsure==1.5.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/versasense/manifest.json b/homeassistant/components/versasense/manifest.json index 75614336c3d1..bd409b5977f3 100644 --- a/homeassistant/components/versasense/manifest.json +++ b/homeassistant/components/versasense/manifest.json @@ -2,7 +2,6 @@ "domain": "versasense", "name": "VersaSense", "documentation": "https://www.home-assistant.io/integrations/versasense", - "dependencies": [], "codeowners": ["@flamm3blemuff1n"], "requirements": ["pyversasense==0.0.6"] } diff --git a/homeassistant/components/version/manifest.json b/homeassistant/components/version/manifest.json index 8d79234375c2..ed3158040d58 100644 --- a/homeassistant/components/version/manifest.json +++ b/homeassistant/components/version/manifest.json @@ -3,7 +3,6 @@ "name": "Version", "documentation": "https://www.home-assistant.io/integrations/version", "requirements": ["pyhaversion==3.3.0"], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/vesync/manifest.json b/homeassistant/components/vesync/manifest.json index 1563ee0ce2bc..7ac8e89fb607 100644 --- a/homeassistant/components/vesync/manifest.json +++ b/homeassistant/components/vesync/manifest.json @@ -2,7 +2,6 @@ "domain": "vesync", "name": "Etekcity VeSync", "documentation": "https://www.home-assistant.io/integrations/vesync", - "dependencies": [], "codeowners": ["@markperdue", "@webdjoe"], "requirements": ["pyvesync==1.1.0"], "config_flow": true diff --git a/homeassistant/components/viaggiatreno/manifest.json b/homeassistant/components/viaggiatreno/manifest.json index 4825441707bc..b4eb145f315b 100644 --- a/homeassistant/components/viaggiatreno/manifest.json +++ b/homeassistant/components/viaggiatreno/manifest.json @@ -2,7 +2,5 @@ "domain": "viaggiatreno", "name": "Trenitalia ViaggiaTreno", "documentation": "https://www.home-assistant.io/integrations/viaggiatreno", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vicare/manifest.json b/homeassistant/components/vicare/manifest.json index a03c927c2acd..6fc0dfdd1199 100644 --- a/homeassistant/components/vicare/manifest.json +++ b/homeassistant/components/vicare/manifest.json @@ -2,7 +2,6 @@ "domain": "vicare", "name": "Viessmann ViCare", "documentation": "https://www.home-assistant.io/integrations/vicare", - "dependencies": [], "codeowners": ["@oischinger"], "requirements": ["PyViCare==0.1.10"] } diff --git a/homeassistant/components/vilfo/manifest.json b/homeassistant/components/vilfo/manifest.json index cedb485fab3c..4dba1a5687e4 100644 --- a/homeassistant/components/vilfo/manifest.json +++ b/homeassistant/components/vilfo/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/vilfo", "requirements": ["vilfo-api-client==0.3.2"], - "dependencies": [], "codeowners": ["@ManneW"] } diff --git a/homeassistant/components/vivotek/manifest.json b/homeassistant/components/vivotek/manifest.json index 3b4a4211f34d..5d1b8cedd7bb 100644 --- a/homeassistant/components/vivotek/manifest.json +++ b/homeassistant/components/vivotek/manifest.json @@ -3,6 +3,5 @@ "name": "VIVOTEK", "documentation": "https://www.home-assistant.io/integrations/vivotek", "requirements": ["libpyvivotek==0.4.0"], - "dependencies": [], "codeowners": ["@HarlemSquirrel"] } diff --git a/homeassistant/components/vizio/manifest.json b/homeassistant/components/vizio/manifest.json index 2436ce6298b3..22b4911d8cfb 100644 --- a/homeassistant/components/vizio/manifest.json +++ b/homeassistant/components/vizio/manifest.json @@ -3,7 +3,6 @@ "name": "VIZIO SmartCast", "documentation": "https://www.home-assistant.io/integrations/vizio", "requirements": ["pyvizio==0.1.45"], - "dependencies": [], "codeowners": ["@raman325"], "config_flow": true, "zeroconf": ["_viziocast._tcp.local."], diff --git a/homeassistant/components/vlc/manifest.json b/homeassistant/components/vlc/manifest.json index f9fbfeabb0d0..6a79e542be26 100644 --- a/homeassistant/components/vlc/manifest.json +++ b/homeassistant/components/vlc/manifest.json @@ -3,6 +3,5 @@ "name": "VLC media player", "documentation": "https://www.home-assistant.io/integrations/vlc", "requirements": ["python-vlc==1.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vlc_telnet/manifest.json b/homeassistant/components/vlc_telnet/manifest.json index fdc974878ec1..f6e4aa045214 100644 --- a/homeassistant/components/vlc_telnet/manifest.json +++ b/homeassistant/components/vlc_telnet/manifest.json @@ -3,6 +3,5 @@ "name": "VLC media player Telnet", "documentation": "https://www.home-assistant.io/integrations/vlc-telnet", "requirements": ["python-telnet-vlc==1.0.4"], - "dependencies": [], "codeowners": ["@rodripf"] } diff --git a/homeassistant/components/voicerss/manifest.json b/homeassistant/components/voicerss/manifest.json index aef862674257..ff9d194a270c 100644 --- a/homeassistant/components/voicerss/manifest.json +++ b/homeassistant/components/voicerss/manifest.json @@ -2,7 +2,5 @@ "domain": "voicerss", "name": "VoiceRSS", "documentation": "https://www.home-assistant.io/integrations/voicerss", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/volkszaehler/manifest.json b/homeassistant/components/volkszaehler/manifest.json index dd361de5f96a..0e28675ce87e 100644 --- a/homeassistant/components/volkszaehler/manifest.json +++ b/homeassistant/components/volkszaehler/manifest.json @@ -3,6 +3,5 @@ "name": "Volkszaehler", "documentation": "https://www.home-assistant.io/integrations/volkszaehler", "requirements": ["volkszaehler==0.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/volumio/manifest.json b/homeassistant/components/volumio/manifest.json index a97c9d637ef0..7fed88116004 100644 --- a/homeassistant/components/volumio/manifest.json +++ b/homeassistant/components/volumio/manifest.json @@ -2,7 +2,5 @@ "domain": "volumio", "name": "Volumio", "documentation": "https://www.home-assistant.io/integrations/volumio", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/volvooncall/manifest.json b/homeassistant/components/volvooncall/manifest.json index bc629eafaadd..c16ad0e48580 100644 --- a/homeassistant/components/volvooncall/manifest.json +++ b/homeassistant/components/volvooncall/manifest.json @@ -3,6 +3,5 @@ "name": "Volvo On Call", "documentation": "https://www.home-assistant.io/integrations/volvooncall", "requirements": ["volvooncall==0.8.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/vultr/manifest.json b/homeassistant/components/vultr/manifest.json index f9e9d8d28948..596e37c3545a 100644 --- a/homeassistant/components/vultr/manifest.json +++ b/homeassistant/components/vultr/manifest.json @@ -3,6 +3,5 @@ "name": "Vultr", "documentation": "https://www.home-assistant.io/integrations/vultr", "requirements": ["vultr==0.1.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/w800rf32/manifest.json b/homeassistant/components/w800rf32/manifest.json index 5fe6cb701105..c93d25dcf460 100644 --- a/homeassistant/components/w800rf32/manifest.json +++ b/homeassistant/components/w800rf32/manifest.json @@ -3,6 +3,5 @@ "name": "WGL Designs W800RF32", "documentation": "https://www.home-assistant.io/integrations/w800rf32", "requirements": ["pyW800rf32==0.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wake_on_lan/manifest.json b/homeassistant/components/wake_on_lan/manifest.json index 526be2a33f2f..c66f87ae26ed 100644 --- a/homeassistant/components/wake_on_lan/manifest.json +++ b/homeassistant/components/wake_on_lan/manifest.json @@ -3,6 +3,5 @@ "name": "Wake on LAN", "documentation": "https://www.home-assistant.io/integrations/wake_on_lan", "requirements": ["wakeonlan==1.1.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/waqi/manifest.json b/homeassistant/components/waqi/manifest.json index 6d37030d1dd8..947d0089f4b3 100644 --- a/homeassistant/components/waqi/manifest.json +++ b/homeassistant/components/waqi/manifest.json @@ -3,6 +3,5 @@ "name": "World Air Quality Index (WAQI)", "documentation": "https://www.home-assistant.io/integrations/waqi", "requirements": ["waqiasync==1.0.0"], - "dependencies": [], "codeowners": ["@andrey-git"] } diff --git a/homeassistant/components/water_heater/manifest.json b/homeassistant/components/water_heater/manifest.json index 7b9adbda1f7e..32221d46a7fe 100644 --- a/homeassistant/components/water_heater/manifest.json +++ b/homeassistant/components/water_heater/manifest.json @@ -2,7 +2,5 @@ "domain": "water_heater", "name": "Water Heater", "documentation": "https://www.home-assistant.io/integrations/water_heater", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/waterfurnace/manifest.json b/homeassistant/components/waterfurnace/manifest.json index 05a38f578929..6ccd2382db9e 100644 --- a/homeassistant/components/waterfurnace/manifest.json +++ b/homeassistant/components/waterfurnace/manifest.json @@ -3,6 +3,5 @@ "name": "WaterFurnace", "documentation": "https://www.home-assistant.io/integrations/waterfurnace", "requirements": ["waterfurnace==1.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/watson_iot/manifest.json b/homeassistant/components/watson_iot/manifest.json index d12c40e4defb..f735b4007e10 100644 --- a/homeassistant/components/watson_iot/manifest.json +++ b/homeassistant/components/watson_iot/manifest.json @@ -3,6 +3,5 @@ "name": "IBM Watson IoT Platform", "documentation": "https://www.home-assistant.io/integrations/watson_iot", "requirements": ["ibmiotf==0.3.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/watson_tts/manifest.json b/homeassistant/components/watson_tts/manifest.json index c1d708a20f91..78d5613e16db 100644 --- a/homeassistant/components/watson_tts/manifest.json +++ b/homeassistant/components/watson_tts/manifest.json @@ -3,6 +3,5 @@ "name": "IBM Watson TTS", "documentation": "https://www.home-assistant.io/integrations/watson_tts", "requirements": ["ibm-watson==4.0.1"], - "dependencies": [], "codeowners": ["@rutkai"] } diff --git a/homeassistant/components/waze_travel_time/manifest.json b/homeassistant/components/waze_travel_time/manifest.json index b34c4f88191c..907013ac362f 100644 --- a/homeassistant/components/waze_travel_time/manifest.json +++ b/homeassistant/components/waze_travel_time/manifest.json @@ -3,6 +3,5 @@ "name": "Waze Travel Time", "documentation": "https://www.home-assistant.io/integrations/waze_travel_time", "requirements": ["WazeRouteCalculator==0.12"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/weather/manifest.json b/homeassistant/components/weather/manifest.json index 4e6290a8c690..c77e8408c837 100644 --- a/homeassistant/components/weather/manifest.json +++ b/homeassistant/components/weather/manifest.json @@ -2,8 +2,6 @@ "domain": "weather", "name": "Weather", "documentation": "https://www.home-assistant.io/integrations/weather", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/webhook/manifest.json b/homeassistant/components/webhook/manifest.json index ff31698fefcf..17c0a2c7dbee 100644 --- a/homeassistant/components/webhook/manifest.json +++ b/homeassistant/components/webhook/manifest.json @@ -2,7 +2,6 @@ "domain": "webhook", "name": "Webhook", "documentation": "https://www.home-assistant.io/integrations/webhook", - "requirements": [], "dependencies": ["http"], "codeowners": [] } diff --git a/homeassistant/components/websocket_api/manifest.json b/homeassistant/components/websocket_api/manifest.json index 2751f8343bf9..76e2742b9966 100644 --- a/homeassistant/components/websocket_api/manifest.json +++ b/homeassistant/components/websocket_api/manifest.json @@ -2,7 +2,6 @@ "domain": "websocket_api", "name": "Home Asssitant WebSocket API", "documentation": "https://www.home-assistant.io/integrations/websocket_api", - "requirements": [], "dependencies": ["http"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" diff --git a/homeassistant/components/wemo/manifest.json b/homeassistant/components/wemo/manifest.json index 017d43f7abad..0ad4574ecbc1 100644 --- a/homeassistant/components/wemo/manifest.json +++ b/homeassistant/components/wemo/manifest.json @@ -12,6 +12,5 @@ "homekit": { "models": ["Wemo"] }, - "dependencies": [], "codeowners": ["@sqldiablo"] } diff --git a/homeassistant/components/whois/manifest.json b/homeassistant/components/whois/manifest.json index 6e383ec14675..4330604f9bd1 100644 --- a/homeassistant/components/whois/manifest.json +++ b/homeassistant/components/whois/manifest.json @@ -3,6 +3,5 @@ "name": "Whois", "documentation": "https://www.home-assistant.io/integrations/whois", "requirements": ["python-whois==0.7.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wirelesstag/manifest.json b/homeassistant/components/wirelesstag/manifest.json index 9320b9a9e73d..d3059a494971 100644 --- a/homeassistant/components/wirelesstag/manifest.json +++ b/homeassistant/components/wirelesstag/manifest.json @@ -3,6 +3,5 @@ "name": "Wireless Sensor Tags", "documentation": "https://www.home-assistant.io/integrations/wirelesstag", "requirements": ["wirelesstagpy==0.4.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wled/manifest.json b/homeassistant/components/wled/manifest.json index d501edbd6310..0e5bb990baed 100644 --- a/homeassistant/components/wled/manifest.json +++ b/homeassistant/components/wled/manifest.json @@ -4,7 +4,6 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/wled", "requirements": ["wled==0.3.0"], - "dependencies": [], "zeroconf": ["_wled._tcp.local."], "codeowners": ["@frenck"], "quality_scale": "platinum" diff --git a/homeassistant/components/workday/manifest.json b/homeassistant/components/workday/manifest.json index 21b84d87cbb7..f6fade69ac45 100644 --- a/homeassistant/components/workday/manifest.json +++ b/homeassistant/components/workday/manifest.json @@ -3,7 +3,6 @@ "name": "Workday", "documentation": "https://www.home-assistant.io/integrations/workday", "requirements": ["holidays==0.10.1"], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/worldclock/manifest.json b/homeassistant/components/worldclock/manifest.json index 9008fbc4855b..4f13e8fba905 100644 --- a/homeassistant/components/worldclock/manifest.json +++ b/homeassistant/components/worldclock/manifest.json @@ -2,8 +2,6 @@ "domain": "worldclock", "name": "Worldclock", "documentation": "https://www.home-assistant.io/integrations/worldclock", - "requirements": [], - "dependencies": [], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/homeassistant/components/worldtidesinfo/manifest.json b/homeassistant/components/worldtidesinfo/manifest.json index 56aa445bc084..b4c3d9509d4b 100644 --- a/homeassistant/components/worldtidesinfo/manifest.json +++ b/homeassistant/components/worldtidesinfo/manifest.json @@ -2,7 +2,5 @@ "domain": "worldtidesinfo", "name": "World Tides", "documentation": "https://www.home-assistant.io/integrations/worldtidesinfo", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/worxlandroid/manifest.json b/homeassistant/components/worxlandroid/manifest.json index 479470f5a3a9..a8a722ff93e3 100644 --- a/homeassistant/components/worxlandroid/manifest.json +++ b/homeassistant/components/worxlandroid/manifest.json @@ -2,7 +2,5 @@ "domain": "worxlandroid", "name": "Worx Landroid", "documentation": "https://www.home-assistant.io/integrations/worxlandroid", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wsdot/manifest.json b/homeassistant/components/wsdot/manifest.json index 73e6c2fe6a79..386b14a3a6a3 100644 --- a/homeassistant/components/wsdot/manifest.json +++ b/homeassistant/components/wsdot/manifest.json @@ -2,7 +2,5 @@ "domain": "wsdot", "name": "Washington State Department of Transportation (WSDOT)", "documentation": "https://www.home-assistant.io/integrations/wsdot", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wunderground/manifest.json b/homeassistant/components/wunderground/manifest.json index b429aad3a786..85f3be460293 100644 --- a/homeassistant/components/wunderground/manifest.json +++ b/homeassistant/components/wunderground/manifest.json @@ -2,7 +2,5 @@ "domain": "wunderground", "name": "Weather Underground (WUnderground)", "documentation": "https://www.home-assistant.io/integrations/wunderground", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wunderlist/manifest.json b/homeassistant/components/wunderlist/manifest.json index 0502d8efd354..414a5eb7d333 100644 --- a/homeassistant/components/wunderlist/manifest.json +++ b/homeassistant/components/wunderlist/manifest.json @@ -3,6 +3,5 @@ "name": "Wunderlist", "documentation": "https://www.home-assistant.io/integrations/wunderlist", "requirements": ["wunderpy2==0.1.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/wwlln/manifest.json b/homeassistant/components/wwlln/manifest.json index 343b8b8a8ce1..19406ac4b7ad 100644 --- a/homeassistant/components/wwlln/manifest.json +++ b/homeassistant/components/wwlln/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/wwlln", "requirements": ["aiowwlln==2.0.2"], - "dependencies": [], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/x10/manifest.json b/homeassistant/components/x10/manifest.json index b994e50a7ac0..ce51fcac0cac 100644 --- a/homeassistant/components/x10/manifest.json +++ b/homeassistant/components/x10/manifest.json @@ -2,7 +2,5 @@ "domain": "x10", "name": "Heyu X10", "documentation": "https://www.home-assistant.io/integrations/x10", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/xbox_live/manifest.json b/homeassistant/components/xbox_live/manifest.json index 4bf8e3faf621..f00f49c1589f 100644 --- a/homeassistant/components/xbox_live/manifest.json +++ b/homeassistant/components/xbox_live/manifest.json @@ -3,6 +3,5 @@ "name": "Xbox Live", "documentation": "https://www.home-assistant.io/integrations/xbox_live", "requirements": ["xboxapi==0.1.1"], - "dependencies": [], "codeowners": ["@MartinHjelmare"] } diff --git a/homeassistant/components/xeoma/manifest.json b/homeassistant/components/xeoma/manifest.json index f5fd27b5063b..9fb6cb8b598f 100644 --- a/homeassistant/components/xeoma/manifest.json +++ b/homeassistant/components/xeoma/manifest.json @@ -3,6 +3,5 @@ "name": "Xeoma", "documentation": "https://www.home-assistant.io/integrations/xeoma", "requirements": ["pyxeoma==1.4.1"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/xfinity/manifest.json b/homeassistant/components/xfinity/manifest.json index 861a05da4c6f..999b77dfb597 100644 --- a/homeassistant/components/xfinity/manifest.json +++ b/homeassistant/components/xfinity/manifest.json @@ -3,6 +3,5 @@ "name": "Xfinity Gateway", "documentation": "https://www.home-assistant.io/integrations/xfinity", "requirements": ["xfinity-gateway==0.0.4"], - "dependencies": [], "codeowners": ["@cisasteelersfan"] } diff --git a/homeassistant/components/xiaomi/manifest.json b/homeassistant/components/xiaomi/manifest.json index 4c5b2c19dd95..407406228a5d 100644 --- a/homeassistant/components/xiaomi/manifest.json +++ b/homeassistant/components/xiaomi/manifest.json @@ -2,7 +2,6 @@ "domain": "xiaomi", "name": "Xiaomi", "documentation": "https://www.home-assistant.io/integrations/xiaomi", - "requirements": [], "dependencies": ["ffmpeg"], "codeowners": [] } diff --git a/homeassistant/components/xiaomi_aqara/manifest.json b/homeassistant/components/xiaomi_aqara/manifest.json index fade5e1a51b1..e604b225fc44 100644 --- a/homeassistant/components/xiaomi_aqara/manifest.json +++ b/homeassistant/components/xiaomi_aqara/manifest.json @@ -3,7 +3,6 @@ "name": "Xiaomi Gateway (Aqara)", "documentation": "https://www.home-assistant.io/integrations/xiaomi_aqara", "requirements": ["PyXiaomiGateway==0.12.4"], - "dependencies": [], "after_dependencies": ["discovery"], "codeowners": ["@danielhiversen", "@syssi"] } diff --git a/homeassistant/components/xiaomi_miio/manifest.json b/homeassistant/components/xiaomi_miio/manifest.json index 4d88cdef0f2a..1db013212857 100644 --- a/homeassistant/components/xiaomi_miio/manifest.json +++ b/homeassistant/components/xiaomi_miio/manifest.json @@ -3,6 +3,5 @@ "name": "Xiaomi miio", "documentation": "https://www.home-assistant.io/integrations/xiaomi_miio", "requirements": ["construct==2.9.45", "python-miio==0.5.0.1"], - "dependencies": [], "codeowners": ["@rytilahti", "@syssi"] } diff --git a/homeassistant/components/xiaomi_tv/manifest.json b/homeassistant/components/xiaomi_tv/manifest.json index 13843c88ecc9..3c901ca753a0 100644 --- a/homeassistant/components/xiaomi_tv/manifest.json +++ b/homeassistant/components/xiaomi_tv/manifest.json @@ -3,6 +3,5 @@ "name": "Xiaomi TV", "documentation": "https://www.home-assistant.io/integrations/xiaomi_tv", "requirements": ["pymitv==1.4.3"], - "dependencies": [], "codeowners": ["@simse"] } diff --git a/homeassistant/components/xmpp/manifest.json b/homeassistant/components/xmpp/manifest.json index 26d2362a1921..8f35f813d997 100644 --- a/homeassistant/components/xmpp/manifest.json +++ b/homeassistant/components/xmpp/manifest.json @@ -3,6 +3,5 @@ "name": "Jabber (XMPP)", "documentation": "https://www.home-assistant.io/integrations/xmpp", "requirements": ["slixmpp==1.4.2"], - "dependencies": [], "codeowners": ["@fabaff", "@flowolf"] } diff --git a/homeassistant/components/xs1/manifest.json b/homeassistant/components/xs1/manifest.json index 480da6df351b..e997953f7ac5 100644 --- a/homeassistant/components/xs1/manifest.json +++ b/homeassistant/components/xs1/manifest.json @@ -3,6 +3,5 @@ "name": "EZcontrol XS1", "documentation": "https://www.home-assistant.io/integrations/xs1", "requirements": ["xs1-api-client==2.3.5"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/yale_smart_alarm/manifest.json b/homeassistant/components/yale_smart_alarm/manifest.json index a937e5e5d5b1..b465125508cd 100644 --- a/homeassistant/components/yale_smart_alarm/manifest.json +++ b/homeassistant/components/yale_smart_alarm/manifest.json @@ -3,6 +3,5 @@ "name": "Yale Smart Living", "documentation": "https://www.home-assistant.io/integrations/yale_smart_alarm", "requirements": ["yalesmartalarmclient==0.1.6"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/yamaha/manifest.json b/homeassistant/components/yamaha/manifest.json index d7aa9dbfae0a..e2f2ed987830 100644 --- a/homeassistant/components/yamaha/manifest.json +++ b/homeassistant/components/yamaha/manifest.json @@ -3,6 +3,5 @@ "name": "Yamaha Network Receivers", "documentation": "https://www.home-assistant.io/integrations/yamaha", "requirements": ["rxv==0.6.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/yamaha_musiccast/manifest.json b/homeassistant/components/yamaha_musiccast/manifest.json index 8734f8709664..4c3a35c15dcb 100644 --- a/homeassistant/components/yamaha_musiccast/manifest.json +++ b/homeassistant/components/yamaha_musiccast/manifest.json @@ -3,6 +3,5 @@ "name": "Yamaha MusicCast", "documentation": "https://www.home-assistant.io/integrations/yamaha_musiccast", "requirements": ["pymusiccast==0.1.6"], - "dependencies": [], "codeowners": ["@jalmeroth"] } diff --git a/homeassistant/components/yandex_transport/manifest.json b/homeassistant/components/yandex_transport/manifest.json index 6ba0886d2dba..da9d920a26cd 100644 --- a/homeassistant/components/yandex_transport/manifest.json +++ b/homeassistant/components/yandex_transport/manifest.json @@ -3,6 +3,5 @@ "name": "Yandex Transport", "documentation": "https://www.home-assistant.io/integrations/yandex_transport", "requirements": ["ya_ma==0.3.8"], - "dependencies": [], "codeowners": ["@rishatik92"] } diff --git a/homeassistant/components/yandextts/manifest.json b/homeassistant/components/yandextts/manifest.json index 99f074fa758d..2769b5fc177a 100644 --- a/homeassistant/components/yandextts/manifest.json +++ b/homeassistant/components/yandextts/manifest.json @@ -2,7 +2,5 @@ "domain": "yandextts", "name": "Yandex TTS", "documentation": "https://www.home-assistant.io/integrations/yandextts", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index c5396030813a..ad3022d5d5a6 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -3,7 +3,6 @@ "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", "requirements": ["yeelight==0.5.1"], - "dependencies": [], "after_dependencies": ["discovery"], "codeowners": ["@rytilahti", "@zewelor"] } diff --git a/homeassistant/components/yeelightsunflower/manifest.json b/homeassistant/components/yeelightsunflower/manifest.json index 6c1a44e8cb17..4c21e8e6f269 100644 --- a/homeassistant/components/yeelightsunflower/manifest.json +++ b/homeassistant/components/yeelightsunflower/manifest.json @@ -3,6 +3,5 @@ "name": "Yeelight Sunflower", "documentation": "https://www.home-assistant.io/integrations/yeelightsunflower", "requirements": ["yeelightsunflower==0.0.10"], - "dependencies": [], "codeowners": ["@lindsaymarkward"] } diff --git a/homeassistant/components/yessssms/manifest.json b/homeassistant/components/yessssms/manifest.json index 0dc6f213bce2..5200408d1d55 100644 --- a/homeassistant/components/yessssms/manifest.json +++ b/homeassistant/components/yessssms/manifest.json @@ -3,6 +3,5 @@ "name": "yesss! SMS", "documentation": "https://www.home-assistant.io/integrations/yessssms", "requirements": ["YesssSMS==0.4.1"], - "dependencies": [], "codeowners": ["@flowolf"] } diff --git a/homeassistant/components/yr/manifest.json b/homeassistant/components/yr/manifest.json index 10b274b8dd34..f21248c96328 100644 --- a/homeassistant/components/yr/manifest.json +++ b/homeassistant/components/yr/manifest.json @@ -3,6 +3,5 @@ "name": "Yr", "documentation": "https://www.home-assistant.io/integrations/yr", "requirements": ["xmltodict==0.12.0"], - "dependencies": [], "codeowners": ["@danielhiversen"] } diff --git a/homeassistant/components/yweather/manifest.json b/homeassistant/components/yweather/manifest.json index 9d9c76f67e4b..f9317d0bcdb1 100644 --- a/homeassistant/components/yweather/manifest.json +++ b/homeassistant/components/yweather/manifest.json @@ -3,6 +3,5 @@ "name": "Yahoo Weather", "documentation": "https://www.home-assistant.io/integrations/yweather", "requirements": ["yahooweather==0.10"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zabbix/manifest.json b/homeassistant/components/zabbix/manifest.json index 5cf4adf5804d..08dfb98d5fa2 100644 --- a/homeassistant/components/zabbix/manifest.json +++ b/homeassistant/components/zabbix/manifest.json @@ -3,6 +3,5 @@ "name": "Zabbix", "documentation": "https://www.home-assistant.io/integrations/zabbix", "requirements": ["pyzabbix==0.7.4"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zamg/manifest.json b/homeassistant/components/zamg/manifest.json index ff131767b33d..c2c03145f600 100644 --- a/homeassistant/components/zamg/manifest.json +++ b/homeassistant/components/zamg/manifest.json @@ -2,7 +2,5 @@ "domain": "zamg", "name": "Zentralanstalt für Meteorologie und Geodynamik (ZAMG)", "documentation": "https://www.home-assistant.io/integrations/zamg", - "requirements": [], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zengge/manifest.json b/homeassistant/components/zengge/manifest.json index 1890088f291e..fc7651708603 100644 --- a/homeassistant/components/zengge/manifest.json +++ b/homeassistant/components/zengge/manifest.json @@ -3,6 +3,5 @@ "name": "Zengge", "documentation": "https://www.home-assistant.io/integrations/zengge", "requirements": ["zengge==0.2"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zestimate/manifest.json b/homeassistant/components/zestimate/manifest.json index c9443bc1ad57..9df1c3f7b91f 100644 --- a/homeassistant/components/zestimate/manifest.json +++ b/homeassistant/components/zestimate/manifest.json @@ -3,6 +3,5 @@ "name": "Zestimate", "documentation": "https://www.home-assistant.io/integrations/zestimate", "requirements": ["xmltodict==0.12.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json index 09dcf71d027d..c7a898e74af0 100644 --- a/homeassistant/components/zha/manifest.json +++ b/homeassistant/components/zha/manifest.json @@ -12,6 +12,5 @@ "zigpy-xbee-homeassistant==0.11.0", "zigpy-zigate==0.5.1" ], - "dependencies": [], "codeowners": ["@dmulcahey", "@adminiuga"] } diff --git a/homeassistant/components/zhong_hong/manifest.json b/homeassistant/components/zhong_hong/manifest.json index 13a65ad16463..f2caf269258e 100644 --- a/homeassistant/components/zhong_hong/manifest.json +++ b/homeassistant/components/zhong_hong/manifest.json @@ -3,6 +3,5 @@ "name": "ZhongHong", "documentation": "https://www.home-assistant.io/integrations/zhong_hong", "requirements": ["zhong_hong_hvac==1.0.9"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zigbee/manifest.json b/homeassistant/components/zigbee/manifest.json index d6c0d76f3c0d..6940aaef7dc0 100644 --- a/homeassistant/components/zigbee/manifest.json +++ b/homeassistant/components/zigbee/manifest.json @@ -3,6 +3,5 @@ "name": "Zigbee", "documentation": "https://www.home-assistant.io/integrations/zigbee", "requirements": ["xbee-helper==0.0.7"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/ziggo_mediabox_xl/manifest.json b/homeassistant/components/ziggo_mediabox_xl/manifest.json index 84a384e51687..ccc5e260eaf7 100644 --- a/homeassistant/components/ziggo_mediabox_xl/manifest.json +++ b/homeassistant/components/ziggo_mediabox_xl/manifest.json @@ -3,6 +3,5 @@ "name": "Ziggo Mediabox XL", "documentation": "https://www.home-assistant.io/integrations/ziggo_mediabox_xl", "requirements": ["ziggo-mediabox-xl==1.1.0"], - "dependencies": [], "codeowners": [] } diff --git a/homeassistant/components/zone/manifest.json b/homeassistant/components/zone/manifest.json index d45399c3f310..019049a3b715 100644 --- a/homeassistant/components/zone/manifest.json +++ b/homeassistant/components/zone/manifest.json @@ -3,8 +3,6 @@ "name": "Zone", "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/zone", - "requirements": [], - "dependencies": [], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/components/zoneminder/manifest.json b/homeassistant/components/zoneminder/manifest.json index 2f6fe831eb33..b3a87510e5ac 100644 --- a/homeassistant/components/zoneminder/manifest.json +++ b/homeassistant/components/zoneminder/manifest.json @@ -3,6 +3,5 @@ "name": "ZoneMinder", "documentation": "https://www.home-assistant.io/integrations/zoneminder", "requirements": ["zm-py==0.4.0"], - "dependencies": [], "codeowners": ["@rohankapoorcom"] } diff --git a/homeassistant/components/zwave/manifest.json b/homeassistant/components/zwave/manifest.json index 72d61b278dd5..5fda2eac7c3d 100644 --- a/homeassistant/components/zwave/manifest.json +++ b/homeassistant/components/zwave/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zwave", "requirements": ["homeassistant-pyozw==0.1.10", "pydispatcher==2.0.5"], - "dependencies": [], "codeowners": ["@home-assistant/z-wave"] } diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 243490499c33..289cb6191713 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -127,8 +127,8 @@ def gather_recursive_requirements(domain, seen=None): seen.add(domain) integration = Integration(Path(f"homeassistant/components/{domain}")) integration.load_manifest() - reqs = set(integration.manifest["requirements"]) - for dep_domain in integration.manifest["dependencies"]: + reqs = set(integration.requirements) + for dep_domain in integration.dependencies: reqs.update(gather_recursive_requirements(dep_domain, seen)) return reqs @@ -170,7 +170,7 @@ def gather_requirements_from_manifests(errors, reqs): process_requirements( errors, - integration.manifest["requirements"], + integration.requirements, f"homeassistant.components.{domain}", reqs, ) diff --git a/script/hassfest/model.py b/script/hassfest/model.py index 37d705c29cad..c82fa670564d 100644 --- a/script/hassfest/model.py +++ b/script/hassfest/model.py @@ -71,6 +71,16 @@ class Integration: """Integration domain.""" return self.path.name + @property + def requirements(self) -> List[str]: + """List of requirements.""" + return self.manifest.get("requirements", []) + + @property + def dependencies(self) -> List[str]: + """List of dependencies.""" + return self.manifest.get("dependencies", []) + def add_error(self, *args, **kwargs): """Add an error.""" self.errors.append(Error(*args, **kwargs)) From 851c1711d43f7215a2592747ab5cd0d824b2331d Mon Sep 17 00:00:00 2001 From: cgtobi Date: Fri, 3 Apr 2020 23:01:24 +0200 Subject: [PATCH 071/653] Reduce log spam (#33592) * Reduce log spam * Reduce log spam * Revert --- homeassistant/components/netatmo/climate.py | 11 ++++++----- homeassistant/components/netatmo/sensor.py | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index fe6526a16eb0..eb4ec52c0f92 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -386,11 +386,12 @@ class NetatmoThermostat(ClimateDevice): ) self._connected = True except KeyError as err: - _LOGGER.debug( - "The thermostat in room %s seems to be out of reach. (%s)", - self._room_name, - err, - ) + if self._connected is not False: + _LOGGER.debug( + "The thermostat in room %s seems to be out of reach. (%s)", + self._room_name, + err, + ) self._connected = False self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY] diff --git a/homeassistant/components/netatmo/sensor.py b/homeassistant/components/netatmo/sensor.py index fcddf58daaa2..be7e0f3e9710 100644 --- a/homeassistant/components/netatmo/sensor.py +++ b/homeassistant/components/netatmo/sensor.py @@ -220,6 +220,11 @@ class NetatmoSensor(Entity): """Return the unique ID for this sensor.""" return self._unique_id + @property + def available(self): + """Return True if entity is available.""" + return bool(self._state) + def update(self): """Get the latest data from Netatmo API and updates the states.""" self.netatmo_data.update() @@ -233,10 +238,11 @@ class NetatmoSensor(Entity): data = self.netatmo_data.data.get(self._module_id) if data is None: - _LOGGER.debug( - "No data found for %s (%s)", self.module_name, self._module_id - ) - _LOGGER.debug("data: %s", self.netatmo_data.data) + if self._state: + _LOGGER.debug( + "No data found for %s (%s)", self.module_name, self._module_id + ) + _LOGGER.debug("data: %s", self.netatmo_data.data) self._state = None return @@ -391,7 +397,8 @@ class NetatmoSensor(Entity): elif data["health_idx"] == 4: self._state = "Unhealthy" except KeyError: - _LOGGER.info("No %s data found for %s", self.type, self.module_name) + if self._state: + _LOGGER.info("No %s data found for %s", self.type, self.module_name) self._state = None return From 8a8ee95336918d54359e9ab17b691576223cba34 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 4 Apr 2020 00:07:23 +0000 Subject: [PATCH 072/653] [ci skip] Translation update --- .../airvisual/.translations/lb.json | 7 +++- .../brother/.translations/zh-Hant.json | 2 +- .../cert_expiry/.translations/lb.json | 5 ++- .../components/cover/.translations/lb.json | 3 ++ .../components/demo/.translations/lb.json | 16 +++++++++- .../components/doorbird/.translations/en.json | 6 ++-- .../components/doorbird/.translations/es.json | 2 ++ .../components/doorbird/.translations/lb.json | 1 + .../doorbird/.translations/zh-Hant.json | 1 + .../elgato/.translations/zh-Hant.json | 2 +- .../esphome/.translations/zh-Hant.json | 2 +- .../flunearyou/.translations/es.json | 21 ++++++++++++ .../flunearyou/.translations/lb.json | 20 ++++++++++++ .../flunearyou/.translations/zh-Hant.json | 21 ++++++++++++ .../components/freebox/.translations/lb.json | 1 + .../components/hue/.translations/lb.json | 17 ++++++++++ .../konnected/.translations/es.json | 5 ++- .../components/light/.translations/lb.json | 2 ++ .../components/nut/.translations/lb.json | 1 + .../components/unifi/.translations/es.json | 3 +- .../components/unifi/.translations/lb.json | 13 +++++++- .../unifi/.translations/zh-Hant.json | 3 +- .../components/vera/.translations/en.json | 32 +++++++++++++++++++ .../components/vera/.translations/es.json | 32 +++++++++++++++++++ .../components/vera/.translations/lb.json | 32 +++++++++++++++++++ .../vera/.translations/zh-Hant.json | 32 +++++++++++++++++++ .../components/vizio/.translations/lb.json | 3 ++ .../wled/.translations/zh-Hant.json | 2 +- .../components/wwlln/.translations/lb.json | 3 +- 29 files changed, 275 insertions(+), 15 deletions(-) create mode 100644 homeassistant/components/flunearyou/.translations/es.json create mode 100644 homeassistant/components/flunearyou/.translations/lb.json create mode 100644 homeassistant/components/flunearyou/.translations/zh-Hant.json create mode 100644 homeassistant/components/vera/.translations/en.json create mode 100644 homeassistant/components/vera/.translations/es.json create mode 100644 homeassistant/components/vera/.translations/lb.json create mode 100644 homeassistant/components/vera/.translations/zh-Hant.json diff --git a/homeassistant/components/airvisual/.translations/lb.json b/homeassistant/components/airvisual/.translations/lb.json index eb267e793bb8..8dcc8ded10d8 100644 --- a/homeassistant/components/airvisual/.translations/lb.json +++ b/homeassistant/components/airvisual/.translations/lb.json @@ -11,8 +11,10 @@ "data": { "api_key": "API Schl\u00ebssel", "latitude": "Breedegrad", - "longitude": "L\u00e4ngegrad" + "longitude": "L\u00e4ngegrad", + "show_on_map": "Iwwerwaachte Geografie op der Kaart uweisen" }, + "description": "Loft Qualit\u00e9it an enger geografescher Lag iwwerwaachen.", "title": "AirVisual konfigur\u00e9ieren" } }, @@ -21,6 +23,9 @@ "options": { "step": { "init": { + "data": { + "show_on_map": "Iwwerwaachte Geografie op der Kaart uweisen" + }, "description": "Verschidden Optioune fir d'AirVisual Integratioun d\u00e9fin\u00e9ieren.", "title": "Airvisual ariichten" } diff --git a/homeassistant/components/brother/.translations/zh-Hant.json b/homeassistant/components/brother/.translations/zh-Hant.json index 0ef813dffeac..987a15f8a2f0 100644 --- a/homeassistant/components/brother/.translations/zh-Hant.json +++ b/homeassistant/components/brother/.translations/zh-Hant.json @@ -24,7 +24,7 @@ "type": "\u5370\u8868\u6a5f\u985e\u578b" }, "description": "\u662f\u5426\u8981\u5c07\u5e8f\u865f {serial_number} \u4e4bBrother \u5370\u8868\u6a5f {model} \u65b0\u589e\u81f3 Home Assistant\uff1f", - "title": "\u767c\u73fe Brother \u5370\u8868\u6a5f" + "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Brother \u5370\u8868\u6a5f" } }, "title": "Brother \u5370\u8868\u6a5f" diff --git a/homeassistant/components/cert_expiry/.translations/lb.json b/homeassistant/components/cert_expiry/.translations/lb.json index 14d12967a384..77aa6093dfaf 100644 --- a/homeassistant/components/cert_expiry/.translations/lb.json +++ b/homeassistant/components/cert_expiry/.translations/lb.json @@ -1,11 +1,14 @@ { "config": { "abort": { - "host_port_exists": "D\u00ebsen Host an Port sinn scho konfigur\u00e9iert" + "already_configured": "D\u00ebs Kombinatioun vun Host an Port sinn scho konfigur\u00e9iert", + "host_port_exists": "D\u00ebsen Host an Port sinn scho konfigur\u00e9iert", + "import_failed": "Import vun der Konfiguratioun feelgeschloen" }, "error": { "certificate_error": "Zertifikat konnt net valid\u00e9iert ginn", "certificate_fetch_failed": "Kann keen Zertifikat vun d\u00ebsen Host a Port recuper\u00e9ieren", + "connection_refused": "Verbindung refus\u00e9iert beim verbannen mam Host", "connection_timeout": "Z\u00e4it Iwwerschreidung beim verbannen.", "host_port_exists": "D\u00ebsen Host an Port sinn scho konfigur\u00e9iert", "resolve_failed": "D\u00ebsen Host kann net opgel\u00e9ist ginn", diff --git a/homeassistant/components/cover/.translations/lb.json b/homeassistant/components/cover/.translations/lb.json index 41c29adf91d4..07742d4f0e0f 100644 --- a/homeassistant/components/cover/.translations/lb.json +++ b/homeassistant/components/cover/.translations/lb.json @@ -1,7 +1,10 @@ { "device_automation": { "action_type": { + "close": "{entity_name} zoumaachen", + "close_tilt": "{entity_name} Kipp zoumaachen", "open": "{entity_name} opmaachen", + "open_tilt": "{entity_name} op Kipp stelle", "set_position": "{entity_name} positioun programm\u00e9ieren", "set_tilt_position": "{entity_name} kipp positioun programm\u00e9ieren" }, diff --git a/homeassistant/components/demo/.translations/lb.json b/homeassistant/components/demo/.translations/lb.json index d968b43af8bd..05b4ba934276 100644 --- a/homeassistant/components/demo/.translations/lb.json +++ b/homeassistant/components/demo/.translations/lb.json @@ -4,9 +4,23 @@ }, "options": { "step": { + "init": { + "data": { + "one": "Een", + "other": "Aner" + } + }, + "options_1": { + "data": { + "bool": "Optionelle Boolean", + "int": "Numeresch Agab" + } + }, "options_2": { "data": { - "select": "Eng Optioun auswielen" + "multi": "Multiple Auswiel", + "select": "Eng Optioun auswielen", + "string": "String W\u00e4ert" } } } diff --git a/homeassistant/components/doorbird/.translations/en.json b/homeassistant/components/doorbird/.translations/en.json index f933b9c99295..87524cd7dd6b 100644 --- a/homeassistant/components/doorbird/.translations/en.json +++ b/homeassistant/components/doorbird/.translations/en.json @@ -10,6 +10,7 @@ "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { @@ -21,8 +22,7 @@ "title": "Connect to the DoorBird" } }, - "title": "DoorBird", - "flow_title" : "DoorBird {name} ({host})" + "title": "DoorBird" }, "options": { "step": { @@ -34,4 +34,4 @@ } } } -} +} \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/es.json b/homeassistant/components/doorbird/.translations/es.json index 93ab919cc030..4e2aa0414dce 100644 --- a/homeassistant/components/doorbird/.translations/es.json +++ b/homeassistant/components/doorbird/.translations/es.json @@ -2,6 +2,7 @@ "config": { "abort": { "already_configured": "DoorBird ya est\u00e1 configurado", + "link_local_address": "No se admiten direcciones locales", "not_doorbird_device": "Este dispositivo no es un DoorBird" }, "error": { @@ -9,6 +10,7 @@ "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "unknown": "Error inesperado" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/doorbird/.translations/lb.json b/homeassistant/components/doorbird/.translations/lb.json index d0b94ed6c594..ba29b19df8a7 100644 --- a/homeassistant/components/doorbird/.translations/lb.json +++ b/homeassistant/components/doorbird/.translations/lb.json @@ -10,6 +10,7 @@ "invalid_auth": "Ong\u00eblteg Authentifikatioun", "unknown": "Onerwaarte Feeler" }, + "flow_title": "DoorBird {name{ ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/doorbird/.translations/zh-Hant.json b/homeassistant/components/doorbird/.translations/zh-Hant.json index d8b6330b8799..bb8b291f86bd 100644 --- a/homeassistant/components/doorbird/.translations/zh-Hant.json +++ b/homeassistant/components/doorbird/.translations/zh-Hant.json @@ -10,6 +10,7 @@ "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/elgato/.translations/zh-Hant.json b/homeassistant/components/elgato/.translations/zh-Hant.json index b187abc5ccd7..c0c638851a10 100644 --- a/homeassistant/components/elgato/.translations/zh-Hant.json +++ b/homeassistant/components/elgato/.translations/zh-Hant.json @@ -19,7 +19,7 @@ }, "zeroconf_confirm": { "description": "\u662f\u5426\u8981\u5c07 Elgato Key \u7167\u660e\u5e8f\u865f `{serial_number}` \u65b0\u589e\u81f3 Home Assistant\uff1f", - "title": "\u767c\u73fe\u5230 Elgato Key \u7167\u660e\u8a2d\u5099" + "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Elgato Key \u7167\u660e\u8a2d\u5099" } }, "title": "Elgato Key \u7167\u660e" diff --git a/homeassistant/components/esphome/.translations/zh-Hant.json b/homeassistant/components/esphome/.translations/zh-Hant.json index 0386fd8c4685..bc229d190a71 100644 --- a/homeassistant/components/esphome/.translations/zh-Hant.json +++ b/homeassistant/components/esphome/.translations/zh-Hant.json @@ -19,7 +19,7 @@ }, "discovery_confirm": { "description": "\u662f\u5426\u8981\u5c07 ESPHome \u7bc0\u9ede `{name}` \u65b0\u589e\u81f3 Home Assistant\uff1f", - "title": "\u767c\u73fe\u5230 ESPHome \u7bc0\u9ede" + "title": "\u81ea\u52d5\u63a2\u7d22\u5230 ESPHome \u7bc0\u9ede" }, "user": { "data": { diff --git a/homeassistant/components/flunearyou/.translations/es.json b/homeassistant/components/flunearyou/.translations/es.json new file mode 100644 index 000000000000..df104c5405ee --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/es.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Estas coordenadas ya est\u00e1n registradas." + }, + "error": { + "general_error": "Se ha producido un error desconocido." + }, + "step": { + "user": { + "data": { + "latitude": "Latitud", + "longitude": "Longitud" + }, + "description": "Monitorizar reportes de usuarios y del CDC para un par de coordenadas", + "title": "Configurar Flu Near You" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/lb.json b/homeassistant/components/flunearyou/.translations/lb.json new file mode 100644 index 000000000000..f2be7cf7ca63 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/lb.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "D\u00ebs Koordinate si scho registr\u00e9iert" + }, + "error": { + "general_error": "Onbekannten Feeler" + }, + "step": { + "user": { + "data": { + "latitude": "Breedegrad", + "longitude": "L\u00e4ngegrad" + }, + "title": "Flu Near You konfigur\u00e9ieren" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/zh-Hant.json b/homeassistant/components/flunearyou/.translations/zh-Hant.json new file mode 100644 index 000000000000..50f31707a61c --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/zh-Hant.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\u6b64\u4e9b\u5ea7\u6a19\u5df2\u8a3b\u518a\u3002" + }, + "error": { + "general_error": "\u767c\u751f\u672a\u77e5\u932f\u8aa4\u3002" + }, + "step": { + "user": { + "data": { + "latitude": "\u7def\u5ea6", + "longitude": "\u7d93\u5ea6" + }, + "description": "\u76e3\u6e2c\u4f7f\u7528\u8005\u8207 CDC \u56de\u5831\u5ea7\u6a19\u3002", + "title": "\u8a2d\u5b9a Flu Near You" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/lb.json b/homeassistant/components/freebox/.translations/lb.json index fdf08c0a5fee..21567b8f0961 100644 --- a/homeassistant/components/freebox/.translations/lb.json +++ b/homeassistant/components/freebox/.translations/lb.json @@ -10,6 +10,7 @@ }, "step": { "link": { + "description": "Dr\u00e9ck \"Ofsch\u00e9cken\", dann dr\u00e9ck de rietse Feil um Router fir d'Freebox mam Home Assistant ze registr\u00e9ieren.\n\n![Location of button on the router](/static/images/config_freebox.png)", "title": "Freebox Router verbannen" }, "user": { diff --git a/homeassistant/components/hue/.translations/lb.json b/homeassistant/components/hue/.translations/lb.json index ac83609ff025..2b5b168817f1 100644 --- a/homeassistant/components/hue/.translations/lb.json +++ b/homeassistant/components/hue/.translations/lb.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "\u00c9ischte Kn\u00e4ppchen", + "button_2": "Zweete Kn\u00e4ppchen", + "button_3": "Dr\u00ebtte Kn\u00e4ppchen", + "button_4": "V\u00e9ierte Kn\u00e4ppchen", + "dim_down": "Verd\u00e4ischteren", + "dim_up": "Erhellen", + "turn_off": "Ausschalten", + "turn_on": "Uschalten" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" Kn\u00e4ppche no laangem unhalen lassgelooss", + "remote_button_short_press": "\"{subtype}\" Kn\u00e4ppche gedr\u00e9ckt", + "remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss" + } } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/es.json b/homeassistant/components/konnected/.translations/es.json index cfd05320e359..64069d4e756b 100644 --- a/homeassistant/components/konnected/.translations/es.json +++ b/homeassistant/components/konnected/.translations/es.json @@ -34,6 +34,7 @@ "not_konn_panel": "No es un dispositivo Konnected.io reconocido" }, "error": { + "bad_host": "URL del host de la API de invalidaci\u00f3n no v\u00e1lida", "one": "", "other": "otros" }, @@ -86,7 +87,9 @@ }, "options_misc": { "data": { - "blink": "Parpadea el LED del panel cuando se env\u00eda un cambio de estado" + "api_host": "Invalidar la direcci\u00f3n URL del host de la API (opcional)", + "blink": "Parpadea el LED del panel cuando se env\u00eda un cambio de estado", + "override_api_host": "Reemplazar la URL predeterminada del panel host de la API de Home Assistant" }, "description": "Seleccione el comportamiento deseado para su panel", "title": "Configurar miscel\u00e1neos" diff --git a/homeassistant/components/light/.translations/lb.json b/homeassistant/components/light/.translations/lb.json index a7f807e8dcda..8ffa33a6a3bf 100644 --- a/homeassistant/components/light/.translations/lb.json +++ b/homeassistant/components/light/.translations/lb.json @@ -1,6 +1,8 @@ { "device_automation": { "action_type": { + "brightness_decrease": "{entity_name} Hellegkeet reduz\u00e9ieren", + "brightness_increase": "{entity_name} Hellegkeet erh\u00e9ijen", "toggle": "{entity_name} \u00ebmschalten", "turn_off": "{entity_name} ausschalten", "turn_on": "{entity_name} uschalten" diff --git a/homeassistant/components/nut/.translations/lb.json b/homeassistant/components/nut/.translations/lb.json index 416d5c49aee9..7e9ec8ddd97f 100644 --- a/homeassistant/components/nut/.translations/lb.json +++ b/homeassistant/components/nut/.translations/lb.json @@ -18,6 +18,7 @@ "resources": "Ressourcen", "username": "Benotzernumm" }, + "description": "Falls m\u00e9i w\u00e9i een UPS mat deem NUT Server verbonnen ass, g\u00e8eff den UPS Numm am 'Alias' Feld un fir ze sichen.", "title": "Mam NUT Server verbannen" } }, diff --git a/homeassistant/components/unifi/.translations/es.json b/homeassistant/components/unifi/.translations/es.json index b6713bb09bbf..31c7e6c0bcd4 100644 --- a/homeassistant/components/unifi/.translations/es.json +++ b/homeassistant/components/unifi/.translations/es.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "Clientes con acceso controlado a la red", - "new_client": "A\u00f1adir nuevo cliente para el control de acceso a la red" + "new_client": "A\u00f1adir nuevo cliente para el control de acceso a la red", + "poe_clients": "Permitir control PoE de clientes" }, "description": "Configurar controles de cliente\n\nCrea conmutadores para los n\u00fameros de serie para los que deseas controlar el acceso a la red.", "title": "Opciones UniFi 2/3" diff --git a/homeassistant/components/unifi/.translations/lb.json b/homeassistant/components/unifi/.translations/lb.json index 13bb40dd25e5..527c2f11a281 100644 --- a/homeassistant/components/unifi/.translations/lb.json +++ b/homeassistant/components/unifi/.translations/lb.json @@ -6,7 +6,8 @@ }, "error": { "faulty_credentials": "Ong\u00eblteg Login Informatioune", - "service_unavailable": "Keen Service disponibel" + "service_unavailable": "Keen Service disponibel", + "unknown_client_mac": "Kee Cliwent mat der MAC Adress disponibel" }, "step": { "user": { @@ -23,18 +24,28 @@ }, "title": "Unifi Kontroller" }, + "error": { + "unknown_client_mac": "Kee Client am Unifi disponibel mat der MAC Adress" + }, "options": { "step": { "client_control": { + "data": { + "block_client": "Netzwierk Zougang kontroll\u00e9iert Clienten", + "new_client": "Neie Client fir Netzwierk Zougang Kontroll b\u00e4isetzen", + "poe_clients": "POE Kontroll vun Clienten erlaben" + }, "title": "UniFi Optiounen 2/3" }, "device_tracker": { "data": { "detection_time": "Z\u00e4it a Sekonne vum leschten Z\u00e4itpunkt un bis den Apparat als \u00ebnnerwee consider\u00e9iert g\u00ebtt", + "ssid_filter": "SSIDs auswielen fir Clienten ze verfollegen", "track_clients": "Netzwierk Cliente verfollegen", "track_devices": "Netzwierk Apparater (Ubiquiti Apparater) verfollegen", "track_wired_clients": "Kabel Netzwierk Cliente abez\u00e9ien" }, + "description": "Apparate verfollegen ariichten", "title": "UniFi Optiounen" }, "init": { diff --git a/homeassistant/components/unifi/.translations/zh-Hant.json b/homeassistant/components/unifi/.translations/zh-Hant.json index ca920abd4923..e91bfca407c0 100644 --- a/homeassistant/components/unifi/.translations/zh-Hant.json +++ b/homeassistant/components/unifi/.translations/zh-Hant.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "\u7db2\u8def\u5b58\u53d6\u63a7\u5236\u5ba2\u6236\u7aef", - "new_client": "\u65b0\u589e\u9396\u8981\u63a7\u5236\u7db2\u8def\u5b58\u53d6\u7684\u5ba2\u6236\u7aef" + "new_client": "\u65b0\u589e\u9396\u8981\u63a7\u5236\u7db2\u8def\u5b58\u53d6\u7684\u5ba2\u6236\u7aef", + "poe_clients": "\u5141\u8a31 POE \u63a7\u5236\u5ba2\u6236\u7aef" }, "description": "\u8a2d\u5b9a\u5ba2\u6236\u7aef\u63a7\u5236\n\n\u65b0\u589e\u9396\u8981\u63a7\u5236\u7db2\u8def\u5b58\u53d6\u7684\u958b\u95dc\u5e8f\u865f\u3002", "title": "UniFi \u9078\u9805 2/3" diff --git a/homeassistant/components/vera/.translations/en.json b/homeassistant/components/vera/.translations/en.json new file mode 100644 index 000000000000..0578daa4c0bb --- /dev/null +++ b/homeassistant/components/vera/.translations/en.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "A controller is already configured.", + "cannot_connect": "Could not connect to controller with url {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "Vera device ids to exclude from Home Assistant.", + "lights": "Vera switch device ids to treat as lights in Home Assistant.", + "vera_controller_url": "Controller URL" + }, + "description": "Provide a Vera controller url below. It should look like this: http://192.168.1.161:3480.", + "title": "Setup Vera controller" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Vera device ids to exclude from Home Assistant.", + "lights": "Vera switch device ids to treat as lights in Home Assistant." + }, + "description": "See the vera documentation for details on optional parameters: https://www.home-assistant.io/integrations/vera/. Note: Any changes here will need a restart to the home assistant server. To clear values, provide a space.", + "title": "Vera controller options" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/es.json b/homeassistant/components/vera/.translations/es.json new file mode 100644 index 000000000000..672bcc9056e1 --- /dev/null +++ b/homeassistant/components/vera/.translations/es.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "Un controlador ya est\u00e1 configurado.", + "cannot_connect": "No se pudo conectar con el controlador con url {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "Identificadores de dispositivos Vera a excluir de Home Assistant", + "lights": "Identificadores de interruptores Vera que deben ser tratados como luces en Home Assistant", + "vera_controller_url": "URL del controlador" + }, + "description": "Introduce una URL para el controlador Vera a continuaci\u00f3n. Ser\u00eda algo como: http://192.168.1.161:3480.", + "title": "Configurar el controlador Vera" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Identificadores de dispositivos Vera a excluir de Home Assistant", + "lights": "Identificadores de interruptores Vera que deben ser tratados como luces en Home Assistant" + }, + "description": "Consulte la documentaci\u00f3n de Vera para obtener detalles sobre los par\u00e1metros opcionales: https://www.home-assistant.io/integrations/vera/. Nota: Cualquier cambio aqu\u00ed necesitar\u00e1 un reinicio del servidor de Home Assistant. Para borrar valores, introduce un espacio.", + "title": "Opciones del controlador Vera" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/lb.json b/homeassistant/components/vera/.translations/lb.json new file mode 100644 index 000000000000..440c576596f1 --- /dev/null +++ b/homeassistant/components/vera/.translations/lb.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "Ee Kontroller ass scho konfigur\u00e9iert", + "cannot_connect": "Et konnt keng Verbindung mam Kontroller mat der URL {base_url} hiergestallt ginn" + }, + "step": { + "user": { + "data": { + "exclude": "IDs vu Vera Apparater d\u00e9i vun Home Assistant ausgeschloss solle ginn.", + "lights": "IDs vun Apparater vu Vera Schalter d\u00e9i als Luuchten am Home Assistant trait\u00e9iert ginn.", + "vera_controller_url": "Kontroller URL" + }, + "description": "Vera Kontroller URL uginn: D\u00e9i sollt sou ausgesinn:\nhttp://192.168.1.161:3480.", + "title": "Vera Kontroller ariichten" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "IDs vu Vera Apparater d\u00e9i vun Home Assistant ausgeschloss solle ginn.", + "lights": "IDs vun Apparater vu Vera Schalter d\u00e9i als Luuchten am Home Assistant trait\u00e9iert ginn." + }, + "description": "Kuck Vera Dokumentatioun fir Detailer zu den optionellle Parameter: https://www.home-assistant.io/integrations/vera/. Hiweis: All \u00c4nnerunge ginn er\u00e9ischt no engem Neistart vum Home Assistant aktiv. Fir W\u00e4rter ze l\u00e4schen, einfach een \"Leerzeichen\" am Feld uginn.", + "title": "Vera Kontroller Optiounen" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/zh-Hant.json b/homeassistant/components/vera/.translations/zh-Hant.json new file mode 100644 index 000000000000..6fb71a57abed --- /dev/null +++ b/homeassistant/components/vera/.translations/zh-Hant.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "\u6b64\u63a7\u5236\u5668\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002", + "cannot_connect": "\u7121\u6cd5\u9023\u7dda\u81f3\u63a7\u5236\u5668 URL {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "\u5f9e Home Assistant \u6392\u9664\u7684 Vera \u8a2d\u5099 ID\u3002", + "lights": "\u65bc Home Assistant \u4e2d\u8996\u70ba\u71c8\u5149\u7684 Vera \u958b\u95dc\u8a2d\u5099 ID\u3002", + "vera_controller_url": "\u63a7\u5236\u5668 URL" + }, + "description": "\u65bc\u4e0b\u65b9\u63d0\u4f9b Vera \u63a7\u5236\u5668 URL\u3002\u683c\u5f0f\u61c9\u8a72\u70ba\uff1ahttp://192.168.1.161:3480\u3002", + "title": "\u8a2d\u5b9a Vera \u63a7\u5236\u5668" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "\u5f9e Home Assistant \u6392\u9664\u7684 Vera \u8a2d\u5099 ID\u3002", + "lights": "\u65bc Home Assistant \u4e2d\u8996\u70ba\u71c8\u5149\u7684 Vera \u958b\u95dc\u8a2d\u5099 ID\u3002" + }, + "description": "\u8acb\u53c3\u95b1 Vera \u6587\u4ef6\u4ee5\u7372\u5f97\u8a73\u7d30\u7684\u9078\u9805\u53c3\u6578\u8cc7\u6599\uff1ahttps://www.home-assistant.io/integrations/vera/\u3002\u8acb\u6ce8\u610f\uff1a\u4efb\u4f55\u8b8a\u66f4\u90fd\u9700\u8981\u91cd\u555f Home Assistant\u3002\u6b32\u6e05\u9664\u8a2d\u5b9a\u503c\u3001\u8acb\u8f38\u5165\u7a7a\u683c\u3002", + "title": "Vera \u63a7\u5236\u5668\u9078\u9805" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/lb.json b/homeassistant/components/vizio/.translations/lb.json index 79dfa120db26..b37f7fda4a55 100644 --- a/homeassistant/components/vizio/.translations/lb.json +++ b/homeassistant/components/vizio/.translations/lb.json @@ -38,6 +38,7 @@ "apps_to_include_or_exclude": "Apps fir mat abegr\u00e4ifen oder auszeschl\u00e9issen", "include_or_exclude": "Apps mat abez\u00e9ien oder auschl\u00e9issen?" }, + "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn. D\u00ebse Schratt kann iwwerspronge ginn fir TV's d\u00e9i keng Apps support\u00e9ieren.", "title": "Apps fir Smart TV konfigur\u00e9ieren" }, "user": { @@ -55,6 +56,7 @@ "apps_to_include_or_exclude": "Apps fir mat abegr\u00e4ifen oder auszeschl\u00e9issen", "include_or_exclude": "Apps mat abez\u00e9ien oder auschl\u00e9issen?" }, + "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn. D\u00ebse Schratt kann iwwerspronge ginn fir TV's d\u00e9i keng Apps support\u00e9ieren.", "title": "Apps fir Smart TV konfigur\u00e9ieren" } }, @@ -69,6 +71,7 @@ "timeout": "Z\u00e4itiwwerscheidung bei der Ufro vun der API (sekonnen)", "volume_step": "Lautst\u00e4erkt Schr\u00ebtt Gr\u00e9isst" }, + "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn.", "title": "Vizo Smartcast Optiounen aktualis\u00e9ieren" } }, diff --git a/homeassistant/components/wled/.translations/zh-Hant.json b/homeassistant/components/wled/.translations/zh-Hant.json index b72ef3d078c6..14139a204019 100644 --- a/homeassistant/components/wled/.translations/zh-Hant.json +++ b/homeassistant/components/wled/.translations/zh-Hant.json @@ -18,7 +18,7 @@ }, "zeroconf_confirm": { "description": "\u662f\u5426\u8981\u65b0\u589e WLED \u540d\u7a31\u300c{name}\u300d\u8a2d\u5099\u81f3 Home Assistant\uff1f", - "title": "\u767c\u73fe\u5230 WLED \u8a2d\u5099" + "title": "\u81ea\u52d5\u63a2\u7d22\u5230 WLED \u8a2d\u5099" } }, "title": "WLED" diff --git a/homeassistant/components/wwlln/.translations/lb.json b/homeassistant/components/wwlln/.translations/lb.json index a580b639d966..00b5c35e0551 100644 --- a/homeassistant/components/wwlln/.translations/lb.json +++ b/homeassistant/components/wwlln/.translations/lb.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "D\u00ebse Standuert ass scho registr\u00e9iert" + "already_configured": "D\u00ebse Standuert ass scho registr\u00e9iert", + "window_too_small": "Eng ze kleng F\u00ebnster f\u00e9iert dozou dass Home Assistant Evenementer verpasst." }, "error": { "identifier_exists": "Standuert ass scho registr\u00e9iert" From 1041dbe23c4605e7413ea37e749db1b2b6957187 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Apr 2020 19:42:06 -0700 Subject: [PATCH 073/653] Hass.io integration do not warn safe mode (#33600) * Hass.io integration do not warn safe mode * Better implementation * Tweak log message --- homeassistant/components/hassio/handler.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/hassio/handler.py b/homeassistant/components/hassio/handler.py index e471bfae543f..bb41e5335d79 100644 --- a/homeassistant/components/hassio/handler.py +++ b/homeassistant/components/hassio/handler.py @@ -10,6 +10,7 @@ from homeassistant.components.http import ( CONF_SERVER_HOST, CONF_SERVER_PORT, CONF_SSL_CERTIFICATE, + DEFAULT_SERVER_HOST, ) from homeassistant.const import SERVER_PORT @@ -133,9 +134,14 @@ class HassIO: "refresh_token": refresh_token.token, } - if CONF_SERVER_HOST in http_config: + if ( + http_config.get(CONF_SERVER_HOST, DEFAULT_SERVER_HOST) + != DEFAULT_SERVER_HOST + ): options["watchdog"] = False - _LOGGER.warning("Don't use 'server_host' options with Hass.io") + _LOGGER.warning( + "Found incompatible HTTP option 'server_host'. Watchdog feature disabled" + ) return await self.send_command("/homeassistant/options", payload=options) From 42353282d46c4fb7348e13d3700f44c105b9efda Mon Sep 17 00:00:00 2001 From: jjlawren Date: Sat, 4 Apr 2020 00:34:42 -0500 Subject: [PATCH 074/653] Debounce calls to Plex server (#33560) * Debounce calls to Plex server * Simplify debounce by recommendation * Update tests to handle debounce * Test debouncer, fix & optimize tests * Use property instead --- homeassistant/components/plex/const.py | 1 + homeassistant/components/plex/server.py | 37 +++++++++++++-- tests/components/plex/common.py | 20 +++++++++ tests/components/plex/test_config_flow.py | 6 +-- tests/components/plex/test_init.py | 36 +++++++-------- tests/components/plex/test_server.py | 55 +++++++++++++++++++---- 6 files changed, 120 insertions(+), 35 deletions(-) create mode 100644 tests/components/plex/common.py diff --git a/homeassistant/components/plex/const.py b/homeassistant/components/plex/const.py index 44bb25b3fd98..126c6eb313a4 100644 --- a/homeassistant/components/plex/const.py +++ b/homeassistant/components/plex/const.py @@ -9,6 +9,7 @@ DEFAULT_PORT = 32400 DEFAULT_SSL = False DEFAULT_VERIFY_SSL = True +DEBOUNCE_TIMEOUT = 1 DISPATCHERS = "dispatchers" PLATFORMS = frozenset(["media_player", "sensor"]) PLATFORMS_COMPLETED = "platforms_completed" diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index 196968cc0974..f2a4908e1196 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -1,4 +1,5 @@ """Shared class to maintain Plex server instances.""" +from functools import partial, wraps import logging import ssl from urllib.parse import urlparse @@ -12,6 +13,7 @@ import requests.exceptions from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL from homeassistant.helpers.dispatcher import dispatcher_send +from homeassistant.helpers.event import async_call_later from .const import ( CONF_CLIENT_IDENTIFIER, @@ -19,6 +21,7 @@ from .const import ( CONF_MONITORED_USERS, CONF_SERVER, CONF_USE_EPISODE_ART, + DEBOUNCE_TIMEOUT, DEFAULT_VERIFY_SSL, PLEX_NEW_MP_SIGNAL, PLEX_UPDATE_MEDIA_PLAYER_SIGNAL, @@ -39,12 +42,37 @@ plexapi.X_PLEX_PRODUCT = X_PLEX_PRODUCT plexapi.X_PLEX_VERSION = X_PLEX_VERSION +def debounce(func): + """Decorate function to debounce callbacks from Plex websocket.""" + + unsub = None + + async def call_later_listener(self, _): + """Handle call_later callback.""" + nonlocal unsub + unsub = None + await self.hass.async_add_executor_job(func, self) + + @wraps(func) + def wrapper(self): + """Schedule async callback.""" + nonlocal unsub + if unsub: + _LOGGER.debug("Throttling update of %s", self.friendly_name) + unsub() # pylint: disable=not-callable + unsub = async_call_later( + self.hass, DEBOUNCE_TIMEOUT, partial(call_later_listener, self), + ) + + return wrapper + + class PlexServer: """Manages a single Plex server connection.""" def __init__(self, hass, server_config, known_server_id=None, options=None): """Initialize a Plex server instance.""" - self._hass = hass + self.hass = hass self._plex_server = None self._known_clients = set() self._known_idle = set() @@ -150,12 +178,13 @@ class PlexServer: unique_id = f"{self.machine_identifier}:{machine_identifier}" _LOGGER.debug("Refreshing %s", unique_id) dispatcher_send( - self._hass, + self.hass, PLEX_UPDATE_MEDIA_PLAYER_SIGNAL.format(unique_id), device, session, ) + @debounce def update_platforms(self): """Update the platform entities.""" _LOGGER.debug("Updating devices") @@ -239,13 +268,13 @@ class PlexServer: if new_entity_configs: dispatcher_send( - self._hass, + self.hass, PLEX_NEW_MP_SIGNAL.format(self.machine_identifier), new_entity_configs, ) dispatcher_send( - self._hass, + self.hass, PLEX_UPDATE_SENSOR_SIGNAL.format(self.machine_identifier), sessions, ) diff --git a/tests/components/plex/common.py b/tests/components/plex/common.py new file mode 100644 index 000000000000..adc6f4e0299d --- /dev/null +++ b/tests/components/plex/common.py @@ -0,0 +1,20 @@ +"""Common fixtures and functions for Plex tests.""" +from datetime import timedelta + +from homeassistant.components.plex.const import ( + DEBOUNCE_TIMEOUT, + PLEX_UPDATE_PLATFORMS_SIGNAL, +) +from homeassistant.helpers.dispatcher import async_dispatcher_send +import homeassistant.util.dt as dt_util + +from tests.common import async_fire_time_changed + + +async def trigger_plex_update(hass, server_id): + """Update Plex by sending signal and jumping ahead by debounce timeout.""" + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + next_update = dt_util.utcnow() + timedelta(seconds=DEBOUNCE_TIMEOUT) + async_fire_time_changed(hass, next_update) + await hass.async_block_till_done() diff --git a/tests/components/plex/test_config_flow.py b/tests/components/plex/test_config_flow.py index d839ccc674b8..bd5d45c0246b 100644 --- a/tests/components/plex/test_config_flow.py +++ b/tests/components/plex/test_config_flow.py @@ -15,14 +15,13 @@ from homeassistant.components.plex.const import ( CONF_USE_EPISODE_ART, DOMAIN, PLEX_SERVER_CONFIG, - PLEX_UPDATE_PLATFORMS_SIGNAL, SERVERS, ) from homeassistant.config_entries import ENTRY_STATE_LOADED from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TOKEN, CONF_URL -from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.setup import async_setup_component +from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS, MOCK_SERVERS, MOCK_TOKEN from .mock_classes import MockPlexAccount, MockPlexServer @@ -416,8 +415,7 @@ async def test_option_flow_new_users_available(hass, caplog): server_id = mock_plex_server.machineIdentifier - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users diff --git a/tests/components/plex/test_init.py b/tests/components/plex/test_init.py index 387ce6cac03e..1aef7878df5e 100644 --- a/tests/components/plex/test_init.py +++ b/tests/components/plex/test_init.py @@ -23,10 +23,10 @@ from homeassistant.const import ( CONF_URL, CONF_VERIFY_SSL, ) -from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util +from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS, MOCK_SERVERS, MOCK_TOKEN from .mock_classes import MockPlexAccount, MockPlexServer @@ -74,7 +74,7 @@ async def test_setup_with_config(hass): ) -async def test_setup_with_config_entry(hass): +async def test_setup_with_config_entry(hass, caplog): """Test setup component with config.""" mock_plex_server = MockPlexServer() @@ -109,30 +109,31 @@ async def test_setup_with_config_entry(hass): hass.data[const.DOMAIN][const.PLATFORMS_COMPLETED][server_id] == const.PLATFORMS ) - async_dispatcher_send(hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) sensor = hass.states.get("sensor.plex_plex_server_1") assert sensor.state == str(len(mock_plex_server.accounts)) - async_dispatcher_send(hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) with patch.object( mock_plex_server, "clients", side_effect=plexapi.exceptions.BadRequest - ): - async_dispatcher_send( - hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id) - ) - await hass.async_block_till_done() + ) as patched_clients_bad_request: + await trigger_plex_update(hass, server_id) + + assert patched_clients_bad_request.called + assert "Error requesting Plex client data from server" in caplog.text with patch.object( mock_plex_server, "clients", side_effect=requests.exceptions.RequestException - ): - async_dispatcher_send( - hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id) - ) - await hass.async_block_till_done() + ) as patched_clients_requests_exception: + await trigger_plex_update(hass, server_id) + + assert patched_clients_requests_exception.called + assert ( + f"Could not connect to Plex server: {mock_plex_server.friendlyName}" + in caplog.text + ) async def test_set_config_entry_unique_id(hass): @@ -294,8 +295,7 @@ async def test_setup_with_photo_session(hass): server_id = mock_plex_server.machineIdentifier - async_dispatcher_send(hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) media_player = hass.states.get("media_player.plex_product_title") assert media_player.state == "idle" diff --git a/tests/components/plex/test_server.py b/tests/components/plex/test_server.py index 646a6ded32e6..242c0fe55046 100644 --- a/tests/components/plex/test_server.py +++ b/tests/components/plex/test_server.py @@ -1,5 +1,6 @@ """Tests for Plex server.""" import copy +from datetime import timedelta from asynctest import patch @@ -7,16 +8,19 @@ from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.components.plex.const import ( CONF_IGNORE_NEW_SHARED_USERS, CONF_MONITORED_USERS, + DEBOUNCE_TIMEOUT, DOMAIN, PLEX_UPDATE_PLATFORMS_SIGNAL, SERVERS, ) from homeassistant.helpers.dispatcher import async_dispatcher_send +import homeassistant.util.dt as dt_util +from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS from .mock_classes import MockPlexServer -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, async_fire_time_changed async def test_new_users_available(hass): @@ -44,8 +48,7 @@ async def test_new_users_available(hass): server_id = mock_plex_server.machineIdentifier - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users @@ -83,8 +86,7 @@ async def test_new_ignored_users_available(hass, caplog): server_id = mock_plex_server.machineIdentifier - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users @@ -118,8 +120,7 @@ async def test_mark_sessions_idle(hass): server_id = mock_plex_server.machineIdentifier - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) sensor = hass.states.get("sensor.plex_plex_server_1") assert sensor.state == str(len(mock_plex_server.accounts)) @@ -127,8 +128,44 @@ async def test_mark_sessions_idle(hass): mock_plex_server.clear_clients() mock_plex_server.clear_sessions() - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + await trigger_plex_update(hass, server_id) sensor = hass.states.get("sensor.plex_plex_server_1") assert sensor.state == "0" + + +async def test_debouncer(hass, caplog): + """Test debouncer decorator logic.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=DEFAULT_DATA, + options=DEFAULT_OPTIONS, + unique_id=DEFAULT_DATA["server_id"], + ) + + mock_plex_server = MockPlexServer(config_entry=entry) + + with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( + "homeassistant.components.plex.PlexWebsocket.listen" + ): + entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + server_id = mock_plex_server.machineIdentifier + + # First two updates are skipped + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + + next_update = dt_util.utcnow() + timedelta(seconds=DEBOUNCE_TIMEOUT) + async_fire_time_changed(hass, next_update) + await hass.async_block_till_done() + + assert ( + caplog.text.count(f"Throttling update of {mock_plex_server.friendlyName}") == 2 + ) From 07ae3f9ee9fdefb9d2c3eb5d694b169177ef347b Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sat, 4 Apr 2020 00:36:46 -0500 Subject: [PATCH 075/653] Use IP addresses instead of mDNS names when IPP discovered (#33610) * use discovery resolved host rather than mdns host. * Update __init__.py * Update test_config_flow.py * Update __init__.py * Update test_init.py * Update test_config_flow.py * Update test_config_flow.py * Update __init__.py * Update __init__.py * Update __init__.py * Update test_init.py * Update test_config_flow.py --- homeassistant/components/ipp/config_flow.py | 2 +- tests/components/ipp/__init__.py | 13 ++++--- tests/components/ipp/test_config_flow.py | 38 ++++++++------------- tests/components/ipp/test_init.py | 4 +-- 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index 395a5f0db58c..e95267e78036 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -85,7 +85,7 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): self.discovery_info.update( { - CONF_HOST: host, + CONF_HOST: discovery_info[CONF_HOST], CONF_PORT: port, CONF_SSL: tls, CONF_VERIFY_SSL: False, diff --git a/tests/components/ipp/__init__.py b/tests/components/ipp/__init__.py index 6bf162725e13..1c52c557024b 100644 --- a/tests/components/ipp/__init__.py +++ b/tests/components/ipp/__init__.py @@ -22,13 +22,13 @@ IPP_ZEROCONF_SERVICE_TYPE = "_ipp._tcp.local." IPPS_ZEROCONF_SERVICE_TYPE = "_ipps._tcp.local." ZEROCONF_NAME = "EPSON123456" -ZEROCONF_HOST = "1.2.3.4" +ZEROCONF_HOST = "192.168.1.31" ZEROCONF_HOSTNAME = "EPSON123456.local." ZEROCONF_PORT = 631 MOCK_USER_INPUT = { - CONF_HOST: "EPSON123456.local", + CONF_HOST: "192.168.1.31", CONF_PORT: 361, CONF_SSL: False, CONF_VERIFY_SSL: False, @@ -37,7 +37,7 @@ MOCK_USER_INPUT = { MOCK_ZEROCONF_IPP_SERVICE_INFO = { CONF_TYPE: IPP_ZEROCONF_SERVICE_TYPE, - CONF_NAME: ZEROCONF_NAME, + CONF_NAME: f"{ZEROCONF_NAME}.{IPP_ZEROCONF_SERVICE_TYPE}", CONF_HOST: ZEROCONF_HOST, ATTR_HOSTNAME: ZEROCONF_HOSTNAME, CONF_PORT: ZEROCONF_PORT, @@ -46,7 +46,7 @@ MOCK_ZEROCONF_IPP_SERVICE_INFO = { MOCK_ZEROCONF_IPPS_SERVICE_INFO = { CONF_TYPE: IPPS_ZEROCONF_SERVICE_TYPE, - CONF_NAME: ZEROCONF_NAME, + CONF_NAME: f"{ZEROCONF_NAME}.{IPPS_ZEROCONF_SERVICE_TYPE}", CONF_HOST: ZEROCONF_HOST, ATTR_HOSTNAME: ZEROCONF_HOSTNAME, CONF_PORT: ZEROCONF_PORT, @@ -65,10 +65,9 @@ async def init_integration( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker, skip_setup: bool = False, ) -> MockConfigEntry: """Set up the IPP integration in Home Assistant.""" - fixture = "ipp/get-printer-attributes.bin" aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", + "http://192.168.1.31:631/ipp/print", content=load_fixture_binary(fixture), headers={"Content-Type": "application/ipp"}, ) @@ -77,7 +76,7 @@ async def init_integration( domain=DOMAIN, unique_id="cfe92100-67c4-11d4-a45f-f8d027761251", data={ - CONF_HOST: "EPSON123456.local", + CONF_HOST: "192.168.1.31", CONF_PORT: 631, CONF_SSL: False, CONF_VERIFY_SSL: True, diff --git a/tests/components/ipp/test_config_flow.py b/tests/components/ipp/test_config_flow.py index 5a2744eac516..0682929b7b86 100644 --- a/tests/components/ipp/test_config_flow.py +++ b/tests/components/ipp/test_config_flow.py @@ -38,7 +38,7 @@ async def test_show_zeroconf_form( ) -> None: """Test that the zeroconf confirmation form is served.""" aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", + "http://192.168.1.31:631/ipp/print", content=load_fixture_binary("ipp/get-printer-attributes.bin"), headers={"Content-Type": "application/ipp"}, ) @@ -57,9 +57,7 @@ async def test_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test we show user form on IPP connection error.""" - aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", exc=aiohttp.ClientError - ) + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=aiohttp.ClientError) user_input = MOCK_USER_INPUT.copy() result = await hass.config_entries.flow.async_init( @@ -75,7 +73,7 @@ async def test_zeroconf_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test we abort zeroconf flow on IPP connection error.""" - aioclient_mock.post("http://EPSON123456.local/ipp/print", exc=aiohttp.ClientError) + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=aiohttp.ClientError) discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() result = await hass.config_entries.flow.async_init( @@ -90,17 +88,11 @@ async def test_zeroconf_confirm_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test we abort zeroconf flow on IPP connection error.""" - aioclient_mock.post("http://EPSON123456.local/ipp/print", exc=aiohttp.ClientError) + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=aiohttp.ClientError) discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() result = await hass.config_entries.flow.async_init( - DOMAIN, - context={ - "source": SOURCE_ZEROCONF, - CONF_HOST: "EPSON123456.local", - CONF_NAME: "EPSON123456", - }, - data=discovery_info, + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info ) assert result["type"] == RESULT_TYPE_ABORT @@ -112,7 +104,7 @@ async def test_user_connection_upgrade_required( ) -> None: """Test we show the user form if connection upgrade required by server.""" aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", exc=IPPConnectionUpgradeRequired + "http://192.168.1.31:631/ipp/print", exc=IPPConnectionUpgradeRequired ) user_input = MOCK_USER_INPUT.copy() @@ -130,7 +122,7 @@ async def test_zeroconf_connection_upgrade_required( ) -> None: """Test we abort zeroconf flow on IPP connection error.""" aioclient_mock.post( - "http://EPSON123456.local/ipp/print", exc=IPPConnectionUpgradeRequired + "http://192.168.1.31:631/ipp/print", exc=IPPConnectionUpgradeRequired ) discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() @@ -193,7 +185,7 @@ async def test_full_user_flow_implementation( ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", + "http://192.168.1.31:631/ipp/print", content=load_fixture_binary("ipp/get-printer-attributes.bin"), headers={"Content-Type": "application/ipp"}, ) @@ -207,14 +199,14 @@ async def test_full_user_flow_implementation( result = await hass.config_entries.flow.async_configure( result["flow_id"], - user_input={CONF_HOST: "EPSON123456.local", CONF_BASE_PATH: "/ipp/print"}, + user_input={CONF_HOST: "192.168.1.31", CONF_BASE_PATH: "/ipp/print"}, ) assert result["type"] == RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "EPSON123456.local" + assert result["title"] == "192.168.1.31" assert result["data"] - assert result["data"][CONF_HOST] == "EPSON123456.local" + assert result["data"][CONF_HOST] == "192.168.1.31" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" @@ -223,7 +215,7 @@ async def test_full_zeroconf_flow_implementation( ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", + "http://192.168.1.31:631/ipp/print", content=load_fixture_binary("ipp/get-printer-attributes.bin"), headers={"Content-Type": "application/ipp"}, ) @@ -244,7 +236,7 @@ async def test_full_zeroconf_flow_implementation( assert result["title"] == "EPSON123456" assert result["data"] - assert result["data"][CONF_HOST] == "EPSON123456.local" + assert result["data"][CONF_HOST] == "192.168.1.31" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" assert not result["data"][CONF_SSL] @@ -254,7 +246,7 @@ async def test_full_zeroconf_tls_flow_implementation( ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.post( - "https://EPSON123456.local:631/ipp/print", + "https://192.168.1.31:631/ipp/print", content=load_fixture_binary("ipp/get-printer-attributes.bin"), headers={"Content-Type": "application/ipp"}, ) @@ -276,7 +268,7 @@ async def test_full_zeroconf_tls_flow_implementation( assert result["title"] == "EPSON123456" assert result["data"] - assert result["data"][CONF_HOST] == "EPSON123456.local" + assert result["data"][CONF_HOST] == "192.168.1.31" assert result["data"][CONF_NAME] == "EPSON123456" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" assert result["data"][CONF_SSL] diff --git a/tests/components/ipp/test_init.py b/tests/components/ipp/test_init.py index 7d3d0692e285..2ec11a1e937d 100644 --- a/tests/components/ipp/test_init.py +++ b/tests/components/ipp/test_init.py @@ -17,9 +17,7 @@ async def test_config_entry_not_ready( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test the IPP configuration entry not ready.""" - aioclient_mock.post( - "http://EPSON123456.local:631/ipp/print", exc=aiohttp.ClientError - ) + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=aiohttp.ClientError) entry = await init_integration(hass, aioclient_mock) assert entry.state == ENTRY_STATE_SETUP_RETRY From c6ba607c8c3fed3d2e3b670fef8a6ddbb0b46b82 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Apr 2020 22:41:08 -0700 Subject: [PATCH 076/653] Use IP addresses instead of mDNS names when wled discovered (#33608) --- homeassistant/components/wled/config_flow.py | 2 +- tests/components/wled/__init__.py | 10 ++--- tests/components/wled/test_config_flow.py | 44 ++++++++++---------- tests/components/wled/test_init.py | 2 +- tests/components/wled/test_light.py | 6 +-- tests/components/wled/test_switch.py | 4 +- 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/wled/config_flow.py b/homeassistant/components/wled/config_flow.py index da1193b1a019..ecf8ca6e1e00 100644 --- a/homeassistant/components/wled/config_flow.py +++ b/homeassistant/components/wled/config_flow.py @@ -45,7 +45,7 @@ class WLEDFlowHandler(ConfigFlow, domain=DOMAIN): # pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167 self.context.update( { - CONF_HOST: host, + CONF_HOST: user_input["host"], CONF_NAME: name, CONF_MAC: user_input["properties"].get(CONF_MAC), "title_placeholders": {"name": name}, diff --git a/tests/components/wled/__init__.py b/tests/components/wled/__init__.py index b4b01c66d8ad..f6bd06434507 100644 --- a/tests/components/wled/__init__.py +++ b/tests/components/wled/__init__.py @@ -18,31 +18,31 @@ async def init_integration( fixture = "wled/rgb.json" if not rgbw else "wled/rgbw.json" aioclient_mock.get( - "http://example.local:80/json/", + "http://192.168.1.123:80/json/", text=load_fixture(fixture), headers={"Content-Type": "application/json"}, ) aioclient_mock.post( - "http://example.local:80/json/state", + "http://192.168.1.123:80/json/state", json={}, headers={"Content-Type": "application/json"}, ) aioclient_mock.get( - "http://example.local:80/json/info", + "http://192.168.1.123:80/json/info", json={}, headers={"Content-Type": "application/json"}, ) aioclient_mock.get( - "http://example.local:80/json/state", + "http://192.168.1.123:80/json/state", json={}, headers={"Content-Type": "application/json"}, ) entry = MockConfigEntry( - domain=DOMAIN, data={CONF_HOST: "example.local", CONF_MAC: "aabbccddeeff"} + domain=DOMAIN, data={CONF_HOST: "192.168.1.123", CONF_MAC: "aabbccddeeff"} ) entry.add_to_hass(hass) diff --git a/tests/components/wled/test_config_flow.py b/tests/components/wled/test_config_flow.py index 521a7b67a46c..6de14a024d41 100644 --- a/tests/components/wled/test_config_flow.py +++ b/tests/components/wled/test_config_flow.py @@ -40,7 +40,7 @@ async def test_show_zerconf_form( ) -> None: """Test that the zeroconf confirmation form is served.""" aioclient_mock.get( - "http://example.local:80/json/", + "http://192.168.1.123:80/json/", text=load_fixture("wled/rgb.json"), headers={"Content-Type": "application/json"}, ) @@ -49,10 +49,10 @@ async def test_show_zerconf_form( flow.hass = hass flow.context = {"source": SOURCE_ZEROCONF} result = await flow.async_step_zeroconf( - {"hostname": "example.local.", "properties": {}} + {"host": "192.168.1.123", "hostname": "example.local.", "properties": {}} ) - assert flow.context[CONF_HOST] == "example.local" + assert flow.context[CONF_HOST] == "192.168.1.123" assert flow.context[CONF_NAME] == "example" assert result["description_placeholders"] == {CONF_NAME: "example"} assert result["step_id"] == "zeroconf_confirm" @@ -80,12 +80,12 @@ async def test_zeroconf_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test we abort zeroconf flow on WLED connection error.""" - aioclient_mock.get("http://example.local/json/", exc=aiohttp.ClientError) + aioclient_mock.get("http://192.168.1.123/json/", exc=aiohttp.ClientError) result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": SOURCE_ZEROCONF}, - data={"hostname": "example.local.", "properties": {}}, + data={"host": "192.168.1.123", "hostname": "example.local.", "properties": {}}, ) assert result["reason"] == "connection_error" @@ -96,7 +96,7 @@ async def test_zeroconf_confirm_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test we abort zeroconf flow on WLED connection error.""" - aioclient_mock.get("http://example.com/json/", exc=aiohttp.ClientError) + aioclient_mock.get("http://192.168.1.123:80/json/", exc=aiohttp.ClientError) result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, @@ -105,7 +105,7 @@ async def test_zeroconf_confirm_connection_error( CONF_HOST: "example.com", CONF_NAME: "test", }, - data={"hostname": "example.com.", "properties": {}}, + data={"host": "192.168.1.123", "hostname": "example.com.", "properties": {}}, ) assert result["reason"] == "connection_error" @@ -133,7 +133,7 @@ async def test_user_device_exists_abort( result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": SOURCE_USER}, - data={CONF_HOST: "example.local"}, + data={CONF_HOST: "192.168.1.123"}, ) assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT @@ -149,7 +149,7 @@ async def test_zeroconf_device_exists_abort( result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": SOURCE_ZEROCONF}, - data={"hostname": "example.local.", "properties": {}}, + data={"host": "192.168.1.123", "hostname": "example.local.", "properties": {}}, ) assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT @@ -165,7 +165,11 @@ async def test_zeroconf_with_mac_device_exists_abort( result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": SOURCE_ZEROCONF}, - data={"hostname": "example.local.", "properties": {CONF_MAC: "aabbccddeeff"}}, + data={ + "host": "192.168.1.123", + "hostname": "example.local.", + "properties": {CONF_MAC: "aabbccddeeff"}, + }, ) assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT @@ -177,7 +181,7 @@ async def test_full_user_flow_implementation( ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.get( - "http://example.local:80/json/", + "http://192.168.1.123:80/json/", text=load_fixture("wled/rgb.json"), headers={"Content-Type": "application/json"}, ) @@ -190,12 +194,12 @@ async def test_full_user_flow_implementation( assert result["type"] == data_entry_flow.RESULT_TYPE_FORM result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input={CONF_HOST: "example.local"} + result["flow_id"], user_input={CONF_HOST: "192.168.1.123"} ) - assert result["data"][CONF_HOST] == "example.local" + assert result["data"][CONF_HOST] == "192.168.1.123" assert result["data"][CONF_MAC] == "aabbccddeeff" - assert result["title"] == "example.local" + assert result["title"] == "192.168.1.123" assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY @@ -204,7 +208,7 @@ async def test_full_zeroconf_flow_implementation( ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.get( - "http://example.local:80/json/", + "http://192.168.1.123:80/json/", text=load_fixture("wled/rgb.json"), headers={"Content-Type": "application/json"}, ) @@ -213,19 +217,17 @@ async def test_full_zeroconf_flow_implementation( flow.hass = hass flow.context = {"source": SOURCE_ZEROCONF} result = await flow.async_step_zeroconf( - {"hostname": "example.local.", "properties": {}} + {"host": "192.168.1.123", "hostname": "example.local.", "properties": {}} ) - assert flow.context[CONF_HOST] == "example.local" + assert flow.context[CONF_HOST] == "192.168.1.123" assert flow.context[CONF_NAME] == "example" assert result["description_placeholders"] == {CONF_NAME: "example"} assert result["step_id"] == "zeroconf_confirm" assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - result = await flow.async_step_zeroconf_confirm( - user_input={CONF_HOST: "example.local"} - ) - assert result["data"][CONF_HOST] == "example.local" + result = await flow.async_step_zeroconf_confirm(user_input={}) + assert result["data"][CONF_HOST] == "192.168.1.123" assert result["data"][CONF_MAC] == "aabbccddeeff" assert result["title"] == "example" assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY diff --git a/tests/components/wled/test_init.py b/tests/components/wled/test_init.py index d287ba6014a5..053c5ebaca01 100644 --- a/tests/components/wled/test_init.py +++ b/tests/components/wled/test_init.py @@ -13,7 +13,7 @@ async def test_config_entry_not_ready( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test the WLED configuration entry not ready.""" - aioclient_mock.get("http://example.local:80/json/", exc=aiohttp.ClientError) + aioclient_mock.get("http://192.168.1.123:80/json/", exc=aiohttp.ClientError) entry = await init_integration(hass, aioclient_mock) assert entry.state == ENTRY_STATE_SETUP_RETRY diff --git a/tests/components/wled/test_light.py b/tests/components/wled/test_light.py index c49ae6a12dfa..0009677cf188 100644 --- a/tests/components/wled/test_light.py +++ b/tests/components/wled/test_light.py @@ -141,7 +141,7 @@ async def test_light_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker, caplog ) -> None: """Test error handling of the WLED lights.""" - aioclient_mock.post("http://example.local:80/json/state", text="", status=400) + aioclient_mock.post("http://192.168.1.123:80/json/state", text="", status=400) await init_integration(hass, aioclient_mock) with patch("homeassistant.components.wled.WLEDDataUpdateCoordinator.async_refresh"): @@ -162,7 +162,7 @@ async def test_light_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test error handling of the WLED switches.""" - aioclient_mock.post("http://example.local:80/json/state", exc=aiohttp.ClientError) + aioclient_mock.post("http://192.168.1.123:80/json/state", exc=aiohttp.ClientError) await init_integration(hass, aioclient_mock) with patch("homeassistant.components.wled.WLEDDataUpdateCoordinator.async_refresh"): @@ -339,7 +339,7 @@ async def test_effect_service_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker, caplog ) -> None: """Test error handling of the WLED effect service.""" - aioclient_mock.post("http://example.local:80/json/state", text="", status=400) + aioclient_mock.post("http://192.168.1.123:80/json/state", text="", status=400) await init_integration(hass, aioclient_mock) with patch("homeassistant.components.wled.WLEDDataUpdateCoordinator.async_refresh"): diff --git a/tests/components/wled/test_switch.py b/tests/components/wled/test_switch.py index 5b315c87e9ea..d140953b9480 100644 --- a/tests/components/wled/test_switch.py +++ b/tests/components/wled/test_switch.py @@ -139,7 +139,7 @@ async def test_switch_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker, caplog ) -> None: """Test error handling of the WLED switches.""" - aioclient_mock.post("http://example.local:80/json/state", text="", status=400) + aioclient_mock.post("http://192.168.1.123:80/json/state", text="", status=400) await init_integration(hass, aioclient_mock) with patch("homeassistant.components.wled.WLEDDataUpdateCoordinator.async_refresh"): @@ -160,7 +160,7 @@ async def test_switch_connection_error( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test error handling of the WLED switches.""" - aioclient_mock.post("http://example.local:80/json/state", exc=aiohttp.ClientError) + aioclient_mock.post("http://192.168.1.123:80/json/state", exc=aiohttp.ClientError) await init_integration(hass, aioclient_mock) with patch("homeassistant.components.wled.WLEDDataUpdateCoordinator.async_refresh"): From c628c2cef28a99d711b768837f144e160311f2b0 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Sat, 4 Apr 2020 07:41:39 +0200 Subject: [PATCH 077/653] Identify more Sonos radio stations with poor titles (#33609) --- homeassistant/components/sonos/media_player.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index d54e6dd968f9..d76af1dc704b 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -614,11 +614,11 @@ class SonosEntity(MediaPlayerDevice): except (TypeError, KeyError, AttributeError): pass - # Radios without tagging can have the radio URI as title. Non-playing - # radios will not have a current title. In these cases we try to use - # the radio name instead. + # Radios without tagging can have part of the radio URI as title. + # Non-playing radios will not have a current title. In these cases we + # try to use the radio name instead. try: - if self.soco.is_radio_uri(self._media_title) or self.state != STATE_PLAYING: + if self._media_title in self._uri or self.state != STATE_PLAYING: self._media_title = variables["enqueued_transport_uri_meta_data"].title except (TypeError, KeyError, AttributeError): pass From b60527c9866d21d4b5fb57b9e7c3b2a66c4e3439 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sat, 4 Apr 2020 07:44:28 +0200 Subject: [PATCH 078/653] =?UTF-8?q?Change=20the=20method=20of=20getting=20?= =?UTF-8?q?the=20mac=20address=20in=20the=20braviatv=20i=E2=80=A6=20(#3356?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove getmac library * Fix error handling * Change error handling method --- .../components/braviatv/manifest.json | 2 +- .../components/braviatv/media_player.py | 36 ++++++++++--------- requirements_all.txt | 1 - requirements_test_all.txt | 1 - 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/braviatv/manifest.json b/homeassistant/components/braviatv/manifest.json index 4945614ed7f0..8d432740a4d8 100644 --- a/homeassistant/components/braviatv/manifest.json +++ b/homeassistant/components/braviatv/manifest.json @@ -2,7 +2,7 @@ "domain": "braviatv", "name": "Sony Bravia TV", "documentation": "https://www.home-assistant.io/integrations/braviatv", - "requirements": ["bravia-tv==1.0.1", "getmac==0.8.1"], + "requirements": ["bravia-tv==1.0.1"], "dependencies": ["configurator"], "codeowners": ["@robbiet480"] } diff --git a/homeassistant/components/braviatv/media_player.py b/homeassistant/components/braviatv/media_player.py index f9362799224f..d428e2deea86 100644 --- a/homeassistant/components/braviatv/media_player.py +++ b/homeassistant/components/braviatv/media_player.py @@ -1,9 +1,7 @@ """Support for interface with a Sony Bravia TV.""" -import ipaddress import logging from bravia_tv import BraviaRC -from getmac import get_mac_address import voluptuous as vol from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerDevice @@ -21,7 +19,9 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_STEP, ) from homeassistant.const import CONF_HOST, CONF_NAME, STATE_OFF, STATE_ON +from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.device_registry import format_mac from homeassistant.util.json import load_json, save_json BRAVIA_CONFIG_FILE = "bravia.conf" @@ -76,8 +76,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): mac = host_config["mac"] name = config.get(CONF_NAME) braviarc = BraviaRC(host, mac) - braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME) - unique_id = braviarc.get_system_info()["cid"].lower() + if not braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME): + raise PlatformNotReady + try: + unique_id = braviarc.get_system_info()["cid"].lower() + except TypeError: + raise PlatformNotReady add_entities([BraviaTVDevice(braviarc, name, pin, unique_id)]) return @@ -94,15 +98,6 @@ def setup_bravia(config, pin, hass, add_entities): request_configuration(config, hass, add_entities) return - try: - if ipaddress.ip_address(host).version == 6: - mode = "ip6" - else: - mode = "ip" - except ValueError: - mode = "hostname" - mac = get_mac_address(**{mode: host}) - # If we came here and configuring this host, mark as done if host in _CONFIGURING: request_id = _CONFIGURING.pop(host) @@ -110,14 +105,23 @@ def setup_bravia(config, pin, hass, add_entities): configurator.request_done(request_id) _LOGGER.info("Discovery configuration done") + braviarc = BraviaRC(host) + if not braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME): + _LOGGER.error("Cannot connect to %s", host) + return + try: + system_info = braviarc.get_system_info() + except TypeError: + _LOGGER.error("Cannot retrieve system info from %s", host) + return + mac = format_mac(system_info["macAddr"]) + unique_id = system_info["cid"].lower() + # Save config save_json( hass.config.path(BRAVIA_CONFIG_FILE), {host: {"pin": pin, "host": host, "mac": mac}}, ) - braviarc = BraviaRC(host, mac) - braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME) - unique_id = braviarc.get_system_info()["cid"].lower() add_entities([BraviaTVDevice(braviarc, name, pin, unique_id)]) diff --git a/requirements_all.txt b/requirements_all.txt index cbac7186ed44..284f78aa2d1b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -603,7 +603,6 @@ georss_ign_sismologia_client==0.2 # homeassistant.components.qld_bushfire georss_qld_bushfire_alert_client==0.3 -# homeassistant.components.braviatv # homeassistant.components.huawei_lte # homeassistant.components.kef # homeassistant.components.minecraft_server diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7a35896b4965..6c156f0dbae7 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -235,7 +235,6 @@ georss_ign_sismologia_client==0.2 # homeassistant.components.qld_bushfire georss_qld_bushfire_alert_client==0.3 -# homeassistant.components.braviatv # homeassistant.components.huawei_lte # homeassistant.components.kef # homeassistant.components.minecraft_server From 0d05bd309a82036e84b1a56df6432e1647c23fde Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sat, 4 Apr 2020 08:44:57 +0300 Subject: [PATCH 079/653] Fix uncaught exceptions in upnp (#33604) removed also the yr tests that are already successful --- tests/components/upnp/test_init.py | 1 + tests/ignore_uncaught_exceptions.py | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/components/upnp/test_init.py b/tests/components/upnp/test_init.py index 86ed017ae8d1..4aa033ee07bc 100644 --- a/tests/components/upnp/test_init.py +++ b/tests/components/upnp/test_init.py @@ -19,6 +19,7 @@ class MockDevice(Device): device = MagicMock() device.manufacturer = "mock-manuf" device.name = "mock-name" + device.model_name = "mock-model-name" super().__init__(device) self._udn = udn self.added_port_mappings = [] diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 6f7910f91204..f0a47b3e64f4 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -57,11 +57,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ "test_configuring_devices_from_multiple_sources", ), ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), - ("tests.components.upnp.test_init", "test_async_setup_entry_default"), - ("tests.components.upnp.test_init", "test_async_setup_entry_port_mapping"), - ("tests.components.yr.test_sensor", "test_default_setup"), - ("tests.components.yr.test_sensor", "test_custom_setup"), - ("tests.components.yr.test_sensor", "test_forecast_setup"), ("tests.components.zwave.test_init", "test_power_schemes"), ] From 4a9f4f585d15a4c39ced53f49f78e180ef55d663 Mon Sep 17 00:00:00 2001 From: Vilppu Vuorinen Date: Sat, 4 Apr 2020 14:56:48 +0300 Subject: [PATCH 080/653] Update pymelcloud to fix broken area device search (#33620) Devices assigned to areas in MELCloud were not available through the integration due to client lib bug. --- homeassistant/components/melcloud/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/melcloud/manifest.json b/homeassistant/components/melcloud/manifest.json index 04b8b2f5a1e6..4747059345f8 100644 --- a/homeassistant/components/melcloud/manifest.json +++ b/homeassistant/components/melcloud/manifest.json @@ -3,6 +3,6 @@ "name": "MELCloud", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/melcloud", - "requirements": ["pymelcloud==2.4.0"], + "requirements": ["pymelcloud==2.4.1"], "codeowners": ["@vilppuvuorinen"] } diff --git a/requirements_all.txt b/requirements_all.txt index 284f78aa2d1b..4eb1520cbb5c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1389,7 +1389,7 @@ pymailgunner==1.4 pymediaroom==0.6.4 # homeassistant.components.melcloud -pymelcloud==2.4.0 +pymelcloud==2.4.1 # homeassistant.components.somfy pymfy==0.7.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 6c156f0dbae7..e5bff579f9f0 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -539,7 +539,7 @@ pylitejet==0.1 pymailgunner==1.4 # homeassistant.components.melcloud -pymelcloud==2.4.0 +pymelcloud==2.4.1 # homeassistant.components.somfy pymfy==0.7.1 From 05192b7164cb1d5413cef55823329d5b392897d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Sat, 4 Apr 2020 14:07:36 +0200 Subject: [PATCH 081/653] Support melcloud swing mode (#33008) * melcloud, support for swing mode * Update homeassistant/components/melcloud/climate.py Co-Authored-By: Vilppu Vuorinen * Update homeassistant/components/melcloud/climate.py Co-Authored-By: Vilppu Vuorinen * Update homeassistant/components/melcloud/climate.py Co-Authored-By: Vilppu Vuorinen * Update homeassistant/components/melcloud/climate.py Co-Authored-By: Vilppu Vuorinen Co-authored-by: Vilppu Vuorinen --- homeassistant/components/melcloud/climate.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/melcloud/climate.py b/homeassistant/components/melcloud/climate.py index b79520772238..e2d1fdd984d8 100644 --- a/homeassistant/components/melcloud/climate.py +++ b/homeassistant/components/melcloud/climate.py @@ -24,6 +24,7 @@ from homeassistant.components.climate.const import ( HVAC_MODE_HEAT_COOL, HVAC_MODE_OFF, SUPPORT_FAN_MODE, + SUPPORT_SWING_MODE, SUPPORT_TARGET_TEMPERATURE, ) from homeassistant.config_entries import ConfigEntry @@ -246,10 +247,24 @@ class AtaDeviceClimate(MelCloudClimate): ) await self._device.set({ata.PROPERTY_VANE_VERTICAL: position}) + @property + def swing_mode(self) -> Optional[str]: + """Return vertical vane position or mode.""" + return self._device.vane_vertical + + async def async_set_swing_mode(self, swing_mode) -> None: + """Set vertical vane position or mode.""" + await self.async_set_vane_vertical(swing_mode) + + @property + def swing_modes(self) -> Optional[str]: + """Return a list of available vertical vane positions and modes.""" + return self._device.vane_vertical_positions + @property def supported_features(self) -> int: """Return the list of supported features.""" - return SUPPORT_FAN_MODE | SUPPORT_TARGET_TEMPERATURE + return SUPPORT_FAN_MODE | SUPPORT_TARGET_TEMPERATURE | SUPPORT_SWING_MODE async def async_turn_on(self) -> None: """Turn the entity on.""" From debc1f78d49e463f85aeee1c0b400d103c1d9e44 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Sat, 4 Apr 2020 08:40:55 -0400 Subject: [PATCH 082/653] Add zigbee information to ZHA device information (#33612) * add zigbee signature to zha device info * add typing * use props and sort clusters * review comment --- .../components/zha/core/channels/__init__.py | 31 ++++++++++++++++++- homeassistant/components/zha/core/const.py | 5 +++ homeassistant/components/zha/core/device.py | 13 ++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/zha/core/channels/__init__.py b/homeassistant/components/zha/core/channels/__init__.py index 91a23e17f12f..18eb2a6c1cc6 100644 --- a/homeassistant/components/zha/core/channels/__init__.py +++ b/homeassistant/components/zha/core/channels/__init__.py @@ -1,7 +1,7 @@ """Channels module for Zigbee Home Automation.""" import asyncio import logging -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Union from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -92,6 +92,14 @@ class Channels: """Return the unique id for this channel.""" return self._unique_id + @property + def zigbee_signature(self) -> Dict[int, Dict[str, Any]]: + """Get the zigbee signatures for the pools in channels.""" + return { + signature[0]: signature[1] + for signature in [pool.zigbee_signature for pool in self.pools] + } + @classmethod def new(cls, zha_device: zha_typing.ZhaDeviceType) -> "Channels": """Create new instance.""" @@ -231,6 +239,27 @@ class ChannelPool: """Return the unique id for this channel.""" return self._unique_id + @property + def zigbee_signature(self) -> Tuple[int, Dict[str, Any]]: + """Get the zigbee signature for the endpoint this pool represents.""" + return ( + self.endpoint.endpoint_id, + { + const.ATTR_PROFILE_ID: self.endpoint.profile_id, + const.ATTR_DEVICE_TYPE: f"0x{self.endpoint.device_type:04x}" + if self.endpoint.device_type is not None + else "", + const.ATTR_IN_CLUSTERS: [ + f"0x{cluster_id:04x}" + for cluster_id in sorted(self.endpoint.in_clusters) + ], + const.ATTR_OUT_CLUSTERS: [ + f"0x{cluster_id:04x}" + for cluster_id in sorted(self.endpoint.out_clusters) + ], + }, + ) + @classmethod def new(cls, channels: Channels, ep_id: int) -> "ChannelPool": """Create new channels for an endpoint.""" diff --git a/homeassistant/components/zha/core/const.py b/homeassistant/components/zha/core/const.py index da151f67dbbb..055b5627bb11 100644 --- a/homeassistant/components/zha/core/const.py +++ b/homeassistant/components/zha/core/const.py @@ -22,8 +22,10 @@ ATTR_COMMAND = "command" ATTR_COMMAND_TYPE = "command_type" ATTR_DEVICE_IEEE = "device_ieee" ATTR_DEVICE_TYPE = "device_type" +ATTR_ENDPOINTS = "endpoints" ATTR_ENDPOINT_ID = "endpoint_id" ATTR_IEEE = "ieee" +ATTR_IN_CLUSTERS = "in_clusters" ATTR_LAST_SEEN = "last_seen" ATTR_LEVEL = "level" ATTR_LQI = "lqi" @@ -32,8 +34,11 @@ ATTR_MANUFACTURER_CODE = "manufacturer_code" ATTR_MEMBERS = "members" ATTR_MODEL = "model" ATTR_NAME = "name" +ATTR_NODE_DESCRIPTOR = "node_descriptor" ATTR_NWK = "nwk" +ATTR_OUT_CLUSTERS = "out_clusters" ATTR_POWER_SOURCE = "power_source" +ATTR_PROFILE_ID = "profile_id" ATTR_QUIRK_APPLIED = "quirk_applied" ATTR_QUIRK_CLASS = "quirk_class" ATTR_RSSI = "rssi" diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index ad3d1ff18adb..716ed5040ae7 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -5,6 +5,7 @@ from enum import Enum import logging import random import time +from typing import Any, Dict from zigpy import types import zigpy.exceptions @@ -31,6 +32,7 @@ from .const import ( ATTR_COMMAND_TYPE, ATTR_DEVICE_TYPE, ATTR_ENDPOINT_ID, + ATTR_ENDPOINTS, ATTR_IEEE, ATTR_LAST_SEEN, ATTR_LQI, @@ -38,11 +40,13 @@ from .const import ( ATTR_MANUFACTURER_CODE, ATTR_MODEL, ATTR_NAME, + ATTR_NODE_DESCRIPTOR, ATTR_NWK, ATTR_POWER_SOURCE, ATTR_QUIRK_APPLIED, ATTR_QUIRK_CLASS, ATTR_RSSI, + ATTR_SIGNATURE, ATTR_VALUE, CLUSTER_COMMAND_SERVER, CLUSTER_COMMANDS_CLIENT, @@ -267,6 +271,14 @@ class ZHADevice(LogMixin): """Return True if sensor is available.""" return self._available + @property + def zigbee_signature(self) -> Dict[str, Any]: + """Get zigbee signature for this device.""" + return { + ATTR_NODE_DESCRIPTOR: str(self._zigpy_device.node_desc), + ATTR_ENDPOINTS: self._channels.zigbee_signature, + } + def set_available(self, available): """Set availability from restore and prevent signals.""" self._available = available @@ -366,6 +378,7 @@ class ZHADevice(LogMixin): ATTR_LAST_SEEN: update_time, ATTR_AVAILABLE: self.available, ATTR_DEVICE_TYPE: self.device_type, + ATTR_SIGNATURE: self.zigbee_signature, } async def async_configure(self): From 46fa20411e2ef975ade5b415e02b593926dc5bd4 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 14:51:12 +0200 Subject: [PATCH 083/653] Bump twentemilieu to 0.3.0 (#33622) * Bump twentemilieu to 0.3.0 * Fix tests --- homeassistant/components/twentemilieu/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/twentemilieu/test_config_flow.py | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/twentemilieu/manifest.json b/homeassistant/components/twentemilieu/manifest.json index 940c751c3c64..da4dc0742622 100644 --- a/homeassistant/components/twentemilieu/manifest.json +++ b/homeassistant/components/twentemilieu/manifest.json @@ -3,6 +3,6 @@ "name": "Twente Milieu", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/twentemilieu", - "requirements": ["twentemilieu==0.2.0"], + "requirements": ["twentemilieu==0.3.0"], "codeowners": ["@frenck"] } diff --git a/requirements_all.txt b/requirements_all.txt index 4eb1520cbb5c..5ef68692f07c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2046,7 +2046,7 @@ transmissionrpc==0.11 tuyaha==0.0.5 # homeassistant.components.twentemilieu -twentemilieu==0.2.0 +twentemilieu==0.3.0 # homeassistant.components.twilio twilio==6.32.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e5bff579f9f0..e9d2b17756fd 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -746,7 +746,7 @@ toonapilib==3.2.4 transmissionrpc==0.11 # homeassistant.components.twentemilieu -twentemilieu==0.2.0 +twentemilieu==0.3.0 # homeassistant.components.twilio twilio==6.32.0 diff --git a/tests/components/twentemilieu/test_config_flow.py b/tests/components/twentemilieu/test_config_flow.py index 1ccbe7a58a94..7dd19e755f31 100644 --- a/tests/components/twentemilieu/test_config_flow.py +++ b/tests/components/twentemilieu/test_config_flow.py @@ -34,7 +34,7 @@ async def test_show_set_form(hass): async def test_connection_error(hass, aioclient_mock): """Test we show user form on Twente Milieu connection error.""" aioclient_mock.post( - "https://wasteapi.2go-mobile.com/api/FetchAdress", exc=aiohttp.ClientError + "https://twentemilieuapi.ximmio.com/api/FetchAdress", exc=aiohttp.ClientError ) flow = config_flow.TwenteMilieuFlowHandler() @@ -49,7 +49,7 @@ async def test_connection_error(hass, aioclient_mock): async def test_invalid_address(hass, aioclient_mock): """Test we show user form on Twente Milieu invalid address error.""" aioclient_mock.post( - "https://wasteapi.2go-mobile.com/api/FetchAdress", + "https://twentemilieuapi.ximmio.com/api/FetchAdress", json={"dataList": []}, headers={"Content-Type": "application/json"}, ) @@ -70,7 +70,7 @@ async def test_address_already_set_up(hass, aioclient_mock): ) aioclient_mock.post( - "https://wasteapi.2go-mobile.com/api/FetchAdress", + "https://twentemilieuapi.ximmio.com/api/FetchAdress", json={"dataList": [{"UniqueId": "12345"}]}, headers={"Content-Type": "application/json"}, ) @@ -86,7 +86,7 @@ async def test_address_already_set_up(hass, aioclient_mock): async def test_full_flow_implementation(hass, aioclient_mock): """Test registering an integration and finishing flow works.""" aioclient_mock.post( - "https://wasteapi.2go-mobile.com/api/FetchAdress", + "https://twentemilieuapi.ximmio.com/api/FetchAdress", json={"dataList": [{"UniqueId": "12345"}]}, headers={"Content-Type": "application/json"}, ) From 211ed3d5966018f98409a27cbc61e8d921c2001f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 15:35:27 +0200 Subject: [PATCH 084/653] Move imports to top in wirelesstag (#33624) --- homeassistant/components/wirelesstag/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/homeassistant/components/wirelesstag/__init__.py b/homeassistant/components/wirelesstag/__init__.py index 396ca093eecd..5637cabbfd21 100644 --- a/homeassistant/components/wirelesstag/__init__.py +++ b/homeassistant/components/wirelesstag/__init__.py @@ -3,7 +3,7 @@ import logging from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol -from wirelesstagpy import NotificationConfig as NC +from wirelesstagpy import NotificationConfig as NC, WirelessTags, WirelessTagsException from homeassistant import util from homeassistant.const import ( @@ -190,8 +190,6 @@ def setup(hass, config): password = conf.get(CONF_PASSWORD) try: - from wirelesstagpy import WirelessTags, WirelessTagsException - wirelesstags = WirelessTags(username=username, password=password) platform = WirelessTagPlatform(hass, wirelesstags) From b112be35563e3531e3a084c1a3abc5aa11744a83 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 15:41:33 +0200 Subject: [PATCH 085/653] Move imports to top for danfoss_air (#33625) --- homeassistant/components/danfoss_air/binary_sensor.py | 4 ++-- homeassistant/components/danfoss_air/sensor.py | 4 ++-- homeassistant/components/danfoss_air/switch.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/danfoss_air/binary_sensor.py b/homeassistant/components/danfoss_air/binary_sensor.py index d5aab8b35bb1..caac12c1b204 100644 --- a/homeassistant/components/danfoss_air/binary_sensor.py +++ b/homeassistant/components/danfoss_air/binary_sensor.py @@ -1,4 +1,6 @@ """Support for the for Danfoss Air HRV binary sensors.""" +from pydanfossair.commands import ReadCommand + from homeassistant.components.binary_sensor import BinarySensorDevice from . import DOMAIN as DANFOSS_AIR_DOMAIN @@ -6,8 +8,6 @@ from . import DOMAIN as DANFOSS_AIR_DOMAIN def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available Danfoss Air sensors etc.""" - from pydanfossair.commands import ReadCommand - data = hass.data[DANFOSS_AIR_DOMAIN] sensors = [ diff --git a/homeassistant/components/danfoss_air/sensor.py b/homeassistant/components/danfoss_air/sensor.py index 73305d5c6251..f03c74ae78b8 100644 --- a/homeassistant/components/danfoss_air/sensor.py +++ b/homeassistant/components/danfoss_air/sensor.py @@ -1,6 +1,8 @@ """Support for the for Danfoss Air HRV sensors.""" import logging +from pydanfossair.commands import ReadCommand + from homeassistant.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_HUMIDITY, @@ -17,8 +19,6 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available Danfoss Air sensors etc.""" - from pydanfossair.commands import ReadCommand - data = hass.data[DANFOSS_AIR_DOMAIN] sensors = [ diff --git a/homeassistant/components/danfoss_air/switch.py b/homeassistant/components/danfoss_air/switch.py index 8a1e0f9c746e..96e363951c82 100644 --- a/homeassistant/components/danfoss_air/switch.py +++ b/homeassistant/components/danfoss_air/switch.py @@ -1,6 +1,8 @@ """Support for the for Danfoss Air HRV sswitches.""" import logging +from pydanfossair.commands import ReadCommand, UpdateCommand + from homeassistant.components.switch import SwitchDevice from . import DOMAIN as DANFOSS_AIR_DOMAIN @@ -10,8 +12,6 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Danfoss Air HRV switch platform.""" - from pydanfossair.commands import ReadCommand, UpdateCommand - data = hass.data[DANFOSS_AIR_DOMAIN] switches = [ From f71125092fb49e6beaa899b4ade581509361c491 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 15:49:20 +0200 Subject: [PATCH 086/653] Move imports to top for doorbird (#33627) --- homeassistant/components/doorbird/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/homeassistant/components/doorbird/__init__.py b/homeassistant/components/doorbird/__init__.py index f762a722f2fd..bbbaa3d340c8 100644 --- a/homeassistant/components/doorbird/__init__.py +++ b/homeassistant/components/doorbird/__init__.py @@ -4,6 +4,7 @@ import logging import urllib from urllib.error import HTTPError +from aiohttp import web from doorbirdpy import DoorBird import voluptuous as vol @@ -58,7 +59,6 @@ CONFIG_SCHEMA = vol.Schema( async def async_setup(hass: HomeAssistant, config: dict): """Set up the DoorBird component.""" - hass.data.setdefault(DOMAIN, {}) # Provide an endpoint for the doorstations to call to trigger events @@ -341,8 +341,6 @@ class DoorBirdRequestView(HomeAssistantView): async def get(self, request, event): """Respond to requests from the device.""" - from aiohttp import web - hass = request.app["hass"] token = request.query.get("token") From 29df8e546fc8efbaa25b0815ece9689f7961c3b0 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 15:49:29 +0200 Subject: [PATCH 087/653] Move imports to top for spc (#33628) --- homeassistant/components/spc/binary_sensor.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/homeassistant/components/spc/binary_sensor.py b/homeassistant/components/spc/binary_sensor.py index 3149ae560638..626e30849df4 100644 --- a/homeassistant/components/spc/binary_sensor.py +++ b/homeassistant/components/spc/binary_sensor.py @@ -1,7 +1,7 @@ """Support for Vanderbilt (formerly Siemens) SPC alarm systems.""" import logging -from pyspcwebgw.const import ZoneInput +from pyspcwebgw.const import ZoneInput, ZoneType from homeassistant.components.binary_sensor import BinarySensorDevice from homeassistant.core import callback @@ -13,8 +13,6 @@ _LOGGER = logging.getLogger(__name__) def _get_device_class(zone_type): - from pyspcwebgw.const import ZoneType - return { ZoneType.ALARM: "motion", ZoneType.ENTRY_EXIT: "opening", From 9dfcae3dc243c9a226916b38fd4d3f897c2edb4e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 16:09:49 +0200 Subject: [PATCH 088/653] Move imports to top for mystrom (#33629) --- homeassistant/components/mystrom/switch.py | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/mystrom/switch.py b/homeassistant/components/mystrom/switch.py index ca766810a3d6..5bfd1e45b81a 100644 --- a/homeassistant/components/mystrom/switch.py +++ b/homeassistant/components/mystrom/switch.py @@ -1,6 +1,8 @@ """Support for myStrom switches.""" import logging +from pymystrom.exceptions import MyStromConnectionError +from pymystrom.switch import MyStromPlug import voluptuous as vol from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice @@ -22,14 +24,12 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Find and return myStrom switch.""" - from pymystrom.switch import MyStromPlug, exceptions - name = config.get(CONF_NAME) host = config.get(CONF_HOST) try: MyStromPlug(host).get_status() - except exceptions.MyStromConnectionError: + except MyStromConnectionError: _LOGGER.error("No route to device: %s", host) raise PlatformNotReady() @@ -41,8 +41,6 @@ class MyStromSwitch(SwitchDevice): def __init__(self, name, resource): """Initialize the myStrom switch.""" - from pymystrom.switch import MyStromPlug - self._name = name self._resource = resource self.data = {} @@ -71,30 +69,24 @@ class MyStromSwitch(SwitchDevice): def turn_on(self, **kwargs): """Turn the switch on.""" - from pymystrom import exceptions - try: self.plug.set_relay_on() - except exceptions.MyStromConnectionError: + except MyStromConnectionError: _LOGGER.error("No route to device: %s", self._resource) def turn_off(self, **kwargs): """Turn the switch off.""" - from pymystrom import exceptions - try: self.plug.set_relay_off() - except exceptions.MyStromConnectionError: + except MyStromConnectionError: _LOGGER.error("No route to device: %s", self._resource) def update(self): """Get the latest data from the device and update the data.""" - from pymystrom import exceptions - try: self.data = self.plug.get_status() self._available = True - except exceptions.MyStromConnectionError: + except MyStromConnectionError: self.data = {"power": 0, "relay": False} self._available = False _LOGGER.error("No route to device: %s", self._resource) From b9b1cee4033af72ec9760fed0db9bfcbda8e0c34 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 17:07:36 +0200 Subject: [PATCH 089/653] Enable pylint import-outside-toplevel (#33631) --- homeassistant/__main__.py | 8 +++++++- homeassistant/auth/mfa_modules/notify.py | 8 ++++---- homeassistant/auth/mfa_modules/totp.py | 10 +++++----- homeassistant/bootstrap.py | 1 + homeassistant/components/mqtt/__init__.py | 1 + homeassistant/components/mqtt/config_flow.py | 1 + homeassistant/components/mqtt/discovery.py | 1 + .../components/tensorflow/image_processing.py | 8 +++++--- homeassistant/components/zwave/__init__.py | 1 + homeassistant/components/zwave/config_flow.py | 1 + homeassistant/components/zwave/node_entity.py | 1 + homeassistant/config.py | 2 ++ homeassistant/core.py | 1 + homeassistant/helpers/data_entry_flow.py | 2 +- homeassistant/helpers/event.py | 2 +- homeassistant/helpers/sun.py | 7 ++++--- homeassistant/helpers/template.py | 1 + homeassistant/loader.py | 5 +++-- homeassistant/scripts/benchmark/__init__.py | 1 + homeassistant/scripts/check_config.py | 1 + homeassistant/scripts/credstash.py | 2 +- homeassistant/scripts/keyring.py | 4 +++- pylintrc | 1 - 23 files changed, 47 insertions(+), 23 deletions(-) diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index a6d4e0c7bc94..5e7fab5bd54a 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -13,6 +13,7 @@ from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __versio def set_loop() -> None: """Attempt to use different loop.""" + # pylint: disable=import-outside-toplevel from asyncio.events import BaseDefaultEventLoopPolicy if sys.platform == "win32": @@ -44,6 +45,7 @@ def validate_python() -> None: def ensure_config_path(config_dir: str) -> None: """Validate the configuration directory.""" + # pylint: disable=import-outside-toplevel import homeassistant.config as config_util lib_dir = os.path.join(config_dir, "deps") @@ -77,6 +79,7 @@ def ensure_config_path(config_dir: str) -> None: def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" + # pylint: disable=import-outside-toplevel import homeassistant.config as config_util parser = argparse.ArgumentParser( @@ -214,6 +217,7 @@ def closefds_osx(min_fd: int, max_fd: int) -> None: are guarded. But we can set the close-on-exec flag on everything we want to get rid of. """ + # pylint: disable=import-outside-toplevel from fcntl import fcntl, F_GETFD, F_SETFD, FD_CLOEXEC for _fd in range(min_fd, max_fd): @@ -237,6 +241,7 @@ def cmdline() -> List[str]: async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int: """Set up Home Assistant and run.""" + # pylint: disable=import-outside-toplevel from homeassistant import bootstrap hass = await bootstrap.async_setup_hass( @@ -253,7 +258,7 @@ async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int: return 1 if args.open_ui and hass.config.api is not None: - import webbrowser + import webbrowser # pylint: disable=import-outside-toplevel hass.add_job(webbrowser.open, hass.config.api.base_url) @@ -324,6 +329,7 @@ def main() -> int: args = get_arguments() if args.script is not None: + # pylint: disable=import-outside-toplevel from homeassistant import scripts return scripts.run(args.script) diff --git a/homeassistant/auth/mfa_modules/notify.py b/homeassistant/auth/mfa_modules/notify.py index 8da81a44a61e..80d0fa3f9736 100644 --- a/homeassistant/auth/mfa_modules/notify.py +++ b/homeassistant/auth/mfa_modules/notify.py @@ -47,28 +47,28 @@ _LOGGER = logging.getLogger(__name__) def _generate_secret() -> str: """Generate a secret.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel return str(pyotp.random_base32()) def _generate_random() -> int: """Generate a 8 digit number.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel return int(pyotp.random_base32(length=8, chars=list("1234567890"))) def _generate_otp(secret: str, count: int) -> str: """Generate one time password.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel return str(pyotp.HOTP(secret).at(count)) def _verify_otp(secret: str, otp: str, count: int) -> bool: """Verify one time password.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel return bool(pyotp.HOTP(secret).verify(otp, count)) diff --git a/homeassistant/auth/mfa_modules/totp.py b/homeassistant/auth/mfa_modules/totp.py index 6abddd2123f0..142bf32babab 100644 --- a/homeassistant/auth/mfa_modules/totp.py +++ b/homeassistant/auth/mfa_modules/totp.py @@ -35,7 +35,7 @@ _LOGGER = logging.getLogger(__name__) def _generate_qr_code(data: str) -> str: """Generate a base64 PNG string represent QR Code image of data.""" - import pyqrcode + import pyqrcode # pylint: disable=import-outside-toplevel qr_code = pyqrcode.create(data) @@ -55,7 +55,7 @@ def _generate_qr_code(data: str) -> str: def _generate_secret_and_qr_code(username: str) -> Tuple[str, str, str]: """Generate a secret, url, and QR code.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel ota_secret = pyotp.random_base32() url = pyotp.totp.TOTP(ota_secret).provisioning_uri( @@ -105,7 +105,7 @@ class TotpAuthModule(MultiFactorAuthModule): def _add_ota_secret(self, user_id: str, secret: Optional[str] = None) -> str: """Create a ota_secret for user.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel ota_secret: str = secret or pyotp.random_base32() @@ -160,7 +160,7 @@ class TotpAuthModule(MultiFactorAuthModule): def _validate_2fa(self, user_id: str, code: str) -> bool: """Validate two factor authentication code.""" - import pyotp + import pyotp # pylint: disable=import-outside-toplevel ota_secret = self._users.get(user_id) # type: ignore if ota_secret is None: @@ -195,7 +195,7 @@ class TotpSetupFlow(SetupFlow): Return self.async_show_form(step_id='init') if user_input is None. Return self.async_create_entry(data={'result': result}) if finish. """ - import pyotp + import pyotp # pylint: disable=import-outside-toplevel errors: Dict[str, str] = {} diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index 5d939d4b34e9..ef345de22cfb 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -215,6 +215,7 @@ def async_enable_logging( if not log_no_color: try: + # pylint: disable=import-outside-toplevel from colorlog import ColoredFormatter # basicConfig must be called after importing colorlog in order to diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 734f67906ceb..5bfc2e0509bc 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -1164,6 +1164,7 @@ class MqttAvailability(Entity): async def cleanup_device_registry(hass, device_id): """Remove device registry entry if there are no remaining entities or triggers.""" # Local import to avoid circular dependencies + # pylint: disable=import-outside-toplevel from . import device_trigger device_registry = await hass.helpers.device_registry.async_get_registry() diff --git a/homeassistant/components/mqtt/config_flow.py b/homeassistant/components/mqtt/config_flow.py index d3c6ee819b5f..b0ba58158e0c 100644 --- a/homeassistant/components/mqtt/config_flow.py +++ b/homeassistant/components/mqtt/config_flow.py @@ -125,6 +125,7 @@ class FlowHandler(config_entries.ConfigFlow): def try_connection(broker, port, username, password, protocol="3.1"): """Test if we can connect to an MQTT broker.""" + # pylint: disable=import-outside-toplevel import paho.mqtt.client as mqtt if protocol == "3.1": diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index 47a7f5a20377..812bb183e1c4 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -148,6 +148,7 @@ async def async_start( if config_entries_key not in hass.data[CONFIG_ENTRY_IS_SETUP]: if component == "device_automation": # Local import to avoid circular dependencies + # pylint: disable=import-outside-toplevel from . import device_automation await device_automation.async_setup_entry(hass, config_entry) diff --git a/homeassistant/components/tensorflow/image_processing.py b/homeassistant/components/tensorflow/image_processing.py index 26cf0fed5e86..3638cbafb9fe 100644 --- a/homeassistant/components/tensorflow/image_processing.py +++ b/homeassistant/components/tensorflow/image_processing.py @@ -92,7 +92,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" # These imports shouldn't be moved to the top, because they depend on code from the model_dir. # (The model_dir is created during the manual setup process. See integration docs.) - import tensorflow as tf + import tensorflow as tf # pylint: disable=import-outside-toplevel + + # pylint: disable=import-outside-toplevel from object_detection.utils import label_map_util except ImportError: _LOGGER.error( @@ -104,7 +106,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): try: # Display warning that PIL will be used if no OpenCV is found. - import cv2 # noqa: F401 pylint: disable=unused-import + import cv2 # noqa: F401 pylint: disable=unused-import, import-outside-toplevel except ImportError: _LOGGER.warning( "No OpenCV library found. TensorFlow will process image with " @@ -281,7 +283,7 @@ class TensorFlowImageProcessor(ImageProcessingEntity): """Process the image.""" try: - import cv2 # pylint: disable=import-error + import cv2 # pylint: disable=import-error, import-outside-toplevel img = cv2.imdecode(np.asarray(bytearray(image)), cv2.IMREAD_UNCHANGED) inp = img[:, :, [2, 1, 0]] # BGR->RGB diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 57c4fbe61998..4e3f2e9af571 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -1,4 +1,5 @@ """Support for Z-Wave.""" +# pylint: disable=import-outside-toplevel import asyncio import copy from importlib import import_module diff --git a/homeassistant/components/zwave/config_flow.py b/homeassistant/components/zwave/config_flow.py index b570e31c128b..6d7dc012e859 100644 --- a/homeassistant/components/zwave/config_flow.py +++ b/homeassistant/components/zwave/config_flow.py @@ -1,4 +1,5 @@ """Config flow to configure Z-Wave.""" +# pylint: disable=import-outside-toplevel from collections import OrderedDict import logging diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index f1b76075ae8b..a9a4bf22b8b3 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -1,4 +1,5 @@ """Entity class that represents Z-Wave node.""" +# pylint: disable=import-outside-toplevel from itertools import count import logging diff --git a/homeassistant/config.py b/homeassistant/config.py index cdaa30dc0494..169f3c771975 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -814,6 +814,7 @@ async def async_check_ha_config_file(hass: HomeAssistant) -> Optional[str]: This method is a coroutine. """ + # pylint: disable=import-outside-toplevel import homeassistant.helpers.check_config as check_config res = await check_config.async_check_ha_config_file(hass) @@ -831,6 +832,7 @@ def async_notify_setup_error( This method must be run in the event loop. """ + # pylint: disable=import-outside-toplevel from homeassistant.components import persistent_notification errors = hass.data.get(DATA_PERSISTENT_ERRORS) diff --git a/homeassistant/core.py b/homeassistant/core.py index d9155ece2d3e..54f1c1cd366f 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -230,6 +230,7 @@ class HomeAssistant: await self.async_start() if attach_signals: + # pylint: disable=import-outside-toplevel from homeassistant.helpers.signal import async_register_signal_handling async_register_signal_handling(self) diff --git a/homeassistant/helpers/data_entry_flow.py b/homeassistant/helpers/data_entry_flow.py index 05f49cd9f531..2b92887eac39 100644 --- a/homeassistant/helpers/data_entry_flow.py +++ b/homeassistant/helpers/data_entry_flow.py @@ -29,7 +29,7 @@ class _BaseFlowManagerView(HomeAssistantView): if result["type"] != data_entry_flow.RESULT_TYPE_FORM: return result - import voluptuous_serialize + import voluptuous_serialize # pylint: disable=import-outside-toplevel data = result.copy() diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 8a4b4bc2b761..27ab35dbb3c6 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -118,7 +118,7 @@ def async_track_template( variables: Optional[Dict[str, Any]] = None, ) -> CALLBACK_TYPE: """Add a listener that track state changes with template condition.""" - from . import condition + from . import condition # pylint: disable=import-outside-toplevel # Local variable to keep track of if the action has already been triggered already_triggered = False diff --git a/homeassistant/helpers/sun.py b/homeassistant/helpers/sun.py index 45ff06f16dea..818010c34105 100644 --- a/homeassistant/helpers/sun.py +++ b/homeassistant/helpers/sun.py @@ -19,7 +19,8 @@ DATA_LOCATION_CACHE = "astral_location_cache" @bind_hass def get_astral_location(hass: HomeAssistantType) -> "astral.Location": """Get an astral location for the current Home Assistant configuration.""" - from astral import Location + + from astral import Location # pylint: disable=import-outside-toplevel latitude = hass.config.latitude longitude = hass.config.longitude @@ -58,7 +59,7 @@ def get_location_astral_event_next( offset: Optional[datetime.timedelta] = None, ) -> datetime.datetime: """Calculate the next specified solar event.""" - from astral import AstralError + from astral import AstralError # pylint: disable=import-outside-toplevel if offset is None: offset = datetime.timedelta() @@ -92,7 +93,7 @@ def get_astral_event_date( date: Union[datetime.date, datetime.datetime, None] = None, ) -> Optional[datetime.datetime]: """Calculate the astral event time for the specified date.""" - from astral import AstralError + from astral import AstralError # pylint: disable=import-outside-toplevel location = get_astral_location(hass) diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 5cd15fefd99a..8c7b103f8345 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -505,6 +505,7 @@ def expand(hass: HomeAssistantType, *args: Any) -> Iterable[State]: # ignore other types continue + # pylint: disable=import-outside-toplevel from homeassistant.components import group if split_entity_id(entity_id)[0] == group.DOMAIN: diff --git a/homeassistant/loader.py b/homeassistant/loader.py index b2e1fa74fba2..f8b9ba55aa1e 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -70,7 +70,7 @@ async def _async_get_custom_components( return {} try: - import custom_components + import custom_components # pylint: disable=import-outside-toplevel except ImportError: return {} @@ -127,6 +127,7 @@ async def async_get_custom_components( async def async_get_config_flows(hass: "HomeAssistant") -> Set[str]: """Return cached list of config flows.""" + # pylint: disable=import-outside-toplevel from homeassistant.generated.config_flows import FLOWS flows: Set[str] = set() @@ -317,7 +318,7 @@ async def async_get_integration(hass: "HomeAssistant", domain: str) -> Integrati event.set() return integration - from homeassistant import components + from homeassistant import components # pylint: disable=import-outside-toplevel integration = await hass.async_add_executor_job( Integration.resolve_from_root, hass, components, domain diff --git a/homeassistant/scripts/benchmark/__init__.py b/homeassistant/scripts/benchmark/__init__.py index 2bc821c84955..69de79707451 100644 --- a/homeassistant/scripts/benchmark/__init__.py +++ b/homeassistant/scripts/benchmark/__init__.py @@ -155,6 +155,7 @@ async def logbook_filtering_attributes(hass): @benchmark async def _logbook_filtering(hass, last_changed, last_updated): + # pylint: disable=import-outside-toplevel from homeassistant.components import logbook entity_id = "test.entity" diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index c7ef1e937812..c5224f8f959f 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -34,6 +34,7 @@ ERROR_STR = "General Errors" def color(the_color, *args, reset=None): """Color helper.""" + # pylint: disable=import-outside-toplevel from colorlog.escape_codes import escape_codes, parse_colors try: diff --git a/homeassistant/scripts/credstash.py b/homeassistant/scripts/credstash.py index f90ab5f793e2..99227d81b663 100644 --- a/homeassistant/scripts/credstash.py +++ b/homeassistant/scripts/credstash.py @@ -29,7 +29,7 @@ def run(args): "value", help="The value to save when putting a secret", nargs="?", default=None ) - # pylint: disable=import-error, no-member + # pylint: disable=import-error, no-member, import-outside-toplevel import credstash args = parser.parse_args(args) diff --git a/homeassistant/scripts/keyring.py b/homeassistant/scripts/keyring.py index 594d897ee4c5..0622b8c3d451 100644 --- a/homeassistant/scripts/keyring.py +++ b/homeassistant/scripts/keyring.py @@ -26,7 +26,9 @@ def run(args): ) parser.add_argument("name", help="Name of the secret", nargs="?", default=None) - import keyring + import keyring # pylint: disable=import-outside-toplevel + + # pylint: disable=import-outside-toplevel from keyring.util import platform_ as platform args = parser.parse_args(args) diff --git a/pylintrc b/pylintrc index 125062c8cfeb..bb51444447a0 100644 --- a/pylintrc +++ b/pylintrc @@ -35,7 +35,6 @@ disable= cyclic-import, duplicate-code, global-statement, - import-outside-toplevel, inconsistent-return-statements, locally-disabled, not-context-manager, From 025cce3445b09e3cf4291e40af9801393c0f9f64 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 4 Apr 2020 10:19:58 -0500 Subject: [PATCH 090/653] Handle race condition in harmony setup (#33611) * Handle race condition in harmony setup If the remote was discovered via ssdp before the yaml config import happened, the unique id would already be set and the import would abort. * Update homeassistant/components/harmony/config_flow.py Co-Authored-By: Paulus Schoutsen * reduce * black Co-authored-by: Paulus Schoutsen --- homeassistant/components/harmony/config_flow.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/harmony/config_flow.py b/homeassistant/components/harmony/config_flow.py index 9d9c9dfb8e97..8d43b2d69ca9 100644 --- a/homeassistant/components/harmony/config_flow.py +++ b/homeassistant/components/harmony/config_flow.py @@ -128,8 +128,11 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def async_step_import(self, validated_input): """Handle import.""" - await self.async_set_unique_id(validated_input[UNIQUE_ID]) + await self.async_set_unique_id( + validated_input[UNIQUE_ID], raise_on_progress=False + ) self._abort_if_unique_id_configured() + # Everything was validated in remote async_setup_platform # all we do now is create. return await self._async_create_entry_from_valid_input( @@ -149,14 +152,8 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): # Options from yaml are preserved, we will pull them out when # we setup the config entry data.update(_options_from_user_input(user_input)) - return self.async_create_entry(title=validated[CONF_NAME], data=data) - def _host_already_configured(self, user_input): - """See if we already have a harmony matching user input configured.""" - existing_hosts = { - entry.data[CONF_HOST] for entry in self._async_current_entries() - } - return user_input[CONF_HOST] in existing_hosts + return self.async_create_entry(title=validated[CONF_NAME], data=data) def _options_from_user_input(user_input): From e8a0abd107010b5db989001172516e295565ac10 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 18:21:14 +0200 Subject: [PATCH 091/653] String formatting improvements (#33635) * String formatting improvements * Found another one --- homeassistant/components/aftership/sensor.py | 4 +++- homeassistant/components/buienradar/sensor.py | 6 ++---- homeassistant/components/config/zwave.py | 2 +- homeassistant/components/google_travel_time/sensor.py | 2 +- homeassistant/components/hdmi_cec/media_player.py | 4 +++- homeassistant/components/hdmi_cec/switch.py | 4 +++- homeassistant/components/nest/sensor.py | 2 +- homeassistant/components/notion/__init__.py | 4 ++-- homeassistant/components/openalpr_cloud/image_processing.py | 2 +- homeassistant/components/openalpr_local/image_processing.py | 2 +- homeassistant/components/opencv/image_processing.py | 2 +- homeassistant/components/openuv/__init__.py | 2 +- homeassistant/components/openuv/config_flow.py | 4 ++-- homeassistant/components/qrcode/image_processing.py | 2 +- homeassistant/components/raincloud/__init__.py | 2 +- homeassistant/components/rainmachine/__init__.py | 2 +- homeassistant/components/rainmachine/binary_sensor.py | 2 +- homeassistant/components/rainmachine/sensor.py | 2 +- homeassistant/components/rainmachine/switch.py | 4 ++-- homeassistant/components/ring/binary_sensor.py | 4 +--- homeassistant/components/ring/sensor.py | 4 +--- homeassistant/components/roku/media_player.py | 4 ++-- homeassistant/components/seven_segments/image_processing.py | 6 ++---- homeassistant/components/seventeentrack/sensor.py | 2 +- homeassistant/components/skybell/binary_sensor.py | 2 +- homeassistant/components/skybell/sensor.py | 2 +- homeassistant/components/skybell/switch.py | 2 +- homeassistant/components/starlingbank/sensor.py | 2 +- homeassistant/components/statsd/__init__.py | 2 +- homeassistant/components/swiss_hydrological_data/sensor.py | 2 +- homeassistant/components/tensorflow/image_processing.py | 4 ++-- homeassistant/components/tile/device_tracker.py | 2 +- homeassistant/components/travisci/sensor.py | 4 +--- homeassistant/components/withings/common.py | 2 +- homeassistant/components/xiaomi/camera.py | 2 +- homeassistant/components/yeelight/__init__.py | 2 +- homeassistant/components/yi/camera.py | 2 +- homeassistant/components/yr/sensor.py | 2 +- homeassistant/util/color.py | 2 +- 39 files changed, 52 insertions(+), 56 deletions(-) diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index 9b8a5637de20..3f00c8c310da 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -191,7 +191,9 @@ class AfterShipSensor(Entity): "name": name, "tracking_number": track["tracking_number"], "slug": track["slug"], - "link": "%s%s/%s" % (BASE, track["slug"], track["tracking_number"]), + "link": "{}{}/{}".format( + BASE, track["slug"], track["tracking_number"] + ), "last_update": track["updated_at"], "expected_delivery": track["expected_delivery"], "status": track["tag"], diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index afa5013b339e..235390d00135 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -255,10 +255,8 @@ class BrSensor(Entity): def uid(self, coordinates): """Generate a unique id using coordinates and sensor type.""" # The combination of the location, name and sensor type is unique - return "%2.6f%2.6f%s" % ( - coordinates[CONF_LATITUDE], - coordinates[CONF_LONGITUDE], - self.type, + return "{:2.6f}{:2.6f}{}".format( + coordinates[CONF_LATITUDE], coordinates[CONF_LONGITUDE], self.type, ) @callback diff --git a/homeassistant/components/config/zwave.py b/homeassistant/components/config/zwave.py index eaed84fe24d9..b792fcccec33 100644 --- a/homeassistant/components/config/zwave.py +++ b/homeassistant/components/config/zwave.py @@ -226,7 +226,7 @@ class ZWaveProtectionView(HomeAssistantView): return self.json(protection_options) protections = node.get_protections() protection_options = { - "value_id": "{0:d}".format(list(protections)[0]), + "value_id": "{:d}".format(list(protections)[0]), "selected": node.get_protection_item(list(protections)[0]), "options": node.get_protection_items(list(protections)[0]), } diff --git a/homeassistant/components/google_travel_time/sensor.py b/homeassistant/components/google_travel_time/sensor.py index dd7d9bf85857..5e99b42b1153 100644 --- a/homeassistant/components/google_travel_time/sensor.py +++ b/homeassistant/components/google_travel_time/sensor.py @@ -321,7 +321,7 @@ class GoogleTravelTimeSensor(Entity): def _get_location_from_attributes(entity): """Get the lat/long string from an entities attributes.""" attr = entity.attributes - return "%s,%s" % (attr.get(ATTR_LATITUDE), attr.get(ATTR_LONGITUDE)) + return "{},{}".format(attr.get(ATTR_LATITUDE), attr.get(ATTR_LONGITUDE)) def _resolve_zone(self, friendly_name): entities = self._hass.states.all() diff --git a/homeassistant/components/hdmi_cec/media_player.py b/homeassistant/components/hdmi_cec/media_player.py index 42c5f0b456c0..9b130f91b72c 100644 --- a/homeassistant/components/hdmi_cec/media_player.py +++ b/homeassistant/components/hdmi_cec/media_player.py @@ -67,7 +67,9 @@ class CecPlayerDevice(CecDevice, MediaPlayerDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "%s.%s_%s" % (DOMAIN, "hdmi", hex(self._logical_address)[2:]) + self.entity_id = "{}.{}_{}".format( + DOMAIN, "hdmi", hex(self._logical_address)[2:] + ) def send_keypress(self, key): """Send keypress to CEC adapter.""" diff --git a/homeassistant/components/hdmi_cec/switch.py b/homeassistant/components/hdmi_cec/switch.py index 53384397cf40..a4ef91dee8f5 100644 --- a/homeassistant/components/hdmi_cec/switch.py +++ b/homeassistant/components/hdmi_cec/switch.py @@ -28,7 +28,9 @@ class CecSwitchDevice(CecDevice, SwitchDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "%s.%s_%s" % (DOMAIN, "hdmi", hex(self._logical_address)[2:]) + self.entity_id = "{}.{}_{}".format( + DOMAIN, "hdmi", hex(self._logical_address)[2:] + ) def turn_on(self, **kwargs) -> None: """Turn device on.""" diff --git a/homeassistant/components/nest/sensor.py b/homeassistant/components/nest/sensor.py index 225caee0a90b..064c78917e1c 100644 --- a/homeassistant/components/nest/sensor.py +++ b/homeassistant/components/nest/sensor.py @@ -203,6 +203,6 @@ class NestTempSensor(NestSensorDevice): if isinstance(temp, tuple): low, high = temp - self._state = "%s-%s" % (int(low), int(high)) + self._state = "{}-{}".format(int(low), int(high)) else: self._state = round(temp, 1) diff --git a/homeassistant/components/notion/__init__.py b/homeassistant/components/notion/__init__.py index e9c45c628163..d608199f6fc0 100644 --- a/homeassistant/components/notion/__init__.py +++ b/homeassistant/components/notion/__init__.py @@ -255,7 +255,7 @@ class NotionEntity(Entity): @property def name(self): """Return the name of the sensor.""" - return "{0}: {1}".format( + return "{}: {}".format( self._notion.sensors[self._sensor_id]["name"], self._name ) @@ -268,7 +268,7 @@ class NotionEntity(Entity): def unique_id(self): """Return a unique, unchanging string that represents this sensor.""" task = self._notion.tasks[self._task_id] - return "{0}_{1}".format(self._sensor_id, task["task_type"]) + return "{}_{}".format(self._sensor_id, task["task_type"]) async def _update_bridge_id(self): """Update the entity's bridge ID if it has changed. diff --git a/homeassistant/components/openalpr_cloud/image_processing.py b/homeassistant/components/openalpr_cloud/image_processing.py index 64ba0d838441..13d8cf75e7cb 100644 --- a/homeassistant/components/openalpr_cloud/image_processing.py +++ b/homeassistant/components/openalpr_cloud/image_processing.py @@ -86,7 +86,7 @@ class OpenAlprCloudEntity(ImageProcessingAlprEntity): if name: self._name = name else: - self._name = "OpenAlpr {0}".format(split_entity_id(camera_entity)[1]) + self._name = "OpenAlpr {}".format(split_entity_id(camera_entity)[1]) @property def confidence(self): diff --git a/homeassistant/components/openalpr_local/image_processing.py b/homeassistant/components/openalpr_local/image_processing.py index df7b235a2240..b2e90ad5597b 100644 --- a/homeassistant/components/openalpr_local/image_processing.py +++ b/homeassistant/components/openalpr_local/image_processing.py @@ -161,7 +161,7 @@ class OpenAlprLocalEntity(ImageProcessingAlprEntity): if name: self._name = name else: - self._name = "OpenAlpr {0}".format(split_entity_id(camera_entity)[1]) + self._name = "OpenAlpr {}".format(split_entity_id(camera_entity)[1]) @property def confidence(self): diff --git a/homeassistant/components/opencv/image_processing.py b/homeassistant/components/opencv/image_processing.py index 4a1b830a3242..8e300c774653 100644 --- a/homeassistant/components/opencv/image_processing.py +++ b/homeassistant/components/opencv/image_processing.py @@ -132,7 +132,7 @@ class OpenCVImageProcessor(ImageProcessingEntity): if name: self._name = name else: - self._name = "OpenCV {0}".format(split_entity_id(camera_entity)[1]) + self._name = "OpenCV {}".format(split_entity_id(camera_entity)[1]) self._classifiers = classifiers self._matches = {} self._total_matches = 0 diff --git a/homeassistant/components/openuv/__init__.py b/homeassistant/components/openuv/__init__.py index 008b46d96f2a..df4ff9735c34 100644 --- a/homeassistant/components/openuv/__init__.py +++ b/homeassistant/components/openuv/__init__.py @@ -82,7 +82,7 @@ async def async_setup(hass, config): conf = config[DOMAIN] - identifier = "{0}, {1}".format( + identifier = "{}, {}".format( conf.get(CONF_LATITUDE, hass.config.latitude), conf.get(CONF_LONGITUDE, hass.config.longitude), ) diff --git a/homeassistant/components/openuv/config_flow.py b/homeassistant/components/openuv/config_flow.py index 82873861fb1f..402f65141781 100644 --- a/homeassistant/components/openuv/config_flow.py +++ b/homeassistant/components/openuv/config_flow.py @@ -20,7 +20,7 @@ from .const import DOMAIN def configured_instances(hass): """Return a set of configured OpenUV instances.""" return set( - "{0}, {1}".format( + "{}, {}".format( entry.data.get(CONF_LATITUDE, hass.config.latitude), entry.data.get(CONF_LONGITUDE, hass.config.longitude), ) @@ -64,7 +64,7 @@ class OpenUvFlowHandler(config_entries.ConfigFlow): if not user_input: return await self._show_form() - identifier = "{0}, {1}".format( + identifier = "{}, {}".format( user_input.get(CONF_LATITUDE, self.hass.config.latitude), user_input.get(CONF_LONGITUDE, self.hass.config.longitude), ) diff --git a/homeassistant/components/qrcode/image_processing.py b/homeassistant/components/qrcode/image_processing.py index 018f074a6d2f..71bb67f07537 100644 --- a/homeassistant/components/qrcode/image_processing.py +++ b/homeassistant/components/qrcode/image_processing.py @@ -34,7 +34,7 @@ class QrEntity(ImageProcessingEntity): if name: self._name = name else: - self._name = "QR {0}".format(split_entity_id(camera_entity)[1]) + self._name = "QR {}".format(split_entity_id(camera_entity)[1]) self._state = None @property diff --git a/homeassistant/components/raincloud/__init__.py b/homeassistant/components/raincloud/__init__.py index 971b8174993a..cc42bdc54b88 100644 --- a/homeassistant/components/raincloud/__init__.py +++ b/homeassistant/components/raincloud/__init__.py @@ -142,7 +142,7 @@ class RainCloudEntity(Entity): """Initialize the RainCloud entity.""" self.data = data self._sensor_type = sensor_type - self._name = "{0} {1}".format(self.data.name, KEY_MAP.get(self._sensor_type)) + self._name = "{} {}".format(self.data.name, KEY_MAP.get(self._sensor_type)) self._state = None @property diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index 92c14d0e0cb4..03dc49d74756 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -426,7 +426,7 @@ class RainMachineEntity(Entity): "identifiers": {(DOMAIN, self.rainmachine.controller.mac)}, "name": self.rainmachine.controller.name, "manufacturer": "RainMachine", - "model": "Version {0} (API: {1})".format( + "model": "Version {} (API: {})".format( self.rainmachine.controller.hardware_version, self.rainmachine.controller.api_version, ), diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 409ad0c99800..40802af2bfad 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -120,7 +120,7 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice): @property def unique_id(self) -> str: """Return a unique, Home Assistant friendly identifier for this entity.""" - return "{0}_{1}".format( + return "{}_{}".format( self.rainmachine.device_mac.replace(":", ""), self._sensor_type ) diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 371ba00dfd0c..287ce29a3cc3 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -132,7 +132,7 @@ class RainMachineSensor(RainMachineEntity): @property def unique_id(self) -> str: """Return a unique, Home Assistant friendly identifier for this entity.""" - return "{0}_{1}".format( + return "{}_{}".format( self.rainmachine.device_mac.replace(":", ""), self._sensor_type ) diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index 264de1d6782e..fd36e23cb0e5 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -142,7 +142,7 @@ class RainMachineSwitch(RainMachineEntity, SwitchDevice): @property def unique_id(self) -> str: """Return a unique, Home Assistant friendly identifier for this entity.""" - return "{0}_{1}_{2}".format( + return "{}_{}_{}".format( self.rainmachine.device_mac.replace(":", ""), self._switch_type, self._rainmachine_entity_id, @@ -219,7 +219,7 @@ class RainMachineProgram(RainMachineSwitch): try: next_run = datetime.strptime( - "{0} {1}".format( + "{} {}".format( self._switch_data["nextRun"], self._switch_data["startTime"] ), "%Y-%m-%d %H:%M", diff --git a/homeassistant/components/ring/binary_sensor.py b/homeassistant/components/ring/binary_sensor.py index 321b668f8aaf..385d8a4f9558 100644 --- a/homeassistant/components/ring/binary_sensor.py +++ b/homeassistant/components/ring/binary_sensor.py @@ -47,9 +47,7 @@ class RingBinarySensor(RingEntityMixin, BinarySensorDevice): super().__init__(config_entry_id, device) self._ring = ring self._sensor_type = sensor_type - self._name = "{0} {1}".format( - self._device.name, SENSOR_TYPES.get(sensor_type)[0] - ) + self._name = "{} {}".format(self._device.name, SENSOR_TYPES.get(sensor_type)[0]) self._device_class = SENSOR_TYPES.get(sensor_type)[2] self._state = None self._unique_id = f"{device.id}-{sensor_type}" diff --git a/homeassistant/components/ring/sensor.py b/homeassistant/components/ring/sensor.py index 84edaf67c223..260b4170745d 100644 --- a/homeassistant/components/ring/sensor.py +++ b/homeassistant/components/ring/sensor.py @@ -46,9 +46,7 @@ class RingSensor(RingEntityMixin, Entity): self._extra = None self._icon = "mdi:{}".format(SENSOR_TYPES.get(sensor_type)[3]) self._kind = SENSOR_TYPES.get(sensor_type)[4] - self._name = "{0} {1}".format( - self._device.name, SENSOR_TYPES.get(sensor_type)[0] - ) + self._name = "{} {}".format(self._device.name, SENSOR_TYPES.get(sensor_type)[0]) self._unique_id = f"{device.id}-{sensor_type}" @property diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index ba923f0fdd28..e26cce46ee24 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -153,8 +153,8 @@ class RokuDevice(MediaPlayerDevice): if self.current_app.id is None: return None - return "http://{0}:{1}/query/icon/{2}".format( - self.ip_address, DEFAULT_PORT, self.current_app.id + return ( + f"http://{self.ip_address}:{DEFAULT_PORT}/query/icon/{self.current_app.id}" ) @property diff --git a/homeassistant/components/seven_segments/image_processing.py b/homeassistant/components/seven_segments/image_processing.py index 315b5c39fec0..4515ec7441bd 100644 --- a/homeassistant/components/seven_segments/image_processing.py +++ b/homeassistant/components/seven_segments/image_processing.py @@ -69,14 +69,12 @@ class ImageProcessingSsocr(ImageProcessingEntity): if name: self._name = name else: - self._name = "SevenSegment OCR {0}".format( - split_entity_id(camera_entity)[1] - ) + self._name = "SevenSegment OCR {}".format(split_entity_id(camera_entity)[1]) self._state = None self.filepath = os.path.join( self.hass.config.config_dir, - "ssocr-{0}.png".format(self._name.replace(" ", "_")), + "ssocr-{}.png".format(self._name.replace(" ", "_")), ) crop = [ "crop", diff --git a/homeassistant/components/seventeentrack/sensor.py b/homeassistant/components/seventeentrack/sensor.py index 000019abb51c..53b16944cb2b 100644 --- a/homeassistant/components/seventeentrack/sensor.py +++ b/homeassistant/components/seventeentrack/sensor.py @@ -130,7 +130,7 @@ class SeventeenTrackSummarySensor(Entity): @property def unique_id(self): """Return a unique, Home Assistant friendly identifier for this entity.""" - return "summary_{0}_{1}".format(self._data.account_id, slugify(self._status)) + return "summary_{}_{}".format(self._data.account_id, slugify(self._status)) @property def unit_of_measurement(self): diff --git a/homeassistant/components/skybell/binary_sensor.py b/homeassistant/components/skybell/binary_sensor.py index 776281e15103..f0df663eba37 100644 --- a/homeassistant/components/skybell/binary_sensor.py +++ b/homeassistant/components/skybell/binary_sensor.py @@ -51,7 +51,7 @@ class SkybellBinarySensor(SkybellDevice, BinarySensorDevice): """Initialize a binary sensor for a Skybell device.""" super().__init__(device) self._sensor_type = sensor_type - self._name = "{0} {1}".format( + self._name = "{} {}".format( self._device.name, SENSOR_TYPES[self._sensor_type][0] ) self._device_class = SENSOR_TYPES[self._sensor_type][1] diff --git a/homeassistant/components/skybell/sensor.py b/homeassistant/components/skybell/sensor.py index 7d266b7d3f67..24b63b6271c0 100644 --- a/homeassistant/components/skybell/sensor.py +++ b/homeassistant/components/skybell/sensor.py @@ -49,7 +49,7 @@ class SkybellSensor(SkybellDevice): super().__init__(device) self._sensor_type = sensor_type self._icon = "mdi:{}".format(SENSOR_TYPES[self._sensor_type][1]) - self._name = "{0} {1}".format( + self._name = "{} {}".format( self._device.name, SENSOR_TYPES[self._sensor_type][0] ) self._state = None diff --git a/homeassistant/components/skybell/switch.py b/homeassistant/components/skybell/switch.py index e5a6975ddbb6..03ea74a23403 100644 --- a/homeassistant/components/skybell/switch.py +++ b/homeassistant/components/skybell/switch.py @@ -48,7 +48,7 @@ class SkybellSwitch(SkybellDevice, SwitchDevice): """Initialize a light for a Skybell device.""" super().__init__(device) self._switch_type = switch_type - self._name = "{0} {1}".format( + self._name = "{} {}".format( self._device.name, SWITCH_TYPES[self._switch_type][0] ) diff --git a/homeassistant/components/starlingbank/sensor.py b/homeassistant/components/starlingbank/sensor.py index 1e0461923478..20fa646ce41b 100644 --- a/homeassistant/components/starlingbank/sensor.py +++ b/homeassistant/components/starlingbank/sensor.py @@ -75,7 +75,7 @@ class StarlingBalanceSensor(Entity): @property def name(self): """Return the name of the sensor.""" - return "{0} {1}".format( + return "{} {}".format( self._account_name, self._balance_data_type.replace("_", " ").capitalize() ) diff --git a/homeassistant/components/statsd/__init__.py b/homeassistant/components/statsd/__init__.py index 79065f7ba534..7ca3068f0039 100644 --- a/homeassistant/components/statsd/__init__.py +++ b/homeassistant/components/statsd/__init__.py @@ -79,7 +79,7 @@ def setup(hass, config): # Send attribute values for key, value in states.items(): if isinstance(value, (float, int)): - stat = "%s.%s" % (state.entity_id, key.replace(" ", "_")) + stat = "{}.{}".format(state.entity_id, key.replace(" ", "_")) statsd_client.gauge(stat, value, sample_rate) else: diff --git a/homeassistant/components/swiss_hydrological_data/sensor.py b/homeassistant/components/swiss_hydrological_data/sensor.py index d4624e82bb7d..61423312b2a0 100644 --- a/homeassistant/components/swiss_hydrological_data/sensor.py +++ b/homeassistant/components/swiss_hydrological_data/sensor.py @@ -97,7 +97,7 @@ class SwissHydrologicalDataSensor(Entity): @property def name(self): """Return the name of the sensor.""" - return "{0} {1}".format(self._data["water-body-name"], self._condition) + return "{} {}".format(self._data["water-body-name"], self._condition) @property def unique_id(self) -> str: diff --git a/homeassistant/components/tensorflow/image_processing.py b/homeassistant/components/tensorflow/image_processing.py index 3638cbafb9fe..b003fef56c0a 100644 --- a/homeassistant/components/tensorflow/image_processing.py +++ b/homeassistant/components/tensorflow/image_processing.py @@ -168,7 +168,7 @@ class TensorFlowImageProcessor(ImageProcessingEntity): if name: self._name = name else: - self._name = "TensorFlow {0}".format(split_entity_id(camera_entity)[1]) + self._name = "TensorFlow {}".format(split_entity_id(camera_entity)[1]) self._session = session self._graph = detection_graph self._category_index = category_index @@ -270,7 +270,7 @@ class TensorFlowImageProcessor(ImageProcessingEntity): # Draw detected objects for instance in values: - label = "{0} {1:.1f}%".format(category, instance["score"]) + label = "{} {:.1f}%".format(category, instance["score"]) draw_box( draw, instance["box"], img_width, img_height, label, (255, 255, 0) ) diff --git a/homeassistant/components/tile/device_tracker.py b/homeassistant/components/tile/device_tracker.py index 8bc4fb11cdfa..6cfe6121ccba 100644 --- a/homeassistant/components/tile/device_tracker.py +++ b/homeassistant/components/tile/device_tracker.py @@ -121,7 +121,7 @@ class TileScanner: for tile in tiles: await self._async_see( - dev_id="tile_{0}".format(slugify(tile["tile_uuid"])), + dev_id="tile_{}".format(slugify(tile["tile_uuid"])), gps=( tile["last_tile_state"]["latitude"], tile["last_tile_state"]["longitude"], diff --git a/homeassistant/components/travisci/sensor.py b/homeassistant/components/travisci/sensor.py index ffbe5239cc9e..c2ce599f5c35 100644 --- a/homeassistant/components/travisci/sensor.py +++ b/homeassistant/components/travisci/sensor.py @@ -106,9 +106,7 @@ class TravisCISensor(Entity): self._user = user self._branch = branch self._state = None - self._name = "{0} {1}".format( - self._repo_name, SENSOR_TYPES[self._sensor_type][0] - ) + self._name = "{} {}".format(self._repo_name, SENSOR_TYPES[self._sensor_type][0]) @property def name(self): diff --git a/homeassistant/components/withings/common.py b/homeassistant/components/withings/common.py index 9cba055bac4c..3a9d1d527518 100644 --- a/homeassistant/components/withings/common.py +++ b/homeassistant/components/withings/common.py @@ -108,7 +108,7 @@ class ConfigEntryWithingsApi(AbstractWithingsApi): partial( requests.request, method, - "%s/%s" % (self.URL, path), + f"{self.URL}/{path}", params=params, headers={ "Authorization": "Bearer %s" diff --git a/homeassistant/components/xiaomi/camera.py b/homeassistant/components/xiaomi/camera.py index cc85f17146b2..2b249c7b7c88 100644 --- a/homeassistant/components/xiaomi/camera.py +++ b/homeassistant/components/xiaomi/camera.py @@ -136,7 +136,7 @@ class XiaomiCamera(Camera): else: video = videos[-1] - return "ftp://{0}:{1}@{2}:{3}{4}/{5}".format( + return "ftp://{}:{}@{}:{}{}/{}".format( self.user, self.passwd, host, self.port, ftp.pwd(), video ) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index eae1cd32c06b..1e0fe841cac8 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -147,7 +147,7 @@ def setup(hass, config): def device_discovered(_, info): _LOGGER.debug("Adding autodetected %s", info["hostname"]) - name = "yeelight_%s_%s" % (info["device_type"], info["properties"]["mac"]) + name = "yeelight_{}_{}".format(info["device_type"], info["properties"]["mac"]) device_config = DEVICE_SCHEMA({CONF_NAME: name}) diff --git a/homeassistant/components/yi/camera.py b/homeassistant/components/yi/camera.py index 6e49d2871869..658cc3a23ee9 100644 --- a/homeassistant/components/yi/camera.py +++ b/homeassistant/components/yi/camera.py @@ -110,7 +110,7 @@ class YiCamera(Camera): await ftp.quit() self._is_on = True - return "ftp://{0}:{1}@{2}:{3}{4}/{5}/{6}".format( + return "ftp://{}:{}@{}:{}{}/{}/{}".format( self.user, self.passwd, self.host, diff --git a/homeassistant/components/yr/sensor.py b/homeassistant/components/yr/sensor.py index 9955a650cd36..2061c061dd07 100644 --- a/homeassistant/components/yr/sensor.py +++ b/homeassistant/components/yr/sensor.py @@ -139,7 +139,7 @@ class YrSensor(Entity): return None return ( "https://api.met.no/weatherapi/weathericon/1.1/" - "?symbol={0};content_type=image/png".format(self._state) + f"?symbol={self._state};content_type=image/png" ) @property diff --git a/homeassistant/util/color.py b/homeassistant/util/color.py index b56ecbbaa891..965b5950c934 100644 --- a/homeassistant/util/color.py +++ b/homeassistant/util/color.py @@ -424,7 +424,7 @@ def color_rgbw_to_rgb(r: int, g: int, b: int, w: int) -> Tuple[int, int, int]: def color_rgb_to_hex(r: int, g: int, b: int) -> str: """Return a RGB color from a hex color string.""" - return "{0:02x}{1:02x}{2:02x}".format(round(r), round(g), round(b)) + return "{:02x}{:02x}{:02x}".format(round(r), round(g), round(b)) def rgb_hex_to_rgb_list(hex_string: str) -> List[int]: From 29d06e8fafe383f9a246118c158698d720a6c18c Mon Sep 17 00:00:00 2001 From: shred86 <32663154+shred86@users.noreply.github.com> Date: Sat, 4 Apr 2020 09:30:00 -0700 Subject: [PATCH 092/653] Update legacy job calls in abode (#33607) --- homeassistant/components/abode/__init__.py | 8 ++++---- homeassistant/components/abode/camera.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/abode/__init__.py b/homeassistant/components/abode/__init__.py index 9ecd2ffd1554..9f4c1dc5fd32 100644 --- a/homeassistant/components/abode/__init__.py +++ b/homeassistant/components/abode/__init__.py @@ -292,7 +292,7 @@ class AbodeEntity(Entity): async def async_added_to_hass(self): """Subscribe to Abode connection status updates.""" - self.hass.async_add_job( + self.hass.async_add_executor_job( self._data.abode.events.add_connection_status_callback, self.unique_id, self._update_connection_status, @@ -302,7 +302,7 @@ class AbodeEntity(Entity): async def async_will_remove_from_hass(self): """Unsubscribe from Abode connection status updates.""" - self.hass.async_add_job( + self.hass.async_add_executor_job( self._data.abode.events.remove_connection_status_callback, self.unique_id, ) @@ -323,7 +323,7 @@ class AbodeDevice(AbodeEntity): async def async_added_to_hass(self): """Subscribe to device events.""" await super().async_added_to_hass() - self.hass.async_add_job( + self.hass.async_add_executor_job( self._data.abode.events.add_device_callback, self._device.device_id, self._update_callback, @@ -332,7 +332,7 @@ class AbodeDevice(AbodeEntity): async def async_will_remove_from_hass(self): """Unsubscribe from device events.""" await super().async_will_remove_from_hass() - self.hass.async_add_job( + self.hass.async_add_executor_job( self._data.abode.events.remove_all_device_callbacks, self._device.device_id ) diff --git a/homeassistant/components/abode/camera.py b/homeassistant/components/abode/camera.py index e733bbd8abbe..b7d5f1dbe4ca 100644 --- a/homeassistant/components/abode/camera.py +++ b/homeassistant/components/abode/camera.py @@ -41,7 +41,7 @@ class AbodeCamera(AbodeDevice, Camera): """Subscribe Abode events.""" await super().async_added_to_hass() - self.hass.async_add_job( + self.hass.async_add_executor_job( self._data.abode.events.add_timeline_callback, self._event, self._capture_callback, From 39a01fcdc63ec5965cc322b74b33141636a7eddd Mon Sep 17 00:00:00 2001 From: Alexei Chetroi Date: Sat, 4 Apr 2020 12:58:43 -0400 Subject: [PATCH 093/653] Update zha dependencies (#33639) --- homeassistant/components/zha/manifest.json | 4 ++-- requirements_all.txt | 4 ++-- requirements_test_all.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json index c7a898e74af0..9a53a29fe5ed 100644 --- a/homeassistant/components/zha/manifest.json +++ b/homeassistant/components/zha/manifest.json @@ -4,11 +4,11 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zha", "requirements": [ - "bellows-homeassistant==0.15.1", + "bellows-homeassistant==0.15.2", "zha-quirks==0.0.38", "zigpy-cc==0.3.1", "zigpy-deconz==0.8.0", - "zigpy-homeassistant==0.18.0", + "zigpy-homeassistant==0.18.1", "zigpy-xbee-homeassistant==0.11.0", "zigpy-zigate==0.5.1" ], diff --git a/requirements_all.txt b/requirements_all.txt index 5ef68692f07c..8bdf43782055 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -317,7 +317,7 @@ beautifulsoup4==4.8.2 beewi_smartclim==0.0.7 # homeassistant.components.zha -bellows-homeassistant==0.15.1 +bellows-homeassistant==0.15.2 # homeassistant.components.bmw_connected_drive bimmer_connected==0.7.1 @@ -2190,7 +2190,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.0 +zigpy-homeassistant==0.18.1 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e9d2b17756fd..121dd891acb6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -131,7 +131,7 @@ av==6.1.2 axis==25 # homeassistant.components.zha -bellows-homeassistant==0.15.1 +bellows-homeassistant==0.15.2 # homeassistant.components.bom bomradarloop==0.1.4 @@ -809,7 +809,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.0 +zigpy-homeassistant==0.18.1 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 From d85222ad80d0e426a4ba6a8069ddb664ff1f912d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 20:02:50 +0200 Subject: [PATCH 094/653] Use byte literals instead of encode (#33633) --- homeassistant/components/actiontec/device_tracker.py | 6 +++--- homeassistant/components/graphite/__init__.py | 2 +- homeassistant/components/lannouncer/notify.py | 2 +- homeassistant/components/thomson/device_tracker.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/actiontec/device_tracker.py b/homeassistant/components/actiontec/device_tracker.py index 302a8d56173e..d9d4a4f2ea6a 100644 --- a/homeassistant/components/actiontec/device_tracker.py +++ b/homeassistant/components/actiontec/device_tracker.py @@ -99,11 +99,11 @@ class ActiontecDeviceScanner(DeviceScanner): telnet.read_until(b"Password: ") telnet.write((self.password + "\n").encode("ascii")) prompt = telnet.read_until(b"Wireless Broadband Router> ").split(b"\n")[-1] - telnet.write("firewall mac_cache_dump\n".encode("ascii")) - telnet.write("\n".encode("ascii")) + telnet.write(b"firewall mac_cache_dump\n") + telnet.write(b"\n") telnet.read_until(prompt) leases_result = telnet.read_until(prompt).split(b"\n")[1:-1] - telnet.write("exit\n".encode("ascii")) + telnet.write(b"exit\n") except EOFError: _LOGGER.exception("Unexpected response from router") return diff --git a/homeassistant/components/graphite/__init__.py b/homeassistant/components/graphite/__init__.py index bf34bc3ddeaa..104ad61e93ce 100644 --- a/homeassistant/components/graphite/__init__.py +++ b/homeassistant/components/graphite/__init__.py @@ -104,7 +104,7 @@ class GraphiteFeeder(threading.Thread): sock.settimeout(10) sock.connect((self._host, self._port)) sock.sendall(data.encode("ascii")) - sock.send("\n".encode("ascii")) + sock.send(b"\n") sock.close() def _report_attributes(self, entity_id, new_state): diff --git a/homeassistant/components/lannouncer/notify.py b/homeassistant/components/lannouncer/notify.py index 9421eb16f51e..2e5cb9b5600e 100644 --- a/homeassistant/components/lannouncer/notify.py +++ b/homeassistant/components/lannouncer/notify.py @@ -69,7 +69,7 @@ class LannouncerNotificationService(BaseNotificationService): # Send message _LOGGER.debug("Sending message: %s", cmd) sock.sendall(cmd.encode()) - sock.sendall("&@DONE@\n".encode()) + sock.sendall(b"&@DONE@\n") # Check response buffer = sock.recv(1024) diff --git a/homeassistant/components/thomson/device_tracker.py b/homeassistant/components/thomson/device_tracker.py index 1f3fda6cc72c..05e7a49b6252 100644 --- a/homeassistant/components/thomson/device_tracker.py +++ b/homeassistant/components/thomson/device_tracker.py @@ -98,9 +98,9 @@ class ThomsonDeviceScanner(DeviceScanner): telnet.read_until(b"Password : ") telnet.write((self.password + "\r\n").encode("ascii")) telnet.read_until(b"=>") - telnet.write(("hostmgr list\r\n").encode("ascii")) + telnet.write(b"hostmgr list\r\n") devices_result = telnet.read_until(b"=>").split(b"\r\n") - telnet.write("exit\r\n".encode("ascii")) + telnet.write(b"exit\r\n") except EOFError: _LOGGER.exception("Unexpected response from router") return From 7d3c9747475568284181f77a8cbecb26eedc2599 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 20:05:15 +0200 Subject: [PATCH 095/653] Use set & dict literals (#33636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Høyer Iversen --- homeassistant/bootstrap.py | 2 +- homeassistant/components/august/__init__.py | 8 +-- .../components/bayesian/binary_sensor.py | 4 +- homeassistant/components/bme680/sensor.py | 4 +- homeassistant/components/cast/discovery.py | 4 +- .../components/emulated_roku/config_flow.py | 4 +- .../geonetnz_volcano/config_flow.py | 4 +- .../components/google_assistant/smart_home.py | 2 +- homeassistant/components/gtfs/sensor.py | 6 +- .../components/homematicip_cloud/__init__.py | 4 +- homeassistant/components/hue/__init__.py | 4 +- homeassistant/components/iqvia/config_flow.py | 4 +- .../components/luftdaten/config_flow.py | 4 +- .../components/mold_indicator/sensor.py | 12 ++-- .../components/openuv/config_flow.py | 4 +- .../components/pioneer/media_player.py | 2 +- homeassistant/components/plex/config_flow.py | 4 +- .../components/python_script/__init__.py | 59 +++++++++++-------- homeassistant/components/smhi/config_flow.py | 4 +- .../components/solaredge/config_flow.py | 4 +- .../components/solarlog/config_flow.py | 4 +- .../components/sonos/media_player.py | 2 +- homeassistant/components/tesla/config_flow.py | 2 +- homeassistant/components/toon/config_flow.py | 4 +- .../components/velbus/config_flow.py | 4 +- homeassistant/config_entries.py | 4 +- homeassistant/helpers/check_config.py | 2 +- homeassistant/helpers/restore_state.py | 4 +- 28 files changed, 89 insertions(+), 80 deletions(-) diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index ef345de22cfb..618a168be61a 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -309,7 +309,7 @@ async def async_mount_local_lib_path(config_dir: str) -> str: def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]: """Get domains of components to set up.""" # Filter out the repeating and common config section [homeassistant] - domains = set(key.split(" ")[0] for key in config.keys() if key != core.DOMAIN) + domains = {key.split(" ")[0] for key in config.keys() if key != core.DOMAIN} # Add config entry domains if not hass.config.safe_mode: diff --git a/homeassistant/components/august/__init__.py b/homeassistant/components/august/__init__.py index 373fcae8d0c2..cd2783e6cb87 100644 --- a/homeassistant/components/august/__init__.py +++ b/homeassistant/components/august/__init__.py @@ -214,11 +214,11 @@ class AugustData(AugustSubscriberMixin): await self._api.async_get_doorbells(self._august_gateway.access_token) or [] ) - self._doorbells_by_id = dict((device.device_id, device) for device in doorbells) - self._locks_by_id = dict((device.device_id, device) for device in locks) - self._house_ids = set( + self._doorbells_by_id = {device.device_id: device for device in doorbells} + self._locks_by_id = {device.device_id: device for device in locks} + self._house_ids = { device.house_id for device in itertools.chain(locks, doorbells) - ) + } await self._async_refresh_device_detail_by_ids( [device.device_id for device in itertools.chain(locks, doorbells)] diff --git a/homeassistant/components/bayesian/binary_sensor.py b/homeassistant/components/bayesian/binary_sensor.py index b922c966ff53..78b30557fce2 100644 --- a/homeassistant/components/bayesian/binary_sensor.py +++ b/homeassistant/components/bayesian/binary_sensor.py @@ -303,11 +303,11 @@ class BayesianBinarySensor(BinarySensorDevice): return { ATTR_OBSERVATIONS: list(self.current_observations.values()), ATTR_OCCURRED_OBSERVATION_ENTITIES: list( - set( + { obs.get("entity_id") for obs in self.current_observations.values() if obs is not None - ) + } ), ATTR_PROBABILITY: round(self.probability, 2), ATTR_PROBABILITY_THRESHOLD: self._probability_threshold, diff --git a/homeassistant/components/bme680/sensor.py b/homeassistant/components/bme680/sensor.py index 19d6fbd30862..ba5a3267a231 100644 --- a/homeassistant/components/bme680/sensor.py +++ b/homeassistant/components/bme680/sensor.py @@ -61,8 +61,8 @@ SENSOR_TYPES = { SENSOR_AQ: ["Air Quality", UNIT_PERCENTAGE], } DEFAULT_MONITORED = [SENSOR_TEMP, SENSOR_HUMID, SENSOR_PRESS, SENSOR_AQ] -OVERSAMPLING_VALUES = set([0, 1, 2, 4, 8, 16]) -FILTER_VALUES = set([0, 1, 3, 7, 15, 31, 63, 127]) +OVERSAMPLING_VALUES = {0, 1, 2, 4, 8, 16} +FILTER_VALUES = {0, 1, 3, 7, 15, 31, 63, 127} PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { diff --git a/homeassistant/components/cast/discovery.py b/homeassistant/components/cast/discovery.py index 54f165889afe..6991c83959d0 100644 --- a/homeassistant/components/cast/discovery.py +++ b/homeassistant/components/cast/discovery.py @@ -30,9 +30,9 @@ def discover_chromecast(hass: HomeAssistant, info: ChromecastInfo): if info.uuid is not None: # Remove previous cast infos with same uuid from known chromecasts. - same_uuid = set( + same_uuid = { x for x in hass.data[KNOWN_CHROMECAST_INFO_KEY] if info.uuid == x.uuid - ) + } hass.data[KNOWN_CHROMECAST_INFO_KEY] -= same_uuid hass.data[KNOWN_CHROMECAST_INFO_KEY].add(info) diff --git a/homeassistant/components/emulated_roku/config_flow.py b/homeassistant/components/emulated_roku/config_flow.py index 3e363e060c22..0f8a82fa8934 100644 --- a/homeassistant/components/emulated_roku/config_flow.py +++ b/homeassistant/components/emulated_roku/config_flow.py @@ -11,9 +11,9 @@ from .const import CONF_LISTEN_PORT, DEFAULT_NAME, DEFAULT_PORT, DOMAIN @callback def configured_servers(hass): """Return a set of the configured servers.""" - return set( + return { entry.data[CONF_NAME] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @config_entries.HANDLERS.register(DOMAIN) diff --git a/homeassistant/components/geonetnz_volcano/config_flow.py b/homeassistant/components/geonetnz_volcano/config_flow.py index 7c079c432ddd..c19e7d4b303d 100644 --- a/homeassistant/components/geonetnz_volcano/config_flow.py +++ b/homeassistant/components/geonetnz_volcano/config_flow.py @@ -24,10 +24,10 @@ _LOGGER = logging.getLogger(__name__) @callback def configured_instances(hass): """Return a set of configured GeoNet NZ Volcano instances.""" - return set( + return { f"{entry.data[CONF_LATITUDE]}, {entry.data[CONF_LONGITUDE]}" for entry in hass.config_entries.async_entries(DOMAIN) - ) + } class GeonetnzVolcanoFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/google_assistant/smart_home.py b/homeassistant/components/google_assistant/smart_home.py index 55e121e2fc7a..a3667f4c4f4c 100644 --- a/homeassistant/components/google_assistant/smart_home.py +++ b/homeassistant/components/google_assistant/smart_home.py @@ -262,7 +262,7 @@ async def async_devices_reachable(hass, data: RequestData, payload): https://developers.google.com/actions/smarthome/create#actiondevicesdisconnect """ - google_ids = set(dev["id"] for dev in (data.devices or [])) + google_ids = {dev["id"] for dev in (data.devices or [])} return { "devices": [ diff --git a/homeassistant/components/gtfs/sensor.py b/homeassistant/components/gtfs/sensor.py index 08550ed80b8f..e4e00c7c2ec6 100644 --- a/homeassistant/components/gtfs/sensor.py +++ b/homeassistant/components/gtfs/sensor.py @@ -659,9 +659,9 @@ class GTFSDepartureSensor(Entity): @staticmethod def dict_for_table(resource: Any) -> dict: """Return a dictionary for the SQLAlchemy resource given.""" - return dict( - (col, getattr(resource, col)) for col in resource.__table__.columns.keys() - ) + return { + col: getattr(resource, col) for col in resource.__table__.columns.keys() + } def append_keys(self, resource: dict, prefix: Optional[str] = None) -> None: """Properly format key val pairs to append to attributes.""" diff --git a/homeassistant/components/homematicip_cloud/__init__.py b/homeassistant/components/homematicip_cloud/__init__.py index d1982e289a32..df1f5062fce0 100644 --- a/homeassistant/components/homematicip_cloud/__init__.py +++ b/homeassistant/components/homematicip_cloud/__init__.py @@ -50,10 +50,10 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool: accesspoints = config.get(DOMAIN, []) for conf in accesspoints: - if conf[CONF_ACCESSPOINT] not in set( + if conf[CONF_ACCESSPOINT] not in { entry.data[HMIPC_HAPID] for entry in hass.config_entries.async_entries(DOMAIN) - ): + }: hass.async_add_job( hass.config_entries.flow.async_init( DOMAIN, diff --git a/homeassistant/components/hue/__init__.py b/homeassistant/components/hue/__init__.py index 7510ff22f163..675fe3ae5e14 100644 --- a/homeassistant/components/hue/__init__.py +++ b/homeassistant/components/hue/__init__.py @@ -70,9 +70,9 @@ async def async_setup(hass, config): bridges = conf[CONF_BRIDGES] - configured_hosts = set( + configured_hosts = { entry.data.get("host") for entry in hass.config_entries.async_entries(DOMAIN) - ) + } for bridge_conf in bridges: host = bridge_conf[CONF_HOST] diff --git a/homeassistant/components/iqvia/config_flow.py b/homeassistant/components/iqvia/config_flow.py index abec8eff09a0..6a57f0f24d4b 100644 --- a/homeassistant/components/iqvia/config_flow.py +++ b/homeassistant/components/iqvia/config_flow.py @@ -16,9 +16,9 @@ from .const import CONF_ZIP_CODE, DOMAIN @callback def configured_instances(hass): """Return a set of configured IQVIA instances.""" - return set( + return { entry.data[CONF_ZIP_CODE] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @config_entries.HANDLERS.register(DOMAIN) diff --git a/homeassistant/components/luftdaten/config_flow.py b/homeassistant/components/luftdaten/config_flow.py index 1f382b86c0fb..1613e8ea555f 100644 --- a/homeassistant/components/luftdaten/config_flow.py +++ b/homeassistant/components/luftdaten/config_flow.py @@ -22,10 +22,10 @@ from .const import CONF_SENSOR_ID, DEFAULT_SCAN_INTERVAL, DOMAIN @callback def configured_sensors(hass): """Return a set of configured Luftdaten sensors.""" - return set( + return { entry.data[CONF_SENSOR_ID] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @callback diff --git a/homeassistant/components/mold_indicator/sensor.py b/homeassistant/components/mold_indicator/sensor.py index 374866a68597..82f1cfaec9bb 100644 --- a/homeassistant/components/mold_indicator/sensor.py +++ b/homeassistant/components/mold_indicator/sensor.py @@ -90,13 +90,11 @@ class MoldIndicator(Entity): self._calib_factor = calib_factor self._is_metric = is_metric self._available = False - self._entities = set( - [ - self._indoor_temp_sensor, - self._indoor_humidity_sensor, - self._outdoor_temp_sensor, - ] - ) + self._entities = { + self._indoor_temp_sensor, + self._indoor_humidity_sensor, + self._outdoor_temp_sensor, + } self._dewpoint = None self._indoor_temp = None diff --git a/homeassistant/components/openuv/config_flow.py b/homeassistant/components/openuv/config_flow.py index 402f65141781..9874cadb5665 100644 --- a/homeassistant/components/openuv/config_flow.py +++ b/homeassistant/components/openuv/config_flow.py @@ -19,13 +19,13 @@ from .const import DOMAIN @callback def configured_instances(hass): """Return a set of configured OpenUV instances.""" - return set( + return { "{}, {}".format( entry.data.get(CONF_LATITUDE, hass.config.latitude), entry.data.get(CONF_LONGITUDE, hass.config.longitude), ) for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @config_entries.HANDLERS.register(DOMAIN) diff --git a/homeassistant/components/pioneer/media_player.py b/homeassistant/components/pioneer/media_player.py index b834a8e68294..66e57d156efb 100644 --- a/homeassistant/components/pioneer/media_player.py +++ b/homeassistant/components/pioneer/media_player.py @@ -87,7 +87,7 @@ class PioneerDevice(MediaPlayerDevice): self._muted = False self._selected_source = "" self._source_name_to_number = sources - self._source_number_to_name = dict((v, k) for k, v in sources.items()) + self._source_number_to_name = {v: k for k, v in sources.items()} @classmethod def telnet_request(cls, telnet, command, expected_prefix): diff --git a/homeassistant/components/plex/config_flow.py b/homeassistant/components/plex/config_flow.py index 6edbecf055dc..a314aba0ecdf 100644 --- a/homeassistant/components/plex/config_flow.py +++ b/homeassistant/components/plex/config_flow.py @@ -43,10 +43,10 @@ _LOGGER = logging.getLogger(__package__) @callback def configured_servers(hass): """Return a set of the configured Plex servers.""" - return set( + return { entry.data[CONF_SERVER_IDENTIFIER] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } class PlexFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/python_script/__init__.py b/homeassistant/components/python_script/__init__.py index 0c5886e177c5..6ec94aa8e52a 100644 --- a/homeassistant/components/python_script/__init__.py +++ b/homeassistant/components/python_script/__init__.py @@ -32,30 +32,41 @@ FOLDER = "python_scripts" CONFIG_SCHEMA = vol.Schema({DOMAIN: vol.Schema(dict)}, extra=vol.ALLOW_EXTRA) -ALLOWED_HASS = set(["bus", "services", "states"]) -ALLOWED_EVENTBUS = set(["fire"]) -ALLOWED_STATEMACHINE = set( - ["entity_ids", "all", "get", "is_state", "is_state_attr", "remove", "set"] -) -ALLOWED_SERVICEREGISTRY = set(["services", "has_service", "call"]) -ALLOWED_TIME = set( - ["sleep", "strftime", "strptime", "gmtime", "localtime", "ctime", "time", "mktime"] -) -ALLOWED_DATETIME = set(["date", "time", "datetime", "timedelta", "tzinfo"]) -ALLOWED_DT_UTIL = set( - [ - "utcnow", - "now", - "as_utc", - "as_timestamp", - "as_local", - "utc_from_timestamp", - "start_of_local_day", - "parse_datetime", - "parse_date", - "get_age", - ] -) +ALLOWED_HASS = {"bus", "services", "states"} +ALLOWED_EVENTBUS = {"fire"} +ALLOWED_STATEMACHINE = { + "entity_ids", + "all", + "get", + "is_state", + "is_state_attr", + "remove", + "set", +} +ALLOWED_SERVICEREGISTRY = {"services", "has_service", "call"} +ALLOWED_TIME = { + "sleep", + "strftime", + "strptime", + "gmtime", + "localtime", + "ctime", + "time", + "mktime", +} +ALLOWED_DATETIME = {"date", "time", "datetime", "timedelta", "tzinfo"} +ALLOWED_DT_UTIL = { + "utcnow", + "now", + "as_utc", + "as_timestamp", + "as_local", + "utc_from_timestamp", + "start_of_local_day", + "parse_datetime", + "parse_date", + "get_age", +} class ScriptError(HomeAssistantError): diff --git a/homeassistant/components/smhi/config_flow.py b/homeassistant/components/smhi/config_flow.py index 2c04896497a1..8853680af338 100644 --- a/homeassistant/components/smhi/config_flow.py +++ b/homeassistant/components/smhi/config_flow.py @@ -15,10 +15,10 @@ from .const import DOMAIN, HOME_LOCATION_NAME @callback def smhi_locations(hass: HomeAssistant): """Return configurations of SMHI component.""" - return set( + return { (slugify(entry.data[CONF_NAME])) for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @config_entries.HANDLERS.register(DOMAIN) diff --git a/homeassistant/components/solaredge/config_flow.py b/homeassistant/components/solaredge/config_flow.py index 62bf99ab3832..8a7f2af3a99e 100644 --- a/homeassistant/components/solaredge/config_flow.py +++ b/homeassistant/components/solaredge/config_flow.py @@ -14,10 +14,10 @@ from .const import CONF_SITE_ID, DEFAULT_NAME, DOMAIN @callback def solaredge_entries(hass: HomeAssistant): """Return the site_ids for the domain.""" - return set( + return { (entry.data[CONF_SITE_ID]) for entry in hass.config_entries.async_entries(DOMAIN) - ) + } class SolarEdgeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/solarlog/config_flow.py b/homeassistant/components/solarlog/config_flow.py index 111155b27b65..39a752855aad 100644 --- a/homeassistant/components/solarlog/config_flow.py +++ b/homeassistant/components/solarlog/config_flow.py @@ -19,9 +19,9 @@ _LOGGER = logging.getLogger(__name__) @callback def solarlog_entries(hass: HomeAssistant): """Return the hosts already configured.""" - return set( + return { entry.data[CONF_HOST] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } class SolarLogConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index d76af1dc704b..33ca62655520 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -1109,7 +1109,7 @@ class SonosEntity(MediaPlayerDevice): entity.restore() # Find all affected players - entities = set(e for e in entities if e._soco_snapshot) + entities = {e for e in entities if e._soco_snapshot} if with_group: for entity in [e for e in entities if e._snapshot_group]: entities.update(entity._snapshot_group) diff --git a/homeassistant/components/tesla/config_flow.py b/homeassistant/components/tesla/config_flow.py index b8407653d1ba..f9a218d2f5fd 100644 --- a/homeassistant/components/tesla/config_flow.py +++ b/homeassistant/components/tesla/config_flow.py @@ -33,7 +33,7 @@ DATA_SCHEMA = vol.Schema( @callback def configured_instances(hass): """Return a set of configured Tesla instances.""" - return set(entry.title for entry in hass.config_entries.async_entries(DOMAIN)) + return {entry.title for entry in hass.config_entries.async_entries(DOMAIN)} class TeslaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/toon/config_flow.py b/homeassistant/components/toon/config_flow.py index ce4f347eaf2a..c8b4b5378533 100644 --- a/homeassistant/components/toon/config_flow.py +++ b/homeassistant/components/toon/config_flow.py @@ -31,9 +31,9 @@ _LOGGER = logging.getLogger(__name__) @callback def configured_displays(hass): """Return a set of configured Toon displays.""" - return set( + return { entry.data[CONF_DISPLAY] for entry in hass.config_entries.async_entries(DOMAIN) - ) + } @config_entries.HANDLERS.register(DOMAIN) diff --git a/homeassistant/components/velbus/config_flow.py b/homeassistant/components/velbus/config_flow.py index 1d081b711a8e..e85422d740a3 100644 --- a/homeassistant/components/velbus/config_flow.py +++ b/homeassistant/components/velbus/config_flow.py @@ -13,9 +13,9 @@ from .const import DOMAIN @callback def velbus_entries(hass: HomeAssistant): """Return connections for Velbus domain.""" - return set( + return { (entry.data[CONF_PORT]) for entry in hass.config_entries.async_entries(DOMAIN) - ) + } class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index 945bd3865c31..905baff895ff 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -870,11 +870,11 @@ class ConfigFlow(data_entry_flow.FlowHandler): def _async_current_ids(self, include_ignore: bool = True) -> Set[Optional[str]]: """Return current unique IDs.""" assert self.hass is not None - return set( + return { entry.unique_id for entry in self.hass.config_entries.async_entries(self.handler) if include_ignore or entry.source != SOURCE_IGNORE - ) + } @callback def _async_in_progress(self) -> List[Dict]: diff --git a/homeassistant/helpers/check_config.py b/homeassistant/helpers/check_config.py index 0beeb4da4e88..d876748e8d1f 100644 --- a/homeassistant/helpers/check_config.py +++ b/homeassistant/helpers/check_config.py @@ -107,7 +107,7 @@ async def async_check_ha_config_file(hass: HomeAssistant) -> HomeAssistantConfig core_config.pop(CONF_PACKAGES, None) # Filter out repeating config sections - components = set(key.split(" ")[0] for key in config.keys()) + components = {key.split(" ")[0] for key in config.keys()} # Process and validate config for domain in components: diff --git a/homeassistant/helpers/restore_state.py b/homeassistant/helpers/restore_state.py index d57d3ad99207..57da6960078b 100644 --- a/homeassistant/helpers/restore_state.py +++ b/homeassistant/helpers/restore_state.py @@ -123,11 +123,11 @@ class RestoreStateData: now = dt_util.utcnow() all_states = self.hass.states.async_all() # Entities currently backed by an entity object - current_entity_ids = set( + current_entity_ids = { state.entity_id for state in all_states if not state.attributes.get(entity_registry.ATTR_RESTORED) - ) + } # Start with the currently registered states stored_states = [ From 187b6525b4abff10b67c16bce7e9048996c964b8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 20:08:55 +0200 Subject: [PATCH 096/653] Removal of extraneous parenthesis (#33637) --- .../binary_sensor/device_condition.py | 18 ++++++++---------- .../components/binary_sensor/device_trigger.py | 18 ++++++++---------- .../device_automation/toggle_entity.py | 16 +++++++--------- homeassistant/components/history/__init__.py | 4 +--- homeassistant/components/knx/climate.py | 4 ++-- homeassistant/components/kodi/__init__.py | 4 +--- homeassistant/components/konnected/__init__.py | 16 ++++++---------- homeassistant/components/nextbus/sensor.py | 4 ++-- homeassistant/components/nmbs/sensor.py | 6 +++--- homeassistant/components/proxy/camera.py | 2 +- homeassistant/components/recorder/purge.py | 4 ++-- .../components/sensor/device_condition.py | 18 ++++++++---------- .../components/sensor/device_trigger.py | 18 ++++++++---------- homeassistant/components/skybeacon/sensor.py | 2 +- .../components/tomato/device_tracker.py | 5 +---- 15 files changed, 59 insertions(+), 80 deletions(-) diff --git a/homeassistant/components/binary_sensor/device_condition.py b/homeassistant/components/binary_sensor/device_condition.py index cb98ec90b5d6..e17869f6cfa6 100644 --- a/homeassistant/components/binary_sensor/device_condition.py +++ b/homeassistant/components/binary_sensor/device_condition.py @@ -217,16 +217,14 @@ async def async_get_conditions( ) conditions.extend( - ( - { - **template, - "condition": "device", - "device_id": device_id, - "entity_id": entry.entity_id, - "domain": DOMAIN, - } - for template in templates - ) + { + **template, + "condition": "device", + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": DOMAIN, + } + for template in templates ) return conditions diff --git a/homeassistant/components/binary_sensor/device_trigger.py b/homeassistant/components/binary_sensor/device_trigger.py index f4799828c688..e5e1f9061e6a 100644 --- a/homeassistant/components/binary_sensor/device_trigger.py +++ b/homeassistant/components/binary_sensor/device_trigger.py @@ -226,16 +226,14 @@ async def async_get_triggers(hass, device_id): ) triggers.extend( - ( - { - **automation, - "platform": "device", - "device_id": device_id, - "entity_id": entry.entity_id, - "domain": DOMAIN, - } - for automation in templates - ) + { + **automation, + "platform": "device", + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": DOMAIN, + } + for automation in templates ) return triggers diff --git a/homeassistant/components/device_automation/toggle_entity.py b/homeassistant/components/device_automation/toggle_entity.py index a2dcd62db8cc..e9a65f7bedd0 100644 --- a/homeassistant/components/device_automation/toggle_entity.py +++ b/homeassistant/components/device_automation/toggle_entity.py @@ -186,15 +186,13 @@ async def _async_get_automations( for entry in entries: automations.extend( - ( - { - **template, - "device_id": device_id, - "entity_id": entry.entity_id, - "domain": domain, - } - for template in automation_templates - ) + { + **template, + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": domain, + } + for template in automation_templates ) return automations diff --git a/homeassistant/components/history/__init__.py b/homeassistant/components/history/__init__.py index 7540740a7370..6fc68b2833e1 100644 --- a/homeassistant/components/history/__init__.py +++ b/homeassistant/components/history/__init__.py @@ -124,9 +124,7 @@ def get_last_state_changes(hass, number_of_states, entity_id): start_time = dt_util.utcnow() with session_scope(hass=hass) as session: - query = session.query(States).filter( - (States.last_changed == States.last_updated) - ) + query = session.query(States).filter(States.last_changed == States.last_updated) if entity_id is not None: query = query.filter_by(entity_id=entity_id.lower()) diff --git a/homeassistant/components/knx/climate.py b/homeassistant/components/knx/climate.py index 919a20d0e4c7..e6da946c81c3 100644 --- a/homeassistant/components/knx/climate.py +++ b/homeassistant/components/knx/climate.py @@ -66,7 +66,7 @@ OPERATION_MODES = { "Dry": HVAC_MODE_DRY, } -OPERATION_MODES_INV = dict((reversed(item) for item in OPERATION_MODES.items())) +OPERATION_MODES_INV = dict(reversed(item) for item in OPERATION_MODES.items()) PRESET_MODES = { # Map DPT 201.100 HVAC operating modes to HA presets @@ -76,7 +76,7 @@ PRESET_MODES = { "Comfort": PRESET_COMFORT, } -PRESET_MODES_INV = dict((reversed(item) for item in PRESET_MODES.items())) +PRESET_MODES_INV = dict(reversed(item) for item in PRESET_MODES.items()) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { diff --git a/homeassistant/components/kodi/__init__.py b/homeassistant/components/kodi/__init__.py index 1f2d3cb5cd09..9470c8bb2c82 100644 --- a/homeassistant/components/kodi/__init__.py +++ b/homeassistant/components/kodi/__init__.py @@ -46,9 +46,7 @@ SERVICE_TO_METHOD = { async def async_setup(hass, config): """Set up the Kodi integration.""" - if any( - ((CONF_PLATFORM, DOMAIN) in cfg.items() for cfg in config.get(MP_DOMAIN, [])) - ): + if any((CONF_PLATFORM, DOMAIN) in cfg.items() for cfg in config.get(MP_DOMAIN, [])): # Register the Kodi media_player services async def async_service_handler(service): """Map services to methods on MediaPlayerDevice.""" diff --git a/homeassistant/components/konnected/__init__.py b/homeassistant/components/konnected/__init__.py index e5185ff03bc9..8df6f7cead62 100644 --- a/homeassistant/components/konnected/__init__.py +++ b/homeassistant/components/konnected/__init__.py @@ -335,11 +335,9 @@ class KonnectedView(HomeAssistantView): payload = await request.json() except json.decoder.JSONDecodeError: _LOGGER.error( - ( - "Your Konnected device software may be out of " - "date. Visit https://help.konnected.io for " - "updating instructions." - ) + "Your Konnected device software may be out of " + "date. Visit https://help.konnected.io for " + "updating instructions." ) device = data[CONF_DEVICES].get(device_id) @@ -389,11 +387,9 @@ class KonnectedView(HomeAssistantView): request.query.get(CONF_ZONE) or PIN_TO_ZONE[request.query[CONF_PIN]] ) zone = next( - ( - switch - for switch in device[CONF_SWITCHES] - if switch[CONF_ZONE] == zone_num - ) + switch + for switch in device[CONF_SWITCHES] + if switch[CONF_ZONE] == zone_num ) except StopIteration: diff --git a/homeassistant/components/nextbus/sensor.py b/homeassistant/components/nextbus/sensor.py index 5909804ebd1a..2b5da2a97fac 100644 --- a/homeassistant/components/nextbus/sensor.py +++ b/homeassistant/components/nextbus/sensor.py @@ -201,13 +201,13 @@ class NextBusDepartureSensor(Entity): messages = listify(results.get("message", [])) self._log_debug("Messages: %s", messages) self._attributes["message"] = " -- ".join( - (message.get("text", "") for message in messages) + message.get("text", "") for message in messages ) # List out all directions in the attributes directions = listify(results.get("direction", [])) self._attributes["direction"] = ", ".join( - (direction.get("title", "") for direction in directions) + direction.get("title", "") for direction in directions ) # Chain all predictions together diff --git a/homeassistant/components/nmbs/sensor.py b/homeassistant/components/nmbs/sensor.py index dfa43c359529..c6dd7b963ff3 100644 --- a/homeassistant/components/nmbs/sensor.py +++ b/homeassistant/components/nmbs/sensor.py @@ -47,12 +47,12 @@ def get_time_until(departure_time=None): return 0 delta = dt_util.utc_from_timestamp(int(departure_time)) - dt_util.now() - return round((delta.total_seconds() / 60)) + return round(delta.total_seconds() / 60) def get_delay_in_minutes(delay=0): """Get the delay in minutes from a delay in seconds.""" - return round((int(delay) / 60)) + return round(int(delay) / 60) def get_ride_duration(departure_time, arrival_time, delay=0): @@ -60,7 +60,7 @@ def get_ride_duration(departure_time, arrival_time, delay=0): duration = dt_util.utc_from_timestamp( int(arrival_time) ) - dt_util.utc_from_timestamp(int(departure_time)) - duration_time = int(round((duration.total_seconds() / 60))) + duration_time = int(round(duration.total_seconds() / 60)) return duration_time + get_delay_in_minutes(delay) diff --git a/homeassistant/components/proxy/camera.py b/homeassistant/components/proxy/camera.py index 893fadfe178a..a2912ef0dbea 100644 --- a/homeassistant/components/proxy/camera.py +++ b/homeassistant/components/proxy/camera.py @@ -98,7 +98,7 @@ def _resize_image(image, opts): new_width = old_width scale = new_width / float(old_width) - new_height = int((float(old_height) * float(scale))) + new_height = int(float(old_height) * float(scale)) img = img.resize((new_width, new_height), Image.ANTIALIAS) imgbuf = io.BytesIO() diff --git a/homeassistant/components/recorder/purge.py b/homeassistant/components/recorder/purge.py index b4b1f612fac3..0c247c961267 100644 --- a/homeassistant/components/recorder/purge.py +++ b/homeassistant/components/recorder/purge.py @@ -21,14 +21,14 @@ def purge_old_data(instance, purge_days, repack): with session_scope(session=instance.get_session()) as session: deleted_rows = ( session.query(States) - .filter((States.last_updated < purge_before)) + .filter(States.last_updated < purge_before) .delete(synchronize_session=False) ) _LOGGER.debug("Deleted %s states", deleted_rows) deleted_rows = ( session.query(Events) - .filter((Events.time_fired < purge_before)) + .filter(Events.time_fired < purge_before) .delete(synchronize_session=False) ) _LOGGER.debug("Deleted %s events", deleted_rows) diff --git a/homeassistant/components/sensor/device_condition.py b/homeassistant/components/sensor/device_condition.py index bb0348eb6a73..3c4337c1dba8 100644 --- a/homeassistant/components/sensor/device_condition.py +++ b/homeassistant/components/sensor/device_condition.py @@ -113,16 +113,14 @@ async def async_get_conditions( ) conditions.extend( - ( - { - **template, - "condition": "device", - "device_id": device_id, - "entity_id": entry.entity_id, - "domain": DOMAIN, - } - for template in templates - ) + { + **template, + "condition": "device", + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": DOMAIN, + } + for template in templates ) return conditions diff --git a/homeassistant/components/sensor/device_trigger.py b/homeassistant/components/sensor/device_trigger.py index 1af8a5e4ab08..57c32da97e9a 100644 --- a/homeassistant/components/sensor/device_trigger.py +++ b/homeassistant/components/sensor/device_trigger.py @@ -129,16 +129,14 @@ async def async_get_triggers(hass, device_id): ) triggers.extend( - ( - { - **automation, - "platform": "device", - "device_id": device_id, - "entity_id": entry.entity_id, - "domain": DOMAIN, - } - for automation in templates - ) + { + **automation, + "platform": "device", + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": DOMAIN, + } + for automation in templates ) return triggers diff --git a/homeassistant/components/skybeacon/sensor.py b/homeassistant/components/skybeacon/sensor.py index 9bd02aec7c4f..d976e6e9408c 100644 --- a/homeassistant/components/skybeacon/sensor.py +++ b/homeassistant/components/skybeacon/sensor.py @@ -176,7 +176,7 @@ class Monitor(threading.Thread): value[2], value[1], ) - self.data["temp"] = float(("%d.%d" % (value[0], value[2]))) + self.data["temp"] = float("%d.%d" % (value[0], value[2])) self.data["humid"] = value[1] def terminate(self): diff --git a/homeassistant/components/tomato/device_tracker.py b/homeassistant/components/tomato/device_tracker.py index 5a5f1b1985b1..35db0671772d 100644 --- a/homeassistant/components/tomato/device_tracker.py +++ b/homeassistant/components/tomato/device_tracker.py @@ -113,10 +113,7 @@ class TomatoDeviceScanner(DeviceScanner): if response.status_code == 401: # Authentication error _LOGGER.exception( - ( - "Failed to authenticate, " - "please check your username and password" - ) + "Failed to authenticate, please check your username and password" ) return False From 71a47fc80c62f58e919059b8c02c0cfdd1fd210e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 20:10:55 +0200 Subject: [PATCH 097/653] Enable pylint global-statement (#33641) --- homeassistant/components/apcupsd/__init__.py | 2 +- .../components/aquostv/media_player.py | 2 +- homeassistant/components/arduino/__init__.py | 2 +- homeassistant/components/bloomsky/__init__.py | 2 +- homeassistant/components/mochad/__init__.py | 2 +- homeassistant/components/scsgate/__init__.py | 2 +- homeassistant/components/sleepiq/__init__.py | 2 +- homeassistant/components/verisure/__init__.py | 2 +- homeassistant/components/zigbee/__init__.py | 18 +++++++++--------- homeassistant/util/dt.py | 2 +- homeassistant/util/yaml/loader.py | 2 +- pylintrc | 1 - 12 files changed, 19 insertions(+), 20 deletions(-) diff --git a/homeassistant/components/apcupsd/__init__.py b/homeassistant/components/apcupsd/__init__.py index 01f741651900..1f99d5410ec9 100644 --- a/homeassistant/components/apcupsd/__init__.py +++ b/homeassistant/components/apcupsd/__init__.py @@ -39,7 +39,7 @@ CONFIG_SCHEMA = vol.Schema( def setup(hass, config): """Use config values to set up a function enabling status retrieval.""" - global DATA + global DATA # pylint: disable=global-statement conf = config[DOMAIN] host = conf.get(CONF_HOST) port = conf.get(CONF_PORT) diff --git a/homeassistant/components/aquostv/media_player.py b/homeassistant/components/aquostv/media_player.py index f71f41dc2939..5cd13aa3b0e5 100644 --- a/homeassistant/components/aquostv/media_player.py +++ b/homeassistant/components/aquostv/media_player.py @@ -126,7 +126,7 @@ class SharpAquosTVDevice(MediaPlayerDevice): def __init__(self, name, remote, power_on_enabled=False): """Initialize the aquos device.""" - global SUPPORT_SHARPTV + global SUPPORT_SHARPTV # pylint: disable=global-statement self._power_on_enabled = power_on_enabled if self._power_on_enabled: SUPPORT_SHARPTV = SUPPORT_SHARPTV | SUPPORT_TURN_ON diff --git a/homeassistant/components/arduino/__init__.py b/homeassistant/components/arduino/__init__.py index 61b03a3160de..76b8c663c94f 100644 --- a/homeassistant/components/arduino/__init__.py +++ b/homeassistant/components/arduino/__init__.py @@ -28,7 +28,7 @@ def setup(hass, config): port = config[DOMAIN][CONF_PORT] - global BOARD + global BOARD # pylint: disable=global-statement try: BOARD = ArduinoBoard(port) except (serial.serialutil.SerialException, FileNotFoundError): diff --git a/homeassistant/components/bloomsky/__init__.py b/homeassistant/components/bloomsky/__init__.py index 6373471fe7a6..5b21a2a62f06 100644 --- a/homeassistant/components/bloomsky/__init__.py +++ b/homeassistant/components/bloomsky/__init__.py @@ -31,7 +31,7 @@ def setup(hass, config): """Set up the BloomSky component.""" api_key = config[DOMAIN][CONF_API_KEY] - global BLOOMSKY + global BLOOMSKY # pylint: disable=global-statement try: BLOOMSKY = BloomSky(api_key, hass.config.units.is_metric) except RuntimeError: diff --git a/homeassistant/components/mochad/__init__.py b/homeassistant/components/mochad/__init__.py index 683681b50a09..50156b2b4b3f 100644 --- a/homeassistant/components/mochad/__init__.py +++ b/homeassistant/components/mochad/__init__.py @@ -42,7 +42,7 @@ def setup(hass, config): host = conf.get(CONF_HOST) port = conf.get(CONF_PORT) - global CONTROLLER + global CONTROLLER # pylint: disable=global-statement try: CONTROLLER = MochadCtrl(host, port) except exceptions.ConfigurationError: diff --git a/homeassistant/components/scsgate/__init__.py b/homeassistant/components/scsgate/__init__.py index 21e3608a51b5..b32b91e56257 100644 --- a/homeassistant/components/scsgate/__init__.py +++ b/homeassistant/components/scsgate/__init__.py @@ -34,7 +34,7 @@ SCSGATE_SCHEMA = vol.Schema( def setup(hass, config): """Set up the SCSGate component.""" device = config[DOMAIN][CONF_DEVICE] - global SCSGATE + global SCSGATE # pylint: disable=global-statement try: SCSGATE = SCSGate(device=device, logger=_LOGGER) diff --git a/homeassistant/components/sleepiq/__init__.py b/homeassistant/components/sleepiq/__init__.py index 2b4d9d010a3a..3399fcb43c55 100644 --- a/homeassistant/components/sleepiq/__init__.py +++ b/homeassistant/components/sleepiq/__init__.py @@ -46,7 +46,7 @@ def setup(hass, config): Will automatically load sensor components to support devices discovered on the account. """ - global DATA + global DATA # pylint: disable=global-statement username = config[DOMAIN][CONF_USERNAME] password = config[DOMAIN][CONF_PASSWORD] diff --git a/homeassistant/components/verisure/__init__.py b/homeassistant/components/verisure/__init__.py index 32735bf06c13..757e299792ac 100644 --- a/homeassistant/components/verisure/__init__.py +++ b/homeassistant/components/verisure/__init__.py @@ -75,7 +75,7 @@ DEVICE_SERIAL_SCHEMA = vol.Schema({vol.Required(ATTR_DEVICE_SERIAL): cv.string}) def setup(hass, config): """Set up the Verisure component.""" - global HUB + global HUB # pylint: disable=global-statement HUB = VerisureHub(config[DOMAIN]) HUB.update_overview = Throttle(config[DOMAIN][CONF_SCAN_INTERVAL])( HUB.update_overview diff --git a/homeassistant/components/zigbee/__init__.py b/homeassistant/components/zigbee/__init__.py index 48c96b7591fa..fd9b42398fea 100644 --- a/homeassistant/components/zigbee/__init__.py +++ b/homeassistant/components/zigbee/__init__.py @@ -71,15 +71,15 @@ PLATFORM_SCHEMA = vol.Schema( def setup(hass, config): """Set up the connection to the Zigbee device.""" - global DEVICE - global GPIO_DIGITAL_OUTPUT_LOW - global GPIO_DIGITAL_OUTPUT_HIGH - global ADC_PERCENTAGE - global DIGITAL_PINS - global ANALOG_PINS - global CONVERT_ADC - global ZIGBEE_EXCEPTION - global ZIGBEE_TX_FAILURE + global DEVICE # pylint: disable=global-statement + global GPIO_DIGITAL_OUTPUT_LOW # pylint: disable=global-statement + global GPIO_DIGITAL_OUTPUT_HIGH # pylint: disable=global-statement + global ADC_PERCENTAGE # pylint: disable=global-statement + global DIGITAL_PINS # pylint: disable=global-statement + global ANALOG_PINS # pylint: disable=global-statement + global CONVERT_ADC # pylint: disable=global-statement + global ZIGBEE_EXCEPTION # pylint: disable=global-statement + global ZIGBEE_TX_FAILURE # pylint: disable=global-statement GPIO_DIGITAL_OUTPUT_LOW = xb_const.GPIO_DIGITAL_OUTPUT_LOW GPIO_DIGITAL_OUTPUT_HIGH = xb_const.GPIO_DIGITAL_OUTPUT_HIGH diff --git a/homeassistant/util/dt.py b/homeassistant/util/dt.py index 084888c188cb..8efad848e87f 100644 --- a/homeassistant/util/dt.py +++ b/homeassistant/util/dt.py @@ -31,7 +31,7 @@ def set_default_time_zone(time_zone: dt.tzinfo) -> None: Async friendly. """ - global DEFAULT_TIME_ZONE + global DEFAULT_TIME_ZONE # pylint: disable=global-statement # NOTE: Remove in the future in favour of typing assert isinstance(time_zone, dt.tzinfo) diff --git a/homeassistant/util/yaml/loader.py b/homeassistant/util/yaml/loader.py index ba4d1e775763..3727a156b974 100644 --- a/homeassistant/util/yaml/loader.py +++ b/homeassistant/util/yaml/loader.py @@ -295,7 +295,7 @@ def secret_yaml(loader: SafeLineLoader, node: yaml.nodes.Node) -> JSON_TYPE: _LOGGER.debug("Secret %s retrieved from keyring", node.value) return pwd - global credstash # pylint: disable=invalid-name + global credstash # pylint: disable=invalid-name, global-statement if credstash: # pylint: disable=no-member diff --git a/pylintrc b/pylintrc index bb51444447a0..1b08c40793ad 100644 --- a/pylintrc +++ b/pylintrc @@ -34,7 +34,6 @@ disable= abstract-method, cyclic-import, duplicate-code, - global-statement, inconsistent-return-statements, locally-disabled, not-context-manager, From ed71683488ea9ab92bfdea920f3649229e19167d Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 20:17:11 +0200 Subject: [PATCH 098/653] Improve string formatting (#33643) --- .../components/google_assistant/const.py | 36 +++++----- .../components/google_assistant/trait.py | 66 +++++++++---------- .../components/joaoapps_join/__init__.py | 14 ++-- .../components/nissan_leaf/sensor.py | 6 +- script/hassfest/codeowners.py | 2 +- script/hassfest/config_flow.py | 2 +- script/hassfest/ssdp.py | 2 +- script/hassfest/zeroconf.py | 2 +- setup.py | 14 ++-- tests/components/withings/common.py | 8 +-- 10 files changed, 76 insertions(+), 76 deletions(-) diff --git a/homeassistant/components/google_assistant/const.py b/homeassistant/components/google_assistant/const.py index c9f8d857b624..37fef6f2d794 100644 --- a/homeassistant/components/google_assistant/const.py +++ b/homeassistant/components/google_assistant/const.py @@ -57,29 +57,29 @@ DEFAULT_EXPOSED_DOMAINS = [ ] PREFIX_TYPES = "action.devices.types." -TYPE_CAMERA = PREFIX_TYPES + "CAMERA" -TYPE_LIGHT = PREFIX_TYPES + "LIGHT" -TYPE_SWITCH = PREFIX_TYPES + "SWITCH" -TYPE_VACUUM = PREFIX_TYPES + "VACUUM" -TYPE_SCENE = PREFIX_TYPES + "SCENE" -TYPE_FAN = PREFIX_TYPES + "FAN" -TYPE_THERMOSTAT = PREFIX_TYPES + "THERMOSTAT" -TYPE_LOCK = PREFIX_TYPES + "LOCK" -TYPE_BLINDS = PREFIX_TYPES + "BLINDS" -TYPE_GARAGE = PREFIX_TYPES + "GARAGE" -TYPE_OUTLET = PREFIX_TYPES + "OUTLET" -TYPE_SENSOR = PREFIX_TYPES + "SENSOR" -TYPE_DOOR = PREFIX_TYPES + "DOOR" -TYPE_TV = PREFIX_TYPES + "TV" -TYPE_SPEAKER = PREFIX_TYPES + "SPEAKER" -TYPE_ALARM = PREFIX_TYPES + "SECURITYSYSTEM" +TYPE_CAMERA = f"{PREFIX_TYPES}CAMERA" +TYPE_LIGHT = f"{PREFIX_TYPES}LIGHT" +TYPE_SWITCH = f"{PREFIX_TYPES}SWITCH" +TYPE_VACUUM = f"{PREFIX_TYPES}VACUUM" +TYPE_SCENE = f"{PREFIX_TYPES}SCENE" +TYPE_FAN = f"{PREFIX_TYPES}FAN" +TYPE_THERMOSTAT = f"{PREFIX_TYPES}THERMOSTAT" +TYPE_LOCK = f"{PREFIX_TYPES}LOCK" +TYPE_BLINDS = f"{PREFIX_TYPES}BLINDS" +TYPE_GARAGE = f"{PREFIX_TYPES}GARAGE" +TYPE_OUTLET = f"{PREFIX_TYPES}OUTLET" +TYPE_SENSOR = f"{PREFIX_TYPES}SENSOR" +TYPE_DOOR = f"{PREFIX_TYPES}DOOR" +TYPE_TV = f"{PREFIX_TYPES}TV" +TYPE_SPEAKER = f"{PREFIX_TYPES}SPEAKER" +TYPE_ALARM = f"{PREFIX_TYPES}SECURITYSYSTEM" SERVICE_REQUEST_SYNC = "request_sync" HOMEGRAPH_URL = "https://homegraph.googleapis.com/" HOMEGRAPH_SCOPE = "https://www.googleapis.com/auth/homegraph" HOMEGRAPH_TOKEN_URL = "https://accounts.google.com/o/oauth2/token" -REQUEST_SYNC_BASE_URL = HOMEGRAPH_URL + "v1/devices:requestSync" -REPORT_STATE_BASE_URL = HOMEGRAPH_URL + "v1/devices:reportStateAndNotification" +REQUEST_SYNC_BASE_URL = f"{HOMEGRAPH_URL}v1/devices:requestSync" +REPORT_STATE_BASE_URL = f"{HOMEGRAPH_URL}v1/devices:reportStateAndNotification" # Error codes used for SmartHomeError class # https://developers.google.com/actions/reference/smarthome/errors-exceptions diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index 2bc5f5040d41..ab0458962355 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -68,45 +68,45 @@ from .error import ChallengeNeeded, SmartHomeError _LOGGER = logging.getLogger(__name__) PREFIX_TRAITS = "action.devices.traits." -TRAIT_CAMERA_STREAM = PREFIX_TRAITS + "CameraStream" -TRAIT_ONOFF = PREFIX_TRAITS + "OnOff" -TRAIT_DOCK = PREFIX_TRAITS + "Dock" -TRAIT_STARTSTOP = PREFIX_TRAITS + "StartStop" -TRAIT_BRIGHTNESS = PREFIX_TRAITS + "Brightness" -TRAIT_COLOR_SETTING = PREFIX_TRAITS + "ColorSetting" -TRAIT_SCENE = PREFIX_TRAITS + "Scene" -TRAIT_TEMPERATURE_SETTING = PREFIX_TRAITS + "TemperatureSetting" -TRAIT_LOCKUNLOCK = PREFIX_TRAITS + "LockUnlock" -TRAIT_FANSPEED = PREFIX_TRAITS + "FanSpeed" -TRAIT_MODES = PREFIX_TRAITS + "Modes" -TRAIT_OPENCLOSE = PREFIX_TRAITS + "OpenClose" -TRAIT_VOLUME = PREFIX_TRAITS + "Volume" -TRAIT_ARMDISARM = PREFIX_TRAITS + "ArmDisarm" -TRAIT_HUMIDITY_SETTING = PREFIX_TRAITS + "HumiditySetting" +TRAIT_CAMERA_STREAM = f"{PREFIX_TRAITS}CameraStream" +TRAIT_ONOFF = f"{PREFIX_TRAITS}OnOff" +TRAIT_DOCK = f"{PREFIX_TRAITS}Dock" +TRAIT_STARTSTOP = f"{PREFIX_TRAITS}StartStop" +TRAIT_BRIGHTNESS = f"{PREFIX_TRAITS}Brightness" +TRAIT_COLOR_SETTING = f"{PREFIX_TRAITS}ColorSetting" +TRAIT_SCENE = f"{PREFIX_TRAITS}Scene" +TRAIT_TEMPERATURE_SETTING = f"{PREFIX_TRAITS}TemperatureSetting" +TRAIT_LOCKUNLOCK = f"{PREFIX_TRAITS}LockUnlock" +TRAIT_FANSPEED = f"{PREFIX_TRAITS}FanSpeed" +TRAIT_MODES = f"{PREFIX_TRAITS}Modes" +TRAIT_OPENCLOSE = f"{PREFIX_TRAITS}OpenClose" +TRAIT_VOLUME = f"{PREFIX_TRAITS}Volume" +TRAIT_ARMDISARM = f"{PREFIX_TRAITS}ArmDisarm" +TRAIT_HUMIDITY_SETTING = f"{PREFIX_TRAITS}HumiditySetting" PREFIX_COMMANDS = "action.devices.commands." -COMMAND_ONOFF = PREFIX_COMMANDS + "OnOff" -COMMAND_GET_CAMERA_STREAM = PREFIX_COMMANDS + "GetCameraStream" -COMMAND_DOCK = PREFIX_COMMANDS + "Dock" -COMMAND_STARTSTOP = PREFIX_COMMANDS + "StartStop" -COMMAND_PAUSEUNPAUSE = PREFIX_COMMANDS + "PauseUnpause" -COMMAND_BRIGHTNESS_ABSOLUTE = PREFIX_COMMANDS + "BrightnessAbsolute" -COMMAND_COLOR_ABSOLUTE = PREFIX_COMMANDS + "ColorAbsolute" -COMMAND_ACTIVATE_SCENE = PREFIX_COMMANDS + "ActivateScene" +COMMAND_ONOFF = f"{PREFIX_COMMANDS}OnOff" +COMMAND_GET_CAMERA_STREAM = f"{PREFIX_COMMANDS}GetCameraStream" +COMMAND_DOCK = f"{PREFIX_COMMANDS}Dock" +COMMAND_STARTSTOP = f"{PREFIX_COMMANDS}StartStop" +COMMAND_PAUSEUNPAUSE = f"{PREFIX_COMMANDS}PauseUnpause" +COMMAND_BRIGHTNESS_ABSOLUTE = f"{PREFIX_COMMANDS}BrightnessAbsolute" +COMMAND_COLOR_ABSOLUTE = f"{PREFIX_COMMANDS}ColorAbsolute" +COMMAND_ACTIVATE_SCENE = f"{PREFIX_COMMANDS}ActivateScene" COMMAND_THERMOSTAT_TEMPERATURE_SETPOINT = ( - PREFIX_COMMANDS + "ThermostatTemperatureSetpoint" + f"{PREFIX_COMMANDS}ThermostatTemperatureSetpoint" ) COMMAND_THERMOSTAT_TEMPERATURE_SET_RANGE = ( - PREFIX_COMMANDS + "ThermostatTemperatureSetRange" + f"{PREFIX_COMMANDS}ThermostatTemperatureSetRange" ) -COMMAND_THERMOSTAT_SET_MODE = PREFIX_COMMANDS + "ThermostatSetMode" -COMMAND_LOCKUNLOCK = PREFIX_COMMANDS + "LockUnlock" -COMMAND_FANSPEED = PREFIX_COMMANDS + "SetFanSpeed" -COMMAND_MODES = PREFIX_COMMANDS + "SetModes" -COMMAND_OPENCLOSE = PREFIX_COMMANDS + "OpenClose" -COMMAND_SET_VOLUME = PREFIX_COMMANDS + "setVolume" -COMMAND_VOLUME_RELATIVE = PREFIX_COMMANDS + "volumeRelative" -COMMAND_ARMDISARM = PREFIX_COMMANDS + "ArmDisarm" +COMMAND_THERMOSTAT_SET_MODE = f"{PREFIX_COMMANDS}ThermostatSetMode" +COMMAND_LOCKUNLOCK = f"{PREFIX_COMMANDS}LockUnlock" +COMMAND_FANSPEED = f"{PREFIX_COMMANDS}SetFanSpeed" +COMMAND_MODES = f"{PREFIX_COMMANDS}SetModes" +COMMAND_OPENCLOSE = f"{PREFIX_COMMANDS}OpenClose" +COMMAND_SET_VOLUME = f"{PREFIX_COMMANDS}setVolume" +COMMAND_VOLUME_RELATIVE = f"{PREFIX_COMMANDS}volumeRelative" +COMMAND_ARMDISARM = f"{PREFIX_COMMANDS}ArmDisarm" TRAITS = [] diff --git a/homeassistant/components/joaoapps_join/__init__.py b/homeassistant/components/joaoapps_join/__init__.py index 10cbcf6b5c06..1bc4ae298c47 100644 --- a/homeassistant/components/joaoapps_join/__init__.py +++ b/homeassistant/components/joaoapps_join/__init__.py @@ -105,12 +105,12 @@ def register_device(hass, api_key, name, device_id, device_ids, device_names): api_key=api_key, ) - hass.services.register(DOMAIN, name + "ring", ring_service) - hass.services.register(DOMAIN, name + "set_wallpaper", set_wallpaper_service) - hass.services.register(DOMAIN, name + "send_sms", send_sms_service) - hass.services.register(DOMAIN, name + "send_file", send_file_service) - hass.services.register(DOMAIN, name + "send_url", send_url_service) - hass.services.register(DOMAIN, name + "send_tasker", send_tasker_service) + hass.services.register(DOMAIN, f"{name}ring", ring_service) + hass.services.register(DOMAIN, f"{name}set_wallpaper", set_wallpaper_service) + hass.services.register(DOMAIN, f"{name}send_sms", send_sms_service) + hass.services.register(DOMAIN, f"{name}send_file", send_file_service) + hass.services.register(DOMAIN, f"{name}send_url", send_url_service) + hass.services.register(DOMAIN, f"{name}send_tasker", send_tasker_service) def setup(hass, config): @@ -122,7 +122,7 @@ def setup(hass, config): device_ids = device.get(CONF_DEVICE_IDS) device_names = device.get(CONF_DEVICE_NAMES) name = device.get(CONF_NAME) - name = name.lower().replace(" ", "_") + "_" if name else "" + name = f"{name.lower().replace(' ', '_')}_" if name else "" if api_key: if not get_devices(api_key): _LOGGER.error("Error connecting to Join, check API key") diff --git a/homeassistant/components/nissan_leaf/sensor.py b/homeassistant/components/nissan_leaf/sensor.py index 33b0efa5d607..3565fb303d54 100644 --- a/homeassistant/components/nissan_leaf/sensor.py +++ b/homeassistant/components/nissan_leaf/sensor.py @@ -41,7 +41,7 @@ class LeafBatterySensor(LeafEntity): @property def name(self): """Sensor Name.""" - return self.car.leaf.nickname + " Charge" + return f"{self.car.leaf.nickname} Charge" @property def device_class(self): @@ -77,8 +77,8 @@ class LeafRangeSensor(LeafEntity): def name(self): """Update sensor name depending on AC.""" if self._ac_on is True: - return self.car.leaf.nickname + " Range (AC)" - return self.car.leaf.nickname + " Range" + return f"{self.car.leaf.nickname} Range (AC)" + return f"{self.car.leaf.nickname} Range" def log_registration(self): """Log registration.""" diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index cfbd112100ab..0a653ea0e90a 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -76,4 +76,4 @@ def generate(integrations: Dict[str, Integration], config: Config): """Generate CODEOWNERS.""" codeowners_path = config.root / "CODEOWNERS" with open(str(codeowners_path), "w") as fp: - fp.write(config.cache["codeowners"] + "\n") + fp.write(f"{config.cache['codeowners']}\n") diff --git a/script/hassfest/config_flow.py b/script/hassfest/config_flow.py index 83d495e1bf2b..5a6f0798c51d 100644 --- a/script/hassfest/config_flow.py +++ b/script/hassfest/config_flow.py @@ -83,4 +83,4 @@ def generate(integrations: Dict[str, Integration], config: Config): """Generate config flow file.""" config_flow_path = config.root / "homeassistant/generated/config_flows.py" with open(str(config_flow_path), "w") as fp: - fp.write(config.cache["config_flow"] + "\n") + fp.write(f"{config.cache['config_flow']}\n") diff --git a/script/hassfest/ssdp.py b/script/hassfest/ssdp.py index a32e07f4aac4..28701f2b0156 100644 --- a/script/hassfest/ssdp.py +++ b/script/hassfest/ssdp.py @@ -79,4 +79,4 @@ def generate(integrations: Dict[str, Integration], config: Config): """Generate ssdp file.""" ssdp_path = config.root / "homeassistant/generated/ssdp.py" with open(str(ssdp_path), "w") as fp: - fp.write(config.cache["ssdp"] + "\n") + fp.write(f"{config.cache['ssdp']}\n") diff --git a/script/hassfest/zeroconf.py b/script/hassfest/zeroconf.py index 7e1b7eae727e..377115f7ae45 100644 --- a/script/hassfest/zeroconf.py +++ b/script/hassfest/zeroconf.py @@ -135,4 +135,4 @@ def generate(integrations: Dict[str, Integration], config: Config): """Generate zeroconf file.""" zeroconf_path = config.root / "homeassistant/generated/zeroconf.py" with open(str(zeroconf_path), "w") as fp: - fp.write(config.cache["zeroconf"] + "\n") + fp.write(f"{config.cache['zeroconf']}\n") diff --git a/setup.py b/setup.py index 89205d4ee8ae..f53af0ee1f3b 100755 --- a/setup.py +++ b/setup.py @@ -10,20 +10,20 @@ PROJECT_NAME = "Home Assistant" PROJECT_PACKAGE_NAME = "homeassistant" PROJECT_LICENSE = "Apache License 2.0" PROJECT_AUTHOR = "The Home Assistant Authors" -PROJECT_COPYRIGHT = " 2013-{}, {}".format(dt.now().year, PROJECT_AUTHOR) +PROJECT_COPYRIGHT = f" 2013-{dt.now().year}, {PROJECT_AUTHOR}" PROJECT_URL = "https://www.home-assistant.io/" PROJECT_EMAIL = "hello@home-assistant.io" PROJECT_GITHUB_USERNAME = "home-assistant" PROJECT_GITHUB_REPOSITORY = "core" -PYPI_URL = "https://pypi.python.org/pypi/{}".format(PROJECT_PACKAGE_NAME) -GITHUB_PATH = "{}/{}".format(PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY) -GITHUB_URL = "https://github.com/{}".format(GITHUB_PATH) +PYPI_URL = f"https://pypi.python.org/pypi/{PROJECT_PACKAGE_NAME}" +GITHUB_PATH = f"{PROJECT_GITHUB_USERNAME}/{PROJECT_GITHUB_REPOSITORY}" +GITHUB_URL = f"https://github.com/{GITHUB_PATH}" -DOWNLOAD_URL = "{}/archive/{}.zip".format(GITHUB_URL, hass_const.__version__) +DOWNLOAD_URL = f"{GITHUB_URL}/archive/{hass_const.__version__}.zip" PROJECT_URLS = { - "Bug Reports": "{}/issues".format(GITHUB_URL), + "Bug Reports": f"{GITHUB_URL}/issues", "Dev Docs": "https://developers.home-assistant.io/", "Discord": "https://discordapp.com/invite/c5DvZ4e", "Forum": "https://community.home-assistant.io/", @@ -68,7 +68,7 @@ setup( include_package_data=True, zip_safe=False, install_requires=REQUIRES, - python_requires=">={}".format(MIN_PY_VERSION), + python_requires=f">={MIN_PY_VERSION}", test_suite="tests", entry_points={"console_scripts": ["hass = homeassistant.__main__:main"]}, ) diff --git a/tests/components/withings/common.py b/tests/components/withings/common.py index 8b7d4ba91a69..f57b2d9b0c8e 100644 --- a/tests/components/withings/common.py +++ b/tests/components/withings/common.py @@ -86,27 +86,27 @@ async def configure_integration( with requests_mock.mock() as rqmck: rqmck.get( - re.compile(AbstractWithingsApi.URL + "/v2/user?.*action=getdevice(&.*|$)"), + re.compile(f"{AbstractWithingsApi.URL}/v2/user?.*action=getdevice(&.*|$)"), status_code=200, json=get_device_response, ) rqmck.get( - re.compile(AbstractWithingsApi.URL + "/v2/sleep?.*action=get(&.*|$)"), + re.compile(f"{AbstractWithingsApi.URL}/v2/sleep?.*action=get(&.*|$)"), status_code=200, json=get_sleep_response, ) rqmck.get( re.compile( - AbstractWithingsApi.URL + "/v2/sleep?.*action=getsummary(&.*|$)" + f"{AbstractWithingsApi.URL}/v2/sleep?.*action=getsummary(&.*|$)" ), status_code=200, json=get_sleep_summary_response, ) rqmck.get( - re.compile(AbstractWithingsApi.URL + "/measure?.*action=getmeas(&.*|$)"), + re.compile(f"{AbstractWithingsApi.URL}/measure?.*action=getmeas(&.*|$)"), status_code=200, json=getmeasures_response, ) From 886308a95380a9c32f6db513e45dfe6287178ebb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 21:39:22 +0200 Subject: [PATCH 099/653] String formatting improvements (#33653) --- homeassistant/components/calendar/__init__.py | 4 ++-- homeassistant/components/nsw_fuel_station/sensor.py | 2 +- homeassistant/components/ohmconnect/sensor.py | 2 +- homeassistant/components/osramlightify/light.py | 2 +- homeassistant/components/plugwise/climate.py | 2 +- homeassistant/components/point/__init__.py | 2 +- homeassistant/components/rainbird/switch.py | 5 +---- homeassistant/components/splunk/__init__.py | 4 ++-- homeassistant/components/tellstick/sensor.py | 6 +++--- homeassistant/components/tensorflow/image_processing.py | 2 +- homeassistant/components/tibber/sensor.py | 4 ++-- homeassistant/components/tuya/__init__.py | 2 +- homeassistant/components/wink/__init__.py | 2 +- homeassistant/components/wirelesstag/__init__.py | 4 ++-- homeassistant/scripts/keyring.py | 2 +- 15 files changed, 21 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index 53edf48ae807..6a03d899a095 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -86,7 +86,7 @@ def calculate_offset(event, offset): summary = event.get("summary", "") # check if we have an offset tag in the message # time is HH:MM or MM - reg = "{}([+-]?[0-9]{{0,2}}(:[0-9]{{0,2}})?)".format(offset) + reg = f"{offset}([+-]?[0-9]{{0,2}}(:[0-9]{{0,2}})?)" search = re.search(reg, summary) if search and search.group(1): time = search.group(1) @@ -94,7 +94,7 @@ def calculate_offset(event, offset): if time[0] == "+" or time[0] == "-": time = "{}0:{}".format(time[0], time[1:]) else: - time = "0:{}".format(time) + time = f"0:{time}" offset_time = time_period_str(time) summary = (summary[: search.start()] + summary[search.end() :]).strip() diff --git a/homeassistant/components/nsw_fuel_station/sensor.py b/homeassistant/components/nsw_fuel_station/sensor.py index b4cd7bd161ed..5e9a9835bf49 100644 --- a/homeassistant/components/nsw_fuel_station/sensor.py +++ b/homeassistant/components/nsw_fuel_station/sensor.py @@ -156,7 +156,7 @@ class StationPriceSensor(Entity): @property def name(self) -> str: """Return the name of the sensor.""" - return "{} {}".format(self._station_data.get_station_name(), self._fuel_type) + return f"{self._station_data.get_station_name()} {self._fuel_type}" @property def state(self) -> Optional[float]: diff --git a/homeassistant/components/ohmconnect/sensor.py b/homeassistant/components/ohmconnect/sensor.py index 490ebbe75b30..56a3cc065566 100644 --- a/homeassistant/components/ohmconnect/sensor.py +++ b/homeassistant/components/ohmconnect/sensor.py @@ -66,7 +66,7 @@ class OhmconnectSensor(Entity): def update(self): """Get the latest data from OhmConnect.""" try: - url = "https://login.ohmconnect.com/verify-ohm-hour/{}".format(self._ohmid) + url = f"https://login.ohmconnect.com/verify-ohm-hour/{self._ohmid}" response = requests.get(url, timeout=10) root = ET.fromstring(response.text) diff --git a/homeassistant/components/osramlightify/light.py b/homeassistant/components/osramlightify/light.py index 05064861844a..3a911fbcf958 100644 --- a/homeassistant/components/osramlightify/light.py +++ b/homeassistant/components/osramlightify/light.py @@ -404,7 +404,7 @@ class OsramLightifyGroup(Luminary): # It should be something like "-" # For now keeping it as is for backward compatibility with existing # users. - return "{}".format(self._luminary.lights()) + return f"{self._luminary.lights()}" def _get_supported_features(self): """Get list of supported features.""" diff --git a/homeassistant/components/plugwise/climate.py b/homeassistant/components/plugwise/climate.py index 9b519f969e02..aef1dd78197a 100644 --- a/homeassistant/components/plugwise/climate.py +++ b/homeassistant/components/plugwise/climate.py @@ -209,7 +209,7 @@ class ThermostatDevice(ClimateDevice): preset_temperature = presets.get(self._preset_mode, "none") if self.hvac_mode == HVAC_MODE_AUTO: if self._thermostat_temperature == self._schedule_temperature: - return "{}".format(self._selected_schema) + return f"{self._selected_schema}" if self._thermostat_temperature == preset_temperature: return self._preset_mode return "Temporary" diff --git a/homeassistant/components/point/__init__.py b/homeassistant/components/point/__init__.py index 2817871cd7ce..bb591b79884d 100644 --- a/homeassistant/components/point/__init__.py +++ b/homeassistant/components/point/__init__.py @@ -319,7 +319,7 @@ class MinutPointEntity(Entity): @property def name(self): """Return the display name of this device.""" - return "{} {}".format(self._name, self.device_class.capitalize()) + return f"{self._name} {self.device_class.capitalize()}" @property def is_updated(self): diff --git a/homeassistant/components/rainbird/switch.py b/homeassistant/components/rainbird/switch.py index cb4ac83090f1..7f589401e3cd 100644 --- a/homeassistant/components/rainbird/switch.py +++ b/homeassistant/components/rainbird/switch.py @@ -45,10 +45,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): name = zone_config.get(CONF_FRIENDLY_NAME) devices.append( RainBirdSwitch( - controller, - zone, - time, - name if name else "Sprinkler {}".format(zone), + controller, zone, time, name if name else f"Sprinkler {zone}", ) ) diff --git a/homeassistant/components/splunk/__init__.py b/homeassistant/components/splunk/__init__.py index 1d5d39416a3f..5b26d9b1c6f3 100644 --- a/homeassistant/components/splunk/__init__.py +++ b/homeassistant/components/splunk/__init__.py @@ -80,8 +80,8 @@ def setup(hass, config): else: uri_scheme = "http://" - event_collector = "{}{}:{}/services/collector/event".format(uri_scheme, host, port) - headers = {AUTHORIZATION: "Splunk {}".format(token)} + event_collector = f"{uri_scheme}{host}:{port}/services/collector/event" + headers = {AUTHORIZATION: f"Splunk {token}"} def splunk_event_listener(event): """Listen for new messages on the bus and sends them to Splunk.""" diff --git a/homeassistant/components/tellstick/sensor.py b/homeassistant/components/tellstick/sensor.py index 4a3ff75b864d..93c510e2fa19 100644 --- a/homeassistant/components/tellstick/sensor.py +++ b/homeassistant/components/tellstick/sensor.py @@ -93,9 +93,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): id_ = named_sensor[CONF_ID] if proto is not None: if model is not None: - named_sensors["{}{}{}".format(proto, model, id_)] = name + named_sensors[f"{proto}{model}{id_}"] = name else: - named_sensors["{}{}".format(proto, id_)] = name + named_sensors[f"{proto}{id_}"] = name else: named_sensors[id_] = name @@ -103,7 +103,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if not config[CONF_ONLY_NAMED]: sensor_name = str(tellcore_sensor.id) else: - proto_id = "{}{}".format(tellcore_sensor.protocol, tellcore_sensor.id) + proto_id = f"{tellcore_sensor.protocol}{tellcore_sensor.id}" proto_model_id = "{}{}{}".format( tellcore_sensor.protocol, tellcore_sensor.model, tellcore_sensor.id ) diff --git a/homeassistant/components/tensorflow/image_processing.py b/homeassistant/components/tensorflow/image_processing.py index b003fef56c0a..f4eb5342c465 100644 --- a/homeassistant/components/tensorflow/image_processing.py +++ b/homeassistant/components/tensorflow/image_processing.py @@ -258,7 +258,7 @@ class TensorFlowImageProcessor(ImageProcessingEntity): 1, 1, ]: - label = "{} Detection Area".format(category.capitalize()) + label = f"{category.capitalize()} Detection Area" draw_box( draw, self._category_areas[category], diff --git a/homeassistant/components/tibber/sensor.py b/homeassistant/components/tibber/sensor.py index 9e95f3cc05b1..054fad3246a6 100644 --- a/homeassistant/components/tibber/sensor.py +++ b/homeassistant/components/tibber/sensor.py @@ -109,7 +109,7 @@ class TibberSensorElPrice(TibberSensor): @property def name(self): """Return the name of the sensor.""" - return "Electricity price {}".format(self._name) + return f"Electricity price {self._name}" @property def icon(self): @@ -179,7 +179,7 @@ class TibberSensorRT(TibberSensor): @property def name(self): """Return the name of the sensor.""" - return "Real time consumption {}".format(self._name) + return f"Real time consumption {self._name}" @property def should_poll(self): diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index dffd66265a68..2a1085a53e34 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -134,7 +134,7 @@ class TuyaDevice(Entity): @property def unique_id(self): """Return a unique ID.""" - return "tuya.{}".format(self.tuya.object_id()) + return f"tuya.{self.tuya.object_id()}" @property def name(self): diff --git a/homeassistant/components/wink/__init__.py b/homeassistant/components/wink/__init__.py index ceeb8b4cbc04..53bac129dbcc 100644 --- a/homeassistant/components/wink/__init__.py +++ b/homeassistant/components/wink/__init__.py @@ -762,7 +762,7 @@ class WinkDevice(Entity): def unique_id(self): """Return the unique id of the Wink device.""" if hasattr(self.wink, "capability") and self.wink.capability() is not None: - return "{}_{}".format(self.wink.object_id(), self.wink.capability()) + return f"{self.wink.object_id()}_{self.wink.capability()}" return self.wink.object_id() @property diff --git a/homeassistant/components/wirelesstag/__init__.py b/homeassistant/components/wirelesstag/__init__.py index 5637cabbfd21..7296179a126f 100644 --- a/homeassistant/components/wirelesstag/__init__.py +++ b/homeassistant/components/wirelesstag/__init__.py @@ -130,7 +130,7 @@ class WirelessTagPlatform: def local_base_url(self): """Define base url of hass in local network.""" if self._local_base_url is None: - self._local_base_url = "http://{}".format(util.get_local_ip()) + self._local_base_url = f"http://{util.get_local_ip()}" port = self.hass.config.api.port if port is not None: @@ -198,7 +198,7 @@ def setup(hass, config): except (ConnectTimeout, HTTPError, WirelessTagsException) as ex: _LOGGER.error("Unable to connect to wirelesstag.net service: %s", str(ex)) hass.components.persistent_notification.create( - "Error: {}
Please restart hass after fixing this.".format(ex), + f"Error: {ex}
Please restart hass after fixing this.", title=NOTIFICATION_TITLE, notification_id=NOTIFICATION_ID, ) diff --git a/homeassistant/scripts/keyring.py b/homeassistant/scripts/keyring.py index 0622b8c3d451..124449d44677 100644 --- a/homeassistant/scripts/keyring.py +++ b/homeassistant/scripts/keyring.py @@ -39,7 +39,7 @@ def run(args): print(f"Active keyring : {keyr.__module__}") config_name = os.path.join(platform.config_root(), "keyringrc.cfg") print(f"Config location : {config_name}") - print("Data location : {}\n".format(platform.data_root())) + print(f"Data location : {platform.data_root()}\n") elif args.name is None: parser.print_help() return 1 From 03cae17992b891901adcc3d6951ec6d331c1fbaa Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 22:08:49 +0200 Subject: [PATCH 100/653] Use str literals (#33654) --- homeassistant/components/rachio/switch.py | 4 ++-- homeassistant/components/rachio/webhooks.py | 2 +- homeassistant/components/zwave/config_flow.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index 2b9a959deb2c..764f87e924c4 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -192,7 +192,7 @@ class RachioZone(RachioSwitch): self._person = person self._shade_type = data.get(KEY_CUSTOM_SHADE, {}).get(KEY_NAME) self._zone_type = data.get(KEY_CUSTOM_CROP, {}).get(KEY_NAME) - self._summary = str() + self._summary = "" self._current_schedule = current_schedule super().__init__(controller, poll=False) self._state = self.zone_id == self._current_schedule.get(KEY_ZONE_ID) @@ -275,7 +275,7 @@ class RachioZone(RachioSwitch): if args[0][KEY_ZONE_ID] != self.zone_id: return - self._summary = kwargs.get(KEY_SUMMARY, str()) + self._summary = kwargs.get(KEY_SUMMARY, "") if args[0][KEY_SUBTYPE] == SUBTYPE_ZONE_STARTED: self._state = True diff --git a/homeassistant/components/rachio/webhooks.py b/homeassistant/components/rachio/webhooks.py index 7051ec046d84..e31b32e9410f 100644 --- a/homeassistant/components/rachio/webhooks.py +++ b/homeassistant/components/rachio/webhooks.py @@ -88,7 +88,7 @@ class RachioWebhookView(HomeAssistantView): data = await request.json() try: - auth = data.get(KEY_EXTERNAL_ID, str()).split(":")[1] + auth = data.get(KEY_EXTERNAL_ID, "").split(":")[1] assert auth == hass.data[DOMAIN][self._entry_id].rachio.webhook_auth except (AssertionError, IndexError): return web.Response(status=web.HTTPForbidden.status_code) diff --git a/homeassistant/components/zwave/config_flow.py b/homeassistant/components/zwave/config_flow.py index 6d7dc012e859..cff197b7e978 100644 --- a/homeassistant/components/zwave/config_flow.py +++ b/homeassistant/components/zwave/config_flow.py @@ -66,7 +66,7 @@ class ZwaveFlowHandler(config_entries.ConfigFlow): # Generate a random key from random import choice - key = str() + key = "" for i in range(16): key += "0x" key += choice("1234567890ABCDEF") From 6f1900c6f46241351064393a0ec4cbe594c43650 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 22:09:11 +0200 Subject: [PATCH 101/653] Replace OSError aliases with OSError (#33655) --- homeassistant/components/anel_pwrctrl/switch.py | 3 +-- homeassistant/components/broadlink/remote.py | 7 +++---- homeassistant/components/ebusd/__init__.py | 2 +- homeassistant/components/emulated_hue/upnp.py | 2 +- homeassistant/components/flux_led/light.py | 3 +-- homeassistant/components/fritzbox_callmonitor/sensor.py | 4 ++-- homeassistant/components/gpsd/sensor.py | 2 +- homeassistant/components/graphite/__init__.py | 4 ++-- homeassistant/components/harmony/remote.py | 2 +- homeassistant/components/influxdb/__init__.py | 2 +- homeassistant/components/lannouncer/notify.py | 2 +- homeassistant/components/maxcube/climate.py | 4 ++-- homeassistant/components/mikrotik/hub.py | 6 +++--- homeassistant/components/mqtt/__init__.py | 3 +-- homeassistant/components/nest/__init__.py | 7 +++---- homeassistant/components/osramlightify/light.py | 3 +-- homeassistant/components/pilight/__init__.py | 2 +- homeassistant/components/tcp/sensor.py | 4 ++-- homeassistant/components/uvc/camera.py | 3 +-- homeassistant/components/watson_iot/__init__.py | 2 +- homeassistant/components/zeroconf/__init__.py | 2 +- homeassistant/components/ziggo_mediabox_xl/media_player.py | 6 +++--- homeassistant/util/__init__.py | 2 +- 23 files changed, 35 insertions(+), 42 deletions(-) diff --git a/homeassistant/components/anel_pwrctrl/switch.py b/homeassistant/components/anel_pwrctrl/switch.py index 19a0cc7c6ad5..be6a76e3b6b8 100644 --- a/homeassistant/components/anel_pwrctrl/switch.py +++ b/homeassistant/components/anel_pwrctrl/switch.py @@ -1,7 +1,6 @@ """Support for ANEL PwrCtrl switches.""" from datetime import timedelta import logging -import socket from anel_pwrctrl import DeviceMaster import voluptuous as vol @@ -45,7 +44,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): write_port=port_recv, ) master.query(ip_addr=host) - except socket.error as ex: + except OSError as ex: _LOGGER.error("Unable to discover PwrCtrl device: %s", str(ex)) return False diff --git a/homeassistant/components/broadlink/remote.py b/homeassistant/components/broadlink/remote.py index 714b5dfec342..769286a567e2 100644 --- a/homeassistant/components/broadlink/remote.py +++ b/homeassistant/components/broadlink/remote.py @@ -7,7 +7,6 @@ from datetime import timedelta from ipaddress import ip_address from itertools import product import logging -import socket import broadlink import voluptuous as vol @@ -103,7 +102,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= connected, loaded = await asyncio.gather( hass.async_add_executor_job(api.auth), remote.async_load_storage_files() ) - except socket.error: + except OSError: pass if not connected: hass.data[DOMAIN][COMPONENT].remove(unique_id) @@ -327,7 +326,7 @@ class BroadlinkRemote(RemoteDevice): continue try: await self.hass.async_add_executor_job(function, *args) - except socket.error: + except OSError: continue return raise ConnectionError @@ -336,7 +335,7 @@ class BroadlinkRemote(RemoteDevice): """Connect to the remote.""" try: auth = await self.hass.async_add_executor_job(self._api.auth) - except socket.error: + except OSError: auth = False if auth and not self._available: _LOGGER.warning("Connected to the remote") diff --git a/homeassistant/components/ebusd/__init__.py b/homeassistant/components/ebusd/__init__.py index eafa42ba22aa..a1a7fc880860 100644 --- a/homeassistant/components/ebusd/__init__.py +++ b/homeassistant/components/ebusd/__init__.py @@ -82,7 +82,7 @@ def setup(hass, config): _LOGGER.debug("Ebusd integration setup completed") return True - except (socket.timeout, socket.error): + except (socket.timeout, OSError): return False diff --git a/homeassistant/components/emulated_hue/upnp.py b/homeassistant/components/emulated_hue/upnp.py index 0ee336de6707..c10fb3b826b9 100644 --- a/homeassistant/components/emulated_hue/upnp.py +++ b/homeassistant/components/emulated_hue/upnp.py @@ -123,7 +123,7 @@ USN: uuid:Socket-1_0-221438K0100073::urn:schemas-upnp-org:device:basic:1 else: # most likely the timeout, so check for interrupt continue - except socket.error as ex: + except OSError as ex: if self._interrupted: clean_socket_close(ssdp_socket) return diff --git a/homeassistant/components/flux_led/light.py b/homeassistant/components/flux_led/light.py index 88b8c91420d7..1acd58d8e431 100644 --- a/homeassistant/components/flux_led/light.py +++ b/homeassistant/components/flux_led/light.py @@ -1,7 +1,6 @@ """Support for Flux lights.""" import logging import random -import socket from flux_led import BulbScanner, WifiLedBulb import voluptuous as vol @@ -363,7 +362,7 @@ class FluxLight(Light): try: self._connect() self._error_reported = False - except socket.error: + except OSError: self._disconnect() if not self._error_reported: _LOGGER.warning( diff --git a/homeassistant/components/fritzbox_callmonitor/sensor.py b/homeassistant/components/fritzbox_callmonitor/sensor.py index fe0393720dc0..40791458505c 100644 --- a/homeassistant/components/fritzbox_callmonitor/sensor.py +++ b/homeassistant/components/fritzbox_callmonitor/sensor.py @@ -63,7 +63,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): # Try to resolve a hostname; if it is already an IP, it will be returned as-is try: host = socket.gethostbyname(host) - except socket.error: + except OSError: _LOGGER.error("Could not resolve hostname %s", host) return port = config.get(CONF_PORT) @@ -170,7 +170,7 @@ class FritzBoxCallMonitor: try: self.sock.connect((self.host, self.port)) threading.Thread(target=self._listen).start() - except socket.error as err: + except OSError as err: self.sock = None _LOGGER.error( "Cannot connect to %s on port %s: %s", self.host, self.port, err diff --git a/homeassistant/components/gpsd/sensor.py b/homeassistant/components/gpsd/sensor.py index 8696dde72cb4..ea238269e598 100644 --- a/homeassistant/components/gpsd/sensor.py +++ b/homeassistant/components/gpsd/sensor.py @@ -58,7 +58,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): sock.connect((host, port)) sock.shutdown(2) _LOGGER.debug("Connection to GPSD possible") - except socket.error: + except OSError: _LOGGER.error("Not able to connect to GPSD") return False diff --git a/homeassistant/components/graphite/__init__.py b/homeassistant/components/graphite/__init__.py index 104ad61e93ce..00dabd59d8f8 100644 --- a/homeassistant/components/graphite/__init__.py +++ b/homeassistant/components/graphite/__init__.py @@ -51,7 +51,7 @@ def setup(hass, config): sock.connect((host, port)) sock.shutdown(2) _LOGGER.debug("Connection to Graphite possible") - except socket.error: + except OSError: _LOGGER.error("Not able to connect to Graphite") return False @@ -128,7 +128,7 @@ class GraphiteFeeder(threading.Thread): self._send_to_graphite("\n".join(lines)) except socket.gaierror: _LOGGER.error("Unable to connect to host %s", self._host) - except socket.error: + except OSError: _LOGGER.exception("Failed to send data to graphite") def run(self): diff --git a/homeassistant/components/harmony/remote.py b/homeassistant/components/harmony/remote.py index 5af8d1eb65a3..45a8f879c0f2 100644 --- a/homeassistant/components/harmony/remote.py +++ b/homeassistant/components/harmony/remote.py @@ -444,7 +444,7 @@ class HarmonyRemote(remote.RemoteDevice): try: with open(self._config_path, "w+", encoding="utf-8") as file_out: json.dump(self._client.json_config, file_out, sort_keys=True, indent=4) - except IOError as exc: + except OSError as exc: _LOGGER.error( "%s: Unable to write HUB configuration to %s: %s", self.name, diff --git a/homeassistant/components/influxdb/__init__.py b/homeassistant/components/influxdb/__init__.py index 48852f279109..1b3093447ecb 100644 --- a/homeassistant/components/influxdb/__init__.py +++ b/homeassistant/components/influxdb/__init__.py @@ -355,7 +355,7 @@ class InfluxThread(threading.Thread): except ( exceptions.InfluxDBClientError, exceptions.InfluxDBServerError, - IOError, + OSError, ) as err: if retry < self.max_tries: time.sleep(RETRY_DELAY) diff --git a/homeassistant/components/lannouncer/notify.py b/homeassistant/components/lannouncer/notify.py index 2e5cb9b5600e..c474bbe8c67a 100644 --- a/homeassistant/components/lannouncer/notify.py +++ b/homeassistant/components/lannouncer/notify.py @@ -80,5 +80,5 @@ class LannouncerNotificationService(BaseNotificationService): sock.close() except socket.gaierror: _LOGGER.error("Unable to connect to host %s", self._host) - except socket.error: + except OSError: _LOGGER.exception("Failed to send data to Lannnouncer") diff --git a/homeassistant/components/maxcube/climate.py b/homeassistant/components/maxcube/climate.py index e723853f6291..333baab1ab19 100644 --- a/homeassistant/components/maxcube/climate.py +++ b/homeassistant/components/maxcube/climate.py @@ -122,7 +122,7 @@ class MaxCubeClimate(ClimateDevice): with self._cubehandle.mutex: try: cube.set_target_temperature(device, target_temperature) - except (socket.timeout, socket.error): + except (socket.timeout, OSError): _LOGGER.error("Setting target temperature failed") return False @@ -145,7 +145,7 @@ class MaxCubeClimate(ClimateDevice): with self._cubehandle.mutex: try: self._cubehandle.cube.set_mode(device, mode) - except (socket.timeout, socket.error): + except (socket.timeout, OSError): _LOGGER.error("Setting operation mode failed") return False diff --git a/homeassistant/components/mikrotik/hub.py b/homeassistant/components/mikrotik/hub.py index 023bdc74a7e6..90150f448e85 100644 --- a/homeassistant/components/mikrotik/hub.py +++ b/homeassistant/components/mikrotik/hub.py @@ -184,7 +184,7 @@ class MikrotikData: # get new hub firmware version if updated self.firmware = self.get_info(ATTR_FIRMWARE) - except (CannotConnect, socket.timeout, socket.error): + except (CannotConnect, socket.timeout, OSError): self.available = False return @@ -249,7 +249,7 @@ class MikrotikData: response = list(self.api(cmd=cmd)) except ( librouteros.exceptions.ConnectionClosed, - socket.error, + OSError, socket.timeout, ) as api_error: _LOGGER.error("Mikrotik %s connection error %s", self._host, api_error) @@ -407,7 +407,7 @@ def get_api(hass, entry): return api except ( librouteros.exceptions.LibRouterosError, - socket.error, + OSError, socket.timeout, ) as api_error: _LOGGER.error("Mikrotik %s error: %s", entry[CONF_HOST], api_error) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 5bfc2e0509bc..5a4dd701d32b 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -7,7 +7,6 @@ import json import logging from operator import attrgetter import os -import socket import ssl import sys import time @@ -996,7 +995,7 @@ class MQTT: self.connected = True _LOGGER.info("Successfully reconnected to the MQTT server") break - except socket.error: + except OSError: pass wait_time = min(2 ** tries, MAX_RECONNECT_WAIT) diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index b486e907ee3b..54c385c1f231 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -1,7 +1,6 @@ """Support for Nest devices.""" from datetime import datetime, timedelta import logging -import socket import threading from nest import Nest @@ -294,7 +293,7 @@ class NestDevice: if self.local_structure is None: self.local_structure = structure_names - except (AuthorizationError, APIError, socket.error) as err: + except (AuthorizationError, APIError, OSError) as err: _LOGGER.error("Connection error while access Nest web service: %s", err) return False return True @@ -312,7 +311,7 @@ class NestDevice: continue yield structure - except (AuthorizationError, APIError, socket.error) as err: + except (AuthorizationError, APIError, OSError) as err: _LOGGER.error("Connection error while access Nest web service: %s", err) def thermostats(self): @@ -354,7 +353,7 @@ class NestDevice: continue yield (structure, device) - except (AuthorizationError, APIError, socket.error) as err: + except (AuthorizationError, APIError, OSError) as err: _LOGGER.error("Connection error while access Nest web service: %s", err) diff --git a/homeassistant/components/osramlightify/light.py b/homeassistant/components/osramlightify/light.py index 3a911fbcf958..5cb9c481c3a2 100644 --- a/homeassistant/components/osramlightify/light.py +++ b/homeassistant/components/osramlightify/light.py @@ -1,7 +1,6 @@ """Support for Osram Lightify.""" import logging import random -import socket from lightify import Lightify import voluptuous as vol @@ -74,7 +73,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): host = config[CONF_HOST] try: bridge = Lightify(host, log_level=logging.NOTSET) - except socket.error as err: + except OSError as err: msg = "Error connecting to bridge: {} due to: {}".format(host, str(err)) _LOGGER.exception(msg) return diff --git a/homeassistant/components/pilight/__init__.py b/homeassistant/components/pilight/__init__.py index 50ee1b248b0c..02d56c890fe4 100644 --- a/homeassistant/components/pilight/__init__.py +++ b/homeassistant/components/pilight/__init__.py @@ -67,7 +67,7 @@ def setup(hass, config): try: pilight_client = pilight.Client(host=host, port=port) - except (socket.error, socket.timeout) as err: + except (OSError, socket.timeout) as err: _LOGGER.error("Unable to connect to %s on port %s: %s", host, port, err) return False diff --git a/homeassistant/components/tcp/sensor.py b/homeassistant/components/tcp/sensor.py index 2732f2d6bd19..62e78f6f88c0 100644 --- a/homeassistant/components/tcp/sensor.py +++ b/homeassistant/components/tcp/sensor.py @@ -99,7 +99,7 @@ class TcpSensor(Entity): sock.settimeout(self._config[CONF_TIMEOUT]) try: sock.connect((self._config[CONF_HOST], self._config[CONF_PORT])) - except socket.error as err: + except OSError as err: _LOGGER.error( "Unable to connect to %s on port %s: %s", self._config[CONF_HOST], @@ -110,7 +110,7 @@ class TcpSensor(Entity): try: sock.send(self._config[CONF_PAYLOAD].encode()) - except socket.error as err: + except OSError as err: _LOGGER.error( "Unable to send payload %r to %s on port %s: %s", self._config[CONF_PAYLOAD], diff --git a/homeassistant/components/uvc/camera.py b/homeassistant/components/uvc/camera.py index cd6875cdcdcd..431785f7c6a8 100644 --- a/homeassistant/components/uvc/camera.py +++ b/homeassistant/components/uvc/camera.py @@ -1,6 +1,5 @@ """Support for Ubiquiti's UVC cameras.""" import logging -import socket import requests from uvcclient import camera as uvc_camera, nvr @@ -154,7 +153,7 @@ class UnifiVideoCamera(Camera): ) self._connect_addr = addr break - except socket.error: + except OSError: pass except uvc_camera.CameraConnectError: pass diff --git a/homeassistant/components/watson_iot/__init__.py b/homeassistant/components/watson_iot/__init__.py index adc05893fde1..b0500806b84d 100644 --- a/homeassistant/components/watson_iot/__init__.py +++ b/homeassistant/components/watson_iot/__init__.py @@ -208,7 +208,7 @@ class WatsonIOTThread(threading.Thread): _LOGGER.error("Failed to publish message to Watson IoT") continue break - except (MissingMessageEncoderException, IOError): + except (MissingMessageEncoderException, OSError): if retry < MAX_TRIES: time.sleep(RETRY_DELAY) else: diff --git a/homeassistant/components/zeroconf/__init__.py b/homeassistant/components/zeroconf/__init__.py index 16a7d2f000c4..7e9f6e60ed53 100644 --- a/homeassistant/components/zeroconf/__init__.py +++ b/homeassistant/components/zeroconf/__init__.py @@ -53,7 +53,7 @@ def setup(hass, config): try: host_ip_pton = socket.inet_pton(socket.AF_INET, host_ip) - except socket.error: + except OSError: host_ip_pton = socket.inet_pton(socket.AF_INET6, host_ip) info = ServiceInfo( diff --git a/homeassistant/components/ziggo_mediabox_xl/media_player.py b/homeassistant/components/ziggo_mediabox_xl/media_player.py index 83a7dbbaba92..832758e26fbe 100644 --- a/homeassistant/components/ziggo_mediabox_xl/media_player.py +++ b/homeassistant/components/ziggo_mediabox_xl/media_player.py @@ -85,7 +85,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): ZiggoMediaboxXLDevice(mediabox, host, name, connection_successful) ) known_devices.add(ip_addr) - except socket.error as error: + except OSError as error: _LOGGER.error("Can't connect to %s: %s", host, error) else: _LOGGER.info("Ignoring duplicate Ziggo Mediabox XL %s", host) @@ -115,7 +115,7 @@ class ZiggoMediaboxXLDevice(MediaPlayerDevice): self._available = True else: self._available = False - except socket.error: + except OSError: _LOGGER.error("Couldn't fetch state from %s", self._host) self._available = False @@ -123,7 +123,7 @@ class ZiggoMediaboxXLDevice(MediaPlayerDevice): """Send keys to the device and handle exceptions.""" try: self._mediabox.send_keys(keys) - except socket.error: + except OSError: _LOGGER.error("Couldn't send keys to %s", self._host) @property diff --git a/homeassistant/util/__init__.py b/homeassistant/util/__init__.py index 07b6a8d48f8e..d80f97754490 100644 --- a/homeassistant/util/__init__.py +++ b/homeassistant/util/__init__.py @@ -101,7 +101,7 @@ def get_local_ip() -> str: sock.connect(("8.8.8.8", 80)) return sock.getsockname()[0] # type: ignore - except socket.error: + except OSError: try: return socket.gethostbyname(socket.gethostname()) except socket.gaierror: From 541e30d15512a847fe8aeef2467a39948bf787cf Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 22:11:33 +0200 Subject: [PATCH 102/653] Remove unused manifest fields v2 (#33656) --- homeassistant/components/coronavirus/manifest.json | 3 --- homeassistant/components/griddy/manifest.json | 7 +------ homeassistant/components/iammeter/manifest.json | 9 ++------- homeassistant/components/intent/manifest.json | 2 -- homeassistant/components/kaiterra/manifest.json | 3 +-- homeassistant/components/local_ip/manifest.json | 3 +-- homeassistant/components/plaato/manifest.json | 3 +-- homeassistant/components/powerwall/manifest.json | 11 ++--------- homeassistant/components/safe_mode/manifest.json | 3 --- homeassistant/components/search/manifest.json | 3 --- homeassistant/components/sentry/manifest.json | 3 --- homeassistant/components/switcher_kis/manifest.json | 3 +-- 12 files changed, 9 insertions(+), 44 deletions(-) diff --git a/homeassistant/components/coronavirus/manifest.json b/homeassistant/components/coronavirus/manifest.json index 3c106027d8b9..5248cf38221b 100644 --- a/homeassistant/components/coronavirus/manifest.json +++ b/homeassistant/components/coronavirus/manifest.json @@ -4,8 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/coronavirus", "requirements": ["coronavirus==1.1.0"], - "ssdp": [], - "zeroconf": [], - "homekit": {}, "codeowners": ["@home_assistant/core"] } diff --git a/homeassistant/components/griddy/manifest.json b/homeassistant/components/griddy/manifest.json index 988c4289b529..1e31b1b7aa83 100644 --- a/homeassistant/components/griddy/manifest.json +++ b/homeassistant/components/griddy/manifest.json @@ -4,10 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/griddy", "requirements": ["griddypower==0.1.0"], - "ssdp": [], - "zeroconf": [], - "homekit": {}, - "codeowners": [ - "@bdraco" - ] + "codeowners": ["@bdraco"] } diff --git a/homeassistant/components/iammeter/manifest.json b/homeassistant/components/iammeter/manifest.json index e1b021c8ce0d..f5f21dcfe481 100644 --- a/homeassistant/components/iammeter/manifest.json +++ b/homeassistant/components/iammeter/manifest.json @@ -2,11 +2,6 @@ "domain": "iammeter", "name": "IamMeter", "documentation": "https://www.home-assistant.io/integrations/iammeter", - "codeowners": [ - "@lewei50" - ], - "requirements": [ - "iammeter==0.1.3" - ], - "dependencies": [] + "codeowners": ["@lewei50"], + "requirements": ["iammeter==0.1.3"] } diff --git a/homeassistant/components/intent/manifest.json b/homeassistant/components/intent/manifest.json index a1b9f819819a..a0d5d0fca238 100644 --- a/homeassistant/components/intent/manifest.json +++ b/homeassistant/components/intent/manifest.json @@ -3,8 +3,6 @@ "name": "Intent", "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/intent", - "ssdp": [], - "homekit": {}, "dependencies": ["http"], "codeowners": ["@home-assistant/core"] } diff --git a/homeassistant/components/kaiterra/manifest.json b/homeassistant/components/kaiterra/manifest.json index 562b988ee380..33fc1266d830 100644 --- a/homeassistant/components/kaiterra/manifest.json +++ b/homeassistant/components/kaiterra/manifest.json @@ -3,6 +3,5 @@ "name": "Kaiterra", "documentation": "https://www.home-assistant.io/integrations/kaiterra", "requirements": ["kaiterra-async-client==0.0.2"], - "codeowners": ["@Michsior14"], - "dependencies": [] + "codeowners": ["@Michsior14"] } diff --git a/homeassistant/components/local_ip/manifest.json b/homeassistant/components/local_ip/manifest.json index 1dd1b1ed85c5..62c862e33c86 100644 --- a/homeassistant/components/local_ip/manifest.json +++ b/homeassistant/components/local_ip/manifest.json @@ -3,6 +3,5 @@ "name": "Local IP Address", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/local_ip", - "codeowners": ["@issacg"], - "requirements": [] + "codeowners": ["@issacg"] } diff --git a/homeassistant/components/plaato/manifest.json b/homeassistant/components/plaato/manifest.json index 9655b91b13e5..29e104b13ed3 100644 --- a/homeassistant/components/plaato/manifest.json +++ b/homeassistant/components/plaato/manifest.json @@ -4,6 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/plaato", "dependencies": ["webhook"], - "codeowners": ["@JohNan"], - "requirements": [] + "codeowners": ["@JohNan"] } diff --git a/homeassistant/components/powerwall/manifest.json b/homeassistant/components/powerwall/manifest.json index 2ab2d5199448..9a302fbcad17 100644 --- a/homeassistant/components/powerwall/manifest.json +++ b/homeassistant/components/powerwall/manifest.json @@ -3,13 +3,6 @@ "name": "Tesla Powerwall", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/powerwall", - "requirements": [ - "tesla-powerwall==0.1.3" - ], - "ssdp": [], - "zeroconf": [], - "homekit": {}, - "codeowners": [ - "@bdraco" - ] + "requirements": ["tesla-powerwall==0.1.3"], + "codeowners": ["@bdraco"] } diff --git a/homeassistant/components/safe_mode/manifest.json b/homeassistant/components/safe_mode/manifest.json index ebc450140fce..6da29c94790a 100644 --- a/homeassistant/components/safe_mode/manifest.json +++ b/homeassistant/components/safe_mode/manifest.json @@ -3,9 +3,6 @@ "name": "Safe Mode", "config_flow": false, "documentation": "https://www.home-assistant.io/integrations/safe_mode", - "ssdp": [], - "zeroconf": [], - "homekit": {}, "dependencies": ["frontend", "config", "persistent_notification", "cloud"], "codeowners": ["@home-assistant/core"] } diff --git a/homeassistant/components/search/manifest.json b/homeassistant/components/search/manifest.json index c46426530a1c..273a517d1118 100644 --- a/homeassistant/components/search/manifest.json +++ b/homeassistant/components/search/manifest.json @@ -2,9 +2,6 @@ "domain": "search", "name": "Search", "documentation": "https://www.home-assistant.io/integrations/search", - "ssdp": [], - "zeroconf": [], - "homekit": {}, "dependencies": ["websocket_api"], "after_dependencies": ["scene", "group", "automation", "script"], "codeowners": ["@home-assistant/core"] diff --git a/homeassistant/components/sentry/manifest.json b/homeassistant/components/sentry/manifest.json index a38a250a878f..12c808b6d7bc 100644 --- a/homeassistant/components/sentry/manifest.json +++ b/homeassistant/components/sentry/manifest.json @@ -4,8 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/sentry", "requirements": ["sentry-sdk==0.13.5"], - "ssdp": [], - "zeroconf": [], - "homekit": {}, "codeowners": ["@dcramer"] } diff --git a/homeassistant/components/switcher_kis/manifest.json b/homeassistant/components/switcher_kis/manifest.json index 81f5d2085c69..9974b885d9e4 100644 --- a/homeassistant/components/switcher_kis/manifest.json +++ b/homeassistant/components/switcher_kis/manifest.json @@ -3,6 +3,5 @@ "name": "Switcher", "documentation": "https://www.home-assistant.io/integrations/switcher_kis/", "codeowners": ["@tomerfi"], - "requirements": ["aioswitcher==2019.4.26"], - "dependencies": [] + "requirements": ["aioswitcher==2019.4.26"] } From 0d95eff21d58530b1f15c9ce3023344952eaa86f Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 22:31:56 +0200 Subject: [PATCH 103/653] Use dict literals (#33658) --- homeassistant/components/androidtv/media_player.py | 4 ++-- homeassistant/components/config/scene.py | 2 +- homeassistant/components/device_tracker/setup.py | 2 +- homeassistant/components/dht/sensor.py | 2 +- homeassistant/components/ecobee/weather.py | 2 +- homeassistant/components/emulated_hue/__init__.py | 2 +- homeassistant/components/fail2ban/sensor.py | 2 +- homeassistant/components/ifttt/__init__.py | 2 +- homeassistant/components/kodi/media_player.py | 2 +- homeassistant/components/meteo_france/weather.py | 2 +- homeassistant/components/mhz19/sensor.py | 2 +- homeassistant/components/mpchc/media_player.py | 4 ++-- homeassistant/components/nanoleaf/light.py | 2 +- homeassistant/components/plant/__init__.py | 8 ++++---- homeassistant/components/remember_the_milk/__init__.py | 8 ++++---- homeassistant/components/stt/__init__.py | 2 +- homeassistant/components/ted5000/sensor.py | 2 +- homeassistant/components/template/__init__.py | 4 ++-- homeassistant/components/ubus/device_tracker.py | 6 +++--- homeassistant/components/volumio/media_player.py | 2 +- tests/components/google_wifi/test_sensor.py | 2 +- tests/components/template/test_cover.py | 2 +- 22 files changed, 33 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/androidtv/media_player.py b/homeassistant/components/androidtv/media_player.py index f9ec68c87426..f78d88ab3ece 100644 --- a/homeassistant/components/androidtv/media_player.py +++ b/homeassistant/components/androidtv/media_player.py @@ -137,7 +137,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_ADB_SERVER_IP): cv.string, vol.Optional(CONF_ADB_SERVER_PORT, default=DEFAULT_ADB_SERVER_PORT): cv.port, vol.Optional(CONF_GET_SOURCES, default=DEFAULT_GET_SOURCES): cv.boolean, - vol.Optional(CONF_APPS, default=dict()): vol.Schema( + vol.Optional(CONF_APPS, default={}): vol.Schema( {cv.string: vol.Any(cv.string, None)} ), vol.Optional(CONF_TURN_ON_COMMAND): cv.string, @@ -327,7 +327,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): target_device.adb_push(local_path, device_path) hass.services.register( - ANDROIDTV_DOMAIN, SERVICE_UPLOAD, service_upload, schema=SERVICE_UPLOAD_SCHEMA, + ANDROIDTV_DOMAIN, SERVICE_UPLOAD, service_upload, schema=SERVICE_UPLOAD_SCHEMA ) diff --git a/homeassistant/components/config/scene.py b/homeassistant/components/config/scene.py index b380656c5418..19cfb7cd31a2 100644 --- a/homeassistant/components/config/scene.py +++ b/homeassistant/components/config/scene.py @@ -58,7 +58,7 @@ class EditSceneConfigView(EditIdBasedConfigView): elif cur_value[CONF_ID] == config_key: break else: - cur_value = dict() + cur_value = {} cur_value[CONF_ID] = config_key index = len(data) data.append(cur_value) diff --git a/homeassistant/components/device_tracker/setup.py b/homeassistant/components/device_tracker/setup.py index 595e36ef07c7..3b7afbe25eed 100644 --- a/homeassistant/components/device_tracker/setup.py +++ b/homeassistant/components/device_tracker/setup.py @@ -170,7 +170,7 @@ def async_setup_scanner_platform( try: extra_attributes = await scanner.async_get_extra_attributes(mac) except NotImplementedError: - extra_attributes = dict() + extra_attributes = {} kwargs = { "mac": mac, diff --git a/homeassistant/components/dht/sensor.py b/homeassistant/components/dht/sensor.py index b9461fae7d71..cfd1cf2a1973 100644 --- a/homeassistant/components/dht/sensor.py +++ b/homeassistant/components/dht/sensor.py @@ -165,7 +165,7 @@ class DHTClient: self.adafruit_dht = adafruit_dht self.sensor = sensor self.pin = pin - self.data = dict() + self.data = {} @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): diff --git a/homeassistant/components/ecobee/weather.py b/homeassistant/components/ecobee/weather.py index b8d23b3e379e..95ed220a16cd 100644 --- a/homeassistant/components/ecobee/weather.py +++ b/homeassistant/components/ecobee/weather.py @@ -184,7 +184,7 @@ class EcobeeWeather(WeatherEntity): def _process_forecast(json): """Process a single ecobee API forecast to return expected values.""" - forecast = dict() + forecast = {} try: forecast[ATTR_FORECAST_TIME] = datetime.strptime( json["dateTime"], "%Y-%m-%d %H:%M:%S" diff --git a/homeassistant/components/emulated_hue/__init__.py b/homeassistant/components/emulated_hue/__init__.py index 6b234a9df7bd..1c37d0215a8a 100644 --- a/homeassistant/components/emulated_hue/__init__.py +++ b/homeassistant/components/emulated_hue/__init__.py @@ -228,7 +228,7 @@ class Config: self.entities = conf.get(CONF_ENTITIES, {}) - self._entities_with_hidden_attr_in_config = dict() + self._entities_with_hidden_attr_in_config = {} for entity_id in self.entities: hidden_value = self.entities[entity_id].get(CONF_ENTITY_HIDDEN, None) if hidden_value is not None: diff --git a/homeassistant/components/fail2ban/sensor.py b/homeassistant/components/fail2ban/sensor.py index 6e47cb459668..224ce83c214f 100644 --- a/homeassistant/components/fail2ban/sensor.py +++ b/homeassistant/components/fail2ban/sensor.py @@ -108,7 +108,7 @@ class BanLogParser: """Initialize the parser.""" self.log_file = log_file self.data = list() - self.ip_regex = dict() + self.ip_regex = {} def read_log(self, jail): """Read the fail2ban log and find entries for jail.""" diff --git a/homeassistant/components/ifttt/__init__.py b/homeassistant/components/ifttt/__init__.py index 72c905497c02..c060c5f88156 100644 --- a/homeassistant/components/ifttt/__init__.py +++ b/homeassistant/components/ifttt/__init__.py @@ -64,7 +64,7 @@ async def async_setup(hass, config): value2 = call.data.get(ATTR_VALUE2) value3 = call.data.get(ATTR_VALUE3) - target_keys = dict() + target_keys = {} for target in targets: if target not in api_keys: _LOGGER.error("No IFTTT api key for %s", target) diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index dccc4ac07653..5f53de899e40 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -171,7 +171,7 @@ def _check_deprecated_turn_off(hass, turn_off_action): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Kodi platform.""" if DOMAIN not in hass.data: - hass.data[DOMAIN] = dict() + hass.data[DOMAIN] = {} unique_id = None # Is this a manual configuration? diff --git a/homeassistant/components/meteo_france/weather.py b/homeassistant/components/meteo_france/weather.py index 1bdea073aae0..2983c6b7d598 100644 --- a/homeassistant/components/meteo_france/weather.py +++ b/homeassistant/components/meteo_france/weather.py @@ -119,7 +119,7 @@ class MeteoFranceWeather(WeatherEntity): @property def device_state_attributes(self): """Return the state attributes.""" - data = dict() + data = {} if self._data and "next_rain" in self._data: data["next_rain"] = self._data["next_rain"] return data diff --git a/homeassistant/components/mhz19/sensor.py b/homeassistant/components/mhz19/sensor.py index 892895b9e026..e77f17c9140c 100644 --- a/homeassistant/components/mhz19/sensor.py +++ b/homeassistant/components/mhz19/sensor.py @@ -124,7 +124,7 @@ class MHZClient: """Initialize the sensor.""" self.co2sensor = co2sens self._serial = serial - self.data = dict() + self.data = {} @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): diff --git a/homeassistant/components/mpchc/media_player.py b/homeassistant/components/mpchc/media_player.py index a3f2c500030e..b69fa651988d 100644 --- a/homeassistant/components/mpchc/media_player.py +++ b/homeassistant/components/mpchc/media_player.py @@ -68,7 +68,7 @@ class MpcHcDevice(MediaPlayerDevice): """Initialize the MPC-HC device.""" self._name = name self._url = url - self._player_variables = dict() + self._player_variables = {} self._available = False def update(self): @@ -83,7 +83,7 @@ class MpcHcDevice(MediaPlayerDevice): self._available = True except requests.exceptions.RequestException: _LOGGER.error("Could not connect to MPC-HC at: %s", self._url) - self._player_variables = dict() + self._player_variables = {} self._available = False def _send_command(self, command_id): diff --git a/homeassistant/components/nanoleaf/light.py b/homeassistant/components/nanoleaf/light.py index 4b08d0b9751a..612e1b6ead95 100644 --- a/homeassistant/components/nanoleaf/light.py +++ b/homeassistant/components/nanoleaf/light.py @@ -57,7 +57,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Nanoleaf light.""" if DATA_NANOLEAF not in hass.data: - hass.data[DATA_NANOLEAF] = dict() + hass.data[DATA_NANOLEAF] = {} token = "" if discovery_info is not None: diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index c26c3f5e68a8..3e35559bb629 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -161,9 +161,9 @@ class Plant(Entity): def __init__(self, name, config): """Initialize the Plant component.""" self._config = config - self._sensormap = dict() - self._readingmap = dict() - self._unit_of_measurement = dict() + self._sensormap = {} + self._readingmap = {} + self._unit_of_measurement = {} for reading, entity_id in config["sensors"].items(): self._sensormap[entity_id] = reading self._readingmap[reading] = entity_id @@ -371,7 +371,7 @@ class DailyHistory: """Create new DailyHistory with a maximum length of the history.""" self.max_length = max_length self._days = None - self._max_dict = dict() + self._max_dict = {} self.max = None def add_measurement(self, value, timestamp=None): diff --git a/homeassistant/components/remember_the_milk/__init__.py b/homeassistant/components/remember_the_milk/__init__.py index ec70c9d43292..d31d83d3e9d3 100644 --- a/homeassistant/components/remember_the_milk/__init__.py +++ b/homeassistant/components/remember_the_milk/__init__.py @@ -157,7 +157,7 @@ class RememberTheMilkConfiguration: """Create new instance of configuration.""" self._config_file_path = hass.config.path(CONFIG_FILE_NAME) if not os.path.isfile(self._config_file_path): - self._config = dict() + self._config = {} return try: _LOGGER.debug("Loading configuration from file: %s", self._config_file_path) @@ -168,7 +168,7 @@ class RememberTheMilkConfiguration: "Failed to load configuration file, creating a new one: %s", self._config_file_path, ) - self._config = dict() + self._config = {} def save_config(self): """Write the configuration to a file.""" @@ -198,9 +198,9 @@ class RememberTheMilkConfiguration: def _initialize_profile(self, profile_name): """Initialize the data structures for a profile.""" if profile_name not in self._config: - self._config[profile_name] = dict() + self._config[profile_name] = {} if CONF_ID_MAP not in self._config[profile_name]: - self._config[profile_name][CONF_ID_MAP] = dict() + self._config[profile_name][CONF_ID_MAP] = {} def get_rtm_id(self, profile_name, hass_id): """Get the RTM ids for a Home Assistant task ID. diff --git a/homeassistant/components/stt/__init__.py b/homeassistant/components/stt/__init__.py index b39ab88484bb..43ef01a497e3 100644 --- a/homeassistant/components/stt/__init__.py +++ b/homeassistant/components/stt/__init__.py @@ -184,7 +184,7 @@ class SpeechToTextView(HomeAssistantView): return None # Convert Header data - args = dict() + args = {} for value in data: value = value.strip() args[value.partition("=")[0]] = value.partition("=")[2] diff --git a/homeassistant/components/ted5000/sensor.py b/homeassistant/components/ted5000/sensor.py index e0025a050c30..2e6246d06ddb 100644 --- a/homeassistant/components/ted5000/sensor.py +++ b/homeassistant/components/ted5000/sensor.py @@ -90,7 +90,7 @@ class Ted5000Gateway: def __init__(self, url): """Initialize the data object.""" self.url = url - self.data = dict() + self.data = {} @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): diff --git a/homeassistant/components/template/__init__.py b/homeassistant/components/template/__init__.py index f100d663d8c5..11ad02975ee8 100644 --- a/homeassistant/components/template/__init__.py +++ b/homeassistant/components/template/__init__.py @@ -11,7 +11,7 @@ _LOGGER = logging.getLogger(__name__) def initialise_templates(hass, templates, attribute_templates=None): """Initialise templates and attribute templates.""" if attribute_templates is None: - attribute_templates = dict() + attribute_templates = {} for template in chain(templates.values(), attribute_templates.values()): if template is None: continue @@ -23,7 +23,7 @@ def extract_entities( ): """Extract entity ids from templates and attribute templates.""" if attribute_templates is None: - attribute_templates = dict() + attribute_templates = {} entity_ids = set() if manual_entity_ids is None: invalid_templates = [] diff --git a/homeassistant/components/ubus/device_tracker.py b/homeassistant/components/ubus/device_tracker.py index 8c83de202a46..1f5b5b4b1b64 100644 --- a/homeassistant/components/ubus/device_tracker.py +++ b/homeassistant/components/ubus/device_tracker.py @@ -94,7 +94,7 @@ class UbusDeviceScanner(DeviceScanner): def _generate_mac2name(self): """Return empty MAC to name dict. Overridden if DHCP server is set.""" - self.mac2name = dict() + self.mac2name = {} @_refresh_on_access_denied def get_device_name(self, device): @@ -170,7 +170,7 @@ class DnsmasqUbusDeviceScanner(UbusDeviceScanner): self.url, self.session_id, "call", "file", "read", path=self.leasefile ) if result: - self.mac2name = dict() + self.mac2name = {} for line in result["data"].splitlines(): hosts = line.split(" ") self.mac2name[hosts[1].upper()] = hosts[3] @@ -185,7 +185,7 @@ class OdhcpdUbusDeviceScanner(UbusDeviceScanner): def _generate_mac2name(self): result = _req_json_rpc(self.url, self.session_id, "call", "dhcp", "ipv4leases") if result: - self.mac2name = dict() + self.mac2name = {} for device in result["device"].values(): for lease in device["leases"]: mac = lease["mac"] # mac = aabbccddeeff diff --git a/homeassistant/components/volumio/media_player.py b/homeassistant/components/volumio/media_player.py index 90e62c0d951e..5778df8c3672 100644 --- a/homeassistant/components/volumio/media_player.py +++ b/homeassistant/components/volumio/media_player.py @@ -79,7 +79,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Volumio platform.""" if DATA_VOLUMIO not in hass.data: - hass.data[DATA_VOLUMIO] = dict() + hass.data[DATA_VOLUMIO] = {} # This is a manual configuration? if discovery_info is None: diff --git a/tests/components/google_wifi/test_sensor.py b/tests/components/google_wifi/test_sensor.py index bddee724966a..22059706dc50 100644 --- a/tests/components/google_wifi/test_sensor.py +++ b/tests/components/google_wifi/test_sensor.py @@ -106,7 +106,7 @@ class TestGoogleWifiSensor(unittest.TestCase): conditions = google_wifi.MONITORED_CONDITIONS.keys() self.api = google_wifi.GoogleWifiAPI("localhost", conditions) self.name = NAME - self.sensor_dict = dict() + self.sensor_dict = {} for condition, cond_list in google_wifi.MONITORED_CONDITIONS.items(): sensor = google_wifi.GoogleWifiSensor(self.api, self.name, condition) name = f"{self.name}_{condition}" diff --git a/tests/components/template/test_cover.py b/tests/components/template/test_cover.py index 5109607d799a..c8caf28ddf6c 100644 --- a/tests/components/template/test_cover.py +++ b/tests/components/template/test_cover.py @@ -144,7 +144,7 @@ async def test_template_position(hass, calls): await hass.async_block_till_done() entity = hass.states.get("cover.test") - attrs = dict() + attrs = {} attrs["position"] = 42 hass.states.async_set(entity.entity_id, entity.state, attributes=attrs) await hass.async_block_till_done() From fddaea797e4baae53b15ee80a9c2a27fa305e1d4 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 22:45:55 +0200 Subject: [PATCH 104/653] Use tuple literals (#33661) --- homeassistant/components/group/__init__.py | 2 +- homeassistant/components/tcp/sensor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index 53ce1c0634b9..fd44a80cf3cf 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -364,7 +364,7 @@ class Group(Entity): if entity_ids: self.tracking = tuple(ent_id.lower() for ent_id in entity_ids) else: - self.tracking = tuple() + self.tracking = () self.group_on = None self.group_off = None self.user_defined = user_defined diff --git a/homeassistant/components/tcp/sensor.py b/homeassistant/components/tcp/sensor.py index 62e78f6f88c0..5d457f2df7b6 100644 --- a/homeassistant/components/tcp/sensor.py +++ b/homeassistant/components/tcp/sensor.py @@ -51,7 +51,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class TcpSensor(Entity): """Implementation of a TCP socket based sensor.""" - required = tuple() + required = () def __init__(self, hass, config): """Set all the config values if they exist and get initial state.""" From 22ae498f3a3cb9de82ab652e70c9690c5cdaec09 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 22:49:15 +0200 Subject: [PATCH 105/653] Remove redundant open modes (#33652) --- homeassistant/__main__.py | 4 ++-- homeassistant/components/config/zwave.py | 2 +- homeassistant/components/fail2ban/sensor.py | 2 +- homeassistant/components/file/sensor.py | 2 +- homeassistant/components/google/__init__.py | 2 +- homeassistant/components/onewire/sensor.py | 4 ++-- homeassistant/components/remember_the_milk/__init__.py | 2 +- homeassistant/config.py | 4 ++-- homeassistant/scripts/macos/__init__.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index 5e7fab5bd54a..6dd5edb81b47 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -167,7 +167,7 @@ def daemonize() -> None: sys.exit(0) # redirect standard file descriptors to devnull - infd = open(os.devnull, "r") + infd = open(os.devnull) outfd = open(os.devnull, "a+") sys.stdout.flush() sys.stderr.flush() @@ -180,7 +180,7 @@ def check_pid(pid_file: str) -> None: """Check that Home Assistant is not already running.""" # Check pid file try: - with open(pid_file, "r") as file: + with open(pid_file) as file: pid = int(file.readline()) except OSError: # PID File does not exist diff --git a/homeassistant/components/config/zwave.py b/homeassistant/components/config/zwave.py index b792fcccec33..7e045934f7d2 100644 --- a/homeassistant/components/config/zwave.py +++ b/homeassistant/components/config/zwave.py @@ -61,7 +61,7 @@ class ZWaveLogView(HomeAssistantView): def _get_log(self, hass, lines): """Retrieve the logfile content.""" logfilepath = hass.config.path(OZW_LOG_FILENAME) - with open(logfilepath, "r") as logfile: + with open(logfilepath) as logfile: data = (line.rstrip() for line in logfile) if lines == 0: loglines = list(data) diff --git a/homeassistant/components/fail2ban/sensor.py b/homeassistant/components/fail2ban/sensor.py index 224ce83c214f..5a7e673ca029 100644 --- a/homeassistant/components/fail2ban/sensor.py +++ b/homeassistant/components/fail2ban/sensor.py @@ -114,7 +114,7 @@ class BanLogParser: """Read the fail2ban log and find entries for jail.""" self.data = list() try: - with open(self.log_file, "r", encoding="utf-8") as file_data: + with open(self.log_file, encoding="utf-8") as file_data: self.data = self.ip_regex[jail].findall(file_data.read()) except (IndexError, FileNotFoundError, IsADirectoryError, UnboundLocalError): diff --git a/homeassistant/components/file/sensor.py b/homeassistant/components/file/sensor.py index 96ae885ca77f..3f6d69325f01 100644 --- a/homeassistant/components/file/sensor.py +++ b/homeassistant/components/file/sensor.py @@ -77,7 +77,7 @@ class FileSensor(Entity): def update(self): """Get the latest entry from a file and updates the state.""" try: - with open(self._file_path, "r", encoding="utf-8") as file_data: + with open(self._file_path, encoding="utf-8") as file_data: for line in file_data: data = line data = data.strip() diff --git a/homeassistant/components/google/__init__.py b/homeassistant/components/google/__init__.py index f3321416b1f6..ec5afde0bacf 100644 --- a/homeassistant/components/google/__init__.py +++ b/homeassistant/components/google/__init__.py @@ -221,7 +221,7 @@ def setup(hass, config): def check_correct_scopes(token_file): """Check for the correct scopes in file.""" - tokenfile = open(token_file, "r").read() + tokenfile = open(token_file).read() if "readonly" in tokenfile: _LOGGER.warning("Please re-authenticate with Google.") return False diff --git a/homeassistant/components/onewire/sensor.py b/homeassistant/components/onewire/sensor.py index 41f41a6e93d5..da8b1ed359be 100644 --- a/homeassistant/components/onewire/sensor.py +++ b/homeassistant/components/onewire/sensor.py @@ -176,7 +176,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): # We have an owfs mounted else: for family_file_path in glob(os.path.join(base_dir, "*", "family")): - with open(family_file_path, "r") as family_file: + with open(family_file_path) as family_file: family = family_file.read() if "EF" in family: continue @@ -218,7 +218,7 @@ class OneWire(Entity): def _read_value_raw(self): """Read the value as it is returned by the sensor.""" - with open(self._device_file, "r") as ds_device_file: + with open(self._device_file) as ds_device_file: lines = ds_device_file.readlines() return lines diff --git a/homeassistant/components/remember_the_milk/__init__.py b/homeassistant/components/remember_the_milk/__init__.py index d31d83d3e9d3..52199b2b9c69 100644 --- a/homeassistant/components/remember_the_milk/__init__.py +++ b/homeassistant/components/remember_the_milk/__init__.py @@ -161,7 +161,7 @@ class RememberTheMilkConfiguration: return try: _LOGGER.debug("Loading configuration from file: %s", self._config_file_path) - with open(self._config_file_path, "r") as config_file: + with open(self._config_file_path) as config_file: self._config = json.load(config_file) except ValueError: _LOGGER.error( diff --git a/homeassistant/config.py b/homeassistant/config.py index 169f3c771975..0ac86c4eb4b2 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -339,7 +339,7 @@ def process_ha_config_upgrade(hass: HomeAssistant) -> None: version_path = hass.config.path(VERSION_FILE) try: - with open(version_path, "rt") as inp: + with open(version_path) as inp: conf_version = inp.readline().strip() except FileNotFoundError: # Last version to not have this file @@ -364,7 +364,7 @@ def process_ha_config_upgrade(hass: HomeAssistant) -> None: # 0.92 moved google/tts.py to google_translate/tts.py config_path = hass.config.path(YAML_CONFIG_FILE) - with open(config_path, "rt", encoding="utf-8") as config_file: + with open(config_path, encoding="utf-8") as config_file: config_raw = config_file.read() if TTS_PRE_92 in config_raw: diff --git a/homeassistant/scripts/macos/__init__.py b/homeassistant/scripts/macos/__init__.py index c09f9f09337d..b1c910013517 100644 --- a/homeassistant/scripts/macos/__init__.py +++ b/homeassistant/scripts/macos/__init__.py @@ -15,7 +15,7 @@ def install_osx(): template_path = os.path.join(os.path.dirname(__file__), "launchd.plist") - with open(template_path, "r", encoding="utf-8") as inp: + with open(template_path, encoding="utf-8") as inp: plist = inp.read() plist = plist.replace("$HASS_PATH$", hass_path) From d2e70eb967b962a28bfdd43c9e5a7452919789b1 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 4 Apr 2020 16:51:00 -0400 Subject: [PATCH 106/653] Add attribution to Sense component (#33657) --- homeassistant/components/sense/binary_sensor.py | 8 +++++++- homeassistant/components/sense/const.py | 2 ++ homeassistant/components/sense/sensor.py | 13 ++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sense/binary_sensor.py b/homeassistant/components/sense/binary_sensor.py index 50fb3fd7dc7e..e3e12e4a9f16 100644 --- a/homeassistant/components/sense/binary_sensor.py +++ b/homeassistant/components/sense/binary_sensor.py @@ -2,12 +2,13 @@ import logging from homeassistant.components.binary_sensor import BinarySensorDevice -from homeassistant.const import DEVICE_CLASS_POWER +from homeassistant.const import ATTR_ATTRIBUTION, DEVICE_CLASS_POWER from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_registry import async_get_registry from .const import ( + ATTRIBUTION, DOMAIN, MDI_ICONS, SENSE_DATA, @@ -100,6 +101,11 @@ class SenseDevice(BinarySensorDevice): """Return the old not so unique id of the binary sensor.""" return self._id + @property + def device_state_attributes(self): + """Return the state attributes.""" + return {ATTR_ATTRIBUTION: ATTRIBUTION} + @property def icon(self): """Return the icon of the binary sensor.""" diff --git a/homeassistant/components/sense/const.py b/homeassistant/components/sense/const.py index 882c3c9d79fb..66b21dbcac98 100644 --- a/homeassistant/components/sense/const.py +++ b/homeassistant/components/sense/const.py @@ -16,6 +16,8 @@ SENSE_DISCOVERED_DEVICES_DATA = "sense_discovered_devices" ACTIVE_NAME = "Energy" ACTIVE_TYPE = "active" +ATTRIBUTION = "Data provided by Sense.com" + CONSUMPTION_NAME = "Usage" CONSUMPTION_ID = "usage" PRODUCTION_NAME = "Production" diff --git a/homeassistant/components/sense/sensor.py b/homeassistant/components/sense/sensor.py index 06cfb90d2b55..d3cfb8b9db64 100644 --- a/homeassistant/components/sense/sensor.py +++ b/homeassistant/components/sense/sensor.py @@ -2,7 +2,12 @@ from datetime import timedelta import logging -from homeassistant.const import DEVICE_CLASS_POWER, ENERGY_KILO_WATT_HOUR, POWER_WATT +from homeassistant.const import ( + ATTR_ATTRIBUTION, + DEVICE_CLASS_POWER, + ENERGY_KILO_WATT_HOUR, + POWER_WATT, +) from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity @@ -11,6 +16,7 @@ from homeassistant.util import Throttle from .const import ( ACTIVE_NAME, ACTIVE_TYPE, + ATTRIBUTION, CONSUMPTION_ID, CONSUMPTION_NAME, DOMAIN, @@ -162,6 +168,11 @@ class SenseActiveSensor(Entity): """Return the unit of measurement of this entity, if any.""" return POWER_WATT + @property + def device_state_attributes(self): + """Return the state attributes.""" + return {ATTR_ATTRIBUTION: ATTRIBUTION} + @property def icon(self): """Icon to use in the frontend, if any.""" From dde93304d3a7ba1f438a0b9d1764393158280fad Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 23:09:34 +0200 Subject: [PATCH 107/653] Improve string formatting v2 (#33645) * Improve string formatting v2 * Improve string formatting v3 * Address review comments --- homeassistant/components/almond/__init__.py | 4 ++-- homeassistant/components/anthemav/media_player.py | 3 ++- homeassistant/components/apple_tv/__init__.py | 4 +++- homeassistant/components/bluesound/media_player.py | 6 ++---- homeassistant/components/denon/media_player.py | 7 ++++--- homeassistant/components/entur_public_transport/sensor.py | 2 +- homeassistant/components/itunes/media_player.py | 4 ++-- homeassistant/components/life360/device_tracker.py | 2 +- homeassistant/components/linky/sensor.py | 2 +- homeassistant/components/london_air/sensor.py | 6 +++--- homeassistant/components/modbus/sensor.py | 2 +- homeassistant/components/neato/vacuum.py | 2 +- homeassistant/components/onewire/sensor.py | 2 +- homeassistant/components/pioneer/media_player.py | 2 +- homeassistant/components/raspihats/switch.py | 4 ++-- homeassistant/components/rfxtrx/sensor.py | 2 +- homeassistant/components/thinkingcleaner/switch.py | 2 +- homeassistant/components/traccar/device_tracker.py | 2 +- homeassistant/components/wink/__init__.py | 4 ++-- homeassistant/components/wunderground/sensor.py | 2 +- homeassistant/components/xiaomi_miio/remote.py | 4 ++-- homeassistant/components/yamaha/media_player.py | 2 +- homeassistant/components/zha/core/device.py | 2 +- homeassistant/scripts/check_config.py | 2 +- script/hassfest/codeowners.py | 2 +- script/inspect_schemas.py | 2 +- tests/components/smartthings/conftest.py | 2 +- tests/components/zha/common.py | 2 +- 28 files changed, 42 insertions(+), 40 deletions(-) diff --git a/homeassistant/components/almond/__init__.py b/homeassistant/components/almond/__init__.py index 8877107b9847..c9870b4cd32f 100644 --- a/homeassistant/components/almond/__init__.py +++ b/homeassistant/components/almond/__init__.py @@ -286,9 +286,9 @@ class AlmondAgent(conversation.AbstractConversationAgent): buffer = "" for message in response["messages"]: if message["type"] == "text": - buffer += "\n" + message["text"] + buffer += f"\n{message['text']}" elif message["type"] == "picture": - buffer += "\n Picture: " + message["url"] + buffer += f"\n Picture: {message['url']}" elif message["type"] == "rdl": buffer += ( "\n Link: " diff --git a/homeassistant/components/anthemav/media_player.py b/homeassistant/components/anthemav/media_player.py index b7df82961c79..9a64b56b575d 100644 --- a/homeassistant/components/anthemav/media_player.py +++ b/homeassistant/components/anthemav/media_player.py @@ -186,4 +186,5 @@ class AnthemAVR(MediaPlayerDevice): def dump_avrdata(self): """Return state of avr object for debugging forensics.""" attrs = vars(self) - return "dump_avrdata: " + ", ".join("%s: %s" % item for item in attrs.items()) + items_string = ", ".join(f"{item}: {item}" for item in attrs.items()) + return f"dump_avrdata: {items_string}" diff --git a/homeassistant/components/apple_tv/__init__.py b/homeassistant/components/apple_tv/__init__.py index 52e02cfaf72a..aae4165fe5fe 100644 --- a/homeassistant/components/apple_tv/__init__.py +++ b/homeassistant/components/apple_tv/__init__.py @@ -129,8 +129,10 @@ async def scan_apple_tvs(hass): if not devices: devices = ["No device(s) found"] + found_devices = "

".join(devices) + hass.components.persistent_notification.async_create( - "The following devices were found:

" + "

".join(devices), + f"The following devices were found:

{found_devices}", title=NOTIFICATION_SCAN_TITLE, notification_id=NOTIFICATION_SCAN_ID, ) diff --git a/homeassistant/components/bluesound/media_player.py b/homeassistant/components/bluesound/media_player.py index 300927abefab..86e62adc6188 100644 --- a/homeassistant/components/bluesound/media_player.py +++ b/homeassistant/components/bluesound/media_player.py @@ -1038,9 +1038,7 @@ class BluesoundPlayer(MediaPlayerDevice): volume = 0 elif volume > 1: volume = 1 - return await self.send_bluesound_command( - "Volume?level=" + str(float(volume) * 100) - ) + return await self.send_bluesound_command(f"Volume?level={float(volume) * 100}") async def async_mute_volume(self, mute): """Send mute command to media player.""" @@ -1050,5 +1048,5 @@ class BluesoundPlayer(MediaPlayerDevice): self._lastvol = volume return await self.send_bluesound_command("Volume?level=0") return await self.send_bluesound_command( - "Volume?level=" + str(float(self._lastvol) * 100) + f"Volume?level={float(self._lastvol) * 100}" ) diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index cd9d6e8feb7c..9f210add0af0 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -257,11 +257,12 @@ class DenonDevice(MediaPlayerDevice): def set_volume_level(self, volume): """Set volume level, range 0..1.""" - self.telnet_command("MV" + str(round(volume * self._volume_max)).zfill(2)) + self.telnet_command(f"MV{str(round(volume * self._volume_max)).zfill(2)}") def mute_volume(self, mute): """Mute (true) or unmute (false) media player.""" - self.telnet_command("MU" + ("ON" if mute else "OFF")) + mute_status = "ON" if mute else "OFF" + self.telnet_command(f"MU{mute_status})") def media_play(self): """Play media player.""" @@ -289,4 +290,4 @@ class DenonDevice(MediaPlayerDevice): def select_source(self, source): """Select input source.""" - self.telnet_command("SI" + self._source_list.get(source)) + self.telnet_command(f"SI{self._source_list.get(source)}") diff --git a/homeassistant/components/entur_public_transport/sensor.py b/homeassistant/components/entur_public_transport/sensor.py index 0425accd06b7..19510337d6ad 100644 --- a/homeassistant/components/entur_public_transport/sensor.py +++ b/homeassistant/components/entur_public_transport/sensor.py @@ -241,7 +241,7 @@ class EnturPublicTransportSensor(Entity): return for i, call in enumerate(calls[2:]): - key_name = "departure_#" + str(i + 3) + key_name = f"departure_#{i + 3}" self._attributes[key_name] = ( f"{'' if bool(call.is_realtime) else 'ca. '}" f"{call.expected_departure_time.strftime('%H:%M')} {call.front_display}" diff --git a/homeassistant/components/itunes/media_player.py b/homeassistant/components/itunes/media_player.py index 327cbf5e9ac1..ccefb681d6ea 100644 --- a/homeassistant/components/itunes/media_player.py +++ b/homeassistant/components/itunes/media_player.py @@ -163,7 +163,7 @@ class Itunes: if found_playlists: playlist = found_playlists[0] - path = "/playlists/" + playlist["id"] + "/play" + path = f"/playlists/{playlist['id']}/play" return self._request("PUT", path) def artwork_url(self): @@ -324,7 +324,7 @@ class ItunesDevice(MediaPlayerDevice): self.player_state in (STATE_PLAYING, STATE_IDLE, STATE_PAUSED) and self.current_title is not None ): - return self.client.artwork_url() + "?id=" + self.content_id + return f"{self.client.artwork_url()}?id={self.content_id}" return ( "https://cloud.githubusercontent.com/assets/260/9829355" diff --git a/homeassistant/components/life360/device_tracker.py b/homeassistant/components/life360/device_tracker.py index b6cd67c26271..5403a483ffbf 100644 --- a/homeassistant/components/life360/device_tracker.py +++ b/homeassistant/components/life360/device_tracker.py @@ -214,7 +214,7 @@ class Life360Scanner: err_msg = member["issues"]["title"] if err_msg: if member["issues"]["dialog"]: - err_msg += ": " + member["issues"]["dialog"] + err_msg += f": {member['issues']['dialog']}" else: err_msg = "Location information missing" self._err(dev_id, err_msg) diff --git a/homeassistant/components/linky/sensor.py b/homeassistant/components/linky/sensor.py index 846b7eeb99f2..7e9da01eb9a8 100644 --- a/homeassistant/components/linky/sensor.py +++ b/homeassistant/components/linky/sensor.py @@ -159,4 +159,4 @@ class LinkySensor(Entity): year_index = INDEX_CURRENT if self._time.endswith("Dec"): year_index = INDEX_LAST - self._time += " " + self._account.data[YEARLY][year_index][TIME] + self._time += f" {self._account.data[YEARLY][year_index][TIME]}" diff --git a/homeassistant/components/london_air/sensor.py b/homeassistant/components/london_air/sensor.py index 77af10928dc7..7eb410cacab4 100644 --- a/homeassistant/components/london_air/sensor.py +++ b/homeassistant/components/london_air/sensor.py @@ -157,9 +157,9 @@ def parse_species(species_data): species_dict["code"] = species["@SpeciesCode"] species_dict["quality"] = species["@AirQualityBand"] species_dict["index"] = species["@AirQualityIndex"] - species_dict["summary"] = ( - species_dict["code"] + " is " + species_dict["quality"] - ) + species_dict[ + "summary" + ] = f"{species_dict['code']} is {species_dict['quality']}" parsed_species_data.append(species_dict) quality_list.append(species_dict["quality"]) return parsed_species_data, quality_list diff --git a/homeassistant/components/modbus/sensor.py b/homeassistant/components/modbus/sensor.py index 8c2b950648ba..59abe2fd6d5d 100644 --- a/homeassistant/components/modbus/sensor.py +++ b/homeassistant/components/modbus/sensor.py @@ -246,7 +246,7 @@ class ModbusRegisterSensor(RestoreEntity): if isinstance(val, int): self._value = str(val) if self._precision > 0: - self._value += "." + "0" * self._precision + self._value += f".{'0' * self._precision}" else: self._value = f"{val:.{self._precision}f}" diff --git a/homeassistant/components/neato/vacuum.py b/homeassistant/components/neato/vacuum.py index adff293301be..7a9cd1d9e45f 100644 --- a/homeassistant/components/neato/vacuum.py +++ b/homeassistant/components/neato/vacuum.py @@ -208,7 +208,7 @@ class NeatoConnectedVacuum(StateVacuumDevice): and "name" in self._state["cleaning"]["boundary"] ): self._status_state += ( - " " + self._state["cleaning"]["boundary"]["name"] + f" {self._state['cleaning']['boundary']['name']}" ) else: self._status_state = robot_alert diff --git a/homeassistant/components/onewire/sensor.py b/homeassistant/components/onewire/sensor.py index da8b1ed359be..90d943dd755f 100644 --- a/homeassistant/components/onewire/sensor.py +++ b/homeassistant/components/onewire/sensor.py @@ -210,7 +210,7 @@ class OneWire(Entity): def __init__(self, name, device_file, sensor_type): """Initialize the sensor.""" - self._name = name + " " + sensor_type.capitalize() + self._name = f"{name} {sensor_type.capitalize()}" self._device_file = device_file self._unit_of_measurement = SENSOR_TYPES[sensor_type][1] self._state = None diff --git a/homeassistant/components/pioneer/media_player.py b/homeassistant/components/pioneer/media_player.py index 66e57d156efb..6e9022711713 100644 --- a/homeassistant/components/pioneer/media_player.py +++ b/homeassistant/components/pioneer/media_player.py @@ -142,7 +142,7 @@ class PioneerDevice(MediaPlayerDevice): # Build the source name dictionaries if necessary if not self._source_name_to_number: for i in range(MAX_SOURCE_NUMBERS): - result = self.telnet_request(telnet, "?RGB" + str(i).zfill(2), "RGB") + result = self.telnet_request(telnet, f"?RGB{str(i).zfill(2)}", "RGB") if not result: continue diff --git a/homeassistant/components/raspihats/switch.py b/homeassistant/components/raspihats/switch.py index 8a083dbe2c91..d61295771188 100644 --- a/homeassistant/components/raspihats/switch.py +++ b/homeassistant/components/raspihats/switch.py @@ -106,8 +106,8 @@ class I2CHatSwitch(ToggleEntity): def _log_message(self, message): """Create log message.""" string = self._name + " " - string += self._board + "I2CHat@" + hex(self._address) + " " - string += "channel:" + str(self._channel) + message + string += f"{self._board}I2CHat@{hex(self._address)} " + string += f"channel:{str(self._channel)}{message}" return string @property diff --git a/homeassistant/components/rfxtrx/sensor.py b/homeassistant/components/rfxtrx/sensor.py index 3f74ff186956..759268140fc6 100644 --- a/homeassistant/components/rfxtrx/sensor.py +++ b/homeassistant/components/rfxtrx/sensor.py @@ -76,7 +76,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if not isinstance(event, SensorEvent): return - device_id = "sensor_" + slugify(event.device.id_string.lower()) + device_id = f"sensor_{slugify(event.device.id_string.lower())}" if device_id in RFX_DEVICES: sensors = RFX_DEVICES[device_id] diff --git a/homeassistant/components/thinkingcleaner/switch.py b/homeassistant/components/thinkingcleaner/switch.py index 172951ed1ef9..6ef1a6f9556c 100644 --- a/homeassistant/components/thinkingcleaner/switch.py +++ b/homeassistant/components/thinkingcleaner/switch.py @@ -98,7 +98,7 @@ class ThinkingCleanerSwitch(ToggleEntity): @property def name(self): """Return the name of the sensor.""" - return self._tc_object.name + " " + SWITCH_TYPES[self.type][0] + return f"{self._tc_object.name} {SWITCH_TYPES[self.type][0]}" @property def is_on(self): diff --git a/homeassistant/components/traccar/device_tracker.py b/homeassistant/components/traccar/device_tracker.py index b6e829750e91..dc2b60dec1ad 100644 --- a/homeassistant/components/traccar/device_tracker.py +++ b/homeassistant/components/traccar/device_tracker.py @@ -316,7 +316,7 @@ class TraccarScanner: None, ) self._hass.bus.async_fire( - "traccar_" + self._event_types.get(event["type"]), + f"traccar_{self._event_types.get(event['type'])}", { "device_traccar_id": event["deviceId"], "device_name": device_name, diff --git a/homeassistant/components/wink/__init__.py b/homeassistant/components/wink/__init__.py index 53bac129dbcc..54d3b2efde98 100644 --- a/homeassistant/components/wink/__init__.py +++ b/homeassistant/components/wink/__init__.py @@ -749,7 +749,7 @@ class WinkDevice(Entity): self.schedule_update_ha_state() except (ValueError, KeyError, AttributeError): _LOGGER.error( - "Error in pubnub JSON for %s polling API for current state", self.name, + "Error in pubnub JSON for %s polling API for current state", self.name ) self.schedule_update_ha_state(True) @@ -912,7 +912,7 @@ class WinkNimbusDialDevice(WinkDevice): @property def name(self): """Return the name of the device.""" - return self.parent.name() + " dial " + str(self.wink.index() + 1) + return f"{self.parent.name()} dial {self.wink.index() + 1}" @property def device_state_attributes(self): diff --git a/homeassistant/components/wunderground/sensor.py b/homeassistant/components/wunderground/sensor.py index de1e48c9c146..22aefa5be4aa 100644 --- a/homeassistant/components/wunderground/sensor.py +++ b/homeassistant/components/wunderground/sensor.py @@ -329,7 +329,7 @@ class WUAlertsSensorConfig(WUSensorConfig): for alert in ALERTS_ATTRS: if data[alert]: if multiple_alerts: - dkey = alert.capitalize() + "_" + data["type"] + dkey = f"{alert.capitalize()}_{data['type']}" else: dkey = alert.capitalize() attrs[dkey] = data[alert] diff --git a/homeassistant/components/xiaomi_miio/remote.py b/homeassistant/components/xiaomi_miio/remote.py index 9e4446f29642..8c4d68208b4d 100644 --- a/homeassistant/components/xiaomi_miio/remote.py +++ b/homeassistant/components/xiaomi_miio/remote.py @@ -100,12 +100,12 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= if DATA_KEY not in hass.data: hass.data[DATA_KEY] = {} - friendly_name = config.get(CONF_NAME, "xiaomi_miio_" + host.replace(".", "_")) + friendly_name = config.get(CONF_NAME, f"xiaomi_miio_{host.replace('.', '_')}") slot = config.get(CONF_SLOT) timeout = config.get(CONF_TIMEOUT) xiaomi_miio_remote = XiaomiMiioRemote( - friendly_name, device, unique_id, slot, timeout, config.get(CONF_COMMANDS), + friendly_name, device, unique_id, slot, timeout, config.get(CONF_COMMANDS) ) hass.data[DATA_KEY][host] = xiaomi_miio_remote diff --git a/homeassistant/components/yamaha/media_player.py b/homeassistant/components/yamaha/media_player.py index 7ab7d5b3a472..5aa0299200a9 100644 --- a/homeassistant/components/yamaha/media_player.py +++ b/homeassistant/components/yamaha/media_player.py @@ -233,7 +233,7 @@ class YamahaDevice(MediaPlayerDevice): zone_name = self._zone_names.get(self._zone, self._zone) if zone_name != "Main_Zone": # Zone will be one of Main_Zone, Zone_2, Zone_3 - name += " " + zone_name.replace("_", " ") + name += f" {zone_name.replace('_', ' ')}" return name @property diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 716ed5040ae7..e0d9cfa0a3ec 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -608,7 +608,7 @@ class ZHADevice(LogMixin): cluster_binding.id, group_id, ) - zdo.debug("processing " + op_msg, *op_params) + zdo.debug(f"processing {op_msg}", *op_params) tasks.append( ( zdo.request( diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index c5224f8f959f..23d90796c866 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -186,7 +186,7 @@ def check(config_dir, secrets=False): continue # The * in the key is removed to find the mock_function (side_effect) # This allows us to use one side_effect to patch multiple locations - mock_function = locals()["mock_" + key.replace("*", "")] + mock_function = locals()[f"mock_{key.replace('*', '')}"] PATCHES[key] = patch(val[0], side_effect=mock_function) # Start all patches diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 0a653ea0e90a..0fdb8eafb0fd 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -52,7 +52,7 @@ def generate_and_validate(integrations: Dict[str, Integration]): "homeassistant/components/{}/* {}".format(domain, " ".join(codeowners)) ) - parts.append("\n" + INDIVIDUAL_FILES.strip()) + parts.append(f"\n{INDIVIDUAL_FILES.strip()}") return "\n".join(parts) diff --git a/script/inspect_schemas.py b/script/inspect_schemas.py index 91a54f87f9e4..6ea37f26d103 100755 --- a/script/inspect_schemas.py +++ b/script/inspect_schemas.py @@ -52,7 +52,7 @@ def main(): add_msg( f"CONFIG_SCHEMA {schema_type}", - module_name + " " + color("cyan", str(schema)[:60]), + f"{module_name} {color('cyan', str(schema)[:60])}", ) for key in sorted(msg): diff --git a/tests/components/smartthings/conftest.py b/tests/components/smartthings/conftest.py index 0dc71ea72b9f..e05917c17d88 100644 --- a/tests/components/smartthings/conftest.py +++ b/tests/components/smartthings/conftest.py @@ -105,7 +105,7 @@ def app_fixture(hass, config_file): app.app_type = "WEBHOOK_SMART_APP" app.classifications = [CLASSIFICATION_AUTOMATION] app.display_name = "Home Assistant" - app.description = hass.config.location_name + " at " + hass.config.api.base_url + app.description = f"{hass.config.location_name} at {hass.config.api.base_url}" app.single_instance = True app.webhook_target_url = webhook.async_generate_url( hass, hass.data[DOMAIN][CONF_WEBHOOK_ID] diff --git a/tests/components/zha/common.py b/tests/components/zha/common.py index 2f0966ae7393..2542037a2bf1 100644 --- a/tests/components/zha/common.py +++ b/tests/components/zha/common.py @@ -146,7 +146,7 @@ async def find_entity_id(domain, zha_device, hass): machine so that we can test state changes. """ ieeetail = "".join([f"{o:02x}" for o in zha_device.ieee[:4]]) - head = f"{domain}." + slugify(f"{zha_device.name} {ieeetail}") + head = f"{domain}.{slugify(f'{zha_device.name} {ieeetail}')}" enitiy_ids = hass.states.async_entity_ids(domain) await hass.async_block_till_done() From db72039b8f613efcc2495f5018e3ef36ffac3473 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 4 Apr 2020 23:14:47 +0200 Subject: [PATCH 108/653] Use list literals (#33659) --- homeassistant/components/discord/notify.py | 4 ++-- homeassistant/components/ecobee/binary_sensor.py | 2 +- homeassistant/components/ecobee/sensor.py | 2 +- homeassistant/components/ecobee/weather.py | 4 ++-- homeassistant/components/fail2ban/sensor.py | 4 ++-- homeassistant/components/ios/__init__.py | 2 +- homeassistant/components/ios/sensor.py | 2 +- homeassistant/components/kodi/media_player.py | 2 +- homeassistant/components/mobile_app/binary_sensor.py | 2 +- homeassistant/components/mobile_app/sensor.py | 2 +- homeassistant/components/openhome/media_player.py | 4 ++-- homeassistant/components/sleepiq/binary_sensor.py | 2 +- homeassistant/components/sleepiq/sensor.py | 2 +- homeassistant/components/yeelight/light.py | 2 +- 14 files changed, 18 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/discord/notify.py b/homeassistant/components/discord/notify.py index 864b7da5e55a..19c25a2fd451 100644 --- a/homeassistant/components/discord/notify.py +++ b/homeassistant/components/discord/notify.py @@ -56,7 +56,7 @@ class DiscordNotificationService(BaseNotificationService): data = kwargs.get(ATTR_DATA) or {} if ATTR_IMAGES in data: - images = list() + images = [] for image in data.get(ATTR_IMAGES): image_exists = await self.hass.async_add_executor_job( @@ -84,7 +84,7 @@ class DiscordNotificationService(BaseNotificationService): # Must create new instances of File for each channel. files = None if images: - files = list() + files = [] for image in images: files.append(discord.File(image)) diff --git a/homeassistant/components/ecobee/binary_sensor.py b/homeassistant/components/ecobee/binary_sensor.py index a4062905eaa1..71aaee1c4054 100644 --- a/homeassistant/components/ecobee/binary_sensor.py +++ b/homeassistant/components/ecobee/binary_sensor.py @@ -10,7 +10,7 @@ from .const import _LOGGER, DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER async def async_setup_entry(hass, config_entry, async_add_entities): """Set up ecobee binary (occupancy) sensors.""" data = hass.data[DOMAIN] - dev = list() + dev = [] for index in range(len(data.ecobee.thermostats)): for sensor in data.ecobee.get_remote_sensors(index): for item in sensor["capability"]: diff --git a/homeassistant/components/ecobee/sensor.py b/homeassistant/components/ecobee/sensor.py index e510cc976a62..4fd1a061cff9 100644 --- a/homeassistant/components/ecobee/sensor.py +++ b/homeassistant/components/ecobee/sensor.py @@ -20,7 +20,7 @@ SENSOR_TYPES = { async def async_setup_entry(hass, config_entry, async_add_entities): """Set up ecobee (temperature and humidity) sensors.""" data = hass.data[DOMAIN] - dev = list() + dev = [] for index in range(len(data.ecobee.thermostats)): for sensor in data.ecobee.get_remote_sensors(index): for item in sensor["capability"]: diff --git a/homeassistant/components/ecobee/weather.py b/homeassistant/components/ecobee/weather.py index 95ed220a16cd..457d924d2fb3 100644 --- a/homeassistant/components/ecobee/weather.py +++ b/homeassistant/components/ecobee/weather.py @@ -26,7 +26,7 @@ from .const import ( async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the ecobee weather platform.""" data = hass.data[DOMAIN] - dev = list() + dev = [] for index in range(len(data.ecobee.thermostats)): thermostat = data.ecobee.get_thermostat(index) if "weather" in thermostat: @@ -164,7 +164,7 @@ class EcobeeWeather(WeatherEntity): if "forecasts" not in self.weather: return None - forecasts = list() + forecasts = [] for day in range(1, 5): forecast = _process_forecast(self.weather["forecasts"][day]) if forecast is None: diff --git a/homeassistant/components/fail2ban/sensor.py b/homeassistant/components/fail2ban/sensor.py index 5a7e673ca029..2f206dca737a 100644 --- a/homeassistant/components/fail2ban/sensor.py +++ b/homeassistant/components/fail2ban/sensor.py @@ -107,12 +107,12 @@ class BanLogParser: def __init__(self, log_file): """Initialize the parser.""" self.log_file = log_file - self.data = list() + self.data = [] self.ip_regex = {} def read_log(self, jail): """Read the fail2ban log and find entries for jail.""" - self.data = list() + self.data = [] try: with open(self.log_file, encoding="utf-8") as file_data: self.data = self.ip_regex[jail].findall(file_data.read()) diff --git a/homeassistant/components/ios/__init__.py b/homeassistant/components/ios/__init__.py index 3f193993c2bc..9eec508bbd55 100644 --- a/homeassistant/components/ios/__init__.py +++ b/homeassistant/components/ios/__init__.py @@ -195,7 +195,7 @@ def devices_with_push(hass): def enabled_push_ids(hass): """Return a list of push enabled target push IDs.""" - push_ids = list() + push_ids = [] for device in hass.data[DOMAIN][ATTR_DEVICES].values(): if device.get(ATTR_PUSH_ID) is not None: push_ids.append(device.get(ATTR_PUSH_ID)) diff --git a/homeassistant/components/ios/sensor.py b/homeassistant/components/ios/sensor.py index e12ab9b4a403..1a655e242f96 100644 --- a/homeassistant/components/ios/sensor.py +++ b/homeassistant/components/ios/sensor.py @@ -20,7 +20,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): async def async_setup_entry(hass, config_entry, async_add_entities): """Set up iOS from a config entry.""" - dev = list() + dev = [] for device_name, device in ios.devices(hass).items(): for sensor_type in ("level", "state"): dev.append(IOSSensor(sensor_type, device_name, device)) diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index 5f53de899e40..33e7c014e40b 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -333,7 +333,7 @@ class KodiDevice(MediaPlayerDevice): self._turn_on_action = turn_on_action self._turn_off_action = turn_off_action self._enable_websocket = websocket - self._players = list() + self._players = [] self._properties = {} self._item = {} self._app_properties = {} diff --git a/homeassistant/components/mobile_app/binary_sensor.py b/homeassistant/components/mobile_app/binary_sensor.py index 73bf925553e5..c04a1af316dc 100644 --- a/homeassistant/components/mobile_app/binary_sensor.py +++ b/homeassistant/components/mobile_app/binary_sensor.py @@ -18,7 +18,7 @@ from .entity import MobileAppEntity, sensor_id async def async_setup_entry(hass, config_entry, async_add_entities): """Set up mobile app binary sensor from a config entry.""" - entities = list() + entities = [] webhook_id = config_entry.data[CONF_WEBHOOK_ID] diff --git a/homeassistant/components/mobile_app/sensor.py b/homeassistant/components/mobile_app/sensor.py index 199ba968dd22..11e07ed5e797 100644 --- a/homeassistant/components/mobile_app/sensor.py +++ b/homeassistant/components/mobile_app/sensor.py @@ -18,7 +18,7 @@ from .entity import MobileAppEntity, sensor_id async def async_setup_entry(hass, config_entry, async_add_entities): """Set up mobile app sensor from a config entry.""" - entities = list() + entities = [] webhook_id = config_entry.data[CONF_WEBHOOK_ID] diff --git a/homeassistant/components/openhome/media_player.py b/homeassistant/components/openhome/media_player.py index 967bce6007ea..8456ae9338dc 100644 --- a/homeassistant/components/openhome/media_player.py +++ b/homeassistant/components/openhome/media_player.py @@ -64,7 +64,7 @@ class OpenhomeDevice(MediaPlayerDevice): self._volume_level = None self._volume_muted = None self._supported_features = SUPPORT_OPENHOME - self._source_names = list() + self._source_names = [] self._source_index = {} self._source = {} self._name = None @@ -79,7 +79,7 @@ class OpenhomeDevice(MediaPlayerDevice): self._name = self._device.Room().decode("utf-8") self._supported_features = SUPPORT_OPENHOME source_index = {} - source_names = list() + source_names = [] if self._device.VolumeEnabled(): self._supported_features |= ( diff --git a/homeassistant/components/sleepiq/binary_sensor.py b/homeassistant/components/sleepiq/binary_sensor.py index b9278fab2782..8396537a2a0c 100644 --- a/homeassistant/components/sleepiq/binary_sensor.py +++ b/homeassistant/components/sleepiq/binary_sensor.py @@ -11,7 +11,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data = sleepiq.DATA data.update() - dev = list() + dev = [] for bed_id, bed in data.beds.items(): for side in sleepiq.SIDES: if getattr(bed, side) is not None: diff --git a/homeassistant/components/sleepiq/sensor.py b/homeassistant/components/sleepiq/sensor.py index 3c2df69331c8..404823abe96a 100644 --- a/homeassistant/components/sleepiq/sensor.py +++ b/homeassistant/components/sleepiq/sensor.py @@ -12,7 +12,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data = sleepiq.DATA data.update() - dev = list() + dev = [] for bed_id, bed in data.beds.items(): for side in sleepiq.SIDES: if getattr(bed, side) is not None: diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 2f69b98bcbcf..ab49e46938ce 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -679,7 +679,7 @@ class YeelightGenericLight(Light): red, green, blue = color_util.color_hs_to_RGB(*self._hs) - transitions = list() + transitions = [] transitions.append( RGBTransition(255, 0, 0, brightness=10, duration=duration) ) From feed139ae7b4d1dcfa3a1d5b4aa13f724916205b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 4 Apr 2020 23:20:48 +0200 Subject: [PATCH 109/653] Small code style improvements to Alexa integration (#33660) --- .../components/alexa/capabilities.py | 27 +++++++++---------- homeassistant/components/alexa/entities.py | 13 ++++----- homeassistant/components/alexa/handlers.py | 14 +++++----- homeassistant/components/alexa/intent.py | 2 +- homeassistant/components/alexa/resources.py | 15 +++++------ 5 files changed, 34 insertions(+), 37 deletions(-) diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py index 63be7df2eade..5e1932ceb679 100644 --- a/homeassistant/components/alexa/capabilities.py +++ b/homeassistant/components/alexa/capabilities.py @@ -734,12 +734,11 @@ class AlexaPlaybackController(AlexaCapability): media_player.SUPPORT_STOP: "Stop", } - supported_operations = [] - for operation in operations: - if operation & supported_features: - supported_operations.append(operations[operation]) - - return supported_operations + return [ + value + for operation, value in operations.items() + if operation & supported_features + ] class AlexaInputController(AlexaCapability): @@ -759,9 +758,7 @@ class AlexaInputController(AlexaCapability): source_list = self.entity.attributes.get( media_player.ATTR_INPUT_SOURCE_LIST, [] ) - input_list = AlexaInputController.get_valid_inputs(source_list) - - return input_list + return AlexaInputController.get_valid_inputs(source_list) @staticmethod def get_valid_inputs(source_list): @@ -1829,10 +1826,11 @@ class AlexaEqualizerController(AlexaCapability): configurations = None sound_mode_list = self.entity.attributes.get(media_player.ATTR_SOUND_MODE_LIST) if sound_mode_list: - supported_sound_modes = [] - for sound_mode in sound_mode_list: - if sound_mode.upper() in ("MOVIE", "MUSIC", "NIGHT", "SPORT", "TV"): - supported_sound_modes.append({"name": sound_mode.upper()}) + supported_sound_modes = [ + {"name": sound_mode.upper()} + for sound_mode in sound_mode_list + if sound_mode.upper() in ("MOVIE", "MUSIC", "NIGHT", "SPORT", "TV") + ] configurations = {"modes": {"supported": supported_sound_modes}} @@ -1890,7 +1888,7 @@ class AlexaCameraStreamController(AlexaCapability): def camera_stream_configurations(self): """Return cameraStreamConfigurations object.""" - camera_stream_configurations = [ + return [ { "protocols": ["HLS"], "resolutions": [{"width": 1280, "height": 720}], @@ -1899,4 +1897,3 @@ class AlexaCameraStreamController(AlexaCapability): "audioCodecs": ["AAC"], } ] - return camera_stream_configurations diff --git a/homeassistant/components/alexa/entities.py b/homeassistant/components/alexa/entities.py index fce05c8dc86e..e5eca399b9cd 100644 --- a/homeassistant/components/alexa/entities.py +++ b/homeassistant/components/alexa/entities.py @@ -268,8 +268,7 @@ class AlexaEntity: if not interface.properties_proactively_reported(): continue - for prop in interface.serialize_properties(): - yield prop + yield from interface.serialize_properties() def serialize_discovery(self): """Serialize the entity for discovery.""" @@ -283,10 +282,12 @@ class AlexaEntity: } locale = self.config.locale - capabilities = [] - for i in self.interfaces(): - if locale in i.supported_locales: - capabilities.append(i.serialize_discovery()) + capabilities = [ + i.serialize_discovery() + for i in self.interfaces() + if locale in i.supported_locales + ] + result["capabilities"] = capabilities return result diff --git a/homeassistant/components/alexa/handlers.py b/homeassistant/components/alexa/handlers.py index b3885588b0ff..6b903665c174 100644 --- a/homeassistant/components/alexa/handlers.py +++ b/homeassistant/components/alexa/handlers.py @@ -355,7 +355,6 @@ async def async_api_deactivate(hass, config, directive, context): async def async_api_set_percentage(hass, config, directive, context): """Process a set percentage request.""" entity = directive.entity - percentage = int(directive.payload["percentage"]) service = None data = {ATTR_ENTITY_ID: entity.entity_id} @@ -363,6 +362,7 @@ async def async_api_set_percentage(hass, config, directive, context): service = fan.SERVICE_SET_SPEED speed = "off" + percentage = int(directive.payload["percentage"]) if percentage <= 33: speed = "low" elif percentage <= 66: @@ -568,7 +568,7 @@ async def async_api_adjust_volume_step(hass, config, directive, context): data = {ATTR_ENTITY_ID: entity.entity_id} - for _ in range(0, abs(volume_int)): + for _ in range(abs(volume_int)): await hass.services.async_call( entity.domain, service_volume, data, blocking=False, context=context ) @@ -849,7 +849,6 @@ async def async_api_reportstate(hass, config, directive, context): async def async_api_set_power_level(hass, config, directive, context): """Process a SetPowerLevel request.""" entity = directive.entity - percentage = int(directive.payload["powerLevel"]) service = None data = {ATTR_ENTITY_ID: entity.entity_id} @@ -857,6 +856,7 @@ async def async_api_set_power_level(hass, config, directive, context): service = fan.SERVICE_SET_SPEED speed = "off" + percentage = int(directive.payload["powerLevel"]) if percentage <= 33: speed = "low" elif percentage <= 66: @@ -920,10 +920,10 @@ async def async_api_arm(hass, config, directive, context): if arm_state == "ARMED_AWAY": service = SERVICE_ALARM_ARM_AWAY - if arm_state == "ARMED_STAY": - service = SERVICE_ALARM_ARM_HOME - if arm_state == "ARMED_NIGHT": + elif arm_state == "ARMED_NIGHT": service = SERVICE_ALARM_ARM_NIGHT + elif arm_state == "ARMED_STAY": + service = SERVICE_ALARM_ARM_HOME await hass.services.async_call( entity.domain, service, data, blocking=False, context=context @@ -1383,7 +1383,7 @@ async def async_api_skipchannel(hass, config, directive, context): else: service_media = SERVICE_MEDIA_NEXT_TRACK - for _ in range(0, abs(channel)): + for _ in range(abs(channel)): await hass.services.async_call( entity.domain, service_media, data, blocking=False, context=context ) diff --git a/homeassistant/components/alexa/intent.py b/homeassistant/components/alexa/intent.py index 4cb75c65bc97..f879b66268b9 100644 --- a/homeassistant/components/alexa/intent.py +++ b/homeassistant/components/alexa/intent.py @@ -201,7 +201,7 @@ def resolve_slot_synonyms(key, request): _LOGGER.debug( "Found multiple synonym resolutions for slot value: {%s: %s}", key, - request["value"], + resolved_value, ) return resolved_value diff --git a/homeassistant/components/alexa/resources.py b/homeassistant/components/alexa/resources.py index d2580f3bfea8..5c02eca4fb2d 100644 --- a/homeassistant/components/alexa/resources.py +++ b/homeassistant/components/alexa/resources.py @@ -296,14 +296,13 @@ class AlexaPresetResource(AlexaCapabilityResource): configuration["unitOfMeasure"] = self._unit_of_measure if self._presets: - preset_resources = [] - for preset in self._presets: - preset_resources.append( - { - "rangeValue": preset["value"], - "presetResources": self.serialize_labels(preset["labels"]), - } - ) + preset_resources = [ + { + "rangeValue": preset["value"], + "presetResources": self.serialize_labels(preset["labels"]), + } + for preset in self._presets + ] configuration["presets"] = preset_resources return configuration From 0a3ec6fea17284aa9ce537218635cfd6eab47332 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 4 Apr 2020 14:29:03 -0700 Subject: [PATCH 110/653] Correct Hue mireds for lights (#33597) --- homeassistant/components/hue/light.py | 16 +++++++ tests/components/hue/test_light.py | 64 ++++++++++++--------------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/homeassistant/components/hue/light.py b/homeassistant/components/hue/light.py index 649be55e94e9..8a3a5c84c025 100644 --- a/homeassistant/components/hue/light.py +++ b/homeassistant/components/hue/light.py @@ -278,6 +278,22 @@ class HueLight(Light): return self.light.action.get("ct") return self.light.state.get("ct") + @property + def min_mireds(self): + """Return the coldest color_temp that this light supports.""" + if self.is_group: + return super().min_mireds + + return self.light.controlcapabilities["ct"]["min"] + + @property + def max_mireds(self): + """Return the warmest color_temp that this light supports.""" + if self.is_group: + return super().min_mireds + + return self.light.controlcapabilities["ct"]["max"] + @property def is_on(self): """Return true if device is on.""" diff --git a/tests/components/hue/test_light.py b/tests/components/hue/test_light.py index 998e3cdea503..c4a2a2fc09a5 100644 --- a/tests/components/hue/test_light.py +++ b/tests/components/hue/test_light.py @@ -49,6 +49,17 @@ GROUP_RESPONSE = { "state": {"any_on": True, "all_on": False}, }, } +LIGHT_1_CAPABILITIES = { + "certified": True, + "control": { + "mindimlevel": 5000, + "maxlumen": 600, + "colorgamuttype": "A", + "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], + "ct": {"min": 153, "max": 500}, + }, + "streaming": {"renderer": True, "proxy": False}, +} LIGHT_1_ON = { "state": { "on": True, @@ -62,12 +73,7 @@ LIGHT_1_ON = { "colormode": "xy", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_1_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 1", "modelid": "LCT001", @@ -88,12 +94,7 @@ LIGHT_1_OFF = { "colormode": "xy", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_1_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 1", "modelid": "LCT001", @@ -101,6 +102,17 @@ LIGHT_1_OFF = { "manufacturername": "Philips", "uniqueid": "456", } +LIGHT_2_CAPABILITIES = { + "certified": True, + "control": { + "mindimlevel": 5000, + "maxlumen": 600, + "colorgamuttype": "A", + "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], + "ct": {"min": 153, "max": 500}, + }, + "streaming": {"renderer": True, "proxy": False}, +} LIGHT_2_OFF = { "state": { "on": False, @@ -114,12 +126,7 @@ LIGHT_2_OFF = { "colormode": "hs", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_2_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 2", "modelid": "LCT001", @@ -140,12 +147,7 @@ LIGHT_2_ON = { "colormode": "hs", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_2_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 2 new", "modelid": "LCT001", @@ -353,12 +355,7 @@ async def test_new_light_discovered(hass, mock_bridge): "colormode": "hs", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_1_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 3", "modelid": "LCT001", @@ -518,12 +515,7 @@ async def test_other_light_update(hass, mock_bridge): "colormode": "hs", "reachable": True, }, - "capabilities": { - "control": { - "colorgamuttype": "A", - "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - } - }, + "capabilities": LIGHT_2_CAPABILITIES, "type": "Extended color light", "name": "Hue Lamp 2 new", "modelid": "LCT001", From c3c7b68cacd345b3601be055943eede160992e8c Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sun, 5 Apr 2020 00:38:20 +0300 Subject: [PATCH 111/653] Fix unhandled exceptions in dsmr (#33601) * reordered the clearing of the closed Event so it can stay set at the end and not leave a task waiting on close * fixed the side effect so it returns one TimeoutError and after that success Previously it reached the end of the single item list and threw an exception * fixed the error. it doesn't happen on python 3.7.5 but CI is on 3.7.0 * fixed comment --- tests/components/dsmr/test_sensor.py | 18 ++++++++++-------- tests/ignore_uncaught_exceptions.py | 7 ------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/tests/components/dsmr/test_sensor.py b/tests/components/dsmr/test_sensor.py index ead9e08d00fa..9f3b45d40e32 100644 --- a/tests/components/dsmr/test_sensor.py +++ b/tests/components/dsmr/test_sensor.py @@ -8,7 +8,8 @@ Entity to be updated with new values. import asyncio import datetime from decimal import Decimal -from unittest.mock import Mock +from itertools import chain, repeat +from unittest.mock import DEFAULT, Mock import asynctest import pytest @@ -323,9 +324,10 @@ async def test_connection_errors_retry(hass, monkeypatch, mock_connection_factor config = {"platform": "dsmr", "reconnect_interval": 0} - # override the mock to have it fail the first time - first_fail_connection_factory = Mock( - wraps=connection_factory, side_effect=[TimeoutError] + # override the mock to have it fail the first time and succeed after + first_fail_connection_factory = asynctest.CoroutineMock( + return_value=(transport, protocol), + side_effect=chain([TimeoutError], repeat(DEFAULT)), ) monkeypatch.setattr( @@ -336,7 +338,7 @@ async def test_connection_errors_retry(hass, monkeypatch, mock_connection_factor # wait for sleep to resolve await hass.async_block_till_done() - assert first_fail_connection_factory.call_count == 2, "connecting not retried" + assert first_fail_connection_factory.call_count >= 2, "connecting not retried" async def test_reconnect(hass, monkeypatch, mock_connection_factory): @@ -352,7 +354,6 @@ async def test_reconnect(hass, monkeypatch, mock_connection_factory): async def wait_closed(): await closed.wait() closed2.set() - closed.clear() protocol.wait_closed = wait_closed @@ -365,9 +366,10 @@ async def test_reconnect(hass, monkeypatch, mock_connection_factory): # wait for lock set to resolve await closed2.wait() closed2.clear() - assert not closed.is_set() + closed.clear() - closed.set() await hass.async_block_till_done() assert connection_factory.call_count >= 2, "connecting not retried" + # setting it so teardown can be successful + closed.set() diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index f0a47b3e64f4..dc93f9a6350b 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -8,13 +8,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.default_config.test_init", "test_setup"), ("tests.components.demo.test_init", "test_setting_up_demo"), ("tests.components.discovery.test_init", "test_discover_config_flow"), - ("tests.components.dsmr.test_sensor", "test_default_setup"), - ("tests.components.dsmr.test_sensor", "test_v4_meter"), - ("tests.components.dsmr.test_sensor", "test_v5_meter"), - ("tests.components.dsmr.test_sensor", "test_belgian_meter"), - ("tests.components.dsmr.test_sensor", "test_belgian_meter_low"), - ("tests.components.dsmr.test_sensor", "test_tcp"), - ("tests.components.dsmr.test_sensor", "test_connection_errors_retry"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_attributes"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_update_state"), ( From 1c25468b21d4d78b57c1acf8c2fcf556ee2c6107 Mon Sep 17 00:00:00 2001 From: shred86 <32663154+shred86@users.noreply.github.com> Date: Sat, 4 Apr 2020 15:19:59 -0700 Subject: [PATCH 112/653] Add await to coroutines in Abode (#33664) --- homeassistant/components/abode/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/abode/__init__.py b/homeassistant/components/abode/__init__.py index 9f4c1dc5fd32..84d1d34bd786 100644 --- a/homeassistant/components/abode/__init__.py +++ b/homeassistant/components/abode/__init__.py @@ -292,7 +292,7 @@ class AbodeEntity(Entity): async def async_added_to_hass(self): """Subscribe to Abode connection status updates.""" - self.hass.async_add_executor_job( + await self.hass.async_add_executor_job( self._data.abode.events.add_connection_status_callback, self.unique_id, self._update_connection_status, @@ -302,7 +302,7 @@ class AbodeEntity(Entity): async def async_will_remove_from_hass(self): """Unsubscribe from Abode connection status updates.""" - self.hass.async_add_executor_job( + await self.hass.async_add_executor_job( self._data.abode.events.remove_connection_status_callback, self.unique_id, ) @@ -323,7 +323,7 @@ class AbodeDevice(AbodeEntity): async def async_added_to_hass(self): """Subscribe to device events.""" await super().async_added_to_hass() - self.hass.async_add_executor_job( + await self.hass.async_add_executor_job( self._data.abode.events.add_device_callback, self._device.device_id, self._update_callback, @@ -332,7 +332,7 @@ class AbodeDevice(AbodeEntity): async def async_will_remove_from_hass(self): """Unsubscribe from device events.""" await super().async_will_remove_from_hass() - self.hass.async_add_executor_job( + await self.hass.async_add_executor_job( self._data.abode.events.remove_all_device_callbacks, self._device.device_id ) From 906385172abd0c13b35523de583a10b545d98930 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 00:26:08 +0200 Subject: [PATCH 113/653] String formatting improvements for tests (#33663) --- tests/components/alexa/__init__.py | 2 +- tests/components/bom/test_sensor.py | 4 +-- tests/components/broadlink/test_init.py | 2 +- tests/components/command_line/test_cover.py | 8 ++--- tests/components/command_line/test_notify.py | 4 +-- tests/components/command_line/test_switch.py | 22 ++++++------ .../components/config/test_config_entries.py | 17 ++++------ tests/components/darksky/test_sensor.py | 2 +- tests/components/datadog/test_init.py | 9 ++--- tests/components/demo/test_vacuum.py | 12 +++---- tests/components/device_tracker/test_init.py | 2 +- tests/components/dialogflow/test_init.py | 34 +++++++++---------- tests/components/efergy/test_sensor.py | 14 ++++---- tests/components/history/test_init.py | 10 +++--- .../components/image_processing/test_init.py | 12 ++----- tests/components/influxdb/test_init.py | 26 +++++++------- tests/components/locative/test_init.py | 12 +++---- tests/components/logbook/test_init.py | 18 +++++----- tests/components/mobile_app/test_entity.py | 6 ++-- tests/components/mqtt_room/test_sensor.py | 6 ++-- .../openalpr_local/test_image_processing.py | 4 +-- tests/components/ps4/test_media_player.py | 4 +-- tests/components/python_script/test_init.py | 2 +- tests/components/recorder/test_init.py | 2 +- tests/components/roku/__init__.py | 2 +- tests/components/scene/test_init.py | 6 ++-- tests/components/script/test_init.py | 2 +- tests/components/shell_command/test_init.py | 8 ++--- tests/components/shopping_list/test_init.py | 10 +++--- tests/components/sleepiq/test_init.py | 6 ++-- tests/components/switch/test_init.py | 2 +- tests/components/tplink/test_init.py | 4 +-- tests/components/traccar/test_init.py | 10 +++--- 33 files changed, 129 insertions(+), 155 deletions(-) diff --git a/tests/components/alexa/__init__.py b/tests/components/alexa/__init__.py index 04f90476c573..a3bc548ee287 100644 --- a/tests/components/alexa/__init__.py +++ b/tests/components/alexa/__init__.py @@ -205,4 +205,4 @@ class ReportedProperties: assert prop["value"] == value return prop - assert False, "property %s:%s not in %r" % (namespace, name, self.properties) + assert False, f"property {namespace}:{name} not in {self.properties!r}" diff --git a/tests/components/bom/test_sensor.py b/tests/components/bom/test_sensor.py index 6d452f7a6a38..7a9daa26c2b6 100644 --- a/tests/components/bom/test_sensor.py +++ b/tests/components/bom/test_sensor.py @@ -50,7 +50,7 @@ def mocked_requests(*args, **kwargs): if re.match(r"^/fwo/[\w]+/[\w.]+\.json", url.path): return MockResponse(json.loads(load_fixture("bom_weather.json")), 200) - raise NotImplementedError("Unknown route {}".format(url.path)) + raise NotImplementedError(f"Unknown route {url.path}") class TestBOMWeatherSensor(unittest.TestCase): @@ -78,7 +78,7 @@ class TestBOMWeatherSensor(unittest.TestCase): ] for entity_id in fake_entities: - state = self.hass.states.get("sensor.{}".format(entity_id)) + state = self.hass.states.get(f"sensor.{entity_id}") assert state is not None @patch("requests.get", side_effect=mocked_requests) diff --git a/tests/components/broadlink/test_init.py b/tests/components/broadlink/test_init.py index d4e3c993cd02..1bdad193f525 100644 --- a/tests/components/broadlink/test_init.py +++ b/tests/components/broadlink/test_init.py @@ -69,7 +69,7 @@ async def test_learn(hass): assert mock_create.call_count == 1 assert mock_create.call_args == call( - "Received packet is: {}".format(DUMMY_IR_PACKET), title="Broadlink switch" + f"Received packet is: {DUMMY_IR_PACKET}", title="Broadlink switch" ) diff --git a/tests/components/command_line/test_cover.py b/tests/components/command_line/test_cover.py index 1cd76581bdc7..fc359d49b265 100644 --- a/tests/components/command_line/test_cover.py +++ b/tests/components/command_line/test_cover.py @@ -54,10 +54,10 @@ async def test_state_value(hass): with tempfile.TemporaryDirectory() as tempdirname: path = os.path.join(tempdirname, "cover_status") test_cover = { - "command_state": "cat {}".format(path), - "command_open": "echo 1 > {}".format(path), - "command_close": "echo 1 > {}".format(path), - "command_stop": "echo 0 > {}".format(path), + "command_state": f"cat {path}", + "command_open": f"echo 1 > {path}", + "command_close": f"echo 1 > {path}", + "command_stop": f"echo 0 > {path}", "value_template": "{{ value }}", } assert ( diff --git a/tests/components/command_line/test_notify.py b/tests/components/command_line/test_notify.py index 8bdc4ba0a015..cd9371158685 100644 --- a/tests/components/command_line/test_notify.py +++ b/tests/components/command_line/test_notify.py @@ -57,7 +57,7 @@ class TestCommandLine(unittest.TestCase): "notify": { "name": "test", "platform": "command_line", - "command": "echo $(cat) > {}".format(filename), + "command": f"echo $(cat) > {filename}", } }, ) @@ -69,7 +69,7 @@ class TestCommandLine(unittest.TestCase): with open(filename) as fil: # the echo command adds a line break - assert fil.read() == "{}\n".format(message) + assert fil.read() == f"{message}\n" @patch("homeassistant.components.command_line.notify._LOGGER.error") def test_error_for_none_zero_exit_code(self, mock_error): diff --git a/tests/components/command_line/test_switch.py b/tests/components/command_line/test_switch.py index 497fb0c25235..acdb5b23b104 100644 --- a/tests/components/command_line/test_switch.py +++ b/tests/components/command_line/test_switch.py @@ -30,8 +30,8 @@ class TestCommandSwitch(unittest.TestCase): with tempfile.TemporaryDirectory() as tempdirname: path = os.path.join(tempdirname, "switch_status") test_switch = { - "command_on": "echo 1 > {}".format(path), - "command_off": "echo 0 > {}".format(path), + "command_on": f"echo 1 > {path}", + "command_off": f"echo 0 > {path}", } assert setup_component( self.hass, @@ -64,9 +64,9 @@ class TestCommandSwitch(unittest.TestCase): with tempfile.TemporaryDirectory() as tempdirname: path = os.path.join(tempdirname, "switch_status") test_switch = { - "command_state": "cat {}".format(path), - "command_on": "echo 1 > {}".format(path), - "command_off": "echo 0 > {}".format(path), + "command_state": f"cat {path}", + "command_on": f"echo 1 > {path}", + "command_off": f"echo 0 > {path}", "value_template": '{{ value=="1" }}', } assert setup_component( @@ -102,9 +102,9 @@ class TestCommandSwitch(unittest.TestCase): oncmd = json.dumps({"status": "ok"}) offcmd = json.dumps({"status": "nope"}) test_switch = { - "command_state": "cat {}".format(path), - "command_on": "echo '{}' > {}".format(oncmd, path), - "command_off": "echo '{}' > {}".format(offcmd, path), + "command_state": f"cat {path}", + "command_on": f"echo '{oncmd}' > {path}", + "command_off": f"echo '{offcmd}' > {path}", "value_template": '{{ value_json.status=="ok" }}', } assert setup_component( @@ -138,9 +138,9 @@ class TestCommandSwitch(unittest.TestCase): with tempfile.TemporaryDirectory() as tempdirname: path = os.path.join(tempdirname, "switch_status") test_switch = { - "command_state": "cat {}".format(path), - "command_on": "echo 1 > {}".format(path), - "command_off": "echo 0 > {}".format(path), + "command_state": f"cat {path}", + "command_on": f"echo 1 > {path}", + "command_off": f"echo 0 > {path}", } assert setup_component( self.hass, diff --git a/tests/components/config/test_config_entries.py b/tests/components/config/test_config_entries.py index ccd41eeb3a57..d944ebb6eb63 100644 --- a/tests/components/config/test_config_entries.py +++ b/tests/components/config/test_config_entries.py @@ -97,9 +97,7 @@ async def test_remove_entry(hass, client): """Test removing an entry via the API.""" entry = MockConfigEntry(domain="demo", state=core_ce.ENTRY_STATE_LOADED) entry.add_to_hass(hass) - resp = await client.delete( - "/api/config/config_entries/entry/{}".format(entry.entry_id) - ) + resp = await client.delete(f"/api/config/config_entries/entry/{entry.entry_id}") assert resp.status == 200 data = await resp.json() assert data == {"require_restart": True} @@ -111,9 +109,7 @@ async def test_remove_entry_unauth(hass, client, hass_admin_user): hass_admin_user.groups = [] entry = MockConfigEntry(domain="demo", state=core_ce.ENTRY_STATE_LOADED) entry.add_to_hass(hass) - resp = await client.delete( - "/api/config/config_entries/entry/{}".format(entry.entry_id) - ) + resp = await client.delete(f"/api/config/config_entries/entry/{entry.entry_id}") assert resp.status == 401 assert len(hass.config_entries.async_entries()) == 1 @@ -124,7 +120,7 @@ async def test_available_flows(hass, client): resp = await client.get("/api/config/config_entries/flow_handlers") assert resp.status == 200 data = await resp.json() - assert set(data) == set(["hello", "world"]) + assert set(data) == {"hello", "world"} ############################ @@ -294,7 +290,7 @@ async def test_two_step_flow(hass, client): with patch.dict(HANDLERS, {"test": TestFlow}): resp = await client.post( - "/api/config/config_entries/flow/{}".format(flow_id), + f"/api/config/config_entries/flow/{flow_id}", json={"user_title": "user-title"}, ) assert resp.status == 200 @@ -352,8 +348,7 @@ async def test_continue_flow_unauth(hass, client, hass_admin_user): hass_admin_user.groups = [] resp = await client.post( - "/api/config/config_entries/flow/{}".format(flow_id), - json={"user_title": "user-title"}, + f"/api/config/config_entries/flow/{flow_id}", json={"user_title": "user-title"}, ) assert resp.status == 401 @@ -559,7 +554,7 @@ async def test_two_step_options_flow(hass, client): with patch.dict(HANDLERS, {"test": TestFlow}): resp = await client.post( - "/api/config/config_entries/options/flow/{}".format(flow_id), + f"/api/config/config_entries/options/flow/{flow_id}", json={"enabled": True}, ) assert resp.status == 200 diff --git a/tests/components/darksky/test_sensor.py b/tests/components/darksky/test_sensor.py index eff06e3bf7d6..2163a809b5ea 100644 --- a/tests/components/darksky/test_sensor.py +++ b/tests/components/darksky/test_sensor.py @@ -156,7 +156,7 @@ class TestDarkSkySetup(unittest.TestCase): url = "https://api.darksky.net/forecast/{}/{},{}?units=auto".format( self.key, str(self.lat), str(self.lon) ) - msg = "400 Client Error: Bad Request for url: {}".format(url) + msg = f"400 Client Error: Bad Request for url: {url}" mock_get_forecast.side_effect = HTTPError(msg) response = darksky.setup_platform( diff --git a/tests/components/datadog/test_init.py b/tests/components/datadog/test_init.py index fdaec26204dd..71b2af33fd34 100644 --- a/tests/components/datadog/test_init.py +++ b/tests/components/datadog/test_init.py @@ -150,19 +150,16 @@ class TestDatadog(unittest.TestCase): mock_client.gauge.assert_has_calls( [ mock.call( - "ha.sensor.{}".format(attribute), + f"ha.sensor.{attribute}", value, sample_rate=1, - tags=["entity:{}".format(state.entity_id)], + tags=[f"entity:{state.entity_id}"], ) ] ) assert mock_client.gauge.call_args == mock.call( - "ha.sensor", - out, - sample_rate=1, - tags=["entity:{}".format(state.entity_id)], + "ha.sensor", out, sample_rate=1, tags=[f"entity:{state.entity_id}"], ) mock_client.gauge.reset_mock() diff --git a/tests/components/demo/test_vacuum.py b/tests/components/demo/test_vacuum.py index 79f9d361169c..2bd39bf7cb33 100644 --- a/tests/components/demo/test_vacuum.py +++ b/tests/components/demo/test_vacuum.py @@ -39,12 +39,12 @@ from homeassistant.setup import setup_component from tests.common import get_test_home_assistant, mock_service from tests.components.vacuum import common -ENTITY_VACUUM_BASIC = "{}.{}".format(DOMAIN, DEMO_VACUUM_BASIC).lower() -ENTITY_VACUUM_COMPLETE = "{}.{}".format(DOMAIN, DEMO_VACUUM_COMPLETE).lower() -ENTITY_VACUUM_MINIMAL = "{}.{}".format(DOMAIN, DEMO_VACUUM_MINIMAL).lower() -ENTITY_VACUUM_MOST = "{}.{}".format(DOMAIN, DEMO_VACUUM_MOST).lower() -ENTITY_VACUUM_NONE = "{}.{}".format(DOMAIN, DEMO_VACUUM_NONE).lower() -ENTITY_VACUUM_STATE = "{}.{}".format(DOMAIN, DEMO_VACUUM_STATE).lower() +ENTITY_VACUUM_BASIC = f"{DOMAIN}.{DEMO_VACUUM_BASIC}".lower() +ENTITY_VACUUM_COMPLETE = f"{DOMAIN}.{DEMO_VACUUM_COMPLETE}".lower() +ENTITY_VACUUM_MINIMAL = f"{DOMAIN}.{DEMO_VACUUM_MINIMAL}".lower() +ENTITY_VACUUM_MOST = f"{DOMAIN}.{DEMO_VACUUM_MOST}".lower() +ENTITY_VACUUM_NONE = f"{DOMAIN}.{DEMO_VACUUM_NONE}".lower() +ENTITY_VACUUM_STATE = f"{DOMAIN}.{DEMO_VACUUM_STATE}".lower() class TestVacuumDemo(unittest.TestCase): diff --git a/tests/components/device_tracker/test_init.py b/tests/components/device_tracker/test_init.py index 1a21ad4a7a4d..8ecc341d4d27 100644 --- a/tests/components/device_tracker/test_init.py +++ b/tests/components/device_tracker/test_init.py @@ -548,7 +548,7 @@ async def test_async_added_to_hass(hass): for key, val in attr.items(): atr = state.attributes.get(key) - assert atr == val, "{}={} expected: {}".format(key, atr, val) + assert atr == val, f"{key}={atr} expected: {val}" async def test_bad_platform(hass): diff --git a/tests/components/dialogflow/test_init.py b/tests/components/dialogflow/test_init.py index aaec1ee67cff..70a75e68c6f7 100644 --- a/tests/components/dialogflow/test_init.py +++ b/tests/components/dialogflow/test_init.py @@ -165,7 +165,7 @@ async def test_intent_action_incomplete_v1(fixture): data["result"]["actionIncomplete"] = True response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status assert "" == await response.text() @@ -178,7 +178,7 @@ async def test_intent_action_incomplete_v2(fixture): data["queryResult"]["allRequiredParamsPresent"] = False response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status assert "" == await response.text() @@ -220,7 +220,7 @@ async def test_intent_slot_filling_v1(fixture): data["result"]["metadata"].update(webhookForSlotFillingUsed="true") response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status assert "" == await response.text() @@ -231,7 +231,7 @@ async def test_intent_request_with_parameters_v1(fixture): mock_client, webhook_id = fixture data = Data.v1 response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -243,7 +243,7 @@ async def test_intent_request_with_parameters_v2(fixture): mock_client, webhook_id = fixture data = Data.v2 response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") @@ -256,7 +256,7 @@ async def test_intent_request_with_parameters_but_empty_v1(fixture): data = Data.v1 data["result"].update(parameters={"ZodiacSign": ""}) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -269,7 +269,7 @@ async def test_intent_request_with_parameters_but_empty_v2(fixture): data = Data.v2 data["queryResult"].update(parameters={"ZodiacSign": ""}) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") @@ -288,7 +288,7 @@ async def test_intent_request_without_slots_v1(hass, fixture): ) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -299,7 +299,7 @@ async def test_intent_request_without_slots_v1(hass, fixture): hass.states.async_set("device_tracker.anne_therese", "home") response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -318,7 +318,7 @@ async def test_intent_request_without_slots_v2(hass, fixture): ) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") @@ -329,7 +329,7 @@ async def test_intent_request_without_slots_v2(hass, fixture): hass.states.async_set("device_tracker.anne_therese", "home") response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") @@ -347,7 +347,7 @@ async def test_intent_request_calling_service_v1(fixture, calls): data["result"]["action"] = "CallServiceIntent" call_count = len(calls) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status assert call_count + 1 == len(calls) @@ -369,7 +369,7 @@ async def test_intent_request_calling_service_v2(fixture, calls): data["queryResult"]["action"] = "CallServiceIntent" call_count = len(calls) response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status assert call_count + 1 == len(calls) @@ -387,7 +387,7 @@ async def test_intent_with_no_action_v1(fixture): del data["result"]["action"] assert "action" not in data["result"] response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -401,7 +401,7 @@ async def test_intent_with_no_action_v2(fixture): del data["queryResult"]["action"] assert "action" not in data["queryResult"] response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") @@ -414,7 +414,7 @@ async def test_intent_with_unknown_action_v1(fixture): data = Data.v1 data["result"]["action"] = "unknown" response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("speech") @@ -427,7 +427,7 @@ async def test_intent_with_unknown_action_v2(fixture): data = Data.v2 data["queryResult"]["action"] = "unknown" response = await mock_client.post( - "/api/webhook/{}".format(webhook_id), data=json.dumps(data) + f"/api/webhook/{webhook_id}", data=json.dumps(data) ) assert 200 == response.status text = (await response.json()).get("fulfillmentText") diff --git a/tests/components/efergy/test_sensor.py b/tests/components/efergy/test_sensor.py index 18a00005dd5a..166325ee242d 100644 --- a/tests/components/efergy/test_sensor.py +++ b/tests/components/efergy/test_sensor.py @@ -35,27 +35,25 @@ def mock_responses(mock): """Mock responses for Efergy.""" base_url = "https://engage.efergy.com/mobile_proxy/" mock.get( - "{}getInstant?token={}".format(base_url, token), - text=load_fixture("efergy_instant.json"), + f"{base_url}getInstant?token={token}", text=load_fixture("efergy_instant.json"), ) mock.get( - "{}getEnergy?token={}&offset=300&period=day".format(base_url, token), + f"{base_url}getEnergy?token={token}&offset=300&period=day", text=load_fixture("efergy_energy.json"), ) mock.get( - "{}getBudget?token={}".format(base_url, token), - text=load_fixture("efergy_budget.json"), + f"{base_url}getBudget?token={token}", text=load_fixture("efergy_budget.json"), ) mock.get( - "{}getCost?token={}&offset=300&period=day".format(base_url, token), + f"{base_url}getCost?token={token}&offset=300&period=day", text=load_fixture("efergy_cost.json"), ) mock.get( - "{}getCurrentValuesSummary?token={}".format(base_url, token), + f"{base_url}getCurrentValuesSummary?token={token}", text=load_fixture("efergy_current_values_single.json"), ) mock.get( - "{}getCurrentValuesSummary?token={}".format(base_url, multi_sensor_token), + f"{base_url}getCurrentValuesSummary?token={multi_sensor_token}", text=load_fixture("efergy_current_values_multi.json"), ) diff --git a/tests/components/history/test_init.py b/tests/components/history/test_init.py index 64b438a29fce..b2687b2bd509 100644 --- a/tests/components/history/test_init.py +++ b/tests/components/history/test_init.py @@ -66,7 +66,7 @@ class TestComponentHistory(unittest.TestCase): for i in range(5): state = ha.State( "test.point_in_time_{}".format(i % 5), - "State {}".format(i), + f"State {i}", {"attribute_test": i}, ) @@ -83,7 +83,7 @@ class TestComponentHistory(unittest.TestCase): for i in range(5): state = ha.State( "test.point_in_time_{}".format(i % 5), - "State {}".format(i), + f"State {i}", {"attribute_test": i}, ) @@ -677,9 +677,7 @@ async def test_fetch_period_api(hass, hass_client): await async_setup_component(hass, "history", {}) await hass.async_add_job(hass.data[recorder.DATA_INSTANCE].block_till_done) client = await hass_client() - response = await client.get( - "/api/history/period/{}".format(dt_util.utcnow().isoformat()) - ) + response = await client.get(f"/api/history/period/{dt_util.utcnow().isoformat()}") assert response.status == 200 @@ -699,7 +697,7 @@ async def test_fetch_period_api_with_include_order(hass, hass_client): await hass.async_add_job(hass.data[recorder.DATA_INSTANCE].block_till_done) client = await hass_client() response = await client.get( - "/api/history/period/{}".format(dt_util.utcnow().isoformat()), + f"/api/history/period/{dt_util.utcnow().isoformat()}", params={"filter_entity_id": "non.existing,something.else"}, ) assert response.status == 200 diff --git a/tests/components/image_processing/test_init.py b/tests/components/image_processing/test_init.py index 39cbb8d583ec..95a6d65a9fb3 100644 --- a/tests/components/image_processing/test_init.py +++ b/tests/components/image_processing/test_init.py @@ -62,9 +62,7 @@ class TestImageProcessing: setup_component(self.hass, ip.DOMAIN, config) state = self.hass.states.get("camera.demo_camera") - self.url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + self.url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" def teardown_method(self): """Stop everything that was started.""" @@ -120,9 +118,7 @@ class TestImageProcessingAlpr: setup_component(self.hass, ip.DOMAIN, config) state = self.hass.states.get("camera.demo_camera") - self.url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + self.url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" self.alpr_events = [] @@ -227,9 +223,7 @@ class TestImageProcessingFace: setup_component(self.hass, ip.DOMAIN, config) state = self.hass.states.get("camera.demo_camera") - self.url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + self.url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" self.face_events = [] diff --git a/tests/components/influxdb/test_init.py b/tests/components/influxdb/test_init.py index 2bb9faad8e52..958bcc9d9754 100644 --- a/tests/components/influxdb/test_init.py +++ b/tests/components/influxdb/test_init.py @@ -252,14 +252,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain="fake", - entity_id="fake.{}".format(entity_id), + entity_id=f"fake.{entity_id}", object_id=entity_id, attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "fake.{}".format(entity_id), + "measurement": f"fake.{entity_id}", "tags": {"domain": "fake", "entity_id": entity_id}, "time": 12345, "fields": {"value": 1}, @@ -284,14 +284,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain=domain, - entity_id="{}.something".format(domain), + entity_id=f"{domain}.something", object_id="something", attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "{}.something".format(domain), + "measurement": f"{domain}.something", "tags": {"domain": domain, "entity_id": "something"}, "time": 12345, "fields": {"value": 1}, @@ -326,14 +326,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain="fake", - entity_id="fake.{}".format(entity_id), + entity_id=f"fake.{entity_id}", object_id=entity_id, attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "fake.{}".format(entity_id), + "measurement": f"fake.{entity_id}", "tags": {"domain": "fake", "entity_id": entity_id}, "time": 12345, "fields": {"value": 1}, @@ -368,14 +368,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain=domain, - entity_id="{}.something".format(domain), + entity_id=f"{domain}.something", object_id="something", attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "{}.something".format(domain), + "measurement": f"{domain}.something", "tags": {"domain": domain, "entity_id": "something"}, "time": 12345, "fields": {"value": 1}, @@ -410,14 +410,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain=domain, - entity_id="{}.something".format(domain), + entity_id=f"{domain}.something", object_id="something", attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "{}.something".format(domain), + "measurement": f"{domain}.something", "tags": {"domain": domain, "entity_id": "something"}, "time": 12345, "fields": {"value": 1}, @@ -438,14 +438,14 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain="other", - entity_id="other.{}".format(entity_id), + entity_id=f"other.{entity_id}", object_id=entity_id, attributes={}, ) event = mock.MagicMock(data={"new_state": state}, time_fired=12345) body = [ { - "measurement": "other.{}".format(entity_id), + "measurement": f"other.{entity_id}", "tags": {"domain": "other", "entity_id": entity_id}, "time": 12345, "fields": {"value": 1}, @@ -532,7 +532,7 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain="fake", - entity_id="fake.{}".format(entity_id), + entity_id=f"fake.{entity_id}", object_id=entity_id, attributes={}, ) diff --git a/tests/components/locative/test_init.py b/tests/components/locative/test_init.py index 009a3d469c56..63ef2e9f5f89 100644 --- a/tests/components/locative/test_init.py +++ b/tests/components/locative/test_init.py @@ -48,7 +48,7 @@ async def webhook_id(hass, locative_client): async def test_missing_data(locative_client, webhook_id): """Test missing data.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "latitude": 1.0, @@ -108,7 +108,7 @@ async def test_missing_data(locative_client, webhook_id): async def test_enter_and_exit(hass, locative_client, webhook_id): """Test when there is a known zone.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "latitude": 40.7855, @@ -177,7 +177,7 @@ async def test_enter_and_exit(hass, locative_client, webhook_id): async def test_exit_after_enter(hass, locative_client, webhook_id): """Test when an exit message comes after an enter message.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "latitude": 40.7855, @@ -219,7 +219,7 @@ async def test_exit_after_enter(hass, locative_client, webhook_id): async def test_exit_first(hass, locative_client, webhook_id): """Test when an exit message is sent first on a new device.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "latitude": 40.7855, @@ -240,7 +240,7 @@ async def test_exit_first(hass, locative_client, webhook_id): async def test_two_devices(hass, locative_client, webhook_id): """Test updating two different devices.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data_device_1 = { "latitude": 40.7855, @@ -283,7 +283,7 @@ async def test_two_devices(hass, locative_client, webhook_id): ) async def test_load_unload_entry(hass, locative_client, webhook_id): """Test that the appropriate dispatch signals are added and removed.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "latitude": 40.7855, diff --git a/tests/components/logbook/test_init.py b/tests/components/logbook/test_init.py index cc07d6cf40fa..2045aeb1a5a0 100644 --- a/tests/components/logbook/test_init.py +++ b/tests/components/logbook/test_init.py @@ -1274,7 +1274,7 @@ async def test_logbook_view(hass, hass_client): await async_setup_component(hass, "logbook", {}) await hass.async_add_job(hass.data[recorder.DATA_INSTANCE].block_till_done) client = await hass_client() - response = await client.get("/api/logbook/{}".format(dt_util.utcnow().isoformat())) + response = await client.get(f"/api/logbook/{dt_util.utcnow().isoformat()}") assert response.status == 200 @@ -1301,7 +1301,7 @@ async def test_logbook_view_period_entity(hass, hass_client): start_date = datetime(start.year, start.month, start.day) # Test today entries without filters - response = await client.get("/api/logbook/{}".format(start_date.isoformat())) + response = await client.get(f"/api/logbook/{start_date.isoformat()}") assert response.status == 200 json = await response.json() assert len(json) == 2 @@ -1309,9 +1309,7 @@ async def test_logbook_view_period_entity(hass, hass_client): assert json[1]["entity_id"] == entity_id_second # Test today entries with filter by period - response = await client.get( - "/api/logbook/{}?period=1".format(start_date.isoformat()) - ) + response = await client.get(f"/api/logbook/{start_date.isoformat()}?period=1") assert response.status == 200 json = await response.json() assert len(json) == 2 @@ -1320,7 +1318,7 @@ async def test_logbook_view_period_entity(hass, hass_client): # Test today entries with filter by entity_id response = await client.get( - "/api/logbook/{}?entity=switch.test".format(start_date.isoformat()) + f"/api/logbook/{start_date.isoformat()}?entity=switch.test" ) assert response.status == 200 json = await response.json() @@ -1329,7 +1327,7 @@ async def test_logbook_view_period_entity(hass, hass_client): # Test entries for 3 days with filter by entity_id response = await client.get( - "/api/logbook/{}?period=3&entity=switch.test".format(start_date.isoformat()) + f"/api/logbook/{start_date.isoformat()}?period=3&entity=switch.test" ) assert response.status == 200 json = await response.json() @@ -1341,14 +1339,14 @@ async def test_logbook_view_period_entity(hass, hass_client): start_date = datetime(start.year, start.month, start.day) # Test tomorrow entries without filters - response = await client.get("/api/logbook/{}".format(start_date.isoformat())) + response = await client.get(f"/api/logbook/{start_date.isoformat()}") assert response.status == 200 json = await response.json() assert len(json) == 0 # Test tomorrow entries with filter by entity_id response = await client.get( - "/api/logbook/{}?entity=switch.test".format(start_date.isoformat()) + f"/api/logbook/{start_date.isoformat()}?entity=switch.test" ) assert response.status == 200 json = await response.json() @@ -1356,7 +1354,7 @@ async def test_logbook_view_period_entity(hass, hass_client): # Test entries from tomorrow to 3 days ago with filter by entity_id response = await client.get( - "/api/logbook/{}?period=3&entity=switch.test".format(start_date.isoformat()) + f"/api/logbook/{start_date.isoformat()}?period=3&entity=switch.test" ) assert response.status == 200 json = await response.json() diff --git a/tests/components/mobile_app/test_entity.py b/tests/components/mobile_app/test_entity.py index 27ce29ecd155..78259cd11456 100644 --- a/tests/components/mobile_app/test_entity.py +++ b/tests/components/mobile_app/test_entity.py @@ -11,7 +11,7 @@ _LOGGER = logging.getLogger(__name__) async def test_sensor(hass, create_registrations, webhook_client): """Test that sensors can be registered and updated.""" webhook_id = create_registrations[1]["webhook_id"] - webhook_url = "/api/webhook/{}".format(webhook_id) + webhook_url = f"/api/webhook/{webhook_id}" reg_resp = await webhook_client.post( webhook_url, @@ -74,7 +74,7 @@ async def test_sensor(hass, create_registrations, webhook_client): async def test_sensor_must_register(hass, create_registrations, webhook_client): """Test that sensors must be registered before updating.""" webhook_id = create_registrations[1]["webhook_id"] - webhook_url = "/api/webhook/{}".format(webhook_id) + webhook_url = f"/api/webhook/{webhook_id}" resp = await webhook_client.post( webhook_url, json={ @@ -93,7 +93,7 @@ async def test_sensor_must_register(hass, create_registrations, webhook_client): async def test_sensor_id_no_dupes(hass, create_registrations, webhook_client): """Test that sensors must have a unique ID.""" webhook_id = create_registrations[1]["webhook_id"] - webhook_url = "/api/webhook/{}".format(webhook_id) + webhook_url = f"/api/webhook/{webhook_id}" payload = { "type": "register_sensor", diff --git a/tests/components/mqtt_room/test_sensor.py b/tests/components/mqtt_room/test_sensor.py index e8a9e62403f7..b3155e563f4e 100644 --- a/tests/components/mqtt_room/test_sensor.py +++ b/tests/components/mqtt_room/test_sensor.py @@ -16,10 +16,10 @@ NAME = "test_device" BEDROOM = "bedroom" LIVING_ROOM = "living_room" -BEDROOM_TOPIC = "room_presence/{}".format(BEDROOM) -LIVING_ROOM_TOPIC = "room_presence/{}".format(LIVING_ROOM) +BEDROOM_TOPIC = f"room_presence/{BEDROOM}" +LIVING_ROOM_TOPIC = f"room_presence/{LIVING_ROOM}" -SENSOR_STATE = "sensor.{}".format(NAME) +SENSOR_STATE = f"sensor.{NAME}" CONF_DEVICE_ID = "device_id" CONF_TIMEOUT = "timeout" diff --git a/tests/components/openalpr_local/test_image_processing.py b/tests/components/openalpr_local/test_image_processing.py index 291bed809c7c..f28ee6f02d49 100644 --- a/tests/components/openalpr_local/test_image_processing.py +++ b/tests/components/openalpr_local/test_image_processing.py @@ -104,9 +104,7 @@ class TestOpenAlprLocal: setup_component(self.hass, ip.DOMAIN, config) state = self.hass.states.get("camera.demo_camera") - self.url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + self.url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" self.alpr_events = [] diff --git a/tests/components/ps4/test_media_player.py b/tests/components/ps4/test_media_player.py index 56a659aa152e..3bd75c40bed3 100644 --- a/tests/components/ps4/test_media_player.py +++ b/tests/components/ps4/test_media_player.py @@ -156,7 +156,7 @@ async def mock_ddp_response(hass, mock_status_data, games=None): mock_code = mock_status_data.get("status_code") mock_status = mock_status_data.get("status") - mock_status_header = "{} {}".format(mock_code, mock_status) + mock_status_header = f"{mock_code} {mock_status}" mock_response = get_ddp_message(mock_status_header, mock_status_data).encode() if games is None: @@ -179,7 +179,7 @@ async def test_media_player_is_setup_correctly_with_entry(hass): # Test that entity is added to hass. assert hass.data[PS4_DATA].protocol is not None - assert mock_entity_id == "media_player.{}".format(MOCK_NAME) + assert mock_entity_id == f"media_player.{MOCK_NAME}" assert mock_state == STATE_UNKNOWN diff --git a/tests/components/python_script/test_init.py b/tests/components/python_script/test_init.py index f61f00047231..d122fef0bd2a 100644 --- a/tests/components/python_script/test_init.py +++ b/tests/components/python_script/test_init.py @@ -162,7 +162,7 @@ async def test_accessing_forbidden_methods(hass, caplog): caplog.records.clear() hass.async_add_job(execute, hass, "test.py", source, {}) await hass.async_block_till_done() - assert "Not allowed to access {}".format(name) in caplog.text + assert f"Not allowed to access {name}" in caplog.text async def test_iterating(hass): diff --git a/tests/components/recorder/test_init.py b/tests/components/recorder/test_init.py index 8a56ba3d9773..6b826d8c29bb 100644 --- a/tests/components/recorder/test_init.py +++ b/tests/components/recorder/test_init.py @@ -109,7 +109,7 @@ def _add_entities(hass, entity_ids): """Add entities.""" attributes = {"test_attr": 5, "test_attr_10": "nice"} for idx, entity_id in enumerate(entity_ids): - hass.states.set(entity_id, "state{}".format(idx), attributes) + hass.states.set(entity_id, f"state{idx}", attributes) wait_recording_done(hass) with session_scope(hass=hass) as session: diff --git a/tests/components/roku/__init__.py b/tests/components/roku/__init__.py index 638a37b193a8..b46e57a38bdd 100644 --- a/tests/components/roku/__init__.py +++ b/tests/components/roku/__init__.py @@ -24,7 +24,7 @@ class MockDeviceInfo(object): def __repr__(self): """Return the object representation of DeviceInfo.""" - return "" % ( + return "".format( self.model_name, self.model_num, self.software_version, diff --git a/tests/components/scene/test_init.py b/tests/components/scene/test_init.py index 8211ff108572..fd09d378b466 100644 --- a/tests/components/scene/test_init.py +++ b/tests/components/scene/test_init.py @@ -87,11 +87,11 @@ class TestScene(unittest.TestCase): "scene:\n" " - name: test\n" " entities:\n" - " {0}: on\n" - " {1}:\n" + f" {self.light_1.entity_id}: on\n" + f" {self.light_2.entity_id}:\n" " state: on\n" " brightness: 100\n" - ).format(self.light_1.entity_id, self.light_2.entity_id) + ) with io.StringIO(config) as file: doc = yaml_loader.yaml.safe_load(file) diff --git a/tests/components/script/test_init.py b/tests/components/script/test_init.py index dbaa5e6e117d..e4a4d4ca2395 100644 --- a/tests/components/script/test_init.py +++ b/tests/components/script/test_init.py @@ -94,7 +94,7 @@ class TestScriptComponent(unittest.TestCase): ): assert not setup_component( self.hass, "script", {"script": value} - ), "Script loaded with wrong config {}".format(value) + ), f"Script loaded with wrong config {value}" assert 0 == len(self.hass.states.entity_ids("script")) diff --git a/tests/components/shell_command/test_init.py b/tests/components/shell_command/test_init.py index 50c3c6bfb559..f046b5087f6f 100644 --- a/tests/components/shell_command/test_init.py +++ b/tests/components/shell_command/test_init.py @@ -53,7 +53,7 @@ class TestShellCommand(unittest.TestCase): assert setup_component( self.hass, shell_command.DOMAIN, - {shell_command.DOMAIN: {"test_service": "date > {}".format(path)}}, + {shell_command.DOMAIN: {"test_service": f"date > {path}"}}, ) self.hass.services.call("shell_command", "test_service", blocking=True) @@ -137,7 +137,7 @@ class TestShellCommand(unittest.TestCase): assert setup_component( self.hass, shell_command.DOMAIN, - {shell_command.DOMAIN: {"test_service": "touch {}".format(path)}}, + {shell_command.DOMAIN: {"test_service": f"touch {path}"}}, ) self.hass.services.call("shell_command", "test_service", blocking=True) @@ -154,7 +154,7 @@ class TestShellCommand(unittest.TestCase): assert setup_component( self.hass, shell_command.DOMAIN, - {shell_command.DOMAIN: {"test_service": "echo {}".format(test_phrase)}}, + {shell_command.DOMAIN: {"test_service": f"echo {test_phrase}"}}, ) self.hass.services.call("shell_command", "test_service", blocking=True) @@ -170,7 +170,7 @@ class TestShellCommand(unittest.TestCase): assert setup_component( self.hass, shell_command.DOMAIN, - {shell_command.DOMAIN: {"test_service": ">&2 echo {}".format(test_phrase)}}, + {shell_command.DOMAIN: {"test_service": f">&2 echo {test_phrase}"}}, ) self.hass.services.call("shell_command", "test_service", blocking=True) diff --git a/tests/components/shopping_list/test_init.py b/tests/components/shopping_list/test_init.py index bb65dcf631f1..82b0d9b455d7 100644 --- a/tests/components/shopping_list/test_init.py +++ b/tests/components/shopping_list/test_init.py @@ -99,7 +99,7 @@ async def test_deprecated_api_update(hass, hass_client, sl_setup): client = await hass_client() resp = await client.post( - "/api/shopping_list/item/{}".format(beer_id), json={"name": "soda"} + f"/api/shopping_list/item/{beer_id}", json={"name": "soda"} ) assert resp.status == 200 @@ -107,7 +107,7 @@ async def test_deprecated_api_update(hass, hass_client, sl_setup): assert data == {"id": beer_id, "name": "soda", "complete": False} resp = await client.post( - "/api/shopping_list/item/{}".format(wine_id), json={"complete": True} + f"/api/shopping_list/item/{wine_id}", json={"complete": True} ) assert resp.status == 200 @@ -174,9 +174,7 @@ async def test_api_update_fails(hass, hass_client, sl_setup): assert resp.status == 404 beer_id = hass.data["shopping_list"].items[0]["id"] - resp = await client.post( - "/api/shopping_list/item/{}".format(beer_id), json={"name": 123} - ) + resp = await client.post(f"/api/shopping_list/item/{beer_id}", json={"name": 123}) assert resp.status == 400 @@ -221,7 +219,7 @@ async def test_deprecated_api_clear_completed(hass, hass_client, sl_setup): # Mark beer as completed resp = await client.post( - "/api/shopping_list/item/{}".format(beer_id), json={"complete": True} + f"/api/shopping_list/item/{beer_id}", json={"complete": True} ) assert resp.status == 200 diff --git a/tests/components/sleepiq/test_init.py b/tests/components/sleepiq/test_init.py index 67fe19da45a7..6626be41a6b8 100644 --- a/tests/components/sleepiq/test_init.py +++ b/tests/components/sleepiq/test_init.py @@ -18,13 +18,11 @@ def mock_responses(mock, single=False): else: suffix = "" mock.put(base_url + "login", text=load_fixture("sleepiq-login.json")) - mock.get( - base_url + "bed?_k=0987", text=load_fixture("sleepiq-bed{}.json".format(suffix)) - ) + mock.get(base_url + "bed?_k=0987", text=load_fixture(f"sleepiq-bed{suffix}.json")) mock.get(base_url + "sleeper?_k=0987", text=load_fixture("sleepiq-sleeper.json")) mock.get( base_url + "bed/familyStatus?_k=0987", - text=load_fixture("sleepiq-familystatus{}.json".format(suffix)), + text=load_fixture(f"sleepiq-familystatus{suffix}.json"), ) diff --git a/tests/components/switch/test_init.py b/tests/components/switch/test_init.py index 9e34eb8f4ab3..07ab1d19f550 100644 --- a/tests/components/switch/test_init.py +++ b/tests/components/switch/test_init.py @@ -77,7 +77,7 @@ class TestSwitch(unittest.TestCase): switch.DOMAIN, { switch.DOMAIN: {CONF_PLATFORM: "test"}, - "{} 2".format(switch.DOMAIN): {CONF_PLATFORM: "test2"}, + f"{switch.DOMAIN} 2": {CONF_PLATFORM: "test2"}, }, ) diff --git a/tests/components/tplink/test_init.py b/tests/components/tplink/test_init.py index 97512dfc9bd1..d30a05ddbf89 100644 --- a/tests/components/tplink/test_init.py +++ b/tests/components/tplink/test_init.py @@ -73,7 +73,7 @@ async def test_configuring_device_types(hass, name, cls, platform, count): "homeassistant.components.tplink.common.SmartDevice._query_helper" ): discovery_data = { - "123.123.123.{}".format(c): cls("123.123.123.123") for c in range(count) + f"123.123.123.{c}": cls("123.123.123.123") for c in range(count) } discover.return_value = discovery_data await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) @@ -242,7 +242,7 @@ async def test_unload(hass, platform): with patch( "homeassistant.components.tplink.common.SmartDevice._query_helper" ), patch( - "homeassistant.components.tplink.{}.async_setup_entry".format(platform), + f"homeassistant.components.tplink.{platform}.async_setup_entry", return_value=mock_coro(True), ) as light_setup: config = { diff --git a/tests/components/traccar/test_init.py b/tests/components/traccar/test_init.py index 5a2dabcf6c23..a13a3d25a6c6 100644 --- a/tests/components/traccar/test_init.py +++ b/tests/components/traccar/test_init.py @@ -75,7 +75,7 @@ async def webhook_id_fixture(hass, client): async def test_missing_data(hass, client, webhook_id): """Test missing data.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = {"lat": "1.0", "lon": "1.1", "id": "123"} # No data @@ -100,7 +100,7 @@ async def test_missing_data(hass, client, webhook_id): async def test_enter_and_exit(hass, client, webhook_id): """Test when there is a known zone.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = {"lat": str(HOME_LATITUDE), "lon": str(HOME_LONGITUDE), "id": "123"} # Enter the Home @@ -142,7 +142,7 @@ async def test_enter_and_exit(hass, client, webhook_id): async def test_enter_with_attrs(hass, client, webhook_id): """Test when additional attributes are present.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = { "timestamp": 123456789, "lat": "1.0", @@ -191,7 +191,7 @@ async def test_enter_with_attrs(hass, client, webhook_id): async def test_two_devices(hass, client, webhook_id): """Test updating two different devices.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data_device_1 = {"lat": "1.0", "lon": "1.1", "id": "device_1"} @@ -223,7 +223,7 @@ async def test_two_devices(hass, client, webhook_id): ) async def test_load_unload_entry(hass, client, webhook_id): """Test that the appropriate dispatch signals are added and removed.""" - url = "/api/webhook/{}".format(webhook_id) + url = f"/api/webhook/{webhook_id}" data = {"lat": str(HOME_LATITUDE), "lon": str(HOME_LONGITUDE), "id": "123"} # Enter the Home From d7e99594428bee13cf28a9fc31dbb93cc3dd29ae Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 00:33:07 +0200 Subject: [PATCH 114/653] String formatting improvements for tests (2) (#33666) --- tests/components/emulated_hue/test_hue_api.py | 6 +++--- tests/components/emulated_hue/test_upnp.py | 2 +- tests/components/hassio/test_http.py | 6 +++--- tests/components/http/test_auth.py | 18 ++++++++--------- tests/components/ifttt/test_init.py | 6 +++--- tests/components/mailgun/test_init.py | 20 +++++++++---------- tests/components/microsoft_face/test_init.py | 2 +- .../test_image_processing.py | 6 ++---- .../test_image_processing.py | 6 ++---- tests/components/mobile_app/test_webhook.py | 10 ++++------ tests/components/mqtt/test_discovery.py | 4 ++-- .../nsw_fuel_station/test_sensor.py | 2 +- .../owntracks/test_device_tracker.py | 18 ++++++++--------- tests/components/ps4/test_init.py | 4 ++-- .../components/sensor/test_device_trigger.py | 7 ++++--- tests/components/starline/test_config_flow.py | 2 +- tests/components/tts/test_init.py | 4 +--- tests/components/twilio/test_init.py | 4 +--- tests/helpers/test_template.py | 14 ++++++------- 19 files changed, 65 insertions(+), 76 deletions(-) diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index 76f1a224c1fc..280ae56ea392 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -50,7 +50,7 @@ from tests.common import ( HTTP_SERVER_PORT = get_test_instance_port() BRIDGE_SERVER_PORT = get_test_instance_port() -BRIDGE_URL_BASE = "http://127.0.0.1:{}".format(BRIDGE_SERVER_PORT) + "{}" +BRIDGE_URL_BASE = f"http://127.0.0.1:{BRIDGE_SERVER_PORT}" + "{}" JSON_HEADERS = {CONTENT_TYPE: const.CONTENT_TYPE_JSON} @@ -773,7 +773,7 @@ async def perform_put_test_on_ceiling_lights( async def perform_get_light_state(client, entity_id, expected_status): """Test the getting of a light state.""" - result = await client.get("/api/username/lights/{}".format(entity_id)) + result = await client.get(f"/api/username/lights/{entity_id}") assert result.status == expected_status @@ -808,7 +808,7 @@ async def perform_put_light_state( data[HUE_API_STATE_SAT] = saturation result = await client.put( - "/api/username/lights/{}/state".format(entity_id), + f"/api/username/lights/{entity_id}/state", headers=req_headers, data=json.dumps(data).encode(), ) diff --git a/tests/components/emulated_hue/test_upnp.py b/tests/components/emulated_hue/test_upnp.py index ea0022751532..889f6437b0ac 100644 --- a/tests/components/emulated_hue/test_upnp.py +++ b/tests/components/emulated_hue/test_upnp.py @@ -15,7 +15,7 @@ from tests.common import get_test_home_assistant, get_test_instance_port HTTP_SERVER_PORT = get_test_instance_port() BRIDGE_SERVER_PORT = get_test_instance_port() -BRIDGE_URL_BASE = "http://127.0.0.1:{}".format(BRIDGE_SERVER_PORT) + "{}" +BRIDGE_URL_BASE = f"http://127.0.0.1:{BRIDGE_SERVER_PORT}" + "{}" JSON_HEADERS = {CONTENT_TYPE: const.CONTENT_TYPE_JSON} diff --git a/tests/components/hassio/test_http.py b/tests/components/hassio/test_http.py index 5789dde64c1b..a5af24eb8680 100644 --- a/tests/components/hassio/test_http.py +++ b/tests/components/hassio/test_http.py @@ -25,7 +25,7 @@ async def test_forward_request(hassio_client, aioclient_mock): ) async def test_auth_required_forward_request(hassio_noauth_client, build_type): """Test auth required for normal request.""" - resp = await hassio_noauth_client.post("/api/hassio/{}".format(build_type)) + resp = await hassio_noauth_client.post(f"/api/hassio/{build_type}") # Check we got right response assert resp.status == 401 @@ -46,9 +46,9 @@ async def test_forward_request_no_auth_for_panel( hassio_client, build_type, aioclient_mock ): """Test no auth needed for .""" - aioclient_mock.get("http://127.0.0.1/{}".format(build_type), text="response") + aioclient_mock.get(f"http://127.0.0.1/{build_type}", text="response") - resp = await hassio_client.get("/api/hassio/{}".format(build_type)) + resp = await hassio_client.get(f"/api/hassio/{build_type}") # Check we got right response assert resp.status == 200 diff --git a/tests/components/http/test_auth.py b/tests/components/http/test_auth.py index 3617690eb3ba..408bfd325c1b 100644 --- a/tests/components/http/test_auth.py +++ b/tests/components/http/test_auth.py @@ -147,12 +147,12 @@ async def test_cannot_access_with_trusted_ip( for remote_addr in UNTRUSTED_ADDRESSES: set_mock_ip(remote_addr) resp = await client.get("/") - assert resp.status == 401, "{} shouldn't be trusted".format(remote_addr) + assert resp.status == 401, f"{remote_addr} shouldn't be trusted" for remote_addr in TRUSTED_ADDRESSES: set_mock_ip(remote_addr) resp = await client.get("/") - assert resp.status == 401, "{} shouldn't be trusted".format(remote_addr) + assert resp.status == 401, f"{remote_addr} shouldn't be trusted" async def test_auth_active_access_with_access_token_in_header( @@ -164,27 +164,27 @@ async def test_auth_active_access_with_access_token_in_header( client = await aiohttp_client(app) refresh_token = await hass.auth.async_validate_access_token(hass_access_token) - req = await client.get("/", headers={"Authorization": "Bearer {}".format(token)}) + req = await client.get("/", headers={"Authorization": f"Bearer {token}"}) assert req.status == 200 assert await req.json() == {"user_id": refresh_token.user.id} - req = await client.get("/", headers={"AUTHORIZATION": "Bearer {}".format(token)}) + req = await client.get("/", headers={"AUTHORIZATION": f"Bearer {token}"}) assert req.status == 200 assert await req.json() == {"user_id": refresh_token.user.id} - req = await client.get("/", headers={"authorization": "Bearer {}".format(token)}) + req = await client.get("/", headers={"authorization": f"Bearer {token}"}) assert req.status == 200 assert await req.json() == {"user_id": refresh_token.user.id} req = await client.get("/", headers={"Authorization": token}) assert req.status == 401 - req = await client.get("/", headers={"Authorization": "BEARER {}".format(token)}) + req = await client.get("/", headers={"Authorization": f"BEARER {token}"}) assert req.status == 401 refresh_token = await hass.auth.async_validate_access_token(hass_access_token) refresh_token.user.is_active = False - req = await client.get("/", headers={"Authorization": "Bearer {}".format(token)}) + req = await client.get("/", headers={"Authorization": f"Bearer {token}"}) assert req.status == 401 @@ -200,12 +200,12 @@ async def test_auth_active_access_with_trusted_ip( for remote_addr in UNTRUSTED_ADDRESSES: set_mock_ip(remote_addr) resp = await client.get("/") - assert resp.status == 401, "{} shouldn't be trusted".format(remote_addr) + assert resp.status == 401, f"{remote_addr} shouldn't be trusted" for remote_addr in TRUSTED_ADDRESSES: set_mock_ip(remote_addr) resp = await client.get("/") - assert resp.status == 401, "{} shouldn't be trusted".format(remote_addr) + assert resp.status == 401, f"{remote_addr} shouldn't be trusted" async def test_auth_legacy_support_api_password_cannot_access( diff --git a/tests/components/ifttt/test_init.py b/tests/components/ifttt/test_init.py index ab5aa7ea1ad4..d10df2492d42 100644 --- a/tests/components/ifttt/test_init.py +++ b/tests/components/ifttt/test_init.py @@ -28,16 +28,16 @@ async def test_config_flow_registers_webhook(hass, aiohttp_client): hass.bus.async_listen(ifttt.EVENT_RECEIVED, handle_event) client = await aiohttp_client(hass.http.app) - await client.post("/api/webhook/{}".format(webhook_id), json={"hello": "ifttt"}) + await client.post(f"/api/webhook/{webhook_id}", json={"hello": "ifttt"}) assert len(ifttt_events) == 1 assert ifttt_events[0].data["webhook_id"] == webhook_id assert ifttt_events[0].data["hello"] == "ifttt" # Invalid JSON - await client.post("/api/webhook/{}".format(webhook_id), data="not a dict") + await client.post(f"/api/webhook/{webhook_id}", data="not a dict") assert len(ifttt_events) == 1 # Not a dict - await client.post("/api/webhook/{}".format(webhook_id), json="not a dict") + await client.post(f"/api/webhook/{webhook_id}", json="not a dict") assert len(ifttt_events) == 1 diff --git a/tests/components/mailgun/test_init.py b/tests/components/mailgun/test_init.py index cb5e4dc8f38a..7ed67dcc0d27 100644 --- a/tests/components/mailgun/test_init.py +++ b/tests/components/mailgun/test_init.py @@ -81,14 +81,14 @@ async def test_mailgun_webhook_with_missing_signature( event_count = len(mailgun_events) await http_client.post( - "/api/webhook/{}".format(webhook_id_with_api_key), + f"/api/webhook/{webhook_id_with_api_key}", json={"hello": "mailgun", "signature": {}}, ) assert len(mailgun_events) == event_count await http_client.post( - "/api/webhook/{}".format(webhook_id_with_api_key), json={"hello": "mailgun"} + f"/api/webhook/{webhook_id_with_api_key}", json={"hello": "mailgun"} ) assert len(mailgun_events) == event_count @@ -104,13 +104,13 @@ async def test_mailgun_webhook_with_different_api_key( event_count = len(mailgun_events) await http_client.post( - "/api/webhook/{}".format(webhook_id_with_api_key), + f"/api/webhook/{webhook_id_with_api_key}", json={ "hello": "mailgun", "signature": { "signature": hmac.new( key=b"random_api_key", - msg=bytes("{}{}".format(timestamp, token), "utf-8"), + msg=bytes(f"{timestamp}{token}", "utf-8"), digestmod=hashlib.sha256, ).hexdigest(), "timestamp": timestamp, @@ -132,13 +132,13 @@ async def test_mailgun_webhook_event_with_correct_api_key( event_count = len(mailgun_events) await http_client.post( - "/api/webhook/{}".format(webhook_id_with_api_key), + f"/api/webhook/{webhook_id_with_api_key}", json={ "hello": "mailgun", "signature": { "signature": hmac.new( key=bytes(API_KEY, "utf-8"), - msg=bytes("{}{}".format(timestamp, token), "utf-8"), + msg=bytes(f"{timestamp}{token}", "utf-8"), digestmod=hashlib.sha256, ).hexdigest(), "timestamp": timestamp, @@ -159,7 +159,7 @@ async def test_mailgun_webhook_with_missing_signature_without_api_key( event_count = len(mailgun_events) await http_client.post( - "/api/webhook/{}".format(webhook_id_without_api_key), + f"/api/webhook/{webhook_id_without_api_key}", json={"hello": "mailgun", "signature": {}}, ) @@ -168,7 +168,7 @@ async def test_mailgun_webhook_with_missing_signature_without_api_key( assert mailgun_events[-1].data["hello"] == "mailgun" await http_client.post( - "/api/webhook/{}".format(webhook_id_without_api_key), json={"hello": "mailgun"} + f"/api/webhook/{webhook_id_without_api_key}", json={"hello": "mailgun"} ) assert len(mailgun_events) == event_count + 1 @@ -186,13 +186,13 @@ async def test_mailgun_webhook_event_without_an_api_key( event_count = len(mailgun_events) await http_client.post( - "/api/webhook/{}".format(webhook_id_without_api_key), + f"/api/webhook/{webhook_id_without_api_key}", json={ "hello": "mailgun", "signature": { "signature": hmac.new( key=bytes(API_KEY, "utf-8"), - msg=bytes("{}{}".format(timestamp, token), "utf-8"), + msg=bytes(f"{timestamp}{token}", "utf-8"), digestmod=hashlib.sha256, ).hexdigest(), "timestamp": timestamp, diff --git a/tests/components/microsoft_face/test_init.py b/tests/components/microsoft_face/test_init.py index 3e2cdf0d5306..803ca0069654 100644 --- a/tests/components/microsoft_face/test_init.py +++ b/tests/components/microsoft_face/test_init.py @@ -89,7 +89,7 @@ class TestMicrosoftFaceSetup: self.config = {mf.DOMAIN: {"api_key": "12345678abcdef"}} - self.endpoint_url = "https://westus.{0}".format(mf.FACE_API_URL) + self.endpoint_url = f"https://westus.{mf.FACE_API_URL}" def teardown_method(self): """Stop everything that was started.""" diff --git a/tests/components/microsoft_face_detect/test_image_processing.py b/tests/components/microsoft_face_detect/test_image_processing.py index 384e0ba130f2..3f38c07cb435 100644 --- a/tests/components/microsoft_face_detect/test_image_processing.py +++ b/tests/components/microsoft_face_detect/test_image_processing.py @@ -86,7 +86,7 @@ class TestMicrosoftFaceDetect: mf.DOMAIN: {"api_key": "12345678abcdef6"}, } - self.endpoint_url = "https://westus.{0}".format(mf.FACE_API_URL) + self.endpoint_url = f"https://westus.{mf.FACE_API_URL}" def teardown_method(self): """Stop everything that was started.""" @@ -115,9 +115,7 @@ class TestMicrosoftFaceDetect: setup_component(self.hass, ip.DOMAIN, self.config) state = self.hass.states.get("camera.demo_camera") - url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" face_events = [] diff --git a/tests/components/microsoft_face_identify/test_image_processing.py b/tests/components/microsoft_face_identify/test_image_processing.py index d1054cf8dc45..58a752c1887e 100644 --- a/tests/components/microsoft_face_identify/test_image_processing.py +++ b/tests/components/microsoft_face_identify/test_image_processing.py @@ -87,7 +87,7 @@ class TestMicrosoftFaceIdentify: mf.DOMAIN: {"api_key": "12345678abcdef6"}, } - self.endpoint_url = "https://westus.{0}".format(mf.FACE_API_URL) + self.endpoint_url = f"https://westus.{mf.FACE_API_URL}" def teardown_method(self): """Stop everything that was started.""" @@ -116,9 +116,7 @@ class TestMicrosoftFaceIdentify: setup_component(self.hass, ip.DOMAIN, self.config) state = self.hass.states.get("camera.demo_camera") - url = "{0}{1}".format( - self.hass.config.api.base_url, state.attributes.get(ATTR_ENTITY_PICTURE) - ) + url = f"{self.hass.config.api.base_url}{state.attributes.get(ATTR_ENTITY_PICTURE)}" face_events = [] diff --git a/tests/components/mobile_app/test_webhook.py b/tests/components/mobile_app/test_webhook.py index 1e8441290bb4..c00719130352 100644 --- a/tests/components/mobile_app/test_webhook.py +++ b/tests/components/mobile_app/test_webhook.py @@ -127,7 +127,7 @@ async def test_webhook_update_registration(webhook_client, authed_api_client): update_container = {"type": "update_registration", "data": UPDATE} update_resp = await webhook_client.post( - "/api/webhook/{}".format(webhook_id), json=update_container + f"/api/webhook/{webhook_id}", json=update_container ) assert update_resp.status == 200 @@ -263,7 +263,7 @@ async def test_webhook_enable_encryption(hass, webhook_client, create_registrati webhook_id = create_registrations[1]["webhook_id"] enable_enc_resp = await webhook_client.post( - "/api/webhook/{}".format(webhook_id), json={"type": "enable_encryption"}, + f"/api/webhook/{webhook_id}", json={"type": "enable_encryption"}, ) assert enable_enc_resp.status == 200 @@ -275,7 +275,7 @@ async def test_webhook_enable_encryption(hass, webhook_client, create_registrati key = enable_enc_json["secret"] enc_required_resp = await webhook_client.post( - "/api/webhook/{}".format(webhook_id), json=RENDER_TEMPLATE, + f"/api/webhook/{webhook_id}", json=RENDER_TEMPLATE, ) assert enc_required_resp.status == 400 @@ -293,9 +293,7 @@ async def test_webhook_enable_encryption(hass, webhook_client, create_registrati "encrypted_data": enc_data, } - enc_resp = await webhook_client.post( - "/api/webhook/{}".format(webhook_id), json=container - ) + enc_resp = await webhook_client.post(f"/api/webhook/{webhook_id}", json=container) assert enc_resp.status == 200 diff --git a/tests/components/mqtt/test_discovery.py b/tests/components/mqtt/test_discovery.py index 71e694f68078..1b2f76d6c5ef 100644 --- a/tests/components/mqtt/test_discovery.py +++ b/tests/components/mqtt/test_discovery.py @@ -100,12 +100,12 @@ async def test_only_valid_components(hass, mqtt_mock, caplog): await async_start(hass, "homeassistant", {}, entry) async_fire_mqtt_message( - hass, "homeassistant/{}/bla/config".format(invalid_component), "{}" + hass, f"homeassistant/{invalid_component}/bla/config", "{}" ) await hass.async_block_till_done() - assert "Integration {} is not supported".format(invalid_component) in caplog.text + assert f"Integration {invalid_component} is not supported" in caplog.text assert not mock_dispatcher_send.called diff --git a/tests/components/nsw_fuel_station/test_sensor.py b/tests/components/nsw_fuel_station/test_sensor.py index babdd0cf1c31..11a3d469a59e 100644 --- a/tests/components/nsw_fuel_station/test_sensor.py +++ b/tests/components/nsw_fuel_station/test_sensor.py @@ -96,7 +96,7 @@ class TestNSWFuelStation(unittest.TestCase): fake_entities = ["my_fake_station_p95", "my_fake_station_e10"] for entity_id in fake_entities: - state = self.hass.states.get("sensor.{}".format(entity_id)) + state = self.hass.states.get(f"sensor.{entity_id}") assert state is not None @patch( diff --git a/tests/components/owntracks/test_device_tracker.py b/tests/components/owntracks/test_device_tracker.py index ae9fb65c6159..bdd1199008c8 100644 --- a/tests/components/owntracks/test_device_tracker.py +++ b/tests/components/owntracks/test_device_tracker.py @@ -18,16 +18,16 @@ from tests.common import ( USER = "greg" DEVICE = "phone" -LOCATION_TOPIC = "owntracks/{}/{}".format(USER, DEVICE) -EVENT_TOPIC = "owntracks/{}/{}/event".format(USER, DEVICE) -WAYPOINTS_TOPIC = "owntracks/{}/{}/waypoints".format(USER, DEVICE) -WAYPOINT_TOPIC = "owntracks/{}/{}/waypoint".format(USER, DEVICE) +LOCATION_TOPIC = f"owntracks/{USER}/{DEVICE}" +EVENT_TOPIC = f"owntracks/{USER}/{DEVICE}/event" +WAYPOINTS_TOPIC = f"owntracks/{USER}/{DEVICE}/waypoints" +WAYPOINT_TOPIC = f"owntracks/{USER}/{DEVICE}/waypoint" USER_BLACKLIST = "ram" -WAYPOINTS_TOPIC_BLOCKED = "owntracks/{}/{}/waypoints".format(USER_BLACKLIST, DEVICE) -LWT_TOPIC = "owntracks/{}/{}/lwt".format(USER, DEVICE) -BAD_TOPIC = "owntracks/{}/{}/unsupported".format(USER, DEVICE) +WAYPOINTS_TOPIC_BLOCKED = f"owntracks/{USER_BLACKLIST}/{DEVICE}/waypoints" +LWT_TOPIC = f"owntracks/{USER}/{DEVICE}/lwt" +BAD_TOPIC = f"owntracks/{USER}/{DEVICE}/unsupported" -DEVICE_TRACKER_STATE = "device_tracker.{}_{}".format(USER, DEVICE) +DEVICE_TRACKER_STATE = f"device_tracker.{USER}_{DEVICE}" IBEACON_DEVICE = "keys" MOBILE_BEACON_FMT = "device_tracker.beacon_{}" @@ -1510,7 +1510,7 @@ async def test_customized_mqtt_topic(hass, setup_comp): """Test subscribing to a custom mqtt topic.""" await setup_owntracks(hass, {CONF_MQTT_TOPIC: "mytracks/#"}) - topic = "mytracks/{}/{}".format(USER, DEVICE) + topic = f"mytracks/{USER}/{DEVICE}" await send_message(hass, topic, LOCATION_MESSAGE) assert_location_latitude(hass, LOCATION_MESSAGE["lat"]) diff --git a/tests/components/ps4/test_init.py b/tests/components/ps4/test_init.py index 028c1643ff0a..453202b6c67c 100644 --- a/tests/components/ps4/test_init.py +++ b/tests/components/ps4/test_init.py @@ -138,7 +138,7 @@ async def test_config_flow_entry_migrate(hass): mock_entry = MOCK_ENTRY_VERSION_1 mock_entry.add_to_manager(manager) mock_e_registry = mock_registry(hass) - mock_entity_id = "media_player.ps4_{}".format(MOCK_UNIQUE_ID) + mock_entity_id = f"media_player.ps4_{MOCK_UNIQUE_ID}" mock_e_entry = mock_e_registry.async_get_or_create( "media_player", "ps4", @@ -278,7 +278,7 @@ async def test_send_command(hass): mock_devices = hass.data[PS4_DATA].devices assert len(mock_devices) == 1 mock_entity = mock_devices[0] - assert mock_entity.entity_id == "media_player.{}".format(MOCK_NAME) + assert mock_entity.entity_id == f"media_player.{MOCK_NAME}" # Test that all commands call service function. with patch(mock_func, return_value=mock_coro(True)) as mock_service: diff --git a/tests/components/sensor/test_device_trigger.py b/tests/components/sensor/test_device_trigger.py index 54c0c8f7bd09..70539871aa8d 100644 --- a/tests/components/sensor/test_device_trigger.py +++ b/tests/components/sensor/test_device_trigger.py @@ -426,6 +426,7 @@ async def test_if_fires_on_state_change_with_for(hass, calls): await hass.async_block_till_done() assert len(calls) == 1 await hass.async_block_till_done() - assert calls[0].data[ - "some" - ] == "turn_off device - {} - unknown - 11 - 0:00:05".format(sensor1.entity_id) + assert ( + calls[0].data["some"] + == f"turn_off device - {sensor1.entity_id} - unknown - 11 - 0:00:05" + ) diff --git a/tests/components/starline/test_config_flow.py b/tests/components/starline/test_config_flow.py index 3ca52f849bc4..7050376dbfee 100644 --- a/tests/components/starline/test_config_flow.py +++ b/tests/components/starline/test_config_flow.py @@ -65,7 +65,7 @@ async def test_flow_works(hass): }, ) assert result["type"] == "create_entry" - assert result["title"] == "Application {}".format(TEST_APP_ID) + assert result["title"] == f"Application {TEST_APP_ID}" async def test_step_auth_app_code_falls(hass): diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index ab5d562ffc80..a52deebbcaaf 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -297,9 +297,7 @@ async def test_setup_component_and_test_with_service_options_def(hass, empty_cac assert os.path.isfile( os.path.join( empty_cache_dir, - "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{0}_demo.mp3".format( - opt_hash - ), + f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3", ) ) diff --git a/tests/components/twilio/test_init.py b/tests/components/twilio/test_init.py index 196d0e99991d..4c4d499a6d95 100644 --- a/tests/components/twilio/test_init.py +++ b/tests/components/twilio/test_init.py @@ -31,9 +31,7 @@ async def test_config_flow_registers_webhook(hass, aiohttp_client): hass.bus.async_listen(twilio.RECEIVED_DATA, handle_event) client = await aiohttp_client(hass.http.app) - await client.post( - "/api/webhook/{}".format(webhook_id), data={"hello": "twilio"} - ) + await client.post(f"/api/webhook/{webhook_id}", data={"hello": "twilio"}) assert len(twilio_events) == 1 assert twilio_events[0].data["webhook_id"] == webhook_id diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index 249b833bdc27..6c5f2b1d3717 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -271,14 +271,14 @@ def test_logarithm(hass): for value, base, expected in tests: assert ( template.Template( - "{{ %s | log(%s) | round(1) }}" % (value, base), hass + f"{{{{ {value} | log({base}) | round(1) }}}}", hass ).async_render() == expected ) assert ( template.Template( - "{{ log(%s, %s) | round(1) }}" % (value, base), hass + f"{{{{ log({value}, {base}) | round(1) }}}}", hass ).async_render() == expected ) @@ -439,13 +439,13 @@ def test_arc_tan2(hass): for y, x, expected in tests: assert ( template.Template( - "{{ (%s, %s) | atan2 | round(3) }}" % (y, x), hass + f"{{{{ ({y}, {x}) | atan2 | round(3) }}}}", hass ).async_render() == expected ) assert ( template.Template( - "{{ atan2(%s, %s) | round(3) }}" % (y, x), hass + f"{{{{ atan2({y}, {x}) | round(3) }}}}", hass ).async_render() == expected ) @@ -468,7 +468,7 @@ def test_strptime(hass): if expected is None: expected = datetime.strptime(inp, fmt) - temp = "{{ strptime('%s', '%s') }}" % (inp, fmt) + temp = f"{{{{ strptime('{inp}', '{fmt}') }}}}" assert template.Template(temp, hass).async_render() == str(expected) @@ -492,9 +492,7 @@ def test_timestamp_custom(hass): else: fil = "timestamp_custom" - assert ( - template.Template("{{ %s | %s }}" % (inp, fil), hass).async_render() == out - ) + assert template.Template(f"{{{{ {inp} | {fil} }}}}", hass).async_render() == out def test_timestamp_local(hass): From bf1b408038a0b0bf3201d3752e17b4db6fbabe69 Mon Sep 17 00:00:00 2001 From: Phil Bruckner Date: Sat, 4 Apr 2020 17:36:33 -0500 Subject: [PATCH 115/653] Handle cancellation in ServiceRegistry.async_call (#33644) --- homeassistant/core.py | 65 +++++++++++++++++++++++++++++++------------ tests/test_core.py | 36 ++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 54f1c1cd366f..7e85e7616a8d 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -28,6 +28,7 @@ from typing import ( Optional, Set, TypeVar, + Union, ) import uuid @@ -1224,29 +1225,57 @@ class ServiceRegistry: context=context, ) + coro = self._execute_service(handler, service_call) if not blocking: - self._hass.async_create_task(self._safe_execute(handler, service_call)) + self._run_service_in_background(coro, service_call) return None + task = self._hass.async_create_task(coro) try: - async with timeout(limit): - await asyncio.shield(self._execute_service(handler, service_call)) - return True - except asyncio.TimeoutError: - return False + await asyncio.wait({task}, timeout=limit) + except asyncio.CancelledError: + # Task calling us was cancelled, so cancel service call task, and wait for + # it to be cancelled, within reason, before leaving. + _LOGGER.debug("Service call was cancelled: %s", service_call) + task.cancel() + await asyncio.wait({task}, timeout=SERVICE_CALL_LIMIT) + raise - async def _safe_execute(self, handler: Service, service_call: ServiceCall) -> None: - """Execute a service and catch exceptions.""" - try: - await self._execute_service(handler, service_call) - except Unauthorized: - _LOGGER.warning( - "Unauthorized service called %s/%s", - service_call.domain, - service_call.service, - ) - except Exception: # pylint: disable=broad-except - _LOGGER.exception("Error executing service %s", service_call) + if task.cancelled(): + # Service call task was cancelled some other way, such as during shutdown. + _LOGGER.debug("Service was cancelled: %s", service_call) + raise asyncio.CancelledError + if task.done(): + # Propagate any exceptions that might have happened during service call. + task.result() + # Service call completed successfully! + return True + # Service call task did not complete before timeout expired. + # Let it keep running in background. + self._run_service_in_background(task, service_call) + _LOGGER.debug("Service did not complete before timeout: %s", service_call) + return False + + def _run_service_in_background( + self, coro_or_task: Union[Coroutine, asyncio.Task], service_call: ServiceCall + ) -> None: + """Run service call in background, catching and logging any exceptions.""" + + async def catch_exceptions() -> None: + try: + await coro_or_task + except Unauthorized: + _LOGGER.warning( + "Unauthorized service called %s/%s", + service_call.domain, + service_call.service, + ) + except asyncio.CancelledError: + _LOGGER.debug("Service was cancelled: %s", service_call) + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Error executing service: %s", service_call) + + self._hass.async_create_task(catch_exceptions()) async def _execute_service( self, handler: Service, service_call: ServiceCall diff --git a/tests/test_core.py b/tests/test_core.py index 5e6bb0908211..deeb808396a8 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1214,6 +1214,42 @@ async def test_async_functions_with_callback(hass): assert len(runs) == 3 +@pytest.mark.parametrize("cancel_call", [True, False]) +async def test_cancel_service_task(hass, cancel_call): + """Test cancellation.""" + service_called = asyncio.Event() + service_cancelled = False + + async def service_handler(call): + nonlocal service_cancelled + service_called.set() + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + service_cancelled = True + raise + + hass.services.async_register("test_domain", "test_service", service_handler) + call_task = hass.async_create_task( + hass.services.async_call("test_domain", "test_service", blocking=True) + ) + + tasks_1 = asyncio.all_tasks() + await asyncio.wait_for(service_called.wait(), timeout=1) + tasks_2 = asyncio.all_tasks() - tasks_1 + assert len(tasks_2) == 1 + service_task = tasks_2.pop() + + if cancel_call: + call_task.cancel() + else: + service_task.cancel() + with pytest.raises(asyncio.CancelledError): + await call_task + + assert service_cancelled + + def test_valid_entity_id(): """Test valid entity ID.""" for invalid in [ From c20a965edaff9b973a92ff3267140f529f4f0088 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 01:32:58 +0200 Subject: [PATCH 116/653] Improve string formatting v3 (#33667) * Improve string formatting v3 * Address review comment --- homeassistant/components/actiontec/device_tracker.py | 4 ++-- homeassistant/components/aftership/sensor.py | 2 +- homeassistant/components/aqualogic/__init__.py | 2 +- homeassistant/components/arwn/sensor.py | 2 +- homeassistant/components/darksky/sensor.py | 3 ++- homeassistant/components/denon/media_player.py | 4 ++-- homeassistant/components/dublin_bus_transport/sensor.py | 2 +- homeassistant/components/dwd_weather_warnings/sensor.py | 4 ++-- homeassistant/components/ecobee/binary_sensor.py | 2 +- homeassistant/components/econet/water_heater.py | 6 +----- homeassistant/components/group/__init__.py | 2 +- homeassistant/components/hydrawise/sensor.py | 6 +----- homeassistant/components/hyperion/light.py | 2 +- homeassistant/components/influxdb/__init__.py | 2 +- homeassistant/components/irish_rail_transport/sensor.py | 8 +++++--- homeassistant/components/knx/climate.py | 2 +- homeassistant/components/life360/__init__.py | 2 +- homeassistant/components/light/__init__.py | 2 +- homeassistant/components/mobile_app/const.py | 2 +- homeassistant/components/mqtt/discovery.py | 2 +- homeassistant/components/mychevy/__init__.py | 2 +- homeassistant/components/nest/binary_sensor.py | 2 +- homeassistant/components/nest/sensor.py | 2 +- homeassistant/components/ombi/__init__.py | 2 +- 24 files changed, 32 insertions(+), 37 deletions(-) diff --git a/homeassistant/components/actiontec/device_tracker.py b/homeassistant/components/actiontec/device_tracker.py index d9d4a4f2ea6a..e3fdeaf35f28 100644 --- a/homeassistant/components/actiontec/device_tracker.py +++ b/homeassistant/components/actiontec/device_tracker.py @@ -95,9 +95,9 @@ class ActiontecDeviceScanner(DeviceScanner): try: telnet = telnetlib.Telnet(self.host) telnet.read_until(b"Username: ") - telnet.write((self.username + "\n").encode("ascii")) + telnet.write((f"{self.username}\n").encode("ascii")) telnet.read_until(b"Password: ") - telnet.write((self.password + "\n").encode("ascii")) + telnet.write((f"{self.password}\n").encode("ascii")) prompt = telnet.read_until(b"Wireless Broadband Router> ").split(b"\n")[-1] telnet.write(b"firewall mac_cache_dump\n") telnet.write(b"\n") diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index 3f00c8c310da..a615c5e40330 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -27,7 +27,7 @@ CONF_TITLE = "title" CONF_TRACKING_NUMBER = "tracking_number" DEFAULT_NAME = "aftership" -UPDATE_TOPIC = DOMAIN + "_update" +UPDATE_TOPIC = f"{DOMAIN}_update" ICON = "mdi:package-variant-closed" diff --git a/homeassistant/components/aqualogic/__init__.py b/homeassistant/components/aqualogic/__init__.py index 9f693966382c..7ed38206a119 100644 --- a/homeassistant/components/aqualogic/__init__.py +++ b/homeassistant/components/aqualogic/__init__.py @@ -18,7 +18,7 @@ from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) DOMAIN = "aqualogic" -UPDATE_TOPIC = DOMAIN + "_update" +UPDATE_TOPIC = f"{DOMAIN}_update" CONF_UNIT = "unit" RECONNECT_INTERVAL = timedelta(seconds=10) diff --git a/homeassistant/components/arwn/sensor.py b/homeassistant/components/arwn/sensor.py index 6684a5b882b8..7be5c4bfb935 100644 --- a/homeassistant/components/arwn/sensor.py +++ b/homeassistant/components/arwn/sensor.py @@ -32,7 +32,7 @@ def discover_sensors(topic, payload): unit = TEMP_CELSIUS return ArwnSensor(name, "temp", unit) if domain == "moisture": - name = parts[2] + " Moisture" + name = f"{parts[2]} Moisture" return ArwnSensor(name, "moisture", unit, "mdi:water-percent") if domain == "rain": if len(parts) >= 3 and parts[2] == "today": diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index 26ba590888f9..0d6814fca10d 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -771,7 +771,8 @@ def convert_to_camel(data): This is not pythonic, but needed for certain situations. """ components = data.split("_") - return components[0] + "".join(x.title() for x in components[1:]) + capital_components = "".join(x.title() for x in components[1:]) + return f"{components[0]}{capital_components}" class DarkSkyData: diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index 9f210add0af0..11c31107ef60 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -187,7 +187,7 @@ class DenonDevice(MediaPlayerDevice): "NSE8", ] for line in self.telnet_request(telnet, "NSE", all_lines=True): - self._mediainfo += line[len(answer_codes.pop(0)) :] + "\n" + self._mediainfo += f"{line[len(answer_codes.pop(0)) :]}\n" else: self._mediainfo = self.source @@ -257,7 +257,7 @@ class DenonDevice(MediaPlayerDevice): def set_volume_level(self, volume): """Set volume level, range 0..1.""" - self.telnet_command(f"MV{str(round(volume * self._volume_max)).zfill(2)}") + self.telnet_command(f"MV{round(volume * self._volume_max):02}") def mute_volume(self, mute): """Mute (true) or unmute (false) media player.""" diff --git a/homeassistant/components/dublin_bus_transport/sensor.py b/homeassistant/components/dublin_bus_transport/sensor.py index 5de0b62a4a9a..e75775bf75f5 100644 --- a/homeassistant/components/dublin_bus_transport/sensor.py +++ b/homeassistant/components/dublin_bus_transport/sensor.py @@ -94,7 +94,7 @@ class DublinPublicTransportSensor(Entity): if self._times is not None: next_up = "None" if len(self._times) > 1: - next_up = self._times[1][ATTR_ROUTE] + " in " + next_up = f"{self._times[1][ATTR_ROUTE]} in " next_up += self._times[1][ATTR_DUE_IN] return { diff --git a/homeassistant/components/dwd_weather_warnings/sensor.py b/homeassistant/components/dwd_weather_warnings/sensor.py index 966ec407ce8f..2b7d2296a016 100644 --- a/homeassistant/components/dwd_weather_warnings/sensor.py +++ b/homeassistant/components/dwd_weather_warnings/sensor.py @@ -133,9 +133,9 @@ class DwdWeatherWarningsSensor(Entity): else: raise Exception("Unknown warning type") - data["warning_count"] = self._api.data[prefix + "_warning_count"] + data["warning_count"] = self._api.data[f"{prefix}_warning_count"] i = 0 - for event in self._api.data[prefix + "_warnings"]: + for event in self._api.data[f"{prefix}_warnings"]: i = i + 1 data[f"warning_{i}_name"] = event["event"] diff --git a/homeassistant/components/ecobee/binary_sensor.py b/homeassistant/components/ecobee/binary_sensor.py index 71aaee1c4054..2f422007ff45 100644 --- a/homeassistant/components/ecobee/binary_sensor.py +++ b/homeassistant/components/ecobee/binary_sensor.py @@ -28,7 +28,7 @@ class EcobeeBinarySensor(BinarySensorDevice): def __init__(self, data, sensor_name, sensor_index): """Initialize the Ecobee sensor.""" self.data = data - self._name = sensor_name + " Occupancy" + self._name = f"{sensor_name} Occupancy" self.sensor_name = sensor_name self.index = sensor_index self._state = None diff --git a/homeassistant/components/econet/water_heater.py b/homeassistant/components/econet/water_heater.py index 26ee7cb8bd42..8fede954255c 100644 --- a/homeassistant/components/econet/water_heater.py +++ b/homeassistant/components/econet/water_heater.py @@ -132,11 +132,7 @@ class EcoNetWaterHeater(WaterHeaterDevice): self.ha_state_to_econet[value] = key for mode in self.supported_modes: if mode not in ECONET_STATE_TO_HA: - error = ( - "Invalid operation mode mapping. " - + mode - + " doesn't map. Please report this." - ) + error = f"Invalid operation mode mapping. {mode} doesn't map. Please report this." _LOGGER.error(error) @property diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index fd44a80cf3cf..e4966a1a4cee 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -174,7 +174,7 @@ def get_entity_ids( if not domain_filter: return cast(List[str], entity_ids) - domain_filter = domain_filter.lower() + "." + domain_filter = f"{domain_filter.lower()}." return [ent_id for ent_id in entity_ids if ent_id.startswith(domain_filter)] diff --git a/homeassistant/components/hydrawise/sensor.py b/homeassistant/components/hydrawise/sensor.py index 53bca7996576..88146dbeb0d1 100644 --- a/homeassistant/components/hydrawise/sensor.py +++ b/homeassistant/components/hydrawise/sensor.py @@ -58,11 +58,7 @@ class HydrawiseSensor(HydrawiseEntity): if relay["nicetime"] == "Not scheduled": self._state = "not_scheduled" else: - self._state = ( - relay["nicetime"].split(",")[0] - + " " - + relay["nicetime"].split(" ")[3] - ) + self._state = f"{relay['nicetime'].split(',')[0]} {relay['nicetime'].split(' ')[3]}" @property def icon(self): diff --git a/homeassistant/components/hyperion/light.py b/homeassistant/components/hyperion/light.py index fa5d58fb3852..fc96f672afbf 100644 --- a/homeassistant/components/hyperion/light.py +++ b/homeassistant/components/hyperion/light.py @@ -285,7 +285,7 @@ class Hyperion(Light): sock.close() return False - sock.send(bytearray(json.dumps(request) + "\n", "utf-8")) + sock.send(bytearray(f"{json.dumps(request)}\n", "utf-8")) try: buf = sock.recv(4096) except socket.timeout: diff --git a/homeassistant/components/influxdb/__init__.py b/homeassistant/components/influxdb/__init__.py index 1b3093447ecb..922a0197cf16 100644 --- a/homeassistant/components/influxdb/__init__.py +++ b/homeassistant/components/influxdb/__init__.py @@ -239,7 +239,7 @@ def setup(hass, config): elif key != "unit_of_measurement" or include_uom: # If the key is already in fields if key in json["fields"]: - key = key + "_" + key = f"{key}_" # Prevent column data errors in influxDB. # For each value we try to cast it as float # But if we can not do it we store the value diff --git a/homeassistant/components/irish_rail_transport/sensor.py b/homeassistant/components/irish_rail_transport/sensor.py index 3bb7da52e22c..76f8d0dfaabd 100644 --- a/homeassistant/components/irish_rail_transport/sensor.py +++ b/homeassistant/components/irish_rail_transport/sensor.py @@ -97,9 +97,11 @@ class IrishRailTransportSensor(Entity): if self._times: next_up = "None" if len(self._times) > 1: - next_up = self._times[1][ATTR_ORIGIN] + " to " - next_up += self._times[1][ATTR_DESTINATION] + " in " - next_up += self._times[1][ATTR_DUE_IN] + next_up = ( + f"{self._times[1][ATTR_ORIGIN]} to " + f"{self._times[1][ATTR_DESTINATION]} in " + f"{self._times[1][ATTR_DUE_IN]}" + ) return { ATTR_ATTRIBUTION: ATTRIBUTION, diff --git a/homeassistant/components/knx/climate.py b/homeassistant/components/knx/climate.py index e6da946c81c3..e7e489dba789 100644 --- a/homeassistant/components/knx/climate.py +++ b/homeassistant/components/knx/climate.py @@ -139,7 +139,7 @@ def async_add_entities_config(hass, config, async_add_entities): """Set up climate for KNX platform configured within platform.""" climate_mode = XknxClimateMode( hass.data[DATA_KNX].xknx, - name=config[CONF_NAME] + " Mode", + name=f"{config[CONF_NAME]} Mode", group_address_operation_mode=config.get(CONF_OPERATION_MODE_ADDRESS), group_address_operation_mode_state=config.get( CONF_OPERATION_MODE_STATE_ADDRESS diff --git a/homeassistant/components/life360/__init__.py b/homeassistant/components/life360/__init__.py index 50117c210a2a..8338cbf7f116 100644 --- a/homeassistant/components/life360/__init__.py +++ b/homeassistant/components/life360/__init__.py @@ -57,7 +57,7 @@ def _prefix(value): if not value: return "" if not value.endswith("_"): - return value + "_" + return f"{value}_" return value diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 5b9b923cc56f..e86de00b59f3 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -325,7 +325,7 @@ class Profiles: def get_default(cls, entity_id): """Return the default turn-on profile for the given light.""" # pylint: disable=unsupported-membership-test - name = entity_id + ".default" + name = f"{entity_id}.default" if name in cls._all: return name name = "group.all_lights.default" diff --git a/homeassistant/components/mobile_app/const.py b/homeassistant/components/mobile_app/const.py index f43f1c88396d..a9cdc6769324 100644 --- a/homeassistant/components/mobile_app/const.py +++ b/homeassistant/components/mobile_app/const.py @@ -70,5 +70,5 @@ ATTR_SENSOR_TYPE_SENSOR = "sensor" ATTR_SENSOR_UNIQUE_ID = "unique_id" ATTR_SENSOR_UOM = "unit_of_measurement" -SIGNAL_SENSOR_UPDATE = DOMAIN + "_sensor_update" +SIGNAL_SENSOR_UPDATE = f"{DOMAIN}_sensor_update" SIGNAL_LOCATION_UPDATE = DOMAIN + "_location_update_{}" diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index 812bb183e1c4..ce8207fc28d8 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -166,7 +166,7 @@ async def async_start( hass.data[CONFIG_ENTRY_IS_SETUP] = set() await mqtt.async_subscribe( - hass, discovery_topic + "/#", async_device_message_received, 0 + hass, f"{discovery_topic}/#", async_device_message_received, 0 ) return True diff --git a/homeassistant/components/mychevy/__init__.py b/homeassistant/components/mychevy/__init__.py index 0ec4d05a623b..2b8bd65dfe8a 100644 --- a/homeassistant/components/mychevy/__init__.py +++ b/homeassistant/components/mychevy/__init__.py @@ -13,7 +13,7 @@ from homeassistant.util import Throttle DOMAIN = "mychevy" UPDATE_TOPIC = DOMAIN -ERROR_TOPIC = DOMAIN + "_error" +ERROR_TOPIC = f"{DOMAIN}_error" MYCHEVY_SUCCESS = "success" MYCHEVY_ERROR = "error" diff --git a/homeassistant/components/nest/binary_sensor.py b/homeassistant/components/nest/binary_sensor.py index a029fcfe7d65..34dc7b06ade6 100644 --- a/homeassistant/components/nest/binary_sensor.py +++ b/homeassistant/components/nest/binary_sensor.py @@ -69,7 +69,7 @@ async def async_setup_entry(hass, entry, async_add_entities): for variable in conditions: if variable in _BINARY_TYPES_DEPRECATED: wstr = ( - variable + " is no a longer supported " + f"{variable} is no a longer supported " "monitored_conditions. See " "https://www.home-assistant.io/integrations/binary_sensor.nest/ " "for valid options." diff --git a/homeassistant/components/nest/sensor.py b/homeassistant/components/nest/sensor.py index 064c78917e1c..082b5b19b5f4 100644 --- a/homeassistant/components/nest/sensor.py +++ b/homeassistant/components/nest/sensor.py @@ -96,7 +96,7 @@ async def async_setup_entry(hass, entry, async_add_entities): ) else: wstr = ( - variable + " is no a longer supported " + f"{variable} is no a longer supported " "monitored_conditions. See " "https://www.home-assistant.io/integrations/" "binary_sensor.nest/ for valid options." diff --git a/homeassistant/components/ombi/__init__.py b/homeassistant/components/ombi/__init__.py index 750772ce8f5b..dcd8f2641612 100644 --- a/homeassistant/components/ombi/__init__.py +++ b/homeassistant/components/ombi/__init__.py @@ -38,7 +38,7 @@ def urlbase(value) -> str: value = str(value).strip("/") if not value: return value - return value + "/" + return f"{value}/" SUBMIT_MOVIE_REQUEST_SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string}) From d267d674b9bc28033545b8c070c62ff731ba0c16 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 5 Apr 2020 00:03:15 +0000 Subject: [PATCH 117/653] [ci skip] Translation update --- .../airvisual/.translations/ru.json | 2 +- .../components/doorbird/.translations/ca.json | 1 + .../components/doorbird/.translations/de.json | 1 + .../components/doorbird/.translations/ko.json | 1 + .../components/doorbird/.translations/ru.json | 5 ++- .../flunearyou/.translations/ca.json | 21 +++++++++++ .../flunearyou/.translations/de.json | 20 ++++++++++ .../flunearyou/.translations/ko.json | 21 +++++++++++ .../flunearyou/.translations/ru.json | 21 +++++++++++ .../components/hue/.translations/ca.json | 17 +++++++++ .../components/hue/.translations/ru.json | 17 +++++++++ .../components/ipp/.translations/ca.json | 3 ++ .../konnected/.translations/ru.json | 9 ++++- .../components/nut/.translations/ru.json | 37 +++++++++++++++++++ .../components/unifi/.translations/ca.json | 3 +- .../components/unifi/.translations/ru.json | 3 +- .../components/vera/.translations/ca.json | 31 ++++++++++++++++ .../components/vera/.translations/de.json | 31 ++++++++++++++++ .../components/vera/.translations/ko.json | 32 ++++++++++++++++ .../components/vera/.translations/ru.json | 32 ++++++++++++++++ 20 files changed, 302 insertions(+), 6 deletions(-) create mode 100644 homeassistant/components/flunearyou/.translations/ca.json create mode 100644 homeassistant/components/flunearyou/.translations/de.json create mode 100644 homeassistant/components/flunearyou/.translations/ko.json create mode 100644 homeassistant/components/flunearyou/.translations/ru.json create mode 100644 homeassistant/components/nut/.translations/ru.json create mode 100644 homeassistant/components/vera/.translations/ca.json create mode 100644 homeassistant/components/vera/.translations/de.json create mode 100644 homeassistant/components/vera/.translations/ko.json create mode 100644 homeassistant/components/vera/.translations/ru.json diff --git a/homeassistant/components/airvisual/.translations/ru.json b/homeassistant/components/airvisual/.translations/ru.json index 5c9634390c6f..61d4b45eb380 100644 --- a/homeassistant/components/airvisual/.translations/ru.json +++ b/homeassistant/components/airvisual/.translations/ru.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u042d\u0442\u043e\u0442 \u043a\u043b\u044e\u0447 API \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f." + "already_configured": "\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b." }, "error": { "invalid_api_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API." diff --git a/homeassistant/components/doorbird/.translations/ca.json b/homeassistant/components/doorbird/.translations/ca.json index 488481f96141..ba6f7341201f 100644 --- a/homeassistant/components/doorbird/.translations/ca.json +++ b/homeassistant/components/doorbird/.translations/ca.json @@ -8,6 +8,7 @@ "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", "unknown": "Error inesperat" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/doorbird/.translations/de.json b/homeassistant/components/doorbird/.translations/de.json index 3709adaa69ac..2992d066d4a0 100644 --- a/homeassistant/components/doorbird/.translations/de.json +++ b/homeassistant/components/doorbird/.translations/de.json @@ -10,6 +10,7 @@ "invalid_auth": "Ung\u00fcltige Authentifizierung", "unknown": "Unerwarteter Fehler" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/doorbird/.translations/ko.json b/homeassistant/components/doorbird/.translations/ko.json index fcdee98a74d3..fff92c32188f 100644 --- a/homeassistant/components/doorbird/.translations/ko.json +++ b/homeassistant/components/doorbird/.translations/ko.json @@ -10,6 +10,7 @@ "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" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/doorbird/.translations/ru.json b/homeassistant/components/doorbird/.translations/ru.json index bca45c773b62..1c034d6d68b4 100644 --- a/homeassistant/components/doorbird/.translations/ru.json +++ b/homeassistant/components/doorbird/.translations/ru.json @@ -1,13 +1,16 @@ { "config": { "abort": { - "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", + "link_local_address": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.", + "not_doorbird_device": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 DoorBird." }, "error": { "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", "invalid_auth": "\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f.", "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/flunearyou/.translations/ca.json b/homeassistant/components/flunearyou/.translations/ca.json new file mode 100644 index 000000000000..dddf7dc2c882 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/ca.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Les coordenades ja estan registrades" + }, + "error": { + "general_error": "S'ha produ\u00eft un error desconegut." + }, + "step": { + "user": { + "data": { + "latitude": "Latitud", + "longitude": "Longitud" + }, + "description": "Monitoritza informes basats en usuari i CDC per a parells de coordenades.", + "title": "Configuraci\u00f3 Flu Near You" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/de.json b/homeassistant/components/flunearyou/.translations/de.json new file mode 100644 index 000000000000..0ac830238968 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/de.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Diese Koordinaten sind bereits registriert." + }, + "error": { + "general_error": "Es gab einen unbekannten Fehler." + }, + "step": { + "user": { + "data": { + "latitude": "Breitengrad", + "longitude": "L\u00e4ngengrad" + }, + "title": "Konfigurieren Sie die Grippe in Ihrer N\u00e4he" + } + }, + "title": "Grippe in Ihrer N\u00e4he" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ko.json b/homeassistant/components/flunearyou/.translations/ko.json new file mode 100644 index 000000000000..c155a7f6111a --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/ko.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\uc88c\ud45c\uac12\uc774 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + }, + "error": { + "general_error": "\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + }, + "step": { + "user": { + "data": { + "latitude": "\uc704\ub3c4", + "longitude": "\uacbd\ub3c4" + }, + "description": "\uc0ac\uc6a9\uc790 \uae30\ubc18 \ub370\uc774\ud130 \ubc0f CDC \ubcf4\uace0\uc11c\uc5d0\uc11c \uc88c\ud45c\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud569\ub2c8\ub2e4.", + "title": "Flu Near You \uad6c\uc131" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ru.json b/homeassistant/components/flunearyou/.translations/ru.json new file mode 100644 index 000000000000..8e8b050ba7af --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/ru.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b." + }, + "error": { + "general_error": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "latitude": "\u0428\u0438\u0440\u043e\u0442\u0430", + "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430" + }, + "description": "\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 CDC \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", + "title": "Flu Near You" + } + }, + "title": "Flu Near You" + } +} \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ca.json b/homeassistant/components/hue/.translations/ca.json index 471ce2181fb8..53c248fe1791 100644 --- a/homeassistant/components/hue/.translations/ca.json +++ b/homeassistant/components/hue/.translations/ca.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "Primer bot\u00f3", + "button_2": "Segon bot\u00f3", + "button_3": "Tercer bot\u00f3", + "button_4": "Quart bot\u00f3", + "dim_down": "Atenua la brillantor", + "dim_up": "Augmenta la brillantor", + "turn_off": "Apaga", + "turn_on": "Enc\u00e9n" + }, + "trigger_type": { + "remote_button_long_release": "Bot\u00f3 \"{subtype}\" alliberat despr\u00e9s d'una estona premut", + "remote_button_short_press": "Bot\u00f3 \"{subtype}\" premut", + "remote_button_short_release": "Bot\u00f3 \"{subtype}\" alliberat" + } } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ru.json b/homeassistant/components/hue/.translations/ru.json index 3425cb82d01e..fa2f2e557442 100644 --- a/homeassistant/components/hue/.translations/ru.json +++ b/homeassistant/components/hue/.translations/ru.json @@ -27,5 +27,22 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", + "button_2": "\u0412\u0442\u043e\u0440\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", + "button_3": "\u0422\u0440\u0435\u0442\u044c\u044f \u043a\u043d\u043e\u043f\u043a\u0430", + "button_4": "\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", + "dim_down": "\u042f\u0440\u043a\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f", + "dim_up": "\u042f\u0440\u043a\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f", + "turn_off": "\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", + "turn_on": "\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044f", + "remote_button_short_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430", + "remote_button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430" + } } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index 5708c8e638dc..39893c5d2fac 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -1,5 +1,8 @@ { "config": { + "abort": { + "already_configured": "Aquesta impressora ja est\u00e0 configurada." + }, "flow_title": "Impressora: {name}", "step": { "user": { diff --git a/homeassistant/components/konnected/.translations/ru.json b/homeassistant/components/konnected/.translations/ru.json index 75a879832a45..f3b7f4d6d24b 100644 --- a/homeassistant/components/konnected/.translations/ru.json +++ b/homeassistant/components/konnected/.translations/ru.json @@ -33,6 +33,9 @@ "abort": { "not_konn_panel": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Konnected.io \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043e." }, + "error": { + "bad_host": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 URL \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442\u0430 API." + }, "step": { "options_binary": { "data": { @@ -82,7 +85,9 @@ }, "options_misc": { "data": { - "blink": "LED-\u0438\u043d\u0434\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f" + "api_host": "\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c URL \u0445\u043e\u0441\u0442\u0430 API (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)", + "blink": "LED-\u0438\u043d\u0434\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f", + "override_api_host": "\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c URL-\u0430\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442-\u043f\u0430\u043d\u0435\u043b\u0438 Home Assistant API" }, "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.", "title": "\u041f\u0440\u043e\u0447\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438" @@ -96,7 +101,7 @@ "pause": "\u041f\u0430\u0443\u0437\u0430 \u043c\u0435\u0436\u0434\u0443 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430\u043c\u0438 (\u043c\u0441) (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)", "repeat": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 (-1 = \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e) (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)" }, - "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0445\u043e\u0434\u0430 \u0434\u043b\u044f {zone}.", + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0445\u043e\u0434\u0430 \u0434\u043b\u044f {zone}: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 {state}.", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430" } }, diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json new file mode 100644 index 000000000000..7bc48ec2e3f6 --- /dev/null +++ b/homeassistant/components/nut/.translations/ru.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "alias": "\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c", + "host": "\u0425\u043e\u0441\u0442", + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "port": "\u041f\u043e\u0440\u0442", + "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "description": "\u0415\u0441\u043b\u0438 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0418\u0411\u041f, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0418\u0411\u041f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043f\u043e\u043b\u0435 '\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c'.", + "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT" + } + }, + "title": "Network UPS Tools (NUT)" + }, + "options": { + "step": { + "init": { + "data": { + "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ca.json b/homeassistant/components/unifi/.translations/ca.json index 3a6e147e8675..7eefb77b3d21 100644 --- a/homeassistant/components/unifi/.translations/ca.json +++ b/homeassistant/components/unifi/.translations/ca.json @@ -32,7 +32,8 @@ "client_control": { "data": { "block_client": "Clients controlats amb acc\u00e9s a la xarxa", - "new_client": "Afegeix un client nou per al control d\u2019acc\u00e9s a la xarxa" + "new_client": "Afegeix un client nou per al control d\u2019acc\u00e9s a la xarxa", + "poe_clients": "Permet control POE dels clients" }, "description": "Configura els controls del client \n\nConfigura interruptors per als n\u00fameros de s\u00e8rie als quals vulguis controlar l'acc\u00e9s a la xarxa.", "title": "Opcions d'UniFi 2/3" diff --git a/homeassistant/components/unifi/.translations/ru.json b/homeassistant/components/unifi/.translations/ru.json index b73c6b9c2fbf..6cd09a947eb2 100644 --- a/homeassistant/components/unifi/.translations/ru.json +++ b/homeassistant/components/unifi/.translations/ru.json @@ -29,7 +29,8 @@ "client_control": { "data": { "block_client": "\u041a\u043b\u0438\u0435\u043d\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430", - "new_client": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430" + "new_client": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430", + "poe_clients": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c POE \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432" }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 UniFi. \u0428\u0430\u0433 2" }, diff --git a/homeassistant/components/vera/.translations/ca.json b/homeassistant/components/vera/.translations/ca.json new file mode 100644 index 000000000000..27ead21ddc5a --- /dev/null +++ b/homeassistant/components/vera/.translations/ca.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "Ja hi ha un controlador configurat.", + "cannot_connect": "No s'ha pogut connectar amb el controlador amb l'URL {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "Identificadors de dispositiu Vera a excloure de Home Assistant.", + "lights": "Identificadors de dispositiu dels commutadors Vera a tractar com a llums a Home Assistant.", + "vera_controller_url": "URL del controlador" + }, + "description": "Proporciona un URL pel controlador Vera. Hauria de quedar aix\u00ed: http://192.168.1.161:3480.", + "title": "Configuraci\u00f3 del controlador Vera" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Identificadors de dispositiu Vera a excloure de Home Assistant.", + "lights": "Identificadors de dispositiu dels commutadors Vera a tractar com a llums a Home Assistant." + }, + "title": "Opcions del controlador Vera" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/de.json b/homeassistant/components/vera/.translations/de.json new file mode 100644 index 000000000000..91f61c9c2bc5 --- /dev/null +++ b/homeassistant/components/vera/.translations/de.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "Ein Controller ist bereits konfiguriert.", + "cannot_connect": "Konnte keine Verbindung zum Controller mit url {base_url} herstellen" + }, + "step": { + "user": { + "data": { + "exclude": "Vera-Ger\u00e4te-IDs, die vom Home Assistant ausgeschlossen werden sollen.", + "lights": "Vera Switch-Ger\u00e4te-IDs, die im Home Assistant als Lichter behandelt werden sollen.", + "vera_controller_url": "Controller-URL" + }, + "description": "Stellen Sie unten eine Vera-Controller-Url zur Verf\u00fcgung. Sie sollte wie folgt aussehen: http://192.168.1.161:3480.", + "title": "Richten Sie den Vera-Controller ein" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Vera-Ger\u00e4te-IDs, die vom Home Assistant ausgeschlossen werden sollen." + }, + "description": "Weitere Informationen zu optionalen Parametern finden Sie in der Vera-Dokumentation: https://www.home-assistant.io/integrations/vera/. Hinweis: Alle \u00c4nderungen hier erfordern einen Neustart des Home Assistant-Servers. Geben Sie ein Leerzeichen ein, um Werte zu l\u00f6schen.", + "title": "Vera Controller Optionen" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ko.json b/homeassistant/components/vera/.translations/ko.json new file mode 100644 index 000000000000..cecde6b9183f --- /dev/null +++ b/homeassistant/components/vera/.translations/ko.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "\ucee8\ud2b8\ub864\ub7ec\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "cannot_connect": "URL {base_url} \uc5d0 \ucee8\ud2b8\ub864\ub7ec\ub97c \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4" + }, + "step": { + "user": { + "data": { + "exclude": "Home Assistant \uc5d0\uc11c \uc81c\uc678\ud560 Vera \uae30\uae30 ID.", + "lights": "Vera \uc2a4\uc704\uce58 \uae30\uae30 ID \ub294 Home Assistant \uc5d0\uc11c \uc870\uba85\uc73c\ub85c \ucde8\uae09\ub429\ub2c8\ub2e4.", + "vera_controller_url": "\ucee8\ud2b8\ub864\ub7ec URL" + }, + "description": "\uc544\ub798\uc5d0 Vera \ucee8\ud2b8\ub864\ub7ec URL \uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694. http://192.168.1.161:3480 \uacfc \uac19\uc740 \ud615\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.", + "title": "Vera \ucee8\ud2b8\ub864\ub7ec \uc124\uc815" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Home Assistant \uc5d0\uc11c \uc81c\uc678\ud560 Vera \uae30\uae30 ID.", + "lights": "Vera \uc2a4\uc704\uce58 \uae30\uae30 ID \ub294 Home Assistant \uc5d0\uc11c \uc870\uba85\uc73c\ub85c \ucde8\uae09\ub429\ub2c8\ub2e4." + }, + "description": "\ub9e4\uac1c \ubcc0\uc218 \uc120\ud0dd\uc0ac\ud56d\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 vera \uc124\uba85\uc11c\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694: https://www.home-assistant.io/integrations/vera/. \ucc38\uace0: \uc5ec\uae30\uc5d0\uc11c \ubcc0\uacbd\ud558\uba74 Home Assistant \uc11c\ubc84\ub97c \ub2e4\uc2dc \uc2dc\uc791\ud574\uc57c \ud569\ub2c8\ub2e4. \uac12\uc744 \uc9c0\uc6b0\ub824\uba74 \uc785\ub825\ub780\uc744 \uacf5\ubc31\uc73c\ub85c \ub450\uc138\uc694.", + "title": "Vera \ucee8\ud2b8\ub864\ub7ec \uc635\uc158" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ru.json b/homeassistant/components/vera/.translations/ru.json new file mode 100644 index 000000000000..de374358e848 --- /dev/null +++ b/homeassistant/components/vera/.translations/ru.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 {base_url}." + }, + "step": { + "user": { + "data": { + "exclude": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Vera \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Home Assistant.", + "lights": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Vera \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 Home Assistant.", + "vera_controller_url": "URL-\u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430" + }, + "description": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Vera. \u0410\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'http://192.168.1.161:3480'.", + "title": "Vera" + } + }, + "title": "Vera" + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Vera \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Home Assistant.", + "lights": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Vera \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 Home Assistant." + }, + "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445: https://www.home-assistant.io/integrations/vera/.\n\u0414\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Home Assistant. \u0427\u0442\u043e\u0431\u044b \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0431\u0435\u043b.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Vera" + } + } + } +} \ No newline at end of file From 03dd92d51bd7565347431242fa9e6c6556afcfcc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 02:20:09 +0200 Subject: [PATCH 118/653] Use set literals in tests (#33669) --- tests/components/alexa/test_smart_home.py | 2 +- tests/components/emulated_hue/test_hue_api.py | 2 +- tests/components/group/test_init.py | 4 ++-- tests/components/hue/test_bridge.py | 4 ++-- tests/components/mqtt/test_device_tracker.py | 16 ++++++++-------- tests/components/zha/test_discover.py | 14 +++++--------- tests/components/zha/test_registries.py | 4 ++-- tests/helpers/test_init.py | 2 +- tests/test_core.py | 4 ++-- 9 files changed, 24 insertions(+), 28 deletions(-) diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index a0d40460373d..87e3a94beb44 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -167,7 +167,7 @@ def assert_endpoint_capabilities(endpoint, *interfaces): them. """ capabilities = endpoint["capabilities"] - supported = set(feature["interface"] for feature in capabilities) + supported = {feature["interface"] for feature in capabilities} assert supported == set(interfaces) return capabilities diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index 280ae56ea392..7ecad0183005 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -181,7 +181,7 @@ async def test_discover_lights(hue_client): result_json = await result.json() - devices = set(val["uniqueid"] for val in result_json.values()) + devices = {val["uniqueid"] for val in result_json.values()} # Make sure the lights we added to the config are there assert "00:2f:d2:31:ce:c5:55:cc-ee" in devices # light.ceiling_lights diff --git a/tests/components/group/test_init.py b/tests/components/group/test_init.py index e8878b7cf4ae..9cc75ff39aa2 100644 --- a/tests/components/group/test_init.py +++ b/tests/components/group/test_init.py @@ -295,7 +295,7 @@ class TestComponentsGroup(unittest.TestCase): group_state = self.hass.states.get(f"{group.DOMAIN}.second_group") assert STATE_ON == group_state.state - assert set((test_group.entity_id, "light.bowl")) == set( + assert {test_group.entity_id, "light.bowl"} == set( group_state.attributes["entity_id"] ) assert group_state.attributes.get(group.ATTR_AUTO) is None @@ -304,7 +304,7 @@ class TestComponentsGroup(unittest.TestCase): group_state = self.hass.states.get(f"{group.DOMAIN}.test_group") assert STATE_UNKNOWN == group_state.state - assert set(("sensor.happy", "hello.world")) == set( + assert {"sensor.happy", "hello.world"} == set( group_state.attributes["entity_id"] ) assert group_state.attributes.get(group.ATTR_AUTO) is None diff --git a/tests/components/hue/test_bridge.py b/tests/components/hue/test_bridge.py index 6ac68d222ebb..c122caf3760a 100644 --- a/tests/components/hue/test_bridge.py +++ b/tests/components/hue/test_bridge.py @@ -23,8 +23,8 @@ async def test_bridge_setup(hass): assert hue_bridge.api is api assert len(mock_forward.mock_calls) == 3 - forward_entries = set(c[1][1] for c in mock_forward.mock_calls) - assert forward_entries == set(["light", "binary_sensor", "sensor"]) + forward_entries = {c[1][1] for c in mock_forward.mock_calls} + assert forward_entries == {"light", "binary_sensor", "sensor"} async def test_bridge_setup_invalid_username(hass): diff --git a/tests/components/mqtt/test_device_tracker.py b/tests/components/mqtt/test_device_tracker.py index aa6d3efc8288..ababe8395f34 100644 --- a/tests/components/mqtt/test_device_tracker.py +++ b/tests/components/mqtt/test_device_tracker.py @@ -43,7 +43,7 @@ async def test_new_message(hass, mock_device_tracker_conf): topic = "/location/paulus" location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "mqtt", "devices": {dev_id: topic}}} ) @@ -60,7 +60,7 @@ async def test_single_level_wildcard_topic(hass, mock_device_tracker_conf): topic = "/location/room/paulus" location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -79,7 +79,7 @@ async def test_multi_level_wildcard_topic(hass, mock_device_tracker_conf): topic = "/location/room/paulus" location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -98,7 +98,7 @@ async def test_single_level_wildcard_topic_not_matching(hass, mock_device_tracke topic = "/location/paulus" location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -117,7 +117,7 @@ async def test_multi_level_wildcard_topic_not_matching(hass, mock_device_tracker topic = "/somewhere/room/paulus" location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -138,7 +138,7 @@ async def test_matching_custom_payload_for_home_and_not_home( payload_home = "present" payload_not_home = "not present" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -171,7 +171,7 @@ async def test_not_matching_custom_payload_for_home_and_not_home( payload_not_home = "not present" payload_not_matching = "test" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, @@ -198,7 +198,7 @@ async def test_matching_source_type(hass, mock_device_tracker_conf): source_type = SOURCE_TYPE_BLUETOOTH location = "work" - hass.config.components = set(["mqtt", "zone"]) + hass.config.components = {"mqtt", "zone"} assert await async_setup_component( hass, DOMAIN, diff --git a/tests/components/zha/test_discover.py b/tests/components/zha/test_discover.py index e58fd740655c..5996ca467f70 100644 --- a/tests/components/zha/test_discover.py +++ b/tests/components/zha/test_discover.py @@ -115,13 +115,9 @@ async def test_devices( } entity_map = device["entity_map"] - assert zha_entity_ids == set( - [ - e["entity_id"] - for e in entity_map.values() - if not e.get("default_match", False) - ] - ) + assert zha_entity_ids == { + e["entity_id"] for e in entity_map.values() if not e.get("default_match", False) + } assert event_channels == set(device["event_channels"]) for call in _dispatch.call_args_list: @@ -133,7 +129,7 @@ async def test_devices( assert entity_id is not None no_tail_id = NO_TAIL_ID.sub("", entity_map[key]["entity_id"]) assert entity_id.startswith(no_tail_id) - assert set([ch.name for ch in channels]) == set(entity_map[key]["channels"]) + assert {ch.name for ch in channels} == set(entity_map[key]["channels"]) assert entity_cls.__name__ == entity_map[key]["entity_class"] @@ -281,7 +277,7 @@ async def test_discover_endpoint(device_info, channels_mock, hass): map_id = (comp, unique_id) assert map_id in device_info["entity_map"] entity_info = device_info["entity_map"][map_id] - assert set([ch.name for ch in channels]) == set(entity_info["channels"]) + assert {ch.name for ch in channels} == set(entity_info["channels"]) assert ent_cls.__name__ == entity_info["entity_class"] diff --git a/tests/components/zha/test_registries.py b/tests/components/zha/test_registries.py index 2612019f6fe4..b0f1a44a3d64 100644 --- a/tests/components/zha/test_registries.py +++ b/tests/components/zha/test_registries.py @@ -221,7 +221,7 @@ def test_match_rule_claim_channels_color(channel): rule = registries.MatchRule(channel_names="on_off", aux_channels={"color", "level"}) claimed = rule.claim_channels([ch_color, ch_level, ch_onoff]) - assert {"color", "level", "on_off"} == set([ch.name for ch in claimed]) + assert {"color", "level", "on_off"} == {ch.name for ch in claimed} @pytest.mark.parametrize( @@ -253,7 +253,7 @@ def test_match_rule_claim_channels(rule, match, channel, channels): channels.append(ch_power) claimed = rule.claim_channels(channels) - assert match == set([ch.name for ch in claimed]) + assert match == {ch.name for ch in claimed} @pytest.fixture diff --git a/tests/helpers/test_init.py b/tests/helpers/test_init.py index f27635d12086..5da6b21a3ff1 100644 --- a/tests/helpers/test_init.py +++ b/tests/helpers/test_init.py @@ -15,7 +15,7 @@ def test_extract_domain_configs(): "zone 100": None, } - assert set(["zone", "zone Hallo", "zone 100"]) == set( + assert {"zone", "zone Hallo", "zone 100"} == set( helpers.extract_domain_configs(config, "zone") ) diff --git a/tests/test_core.py b/tests/test_core.py index deeb808396a8..a28c8571f318 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -920,7 +920,7 @@ class TestConfig(unittest.TestCase): with TemporaryDirectory() as tmp_dir: # The created dir is in /tmp. This is a symlink on OS X # causing this test to fail unless we resolve path first. - self.config.whitelist_external_dirs = set((os.path.realpath(tmp_dir),)) + self.config.whitelist_external_dirs = {os.path.realpath(tmp_dir)} test_file = os.path.join(tmp_dir, "test.jpg") with open(test_file, "w") as tmp_file: @@ -930,7 +930,7 @@ class TestConfig(unittest.TestCase): for path in valid: assert self.config.is_allowed_path(path) - self.config.whitelist_external_dirs = set(("/home", "/var")) + self.config.whitelist_external_dirs = {"/home", "/var"} unvalid = [ "/hass/config/secure", From 262b01d6323cfa6deb2b8af44a1603b97ffadd7d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 02:21:07 +0200 Subject: [PATCH 119/653] Removal of old style class definitions in tests (#33671) --- tests/components/google_pubsub/test_pubsub.py | 2 +- tests/components/mqtt/test_light_json.py | 2 +- tests/components/roku/__init__.py | 2 +- tests/components/vizio/const.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/components/google_pubsub/test_pubsub.py b/tests/components/google_pubsub/test_pubsub.py index 8f732b8e3df0..77ca4ed8bd72 100644 --- a/tests/components/google_pubsub/test_pubsub.py +++ b/tests/components/google_pubsub/test_pubsub.py @@ -4,7 +4,7 @@ from datetime import datetime from homeassistant.components.google_pubsub import DateTimeJSONEncoder as victim -class TestDateTimeJSONEncoder(object): +class TestDateTimeJSONEncoder: """Bundle for DateTimeJSONEncoder tests.""" def test_datetime(self): diff --git a/tests/components/mqtt/test_light_json.py b/tests/components/mqtt/test_light_json.py index 1223f3525c4e..824085ea833c 100644 --- a/tests/components/mqtt/test_light_json.py +++ b/tests/components/mqtt/test_light_json.py @@ -136,7 +136,7 @@ DEFAULT_CONFIG = { } -class JsonValidator(object): +class JsonValidator: """Helper to compare JSON.""" def __init__(self, jsondata): diff --git a/tests/components/roku/__init__.py b/tests/components/roku/__init__.py index b46e57a38bdd..4cb7c851bd95 100644 --- a/tests/components/roku/__init__.py +++ b/tests/components/roku/__init__.py @@ -12,7 +12,7 @@ UPNP_FRIENDLY_NAME = "My Roku 3" UPNP_SERIAL = "1GU48T017973" -class MockDeviceInfo(object): +class MockDeviceInfo: """Mock DeviceInfo for Roku.""" model_name = NAME diff --git a/tests/components/vizio/const.py b/tests/components/vizio/const.py index 034fa23a3af2..e3d09977c1f0 100644 --- a/tests/components/vizio/const.py +++ b/tests/components/vizio/const.py @@ -47,7 +47,7 @@ RESPONSE_TOKEN = 1234 PIN = "abcd" -class MockStartPairingResponse(object): +class MockStartPairingResponse: """Mock Vizio start pairing response.""" def __init__(self, ch_type: int, token: int) -> None: @@ -56,7 +56,7 @@ class MockStartPairingResponse(object): self.token = token -class MockCompletePairingResponse(object): +class MockCompletePairingResponse: """Mock Vizio complete pairing response.""" def __init__(self, auth_token: str) -> None: From 59f1a1be935d323d67aa3a5fd3ec9ec5a341bfc1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 02:21:47 +0200 Subject: [PATCH 120/653] Replace OSError aliases with OSError in UVC test (#33673) --- tests/components/uvc/test_camera.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/uvc/test_camera.py b/tests/components/uvc/test_camera.py index b95d940bda47..2ca7fdf46e3b 100644 --- a/tests/components/uvc/test_camera.py +++ b/tests/components/uvc/test_camera.py @@ -258,7 +258,7 @@ class TestUVC(unittest.TestCase): """Mock login.""" try: responses.pop(0) - raise socket.error + raise OSError except IndexError: pass From b00b8ea0c11ab74667f64729240fb8c5e1c004f8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 02:39:44 +0200 Subject: [PATCH 121/653] Use byte literals instead of encode in tests (#33672) --- tests/components/graphite/test_init.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/graphite/test_init.py b/tests/components/graphite/test_init.py index dd60f03cd589..696d642cf86f 100644 --- a/tests/components/graphite/test_init.py +++ b/tests/components/graphite/test_init.py @@ -172,9 +172,9 @@ class TestGraphite(unittest.TestCase): assert sock.connect.call_count == 1 assert sock.connect.call_args == mock.call(("foo", 123)) assert sock.sendall.call_count == 1 - assert sock.sendall.call_args == mock.call("foo".encode("ascii")) + assert sock.sendall.call_args == mock.call(b"foo") assert sock.send.call_count == 1 - assert sock.send.call_args == mock.call("\n".encode("ascii")) + assert sock.send.call_args == mock.call(b"\n") assert sock.close.call_count == 1 assert sock.close.call_args == mock.call() From 61b4d1e8de6e2db03d3f546c2666bfb3d08466e9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 02:58:10 +0200 Subject: [PATCH 122/653] Small code style improvements to Insteon integration (#33662) * Small code style improvements to Insteon integration * Update homeassistant/components/insteon/utils.py Co-Authored-By: Martin Hjelmare Co-authored-by: Martin Hjelmare --- homeassistant/components/insteon/binary_sensor.py | 2 +- homeassistant/components/insteon/insteon_entity.py | 9 +++------ homeassistant/components/insteon/ipdb.py | 3 +-- homeassistant/components/insteon/schemas.py | 5 +---- homeassistant/components/insteon/switch.py | 4 +--- homeassistant/components/insteon/utils.py | 7 ++----- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/insteon/binary_sensor.py b/homeassistant/components/insteon/binary_sensor.py index 395c0a3ac20f..b96feb218315 100644 --- a/homeassistant/components/insteon/binary_sensor.py +++ b/homeassistant/components/insteon/binary_sensor.py @@ -30,7 +30,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= _LOGGER.debug( "Adding device %s entity %s to Binary Sensor platform", device.address.hex, - device.states[state_key].name, + name, ) new_entity = InsteonBinarySensor(device, state_key) diff --git a/homeassistant/components/insteon/insteon_entity.py b/homeassistant/components/insteon/insteon_entity.py index 19f3344fb81e..b453cad2e07b 100644 --- a/homeassistant/components/insteon/insteon_entity.py +++ b/homeassistant/components/insteon/insteon_entity.py @@ -55,21 +55,18 @@ class InsteonEntity(Entity): """Return the name of the node (used for Entity_ID).""" # Set a base description description = self._insteon_device.description - if self._insteon_device.description is None: + if description is None: description = "Unknown Device" - # Get an extension label if there is one extension = self._get_label() if extension: extension = f" {extension}" - name = f"{description} {self._insteon_device.address.human}{extension}" - return name + return f"{description} {self._insteon_device.address.human}{extension}" @property def device_state_attributes(self): """Provide attributes for display on device card.""" - attributes = {"insteon_address": self.address, "insteon_group": self.group} - return attributes + return {"insteon_address": self.address, "insteon_group": self.group} @callback def async_entity_update(self, deviceid, group, val): diff --git a/homeassistant/components/insteon/ipdb.py b/homeassistant/components/insteon/ipdb.py index 1618518a0eb4..6aba40d6df93 100644 --- a/homeassistant/components/insteon/ipdb.py +++ b/homeassistant/components/insteon/ipdb.py @@ -71,8 +71,7 @@ class IPDB: def __iter__(self): """Itterate through the INSTEON state types to HA platforms.""" - for product in self.states: - yield product + yield from self.states def __getitem__(self, key): """Return a Home Assistant platform from an INSTEON state type.""" diff --git a/homeassistant/components/insteon/schemas.py b/homeassistant/components/insteon/schemas.py index 20399195365b..e3f2644ac560 100644 --- a/homeassistant/components/insteon/schemas.py +++ b/homeassistant/components/insteon/schemas.py @@ -52,10 +52,7 @@ def set_default_port(schema: Dict) -> Dict: if not ip_port: hub_version = schema.get(CONF_HUB_VERSION) # Found hub_version but not ip_port - if hub_version == 1: - schema[CONF_IP_PORT] = 9761 - else: - schema[CONF_IP_PORT] = 25105 + schema[CONF_IP_PORT] = 9761 if hub_version == 1 else 25105 return schema diff --git a/homeassistant/components/insteon/switch.py b/homeassistant/components/insteon/switch.py index eec7874c7fbb..c88d31d2f91f 100644 --- a/homeassistant/components/insteon/switch.py +++ b/homeassistant/components/insteon/switch.py @@ -19,9 +19,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= state_name = device.states[state_key].name _LOGGER.debug( - "Adding device %s entity %s to Switch platform", - device.address.hex, - device.states[state_key].name, + "Adding device %s entity %s to Switch platform", device.address.hex, state_name, ) new_entity = None diff --git a/homeassistant/components/insteon/utils.py b/homeassistant/components/insteon/utils.py index 339189d3564a..267689362911 100644 --- a/homeassistant/components/insteon/utils.py +++ b/homeassistant/components/insteon/utils.py @@ -58,12 +58,9 @@ def register_new_device_callback(hass, config, insteon_modem): "" if state_name == BUTTON_PRESSED_STATE_NAME else state_name[-1].lower() ) schema = {CONF_ADDRESS: address.hex} - if button != "": + if button: schema[EVENT_CONF_BUTTON] = button - if val: - event = EVENT_BUTTON_ON - else: - event = EVENT_BUTTON_OFF + event = EVENT_BUTTON_ON if val else EVENT_BUTTON_OFF _LOGGER.debug( "Firing event %s with address %s and button %s", event, address.hex, button ) From 528c7f4871d5d6367004e7af03860eef763cc84f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 03:50:30 +0200 Subject: [PATCH 123/653] Removal of extraneous parenthesis in tests (#33670) * Removal of extraneous parenthesis * Process review suggestions * Apply suggestions from code review Co-authored-by: Martin Hjelmare --- tests/components/filesize/test_sensor.py | 2 +- tests/components/folder/test_sensor.py | 2 +- tests/components/folder_watcher/test_init.py | 2 +- .../homekit_controller/test_config_flow.py | 8 +++----- .../homematicip_cloud/test_config_flow.py | 8 +++----- tests/components/hue/test_config_flow.py | 16 ++++++---------- tests/helpers/test_state.py | 4 ++-- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/tests/components/filesize/test_sensor.py b/tests/components/filesize/test_sensor.py index 29bd6a7fb1f0..b2552f58c6a0 100644 --- a/tests/components/filesize/test_sensor.py +++ b/tests/components/filesize/test_sensor.py @@ -23,7 +23,7 @@ class TestFileSensor(unittest.TestCase): def setup_method(self, method): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() - self.hass.config.whitelist_external_dirs = set((TEST_DIR)) + self.hass.config.whitelist_external_dirs = {TEST_DIR} def teardown_method(self, method): """Stop everything that was started.""" diff --git a/tests/components/folder/test_sensor.py b/tests/components/folder/test_sensor.py index fc7de1f59c08..1c465c6a8648 100644 --- a/tests/components/folder/test_sensor.py +++ b/tests/components/folder/test_sensor.py @@ -28,7 +28,7 @@ class TestFolderSensor(unittest.TestCase): self.hass = get_test_home_assistant() if not os.path.isdir(TEST_DIR): os.mkdir(TEST_DIR) - self.hass.config.whitelist_external_dirs = set((TEST_DIR)) + self.hass.config.whitelist_external_dirs = {TEST_DIR} def teardown_method(self, method): """Stop everything that was started.""" diff --git a/tests/components/folder_watcher/test_init.py b/tests/components/folder_watcher/test_init.py index db8bad3ba095..0702e64b4f8c 100644 --- a/tests/components/folder_watcher/test_init.py +++ b/tests/components/folder_watcher/test_init.py @@ -20,7 +20,7 @@ async def test_invalid_path_setup(hass): async def test_valid_path_setup(hass): """Test that a valid path is setup.""" cwd = os.path.join(os.path.dirname(__file__)) - hass.config.whitelist_external_dirs = set((cwd)) + hass.config.whitelist_external_dirs = {cwd} with patch.object(folder_watcher, "Watcher"): assert await async_setup_component( hass, diff --git a/tests/components/homekit_controller/test_config_flow.py b/tests/components/homekit_controller/test_config_flow.py index 760c5f30436b..19113eddf893 100644 --- a/tests/components/homekit_controller/test_config_flow.py +++ b/tests/components/homekit_controller/test_config_flow.py @@ -100,11 +100,9 @@ def test_valid_pairing_codes(pairing_code): def get_flow_context(hass, result): """Get the flow context from the result of async_init or async_configure.""" flow = next( - ( - flow - for flow in hass.config_entries.flow.async_progress() - if flow["flow_id"] == result["flow_id"] - ) + flow + for flow in hass.config_entries.flow.async_progress() + if flow["flow_id"] == result["flow_id"] ) return flow["context"] diff --git a/tests/components/homematicip_cloud/test_config_flow.py b/tests/components/homematicip_cloud/test_config_flow.py index ec13fc795366..e6e145fefbac 100644 --- a/tests/components/homematicip_cloud/test_config_flow.py +++ b/tests/components/homematicip_cloud/test_config_flow.py @@ -35,11 +35,9 @@ async def test_flow_works(hass, simple_mock_home): assert result["errors"] == {"base": "press_the_button"} flow = next( - ( - flow - for flow in hass.config_entries.flow.async_progress() - if flow["flow_id"] == result["flow_id"] - ) + flow + for flow in hass.config_entries.flow.async_progress() + if flow["flow_id"] == result["flow_id"] ) assert flow["context"]["unique_id"] == "ABC123" diff --git a/tests/components/hue/test_config_flow.py b/tests/components/hue/test_config_flow.py index 1ca2eca664ee..87d4dc2b8879 100644 --- a/tests/components/hue/test_config_flow.py +++ b/tests/components/hue/test_config_flow.py @@ -62,11 +62,9 @@ async def test_flow_works(hass): assert result["step_id"] == "link" flow = next( - ( - flow - for flow in hass.config_entries.flow.async_progress() - if flow["flow_id"] == result["flow_id"] - ) + flow + for flow in hass.config_entries.flow.async_progress() + if flow["flow_id"] == result["flow_id"] ) assert flow["context"]["unique_id"] == "aabbccddeeff" @@ -168,11 +166,9 @@ async def test_flow_two_bridges_discovered_one_new(hass, aioclient_mock): assert result["type"] == "form" assert result["step_id"] == "link" flow = next( - ( - flow - for flow in hass.config_entries.flow.async_progress() - if flow["flow_id"] == result["flow_id"] - ) + flow + for flow in hass.config_entries.flow.async_progress() + if flow["flow_id"] == result["flow_id"] ) assert flow["context"]["unique_id"] == "beer" diff --git a/tests/helpers/test_state.py b/tests/helpers/test_state.py index 567bac65f5ba..c2b89406f24e 100644 --- a/tests/helpers/test_state.py +++ b/tests/helpers/test_state.py @@ -54,13 +54,13 @@ def test_async_track_states(hass): def test_call_to_component(hass): """Test calls to components state reproduction functions.""" with patch( - ("homeassistant.components.media_player.reproduce_state.async_reproduce_states") + "homeassistant.components.media_player.reproduce_state.async_reproduce_states" ) as media_player_fun: media_player_fun.return_value = asyncio.Future() media_player_fun.return_value.set_result(None) with patch( - ("homeassistant.components.climate.reproduce_state.async_reproduce_states") + "homeassistant.components.climate.reproduce_state.async_reproduce_states" ) as climate_fun: climate_fun.return_value = asyncio.Future() climate_fun.return_value.set_result(None) From 927c2314c4e7cac55f9ac0cf92a109c5147ea9fe Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sat, 4 Apr 2020 21:42:51 -0500 Subject: [PATCH 124/653] use async_on_remove for IPP Update Coordinator (#33596) --- homeassistant/components/ipp/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/ipp/__init__.py b/homeassistant/components/ipp/__init__.py index 447665a36764..81d77b27a3ec 100644 --- a/homeassistant/components/ipp/__init__.py +++ b/homeassistant/components/ipp/__init__.py @@ -168,11 +168,9 @@ class IPPEntity(Entity): async def async_added_to_hass(self) -> None: """Connect to dispatcher listening for entity data notifications.""" - self.coordinator.async_add_listener(self.async_write_ha_state) - - async def async_will_remove_from_hass(self) -> None: - """Disconnect from update signal.""" - self.coordinator.async_remove_listener(self.async_write_ha_state) + self.async_on_remove( + self.coordinator.async_add_listener(self.async_write_ha_state) + ) async def async_update(self) -> None: """Update an IPP entity.""" From 8d3a415d072a7edcab155b561c9e6a448953881b Mon Sep 17 00:00:00 2001 From: Michal Ziemski Date: Sun, 5 Apr 2020 05:04:41 +0200 Subject: [PATCH 125/653] Add OpenERZ API integration (#30441) * Adding OpenERZ integration * Added unit tests * Linter fixes, better friendly_name handling * Increase coverage * Review fixes * fixup! Review fixes * Refactor to use external openerz-api library * fixup! Refactor to use external openerz-api library * fixup! Refactor to use external openerz-api library * fixup! Refactor to use external openerz-api library * fixup! Refactor to use external openerz-api library --- CODEOWNERS | 1 + homeassistant/components/openerz/__init__.py | 3 + .../components/openerz/manifest.json | 12 ++++ homeassistant/components/openerz/sensor.py | 58 +++++++++++++++++++ requirements_all.txt | 3 + requirements_test_all.txt | 3 + tests/components/openerz/__init__.py | 1 + tests/components/openerz/test_sensor.py | 34 +++++++++++ 8 files changed, 115 insertions(+) create mode 100644 homeassistant/components/openerz/__init__.py create mode 100644 homeassistant/components/openerz/manifest.json create mode 100644 homeassistant/components/openerz/sensor.py create mode 100644 tests/components/openerz/__init__.py create mode 100644 tests/components/openerz/test_sensor.py diff --git a/CODEOWNERS b/CODEOWNERS index 5cbf0d411a0f..0ece14799a31 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -269,6 +269,7 @@ homeassistant/components/ohmconnect/* @robbiet480 homeassistant/components/ombi/* @larssont homeassistant/components/onboarding/* @home-assistant/core homeassistant/components/onewire/* @garbled1 +homeassistant/components/openerz/* @misialq homeassistant/components/opentherm_gw/* @mvn23 homeassistant/components/openuv/* @bachya homeassistant/components/openweathermap/* @fabaff diff --git a/homeassistant/components/openerz/__init__.py b/homeassistant/components/openerz/__init__.py new file mode 100644 index 000000000000..57ed4d1d8a7a --- /dev/null +++ b/homeassistant/components/openerz/__init__.py @@ -0,0 +1,3 @@ +"""The Open ERZ API integration.""" + +DOMAIN = "sensor" diff --git a/homeassistant/components/openerz/manifest.json b/homeassistant/components/openerz/manifest.json new file mode 100644 index 000000000000..19bb17ea3909 --- /dev/null +++ b/homeassistant/components/openerz/manifest.json @@ -0,0 +1,12 @@ +{ + "domain": "openerz", + "name": "Open ERZ", + "documentation": "https://www.home-assistant.io/integrations/openerz", + "dependencies": [], + "codeowners": [ + "@misialq" + ], + "requirements": [ + "openerz-api==0.1.0" + ] +} \ No newline at end of file diff --git a/homeassistant/components/openerz/sensor.py b/homeassistant/components/openerz/sensor.py new file mode 100644 index 000000000000..6e72058b60b6 --- /dev/null +++ b/homeassistant/components/openerz/sensor.py @@ -0,0 +1,58 @@ +"""Support for OpenERZ API for Zurich city waste disposal system.""" +from datetime import timedelta +import logging + +from openerz_api.main import OpenERZConnector +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.config_validation import PLATFORM_SCHEMA +from homeassistant.helpers.entity import Entity + +_LOGGER = logging.getLogger(__name__) +SCAN_INTERVAL = timedelta(hours=12) + +CONF_ZIP = "zip" +CONF_WASTE_TYPE = "waste_type" +CONF_NAME = "name" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_ZIP): cv.positive_int, + vol.Required(CONF_WASTE_TYPE, default="waste"): cv.string, + vol.Optional(CONF_NAME): cv.string, + } +) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up the sensor platform.""" + api_connector = OpenERZConnector(config[CONF_ZIP], config[CONF_WASTE_TYPE]) + add_entities([OpenERZSensor(api_connector, config.get(CONF_NAME))], True) + + +class OpenERZSensor(Entity): + """Representation of a Sensor.""" + + def __init__(self, api_connector, name): + """Initialize the sensor.""" + self._state = None + self._name = name + self.api_connector = api_connector + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + def update(self): + """Fetch new state data for the sensor. + + This is the only method that should fetch new data for Home Assistant. + """ + self._state = self.api_connector.find_next_pickup(day_offset=31) diff --git a/requirements_all.txt b/requirements_all.txt index 8bdf43782055..48322760753a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -965,6 +965,9 @@ onvif-zeep-async==0.2.0 # homeassistant.components.opencv # opencv-python-headless==4.2.0.32 +# homeassistant.components.openerz +openerz-api==0.1.0 + # homeassistant.components.openevse openevsewifi==0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 121dd891acb6..5db1635e39a7 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -373,6 +373,9 @@ numpy==1.18.1 # homeassistant.components.google oauth2client==4.0.0 +# homeassistant.components.openerz +openerz-api==0.1.0 + # homeassistant.components.mqtt # homeassistant.components.shiftr paho-mqtt==1.5.0 diff --git a/tests/components/openerz/__init__.py b/tests/components/openerz/__init__.py new file mode 100644 index 000000000000..9de62e5f727c --- /dev/null +++ b/tests/components/openerz/__init__.py @@ -0,0 +1 @@ +"""Tests for OpenERZ component.""" diff --git a/tests/components/openerz/test_sensor.py b/tests/components/openerz/test_sensor.py new file mode 100644 index 000000000000..24a0f0610af5 --- /dev/null +++ b/tests/components/openerz/test_sensor.py @@ -0,0 +1,34 @@ +"""Tests for OpenERZ component.""" +from unittest.mock import MagicMock, patch + +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN +from homeassistant.setup import async_setup_component + +MOCK_CONFIG = { + "sensor": { + "platform": "openerz", + "name": "test_name", + "zip": 1234, + "waste_type": "glass", + } +} + + +async def test_sensor_state(hass): + """Test whether default waste type set properly.""" + with patch( + "homeassistant.components.openerz.sensor.OpenERZConnector" + ) as patched_connector: + pickup_instance = MagicMock() + pickup_instance.find_next_pickup.return_value = "2020-12-12" + patched_connector.return_value = pickup_instance + + await async_setup_component(hass, SENSOR_DOMAIN, MOCK_CONFIG) + await hass.async_block_till_done() + + entity_id = "sensor.test_name" + test_openerz_state = hass.states.get(entity_id) + + assert test_openerz_state.state == "2020-12-12" + assert test_openerz_state.name == "test_name" + pickup_instance.find_next_pickup.assert_called_once() From d3a42703121070c6c9c7c7f3daafb34d539cf2f0 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Sun, 5 Apr 2020 01:21:20 -0500 Subject: [PATCH 126/653] Plex logging additions & cleanup (#33681) --- homeassistant/components/plex/server.py | 16 ++++++++----- tests/components/plex/test_init.py | 31 +++++++++++-------------- tests/components/plex/test_server.py | 2 +- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index f2a4908e1196..80e7c92640a7 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -159,6 +159,7 @@ class PlexServer: for account in self._plex_server.systemAccounts() if account.name ] + _LOGGER.debug("Linked accounts: %s", self.accounts) owner_account = [ account.name @@ -167,6 +168,7 @@ class PlexServer: ] if owner_account: self._owner_username = owner_account[0] + _LOGGER.debug("Server owner found: '%s'", self._owner_username) self._version = self._plex_server.version @@ -209,11 +211,11 @@ class PlexServer: try: devices = self._plex_server.clients() sessions = self._plex_server.sessions() - except plexapi.exceptions.BadRequest: - _LOGGER.exception("Error requesting Plex client data from server") - return - except requests.exceptions.RequestException as ex: - _LOGGER.warning( + except ( + plexapi.exceptions.BadRequest, + requests.exceptions.RequestException, + ) as ex: + _LOGGER.error( "Could not connect to Plex server: %s (%s)", self.friendly_name, ex ) return @@ -234,7 +236,9 @@ class PlexServer: for player in session.players: if session_username and session_username not in monitored_users: ignored_clients.add(player.machineIdentifier) - _LOGGER.debug("Ignoring Plex client owned by %s", session_username) + _LOGGER.debug( + "Ignoring Plex client owned by '%s'", session_username + ) continue self._known_idle.discard(player.machineIdentifier) available_clients.setdefault( diff --git a/tests/components/plex/test_init.py b/tests/components/plex/test_init.py index 1aef7878df5e..cd1ea8725bd4 100644 --- a/tests/components/plex/test_init.py +++ b/tests/components/plex/test_init.py @@ -116,24 +116,21 @@ async def test_setup_with_config_entry(hass, caplog): await trigger_plex_update(hass, server_id) - with patch.object( - mock_plex_server, "clients", side_effect=plexapi.exceptions.BadRequest - ) as patched_clients_bad_request: - await trigger_plex_update(hass, server_id) + for test_exception in ( + plexapi.exceptions.BadRequest, + requests.exceptions.RequestException, + ): + with patch.object( + mock_plex_server, "clients", side_effect=test_exception + ) as patched_clients_bad_request: + await trigger_plex_update(hass, server_id) - assert patched_clients_bad_request.called - assert "Error requesting Plex client data from server" in caplog.text - - with patch.object( - mock_plex_server, "clients", side_effect=requests.exceptions.RequestException - ) as patched_clients_requests_exception: - await trigger_plex_update(hass, server_id) - - assert patched_clients_requests_exception.called - assert ( - f"Could not connect to Plex server: {mock_plex_server.friendlyName}" - in caplog.text - ) + assert patched_clients_bad_request.called + assert ( + f"Could not connect to Plex server: {mock_plex_server.friendlyName}" + in caplog.text + ) + caplog.clear() async def test_set_config_entry_unique_id(hass): diff --git a/tests/components/plex/test_server.py b/tests/components/plex/test_server.py index 242c0fe55046..3b70f30189af 100644 --- a/tests/components/plex/test_server.py +++ b/tests/components/plex/test_server.py @@ -94,7 +94,7 @@ async def test_new_ignored_users_available(hass, caplog): assert len(monitored_users) == 1 assert len(ignored_users) == 2 for ignored_user in ignored_users: - assert f"Ignoring Plex client owned by {ignored_user}" in caplog.text + assert f"Ignoring Plex client owned by '{ignored_user}'" in caplog.text sensor = hass.states.get("sensor.plex_plex_server_1") assert sensor.state == str(len(mock_plex_server.accounts)) From 000ad256fb9b13cde52e2e246458b79e780af297 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 01:21:44 -0500 Subject: [PATCH 127/653] Handle float values for homekit lightning (#33683) * Handle float values for homekit lightning * Empty commit to rerun CI --- .../components/homekit/type_lights.py | 28 ++++++++----------- tests/components/homekit/test_type_lights.py | 20 +++++++++++++ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/homekit/type_lights.py b/homeassistant/components/homekit/type_lights.py index 1720c2c58c8e..e38af1a04eb8 100644 --- a/homeassistant/components/homekit/type_lights.py +++ b/homeassistant/components/homekit/type_lights.py @@ -149,7 +149,7 @@ class Light(HomeAccessory): # Handle Brightness if CHAR_BRIGHTNESS in self.chars: brightness = new_state.attributes.get(ATTR_BRIGHTNESS) - if isinstance(brightness, int): + if isinstance(brightness, (int, float)): brightness = round(brightness / 255 * 100, 0) # The homeassistant component might report its brightness as 0 but is # not off. But 0 is a special value in homekit. When you turn on a @@ -169,22 +169,18 @@ class Light(HomeAccessory): # Handle color temperature if CHAR_COLOR_TEMPERATURE in self.chars: color_temperature = new_state.attributes.get(ATTR_COLOR_TEMP) - if ( - isinstance(color_temperature, int) - and self.char_color_temperature.value != color_temperature - ): - self.char_color_temperature.set_value(color_temperature) + if isinstance(color_temperature, (int, float)): + color_temperature = round(color_temperature, 0) + if self.char_color_temperature.value != color_temperature: + self.char_color_temperature.set_value(color_temperature) # Handle Color if CHAR_SATURATION in self.chars and CHAR_HUE in self.chars: hue, saturation = new_state.attributes.get(ATTR_HS_COLOR, (None, None)) - if ( - isinstance(hue, (int, float)) - and isinstance(saturation, (int, float)) - and ( - hue != self.char_hue.value - or saturation != self.char_saturation.value - ) - ): - self.char_hue.set_value(hue) - self.char_saturation.set_value(saturation) + if isinstance(hue, (int, float)) and isinstance(saturation, (int, float)): + hue = round(hue, 0) + saturation = round(saturation, 0) + if hue != self.char_hue.value: + self.char_hue.set_value(hue) + if saturation != self.char_saturation.value: + self.char_saturation.set_value(saturation) diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index 888ad87a848a..3ee2e61cc722 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -235,6 +235,17 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): await hass.async_block_till_done() assert acc.char_brightness.value == 1 + # Ensure floats are handled + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 55.66}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 22 + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 108.4}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 43 + hass.states.async_set(entity_id, STATE_ON, {ATTR_BRIGHTNESS: 0.0}) + await hass.async_block_till_done() + assert acc.char_brightness.value == 1 + async def test_light_color_temperature(hass, hk_driver, cls, events, driver): """Test light with color temperature.""" @@ -417,6 +428,11 @@ async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driv await hass.async_block_till_done() assert acc.char_brightness.value == 40 + hass.states.async_set(entity_id, STATE_ON, {ATTR_HS_COLOR: (4.5, 9.2)}) + await hass.async_block_till_done() + assert acc.char_hue.value == 4 + assert acc.char_saturation.value == 9 + # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") @@ -489,6 +505,10 @@ async def test_light_set_brightness_and_color_temp( await hass.async_block_till_done() assert acc.char_brightness.value == 40 + hass.states.async_set(entity_id, STATE_ON, {ATTR_COLOR_TEMP: (224.14)}) + await hass.async_block_till_done() + assert acc.char_color_temperature.value == 224 + # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") From 7653dc947ad7453329d73a07cb552c4e552dc048 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 10:33:07 +0200 Subject: [PATCH 128/653] Enable pylint unnecessary-pass (#33650) * Enable pylint unnecessary-pass * Process review suggestions * Fix smhi tests --- homeassistant/auth/providers/__init__.py | 1 - .../components/adguard/config_flow.py | 4 -- homeassistant/components/alexa/entities.py | 1 - homeassistant/components/auth/indieauth.py | 5 --- homeassistant/components/cast/helpers.py | 3 -- homeassistant/components/citybikes/sensor.py | 2 - homeassistant/components/cover/__init__.py | 10 ----- homeassistant/components/daikin/climate.py | 1 - homeassistant/components/daikin/sensor.py | 1 - homeassistant/components/daikin/switch.py | 1 - homeassistant/components/fan/__init__.py | 1 - homeassistant/components/fibaro/__init__.py | 4 -- homeassistant/components/fronius/sensor.py | 1 - homeassistant/components/frontend/__init__.py | 2 - .../components/homekit/accessories.py | 1 - .../components/huawei_lte/__init__.py | 1 - homeassistant/components/hue/light.py | 1 - .../components/icloud/device_tracker.py | 1 - homeassistant/components/incomfort/climate.py | 1 - .../components/isy994/binary_sensor.py | 1 - homeassistant/components/mailbox/__init__.py | 2 - .../components/media_extractor/__init__.py | 4 -- homeassistant/components/mqtt/discovery.py | 2 - .../components/openuv/config_flow.py | 4 -- homeassistant/components/plex/media_player.py | 8 ---- homeassistant/components/plex/sensor.py | 8 ---- homeassistant/components/point/__init__.py | 1 - .../components/python_script/__init__.py | 3 -- homeassistant/components/rflink/light.py | 2 - homeassistant/components/rflink/switch.py | 2 - homeassistant/components/roku/media_player.py | 1 - homeassistant/components/roku/remote.py | 1 - .../components/samsungtv/media_player.py | 7 ---- .../components/simplisafe/__init__.py | 2 - homeassistant/components/smhi/weather.py | 9 ----- homeassistant/components/soma/cover.py | 9 ----- homeassistant/components/starline/account.py | 1 - .../components/tellduslive/binary_sensor.py | 9 ----- homeassistant/components/tellduslive/cover.py | 9 ----- homeassistant/components/tellduslive/light.py | 9 ----- .../components/tellduslive/sensor.py | 9 ----- .../components/tellduslive/switch.py | 9 ----- homeassistant/components/tellstick/cover.py | 3 -- homeassistant/components/tellstick/switch.py | 2 - homeassistant/components/tesla/__init__.py | 2 - .../components/toon/binary_sensor.py | 6 --- homeassistant/components/toon/climate.py | 1 - homeassistant/components/toon/sensor.py | 8 ---- homeassistant/components/vacuum/__init__.py | 5 --- homeassistant/components/velbus/climate.py | 1 - .../components/websocket_api/error.py | 2 - homeassistant/components/withings/common.py | 4 -- homeassistant/components/xs1/climate.py | 1 - homeassistant/components/yessssms/notify.py | 1 - homeassistant/components/zha/binary_sensor.py | 1 - .../components/zha/core/channels/base.py | 5 --- .../components/zha/core/channels/closures.py | 2 - .../components/zha/core/channels/general.py | 30 -------------- .../zha/core/channels/homeautomation.py | 10 ----- .../components/zha/core/channels/hvac.py | 8 ---- .../components/zha/core/channels/lighting.py | 4 -- .../components/zha/core/channels/lightlink.py | 2 - .../components/zha/core/channels/protocol.py | 40 ------------------- .../components/zha/core/channels/security.py | 2 - .../zha/core/channels/smartenergy.py | 22 ---------- homeassistant/components/zha/entity.py | 3 -- homeassistant/components/zha/fan.py | 1 - homeassistant/components/zha/sensor.py | 1 - .../components/zigbee/binary_sensor.py | 2 - homeassistant/components/zigbee/light.py | 2 - homeassistant/components/zigbee/switch.py | 2 - homeassistant/components/zwave/__init__.py | 2 - homeassistant/components/zwave/sensor.py | 2 - homeassistant/config.py | 1 - homeassistant/data_entry_flow.py | 3 -- homeassistant/util/logging.py | 3 -- homeassistant/util/yaml/objects.py | 4 -- pylintrc | 2 - tests/components/smhi/test_weather.py | 5 --- 79 files changed, 349 deletions(-) diff --git a/homeassistant/auth/providers/__init__.py b/homeassistant/auth/providers/__init__.py index bb0fc55b5c4d..1fa70e42b3fe 100644 --- a/homeassistant/auth/providers/__init__.py +++ b/homeassistant/auth/providers/__init__.py @@ -116,7 +116,6 @@ class AuthProvider: async def async_initialize(self) -> None: """Initialize the auth provider.""" - pass async def auth_provider_from_config( diff --git a/homeassistant/components/adguard/config_flow.py b/homeassistant/components/adguard/config_flow.py index 3657d4ee3ad0..e2a226eb4ce6 100644 --- a/homeassistant/components/adguard/config_flow.py +++ b/homeassistant/components/adguard/config_flow.py @@ -30,10 +30,6 @@ class AdGuardHomeFlowHandler(ConfigFlow): _hassio_discovery = None - def __init__(self): - """Initialize AgGuard Home flow.""" - pass - async def _show_setup_form(self, errors=None): """Show the setup form to the user.""" return self.async_show_form( diff --git a/homeassistant/components/alexa/entities.py b/homeassistant/components/alexa/entities.py index e5eca399b9cd..0943d1a4e52d 100644 --- a/homeassistant/components/alexa/entities.py +++ b/homeassistant/components/alexa/entities.py @@ -252,7 +252,6 @@ class AlexaEntity: Raises _UnsupportedInterface. """ - pass def interfaces(self): """Return a list of supported interfaces. diff --git a/homeassistant/components/auth/indieauth.py b/homeassistant/components/auth/indieauth.py index a2d015c279b3..cd8e797876fd 100644 --- a/homeassistant/components/auth/indieauth.py +++ b/homeassistant/components/auth/indieauth.py @@ -90,21 +90,16 @@ async def fetch_redirect_uris(hass, url): except asyncio.TimeoutError: _LOGGER.error("Timeout while looking up redirect_uri %s", url) - pass except aiohttp.client_exceptions.ClientSSLError: _LOGGER.error("SSL error while looking up redirect_uri %s", url) - pass except aiohttp.client_exceptions.ClientOSError as ex: _LOGGER.error("OS error while looking up redirect_uri %s: %s", url, ex.strerror) - pass except aiohttp.client_exceptions.ClientConnectionError: _LOGGER.error( "Low level connection error while looking up redirect_uri %s", url ) - pass except aiohttp.client_exceptions.ClientError: _LOGGER.error("Unknown error while looking up redirect_uri %s", url) - pass # Authorization endpoints verifying that a redirect_uri is allowed for use # by a client MUST look for an exact match of the given redirect_uri in the diff --git a/homeassistant/components/cast/helpers.py b/homeassistant/components/cast/helpers.py index e82f6c9e4ed1..b39f8a6ef25f 100644 --- a/homeassistant/components/cast/helpers.py +++ b/homeassistant/components/cast/helpers.py @@ -173,7 +173,6 @@ class CastStatusListener: @staticmethod def added_to_multizone(group_uuid): """Handle the cast added to a group.""" - pass def removed_from_multizone(self, group_uuid): """Handle the cast removed from a group.""" @@ -182,7 +181,6 @@ class CastStatusListener: def multizone_new_cast_status(self, group_uuid, cast_status): """Handle reception of a new CastStatus for a group.""" - pass def multizone_new_media_status(self, group_uuid, media_status): """Handle reception of a new MediaStatus for a group.""" @@ -224,7 +222,6 @@ class DynamicGroupCastStatusListener: def new_cast_status(self, cast_status): """Handle reception of a new CastStatus.""" - pass def new_media_status(self, media_status): """Handle reception of a new MediaStatus.""" diff --git a/homeassistant/components/citybikes/sensor.py b/homeassistant/components/citybikes/sensor.py index 8e0b883b7269..799fe6acc70a 100644 --- a/homeassistant/components/citybikes/sensor.py +++ b/homeassistant/components/citybikes/sensor.py @@ -125,8 +125,6 @@ STATIONS_RESPONSE_SCHEMA = vol.Schema( class CityBikesRequestError(Exception): """Error to indicate a CityBikes API request has failed.""" - pass - async def async_citybikes_request(hass, uri, schema): """Perform a request to CityBikes API endpoint, and parse the response.""" diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index e63054d23b2b..cb2812f319b4 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -162,7 +162,6 @@ class CoverDevice(Entity): None is unknown, 0 is closed, 100 is fully open. """ - pass @property def current_cover_tilt_position(self): @@ -170,7 +169,6 @@ class CoverDevice(Entity): None is unknown, 0 is closed, 100 is fully open. """ - pass @property def state(self): @@ -223,12 +221,10 @@ class CoverDevice(Entity): @property def is_opening(self): """Return if the cover is opening or not.""" - pass @property def is_closing(self): """Return if the cover is closing or not.""" - pass @property def is_closed(self): @@ -267,7 +263,6 @@ class CoverDevice(Entity): def set_cover_position(self, **kwargs): """Move the cover to a specific position.""" - pass async def async_set_cover_position(self, **kwargs): """Move the cover to a specific position.""" @@ -275,7 +270,6 @@ class CoverDevice(Entity): def stop_cover(self, **kwargs): """Stop the cover.""" - pass async def async_stop_cover(self, **kwargs): """Stop the cover.""" @@ -283,7 +277,6 @@ class CoverDevice(Entity): def open_cover_tilt(self, **kwargs: Any) -> None: """Open the cover tilt.""" - pass async def async_open_cover_tilt(self, **kwargs): """Open the cover tilt.""" @@ -291,7 +284,6 @@ class CoverDevice(Entity): def close_cover_tilt(self, **kwargs: Any) -> None: """Close the cover tilt.""" - pass async def async_close_cover_tilt(self, **kwargs): """Close the cover tilt.""" @@ -299,7 +291,6 @@ class CoverDevice(Entity): def set_cover_tilt_position(self, **kwargs): """Move the cover tilt to a specific position.""" - pass async def async_set_cover_tilt_position(self, **kwargs): """Move the cover tilt to a specific position.""" @@ -309,7 +300,6 @@ class CoverDevice(Entity): def stop_cover_tilt(self, **kwargs): """Stop the cover.""" - pass async def async_stop_cover_tilt(self, **kwargs): """Stop the cover.""" diff --git a/homeassistant/components/daikin/climate.py b/homeassistant/components/daikin/climate.py index d46ea26d4870..8b5724e014d3 100644 --- a/homeassistant/components/daikin/climate.py +++ b/homeassistant/components/daikin/climate.py @@ -78,7 +78,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= Can only be called when a user accidentally mentions the platform in their config. But even in that case it would have been ignored. """ - pass async def async_setup_entry(hass, entry, async_add_entities): diff --git a/homeassistant/components/daikin/sensor.py b/homeassistant/components/daikin/sensor.py index e3e2e6a0f27f..1bda31fc6b0e 100644 --- a/homeassistant/components/daikin/sensor.py +++ b/homeassistant/components/daikin/sensor.py @@ -22,7 +22,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= Can only be called when a user accidentally mentions the platform in their config. But even in that case it would have been ignored. """ - pass async def async_setup_entry(hass, entry, async_add_entities): diff --git a/homeassistant/components/daikin/switch.py b/homeassistant/components/daikin/switch.py index e22c0b04995d..b7131c29bdd4 100644 --- a/homeassistant/components/daikin/switch.py +++ b/homeassistant/components/daikin/switch.py @@ -16,7 +16,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= Can only be called when a user accidentally mentions the platform in their config. But even in that case it would have been ignored. """ - pass async def async_setup_entry(hass, entry, async_add_entities): diff --git a/homeassistant/components/fan/__init__.py b/homeassistant/components/fan/__init__.py index 76bd16a63634..a395a5da4700 100644 --- a/homeassistant/components/fan/__init__.py +++ b/homeassistant/components/fan/__init__.py @@ -141,7 +141,6 @@ class FanEntity(ToggleEntity): def oscillate(self, oscillating: bool) -> None: """Oscillate the fan.""" - pass async def async_oscillate(self, oscillating: bool): """Oscillate the fan.""" diff --git a/homeassistant/components/fibaro/__init__.py b/homeassistant/components/fibaro/__init__.py index 89529046f85a..dcbffe2a568b 100644 --- a/homeassistant/components/fibaro/__init__.py +++ b/homeassistant/components/fibaro/__init__.py @@ -462,10 +462,6 @@ class FibaroDevice(Entity): """Get polling requirement from fibaro device.""" return False - def update(self): - """Call to update state.""" - pass - @property def device_state_attributes(self): """Return the state attributes of the device.""" diff --git a/homeassistant/components/fronius/sensor.py b/homeassistant/components/fronius/sensor.py index 722dc2dc6590..7c966a6fa4ae 100644 --- a/homeassistant/components/fronius/sensor.py +++ b/homeassistant/components/fronius/sensor.py @@ -186,7 +186,6 @@ class FroniusAdapter: async def _update(self): """Return values of interest.""" - pass async def register(self, sensor): """Register child sensor for update subscriptions.""" diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index d9a39ce5726e..2ce710ea4194 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -421,11 +421,9 @@ class IndexView(web_urldispatcher.AbstractResource): def freeze(self) -> None: """Freeze the resource.""" - pass def raw_match(self, path: str) -> bool: """Perform a raw match against path.""" - pass def get_template(self): """Get template.""" diff --git a/homeassistant/components/homekit/accessories.py b/homeassistant/components/homekit/accessories.py index ddcc795d2625..3d014d13c5dc 100644 --- a/homeassistant/components/homekit/accessories.py +++ b/homeassistant/components/homekit/accessories.py @@ -235,7 +235,6 @@ class HomeBridge(Bridge): def setup_message(self): """Prevent print of pyhap setup message to terminal.""" - pass class HomeDriver(AccessoryDriver): diff --git a/homeassistant/components/huawei_lte/__init__.py b/homeassistant/components/huawei_lte/__init__.py index 5d618c1fdb53..272efa5d7226 100644 --- a/homeassistant/components/huawei_lte/__init__.py +++ b/homeassistant/components/huawei_lte/__init__.py @@ -600,7 +600,6 @@ class HuaweiLteBaseEntity(Entity): async def async_update_options(self, config_entry: ConfigEntry) -> None: """Update config entry options.""" - pass async def async_added_to_hass(self) -> None: """Connect to update signals.""" diff --git a/homeassistant/components/hue/light.py b/homeassistant/components/hue/light.py index 8a3a5c84c025..fa9dfe7615f9 100644 --- a/homeassistant/components/hue/light.py +++ b/homeassistant/components/hue/light.py @@ -68,7 +68,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= Can only be called when a user accidentally mentions hue platform in their config. But even in that case it would have been ignored. """ - pass def create_light(item_class, coordinator, bridge, is_group, api, item_id): diff --git a/homeassistant/components/icloud/device_tracker.py b/homeassistant/components/icloud/device_tracker.py index 47a302e2f267..0b2454168871 100644 --- a/homeassistant/components/icloud/device_tracker.py +++ b/homeassistant/components/icloud/device_tracker.py @@ -24,7 +24,6 @@ async def async_setup_scanner( hass: HomeAssistantType, config, see, discovery_info=None ): """Old way of setting up the iCloud tracker.""" - pass async def async_setup_entry( diff --git a/homeassistant/components/incomfort/climate.py b/homeassistant/components/incomfort/climate.py index 7d91ca012b93..464ff9899410 100644 --- a/homeassistant/components/incomfort/climate.py +++ b/homeassistant/components/incomfort/climate.py @@ -90,4 +90,3 @@ class InComfortClimate(IncomfortChild, ClimateDevice): async def async_set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - pass diff --git a/homeassistant/components/isy994/binary_sensor.py b/homeassistant/components/isy994/binary_sensor.py index 917dedd5c53a..30b26ea5d242 100644 --- a/homeassistant/components/isy994/binary_sensor.py +++ b/homeassistant/components/isy994/binary_sensor.py @@ -319,7 +319,6 @@ class ISYBinarySensorHeartbeat(ISYDevice, BinarySensorDevice): We listen directly to the Control events for this device. """ - pass @property def value(self) -> object: diff --git a/homeassistant/components/mailbox/__init__.py b/homeassistant/components/mailbox/__init__.py index 8526f6658c70..2275c5eba48d 100644 --- a/homeassistant/components/mailbox/__init__.py +++ b/homeassistant/components/mailbox/__init__.py @@ -177,8 +177,6 @@ class Mailbox: class StreamError(Exception): """Media streaming exception.""" - pass - class MailboxView(HomeAssistantView): """Base mailbox view.""" diff --git a/homeassistant/components/media_extractor/__init__.py b/homeassistant/components/media_extractor/__init__.py index 7dc05368dcde..af5ada7d2c94 100644 --- a/homeassistant/components/media_extractor/__init__.py +++ b/homeassistant/components/media_extractor/__init__.py @@ -58,14 +58,10 @@ def setup(hass, config): class MEDownloadException(Exception): """Media extractor download exception.""" - pass - class MEQueryException(Exception): """Media extractor query exception.""" - pass - class MediaExtractor: """Class which encapsulates all extraction logic.""" diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index ce8207fc28d8..1f2b7162556a 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -56,8 +56,6 @@ def set_discovery_hash(hass, discovery_hash): class MQTTConfig(dict): """Dummy class to allow adding attributes.""" - pass - async def async_start( hass: HomeAssistantType, discovery_topic, hass_config, config_entry=None diff --git a/homeassistant/components/openuv/config_flow.py b/homeassistant/components/openuv/config_flow.py index 9874cadb5665..aa6e58d60362 100644 --- a/homeassistant/components/openuv/config_flow.py +++ b/homeassistant/components/openuv/config_flow.py @@ -35,10 +35,6 @@ class OpenUvFlowHandler(config_entries.ConfigFlow): VERSION = 2 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL - def __init__(self): - """Initialize the config flow.""" - pass - async def _show_form(self, errors=None): """Show the form to the user.""" data_schema = vol.Schema( diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index aea8ecadaff2..00d1b6084ad0 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -42,14 +42,6 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Set up the Plex media_player platform. - - Deprecated. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up Plex media_player from a config entry.""" server_id = config_entry.data[CONF_SERVER_IDENTIFIER] diff --git a/homeassistant/components/plex/sensor.py b/homeassistant/components/plex/sensor.py index b1e93aec8c00..0e3aa5d4469a 100644 --- a/homeassistant/components/plex/sensor.py +++ b/homeassistant/components/plex/sensor.py @@ -17,14 +17,6 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Set up the Plex sensor platform. - - Deprecated. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up Plex sensor from a config entry.""" server_id = config_entry.data[CONF_SERVER_IDENTIFIER] diff --git a/homeassistant/components/point/__init__.py b/homeassistant/components/point/__init__.py index bb591b79884d..d2e4826ba2d7 100644 --- a/homeassistant/components/point/__init__.py +++ b/homeassistant/components/point/__init__.py @@ -271,7 +271,6 @@ class MinutPointEntity(Entity): async def _update_callback(self): """Update the value of the sensor.""" - pass @property def available(self): diff --git a/homeassistant/components/python_script/__init__.py b/homeassistant/components/python_script/__init__.py index 6ec94aa8e52a..36963dc2f20e 100644 --- a/homeassistant/components/python_script/__init__.py +++ b/homeassistant/components/python_script/__init__.py @@ -72,8 +72,6 @@ ALLOWED_DT_UTIL = { class ScriptError(HomeAssistantError): """When a script error occurs.""" - pass - def setup(hass, config): """Initialize the Python script component.""" @@ -216,7 +214,6 @@ class StubPrinter: def __init__(self, _getattr_): """Initialize our printer.""" - pass def _call_print(self, *objects, **kwargs): """Print text.""" diff --git a/homeassistant/components/rflink/light.py b/homeassistant/components/rflink/light.py index 01004a3b45a4..18650d2038e5 100644 --- a/homeassistant/components/rflink/light.py +++ b/homeassistant/components/rflink/light.py @@ -162,8 +162,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class RflinkLight(SwitchableRflinkDevice, Light): """Representation of a Rflink light.""" - pass - class DimmableRflinkLight(SwitchableRflinkDevice, Light): """Rflink light device that support dimming.""" diff --git a/homeassistant/components/rflink/switch.py b/homeassistant/components/rflink/switch.py index 943f8a6aae61..83c335f0f03f 100644 --- a/homeassistant/components/rflink/switch.py +++ b/homeassistant/components/rflink/switch.py @@ -71,5 +71,3 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class RflinkSwitch(SwitchableRflinkDevice, SwitchDevice): """Representation of a Rflink switch.""" - - pass diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index e26cce46ee24..99cda9cb4119 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -68,7 +68,6 @@ class RokuDevice(MediaPlayerDevice): self._available = True except (RequestsConnectionError, RequestsReadTimeout, RokuException): self._available = False - pass def get_source_list(self): """Get the list of applications to be used as sources.""" diff --git a/homeassistant/components/roku/remote.py b/homeassistant/components/roku/remote.py index 548282d6b2fb..999747c9a27e 100644 --- a/homeassistant/components/roku/remote.py +++ b/homeassistant/components/roku/remote.py @@ -43,7 +43,6 @@ class RokuRemote(RemoteDevice): self._available = True except (RequestsConnectionError, RequestsReadTimeout, RokuException): self._available = False - pass @property def name(self): diff --git a/homeassistant/components/samsungtv/media_player.py b/homeassistant/components/samsungtv/media_player.py index 8f12341ee4aa..35a374688b56 100644 --- a/homeassistant/components/samsungtv/media_player.py +++ b/homeassistant/components/samsungtv/media_player.py @@ -52,13 +52,6 @@ SUPPORT_SAMSUNGTV = ( ) -async def async_setup_platform( - hass, config, add_entities, discovery_info=None -): # pragma: no cover - """Set up the Samsung TV platform.""" - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the Samsung TV from a config entry.""" ip_address = config_entry.data[CONF_IP_ADDRESS] diff --git a/homeassistant/components/simplisafe/__init__.py b/homeassistant/components/simplisafe/__init__.py index bf12951e2ae7..04c00171b437 100644 --- a/homeassistant/components/simplisafe/__init__.py +++ b/homeassistant/components/simplisafe/__init__.py @@ -683,7 +683,6 @@ class SimpliSafeEntity(Entity): @callback def async_update_from_rest_api(self): """Update the entity with the provided REST API data.""" - pass @callback def _async_internal_update_from_websocket_event(self, event): @@ -707,7 +706,6 @@ class SimpliSafeEntity(Entity): @callback def async_update_from_websocket_event(self, event): """Update the entity with the provided websocket API data.""" - pass async def async_will_remove_from_hass(self) -> None: """Disconnect dispatcher listener when removed.""" diff --git a/homeassistant/components/smhi/weather.py b/homeassistant/components/smhi/weather.py index 574b8d857672..0c5450b5ddd6 100644 --- a/homeassistant/components/smhi/weather.py +++ b/homeassistant/components/smhi/weather.py @@ -51,15 +51,6 @@ RETRY_TIMEOUT = 5 * 60 MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=31) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up components. - - Can only be called when a user accidentally mentions smhi in the - config. In that case it will be ignored. - """ - pass - - async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, config_entries ) -> bool: diff --git a/homeassistant/components/soma/cover.py b/homeassistant/components/soma/cover.py index d23cc9ec5d0d..9bfe903e7244 100644 --- a/homeassistant/components/soma/cover.py +++ b/homeassistant/components/soma/cover.py @@ -18,15 +18,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up platform. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - class SomaCover(SomaEntity, CoverDevice): """Representation of a Soma cover device.""" diff --git a/homeassistant/components/starline/account.py b/homeassistant/components/starline/account.py index 8d0214d1b5c4..3ee716ec8567 100644 --- a/homeassistant/components/starline/account.py +++ b/homeassistant/components/starline/account.py @@ -61,7 +61,6 @@ class StarlineAccount: ) except Exception as err: # pylint: disable=broad-except LOGGER.error("Error updating SLNet token: %s", err) - pass def _update_data(self): """Update StarLine data.""" diff --git a/homeassistant/components/tellduslive/binary_sensor.py b/homeassistant/components/tellduslive/binary_sensor.py index ef1cd52f75b2..09541a120fd4 100644 --- a/homeassistant/components/tellduslive/binary_sensor.py +++ b/homeassistant/components/tellduslive/binary_sensor.py @@ -10,15 +10,6 @@ from .entry import TelldusLiveEntity _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up TelldusLive. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up tellduslive sensors dynamically.""" diff --git a/homeassistant/components/tellduslive/cover.py b/homeassistant/components/tellduslive/cover.py index 230f89b05318..6e31cd595bf6 100644 --- a/homeassistant/components/tellduslive/cover.py +++ b/homeassistant/components/tellduslive/cover.py @@ -10,15 +10,6 @@ from .entry import TelldusLiveEntity _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up TelldusLive. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up tellduslive sensors dynamically.""" diff --git a/homeassistant/components/tellduslive/light.py b/homeassistant/components/tellduslive/light.py index c4921e3855e5..3087c4cdf089 100644 --- a/homeassistant/components/tellduslive/light.py +++ b/homeassistant/components/tellduslive/light.py @@ -10,15 +10,6 @@ from .entry import TelldusLiveEntity _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up TelldusLive. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up tellduslive sensors dynamically.""" diff --git a/homeassistant/components/tellduslive/sensor.py b/homeassistant/components/tellduslive/sensor.py index 11411e1d6ea9..472c430da163 100644 --- a/homeassistant/components/tellduslive/sensor.py +++ b/homeassistant/components/tellduslive/sensor.py @@ -52,15 +52,6 @@ SENSOR_TYPES = { } -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up TelldusLive. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up tellduslive sensors dynamically.""" diff --git a/homeassistant/components/tellduslive/switch.py b/homeassistant/components/tellduslive/switch.py index 20c5fba7f9f2..05a3c166213a 100644 --- a/homeassistant/components/tellduslive/switch.py +++ b/homeassistant/components/tellduslive/switch.py @@ -10,15 +10,6 @@ from .entry import TelldusLiveEntity _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Old way of setting up TelldusLive. - - Can only be called when a user accidentally mentions the platform in their - config. But even in that case it would have been ignored. - """ - pass - - async def async_setup_entry(hass, config_entry, async_add_entities): """Set up tellduslive sensors dynamically.""" diff --git a/homeassistant/components/tellstick/cover.py b/homeassistant/components/tellstick/cover.py index 87571baa2c96..0a5643fc1ea9 100644 --- a/homeassistant/components/tellstick/cover.py +++ b/homeassistant/components/tellstick/cover.py @@ -55,12 +55,9 @@ class TellstickCover(TellstickDevice, CoverDevice): def _parse_tellcore_data(self, tellcore_data): """Turn the value received from tellcore into something useful.""" - pass def _parse_ha_data(self, kwargs): """Turn the value from HA into something useful.""" - pass def _update_model(self, new_state, data): """Update the device entity state to match the arguments.""" - pass diff --git a/homeassistant/components/tellstick/switch.py b/homeassistant/components/tellstick/switch.py index e16f9983d007..8797e8e61e6e 100644 --- a/homeassistant/components/tellstick/switch.py +++ b/homeassistant/components/tellstick/switch.py @@ -34,11 +34,9 @@ class TellstickSwitch(TellstickDevice, ToggleEntity): def _parse_ha_data(self, kwargs): """Turn the value from HA into something useful.""" - pass def _parse_tellcore_data(self, tellcore_data): """Turn the value received from tellcore into something useful.""" - pass def _update_model(self, new_state, data): """Update the device entity state to match the arguments.""" diff --git a/homeassistant/components/tesla/__init__.py b/homeassistant/components/tesla/__init__.py index 2d08b48e0af1..d2b5f0910213 100644 --- a/homeassistant/components/tesla/__init__.py +++ b/homeassistant/components/tesla/__init__.py @@ -250,11 +250,9 @@ class TeslaDevice(Entity): async def async_added_to_hass(self): """Register state update callback.""" - pass async def async_will_remove_from_hass(self): """Prepare for unload.""" - pass async def async_update(self): """Update the state of the device.""" diff --git a/homeassistant/components/toon/binary_sensor.py b/homeassistant/components/toon/binary_sensor.py index 7cf52919efed..e6ef780ec8ef 100644 --- a/homeassistant/components/toon/binary_sensor.py +++ b/homeassistant/components/toon/binary_sensor.py @@ -177,16 +177,10 @@ class ToonBinarySensor(ToonEntity, BinarySensorDevice): class ToonBoilerBinarySensor(ToonBinarySensor, ToonBoilerDeviceEntity): """Defines a Boiler binary sensor.""" - pass - class ToonDisplayBinarySensor(ToonBinarySensor, ToonDisplayDeviceEntity): """Defines a Toon Display binary sensor.""" - pass - class ToonBoilerModuleBinarySensor(ToonBinarySensor, ToonBoilerModuleDeviceEntity): """Defines a Boiler module binary sensor.""" - - pass diff --git a/homeassistant/components/toon/climate.py b/homeassistant/components/toon/climate.py index 9ce9991c3714..fac9cf4ffc21 100644 --- a/homeassistant/components/toon/climate.py +++ b/homeassistant/components/toon/climate.py @@ -142,7 +142,6 @@ class ToonThermostatDevice(ToonDisplayDeviceEntity, ClimateDevice): def set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - pass def update(self) -> None: """Update local state.""" diff --git a/homeassistant/components/toon/sensor.py b/homeassistant/components/toon/sensor.py index a5e88bb3d2fa..157c357e180c 100644 --- a/homeassistant/components/toon/sensor.py +++ b/homeassistant/components/toon/sensor.py @@ -283,22 +283,14 @@ class ToonSensor(ToonEntity): class ToonElectricityMeterDeviceSensor(ToonSensor, ToonElectricityMeterDeviceEntity): """Defines a Electricity Meter sensor.""" - pass - class ToonGasMeterDeviceSensor(ToonSensor, ToonGasMeterDeviceEntity): """Defines a Gas Meter sensor.""" - pass - class ToonSolarDeviceSensor(ToonSensor, ToonSolarDeviceEntity): """Defines a Solar sensor.""" - pass - class ToonBoilerDeviceSensor(ToonSensor, ToonBoilerDeviceEntity): """Defines a Boiler sensor.""" - - pass diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index 3cd2de600e31..f66a1b5f226c 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -304,11 +304,9 @@ class VacuumDevice(_BaseVacuum, ToggleEntity): async def async_pause(self): """Not supported.""" - pass async def async_start(self): """Not supported.""" - pass class StateVacuumDevice(_BaseVacuum): @@ -373,12 +371,9 @@ class StateVacuumDevice(_BaseVacuum): async def async_turn_on(self, **kwargs): """Not supported.""" - pass async def async_turn_off(self, **kwargs): """Not supported.""" - pass async def async_toggle(self, **kwargs): """Not supported.""" - pass diff --git a/homeassistant/components/velbus/climate.py b/homeassistant/components/velbus/climate.py index e322cfb77c7b..38d893e73434 100644 --- a/homeassistant/components/velbus/climate.py +++ b/homeassistant/components/velbus/climate.py @@ -82,4 +82,3 @@ class VelbusClimate(VelbusEntity, ClimateDevice): def set_hvac_mode(self, hvac_mode): """Set new target hvac mode.""" - pass diff --git a/homeassistant/components/websocket_api/error.py b/homeassistant/components/websocket_api/error.py index c0b7ea045547..5d4ca93105df 100644 --- a/homeassistant/components/websocket_api/error.py +++ b/homeassistant/components/websocket_api/error.py @@ -4,5 +4,3 @@ from homeassistant.exceptions import HomeAssistantError class Disconnect(HomeAssistantError): """Disconnect the current session.""" - - pass diff --git a/homeassistant/components/withings/common.py b/homeassistant/components/withings/common.py index 3a9d1d527518..ac7bc149cd92 100644 --- a/homeassistant/components/withings/common.py +++ b/homeassistant/components/withings/common.py @@ -38,14 +38,10 @@ NOT_AUTHENTICATED_ERROR = re.compile( class NotAuthenticatedError(HomeAssistantError): """Raise when not authenticated with the service.""" - pass - class ServiceError(HomeAssistantError): """Raise when the service has an error.""" - pass - class ThrottleData: """Throttle data.""" diff --git a/homeassistant/components/xs1/climate.py b/homeassistant/components/xs1/climate.py index 33c778c0d3df..19d5ae1e904e 100644 --- a/homeassistant/components/xs1/climate.py +++ b/homeassistant/components/xs1/climate.py @@ -115,7 +115,6 @@ class XS1ThermostatEntity(XS1DeviceEntity, ClimateDevice): def set_hvac_mode(self, hvac_mode): """Set new target hvac mode.""" - pass async def async_update(self): """Also update the sensor when available.""" diff --git a/homeassistant/components/yessssms/notify.py b/homeassistant/components/yessssms/notify.py index fbc6b50e8d60..863602134a44 100644 --- a/homeassistant/components/yessssms/notify.py +++ b/homeassistant/components/yessssms/notify.py @@ -46,7 +46,6 @@ def get_service(hass, config, discovery_info=None): "Connection Error, could not verify login data for '%s'", yesss.get_provider(), ) - pass _LOGGER.debug( "initialized; library version: %s, with %s", diff --git a/homeassistant/components/zha/binary_sensor.py b/homeassistant/components/zha/binary_sensor.py index 9ed1bbfca161..044d32890da2 100644 --- a/homeassistant/components/zha/binary_sensor.py +++ b/homeassistant/components/zha/binary_sensor.py @@ -75,7 +75,6 @@ class BinarySensor(ZhaEntity, BinarySensorDevice): async def get_device_class(self): """Get the HA device class from the channel.""" - pass async def async_added_to_hass(self): """Run when about to be added to hass.""" diff --git a/homeassistant/components/zha/core/channels/base.py b/homeassistant/components/zha/core/channels/base.py index a5255e7f756d..8478c2b9c491 100644 --- a/homeassistant/components/zha/core/channels/base.py +++ b/homeassistant/components/zha/core/channels/base.py @@ -205,7 +205,6 @@ class ZigbeeChannel(LogMixin): @callback def cluster_command(self, tsn, command_id, args): """Handle commands received to this cluster.""" - pass @callback def attribute_updated(self, attrid, value): @@ -220,7 +219,6 @@ class ZigbeeChannel(LogMixin): @callback def zdo_command(self, *args, **kwargs): """Handle ZDO commands on this cluster.""" - pass @callback def zha_send_event(self, command: str, args: Union[int, dict]) -> None: @@ -236,7 +234,6 @@ class ZigbeeChannel(LogMixin): async def async_update(self): """Retrieve latest state from cluster.""" - pass async def get_attribute_value(self, attribute, from_cache=True): """Get the value for an attribute.""" @@ -322,12 +319,10 @@ class ZDOChannel(LogMixin): @callback def device_announce(self, zigpy_device): """Device announce handler.""" - pass @callback def permit_duration(self, duration): """Permit handler.""" - pass async def async_initialize(self, from_cache): """Initialize channel.""" diff --git a/homeassistant/components/zha/core/channels/closures.py b/homeassistant/components/zha/core/channels/closures.py index 2b6c06ba12a0..826c99fbd3b2 100644 --- a/homeassistant/components/zha/core/channels/closures.py +++ b/homeassistant/components/zha/core/channels/closures.py @@ -49,8 +49,6 @@ class DoorLockChannel(ZigbeeChannel): class Shade(ZigbeeChannel): """Shade channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(closures.WindowCovering.cluster_id) class WindowCovering(ZigbeeChannel): diff --git a/homeassistant/components/zha/core/channels/general.py b/homeassistant/components/zha/core/channels/general.py index f2afadbd657c..05406b6939ea 100644 --- a/homeassistant/components/zha/core/channels/general.py +++ b/homeassistant/components/zha/core/channels/general.py @@ -30,8 +30,6 @@ _LOGGER = logging.getLogger(__name__) class Alarms(ZigbeeChannel): """Alarms channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.AnalogInput.cluster_id) class AnalogInput(ZigbeeChannel): @@ -58,8 +56,6 @@ class AnalogValue(ZigbeeChannel): class ApplianceContorl(ZigbeeChannel): """Appliance Control channel.""" - pass - @registries.CHANNEL_ONLY_CLUSTERS.register(general.Basic.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Basic.cluster_id) @@ -130,29 +126,21 @@ class BinaryValue(ZigbeeChannel): class Commissioning(ZigbeeChannel): """Commissioning channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.DeviceTemperature.cluster_id) class DeviceTemperature(ZigbeeChannel): """Device Temperature channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.GreenPowerProxy.cluster_id) class GreenPowerProxy(ZigbeeChannel): """Green Power Proxy channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Groups.cluster_id) class Groups(ZigbeeChannel): """Groups channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Identify.cluster_id) class Identify(ZigbeeChannel): @@ -171,8 +159,6 @@ class Identify(ZigbeeChannel): class LevelControlClientChannel(ClientChannel): """LevelControl client cluster.""" - pass - @registries.BINDABLE_CLUSTERS.register(general.LevelControl.cluster_id) @registries.LIGHT_CLUSTERS.register(general.LevelControl.cluster_id) @@ -244,8 +230,6 @@ class MultistateValue(ZigbeeChannel): class OnOffClientChannel(ClientChannel): """OnOff client channel.""" - pass - @registries.BINARY_SENSOR_CLUSTERS.register(general.OnOff.cluster_id) @registries.BINDABLE_CLUSTERS.register(general.OnOff.cluster_id) @@ -331,8 +315,6 @@ class OnOffChannel(ZigbeeChannel): class OnOffConfiguration(ZigbeeChannel): """OnOff Configuration channel.""" - pass - @registries.CLIENT_CHANNELS_REGISTRY.register(general.Ota.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Ota.cluster_id) @@ -354,8 +336,6 @@ class Ota(ZigbeeChannel): class Partition(ZigbeeChannel): """Partition channel.""" - pass - @registries.CHANNEL_ONLY_CLUSTERS.register(general.PollControl.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.PollControl.cluster_id) @@ -449,32 +429,22 @@ class PowerConfigurationChannel(ZigbeeChannel): class PowerProfile(ZigbeeChannel): """Power Profile channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.RSSILocation.cluster_id) class RSSILocation(ZigbeeChannel): """RSSI Location channel.""" - pass - @registries.CLIENT_CHANNELS_REGISTRY.register(general.Scenes.cluster_id) class ScenesClientChannel(ClientChannel): """Scenes channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Scenes.cluster_id) class Scenes(ZigbeeChannel): """Scenes channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Time.cluster_id) class Time(ZigbeeChannel): """Time channel.""" - - pass diff --git a/homeassistant/components/zha/core/channels/homeautomation.py b/homeassistant/components/zha/core/channels/homeautomation.py index 1df7cf117e29..c867fdc621d1 100644 --- a/homeassistant/components/zha/core/channels/homeautomation.py +++ b/homeassistant/components/zha/core/channels/homeautomation.py @@ -21,8 +21,6 @@ _LOGGER = logging.getLogger(__name__) class ApplianceEventAlerts(ZigbeeChannel): """Appliance Event Alerts channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( homeautomation.ApplianceIdentification.cluster_id @@ -30,8 +28,6 @@ class ApplianceEventAlerts(ZigbeeChannel): class ApplianceIdentification(ZigbeeChannel): """Appliance Identification channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( homeautomation.ApplianceStatistics.cluster_id @@ -39,15 +35,11 @@ class ApplianceIdentification(ZigbeeChannel): class ApplianceStatistics(ZigbeeChannel): """Appliance Statistics channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(homeautomation.Diagnostic.cluster_id) class Diagnostic(ZigbeeChannel): """Diagnostic channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( homeautomation.ElectricalMeasurement.cluster_id @@ -127,5 +119,3 @@ class ElectricalMeasurementChannel(ZigbeeChannel): ) class MeterIdentification(ZigbeeChannel): """Metering Identification channel.""" - - pass diff --git a/homeassistant/components/zha/core/channels/hvac.py b/homeassistant/components/zha/core/channels/hvac.py index 3c00e186ebb2..bd90b907d3b6 100644 --- a/homeassistant/components/zha/core/channels/hvac.py +++ b/homeassistant/components/zha/core/channels/hvac.py @@ -17,8 +17,6 @@ _LOGGER = logging.getLogger(__name__) class Dehumidification(ZigbeeChannel): """Dehumidification channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(hvac.Fan.cluster_id) class FanChannel(ZigbeeChannel): @@ -67,18 +65,12 @@ class FanChannel(ZigbeeChannel): class Pump(ZigbeeChannel): """Pump channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(hvac.Thermostat.cluster_id) class Thermostat(ZigbeeChannel): """Thermostat channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(hvac.UserInterface.cluster_id) class UserInterface(ZigbeeChannel): """User interface (thermostat) channel.""" - - pass diff --git a/homeassistant/components/zha/core/channels/lighting.py b/homeassistant/components/zha/core/channels/lighting.py index 25f6c05d739a..9721bee90146 100644 --- a/homeassistant/components/zha/core/channels/lighting.py +++ b/homeassistant/components/zha/core/channels/lighting.py @@ -14,15 +14,11 @@ _LOGGER = logging.getLogger(__name__) class Ballast(ZigbeeChannel): """Ballast channel.""" - pass - @registries.CLIENT_CHANNELS_REGISTRY.register(lighting.Color.cluster_id) class ColorClientChannel(ClientChannel): """Color client channel.""" - pass - @registries.BINDABLE_CLUSTERS.register(lighting.Color.cluster_id) @registries.LIGHT_CLUSTERS.register(lighting.Color.cluster_id) diff --git a/homeassistant/components/zha/core/channels/lightlink.py b/homeassistant/components/zha/core/channels/lightlink.py index af0248c9713c..25f3ebf96867 100644 --- a/homeassistant/components/zha/core/channels/lightlink.py +++ b/homeassistant/components/zha/core/channels/lightlink.py @@ -13,5 +13,3 @@ _LOGGER = logging.getLogger(__name__) @registries.ZIGBEE_CHANNEL_REGISTRY.register(lightlink.LightLink.cluster_id) class LightLink(ZigbeeChannel): """Lightlink channel.""" - - pass diff --git a/homeassistant/components/zha/core/channels/protocol.py b/homeassistant/components/zha/core/channels/protocol.py index db7488e9a7f8..083e0f55841e 100644 --- a/homeassistant/components/zha/core/channels/protocol.py +++ b/homeassistant/components/zha/core/channels/protocol.py @@ -13,99 +13,71 @@ _LOGGER = logging.getLogger(__name__) class AnalogInputExtended(ZigbeeChannel): """Analog Input Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.AnalogInputRegular.cluster_id) class AnalogInputRegular(ZigbeeChannel): """Analog Input Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.AnalogOutputExtended.cluster_id) class AnalogOutputExtended(ZigbeeChannel): """Analog Output Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.AnalogOutputRegular.cluster_id) class AnalogOutputRegular(ZigbeeChannel): """Analog Output Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.AnalogValueExtended.cluster_id) class AnalogValueExtended(ZigbeeChannel): """Analog Value Extended edition channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.AnalogValueRegular.cluster_id) class AnalogValueRegular(ZigbeeChannel): """Analog Value Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BacnetProtocolTunnel.cluster_id) class BacnetProtocolTunnel(ZigbeeChannel): """Bacnet Protocol Tunnel channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryInputExtended.cluster_id) class BinaryInputExtended(ZigbeeChannel): """Binary Input Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryInputRegular.cluster_id) class BinaryInputRegular(ZigbeeChannel): """Binary Input Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryOutputExtended.cluster_id) class BinaryOutputExtended(ZigbeeChannel): """Binary Output Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryOutputRegular.cluster_id) class BinaryOutputRegular(ZigbeeChannel): """Binary Output Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryValueExtended.cluster_id) class BinaryValueExtended(ZigbeeChannel): """Binary Value Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.BinaryValueRegular.cluster_id) class BinaryValueRegular(ZigbeeChannel): """Binary Value Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.GenericTunnel.cluster_id) class GenericTunnel(ZigbeeChannel): """Generic Tunnel channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( protocol.MultistateInputExtended.cluster_id @@ -113,15 +85,11 @@ class GenericTunnel(ZigbeeChannel): class MultiStateInputExtended(ZigbeeChannel): """Multistate Input Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.MultistateInputRegular.cluster_id) class MultiStateInputRegular(ZigbeeChannel): """Multistate Input Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( protocol.MultistateOutputExtended.cluster_id @@ -129,8 +97,6 @@ class MultiStateInputRegular(ZigbeeChannel): class MultiStateOutputExtended(ZigbeeChannel): """Multistate Output Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( protocol.MultistateOutputRegular.cluster_id @@ -138,8 +104,6 @@ class MultiStateOutputExtended(ZigbeeChannel): class MultiStateOutputRegular(ZigbeeChannel): """Multistate Output Regular channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register( protocol.MultistateValueExtended.cluster_id @@ -147,11 +111,7 @@ class MultiStateOutputRegular(ZigbeeChannel): class MultiStateValueExtended(ZigbeeChannel): """Multistate Value Extended channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(protocol.MultistateValueRegular.cluster_id) class MultiStateValueRegular(ZigbeeChannel): """Multistate Value Regular channel.""" - - pass diff --git a/homeassistant/components/zha/core/channels/security.py b/homeassistant/components/zha/core/channels/security.py index 822ae8dd911d..914c11331162 100644 --- a/homeassistant/components/zha/core/channels/security.py +++ b/homeassistant/components/zha/core/channels/security.py @@ -30,8 +30,6 @@ _LOGGER = logging.getLogger(__name__) class IasAce(ZigbeeChannel): """IAS Ancillary Control Equipment channel.""" - pass - @registries.CHANNEL_ONLY_CLUSTERS.register(security.IasWd.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(security.IasWd.cluster_id) diff --git a/homeassistant/components/zha/core/channels/smartenergy.py b/homeassistant/components/zha/core/channels/smartenergy.py index 86533662838d..4226aad3f0a5 100644 --- a/homeassistant/components/zha/core/channels/smartenergy.py +++ b/homeassistant/components/zha/core/channels/smartenergy.py @@ -17,57 +17,41 @@ _LOGGER = logging.getLogger(__name__) class Calendar(ZigbeeChannel): """Calendar channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.DeviceManagement.cluster_id) class DeviceManagement(ZigbeeChannel): """Device Management channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Drlc.cluster_id) class Drlc(ZigbeeChannel): """Demand Response and Load Control channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.EnergyManagement.cluster_id) class EnergyManagement(ZigbeeChannel): """Energy Management channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Events.cluster_id) class Events(ZigbeeChannel): """Event channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.KeyEstablishment.cluster_id) class KeyEstablishment(ZigbeeChannel): """Key Establishment channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.MduPairing.cluster_id) class MduPairing(ZigbeeChannel): """Pairing channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Messaging.cluster_id) class Messaging(ZigbeeChannel): """Messaging channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Metering.cluster_id) class Metering(ZigbeeChannel): @@ -163,18 +147,12 @@ class Metering(ZigbeeChannel): class Prepayment(ZigbeeChannel): """Prepayment channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Price.cluster_id) class Price(ZigbeeChannel): """Price channel.""" - pass - @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Tunneling.cluster_id) class Tunneling(ZigbeeChannel): """Tunneling channel.""" - - pass diff --git a/homeassistant/components/zha/entity.py b/homeassistant/components/zha/entity.py index 2d098d60bfb5..0ba7ff09f3f1 100644 --- a/homeassistant/components/zha/entity.py +++ b/homeassistant/components/zha/entity.py @@ -112,7 +112,6 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): @callback def async_set_state(self, attr_id: int, attr_name: str, value: Any) -> None: """Set the entity state.""" - pass async def async_added_to_hass(self) -> None: """Run when about to be added to hass.""" @@ -136,7 +135,6 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): @callback def async_restore_last_state(self, last_state) -> None: """Restore previous state.""" - pass async def async_accept_signal( self, channel: ChannelType, signal: str, func: CALLABLE_T, signal_override=False @@ -282,4 +280,3 @@ class ZhaGroupEntity(BaseZhaEntity): async def async_update(self) -> None: """Update the state of the group entity.""" - pass diff --git a/homeassistant/components/zha/fan.py b/homeassistant/components/zha/fan.py index c3cd88b0d6d0..8a9dc2691fc9 100644 --- a/homeassistant/components/zha/fan.py +++ b/homeassistant/components/zha/fan.py @@ -121,7 +121,6 @@ class BaseFan(FanEntity): @callback def async_set_state(self, attr_id, attr_name, value): """Handle state update from channel.""" - pass @STRICT_MATCH(channel_names=CHANNEL_FAN) diff --git a/homeassistant/components/zha/sensor.py b/homeassistant/components/zha/sensor.py index 5e2e8bf4a0d3..4544780b4f86 100644 --- a/homeassistant/components/zha/sensor.py +++ b/homeassistant/components/zha/sensor.py @@ -158,7 +158,6 @@ class AnalogInput(Sensor): """Sensor that displays analog input values.""" SENSOR_ATTR = "present_value" - pass @STRICT_MATCH(channel_names=CHANNEL_POWER_CONFIGURATION) diff --git a/homeassistant/components/zigbee/binary_sensor.py b/homeassistant/components/zigbee/binary_sensor.py index d8a5949be4c3..8b37107b906e 100644 --- a/homeassistant/components/zigbee/binary_sensor.py +++ b/homeassistant/components/zigbee/binary_sensor.py @@ -20,5 +20,3 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class ZigBeeBinarySensor(ZigBeeDigitalIn, BinarySensorDevice): """Use ZigBeeDigitalIn as binary sensor.""" - - pass diff --git a/homeassistant/components/zigbee/light.py b/homeassistant/components/zigbee/light.py index 9a48efe8a954..86994a55446c 100644 --- a/homeassistant/components/zigbee/light.py +++ b/homeassistant/components/zigbee/light.py @@ -22,5 +22,3 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class ZigBeeLight(ZigBeeDigitalOut, Light): """Use ZigBeeDigitalOut as light.""" - - pass diff --git a/homeassistant/components/zigbee/switch.py b/homeassistant/components/zigbee/switch.py index 4e8d21f438a1..71e419e410f1 100644 --- a/homeassistant/components/zigbee/switch.py +++ b/homeassistant/components/zigbee/switch.py @@ -21,5 +21,3 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class ZigBeeSwitch(ZigBeeDigitalOut, SwitchDevice): """Representation of a Zigbee Digital Out device.""" - - pass diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 4e3f2e9af571..9beef00a9217 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -1209,7 +1209,6 @@ class ZWaveDeviceEntity(ZWaveBaseEntity): def value_added(self): """Handle a new value of this entity.""" - pass def value_changed(self): """Handle a changed value for this entity's node.""" @@ -1263,7 +1262,6 @@ class ZWaveDeviceEntity(ZWaveBaseEntity): def update_properties(self): """Update on data changes for node values.""" - pass @property def should_poll(self): diff --git a/homeassistant/components/zwave/sensor.py b/homeassistant/components/zwave/sensor.py index b732e3569eda..b551e4363526 100644 --- a/homeassistant/components/zwave/sensor.py +++ b/homeassistant/components/zwave/sensor.py @@ -105,8 +105,6 @@ class ZWaveAlarmSensor(ZWaveSensor): COMMAND_CLASS_ALARM is what we get here. """ - pass - class ZWaveBatterySensor(ZWaveSensor): """Representation of Z-Wave device battery level.""" diff --git a/homeassistant/config.py b/homeassistant/config.py index 0ac86c4eb4b2..068dbd47fa96 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -375,7 +375,6 @@ def process_ha_config_upgrade(hass: HomeAssistant) -> None: config_file.write(config_raw) except OSError: _LOGGER.exception("Migrating to google_translate tts failed") - pass if version_obj < LooseVersion("0.94") and is_docker_env(): # In 0.94 we no longer install packages inside the deps folder when diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index 4a115762be40..0d419ae66c28 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -67,20 +67,17 @@ class FlowManager(abc.ABC): Handler key is the domain of the component that we want to set up. """ - pass @abc.abstractmethod async def async_finish_flow( self, flow: "FlowHandler", result: Dict[str, Any] ) -> Dict[str, Any]: """Finish a config flow and add an entry.""" - pass async def async_post_init( self, flow: "FlowHandler", result: Dict[str, Any] ) -> None: """Entry has finished executing its first step asynchronously.""" - pass @callback def async_progress(self) -> List[Dict]: diff --git a/homeassistant/util/logging.py b/homeassistant/util/logging.py index 1a46a34c1a89..abadb6131689 100644 --- a/homeassistant/util/logging.py +++ b/homeassistant/util/logging.py @@ -96,15 +96,12 @@ class AsyncHandler: def createLock(self) -> None: """Ignore lock stuff.""" - pass def acquire(self) -> None: """Ignore lock stuff.""" - pass def release(self) -> None: """Ignore lock stuff.""" - pass @property def level(self) -> int: diff --git a/homeassistant/util/yaml/objects.py b/homeassistant/util/yaml/objects.py index 183c6c171d68..cae957740e43 100644 --- a/homeassistant/util/yaml/objects.py +++ b/homeassistant/util/yaml/objects.py @@ -4,10 +4,6 @@ class NodeListClass(list): """Wrapper class to be able to add attributes on a list.""" - pass - class NodeStrClass(str): """Wrapper class to be able to add attributes on a string.""" - - pass diff --git a/pylintrc b/pylintrc index 1b08c40793ad..38c9beb28e50 100644 --- a/pylintrc +++ b/pylintrc @@ -24,7 +24,6 @@ good-names=id,i,j,k,ex,Run,_,fp # too-few-* - same as too-many-* # abstract-method - with intro of async there are always methods missing # inconsistent-return-statements - doesn't handle raise -# unnecessary-pass - readability for functions which only contain pass # import-outside-toplevel - TODO # too-many-ancestors - it's too strict. # wrong-import-order - isort guards this @@ -49,7 +48,6 @@ disable= too-many-return-statements, too-many-statements, too-many-boolean-expressions, - unnecessary-pass, unused-argument, wrong-import-order enable= diff --git a/tests/components/smhi/test_weather.py b/tests/components/smhi/test_weather.py index 952e82c01be2..3485a108d5b7 100644 --- a/tests/components/smhi/test_weather.py +++ b/tests/components/smhi/test_weather.py @@ -74,11 +74,6 @@ async def test_setup_hass(hass: HomeAssistant, aioclient_mock) -> None: assert forecast[ATTR_FORECAST_CONDITION] == "partlycloudy" -async def test_setup_plattform(hass): - """Test that setup platform does nothing.""" - assert await weather_smhi.async_setup_platform(hass, None, None) is None - - def test_properties_no_data(hass: HomeAssistant) -> None: """Test properties when no API data available.""" weather = weather_smhi.SmhiWeather("name", "10", "10") From 24840b54ac14cb726e34a70755ccb5f7b2c070be Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 10:33:45 +0200 Subject: [PATCH 129/653] Add yamllint (in pre-commit and CI) (#33676) * Add yamllint (in pre-commit and CI) * Fix linting for all YAML files * Bump and add it to requirements * Fix gen_requirements for pre-commit, remove 'v' from version --- .github/lock.yml | 2 +- .pre-commit-config.yaml | 4 + .yamllint | 61 ++++++ azure-pipelines-ci.yml | 4 + codecov.yml | 6 +- homeassistant/components/abode/services.yaml | 16 +- homeassistant/components/arlo/services.yaml | 2 +- .../components/automation/services.yaml | 11 +- homeassistant/components/blink/services.yaml | 28 +-- .../components/bluesound/services.yaml | 10 +- .../bluetooth_tracker/services.yaml | 2 +- .../components/conversation/services.yaml | 3 - homeassistant/components/demo/services.yaml | 2 +- .../components/downloader/services.yaml | 10 +- homeassistant/components/dyson/services.yaml | 14 +- homeassistant/components/ebusd/services.yaml | 2 +- homeassistant/components/econet/services.yaml | 4 +- homeassistant/components/fan/services.yaml | 21 +-- .../components/fastdotcom/services.yaml | 2 +- homeassistant/components/ffmpeg/services.yaml | 15 +- .../components/foursquare/services.yaml | 50 +++-- homeassistant/components/google/services.yaml | 16 +- homeassistant/components/group/services.yaml | 3 +- .../components/habitica/services.yaml | 4 +- .../components/hangouts/services.yaml | 2 +- .../components/harmony/services.yaml | 6 +- .../components/hdmi_cec/services.yaml | 50 +++-- homeassistant/components/heos/services.yaml | 6 +- homeassistant/components/hive/services.yaml | 35 ++-- .../homematicip_cloud/services.yaml | 6 +- .../components/ihc/ihc_auto_setup.yaml | 173 +++++++++--------- homeassistant/components/ihc/services.yaml | 2 +- .../components/input_datetime/services.yaml | 20 +- .../components/input_number/services.yaml | 19 +- .../components/insteon/services.yaml | 10 +- homeassistant/components/iperf3/services.yaml | 2 +- homeassistant/components/lcn/services.yaml | 70 +++---- homeassistant/components/lifx/services.yaml | 6 +- .../components/logbook/services.yaml | 2 +- homeassistant/components/matrix/services.yaml | 4 +- .../components/media_extractor/services.yaml | 9 +- homeassistant/components/mill/services.yaml | 4 +- .../components/mysensors/services.yaml | 4 +- homeassistant/components/neato/services.yaml | 4 +- .../components/ness_alarm/services.yaml | 2 +- homeassistant/components/nexia/services.yaml | 4 +- .../components/nuimo_controller/services.yaml | 21 +-- homeassistant/components/ombi/services.yaml | 5 +- homeassistant/components/openuv/services.yaml | 2 - .../components/pi_hole/services.yaml | 4 +- .../components/qvr_pro/services.yaml | 4 +- .../components/rainmachine/services.yaml | 2 - .../remember_the_milk/services.yaml | 9 +- homeassistant/components/ring/services.yaml | 2 +- .../components/route53/services.yaml | 2 +- .../components/simplisafe/services.yaml | 2 - homeassistant/components/snips/services.yaml | 49 +++-- .../components/speedtestdotnet/services.yaml | 2 +- homeassistant/components/stream/services.yaml | 4 +- .../components/streamlabswater/services.yaml | 6 +- homeassistant/components/timer/services.yaml | 10 +- .../components/utility_meter/services.yaml | 12 +- homeassistant/components/vallox/services.yaml | 4 +- homeassistant/components/velbus/services.yaml | 4 +- homeassistant/components/vesync/services.yaml | 2 +- .../components/webostv/services.yaml | 26 +-- homeassistant/components/wink/services.yaml | 82 +++++---- .../components/xiaomi_miio/services.yaml | 110 +++++------ homeassistant/components/yamaha/services.yaml | 6 +- .../components/zoneminder/services.yaml | 2 +- homeassistant/components/zwave/services.yaml | 17 +- requirements_test_pre_commit.txt | 5 +- script/gen_requirements_all.py | 2 +- 73 files changed, 621 insertions(+), 507 deletions(-) create mode 100644 .yamllint diff --git a/.github/lock.yml b/.github/lock.yml index 93666bc6eebe..7ce0cc656194 100644 --- a/.github/lock.yml +++ b/.github/lock.yml @@ -24,4 +24,4 @@ only: pulls # Optionally, specify configuration settings just for `issues` or `pulls` issues: - daysUntilLock: 30 + daysUntilLock: 30 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4211438379c5..20337d836316 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,6 +46,10 @@ repos: - --branch=dev - --branch=master - --branch=rc + - repo: https://github.com/adrienverge/yamllint.git + rev: v1.21.0 + hooks: + - id: yamllint - repo: local hooks: # Run mypy through our wrapper script in order to get the possible diff --git a/.yamllint b/.yamllint new file mode 100644 index 000000000000..c2f877a2b7a0 --- /dev/null +++ b/.yamllint @@ -0,0 +1,61 @@ +ignore: | + azure-*.yml +rules: + braces: + level: error + min-spaces-inside: 0 + max-spaces-inside: 1 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + level: error + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + level: error + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: error + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + level: error + require-starting-space: true + min-spaces-from-content: 2 + comments-indentation: + level: error + document-end: + level: error + present: false + document-start: + level: error + present: false + empty-lines: + level: error + max: 1 + max-start: 0 + max-end: 1 + hyphens: + level: error + max-spaces-after: 1 + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: false + key-duplicates: + level: error + line-length: disable + new-line-at-end-of-file: + level: error + new-lines: + level: error + type: unix + trailing-spaces: + level: error + truthy: + level: error diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 8fb014f80a7d..225c88b7b0f4 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -64,6 +64,10 @@ stages: . venv/bin/activate pre-commit run check-json --all-files displayName: 'Run check-json' + - script: | + . venv/bin/activate + pre-commit run yamllint --all-files + displayName: 'Run yamllint' - job: 'Validate' pool: vmImage: 'ubuntu-latest' diff --git a/codecov.yml b/codecov.yml index 1455c20749a5..964e2427fb19 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,8 +12,8 @@ coverage: default: url: "secret:TgWDUM4Jw0w7wMJxuxNF/yhSOHglIo1fGwInJnRLEVPy2P2aLimkoK1mtKCowH5TFw+baUXVXT3eAqefbdvIuM8BjRR4aRji95C6CYyD0QHy4N8i7nn1SQkWDPpS8IthYTg07rUDF7s5guurkKv2RrgoCdnnqjAMSzHoExMOF7xUmblMdhBTWJgBpWEhASJy85w/xxjlsE1xoTkzeJu9Q67pTXtRcn+5kb5/vIzPSYg=" comment: - require_changes: yes + require_changes: true layout: reach branches: - - master - - !dev + - master + - !dev diff --git a/homeassistant/components/abode/services.yaml b/homeassistant/components/abode/services.yaml index 5818cdc00485..f694afc02983 100644 --- a/homeassistant/components/abode/services.yaml +++ b/homeassistant/components/abode/services.yaml @@ -1,13 +1,21 @@ capture_image: description: Request a new image capture from a camera device. fields: - entity_id: {description: Entity id of the camera to request an image., example: camera.downstairs_motion_camera} + entity_id: + description: Entity id of the camera to request an image. + example: camera.downstairs_motion_camera change_setting: description: Change an Abode system setting. fields: - setting: {description: Setting to change., example: beeper_mute} - value: {description: Value of the setting., example: '1'} + setting: + description: Setting to change. + example: beeper_mute + value: + description: Value of the setting. + example: "1" trigger_automation: description: Trigger an Abode automation. fields: - entity_id: {description: Entity id of the automation to trigger., example: switch.my_automation} \ No newline at end of file + entity_id: + description: Entity id of the automation to trigger. + example: switch.my_automation diff --git a/homeassistant/components/arlo/services.yaml b/homeassistant/components/arlo/services.yaml index 773bee4430aa..a35fec8fb737 100644 --- a/homeassistant/components/arlo/services.yaml +++ b/homeassistant/components/arlo/services.yaml @@ -1,4 +1,4 @@ # Describes the format for available arlo services update: - description: Update the state for all cameras and the base station. \ No newline at end of file + description: Update the state for all cameras and the base station. diff --git a/homeassistant/components/automation/services.yaml b/homeassistant/components/automation/services.yaml index ce54220aff46..867dc8e89cdb 100644 --- a/homeassistant/components/automation/services.yaml +++ b/homeassistant/components/automation/services.yaml @@ -1,35 +1,34 @@ # Describes the format for available automation services - turn_on: description: Enable an automation. fields: entity_id: description: Name of the automation to turn on. - example: 'automation.notify_home' + example: "automation.notify_home" turn_off: description: Disable an automation. fields: entity_id: description: Name of the automation to turn off. - example: 'automation.notify_home' + example: "automation.notify_home" toggle: description: Toggle an automation. fields: entity_id: description: Name of the automation to toggle on/off. - example: 'automation.notify_home' + example: "automation.notify_home" trigger: description: Trigger the action of an automation. fields: entity_id: description: Name of the automation to trigger. - example: 'automation.notify_home' + example: "automation.notify_home" skip_condition: description: Whether or not the condition will be skipped (defaults to True). - example: True + example: true reload: description: Reload the automation configuration. diff --git a/homeassistant/components/blink/services.yaml b/homeassistant/components/blink/services.yaml index fc042b0d5986..37595837c118 100644 --- a/homeassistant/components/blink/services.yaml +++ b/homeassistant/components/blink/services.yaml @@ -1,21 +1,21 @@ # Describes the format for available Blink services blink_update: - description: Force a refresh. + description: Force a refresh. trigger_camera: - description: Request named camera to take new image. - fields: - name: - description: Name of camera to take new image. - example: 'Living Room' + description: Request named camera to take new image. + fields: + name: + description: Name of camera to take new image. + example: "Living Room" save_video: - description: Save last recorded video clip to local file. - fields: - name: - description: Name of camera to grab video from. - example: 'Living Room' - filename: - description: Filename to writable path (directory may need to be included in whitelist_dirs in config) - example: '/tmp/video.mp4' + description: Save last recorded video clip to local file. + fields: + name: + description: Name of camera to grab video from. + example: "Living Room" + filename: + description: Filename to writable path (directory may need to be included in whitelist_dirs in config) + example: "/tmp/video.mp4" diff --git a/homeassistant/components/bluesound/services.yaml b/homeassistant/components/bluesound/services.yaml index 6c85c77e961c..0ca12c9e2ae4 100644 --- a/homeassistant/components/bluesound/services.yaml +++ b/homeassistant/components/bluesound/services.yaml @@ -3,28 +3,28 @@ join: fields: master: description: Entity ID of the player that should become the master of the group. - example: 'media_player.bluesound_livingroom' + example: "media_player.bluesound_livingroom" entity_id: description: Name(s) of entities that will coordinate the grouping. Platform dependent. - example: 'media_player.bluesound_livingroom' + example: "media_player.bluesound_livingroom" unjoin: description: Unjoin the player from a group. fields: entity_id: description: Name(s) of entities that will be unjoined from their group. Platform dependent. - example: 'media_player.bluesound_livingroom' + example: "media_player.bluesound_livingroom" set_sleep_timer: description: "Set a Bluesound timer. It will increase timer in steps: 15, 30, 45, 60, 90, 0" fields: entity_id: description: Name(s) of entities that will have a timer set. - example: 'media_player.bluesound_livingroom' + example: "media_player.bluesound_livingroom" clear_sleep_timer: description: Clear a Bluesound timer. fields: entity_id: description: Name(s) of entities that will have the timer cleared. - example: 'media_player.bluesound_livingroom' \ No newline at end of file + example: "media_player.bluesound_livingroom" diff --git a/homeassistant/components/bluetooth_tracker/services.yaml b/homeassistant/components/bluetooth_tracker/services.yaml index b48c48a89680..01b31eee63e7 100644 --- a/homeassistant/components/bluetooth_tracker/services.yaml +++ b/homeassistant/components/bluetooth_tracker/services.yaml @@ -1,2 +1,2 @@ update: - description: Trigger manual tracker update \ No newline at end of file + description: Trigger manual tracker update diff --git a/homeassistant/components/conversation/services.yaml b/homeassistant/components/conversation/services.yaml index a1b980d8e05a..032edba8db18 100644 --- a/homeassistant/components/conversation/services.yaml +++ b/homeassistant/components/conversation/services.yaml @@ -1,10 +1,7 @@ # Describes the format for available component services - process: description: Launch a conversation from a transcribed text. fields: text: description: Transcribed text example: Turn all lights on - - diff --git a/homeassistant/components/demo/services.yaml b/homeassistant/components/demo/services.yaml index a8a96b21c192..aed23eed95aa 100644 --- a/homeassistant/components/demo/services.yaml +++ b/homeassistant/components/demo/services.yaml @@ -1,2 +1,2 @@ randomize_device_tracker_data: - description: Demonstrates using a device tracker to see where devices are located \ No newline at end of file + description: Demonstrates using a device tracker to see where devices are located diff --git a/homeassistant/components/downloader/services.yaml b/homeassistant/components/downloader/services.yaml index d16b2788c70a..6e16e00432fd 100644 --- a/homeassistant/components/downloader/services.yaml +++ b/homeassistant/components/downloader/services.yaml @@ -1,15 +1,15 @@ download_file: description: Downloads a file to the download location. fields: - url: + url: description: The URL of the file to download. - example: 'http://example.org/myfile' + example: "http://example.org/myfile" subdir: description: Download into subdirectory. - example: 'download_dir' + example: "download_dir" filename: description: Determine the filename. - example: 'my_file_name' + example: "my_file_name" overwrite: description: Whether to overwrite the file or not. - example: 'false' \ No newline at end of file + example: "false" diff --git a/homeassistant/components/dyson/services.yaml b/homeassistant/components/dyson/services.yaml index 1b59217f6ab7..73f7bc758744 100644 --- a/homeassistant/components/dyson/services.yaml +++ b/homeassistant/components/dyson/services.yaml @@ -5,7 +5,7 @@ set_night_mode: fields: entity_id: description: Name(s) of the entities to enable/disable night mode - example: 'fan.living_room' + example: "fan.living_room" night_mode: description: Night mode status example: true @@ -15,7 +15,7 @@ set_auto_mode: fields: entity_id: description: Name(s) of the entities to enable/disable auto mode - example: 'fan.living_room' + example: "fan.living_room" auto_mode: description: Auto mode status example: true @@ -25,7 +25,7 @@ set_angle: fields: entity_id: description: Name(s) of the entities for which to set the angle - example: 'fan.living_room' + example: "fan.living_room" angle_low: description: The angle at which the oscillation should start example: 1 @@ -38,7 +38,7 @@ flow_direction_front: fields: entity_id: description: Name(s) of the entities to set frontal flow direction for - example: 'fan.living_room' + example: "fan.living_room" flow_direction_front: description: Frontal flow direction example: true @@ -48,7 +48,7 @@ set_timer: fields: entity_id: description: Name(s) of the entities to set the sleep timer for - example: 'fan.living_room' + example: "fan.living_room" timer: description: The value in minutes to set the timer to, 0 to disable it example: 30 @@ -58,7 +58,7 @@ set_speed: fields: entity_id: description: Name(s) of the entities to set the speed for - example: 'fan.living_room' + example: "fan.living_room" dyson_speed: description: Speed - example: 1 \ No newline at end of file + example: 1 diff --git a/homeassistant/components/ebusd/services.yaml b/homeassistant/components/ebusd/services.yaml index 0f64533f7f15..eee9896da108 100644 --- a/homeassistant/components/ebusd/services.yaml +++ b/homeassistant/components/ebusd/services.yaml @@ -3,4 +3,4 @@ write: fields: call: description: Property name and value to set - example: '{"name": "Hc1MaxFlowTempDesired", "value": 21}' \ No newline at end of file + example: '{"name": "Hc1MaxFlowTempDesired", "value": 21}' diff --git a/homeassistant/components/econet/services.yaml b/homeassistant/components/econet/services.yaml index 9f489165c22e..b531764c2901 100644 --- a/homeassistant/components/econet/services.yaml +++ b/homeassistant/components/econet/services.yaml @@ -3,7 +3,7 @@ add_vacation: fields: entity_id: description: Name(s) of entities to change. - example: 'water_heater.econet' + example: "water_heater.econet" start_date: description: The timestamp of when the vacation should start. (Optional, defaults to now) example: 1513186320 @@ -16,4 +16,4 @@ delete_vacation: fields: entity_id: description: Name(s) of entities to change. - example: 'water_heater.econet' \ No newline at end of file + example: "water_heater.econet" diff --git a/homeassistant/components/fan/services.yaml b/homeassistant/components/fan/services.yaml index 1fbd9089ed7f..1fb88a36d2c1 100644 --- a/homeassistant/components/fan/services.yaml +++ b/homeassistant/components/fan/services.yaml @@ -1,55 +1,54 @@ # Describes the format for available fan services - set_speed: description: Sets fan speed. fields: entity_id: description: Name(s) of the entities to set - example: 'fan.living_room' + example: "fan.living_room" speed: description: Speed setting - example: 'low' + example: "low" turn_on: description: Turns fan on. fields: entity_id: description: Names(s) of the entities to turn on - example: 'fan.living_room' + example: "fan.living_room" speed: description: Speed setting - example: 'high' + example: "high" turn_off: description: Turns fan off. fields: entity_id: description: Names(s) of the entities to turn off - example: 'fan.living_room' + example: "fan.living_room" oscillate: description: Oscillates the fan. fields: entity_id: description: Name(s) of the entities to oscillate - example: 'fan.desk_fan' + example: "fan.desk_fan" oscillating: description: Flag to turn on/off oscillation - example: True + example: true toggle: description: Toggle the fan on/off. fields: entity_id: description: Name(s) of the entities to toggle - example: 'fan.living_room' + example: "fan.living_room" set_direction: description: Set the fan rotation. fields: entity_id: description: Name(s) of the entities to set - example: 'fan.living_room' + example: "fan.living_room" direction: description: The direction to rotate. Either 'forward' or 'reverse' - example: 'forward' + example: "forward" diff --git a/homeassistant/components/fastdotcom/services.yaml b/homeassistant/components/fastdotcom/services.yaml index fe6cb1ac12db..f0afb49dbe0a 100644 --- a/homeassistant/components/fastdotcom/services.yaml +++ b/homeassistant/components/fastdotcom/services.yaml @@ -1,2 +1,2 @@ speedtest: - description: Immediately take a speedest with Fast.com \ No newline at end of file + description: Immediately take a speedest with Fast.com diff --git a/homeassistant/components/ffmpeg/services.yaml b/homeassistant/components/ffmpeg/services.yaml index 05c9c4fb1806..15afa82ed0a4 100644 --- a/homeassistant/components/ffmpeg/services.yaml +++ b/homeassistant/components/ffmpeg/services.yaml @@ -1,15 +1,18 @@ restart: description: Send a restart command to a ffmpeg based sensor. fields: - entity_id: {description: Name(s) of entities that will restart. Platform dependent., - example: binary_sensor.ffmpeg_noise} + entity_id: + description: Name(s) of entities that will restart. Platform dependent. + example: binary_sensor.ffmpeg_noise start: description: Send a start command to a ffmpeg based sensor. fields: - entity_id: {description: Name(s) of entities that will start. Platform dependent., - example: binary_sensor.ffmpeg_noise} + entity_id: + description: Name(s) of entities that will start. Platform dependent. + example: binary_sensor.ffmpeg_noise stop: description: Send a stop command to a ffmpeg based sensor. fields: - entity_id: {description: Name(s) of entities that will stop. Platform dependent., - example: binary_sensor.ffmpeg_noise} + entity_id: + description: Name(s) of entities that will stop. Platform dependent. + example: binary_sensor.ffmpeg_noise diff --git a/homeassistant/components/foursquare/services.yaml b/homeassistant/components/foursquare/services.yaml index 3d15a9583f64..0fcc077c7d3c 100644 --- a/homeassistant/components/foursquare/services.yaml +++ b/homeassistant/components/foursquare/services.yaml @@ -1,29 +1,45 @@ checkin: description: Check a user into a Foursquare venue. fields: - alt: {description: 'Altitude of the user''s location, in meters. [Optional]', - example: 0} - altAcc: {description: 'Vertical accuracy of the user''s location, in meters.', - example: 1} - broadcast: {description: 'Who to broadcast this check-in to. Accepts a comma-delimited + alt: + description: Altitude of the user's location, in meters. [Optional] + example: 0 + altAcc: + description: Vertical accuracy of the user's location, in meters. + example: 1 + broadcast: + description: >- + Who to broadcast this check-in to. Accepts a comma-delimited list of values: private (off the grid) or public (share with friends), facebook share on facebook, twitter share on twitter, followers share with followers (celebrity mode users only), If no valid value is found, the default is public. - [Optional]', example: 'public,twitter'} - eventId: {description: 'The event the user is checking in to. [Optional]', example: UHR8THISVNT} - ll: {description: 'Latitude and longitude of the user''s location. Only specify + [Optional] + example: "public,twitter" + eventId: + description: The event the user is checking in to. [Optional] + example: UHR8THISVNT + ll: + description: >- + Latitude and longitude of the user's location. Only specify this field if you have a GPS or other device reported location for the user - at the time of check-in. [Optional]', example: '33.7,44.2'} - llAcc: {description: 'Accuracy of the user''s latitude and longitude, in meters. - [Optional]', example: 1} - mentions: {description: 'Mentions in your check-in. This parameter is a semicolon-delimited + at the time of check-in. [Optional] + example: "33.7,44.2" + llAcc: + description: Accuracy of the user's latitude and longitude, in meters. [Optional] + example: 1 + mentions: + description: >- + Mentions in your check-in. This parameter is a semicolon-delimited list of mentions. A single mention is of the form "start,end,userid", where start is the index of the first character in the shout representing the mention, end is the index of the first character in the shout after the mention, and userid is the userid of the user being mentioned. If userid is prefixed with "fbu-", this indicates a Facebook userid that is being mention. Character - indices in shouts are 0-based. [Optional]', example: '5,10,HZXXY3Y;15,20,GZYYZ3Z;25,30,fbu-GZXY13Y'} - shout: {description: 'A message about your check-in. The maximum length of this - field is 140 characters. [Optional]', example: There are crayons! Crayons!} - venueId: {description: 'The Foursquare venue where the user is checking in. [Required]', - example: IHR8THISVNU} + indices in shouts are 0-based. [Optional] + example: "5,10,HZXXY3Y;15,20,GZYYZ3Z;25,30,fbu-GZXY13Y" + shout: + description: A message about your check-in. The maximum length of this field is 140 characters. [Optional] + example: There are crayons! Crayons! + venueId: + description: The Foursquare venue where the user is checking in. [Required] + example: IHR8THISVNU diff --git a/homeassistant/components/google/services.yaml b/homeassistant/components/google/services.yaml index 048e886dc4e5..702b8347676d 100644 --- a/homeassistant/components/google/services.yaml +++ b/homeassistant/components/google/services.yaml @@ -7,25 +7,25 @@ add_event: fields: calendar_id: description: The id of the calendar you want. - example: 'Your email' + example: "Your email" summary: description: Acts as the title of the event. - example: 'Bowling' + example: "Bowling" description: description: The description of the event. Optional. - example: 'Birthday bowling' + example: "Birthday bowling" start_date_time: description: The date and time the event should start. - example: '2019-03-22 20:00:00' + example: "2019-03-22 20:00:00" end_date_time: description: The date and time the event should end. - example: '2019-03-22 22:00:00' + example: "2019-03-22 22:00:00" start_date: description: The date the whole day event should start. - example: '2019-03-10' + example: "2019-03-10" end_date: description: The date the whole day event should end. - example: '2019-03-11' + example: "2019-03-11" in: description: Days or weeks that you want to create the event in. - example: '"days": 2 or "weeks": 2' \ No newline at end of file + example: '"days": 2 or "weeks": 2' diff --git a/homeassistant/components/group/services.yaml b/homeassistant/components/group/services.yaml index 98b0cef69c34..cec4f187ca68 100644 --- a/homeassistant/components/group/services.yaml +++ b/homeassistant/components/group/services.yaml @@ -1,5 +1,4 @@ # Describes the format for available group services - reload: description: Reload group configuration. @@ -23,7 +22,7 @@ set: example: domain.entity_id1, domain.entity_id2 all: description: Enable this option if the group should only turn on when all entities are on. - example: True + example: true remove: description: Remove a user group. diff --git a/homeassistant/components/habitica/services.yaml b/homeassistant/components/habitica/services.yaml index a063b1577f5c..20794b4c47bf 100644 --- a/homeassistant/components/habitica/services.yaml +++ b/homeassistant/components/habitica/services.yaml @@ -1,12 +1,10 @@ # Describes the format for Habitica service - ---- api_call: description: Call Habitica api fields: name: description: Habitica's username to call for - example: 'xxxNotAValidNickxxx' + example: "xxxNotAValidNickxxx" path: description: "Items from API URL in form of an array with method attached at the end. Consult https://habitica.com/apidoc/. Example uses https://habitica.com/apidoc/#api-Task-CreateUserTasks" example: '["tasks", "user", "post"]' diff --git a/homeassistant/components/hangouts/services.yaml b/homeassistant/components/hangouts/services.yaml index 26a7193493b4..ff11762235d6 100644 --- a/homeassistant/components/hangouts/services.yaml +++ b/homeassistant/components/hangouts/services.yaml @@ -15,4 +15,4 @@ send_message: example: '{ "image_file": "file" } or { "image_url": "url" }' reconnect: - description: Reconnect the bot. \ No newline at end of file + description: Reconnect the bot. diff --git a/homeassistant/components/harmony/services.yaml b/homeassistant/components/harmony/services.yaml index 1b9ae225c7f8..f20f0494a5f7 100644 --- a/homeassistant/components/harmony/services.yaml +++ b/homeassistant/components/harmony/services.yaml @@ -3,14 +3,14 @@ sync: fields: entity_id: description: Name(s) of entities to sync. - example: 'remote.family_room' + example: "remote.family_room" change_channel: description: Sends change channel command to the Harmony HUB fields: entity_id: description: Name(s) of Harmony remote entities to send change channel command to - example: 'remote.family_room' + example: "remote.family_room" channel: description: Channel number to change to - example: '200' \ No newline at end of file + example: "200" diff --git a/homeassistant/components/hdmi_cec/services.yaml b/homeassistant/components/hdmi_cec/services.yaml index 63aee6680622..256b26c00c75 100644 --- a/homeassistant/components/hdmi_cec/services.yaml +++ b/homeassistant/components/hdmi_cec/services.yaml @@ -1,32 +1,44 @@ -power_on: {description: Power on all devices which supports it.} +power_on: { description: Power on all devices which supports it. } select_device: description: Select HDMI device. fields: - device: {description: 'Address of device to select. Can be entity_id, physical - address or alias from configuration.', example: '"switch.hdmi_1" or "1.1.0.0" - or "01:10"'} + device: + description: Address of device to select. Can be entity_id, physical address or alias from configuration. + example: '"switch.hdmi_1" or "1.1.0.0" or "01:10"' send_command: description: Sends CEC command into HDMI CEC capable adapter. fields: att: description: Optional parameters. example: [0, 2] - cmd: {description: 'Command itself. Could be decimal number or string with hexadeximal - notation: "0x10".', example: 144 or "0x90"} - dst: {description: 'Destination for command. Could be decimal number or string - with hexadeximal notation: "0x10".', example: 5 or "0x5"} - raw: {description: 'Raw CEC command in format "00:00:00:00" where first two digits + cmd: + description: 'Command itself. Could be decimal number or string with hexadeximal notation: "0x10".' + example: 144 or "0x90" + dst: + description: 'Destination for command. Could be decimal number or string with hexadeximal notation: "0x10".' + example: 5 or "0x5" + raw: + description: >- + Raw CEC command in format "00:00:00:00" where first two digits are source and destination, second byte is command and optional other bytes - are command parameters. If raw command specified, other params are ignored.', - example: '"10:36"'} - src: {description: 'Source of command. Could be decimal number or string with - hexadeximal notation: "0x10".', example: 12 or "0xc"} -standby: {description: Standby all devices which supports it.} -update: {description: Update devices state from network.} + are command parameters. If raw command specified, other params are ignored. + example: '"10:36"' + src: + description: 'Source of command. Could be decimal number or string with hexadeximal notation: "0x10".' + example: 12 or "0xc" +standby: + description: Standby all devices which supports it. +update: + description: Update devices state from network. volume: description: Increase or decrease volume of system. fields: - down: {description: Decreases volume x levels., example: 3} - mute: {description: 'Mutes audio system. Value should be on, off or toggle.', - example: toggle} - up: {description: Increases volume x levels., example: 3} + down: + description: Decreases volume x levels. + example: 3 + mute: + description: Mutes audio system. Value should be on, off or toggle. + example: toggle + up: + description: Increases volume x levels. + example: 3 diff --git a/homeassistant/components/heos/services.yaml b/homeassistant/components/heos/services.yaml index 8274240368f8..0fe0518323f5 100644 --- a/homeassistant/components/heos/services.yaml +++ b/homeassistant/components/heos/services.yaml @@ -3,10 +3,10 @@ sign_in: fields: username: description: The username or email of the HEOS account. [Required] - example: 'example@example.com' + example: "example@example.com" password: description: The password of the HEOS account. [Required] - example: 'password' + example: "password" sign_out: - description: Sign the controller out of the HEOS account. \ No newline at end of file + description: Sign the controller out of the HEOS account. diff --git a/homeassistant/components/hive/services.yaml b/homeassistant/components/hive/services.yaml index 6513d76ca899..f09baea7655f 100644 --- a/homeassistant/components/hive/services.yaml +++ b/homeassistant/components/hive/services.yaml @@ -1,27 +1,24 @@ boost_heating: - description: "Set the boost mode ON defining the period of time and the desired target temperature - for the boost." + description: Set the boost mode ON defining the period of time and the desired target temperature for the boost. fields: entity_id: - { - description: Enter the entity_id for the device required to set the boost mode., - example: "climate.heating", - } + description: Enter the entity_id for the device required to set the boost mode. + example: "climate.heating" time_period: - { description: Set the time period for the boost., example: "01:30:00" } + description: Set the time period for the boost. + example: "01:30:00" temperature: - { - description: Set the target temperature for the boost period., - example: "20.5", - } + description: Set the target temperature for the boost period. + example: "20.5" boost_hot_water: - description: - "Set the boost mode ON or OFF defining the period of time for the boost." + description: "Set the boost mode ON or OFF defining the period of time for the boost." fields: entity_id: - { - description: Enter the entity_id for the device reuired to set the boost mode., - example: "water_heater.hot_water", - } - time_period: { description: Set the time period for the boost., example: "01:30:00" } - on_off: { description: Set the boost function on or off., example: "on" } + description: Enter the entity_id for the device reuired to set the boost mode. + example: "water_heater.hot_water" + time_period: + description: Set the time period for the boost. + example: "01:30:00" + on_off: + description: Set the boost function on or off. + example: "on" diff --git a/homeassistant/components/homematicip_cloud/services.yaml b/homeassistant/components/homematicip_cloud/services.yaml index 750528eddf89..20447e496f70 100644 --- a/homeassistant/components/homematicip_cloud/services.yaml +++ b/homeassistant/components/homematicip_cloud/services.yaml @@ -62,13 +62,13 @@ dump_hap_config: fields: config_output_path: description: (Default is 'Your home-assistant config directory') Path where to store the config. - example: '/config' + example: "/config" config_output_file_prefix: description: (Default is 'hmip-config') Name of the config file. The SGTIN of the AP will always be appended. - example: 'hmip-config' + example: "hmip-config" anonymize: description: (Default is True) Should the Configuration be anonymized? - example: True + example: true reset_energy_counter: description: Reset the energy counter of a measuring entity. diff --git a/homeassistant/components/ihc/ihc_auto_setup.yaml b/homeassistant/components/ihc/ihc_auto_setup.yaml index 6b5003a04b5c..d5f8d26e2b79 100644 --- a/homeassistant/components/ihc/ihc_auto_setup.yaml +++ b/homeassistant/components/ihc/ihc_auto_setup.yaml @@ -3,96 +3,95 @@ # folder and make your changes. binary_sensor: - # Magnet contact - - xpath: './/product_dataline[@product_identifier="_0x2109"]' - node: 'dataline_input' - type: 'opening' - inverting: True - # Pir sensors - - xpath: './/product_dataline[@product_identifier="_0x210e"]' - node: 'dataline_input[1]' - type: 'motion' - # Pir sensors twilight sensor - - xpath: './/product_dataline[@product_identifier="_0x0"]' - node: 'dataline_input[1]' - type: 'motion' - # Pir sensors alarm - - xpath: './/product_dataline[@product_identifier="_0x210f"]' - node: 'dataline_input' - type: 'motion' - # Smoke detector - - xpath: './/product_dataline[@product_identifier="_0x210a"]' - node: 'dataline_input' - type: 'smoke' - # leak detector - - xpath: './/product_dataline[@product_identifier="_0x210c"]' - node: 'dataline_input' - type: 'moisture' - # light detector - - xpath: './/product_dataline[@product_identifier="_0x2110"]' - node: 'dataline_input' - type: 'light' + # Magnet contact + - xpath: './/product_dataline[@product_identifier="_0x2109"]' + node: "dataline_input" + type: "opening" + inverting: true + # Pir sensors + - xpath: './/product_dataline[@product_identifier="_0x210e"]' + node: "dataline_input[1]" + type: "motion" + # Pir sensors twilight sensor + - xpath: './/product_dataline[@product_identifier="_0x0"]' + node: "dataline_input[1]" + type: "motion" + # Pir sensors alarm + - xpath: './/product_dataline[@product_identifier="_0x210f"]' + node: "dataline_input" + type: "motion" + # Smoke detector + - xpath: './/product_dataline[@product_identifier="_0x210a"]' + node: "dataline_input" + type: "smoke" + # leak detector + - xpath: './/product_dataline[@product_identifier="_0x210c"]' + node: "dataline_input" + type: "moisture" + # light detector + - xpath: './/product_dataline[@product_identifier="_0x2110"]' + node: "dataline_input" + type: "light" light: - # Wireless Combi dimmer 4 buttons - - xpath: './/product_airlink[@product_identifier="_0x4406"]' - node: 'airlink_dimming' - dimmable: True - # Wireless Lamp outlet dimmer - - xpath: './/product_airlink[@product_identifier="_0x4304"]' - node: 'airlink_dimming' - dimmable: True - # Wireless universal dimmer - - xpath: './/product_airlink[@product_identifier="_0x4306"]' - node: 'airlink_dimming' - dimmable: True - # Wireless Lamp outlet relay - - xpath: './/product_airlink[@product_identifier="_0x4202"]' - node: 'airlink_relay' - # Wireless Combi relay 4 buttons - - xpath: './/product_airlink[@product_identifier="_0x4404"]' - node: 'airlink_relay' - # Dataline Lamp outlet - - xpath: './/product_dataline[@product_identifier="_0x2202"]' - node: 'dataline_output' - # Mobile Wireless dimmer - - xpath: './/product_airlink[@product_identifier="_0x4303"]' - node: 'airlink_dimming' - dimmable: True + # Wireless Combi dimmer 4 buttons + - xpath: './/product_airlink[@product_identifier="_0x4406"]' + node: "airlink_dimming" + dimmable: true + # Wireless Lamp outlet dimmer + - xpath: './/product_airlink[@product_identifier="_0x4304"]' + node: "airlink_dimming" + dimmable: true + # Wireless universal dimmer + - xpath: './/product_airlink[@product_identifier="_0x4306"]' + node: "airlink_dimming" + dimmable: true + # Wireless Lamp outlet relay + - xpath: './/product_airlink[@product_identifier="_0x4202"]' + node: "airlink_relay" + # Wireless Combi relay 4 buttons + - xpath: './/product_airlink[@product_identifier="_0x4404"]' + node: "airlink_relay" + # Dataline Lamp outlet + - xpath: './/product_dataline[@product_identifier="_0x2202"]' + node: "dataline_output" + # Mobile Wireless dimmer + - xpath: './/product_airlink[@product_identifier="_0x4303"]' + node: "airlink_dimming" + dimmable: true sensor: - # Temperature sensor - - xpath: './/product_dataline[@product_identifier="_0x2124"]' - node: 'resource_temperature' - unit_of_measurement: '°C' - # Humidity/temperature - - xpath: './/product_dataline[@product_identifier="_0x2135"]' - node: 'resource_humidity_level' - unit_of_measurement: '%' - # Humidity/temperature - - xpath: './/product_dataline[@product_identifier="_0x2135"]' - node: 'resource_temperature' - unit_of_measurement: '°C' - # Lux/temperature - - xpath: './/product_dataline[@product_identifier="_0x2136"]' - node: 'resource_light' - unit_of_measurement: 'Lux' - # Lux/temperature - - xpath: './/product_dataline[@product_identifier="_0x2136"]' - node: 'resource_temperature' - unit_of_measurement: '°C' + # Temperature sensor + - xpath: './/product_dataline[@product_identifier="_0x2124"]' + node: "resource_temperature" + unit_of_measurement: "°C" + # Humidity/temperature + - xpath: './/product_dataline[@product_identifier="_0x2135"]' + node: "resource_humidity_level" + unit_of_measurement: "%" + # Humidity/temperature + - xpath: './/product_dataline[@product_identifier="_0x2135"]' + node: "resource_temperature" + unit_of_measurement: "°C" + # Lux/temperature + - xpath: './/product_dataline[@product_identifier="_0x2136"]' + node: "resource_light" + unit_of_measurement: "Lux" + # Lux/temperature + - xpath: './/product_dataline[@product_identifier="_0x2136"]' + node: "resource_temperature" + unit_of_measurement: "°C" switch: - # Wireless Plug outlet - - xpath: './/product_airlink[@product_identifier="_0x4201"]' - node: 'airlink_relay' - # Dataline universal relay - - xpath: './/product_airlink[@product_identifier="_0x4203"]' - node: 'airlink_relay' - # Dataline plug outlet - - xpath: './/product_dataline[@product_identifier="_0x2201"]' - node: 'dataline_output' - # Wireless mobile relay - - xpath: './/product_airlink[@product_identifier="_0x4204"]' - node: 'airlink_relay' - + # Wireless Plug outlet + - xpath: './/product_airlink[@product_identifier="_0x4201"]' + node: "airlink_relay" + # Dataline universal relay + - xpath: './/product_airlink[@product_identifier="_0x4203"]' + node: "airlink_relay" + # Dataline plug outlet + - xpath: './/product_dataline[@product_identifier="_0x2201"]' + node: "dataline_output" + # Wireless mobile relay + - xpath: './/product_airlink[@product_identifier="_0x4204"]' + node: "airlink_relay" diff --git a/homeassistant/components/ihc/services.yaml b/homeassistant/components/ihc/services.yaml index 0a78c45d7b23..ad41539162cc 100644 --- a/homeassistant/components/ihc/services.yaml +++ b/homeassistant/components/ihc/services.yaml @@ -28,4 +28,4 @@ pulse: description: Pulses an input on the IHC controller. fields: ihc_id: - description: The integer IHC resource ID. \ No newline at end of file + description: The integer IHC resource ID. diff --git a/homeassistant/components/input_datetime/services.yaml b/homeassistant/components/input_datetime/services.yaml index 4c5c998d0a52..26b2d088aea7 100644 --- a/homeassistant/components/input_datetime/services.yaml +++ b/homeassistant/components/input_datetime/services.yaml @@ -1,14 +1,18 @@ set_datetime: description: This can be used to dynamically set the date and/or time. fields: - entity_id: {description: Entity id of the input datetime to set the new value., - example: input_datetime.test_date_time} - date: {description: The target date the entity should be set to. Do not use with datetime., - example: '"2019-04-20"'} - time: {description: The target time the entity should be set to. Do not use with datetime., - example: '"05:04:20"'} - datetime: {description: The target date & time the entity should be set to. Do not use with date or time., - example: '"2019-04-20 05:04:20"'} + entity_id: + description: Entity id of the input datetime to set the new value. + example: input_datetime.test_date_time + date: + description: The target date the entity should be set to. Do not use with datetime. + example: '"2019-04-20"' + time: + description: The target time the entity should be set to. Do not use with datetime. + example: '"05:04:20"' + datetime: + description: The target date & time the entity should be set to. Do not use with date or time. + example: '"2019-04-20 05:04:20"' reload: description: Reload the input_datetime configuration. diff --git a/homeassistant/components/input_number/services.yaml b/homeassistant/components/input_number/services.yaml index 9cd1b913ccd3..76526b73e925 100644 --- a/homeassistant/components/input_number/services.yaml +++ b/homeassistant/components/input_number/services.yaml @@ -1,18 +1,23 @@ decrement: description: Decrement the value of an input number entity by its stepping. fields: - entity_id: {description: Entity id of the input number the should be decremented., - example: input_number.threshold} + entity_id: + description: Entity id of the input number the should be decremented. + example: input_number.threshold increment: description: Increment the value of an input number entity by its stepping. fields: - entity_id: {description: Entity id of the input number the should be incremented., - example: input_number.threshold} + entity_id: + description: Entity id of the input number the should be incremented. + example: input_number.threshold set_value: description: Set the value of an input number entity. fields: - entity_id: {description: Entity id of the input number to set the new value., - example: input_number.threshold} - value: {description: The target value the entity should be set to., example: 42} + entity_id: + description: Entity id of the input number to set the new value. + example: input_number.threshold + value: + description: The target value the entity should be set to. + example: 42 reload: description: Reload the input_number configuration. diff --git a/homeassistant/components/insteon/services.yaml b/homeassistant/components/insteon/services.yaml index 9c8d32371144..3d232569e9c2 100644 --- a/homeassistant/components/insteon/services.yaml +++ b/homeassistant/components/insteon/services.yaml @@ -6,7 +6,7 @@ add_all_link: example: 1 mode: description: Linking mode controller - IM is controller responder - IM is responder - example: 'controller' + example: "controller" delete_all_link: description: Tells the Insteon Modem (IM) to remove an All-Link record from the All-Link Database of the IM and a device. Once the IM is set to delete the link, press the link button on the corresponding device to complete the process. fields: @@ -18,16 +18,16 @@ load_all_link_database: fields: entity_id: description: Name of the device to load. Use "all" to load the database of all devices. - example: 'light.1a2b3c' + example: "light.1a2b3c" reload: description: Reload all records. If true the current records are cleared from memory (does not effect the device) and the records are reloaded. If false the existing records are left in place and only missing records are added. Default is false. - example: 'true' + example: "true" print_all_link_database: description: Print the All-Link Database for a device. Requires that the All-Link Database is loaded into memory. fields: entity_id: description: Name of the device to print - example: 'light.1a2b3c' + example: "light.1a2b3c" print_im_all_link_database: description: Print the All-Link Database for the INSTEON Modem (IM). x10_all_units_off: @@ -59,4 +59,4 @@ scene_off: fields: group: description: INSTEON group or scene number - example: 26 \ No newline at end of file + example: 26 diff --git a/homeassistant/components/iperf3/services.yaml b/homeassistant/components/iperf3/services.yaml index c333d7c74c85..a3f645f5085a 100644 --- a/homeassistant/components/iperf3/services.yaml +++ b/homeassistant/components/iperf3/services.yaml @@ -3,4 +3,4 @@ speedtest: fields: host: description: The host name of the iperf3 server (already configured) to run a test with. - example: 'iperf.he.net' \ No newline at end of file + example: "iperf.he.net" diff --git a/homeassistant/components/lcn/services.yaml b/homeassistant/components/lcn/services.yaml index 80c636577f8c..89fe884fa9aa 100644 --- a/homeassistant/components/lcn/services.yaml +++ b/homeassistant/components/lcn/services.yaml @@ -5,7 +5,7 @@ output_abs: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" output: description: Output port example: "output1" @@ -21,7 +21,7 @@ output_rel: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" output: description: Output port example: "output1" @@ -37,7 +37,7 @@ output_toggle: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" output: description: Output port example: "output1" @@ -50,7 +50,7 @@ relays: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" state: description: Relays states as string (1=on, 2=off, t=toggle, -=nochange) example: "t---001-" @@ -60,16 +60,16 @@ led: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" led: description: Led example: "led6" state: description: Led state - example: 'blink' + example: "blink" values: - - on - - off + - "on" + - "off" - blink - flicker @@ -78,45 +78,45 @@ var_abs: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" variable: description: Variable or setpoint name - example: 'var1' + example: "var1" value: description: Value to set - example: '50' + example: "50" unit_of_measurement: description: Unit of value - example: 'celsius' + example: "celsius" var_reset: description: Reset value of variable or setpoint. fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" variable: description: Variable or setpoint name - example: 'var1' + example: "var1" var_rel: description: Shift value of a variable, setpoint or threshold. fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" variable: description: Variable or setpoint name - example: 'var1' + example: "var1" value: description: Shift value - example: '50' + example: "50" unit_of_measurement: description: Unit of value - example: 'celsius' + example: "celsius" value_reference: description: Reference value (current or programmed) for setpoint and threshold - example: 'current' + example: "current" values: - current - prog @@ -126,10 +126,10 @@ lock_regulator: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" setpoint: description: Setpoint name - example: 'r1varsetpoint' + example: "r1varsetpoint" state: description: New setpoint state example: true @@ -139,13 +139,13 @@ send_keys: fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" keys: description: Keys to send - example: 'a1a5d8' + example: "a1a5d8" state: - description: 'Key state upon sending (optional, must be hit for deferred)' - example: 'hit' + description: "Key state upon sending (optional, must be hit for deferred)" + example: "hit" values: - hit - make @@ -155,46 +155,46 @@ send_keys: example: 10 time_unit: description: Time unit of send delay (optional) - example: 's' + example: "s" lock_keys: description: Lock keys. fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" table: - description: 'Table with keys to lock (optional, must be A for interval).' - example: 'A5' + description: "Table with keys to lock (optional, must be A for interval)." + example: "A5" state: description: Key lock states as string (1=on, 2=off, T=toggle, -=nochange) - example: '1---t0--' + example: "1---t0--" time: description: Lock interval (optional) example: 10 time_unit: description: Time unit of lock interval (optional) - example: 's' + example: "s" dyn_text: description: Send dynamic text to LCN-GTxD displays. fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" row: description: Text row 1..4 (support of 4 independent text rows) example: 1 text: description: Text to send (up to 60 characters encoded as UTF-8) - example: 'text up to 60 characters' + example: "text up to 60 characters" pck: description: Send arbitrary PCK command. fields: address: description: Module address - example: 'myhome.s0.m7' + example: "myhome.s0.m7" pck: description: PCK command (without address header) - example: 'PIN4' + example: "PIN4" diff --git a/homeassistant/components/lifx/services.yaml b/homeassistant/components/lifx/services.yaml index ebf2032a9a51..0ea0cb7a6967 100644 --- a/homeassistant/components/lifx/services.yaml +++ b/homeassistant/components/lifx/services.yaml @@ -17,7 +17,7 @@ set_state: example: 10 power: description: Turn the light on (True) or off (False). Leave out to keep the power as it is. - example: True + example: false effect_pulse: description: Run a flash effect by changing to a color and back. @@ -45,7 +45,7 @@ effect_pulse: example: 2 power_on: description: Powered off lights are temporarily turned on during the effect (default True). - example: False + example: false effect_colorloop: description: Run an effect with looping colors. @@ -67,7 +67,7 @@ effect_colorloop: example: 0 power_on: description: Powered off lights are temporarily turned on during the effect (default True). - example: False + example: false effect_stop: description: Stop a running effect. diff --git a/homeassistant/components/logbook/services.yaml b/homeassistant/components/logbook/services.yaml index 08c463feed25..fb1736d7784b 100644 --- a/homeassistant/components/logbook/services.yaml +++ b/homeassistant/components/logbook/services.yaml @@ -12,4 +12,4 @@ log: example: "light.kitchen" domain: description: Icon of domain to display in custom logbook entry [Optional] - example: "light" \ No newline at end of file + example: "light" diff --git a/homeassistant/components/matrix/services.yaml b/homeassistant/components/matrix/services.yaml index 03c441a39ec2..f8b0c53bda63 100644 --- a/homeassistant/components/matrix/services.yaml +++ b/homeassistant/components/matrix/services.yaml @@ -3,7 +3,7 @@ send_message: fields: message: description: The message to be sent. - example: 'This is a message I am sending to matrix' + example: This is a message I am sending to matrix target: description: A list of room(s) to send the message to. - example: '#hasstest:matrix.org' \ No newline at end of file + example: "#hasstest:matrix.org" diff --git a/homeassistant/components/media_extractor/services.yaml b/homeassistant/components/media_extractor/services.yaml index c5588c341340..17abffee89d3 100644 --- a/homeassistant/components/media_extractor/services.yaml +++ b/homeassistant/components/media_extractor/services.yaml @@ -1,13 +1,12 @@ play_media: description: Downloads file from given url. fields: - entity_id: + entity_id: description: Name(s) of entities to play media on. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" media_content_id: description: The ID of the content to play. Platform dependent. - example: 'https://soundcloud.com/bruttoband/brutto-11' + example: "https://soundcloud.com/bruttoband/brutto-11" media_content_type: description: The type of the content to play. Must be one of MUSIC, TVSHOW, VIDEO, EPISODE, CHANNEL or PLAYLIST MUSIC. - example: 'music' - + example: "music" diff --git a/homeassistant/components/mill/services.yaml b/homeassistant/components/mill/services.yaml index e9e59b50170f..5223bf9c8903 100644 --- a/homeassistant/components/mill/services.yaml +++ b/homeassistant/components/mill/services.yaml @@ -3,7 +3,7 @@ set_room_temperature: fields: room_name: description: Name of room to change. - example: 'kitchen' + example: "kitchen" away_temp: description: Away temp. example: 12 @@ -12,4 +12,4 @@ set_room_temperature: example: 22 sleep_temp: description: Sleep temp. - example: 17 \ No newline at end of file + example: 17 diff --git a/homeassistant/components/mysensors/services.yaml b/homeassistant/components/mysensors/services.yaml index 74a5ff0f183f..a93429550cd8 100644 --- a/homeassistant/components/mysensors/services.yaml +++ b/homeassistant/components/mysensors/services.yaml @@ -3,7 +3,7 @@ send_ir_code: fields: entity_id: description: Name(s) of entities that should have the IR code set and be turned on. Platform dependent. - example: 'switch.living_room_1_1' + example: "switch.living_room_1_1" V_IR_SEND: description: IR code to send. - example: '0xC284' \ No newline at end of file + example: "0xC284" diff --git a/homeassistant/components/neato/services.yaml b/homeassistant/components/neato/services.yaml index b40edabd7796..2c5b2bd3181d 100644 --- a/homeassistant/components/neato/services.yaml +++ b/homeassistant/components/neato/services.yaml @@ -3,7 +3,7 @@ custom_cleaning: fields: entity_id: description: Name of the vacuum entity. [Required] - example: 'vacuum.neato' + example: "vacuum.neato" mode: description: "Set the cleaning mode: 1 for eco and 2 for turbo. Defaults to turbo if not set." example: 2 @@ -15,4 +15,4 @@ custom_cleaning: example: 2 zone: description: Only supported on the Botvac D7. Name of the zone to clean. Defaults to no zone i.e. complete house cleanup. - example: "Kitchen" \ No newline at end of file + example: "Kitchen" diff --git a/homeassistant/components/ness_alarm/services.yaml b/homeassistant/components/ness_alarm/services.yaml index 27f8ba383dde..eb35c48b9f44 100644 --- a/homeassistant/components/ness_alarm/services.yaml +++ b/homeassistant/components/ness_alarm/services.yaml @@ -16,4 +16,4 @@ panic: fields: code: description: The user code to use to trigger the panic. - example: 1234 \ No newline at end of file + example: 1234 diff --git a/homeassistant/components/nexia/services.yaml b/homeassistant/components/nexia/services.yaml index 725b215da5a6..23a9498746bf 100644 --- a/homeassistant/components/nexia/services.yaml +++ b/homeassistant/components/nexia/services.yaml @@ -5,7 +5,7 @@ set_aircleaner_mode: description: "This setting will affect all zones connected to the thermostat." example: climate.master_bedroom aircleaner_mode: - description: "The air cleaner mode to set. Options include \"auto\", \"quick\", or \"allergy\"." + description: 'The air cleaner mode to set. Options include "auto", "quick", or "allergy".' example: allergy set_humidify_setpoint: @@ -16,4 +16,4 @@ set_humidify_setpoint: example: climate.master_bedroom humidity: description: "The humidification setpoint as an int, range 35-65." - example: 45 \ No newline at end of file + example: 45 diff --git a/homeassistant/components/nuimo_controller/services.yaml b/homeassistant/components/nuimo_controller/services.yaml index ba537544a3b9..d98659caa8b1 100644 --- a/homeassistant/components/nuimo_controller/services.yaml +++ b/homeassistant/components/nuimo_controller/services.yaml @@ -3,16 +3,15 @@ led_matrix: fields: matrix: description: "A string representation of the matrix to be displayed. See the SDK documentation for more info: https://github.com/getSenic/nuimo-linux-python#write-to-nuimos-led-matrix" - example: - '........ - 0000000. - .000000. - ..00000. - .0.0000. - .00.000. - .000000. - .000000. - ........' + example: "........ + 0000000. + .000000. + ..00000. + .0.0000. + .00.000. + .000000. + .000000. + ........" interval: description: Display interval in seconds - example: 0.5 \ No newline at end of file + example: 0.5 diff --git a/homeassistant/components/ombi/services.yaml b/homeassistant/components/ombi/services.yaml index 5f4f2defe320..6c7f5ced4893 100644 --- a/homeassistant/components/ombi/services.yaml +++ b/homeassistant/components/ombi/services.yaml @@ -1,5 +1,4 @@ # Ombi services.yaml entries - submit_movie_request: description: Searches for a movie and requests the first result. fields: @@ -7,7 +6,6 @@ submit_movie_request: description: Search parameter example: "beverly hills cop" - submit_tv_request: description: Searches for a TV show and requests the first result. fields: @@ -18,10 +16,9 @@ submit_tv_request: description: Which season(s) to request (first, latest or all) example: "latest" - submit_music_request: description: Searches for a music album and requests the first result. fields: name: description: Search parameter - example: "nevermind" \ No newline at end of file + example: "nevermind" diff --git a/homeassistant/components/openuv/services.yaml b/homeassistant/components/openuv/services.yaml index be9a7ba522f6..ea353e848929 100644 --- a/homeassistant/components/openuv/services.yaml +++ b/homeassistant/components/openuv/services.yaml @@ -1,6 +1,4 @@ # Describes the format for available OpenUV services - ---- update_data: description: Request new data from OpenUV. Consumes two API calls. diff --git a/homeassistant/components/pi_hole/services.yaml b/homeassistant/components/pi_hole/services.yaml index e3cc8624e368..9bb31b1723f0 100644 --- a/homeassistant/components/pi_hole/services.yaml +++ b/homeassistant/components/pi_hole/services.yaml @@ -4,7 +4,7 @@ disable: duration: description: Time that the Pi-hole should be disabled for example: "00:00:15" - name: + name: description: "[Optional] When multiple Pi-holes are configured, the name of the one to disable. If omitted, all configured Pi-holes will be disabled." example: "Pi-Hole" enable: @@ -12,4 +12,4 @@ enable: fields: name: description: "[Optional] When multiple Pi-holes are configured, the name of the one to enable. If omitted, all configured Pi-holes will be enabled." - example: "Pi-Hole" \ No newline at end of file + example: "Pi-Hole" diff --git a/homeassistant/components/qvr_pro/services.yaml b/homeassistant/components/qvr_pro/services.yaml index cc6866fee63f..0f305d1fa8d6 100644 --- a/homeassistant/components/qvr_pro/services.yaml +++ b/homeassistant/components/qvr_pro/services.yaml @@ -3,11 +3,11 @@ start_record: fields: guid: description: GUID of the channel to start recording. - example: '245EBE933C0A597EBE865C0A245E0002' + example: "245EBE933C0A597EBE865C0A245E0002" stop_record: description: Stop QVR Pro recording on specified channel. fields: guid: description: GUID of the channel to stop recording. - example: '245EBE933C0A597EBE865C0A245E0002' \ No newline at end of file + example: "245EBE933C0A597EBE865C0A245E0002" diff --git a/homeassistant/components/rainmachine/services.yaml b/homeassistant/components/rainmachine/services.yaml index 288161968ded..e66bd2a1d145 100644 --- a/homeassistant/components/rainmachine/services.yaml +++ b/homeassistant/components/rainmachine/services.yaml @@ -1,6 +1,4 @@ # Describes the format for available RainMachine services - ---- disable_program: description: Disable a program. fields: diff --git a/homeassistant/components/remember_the_milk/services.yaml b/homeassistant/components/remember_the_milk/services.yaml index 74a2c3a4d4fc..448b35a3a04b 100644 --- a/homeassistant/components/remember_the_milk/services.yaml +++ b/homeassistant/components/remember_the_milk/services.yaml @@ -1,24 +1,21 @@ # Describes the format for available Remember The Milk services create_task: - description: > + description: >- Create (or update) a new task in your Remember The Milk account. If you want to update a task later on, you have to set an "id" when creating the task. Note: Updating a tasks does not support the smart syntax. - fields: name: description: name of the new task, you can use the smart syntax here - example: 'do this ^today #from_hass' - + example: "do this ^today #from_hass" id: description: (optional) identifier for the task you're creating, can be used to update or complete the task later on example: myid complete_task: description: Complete a tasks that was privously created. - fields: id: description: identifier that was defined when creating the task - example: myid \ No newline at end of file + example: myid diff --git a/homeassistant/components/ring/services.yaml b/homeassistant/components/ring/services.yaml index a1500e1360f4..bcc9b2f7ff4e 100644 --- a/homeassistant/components/ring/services.yaml +++ b/homeassistant/components/ring/services.yaml @@ -1,2 +1,2 @@ update: - description: Updates the data we have for all your ring devices \ No newline at end of file + description: Updates the data we have for all your ring devices diff --git a/homeassistant/components/route53/services.yaml b/homeassistant/components/route53/services.yaml index 20dbfa77f7ac..3ca109fcb369 100644 --- a/homeassistant/components/route53/services.yaml +++ b/homeassistant/components/route53/services.yaml @@ -1,2 +1,2 @@ update_records: - description: Trigger update of records. \ No newline at end of file + description: Trigger update of records. diff --git a/homeassistant/components/simplisafe/services.yaml b/homeassistant/components/simplisafe/services.yaml index 6d01dfd8e469..e52af4f26651 100644 --- a/homeassistant/components/simplisafe/services.yaml +++ b/homeassistant/components/simplisafe/services.yaml @@ -1,6 +1,4 @@ # Describes the format for available SimpliSafe services - ---- remove_pin: description: Remove a PIN by its label or value. fields: diff --git a/homeassistant/components/snips/services.yaml b/homeassistant/components/snips/services.yaml index cca39062ce95..f06b94b9eaaf 100644 --- a/homeassistant/components/snips/services.yaml +++ b/homeassistant/components/snips/services.yaml @@ -1,31 +1,42 @@ feedback_off: description: Turns feedback sounds off. fields: - site_id: {description: 'Site to turn sounds on, defaults to all sites (optional)', - example: bedroom} + site_id: + description: Site to turn sounds on, defaults to all sites (optional) + example: bedroom feedback_on: description: Turns feedback sounds on. fields: - site_id: {description: 'Site to turn sounds on, defaults to all sites (optional)', - example: bedroom} + site_id: + description: Site to turn sounds on, defaults to all sites (optional) + example: bedroom say: description: Send a TTS message to Snips. fields: - custom_data: {description: custom data that will be included with all messages - in this session, example: user=UserName} - site_id: {description: 'Site to use to start session, defaults to default (optional)', - example: bedroom} - text: {description: Text to say., example: My name is snips} + custom_data: + description: custom data that will be included with all messages in this session + example: user=UserName + site_id: + description: Site to use to start session, defaults to default (optional) + example: bedroom + text: + description: Text to say. + example: My name is snips say_action: description: Send a TTS message to Snips to listen for a response. fields: - can_be_enqueued: {description: 'If True, session waits for an open session to - end, if False session is dropped if one is running', example: true} - custom_data: {description: custom data that will be included with all messages - in this session, example: user=UserName} - intent_filter: {description: Optional Array of Strings - A list of intents names - to restrict the NLU resolution to on the first query., example: 'turnOnLights, - turnOffLights'} - site_id: {description: 'Site to use to start session, defaults to default (optional)', - example: bedroom} - text: {description: Text to say, example: My name is snips} + can_be_enqueued: + description: If True, session waits for an open session to end, if False session is dropped if one is running + example: true + custom_data: + description: custom data that will be included with all messages in this session + example: user=UserName + intent_filter: + description: Optional Array of Strings - A list of intents names to restrict the NLU resolution to on the first query. + example: "turnOnLights, turnOffLights" + site_id: + description: Site to use to start session, defaults to default (optional) + example: bedroom + text: + description: Text to say + example: My name is snips diff --git a/homeassistant/components/speedtestdotnet/services.yaml b/homeassistant/components/speedtestdotnet/services.yaml index db813affe76a..299d457350d8 100644 --- a/homeassistant/components/speedtestdotnet/services.yaml +++ b/homeassistant/components/speedtestdotnet/services.yaml @@ -1,2 +1,2 @@ speedtest: - description: Immediately take a speedest with Speedtest.net \ No newline at end of file + description: Immediately take a speedest with Speedtest.net diff --git a/homeassistant/components/stream/services.yaml b/homeassistant/components/stream/services.yaml index c3b25e06348a..a8652335bf1a 100644 --- a/homeassistant/components/stream/services.yaml +++ b/homeassistant/components/stream/services.yaml @@ -5,11 +5,11 @@ record: description: The input source for the stream. example: "rtsp://my.stream.feed:554" filename: - description: The file name string. + description: The file name string. example: "/tmp/my_stream.mp4" duration: description: "Target recording length (in seconds). Default: 30" example: 30 lookback: description: "Target lookback period (in seconds) to include in addition to duration. Only available if there is currently an active HLS stream for stream_source. Default: 0" - example: 5 \ No newline at end of file + example: 5 diff --git a/homeassistant/components/streamlabswater/services.yaml b/homeassistant/components/streamlabswater/services.yaml index fa2a04c95864..63ab2be97599 100644 --- a/homeassistant/components/streamlabswater/services.yaml +++ b/homeassistant/components/streamlabswater/services.yaml @@ -1,4 +1,6 @@ set_away_mode: - description: 'Set the home/away mode for a Streamlabs Water Monitor.' + description: "Set the home/away mode for a Streamlabs Water Monitor." fields: - away_mode: {description: home or away, example: 'home'} \ No newline at end of file + away_mode: + description: home or away + example: "home" diff --git a/homeassistant/components/timer/services.yaml b/homeassistant/components/timer/services.yaml index b299aaa8185e..cd810c21de51 100644 --- a/homeassistant/components/timer/services.yaml +++ b/homeassistant/components/timer/services.yaml @@ -6,10 +6,10 @@ start: fields: entity_id: description: Entity id of the timer to start. [optional] - example: 'timer.timer0' + example: "timer.timer0" duration: description: Duration the timer requires to finish. [optional] - example: '00:01:00 or 60' + example: "00:01:00 or 60" pause: description: Pause a timer. @@ -17,7 +17,7 @@ pause: fields: entity_id: description: Entity id of the timer to pause. [optional] - example: 'timer.timer0' + example: "timer.timer0" cancel: description: Cancel a timer. @@ -25,7 +25,7 @@ cancel: fields: entity_id: description: Entity id of the timer to cancel. [optional] - example: 'timer.timer0' + example: "timer.timer0" finish: description: Finish a timer. @@ -33,4 +33,4 @@ finish: fields: entity_id: description: Entity id of the timer to finish. [optional] - example: 'timer.timer0' \ No newline at end of file + example: "timer.timer0" diff --git a/homeassistant/components/utility_meter/services.yaml b/homeassistant/components/utility_meter/services.yaml index 42522f81876f..d33229f4e560 100644 --- a/homeassistant/components/utility_meter/services.yaml +++ b/homeassistant/components/utility_meter/services.yaml @@ -5,31 +5,31 @@ reset: fields: entity_id: description: Name(s) of the utility meter to reset - example: 'utility_meter.energy' + example: "utility_meter.energy" next_tariff: description: Changes the tariff to the next one. fields: entity_id: description: Name(s) of entities to reset - example: 'utility_meter.energy' + example: "utility_meter.energy" select_tariff: description: selects the current tariff of an utility meter. fields: entity_id: description: Name of the entity to set the tariff for - example: 'utility_meter.energy' + example: "utility_meter.energy" tariff: description: Name of the tariff to switch to - example: 'offpeak' + example: "offpeak" calibrate: description: calibrates an utility meter. fields: entity_id: description: Name of the entity to calibrate - example: 'utility_meter.energy' + example: "utility_meter.energy" value: description: Value to which set the meter - example: '100' \ No newline at end of file + example: "100" diff --git a/homeassistant/components/vallox/services.yaml b/homeassistant/components/vallox/services.yaml index ea92e0ca2d9d..65757b703645 100644 --- a/homeassistant/components/vallox/services.yaml +++ b/homeassistant/components/vallox/services.yaml @@ -2,8 +2,7 @@ set_profile: description: Set the ventilation profile. fields: profile: - description: > - Set to any of: Home, Away, Boost, Fireplace + description: "Set to any of: Home, Away, Boost, Fireplace" example: Away set_profile_fan_speed_home: @@ -13,7 +12,6 @@ set_profile_fan_speed_home: description: Fan speed in %. Integer, between 0 and 100. example: 50 - set_profile_fan_speed_away: description: Set the fan speed of the Away profile. fields: diff --git a/homeassistant/components/velbus/services.yaml b/homeassistant/components/velbus/services.yaml index ea31b951a188..490c746fa74c 100644 --- a/homeassistant/components/velbus/services.yaml +++ b/homeassistant/components/velbus/services.yaml @@ -10,9 +10,9 @@ set_memo_text: description: > The module address in decimal format. The decimal addresses are displayed in front of the modules listed at the integration page. - example: '11' + example: "11" memo_text: description: > The actual text to be displayed. Text is limited to 64 characters. - example: 'Do not forget trash' \ No newline at end of file + example: "Do not forget trash" diff --git a/homeassistant/components/vesync/services.yaml b/homeassistant/components/vesync/services.yaml index 2174c974e161..dec19740aef2 100644 --- a/homeassistant/components/vesync/services.yaml +++ b/homeassistant/components/vesync/services.yaml @@ -1,2 +1,2 @@ update_devices: - description: Add new VeSync devices to Home Assistant \ No newline at end of file + description: Add new VeSync devices to Home Assistant diff --git a/homeassistant/components/webostv/services.yaml b/homeassistant/components/webostv/services.yaml index 1dfb3a6f1d3f..70aa94b6ea6c 100644 --- a/homeassistant/components/webostv/services.yaml +++ b/homeassistant/components/webostv/services.yaml @@ -1,35 +1,37 @@ -# Describes the format for available webostv services +# Describes the format for available webostv services button: - description: 'Send a button press command.' + description: "Send a button press command." fields: entity_id: description: Name(s) of the webostv entities where to run the API method. - example: 'media_player.living_room_tv' + example: "media_player.living_room_tv" button: - description: Name of the button to press. Known possible values are + description: >- + Name of the button to press. Known possible values are LEFT, RIGHT, DOWN, UP, HOME, BACK, ENTER, DASH, INFO, ASTERISK, CC, EXIT, MUTE, RED, GREEN, BLUE, VOLUMEUP, VOLUMEDOWN, CHANNELUP, CHANNELDOWN, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - example: 'LEFT' + example: "LEFT" command: - description: 'Send a command.' + description: "Send a command." fields: entity_id: description: Name(s) of the webostv entities where to run the API method. - example: 'media_player.living_room_tv' + example: "media_player.living_room_tv" command: - description: Endpoint of the command. Known valid endpoints are listed in + description: >- + Endpoint of the command. Known valid endpoints are listed in https://github.com/TheRealLink/pylgtv/blob/master/pylgtv/endpoints.py - example: 'media.controls/rewind' + example: "media.controls/rewind" select_sound_output: - description: 'Send the TV the command to change sound output.' + description: "Send the TV the command to change sound output." fields: entity_id: description: Name(s) of the webostv entities to change sound output on. - example: 'media_player.living_room_tv' + example: "media_player.living_room_tv" sound_output: description: Name of the sound output to switch to. - example: 'external_speaker' + example: "external_speaker" diff --git a/homeassistant/components/wink/services.yaml b/homeassistant/components/wink/services.yaml index 500f1fd3f2a7..ac050fd0087b 100644 --- a/homeassistant/components/wink/services.yaml +++ b/homeassistant/components/wink/services.yaml @@ -1,17 +1,16 @@ # Describes the format for available Wink services - pair_new_device: description: Pair a new device to a Wink Hub. fields: hub_name: description: The name of the hub to pair a new device to. - example: 'My hub' + example: "My hub" pairing_mode: description: One of ["zigbee", "zwave", "zwave_exclusion", "zwave_network_rediscovery", "lutron", "bluetooth", "kidde"]. - example: 'zigbee' + example: "zigbee" kidde_radio_code: - description: 'A string of 8 1s and 0s one for each dip switch on the kidde device left --> right = 1 --> 8. Down = 1 and Up = 0' - example: '10101010' + description: "A string of 8 1s and 0s one for each dip switch on the kidde device left --> right = 1 --> 8. Down = 1 and Up = 0" + example: "10101010" rename_wink_device: description: Rename the provided device. @@ -40,47 +39,55 @@ set_siren_volume: fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" volume: - description: Volume level. One of ["low", "medium", "high"]. - example: "high" + description: Volume level. One of ["low", "medium", "high"]. + example: "high" enable_chime: description: Enable the chime of a Dome siren with the provided sound. fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" tone: - description: The tone to use for the chime. One of ["doorbell", "fur_elise", "doorbell_extended", "alert", "william_tell", "rondo_alla_turca", "police_siren", "evacuation", "beep_beep", "beep", "inactive"] - example: "doorbell" + description: >- + The tone to use for the chime. One of ["doorbell", "fur_elise", + "doorbell_extended", "alert", "william_tell", "rondo_alla_turca", + "police_siren", "evacuation", "beep_beep", "beep", "inactive"] + example: "doorbell" set_siren_tone: description: Set the sound to use when the siren is enabled. (This doesn't enable the siren) fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" tone: - description: The tone to use for the chime. One of ["doorbell", "fur_elise", "doorbell_extended", "alert", "william_tell", "rondo_alla_turca", "police_siren", "evacuation", "beep_beep", "beep", "inactive"] - example: "alert" + description: >- + The tone to use for the chime. One of ["doorbell", "fur_elise", + "doorbell_extended", "alert", "william_tell", "rondo_alla_turca", + "police_siren", "evacuation", "beep_beep", "beep", "inactive"] + example: "alert" siren_set_auto_shutoff: description: How long to sound the siren before turning off. fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" auto_shutoff: - description: The time in seconds to sound the siren. One of [None, -1, 30, 60, 120] (None and -1 are forever. Use None for gocontrol, and -1 for Dome) - example: 60 + description: >- + The time in seconds to sound the siren. One of [None, -1, 30, 60, 120] + (None and -1 are forever. Use None for gocontrol, and -1 for Dome) + example: 60 set_siren_strobe_enabled: description: Enable or disable the strobe light when the siren is sounding. fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" enabled: description: "True or False" @@ -89,38 +96,38 @@ set_chime_strobe_enabled: fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" enabled: - description: "True or False" + description: "True or False" enable_siren: description: Enable/disable the siren. fields: entity_id: description: Name(s) of the entities to set - example: 'switch.dome_siren' + example: "switch.dome_siren" enabled: - description: "True or False" + description: "true or false" set_chime_volume: description: Set the volume of the chime for a Dome siren/chime. fields: entity_id: description: Name(s) of the entities to set. - example: 'switch.dome_siren' + example: "switch.dome_siren" volume: - description: Volume level. One of ["low", "medium", "high"] - example: "low" + description: Volume level. One of ["low", "medium", "high"] + example: "low" set_nimbus_dial_configuration: description: Set the configuration of an individual nimbus dial fields: entity_id: description: Name of the entity to set. - example: 'wink.nimbus_dial_3' + example: "wink.nimbus_dial_3" rotation: description: Direction dial hand should spin ["cw" or "ccw"] - example: 'cw' + example: "cw" ticks: description: Number of times the hand should move example: 12 @@ -145,12 +152,15 @@ set_nimbus_dial_state: fields: entity_id: description: Name of the entity to set. - example: 'wink.nimbus_dial_3' + example: "wink.nimbus_dial_3" value: description: The value that should be set (Should be between min_value and max_value) example: 250 labels: - description: The values shown on the dial labels ["Dial 1", "test"] the first value is what is shown by default the second value is shown when the nimbus is pressed + description: >- + The values shown on the dial labels ["Dial 1", "test"] the first value + is what is shown by default the second value is shown when the nimbus is + pressed. example: ["example", "test"] set_lock_vacation_mode: @@ -158,7 +168,7 @@ set_lock_vacation_mode: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" enabled: description: enable or disable. true or false. example: true @@ -168,7 +178,7 @@ set_lock_alarm_mode: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" mode: description: One of tamper, activity, or forced_entry. example: tamper @@ -178,7 +188,7 @@ set_lock_alarm_sensitivity: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" sensitivity: description: One of low, medium_low, medium, medium_high, high. example: medium @@ -188,7 +198,7 @@ set_lock_alarm_state: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" enabled: description: enable or disable. true or false. example: true @@ -198,7 +208,7 @@ set_lock_beeper_state: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" enabled: description: enable or disable. true or false. example: true @@ -208,10 +218,10 @@ add_new_lock_key_code: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" name: description: name of the new key code. example: Bob code: description: new key code, length must match length of other codes. Default length is 4. - example: 1234 \ No newline at end of file + example: 1234 diff --git a/homeassistant/components/xiaomi_miio/services.yaml b/homeassistant/components/xiaomi_miio/services.yaml index 4306ce4e719f..a5308b08d6d1 100644 --- a/homeassistant/components/xiaomi_miio/services.yaml +++ b/homeassistant/components/xiaomi_miio/services.yaml @@ -3,49 +3,49 @@ fan_set_buzzer_on: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_buzzer_off: description: Turn the buzzer off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_led_on: description: Turn the led on. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_led_off: description: Turn the led off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_child_lock_on: description: Turn the child lock on. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_child_lock_off: description: Turn the child lock off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_favorite_level: description: Set the favorite level. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" level: description: Level, between 0 and 16. example: 1 @@ -55,7 +55,7 @@ fan_set_fan_level: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" level: description: Level, between 1 and 3. example: 1 @@ -65,7 +65,7 @@ fan_set_led_brightness: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" brightness: description: Brightness (0 = Bright, 1 = Dim, 2 = Off) example: 1 @@ -75,35 +75,35 @@ fan_set_auto_detect_on: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_auto_detect_off: description: Turn the auto detect off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_learn_mode_on: description: Turn the learn mode on. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_learn_mode_off: description: Turn the learn mode off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_volume: description: Set the sound volume. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" volume: description: Volume, between 0 and 100. example: 50 @@ -113,14 +113,14 @@ fan_reset_filter: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_extra_features: description: Manipulates a storage register which advertises extra features. The Mi Home app evaluates the value. A feature called "turbo mode" is unlocked in the app on value 1. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" features: description: Integer, known values are 0 (default) and 1 (turbo mode). example: 1 @@ -130,7 +130,7 @@ fan_set_target_humidity: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" humidity: description: Target humidity. Allowed values are 30, 40, 50, 60, 70 and 80. example: 50 @@ -140,14 +140,14 @@ fan_set_dry_on: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" fan_set_dry_off: description: Turn the dry mode off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'fan.xiaomi_miio_device' + example: "fan.xiaomi_miio_device" light_set_scene: description: Set a fixed scene. @@ -173,77 +173,77 @@ light_reminder_on: description: Enable the eye fatigue reminder/notification (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" light_reminder_off: description: Disable the eye fatigue reminder/notification (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" light_night_light_mode_on: description: Turn the eyecare mode on (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" light_night_light_mode_off: description: Turn the eyecare mode fan_set_dry_off (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" light_eyecare_mode_on: description: Enable the eye fatigue reminder/notification (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" light_eyecare_mode_off: description: Disable the eye fatigue reminder/notification (EYECARE SMART LAMP 2 ONLY). fields: entity_id: - description: 'Name of the entity to act on.' - example: 'light.xiaomi_miio' + description: "Name of the entity to act on." + example: "light.xiaomi_miio" remote_learn_command: description: 'Learn an IR command, press "Call Service", point the remote at the IR device, and the learned command will be shown as a notification in Overview.' fields: entity_id: - description: 'Name of the entity to learn command from.' - example: 'remote.xiaomi_miio' + description: "Name of the entity to learn command from." + example: "remote.xiaomi_miio" slot: - description: 'Define the slot used to save the IR command (Value from 1 to 1000000)' - example: '1' + description: "Define the slot used to save the IR command (Value from 1 to 1000000)" + example: "1" timeout: - description: 'Define the timeout in seconds, before which the command must be learned.' - example: '30' + description: "Define the timeout in seconds, before which the command must be learned." + example: "30" switch_set_wifi_led_on: description: Turn the wifi led on. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'switch.xiaomi_miio_device' + example: "switch.xiaomi_miio_device" switch_set_wifi_led_off: description: Turn the wifi led off. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'switch.xiaomi_miio_device' + example: "switch.xiaomi_miio_device" switch_set_power_price: description: Set the power price. fields: entity_id: description: Name of the xiaomi miio entity. - example: 'switch.xiaomi_miio_device' + example: "switch.xiaomi_miio_device" mode: description: Power price, between 0 and 999. example: 31 @@ -253,66 +253,66 @@ switch_set_power_mode: fields: entity_id: description: Name of the xiaomi miio entity. - example: 'switch.xiaomi_miio_device' + example: "switch.xiaomi_miio_device" mode: description: Power mode, valid values are 'normal' and 'green'. - example: 'green' + example: "green" vacuum_remote_control_start: description: Start remote control of the vacuum cleaner. You can then move it with `remote_control_move`, when done call `remote_control_stop`. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" vacuum_remote_control_stop: description: Stop remote control mode of the vacuum cleaner. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" vacuum_remote_control_move: description: Remote control the vacuum cleaner, make sure you first set it in remote control mode with `remote_control_start`. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" velocity: description: Speed, between -0.29 and 0.29. - example: '0.2' + example: "0.2" rotation: description: Rotation, between -179 degrees and 179 degrees. - example: '90' + example: "90" duration: description: Duration of the movement. - example: '1500' + example: "1500" vacuum_remote_control_move_step: description: Remote control the vacuum cleaner, only makes one move and then stops. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" velocity: description: Speed, between -0.29 and 0.29. - example: '0.2' + example: "0.2" rotation: description: Rotation, between -179 degrees and 179 degrees. - example: '90' + example: "90" duration: description: Duration of the movement. - example: '1500' + example: "1500" vacuum_clean_zone: description: Start the cleaning operation in the selected areas for the number of repeats indicated. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" zone: description: Array of zones. Each zone is an array of 4 integer values. - example: '[[23510,25311,25110,26362]]' + example: "[[23510,25311,25110,26362]]" repeats: description: Number of cleaning repeats for each zone between 1 and 3. - example: '1' + example: "1" diff --git a/homeassistant/components/yamaha/services.yaml b/homeassistant/components/yamaha/services.yaml index c92522008be0..f96d3ea58efa 100644 --- a/homeassistant/components/yamaha/services.yaml +++ b/homeassistant/components/yamaha/services.yaml @@ -3,10 +3,10 @@ enable_output: fields: entity_id: description: Name(s) of entities to enable/disable port on. - example: 'media_player.yamaha' + example: "media_player.yamaha" port: description: Name of port to enable/disable. - example: 'hdmi1' + example: "hdmi1" enabled: description: Boolean indicating if port should be enabled or not. - example: true \ No newline at end of file + example: true diff --git a/homeassistant/components/zoneminder/services.yaml b/homeassistant/components/zoneminder/services.yaml index e6346d2f3840..a6fb85b641de 100644 --- a/homeassistant/components/zoneminder/services.yaml +++ b/homeassistant/components/zoneminder/services.yaml @@ -3,4 +3,4 @@ set_run_state: fields: name: description: The string name of the ZoneMinder run state to set as active. - example: 'Home' \ No newline at end of file + example: "Home" diff --git a/homeassistant/components/zwave/services.yaml b/homeassistant/components/zwave/services.yaml index d908941fb925..b4a5db589864 100644 --- a/homeassistant/components/zwave/services.yaml +++ b/homeassistant/components/zwave/services.yaml @@ -31,14 +31,14 @@ heal_network: fields: return_routes: description: Whether or not to update the return routes from the nodes to the controller. Defaults to False. - example: True + example: true heal_node: description: Start a Z-Wave node heal. Refer to OZW_Log.txt for progress. fields: return_routes: description: Whether or not to update the return routes from the node to the controller. Defaults to False. - example: True + example: true remove_node: description: Remove a node from the Z-Wave network. Refer to OZW_Log.txt for progress. @@ -100,7 +100,6 @@ set_poll_intensity: description: The intensity to poll, 0 = disabled, 1 = Every time through list, 2 = Every second time through list... example: 2 - print_config_parameter: description: Prints a Z-Wave node config parameter value to log. fields: @@ -120,7 +119,7 @@ refresh_entity: fields: entity_id: description: Name of the entity to refresh. - example: 'light.leviton_vrmx11lz_multilevel_scene_switch_level_40' + example: "light.leviton_vrmx11lz_multilevel_scene_switch_level_40" refresh_node: description: Refresh zwave node. @@ -153,7 +152,7 @@ test_node: description: This will send test messages to a node in the Z-Wave network. This could bring back dead nodes. fields: node_id: - description: ID of the node to send test messages to. + description: ID of the node to send test messages to. example: 10 messages: description: Optional. Amount of test messages to send. @@ -167,10 +166,10 @@ rename_node: example: 10 update_ids: description: (optional) Rename the entity IDs for entities of this node. - example: True + example: true name: description: New Name - example: 'kitchen' + example: "kitchen" rename_value: description: Set the name of a node value. This will affect the ID of the value entity. Value IDs can be queried from /api/zwave/values/{node_id} @@ -183,10 +182,10 @@ rename_value: example: 72037594255792737 update_ids: description: (optional) Update the entity ID for this value's entity. - example: True + example: true name: description: New Name - example: 'Luminosity' + example: "Luminosity" reset_node_meters: description: Resets the meter counters of a node. diff --git a/requirements_test_pre_commit.txt b/requirements_test_pre_commit.txt index b0deb01b3da1..9061a4598dfe 100644 --- a/requirements_test_pre_commit.txt +++ b/requirements_test_pre_commit.txt @@ -2,8 +2,9 @@ bandit==1.6.2 black==19.10b0 -codespell==v1.16.0 +codespell==1.16.0 flake8-docstrings==1.5.0 flake8==3.7.9 -isort==v4.3.21 +isort==4.3.21 pydocstyle==5.0.2 +yamllint==1.21.0 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 289cb6191713..ce22b66eb358 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -262,7 +262,7 @@ def requirements_pre_commit_output(): for repo in (x for x in pre_commit_conf["repos"] if x.get("rev")): for hook in repo["hooks"]: if hook["id"] not in IGNORE_PRE_COMMIT_HOOK_ID: - reqs.append(f"{hook['id']}=={repo['rev']}") + reqs.append(f"{hook['id']}=={repo['rev'].lstrip('v')}") reqs.extend(x for x in hook.get("additional_dependencies", ())) output = [ f"# Automatically generated " From 5bf7e0fcc0abc6cc0801ccb4c846c54a8fdcf04a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 5 Apr 2020 03:15:29 -0700 Subject: [PATCH 130/653] List dir when test fails (#33685) --- tests/components/tts/conftest.py | 18 ++++++++++++++++++ tests/components/tts/test_init.py | 15 +++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/components/tts/conftest.py diff --git a/tests/components/tts/conftest.py b/tests/components/tts/conftest.py new file mode 100644 index 000000000000..7f5b06b71ee2 --- /dev/null +++ b/tests/components/tts/conftest.py @@ -0,0 +1,18 @@ +"""Conftest for TTS tests. + +From http://doc.pytest.org/en/latest/example/simple.html#making-test-result-information-available-in-fixtures +""" + +import pytest + + +@pytest.hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_makereport(item, call): + """Add test report to node.""" + # execute all other hooks to obtain the report object + outcome = yield + rep = outcome.get_result() + + # set a report attribute for each phase of a call, which can + # be "setup", "call", "teardown" + setattr(item, "rep_" + rep.when, rep) diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index a52deebbcaaf..803d3d6f1dbb 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -52,7 +52,7 @@ def mock_init_cache_dir(): @pytest.fixture -def empty_cache_dir(tmp_path, mock_init_cache_dir, mock_get_cache_files): +def empty_cache_dir(tmp_path, mock_init_cache_dir, mock_get_cache_files, request): """Mock the TTS cache dir with empty dir.""" mock_init_cache_dir.side_effect = None mock_init_cache_dir.return_value = str(tmp_path) @@ -60,7 +60,18 @@ def empty_cache_dir(tmp_path, mock_init_cache_dir, mock_get_cache_files): # Restore original get cache files behavior, we're working with a real dir. mock_get_cache_files.side_effect = _get_cache_files - return tmp_path + yield tmp_path + + if request.node.rep_call.passed: + return + + # Print contents of dir if failed + print("Content of dir for", request.node.nodeid) + for fil in tmp_path.iterdir(): + print(fil.relative_to(tmp_path)) + + # To show the log. + assert False @pytest.fixture(autouse=True) From f38011560fcb9d26c163e31b02b21b8b13b8d67b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 12:49:57 +0200 Subject: [PATCH 131/653] Add pyupgrade (in pre-commit and CI) (#33688) * Add pyupgrade (in pre-commit and CI) * Fix leftover results of pyupgrade * Ensure we run for Python 3.7 on pyupgrade --- .pre-commit-config.yaml | 5 +++++ azure-pipelines-ci.yml | 4 ++++ docs/source/conf.py | 7 +++---- requirements_test_pre_commit.txt | 1 + script/hassfest/codeowners.py | 2 +- script/hassfest/config_flow.py | 2 +- script/hassfest/model.py | 2 +- script/hassfest/ssdp.py | 2 +- script/hassfest/zeroconf.py | 2 +- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 20337d836316..23827ae870df 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,9 @@ repos: + - repo: https://github.com/asottile/pyupgrade + rev: v2.1.0 + hooks: + - id: pyupgrade + args: [--py37-plus] - repo: https://github.com/psf/black rev: 19.10b0 hooks: diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 225c88b7b0f4..eedeefad073d 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -68,6 +68,10 @@ stages: . venv/bin/activate pre-commit run yamllint --all-files displayName: 'Run yamllint' + - script: | + . venv/bin/activate + pre-commit run pyupgrade --all-files + displayName: 'Run pyupgrade' - job: 'Validate' pool: vmImage: 'ubuntu-latest' diff --git a/docs/source/conf.py b/docs/source/conf.py index 3aa30965c955..cea9a22b64ec 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- # # Home-Assistant documentation build configuration file, created by # sphinx-quickstart on Sun Aug 28 13:13:10 2016. @@ -26,7 +25,7 @@ from homeassistant.const import __short_version__, __version__ PROJECT_NAME = 'Home Assistant' PROJECT_PACKAGE_NAME = 'homeassistant' PROJECT_AUTHOR = 'The Home Assistant Authors' -PROJECT_COPYRIGHT = ' 2013-2020, {}'.format(PROJECT_AUTHOR) +PROJECT_COPYRIGHT = f' 2013-2020, {PROJECT_AUTHOR}' PROJECT_LONG_DESCRIPTION = ('Home Assistant is an open-source ' 'home automation platform running on Python 3. ' 'Track and control all devices at home and ' @@ -37,7 +36,7 @@ PROJECT_GITHUB_REPOSITORY = 'home-assistant' GITHUB_PATH = '{}/{}'.format( PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY) -GITHUB_URL = 'https://github.com/{}'.format(GITHUB_PATH) +GITHUB_URL = f'https://github.com/{GITHUB_PATH}' sys.path.insert(0, os.path.abspath('_ext')) @@ -132,7 +131,7 @@ def linkcode_resolve(domain, info): fn = fn[index:] - return '{}/blob/{}/{}{}'.format(GITHUB_URL, code_branch, fn, linespec) + return f'{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/requirements_test_pre_commit.txt b/requirements_test_pre_commit.txt index 9061a4598dfe..f6575ac8404d 100644 --- a/requirements_test_pre_commit.txt +++ b/requirements_test_pre_commit.txt @@ -7,4 +7,5 @@ flake8-docstrings==1.5.0 flake8==3.7.9 isort==4.3.21 pydocstyle==5.0.2 +pyupgrade==2.1.0 yamllint==1.21.0 diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 0fdb8eafb0fd..2bec560f2998 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -62,7 +62,7 @@ def validate(integrations: Dict[str, Integration], config: Config): codeowners_path = config.root / "CODEOWNERS" config.cache["codeowners"] = content = generate_and_validate(integrations) - with open(str(codeowners_path), "r") as fp: + with open(str(codeowners_path)) as fp: if fp.read().strip() != content: config.add_error( "codeowners", diff --git a/script/hassfest/config_flow.py b/script/hassfest/config_flow.py index 5a6f0798c51d..1f14beafd736 100644 --- a/script/hassfest/config_flow.py +++ b/script/hassfest/config_flow.py @@ -68,7 +68,7 @@ def validate(integrations: Dict[str, Integration], config: Config): config_flow_path = config.root / "homeassistant/generated/config_flows.py" config.cache["config_flow"] = content = generate_and_validate(integrations) - with open(str(config_flow_path), "r") as fp: + with open(str(config_flow_path)) as fp: if fp.read().strip() != content: config.add_error( "config_flow", diff --git a/script/hassfest/model.py b/script/hassfest/model.py index c82fa670564d..0a17b5aab9fb 100644 --- a/script/hassfest/model.py +++ b/script/hassfest/model.py @@ -17,7 +17,7 @@ class Error: def __str__(self) -> str: """Represent error as string.""" - return "[{}] {}".format(self.plugin.upper(), self.error) + return f"[{self.plugin.upper()}] {self.error}" @attr.s diff --git a/script/hassfest/ssdp.py b/script/hassfest/ssdp.py index 28701f2b0156..71e94997b0ca 100644 --- a/script/hassfest/ssdp.py +++ b/script/hassfest/ssdp.py @@ -65,7 +65,7 @@ def validate(integrations: Dict[str, Integration], config: Config): ssdp_path = config.root / "homeassistant/generated/ssdp.py" config.cache["ssdp"] = content = generate_and_validate(integrations) - with open(str(ssdp_path), "r") as fp: + with open(str(ssdp_path)) as fp: if fp.read().strip() != content: config.add_error( "ssdp", diff --git a/script/hassfest/zeroconf.py b/script/hassfest/zeroconf.py index 377115f7ae45..48a5873133bd 100644 --- a/script/hassfest/zeroconf.py +++ b/script/hassfest/zeroconf.py @@ -120,7 +120,7 @@ def validate(integrations: Dict[str, Integration], config: Config): zeroconf_path = config.root / "homeassistant/generated/zeroconf.py" config.cache["zeroconf"] = content = generate_and_validate(integrations) - with open(str(zeroconf_path), "r") as fp: + with open(str(zeroconf_path)) as fp: current = fp.read().strip() if current != content: config.add_error( From de317fb2f6a0a76941c70371ec16e5dc95066291 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 08:47:32 -0500 Subject: [PATCH 132/653] Map dry and fan only states for homekit thermostats (#33682) Homekit only has Off/Heat/Cool/Auto at this time, but at least we can prevent the device from erroring by mapping dry and fan to cool so it continues to function. --- .../components/homekit/type_thermostats.py | 5 +++ .../homekit/test_type_thermostats.py | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/homeassistant/components/homekit/type_thermostats.py b/homeassistant/components/homekit/type_thermostats.py index b8c3b3f01974..57b381fa4166 100644 --- a/homeassistant/components/homekit/type_thermostats.py +++ b/homeassistant/components/homekit/type_thermostats.py @@ -16,6 +16,8 @@ from homeassistant.components.climate.const import ( ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW, CURRENT_HVAC_COOL, + CURRENT_HVAC_DRY, + CURRENT_HVAC_FAN, CURRENT_HVAC_HEAT, CURRENT_HVAC_IDLE, CURRENT_HVAC_OFF, @@ -91,6 +93,8 @@ HC_HASS_TO_HOMEKIT_ACTION = { CURRENT_HVAC_IDLE: 0, CURRENT_HVAC_HEAT: 1, CURRENT_HVAC_COOL: 2, + CURRENT_HVAC_DRY: 2, + CURRENT_HVAC_FAN: 2, } @@ -382,6 +386,7 @@ class Thermostat(HomeAccessory): # Set current operation mode for supported thermostats hvac_action = new_state.attributes.get(ATTR_HVAC_ACTION) if hvac_action: + self.char_current_heat_cool.set_value( HC_HASS_TO_HOMEKIT_ACTION[hvac_action] ) diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index 756b20456fea..9533c30017fe 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -17,6 +17,8 @@ from homeassistant.components.climate.const import ( ATTR_TARGET_TEMP_LOW, ATTR_TARGET_TEMP_STEP, CURRENT_HVAC_COOL, + CURRENT_HVAC_DRY, + CURRENT_HVAC_FAN, CURRENT_HVAC_HEAT, CURRENT_HVAC_IDLE, DEFAULT_MAX_TEMP, @@ -25,6 +27,7 @@ from homeassistant.components.climate.const import ( DOMAIN as DOMAIN_CLIMATE, HVAC_MODE_AUTO, HVAC_MODE_COOL, + HVAC_MODE_DRY, HVAC_MODE_FAN_ONLY, HVAC_MODE_HEAT, HVAC_MODE_HEAT_COOL, @@ -233,6 +236,38 @@ async def test_thermostat(hass, hk_driver, cls, events): assert acc.char_current_temp.value == 22.0 assert acc.char_display_units.value == 0 + hass.states.async_set( + entity_id, + HVAC_MODE_FAN_ONLY, + { + ATTR_TEMPERATURE: 22.0, + ATTR_CURRENT_TEMPERATURE: 22.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_FAN, + }, + ) + await hass.async_block_till_done() + assert acc.char_target_temp.value == 22.0 + assert acc.char_current_heat_cool.value == 2 + assert acc.char_target_heat_cool.value == 2 + assert acc.char_current_temp.value == 22.0 + assert acc.char_display_units.value == 0 + + hass.states.async_set( + entity_id, + HVAC_MODE_DRY, + { + ATTR_TEMPERATURE: 22.0, + ATTR_CURRENT_TEMPERATURE: 22.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_DRY, + }, + ) + await hass.async_block_till_done() + assert acc.char_target_temp.value == 22.0 + assert acc.char_current_heat_cool.value == 2 + assert acc.char_target_heat_cool.value == 2 + assert acc.char_current_temp.value == 22.0 + assert acc.char_display_units.value == 0 + # Set from HomeKit call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") From b855177fe6fac518f6cfe48b152a08c881204146 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 08:47:44 -0500 Subject: [PATCH 133/653] Make homekit aware of STATE_STANDBY (#33679) --- homeassistant/components/homekit/type_media_players.py | 8 +++++++- tests/components/homekit/test_type_media_players.py | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/homekit/type_media_players.py b/homeassistant/components/homekit/type_media_players.py index e07e9cb47494..ec15438352ca 100644 --- a/homeassistant/components/homekit/type_media_players.py +++ b/homeassistant/components/homekit/type_media_players.py @@ -33,6 +33,7 @@ from homeassistant.const import ( STATE_OFF, STATE_PAUSED, STATE_PLAYING, + STATE_STANDBY, STATE_UNKNOWN, ) @@ -190,7 +191,12 @@ class MediaPlayer(HomeAccessory): current_state = new_state.state if self.chars[FEATURE_ON_OFF]: - hk_state = current_state not in (STATE_OFF, STATE_UNKNOWN, "None") + hk_state = current_state not in ( + STATE_OFF, + STATE_UNKNOWN, + STATE_STANDBY, + "None", + ) if not self._flag[FEATURE_ON_OFF]: _LOGGER.debug( '%s: Set current state for "on_off" to %s', self.entity_id, hk_state diff --git a/tests/components/homekit/test_type_media_players.py b/tests/components/homekit/test_type_media_players.py index 366617ee988d..1fcc3dde40fb 100644 --- a/tests/components/homekit/test_type_media_players.py +++ b/tests/components/homekit/test_type_media_players.py @@ -30,6 +30,7 @@ from homeassistant.const import ( STATE_ON, STATE_PAUSED, STATE_PLAYING, + STATE_STANDBY, ) from homeassistant.core import CoreState from homeassistant.helpers import entity_registry @@ -75,6 +76,14 @@ async def test_media_player_set_state(hass, hk_driver, events): await hass.async_block_till_done() assert acc.chars[FEATURE_ON_OFF].value is False + hass.states.async_set(entity_id, STATE_ON) + await hass.async_block_till_done() + assert acc.chars[FEATURE_ON_OFF].value is True + + hass.states.async_set(entity_id, STATE_STANDBY) + await hass.async_block_till_done() + assert acc.chars[FEATURE_ON_OFF].value is False + hass.states.async_set(entity_id, STATE_PLAYING) await hass.async_block_till_done() assert acc.chars[FEATURE_PLAY_PAUSE].value is True From e3bcfb88e709e756af2d47d4ca6aa04512869a7b Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 16:01:41 +0200 Subject: [PATCH 134/653] Improve string formatting v4 (#33668) * Improve string formatting v4 * Use normal strings instead of f-strings * Fix zeroconf test by adding back part of a condition --- homeassistant/components/almond/__init__.py | 6 ++---- homeassistant/components/anthemav/media_player.py | 5 ++--- homeassistant/components/braviatv/media_player.py | 6 ++++-- homeassistant/components/envisalink/sensor.py | 2 +- homeassistant/components/mqtt_statestream/__init__.py | 10 +++++----- homeassistant/components/neato/vacuum.py | 5 ++--- homeassistant/components/opencv/image_processing.py | 2 +- homeassistant/components/pioneer/media_player.py | 4 ++-- homeassistant/components/proximity/__init__.py | 2 +- homeassistant/components/rachio/const.py | 8 ++++---- homeassistant/components/raspihats/switch.py | 2 +- homeassistant/components/remember_the_milk/__init__.py | 10 ++++++---- homeassistant/components/waterfurnace/__init__.py | 2 +- homeassistant/components/websocket_api/const.py | 2 +- homeassistant/components/wink/water_heater.py | 3 +-- homeassistant/components/zeroconf/__init__.py | 4 ++-- homeassistant/components/zha/api.py | 4 ++-- homeassistant/components/zha/core/device.py | 4 ++-- script/gen_requirements_all.py | 7 ++----- script/inspect_schemas.py | 2 +- 20 files changed, 43 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/almond/__init__.py b/homeassistant/components/almond/__init__.py index c9870b4cd32f..58fada7a196d 100644 --- a/homeassistant/components/almond/__init__.py +++ b/homeassistant/components/almond/__init__.py @@ -291,10 +291,8 @@ class AlmondAgent(conversation.AbstractConversationAgent): buffer += f"\n Picture: {message['url']}" elif message["type"] == "rdl": buffer += ( - "\n Link: " - + message["rdl"]["displayTitle"] - + " " - + message["rdl"]["webCallback"] + f"\n Link: {message['rdl']['displayTitle']} " + f"{message['rdl']['webCallback']}" ) elif message["type"] == "choice": if first_choice: diff --git a/homeassistant/components/anthemav/media_player.py b/homeassistant/components/anthemav/media_player.py index 9a64b56b575d..40317ef17282 100644 --- a/homeassistant/components/anthemav/media_player.py +++ b/homeassistant/components/anthemav/media_player.py @@ -142,9 +142,8 @@ class AnthemAVR(MediaPlayerDevice): def app_name(self): """Return details about current video and audio stream.""" return ( - self._lookup("video_input_resolution_text", "") - + " " - + self._lookup("audio_input_name", "") + f"{self._lookup('video_input_resolution_text', '')} " + f"{self._lookup('audio_input_name', '')}" ) @property diff --git a/homeassistant/components/braviatv/media_player.py b/homeassistant/components/braviatv/media_player.py index d428e2deea86..31cc98f7e4ba 100644 --- a/homeassistant/components/braviatv/media_player.py +++ b/homeassistant/components/braviatv/media_player.py @@ -154,8 +154,10 @@ def request_configuration(config, hass, add_entities): _CONFIGURING[host] = configurator.request_config( name, bravia_configuration_callback, - description="Enter the Pin shown on your Sony Bravia TV." - + "If no Pin is shown, enter 0000 to let TV show you a Pin.", + description=( + "Enter the Pin shown on your Sony Bravia TV." + "If no Pin is shown, enter 0000 to let TV show you a Pin." + ), description_image="/static/images/smart-tv.png", submit_caption="Confirm", fields=[{"id": "pin", "name": "Enter the pin", "type": ""}], diff --git a/homeassistant/components/envisalink/sensor.py b/homeassistant/components/envisalink/sensor.py index b4f15a2999e2..3f3711b2e40a 100644 --- a/homeassistant/components/envisalink/sensor.py +++ b/homeassistant/components/envisalink/sensor.py @@ -46,7 +46,7 @@ class EnvisalinkSensor(EnvisalinkDevice, Entity): self._partition_number = partition_number _LOGGER.debug("Setting up sensor for partition: %s", partition_name) - super().__init__(partition_name + " Keypad", info, controller) + super().__init__(f"{partition_name} Keypad", info, controller) async def async_added_to_hass(self): """Register callbacks.""" diff --git a/homeassistant/components/mqtt_statestream/__init__.py b/homeassistant/components/mqtt_statestream/__init__.py index e35f26532837..8e63bffe5680 100644 --- a/homeassistant/components/mqtt_statestream/__init__.py +++ b/homeassistant/components/mqtt_statestream/__init__.py @@ -68,7 +68,7 @@ async def async_setup(hass, config): pub_exclude.get(CONF_ENTITIES, []), ) if not base_topic.endswith("/"): - base_topic = base_topic + "/" + base_topic = f"{base_topic}/" @callback def _state_publisher(entity_id, old_state, new_state): @@ -80,17 +80,17 @@ async def async_setup(hass, config): payload = new_state.state - mybase = base_topic + entity_id.replace(".", "/") + "/" - hass.components.mqtt.async_publish(mybase + "state", payload, 1, True) + mybase = f"{base_topic}{entity_id.replace('.', '/')}/" + hass.components.mqtt.async_publish(f"{mybase}state", payload, 1, True) if publish_timestamps: if new_state.last_updated: hass.components.mqtt.async_publish( - mybase + "last_updated", new_state.last_updated.isoformat(), 1, True + f"{mybase}last_updated", new_state.last_updated.isoformat(), 1, True ) if new_state.last_changed: hass.components.mqtt.async_publish( - mybase + "last_changed", new_state.last_changed.isoformat(), 1, True + f"{mybase}last_changed", new_state.last_changed.isoformat(), 1, True ) if publish_attributes: diff --git a/homeassistant/components/neato/vacuum.py b/homeassistant/components/neato/vacuum.py index 7a9cd1d9e45f..391fcecf3739 100644 --- a/homeassistant/components/neato/vacuum.py +++ b/homeassistant/components/neato/vacuum.py @@ -199,9 +199,8 @@ class NeatoConnectedVacuum(StateVacuumDevice): if robot_alert is None: self._clean_state = STATE_CLEANING self._status_state = ( - MODE.get(self._state["cleaning"]["mode"]) - + " " - + ACTION.get(self._state["action"]) + f"{MODE.get(self._state['cleaning']['mode'])} " + f"{ACTION.get(self._state['action'])}" ) if ( "boundary" in self._state["cleaning"] diff --git a/homeassistant/components/opencv/image_processing.py b/homeassistant/components/opencv/image_processing.py index 8e300c774653..c2cd62237d76 100644 --- a/homeassistant/components/opencv/image_processing.py +++ b/homeassistant/components/opencv/image_processing.py @@ -32,7 +32,7 @@ ATTR_TOTAL_MATCHES = "total_matches" CASCADE_URL = ( "https://raw.githubusercontent.com/opencv/opencv/master/data/" - + "lbpcascades/lbpcascade_frontalface.xml" + "lbpcascades/lbpcascade_frontalface.xml" ) CONF_CLASSIFIER = "classifier" diff --git a/homeassistant/components/pioneer/media_player.py b/homeassistant/components/pioneer/media_player.py index 6e9022711713..899a06dc2788 100644 --- a/homeassistant/components/pioneer/media_player.py +++ b/homeassistant/components/pioneer/media_player.py @@ -225,7 +225,7 @@ class PioneerDevice(MediaPlayerDevice): def set_volume_level(self, volume): """Set volume level, range 0..1.""" # 60dB max - self.telnet_command(str(round(volume * MAX_VOLUME)).zfill(3) + "VL") + self.telnet_command(f"{round(volume * MAX_VOLUME):03}VL") def mute_volume(self, mute): """Mute (true) or unmute (false) media player.""" @@ -237,4 +237,4 @@ class PioneerDevice(MediaPlayerDevice): def select_source(self, source): """Select input source.""" - self.telnet_command(self._source_name_to_number.get(source) + "FN") + self.telnet_command(f"{self._source_name_to_number.get(source)}FN") diff --git a/homeassistant/components/proximity/__init__.py b/homeassistant/components/proximity/__init__.py index 7e5f64367571..0182f6bc0725 100644 --- a/homeassistant/components/proximity/__init__.py +++ b/homeassistant/components/proximity/__init__.py @@ -160,7 +160,7 @@ class Proximity(Entity): if (device_state.state).lower() == (self.friendly_name).lower(): device_friendly = device_state.name if devices_in_zone != "": - devices_in_zone = devices_in_zone + ", " + devices_in_zone = f"{devices_in_zone}, " devices_in_zone = devices_in_zone + device_friendly # No-one to track so reset the entity. diff --git a/homeassistant/components/rachio/const.py b/homeassistant/components/rachio/const.py index 587cd85a2a50..2e73bf9b1167 100644 --- a/homeassistant/components/rachio/const.py +++ b/homeassistant/components/rachio/const.py @@ -54,7 +54,7 @@ RACHIO_API_EXCEPTIONS = ( STATUS_ONLINE = "ONLINE" STATUS_OFFLINE = "OFFLINE" -SIGNAL_RACHIO_UPDATE = DOMAIN + "_update" -SIGNAL_RACHIO_CONTROLLER_UPDATE = SIGNAL_RACHIO_UPDATE + "_controller" -SIGNAL_RACHIO_ZONE_UPDATE = SIGNAL_RACHIO_UPDATE + "_zone" -SIGNAL_RACHIO_SCHEDULE_UPDATE = SIGNAL_RACHIO_UPDATE + "_schedule" +SIGNAL_RACHIO_UPDATE = f"{DOMAIN}_update" +SIGNAL_RACHIO_CONTROLLER_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_controller" +SIGNAL_RACHIO_ZONE_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_zone" +SIGNAL_RACHIO_SCHEDULE_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_schedule" diff --git a/homeassistant/components/raspihats/switch.py b/homeassistant/components/raspihats/switch.py index d61295771188..98bcb4d0aa81 100644 --- a/homeassistant/components/raspihats/switch.py +++ b/homeassistant/components/raspihats/switch.py @@ -105,7 +105,7 @@ class I2CHatSwitch(ToggleEntity): def _log_message(self, message): """Create log message.""" - string = self._name + " " + string = f"{self._name} " string += f"{self._board}I2CHat@{hex(self._address)} " string += f"channel:{str(self._channel)}{message}" return string diff --git a/homeassistant/components/remember_the_milk/__init__.py b/homeassistant/components/remember_the_milk/__init__.py index 52199b2b9c69..9de33c67158f 100644 --- a/homeassistant/components/remember_the_milk/__init__.py +++ b/homeassistant/components/remember_the_milk/__init__.py @@ -137,10 +137,12 @@ def _register_new_account( request_id = configurator.async_request_config( f"{DOMAIN} - {account_name}", callback=register_account_callback, - description="You need to log in to Remember The Milk to" - + "connect your account. \n\n" - + 'Step 1: Click on the link "Remember The Milk login"\n\n' - + 'Step 2: Click on "login completed"', + description=( + "You need to log in to Remember The Milk to" + "connect your account. \n\n" + "Step 1: Click on the link 'Remember The Milk login'\n\n" + "Step 2: Click on 'login completed'" + ), link_name="Remember The Milk login", link_url=url, submit_caption="login completed", diff --git a/homeassistant/components/waterfurnace/__init__.py b/homeassistant/components/waterfurnace/__init__.py index 942ab8a14ac4..2ec77e35070c 100644 --- a/homeassistant/components/waterfurnace/__init__.py +++ b/homeassistant/components/waterfurnace/__init__.py @@ -14,7 +14,7 @@ from homeassistant.helpers import config_validation as cv, discovery _LOGGER = logging.getLogger(__name__) DOMAIN = "waterfurnace" -UPDATE_TOPIC = DOMAIN + "_update" +UPDATE_TOPIC = f"{DOMAIN}_update" SCAN_INTERVAL = timedelta(seconds=10) ERROR_INTERVAL = timedelta(seconds=300) MAX_FAILS = 10 diff --git a/homeassistant/components/websocket_api/const.py b/homeassistant/components/websocket_api/const.py index 61f12fd5f575..183e70088531 100644 --- a/homeassistant/components/websocket_api/const.py +++ b/homeassistant/components/websocket_api/const.py @@ -39,6 +39,6 @@ SIGNAL_WEBSOCKET_CONNECTED = "websocket_connected" SIGNAL_WEBSOCKET_DISCONNECTED = "websocket_disconnected" # Data used to store the current connection list -DATA_CONNECTIONS = DOMAIN + ".connections" +DATA_CONNECTIONS = f"{DOMAIN}.connections" JSON_DUMP = partial(json.dumps, cls=JSONEncoder, allow_nan=False) diff --git a/homeassistant/components/wink/water_heater.py b/homeassistant/components/wink/water_heater.py index 11330c7c9a5c..dae6acf91bf9 100644 --- a/homeassistant/components/wink/water_heater.py +++ b/homeassistant/components/wink/water_heater.py @@ -104,8 +104,7 @@ class WinkWaterHeater(WinkDevice, WaterHeaterDevice): else: error = ( "Invalid operation mode mapping. " - + mode - + " doesn't map. Please report this." + f"{mode} doesn't map. Please report this." ) _LOGGER.error(error) return op_list diff --git a/homeassistant/components/zeroconf/__init__.py b/homeassistant/components/zeroconf/__init__.py index 7e9f6e60ed53..373df9e6384f 100644 --- a/homeassistant/components/zeroconf/__init__.py +++ b/homeassistant/components/zeroconf/__init__.py @@ -134,8 +134,8 @@ def handle_homekit(hass, info) -> bool: for test_model in HOMEKIT: if ( model != test_model - and not model.startswith(test_model + " ") - and not model.startswith(test_model + "-") + and not model.startswith(f"{test_model} ") + and not model.startswith(f"{test_model}-") ): continue diff --git a/homeassistant/components/zha/api.py b/homeassistant/components/zha/api.py index f3b6e2eebd9b..433f9dd7ff22 100644 --- a/homeassistant/components/zha/api.py +++ b/homeassistant/components/zha/api.py @@ -774,9 +774,9 @@ async def async_binding_operation(zha_gateway, source_ieee, target_ieee, operati res = await asyncio.gather(*(t[0] for t in bind_tasks), return_exceptions=True) for outcome, log_msg in zip(res, bind_tasks): if isinstance(outcome, Exception): - fmt = log_msg[1] + " failed: %s" + fmt = f"{log_msg[1]} failed: %s" else: - fmt = log_msg[1] + " completed: %s" + fmt = f"{log_msg[1]} completed: %s" zdo.debug(fmt, *(log_msg[2] + (outcome,))) diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index e0d9cfa0a3ec..56e8d3ddcbf1 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -625,9 +625,9 @@ class ZHADevice(LogMixin): res = await asyncio.gather(*(t[0] for t in tasks), return_exceptions=True) for outcome, log_msg in zip(res, tasks): if isinstance(outcome, Exception): - fmt = log_msg[1] + " failed: %s" + fmt = f"{log_msg[1]} failed: %s" else: - fmt = log_msg[1] + " completed: %s" + fmt = f"{log_msg[1]} completed: %s" zdo.debug(fmt, *(log_msg[2] + (outcome,))) def log(self, level, msg, *args): diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index ce22b66eb358..40fb1ad8b497 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -102,7 +102,7 @@ def explore_module(package, explore_children): if not hasattr(module, "__path__"): return found - for _, name, _ in pkgutil.iter_modules(module.__path__, package + "."): + for _, name, _ in pkgutil.iter_modules(module.__path__, f"{package}."): found.append(name) if explore_children: @@ -169,10 +169,7 @@ def gather_requirements_from_manifests(errors, reqs): continue process_requirements( - errors, - integration.requirements, - f"homeassistant.components.{domain}", - reqs, + errors, integration.requirements, f"homeassistant.components.{domain}", reqs ) diff --git a/script/inspect_schemas.py b/script/inspect_schemas.py index 6ea37f26d103..cd72f55a8554 100755 --- a/script/inspect_schemas.py +++ b/script/inspect_schemas.py @@ -13,7 +13,7 @@ def explore_module(package): module = importlib.import_module(package) if not hasattr(module, "__path__"): return [] - for _, name, _ in pkgutil.iter_modules(module.__path__, package + "."): + for _, name, _ in pkgutil.iter_modules(module.__path__, f"{package}."): yield name From 39336d3ea367e5c50e88fa09165257290a07b150 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 17:27:16 +0200 Subject: [PATCH 135/653] Add prettier (in pre-commit and CI) (#33693) * Add prettier (in pre-commit and CI) * Make all file prettier * Change order * Add to Azure Pipelines * Fix a YAML file prettier caught as invalid * Remove flow mapping using curly braces from all YAML service files --- .pre-commit-config.yaml | 4 + .prettierignore | 5 + azure-pipelines-ci.yml | 4 + homeassistant/components/abode/strings.json | 2 +- homeassistant/components/adguard/strings.json | 58 ++++----- homeassistant/components/ads/services.yaml | 4 +- .../components/aftership/services.yaml | 10 +- .../alarm_control_panel/services.yaml | 12 +- .../alarm_control_panel/strings.json | 46 +++---- .../components/alarmdecoder/manifest.json | 10 +- .../components/alarmdecoder/services.yaml | 4 +- homeassistant/components/alert/services.yaml | 12 +- .../components/ambiclimate/strings.json | 2 +- .../components/amcrest/services.yaml | 26 ++-- .../components/androidtv/services.yaml | 16 +-- .../components/apple_tv/services.yaml | 7 +- .../components/arcam_fmj/strings.json | 6 +- homeassistant/components/august/manifest.json | 12 +- homeassistant/components/august/strings.json | 58 ++++----- homeassistant/components/auth/strings.json | 2 +- .../components/binary_sensor/strings.json | 1 - .../components/blackbird/services.yaml | 5 +- .../components/broadlink/services.yaml | 11 +- .../components/calendar/services.yaml | 1 - homeassistant/components/camera/services.yaml | 23 ++-- .../components/cert_expiry/strings.json | 40 +++--- .../components/channels/services.yaml | 6 +- .../components/climate/services.yaml | 22 ++-- .../components/counter/services.yaml | 8 +- homeassistant/components/cover/services.yaml | 20 +-- homeassistant/components/daikin/strings.json | 32 ++--- homeassistant/components/deconz/manifest.json | 8 +- homeassistant/components/deconz/services.yaml | 6 +- homeassistant/components/deconz/strings.json | 2 +- .../components/denonavr/services.yaml | 6 +- .../components/device_tracker/services.yaml | 14 +-- homeassistant/components/doods/manifest.json | 5 +- .../components/doorbird/manifest.json | 13 +- .../components/doorbird/strings.json | 66 +++++----- .../components/duckdns/services.yaml | 2 +- .../components/dynalite/manifest.json | 12 +- homeassistant/components/ebusd/strings.json | 2 +- homeassistant/components/ecobee/services.yaml | 4 +- homeassistant/components/ecobee/strings.json | 40 +++--- homeassistant/components/edl21/manifest.json | 8 +- .../components/eight_sleep/services.yaml | 12 +- homeassistant/components/elkm1/manifest.json | 8 +- homeassistant/components/elkm1/services.yaml | 8 +- homeassistant/components/elkm1/strings.json | 2 +- .../components/emulated_roku/strings.json | 38 +++--- .../components/envisalink/services.yaml | 6 +- homeassistant/components/epson/services.yaml | 4 +- homeassistant/components/esphome/strings.json | 62 ++++----- .../components/evohome/services.yaml | 26 ++-- homeassistant/components/ezviz/manifest.json | 2 +- .../components/facebox/services.yaml | 6 +- homeassistant/components/foscam/services.yaml | 4 +- homeassistant/components/freebox/strings.json | 42 +++---- .../components/frontend/manifest.json | 8 +- .../components/frontend/services.yaml | 2 +- homeassistant/components/gdacs/manifest.json | 8 +- .../components/geniushub/services.yaml | 9 +- .../components/geofency/strings.json | 2 +- homeassistant/components/glances/strings.json | 66 +++++----- .../components/gpslogger/strings.json | 2 +- homeassistant/components/griddy/strings.json | 36 +++--- .../components/hangouts/strings.json | 52 ++++---- .../components/harmony/manifest.json | 2 +- .../components/hdmi_cec/services.yaml | 3 +- homeassistant/components/heos/strings.json | 36 +++--- .../homekit_controller/strings.json | 72 +++++------ .../components/homematic/services.yaml | 5 +- homeassistant/components/html5/services.yaml | 2 +- .../components/huawei_lte/strings.json | 78 ++++++------ homeassistant/components/hue/strings.json | 2 +- homeassistant/components/icloud/services.yaml | 23 ++-- homeassistant/components/icloud/strings.json | 72 +++++------ homeassistant/components/ifttt/services.yaml | 12 +- homeassistant/components/ihc/manifest.json | 5 +- .../components/image_processing/services.yaml | 2 +- .../components/input_boolean/services.yaml | 13 +- .../components/input_select/services.yaml | 28 +++-- .../components/input_text/services.yaml | 9 +- homeassistant/components/ipma/strings.json | 32 ++--- homeassistant/components/kodi/services.yaml | 12 +- .../components/konnected/manifest.json | 13 +- homeassistant/components/linky/strings.json | 38 +++--- .../components/local_file/services.yaml | 4 +- .../components/locative/strings.json | 2 +- homeassistant/components/lock/services.yaml | 6 +- .../components/luftdaten/strings.json | 1 - .../components/lutron_caseta/strings.json | 8 +- .../components/marytts/manifest.json | 4 +- .../components/media_player/services.yaml | 46 +++---- homeassistant/components/met/strings.json | 32 ++--- .../components/meteo_france/strings.json | 26 ++-- .../components/microsoft_face/services.yaml | 40 ++++-- .../components/mikrotik/manifest.json | 8 +- .../components/mikrotik/strings.json | 66 +++++----- .../components/minecraft_server/strings.json | 40 +++--- homeassistant/components/modbus/services.yaml | 32 +++-- .../components/monoprice/services.yaml | 4 +- .../components/monoprice/strings.json | 2 +- homeassistant/components/myq/manifest.json | 8 +- homeassistant/components/neato/strings.json | 48 +++---- homeassistant/components/nest/strings.json | 2 +- .../components/netatmo/manifest.json | 23 +--- homeassistant/components/netatmo/strings.json | 2 +- homeassistant/components/nexia/manifest.json | 8 +- homeassistant/components/nexia/strings.json | 2 +- .../components/nextcloud/manifest.json | 8 +- .../components/nissan_leaf/services.yaml | 1 - homeassistant/components/notify/services.yaml | 6 +- homeassistant/components/nuheat/manifest.json | 12 +- homeassistant/components/nuheat/strings.json | 44 +++---- homeassistant/components/nuki/services.yaml | 3 +- homeassistant/components/nut/manifest.json | 4 +- homeassistant/components/nut/strings.json | 3 +- homeassistant/components/opencv/manifest.json | 5 +- .../components/openerz/manifest.json | 10 +- .../components/opentherm_gw/services.yaml | 40 +++--- .../components/opentherm_gw/strings.json | 4 +- .../components/opnsense/manifest.json | 4 +- .../components/pilight/services.yaml | 4 +- homeassistant/components/plaato/strings.json | 2 +- homeassistant/components/plex/strings.json | 78 ++++++------ homeassistant/components/proxy/manifest.json | 4 +- homeassistant/components/ps4/services.yaml | 4 +- homeassistant/components/qrcode/manifest.json | 5 +- homeassistant/components/rachio/manifest.json | 12 +- homeassistant/components/rachio/strings.json | 2 +- .../components/rainbird/services.yaml | 2 +- .../components/rainforest_eagle/manifest.json | 8 +- homeassistant/components/remote/services.yaml | 30 ++--- homeassistant/components/rflink/services.yaml | 8 +- homeassistant/components/roomba/manifest.json | 8 +- homeassistant/components/salt/manifest.json | 10 +- .../components/samsungtv/manifest.json | 4 +- .../components/samsungtv/strings.json | 4 +- homeassistant/components/script/services.yaml | 6 +- homeassistant/components/sense/manifest.json | 8 +- .../components/sensibo/services.yaml | 4 +- .../components/seven_segments/manifest.json | 4 +- .../components/shopping_list/services.yaml | 11 +- .../components/shopping_list/strings.json | 20 +-- .../components/sighthound/manifest.json | 15 +-- .../components/smartthings/strings.json | 18 +-- homeassistant/components/smhi/strings.json | 32 ++--- .../components/snapcast/services.yaml | 10 +- .../components/solaredge/strings.json | 34 ++--- homeassistant/components/soma/strings.json | 44 +++---- .../components/songpal/services.yaml | 6 +- homeassistant/components/sonos/services.yaml | 30 ++--- .../components/soundtouch/services.yaml | 14 +-- .../components/squeezebox/services.yaml | 4 +- .../components/starline/strings.json | 76 +++++------ homeassistant/components/switch/services.yaml | 6 +- .../components/switcher_kis/services.yaml | 4 +- homeassistant/components/tado/manifest.json | 8 +- .../components/tankerkoenig/manifest.json | 4 +- .../components/telegram_bot/services.yaml | 64 +++++----- .../components/tellduslive/strings.json | 44 +++---- homeassistant/components/tesla/manifest.json | 9 +- homeassistant/components/tesla/strings.json | 2 +- homeassistant/components/tmb/manifest.json | 8 +- .../components/todoist/services.yaml | 1 - homeassistant/components/toon/strings.json | 2 +- .../components/transmission/strings.json | 62 ++++----- homeassistant/components/tts/services.yaml | 8 +- .../components/twentemilieu/strings.json | 38 +++--- homeassistant/components/unifi/manifest.json | 8 +- homeassistant/components/unifi/strings.json | 118 +++++++++--------- homeassistant/components/upnp/strings.json | 52 ++++---- homeassistant/components/vacuum/services.yaml | 26 ++-- homeassistant/components/vera/manifest.json | 4 +- .../components/verisure/services.yaml | 5 +- homeassistant/components/vesync/strings.json | 34 ++--- homeassistant/components/vizio/strings.json | 102 +++++++-------- .../components/wake_on_lan/services.yaml | 9 +- .../components/water_heater/services.yaml | 6 +- homeassistant/components/wemo/services.yaml | 4 +- .../components/wunderlist/services.yaml | 4 +- .../components/xiaomi_aqara/services.yaml | 37 ++++-- .../components/yeelight/services.yaml | 24 ++-- homeassistant/components/zha/services.yaml | 4 +- homeassistant/components/zwave/strings.json | 38 +++--- script/gen_requirements_all.py | 2 +- 187 files changed, 1649 insertions(+), 1688 deletions(-) create mode 100644 .prettierignore diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 23827ae870df..a39b26599142 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -55,6 +55,10 @@ repos: rev: v1.21.0 hooks: - id: yamllint + - repo: https://github.com/prettier/prettier + rev: 2.0.2 + hooks: + - id: prettier - repo: local hooks: # Run mypy through our wrapper script in order to get the possible diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000000..cf6293781611 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +*.md +azure-*.yml +docs/source/_templates/* +homeassistant/components/*/.translations/*.json +tests/fixtures/* diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index eedeefad073d..2e9ec2b4e380 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -72,6 +72,10 @@ stages: . venv/bin/activate pre-commit run pyupgrade --all-files displayName: 'Run pyupgrade' + - script: | + . venv/bin/activate + pre-commit run prettier --all-files + displayName: 'Run prettier' - job: 'Validate' pool: vmImage: 'ubuntu-latest' diff --git a/homeassistant/components/abode/strings.json b/homeassistant/components/abode/strings.json index bf7e768f6e32..5c1385c6ecd9 100644 --- a/homeassistant/components/abode/strings.json +++ b/homeassistant/components/abode/strings.json @@ -19,4 +19,4 @@ "single_instance_allowed": "Only a single configuration of Abode is allowed." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/adguard/strings.json b/homeassistant/components/adguard/strings.json index d33ba2b397a8..fb17a8ea4711 100644 --- a/homeassistant/components/adguard/strings.json +++ b/homeassistant/components/adguard/strings.json @@ -1,32 +1,32 @@ { - "config": { - "title": "AdGuard Home", - "step": { - "user": { - "title": "Link your AdGuard Home.", - "description": "Set up your AdGuard Home instance to allow monitoring and control.", - "data": { - "host": "Host", - "password": "Password", - "port": "Port", - "username": "Username", - "ssl": "AdGuard Home uses a SSL certificate", - "verify_ssl": "AdGuard Home uses a proper certificate" - } - }, - "hassio_confirm": { - "title": "AdGuard Home via Hass.io add-on", - "description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the Hass.io add-on: {addon}?" - } - }, - "error": { - "connection_error": "Failed to connect." - }, - "abort": { - "adguard_home_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}.", - "adguard_home_addon_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}. Please update your Hass.io AdGuard Home add-on.", - "existing_instance_updated": "Updated existing configuration.", - "single_instance_allowed": "Only a single configuration of AdGuard Home is allowed." + "config": { + "title": "AdGuard Home", + "step": { + "user": { + "title": "Link your AdGuard Home.", + "description": "Set up your AdGuard Home instance to allow monitoring and control.", + "data": { + "host": "Host", + "password": "Password", + "port": "Port", + "username": "Username", + "ssl": "AdGuard Home uses a SSL certificate", + "verify_ssl": "AdGuard Home uses a proper certificate" } + }, + "hassio_confirm": { + "title": "AdGuard Home via Hass.io add-on", + "description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the Hass.io add-on: {addon}?" + } + }, + "error": { + "connection_error": "Failed to connect." + }, + "abort": { + "adguard_home_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}.", + "adguard_home_addon_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}. Please update your Hass.io AdGuard Home add-on.", + "existing_instance_updated": "Updated existing configuration.", + "single_instance_allowed": "Only a single configuration of AdGuard Home is allowed." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/ads/services.yaml b/homeassistant/components/ads/services.yaml index 81751e768f1e..1e7b664b6744 100644 --- a/homeassistant/components/ads/services.yaml +++ b/homeassistant/components/ads/services.yaml @@ -6,10 +6,10 @@ write_data_by_name: fields: adsvar: description: The name of the variable to write to. - example: '.global_var' + example: ".global_var" adstype: description: The data type of the variable to write to. - example: 'int' + example: "int" value: description: The value to write to the variable. example: 1 diff --git a/homeassistant/components/aftership/services.yaml b/homeassistant/components/aftership/services.yaml index 157156c32529..5ad30d25d8b7 100644 --- a/homeassistant/components/aftership/services.yaml +++ b/homeassistant/components/aftership/services.yaml @@ -5,20 +5,20 @@ add_tracking: fields: tracking_number: description: Tracking number for the new tracking - example: '123456789' + example: "123456789" title: description: A custom title for the new tracking - example: 'Laptop' + example: "Laptop" slug: description: Slug (carrier) of the new tracking - example: 'USPS' + example: "USPS" remove_tracking: description: Remove a tracking from Aftership. fields: tracking_number: description: Tracking number of the tracking to remove - example: '123456789' + example: "123456789" slug: description: Slug (carrier) of the tracking to remove - example: 'USPS' + example: "USPS" diff --git a/homeassistant/components/alarm_control_panel/services.yaml b/homeassistant/components/alarm_control_panel/services.yaml index b31cb718b3f8..fa5c573a7f89 100644 --- a/homeassistant/components/alarm_control_panel/services.yaml +++ b/homeassistant/components/alarm_control_panel/services.yaml @@ -5,7 +5,7 @@ alarm_disarm: fields: entity_id: description: Name of alarm control panel to disarm. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to disarm the alarm control panel with. example: 1234 @@ -15,7 +15,7 @@ alarm_arm_custom_bypass: fields: entity_id: description: Name of alarm control panel to arm custom bypass. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to arm custom bypass the alarm control panel with. example: 1234 @@ -25,7 +25,7 @@ alarm_arm_home: fields: entity_id: description: Name of alarm control panel to arm home. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to arm home the alarm control panel with. example: 1234 @@ -35,7 +35,7 @@ alarm_arm_away: fields: entity_id: description: Name of alarm control panel to arm away. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to arm away the alarm control panel with. example: 1234 @@ -45,7 +45,7 @@ alarm_arm_night: fields: entity_id: description: Name of alarm control panel to arm night. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to arm night the alarm control panel with. example: 1234 @@ -55,7 +55,7 @@ alarm_trigger: fields: entity_id: description: Name of alarm control panel to trigger. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" code: description: An optional code to trigger the alarm control panel with. example: 1234 diff --git a/homeassistant/components/alarm_control_panel/strings.json b/homeassistant/components/alarm_control_panel/strings.json index 4e14a8c2a3d5..928c8d2a2e25 100644 --- a/homeassistant/components/alarm_control_panel/strings.json +++ b/homeassistant/components/alarm_control_panel/strings.json @@ -1,25 +1,25 @@ { - "device_automation": { - "action_type": { - "arm_away": "Arm {entity_name} away", - "arm_home": "Arm {entity_name} home", - "arm_night": "Arm {entity_name} night", - "disarm": "Disarm {entity_name}", - "trigger": "Trigger {entity_name}" - }, - "condition_type": { - "is_triggered": "{entity_name} is triggered", - "is_disarmed": "{entity_name} is disarmed", - "is_armed_home": "{entity_name} is armed home", - "is_armed_away": "{entity_name} is armed away", - "is_armed_night": "{entity_name} is armed night" - }, - "trigger_type": { - "triggered": "{entity_name} triggered", - "disarmed": "{entity_name} disarmed", - "armed_home": "{entity_name} armed home", - "armed_away": "{entity_name} armed away", - "armed_night": "{entity_name} armed night" - } + "device_automation": { + "action_type": { + "arm_away": "Arm {entity_name} away", + "arm_home": "Arm {entity_name} home", + "arm_night": "Arm {entity_name} night", + "disarm": "Disarm {entity_name}", + "trigger": "Trigger {entity_name}" + }, + "condition_type": { + "is_triggered": "{entity_name} is triggered", + "is_disarmed": "{entity_name} is disarmed", + "is_armed_home": "{entity_name} is armed home", + "is_armed_away": "{entity_name} is armed away", + "is_armed_night": "{entity_name} is armed night" + }, + "trigger_type": { + "triggered": "{entity_name} triggered", + "disarmed": "{entity_name} disarmed", + "armed_home": "{entity_name} armed home", + "armed_away": "{entity_name} armed away", + "armed_night": "{entity_name} armed night" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/alarmdecoder/manifest.json b/homeassistant/components/alarmdecoder/manifest.json index 06ab3ab14839..48c5cb824add 100644 --- a/homeassistant/components/alarmdecoder/manifest.json +++ b/homeassistant/components/alarmdecoder/manifest.json @@ -1,7 +1,7 @@ { - "domain": "alarmdecoder", - "name": "AlarmDecoder", - "documentation": "https://www.home-assistant.io/integrations/alarmdecoder", - "requirements": ["alarmdecoder==1.13.2"], - "codeowners": ["@ajschmidt8"] + "domain": "alarmdecoder", + "name": "AlarmDecoder", + "documentation": "https://www.home-assistant.io/integrations/alarmdecoder", + "requirements": ["alarmdecoder==1.13.2"], + "codeowners": ["@ajschmidt8"] } diff --git a/homeassistant/components/alarmdecoder/services.yaml b/homeassistant/components/alarmdecoder/services.yaml index 1193f90ff8e6..bcf5a927713a 100644 --- a/homeassistant/components/alarmdecoder/services.yaml +++ b/homeassistant/components/alarmdecoder/services.yaml @@ -2,8 +2,8 @@ alarm_keypress: description: Send custom keypresses to the alarm. fields: keypress: - description: 'String to send to the alarm panel.' - example: '*71' + description: "String to send to the alarm panel." + example: "*71" alarm_toggle_chime: description: Send the alarm the toggle chime command. diff --git a/homeassistant/components/alert/services.yaml b/homeassistant/components/alert/services.yaml index 1cdd1f02e7ee..995302005460 100644 --- a/homeassistant/components/alert/services.yaml +++ b/homeassistant/components/alert/services.yaml @@ -1,12 +1,18 @@ toggle: description: Toggle alert's notifications. fields: - entity_id: {description: Name of the alert to toggle., example: alert.garage_door_open} + entity_id: + description: Name of the alert to toggle. + example: alert.garage_door_open turn_off: description: Silence alert's notifications. fields: - entity_id: {description: Name of the alert to silence., example: alert.garage_door_open} + entity_id: + description: Name of the alert to silence. + example: alert.garage_door_open turn_on: description: Reset alert's notifications. fields: - entity_id: {description: Name of the alert to reset., example: alert.garage_door_open} + entity_id: + description: Name of the alert to reset. + example: alert.garage_door_open diff --git a/homeassistant/components/ambiclimate/strings.json b/homeassistant/components/ambiclimate/strings.json index 78386077af28..f38836c0414d 100644 --- a/homeassistant/components/ambiclimate/strings.json +++ b/homeassistant/components/ambiclimate/strings.json @@ -20,4 +20,4 @@ "access_token": "Unknown error generating an access token." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/amcrest/services.yaml b/homeassistant/components/amcrest/services.yaml index 820f965c533b..10865586b6db 100644 --- a/homeassistant/components/amcrest/services.yaml +++ b/homeassistant/components/amcrest/services.yaml @@ -3,49 +3,49 @@ enable_recording: fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" disable_recording: description: Disable continuous recording to camera storage. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" enable_audio: description: Enable audio stream. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" disable_audio: description: Disable audio stream. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" enable_motion_recording: description: Enable recording a clip to camera storage when motion is detected. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" disable_motion_recording: description: Disable recording a clip to camera storage when motion is detected. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" goto_preset: description: Move camera to PTZ preset. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" preset: description: Preset number, starting from 1. example: 1 @@ -55,7 +55,7 @@ set_color_bw: fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" color_bw: description: Color mode, one of 'auto', 'color' or 'bw'. example: auto @@ -65,24 +65,24 @@ start_tour: fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" stop_tour: description: Stop camera's PTZ tour function. fields: entity_id: description: "Name(s) of the cameras, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" ptz_control: description: Move (Pan/Tilt) and/or Zoom a PTZ camera fields: entity_id: description: "Name of the camera, or 'all' for all cameras." - example: 'camera.house_front' + example: "camera.house_front" movement: description: "up, down, right, left, right_up, right_down, left_up, left_down, zoom_in, zoom_out" - example: 'right' + example: "right" travel_time: description: "(optional) Travel time in fractional seconds: from 0 to 1. Default: .2" - example: '.5' + example: ".5" diff --git a/homeassistant/components/androidtv/services.yaml b/homeassistant/components/androidtv/services.yaml index 96d70ef49985..9de4f928b38f 100644 --- a/homeassistant/components/androidtv/services.yaml +++ b/homeassistant/components/androidtv/services.yaml @@ -5,31 +5,31 @@ adb_command: fields: entity_id: description: Name(s) of Android TV / Fire TV entities. - example: 'media_player.android_tv_living_room' + example: "media_player.android_tv_living_room" command: description: Either a key command or an ADB shell command. - example: 'HOME' + example: "HOME" download: description: Download a file from your Android TV / Fire TV device to your Home Assistant instance. fields: entity_id: description: Name of Android TV / Fire TV entity. - example: 'media_player.android_tv_living_room' + example: "media_player.android_tv_living_room" device_path: description: The filepath on the Android TV / Fire TV device. - example: '/storage/emulated/0/Download/example.txt' + example: "/storage/emulated/0/Download/example.txt" local_path: description: The filepath on your Home Assistant instance. - example: '/config/example.txt' + example: "/config/example.txt" upload: description: Upload a file from your Home Assistant instance to an Android TV / Fire TV device. fields: entity_id: description: Name(s) of Android TV / Fire TV entities. - example: 'media_player.android_tv_living_room' + example: "media_player.android_tv_living_room" device_path: description: The filepath on the Android TV / Fire TV device. - example: '/storage/emulated/0/Download/example.txt' + example: "/storage/emulated/0/Download/example.txt" local_path: description: The filepath on your Home Assistant instance. - example: '/config/example.txt' + example: "/config/example.txt" diff --git a/homeassistant/components/apple_tv/services.yaml b/homeassistant/components/apple_tv/services.yaml index 01e26a5630b7..af1e052fa33f 100644 --- a/homeassistant/components/apple_tv/services.yaml +++ b/homeassistant/components/apple_tv/services.yaml @@ -1,5 +1,8 @@ apple_tv_authenticate: description: Start AirPlay device authentication. fields: - entity_id: {description: Name(s) of entities to authenticate with., example: media_player.apple_tv} -apple_tv_scan: {description: Scan for Apple TV devices.} + entity_id: + description: Name(s) of entities to authenticate with. + example: media_player.apple_tv +apple_tv_scan: + description: Scan for Apple TV devices. diff --git a/homeassistant/components/arcam_fmj/strings.json b/homeassistant/components/arcam_fmj/strings.json index b0006dbb5ae6..85413da8f809 100644 --- a/homeassistant/components/arcam_fmj/strings.json +++ b/homeassistant/components/arcam_fmj/strings.json @@ -1,5 +1,5 @@ { - "config": { - "title": "Arcam FMJ" - } + "config": { + "title": "Arcam FMJ" + } } diff --git a/homeassistant/components/august/manifest.json b/homeassistant/components/august/manifest.json index f1085b815540..c2c383468f6d 100644 --- a/homeassistant/components/august/manifest.json +++ b/homeassistant/components/august/manifest.json @@ -2,14 +2,8 @@ "domain": "august", "name": "August", "documentation": "https://www.home-assistant.io/integrations/august", - "requirements": [ - "py-august==0.25.0" - ], - "dependencies": [ - "configurator" - ], - "codeowners": [ - "@bdraco" - ], + "requirements": ["py-august==0.25.0"], + "dependencies": ["configurator"], + "codeowners": ["@bdraco"], "config_flow": true } diff --git a/homeassistant/components/august/strings.json b/homeassistant/components/august/strings.json index 1695d33cd63d..da8c49184526 100644 --- a/homeassistant/components/august/strings.json +++ b/homeassistant/components/august/strings.json @@ -1,32 +1,32 @@ { - "config" : { - "error" : { - "unknown" : "Unexpected error", - "cannot_connect" : "Failed to connect, please try again", - "invalid_auth" : "Invalid authentication" + "config": { + "error": { + "unknown": "Unexpected error", + "cannot_connect": "Failed to connect, please try again", + "invalid_auth": "Invalid authentication" + }, + "abort": { + "already_configured": "Account is already configured" + }, + "step": { + "validation": { + "title": "Two factor authentication", + "data": { + "code": "Verification code" + }, + "description": "Please check your {login_method} ({username}) and enter the verification code below" }, - "abort" : { - "already_configured" : "Account is already configured" - }, - "step" : { - "validation" : { - "title" : "Two factor authentication", - "data" : { - "code" : "Verification code" - }, - "description" : "Please check your {login_method} ({username}) and enter the verification code below" - }, - "user" : { - "description" : "If the Login Method is 'email', Username is the email address. If the Login Method is 'phone', Username is the phone number in the format '+NNNNNNNNN'.", - "data" : { - "timeout" : "Timeout (seconds)", - "password" : "Password", - "username" : "Username", - "login_method" : "Login Method" - }, - "title" : "Setup an August account" - } - }, - "title" : "August" - } + "user": { + "description": "If the Login Method is 'email', Username is the email address. If the Login Method is 'phone', Username is the phone number in the format '+NNNNNNNNN'.", + "data": { + "timeout": "Timeout (seconds)", + "password": "Password", + "username": "Username", + "login_method": "Login Method" + }, + "title": "Setup an August account" + } + }, + "title": "August" + } } diff --git a/homeassistant/components/auth/strings.json b/homeassistant/components/auth/strings.json index 57f5ed659b08..d386bb7a4888 100644 --- a/homeassistant/components/auth/strings.json +++ b/homeassistant/components/auth/strings.json @@ -1,5 +1,5 @@ { - "mfa_setup":{ + "mfa_setup": { "totp": { "title": "TOTP", "step": { diff --git a/homeassistant/components/binary_sensor/strings.json b/homeassistant/components/binary_sensor/strings.json index e01af8d183ec..f2b32f45304e 100644 --- a/homeassistant/components/binary_sensor/strings.json +++ b/homeassistant/components/binary_sensor/strings.json @@ -87,7 +87,6 @@ "not_opened": "{entity_name} closed", "turned_on": "{entity_name} turned on", "turned_off": "{entity_name} turned off" - } } } diff --git a/homeassistant/components/blackbird/services.yaml b/homeassistant/components/blackbird/services.yaml index d541e21049da..a783dff241bf 100644 --- a/homeassistant/components/blackbird/services.yaml +++ b/homeassistant/components/blackbird/services.yaml @@ -3,8 +3,7 @@ set_all_zones: fields: entity_id: description: Name of any blackbird zone. - example: 'media_player.zone_1' + example: "media_player.zone_1" source: description: Name of source to switch to. - example: 'Source 1' - + example: "Source 1" diff --git a/homeassistant/components/broadlink/services.yaml b/homeassistant/components/broadlink/services.yaml index 2281cb1cc4d0..f1b39976afc1 100644 --- a/homeassistant/components/broadlink/services.yaml +++ b/homeassistant/components/broadlink/services.yaml @@ -1,9 +1,14 @@ send: description: Send a raw packet to device. fields: - host: {description: IP address of device to send packet via. This must be an already configured device., example: "192.168.0.1"} - packet: {description: base64 encoded packet.} + host: + description: IP address of device to send packet via. This must be an already configured device. + example: "192.168.0.1" + packet: + description: base64 encoded packet. learn: description: Learn a IR or RF code from remote. fields: - host: {description: IP address of device to send packet via. This must be an already configured device., example: "192.168.0.1"} + host: + description: IP address of device to send packet via. This must be an already configured device. + example: "192.168.0.1" diff --git a/homeassistant/components/calendar/services.yaml b/homeassistant/components/calendar/services.yaml index d8a0575bcedd..8e2958f73701 100644 --- a/homeassistant/components/calendar/services.yaml +++ b/homeassistant/components/calendar/services.yaml @@ -1,2 +1 @@ # Describes the format for available calendar services - diff --git a/homeassistant/components/camera/services.yaml b/homeassistant/components/camera/services.yaml index 6196322e2345..14f949769846 100644 --- a/homeassistant/components/camera/services.yaml +++ b/homeassistant/components/camera/services.yaml @@ -5,61 +5,61 @@ turn_off: fields: entity_id: description: Entity id. - example: 'camera.living_room' + example: "camera.living_room" turn_on: description: Turn on camera. fields: entity_id: description: Entity id. - example: 'camera.living_room' + example: "camera.living_room" enable_motion_detection: description: Enable the motion detection in a camera. fields: entity_id: description: Name(s) of entities to enable motion detection. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" disable_motion_detection: description: Disable the motion detection in a camera. fields: entity_id: description: Name(s) of entities to disable motion detection. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" snapshot: description: Take a snapshot from a camera. fields: entity_id: description: Name(s) of entities to create snapshots from. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" filename: description: Template of a Filename. Variable is entity_id. - example: '/tmp/snapshot_{{ entity_id }}' + example: "/tmp/snapshot_{{ entity_id }}" play_stream: description: Play camera stream on supported media player. fields: entity_id: description: Name(s) of entities to stream from. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" media_player: description: Name(s) of media player to stream to. - example: 'media_player.living_room_tv' + example: "media_player.living_room_tv" format: description: (Optional) Stream format supported by media player. - example: 'hls' + example: "hls" record: description: Record live camera feed. fields: entity_id: description: Name of entities to record. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" filename: description: Template of a Filename. Variable is entity_id. Must be mp4. - example: '/tmp/snapshot_{{ entity_id }}.mp4' + example: "/tmp/snapshot_{{ entity_id }}.mp4" duration: description: (Optional) Target recording length (in seconds). default: 30 @@ -67,4 +67,3 @@ record: lookback: description: (Optional) Target lookback period (in seconds) to include in addition to duration. Only available if there is currently an active HLS stream. example: 4 - diff --git a/homeassistant/components/cert_expiry/strings.json b/homeassistant/components/cert_expiry/strings.json index 4d4982a19af7..e47613e17ca8 100644 --- a/homeassistant/components/cert_expiry/strings.json +++ b/homeassistant/components/cert_expiry/strings.json @@ -1,24 +1,24 @@ { - "config": { - "title": "Certificate Expiry", - "step": { - "user": { - "title": "Define the certificate to test", - "data": { - "name": "The name of the certificate", - "host": "The hostname of the certificate", - "port": "The port of the certificate" - } - } - }, - "error": { - "resolve_failed": "This host can not be resolved", - "connection_timeout": "Timeout when connecting to this host", - "connection_refused": "Connection refused when connecting to host" - }, - "abort": { - "already_configured": "This host and port combination is already configured", - "import_failed": "Import from config failed" + "config": { + "title": "Certificate Expiry", + "step": { + "user": { + "title": "Define the certificate to test", + "data": { + "name": "The name of the certificate", + "host": "The hostname of the certificate", + "port": "The port of the certificate" } + } + }, + "error": { + "resolve_failed": "This host can not be resolved", + "connection_timeout": "Timeout when connecting to this host", + "connection_refused": "Connection refused when connecting to host" + }, + "abort": { + "already_configured": "This host and port combination is already configured", + "import_failed": "Import from config failed" } + } } diff --git a/homeassistant/components/channels/services.yaml b/homeassistant/components/channels/services.yaml index cbb1dd201a67..f06b2bfd9055 100644 --- a/homeassistant/components/channels/services.yaml +++ b/homeassistant/components/channels/services.yaml @@ -3,21 +3,21 @@ seek_forward: fields: entity_id: description: Name of entity for the instance of Channels to seek in. - example: 'media_player.family_room_channels' + example: "media_player.family_room_channels" seek_backward: description: Seek backward by a set number of seconds. fields: entity_id: description: Name of entity for the instance of Channels to seek in. - example: 'media_player.family_room_channels' + example: "media_player.family_room_channels" seek_by: description: Seek by an inputted number of seconds. fields: entity_id: description: Name of entity for the instance of Channels to seek in. - example: 'media_player.family_room_channels' + example: "media_player.family_room_channels" seconds: description: Number of seconds to seek by. Negative numbers seek backwards. example: 120 diff --git a/homeassistant/components/climate/services.yaml b/homeassistant/components/climate/services.yaml index 815df57f342c..999640812779 100644 --- a/homeassistant/components/climate/services.yaml +++ b/homeassistant/components/climate/services.yaml @@ -5,7 +5,7 @@ set_aux_heat: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" aux_heat: description: New value of axillary heater. example: true @@ -15,17 +15,17 @@ set_preset_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" preset_mode: description: New value of preset mode - example: 'away' + example: "away" set_temperature: description: Set target temperature of climate device. fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" temperature: description: New target temperature for HVAC. example: 25 @@ -37,14 +37,14 @@ set_temperature: example: 20 hvac_mode: description: HVAC operation mode to set temperature to. - example: 'heat' + example: "heat" set_humidity: description: Set target humidity of climate device. fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" humidity: description: New target humidity for climate device. example: 60 @@ -54,7 +54,7 @@ set_fan_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.nest' + example: "climate.nest" fan_mode: description: New value of fan mode. example: On Low @@ -64,7 +64,7 @@ set_hvac_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.nest' + example: "climate.nest" hvac_mode: description: New value of operation mode. example: heat @@ -74,7 +74,7 @@ set_swing_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.nest' + example: "climate.nest" swing_mode: description: New value of swing mode. @@ -83,11 +83,11 @@ turn_on: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" turn_off: description: Turn climate device off. fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" diff --git a/homeassistant/components/counter/services.yaml b/homeassistant/components/counter/services.yaml index 449ae6841ffe..960424df0ca2 100644 --- a/homeassistant/components/counter/services.yaml +++ b/homeassistant/components/counter/services.yaml @@ -5,25 +5,25 @@ decrement: fields: entity_id: description: Entity id of the counter to decrement. - example: 'counter.count0' + example: "counter.count0" increment: description: Increment a counter. fields: entity_id: description: Entity id of the counter to increment. - example: 'counter.count0' + example: "counter.count0" reset: description: Reset a counter. fields: entity_id: description: Entity id of the counter to reset. - example: 'counter.count0' + example: "counter.count0" configure: description: Change counter parameters fields: entity_id: description: Entity id of the counter to change. - example: 'counter.count0' + example: "counter.count0" minimum: description: New minimum value for the counter or None to remove minimum example: 0 diff --git a/homeassistant/components/cover/services.yaml b/homeassistant/components/cover/services.yaml index 64534e409742..604955aa1992 100644 --- a/homeassistant/components/cover/services.yaml +++ b/homeassistant/components/cover/services.yaml @@ -5,28 +5,28 @@ open_cover: fields: entity_id: description: Name(s) of cover(s) to open. - example: 'cover.living_room' + example: "cover.living_room" close_cover: description: Close all or specified cover. fields: entity_id: description: Name(s) of cover(s) to close. - example: 'cover.living_room' + example: "cover.living_room" toggle: description: Toggles a cover open/closed. fields: entity_id: description: Name(s) of cover(s) to toggle. - example: 'cover.garage_door' + example: "cover.garage_door" set_cover_position: description: Move to specific position all or specified cover. fields: entity_id: description: Name(s) of cover(s) to set cover position. - example: 'cover.living_room' + example: "cover.living_room" position: description: Position of the cover (0 to 100). example: 30 @@ -36,35 +36,35 @@ stop_cover: fields: entity_id: description: Name(s) of cover(s) to stop. - example: 'cover.living_room' + example: "cover.living_room" open_cover_tilt: description: Open all or specified cover tilt. fields: entity_id: description: Name(s) of cover(s) tilt to open. - example: 'cover.living_room_blinds' + example: "cover.living_room_blinds" close_cover_tilt: description: Close all or specified cover tilt. fields: entity_id: description: Name(s) of cover(s) to close tilt. - example: 'cover.living_room_blinds' + example: "cover.living_room_blinds" toggle_cover_tilt: description: Toggles a cover tilt open/closed. fields: entity_id: description: Name(s) of cover(s) to toggle tilt. - example: 'cover.living_room_blinds' + example: "cover.living_room_blinds" set_cover_tilt_position: description: Move to specific position all or specified cover tilt. fields: entity_id: description: Name(s) of cover(s) to set cover tilt position. - example: 'cover.living_room_blinds' + example: "cover.living_room_blinds" tilt_position: description: Tilt position of the cover (0 to 100). example: 30 @@ -74,4 +74,4 @@ stop_cover_tilt: fields: entity_id: description: Name(s) of cover(s) to stop. - example: 'cover.living_room_blinds' + example: "cover.living_room_blinds" diff --git a/homeassistant/components/daikin/strings.json b/homeassistant/components/daikin/strings.json index 4badc8b72d78..6c48024efc44 100644 --- a/homeassistant/components/daikin/strings.json +++ b/homeassistant/components/daikin/strings.json @@ -1,19 +1,19 @@ { - "config": { - "title": "Daikin AC", - "step": { - "user": { - "title": "Configure Daikin AC", - "description": "Enter IP address of your Daikin AC.", - "data": { - "host": "Host" - } - } - }, - "abort": { - "device_timeout": "Timeout connecting to the device.", - "device_fail": "Unexpected error creating device.", - "already_configured": "Device is already configured" + "config": { + "title": "Daikin AC", + "step": { + "user": { + "title": "Configure Daikin AC", + "description": "Enter IP address of your Daikin AC.", + "data": { + "host": "Host" } + } + }, + "abort": { + "device_timeout": "Timeout connecting to the device.", + "device_fail": "Unexpected error creating device.", + "already_configured": "Device is already configured" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/deconz/manifest.json b/homeassistant/components/deconz/manifest.json index 288946824302..5ff4a303b0c3 100644 --- a/homeassistant/components/deconz/manifest.json +++ b/homeassistant/components/deconz/manifest.json @@ -3,16 +3,12 @@ "name": "deCONZ", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/deconz", - "requirements": [ - "pydeconz==70" - ], + "requirements": ["pydeconz==70"], "ssdp": [ { "manufacturer": "Royal Philips Electronics" } ], - "codeowners": [ - "@kane610" - ], + "codeowners": ["@kane610"], "quality_scale": "platinum" } diff --git a/homeassistant/components/deconz/services.yaml b/homeassistant/components/deconz/services.yaml index bd5c2eb6a0c7..d8bf3e4d9949 100644 --- a/homeassistant/components/deconz/services.yaml +++ b/homeassistant/components/deconz/services.yaml @@ -3,7 +3,7 @@ configure: fields: entity: description: Entity id representing a specific device in deCONZ. - example: 'light.rgb_light' + example: "light.rgb_light" field: description: >- Field is a string representing a full path to deCONZ endpoint (when @@ -15,11 +15,11 @@ configure: example: '{"on": true}' bridgeid: description: (Optional) Bridgeid is a string unique for each deCONZ hardware. It can be found as part of the integration name. - example: '00212EFFFF012345' + example: "00212EFFFF012345" device_refresh: description: Refresh device lists from deCONZ. fields: bridgeid: description: (Optional) Bridgeid is a string unique for each deCONZ hardware. It can be found as part of the integration name. - example: '00212EFFFF012345' + example: "00212EFFFF012345" diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index 52cd90e54a13..c4ceffd5373a 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -95,4 +95,4 @@ "side_6": "Side 6" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/denonavr/services.yaml b/homeassistant/components/denonavr/services.yaml index 889adc3af058..c9831a68aa52 100644 --- a/homeassistant/components/denonavr/services.yaml +++ b/homeassistant/components/denonavr/services.yaml @@ -1,11 +1,11 @@ # Describes the format for available webostv services get_command: - description: 'Send a generic http get command.' + description: "Send a generic http get command." fields: entity_id: description: Name(s) of the denonavr entities where to run the API method. - example: 'media_player.living_room_receiver' + example: "media_player.living_room_receiver" command: description: Endpoint of the command, including associated parameters. - example: '/goform/formiPhoneAppDirect.xml?RCKSK0410370' + example: "/goform/formiPhoneAppDirect.xml?RCKSK0410370" diff --git a/homeassistant/components/device_tracker/services.yaml b/homeassistant/components/device_tracker/services.yaml index 51865034b00f..63435d0ac9d6 100644 --- a/homeassistant/components/device_tracker/services.yaml +++ b/homeassistant/components/device_tracker/services.yaml @@ -5,22 +5,22 @@ see: fields: mac: description: MAC address of device - example: 'FF:FF:FF:FF:FF:FF' + example: "FF:FF:FF:FF:FF:FF" dev_id: description: Id of device (find id in known_devices.yaml). - example: 'phonedave' + example: "phonedave" host_name: description: Hostname of device - example: 'Dave' + example: "Dave" location_name: description: Name of location where device is located (not_home is away). - example: 'home' + example: "home" gps: description: GPS coordinates where device is located (latitude, longitude). - example: '[51.509802, -0.086692]' + example: "[51.509802, -0.086692]" gps_accuracy: description: Accuracy of GPS coordinates. - example: '80' + example: "80" battery: description: Battery level of device. - example: '100' + example: "100" diff --git a/homeassistant/components/doods/manifest.json b/homeassistant/components/doods/manifest.json index 253174972b17..2e7c9efc7c62 100644 --- a/homeassistant/components/doods/manifest.json +++ b/homeassistant/components/doods/manifest.json @@ -2,9 +2,6 @@ "domain": "doods", "name": "DOODS - Distributed Outside Object Detection Service", "documentation": "https://www.home-assistant.io/integrations/doods", - "requirements": [ - "pydoods==1.0.2", - "pillow==7.0.0" - ], + "requirements": ["pydoods==1.0.2", "pillow==7.0.0"], "codeowners": [] } diff --git a/homeassistant/components/doorbird/manifest.json b/homeassistant/components/doorbird/manifest.json index e0aef80ab61c..6c1c75ff328e 100644 --- a/homeassistant/components/doorbird/manifest.json +++ b/homeassistant/components/doorbird/manifest.json @@ -2,16 +2,9 @@ "domain": "doorbird", "name": "DoorBird", "documentation": "https://www.home-assistant.io/integrations/doorbird", - "requirements": [ - "doorbirdpy==2.0.8" - ], - "dependencies": [ - "http", - "logbook" - ], + "requirements": ["doorbirdpy==2.0.8"], + "dependencies": ["http", "logbook"], "zeroconf": ["_axis-video._tcp.local."], - "codeowners": [ - "@oblogic7", "@bdraco" - ], + "codeowners": ["@oblogic7", "@bdraco"], "config_flow": true } diff --git a/homeassistant/components/doorbird/strings.json b/homeassistant/components/doorbird/strings.json index e4fb72db91ba..6bfda8c31dd2 100644 --- a/homeassistant/components/doorbird/strings.json +++ b/homeassistant/components/doorbird/strings.json @@ -1,37 +1,37 @@ { - "options" : { - "step" : { - "init" : { - "data" : { - "events" : "Comma separated list of events." - }, - "description" : "Add an comma separated event name for each event you wish to track. After entering them here, use the DoorBird app to assign them to a specific event. See the documentation at https://www.home-assistant.io/integrations/doorbird/#events. Example: somebody_pressed_the_button, motion" - } + "options": { + "step": { + "init": { + "data": { + "events": "Comma separated list of events." + }, + "description": "Add an comma separated event name for each event you wish to track. After entering them here, use the DoorBird app to assign them to a specific event. See the documentation at https://www.home-assistant.io/integrations/doorbird/#events. Example: somebody_pressed_the_button, motion" } - }, - "config" : { - "step" : { - "user" : { - "title" : "Connect to the DoorBird", - "data" : { - "password" : "Password", - "host" : "Host (IP Address)", - "name" : "Device Name", - "username" : "Username" - } - } - }, - "abort" : { - "already_configured" : "This DoorBird is already configured", - "link_local_address": "Link local addresses are not supported", - "not_doorbird_device": "This device is not a DoorBird" - }, - "title" : "DoorBird", - "flow_title" : "DoorBird {name} ({host})", - "error" : { - "invalid_auth" : "Invalid authentication", - "unknown" : "Unexpected error", - "cannot_connect" : "Failed to connect, please try again" + } + }, + "config": { + "step": { + "user": { + "title": "Connect to the DoorBird", + "data": { + "password": "Password", + "host": "Host (IP Address)", + "name": "Device Name", + "username": "Username" + } } - } + }, + "abort": { + "already_configured": "This DoorBird is already configured", + "link_local_address": "Link local addresses are not supported", + "not_doorbird_device": "This device is not a DoorBird" + }, + "title": "DoorBird", + "flow_title": "DoorBird {name} ({host})", + "error": { + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error", + "cannot_connect": "Failed to connect, please try again" + } + } } diff --git a/homeassistant/components/duckdns/services.yaml b/homeassistant/components/duckdns/services.yaml index 8c353a0b3cd2..e0ba27390df3 100644 --- a/homeassistant/components/duckdns/services.yaml +++ b/homeassistant/components/duckdns/services.yaml @@ -3,4 +3,4 @@ set_txt: fields: txt: description: Payload for the TXT record. - example: 'This domain name is reserved for use in documentation' + example: "This domain name is reserved for use in documentation" diff --git a/homeassistant/components/dynalite/manifest.json b/homeassistant/components/dynalite/manifest.json index 5c18f0421cd1..39f72f57b060 100755 --- a/homeassistant/components/dynalite/manifest.json +++ b/homeassistant/components/dynalite/manifest.json @@ -1,8 +1,8 @@ { - "domain": "dynalite", - "name": "Philips Dynalite", - "config_flow": true, - "documentation": "https://www.home-assistant.io/integrations/dynalite", - "codeowners": ["@ziv1234"], - "requirements": ["dynalite_devices==0.1.39"] + "domain": "dynalite", + "name": "Philips Dynalite", + "config_flow": true, + "documentation": "https://www.home-assistant.io/integrations/dynalite", + "codeowners": ["@ziv1234"], + "requirements": ["dynalite_devices==0.1.39"] } diff --git a/homeassistant/components/ebusd/strings.json b/homeassistant/components/ebusd/strings.json index ee62df8ddad5..ed1827dd9c28 100644 --- a/homeassistant/components/ebusd/strings.json +++ b/homeassistant/components/ebusd/strings.json @@ -3,4 +3,4 @@ "day": "Day", "night": "Night" } -} \ No newline at end of file +} diff --git a/homeassistant/components/ecobee/services.yaml b/homeassistant/components/ecobee/services.yaml index 2155d3cf7d24..88137bd95301 100644 --- a/homeassistant/components/ecobee/services.yaml +++ b/homeassistant/components/ecobee/services.yaml @@ -55,7 +55,7 @@ resume_program: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" resume_all: description: Resume all events and return to the scheduled program. This default to false which removes only the top event. example: true @@ -65,7 +65,7 @@ set_fan_min_on_time: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" fan_min_on_time: description: New value of fan min on time. example: 5 diff --git a/homeassistant/components/ecobee/strings.json b/homeassistant/components/ecobee/strings.json index 9e7e9fed3965..a6eaa488c60c 100644 --- a/homeassistant/components/ecobee/strings.json +++ b/homeassistant/components/ecobee/strings.json @@ -1,23 +1,23 @@ { - "config": { - "title": "ecobee", - "step": { - "user": { - "title": "ecobee API key", - "description": "Please enter the API key obtained from ecobee.com.", - "data": {"api_key": "API Key"} - }, - "authorize": { - "title": "Authorize app on ecobee.com", - "description": "Please authorize this app at https://www.ecobee.com/consumerportal/index.html with pin code:\n\n{pin}\n\nThen, press Submit." - } - }, - "error": { - "pin_request_failed": "Error requesting PIN from ecobee; please verify API key is correct.", - "token_request_failed": "Error requesting tokens from ecobee; please try again." - }, - "abort": { - "one_instance_only": "This integration currently supports only one ecobee instance." - } + "config": { + "title": "ecobee", + "step": { + "user": { + "title": "ecobee API key", + "description": "Please enter the API key obtained from ecobee.com.", + "data": { "api_key": "API Key" } + }, + "authorize": { + "title": "Authorize app on ecobee.com", + "description": "Please authorize this app at https://www.ecobee.com/consumerportal/index.html with pin code:\n\n{pin}\n\nThen, press Submit." + } + }, + "error": { + "pin_request_failed": "Error requesting PIN from ecobee; please verify API key is correct.", + "token_request_failed": "Error requesting tokens from ecobee; please try again." + }, + "abort": { + "one_instance_only": "This integration currently supports only one ecobee instance." } + } } diff --git a/homeassistant/components/edl21/manifest.json b/homeassistant/components/edl21/manifest.json index 6eaf933b82bd..3e469e44601e 100644 --- a/homeassistant/components/edl21/manifest.json +++ b/homeassistant/components/edl21/manifest.json @@ -2,10 +2,6 @@ "domain": "edl21", "name": "EDL21", "documentation": "https://www.home-assistant.io/integrations/edl21", - "requirements": [ - "pysml==0.0.2" - ], - "codeowners": [ - "@mtdcr" - ] + "requirements": ["pysml==0.0.2"], + "codeowners": ["@mtdcr"] } diff --git a/homeassistant/components/eight_sleep/services.yaml b/homeassistant/components/eight_sleep/services.yaml index 49a3c67d6049..05354bccc685 100644 --- a/homeassistant/components/eight_sleep/services.yaml +++ b/homeassistant/components/eight_sleep/services.yaml @@ -1,6 +1,12 @@ heat_set: description: Set heating/cooling level for eight sleep. fields: - duration: {description: Duration to heat/cool at the target level in seconds., example: 3600} - entity_id: {description: Entity id of the bed state to adjust., example: sensor.eight_left_bed_state} - target: {description: Target cooling/heating level from -100 to 100., example: 35} + duration: + description: Duration to heat/cool at the target level in seconds. + example: 3600 + entity_id: + description: Entity id of the bed state to adjust. + example: sensor.eight_left_bed_state + target: + description: Target cooling/heating level from -100 to 100. + example: 35 diff --git a/homeassistant/components/elkm1/manifest.json b/homeassistant/components/elkm1/manifest.json index d1ce5d28c249..5a88792208ae 100644 --- a/homeassistant/components/elkm1/manifest.json +++ b/homeassistant/components/elkm1/manifest.json @@ -2,11 +2,7 @@ "domain": "elkm1", "name": "Elk-M1 Control", "documentation": "https://www.home-assistant.io/integrations/elkm1", - "requirements": [ - "elkm1-lib==0.7.17" - ], - "codeowners": [ - "@bdraco" - ], + "requirements": ["elkm1-lib==0.7.17"], + "codeowners": ["@bdraco"], "config_flow": true } diff --git a/homeassistant/components/elkm1/services.yaml b/homeassistant/components/elkm1/services.yaml index fbcbf7edc6dd..beb4427d14c7 100644 --- a/homeassistant/components/elkm1/services.yaml +++ b/homeassistant/components/elkm1/services.yaml @@ -3,7 +3,7 @@ alarm_arm_home_instant: fields: entity_id: description: Name of alarm control panel to arm. - example: 'alarm_control_panel.main' + example: "alarm_control_panel.main" code: description: An code to arm the alarm control panel. example: 1234 @@ -13,7 +13,7 @@ alarm_arm_night_instant: fields: entity_id: description: Name of alarm control panel to arm. - example: 'alarm_control_panel.main' + example: "alarm_control_panel.main" code: description: An code to arm the alarm control panel. example: 1234 @@ -23,7 +23,7 @@ alarm_arm_vacation: fields: entity_id: description: Name of alarm control panel to arm. - example: 'alarm_control_panel.main' + example: "alarm_control_panel.main" code: description: An code to arm the alarm control panel. example: 1234 @@ -33,7 +33,7 @@ alarm_display_message: fields: entity_id: description: Name of alarm control panel to display messages on. - example: 'alarm_control_panel.main' + example: "alarm_control_panel.main" clear: description: 0=clear message, 1=clear message with * key, 2=Display until timeout; default 2 example: 1 diff --git a/homeassistant/components/elkm1/strings.json b/homeassistant/components/elkm1/strings.json index a5246a004c3e..36272a3de883 100644 --- a/homeassistant/components/elkm1/strings.json +++ b/homeassistant/components/elkm1/strings.json @@ -25,4 +25,4 @@ "address_already_configured": "An ElkM1 with this address is already configured" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/emulated_roku/strings.json b/homeassistant/components/emulated_roku/strings.json index 376252966a37..987e49079117 100644 --- a/homeassistant/components/emulated_roku/strings.json +++ b/homeassistant/components/emulated_roku/strings.json @@ -1,21 +1,21 @@ { - "config": { - "abort": { - "name_exists": "Name already exists" + "config": { + "abort": { + "name_exists": "Name already exists" + }, + "step": { + "user": { + "data": { + "advertise_ip": "Advertise IP", + "advertise_port": "Advertise port", + "host_ip": "Host IP", + "listen_port": "Listen port", + "name": "Name", + "upnp_bind_multicast": "Bind multicast (True/False)" }, - "step": { - "user": { - "data": { - "advertise_ip": "Advertise IP", - "advertise_port": "Advertise port", - "host_ip": "Host IP", - "listen_port": "Listen port", - "name": "Name", - "upnp_bind_multicast": "Bind multicast (True/False)" - }, - "title": "Define server configuration" - } - }, - "title": "EmulatedRoku" - } -} \ No newline at end of file + "title": "Define server configuration" + } + }, + "title": "EmulatedRoku" + } +} diff --git a/homeassistant/components/envisalink/services.yaml b/homeassistant/components/envisalink/services.yaml index 2a5f91791df4..e9229ad838da 100644 --- a/homeassistant/components/envisalink/services.yaml +++ b/homeassistant/components/envisalink/services.yaml @@ -5,10 +5,10 @@ alarm_keypress: fields: entity_id: description: Name of the alarm control panel to trigger. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" keypress: - description: 'String to send to the alarm panel (1-6 characters).' - example: '*71' + description: "String to send to the alarm panel (1-6 characters)." + example: "*71" invoke_custom_function: description: > diff --git a/homeassistant/components/epson/services.yaml b/homeassistant/components/epson/services.yaml index 6e9724c95f72..a463cd355124 100644 --- a/homeassistant/components/epson/services.yaml +++ b/homeassistant/components/epson/services.yaml @@ -3,7 +3,7 @@ select_cmode: fields: entity_id: description: Name of projector - example: 'media_player.epson_projector' + example: "media_player.epson_projector" cmode: description: Name of Cmode - example: 'cinema' + example: "cinema" diff --git a/homeassistant/components/esphome/strings.json b/homeassistant/components/esphome/strings.json index 3b662441e139..00d1ab1828ea 100644 --- a/homeassistant/components/esphome/strings.json +++ b/homeassistant/components/esphome/strings.json @@ -1,35 +1,35 @@ { - "config": { - "abort": { - "already_configured": "ESP is already configured" + "config": { + "abort": { + "already_configured": "ESP is already configured" + }, + "error": { + "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", + "connection_error": "Can't connect to ESP. Please make sure your YAML file contains an 'api:' line.", + "invalid_password": "Invalid password!" + }, + "step": { + "user": { + "data": { + "host": "Host", + "port": "Port" }, - "error": { - "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", - "connection_error": "Can't connect to ESP. Please make sure your YAML file contains an 'api:' line.", - "invalid_password": "Invalid password!" + "description": "Please enter connection settings of your [ESPHome](https://esphomelib.com/) node.", + "title": "ESPHome" + }, + "authenticate": { + "data": { + "password": "Password" }, - "step": { - "user": { - "data": { - "host": "Host", - "port": "Port" - }, - "description": "Please enter connection settings of your [ESPHome](https://esphomelib.com/) node.", - "title": "ESPHome" - }, - "authenticate": { - "data": { - "password": "Password" - }, - "description": "Please enter the password you set in your configuration for {name}.", - "title": "Enter Password" - }, - "discovery_confirm": { - "description": "Do you want to add the ESPHome node `{name}` to Home Assistant?", - "title": "Discovered ESPHome node" - } - }, - "title": "ESPHome", - "flow_title": "ESPHome: {name}" - } + "description": "Please enter the password you set in your configuration for {name}.", + "title": "Enter Password" + }, + "discovery_confirm": { + "description": "Do you want to add the ESPHome node `{name}` to Home Assistant?", + "title": "Discovered ESPHome node" + } + }, + "title": "ESPHome", + "flow_title": "ESPHome: {name}" + } } diff --git a/homeassistant/components/evohome/services.yaml b/homeassistant/components/evohome/services.yaml index ebc859ed9e3c..04f7a3ac2aa3 100644 --- a/homeassistant/components/evohome/services.yaml +++ b/homeassistant/components/evohome/services.yaml @@ -3,16 +3,16 @@ set_system_mode: description: >- - Set the system mode, either indefinitely, or for a specified period of time, after - which it will revert to Auto. Not all systems support all modes. + Set the system mode, either indefinitely, or for a specified period of time, after + which it will revert to Auto. Not all systems support all modes. fields: mode: - description: 'One of: Auto, AutoWithEco, Away, DayOff, HeatingOff, or Custom.' + description: "One of: Auto, AutoWithEco, Away, DayOff, HeatingOff, or Custom." example: Away period: description: >- - A period of time in days; used only with Away, DayOff, or Custom. The system - will revert to Auto at midnight (up to 99 days, today is day 1). + A period of time in days; used only with Away, DayOff, or Custom. The system + will revert to Auto at midnight (up to 99 days, today is day 1). example: '{"days": 28}' duration: description: The duration in hours; used only with AutoWithEco (up to 24 hours). @@ -20,18 +20,18 @@ set_system_mode: reset_system: description: >- - Set the system to Auto mode and reset all the zones to follow their schedules. - Not all Evohome systems support this feature (i.e. AutoWithReset mode). + Set the system to Auto mode and reset all the zones to follow their schedules. + Not all Evohome systems support this feature (i.e. AutoWithReset mode). refresh_system: description: >- - Pull the latest data from the vendor's servers now, rather than waiting for the - next scheduled update. + Pull the latest data from the vendor's servers now, rather than waiting for the + next scheduled update. set_zone_override: description: >- - Override a zone's setpoint, either indefinitely, or for a specified period of - time, after which it will revert to following its schedule. + Override a zone's setpoint, either indefinitely, or for a specified period of + time, after which it will revert to following its schedule. fields: entity_id: description: The entity_id of the Evohome zone. @@ -41,8 +41,8 @@ set_zone_override: example: 5.0 duration: description: >- - The zone will revert to its schedule after this time. If 0 the change is until - the next scheduled setpoint. + The zone will revert to its schedule after this time. If 0 the change is until + the next scheduled setpoint. example: '{"minutes": 135}' clear_zone_override: diff --git a/homeassistant/components/ezviz/manifest.json b/homeassistant/components/ezviz/manifest.json index 6b02dd4dbf70..651fd77619cd 100644 --- a/homeassistant/components/ezviz/manifest.json +++ b/homeassistant/components/ezviz/manifest.json @@ -4,4 +4,4 @@ "documentation": "https://www.home-assistant.io/integrations/ezviz", "codeowners": ["@baqs"], "requirements": ["pyezviz==0.1.5"] -} +} diff --git a/homeassistant/components/facebox/services.yaml b/homeassistant/components/facebox/services.yaml index c6b686efb851..caa2e7df2c66 100644 --- a/homeassistant/components/facebox/services.yaml +++ b/homeassistant/components/facebox/services.yaml @@ -3,10 +3,10 @@ teach_face: fields: entity_id: description: The facebox entity to teach. - example: 'image_processing.facebox' + example: "image_processing.facebox" name: description: The name of the face to teach. - example: 'my_name' + example: "my_name" file_path: description: The path to the image file. - example: '/images/my_image.jpg' + example: "/images/my_image.jpg" diff --git a/homeassistant/components/foscam/services.yaml b/homeassistant/components/foscam/services.yaml index 64e68dd5bc42..33ba82482f1a 100644 --- a/homeassistant/components/foscam/services.yaml +++ b/homeassistant/components/foscam/services.yaml @@ -3,10 +3,10 @@ ptz: fields: entity_id: description: Name(s) of entities to move. - example: 'camera.living_room_camera' + example: "camera.living_room_camera" movement: description: "Direction of the movement. Allowed values: up, down, left, right, top_left, top_right, bottom_left, bottom_right." - example: 'up' + example: "up" travel_time: description: "(Optional) Travel time in seconds. Allowed values: float from 0 to 1. Default: 0.125" example: 0.125 diff --git a/homeassistant/components/freebox/strings.json b/homeassistant/components/freebox/strings.json index 867a497d02fb..9f402a7d1e65 100644 --- a/homeassistant/components/freebox/strings.json +++ b/homeassistant/components/freebox/strings.json @@ -1,26 +1,26 @@ { - "config": { + "config": { + "title": "Freebox", + "step": { + "user": { "title": "Freebox", - "step": { - "user": { - "title": "Freebox", - "data": { - "host": "Host", - "port": "Port" - } - }, - "link": { - "title": "Link Freebox router", - "description": "Click \"Submit\", then touch the right arrow on the router to register Freebox with Home Assistant.\n\n![Location of button on the router](/static/images/config_freebox.png)" - } - }, - "error":{ - "register_failed": "Failed to register, please try again", - "connection_failed": "Failed to connect, please try again", - "unknown": "Unknown error: please retry later" - }, - "abort":{ - "already_configured": "Host already configured" + "data": { + "host": "Host", + "port": "Port" } + }, + "link": { + "title": "Link Freebox router", + "description": "Click \"Submit\", then touch the right arrow on the router to register Freebox with Home Assistant.\n\n![Location of button on the router](/static/images/config_freebox.png)" + } + }, + "error": { + "register_failed": "Failed to register, please try again", + "connection_failed": "Failed to connect, please try again", + "unknown": "Unknown error: please retry later" + }, + "abort": { + "already_configured": "Host already configured" } + } } diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index d9f114777acd..3059a0fa71cd 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,9 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": [ - "home-assistant-frontend==20200403.0" - ], + "requirements": ["home-assistant-frontend==20200403.0"], "dependencies": [ "api", "auth", @@ -16,8 +14,6 @@ "system_log", "websocket_api" ], - "codeowners": [ - "@home-assistant/frontend" - ], + "codeowners": ["@home-assistant/frontend"], "quality_scale": "internal" } diff --git a/homeassistant/components/frontend/services.yaml b/homeassistant/components/frontend/services.yaml index dc1fb40be484..489164ce7bd9 100644 --- a/homeassistant/components/frontend/services.yaml +++ b/homeassistant/components/frontend/services.yaml @@ -5,7 +5,7 @@ set_theme: fields: name: description: Name of a predefined theme or 'default'. - example: 'light' + example: "light" reload_themes: description: Reload themes from yaml configuration. diff --git a/homeassistant/components/gdacs/manifest.json b/homeassistant/components/gdacs/manifest.json index 3af46cc80670..630ed0a4a06c 100644 --- a/homeassistant/components/gdacs/manifest.json +++ b/homeassistant/components/gdacs/manifest.json @@ -3,11 +3,7 @@ "name": "Global Disaster Alert and Coordination System (GDACS)", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/gdacs", - "requirements": [ - "aio_georss_gdacs==0.3" - ], - "codeowners": [ - "@exxamalte" - ], + "requirements": ["aio_georss_gdacs==0.3"], + "codeowners": ["@exxamalte"], "quality_scale": "platinum" } diff --git a/homeassistant/components/geniushub/services.yaml b/homeassistant/components/geniushub/services.yaml index d7522ac29951..50cd8d7d01e7 100644 --- a/homeassistant/components/geniushub/services.yaml +++ b/homeassistant/components/geniushub/services.yaml @@ -3,18 +3,18 @@ set_zone_mode: description: >- - Set the zone to an operating mode. + Set the zone to an operating mode. fields: entity_id: description: The zone's entity_id. example: climate.kitchen mode: - description: 'One of: off, timer or footprint.' + description: "One of: off, timer or footprint." example: timer set_zone_override: description: >- - Override the zone's setpoint for a given duration. + Override the zone's setpoint for a given duration. fields: entity_id: description: The zone's entity_id. @@ -24,6 +24,5 @@ set_zone_override: example: 19.2 duration: description: >- - The duration of the override. Optional, default 1 hour, maximum 24 hours. + The duration of the override. Optional, default 1 hour, maximum 24 hours. example: '{"minutes": 135}' - diff --git a/homeassistant/components/geofency/strings.json b/homeassistant/components/geofency/strings.json index e67af592c168..7951df50e5ed 100644 --- a/homeassistant/components/geofency/strings.json +++ b/homeassistant/components/geofency/strings.json @@ -15,4 +15,4 @@ "default": "To send events to Home Assistant, you will need to setup the webhook feature in Geofency.\n\nFill in the following info:\n\n- URL: `{webhook_url}`\n- Method: POST\n\nSee [the documentation]({docs_url}) for further details." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/glances/strings.json b/homeassistant/components/glances/strings.json index 1bd7275daeff..3ec324f9cd6d 100644 --- a/homeassistant/components/glances/strings.json +++ b/homeassistant/components/glances/strings.json @@ -1,37 +1,37 @@ { - "config": { - "title": "Glances", - "step": { - "user": { - "title": "Setup Glances", - "data": { - "name": "Name", - "host": "Host", - "username": "Username", - "password": "Password", - "port": "Port", - "version": "Glances API Version (2 or 3)", - "ssl": "Use SSL/TLS to connect to the Glances system", - "verify_ssl": "Verify the certification of the system" - } - } - }, - "error": { - "cannot_connect": "Unable to connect to host", - "wrong_version": "Version not supported (2 or 3 only)" - }, - "abort": { - "already_configured": "Host is already configured." + "config": { + "title": "Glances", + "step": { + "user": { + "title": "Setup Glances", + "data": { + "name": "Name", + "host": "Host", + "username": "Username", + "password": "Password", + "port": "Port", + "version": "Glances API Version (2 or 3)", + "ssl": "Use SSL/TLS to connect to the Glances system", + "verify_ssl": "Verify the certification of the system" } + } }, - "options": { - "step": { - "init": { - "description": "Configure options for Glances", - "data": { - "scan_interval": "Update frequency" - } - } - } + "error": { + "cannot_connect": "Unable to connect to host", + "wrong_version": "Version not supported (2 or 3 only)" + }, + "abort": { + "already_configured": "Host is already configured." } -} \ No newline at end of file + }, + "options": { + "step": { + "init": { + "description": "Configure options for Glances", + "data": { + "scan_interval": "Update frequency" + } + } + } + } +} diff --git a/homeassistant/components/gpslogger/strings.json b/homeassistant/components/gpslogger/strings.json index d5641ef5db81..add0ad31cbbc 100644 --- a/homeassistant/components/gpslogger/strings.json +++ b/homeassistant/components/gpslogger/strings.json @@ -15,4 +15,4 @@ "default": "To send events to Home Assistant, you will need to setup the webhook feature in GPSLogger.\n\nFill in the following info:\n\n- URL: `{webhook_url}`\n- Method: POST\n\nSee [the documentation]({docs_url}) for further details." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/griddy/strings.json b/homeassistant/components/griddy/strings.json index bedd85e75089..ee4df700f790 100644 --- a/homeassistant/components/griddy/strings.json +++ b/homeassistant/components/griddy/strings.json @@ -1,21 +1,21 @@ { - "config" : { - "error" : { - "cannot_connect" : "Failed to connect, please try again", - "unknown" : "Unexpected error" - }, - "title" : "Griddy", - "step" : { - "user" : { - "description" : "Your Load Zone is in your Griddy account under “Account > Meter > Load Zone.”", - "data" : { - "loadzone" : "Load Zone (Settlement Point)" - }, - "title" : "Setup your Griddy Load Zone" - } - }, - "abort" : { - "already_configured" : "This Load Zone is already configured" + "config": { + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "title": "Griddy", + "step": { + "user": { + "description": "Your Load Zone is in your Griddy account under “Account > Meter > Load Zone.”", + "data": { + "loadzone": "Load Zone (Settlement Point)" + }, + "title": "Setup your Griddy Load Zone" } - } + }, + "abort": { + "already_configured": "This Load Zone is already configured" + } + } } diff --git a/homeassistant/components/hangouts/strings.json b/homeassistant/components/hangouts/strings.json index 8c155784ebe1..7bd67a7a2c8b 100644 --- a/homeassistant/components/hangouts/strings.json +++ b/homeassistant/components/hangouts/strings.json @@ -1,30 +1,30 @@ { - "config": { - "abort": { - "already_configured": "Google Hangouts is already configured", - "unknown": "Unknown error occurred." + "config": { + "abort": { + "already_configured": "Google Hangouts is already configured", + "unknown": "Unknown error occurred." + }, + "error": { + "invalid_login": "Invalid Login, please try again.", + "invalid_2fa": "Invalid 2 Factor Authentication, please try again.", + "invalid_2fa_method": "Invalid 2FA Method (Verify on Phone)." + }, + "step": { + "user": { + "data": { + "email": "E-Mail Address", + "password": "Password", + "authorization_code": "Authorization Code (required for manual authentication)" }, - "error": { - "invalid_login": "Invalid Login, please try again.", - "invalid_2fa": "Invalid 2 Factor Authentication, please try again.", - "invalid_2fa_method": "Invalid 2FA Method (Verify on Phone)." + "title": "Google Hangouts Login" + }, + "2fa": { + "data": { + "2fa": "2FA Pin" }, - "step": { - "user": { - "data": { - "email": "E-Mail Address", - "password": "Password", - "authorization_code": "Authorization Code (required for manual authentication)" - }, - "title": "Google Hangouts Login" - }, - "2fa": { - "data": { - "2fa": "2FA Pin" - }, - "title": "2-Factor-Authentication" - } - }, - "title": "Google Hangouts" - } + "title": "2-Factor-Authentication" + } + }, + "title": "Google Hangouts" + } } diff --git a/homeassistant/components/harmony/manifest.json b/homeassistant/components/harmony/manifest.json index f3ed23282917..154fd211aa81 100644 --- a/homeassistant/components/harmony/manifest.json +++ b/homeassistant/components/harmony/manifest.json @@ -3,7 +3,7 @@ "name": "Logitech Harmony Hub", "documentation": "https://www.home-assistant.io/integrations/harmony", "requirements": ["aioharmony==0.1.13"], - "codeowners": ["@ehendrix23","@bramkragten","@bdraco"], + "codeowners": ["@ehendrix23", "@bramkragten", "@bdraco"], "ssdp": [ { "manufacturer": "Logitech", diff --git a/homeassistant/components/hdmi_cec/services.yaml b/homeassistant/components/hdmi_cec/services.yaml index 256b26c00c75..aa85ffb0214e 100644 --- a/homeassistant/components/hdmi_cec/services.yaml +++ b/homeassistant/components/hdmi_cec/services.yaml @@ -1,4 +1,5 @@ -power_on: { description: Power on all devices which supports it. } +power_on: + description: Power on all devices which supports it. select_device: description: Select HDMI device. fields: diff --git a/homeassistant/components/heos/strings.json b/homeassistant/components/heos/strings.json index 9a00ac6a4bd1..28b404acdbd0 100644 --- a/homeassistant/components/heos/strings.json +++ b/homeassistant/components/heos/strings.json @@ -1,21 +1,21 @@ { - "config": { - "title": "HEOS", - "step": { - "user": { - "title": "Connect to Heos", - "description": "Please enter the host name or IP address of a Heos device (preferably one connected via wire to the network).", - "data": { - "access_token": "Host", - "host": "Host" - } - } - }, - "error": { - "connection_failure": "Unable to connect to the specified host." - }, - "abort": { - "already_setup": "You can only configure a single Heos connection as it will support all devices on the network." + "config": { + "title": "HEOS", + "step": { + "user": { + "title": "Connect to Heos", + "description": "Please enter the host name or IP address of a Heos device (preferably one connected via wire to the network).", + "data": { + "access_token": "Host", + "host": "Host" } + } + }, + "error": { + "connection_failure": "Unable to connect to the specified host." + }, + "abort": { + "already_setup": "You can only configure a single Heos connection as it will support all devices on the network." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/homekit_controller/strings.json b/homeassistant/components/homekit_controller/strings.json index 80370717183d..40295c74e0a3 100644 --- a/homeassistant/components/homekit_controller/strings.json +++ b/homeassistant/components/homekit_controller/strings.json @@ -1,40 +1,40 @@ { - "config": { - "title": "HomeKit Accessory", - "flow_title": "HomeKit Accessory: {name}", - "step": { - "user": { - "title": "Pair with HomeKit Accessory", - "description": "Select the device you want to pair with", - "data": { - "device": "Device" - } - }, - "pair": { - "title": "Pair with HomeKit Accessory", - "description": "Enter your HomeKit pairing code (in the format XXX-XX-XXX) to use this accessory", - "data": { - "pairing_code": "Pairing Code" - } - } - }, - "error": { - "unable_to_pair": "Unable to pair, please try again.", - "unknown_error": "Device reported an unknown error. Pairing failed.", - "authentication_error": "Incorrect HomeKit code. Please check it and try again.", - "max_peers_error": "Device refused to add pairing as it has no free pairing storage.", - "busy_error": "Device refused to add pairing as it is already pairing with another controller.", - "max_tries_error": "Device refused to add pairing as it has received more than 100 unsuccessful authentication attempts.", - "pairing_failed": "An unhandled error occurred while attempting to pair with this device. This may be a temporary failure or your device may not be supported currently." - }, - "abort": { - "no_devices": "No unpaired devices could be found", - "already_paired": "This accessory is already paired to another device. Please reset the accessory and try again.", - "ignored_model": "HomeKit support for this model is blocked as a more feature complete native integration is available.", - "already_configured": "Accessory is already configured with this controller.", - "invalid_config_entry": "This device is showing as ready to pair but there is already a conflicting configuration entry for it in Home Assistant that must first be removed.", - "accessory_not_found_error": "Cannot add pairing as device can no longer be found.", - "already_in_progress": "Config flow for device is already in progress." + "config": { + "title": "HomeKit Accessory", + "flow_title": "HomeKit Accessory: {name}", + "step": { + "user": { + "title": "Pair with HomeKit Accessory", + "description": "Select the device you want to pair with", + "data": { + "device": "Device" } + }, + "pair": { + "title": "Pair with HomeKit Accessory", + "description": "Enter your HomeKit pairing code (in the format XXX-XX-XXX) to use this accessory", + "data": { + "pairing_code": "Pairing Code" + } + } + }, + "error": { + "unable_to_pair": "Unable to pair, please try again.", + "unknown_error": "Device reported an unknown error. Pairing failed.", + "authentication_error": "Incorrect HomeKit code. Please check it and try again.", + "max_peers_error": "Device refused to add pairing as it has no free pairing storage.", + "busy_error": "Device refused to add pairing as it is already pairing with another controller.", + "max_tries_error": "Device refused to add pairing as it has received more than 100 unsuccessful authentication attempts.", + "pairing_failed": "An unhandled error occurred while attempting to pair with this device. This may be a temporary failure or your device may not be supported currently." + }, + "abort": { + "no_devices": "No unpaired devices could be found", + "already_paired": "This accessory is already paired to another device. Please reset the accessory and try again.", + "ignored_model": "HomeKit support for this model is blocked as a more feature complete native integration is available.", + "already_configured": "Accessory is already configured with this controller.", + "invalid_config_entry": "This device is showing as ready to pair but there is already a conflicting configuration entry for it in Home Assistant that must first be removed.", + "accessory_not_found_error": "Cannot add pairing as device can no longer be found.", + "already_in_progress": "Config flow for device is already in progress." } + } } diff --git a/homeassistant/components/homematic/services.yaml b/homeassistant/components/homematic/services.yaml index 044bcfa46adc..5d52f13f39e5 100644 --- a/homeassistant/components/homematic/services.yaml +++ b/homeassistant/components/homematic/services.yaml @@ -21,10 +21,10 @@ set_variable_value: fields: entity_id: description: Name(s) of homematic central to set value. - example: 'homematic.ccu2' + example: "homematic.ccu2" name: description: Name of the variable to set. - example: 'testvariable' + example: "testvariable" value: description: New value example: 1 @@ -82,4 +82,3 @@ put_paramset: paramset: description: A paramset dictionary example: '{"WEEK_PROGRAM_POINTER": 1}' - diff --git a/homeassistant/components/html5/services.yaml b/homeassistant/components/html5/services.yaml index 5fd068a64dcd..f3df43415940 100644 --- a/homeassistant/components/html5/services.yaml +++ b/homeassistant/components/html5/services.yaml @@ -3,7 +3,7 @@ dismiss: fields: target: description: An array of targets. Optional. - example: ['my_phone', 'my_tablet'] + example: ["my_phone", "my_tablet"] data: description: Extended information of notification. Supports tag. Optional. example: '{ "tag": "tagname" }' diff --git a/homeassistant/components/huawei_lte/strings.json b/homeassistant/components/huawei_lte/strings.json index c5f2b4a2a02e..a23c2a9184f0 100644 --- a/homeassistant/components/huawei_lte/strings.json +++ b/homeassistant/components/huawei_lte/strings.json @@ -1,43 +1,43 @@ { - "config": { - "abort": { - "already_configured": "This device has already been configured", - "already_in_progress": "This device is already being configured", - "not_huawei_lte": "Not a Huawei LTE device" - }, - "error": { - "connection_failed": "Connection failed", - "connection_timeout": "Connection timeout", - "incorrect_password": "Incorrect password", - "incorrect_username": "Incorrect username", - "incorrect_username_or_password": "Incorrect username or password", - "invalid_url": "Invalid URL", - "login_attempts_exceeded": "Maximum login attempts exceeded, please try again later", - "response_error": "Unknown error from device", - "unknown_connection_error": "Unknown error connecting to device" - }, - "step": { - "user": { - "data": { - "password": "Password", - "url": "URL", - "username": "User name" - }, - "description": "Enter device access details. Specifying username and password is optional, but enables support for more integration features. On the other hand, use of an authorized connection may cause problems accessing the device web interface from outside Home Assistant while the integration is active, and the other way around.", - "title": "Configure Huawei LTE" - } - }, - "title": "Huawei LTE" + "config": { + "abort": { + "already_configured": "This device has already been configured", + "already_in_progress": "This device is already being configured", + "not_huawei_lte": "Not a Huawei LTE device" }, - "options": { - "step": { - "init": { - "data": { - "name": "Notification service name (change requires restart)", - "recipient": "SMS notification recipients", - "track_new_devices": "Track new devices" - } - } + "error": { + "connection_failed": "Connection failed", + "connection_timeout": "Connection timeout", + "incorrect_password": "Incorrect password", + "incorrect_username": "Incorrect username", + "incorrect_username_or_password": "Incorrect username or password", + "invalid_url": "Invalid URL", + "login_attempts_exceeded": "Maximum login attempts exceeded, please try again later", + "response_error": "Unknown error from device", + "unknown_connection_error": "Unknown error connecting to device" + }, + "step": { + "user": { + "data": { + "password": "Password", + "url": "URL", + "username": "User name" + }, + "description": "Enter device access details. Specifying username and password is optional, but enables support for more integration features. On the other hand, use of an authorized connection may cause problems accessing the device web interface from outside Home Assistant while the integration is active, and the other way around.", + "title": "Configure Huawei LTE" + } + }, + "title": "Huawei LTE" + }, + "options": { + "step": { + "init": { + "data": { + "name": "Notification service name (change requires restart)", + "recipient": "SMS notification recipients", + "track_new_devices": "Track new devices" } + } } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/hue/strings.json b/homeassistant/components/hue/strings.json index 0f70c49ff2e9..9f23f0568947 100644 --- a/homeassistant/components/hue/strings.json +++ b/homeassistant/components/hue/strings.json @@ -45,4 +45,4 @@ "remote_button_short_release": "\"{subtype}\" button released" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/icloud/services.yaml b/homeassistant/components/icloud/services.yaml index ce239df7564c..3013b04943dc 100644 --- a/homeassistant/components/icloud/services.yaml +++ b/homeassistant/components/icloud/services.yaml @@ -3,47 +3,46 @@ update: fields: account: description: Your iCloud account username (email) or account name. - example: 'steve@apple.com' + example: "steve@apple.com" play_sound: description: Play sound on an Apple device. fields: account: description: (required) Your iCloud account username (email) or account name. - example: 'steve@apple.com' + example: "steve@apple.com" device_name: description: (required) The name of the Apple device to play a sound. - example: 'stevesiphone' + example: "stevesiphone" display_message: description: Display a message on an Apple device. fields: account: description: (required) Your iCloud account username (email) or account name. - example: 'steve@apple.com' + example: "steve@apple.com" device_name: description: (required) The name of the Apple device to display the message. - example: 'stevesiphone' + example: "stevesiphone" message: description: (required) The content of your message. - example: 'Hey Steve !' + example: "Hey Steve !" sound: description: To make a sound when displaying the message (boolean). - example: 'true' + example: "true" lost_device: description: Make an Apple device in lost state. fields: account: description: (required) Your iCloud account username (email) or account name. - example: 'steve@apple.com' + example: "steve@apple.com" device_name: description: (required) The name of the Apple device to set lost. - example: 'stevesiphone' + example: "stevesiphone" number: description: (required) The phone number to call in lost mode (must contain country code). - example: '+33450020100' + example: "+33450020100" message: description: (required) The message to display in lost mode. - example: 'Call me' - + example: "Call me" diff --git a/homeassistant/components/icloud/strings.json b/homeassistant/components/icloud/strings.json index 6cea7dc11756..abf47e5744f2 100644 --- a/homeassistant/components/icloud/strings.json +++ b/homeassistant/components/icloud/strings.json @@ -1,39 +1,39 @@ { - "config": { - "title": "Apple iCloud", - "step": { - "user": { - "title": "iCloud credentials", - "description": "Enter your credentials", - "data": { - "username": "Email", - "password": "Password", - "with_family": "With family" - } - }, - "trusted_device": { - "title": "iCloud trusted device", - "description": "Select your trusted device", - "data": { - "trusted_device": "Trusted device" - } - }, - "verification_code": { - "title": "iCloud verification code", - "description": "Please enter the verification code you just received from iCloud", - "data": { - "verification_code": "Verification code" - } - } - }, - "error": { - "login": "Login error: please check your email & password", - "send_verification_code": "Failed to send verification code", - "validate_verification_code": "Failed to verify your verification code, choose a trust device and start the verification again" - }, - "abort": { - "already_configured": "Account already configured", - "no_device": "None of your devices have \"Find my iPhone\" activated" + "config": { + "title": "Apple iCloud", + "step": { + "user": { + "title": "iCloud credentials", + "description": "Enter your credentials", + "data": { + "username": "Email", + "password": "Password", + "with_family": "With family" } + }, + "trusted_device": { + "title": "iCloud trusted device", + "description": "Select your trusted device", + "data": { + "trusted_device": "Trusted device" + } + }, + "verification_code": { + "title": "iCloud verification code", + "description": "Please enter the verification code you just received from iCloud", + "data": { + "verification_code": "Verification code" + } + } + }, + "error": { + "login": "Login error: please check your email & password", + "send_verification_code": "Failed to send verification code", + "validate_verification_code": "Failed to verify your verification code, choose a trust device and start the verification again" + }, + "abort": { + "already_configured": "Account already configured", + "no_device": "None of your devices have \"Find my iPhone\" activated" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/ifttt/services.yaml b/homeassistant/components/ifttt/services.yaml index 693c654f2582..80bf72e52902 100644 --- a/homeassistant/components/ifttt/services.yaml +++ b/homeassistant/components/ifttt/services.yaml @@ -5,23 +5,23 @@ push_alarm_state: fields: entity_id: description: Name of the alarm control panel which state has to be updated. - example: 'alarm_control_panel.downstairs' + example: "alarm_control_panel.downstairs" state: description: The state to which the alarm control panel has to be set. - example: 'armed_night' + example: "armed_night" trigger: description: Triggers the configured IFTTT Webhook. fields: event: description: The name of the event to sent. - example: 'MY_HA_EVENT' + example: "MY_HA_EVENT" value1: description: Generic field to send data via the event. - example: 'Hello World' + example: "Hello World" value2: description: Generic field to send data via the event. - example: 'some additional data' + example: "some additional data" value3: description: Generic field to send data via the event. - example: 'even more data' + example: "even more data" diff --git a/homeassistant/components/ihc/manifest.json b/homeassistant/components/ihc/manifest.json index 91086a4f8753..6403d800a16b 100644 --- a/homeassistant/components/ihc/manifest.json +++ b/homeassistant/components/ihc/manifest.json @@ -2,9 +2,6 @@ "domain": "ihc", "name": "IHC Controller", "documentation": "https://www.home-assistant.io/integrations/ihc", - "requirements": [ - "defusedxml==0.6.0", - "ihcsdk==2.6.0" - ], + "requirements": ["defusedxml==0.6.0", "ihcsdk==2.6.0"], "codeowners": [] } diff --git a/homeassistant/components/image_processing/services.yaml b/homeassistant/components/image_processing/services.yaml index 1f1fa347dc9b..69e455344b0a 100644 --- a/homeassistant/components/image_processing/services.yaml +++ b/homeassistant/components/image_processing/services.yaml @@ -5,4 +5,4 @@ scan: fields: entity_id: description: Name(s) of entities to scan immediately. - example: 'image_processing.alpr_garage' + example: "image_processing.alpr_garage" diff --git a/homeassistant/components/input_boolean/services.yaml b/homeassistant/components/input_boolean/services.yaml index e391c15d3a8f..5ab5e7a9b821 100644 --- a/homeassistant/components/input_boolean/services.yaml +++ b/homeassistant/components/input_boolean/services.yaml @@ -1,15 +1,20 @@ toggle: description: Toggles an input boolean. fields: - entity_id: {description: Entity id of the input boolean to toggle., example: input_boolean.notify_alerts} + entity_id: + description: Entity id of the input boolean to toggle. + example: input_boolean.notify_alerts turn_off: description: Turns off an input boolean fields: - entity_id: {description: Entity id of the input boolean to turn off., example: input_boolean.notify_alerts} + entity_id: + description: Entity id of the input boolean to turn off. + example: input_boolean.notify_alerts turn_on: description: Turns on an input boolean. fields: - entity_id: {description: Entity id of the input boolean to turn on., example: input_boolean.notify_alerts} + entity_id: + description: Entity id of the input boolean to turn on. + example: input_boolean.notify_alerts reload: description: Reload the input_boolean configuration. - diff --git a/homeassistant/components/input_select/services.yaml b/homeassistant/components/input_select/services.yaml index 2cce496d0b6b..f4aa44f3de03 100644 --- a/homeassistant/components/input_select/services.yaml +++ b/homeassistant/components/input_select/services.yaml @@ -1,24 +1,32 @@ select_next: description: Select the next options of an input select entity. fields: - entity_id: {description: Entity id of the input select to select the next value - for., example: input_select.my_select} + entity_id: + description: Entity id of the input select to select the next value for. + example: input_select.my_select select_option: description: Select an option of an input select entity. fields: - entity_id: {description: Entity id of the input select to select the value., example: input_select.my_select} - option: {description: Option to be selected., example: '"Item A"'} + entity_id: + description: Entity id of the input select to select the value. + example: input_select.my_select + option: + description: Option to be selected. + example: '"Item A"' select_previous: description: Select the previous options of an input select entity. fields: - entity_id: {description: Entity id of the input select to select the previous - value for., example: input_select.my_select} + entity_id: + description: Entity id of the input select to select the previous value for. + example: input_select.my_select set_options: description: Set the options of an input select entity. fields: - entity_id: {description: Entity id of the input select to set the new options - for., example: input_select.my_select} - options: {description: Options for the input select entity., example: '["Item - A", "Item B", "Item C"]'} + entity_id: + description: Entity id of the input select to set the new options for. + example: input_select.my_select + options: + description: Options for the input select entity. + example: '["Item A", "Item B", "Item C"]' reload: description: Reload the input_select configuration. diff --git a/homeassistant/components/input_text/services.yaml b/homeassistant/components/input_text/services.yaml index e9b709b0c03c..0f74cd8940ea 100644 --- a/homeassistant/components/input_text/services.yaml +++ b/homeassistant/components/input_text/services.yaml @@ -1,8 +1,11 @@ set_value: description: Set the value of an input text entity. fields: - entity_id: {description: Entity id of the input text to set the new value., example: input_text.text1} - value: {description: The target value the entity should be set to., example: This - is an example text} + entity_id: + description: Entity id of the input text to set the new value. + example: input_text.text1 + value: + description: The target value the entity should be set to. + example: This is an example text reload: description: Reload the input_text configuration. diff --git a/homeassistant/components/ipma/strings.json b/homeassistant/components/ipma/strings.json index ea8b9edcc863..184b7e38946e 100644 --- a/homeassistant/components/ipma/strings.json +++ b/homeassistant/components/ipma/strings.json @@ -1,20 +1,20 @@ { - "config": { - "title": "Portuguese weather service (IPMA)", - "step": { - "user": { - "title": "Location", - "description": "Instituto Português do Mar e Atmosfera", - "data": { - "name": "Name", - "latitude": "Latitude", - "longitude": "Longitude", - "mode": "Mode" - } - } - }, - "error": { - "name_exists": "Name already exists" + "config": { + "title": "Portuguese weather service (IPMA)", + "step": { + "user": { + "title": "Location", + "description": "Instituto Português do Mar e Atmosfera", + "data": { + "name": "Name", + "latitude": "Latitude", + "longitude": "Longitude", + "mode": "Mode" } + } + }, + "error": { + "name_exists": "Name already exists" } + } } diff --git a/homeassistant/components/kodi/services.yaml b/homeassistant/components/kodi/services.yaml index 01dde6a249cc..11287217fa8c 100644 --- a/homeassistant/components/kodi/services.yaml +++ b/homeassistant/components/kodi/services.yaml @@ -5,7 +5,7 @@ add_to_playlist: fields: entity_id: description: Name(s) of the Kodi entities where to add the media. - example: 'media_player.living_room_kodi' + example: "media_player.living_room_kodi" media_type: description: Media type identifier. It must be one of SONG or ALBUM. example: ALBUM @@ -14,17 +14,17 @@ add_to_playlist: example: 123456 media_name: description: Optional media name for filtering media. Can be 'ALL' when `media_type` is 'ALBUM' and `artist_name` is specified, to add all songs from one artist. - example: 'Highway to Hell' + example: "Highway to Hell" artist_name: description: Optional artist name for filtering media. - example: 'AC/DC' + example: "AC/DC" call_method: - description: 'Call a Kodi JSONRPC API method with optional parameters. Results of the Kodi API call will be redirected in a Home Assistant event: `kodi_call_method_result`.' + description: "Call a Kodi JSONRPC API method with optional parameters. Results of the Kodi API call will be redirected in a Home Assistant event: `kodi_call_method_result`." fields: entity_id: description: Name(s) of the Kodi entities where to run the API method. - example: 'media_player.living_room_kodi' + example: "media_player.living_room_kodi" method: description: Name of the Kodi JSONRPC API method to be called. - example: 'VideoLibrary.GetRecentlyAddedEpisodes' + example: "VideoLibrary.GetRecentlyAddedEpisodes" diff --git a/homeassistant/components/konnected/manifest.json b/homeassistant/components/konnected/manifest.json index 3a74e2165dfb..48f61ece4c4d 100644 --- a/homeassistant/components/konnected/manifest.json +++ b/homeassistant/components/konnected/manifest.json @@ -3,19 +3,12 @@ "name": "Konnected", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/konnected", - "requirements": [ - "konnected==1.1.0" - ], + "requirements": ["konnected==1.1.0"], "ssdp": [ { "manufacturer": "konnected.io" } ], - "dependencies": [ - "http" - ], - "codeowners": [ - "@heythisisnate", - "@kit-klein" - ] + "dependencies": ["http"], + "codeowners": ["@heythisisnate", "@kit-klein"] } diff --git a/homeassistant/components/linky/strings.json b/homeassistant/components/linky/strings.json index dc4c0bb9651a..6d53e4f12a5c 100644 --- a/homeassistant/components/linky/strings.json +++ b/homeassistant/components/linky/strings.json @@ -1,24 +1,24 @@ { - "config": { + "config": { + "title": "Linky", + "step": { + "user": { "title": "Linky", - "step": { - "user": { - "title": "Linky", - "description": "Enter your credentials", - "data": { - "username": "Email", - "password": "Password" - } - } - }, - "error":{ - "access": "Could not access to Enedis.fr, please check your internet connection", - "enedis": "Enedis.fr answered with an error: please retry later (usually not between 11PM and 2AM)", - "wrong_login": "Login error: please check your email & password", - "unknown": "Unknown error: please retry later (usually not between 11PM and 2AM)" - }, - "abort":{ - "already_configured": "Account already configured" + "description": "Enter your credentials", + "data": { + "username": "Email", + "password": "Password" } + } + }, + "error": { + "access": "Could not access to Enedis.fr, please check your internet connection", + "enedis": "Enedis.fr answered with an error: please retry later (usually not between 11PM and 2AM)", + "wrong_login": "Login error: please check your email & password", + "unknown": "Unknown error: please retry later (usually not between 11PM and 2AM)" + }, + "abort": { + "already_configured": "Account already configured" } + } } diff --git a/homeassistant/components/local_file/services.yaml b/homeassistant/components/local_file/services.yaml index b8c615f33350..9430c02c0e6e 100644 --- a/homeassistant/components/local_file/services.yaml +++ b/homeassistant/components/local_file/services.yaml @@ -3,7 +3,7 @@ update_file_path: fields: entity_id: description: Name of the entity_id of the camera to update. - example: 'camera.local_file' + example: "camera.local_file" file_path: description: The full path to the new image file to be displayed. - example: '/config/www/images/image.jpg' + example: "/config/www/images/image.jpg" diff --git a/homeassistant/components/locative/strings.json b/homeassistant/components/locative/strings.json index b2a538a0fa5b..4e7bd5729f4c 100644 --- a/homeassistant/components/locative/strings.json +++ b/homeassistant/components/locative/strings.json @@ -15,4 +15,4 @@ "default": "To send locations to Home Assistant, you will need to setup the webhook feature in the Locative app.\n\nFill in the following info:\n\n- URL: `{webhook_url}`\n- Method: POST\n\nSee [the documentation]({docs_url}) for further details." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/lock/services.yaml b/homeassistant/components/lock/services.yaml index fea02bb025e2..d1456f1e68e4 100644 --- a/homeassistant/components/lock/services.yaml +++ b/homeassistant/components/lock/services.yaml @@ -25,7 +25,7 @@ lock: fields: entity_id: description: Name of lock to lock. - example: 'lock.front_door' + example: "lock.front_door" code: description: An optional code to lock the lock with. example: 1234 @@ -35,7 +35,7 @@ open: fields: entity_id: description: Name of lock to open. - example: 'lock.front_door' + example: "lock.front_door" code: description: An optional code to open the lock with. example: 1234 @@ -58,7 +58,7 @@ unlock: fields: entity_id: description: Name of lock to unlock. - example: 'lock.front_door' + example: "lock.front_door" code: description: An optional code to unlock the lock with. example: 1234 diff --git a/homeassistant/components/luftdaten/strings.json b/homeassistant/components/luftdaten/strings.json index 2ba15087c48f..96d24139c250 100644 --- a/homeassistant/components/luftdaten/strings.json +++ b/homeassistant/components/luftdaten/strings.json @@ -7,7 +7,6 @@ "data": { "station_id": "Luftdaten Sensor ID", "show_on_map": "Show on map" - } } }, diff --git a/homeassistant/components/lutron_caseta/strings.json b/homeassistant/components/lutron_caseta/strings.json index cb7ab8c767eb..5d7ddc8b55b0 100644 --- a/homeassistant/components/lutron_caseta/strings.json +++ b/homeassistant/components/lutron_caseta/strings.json @@ -1,5 +1,5 @@ { - "config": { - "title": "Lutron Caséta" - } -} \ No newline at end of file + "config": { + "title": "Lutron Caséta" + } +} diff --git a/homeassistant/components/marytts/manifest.json b/homeassistant/components/marytts/manifest.json index ba4cea8365fc..5152e838fb94 100644 --- a/homeassistant/components/marytts/manifest.json +++ b/homeassistant/components/marytts/manifest.json @@ -2,8 +2,6 @@ "domain": "marytts", "name": "MaryTTS", "documentation": "https://www.home-assistant.io/integrations/marytts", - "requirements": [ - "speak2mary==1.4.0" - ], + "requirements": ["speak2mary==1.4.0"], "codeowners": [] } diff --git a/homeassistant/components/media_player/services.yaml b/homeassistant/components/media_player/services.yaml index 19ef1cb14c08..99fdb30b5c5f 100644 --- a/homeassistant/components/media_player/services.yaml +++ b/homeassistant/components/media_player/services.yaml @@ -5,42 +5,42 @@ turn_on: fields: entity_id: description: Name(s) of entities to turn on. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" turn_off: description: Turn a media player power off. fields: entity_id: description: Name(s) of entities to turn off. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" toggle: description: Toggles a media player power state. fields: entity_id: description: Name(s) of entities to toggle. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" volume_up: description: Turn a media player volume up. fields: entity_id: description: Name(s) of entities to turn volume up on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" volume_down: description: Turn a media player volume down. fields: entity_id: description: Name(s) of entities to turn volume down on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" volume_mute: description: Mute a media player's volume. fields: entity_id: description: Name(s) of entities to mute. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" is_volume_muted: description: True/false for mute/unmute. example: true @@ -50,7 +50,7 @@ volume_set: fields: entity_id: description: Name(s) of entities to set volume level on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" volume_level: description: Volume level to set as float. example: 0.6 @@ -60,49 +60,49 @@ media_play_pause: fields: entity_id: description: Name(s) of entities to toggle play/pause state on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_play: description: Send the media player the command for play. fields: entity_id: description: Name(s) of entities to play on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_pause: description: Send the media player the command for pause. fields: entity_id: description: Name(s) of entities to pause on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_stop: description: Send the media player the stop command. fields: entity_id: description: Name(s) of entities to stop on. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_next_track: description: Send the media player the command for next track. fields: entity_id: description: Name(s) of entities to send next track command to. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_previous_track: description: Send the media player the command for previous track. fields: entity_id: description: Name(s) of entities to send previous track command to. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" media_seek: description: Send the media player the command to seek in current playing media. fields: entity_id: description: Name(s) of entities to seek media on. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" seek_position: description: Position to seek to. The format is platform dependent. example: 100 @@ -112,47 +112,47 @@ play_media: fields: entity_id: description: Name(s) of entities to seek media on - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" media_content_id: description: The ID of the content to play. Platform dependent. - example: 'https://home-assistant.io/images/cast/splash.png' + example: "https://home-assistant.io/images/cast/splash.png" media_content_type: description: The type of the content to play. Must be one of image, music, tvshow, video, episode, channel or playlist - example: 'music' + example: "music" select_source: description: Send the media player the command to change input source. fields: entity_id: description: Name(s) of entities to change source on. - example: 'media_player.txnr535_0009b0d81f82' + example: "media_player.txnr535_0009b0d81f82" source: description: Name of the source to switch to. Platform dependent. - example: 'video1' + example: "video1" select_sound_mode: description: Send the media player the command to change sound mode. fields: entity_id: description: Name(s) of entities to change sound mode on. - example: 'media_player.marantz' + example: "media_player.marantz" sound_mode: description: Name of the sound mode to switch to. - example: 'Music' + example: "Music" clear_playlist: description: Send the media player the command to clear players playlist. fields: entity_id: description: Name(s) of entities to change source on. - example: 'media_player.living_room_chromecast' + example: "media_player.living_room_chromecast" shuffle_set: description: Set shuffling state. fields: entity_id: description: Name(s) of entities to set. - example: 'media_player.spotify' + example: "media_player.spotify" shuffle: description: True/false for enabling/disabling shuffle. example: true diff --git a/homeassistant/components/met/strings.json b/homeassistant/components/met/strings.json index 0c52e624418a..cadfd03e9d2a 100644 --- a/homeassistant/components/met/strings.json +++ b/homeassistant/components/met/strings.json @@ -1,20 +1,20 @@ { - "config": { - "title": "Met.no", - "step": { - "user": { - "title": "Location", - "description": "Meteorologisk institutt", - "data": { - "name": "Name", - "latitude": "Latitude", - "longitude": "Longitude", - "elevation": "Elevation" - } - } - }, - "error": { - "name_exists": "Location already exists" + "config": { + "title": "Met.no", + "step": { + "user": { + "title": "Location", + "description": "Meteorologisk institutt", + "data": { + "name": "Name", + "latitude": "Latitude", + "longitude": "Longitude", + "elevation": "Elevation" } + } + }, + "error": { + "name_exists": "Location already exists" } + } } diff --git a/homeassistant/components/meteo_france/strings.json b/homeassistant/components/meteo_france/strings.json index 8bb02f28bd06..91950f62369a 100644 --- a/homeassistant/components/meteo_france/strings.json +++ b/homeassistant/components/meteo_france/strings.json @@ -1,18 +1,18 @@ { - "config": { + "config": { + "title": "Météo-France", + "step": { + "user": { "title": "Météo-France", - "step": { - "user": { - "title": "Météo-France", - "description": "Enter the postal code (only for France, recommended) or city name", - "data": { - "city": "City" - } - } - }, - "abort":{ - "already_configured": "City already configured", - "unknown": "Unknown error: please retry later" + "description": "Enter the postal code (only for France, recommended) or city name", + "data": { + "city": "City" } + } + }, + "abort": { + "already_configured": "City already configured", + "unknown": "Unknown error: please retry later" } + } } diff --git a/homeassistant/components/microsoft_face/services.yaml b/homeassistant/components/microsoft_face/services.yaml index 386f7083f92a..4b273286d837 100644 --- a/homeassistant/components/microsoft_face/services.yaml +++ b/homeassistant/components/microsoft_face/services.yaml @@ -1,28 +1,48 @@ create_group: description: Create a new person group. fields: - name: {description: Name of the group., example: family} + name: + description: Name of the group. + example: family create_person: description: Create a new person in the group. fields: - group: {description: Name of the group, example: family} - name: {description: Name of the person, example: Hans} + group: + description: Name of the group + example: family + name: + description: Name of the person + example: Hans delete_group: description: Delete a new person group. fields: - name: {description: Name of the group., example: family} + name: + description: Name of the group. + example: family delete_person: description: Delete a person in the group. fields: - group: {description: Name of the group., example: family} - name: {description: Name of the person., example: Hans} + group: + description: Name of the group. + example: family + name: + description: Name of the person. + example: Hans face_person: description: Add a new picture to a person. fields: - camera_entity: {description: Camera to take a picture., example: camera.door} - group: {description: Name of the group., example: family} - person: {description: Name of the person., example: Hans} + camera_entity: + description: Camera to take a picture. + example: camera.door + group: + description: Name of the group. + example: family + person: + description: Name of the person. + example: Hans train_group: description: Train a person group. fields: - group: {description: Name of the group, example: family} + group: + description: Name of the group + example: family diff --git a/homeassistant/components/mikrotik/manifest.json b/homeassistant/components/mikrotik/manifest.json index c87b37685961..41223f97a8e8 100644 --- a/homeassistant/components/mikrotik/manifest.json +++ b/homeassistant/components/mikrotik/manifest.json @@ -3,10 +3,6 @@ "name": "Mikrotik", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/mikrotik", - "requirements": [ - "librouteros==3.0.0" - ], - "codeowners": [ - "@engrbm87" - ] + "requirements": ["librouteros==3.0.0"], + "codeowners": ["@engrbm87"] } diff --git a/homeassistant/components/mikrotik/strings.json b/homeassistant/components/mikrotik/strings.json index 590563993d6a..0d6fc42d1a35 100644 --- a/homeassistant/components/mikrotik/strings.json +++ b/homeassistant/components/mikrotik/strings.json @@ -1,37 +1,37 @@ { - "config": { - "title": "Mikrotik", - "step": { - "user": { - "title": "Set up Mikrotik Router", - "data": { - "name": "Name", - "host": "Host", - "username": "Username", - "password": "Password", - "port": "Port", - "verify_ssl": "Use ssl" - } - } - }, - "error": { - "name_exists": "Name exists", - "cannot_connect": "Connection Unsuccessful", - "wrong_credentials": "Wrong Credentials" - }, - "abort": { - "already_configured": "Mikrotik is already configured" + "config": { + "title": "Mikrotik", + "step": { + "user": { + "title": "Set up Mikrotik Router", + "data": { + "name": "Name", + "host": "Host", + "username": "Username", + "password": "Password", + "port": "Port", + "verify_ssl": "Use ssl" } + } }, - "options": { - "step": { - "device_tracker": { - "data": { - "arp_ping": "Enable ARP ping", - "force_dhcp": "Force scanning using DHCP", - "detection_time": "Consider home interval" - } - } - } + "error": { + "name_exists": "Name exists", + "cannot_connect": "Connection Unsuccessful", + "wrong_credentials": "Wrong Credentials" + }, + "abort": { + "already_configured": "Mikrotik is already configured" } -} \ No newline at end of file + }, + "options": { + "step": { + "device_tracker": { + "data": { + "arp_ping": "Enable ARP ping", + "force_dhcp": "Force scanning using DHCP", + "detection_time": "Consider home interval" + } + } + } + } +} diff --git a/homeassistant/components/minecraft_server/strings.json b/homeassistant/components/minecraft_server/strings.json index 3a2408694adf..39dc17e66d58 100644 --- a/homeassistant/components/minecraft_server/strings.json +++ b/homeassistant/components/minecraft_server/strings.json @@ -1,23 +1,23 @@ { - "config": { - "title": "Minecraft Server", - "step": { - "user": { - "title": "Link your Minecraft Server", - "description": "Set up your Minecraft Server instance to allow monitoring.", - "data": { - "name": "Name", - "host": "Host" - } - } - }, - "error": { - "invalid_port": "Port must be in range from 1024 to 65535. Please correct it and try again.", - "cannot_connect": "Failed to connect to server. Please check the host and port and try again. Also ensure that you are running at least Minecraft version 1.7 on your server.", - "invalid_ip": "IP address is invalid (MAC address could not be determined). Please correct it and try again." - }, - "abort": { - "already_configured": "Host is already configured." + "config": { + "title": "Minecraft Server", + "step": { + "user": { + "title": "Link your Minecraft Server", + "description": "Set up your Minecraft Server instance to allow monitoring.", + "data": { + "name": "Name", + "host": "Host" } + } + }, + "error": { + "invalid_port": "Port must be in range from 1024 to 65535. Please correct it and try again.", + "cannot_connect": "Failed to connect to server. Please check the host and port and try again. Also ensure that you are running at least Minecraft version 1.7 on your server.", + "invalid_ip": "IP address is invalid (MAC address could not be determined). Please correct it and try again." + }, + "abort": { + "already_configured": "Host is already configured." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/modbus/services.yaml b/homeassistant/components/modbus/services.yaml index 8c11209570b8..ba3113db5e03 100644 --- a/homeassistant/components/modbus/services.yaml +++ b/homeassistant/components/modbus/services.yaml @@ -1,14 +1,30 @@ write_coil: description: Write to a modbus coil. fields: - address: {description: Address of the register to write to., example: 0} - state: {description: State to write., example: false} - unit: {description: Address of the modbus unit., example: 21} - hub: {description: Optional Modbus hub name. A hub with the name 'default' is used if not specified., example: "hub1"} + address: + description: Address of the register to write to. + example: 0 + state: + description: State to write. + example: false + unit: + description: Address of the modbus unit. + example: 21 + hub: + description: Optional Modbus hub name. A hub with the name 'default' is used if not specified. + example: "hub1" write_register: description: Write to a modbus holding register. fields: - address: {description: Address of the holding register to write to., example: 0} - unit: {description: Address of the modbus unit., example: 21} - value: {description: Value (single value or array) to write., example: "0 or [4,0]"} - hub: {description: Optional Modbus hub name. A hub with the name 'default' is used if not specified., example: "hub1"} + address: + description: Address of the holding register to write to. + example: 0 + unit: + description: Address of the modbus unit. + example: 21 + value: + description: Value (single value or array) to write. + example: "0 or [4,0]" + hub: + description: Optional Modbus hub name. A hub with the name 'default' is used if not specified. + example: "hub1" diff --git a/homeassistant/components/monoprice/services.yaml b/homeassistant/components/monoprice/services.yaml index 420270e10aca..a271d704768e 100644 --- a/homeassistant/components/monoprice/services.yaml +++ b/homeassistant/components/monoprice/services.yaml @@ -3,11 +3,11 @@ snapshot: fields: entity_id: description: Name(s) of entities that will be snapshot. Platform dependent. - example: 'media_player.living_room' + example: "media_player.living_room" restore: description: Restore a snapshot of the media player zone. fields: entity_id: description: Name(s) of entities that will be restored. Platform dependent. - example: 'media_player.living_room' + example: "media_player.living_room" diff --git a/homeassistant/components/monoprice/strings.json b/homeassistant/components/monoprice/strings.json index 32332c7369a5..7842f858fd83 100644 --- a/homeassistant/components/monoprice/strings.json +++ b/homeassistant/components/monoprice/strings.json @@ -38,4 +38,4 @@ } } } -} \ No newline at end of file +} diff --git a/homeassistant/components/myq/manifest.json b/homeassistant/components/myq/manifest.json index 460b6f50bd41..940c59c99795 100644 --- a/homeassistant/components/myq/manifest.json +++ b/homeassistant/components/myq/manifest.json @@ -2,14 +2,10 @@ "domain": "myq", "name": "MyQ", "documentation": "https://www.home-assistant.io/integrations/myq", - "requirements": [ - "pymyq==2.0.1" - ], + "requirements": ["pymyq==2.0.1"], "codeowners": ["@bdraco"], "config_flow": true, "homekit": { - "models": [ - "819LMB" - ] + "models": ["819LMB"] } } diff --git a/homeassistant/components/neato/strings.json b/homeassistant/components/neato/strings.json index 69cdb48a560e..9e6a0cb27096 100644 --- a/homeassistant/components/neato/strings.json +++ b/homeassistant/components/neato/strings.json @@ -1,27 +1,27 @@ { - "config": { - "title": "Neato", - "step": { - "user": { - "title": "Neato Account Info", - "data": { - "username": "Username", - "password": "Password", - "vendor": "Vendor" - }, - "description": "See [Neato documentation]({docs_url})." - } + "config": { + "title": "Neato", + "step": { + "user": { + "title": "Neato Account Info", + "data": { + "username": "Username", + "password": "Password", + "vendor": "Vendor" }, - "error": { - "invalid_credentials": "Invalid credentials", - "unexpected_error": "Unexpected error" - }, - "create_entry": { - "default": "See [Neato documentation]({docs_url})." - }, - "abort": { - "already_configured": "Already configured", - "invalid_credentials": "Invalid credentials" - } + "description": "See [Neato documentation]({docs_url})." + } + }, + "error": { + "invalid_credentials": "Invalid credentials", + "unexpected_error": "Unexpected error" + }, + "create_entry": { + "default": "See [Neato documentation]({docs_url})." + }, + "abort": { + "already_configured": "Already configured", + "invalid_credentials": "Invalid credentials" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/nest/strings.json b/homeassistant/components/nest/strings.json index 5a70e3fd48d6..1e6700267f84 100644 --- a/homeassistant/components/nest/strings.json +++ b/homeassistant/components/nest/strings.json @@ -30,4 +30,4 @@ "authorize_url_fail": "Unknown error generating an authorize url." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index 4efefd061da8..ff92fd93554d 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -2,25 +2,12 @@ "domain": "netatmo", "name": "Netatmo", "documentation": "https://www.home-assistant.io/integrations/netatmo", - "requirements": [ - "pyatmo==3.3.0" - ], - "after_dependencies": [ - "cloud" - ], - "dependencies": [ - "webhook" - ], - "codeowners": [ - "@cgtobi" - ], + "requirements": ["pyatmo==3.3.0"], + "after_dependencies": ["cloud"], + "dependencies": ["webhook"], + "codeowners": ["@cgtobi"], "config_flow": true, "homekit": { - "models": [ - "Healty Home Coach", - "Netatmo Relay", - "Presence", - "Welcome" - ] + "models": ["Healty Home Coach", "Netatmo Relay", "Presence", "Welcome"] } } diff --git a/homeassistant/components/netatmo/strings.json b/homeassistant/components/netatmo/strings.json index 8cd4f51aee26..5ba3fff7fe20 100644 --- a/homeassistant/components/netatmo/strings.json +++ b/homeassistant/components/netatmo/strings.json @@ -15,4 +15,4 @@ "default": "Successfully authenticated with Netatmo." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index 5fb38f9b71d3..80f66c51f997 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,12 +1,8 @@ { "domain": "nexia", "name": "Nexia", - "requirements": [ - "nexia==0.7.3" - ], - "codeowners": [ - "@ryannazaretian", "@bdraco" - ], + "requirements": ["nexia==0.7.3"], + "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true } diff --git a/homeassistant/components/nexia/strings.json b/homeassistant/components/nexia/strings.json index d3fabfb0b4d7..8bdb3ea90b9b 100644 --- a/homeassistant/components/nexia/strings.json +++ b/homeassistant/components/nexia/strings.json @@ -19,4 +19,4 @@ "already_configured": "This nexia home is already configured" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/nextcloud/manifest.json b/homeassistant/components/nextcloud/manifest.json index 414d65fc3cce..73ec2a138b3b 100644 --- a/homeassistant/components/nextcloud/manifest.json +++ b/homeassistant/components/nextcloud/manifest.json @@ -2,10 +2,6 @@ "domain": "nextcloud", "name": "Nextcloud", "documentation": "https://www.home-assistant.io/integrations/nextcloud", - "requirements": [ - "nextcloudmonitor==1.1.0" - ], - "codeowners": [ - "@meichthys" - ] + "requirements": ["nextcloudmonitor==1.1.0"], + "codeowners": ["@meichthys"] } diff --git a/homeassistant/components/nissan_leaf/services.yaml b/homeassistant/components/nissan_leaf/services.yaml index ef60dfb4a654..096f4f5b8b42 100644 --- a/homeassistant/components/nissan_leaf/services.yaml +++ b/homeassistant/components/nissan_leaf/services.yaml @@ -18,4 +18,3 @@ update: description: > The vehicle identification number (VIN) of the vehicle, 17 characters example: WBANXXXXXX1234567 - diff --git a/homeassistant/components/notify/services.yaml b/homeassistant/components/notify/services.yaml index 23b1c968c4a3..e80c7c85677f 100644 --- a/homeassistant/components/notify/services.yaml +++ b/homeassistant/components/notify/services.yaml @@ -8,7 +8,7 @@ notify: example: The garage door has been open for 10 minutes. title: description: Optional title for your notification. - example: 'Your Garage Door Friend' + example: "Your Garage Door Friend" target: description: An array of targets to send the notification to. Optional depending on the platform. example: platform specific @@ -21,7 +21,7 @@ apns_register: fields: push_id: description: The device token, a 64 character hex string (256 bits). The device token is provided to you by your client app, which receives the token after registering itself with the remote notification service. - example: '72f2a8633655c5ce574fdc9b2b34ff8abdfc3b739b6ceb7a9ff06c1cbbf99f62' + example: "72f2a8633655c5ce574fdc9b2b34ff8abdfc3b739b6ceb7a9ff06c1cbbf99f62" name: description: A friendly name for the device (optional). - example: 'Sam''s iPhone' + example: "Sam's iPhone" diff --git a/homeassistant/components/nuheat/manifest.json b/homeassistant/components/nuheat/manifest.json index 7ca81862ca77..d479f570d60d 100644 --- a/homeassistant/components/nuheat/manifest.json +++ b/homeassistant/components/nuheat/manifest.json @@ -1,8 +1,8 @@ { - "domain": "nuheat", - "name": "NuHeat", - "documentation": "https://www.home-assistant.io/integrations/nuheat", - "requirements": ["nuheat==0.3.0"], - "codeowners": ["@bdraco"], - "config_flow": true + "domain": "nuheat", + "name": "NuHeat", + "documentation": "https://www.home-assistant.io/integrations/nuheat", + "requirements": ["nuheat==0.3.0"], + "codeowners": ["@bdraco"], + "config_flow": true } diff --git a/homeassistant/components/nuheat/strings.json b/homeassistant/components/nuheat/strings.json index 4bfbb8ef62ad..3effdbc60d6a 100644 --- a/homeassistant/components/nuheat/strings.json +++ b/homeassistant/components/nuheat/strings.json @@ -1,25 +1,25 @@ { - "config" : { - "error" : { - "unknown" : "Unexpected error", - "cannot_connect" : "Failed to connect, please try again", - "invalid_auth" : "Invalid authentication", - "invalid_thermostat" : "The thermostat serial number is invalid." - }, - "title" : "NuHeat", - "abort" : { - "already_configured" : "The thermostat is already configured" - }, - "step" : { - "user" : { - "title" : "Connect to the NuHeat", - "description": "You will need to obtain your thermostat’s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", - "data" : { - "username" : "Username", - "password" : "Password", - "serial_number" : "Serial number of the thermostat." - } - } + "config": { + "error": { + "unknown": "Unexpected error", + "cannot_connect": "Failed to connect, please try again", + "invalid_auth": "Invalid authentication", + "invalid_thermostat": "The thermostat serial number is invalid." + }, + "title": "NuHeat", + "abort": { + "already_configured": "The thermostat is already configured" + }, + "step": { + "user": { + "title": "Connect to the NuHeat", + "description": "You will need to obtain your thermostat’s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", + "data": { + "username": "Username", + "password": "Password", + "serial_number": "Serial number of the thermostat." + } } - } + } + } } diff --git a/homeassistant/components/nuki/services.yaml b/homeassistant/components/nuki/services.yaml index 1300b48e0ddd..9e3be794cb7c 100644 --- a/homeassistant/components/nuki/services.yaml +++ b/homeassistant/components/nuki/services.yaml @@ -3,8 +3,7 @@ lock_n_go: fields: entity_id: description: Entity id of the Nuki lock. - example: 'lock.front_door' + example: "lock.front_door" unlatch: description: Whether to unlatch the lock. example: false - diff --git a/homeassistant/components/nut/manifest.json b/homeassistant/components/nut/manifest.json index ddd200dfa043..226250b9a52f 100644 --- a/homeassistant/components/nut/manifest.json +++ b/homeassistant/components/nut/manifest.json @@ -2,9 +2,7 @@ "domain": "nut", "name": "Network UPS Tools (NUT)", "documentation": "https://www.home-assistant.io/integrations/nut", - "requirements": [ - "pynut2==2.1.2" - ], + "requirements": ["pynut2==2.1.2"], "codeowners": ["@bdraco"], "config_flow": true } diff --git a/homeassistant/components/nut/strings.json b/homeassistant/components/nut/strings.json index e37a019af78c..8e5f5ee2fcbb 100644 --- a/homeassistant/components/nut/strings.json +++ b/homeassistant/components/nut/strings.json @@ -34,5 +34,4 @@ } } } - -} \ No newline at end of file +} diff --git a/homeassistant/components/opencv/manifest.json b/homeassistant/components/opencv/manifest.json index fd7f2b4064ab..95b0431a32f7 100644 --- a/homeassistant/components/opencv/manifest.json +++ b/homeassistant/components/opencv/manifest.json @@ -2,9 +2,6 @@ "domain": "opencv", "name": "OpenCV", "documentation": "https://www.home-assistant.io/integrations/opencv", - "requirements": [ - "numpy==1.18.1", - "opencv-python-headless==4.2.0.32" - ], + "requirements": ["numpy==1.18.1", "opencv-python-headless==4.2.0.32"], "codeowners": [] } diff --git a/homeassistant/components/openerz/manifest.json b/homeassistant/components/openerz/manifest.json index 19bb17ea3909..7f56e2b8c550 100644 --- a/homeassistant/components/openerz/manifest.json +++ b/homeassistant/components/openerz/manifest.json @@ -3,10 +3,6 @@ "name": "Open ERZ", "documentation": "https://www.home-assistant.io/integrations/openerz", "dependencies": [], - "codeowners": [ - "@misialq" - ], - "requirements": [ - "openerz-api==0.1.0" - ] -} \ No newline at end of file + "codeowners": ["@misialq"], + "requirements": ["openerz-api==0.1.0"] +} diff --git a/homeassistant/components/opentherm_gw/services.yaml b/homeassistant/components/opentherm_gw/services.yaml index 29ad2ecdbe71..227c6d423bca 100644 --- a/homeassistant/components/opentherm_gw/services.yaml +++ b/homeassistant/components/opentherm_gw/services.yaml @@ -5,20 +5,20 @@ reset_gateway: fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" set_clock: description: Set the clock and day of the week on the connected thermostat. fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" date: description: Optional date from which the day of the week will be extracted. Defaults to today. - example: '2018-10-23' + example: "2018-10-23" time: description: Optional time in 24h format which will be provided to the thermostat. Defaults to the current time. - example: '19:34' + example: "19:34" set_control_setpoint: description: > @@ -27,13 +27,13 @@ set_control_setpoint: fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" temperature: description: > The central heating setpoint to set on the gateway. Values between 0 and 90 are accepted, but not all boilers support this range. A value of 0 disables the central heating setpoint override. - example: '37.5' + example: "37.5" set_hot_water_ovrd: description: > @@ -41,7 +41,7 @@ set_hot_water_ovrd: fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" dhw_override: description: > Control the domestic hot water enable option. If the boiler has @@ -50,37 +50,37 @@ set_hot_water_ovrd: that. Value should be 0 or 1 to enable the override in off or on state, or "A" to disable the override. - example: '1' + example: "1" set_gpio_mode: description: Change the function of the GPIO pins of the gateway. fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" id: description: The ID of the GPIO pin. Either "A" or "B". - example: 'B' + example: "B" mode: description: > Mode to set on the GPIO pin. Values 0 through 6 are accepted for both GPIOs, 7 is only accepted for GPIO "B". See https://www.home-assistant.io/integrations/opentherm_gw/#gpio-modes for an explanation of the values. - example: '5' + example: "5" set_led_mode: description: Change the function of the LEDs of the gateway. fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" id: description: The ID of the LED. Possible values are "A" through "F". - example: 'C' + example: "C" mode: description: > The function to assign to the LED. One of "R", "X", "T", "B", "O", "F", "H", "W", "C", "E", "M" or "P". See https://www.home-assistant.io/integrations/opentherm_gw/#led-modes for an explanation of the values. - example: 'F' + example: "F" set_max_modulation: description: > @@ -89,13 +89,13 @@ set_max_modulation: fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" level: description: > The modulation level to provide to the gateway. Values between 0 and 100 will set the modulation level. Provide a value of -1 to clear the override and forward the value from the thermostat again. - example: '42' + example: "42" set_outside_temperature: description: > @@ -104,20 +104,20 @@ set_outside_temperature: fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" temperature: description: > The temperature to provide to the thermostat. Values between -40.0 and 64.0 will be accepted, but not all thermostats can display the full range. Any value above 64.0 will clear a previously configured value (suggestion: 99) - example: '-2.3' + example: "-2.3" set_setback_temperature: description: Configure the setback temperature to be used with the GPIO away mode function. fields: gateway_id: description: The gateway_id of the OpenTherm Gateway. - example: 'opentherm_gateway' + example: "opentherm_gateway" temperature: description: The setback temperature to configure on the gateway. Values between 0.0 and 30.0 are accepted. - example: '16.0' + example: "16.0" diff --git a/homeassistant/components/opentherm_gw/strings.json b/homeassistant/components/opentherm_gw/strings.json index 1c246432fb14..7bc25726f273 100644 --- a/homeassistant/components/opentherm_gw/strings.json +++ b/homeassistant/components/opentherm_gw/strings.json @@ -16,7 +16,7 @@ "id_exists": "Gateway id already exists", "serial_error": "Error connecting to device", "timeout": "Connection attempt timed out" - } + } }, "options": { "step": { @@ -29,4 +29,4 @@ } } } -} \ No newline at end of file +} diff --git a/homeassistant/components/opnsense/manifest.json b/homeassistant/components/opnsense/manifest.json index 8cc77da7cfa1..129ca0108a5a 100644 --- a/homeassistant/components/opnsense/manifest.json +++ b/homeassistant/components/opnsense/manifest.json @@ -2,8 +2,6 @@ "domain": "opnsense", "name": "OPNSense", "documentation": "https://www.home-assistant.io/integrations/opnsense", - "requirements": [ - "pyopnsense==0.2.0" - ], + "requirements": ["pyopnsense==0.2.0"], "codeowners": ["@mtreinish"] } diff --git a/homeassistant/components/pilight/services.yaml b/homeassistant/components/pilight/services.yaml index cc6141fdd91e..9faa8908efbc 100644 --- a/homeassistant/components/pilight/services.yaml +++ b/homeassistant/components/pilight/services.yaml @@ -2,5 +2,5 @@ send: description: Send RF code to Pilight device fields: protocol: - description: 'Protocol that Pilight recognizes. See https://manual.pilight.org/protocols/index.html for supported protocols and additional parameters that each protocol supports' - example: 'lirc' + description: "Protocol that Pilight recognizes. See https://manual.pilight.org/protocols/index.html for supported protocols and additional parameters that each protocol supports" + example: "lirc" diff --git a/homeassistant/components/plaato/strings.json b/homeassistant/components/plaato/strings.json index ee99da0c8b1c..2fde2782f466 100644 --- a/homeassistant/components/plaato/strings.json +++ b/homeassistant/components/plaato/strings.json @@ -15,4 +15,4 @@ "default": "To send events to Home Assistant, you will need to setup the webhook feature in Plaato Airlock.\n\nFill in the following info:\n\n- URL: `{webhook_url}`\n- Method: POST\n\nSee [the documentation]({docs_url}) for further details." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/plex/strings.json b/homeassistant/components/plex/strings.json index 43dc47bec104..83466327da3b 100644 --- a/homeassistant/components/plex/strings.json +++ b/homeassistant/components/plex/strings.json @@ -1,44 +1,44 @@ { - "config": { - "title": "Plex", - "step": { - "select_server": { - "title": "Select Plex server", - "description": "Multiple servers available, select one:", - "data": { - "server": "Server" - } - }, - "start_website_auth": { - "title": "Connect Plex server", - "description": "Continue to authorize at plex.tv." - } - }, - "error": { - "faulty_credentials": "Authorization failed", - "no_servers": "No servers linked to account", - "not_found": "Plex server not found" - }, - "abort": { - "all_configured": "All linked servers already configured", - "already_configured": "This Plex server is already configured", - "already_in_progress": "Plex is being configured", - "invalid_import": "Imported configuration is invalid", - "non-interactive": "Non-interactive import", - "token_request_timeout": "Timed out obtaining token", - "unknown": "Failed for unknown reason" + "config": { + "title": "Plex", + "step": { + "select_server": { + "title": "Select Plex server", + "description": "Multiple servers available, select one:", + "data": { + "server": "Server" } + }, + "start_website_auth": { + "title": "Connect Plex server", + "description": "Continue to authorize at plex.tv." + } }, - "options": { - "step": { - "plex_mp_settings": { - "description": "Options for Plex Media Players", - "data": { - "use_episode_art": "Use episode art", - "ignore_new_shared_users": "Ignore new managed/shared users", - "monitored_users": "Monitored users" - } - } - } + "error": { + "faulty_credentials": "Authorization failed", + "no_servers": "No servers linked to account", + "not_found": "Plex server not found" + }, + "abort": { + "all_configured": "All linked servers already configured", + "already_configured": "This Plex server is already configured", + "already_in_progress": "Plex is being configured", + "invalid_import": "Imported configuration is invalid", + "non-interactive": "Non-interactive import", + "token_request_timeout": "Timed out obtaining token", + "unknown": "Failed for unknown reason" } + }, + "options": { + "step": { + "plex_mp_settings": { + "description": "Options for Plex Media Players", + "data": { + "use_episode_art": "Use episode art", + "ignore_new_shared_users": "Ignore new managed/shared users", + "monitored_users": "Monitored users" + } + } + } + } } diff --git a/homeassistant/components/proxy/manifest.json b/homeassistant/components/proxy/manifest.json index 246eb856bdcf..a704e5ffa66d 100644 --- a/homeassistant/components/proxy/manifest.json +++ b/homeassistant/components/proxy/manifest.json @@ -2,8 +2,6 @@ "domain": "proxy", "name": "Camera Proxy", "documentation": "https://www.home-assistant.io/integrations/proxy", - "requirements": [ - "pillow==7.0.0" - ], + "requirements": ["pillow==7.0.0"], "codeowners": [] } diff --git a/homeassistant/components/ps4/services.yaml b/homeassistant/components/ps4/services.yaml index b7d1e8df96f3..e1af6543a650 100644 --- a/homeassistant/components/ps4/services.yaml +++ b/homeassistant/components/ps4/services.yaml @@ -3,7 +3,7 @@ send_command: fields: entity_id: description: Name(s) of entities to send command. - example: 'media_player.playstation_4' + example: "media_player.playstation_4" command: description: Button to press. - example: 'ps' + example: "ps" diff --git a/homeassistant/components/qrcode/manifest.json b/homeassistant/components/qrcode/manifest.json index f51f7150868f..615fa1f75527 100644 --- a/homeassistant/components/qrcode/manifest.json +++ b/homeassistant/components/qrcode/manifest.json @@ -2,9 +2,6 @@ "domain": "qrcode", "name": "QR Code", "documentation": "https://www.home-assistant.io/integrations/qrcode", - "requirements": [ - "pillow==7.0.0", - "pyzbar==0.1.7" - ], + "requirements": ["pillow==7.0.0", "pyzbar==0.1.7"], "codeowners": [] } diff --git a/homeassistant/components/rachio/manifest.json b/homeassistant/components/rachio/manifest.json index 9b293ee5df20..b8c141f52ab2 100644 --- a/homeassistant/components/rachio/manifest.json +++ b/homeassistant/components/rachio/manifest.json @@ -2,17 +2,11 @@ "domain": "rachio", "name": "Rachio", "documentation": "https://www.home-assistant.io/integrations/rachio", - "requirements": [ - "rachiopy==0.1.3" - ], - "dependencies": [ - "http" - ], + "requirements": ["rachiopy==0.1.3"], + "dependencies": ["http"], "codeowners": ["@bdraco"], "config_flow": true, "homekit": { - "models": [ - "Rachio" - ] + "models": ["Rachio"] } } diff --git a/homeassistant/components/rachio/strings.json b/homeassistant/components/rachio/strings.json index 391320289dbe..1f05a1c7a5f4 100644 --- a/homeassistant/components/rachio/strings.json +++ b/homeassistant/components/rachio/strings.json @@ -4,7 +4,7 @@ "step": { "user": { "title": "Connect to your Rachio device", - "description" : "You will need the API Key from https://app.rach.io/. Select 'Account Settings, and then click on 'GET API KEY'.", + "description": "You will need the API Key from https://app.rach.io/. Select 'Account Settings, and then click on 'GET API KEY'.", "data": { "api_key": "The API key for the Rachio account." } diff --git a/homeassistant/components/rainbird/services.yaml b/homeassistant/components/rainbird/services.yaml index cdac7171a25c..ed1ec8b62df0 100644 --- a/homeassistant/components/rainbird/services.yaml +++ b/homeassistant/components/rainbird/services.yaml @@ -3,7 +3,7 @@ start_irrigation: fields: entity_id: description: Name of a single irrigation to turn on - example: 'switch.sprinkler_1' + example: "switch.sprinkler_1" duration: description: Duration for this sprinkler to be turned on example: 1 diff --git a/homeassistant/components/rainforest_eagle/manifest.json b/homeassistant/components/rainforest_eagle/manifest.json index b6db35347bcf..bae9cbe4ccb4 100644 --- a/homeassistant/components/rainforest_eagle/manifest.json +++ b/homeassistant/components/rainforest_eagle/manifest.json @@ -2,10 +2,6 @@ "domain": "rainforest_eagle", "name": "Rainforest Eagle-200", "documentation": "https://www.home-assistant.io/integrations/rainforest_eagle", - "requirements": [ - "eagle200_reader==0.2.4", - "uEagle==0.0.1" - ], - "codeowners": ["@gtdiehl", - "@jcalbert"] + "requirements": ["eagle200_reader==0.2.4", "uEagle==0.0.1"], + "codeowners": ["@gtdiehl", "@jcalbert"] } diff --git a/homeassistant/components/remote/services.yaml b/homeassistant/components/remote/services.yaml index 1d712a8f2850..fc9d170726e5 100644 --- a/homeassistant/components/remote/services.yaml +++ b/homeassistant/components/remote/services.yaml @@ -5,62 +5,62 @@ turn_on: fields: entity_id: description: Name(s) of entities to turn on. - example: 'remote.family_room' + example: "remote.family_room" activity: description: Activity ID or Activity Name to start. - example: 'BedroomTV' + example: "BedroomTV" toggle: description: Toggles a device. fields: entity_id: description: Name(s) of entities to toggle. - example: 'remote.family_room' + example: "remote.family_room" turn_off: description: Sends the Power Off Command. fields: entity_id: description: Name(s) of entities to turn off. - example: 'remote.family_room' + example: "remote.family_room" send_command: description: Sends a command or a list of commands to a device. fields: entity_id: description: Name(s) of entities to send command from. - example: 'remote.family_room' + example: "remote.family_room" device: description: Device ID to send command to. - example: '32756745' + example: "32756745" command: description: A single command or a list of commands to send. - example: 'Play' + example: "Play" num_repeats: description: An optional value that specifies the number of times you want to repeat the command(s). If not specified, the command(s) will not be repeated. - example: '5' + example: "5" delay_secs: description: An optional value that specifies that number of seconds you want to wait in between repeated commands. If not specified, the default of 0.4 seconds will be used. - example: '0.75' + example: "0.75" hold_secs: description: An optional value that specifies that number of seconds you want to have it held before the release is send. If not specified, the release will be send immediately after the press. - example: '2.5' + example: "2.5" learn_command: description: Learns a command or a list of commands from a device. fields: entity_id: description: Name(s) of entities to learn command from. - example: 'remote.bedroom' + example: "remote.bedroom" device: description: Device ID to learn command from. - example: 'television' + example: "television" command: description: A single command or a list of commands to learn. - example: 'Turn on' + example: "Turn on" alternative: description: If code must be stored as alternative (useful for discrete remotes). - example: 'True' + example: "True" timeout: description: Timeout, in seconds, for the command to be learned. - example: '30' + example: "30" diff --git a/homeassistant/components/rflink/services.yaml b/homeassistant/components/rflink/services.yaml index 9269326ece6f..3a44d04f75d9 100644 --- a/homeassistant/components/rflink/services.yaml +++ b/homeassistant/components/rflink/services.yaml @@ -1,5 +1,9 @@ send_command: description: Send device command through RFLink. fields: - command: {description: The command to be sent., example: 'on'} - device_id: {description: RFLink device ID., example: newkaku_0000c6c2_1} + command: + description: The command to be sent. + example: "on" + device_id: + description: RFLink device ID. + example: newkaku_0000c6c2_1 diff --git a/homeassistant/components/roomba/manifest.json b/homeassistant/components/roomba/manifest.json index c66cd3ecbdfc..942ebd084262 100644 --- a/homeassistant/components/roomba/manifest.json +++ b/homeassistant/components/roomba/manifest.json @@ -2,10 +2,6 @@ "domain": "roomba", "name": "iRobot Roomba", "documentation": "https://www.home-assistant.io/integrations/roomba", - "requirements": [ - "roombapy==1.4.3" - ], - "codeowners": [ - "@pschmitt" - ] + "requirements": ["roombapy==1.4.3"], + "codeowners": ["@pschmitt"] } diff --git a/homeassistant/components/salt/manifest.json b/homeassistant/components/salt/manifest.json index eefe901d2963..cad9b6d36613 100644 --- a/homeassistant/components/salt/manifest.json +++ b/homeassistant/components/salt/manifest.json @@ -1,7 +1,7 @@ { - "domain": "salt", - "name": "Salt Fiber Box", - "documentation": "https://www.home-assistant.io/integrations/salt", - "requirements": ["saltbox==0.1.3"], - "codeowners": ["@bjornorri"] + "domain": "salt", + "name": "Salt Fiber Box", + "documentation": "https://www.home-assistant.io/integrations/salt", + "requirements": ["saltbox==0.1.3"], + "codeowners": ["@bjornorri"] } diff --git a/homeassistant/components/samsungtv/manifest.json b/homeassistant/components/samsungtv/manifest.json index ea91fee481ac..efcb9064208b 100644 --- a/homeassistant/components/samsungtv/manifest.json +++ b/homeassistant/components/samsungtv/manifest.json @@ -11,8 +11,6 @@ "st": "urn:samsung.com:device:RemoteControlReceiver:1" } ], - "codeowners": [ - "@escoand" - ], + "codeowners": ["@escoand"], "config_flow": true } diff --git a/homeassistant/components/samsungtv/strings.json b/homeassistant/components/samsungtv/strings.json index 2e36062669f5..71de0764789a 100644 --- a/homeassistant/components/samsungtv/strings.json +++ b/homeassistant/components/samsungtv/strings.json @@ -7,8 +7,8 @@ "title": "Samsung TV", "description": "Enter your Samsung TV information. If you never connected Home Assistant before you should see a popup on your TV asking for authorization.", "data": { - "host": "Host or IP address", - "name": "Name" + "host": "Host or IP address", + "name": "Name" } }, "confirm": { diff --git a/homeassistant/components/script/services.yaml b/homeassistant/components/script/services.yaml index 736b0ec71c3f..1347f760b546 100644 --- a/homeassistant/components/script/services.yaml +++ b/homeassistant/components/script/services.yaml @@ -8,18 +8,18 @@ turn_on: fields: entity_id: description: Name(s) of script to be turned on. - example: 'script.arrive_home' + example: "script.arrive_home" turn_off: description: Turn off script fields: entity_id: description: Name(s) of script to be turned off. - example: 'script.arrive_home' + example: "script.arrive_home" toggle: description: Toggle script fields: entity_id: description: Name(s) of script to be toggled. - example: 'script.arrive_home' + example: "script.arrive_home" diff --git a/homeassistant/components/sense/manifest.json b/homeassistant/components/sense/manifest.json index d4ec8ab8a1e1..d0bed8267348 100644 --- a/homeassistant/components/sense/manifest.json +++ b/homeassistant/components/sense/manifest.json @@ -2,11 +2,7 @@ "domain": "sense", "name": "Sense", "documentation": "https://www.home-assistant.io/integrations/sense", - "requirements": [ - "sense_energy==0.7.1" - ], - "codeowners": [ - "@kbickar" - ], + "requirements": ["sense_energy==0.7.1"], + "codeowners": ["@kbickar"], "config_flow": true } diff --git a/homeassistant/components/sensibo/services.yaml b/homeassistant/components/sensibo/services.yaml index d2e5e39c7d84..f981ef7fd32b 100644 --- a/homeassistant/components/sensibo/services.yaml +++ b/homeassistant/components/sensibo/services.yaml @@ -3,7 +3,7 @@ assume_state: fields: entity_id: description: Name(s) of entities to change. - example: 'climate.kitchen' + example: "climate.kitchen" state: description: State to set. - example: 'idle' + example: "idle" diff --git a/homeassistant/components/seven_segments/manifest.json b/homeassistant/components/seven_segments/manifest.json index 2bee5379a1b9..1eb60e9154ae 100644 --- a/homeassistant/components/seven_segments/manifest.json +++ b/homeassistant/components/seven_segments/manifest.json @@ -2,8 +2,6 @@ "domain": "seven_segments", "name": "Seven Segments OCR", "documentation": "https://www.home-assistant.io/integrations/seven_segments", - "requirements": [ - "pillow==7.0.0" - ], + "requirements": ["pillow==7.0.0"], "codeowners": [] } diff --git a/homeassistant/components/shopping_list/services.yaml b/homeassistant/components/shopping_list/services.yaml index 1d667e43fa6e..04457e2abec4 100644 --- a/homeassistant/components/shopping_list/services.yaml +++ b/homeassistant/components/shopping_list/services.yaml @@ -1,9 +1,12 @@ add_item: description: Adds an item to the shopping list. fields: - name: {description: The name of the item to add., example: Beer} + name: + description: The name of the item to add. + example: Beer complete_item: - description: Marks an item as completed in the shopping list. It does not remove - the item. + description: Marks an item as completed in the shopping list. It does not remove the item. fields: - name: {description: The name of the item to mark as completed., example: Beer} + name: + description: The name of the item to mark as completed. + example: Beer diff --git a/homeassistant/components/shopping_list/strings.json b/homeassistant/components/shopping_list/strings.json index 9e56dd7eaa49..537bed16a786 100644 --- a/homeassistant/components/shopping_list/strings.json +++ b/homeassistant/components/shopping_list/strings.json @@ -1,14 +1,14 @@ { - "config": { + "config": { + "title": "Shopping List", + "step": { + "user": { "title": "Shopping List", - "step": { - "user": { - "title": "Shopping List", - "description": "Do you want to configure the shopping list?" - } - }, - "abort": { - "already_configured": "The shopping list is already configured." - } + "description": "Do you want to configure the shopping list?" + } + }, + "abort": { + "already_configured": "The shopping list is already configured." } + } } diff --git a/homeassistant/components/sighthound/manifest.json b/homeassistant/components/sighthound/manifest.json index b4e80884484e..3efe31d5a879 100644 --- a/homeassistant/components/sighthound/manifest.json +++ b/homeassistant/components/sighthound/manifest.json @@ -1,12 +1,7 @@ { - "domain": "sighthound", - "name": "Sighthound", - "documentation": "https://www.home-assistant.io/integrations/sighthound", - "requirements": [ - "pillow==7.0.0", - "simplehound==0.3" - ], - "codeowners": [ - "@robmarkcole" - ] + "domain": "sighthound", + "name": "Sighthound", + "documentation": "https://www.home-assistant.io/integrations/sighthound", + "requirements": ["pillow==7.0.0", "simplehound==0.3"], + "codeowners": ["@robmarkcole"] } diff --git a/homeassistant/components/smartthings/strings.json b/homeassistant/components/smartthings/strings.json index 3578bcd5138d..99173c830a0b 100644 --- a/homeassistant/components/smartthings/strings.json +++ b/homeassistant/components/smartthings/strings.json @@ -15,14 +15,14 @@ } }, "error": { - "token_invalid_format": "The token must be in the UID/GUID format", - "token_unauthorized": "The token is invalid or no longer authorized.", - "token_forbidden": "The token does not have the required OAuth scopes.", - "token_already_setup": "The token has already been setup.", - "app_setup_error": "Unable to setup the SmartApp. Please try again.", - "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", - "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", - "webhook_error": "SmartThings could not validate the endpoint configured in `base_url`. Please review the component requirements." + "token_invalid_format": "The token must be in the UID/GUID format", + "token_unauthorized": "The token is invalid or no longer authorized.", + "token_forbidden": "The token does not have the required OAuth scopes.", + "token_already_setup": "The token has already been setup.", + "app_setup_error": "Unable to setup the SmartApp. Please try again.", + "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", + "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", + "webhook_error": "SmartThings could not validate the endpoint configured in `base_url`. Please review the component requirements." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/smhi/strings.json b/homeassistant/components/smhi/strings.json index dbf1172b7d67..2db9e0f94eb0 100644 --- a/homeassistant/components/smhi/strings.json +++ b/homeassistant/components/smhi/strings.json @@ -1,19 +1,19 @@ { - "config": { - "title": "Swedish weather service (SMHI)", - "step": { - "user": { - "title": "Location in Sweden", - "data": { - "name": "Name", - "latitude": "Latitude", - "longitude": "Longitude" - } - } - }, - "error": { - "name_exists": "Name already exists", - "wrong_location": "Location Sweden only" + "config": { + "title": "Swedish weather service (SMHI)", + "step": { + "user": { + "title": "Location in Sweden", + "data": { + "name": "Name", + "latitude": "Latitude", + "longitude": "Longitude" } + } + }, + "error": { + "name_exists": "Name already exists", + "wrong_location": "Location Sweden only" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/snapcast/services.yaml b/homeassistant/components/snapcast/services.yaml index 3e5dadbf5c17..1517f12f52d5 100644 --- a/homeassistant/components/snapcast/services.yaml +++ b/homeassistant/components/snapcast/services.yaml @@ -3,28 +3,28 @@ join: fields: master: description: Entity ID of the player to synchronize to. - example: 'media_player.living_room' + example: "media_player.living_room" entity_id: description: Entity ID of the players to join to the "master". - example: 'media_player.bedroom' + example: "media_player.bedroom" unjoin: description: Unjoin the player from a group. fields: entity_id: description: Entity ID of the player to unjoin. - example: 'media_player.living_room' + example: "media_player.living_room" snapshot: description: Take a snapshot of the media player. fields: entity_id: description: Name(s) of entities that will be snapshotted. Platform dependent. - example: 'media_player.living_room' + example: "media_player.living_room" restore: description: Restore a snapshot of the media player. fields: entity_id: description: Name(s) of entities that will be restored. Platform dependent. - example: 'media_player.living_room' + example: "media_player.living_room" diff --git a/homeassistant/components/solaredge/strings.json b/homeassistant/components/solaredge/strings.json index 3265e3bb1b0a..650ae3edd4fd 100644 --- a/homeassistant/components/solaredge/strings.json +++ b/homeassistant/components/solaredge/strings.json @@ -1,21 +1,21 @@ { - "config": { - "title": "SolarEdge", - "step": { - "user": { - "title": "Define the API parameters for this installation", - "data": { - "name": "The name of this installation", - "site_id": "The SolarEdge site-id", - "api_key": "The API key for this site" - } - } - }, - "error": { - "site_exists": "This site_id is already configured" - }, - "abort": { - "site_exists": "This site_id is already configured" + "config": { + "title": "SolarEdge", + "step": { + "user": { + "title": "Define the API parameters for this installation", + "data": { + "name": "The name of this installation", + "site_id": "The SolarEdge site-id", + "api_key": "The API key for this site" } + } + }, + "error": { + "site_exists": "This site_id is already configured" + }, + "abort": { + "site_exists": "This site_id is already configured" } + } } diff --git a/homeassistant/components/soma/strings.json b/homeassistant/components/soma/strings.json index 67f1f6b7d460..74a72fdd9760 100644 --- a/homeassistant/components/soma/strings.json +++ b/homeassistant/components/soma/strings.json @@ -1,25 +1,25 @@ { - "config": { - "abort": { - "already_setup": "You can only configure one Soma account.", - "authorize_url_timeout": "Timeout generating authorize url.", - "missing_configuration": "The Soma component is not configured. Please follow the documentation.", - "result_error": "SOMA Connect responded with error status.", - "connection_error": "Failed to connect to SOMA Connect." + "config": { + "abort": { + "already_setup": "You can only configure one Soma account.", + "authorize_url_timeout": "Timeout generating authorize url.", + "missing_configuration": "The Soma component is not configured. Please follow the documentation.", + "result_error": "SOMA Connect responded with error status.", + "connection_error": "Failed to connect to SOMA Connect." + }, + "create_entry": { + "default": "Successfully authenticated with Soma." + }, + "step": { + "user": { + "data": { + "host": "Host", + "port": "Port" }, - "create_entry": { - "default": "Successfully authenticated with Soma." - }, - "step": { - "user": { - "data": { - "host": "Host", - "port": "Port" - }, - "description": "Please enter connection settings of your SOMA Connect.", - "title": "SOMA Connect" - } - }, - "title": "Soma" - } + "description": "Please enter connection settings of your SOMA Connect.", + "title": "SOMA Connect" + } + }, + "title": "Soma" + } } diff --git a/homeassistant/components/songpal/services.yaml b/homeassistant/components/songpal/services.yaml index 8cf1a664276e..e08ae2098fe4 100644 --- a/homeassistant/components/songpal/services.yaml +++ b/homeassistant/components/songpal/services.yaml @@ -4,10 +4,10 @@ set_sound_setting: fields: entity_id: description: Target device. - example: 'media_player.my_soundbar' + example: "media_player.my_soundbar" name: description: Name of the setting. - example: 'nightMode' + example: "nightMode" value: description: Value to set. - example: 'on' + example: "on" diff --git a/homeassistant/components/sonos/services.yaml b/homeassistant/components/sonos/services.yaml index 480eeeeba9f5..37effe7d6ab1 100644 --- a/homeassistant/components/sonos/services.yaml +++ b/homeassistant/components/sonos/services.yaml @@ -3,74 +3,74 @@ join: fields: master: description: Entity ID of the player that should become the coordinator of the group. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" entity_id: description: Name(s) of entities that will join the master. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" unjoin: description: Unjoin the player from a group. fields: entity_id: description: Name(s) of entities that will be unjoined from their group. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" snapshot: description: Take a snapshot of the media player. fields: entity_id: description: Name(s) of entities that will be snapshot. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" with_group: description: True (default) or False. Also snapshot the group layout. - example: 'true' + example: "true" restore: description: Restore a snapshot of the media player. fields: entity_id: description: Name(s) of entities that will be restored. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" with_group: description: True (default) or False. Also restore the group layout. - example: 'true' + example: "true" set_sleep_timer: description: Set a Sonos timer. fields: entity_id: description: Name(s) of entities that will have a timer set. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" sleep_time: description: Number of seconds to set the timer. - example: '900' + example: "900" clear_sleep_timer: description: Clear a Sonos timer. fields: entity_id: description: Name(s) of entities that will have the timer cleared. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" set_option: description: Set Sonos sound options. fields: entity_id: description: Name(s) of entities that will have options set. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" night_sound: description: Enable Night Sound mode - example: 'true' + example: "true" speech_enhance: description: Enable Speech Enhancement mode - example: 'true' + example: "true" play_queue: description: Starts playing the queue from the first item. fields: entity_id: description: Name(s) of entities that will start playing. - example: 'media_player.living_room_sonos' + example: "media_player.living_room_sonos" queue_position: description: Position of the song in the queue to start playing from. - example: '0' + example: "0" diff --git a/homeassistant/components/soundtouch/services.yaml b/homeassistant/components/soundtouch/services.yaml index fd848b76b2db..79fd1d416658 100644 --- a/homeassistant/components/soundtouch/services.yaml +++ b/homeassistant/components/soundtouch/services.yaml @@ -3,34 +3,34 @@ play_everywhere: fields: master: description: Name of the master entity that will coordinate the grouping. Platform dependent. It is a shortcut for creating a multi-room zone with all devices - example: 'media_player.soundtouch_home' + example: "media_player.soundtouch_home" create_zone: description: Create a Sountouch multi-room zone. fields: master: description: Name of the master entity that will coordinate the multi-room zone. Platform dependent. - example: 'media_player.soundtouch_home' + example: "media_player.soundtouch_home" slaves: description: Name of slaves entities to add to the new zone. - example: 'media_player.soundtouch_bedroom' + example: "media_player.soundtouch_bedroom" add_zone_slave: description: Add a slave to a Sountouch multi-room zone. fields: master: description: Name of the master entity that is coordinating the multi-room zone. Platform dependent. - example: 'media_player.soundtouch_home' + example: "media_player.soundtouch_home" slaves: description: Name of slaves entities to add to the existing zone. - example: 'media_player.soundtouch_bedroom' + example: "media_player.soundtouch_bedroom" remove_zone_slave: description: Remove a slave from the Sounttouch multi-room zone. fields: master: description: Name of the master entity that is coordinating the multi-room zone. Platform dependent. - example: 'media_player.soundtouch_home' + example: "media_player.soundtouch_home" slaves: description: Name of slaves entities to remove from the existing zone. - example: 'media_player.soundtouch_bedroom' + example: "media_player.soundtouch_bedroom" diff --git a/homeassistant/components/squeezebox/services.yaml b/homeassistant/components/squeezebox/services.yaml index 0c81c369e731..b17689492584 100644 --- a/homeassistant/components/squeezebox/services.yaml +++ b/homeassistant/components/squeezebox/services.yaml @@ -3,10 +3,10 @@ call_method: fields: entity_id: description: Name(s) of the Squeezebox entities where to run the API method. - example: 'media_player.squeezebox_radio' + example: "media_player.squeezebox_radio" command: description: Command to pass to Logitech Media Server (p0 in the CLI documentation). - example: 'playlist' + example: "playlist" parameters: description: Array of additional parameters to pass to Logitech Media Server (p1, ..., pN in the CLI documentation). example: ["loadtracks", "album.titlesearch="] diff --git a/homeassistant/components/starline/strings.json b/homeassistant/components/starline/strings.json index bf83f652c3c7..673fc6f54bd6 100644 --- a/homeassistant/components/starline/strings.json +++ b/homeassistant/components/starline/strings.json @@ -1,42 +1,42 @@ { - "config": { - "title": "StarLine", - "step": { - "auth_app": { - "title": "Application credentials", - "description": "Application ID and secret code from StarLine developer account", - "data": { - "app_id": "App ID", - "app_secret": "Secret" - } - }, - "auth_user": { - "title": "User credentials", - "description": "StarLine account email and password", - "data": { - "username": "Username", - "password": "Password" - } - }, - "auth_mfa": { - "title": "Two-factor authorization", - "description": "Enter the code sent to phone {phone_number}", - "data": { - "mfa_code": "SMS code" - } - }, - "auth_captcha": { - "title": "Captcha", - "description": "{captcha_img}", - "data": { - "captcha_code": "Code from image" - } - } - }, - "error": { - "error_auth_app": "Incorrect application id or secret", - "error_auth_user": "Incorrect username or password", - "error_auth_mfa": "Incorrect code" + "config": { + "title": "StarLine", + "step": { + "auth_app": { + "title": "Application credentials", + "description": "Application ID and secret code from StarLine developer account", + "data": { + "app_id": "App ID", + "app_secret": "Secret" } + }, + "auth_user": { + "title": "User credentials", + "description": "StarLine account email and password", + "data": { + "username": "Username", + "password": "Password" + } + }, + "auth_mfa": { + "title": "Two-factor authorization", + "description": "Enter the code sent to phone {phone_number}", + "data": { + "mfa_code": "SMS code" + } + }, + "auth_captcha": { + "title": "Captcha", + "description": "{captcha_img}", + "data": { + "captcha_code": "Code from image" + } + } + }, + "error": { + "error_auth_app": "Incorrect application id or secret", + "error_auth_user": "Incorrect username or password", + "error_auth_mfa": "Incorrect code" } + } } diff --git a/homeassistant/components/switch/services.yaml b/homeassistant/components/switch/services.yaml index 352ffb6feec6..74dda2ddf4f0 100644 --- a/homeassistant/components/switch/services.yaml +++ b/homeassistant/components/switch/services.yaml @@ -5,18 +5,18 @@ turn_on: fields: entity_id: description: Name(s) of entities to turn on - example: 'switch.living_room' + example: "switch.living_room" turn_off: description: Turn a switch off. fields: entity_id: description: Name(s) of entities to turn off. - example: 'switch.living_room' + example: "switch.living_room" toggle: description: Toggles a switch state. fields: entity_id: description: Name(s) of entities to toggle. - example: 'switch.living_room' + example: "switch.living_room" diff --git a/homeassistant/components/switcher_kis/services.yaml b/homeassistant/components/switcher_kis/services.yaml index 5408a2049902..396917524456 100644 --- a/homeassistant/components/switcher_kis/services.yaml +++ b/homeassistant/components/switcher_kis/services.yaml @@ -1,9 +1,9 @@ set_auto_off: - description: 'Update Switcher device auto off setting.' + description: "Update Switcher device auto off setting." fields: entity_id: description: "Name of the entity id associated with the integration, used for permission validation." example: "switch.switcher_kis_boiler" auto_off: - description: 'Time period string containing hours and minutes.' + description: "Time period string containing hours and minutes." example: '"02:30"' diff --git a/homeassistant/components/tado/manifest.json b/homeassistant/components/tado/manifest.json index f0aa605f1644..741612b6b4b4 100644 --- a/homeassistant/components/tado/manifest.json +++ b/homeassistant/components/tado/manifest.json @@ -2,10 +2,6 @@ "domain": "tado", "name": "Tado", "documentation": "https://www.home-assistant.io/integrations/tado", - "requirements": [ - "python-tado==0.6.0" - ], - "codeowners": [ - "@michaelarnauts", "@bdraco" - ] + "requirements": ["python-tado==0.6.0"], + "codeowners": ["@michaelarnauts", "@bdraco"] } diff --git a/homeassistant/components/tankerkoenig/manifest.json b/homeassistant/components/tankerkoenig/manifest.json index ee0c573b3cd7..d9a63037a8fe 100755 --- a/homeassistant/components/tankerkoenig/manifest.json +++ b/homeassistant/components/tankerkoenig/manifest.json @@ -3,7 +3,5 @@ "name": "Tankerkoenig", "documentation": "https://www.home-assistant.io/integrations/tankerkoenig", "requirements": ["pytankerkoenig==0.0.6"], - "codeowners": [ - "@guillempages" - ] + "codeowners": ["@guillempages"] } diff --git a/homeassistant/components/telegram_bot/services.yaml b/homeassistant/components/telegram_bot/services.yaml index e3d303a2c528..8e42b25c0caf 100644 --- a/homeassistant/components/telegram_bot/services.yaml +++ b/homeassistant/components/telegram_bot/services.yaml @@ -8,13 +8,13 @@ send_message: example: The garage door has been open for 10 minutes. title: description: Optional title for your notification. Will be composed as '%title\n%message' - example: 'Your Garage Door Friend' + example: "Your Garage Door Friend" target: description: An array of pre-authorized chat_ids to send the notification to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" parse_mode: description: "Parser for the message text: `html` or `markdown`." - example: 'html' + example: "html" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true @@ -23,7 +23,7 @@ send_message: example: true timeout: description: Timeout for send message. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. Empty list clears a previously set keyboard. example: '["/command1, /command2", "/command3"]' @@ -36,13 +36,13 @@ send_photo: fields: url: description: Remote path to an image. - example: 'http://example.org/path/to/the/image.png' + example: "http://example.org/path/to/the/image.png" file: description: Local path to an image. - example: '/path/to/the/image.png' + example: "/path/to/the/image.png" caption: description: The title of the image. - example: 'My image' + example: "My image" username: description: Username for a URL which require HTTP basic authentication. example: myuser @@ -51,7 +51,7 @@ send_photo: example: myuser_pwd target: description: An array of pre-authorized chat_ids to send the document to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true @@ -60,7 +60,7 @@ send_photo: example: false timeout: description: Timeout for send photo. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. example: '["/command1, /command2", "/command3"]' @@ -73,10 +73,10 @@ send_sticker: fields: url: description: Remote path to an webp sticker. - example: 'http://example.org/path/to/the/sticker.webp' + example: "http://example.org/path/to/the/sticker.webp" file: description: Local path to an webp sticker. - example: '/path/to/the/sticker.webp' + example: "/path/to/the/sticker.webp" username: description: Username for a URL which require HTTP basic authentication. example: myuser @@ -85,7 +85,7 @@ send_sticker: example: myuser_pwd target: description: An array of pre-authorized chat_ids to send the document to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true @@ -94,7 +94,7 @@ send_sticker: example: false timeout: description: Timeout for send sticker. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. example: '["/command1, /command2", "/command3"]' @@ -107,13 +107,13 @@ send_video: fields: url: description: Remote path to a video. - example: 'http://example.org/path/to/the/video.mp4' + example: "http://example.org/path/to/the/video.mp4" file: description: Local path to an image. - example: '/path/to/the/video.mp4' + example: "/path/to/the/video.mp4" caption: description: The title of the video. - example: 'My video' + example: "My video" username: description: Username for a URL which require HTTP basic authentication. example: myuser @@ -122,7 +122,7 @@ send_video: example: myuser_pwd target: description: An array of pre-authorized chat_ids to send the document to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true @@ -131,7 +131,7 @@ send_video: example: false timeout: description: Timeout for send video. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. example: '["/command1, /command2", "/command3"]' @@ -144,10 +144,10 @@ send_document: fields: url: description: Remote path to a document. - example: 'http://example.org/path/to/the/document.odf' + example: "http://example.org/path/to/the/document.odf" file: description: Local path to a document. - example: '/tmp/whatever.odf' + example: "/tmp/whatever.odf" caption: description: The title of the document. example: Document Title xy @@ -159,7 +159,7 @@ send_document: example: myuser_pwd target: description: An array of pre-authorized chat_ids to send the document to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true @@ -168,7 +168,7 @@ send_document: example: false timeout: description: Timeout for send document. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. example: '["/command1, /command2", "/command3"]' @@ -187,13 +187,13 @@ send_location: example: 38.123 target: description: An array of pre-authorized chat_ids to send the location to. If not present, first allowed chat_id is the default. - example: '[12345, 67890] or 12345' + example: "[12345, 67890] or 12345" disable_notification: description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound. example: true timeout: description: Timeout for send photo. Will help with timeout errors (poor internet connection, etc) - example: '1000' + example: "1000" keyboard: description: List of rows of commands, comma-separated, to make a custom keyboard. example: '["/command1, /command2", "/command3"]' @@ -206,7 +206,7 @@ edit_message: fields: message_id: description: id of the message to edit. - example: '{{ trigger.event.data.message.message_id }}' + example: "{{ trigger.event.data.message.message_id }}" chat_id: description: The chat_id where to edit the message. example: 12345 @@ -215,10 +215,10 @@ edit_message: example: The garage door has been open for 10 minutes. title: description: Optional title for your notification. Will be composed as '%title\n%message' - example: 'Your Garage Door Friend' + example: "Your Garage Door Friend" parse_mode: description: "Parser for the message text: `html` or `markdown`." - example: 'html' + example: "html" disable_web_page_preview: description: Disables link previews for links in the message. example: true @@ -231,7 +231,7 @@ edit_caption: fields: message_id: description: id of the message to edit. - example: '{{ trigger.event.data.message.message_id }}' + example: "{{ trigger.event.data.message.message_id }}" chat_id: description: The chat_id where to edit the caption. example: 12345 @@ -247,7 +247,7 @@ edit_replymarkup: fields: message_id: description: id of the message to edit. - example: '{{ trigger.event.data.message.message_id }}' + example: "{{ trigger.event.data.message.message_id }}" chat_id: description: The chat_id where to edit the reply_markup. example: 12345 @@ -263,17 +263,17 @@ answer_callback_query: example: "OK, I'm listening" callback_query_id: description: Unique id of the callback response. - example: '{{ trigger.event.data.id }}' + example: "{{ trigger.event.data.id }}" show_alert: description: Show a permanent notification. example: true delete_message: - description: Delete a previously sent message.

 + description: Delete a previously sent message. fields: message_id: description: id of the message to delete. - example: '{{ trigger.event.data.message.message_id }}'

 + example: "{{ trigger.event.data.message.message_id }}" chat_id: description: The chat_id where to delete the message. example: 12345 diff --git a/homeassistant/components/tellduslive/strings.json b/homeassistant/components/tellduslive/strings.json index bb62889085ba..53a32812f60d 100644 --- a/homeassistant/components/tellduslive/strings.json +++ b/homeassistant/components/tellduslive/strings.json @@ -1,26 +1,26 @@ { "config": { - "abort": { - "already_setup": "TelldusLive is already configured", - "authorize_url_fail": "Unknown error generating an authorize url.", - "authorize_url_timeout": "Timeout generating authorize url.", - "unknown": "Unknown error occurred" + "abort": { + "already_setup": "TelldusLive is already configured", + "authorize_url_fail": "Unknown error generating an authorize url.", + "authorize_url_timeout": "Timeout generating authorize url.", + "unknown": "Unknown error occurred" + }, + "error": { + "auth_error": "Authentication error, please try again" + }, + "step": { + "auth": { + "description": "To link your TelldusLive account:\n 1. Click the link below\n 2. Login to Telldus Live\n 3. Authorize **{app_name}** (click **Yes**).\n 4. Come back here and click **SUBMIT**.\n\n [Link TelldusLive account]({auth_url})", + "title": "Authenticate against TelldusLive" }, - "error": { - "auth_error": "Authentication error, please try again" - }, - "step": { - "auth": { - "description": "To link your TelldusLive account:\n 1. Click the link below\n 2. Login to Telldus Live\n 3. Authorize **{app_name}** (click **Yes**).\n 4. Come back here and click **SUBMIT**.\n\n [Link TelldusLive account]({auth_url})", - "title": "Authenticate against TelldusLive" - }, - "user": { - "data": { - "host": "Host" - }, - "title": "Pick endpoint." - } - }, - "title": "Telldus Live" + "user": { + "data": { + "host": "Host" + }, + "title": "Pick endpoint." + } + }, + "title": "Telldus Live" } -} \ No newline at end of file +} diff --git a/homeassistant/components/tesla/manifest.json b/homeassistant/components/tesla/manifest.json index b6c7f4658e92..d977e24bfec3 100644 --- a/homeassistant/components/tesla/manifest.json +++ b/homeassistant/components/tesla/manifest.json @@ -3,11 +3,6 @@ "name": "Tesla", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tesla", - "requirements": [ - "teslajsonpy==0.6.0" - ], - "codeowners": [ - "@zabuldon", - "@alandtse" - ] + "requirements": ["teslajsonpy==0.6.0"], + "codeowners": ["@zabuldon", "@alandtse"] } diff --git a/homeassistant/components/tesla/strings.json b/homeassistant/components/tesla/strings.json index 3c8017a7d764..61cf5a2fcb2c 100644 --- a/homeassistant/components/tesla/strings.json +++ b/homeassistant/components/tesla/strings.json @@ -28,4 +28,4 @@ } } } -} \ No newline at end of file +} diff --git a/homeassistant/components/tmb/manifest.json b/homeassistant/components/tmb/manifest.json index e35c266b6964..fb4270f641da 100644 --- a/homeassistant/components/tmb/manifest.json +++ b/homeassistant/components/tmb/manifest.json @@ -2,10 +2,6 @@ "domain": "tmb", "name": "Transports Metropolitans de Barcelona", "documentation": "https://www.home-assistant.io/integrations/tmb", - "requirements": [ - "tmb==0.0.4" - ], - "codeowners": [ - "@alemuro" - ] + "requirements": ["tmb==0.0.4"], + "codeowners": ["@alemuro"] } diff --git a/homeassistant/components/todoist/services.yaml b/homeassistant/components/todoist/services.yaml index 3382e27693d3..186b15a18a9a 100644 --- a/homeassistant/components/todoist/services.yaml +++ b/homeassistant/components/todoist/services.yaml @@ -22,4 +22,3 @@ new_task: due_date: description: The day this task is due, in format YYYY-MM-DD. example: "2019-10-22" - diff --git a/homeassistant/components/toon/strings.json b/homeassistant/components/toon/strings.json index 20d6ba3d72ca..a12fce67ffdc 100644 --- a/homeassistant/components/toon/strings.json +++ b/homeassistant/components/toon/strings.json @@ -31,4 +31,4 @@ "no_app": "You need to configure Toon before being able to authenticate with it. [Please read the instructions](https://www.home-assistant.io/components/toon/)." } } -} \ No newline at end of file +} diff --git a/homeassistant/components/transmission/strings.json b/homeassistant/components/transmission/strings.json index 45c16be36e2c..a239de65b6e5 100644 --- a/homeassistant/components/transmission/strings.json +++ b/homeassistant/components/transmission/strings.json @@ -1,35 +1,35 @@ { - "config": { - "title": "Transmission", - "step": { - "user": { - "title": "Setup Transmission Client", - "data": { - "name": "Name", - "host": "Host", - "username": "Username", - "password": "Password", - "port": "Port" - } - } - }, - "error": { - "name_exists": "Name already exists", - "wrong_credentials": "Wrong username or password", - "cannot_connect": "Unable to Connect to host" - }, - "abort": { - "already_configured": "Host is already configured." + "config": { + "title": "Transmission", + "step": { + "user": { + "title": "Setup Transmission Client", + "data": { + "name": "Name", + "host": "Host", + "username": "Username", + "password": "Password", + "port": "Port" } + } }, - "options": { - "step": { - "init": { - "title": "Configure options for Transmission", - "data": { - "scan_interval": "Update frequency" - } - } - } + "error": { + "name_exists": "Name already exists", + "wrong_credentials": "Wrong username or password", + "cannot_connect": "Unable to Connect to host" + }, + "abort": { + "already_configured": "Host is already configured." } -} \ No newline at end of file + }, + "options": { + "step": { + "init": { + "title": "Configure options for Transmission", + "data": { + "scan_interval": "Update frequency" + } + } + } + } +} diff --git a/homeassistant/components/tts/services.yaml b/homeassistant/components/tts/services.yaml index 823eef632f3e..7d1bf95572b3 100644 --- a/homeassistant/components/tts/services.yaml +++ b/homeassistant/components/tts/services.yaml @@ -5,16 +5,16 @@ say: fields: entity_id: description: Name(s) of media player entities. - example: 'media_player.floor' + example: "media_player.floor" message: description: Text to speak on devices. - example: 'My name is hanna' + example: "My name is hanna" cache: description: Control file cache of this message. - example: 'true' + example: "true" language: description: Language to use for speech generation. - example: 'ru' + example: "ru" options: description: A dictionary containing platform-specific options. Optional depending on the platform. example: platform specific diff --git a/homeassistant/components/twentemilieu/strings.json b/homeassistant/components/twentemilieu/strings.json index 811ecdbfa6ec..3ef76a5d20b0 100644 --- a/homeassistant/components/twentemilieu/strings.json +++ b/homeassistant/components/twentemilieu/strings.json @@ -1,23 +1,23 @@ { - "config": { + "config": { + "title": "Twente Milieu", + "step": { + "user": { "title": "Twente Milieu", - "step": { - "user": { - "title": "Twente Milieu", - "description": "Set up Twente Milieu providing waste collection information on your address.", - "data": { - "post_code": "Postal code", - "house_number": "House number", - "house_letter": "House letter/additional" - } - } - }, - "error": { - "connection_error": "Failed to connect.", - "invalid_address": "Address not found in Twente Milieu service area." - }, - "abort": { - "address_exists": "Address already set up." + "description": "Set up Twente Milieu providing waste collection information on your address.", + "data": { + "post_code": "Postal code", + "house_number": "House number", + "house_letter": "House letter/additional" } + } + }, + "error": { + "connection_error": "Failed to connect.", + "invalid_address": "Address not found in Twente Milieu service area." + }, + "abort": { + "address_exists": "Address already set up." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index e0f07d8d7ccc..54b474e95cc2 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,11 +3,7 @@ "name": "Ubiquiti UniFi", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": [ - "aiounifi==15" - ], - "codeowners": [ - "@kane610" - ], + "requirements": ["aiounifi==15"], + "codeowners": ["@kane610"], "quality_scale": "platinum" } diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index 61116adfb60a..881e97bc9cad 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -1,64 +1,64 @@ { - "config": { - "title": "UniFi Controller", - "step": { - "user": { - "title": "Set up UniFi Controller", - "data": { - "host": "Host", - "username": "User name", - "password": "Password", - "port": "Port", - "site": "Site ID", - "verify_ssl": "Controller using proper certificate" - } - } - }, - "error": { - "faulty_credentials": "Bad user credentials", - "service_unavailable": "No service available", - "unknown_client_mac": "No client available on that MAC address" - }, - "abort": { - "already_configured": "Controller site is already configured", - "user_privilege": "User needs to be administrator" - } - }, - "options": { - "step": { - "init": { - "data": {} - }, - "device_tracker": { - "data": { - "detection_time": "Time in seconds from last seen until considered away", - "ssid_filter": "Select SSIDs to track wireless clients on", - "track_clients": "Track network clients", - "track_devices": "Track network devices (Ubiquiti devices)", - "track_wired_clients": "Include wired network clients" - }, - "description": "Configure device tracking", - "title": "UniFi options 1/3" - }, - "client_control": { - "data": { - "block_client": "Network access controlled clients", - "new_client": "Add new client for network access control", - "poe_clients": "Allow POE control of clients" - }, - "description": "Configure client controls\n\nCreate switches for serial numbers you want to control network access for.", - "title": "UniFi options 2/3" - }, - "statistics_sensors": { - "data": { - "allow_bandwidth_sensors": "Bandwidth usage sensors for network clients" - }, - "description": "Configure statistics sensors", - "title": "UniFi options 3/3" - } + "config": { + "title": "UniFi Controller", + "step": { + "user": { + "title": "Set up UniFi Controller", + "data": { + "host": "Host", + "username": "User name", + "password": "Password", + "port": "Port", + "site": "Site ID", + "verify_ssl": "Controller using proper certificate" } + } }, "error": { - "unknown_client_mac": "No client available in UniFi on that MAC address" + "faulty_credentials": "Bad user credentials", + "service_unavailable": "No service available", + "unknown_client_mac": "No client available on that MAC address" + }, + "abort": { + "already_configured": "Controller site is already configured", + "user_privilege": "User needs to be administrator" } -} \ No newline at end of file + }, + "options": { + "step": { + "init": { + "data": {} + }, + "device_tracker": { + "data": { + "detection_time": "Time in seconds from last seen until considered away", + "ssid_filter": "Select SSIDs to track wireless clients on", + "track_clients": "Track network clients", + "track_devices": "Track network devices (Ubiquiti devices)", + "track_wired_clients": "Include wired network clients" + }, + "description": "Configure device tracking", + "title": "UniFi options 1/3" + }, + "client_control": { + "data": { + "block_client": "Network access controlled clients", + "new_client": "Add new client for network access control", + "poe_clients": "Allow POE control of clients" + }, + "description": "Configure client controls\n\nCreate switches for serial numbers you want to control network access for.", + "title": "UniFi options 2/3" + }, + "statistics_sensors": { + "data": { + "allow_bandwidth_sensors": "Bandwidth usage sensors for network clients" + }, + "description": "Configure statistics sensors", + "title": "UniFi options 3/3" + } + } + }, + "error": { + "unknown_client_mac": "No client available in UniFi on that MAC address" + } +} diff --git a/homeassistant/components/upnp/strings.json b/homeassistant/components/upnp/strings.json index 6c5b2fb2bb2d..628c0ea5a00c 100644 --- a/homeassistant/components/upnp/strings.json +++ b/homeassistant/components/upnp/strings.json @@ -1,30 +1,30 @@ { - "config": { + "config": { + "title": "UPnP/IGD", + "step": { + "init": { + "title": "UPnP/IGD" + }, + "confirm": { "title": "UPnP/IGD", - "step": { - "init": { - "title": "UPnP/IGD" - }, - "confirm": { - "title": "UPnP/IGD", - "description": "Do you want to set up UPnP/IGD?" - }, - "user": { - "title": "Configuration options for the UPnP/IGD", - "data": { - "enable_port_mapping": "Enable port mapping for Home Assistant", - "enable_sensors": "Add traffic sensors", - "igd": "UPnP/IGD" - } - } - }, - "abort": { - "already_configured": "UPnP/IGD is already configured", - "incomplete_device": "Ignoring incomplete UPnP device", - "no_devices_discovered": "No UPnP/IGDs discovered", - "no_devices_found": "No UPnP/IGD devices found on the network.", - "no_sensors_or_port_mapping": "Enable at least sensors or port mapping", - "single_instance_allowed": "Only a single configuration of UPnP/IGD is necessary." + "description": "Do you want to set up UPnP/IGD?" + }, + "user": { + "title": "Configuration options for the UPnP/IGD", + "data": { + "enable_port_mapping": "Enable port mapping for Home Assistant", + "enable_sensors": "Add traffic sensors", + "igd": "UPnP/IGD" } + } + }, + "abort": { + "already_configured": "UPnP/IGD is already configured", + "incomplete_device": "Ignoring incomplete UPnP device", + "no_devices_discovered": "No UPnP/IGDs discovered", + "no_devices_found": "No UPnP/IGD devices found on the network.", + "no_sensors_or_port_mapping": "Enable at least sensors or port mapping", + "single_instance_allowed": "Only a single configuration of UPnP/IGD is necessary." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/vacuum/services.yaml b/homeassistant/components/vacuum/services.yaml index 7db70c5cd516..3287eafe7f28 100644 --- a/homeassistant/components/vacuum/services.yaml +++ b/homeassistant/components/vacuum/services.yaml @@ -5,73 +5,73 @@ turn_on: fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" turn_off: description: Stop the current cleaning task and return to home. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" stop: description: Stop the current cleaning task. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" locate: description: Locate the vacuum cleaner robot. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" start_pause: description: Start, pause, or resume the cleaning task. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" start: description: Start or resume the cleaning task. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" pause: description: Pause the cleaning task. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" return_to_base: description: Tell the vacuum cleaner to return to its dock. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" clean_spot: description: Tell the vacuum cleaner to do a spot clean-up. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" send_command: description: Send a raw command to the vacuum cleaner. fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" command: description: Command to execute. - example: 'set_dnd_timer' + example: "set_dnd_timer" params: description: Parameters for the command. example: '{ "key": "value" }' @@ -81,7 +81,7 @@ set_fan_speed: fields: entity_id: description: Name of the vacuum entity. - example: 'vacuum.xiaomi_vacuum_cleaner' + example: "vacuum.xiaomi_vacuum_cleaner" fan_speed: description: Platform dependent vacuum cleaner fan speed, with speed steps, like 'medium' or by percentage, between 0 and 100. - example: 'low' + example: "low" diff --git a/homeassistant/components/vera/manifest.json b/homeassistant/components/vera/manifest.json index 90f208ba915a..22a5da19d8c6 100644 --- a/homeassistant/components/vera/manifest.json +++ b/homeassistant/components/vera/manifest.json @@ -4,7 +4,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/vera", "requirements": ["pyvera==0.3.7"], - "codeowners": [ - "@vangorra" - ] + "codeowners": ["@vangorra"] } diff --git a/homeassistant/components/verisure/services.yaml b/homeassistant/components/verisure/services.yaml index 405f0c5d57df..885b8597549d 100644 --- a/homeassistant/components/verisure/services.yaml +++ b/homeassistant/components/verisure/services.yaml @@ -1,5 +1,6 @@ capture_smartcam: description: Capture a new image from a smartcam. fields: - device_serial: {description: The serial number of the smartcam you want to capture - an image from., example: 2DEU AT5Z} + device_serial: + description: The serial number of the smartcam you want to capture an image from. + example: 2DEU AT5Z diff --git a/homeassistant/components/vesync/strings.json b/homeassistant/components/vesync/strings.json index 2d808e85beaf..4e656d355636 100644 --- a/homeassistant/components/vesync/strings.json +++ b/homeassistant/components/vesync/strings.json @@ -1,20 +1,20 @@ { - "config": { - "title": "VeSync", - "step": { - "user": { - "title": "Enter Username and Password", - "data": { - "username": "Email Address", - "password": "Password" - } - } - }, - "error": { - "invalid_login": "Invalid username or password" - }, - "abort": { - "already_setup": "Only one Vesync instance is allowed" + "config": { + "title": "VeSync", + "step": { + "user": { + "title": "Enter Username and Password", + "data": { + "username": "Email Address", + "password": "Password" } + } + }, + "error": { + "invalid_login": "Invalid username or password" + }, + "abort": { + "already_setup": "Only one Vesync instance is allowed" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/vizio/strings.json b/homeassistant/components/vizio/strings.json index b6f6f53cf79d..1ddcadb43900 100644 --- a/homeassistant/components/vizio/strings.json +++ b/homeassistant/components/vizio/strings.json @@ -1,56 +1,56 @@ { - "config": { - "title": "Vizio SmartCast", - "step": { - "user": { - "title": "Setup Vizio SmartCast Device", - "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", - "data": { - "name": "Name", - "host": ":", - "device_class": "Device Type", - "access_token": "Access Token" - } - }, - "pair_tv": { - "title": "Complete Pairing Process", - "description": "Your TV should be displaying a code. Enter that code into the form and then continue to the next step to complete the pairing.", - "data": { - "pin": "PIN" - } - }, - "pairing_complete": { - "title": "Pairing Complete", - "description": "Your Vizio SmartCast device is now connected to Home Assistant." - }, - "pairing_complete_import": { - "title": "Pairing Complete", - "description": "Your Vizio SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'." - } - }, - "error": { - "host_exists": "Vizio device with specified host already configured.", - "name_exists": "Vizio device with specified name already configured.", - "complete_pairing failed": "Unable to complete pairing. Ensure the PIN you provided is correct and the TV is still powered and connected to the network before resubmitting.", - "cant_connect": "Could not connect to the device. [Review the docs](https://www.home-assistant.io/integrations/vizio/) and re-verify that:\n- The device is powered on\n- The device is connected to the network\n- The values you filled in are accurate\nbefore attempting to resubmit." - }, - "abort": { - "already_setup": "This entry has already been setup.", - "updated_entry": "This entry has already been setup but the name, apps, and/or options defined in the configuration do not match the previously imported configuration, so the configuration entry has been updated accordingly." + "config": { + "title": "Vizio SmartCast", + "step": { + "user": { + "title": "Setup Vizio SmartCast Device", + "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", + "data": { + "name": "Name", + "host": ":", + "device_class": "Device Type", + "access_token": "Access Token" } + }, + "pair_tv": { + "title": "Complete Pairing Process", + "description": "Your TV should be displaying a code. Enter that code into the form and then continue to the next step to complete the pairing.", + "data": { + "pin": "PIN" + } + }, + "pairing_complete": { + "title": "Pairing Complete", + "description": "Your Vizio SmartCast device is now connected to Home Assistant." + }, + "pairing_complete_import": { + "title": "Pairing Complete", + "description": "Your Vizio SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'." + } }, - "options": { - "title": "Update Vizo SmartCast Options", - "step": { - "init": { - "title": "Update Vizo SmartCast Options", - "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", - "data": { - "volume_step": "Volume Step Size", - "include_or_exclude": "Include or Exclude Apps?", - "apps_to_include_or_exclude": "Apps to Include or Exclude" - } - } - } + "error": { + "host_exists": "Vizio device with specified host already configured.", + "name_exists": "Vizio device with specified name already configured.", + "complete_pairing failed": "Unable to complete pairing. Ensure the PIN you provided is correct and the TV is still powered and connected to the network before resubmitting.", + "cant_connect": "Could not connect to the device. [Review the docs](https://www.home-assistant.io/integrations/vizio/) and re-verify that:\n- The device is powered on\n- The device is connected to the network\n- The values you filled in are accurate\nbefore attempting to resubmit." + }, + "abort": { + "already_setup": "This entry has already been setup.", + "updated_entry": "This entry has already been setup but the name, apps, and/or options defined in the configuration do not match the previously imported configuration, so the configuration entry has been updated accordingly." } + }, + "options": { + "title": "Update Vizo SmartCast Options", + "step": { + "init": { + "title": "Update Vizo SmartCast Options", + "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", + "data": { + "volume_step": "Volume Step Size", + "include_or_exclude": "Include or Exclude Apps?", + "apps_to_include_or_exclude": "Apps to Include or Exclude" + } + } + } + } } diff --git a/homeassistant/components/wake_on_lan/services.yaml b/homeassistant/components/wake_on_lan/services.yaml index e20dd64396f4..915dd2bce96c 100644 --- a/homeassistant/components/wake_on_lan/services.yaml +++ b/homeassistant/components/wake_on_lan/services.yaml @@ -1,6 +1,9 @@ send_magic_packet: description: Send a 'magic packet' to wake up a device with 'Wake-On-LAN' capabilities. fields: - broadcast_address: {description: Optional broadcast IP where to send the magic - packet., example: 192.168.255.255} - mac: {description: MAC address of the device to wake up., example: 'aa:bb:cc:dd:ee:ff'} + broadcast_address: + description: Optional broadcast IP where to send the magic packet. + example: 192.168.255.255 + mac: + description: MAC address of the device to wake up. + example: "aa:bb:cc:dd:ee:ff" diff --git a/homeassistant/components/water_heater/services.yaml b/homeassistant/components/water_heater/services.yaml index 7a26e5bc0d4b..8aee796b9cb8 100644 --- a/homeassistant/components/water_heater/services.yaml +++ b/homeassistant/components/water_heater/services.yaml @@ -5,7 +5,7 @@ set_away_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'water_heater.water_heater' + example: "water_heater.water_heater" away_mode: description: New value of away mode. example: true @@ -15,7 +15,7 @@ set_temperature: fields: entity_id: description: Name(s) of entities to change. - example: 'water_heater.water_heater' + example: "water_heater.water_heater" temperature: description: New target temperature for water heater. example: 25 @@ -25,7 +25,7 @@ set_operation_mode: fields: entity_id: description: Name(s) of entities to change. - example: 'water_heater.water_heater' + example: "water_heater.water_heater" operation_mode: description: New value of operation mode. example: eco diff --git a/homeassistant/components/wemo/services.yaml b/homeassistant/components/wemo/services.yaml index c2415265c62c..c47d666f5c16 100644 --- a/homeassistant/components/wemo/services.yaml +++ b/homeassistant/components/wemo/services.yaml @@ -3,7 +3,7 @@ set_humidity: fields: entity_id: description: Names of the WeMo humidifier entities (1 or more entity_ids are required). - example: 'fan.wemo_humidifier' + example: "fan.wemo_humidifier" target_humidity: description: Target humidity. This is a float value between 0 and 100, but will be mapped to the humidity levels that WeMo humidifiers support (45, 50, 55, 60, and 100/Max) by rounding the value down to the nearest supported value. example: 56.5 @@ -13,4 +13,4 @@ reset_filter_life: fields: entity_id: description: Names of the WeMo humidifier entities (1 or more entity_ids are required). - example: 'fan.wemo_humidifier' + example: "fan.wemo_humidifier" diff --git a/homeassistant/components/wunderlist/services.yaml b/homeassistant/components/wunderlist/services.yaml index a3b097c5d353..1b824e438434 100644 --- a/homeassistant/components/wunderlist/services.yaml +++ b/homeassistant/components/wunderlist/services.yaml @@ -6,10 +6,10 @@ create_task: fields: list_name: description: name of the new list where the task will be created - example: 'Shopping list' + example: "Shopping list" name: description: name of the new task - example: 'Buy 5 bottles of beer' + example: "Buy 5 bottles of beer" starred: description: Create the task as starred [Optional] example: true diff --git a/homeassistant/components/xiaomi_aqara/services.yaml b/homeassistant/components/xiaomi_aqara/services.yaml index 0c5b89dc2cbb..9d8c87e5863a 100644 --- a/homeassistant/components/xiaomi_aqara/services.yaml +++ b/homeassistant/components/xiaomi_aqara/services.yaml @@ -1,22 +1,39 @@ add_device: - description: Enables the join permission of the Xiaomi Aqara Gateway for 30 seconds. + description: + Enables the join permission of the Xiaomi Aqara Gateway for 30 seconds. A new device can be added afterwards by pressing the pairing button once. fields: - gw_mac: {description: MAC address of the Xiaomi Aqara Gateway., example: 34ce00880088} + gw_mac: + description: MAC address of the Xiaomi Aqara Gateway. + example: 34ce00880088 play_ringtone: - description: Play a specific ringtone. The version of the gateway firmware must + description: + Play a specific ringtone. The version of the gateway firmware must be 1.4.1_145 at least. fields: - gw_mac: {description: MAC address of the Xiaomi Aqara Gateway., example: 34ce00880088} - ringtone_id: {description: One of the allowed ringtone ids., example: 8} - ringtone_vol: {description: The volume in percent., example: 30} + gw_mac: + description: MAC address of the Xiaomi Aqara Gateway. + example: 34ce00880088 + ringtone_id: + description: One of the allowed ringtone ids. + example: 8 + ringtone_vol: + description: The volume in percent. + example: 30 remove_device: - description: Removes a specific device. The removal is required if a device shall + description: + Removes a specific device. The removal is required if a device shall be paired with another gateway. fields: - device_id: {description: Hardware address of the device to remove., example: 158d0000000000} - gw_mac: {description: MAC address of the Xiaomi Aqara Gateway., example: 34ce00880088} + device_id: + description: Hardware address of the device to remove. + example: 158d0000000000 + gw_mac: + description: MAC address of the Xiaomi Aqara Gateway. + example: 34ce00880088 stop_ringtone: description: Stops a playing ringtone immediately. fields: - gw_mac: {description: MAC address of the Xiaomi Aqara Gateway., example: 34ce00880088} + gw_mac: + description: MAC address of the Xiaomi Aqara Gateway. + example: 34ce00880088 diff --git a/homeassistant/components/yeelight/services.yaml b/homeassistant/components/yeelight/services.yaml index 52106a420635..5e7f2419f164 100644 --- a/homeassistant/components/yeelight/services.yaml +++ b/homeassistant/components/yeelight/services.yaml @@ -3,19 +3,19 @@ set_mode: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" mode: description: Operation mode. Valid values are 'last', 'normal', 'rgb', 'hsv', 'color_flow', 'moonlight'. - example: 'moonlight' + example: "moonlight" set_color_scene: description: Changes the light to the specified RGB color and brightness. If the light is off, it will be turned on. fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" rgb_color: description: Color for the light in RGB-format. - example: '[255, 100, 100]' + example: "[255, 100, 100]" brightness: description: The brightness value to set (1-100). example: 50 @@ -24,10 +24,10 @@ set_hsv_scene: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" hs_color: description: Color for the light in hue/sat format. Hue is 0-359 and Sat is 0-100. - example: '[300, 70]' + example: "[300, 70]" brightness: description: The brightness value to set (1-100). example: 50 @@ -36,7 +36,7 @@ set_color_temp_scene: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" kelvin: description: Color temperature for the light in Kelvin. example: 4000 @@ -48,13 +48,13 @@ set_color_flow_scene: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" count: description: The number of times to run this flow (0 to run forever). example: 0 action: description: The action to take after the flow stops. Can be 'recover', 'stay', 'off'. (default 'recover') - example: 'stay' + example: "stay" transitions: description: Array of transitions, for desired effect. Examples https://yeelight.readthedocs.io/en/stable/flow.html example: '[{ "TemperatureTransition": [1900, 1000, 80] }, { "TemperatureTransition": [1900, 1000, 10] }]' @@ -63,7 +63,7 @@ set_auto_delay_off_scene: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" minutes: description: The minutes to wait before automatically turning the light off. example: 5 @@ -75,13 +75,13 @@ start_flow: fields: entity_id: description: Name of the light entity. - example: 'light.yeelight' + example: "light.yeelight" count: description: The number of times to run this flow (0 to run forever). example: 0 action: description: The action to take after the flow stops. Can be 'recover', 'stay', 'off'. (default 'recover') - example: 'stay' + example: "stay" transitions: description: Array of transitions, for desired effect. Examples https://yeelight.readthedocs.io/en/stable/flow.html example: '[{ "TemperatureTransition": [1900, 1000, 80] }, { "TemperatureTransition": [1900, 1000, 10] }]' diff --git a/homeassistant/components/zha/services.yaml b/homeassistant/components/zha/services.yaml index 3e38d6982f00..971321fbfd25 100644 --- a/homeassistant/components/zha/services.yaml +++ b/homeassistant/components/zha/services.yaml @@ -78,7 +78,7 @@ issue_zigbee_cluster_command: example: "server" args: description: args to pass to the command - example: '[arg1, arg2, argN]' + example: "[arg1, arg2, argN]" manufacturer: description: manufacturer code example: 0x00FC @@ -98,7 +98,7 @@ issue_zigbee_group_command: example: 0 args: description: args to pass to the command - example: '[arg1, arg2, argN]' + example: "[arg1, arg2, argN]" manufacturer: description: manufacturer code example: 0x00FC diff --git a/homeassistant/components/zwave/strings.json b/homeassistant/components/zwave/strings.json index 0ac55e46791e..ddb03a135b91 100644 --- a/homeassistant/components/zwave/strings.json +++ b/homeassistant/components/zwave/strings.json @@ -1,22 +1,22 @@ { - "config": { - "title": "Z-Wave", - "step": { - "user": { - "title": "Set up Z-Wave", - "description": "See https://www.home-assistant.io/docs/z-wave/installation/ for information on the configuration variables", - "data": { - "usb_path": "USB Path", - "network_key": "Network Key (leave blank to auto-generate)" - } - } - }, - "error": { - "option_error": "Z-Wave validation failed. Is the path to the USB stick correct?" - }, - "abort": { - "already_configured": "Z-Wave is already configured", - "one_instance_only": "Component only supports one Z-Wave instance" + "config": { + "title": "Z-Wave", + "step": { + "user": { + "title": "Set up Z-Wave", + "description": "See https://www.home-assistant.io/docs/z-wave/installation/ for information on the configuration variables", + "data": { + "usb_path": "USB Path", + "network_key": "Network Key (leave blank to auto-generate)" } + } + }, + "error": { + "option_error": "Z-Wave validation failed. Is the path to the USB stick correct?" + }, + "abort": { + "already_configured": "Z-Wave is already configured", + "one_instance_only": "Component only supports one Z-Wave instance" } -} \ No newline at end of file + } +} diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 40fb1ad8b497..b6f357d4cda0 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -68,7 +68,7 @@ enum34==1000000000.0.0 pycrypto==1000000000.0.0 """ -IGNORE_PRE_COMMIT_HOOK_ID = ("check-json", "no-commit-to-branch") +IGNORE_PRE_COMMIT_HOOK_ID = ("check-json", "no-commit-to-branch", "prettier") def has_tests(module: str): From fca90a8ddcbeff5f1ad6316f8703a7b7732b0da8 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 17:48:55 +0200 Subject: [PATCH 136/653] Improve string formatting v5 (#33697) * Improve string formatting v5 * Address review comments --- docs/source/_ext/edit_on_github.py | 30 ++-- docs/source/conf.py | 157 +++++++++--------- homeassistant/__main__.py | 5 +- homeassistant/components/aftership/sensor.py | 4 +- homeassistant/components/august/__init__.py | 9 +- homeassistant/components/calendar/__init__.py | 2 +- homeassistant/components/canary/__init__.py | 4 +- homeassistant/components/canary/sensor.py | 2 +- .../components/cisco_webex_teams/notify.py | 2 +- .../components/cloud/alexa_config.py | 4 +- homeassistant/components/coinbase/sensor.py | 2 +- homeassistant/components/ezviz/camera.py | 7 +- .../components/hdmi_cec/media_player.py | 4 +- homeassistant/components/hdmi_cec/switch.py | 4 +- homeassistant/components/n26/sensor.py | 10 +- homeassistant/components/n26/switch.py | 2 +- homeassistant/components/nest/__init__.py | 10 +- .../components/websocket_api/auth.py | 4 +- homeassistant/components/wink/__init__.py | 12 +- .../components/wirelesstag/sensor.py | 4 +- .../components/wirelesstag/switch.py | 2 +- homeassistant/components/withings/sensor.py | 5 +- .../components/wunderground/sensor.py | 26 +-- homeassistant/components/xiaomi/camera.py | 4 +- .../components/xiaomi_aqara/__init__.py | 4 +- homeassistant/components/xiaomi_miio/light.py | 2 +- .../components/xiaomi_miio/switch.py | 2 +- homeassistant/components/yi/camera.py | 11 +- homeassistant/components/zamg/sensor.py | 2 +- homeassistant/components/zamg/weather.py | 5 +- homeassistant/components/zha/core/device.py | 15 +- homeassistant/components/zha/entity.py | 4 +- homeassistant/components/zwave/__init__.py | 6 +- homeassistant/components/zwave/lock.py | 17 +- homeassistant/config.py | 40 +++-- homeassistant/data_entry_flow.py | 4 +- homeassistant/helpers/entity_registry.py | 2 +- homeassistant/loader.py | 3 +- homeassistant/scripts/check_config.py | 4 +- homeassistant/util/ruamel_yaml.py | 5 +- script/gen_requirements_all.py | 2 +- script/hassfest/codeowners.py | 4 +- script/hassfest/manifest.py | 10 +- script/hassfest/services.py | 2 +- script/hassfest/zeroconf.py | 8 +- script/lazytox.py | 6 +- 46 files changed, 221 insertions(+), 252 deletions(-) diff --git a/docs/source/_ext/edit_on_github.py b/docs/source/_ext/edit_on_github.py index a31fb13ebf11..1d40bfc33abc 100644 --- a/docs/source/_ext/edit_on_github.py +++ b/docs/source/_ext/edit_on_github.py @@ -8,19 +8,19 @@ Loosely based on https://github.com/astropy/astropy/pull/347 import os import warnings -__licence__ = 'BSD (3 clause)' +__licence__ = "BSD (3 clause)" def get_github_url(app, view, path): - github_fmt = 'https://github.com/{}/{}/{}/{}{}' return ( - github_fmt.format(app.config.edit_on_github_project, view, - app.config.edit_on_github_branch, - app.config.edit_on_github_src_path, path)) + f"https://github.com/{app.config.edit_on_github_project}/" + f"{view}/{app.config.edit_on_github_branch}/" + f"{app.config.edit_on_github_src_path}{path}" + ) def html_page_context(app, pagename, templatename, context, doctree): - if templatename != 'page.html': + if templatename != "page.html": return if not app.config.edit_on_github_project: @@ -29,16 +29,16 @@ def html_page_context(app, pagename, templatename, context, doctree): if not doctree: warnings.warn("doctree is None") return - path = os.path.relpath(doctree.get('source'), app.builder.srcdir) - show_url = get_github_url(app, 'blob', path) - edit_url = get_github_url(app, 'edit', path) + path = os.path.relpath(doctree.get("source"), app.builder.srcdir) + show_url = get_github_url(app, "blob", path) + edit_url = get_github_url(app, "edit", path) - context['show_on_github_url'] = show_url - context['edit_on_github_url'] = edit_url + context["show_on_github_url"] = show_url + context["edit_on_github_url"] = edit_url def setup(app): - app.add_config_value('edit_on_github_project', '', True) - app.add_config_value('edit_on_github_branch', 'master', True) - app.add_config_value('edit_on_github_src_path', '', True) # 'eg' "docs/" - app.connect('html-page-context', html_page_context) + app.add_config_value("edit_on_github_project", "", True) + app.add_config_value("edit_on_github_branch", "master", True) + app.add_config_value("edit_on_github_src_path", "", True) # 'eg' "docs/" + app.connect("html-page-context", html_page_context) diff --git a/docs/source/conf.py b/docs/source/conf.py index cea9a22b64ec..242a90088b36 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -22,25 +22,26 @@ import sys from homeassistant.const import __short_version__, __version__ -PROJECT_NAME = 'Home Assistant' -PROJECT_PACKAGE_NAME = 'homeassistant' -PROJECT_AUTHOR = 'The Home Assistant Authors' -PROJECT_COPYRIGHT = f' 2013-2020, {PROJECT_AUTHOR}' -PROJECT_LONG_DESCRIPTION = ('Home Assistant is an open-source ' - 'home automation platform running on Python 3. ' - 'Track and control all devices at home and ' - 'automate control. ' - 'Installation in less than a minute.') -PROJECT_GITHUB_USERNAME = 'home-assistant' -PROJECT_GITHUB_REPOSITORY = 'home-assistant' +PROJECT_NAME = "Home Assistant" +PROJECT_PACKAGE_NAME = "homeassistant" +PROJECT_AUTHOR = "The Home Assistant Authors" +PROJECT_COPYRIGHT = f" 2013-2020, {PROJECT_AUTHOR}" +PROJECT_LONG_DESCRIPTION = ( + "Home Assistant is an open-source " + "home automation platform running on Python 3. " + "Track and control all devices at home and " + "automate control. " + "Installation in less than a minute." +) +PROJECT_GITHUB_USERNAME = "home-assistant" +PROJECT_GITHUB_REPOSITORY = "home-assistant" -GITHUB_PATH = '{}/{}'.format( - PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY) -GITHUB_URL = f'https://github.com/{GITHUB_PATH}' +GITHUB_PATH = f"{PROJECT_GITHUB_USERNAME}/{PROJECT_GITHUB_REPOSITORY}" +GITHUB_URL = f"https://github.com/{GITHUB_PATH}" -sys.path.insert(0, os.path.abspath('_ext')) -sys.path.insert(0, os.path.abspath('../homeassistant')) +sys.path.insert(0, os.path.abspath("_ext")) +sys.path.insert(0, os.path.abspath("../homeassistant")) # -- General configuration ------------------------------------------------ @@ -52,27 +53,27 @@ sys.path.insert(0, os.path.abspath('../homeassistant')) # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.linkcode', - 'sphinx_autodoc_annotation', - 'edit_on_github' + "sphinx.ext.autodoc", + "sphinx.ext.linkcode", + "sphinx_autodoc_annotation", + "edit_on_github", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. project = PROJECT_NAME @@ -88,25 +89,25 @@ version = __short_version__ # The full version, including alpha/beta/rc tags. release = __version__ -code_branch = 'dev' if 'dev' in __version__ else 'master' +code_branch = "dev" if "dev" in __version__ else "master" # Edit on Github config edit_on_github_project = GITHUB_PATH edit_on_github_branch = code_branch -edit_on_github_src_path = 'docs/source/' +edit_on_github_src_path = "docs/source/" def linkcode_resolve(domain, info): """Determine the URL corresponding to Python object.""" - if domain != 'py': + if domain != "py": return None - modname = info['module'] - fullname = info['fullname'] + modname = info["module"] + fullname = info["fullname"] submod = sys.modules.get(modname) if submod is None: return None obj = submod - for part in fullname.split('.'): + for part in fullname.split("."): try: obj = getattr(obj, part) except: @@ -131,7 +132,8 @@ def linkcode_resolve(domain, info): fn = fn[index:] - return f'{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}' + return f"{GITHUB_URL}/blob/{code_branch}/{fn}{linespec}" + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -174,7 +176,7 @@ exclude_patterns = [] # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -191,22 +193,22 @@ todo_include_todos = False # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = { - 'logo': 'logo.png', - 'logo_name': PROJECT_NAME, - 'description': PROJECT_LONG_DESCRIPTION, - 'github_user': PROJECT_GITHUB_USERNAME, - 'github_repo': PROJECT_GITHUB_REPOSITORY, - 'github_type': 'star', - 'github_banner': True, - 'travis_button': True, - 'touch_icon': 'logo-apple.png', + "logo": "logo.png", + "logo_name": PROJECT_NAME, + "description": PROJECT_LONG_DESCRIPTION, + "github_user": PROJECT_GITHUB_USERNAME, + "github_repo": PROJECT_GITHUB_REPOSITORY, + "github_type": "star", + "github_banner": True, + "travis_button": True, + "touch_icon": "logo-apple.png", # 'fixed_sidebar': True, # Re-enable when we have more content } @@ -232,12 +234,12 @@ html_theme_options = { # This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # -html_favicon = '_static/favicon.ico' +html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -249,7 +251,7 @@ html_static_path = ['_static'] # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. # -html_last_updated_fmt = '%b %d, %Y' +html_last_updated_fmt = "%b %d, %Y" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. @@ -259,13 +261,13 @@ html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = { - '**': [ - 'about.html', - 'links.html', - 'searchbox.html', - 'sourcelink.html', - 'navigation.html', - 'relations.html' + "**": [ + "about.html", + "links.html", + "searchbox.html", + "sourcelink.html", + "navigation.html", + "relations.html", ] } @@ -326,34 +328,36 @@ html_sidebars = { # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'Home-Assistantdoc' +htmlhelp_basename = "Home-Assistantdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'home-assistant.tex', 'Home Assistant Documentation', - 'Home Assistant Team', 'manual'), + ( + master_doc, + "home-assistant.tex", + "Home Assistant Documentation", + "Home Assistant Team", + "manual", + ) ] # The name of an image file (relative to this directory) to place at the top of @@ -394,8 +398,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'home-assistant', 'Home Assistant Documentation', - [author], 1) + (master_doc, "home-assistant", "Home Assistant Documentation", [author], 1) ] # If true, show URL addresses after external links. @@ -409,9 +412,15 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Home-Assistant', 'Home Assistant Documentation', - author, 'Home Assistant', 'Open-source home automation platform.', - 'Miscellaneous'), + ( + master_doc, + "Home-Assistant", + "Home Assistant Documentation", + author, + "Home Assistant", + "Open-source home automation platform.", + "Miscellaneous", + ) ] # Documents to append as an appendix to all manuals. diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index 6dd5edb81b47..728ee3c5985e 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -36,9 +36,8 @@ def validate_python() -> None: """Validate that the right Python version is running.""" if sys.version_info[:3] < REQUIRED_PYTHON_VER: print( - "Home Assistant requires at least Python {}.{}.{}".format( - *REQUIRED_PYTHON_VER - ) + "Home Assistant requires at least Python " + f"{REQUIRED_PYTHON_VER[0]}.{REQUIRED_PYTHON_VER[1]}.{REQUIRED_PYTHON_VER[2]}" ) sys.exit(1) diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index a615c5e40330..9e0d8939da4a 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -191,9 +191,7 @@ class AfterShipSensor(Entity): "name": name, "tracking_number": track["tracking_number"], "slug": track["slug"], - "link": "{}{}/{}".format( - BASE, track["slug"], track["tracking_number"] - ), + "link": f"{BASE}{track['slug']}/{track['tracking_number']}", "last_update": track["updated_at"], "expected_delivery": track["expected_delivery"], "status": track["tag"], diff --git a/homeassistant/components/august/__init__.py b/homeassistant/components/august/__init__.py index cd2783e6cb87..280bd9879658 100644 --- a/homeassistant/components/august/__init__.py +++ b/homeassistant/components/august/__init__.py @@ -90,8 +90,11 @@ async def async_request_validation(hass, config_entry, august_gateway): hass.data[DOMAIN][entry_id][TWO_FA_REVALIDATE] = configurator.async_request_config( f"{DEFAULT_NAME} ({username})", async_august_configuration_validation_callback, - description="August must be re-verified. Please check your {} ({}) and enter the verification " - "code below".format(login_method, username), + description=( + "August must be re-verified. " + f"Please check your {login_method} ({username}) " + "and enter the verification code below" + ), submit_caption="Verify", fields=[ {"id": VERIFICATION_CODE_KEY, "name": "Verification code", "type": "string"} @@ -265,7 +268,7 @@ class AugustData(AugustSubscriberMixin): self._api.async_get_doorbell_detail, ) _LOGGER.debug( - "async_signal_device_id_update (from detail updates): %s", device_id, + "async_signal_device_id_update (from detail updates): %s", device_id ) self.async_signal_device_id_update(device_id) diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index 6a03d899a095..e930a0de5973 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -92,7 +92,7 @@ def calculate_offset(event, offset): time = search.group(1) if ":" not in time: if time[0] == "+" or time[0] == "-": - time = "{}0:{}".format(time[0], time[1:]) + time = f"{time[0]}0:{time[1:]}" else: time = f"0:{time}" diff --git a/homeassistant/components/canary/__init__.py b/homeassistant/components/canary/__init__.py index a8a45f5b9469..1c7c8bb4a903 100644 --- a/homeassistant/components/canary/__init__.py +++ b/homeassistant/components/canary/__init__.py @@ -49,9 +49,7 @@ def setup(hass, config): except (ConnectTimeout, HTTPError) as ex: _LOGGER.error("Unable to connect to Canary service: %s", str(ex)) hass.components.persistent_notification.create( - "Error: {}
" - "You will need to restart hass after fixing." - "".format(ex), + f"Error: {ex}
You will need to restart hass after fixing.", title=NOTIFICATION_TITLE, notification_id=NOTIFICATION_ID, ) diff --git a/homeassistant/components/canary/sensor.py b/homeassistant/components/canary/sensor.py index 88b42d296ed5..0be5171af485 100644 --- a/homeassistant/components/canary/sensor.py +++ b/homeassistant/components/canary/sensor.py @@ -76,7 +76,7 @@ class CanarySensor(Entity): @property def unique_id(self): """Return the unique ID of this sensor.""" - return "{}_{}".format(self._device_id, self._sensor_type[0]) + return f"{self._device_id}_{self._sensor_type[0]}" @property def unit_of_measurement(self): diff --git a/homeassistant/components/cisco_webex_teams/notify.py b/homeassistant/components/cisco_webex_teams/notify.py index 7be53d1fb6cd..271d58fcc8e8 100644 --- a/homeassistant/components/cisco_webex_teams/notify.py +++ b/homeassistant/components/cisco_webex_teams/notify.py @@ -48,7 +48,7 @@ class CiscoWebexTeamsNotificationService(BaseNotificationService): title = "" if kwargs.get(ATTR_TITLE) is not None: - title = "{}{}".format(kwargs.get(ATTR_TITLE), "
") + title = f"{kwargs.get(ATTR_TITLE)}
" try: self.client.messages.create(roomId=self.room, html=f"{title}{message}") diff --git a/homeassistant/components/cloud/alexa_config.py b/homeassistant/components/cloud/alexa_config.py index 8d1527b19309..86b3532e00e3 100644 --- a/homeassistant/components/cloud/alexa_config.py +++ b/homeassistant/components/cloud/alexa_config.py @@ -119,9 +119,9 @@ class AlexaConfig(alexa_config.AbstractConfig): if self.should_report_state: await self._prefs.async_update(alexa_report_state=False) self.hass.components.persistent_notification.async_create( - "There was an error reporting state to Alexa ({}). " + f"There was an error reporting state to Alexa ({body['reason']}). " "Please re-link your Alexa skill via the Alexa app to " - "continue using it.".format(body["reason"]), + "continue using it.", "Alexa state reporting disabled", "cloud_alexa_report", ) diff --git a/homeassistant/components/coinbase/sensor.py b/homeassistant/components/coinbase/sensor.py index a13dfef11da8..973c3d391591 100644 --- a/homeassistant/components/coinbase/sensor.py +++ b/homeassistant/components/coinbase/sensor.py @@ -82,7 +82,7 @@ class AccountSensor(Entity): """Get the latest state of the sensor.""" self._coinbase_data.update() for account in self._coinbase_data.accounts["data"]: - if self._name == "Coinbase {}".format(account["name"]): + if self._name == f"Coinbase {account['name']}": self._state = account["balance"]["amount"] self._native_balance = account["native_balance"]["amount"] self._native_currency = account["native_balance"]["currency"] diff --git a/homeassistant/components/ezviz/camera.py b/homeassistant/components/ezviz/camera.py index b8ede42a508a..e7e6725e4557 100644 --- a/homeassistant/components/ezviz/camera.py +++ b/homeassistant/components/ezviz/camera.py @@ -219,15 +219,16 @@ class HassEzvizCamera(Camera): ffmpeg = ImageFrame(self._ffmpeg.binary, loop=self.hass.loop) image = await asyncio.shield( - ffmpeg.get_image(self._rtsp_stream, output_format=IMAGE_JPEG,) + ffmpeg.get_image(self._rtsp_stream, output_format=IMAGE_JPEG) ) return image async def stream_source(self): """Return the stream source.""" if self._local_rtsp_port: - rtsp_stream_source = "rtsp://{}:{}@{}:{}".format( - self._username, self._password, self._local_ip, self._local_rtsp_port + rtsp_stream_source = ( + f"rtsp://{self._username}:{self._password}@" + f"{self._local_ip}:{self._local_rtsp_port}" ) _LOGGER.debug( "Camera %s source stream: %s", self._serial, rtsp_stream_source diff --git a/homeassistant/components/hdmi_cec/media_player.py b/homeassistant/components/hdmi_cec/media_player.py index 9b130f91b72c..c49ee45271a9 100644 --- a/homeassistant/components/hdmi_cec/media_player.py +++ b/homeassistant/components/hdmi_cec/media_player.py @@ -67,9 +67,7 @@ class CecPlayerDevice(CecDevice, MediaPlayerDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "{}.{}_{}".format( - DOMAIN, "hdmi", hex(self._logical_address)[2:] - ) + self.entity_id = f"{DOMAIN}.hdmi_{hex(self._logical_address)[2:]}" def send_keypress(self, key): """Send keypress to CEC adapter.""" diff --git a/homeassistant/components/hdmi_cec/switch.py b/homeassistant/components/hdmi_cec/switch.py index a4ef91dee8f5..0fcf9c01c8fd 100644 --- a/homeassistant/components/hdmi_cec/switch.py +++ b/homeassistant/components/hdmi_cec/switch.py @@ -28,9 +28,7 @@ class CecSwitchDevice(CecDevice, SwitchDevice): def __init__(self, device, logical) -> None: """Initialize the HDMI device.""" CecDevice.__init__(self, device, logical) - self.entity_id = "{}.{}_{}".format( - DOMAIN, "hdmi", hex(self._logical_address)[2:] - ) + self.entity_id = f"{DOMAIN}.hdmi_{hex(self._logical_address)[2:]}" def turn_on(self, **kwargs) -> None: """Turn device on.""" diff --git a/homeassistant/components/n26/sensor.py b/homeassistant/components/n26/sensor.py index 93f0fae918a5..7752efe82ea8 100644 --- a/homeassistant/components/n26/sensor.py +++ b/homeassistant/components/n26/sensor.py @@ -71,7 +71,7 @@ class N26Account(Entity): @property def name(self) -> str: """Friendly name of the sensor.""" - return "n26_{}".format(self._iban[-4:]) + return f"n26_{self._iban[-4:]}" @property def state(self) -> float: @@ -110,7 +110,7 @@ class N26Account(Entity): } for limit in self._data.limits: - limit_attr_name = "limit_{}".format(limit["limit"].lower()) + limit_attr_name = f"limit_{limit['limit'].lower()}" attributes[limit_attr_name] = limit["amount"] return attributes @@ -143,7 +143,7 @@ class N26Card(Entity): @property def name(self) -> str: """Friendly name of the sensor.""" - return "{}_card_{}".format(self._account_name.lower(), self._card["id"]) + return f"{self._account_name.lower()}_card_{self._card['id']}" @property def state(self) -> float: @@ -206,9 +206,7 @@ class N26Space(Entity): @property def unique_id(self): """Return the unique ID of the entity.""" - return "space_{}_{}".format( - self._data.balance["iban"][-4:], self._space["name"].lower() - ) + return f"space_{self._data.balance['iban'][-4:]}_{self._space['name'].lower()}" @property def name(self) -> str: diff --git a/homeassistant/components/n26/switch.py b/homeassistant/components/n26/switch.py index 90651cb5a4b9..6ec111720f35 100644 --- a/homeassistant/components/n26/switch.py +++ b/homeassistant/components/n26/switch.py @@ -42,7 +42,7 @@ class N26CardSwitch(SwitchDevice): @property def name(self) -> str: """Friendly name of the sensor.""" - return "card_{}".format(self._card["id"]) + return f"card_{self._card['id']}" @property def is_on(self): diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index 54c385c1f231..f92f6466156e 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -200,7 +200,7 @@ async def async_setup_entry(hass, entry): now = datetime.utcnow() trip_id = service.data.get( - ATTR_TRIP_ID, "trip_{}".format(int(now.timestamp())) + ATTR_TRIP_ID, f"trip_{int(now.timestamp())}" ) eta_begin = now + service.data[ATTR_ETA] eta_window = service.data.get(ATTR_ETA_WINDOW, timedelta(minutes=1)) @@ -368,15 +368,11 @@ class NestSensorDevice(Entity): if device is not None: # device specific self.device = device - self._name = "{} {}".format( - self.device.name_long, self.variable.replace("_", " ") - ) + self._name = f"{self.device.name_long} {self.variable.replace('_', ' ')}" else: # structure only self.device = structure - self._name = "{} {}".format( - self.structure.name, self.variable.replace("_", " ") - ) + self._name = f"{self.structure.name} {self.variable.replace('_', ' ')}" self._state = None self._unit = None diff --git a/homeassistant/components/websocket_api/auth.py b/homeassistant/components/websocket_api/auth.py index 9e33ed74fd40..f5b29f49b1e5 100644 --- a/homeassistant/components/websocket_api/auth.py +++ b/homeassistant/components/websocket_api/auth.py @@ -57,8 +57,8 @@ class AuthPhase: try: msg = AUTH_MESSAGE_SCHEMA(msg) except vol.Invalid as err: - error_msg = "Auth message incorrectly formatted: {}".format( - humanize_error(msg, err) + error_msg = ( + f"Auth message incorrectly formatted: {humanize_error(msg, err)}" ) self._logger.warning(error_msg) self._send_message(auth_invalid_message(error_msg)) diff --git a/homeassistant/components/wink/__init__.py b/homeassistant/components/wink/__init__.py index 54d3b2efde98..2d20183cb3da 100644 --- a/homeassistant/components/wink/__init__.py +++ b/homeassistant/components/wink/__init__.py @@ -233,15 +233,13 @@ def _request_app_setup(hass, config): start_url = f"{hass.config.api.base_url}{WINK_AUTH_CALLBACK_PATH}" - description = """Please create a Wink developer app at + description = f"""Please create a Wink developer app at https://developer.wink.com. - Add a Redirect URI of {}. + Add a Redirect URI of {start_url}. They will provide you a Client ID and secret after reviewing your request. (This can take several days). - """.format( - start_url - ) + """ hass.data[DOMAIN]["configuring"][DOMAIN] = configurator.request_config( DOMAIN, @@ -351,9 +349,7 @@ def setup(hass, config): # Home . else: - redirect_uri = "{}{}".format( - hass.config.api.base_url, WINK_AUTH_CALLBACK_PATH - ) + redirect_uri = f"{hass.config.api.base_url}{WINK_AUTH_CALLBACK_PATH}" wink_auth_start_url = pywink.get_authorization_url( config_file.get(ATTR_CLIENT_ID), redirect_uri diff --git a/homeassistant/components/wirelesstag/sensor.py b/homeassistant/components/wirelesstag/sensor.py index 14f630847098..2a8452490280 100644 --- a/homeassistant/components/wirelesstag/sensor.py +++ b/homeassistant/components/wirelesstag/sensor.py @@ -58,8 +58,8 @@ class WirelessTagSensor(WirelessTagBaseSensor): # sensor.wirelesstag_bedroom_temperature # and not as sensor.bedroom for temperature and # sensor.bedroom_2 for humidity - self._entity_id = "{}.{}_{}_{}".format( - "sensor", WIRELESSTAG_DOMAIN, self.underscored_name, self._sensor_type + self._entity_id = ( + f"sensor.{WIRELESSTAG_DOMAIN}_{self.underscored_name}_{self._sensor_type}" ) async def async_added_to_hass(self): diff --git a/homeassistant/components/wirelesstag/switch.py b/homeassistant/components/wirelesstag/switch.py index 1bc806d9e323..79242394f7fa 100644 --- a/homeassistant/components/wirelesstag/switch.py +++ b/homeassistant/components/wirelesstag/switch.py @@ -57,7 +57,7 @@ class WirelessTagSwitch(WirelessTagBaseSensor, SwitchDevice): super().__init__(api, tag) self._switch_type = switch_type self.sensor_type = SWITCH_TYPES[self._switch_type][1] - self._name = "{} {}".format(self._tag.name, SWITCH_TYPES[self._switch_type][0]) + self._name = f"{self._tag.name} {SWITCH_TYPES[self._switch_type][0]}" def turn_on(self, **kwargs): """Turn on the switch.""" diff --git a/homeassistant/components/withings/sensor.py b/homeassistant/components/withings/sensor.py index 7e58beb4419a..61e4dab8510c 100644 --- a/homeassistant/components/withings/sensor.py +++ b/homeassistant/components/withings/sensor.py @@ -320,8 +320,9 @@ class WithingsHealthSensor(Entity): @property def unique_id(self) -> str: """Return a unique, Home Assistant friendly identifier for this entity.""" - return "withings_{}_{}_{}".format( - self._slug, self._user_id, slugify(self._attribute.measurement) + return ( + f"withings_{self._slug}_{self._user_id}_" + f"{slugify(self._attribute.measurement)}" ) @property diff --git a/homeassistant/components/wunderground/sensor.py b/homeassistant/components/wunderground/sensor.py index 22aefa5be4aa..6d843c222d98 100644 --- a/homeassistant/components/wunderground/sensor.py +++ b/homeassistant/components/wunderground/sensor.py @@ -217,9 +217,9 @@ class WUHourlyForecastSensorConfig(WUSensorConfig): :param field: field name to use as value """ super().__init__( - friendly_name=lambda wu: "{} {}".format( - wu.data["hourly_forecast"][period]["FCTTIME"]["weekday_name_abbrev"], - wu.data["hourly_forecast"][period]["FCTTIME"]["civil"], + friendly_name=lambda wu: ( + f"{wu.data['hourly_forecast'][period]['FCTTIME']['weekday_name_abbrev']} " + f"{wu.data['hourly_forecast'][period]['FCTTIME']['civil']}" ), feature="hourly", value=lambda wu: wu.data["hourly_forecast"][period][field], @@ -477,8 +477,9 @@ SENSOR_TYPES = { "Wind Summary", "wind_string", "mdi:weather-windy" ), "temp_high_record_c": WUAlmanacSensorConfig( - lambda wu: "High Temperature Record ({})".format( - wu.data["almanac"]["temp_high"]["recordyear"] + lambda wu: ( + f"High Temperature Record " + f"({wu.data['almanac']['temp_high']['recordyear']})" ), "temp_high", "record", @@ -487,8 +488,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_high_record_f": WUAlmanacSensorConfig( - lambda wu: "High Temperature Record ({})".format( - wu.data["almanac"]["temp_high"]["recordyear"] + lambda wu: ( + f"High Temperature Record " + f"({wu.data['almanac']['temp_high']['recordyear']})" ), "temp_high", "record", @@ -497,8 +499,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_low_record_c": WUAlmanacSensorConfig( - lambda wu: "Low Temperature Record ({})".format( - wu.data["almanac"]["temp_low"]["recordyear"] + lambda wu: ( + f"Low Temperature Record " + f"({wu.data['almanac']['temp_low']['recordyear']})" ), "temp_low", "record", @@ -507,8 +510,9 @@ SENSOR_TYPES = { "mdi:thermometer", ), "temp_low_record_f": WUAlmanacSensorConfig( - lambda wu: "Low Temperature Record ({})".format( - wu.data["almanac"]["temp_low"]["recordyear"] + lambda wu: ( + f"Low Temperature Record " + f"({wu.data['almanac']['temp_low']['recordyear']})" ), "temp_low", "record", diff --git a/homeassistant/components/xiaomi/camera.py b/homeassistant/components/xiaomi/camera.py index 2b249c7b7c88..45466be2cc44 100644 --- a/homeassistant/components/xiaomi/camera.py +++ b/homeassistant/components/xiaomi/camera.py @@ -136,9 +136,7 @@ class XiaomiCamera(Camera): else: video = videos[-1] - return "ftp://{}:{}@{}:{}{}/{}".format( - self.user, self.passwd, host, self.port, ftp.pwd(), video - ) + return f"ftp://{self.user}:{self.passwd}@{host}:{self.port}{ftp.pwd()}/{video}" async def async_camera_image(self): """Return a still image response from the camera.""" diff --git a/homeassistant/components/xiaomi_aqara/__init__.py b/homeassistant/components/xiaomi_aqara/__init__.py index 533238ac5e76..450a6e4c862d 100644 --- a/homeassistant/components/xiaomi_aqara/__init__.py +++ b/homeassistant/components/xiaomi_aqara/__init__.py @@ -242,8 +242,8 @@ class XiaomiDevice(Entity): self.parse_voltage(device["data"]) if hasattr(self, "_data_key") and self._data_key: # pylint: disable=no-member - self._unique_id = "{}{}".format( - self._data_key, self._sid # pylint: disable=no-member + self._unique_id = ( + f"{self._data_key}{self._sid}" # pylint: disable=no-member ) else: self._unique_id = f"{self._type}{self._sid}" diff --git a/homeassistant/components/xiaomi_miio/light.py b/homeassistant/components/xiaomi_miio/light.py index 61462bcdbc06..c4ea831ceebb 100644 --- a/homeassistant/components/xiaomi_miio/light.py +++ b/homeassistant/components/xiaomi_miio/light.py @@ -718,7 +718,7 @@ class XiaomiPhilipsEyecareLampAmbientLight(XiaomiPhilipsAbstractLight): """Initialize the light device.""" name = f"{name} Ambient Light" if unique_id is not None: - unique_id = "{}-{}".format(unique_id, "ambient") + unique_id = f"{unique_id}-ambient" super().__init__(name, light, model, unique_id) async def async_turn_on(self, **kwargs): diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index 63229b851d06..c66f9b745f5e 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -429,7 +429,7 @@ class ChuangMiPlugSwitch(XiaomiPlugGenericSwitch): name = f"{name} USB" if channel_usb else name if unique_id is not None and channel_usb: - unique_id = "{}-{}".format(unique_id, "usb") + unique_id = f"{unique_id}-usb" super().__init__(name, plug, model, unique_id) self._channel_usb = channel_usb diff --git a/homeassistant/components/yi/camera.py b/homeassistant/components/yi/camera.py index 658cc3a23ee9..4273b5294eda 100644 --- a/homeassistant/components/yi/camera.py +++ b/homeassistant/components/yi/camera.py @@ -110,14 +110,9 @@ class YiCamera(Camera): await ftp.quit() self._is_on = True - return "ftp://{}:{}@{}:{}{}/{}/{}".format( - self.user, - self.passwd, - self.host, - self.port, - self.path, - latest_dir, - videos[-1], + return ( + f"ftp://{self.user}:{self.passwd}@{self.host}:" + f"{self.port}{self.path}/{latest_dir}/{videos[-1]}" ) except (ConnectionRefusedError, StatusCodeError) as err: _LOGGER.error("Error while fetching video: %s", err) diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index a5eb90df218c..664ce0a38b62 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -159,7 +159,7 @@ class ZamgData: """The class for handling the data retrieval.""" API_URL = "http://www.zamg.ac.at/ogd/" - API_HEADERS = {USER_AGENT: "{} {}".format("home-assistant.zamg/", __version__)} + API_HEADERS = {USER_AGENT: f"home-assistant.zamg/ {__version__}"} def __init__(self, station_id): """Initialize the probe.""" diff --git a/homeassistant/components/zamg/weather.py b/homeassistant/components/zamg/weather.py index 46818578534e..c1a0ab62cc52 100644 --- a/homeassistant/components/zamg/weather.py +++ b/homeassistant/components/zamg/weather.py @@ -78,8 +78,9 @@ class ZamgWeather(WeatherEntity): @property def name(self): """Return the name of the sensor.""" - return self.stationname or "ZAMG {}".format( - self.zamg_data.data.get("Name") or "(unknown station)" + return ( + self.stationname + or f"ZAMG {self.zamg_data.data.get('Name') or '(unknown station)'}" ) @property diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 56e8d3ddcbf1..287ad0dd5221 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -93,9 +93,7 @@ class ZHADevice(LogMixin): self._zigpy_device = zigpy_device self._zha_gateway = zha_gateway self._available = False - self._available_signal = "{}_{}_{}".format( - self.name, self.ieee, SIGNAL_AVAILABLE - ) + self._available_signal = f"{self.name}_{self.ieee}_{SIGNAL_AVAILABLE}" self._checkins_missed_count = 0 self.unsubs = [] self.unsubs.append( @@ -104,10 +102,11 @@ class ZHADevice(LogMixin): ) ) self.quirk_applied = isinstance(self._zigpy_device, zigpy.quirks.CustomDevice) - self.quirk_class = "{}.{}".format( - self._zigpy_device.__class__.__module__, - self._zigpy_device.__class__.__name__, + self.quirk_class = ( + f"{self._zigpy_device.__class__.__module__}." + f"{self._zigpy_device.__class__.__name__}" ) + if self.is_mains_powered: self._consider_unavailable_time = _CONSIDER_UNAVAILABLE_MAINS else: @@ -352,9 +351,7 @@ class ZHADevice(LogMixin): if self._available != available and available: # Update the state the first time the device comes online async_dispatcher_send(self.hass, self._available_signal, False) - async_dispatcher_send( - self.hass, "{}_{}".format(self._available_signal, "entity"), available - ) + async_dispatcher_send(self.hass, f"{self._available_signal}_entity", available) self._available = available @property diff --git a/homeassistant/components/zha/entity.py b/homeassistant/components/zha/entity.py index 0ba7ff09f3f1..dd12924f4b0d 100644 --- a/homeassistant/components/zha/entity.py +++ b/homeassistant/components/zha/entity.py @@ -119,7 +119,7 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): self.remove_future = asyncio.Future() await self.async_accept_signal( None, - "{}_{}".format(SIGNAL_REMOVE, str(self.zha_device.ieee)), + f"{SIGNAL_REMOVE}_{self.zha_device.ieee}", self.async_remove, signal_override=True, ) @@ -182,7 +182,7 @@ class ZhaEntity(BaseZhaEntity): await self.async_check_recently_seen() await self.async_accept_signal( None, - "{}_{}".format(self.zha_device.available_signal, "entity"), + f"{self.zha_device.available_signal}_entity", self.async_set_available, signal_override=True, ) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 9beef00a9217..279cd5b8eb0d 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -261,7 +261,7 @@ def _obj_to_dict(obj): def _value_name(value): """Return the name of the value.""" - return "{} {}".format(node_name(value.node), value.label).strip() + return f"{node_name(value.node)} {value.label}".strip() def nice_print_node(node): @@ -826,9 +826,7 @@ async def async_setup_entry(hass, config_entry): ) return _LOGGER.info( - "Node %s on instance %s does not have resettable meters.", - node_id, - instance, + "Node %s on instance %s does not have resettable meters.", node_id, instance ) def heal_node(service): diff --git a/homeassistant/components/zwave/lock.py b/homeassistant/components/zwave/lock.py index 382d2c4dbf28..0bbcf9815c64 100644 --- a/homeassistant/components/zwave/lock.py +++ b/homeassistant/components/zwave/lock.py @@ -337,21 +337,20 @@ class ZwaveLock(ZWaveDeviceEntity, LockDevice): ) if alarm_type == 21: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), - MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level)), + self._lock_status = ( + f"{LOCK_ALARM_TYPE.get(str(alarm_type))}" + f"{MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level))}" ) return if str(alarm_type) in ALARM_TYPE_STD: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), str(alarm_level) - ) + self._lock_status = f"{LOCK_ALARM_TYPE.get(str(alarm_type))}{alarm_level}" return if alarm_type == 161: - self._lock_status = "{}{}".format( - LOCK_ALARM_TYPE.get(str(alarm_type)), - TAMPER_ALARM_LEVEL.get(str(alarm_level)), + self._lock_status = ( + f"{LOCK_ALARM_TYPE.get(str(alarm_type))}" + f"{TAMPER_ALARM_LEVEL.get(str(alarm_level))}" ) + return if alarm_type != 0: self._lock_status = LOCK_ALARM_TYPE.get(str(alarm_type)) diff --git a/homeassistant/config.py b/homeassistant/config.py index 068dbd47fa96..297680279dbf 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -116,10 +116,9 @@ def _no_duplicate_auth_provider( key = (config[CONF_TYPE], config.get(CONF_ID)) if key in config_keys: raise vol.Invalid( - "Duplicate auth provider {} found. Please add unique IDs if " - "you want to have the same auth provider twice".format( - config[CONF_TYPE] - ) + f"Duplicate auth provider {config[CONF_TYPE]} found. " + "Please add unique IDs " + "if you want to have the same auth provider twice" ) config_keys.add(key) return configs @@ -140,8 +139,9 @@ def _no_duplicate_auth_mfa_module( key = config.get(CONF_ID, config[CONF_TYPE]) if key in config_keys: raise vol.Invalid( - "Duplicate mfa module {} found. Please add unique IDs if " - "you want to have the same mfa module twice".format(config[CONF_TYPE]) + f"Duplicate mfa module {config[CONF_TYPE]} found. " + "Please add unique IDs " + "if you want to have the same mfa module twice" ) config_keys.add(key) return configs @@ -319,8 +319,9 @@ def load_yaml_config_file(config_path: str) -> Dict[Any, Any]: conf_dict = load_yaml(config_path) if not isinstance(conf_dict, dict): - msg = "The configuration file {} does not contain a dictionary".format( - os.path.basename(config_path) + msg = ( + f"The configuration file {os.path.basename(config_path)} " + "does not contain a dictionary" ) _LOGGER.error(msg) raise HomeAssistantError(msg) @@ -415,16 +416,13 @@ def _format_config_error( message = f"Invalid config for [{domain}]: " if isinstance(ex, vol.Invalid): if "extra keys not allowed" in ex.error_message: + path = "->".join(str(m) for m in ex.path) message += ( - "[{option}] is an invalid option for [{domain}]. " - "Check: {domain}->{path}.".format( - option=ex.path[-1], - domain=domain, - path="->".join(str(m) for m in ex.path), - ) + f"[{ex.path[-1]}] is an invalid option for [{domain}]. " + f"Check: {domain}->{path}." ) else: - message += "{}.".format(humanize_error(config, ex)) + message += f"{humanize_error(config, ex)}." else: message += str(ex) @@ -433,9 +431,9 @@ def _format_config_error( except AttributeError: domain_config = config - message += " (See {}, line {}). ".format( - getattr(domain_config, "__config_file__", "?"), - getattr(domain_config, "__line__", "?"), + message += ( + f" (See {getattr(domain_config, '__config_file__', '?')}, " + f"line {getattr(domain_config, '__line__', '?')}). " ) if domain != CONF_CORE and link: @@ -551,9 +549,9 @@ def _log_pkg_error(package: str, component: str, config: Dict, message: str) -> message = f"Package {package} setup failed. Integration {component} {message}" pack_config = config[CONF_CORE][CONF_PACKAGES].get(package, config) - message += " (See {}:{}). ".format( - getattr(pack_config, "__config_file__", "?"), - getattr(pack_config, "__line__", "?"), + message += ( + f" (See {getattr(pack_config, '__config_file__', '?')}:" + f"{getattr(pack_config, '__line__', '?')}). " ) _LOGGER.error(message) diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index 0d419ae66c28..20763dd39a5f 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -179,9 +179,7 @@ class FlowManager(abc.ABC): RESULT_TYPE_ABORT, RESULT_TYPE_EXTERNAL_STEP_DONE, ): - raise ValueError( - "Handler returned incorrect type: {}".format(result["type"]) - ) + raise ValueError(f"Handler returned incorrect type: {result['type']}") if result["type"] in ( RESULT_TYPE_FORM, diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index b8e54155922f..36a9bccf39d3 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -146,7 +146,7 @@ class EntityRegistry: Conflicts checked against registered and currently existing entities. """ return ensure_unique_string( - "{}.{}".format(domain, slugify(suggested_object_id)), + f"{domain}.{slugify(suggested_object_id)}", chain( self.entities.keys(), self.hass.states.async_entity_ids(domain), diff --git a/homeassistant/loader.py b/homeassistant/loader.py index f8b9ba55aa1e..913262d35c4d 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -425,8 +425,7 @@ def _load_file( if str(err) not in white_listed_errors: _LOGGER.exception( - ("Error loading %s. Make sure all dependencies are installed"), - path, + ("Error loading %s. Make sure all dependencies are installed"), path ) return None diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index 23d90796c866..25b25f41a208 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -233,9 +233,7 @@ def line_info(obj, **kwargs): """Display line config source.""" if hasattr(obj, "__config_file__"): return color( - "cyan", - "[source {}:{}]".format(obj.__config_file__, obj.__line__ or "?"), - **kwargs, + "cyan", f"[source {obj.__config_file__}:{obj.__line__ or '?'}]", **kwargs ) return "?" diff --git a/homeassistant/util/ruamel_yaml.py b/homeassistant/util/ruamel_yaml.py index 71d3ab2cc433..8635de00fe43 100644 --- a/homeassistant/util/ruamel_yaml.py +++ b/homeassistant/util/ruamel_yaml.py @@ -54,9 +54,8 @@ def _yaml_unsupported( constructor: ExtSafeConstructor, node: ruamel.yaml.nodes.Node ) -> None: raise UnsupportedYamlError( - "Unsupported YAML, you can not use {} in {}".format( - node.tag, os.path.basename(constructor.name or "(None)") - ) + f"Unsupported YAML, you can not use {node.tag} in " + f"{os.path.basename(constructor.name or '(None)')}" ) diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index b6f357d4cda0..5c7385822fdb 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -182,7 +182,7 @@ def gather_requirements_from_modules(errors, reqs): try: module = importlib.import_module(package) except ImportError as err: - print("{}.py: {}".format(package.replace(".", "/"), err)) + print(f"{package.replace('.', '/')}.py: {err}") errors.append(package) continue diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 2bec560f2998..76d62bda6067 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -48,9 +48,7 @@ def generate_and_validate(integrations: Dict[str, Integration]): "codeowners", "Code owners need to be valid GitHub handles." ) - parts.append( - "homeassistant/components/{}/* {}".format(domain, " ".join(codeowners)) - ) + parts.append(f"homeassistant/components/{domain}/* {' '.join(codeowners)}") parts.append(f"\n{INDIVIDUAL_FILES.strip()}") diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index 758279cabf8c..eeaf6f01262b 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -12,12 +12,7 @@ DOCUMENTATION_URL_HOST = "www.home-assistant.io" DOCUMENTATION_URL_PATH_PREFIX = "/integrations/" DOCUMENTATION_URL_EXCEPTIONS = ["https://www.home-assistant.io/hassio"] -SUPPORTED_QUALITY_SCALES = [ - "gold", - "internal", - "platinum", - "silver", -] +SUPPORTED_QUALITY_SCALES = ["gold", "internal", "platinum", "silver"] def documentation_url(value: str) -> str: @@ -68,8 +63,7 @@ def validate_manifest(integration: Integration): MANIFEST_SCHEMA(integration.manifest) except vol.Invalid as err: integration.add_error( - "manifest", - "Invalid manifest: {}".format(humanize_error(integration.manifest, err)), + "manifest", f"Invalid manifest: {humanize_error(integration.manifest, err)}" ) integration.manifest = None return diff --git a/script/hassfest/services.py b/script/hassfest/services.py index 08cde60f5b5e..1e05ef63efb2 100644 --- a/script/hassfest/services.py +++ b/script/hassfest/services.py @@ -79,7 +79,7 @@ def validate_services(integration: Integration): SERVICES_SCHEMA(data) except vol.Invalid as err: integration.add_error( - "services", "Invalid services.yaml: {}".format(humanize_error(data, err)) + "services", f"Invalid services.yaml: {humanize_error(data, err)}" ) diff --git a/script/hassfest/zeroconf.py b/script/hassfest/zeroconf.py index 48a5873133bd..89e0eb7fba4a 100644 --- a/script/hassfest/zeroconf.py +++ b/script/hassfest/zeroconf.py @@ -79,8 +79,8 @@ def generate_and_validate(integrations: Dict[str, Integration]): if model in homekit_dict: integration.add_error( "zeroconf", - "Integrations {} and {} have overlapping HomeKit " - "models".format(domain, homekit_dict[model]), + f"Integrations {domain} and {homekit_dict[model]} " + "have overlapping HomeKit models", ) break @@ -100,8 +100,8 @@ def generate_and_validate(integrations: Dict[str, Integration]): if key.startswith(key_2) or key_2.startswith(key): integration.add_error( "zeroconf", - "Integrations {} and {} have overlapping HomeKit " - "models".format(homekit_dict[key], homekit_dict[key_2]), + f"Integrations {homekit_dict[key]} and {homekit_dict[key_2]} " + "have overlapping HomeKit models", ) warned.add(key) warned.add(key_2) diff --git a/script/lazytox.py b/script/lazytox.py index e171cb3d669c..5a8837b8154d 100755 --- a/script/lazytox.py +++ b/script/lazytox.py @@ -61,7 +61,7 @@ async def async_exec(*args, display=False): argsp = [] for arg in args: if os.path.isfile(arg): - argsp.append("\\\n {}".format(shlex.quote(arg))) + argsp.append(f"\\\n {shlex.quote(arg)}") else: argsp.append(shlex.quote(arg)) printc("cyan", *argsp) @@ -75,9 +75,7 @@ async def async_exec(*args, display=False): kwargs["stderr"] = asyncio.subprocess.PIPE proc = await asyncio.create_subprocess_exec(*args, **kwargs) except FileNotFoundError as err: - printc( - FAIL, f"Could not execute {args[0]}. Did you install test requirements?", - ) + printc(FAIL, f"Could not execute {args[0]}. Did you install test requirements?") raise err if not display: From 3f0936f0683d0568e32858d83aae390e8658171c Mon Sep 17 00:00:00 2001 From: Malachi Soord Date: Sun, 5 Apr 2020 18:03:13 +0200 Subject: [PATCH 137/653] Prevent last.fm errors with None (#33446) --- homeassistant/components/lastfm/sensor.py | 30 ++++++--- requirements_test_all.txt | 3 + tests/components/lastfm/__init__.py | 1 + tests/components/lastfm/test_sensor.py | 82 +++++++++++++++++++++++ 4 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 tests/components/lastfm/__init__.py create mode 100644 tests/components/lastfm/test_sensor.py diff --git a/homeassistant/components/lastfm/sensor.py b/homeassistant/components/lastfm/sensor.py index 80a72f1d6fda..4783457112cb 100644 --- a/homeassistant/components/lastfm/sensor.py +++ b/homeassistant/components/lastfm/sensor.py @@ -19,6 +19,8 @@ ATTR_PLAY_COUNT = "play_count" ATTR_TOP_PLAYED = "top_played" ATTRIBUTION = "Data provided by Last.fm" +STATE_NOT_SCROBBLING = "Not Scrobbling" + CONF_USERS = "users" ICON = "mdi:lastfm" @@ -84,17 +86,25 @@ class LastfmSensor(Entity): """Update device state.""" self._cover = self._user.get_image() self._playcount = self._user.get_playcount() - last = self._user.get_recent_tracks(limit=2)[0] - self._lastplayed = f"{last.track.artist} - {last.track.title}" - top = self._user.get_top_tracks(limit=1)[0] - toptitle = re.search("', '(.+?)',", str(top)) - topartist = re.search("'(.+?)',", str(top)) - self._topplayed = f"{topartist.group(1)} - {toptitle.group(1)}" - if self._user.get_now_playing() is None: - self._state = "Not Scrobbling" + + recent_tracks = self._user.get_recent_tracks(limit=2) + if recent_tracks: + last = recent_tracks[0] + self._lastplayed = f"{last.track.artist} - {last.track.title}" + + top_tracks = self._user.get_top_tracks(limit=1) + if top_tracks: + top = top_tracks[0] + toptitle = re.search("', '(.+?)',", str(top)) + topartist = re.search("'(.+?)',", str(top)) + self._topplayed = f"{topartist.group(1)} - {toptitle.group(1)}" + + now_playing = self._user.get_now_playing() + if now_playing is None: + self._state = STATE_NOT_SCROBBLING return - now = self._user.get_now_playing() - self._state = f"{now.artist} - {now.title}" + + self._state = f"{now_playing.artist} - {now_playing.title}" @property def device_state_attributes(self): diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5db1635e39a7..b064ca1b4117 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -532,6 +532,9 @@ pyiqvia==0.2.1 # homeassistant.components.kira pykira==0.1.1 +# homeassistant.components.lastfm +pylast==3.2.1 + # homeassistant.components.linky pylinky==0.4.0 diff --git a/tests/components/lastfm/__init__.py b/tests/components/lastfm/__init__.py new file mode 100644 index 000000000000..4e7cfffa833a --- /dev/null +++ b/tests/components/lastfm/__init__.py @@ -0,0 +1 @@ +"""The tests for lastfm.""" diff --git a/tests/components/lastfm/test_sensor.py b/tests/components/lastfm/test_sensor.py new file mode 100644 index 000000000000..c2ce8e947dd6 --- /dev/null +++ b/tests/components/lastfm/test_sensor.py @@ -0,0 +1,82 @@ +"""Tests for the lastfm sensor.""" +from unittest.mock import patch + +from pylast import Track +import pytest + +from homeassistant.components import sensor +from homeassistant.components.lastfm.sensor import STATE_NOT_SCROBBLING +from homeassistant.setup import async_setup_component + + +class MockUser: + """Mock user object for pylast.""" + + def __init__(self, now_playing_result): + """Initialize the mock.""" + self._now_playing_result = now_playing_result + + def get_playcount(self): + """Get mock play count.""" + return 1 + + def get_image(self): + """Get mock image.""" + pass + + def get_recent_tracks(self, limit): + """Get mock recent tracks.""" + return [] + + def get_top_tracks(self, limit): + """Get mock top tracks.""" + return [] + + def get_now_playing(self): + """Get mock now playing.""" + return self._now_playing_result + + +@pytest.fixture(name="lastfm_network") +def lastfm_network_fixture(): + """Create fixture for LastFMNetwork.""" + with patch("pylast.LastFMNetwork") as lastfm_network: + yield lastfm_network + + +async def test_update_not_playing(hass, lastfm_network): + """Test update when no playing song.""" + + lastfm_network.return_value.get_user.return_value = MockUser(None) + + assert await async_setup_component( + hass, + sensor.DOMAIN, + {"sensor": {"platform": "lastfm", "api_key": "secret-key", "users": ["test"]}}, + ) + + entity_id = "sensor.test" + + state = hass.states.get(entity_id) + + assert state.state == STATE_NOT_SCROBBLING + + +async def test_update_playing(hass, lastfm_network): + """Test update when song playing.""" + + lastfm_network.return_value.get_user.return_value = MockUser( + Track("artist", "title", None) + ) + + assert await async_setup_component( + hass, + sensor.DOMAIN, + {"sensor": {"platform": "lastfm", "api_key": "secret-key", "users": ["test"]}}, + ) + + entity_id = "sensor.test" + + state = hass.states.get(entity_id) + + assert state.state == "artist - title" From f89c73d79d298d7ea0d6716cc6f6883c321b714f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 18:19:40 +0200 Subject: [PATCH 138/653] Recommend python & prettier vscode extensions (#33702) --- .vscode/extensions.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000000..951134133e57 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "ms-python.python"] +} From d33cf289364637d42dba40ac63e08801382639c8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 18:45:43 +0200 Subject: [PATCH 139/653] Add check executables have shebangs (in pre-commit and CI) (#33703) * Add check executables have shebangs (in pre-commit and CI) * Fix file permissions * Adjust Azure Pipelines --- .pre-commit-config.yaml | 1 + azure-pipelines-ci.yml | 4 ++++ homeassistant/components/dynalite/__init__.py | 0 homeassistant/components/dynalite/bridge.py | 0 homeassistant/components/dynalite/config_flow.py | 0 homeassistant/components/dynalite/const.py | 0 homeassistant/components/dynalite/dynalitebase.py | 0 homeassistant/components/dynalite/light.py | 0 homeassistant/components/dynalite/manifest.json | 0 homeassistant/components/dynalite/switch.py | 0 homeassistant/components/tankerkoenig/__init__.py | 0 homeassistant/components/tankerkoenig/manifest.json | 0 homeassistant/components/tankerkoenig/sensor.py | 0 script/gen_requirements_all.py | 7 ++++++- tests/components/alexa/test_capabilities.py | 0 tests/components/dynalite/__init__.py | 0 tests/components/dynalite/common.py | 0 tests/components/dynalite/test_bridge.py | 0 tests/components/dynalite/test_config_flow.py | 0 tests/components/dynalite/test_init.py | 0 tests/components/dynalite/test_light.py | 0 tests/components/dynalite/test_switch.py | 0 22 files changed, 11 insertions(+), 1 deletion(-) mode change 100755 => 100644 homeassistant/components/dynalite/__init__.py mode change 100755 => 100644 homeassistant/components/dynalite/bridge.py mode change 100755 => 100644 homeassistant/components/dynalite/config_flow.py mode change 100755 => 100644 homeassistant/components/dynalite/const.py mode change 100755 => 100644 homeassistant/components/dynalite/dynalitebase.py mode change 100755 => 100644 homeassistant/components/dynalite/light.py mode change 100755 => 100644 homeassistant/components/dynalite/manifest.json mode change 100755 => 100644 homeassistant/components/dynalite/switch.py mode change 100755 => 100644 homeassistant/components/tankerkoenig/__init__.py mode change 100755 => 100644 homeassistant/components/tankerkoenig/manifest.json mode change 100755 => 100644 homeassistant/components/tankerkoenig/sensor.py mode change 100755 => 100644 tests/components/alexa/test_capabilities.py mode change 100755 => 100644 tests/components/dynalite/__init__.py mode change 100755 => 100644 tests/components/dynalite/common.py mode change 100755 => 100644 tests/components/dynalite/test_bridge.py mode change 100755 => 100644 tests/components/dynalite/test_config_flow.py mode change 100755 => 100644 tests/components/dynalite/test_init.py mode change 100755 => 100644 tests/components/dynalite/test_light.py mode change 100755 => 100644 tests/components/dynalite/test_switch.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a39b26599142..62f634ebc56f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,6 +45,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.4.0 hooks: + - id: check-executables-have-shebangs - id: check-json - id: no-commit-to-branch args: diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 2e9ec2b4e380..d04f8525fb3d 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -44,6 +44,10 @@ stages: . venv/bin/activate pip install -r requirements_test.txt -c homeassistant/package_constraints.txt pre-commit install-hooks + - script: | + . venv/bin/activate + pre-commit run check-executables-have-shebangs --all-files + displayName: 'Run executables check' - script: | . venv/bin/activate pre-commit run codespell --all-files diff --git a/homeassistant/components/dynalite/__init__.py b/homeassistant/components/dynalite/__init__.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/bridge.py b/homeassistant/components/dynalite/bridge.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/config_flow.py b/homeassistant/components/dynalite/config_flow.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/const.py b/homeassistant/components/dynalite/const.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/dynalitebase.py b/homeassistant/components/dynalite/dynalitebase.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/light.py b/homeassistant/components/dynalite/light.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/manifest.json b/homeassistant/components/dynalite/manifest.json old mode 100755 new mode 100644 diff --git a/homeassistant/components/dynalite/switch.py b/homeassistant/components/dynalite/switch.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/tankerkoenig/__init__.py b/homeassistant/components/tankerkoenig/__init__.py old mode 100755 new mode 100644 diff --git a/homeassistant/components/tankerkoenig/manifest.json b/homeassistant/components/tankerkoenig/manifest.json old mode 100755 new mode 100644 diff --git a/homeassistant/components/tankerkoenig/sensor.py b/homeassistant/components/tankerkoenig/sensor.py old mode 100755 new mode 100644 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 5c7385822fdb..fdd0c564efb9 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -68,7 +68,12 @@ enum34==1000000000.0.0 pycrypto==1000000000.0.0 """ -IGNORE_PRE_COMMIT_HOOK_ID = ("check-json", "no-commit-to-branch", "prettier") +IGNORE_PRE_COMMIT_HOOK_ID = ( + "check-executables-have-shebangs", + "check-json", + "no-commit-to-branch", + "prettier", +) def has_tests(module: str): diff --git a/tests/components/alexa/test_capabilities.py b/tests/components/alexa/test_capabilities.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/__init__.py b/tests/components/dynalite/__init__.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/common.py b/tests/components/dynalite/common.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/test_bridge.py b/tests/components/dynalite/test_bridge.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/test_config_flow.py b/tests/components/dynalite/test_config_flow.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/test_init.py b/tests/components/dynalite/test_init.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/test_light.py b/tests/components/dynalite/test_light.py old mode 100755 new mode 100644 diff --git a/tests/components/dynalite/test_switch.py b/tests/components/dynalite/test_switch.py old mode 100755 new mode 100644 From c8df5fb8ad7700db97c9f82e4fd4ea5b22e3a9b1 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sun, 5 Apr 2020 10:47:04 -0600 Subject: [PATCH 140/653] Ensure SimpliSafe state sync when websocket falters (#33680) --- .../components/simplisafe/alarm_control_panel.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/homeassistant/components/simplisafe/alarm_control_panel.py b/homeassistant/components/simplisafe/alarm_control_panel.py index 4e2393bd238d..a95f77ab3607 100644 --- a/homeassistant/components/simplisafe/alarm_control_panel.py +++ b/homeassistant/components/simplisafe/alarm_control_panel.py @@ -217,6 +217,20 @@ class SimpliSafeAlarm(SimpliSafeEntity, AlarmControlPanel): } ) + # Although system state updates are designed the come via the websocket, the + # SimpliSafe cloud can sporadically fail to send those updates as expected; so, + # just in case, we synchronize the state via the REST API, too: + if self._system.state == SystemStates.away: + self._state = STATE_ALARM_ARMED_AWAY + elif self._system.state in (SystemStates.away_count, SystemStates.exit_delay): + self._state = STATE_ALARM_ARMING + elif self._system.state == SystemStates.home: + self._state = STATE_ALARM_ARMED_HOME + elif self._system.state == SystemStates.off: + self._state = STATE_ALARM_DISARMED + else: + self._state = None + @callback def async_update_from_websocket_event(self, event): """Update the entity with the provided websocket API event data.""" From 0793b5ac6254538c499ad69906d46fde9eeec2d2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 5 Apr 2020 20:51:36 +0200 Subject: [PATCH 141/653] Show diff in CI and cleanup pylintrc (#33704) --- azure-pipelines-ci.yml | 4 ++-- pylintrc | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index d04f8525fb3d..200cbe7488f0 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -74,11 +74,11 @@ stages: displayName: 'Run yamllint' - script: | . venv/bin/activate - pre-commit run pyupgrade --all-files + pre-commit run pyupgrade --all-files --show-diff-on-failure displayName: 'Run pyupgrade' - script: | . venv/bin/activate - pre-commit run prettier --all-files + pre-commit run prettier --all-files --show-diff-on-failure displayName: 'Run prettier' - job: 'Validate' pool: diff --git a/pylintrc b/pylintrc index 38c9beb28e50..a8118d239101 100644 --- a/pylintrc +++ b/pylintrc @@ -18,13 +18,11 @@ good-names=id,i,j,k,ex,Run,_,fp # cyclic-import - doesn't test if both import on load # abstract-class-little-used - prevents from setting right foundation # unused-argument - generic callbacks and setup methods create a lot of warnings -# global-statement - used for the on-demand requirement installation # redefined-variable-type - this is Python, we're duck typing! # too-many-* - are not enforced for the sake of readability # too-few-* - same as too-many-* # abstract-method - with intro of async there are always methods missing # inconsistent-return-statements - doesn't handle raise -# import-outside-toplevel - TODO # too-many-ancestors - it's too strict. # wrong-import-order - isort guards this disable= From 171c1b20f7b34b62a108e3ffc43189f0b19217c0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 15:54:57 -0500 Subject: [PATCH 142/653] Remap homekit auto to home assistant heat_cool (#33701) Home Assistant auto mode is described as "The device is set to a schedule, learned behavior, AI." HomeKit Accessory Protocol expects "heating or cooling to maintain temperature within the heating and cooling threshold of the target temperature" Since HomeKit is expecting to set temperatures in this mode, mapping homekit state 3 ("Auto") to Home Assistant HVAC_MODE_HEAT_COOL is more inline with how Home Assistant defines HVAC_MODE_HEAT_COOL as "The device supports heating/cooling to a range" --- .../components/homekit/type_thermostats.py | 17 ++- .../homekit/test_type_thermostats.py | 125 +++++++++++++++++- 2 files changed, 137 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/homekit/type_thermostats.py b/homeassistant/components/homekit/type_thermostats.py index 57b381fa4166..98905e045c5a 100644 --- a/homeassistant/components/homekit/type_thermostats.py +++ b/homeassistant/components/homekit/type_thermostats.py @@ -27,6 +27,7 @@ from homeassistant.components.climate.const import ( DOMAIN as DOMAIN_CLIMATE, HVAC_MODE_AUTO, HVAC_MODE_COOL, + HVAC_MODE_DRY, HVAC_MODE_FAN_ONLY, HVAC_MODE_HEAT, HVAC_MODE_HEAT_COOL, @@ -150,15 +151,25 @@ class Thermostat(HomeAccessory): HVAC_MODE_OFF, ) - # determine available modes for this entity, prefer AUTO over HEAT_COOL and COOL over FAN_ONLY + # Determine available modes for this entity, + # Prefer HEAT_COOL over AUTO and COOL over FAN_ONLY, DRY + # + # HEAT_COOL is preferred over auto because HomeKit Accessory Protocol describes + # heating or cooling comes on to maintain a target temp which is closest to + # the Home Assistant spec + # + # HVAC_MODE_HEAT_COOL: The device supports heating/cooling to a range self.hc_homekit_to_hass = { c: s for s, c in HC_HASS_TO_HOMEKIT.items() if ( s in hc_modes and not ( - (s == HVAC_MODE_HEAT_COOL and HVAC_MODE_AUTO in hc_modes) - or (s == HVAC_MODE_FAN_ONLY and HVAC_MODE_COOL in hc_modes) + (s == HVAC_MODE_AUTO and HVAC_MODE_HEAT_COOL in hc_modes) + or ( + s in (HVAC_MODE_DRY, HVAC_MODE_FAN_ONLY) + and HVAC_MODE_COOL in hc_modes + ) ) ) } diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index 9533c30017fe..a6ab2fa7cf3a 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -294,10 +294,10 @@ async def test_thermostat(hass, hk_driver, cls, events): await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[1].data[ATTR_ENTITY_ID] == entity_id - assert call_set_hvac_mode[1].data[ATTR_HVAC_MODE] == HVAC_MODE_AUTO + assert call_set_hvac_mode[1].data[ATTR_HVAC_MODE] == HVAC_MODE_HEAT_COOL assert acc.char_target_heat_cool.value == 3 assert len(events) == 3 - assert events[-1].data[ATTR_VALUE] == HVAC_MODE_AUTO + assert events[-1].data[ATTR_VALUE] == HVAC_MODE_HEAT_COOL async def test_thermostat_auto(hass, hk_driver, cls, events): @@ -660,6 +660,9 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls): acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) await hass.async_add_job(acc.run) await hass.async_block_till_done() + hap = acc.char_target_heat_cool.to_HAP() + assert hap["valid-values"] == [0, 1] + assert acc.char_target_heat_cool.value == 0 with pytest.raises(ValueError): await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) @@ -676,6 +679,124 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 1 +async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): + """Test we get heat cool over auto.""" + entity_id = "climate.test" + + hass.states.async_set( + entity_id, + HVAC_MODE_HEAT_COOL, + { + ATTR_HVAC_MODES: [ + HVAC_MODE_HEAT_COOL, + HVAC_MODE_AUTO, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + ] + }, + ) + call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") + await hass.async_block_till_done() + + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + await hass.async_add_job(acc.run) + await hass.async_block_till_done() + hap = acc.char_target_heat_cool.to_HAP() + assert hap["valid-values"] == [0, 1, 3] + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + with pytest.raises(ValueError): + await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 3) + await hass.async_block_till_done() + assert call_set_hvac_mode + assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_hvac_mode[0].data[ATTR_HVAC_MODE] == HVAC_MODE_HEAT_COOL + assert acc.char_target_heat_cool.value == 3 + + +async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls): + """Test we get auto when there is no heat cool.""" + entity_id = "climate.test" + + hass.states.async_set( + entity_id, + HVAC_MODE_HEAT_COOL, + {ATTR_HVAC_MODES: [HVAC_MODE_AUTO, HVAC_MODE_HEAT, HVAC_MODE_OFF]}, + ) + call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") + await hass.async_block_till_done() + + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + await hass.async_add_job(acc.run) + await hass.async_block_till_done() + hap = acc.char_target_heat_cool.to_HAP() + assert hap["valid-values"] == [0, 1, 3] + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + with pytest.raises(ValueError): + await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 3) + await hass.async_block_till_done() + assert call_set_hvac_mode + assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_hvac_mode[0].data[ATTR_HVAC_MODE] == HVAC_MODE_AUTO + assert acc.char_target_heat_cool.value == 3 + + +async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): + """Test if unsupported HVAC modes are deactivated in HomeKit.""" + entity_id = "climate.test" + + hass.states.async_set( + entity_id, HVAC_MODE_AUTO, {ATTR_HVAC_MODES: [HVAC_MODE_AUTO, HVAC_MODE_OFF]} + ) + + await hass.async_block_till_done() + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + await hass.async_add_job(acc.run) + await hass.async_block_till_done() + hap = acc.char_target_heat_cool.to_HAP() + assert hap["valid-values"] == [0, 3] + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + with pytest.raises(ValueError): + await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + with pytest.raises(ValueError): + await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + async def test_water_heater(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "water_heater.test" From b1326928df23be7994dcd6b174415fb15467896e Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 23:14:37 +0200 Subject: [PATCH 143/653] Remove global variable from aquostv (#33716) --- homeassistant/components/aquostv/media_player.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/aquostv/media_player.py b/homeassistant/components/aquostv/media_player.py index 5cd13aa3b0e5..3895dafe1fa9 100644 --- a/homeassistant/components/aquostv/media_player.py +++ b/homeassistant/components/aquostv/media_player.py @@ -126,10 +126,10 @@ class SharpAquosTVDevice(MediaPlayerDevice): def __init__(self, name, remote, power_on_enabled=False): """Initialize the aquos device.""" - global SUPPORT_SHARPTV # pylint: disable=global-statement + self._supported_features = SUPPORT_SHARPTV self._power_on_enabled = power_on_enabled if self._power_on_enabled: - SUPPORT_SHARPTV = SUPPORT_SHARPTV | SUPPORT_TURN_ON + self._supported_features |= SUPPORT_TURN_ON # Save a reference to the imported class self._name = name # Assume that the TV is not muted @@ -199,7 +199,7 @@ class SharpAquosTVDevice(MediaPlayerDevice): @property def supported_features(self): """Flag media player features that are supported.""" - return SUPPORT_SHARPTV + return self._supported_features @_retry def turn_off(self): From 983ed8b8b4ff9efd11e417bcc57a525544add351 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 23:16:30 +0200 Subject: [PATCH 144/653] Remove global variable from bloomsky (#33720) --- homeassistant/components/bloomsky/__init__.py | 7 ++++--- homeassistant/components/bloomsky/binary_sensor.py | 7 ++++--- homeassistant/components/bloomsky/camera.py | 8 +++++--- homeassistant/components/bloomsky/sensor.py | 7 ++++--- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/bloomsky/__init__.py b/homeassistant/components/bloomsky/__init__.py index 5b21a2a62f06..c9948aa2ff96 100644 --- a/homeassistant/components/bloomsky/__init__.py +++ b/homeassistant/components/bloomsky/__init__.py @@ -13,7 +13,6 @@ from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) -BLOOMSKY = None BLOOMSKY_TYPE = ["camera", "binary_sensor", "sensor"] DOMAIN = "bloomsky" @@ -31,12 +30,14 @@ def setup(hass, config): """Set up the BloomSky component.""" api_key = config[DOMAIN][CONF_API_KEY] - global BLOOMSKY # pylint: disable=global-statement + bloomsky = None try: - BLOOMSKY = BloomSky(api_key, hass.config.units.is_metric) + bloomsky = BloomSky(api_key, hass.config.units.is_metric) except RuntimeError: return False + hass.data[DOMAIN] = bloomsky + for component in BLOOMSKY_TYPE: discovery.load_platform(hass, component, DOMAIN, {}, config) diff --git a/homeassistant/components/bloomsky/binary_sensor.py b/homeassistant/components/bloomsky/binary_sensor.py index 516fa42cb5c8..0a410401b54d 100644 --- a/homeassistant/components/bloomsky/binary_sensor.py +++ b/homeassistant/components/bloomsky/binary_sensor.py @@ -7,7 +7,7 @@ from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensor from homeassistant.const import CONF_MONITORED_CONDITIONS import homeassistant.helpers.config_validation as cv -from . import BLOOMSKY +from . import DOMAIN _LOGGER = logging.getLogger(__name__) @@ -26,10 +26,11 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available BloomSky weather binary sensors.""" # Default needed in case of discovery sensors = config.get(CONF_MONITORED_CONDITIONS, SENSOR_TYPES) + bloomsky = hass.data[DOMAIN] - for device in BLOOMSKY.devices.values(): + for device in bloomsky.devices.values(): for variable in sensors: - add_entities([BloomSkySensor(BLOOMSKY, device, variable)], True) + add_entities([BloomSkySensor(bloomsky, device, variable)], True) class BloomSkySensor(BinarySensorDevice): diff --git a/homeassistant/components/bloomsky/camera.py b/homeassistant/components/bloomsky/camera.py index d62dede5abda..43bae9dc3bf5 100644 --- a/homeassistant/components/bloomsky/camera.py +++ b/homeassistant/components/bloomsky/camera.py @@ -5,13 +5,15 @@ import requests from homeassistant.components.camera import Camera -from . import BLOOMSKY +from . import DOMAIN def setup_platform(hass, config, add_entities, discovery_info=None): """Set up access to BloomSky cameras.""" - for device in BLOOMSKY.devices.values(): - add_entities([BloomSkyCamera(BLOOMSKY, device)]) + bloomsky = hass.data[DOMAIN] + + for device in bloomsky.devices.values(): + add_entities([BloomSkyCamera(bloomsky, device)]) class BloomSkyCamera(Camera): diff --git a/homeassistant/components/bloomsky/sensor.py b/homeassistant/components/bloomsky/sensor.py index b07bca948bdf..812bbc91947b 100644 --- a/homeassistant/components/bloomsky/sensor.py +++ b/homeassistant/components/bloomsky/sensor.py @@ -13,7 +13,7 @@ from homeassistant.const import ( import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity -from . import BLOOMSKY +from . import DOMAIN LOGGER = logging.getLogger(__name__) @@ -61,10 +61,11 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available BloomSky weather sensors.""" # Default needed in case of discovery sensors = config.get(CONF_MONITORED_CONDITIONS, SENSOR_TYPES) + bloomsky = hass.data[DOMAIN] - for device in BLOOMSKY.devices.values(): + for device in bloomsky.devices.values(): for variable in sensors: - add_entities([BloomSkySensor(BLOOMSKY, device, variable)], True) + add_entities([BloomSkySensor(bloomsky, device, variable)], True) class BloomSkySensor(Entity): From 40ce8f8c9cbc23fe41fdb34e9ab3a61d9afe1b0a Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 23:27:58 +0200 Subject: [PATCH 145/653] Remove global variable from arduino (#33718) * Remove global variable from arduino * Run isort --- homeassistant/components/arduino/__init__.py | 11 +++++----- homeassistant/components/arduino/sensor.py | 16 +++++++++------ homeassistant/components/arduino/switch.py | 21 +++++++++++--------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/arduino/__init__.py b/homeassistant/components/arduino/__init__.py index 76b8c663c94f..c890e8a8b1e4 100644 --- a/homeassistant/components/arduino/__init__.py +++ b/homeassistant/components/arduino/__init__.py @@ -14,8 +14,6 @@ import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) -BOARD = None - DOMAIN = "arduino" CONFIG_SCHEMA = vol.Schema( @@ -28,15 +26,15 @@ def setup(hass, config): port = config[DOMAIN][CONF_PORT] - global BOARD # pylint: disable=global-statement + board = None try: - BOARD = ArduinoBoard(port) + board = ArduinoBoard(port) except (serial.serialutil.SerialException, FileNotFoundError): _LOGGER.error("Your port %s is not accessible", port) return False try: - if BOARD.get_firmata()[1] <= 2: + if board.get_firmata()[1] <= 2: _LOGGER.error("The StandardFirmata sketch should be 2.2 or newer") return False except IndexError: @@ -47,13 +45,14 @@ def setup(hass, config): def stop_arduino(event): """Stop the Arduino service.""" - BOARD.disconnect() + board.disconnect() def start_arduino(event): """Start the Arduino service.""" hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_arduino) hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_arduino) + hass.data[DOMAIN] = board return True diff --git a/homeassistant/components/arduino/sensor.py b/homeassistant/components/arduino/sensor.py index c5863475512a..935aa01a9a70 100644 --- a/homeassistant/components/arduino/sensor.py +++ b/homeassistant/components/arduino/sensor.py @@ -3,12 +3,13 @@ import logging import voluptuous as vol -from homeassistant.components import arduino from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import CONF_NAME import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity +from . import DOMAIN + _LOGGER = logging.getLogger(__name__) CONF_PINS = "pins" @@ -23,7 +24,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" - if arduino.BOARD is None: + board = hass.data[DOMAIN] + + if board is None: _LOGGER.error("A connection has not been made to the Arduino board") return False @@ -31,14 +34,14 @@ def setup_platform(hass, config, add_entities, discovery_info=None): sensors = [] for pinnum, pin in pins.items(): - sensors.append(ArduinoSensor(pin.get(CONF_NAME), pinnum, CONF_TYPE)) + sensors.append(ArduinoSensor(pin.get(CONF_NAME), pinnum, CONF_TYPE, board)) add_entities(sensors) class ArduinoSensor(Entity): """Representation of an Arduino Sensor.""" - def __init__(self, name, pin, pin_type): + def __init__(self, name, pin, pin_type, board): """Initialize the sensor.""" self._pin = pin self._name = name @@ -46,7 +49,8 @@ class ArduinoSensor(Entity): self.direction = "in" self._value = None - arduino.BOARD.set_mode(self._pin, self.direction, self.pin_type) + board.set_mode(self._pin, self.direction, self.pin_type) + self._board = board @property def state(self): @@ -60,4 +64,4 @@ class ArduinoSensor(Entity): def update(self): """Get the latest value from the pin.""" - self._value = arduino.BOARD.get_analog_inputs()[self._pin][1] + self._value = self._board.get_analog_inputs()[self._pin][1] diff --git a/homeassistant/components/arduino/switch.py b/homeassistant/components/arduino/switch.py index 5b5b161a24a5..9ea7a8b7a43e 100644 --- a/homeassistant/components/arduino/switch.py +++ b/homeassistant/components/arduino/switch.py @@ -3,11 +3,12 @@ import logging import voluptuous as vol -from homeassistant.components import arduino from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice from homeassistant.const import CONF_NAME import homeassistant.helpers.config_validation as cv +from . import DOMAIN + _LOGGER = logging.getLogger(__name__) CONF_PINS = "pins" @@ -30,8 +31,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" + board = hass.data[DOMAIN] + # Verify that Arduino board is present - if arduino.BOARD is None: + if board is None: _LOGGER.error("A connection has not been made to the Arduino board") return False @@ -39,14 +42,14 @@ def setup_platform(hass, config, add_entities, discovery_info=None): switches = [] for pinnum, pin in pins.items(): - switches.append(ArduinoSwitch(pinnum, pin)) + switches.append(ArduinoSwitch(pinnum, pin, board)) add_entities(switches) class ArduinoSwitch(SwitchDevice): """Representation of an Arduino switch.""" - def __init__(self, pin, options): + def __init__(self, pin, options, board): """Initialize the Pin.""" self._pin = pin self._name = options.get(CONF_NAME) @@ -56,13 +59,13 @@ class ArduinoSwitch(SwitchDevice): self._state = options.get(CONF_INITIAL) if options.get(CONF_NEGATE): - self.turn_on_handler = arduino.BOARD.set_digital_out_low - self.turn_off_handler = arduino.BOARD.set_digital_out_high + self.turn_on_handler = board.set_digital_out_low + self.turn_off_handler = board.set_digital_out_high else: - self.turn_on_handler = arduino.BOARD.set_digital_out_high - self.turn_off_handler = arduino.BOARD.set_digital_out_low + self.turn_on_handler = board.set_digital_out_high + self.turn_off_handler = board.set_digital_out_low - arduino.BOARD.set_mode(self._pin, self.direction, self.pin_type) + board.set_mode(self._pin, self.direction, self.pin_type) (self.turn_on_handler if self._state else self.turn_off_handler)(pin) @property From 00e67fb2c77dfd08356d14f4069acfe0637f045c Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 23:47:11 +0200 Subject: [PATCH 146/653] Remove global variable from scsgate (#33719) * Remove global variable from scsgate * Import CONF_SCS_ID in light.py * Run isort * Remove constant ATTR_STATE --- homeassistant/components/scsgate/__init__.py | 13 +++--- homeassistant/components/scsgate/cover.py | 25 ++++++----- homeassistant/components/scsgate/light.py | 25 ++++++----- homeassistant/components/scsgate/switch.py | 44 +++++++++++--------- 4 files changed, 58 insertions(+), 49 deletions(-) diff --git a/homeassistant/components/scsgate/__init__.py b/homeassistant/components/scsgate/__init__.py index b32b91e56257..71a439fe6f94 100644 --- a/homeassistant/components/scsgate/__init__.py +++ b/homeassistant/components/scsgate/__init__.py @@ -14,14 +14,10 @@ import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) -ATTR_STATE = "state" - CONF_SCS_ID = "scs_id" DOMAIN = "scsgate" -SCSGATE = None - CONFIG_SCHEMA = vol.Schema( {DOMAIN: vol.Schema({vol.Required(CONF_DEVICE): cv.string})}, extra=vol.ALLOW_EXTRA ) @@ -34,11 +30,11 @@ SCSGATE_SCHEMA = vol.Schema( def setup(hass, config): """Set up the SCSGate component.""" device = config[DOMAIN][CONF_DEVICE] - global SCSGATE # pylint: disable=global-statement + scsgate = None try: - SCSGATE = SCSGate(device=device, logger=_LOGGER) - SCSGATE.start() + scsgate = SCSGate(device=device, logger=_LOGGER) + scsgate.start() except Exception as exception: # pylint: disable=broad-except _LOGGER.error("Cannot setup SCSGate component: %s", exception) return False @@ -46,9 +42,10 @@ def setup(hass, config): def stop_monitor(event): """Stop the SCSGate.""" _LOGGER.info("Stopping SCSGate monitor thread") - SCSGATE.stop() + scsgate.stop() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_monitor) + hass.data[DOMAIN] = scsgate return True diff --git a/homeassistant/components/scsgate/cover.py b/homeassistant/components/scsgate/cover.py index 9d034c146ee2..f9ef2e127304 100644 --- a/homeassistant/components/scsgate/cover.py +++ b/homeassistant/components/scsgate/cover.py @@ -8,15 +8,16 @@ from scsgate.tasks import ( ) import voluptuous as vol -from homeassistant.components import scsgate from homeassistant.components.cover import PLATFORM_SCHEMA, CoverDevice from homeassistant.const import CONF_DEVICES, CONF_NAME import homeassistant.helpers.config_validation as cv +from . import CONF_SCS_ID, DOMAIN, SCSGATE_SCHEMA + _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(scsgate.SCSGATE_SCHEMA)} + {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(SCSGATE_SCHEMA)} ) @@ -25,19 +26,22 @@ def setup_platform(hass, config, add_entities, discovery_info=None): devices = config.get(CONF_DEVICES) covers = [] logger = logging.getLogger(__name__) + scsgate = hass.data[DOMAIN] if devices: for _, entity_info in devices.items(): - if entity_info[scsgate.CONF_SCS_ID] in scsgate.SCSGATE.devices: + if entity_info[CONF_SCS_ID] in scsgate.devices: continue name = entity_info[CONF_NAME] - scs_id = entity_info[scsgate.CONF_SCS_ID] + scs_id = entity_info[CONF_SCS_ID] logger.info("Adding %s scsgate.cover", name) - cover = SCSGateCover(name=name, scs_id=scs_id, logger=logger) - scsgate.SCSGATE.add_device(cover) + cover = SCSGateCover( + name=name, scs_id=scs_id, logger=logger, scsgate=scsgate + ) + scsgate.add_device(cover) covers.append(cover) add_entities(covers) @@ -46,11 +50,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class SCSGateCover(CoverDevice): """Representation of SCSGate cover.""" - def __init__(self, scs_id, name, logger): + def __init__(self, scs_id, name, logger, scsgate): """Initialize the cover.""" self._scs_id = scs_id self._name = name self._logger = logger + self._scsgate = scsgate @property def scs_id(self): @@ -74,15 +79,15 @@ class SCSGateCover(CoverDevice): def open_cover(self, **kwargs): """Move the cover.""" - scsgate.SCSGATE.append_task(RaiseRollerShutterTask(target=self._scs_id)) + self._scsgate.append_task(RaiseRollerShutterTask(target=self._scs_id)) def close_cover(self, **kwargs): """Move the cover down.""" - scsgate.SCSGATE.append_task(LowerRollerShutterTask(target=self._scs_id)) + self._scsgate.append_task(LowerRollerShutterTask(target=self._scs_id)) def stop_cover(self, **kwargs): """Stop the cover.""" - scsgate.SCSGATE.append_task(HaltRollerShutterTask(target=self._scs_id)) + self._scsgate.append_task(HaltRollerShutterTask(target=self._scs_id)) def process_event(self, message): """Handle a SCSGate message related with this cover.""" diff --git a/homeassistant/components/scsgate/light.py b/homeassistant/components/scsgate/light.py index a04dfdc7e7ae..8caa824d5fbb 100644 --- a/homeassistant/components/scsgate/light.py +++ b/homeassistant/components/scsgate/light.py @@ -4,15 +4,16 @@ import logging from scsgate.tasks import ToggleStatusTask import voluptuous as vol -from homeassistant.components import scsgate from homeassistant.components.light import PLATFORM_SCHEMA, Light from homeassistant.const import ATTR_ENTITY_ID, ATTR_STATE, CONF_DEVICES, CONF_NAME import homeassistant.helpers.config_validation as cv +from . import CONF_SCS_ID, DOMAIN, SCSGATE_SCHEMA + _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(scsgate.SCSGATE_SCHEMA)} + {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(SCSGATE_SCHEMA)} ) @@ -21,33 +22,37 @@ def setup_platform(hass, config, add_entities, discovery_info=None): devices = config.get(CONF_DEVICES) lights = [] logger = logging.getLogger(__name__) + scsgate = hass.data[DOMAIN] if devices: for _, entity_info in devices.items(): - if entity_info[scsgate.CONF_SCS_ID] in scsgate.SCSGATE.devices: + if entity_info[CONF_SCS_ID] in scsgate.devices: continue name = entity_info[CONF_NAME] - scs_id = entity_info[scsgate.CONF_SCS_ID] + scs_id = entity_info[CONF_SCS_ID] logger.info("Adding %s scsgate.light", name) - light = SCSGateLight(name=name, scs_id=scs_id, logger=logger) + light = SCSGateLight( + name=name, scs_id=scs_id, logger=logger, scsgate=scsgate + ) lights.append(light) add_entities(lights) - scsgate.SCSGATE.add_devices_to_register(lights) + scsgate.add_devices_to_register(lights) class SCSGateLight(Light): """Representation of a SCSGate light.""" - def __init__(self, scs_id, name, logger): + def __init__(self, scs_id, name, logger, scsgate): """Initialize the light.""" self._name = name self._scs_id = scs_id self._toggled = False self._logger = logger + self._scsgate = scsgate @property def scs_id(self): @@ -72,7 +77,7 @@ class SCSGateLight(Light): def turn_on(self, **kwargs): """Turn the device on.""" - scsgate.SCSGATE.append_task(ToggleStatusTask(target=self._scs_id, toggled=True)) + self._scsgate.append_task(ToggleStatusTask(target=self._scs_id, toggled=True)) self._toggled = True self.schedule_update_ha_state() @@ -80,9 +85,7 @@ class SCSGateLight(Light): def turn_off(self, **kwargs): """Turn the device off.""" - scsgate.SCSGATE.append_task( - ToggleStatusTask(target=self._scs_id, toggled=False) - ) + self._scsgate.append_task(ToggleStatusTask(target=self._scs_id, toggled=False)) self._toggled = False self.schedule_update_ha_state() diff --git a/homeassistant/components/scsgate/switch.py b/homeassistant/components/scsgate/switch.py index b2043d3a4c39..d5c85a5a84f3 100644 --- a/homeassistant/components/scsgate/switch.py +++ b/homeassistant/components/scsgate/switch.py @@ -5,85 +5,91 @@ from scsgate.messages import ScenarioTriggeredMessage, StateMessage from scsgate.tasks import ToggleStatusTask import voluptuous as vol -from homeassistant.components import scsgate from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice from homeassistant.const import ATTR_ENTITY_ID, ATTR_STATE, CONF_DEVICES, CONF_NAME import homeassistant.helpers.config_validation as cv +from . import CONF_SCS_ID, DOMAIN, SCSGATE_SCHEMA + ATTR_SCENARIO_ID = "scenario_id" CONF_TRADITIONAL = "traditional" CONF_SCENARIO = "scenario" -CONF_SCS_ID = "scs_id" - PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(scsgate.SCSGATE_SCHEMA)} + {vol.Required(CONF_DEVICES): cv.schema_with_slug_keys(SCSGATE_SCHEMA)} ) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the SCSGate switches.""" logger = logging.getLogger(__name__) + scsgate = hass.data[DOMAIN] _setup_traditional_switches( - logger=logger, config=config, add_entities_callback=add_entities + logger=logger, + config=config, + scsgate=scsgate, + add_entities_callback=add_entities, ) - _setup_scenario_switches(logger=logger, config=config, hass=hass) + _setup_scenario_switches(logger=logger, config=config, scsgate=scsgate, hass=hass) -def _setup_traditional_switches(logger, config, add_entities_callback): +def _setup_traditional_switches(logger, config, scsgate, add_entities_callback): """Add traditional SCSGate switches.""" traditional = config.get(CONF_TRADITIONAL) switches = [] if traditional: for _, entity_info in traditional.items(): - if entity_info[scsgate.CONF_SCS_ID] in scsgate.SCSGATE.devices: + if entity_info[CONF_SCS_ID] in scsgate.devices: continue name = entity_info[CONF_NAME] - scs_id = entity_info[scsgate.CONF_SCS_ID] + scs_id = entity_info[CONF_SCS_ID] logger.info("Adding %s scsgate.traditional_switch", name) - switch = SCSGateSwitch(name=name, scs_id=scs_id, logger=logger) + switch = SCSGateSwitch( + name=name, scs_id=scs_id, logger=logger, scsgate=scsgate + ) switches.append(switch) add_entities_callback(switches) - scsgate.SCSGATE.add_devices_to_register(switches) + scsgate.add_devices_to_register(switches) -def _setup_scenario_switches(logger, config, hass): +def _setup_scenario_switches(logger, config, scsgate, hass): """Add only SCSGate scenario switches.""" scenario = config.get(CONF_SCENARIO) if scenario: for _, entity_info in scenario.items(): - if entity_info[scsgate.CONF_SCS_ID] in scsgate.SCSGATE.devices: + if entity_info[CONF_SCS_ID] in scsgate.devices: continue name = entity_info[CONF_NAME] - scs_id = entity_info[scsgate.CONF_SCS_ID] + scs_id = entity_info[CONF_SCS_ID] logger.info("Adding %s scsgate.scenario_switch", name) switch = SCSGateScenarioSwitch( name=name, scs_id=scs_id, logger=logger, hass=hass ) - scsgate.SCSGATE.add_device(switch) + scsgate.add_device(switch) class SCSGateSwitch(SwitchDevice): """Representation of a SCSGate switch.""" - def __init__(self, scs_id, name, logger): + def __init__(self, scs_id, name, logger, scsgate): """Initialize the switch.""" self._name = name self._scs_id = scs_id self._toggled = False self._logger = logger + self._scsgate = scsgate @property def scs_id(self): @@ -108,7 +114,7 @@ class SCSGateSwitch(SwitchDevice): def turn_on(self, **kwargs): """Turn the device on.""" - scsgate.SCSGATE.append_task(ToggleStatusTask(target=self._scs_id, toggled=True)) + self._scsgate.append_task(ToggleStatusTask(target=self._scs_id, toggled=True)) self._toggled = True self.schedule_update_ha_state() @@ -116,9 +122,7 @@ class SCSGateSwitch(SwitchDevice): def turn_off(self, **kwargs): """Turn the device off.""" - scsgate.SCSGATE.append_task( - ToggleStatusTask(target=self._scs_id, toggled=False) - ) + self._scsgate.append_task(ToggleStatusTask(target=self._scs_id, toggled=False)) self._toggled = False self.schedule_update_ha_state() From 60dd2213cf50bb3a58c6af8e43546f5730e77122 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 5 Apr 2020 23:54:37 +0200 Subject: [PATCH 147/653] Remove global variable from apcupsd (#33717) * Remove global variable from apcupsd * Run isort * Address review comments --- homeassistant/components/apcupsd/__init__.py | 9 +++------ homeassistant/components/apcupsd/binary_sensor.py | 11 +++++++---- homeassistant/components/apcupsd/sensor.py | 8 +++++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/apcupsd/__init__.py b/homeassistant/components/apcupsd/__init__.py index 1f99d5410ec9..967b5855a511 100644 --- a/homeassistant/components/apcupsd/__init__.py +++ b/homeassistant/components/apcupsd/__init__.py @@ -11,9 +11,6 @@ from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) -CONF_TYPE = "type" - -DATA = None DEFAULT_HOST = "localhost" DEFAULT_PORT = 3551 DOMAIN = "apcupsd" @@ -39,17 +36,17 @@ CONFIG_SCHEMA = vol.Schema( def setup(hass, config): """Use config values to set up a function enabling status retrieval.""" - global DATA # pylint: disable=global-statement conf = config[DOMAIN] host = conf.get(CONF_HOST) port = conf.get(CONF_PORT) - DATA = APCUPSdData(host, port) + apcups_data = APCUPSdData(host, port) + hass.data[DOMAIN] = apcups_data # It doesn't really matter why we're not able to get the status, just that # we can't. try: - DATA.update(no_throttle=True) + apcups_data.update(no_throttle=True) except Exception: # pylint: disable=broad-except _LOGGER.exception("Failure while testing APCUPSd status retrieval.") return False diff --git a/homeassistant/components/apcupsd/binary_sensor.py b/homeassistant/components/apcupsd/binary_sensor.py index de4e1f17200a..e07f97c928c7 100644 --- a/homeassistant/components/apcupsd/binary_sensor.py +++ b/homeassistant/components/apcupsd/binary_sensor.py @@ -1,11 +1,12 @@ """Support for tracking the online status of a UPS.""" import voluptuous as vol -from homeassistant.components import apcupsd from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorDevice from homeassistant.const import CONF_NAME import homeassistant.helpers.config_validation as cv +from . import DOMAIN, KEY_STATUS, VALUE_ONLINE + DEFAULT_NAME = "UPS Online Status" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string} @@ -14,7 +15,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up an APCUPSd Online Status binary sensor.""" - add_entities([OnlineStatus(config, apcupsd.DATA)], True) + apcups_data = hass.data[DOMAIN] + + add_entities([OnlineStatus(config, apcups_data)], True) class OnlineStatus(BinarySensorDevice): @@ -34,8 +37,8 @@ class OnlineStatus(BinarySensorDevice): @property def is_on(self): """Return true if the UPS is online, else false.""" - return self._state & apcupsd.VALUE_ONLINE > 0 + return self._state & VALUE_ONLINE > 0 def update(self): """Get the status report from APCUPSd and set this entity's state.""" - self._state = int(self._data.status[apcupsd.KEY_STATUS], 16) + self._state = int(self._data.status[KEY_STATUS], 16) diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index e39696cc37a2..85bbe5c950e7 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -4,7 +4,6 @@ import logging from apcaccess.status import ALL_UNITS import voluptuous as vol -from homeassistant.components import apcupsd from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_RESOURCES, @@ -17,6 +16,8 @@ from homeassistant.const import ( import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity +from . import DOMAIN + _LOGGER = logging.getLogger(__name__) SENSOR_PREFIX = "UPS " @@ -114,6 +115,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the APCUPSd sensors.""" + apcups_data = hass.data[DOMAIN] entities = [] for resource in config[CONF_RESOURCES]: @@ -126,13 +128,13 @@ def setup_platform(hass, config, add_entities, discovery_info=None): "mdi:information-outline", ] - if sensor_type.upper() not in apcupsd.DATA.status: + if sensor_type.upper() not in apcups_data.status: _LOGGER.warning( "Sensor type: %s does not appear in the APCUPSd status output", sensor_type, ) - entities.append(APCUPSdSensor(apcupsd.DATA, sensor_type)) + entities.append(APCUPSdSensor(apcups_data, sensor_type)) add_entities(entities, True) From 18e4493ca33c2f7cf4ad681405a241d7695ea95a Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Mon, 6 Apr 2020 01:16:16 +0300 Subject: [PATCH 148/653] Ignore tplink tests exceptions (#33710) --- tests/ignore_uncaught_exceptions.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index dc93f9a6350b..6fa1f0175677 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -45,10 +45,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.qwikswitch.test_init", "test_sensor_device"), ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), ("tests.components.samsungtv.test_media_player", "test_update_connection_failure"), - ( - "tests.components.tplink.test_init", - "test_configuring_devices_from_multiple_sources", - ), ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), ("tests.components.zwave.test_init", "test_power_schemes"), ] From 5711c0882fb40ee76c6102e53dfd081809873d3b Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Mon, 6 Apr 2020 01:17:24 +0300 Subject: [PATCH 149/653] Fix exception in zwave test (#33711) would be better to not have it in there but mock has all attributes --- tests/components/zwave/test_init.py | 5 +++-- tests/ignore_uncaught_exceptions.py | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 6d19022f9592..71f7ea17f76b 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -704,7 +704,7 @@ async def test_power_schemes(hass, mock_openzwave): genre=const.GENRE_USER, type=const.TYPE_BOOL, ) - hass.async_add_job(mock_receivers[0], node, switch) + await hass.async_add_job(mock_receivers[0], node, switch) await hass.async_block_till_done() @@ -726,8 +726,9 @@ async def test_power_schemes(hass, mock_openzwave): index=const.INDEX_SENSOR_MULTILEVEL_POWER, instance=13, command_class=const.COMMAND_CLASS_SENSOR_MULTILEVEL, + genre=const.GENRE_USER, # to avoid exception ) - hass.async_add_job(mock_receivers[0], node, power) + await hass.async_add_job(mock_receivers[0], node, power) await hass.async_block_till_done() assert ( diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 6fa1f0175677..65ace96917d0 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -46,7 +46,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), ("tests.components.samsungtv.test_media_player", "test_update_connection_failure"), ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), - ("tests.components.zwave.test_init", "test_power_schemes"), ] IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [ From a16e742107c1a7f654b36084f258396adec249b8 Mon Sep 17 00:00:00 2001 From: Quentame Date: Mon, 6 Apr 2020 00:21:22 +0200 Subject: [PATCH 150/653] Fix iCloud tests doing I/O (#33721) --- tests/components/icloud/conftest.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/components/icloud/conftest.py diff --git a/tests/components/icloud/conftest.py b/tests/components/icloud/conftest.py new file mode 100644 index 000000000000..2230cc2ea326 --- /dev/null +++ b/tests/components/icloud/conftest.py @@ -0,0 +1,11 @@ +"""Configure iCloud tests.""" +from unittest.mock import patch + +import pytest + + +@pytest.fixture(name="icloud_bypass_setup", autouse=True) +def icloud_bypass_setup_fixture(): + """Mock component setup.""" + with patch("homeassistant.components.icloud.async_setup_entry", return_value=True): + yield From d28b477f9a6e0a122cc9ace01ab71351f518d4fe Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 17:23:20 -0500 Subject: [PATCH 151/653] Fix nuheat response error checking (#33712) This integration was checking request instead of response for the error code. --- homeassistant/components/nuheat/__init__.py | 2 +- .../components/nuheat/config_flow.py | 2 +- tests/components/nuheat/test_config_flow.py | 25 +++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/nuheat/__init__.py b/homeassistant/components/nuheat/__init__.py index ff90bb265303..ca47f831370e 100644 --- a/homeassistant/components/nuheat/__init__.py +++ b/homeassistant/components/nuheat/__init__.py @@ -78,7 +78,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): except requests.exceptions.Timeout: raise ConfigEntryNotReady except requests.exceptions.HTTPError as ex: - if ex.request.status_code > 400 and ex.request.status_code < 500: + if ex.response.status_code > 400 and ex.response.status_code < 500: _LOGGER.error("Failed to login to nuheat: %s", ex) return False raise ConfigEntryNotReady diff --git a/homeassistant/components/nuheat/config_flow.py b/homeassistant/components/nuheat/config_flow.py index 082cb899ec54..4f12f590057e 100644 --- a/homeassistant/components/nuheat/config_flow.py +++ b/homeassistant/components/nuheat/config_flow.py @@ -34,7 +34,7 @@ async def validate_input(hass: core.HomeAssistant, data): except requests.exceptions.Timeout: raise CannotConnect except requests.exceptions.HTTPError as ex: - if ex.request.status_code > 400 and ex.request.status_code < 500: + if ex.response.status_code > 400 and ex.response.status_code < 500: raise InvalidAuth raise CannotConnect # diff --git a/tests/components/nuheat/test_config_flow.py b/tests/components/nuheat/test_config_flow.py index 95987404e449..d6e10e1dc7c4 100644 --- a/tests/components/nuheat/test_config_flow.py +++ b/tests/components/nuheat/test_config_flow.py @@ -1,5 +1,5 @@ """Test the NuHeat config flow.""" -from asynctest import patch +from asynctest import MagicMock, patch import requests from homeassistant import config_entries, setup @@ -100,6 +100,24 @@ async def test_form_invalid_auth(hass): with patch( "homeassistant.components.nuheat.config_flow.nuheat.NuHeat.authenticate", side_effect=Exception, + ): + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_SERIAL_NUMBER: "12345", + CONF_USERNAME: "test-username", + CONF_PASSWORD: "test-password", + }, + ) + + assert result["type"] == "form" + assert result["errors"] == {"base": "invalid_auth"} + + response_mock = MagicMock() + type(response_mock).status_code = 401 + with patch( + "homeassistant.components.nuheat.config_flow.nuheat.NuHeat.authenticate", + side_effect=requests.HTTPError(response=response_mock), ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -120,12 +138,15 @@ async def test_form_invalid_thermostat(hass): DOMAIN, context={"source": config_entries.SOURCE_USER} ) + response_mock = MagicMock() + type(response_mock).status_code = 500 + with patch( "homeassistant.components.nuheat.config_flow.nuheat.NuHeat.authenticate", return_value=True, ), patch( "homeassistant.components.nuheat.config_flow.nuheat.NuHeat.get_thermostat", - side_effect=requests.exceptions.HTTPError, + side_effect=requests.HTTPError(response=response_mock), ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], From 15f41c84f9c166e9be1d1fab5cb45cc5d093fe53 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 17:25:31 -0500 Subject: [PATCH 152/653] Fix rachio import of run time from yaml (#33723) Importing from yaml would fail for rachio when copying the manual run time to the option flow. --- homeassistant/components/rachio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/rachio/__init__.py b/homeassistant/components/rachio/__init__.py index 9bd3b16d12ca..8879bd6965ce 100644 --- a/homeassistant/components/rachio/__init__.py +++ b/homeassistant/components/rachio/__init__.py @@ -86,7 +86,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): if not options.get(CONF_MANUAL_RUN_MINS) and config.get(CONF_MANUAL_RUN_MINS): options_copy = options.copy() options_copy[CONF_MANUAL_RUN_MINS] = config[CONF_MANUAL_RUN_MINS] - hass.config_entries.async_update_entry(options=options_copy) + hass.config_entries.async_update_entry(entry, options=options_copy) # Configure API api_key = config[CONF_API_KEY] From 67c3a4c9701e47ccb0accfd427769ad2116f7aba Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Mon, 6 Apr 2020 00:34:24 +0200 Subject: [PATCH 153/653] Improve string formatting v7 (#33705) --- tests/components/homekit/test_homekit.py | 26 ++-- tests/components/rflink/test_cover.py | 152 ++++++++++---------- tests/components/rflink/test_init.py | 4 +- tests/components/rflink/test_light.py | 96 ++++++------- tests/components/rflink/test_switch.py | 36 ++--- tests/components/smartthings/test_sensor.py | 10 +- tests/components/withings/test_init.py | 4 +- 7 files changed, 164 insertions(+), 164 deletions(-) diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index de6aaf0f11eb..7367f4ae563f 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -56,14 +56,14 @@ def test_generate_aid(): assert isinstance(aid, int) assert aid >= 2 and aid <= 18446744073709551615 - with patch(PATH_HOMEKIT + ".adler32") as mock_adler32: + with patch(f"{PATH_HOMEKIT}.adler32") as mock_adler32: mock_adler32.side_effect = [0, 1] assert generate_aid("demo.entity") is None async def test_setup_min(hass): """Test async_setup with min config options.""" - with patch(PATH_HOMEKIT + ".HomeKit") as mock_homekit: + with patch(f"{PATH_HOMEKIT}.HomeKit") as mock_homekit: assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}}) mock_homekit.assert_any_call( @@ -91,7 +91,7 @@ async def test_setup_auto_start_disabled(hass): } } - with patch(PATH_HOMEKIT + ".HomeKit") as mock_homekit: + with patch(f"{PATH_HOMEKIT}.HomeKit") as mock_homekit: mock_homekit.return_value = homekit = Mock() assert await setup.async_setup_component(hass, DOMAIN, config) @@ -126,7 +126,7 @@ async def test_homekit_setup(hass, hk_driver): homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, DEFAULT_SAFE_MODE) with patch( - PATH_HOMEKIT + ".accessories.HomeDriver", return_value=hk_driver + f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver, patch("homeassistant.util.get_local_ip") as mock_ip: mock_ip.return_value = IP_ADDRESS await hass.async_add_job(homekit.setup) @@ -151,7 +151,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver): homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, "172.0.0.0", {}, {}, None) with patch( - PATH_HOMEKIT + ".accessories.HomeDriver", return_value=hk_driver + f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: await hass.async_add_job(homekit.setup) mock_driver.assert_called_with( @@ -170,7 +170,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver): ) with patch( - PATH_HOMEKIT + ".accessories.HomeDriver", return_value=hk_driver + f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: await hass.async_add_job(homekit.setup) mock_driver.assert_called_with( @@ -186,7 +186,7 @@ async def test_homekit_setup_safe_mode(hass, hk_driver): """Test if safe_mode flag is set.""" homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True) - with patch(PATH_HOMEKIT + ".accessories.HomeDriver", return_value=hk_driver): + with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver): await hass.async_add_job(homekit.setup) assert homekit.driver.safe_mode is True @@ -197,7 +197,7 @@ async def test_homekit_add_accessory(): homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() - with patch(PATH_HOMEKIT + ".get_accessory") as mock_get_acc: + with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.side_effect = [None, "acc", None] homekit.add_bridge_accessory(State("light.demo", "on")) @@ -230,7 +230,7 @@ async def test_homekit_entity_filter(hass): entity_filter = generate_filter(["cover"], ["demo.test"], [], []) homekit = HomeKit(hass, None, None, None, entity_filter, {}, None) - with patch(PATH_HOMEKIT + ".get_accessory") as mock_get_acc: + with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.return_value = None homekit.add_bridge_accessory(State("cover.test", "open")) @@ -256,8 +256,8 @@ async def test_homekit_start(hass, hk_driver, debounce_patcher): hass.states.async_set("light.demo", "on") state = hass.states.async_all()[0] - with patch(PATH_HOMEKIT + ".HomeKit.add_bridge_accessory") as mock_add_acc, patch( - PATH_HOMEKIT + ".show_setup_message" + with patch(f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory") as mock_add_acc, patch( + f"{PATH_HOMEKIT}.show_setup_message" ) as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ) as hk_driver_add_acc, patch( @@ -302,8 +302,8 @@ async def test_homekit_reset_accessories(hass): homekit = HomeKit(hass, None, None, None, {}, {entity_id: {}}, None) homekit.bridge = Mock() - with patch(PATH_HOMEKIT + ".HomeKit", return_value=homekit), patch( - PATH_HOMEKIT + ".HomeKit.setup" + with patch(f"{PATH_HOMEKIT}.HomeKit", return_value=homekit), patch( + f"{PATH_HOMEKIT}.HomeKit.setup" ), patch("pyhap.accessory.Bridge.add_accessory") as mock_add_accessory, patch( "pyhap.accessory_driver.AccessoryDriver.config_changed" ) as hk_driver_config_changed: diff --git a/tests/components/rflink/test_cover.py b/tests/components/rflink/test_cover.py index e10cdc201430..392008e838da 100644 --- a/tests/components/rflink/test_cover.py +++ b/tests/components/rflink/test_cover.py @@ -51,7 +51,7 @@ async def test_default_setup(hass, monkeypatch): assert create.call_args_list[0][1]["ignore"] # test default state of cover loaded from config - cover_initial = hass.states.get(DOMAIN + ".test") + cover_initial = hass.states.get(f"{DOMAIN}.test") assert cover_initial.state == STATE_CLOSED assert cover_initial.attributes["assumed_state"] @@ -62,7 +62,7 @@ async def test_default_setup(hass, monkeypatch): event_callback({"id": "protocol_0_0", "command": "up"}) await hass.async_block_till_done() - cover_after_first_command = hass.states.get(DOMAIN + ".test") + cover_after_first_command = hass.states.get(f"{DOMAIN}.test") assert cover_after_first_command.state == STATE_OPEN # not sure why, but cover have always assumed_state=true assert cover_after_first_command.attributes.get("assumed_state") @@ -71,46 +71,46 @@ async def test_default_setup(hass, monkeypatch): event_callback({"id": "protocol_0_0", "command": "down"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # should respond to group command event_callback({"id": "protocol_0_0", "command": "allon"}) await hass.async_block_till_done() - cover_after_first_command = hass.states.get(DOMAIN + ".test") + cover_after_first_command = hass.states.get(f"{DOMAIN}.test") assert cover_after_first_command.state == STATE_OPEN # should respond to group command event_callback({"id": "protocol_0_0", "command": "alloff"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test following aliases # mock incoming command event for this device alias event_callback({"id": "test_alias_0_0", "command": "up"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN # test changing state from HA propagates to RFLink hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[0][0][0] == "protocol_0_0" assert protocol.send_command_ack.call_args_list[0][0][1] == "DOWN" hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[1][0][1] == "UP" @@ -146,7 +146,7 @@ async def test_firing_bus_event(hass, monkeypatch): await hass.async_block_till_done() await hass.async_block_till_done() - assert calls[0].data == {"state": "down", "entity_id": DOMAIN + ".test"} + assert calls[0].data == {"state": "down", "entity_id": f"{DOMAIN}.test"} async def test_signal_repetitions(hass, monkeypatch): @@ -169,7 +169,7 @@ async def test_signal_repetitions(hass, monkeypatch): # test if signal repetition is performed according to configuration hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) @@ -181,7 +181,7 @@ async def test_signal_repetitions(hass, monkeypatch): # test if default apply to configured devices hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test1"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test1"} ) ) @@ -209,12 +209,12 @@ async def test_signal_repetitions_alternation(hass, monkeypatch): hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test1"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test1"} ) ) @@ -241,13 +241,13 @@ async def test_signal_repetitions_cancelling(hass, monkeypatch): hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) @@ -274,19 +274,19 @@ async def test_group_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "allon"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "down"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN async def test_nogroup_alias(hass, monkeypatch): @@ -307,19 +307,19 @@ async def test_nogroup_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "up"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN async def test_nogroup_device_id(hass, monkeypatch): @@ -335,19 +335,19 @@ async def test_nogroup_device_id(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.test").state == STATE_CLOSED # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "up"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.test").state == STATE_OPEN async def test_restore_state(hass, monkeypatch): @@ -366,7 +366,7 @@ async def test_restore_state(hass, monkeypatch): } mock_restore_cache( - hass, (State(DOMAIN + ".c1", STATE_OPEN), State(DOMAIN + ".c2", STATE_CLOSED)) + hass, (State(f"{DOMAIN}.c1", STATE_OPEN), State(f"{DOMAIN}.c2", STATE_CLOSED)) ) hass.state = CoreState.starting @@ -374,20 +374,20 @@ async def test_restore_state(hass, monkeypatch): # setup mocking rflink module _, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - state = hass.states.get(DOMAIN + ".c1") + state = hass.states.get(f"{DOMAIN}.c1") assert state assert state.state == STATE_OPEN - state = hass.states.get(DOMAIN + ".c2") + state = hass.states.get(f"{DOMAIN}.c2") assert state assert state.state == STATE_CLOSED - state = hass.states.get(DOMAIN + ".c3") + state = hass.states.get(f"{DOMAIN}.c3") assert state assert state.state == STATE_CLOSED # not cached cover must default values - state = hass.states.get(DOMAIN + ".c4") + state = hass.states.get(f"{DOMAIN}.c4") assert state assert state.state == STATE_CLOSED assert state.attributes["assumed_state"] @@ -431,7 +431,7 @@ async def test_inverted_cover(hass, monkeypatch): ) # test default state of cover loaded from config - standard_cover = hass.states.get(DOMAIN + ".nonkaku_type_standard") + standard_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_standard") assert standard_cover.state == STATE_CLOSED assert standard_cover.attributes["assumed_state"] @@ -439,7 +439,7 @@ async def test_inverted_cover(hass, monkeypatch): event_callback({"id": "nonkaku_device_1", "command": "up"}) await hass.async_block_till_done() - standard_cover = hass.states.get(DOMAIN + ".nonkaku_type_standard") + standard_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_standard") assert standard_cover.state == STATE_OPEN assert standard_cover.attributes.get("assumed_state") @@ -447,7 +447,7 @@ async def test_inverted_cover(hass, monkeypatch): event_callback({"id": "nonkaku_device_2", "command": "up"}) await hass.async_block_till_done() - standard_cover = hass.states.get(DOMAIN + ".nonkaku_type_none") + standard_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_none") assert standard_cover.state == STATE_OPEN assert standard_cover.attributes.get("assumed_state") @@ -456,7 +456,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".nonkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_inverted") assert inverted_cover.state == STATE_OPEN assert inverted_cover.attributes.get("assumed_state") @@ -465,7 +465,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_standard") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_standard") assert inverted_cover.state == STATE_OPEN assert inverted_cover.attributes.get("assumed_state") @@ -474,7 +474,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_none") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_none") assert inverted_cover.state == STATE_OPEN assert inverted_cover.attributes.get("assumed_state") @@ -483,7 +483,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_inverted") assert inverted_cover.state == STATE_OPEN assert inverted_cover.attributes.get("assumed_state") @@ -492,7 +492,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - standard_cover = hass.states.get(DOMAIN + ".nonkaku_type_standard") + standard_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_standard") assert standard_cover.state == STATE_CLOSED assert standard_cover.attributes.get("assumed_state") @@ -501,7 +501,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - standard_cover = hass.states.get(DOMAIN + ".nonkaku_type_none") + standard_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_none") assert standard_cover.state == STATE_CLOSED assert standard_cover.attributes.get("assumed_state") @@ -510,7 +510,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".nonkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_inverted") assert inverted_cover.state == STATE_CLOSED assert inverted_cover.attributes.get("assumed_state") @@ -519,7 +519,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_standard") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_standard") assert inverted_cover.state == STATE_CLOSED assert inverted_cover.attributes.get("assumed_state") @@ -528,7 +528,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_none") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_none") assert inverted_cover.state == STATE_CLOSED assert inverted_cover.attributes.get("assumed_state") @@ -537,7 +537,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_inverted") assert inverted_cover.state == STATE_CLOSED assert inverted_cover.attributes.get("assumed_state") @@ -549,7 +549,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".nonkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_inverted") assert inverted_cover.state == STATE_CLOSED # should respond to group command @@ -557,7 +557,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".nonkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.nonkaku_type_inverted") assert inverted_cover.state == STATE_OPEN # should respond to group command @@ -565,7 +565,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_standard") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_standard") assert inverted_cover.state == STATE_CLOSED # should respond to group command @@ -573,7 +573,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_standard") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_standard") assert inverted_cover.state == STATE_OPEN # should respond to group command @@ -581,7 +581,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_none") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_none") assert inverted_cover.state == STATE_CLOSED # should respond to group command @@ -589,7 +589,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_none") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_none") assert inverted_cover.state == STATE_OPEN # should respond to group command @@ -597,7 +597,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_inverted") assert inverted_cover.state == STATE_CLOSED # should respond to group command @@ -605,7 +605,7 @@ async def test_inverted_cover(hass, monkeypatch): await hass.async_block_till_done() - inverted_cover = hass.states.get(DOMAIN + ".newkaku_type_inverted") + inverted_cover = hass.states.get(f"{DOMAIN}.newkaku_type_inverted") assert inverted_cover.state == STATE_OPEN # Sending the close command from HA should result @@ -615,13 +615,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_standard"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_standard"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_standard").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.nonkaku_type_standard").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[0][0][0] == "nonkaku_device_1" assert protocol.send_command_ack.call_args_list[0][0][1] == "DOWN" @@ -632,13 +632,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_OPEN_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_standard"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_standard"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_standard").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.nonkaku_type_standard").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[1][0][0] == "nonkaku_device_1" assert protocol.send_command_ack.call_args_list[1][0][1] == "UP" @@ -647,13 +647,13 @@ async def test_inverted_cover(hass, monkeypatch): # that has its type not specified. hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_none"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_none"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_none").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.nonkaku_type_none").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[2][0][0] == "nonkaku_device_2" assert protocol.send_command_ack.call_args_list[2][0][1] == "DOWN" @@ -662,13 +662,13 @@ async def test_inverted_cover(hass, monkeypatch): # that has its type not specified. hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_none"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_none"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_none").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.nonkaku_type_none").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[3][0][0] == "nonkaku_device_2" assert protocol.send_command_ack.call_args_list[3][0][1] == "UP" @@ -679,13 +679,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_inverted"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_inverted"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_inverted").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.nonkaku_type_inverted").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[4][0][0] == "nonkaku_device_3" assert protocol.send_command_ack.call_args_list[4][0][1] == "UP" @@ -696,13 +696,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_OPEN_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".nonkaku_type_inverted"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.nonkaku_type_inverted"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".nonkaku_type_inverted").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.nonkaku_type_inverted").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[5][0][0] == "nonkaku_device_3" assert protocol.send_command_ack.call_args_list[5][0][1] == "DOWN" @@ -713,13 +713,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_standard"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_standard"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_standard").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.newkaku_type_standard").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[6][0][0] == "newkaku_device_4" assert protocol.send_command_ack.call_args_list[6][0][1] == "DOWN" @@ -730,13 +730,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_OPEN_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_standard"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_standard"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_standard").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.newkaku_type_standard").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[7][0][0] == "newkaku_device_4" assert protocol.send_command_ack.call_args_list[7][0][1] == "UP" @@ -745,13 +745,13 @@ async def test_inverted_cover(hass, monkeypatch): # that has its type not specified. hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_none"} + DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_none"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_none").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.newkaku_type_none").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[8][0][0] == "newkaku_device_5" assert protocol.send_command_ack.call_args_list[8][0][1] == "UP" @@ -760,13 +760,13 @@ async def test_inverted_cover(hass, monkeypatch): # that has its type not specified. hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_none"} + DOMAIN, SERVICE_OPEN_COVER, {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_none"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_none").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.newkaku_type_none").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[9][0][0] == "newkaku_device_5" assert protocol.send_command_ack.call_args_list[9][0][1] == "DOWN" @@ -777,13 +777,13 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_inverted"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_inverted"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_inverted").state == STATE_CLOSED + assert hass.states.get(f"{DOMAIN}.newkaku_type_inverted").state == STATE_CLOSED assert protocol.send_command_ack.call_args_list[10][0][0] == "newkaku_device_6" assert protocol.send_command_ack.call_args_list[10][0][1] == "UP" @@ -794,12 +794,12 @@ async def test_inverted_cover(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_OPEN_COVER, - {ATTR_ENTITY_ID: DOMAIN + ".newkaku_type_inverted"}, + {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_type_inverted"}, ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".newkaku_type_inverted").state == STATE_OPEN + assert hass.states.get(f"{DOMAIN}.newkaku_type_inverted").state == STATE_OPEN assert protocol.send_command_ack.call_args_list[11][0][0] == "newkaku_device_6" assert protocol.send_command_ack.call_args_list[11][0][1] == "DOWN" diff --git a/tests/components/rflink/test_init.py b/tests/components/rflink/test_init.py index df96b0e87aea..135f6322e2da 100644 --- a/tests/components/rflink/test_init.py +++ b/tests/components/rflink/test_init.py @@ -315,7 +315,7 @@ async def test_race_condition(hass, monkeypatch): await hass.async_block_till_done() # test state of new sensor - new_sensor = hass.states.get(domain + ".test3") + new_sensor = hass.states.get(f"{domain}.test3") assert new_sensor assert new_sensor.state == "off" @@ -325,7 +325,7 @@ async def test_race_condition(hass, monkeypatch): assert tmp_entity not in hass.data[DATA_ENTITY_LOOKUP][EVENT_KEY_COMMAND]["test3"] # test state of new sensor - new_sensor = hass.states.get(domain + ".test3") + new_sensor = hass.states.get(f"{domain}.test3") assert new_sensor assert new_sensor.state == "on" diff --git a/tests/components/rflink/test_light.py b/tests/components/rflink/test_light.py index 87696191ac8b..f3ea5e303754 100644 --- a/tests/components/rflink/test_light.py +++ b/tests/components/rflink/test_light.py @@ -47,7 +47,7 @@ async def test_default_setup(hass, monkeypatch): assert create.call_args_list[0][1]["ignore"] # test default state of light loaded from config - light_initial = hass.states.get(DOMAIN + ".test") + light_initial = hass.states.get(f"{DOMAIN}.test") assert light_initial.state == "off" assert light_initial.attributes["assumed_state"] @@ -58,7 +58,7 @@ async def test_default_setup(hass, monkeypatch): event_callback({"id": "protocol_0_0", "command": "on"}) await hass.async_block_till_done() - light_after_first_command = hass.states.get(DOMAIN + ".test") + light_after_first_command = hass.states.get(f"{DOMAIN}.test") assert light_after_first_command.state == "on" # also after receiving first command state not longer has to be assumed assert not light_after_first_command.attributes.get("assumed_state") @@ -67,52 +67,52 @@ async def test_default_setup(hass, monkeypatch): event_callback({"id": "protocol_0_0", "command": "off"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # should respond to group command event_callback({"id": "protocol_0_0", "command": "allon"}) await hass.async_block_till_done() - light_after_first_command = hass.states.get(DOMAIN + ".test") + light_after_first_command = hass.states.get(f"{DOMAIN}.test") assert light_after_first_command.state == "on" # should respond to group command event_callback({"id": "protocol_0_0", "command": "alloff"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test following aliases # mock incoming command event for this device alias event_callback({"id": "test_alias_0_0", "command": "on"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" # test event for new unconfigured sensor event_callback({"id": "protocol2_0_1", "command": "on"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".protocol2_0_1").state == "on" + assert hass.states.get(f"{DOMAIN}.protocol2_0_1").state == "on" # test changing state from HA propagates to RFLink hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" assert protocol.send_command_ack.call_args_list[0][0][0] == "protocol_0_0" assert protocol.send_command_ack.call_args_list[0][0][1] == "off" hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" assert protocol.send_command_ack.call_args_list[1][0][1] == "on" # protocols supporting dimming and on/off should create hybrid light entity @@ -120,7 +120,7 @@ async def test_default_setup(hass, monkeypatch): await hass.async_block_till_done() hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: DOMAIN + ".newkaku_0_1"} + DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_0_1"} ) ) await hass.async_block_till_done() @@ -135,7 +135,7 @@ async def test_default_setup(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_TURN_ON, - {ATTR_ENTITY_ID: DOMAIN + ".newkaku_0_1", ATTR_BRIGHTNESS: 128}, + {ATTR_ENTITY_ID: f"{DOMAIN}.newkaku_0_1", ATTR_BRIGHTNESS: 128}, ) ) await hass.async_block_till_done() @@ -146,7 +146,7 @@ async def test_default_setup(hass, monkeypatch): hass.services.async_call( DOMAIN, SERVICE_TURN_ON, - {ATTR_ENTITY_ID: DOMAIN + ".dim_test", ATTR_BRIGHTNESS: 128}, + {ATTR_ENTITY_ID: f"{DOMAIN}.dim_test", ATTR_BRIGHTNESS: 128}, ) ) await hass.async_block_till_done() @@ -186,7 +186,7 @@ async def test_firing_bus_event(hass, monkeypatch): await hass.async_block_till_done() await hass.async_block_till_done() - assert calls[0].data == {"state": "off", "entity_id": DOMAIN + ".test"} + assert calls[0].data == {"state": "off", "entity_id": f"{DOMAIN}.test"} async def test_signal_repetitions(hass, monkeypatch): @@ -212,7 +212,7 @@ async def test_signal_repetitions(hass, monkeypatch): # test if signal repetition is performed according to configuration hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) @@ -224,7 +224,7 @@ async def test_signal_repetitions(hass, monkeypatch): # test if default apply to configured devices hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test1"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test1"} ) ) @@ -241,7 +241,7 @@ async def test_signal_repetitions(hass, monkeypatch): hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".protocol_0_2"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.protocol_0_2"} ) ) @@ -268,10 +268,10 @@ async def test_signal_repetitions_alternation(hass, monkeypatch): _, _, protocol, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) await hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) await hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test1"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test1"} ) await hass.async_block_till_done() @@ -296,11 +296,11 @@ async def test_signal_repetitions_cancelling(hass, monkeypatch): _, _, protocol, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) await hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) await hass.services.async_call( - DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: DOMAIN + ".test"}, blocking=True + DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: f"{DOMAIN}.test"}, blocking=True ) assert [call[0][1] for call in protocol.send_command_ack.call_args_list] == [ @@ -325,39 +325,39 @@ async def test_type_toggle(hass, monkeypatch): event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) # default value = 'off' - assert hass.states.get(DOMAIN + ".toggle_test").state == "off" + assert hass.states.get(f"{DOMAIN}.toggle_test").state == "off" # test sending 'on' command, must set state = 'on' event_callback({"id": "toggle_0_0", "command": "on"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".toggle_test").state == "on" + assert hass.states.get(f"{DOMAIN}.toggle_test").state == "on" # test sending 'on' command again, must set state = 'off' event_callback({"id": "toggle_0_0", "command": "on"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".toggle_test").state == "off" + assert hass.states.get(f"{DOMAIN}.toggle_test").state == "off" # test async_turn_off, must set state = 'on' ('off' + toggle) hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".toggle_test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.toggle_test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".toggle_test").state == "on" + assert hass.states.get(f"{DOMAIN}.toggle_test").state == "on" # test async_turn_on, must set state = 'off' (yes, sounds crazy) hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: DOMAIN + ".toggle_test"} + DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: f"{DOMAIN}.toggle_test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".toggle_test").state == "off" + assert hass.states.get(f"{DOMAIN}.toggle_test").state == "off" async def test_group_alias(hass, monkeypatch): @@ -375,19 +375,19 @@ async def test_group_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "allon"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "off"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_nogroup_alias(hass, monkeypatch): @@ -408,19 +408,19 @@ async def test_nogroup_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "on"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_nogroup_device_id(hass, monkeypatch): @@ -436,19 +436,19 @@ async def test_nogroup_device_id(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "on"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_disable_automatic_add(hass, monkeypatch): @@ -466,7 +466,7 @@ async def test_disable_automatic_add(hass, monkeypatch): await hass.async_block_till_done() # make sure new device is not added - assert not hass.states.get(DOMAIN + ".protocol_0_0") + assert not hass.states.get(f"{DOMAIN}.protocol_0_0") async def test_restore_state(hass, monkeypatch): @@ -488,10 +488,10 @@ async def test_restore_state(hass, monkeypatch): mock_restore_cache( hass, ( - State(DOMAIN + ".l1", STATE_ON, {ATTR_BRIGHTNESS: "123"}), - State(DOMAIN + ".l2", STATE_ON, {ATTR_BRIGHTNESS: "321"}), - State(DOMAIN + ".l3", STATE_OFF), - State(DOMAIN + ".l5", STATE_ON, {ATTR_BRIGHTNESS: "222"}), + State(f"{DOMAIN}.l1", STATE_ON, {ATTR_BRIGHTNESS: "123"}), + State(f"{DOMAIN}.l2", STATE_ON, {ATTR_BRIGHTNESS: "321"}), + State(f"{DOMAIN}.l3", STATE_OFF), + State(f"{DOMAIN}.l5", STATE_ON, {ATTR_BRIGHTNESS: "222"}), ), ) @@ -501,31 +501,31 @@ async def test_restore_state(hass, monkeypatch): _, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) # hybrid light must restore brightness - state = hass.states.get(DOMAIN + ".l1") + state = hass.states.get(f"{DOMAIN}.l1") assert state assert state.state == STATE_ON assert state.attributes[ATTR_BRIGHTNESS] == 123 # normal light do NOT must restore brightness - state = hass.states.get(DOMAIN + ".l2") + state = hass.states.get(f"{DOMAIN}.l2") assert state assert state.state == STATE_ON assert not state.attributes.get(ATTR_BRIGHTNESS) # OFF state also restores (or not) - state = hass.states.get(DOMAIN + ".l3") + state = hass.states.get(f"{DOMAIN}.l3") assert state assert state.state == STATE_OFF # not cached light must default values - state = hass.states.get(DOMAIN + ".l4") + state = hass.states.get(f"{DOMAIN}.l4") assert state assert state.state == STATE_OFF assert state.attributes[ATTR_BRIGHTNESS] == 255 assert state.attributes["assumed_state"] # test coverage for dimmable light - state = hass.states.get(DOMAIN + ".l5") + state = hass.states.get(f"{DOMAIN}.l5") assert state assert state.state == STATE_ON assert state.attributes[ATTR_BRIGHTNESS] == 222 diff --git a/tests/components/rflink/test_switch.py b/tests/components/rflink/test_switch.py index bcade409d3ec..d696e8933be0 100644 --- a/tests/components/rflink/test_switch.py +++ b/tests/components/rflink/test_switch.py @@ -78,21 +78,21 @@ async def test_default_setup(hass, monkeypatch): # test changing state from HA propagates to Rflink hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" assert protocol.send_command_ack.call_args_list[0][0][0] == "protocol_0_0" assert protocol.send_command_ack.call_args_list[0][0][1] == "off" hass.async_create_task( hass.services.async_call( - DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: DOMAIN + ".test"} + DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: f"{DOMAIN}.test"} ) ) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" assert protocol.send_command_ack.call_args_list[1][0][1] == "on" @@ -111,19 +111,19 @@ async def test_group_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "allon"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" # test sending group command to group alias event_callback({"id": "test_group_0_0", "command": "off"}) await hass.async_block_till_done() - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_nogroup_alias(hass, monkeypatch): @@ -144,19 +144,19 @@ async def test_nogroup_alias(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup alias event_callback({"id": "test_nogroup_0_0", "command": "on"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_nogroup_device_id(hass, monkeypatch): @@ -172,19 +172,19 @@ async def test_nogroup_device_id(hass, monkeypatch): # setup mocking rflink module event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "allon"}) await hass.async_block_till_done() # should not affect state - assert hass.states.get(DOMAIN + ".test").state == "off" + assert hass.states.get(f"{DOMAIN}.test").state == "off" # test sending group command to nogroup event_callback({"id": "test_nogroup_0_0", "command": "on"}) await hass.async_block_till_done() # should affect state - assert hass.states.get(DOMAIN + ".test").state == "on" + assert hass.states.get(f"{DOMAIN}.test").state == "on" async def test_device_defaults(hass, monkeypatch): @@ -216,7 +216,7 @@ async def test_device_defaults(hass, monkeypatch): await hass.async_block_till_done() await hass.async_block_till_done() - assert calls[0].data == {"state": "off", "entity_id": DOMAIN + ".test"} + assert calls[0].data == {"state": "off", "entity_id": f"{DOMAIN}.test"} async def test_not_firing_default(hass, monkeypatch): @@ -264,7 +264,7 @@ async def test_restore_state(hass, monkeypatch): } mock_restore_cache( - hass, (State(DOMAIN + ".s1", STATE_ON), State(DOMAIN + ".s2", STATE_OFF)) + hass, (State(f"{DOMAIN}.s1", STATE_ON), State(f"{DOMAIN}.s2", STATE_OFF)) ) hass.state = CoreState.starting @@ -272,16 +272,16 @@ async def test_restore_state(hass, monkeypatch): # setup mocking rflink module _, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) - state = hass.states.get(DOMAIN + ".s1") + state = hass.states.get(f"{DOMAIN}.s1") assert state assert state.state == STATE_ON - state = hass.states.get(DOMAIN + ".s2") + state = hass.states.get(f"{DOMAIN}.s2") assert state assert state.state == STATE_OFF # not cached switch must default values - state = hass.states.get(DOMAIN + ".s3") + state = hass.states.get(f"{DOMAIN}.s3") assert state assert state.state == STATE_OFF assert state.attributes["assumed_state"] diff --git a/tests/components/smartthings/test_sensor.py b/tests/components/smartthings/test_sensor.py index fd8bfdca44cc..f61172c3b974 100644 --- a/tests/components/smartthings/test_sensor.py +++ b/tests/components/smartthings/test_sensor.py @@ -39,7 +39,7 @@ async def test_entity_state(hass, device_factory): state = hass.states.get("sensor.sensor_1_battery") assert state.state == "100" assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == UNIT_PERCENTAGE - assert state.attributes[ATTR_FRIENDLY_NAME] == device.label + " Battery" + assert state.attributes[ATTR_FRIENDLY_NAME] == f"{device.label} Battery" async def test_entity_three_axis_state(hass, device_factory): @@ -50,13 +50,13 @@ async def test_entity_three_axis_state(hass, device_factory): await setup_platform(hass, SENSOR_DOMAIN, devices=[device]) state = hass.states.get("sensor.three_axis_x_coordinate") assert state.state == "100" - assert state.attributes[ATTR_FRIENDLY_NAME] == device.label + " X Coordinate" + assert state.attributes[ATTR_FRIENDLY_NAME] == f"{device.label} X Coordinate" state = hass.states.get("sensor.three_axis_y_coordinate") assert state.state == "75" - assert state.attributes[ATTR_FRIENDLY_NAME] == device.label + " Y Coordinate" + assert state.attributes[ATTR_FRIENDLY_NAME] == f"{device.label} Y Coordinate" state = hass.states.get("sensor.three_axis_z_coordinate") assert state.state == "25" - assert state.attributes[ATTR_FRIENDLY_NAME] == device.label + " Z Coordinate" + assert state.attributes[ATTR_FRIENDLY_NAME] == f"{device.label} Z Coordinate" async def test_entity_three_axis_invalid_state(hass, device_factory): @@ -84,7 +84,7 @@ async def test_entity_and_device_attributes(hass, device_factory): # Assert entry = entity_registry.async_get("sensor.sensor_1_battery") assert entry - assert entry.unique_id == device.device_id + "." + Attribute.battery + assert entry.unique_id == f"{device.device_id}." + Attribute.battery entry = device_registry.async_get_device({(DOMAIN, device.device_id)}, []) assert entry assert entry.name == device.label diff --git a/tests/components/withings/test_init.py b/tests/components/withings/test_init.py index 286b28b61ff4..ae717bc1839b 100644 --- a/tests/components/withings/test_init.py +++ b/tests/components/withings/test_init.py @@ -199,7 +199,7 @@ async def test_upgrade_token( with requests_mock.mock() as rqmck: rqmck.get( - re.compile(AbstractWithingsApi.URL + "/v2/user?.*action=getdevice(&.*|$)"), + re.compile(f"{AbstractWithingsApi.URL}/v2/user?.*action=getdevice(&.*|$)"), status_code=200, json=WITHINGS_GET_DEVICE_RESPONSE_EMPTY, ) @@ -255,7 +255,7 @@ async def test_auth_failure( with requests_mock.mock() as rqmck: rqmck.get( - re.compile(AbstractWithingsApi.URL + "/v2/user?.*action=getdevice(&.*|$)"), + re.compile(f"{AbstractWithingsApi.URL}/v2/user?.*action=getdevice(&.*|$)"), status_code=200, json={"status": 401, "body": {}}, ) From 2e6108365eb98ca888ada17d333c570df609dbbe Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Mon, 6 Apr 2020 00:46:50 +0200 Subject: [PATCH 154/653] Remove global variable from sleepiq (#33715) * Remove global variable from sleepiq * Remove global variable from sleepiq v2 * Create constant file * Move back time constant * Update homeassistant/components/sleepiq/__init__.py Co-Authored-By: Quentame Co-authored-by: Quentame --- homeassistant/components/sleepiq/__init__.py | 19 +++++-------------- .../components/sleepiq/binary_sensor.py | 18 ++++++++++-------- homeassistant/components/sleepiq/const.py | 11 +++++++++++ homeassistant/components/sleepiq/sensor.py | 17 +++++++++-------- 4 files changed, 35 insertions(+), 30 deletions(-) create mode 100644 homeassistant/components/sleepiq/const.py diff --git a/homeassistant/components/sleepiq/__init__.py b/homeassistant/components/sleepiq/__init__.py index 3399fcb43c55..9227b872080f 100644 --- a/homeassistant/components/sleepiq/__init__.py +++ b/homeassistant/components/sleepiq/__init__.py @@ -11,22 +11,12 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle -DOMAIN = "sleepiq" +from .const import DOMAIN MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=30) -IS_IN_BED = "is_in_bed" -SLEEP_NUMBER = "sleep_number" -SENSOR_TYPES = {SLEEP_NUMBER: "SleepNumber", IS_IN_BED: "Is In Bed"} - -LEFT = "left" -RIGHT = "right" -SIDES = [LEFT, RIGHT] - _LOGGER = logging.getLogger(__name__) -DATA = None - CONFIG_SCHEMA = vol.Schema( { vol.Required(DOMAIN): vol.Schema( @@ -46,14 +36,14 @@ def setup(hass, config): Will automatically load sensor components to support devices discovered on the account. """ - global DATA # pylint: disable=global-statement + data = None username = config[DOMAIN][CONF_USERNAME] password = config[DOMAIN][CONF_PASSWORD] client = Sleepyq(username, password) try: - DATA = SleepIQData(client) - DATA.update() + data = SleepIQData(client) + data.update() except ValueError: message = """ SleepIQ failed to login, double check your username and password" @@ -61,6 +51,7 @@ def setup(hass, config): _LOGGER.error(message) return False + hass.data[DOMAIN] = data discovery.load_platform(hass, "sensor", DOMAIN, {}, config) discovery.load_platform(hass, "binary_sensor", DOMAIN, {}, config) diff --git a/homeassistant/components/sleepiq/binary_sensor.py b/homeassistant/components/sleepiq/binary_sensor.py index 8396537a2a0c..2e5028596016 100644 --- a/homeassistant/components/sleepiq/binary_sensor.py +++ b/homeassistant/components/sleepiq/binary_sensor.py @@ -1,33 +1,35 @@ """Support for SleepIQ sensors.""" -from homeassistant.components import sleepiq from homeassistant.components.binary_sensor import BinarySensorDevice +from . import SleepIQSensor +from .const import DOMAIN, IS_IN_BED, SENSOR_TYPES, SIDES + def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the SleepIQ sensors.""" if discovery_info is None: return - data = sleepiq.DATA + data = hass.data[DOMAIN] data.update() dev = [] for bed_id, bed in data.beds.items(): - for side in sleepiq.SIDES: + for side in SIDES: if getattr(bed, side) is not None: dev.append(IsInBedBinarySensor(data, bed_id, side)) add_entities(dev) -class IsInBedBinarySensor(sleepiq.SleepIQSensor, BinarySensorDevice): +class IsInBedBinarySensor(SleepIQSensor, BinarySensorDevice): """Implementation of a SleepIQ presence sensor.""" def __init__(self, sleepiq_data, bed_id, side): """Initialize the sensor.""" - sleepiq.SleepIQSensor.__init__(self, sleepiq_data, bed_id, side) - self.type = sleepiq.IS_IN_BED + SleepIQSensor.__init__(self, sleepiq_data, bed_id, side) + self.type = IS_IN_BED self._state = None - self._name = sleepiq.SENSOR_TYPES[self.type] + self._name = SENSOR_TYPES[self.type] self.update() @property @@ -42,5 +44,5 @@ class IsInBedBinarySensor(sleepiq.SleepIQSensor, BinarySensorDevice): def update(self): """Get the latest data from SleepIQ and updates the states.""" - sleepiq.SleepIQSensor.update(self) + SleepIQSensor.update(self) self._state = self.side.is_in_bed diff --git a/homeassistant/components/sleepiq/const.py b/homeassistant/components/sleepiq/const.py new file mode 100644 index 000000000000..64f508167e18 --- /dev/null +++ b/homeassistant/components/sleepiq/const.py @@ -0,0 +1,11 @@ +"""Define constants for the SleepIQ component.""" + +DOMAIN = "sleepiq" + +IS_IN_BED = "is_in_bed" +SLEEP_NUMBER = "sleep_number" +SENSOR_TYPES = {SLEEP_NUMBER: "SleepNumber", IS_IN_BED: "Is In Bed"} + +LEFT = "left" +RIGHT = "right" +SIDES = [LEFT, RIGHT] diff --git a/homeassistant/components/sleepiq/sensor.py b/homeassistant/components/sleepiq/sensor.py index 404823abe96a..b4c3054268d1 100644 --- a/homeassistant/components/sleepiq/sensor.py +++ b/homeassistant/components/sleepiq/sensor.py @@ -1,5 +1,6 @@ """Support for SleepIQ sensors.""" -from homeassistant.components import sleepiq +from . import SleepIQSensor +from .const import DOMAIN, SENSOR_TYPES, SIDES, SLEEP_NUMBER ICON = "mdi:hotel" @@ -9,27 +10,27 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if discovery_info is None: return - data = sleepiq.DATA + data = hass.data[DOMAIN] data.update() dev = [] for bed_id, bed in data.beds.items(): - for side in sleepiq.SIDES: + for side in SIDES: if getattr(bed, side) is not None: dev.append(SleepNumberSensor(data, bed_id, side)) add_entities(dev) -class SleepNumberSensor(sleepiq.SleepIQSensor): +class SleepNumberSensor(SleepIQSensor): """Implementation of a SleepIQ sensor.""" def __init__(self, sleepiq_data, bed_id, side): """Initialize the sensor.""" - sleepiq.SleepIQSensor.__init__(self, sleepiq_data, bed_id, side) + SleepIQSensor.__init__(self, sleepiq_data, bed_id, side) self._state = None - self.type = sleepiq.SLEEP_NUMBER - self._name = sleepiq.SENSOR_TYPES[self.type] + self.type = SLEEP_NUMBER + self._name = SENSOR_TYPES[self.type] self.update() @@ -45,5 +46,5 @@ class SleepNumberSensor(sleepiq.SleepIQSensor): def update(self): """Get the latest data from SleepIQ and updates the states.""" - sleepiq.SleepIQSensor.update(self) + SleepIQSensor.update(self) self._state = self.side.sleep_number From e3e2e817e51e082ae0216763ac330a2ac35a0a68 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 17:47:27 -0500 Subject: [PATCH 155/653] Convert rachio to cloudhooks (#33724) * Convert rachio to cloudhooks * add cloud to after_dependencies --- homeassistant/components/rachio/__init__.py | 27 +++++--- homeassistant/components/rachio/const.py | 3 + homeassistant/components/rachio/manifest.json | 1 + homeassistant/components/rachio/webhooks.py | 61 +++++++++++++------ 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/rachio/__init__.py b/homeassistant/components/rachio/__init__.py index 8879bd6965ce..a5c9f5ab0a99 100644 --- a/homeassistant/components/rachio/__init__.py +++ b/homeassistant/components/rachio/__init__.py @@ -13,14 +13,18 @@ from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import config_validation as cv from .const import ( - CONF_CUSTOM_URL, + CONF_CLOUDHOOK_URL, CONF_MANUAL_RUN_MINS, + CONF_WEBHOOK_ID, DEFAULT_MANUAL_RUN_MINS, DOMAIN, RACHIO_API_EXCEPTIONS, ) from .device import RachioPerson -from .webhooks import WEBHOOK_PATH, RachioWebhookView +from .webhooks import ( + async_get_or_create_registered_webhook_id_and_url, + async_register_webhook, +) _LOGGER = logging.getLogger(__name__) @@ -31,7 +35,6 @@ CONFIG_SCHEMA = vol.Schema( DOMAIN: vol.Schema( { vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_CUSTOM_URL): cv.string, vol.Optional( CONF_MANUAL_RUN_MINS, default=DEFAULT_MANUAL_RUN_MINS ): cv.positive_int, @@ -76,6 +79,12 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): return unload_ok +async def async_remove_entry(hass, entry): + """Remove a rachio config entry.""" + if CONF_CLOUDHOOK_URL in entry.data: + await hass.components.cloud.async_delete_cloudhook(entry.data[CONF_WEBHOOK_ID]) + + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): """Set up the Rachio config entry.""" @@ -93,11 +102,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): rachio = Rachio(api_key) # Get the URL of this server - custom_url = config.get(CONF_CUSTOM_URL) - hass_url = hass.config.api.base_url if custom_url is None else custom_url rachio.webhook_auth = secrets.token_hex() - webhook_url_path = f"{WEBHOOK_PATH}-{entry.entry_id}" - rachio.webhook_url = f"{hass_url}{webhook_url_path}" + webhook_id, webhook_url = await async_get_or_create_registered_webhook_id_and_url( + hass, entry + ) + rachio.webhook_url = webhook_url person = RachioPerson(rachio, entry) @@ -118,9 +127,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): # Enable component hass.data[DOMAIN][entry.entry_id] = person - - # Listen for incoming webhook connections after the data is there - hass.http.register_view(RachioWebhookView(entry.entry_id, webhook_url_path)) + async_register_webhook(hass, webhook_id, entry.entry_id) for component in SUPPORTED_DOMAINS: hass.async_create_task( diff --git a/homeassistant/components/rachio/const.py b/homeassistant/components/rachio/const.py index 2e73bf9b1167..3508e24eb4b6 100644 --- a/homeassistant/components/rachio/const.py +++ b/homeassistant/components/rachio/const.py @@ -58,3 +58,6 @@ SIGNAL_RACHIO_UPDATE = f"{DOMAIN}_update" SIGNAL_RACHIO_CONTROLLER_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_controller" SIGNAL_RACHIO_ZONE_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_zone" SIGNAL_RACHIO_SCHEDULE_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_schedule" + +CONF_WEBHOOK_ID = "webhook_id" +CONF_CLOUDHOOK_URL = "cloudhook_url" diff --git a/homeassistant/components/rachio/manifest.json b/homeassistant/components/rachio/manifest.json index b8c141f52ab2..c289d754006d 100644 --- a/homeassistant/components/rachio/manifest.json +++ b/homeassistant/components/rachio/manifest.json @@ -4,6 +4,7 @@ "documentation": "https://www.home-assistant.io/integrations/rachio", "requirements": ["rachiopy==0.1.3"], "dependencies": ["http"], + "after_dependencies": ["cloud"], "codeowners": ["@bdraco"], "config_flow": true, "homekit": { diff --git a/homeassistant/components/rachio/webhooks.py b/homeassistant/components/rachio/webhooks.py index e31b32e9410f..a5960b8b28ba 100644 --- a/homeassistant/components/rachio/webhooks.py +++ b/homeassistant/components/rachio/webhooks.py @@ -4,11 +4,13 @@ import logging from aiohttp import web -from homeassistant.components.http import HomeAssistantView from homeassistant.const import URL_API +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_send from .const import ( + CONF_CLOUDHOOK_URL, + CONF_WEBHOOK_ID, DOMAIN, KEY_EXTERNAL_ID, KEY_TYPE, @@ -68,28 +70,17 @@ SIGNAL_MAP = { _LOGGER = logging.getLogger(__name__) -class RachioWebhookView(HomeAssistantView): - """Provide a page for the server to call.""" +@callback +def async_register_webhook(hass, webhook_id, entry_id): + """Register a webhook.""" - requires_auth = False # Handled separately - - def __init__(self, entry_id, webhook_url): - """Initialize the instance of the view.""" - self._entry_id = entry_id - self.url = webhook_url - self.name = webhook_url[1:].replace("/", ":") - _LOGGER.debug( - "Initialize webhook at url: %s, with name %s", self.url, self.name - ) - - async def post(self, request) -> web.Response: + async def _async_handle_rachio_webhook(hass, webhook_id, request): """Handle webhook calls from the server.""" - hass = request.app["hass"] data = await request.json() try: auth = data.get(KEY_EXTERNAL_ID, "").split(":")[1] - assert auth == hass.data[DOMAIN][self._entry_id].rachio.webhook_auth + assert auth == hass.data[DOMAIN][entry_id].rachio.webhook_auth except (AssertionError, IndexError): return web.Response(status=web.HTTPForbidden.status_code) @@ -98,3 +89,39 @@ class RachioWebhookView(HomeAssistantView): async_dispatcher_send(hass, SIGNAL_MAP[update_type], data) return web.Response(status=web.HTTPNoContent.status_code) + + hass.components.webhook.async_register( + DOMAIN, "Rachio", webhook_id, _async_handle_rachio_webhook + ) + + +async def async_get_or_create_registered_webhook_id_and_url(hass, entry): + """Generate webhook ID.""" + config = entry.data.copy() + + updated_config = False + webhook_url = None + + webhook_id = config.get(CONF_WEBHOOK_ID) + if not webhook_id: + webhook_id = hass.components.webhook.async_generate_id() + config[CONF_WEBHOOK_ID] = webhook_id + updated_config = True + + if hass.components.cloud.async_active_subscription(): + cloudhook_url = config.get(CONF_CLOUDHOOK_URL) + if not cloudhook_url: + cloudhook_url = await hass.components.cloud.async_create_cloudhook( + webhook_id + ) + config[CONF_CLOUDHOOK_URL] = cloudhook_url + updated_config = True + webhook_url = cloudhook_url + + if not webhook_url: + webhook_url = hass.components.webhook.async_generate_url(webhook_id) + + if updated_config: + hass.config_entries.async_update_entry(entry, data=config) + + return webhook_id, webhook_url From d99e228983516175e164606b27c72d4c50b8dc33 Mon Sep 17 00:00:00 2001 From: Quentame Date: Mon, 6 Apr 2020 00:50:52 +0200 Subject: [PATCH 156/653] Add config flow to Synology DSM (#32704) * Add config flow to Synology DSM * Use proper sensor unique ID from flow + sensor name * Add description to api_version * Add authentication flow check * Add device_info * Add test_login_failed test * Bump python-synology to 0.5.0 * 0.5.0 test updates * Use NAS S/N as config_flow unique_id * Add missed conf disks + volumes * Review: async_unload the async_track_time_interval * Fix NoneType for disks or volumes * Keep all disks and volumes forever * Update homeassistant/components/synology_dsm/.translations/en.json Co-Authored-By: J. Nick Koston * Update homeassistant/components/synology_dsm/strings.json Co-Authored-By: J. Nick Koston * Fix "Keep all disks and volumes forever" for empty import * Fix prettier * Remove useless LOGGER in config flow * Fix Synology DSM tests doing I/O Co-authored-by: J. Nick Koston --- .coveragerc | 3 +- CODEOWNERS | 1 + .../synology_dsm/.translations/en.json | 26 ++ .../components/synology_dsm/__init__.py | 161 ++++++++++ .../components/synology_dsm/config_flow.py | 142 +++++++++ .../components/synology_dsm/const.py | 55 ++++ .../components/synology_dsm/manifest.json | 8 + .../components/synology_dsm/sensor.py | 201 +++++++++++++ .../components/synology_dsm/strings.json | 26 ++ .../components/synologydsm/__init__.py | 1 - .../components/synologydsm/manifest.json | 7 - .../components/synologydsm/sensor.py | 279 ------------------ homeassistant/generated/config_flows.py | 1 + requirements_all.txt | 4 +- requirements_test_all.txt | 3 + tests/components/synology_dsm/__init__.py | 1 + tests/components/synology_dsm/conftest.py | 13 + .../synology_dsm/test_config_flow.py | 234 +++++++++++++++ 18 files changed, 876 insertions(+), 290 deletions(-) create mode 100644 homeassistant/components/synology_dsm/.translations/en.json create mode 100644 homeassistant/components/synology_dsm/__init__.py create mode 100644 homeassistant/components/synology_dsm/config_flow.py create mode 100644 homeassistant/components/synology_dsm/const.py create mode 100644 homeassistant/components/synology_dsm/manifest.json create mode 100644 homeassistant/components/synology_dsm/sensor.py create mode 100644 homeassistant/components/synology_dsm/strings.json delete mode 100644 homeassistant/components/synologydsm/__init__.py delete mode 100644 homeassistant/components/synologydsm/manifest.json delete mode 100644 homeassistant/components/synologydsm/sensor.py create mode 100644 tests/components/synology_dsm/__init__.py create mode 100644 tests/components/synology_dsm/conftest.py create mode 100644 tests/components/synology_dsm/test_config_flow.py diff --git a/.coveragerc b/.coveragerc index c41d5afe169c..ca9a6422f1ba 100644 --- a/.coveragerc +++ b/.coveragerc @@ -688,8 +688,9 @@ omit = homeassistant/components/syncthru/sensor.py homeassistant/components/synology/camera.py homeassistant/components/synology_chat/notify.py + homeassistant/components/synology_dsm/__init__.py + homeassistant/components/synology_dsm/sensor.py homeassistant/components/synology_srm/device_tracker.py - homeassistant/components/synologydsm/sensor.py homeassistant/components/syslog/notify.py homeassistant/components/systemmonitor/sensor.py homeassistant/components/tado/* diff --git a/CODEOWNERS b/CODEOWNERS index 0ece14799a31..3983ae7364bc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -370,6 +370,7 @@ homeassistant/components/switchbot/* @danielhiversen homeassistant/components/switcher_kis/* @tomerfi homeassistant/components/switchmate/* @danielhiversen homeassistant/components/syncthru/* @nielstron +homeassistant/components/synology_dsm/* @ProtoThis @Quentame homeassistant/components/synology_srm/* @aerialls homeassistant/components/syslog/* @fabaff homeassistant/components/tado/* @michaelarnauts @bdraco diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json new file mode 100644 index 000000000000..fea5ee3f4668 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Host already configured" + }, + "error": { + "login": "Login error: please check your username & password", + "unknown": "Unknown error: please retry later or an other configuration" + }, + "step": { + "user": { + "data": { + "api_version": "DSM version", + "host": "Host", + "name": "Name", + "password": "Password", + "port": "Port", + "ssl": "Use SSL/TLS to connect to your NAS", + "username": "Username" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py new file mode 100644 index 000000000000..e2ada59ec1d8 --- /dev/null +++ b/homeassistant/components/synology_dsm/__init__.py @@ -0,0 +1,161 @@ +"""The Synology DSM component.""" +from datetime import timedelta + +from synology_dsm import SynologyDSM +from synology_dsm.api.core.utilization import SynoCoreUtilization +from synology_dsm.api.dsm.information import SynoDSMInformation +from synology_dsm.api.storage.storage import SynoStorage +import voluptuous as vol + +from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry +from homeassistant.const import ( + CONF_API_VERSION, + CONF_DISKS, + CONF_HOST, + CONF_NAME, + CONF_PASSWORD, + CONF_PORT, + CONF_SSL, + CONF_USERNAME, +) +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.event import async_track_time_interval +from homeassistant.helpers.typing import HomeAssistantType + +from .const import CONF_VOLUMES, DEFAULT_DSM_VERSION, DEFAULT_NAME, DEFAULT_SSL, DOMAIN + +CONFIG_SCHEMA = vol.Schema( + { + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_PORT): cv.port, + vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + vol.Optional(CONF_API_VERSION, default=DEFAULT_DSM_VERSION): cv.positive_int, + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Optional(CONF_DISKS): cv.ensure_list, + vol.Optional(CONF_VOLUMES): cv.ensure_list, + } +) + +CONFIG_SCHEMA = vol.Schema( + {DOMAIN: vol.Schema(vol.All(cv.ensure_list, [CONFIG_SCHEMA]))}, + extra=vol.ALLOW_EXTRA, +) + +SCAN_INTERVAL = timedelta(minutes=15) + + +async def async_setup(hass, config): + """Set up Synology DSM sensors from legacy config file.""" + + conf = config.get(DOMAIN) + if conf is None: + return True + + for dsm_conf in conf: + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=dsm_conf, + ) + ) + + return True + + +async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry): + """Set up Synology DSM sensors.""" + host = entry.data[CONF_HOST] + port = entry.data[CONF_PORT] + username = entry.data[CONF_USERNAME] + password = entry.data[CONF_PASSWORD] + unit = hass.config.units.temperature_unit + use_ssl = entry.data[CONF_SSL] + api_version = entry.data.get(CONF_API_VERSION, DEFAULT_DSM_VERSION) + + api = SynoApi(hass, host, port, username, password, unit, use_ssl, api_version) + + await api.async_setup() + + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][entry.unique_id] = api + + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, "sensor") + ) + + return True + + +async def async_unload_entry(hass: HomeAssistantType, entry: ConfigEntry): + """Unload Synology DSM sensors.""" + api = hass.data[DOMAIN][entry.unique_id] + await api.async_unload() + return await hass.config_entries.async_forward_entry_unload(entry, "sensor") + + +class SynoApi: + """Class to interface with Synology DSM API.""" + + def __init__( + self, + hass: HomeAssistantType, + host: str, + port: int, + username: str, + password: str, + temp_unit: str, + use_ssl: bool, + api_version: int, + ): + """Initialize the API wrapper class.""" + self._hass = hass + self._host = host + self._port = port + self._username = username + self._password = password + self._use_ssl = use_ssl + self._api_version = api_version + self.temp_unit = temp_unit + + self._dsm: SynologyDSM = None + self.information: SynoDSMInformation = None + self.utilisation: SynoCoreUtilization = None + self.storage: SynoStorage = None + + self._unsub_dispatcher = None + + @property + def signal_sensor_update(self) -> str: + """Event specific per Synology DSM entry to signal updates in sensors.""" + return f"{DOMAIN}-{self.information.serial}-sensor-update" + + async def async_setup(self): + """Start interacting with the NAS.""" + self._dsm = SynologyDSM( + self._host, + self._port, + self._username, + self._password, + self._use_ssl, + dsm_version=self._api_version, + ) + self.information = self._dsm.information + self.utilisation = self._dsm.utilisation + self.storage = self._dsm.storage + + await self.update() + + self._unsub_dispatcher = async_track_time_interval( + self._hass, self.update, SCAN_INTERVAL + ) + + async def async_unload(self): + """Stop interacting with the NAS and prepare for removal from hass.""" + self._unsub_dispatcher() + + async def update(self, now=None): + """Update function for updating API information.""" + await self._hass.async_add_executor_job(self._dsm.update) + async_dispatcher_send(self._hass, self.signal_sensor_update) diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py new file mode 100644 index 000000000000..fd23931f13f5 --- /dev/null +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -0,0 +1,142 @@ +"""Config flow to configure the Synology DSM integration.""" +from synology_dsm import SynologyDSM +from synology_dsm.api.core.utilization import SynoCoreUtilization +from synology_dsm.api.dsm.information import SynoDSMInformation +from synology_dsm.api.storage.storage import SynoStorage +import voluptuous as vol + +from homeassistant import config_entries +from homeassistant.const import ( + CONF_API_VERSION, + CONF_DISKS, + CONF_HOST, + CONF_NAME, + CONF_PASSWORD, + CONF_PORT, + CONF_SSL, + CONF_USERNAME, +) + +from .const import ( + CONF_VOLUMES, + DEFAULT_DSM_VERSION, + DEFAULT_NAME, + DEFAULT_PORT, + DEFAULT_PORT_SSL, + DEFAULT_SSL, +) +from .const import DOMAIN # pylint: disable=unused-import + + +class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + + async def _show_setup_form(self, user_input=None, errors=None): + """Show the setup form to the user.""" + + if user_input is None: + user_input = {} + + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + { + vol.Optional( + CONF_NAME, default=user_input.get(CONF_NAME, DEFAULT_NAME) + ): str, + vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, + vol.Optional(CONF_PORT, default=user_input.get(CONF_PORT, "")): str, + vol.Optional( + CONF_SSL, default=user_input.get(CONF_SSL, DEFAULT_SSL) + ): bool, + vol.Optional( + CONF_API_VERSION, + default=user_input.get(CONF_API_VERSION, DEFAULT_DSM_VERSION), + ): vol.All( + vol.Coerce(int), + vol.In([5, 6]), # DSM versions supported by the library + ), + vol.Required( + CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") + ): str, + vol.Required( + CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") + ): str, + } + ), + errors=errors or {}, + ) + + async def async_step_user(self, user_input=None): + """Handle a flow initiated by the user.""" + errors = {} + + if user_input is None: + return await self._show_setup_form(user_input, None) + + name = user_input.get(CONF_NAME, DEFAULT_NAME) + host = user_input[CONF_HOST] + port = user_input.get(CONF_PORT) + username = user_input[CONF_USERNAME] + password = user_input[CONF_PASSWORD] + use_ssl = user_input.get(CONF_SSL, DEFAULT_SSL) + api_version = user_input.get(CONF_API_VERSION, DEFAULT_DSM_VERSION) + + if not port: + if use_ssl is True: + port = DEFAULT_PORT_SSL + else: + port = DEFAULT_PORT + + api = SynologyDSM( + host, port, username, password, use_ssl, dsm_version=api_version, + ) + + if not await self.hass.async_add_executor_job(api.login): + errors[CONF_USERNAME] = "login" + return await self._show_setup_form(user_input, errors) + + information: SynoDSMInformation = await self.hass.async_add_executor_job( + getattr, api, "information" + ) + utilisation: SynoCoreUtilization = await self.hass.async_add_executor_job( + getattr, api, "utilisation" + ) + storage: SynoStorage = await self.hass.async_add_executor_job( + getattr, api, "storage" + ) + + if ( + information.serial is None + or utilisation.cpu_user_load is None + or storage.disks_ids is None + or storage.volumes_ids is None + ): + errors["base"] = "unknown" + return await self._show_setup_form(user_input, errors) + + # Check if already configured + await self.async_set_unique_id(information.serial) + self._abort_if_unique_id_configured() + + config_data = { + CONF_NAME: name, + CONF_HOST: host, + CONF_PORT: port, + CONF_SSL: use_ssl, + CONF_USERNAME: username, + CONF_PASSWORD: password, + } + if user_input.get(CONF_DISKS): + config_data.update({CONF_DISKS: user_input[CONF_DISKS]}) + if user_input.get(CONF_VOLUMES): + config_data.update({CONF_VOLUMES: user_input[CONF_VOLUMES]}) + + return self.async_create_entry(title=host, data=config_data,) + + async def async_step_import(self, user_input=None): + """Import a config entry.""" + return await self.async_step_user(user_input) diff --git a/homeassistant/components/synology_dsm/const.py b/homeassistant/components/synology_dsm/const.py new file mode 100644 index 000000000000..7323413636ba --- /dev/null +++ b/homeassistant/components/synology_dsm/const.py @@ -0,0 +1,55 @@ +"""Constants for Synology DSM.""" +from homeassistant.const import ( + DATA_MEGABYTES, + DATA_RATE_KILOBYTES_PER_SECOND, + UNIT_PERCENTAGE, +) + +DOMAIN = "synology_dsm" + +CONF_VOLUMES = "volumes" +DEFAULT_NAME = "Synology DSM" +DEFAULT_SSL = True +DEFAULT_PORT = 5000 +DEFAULT_PORT_SSL = 5001 +DEFAULT_DSM_VERSION = 6 + +UTILISATION_SENSORS = { + "cpu_other_load": ["CPU Load (Other)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_user_load": ["CPU Load (User)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_system_load": ["CPU Load (System)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_total_load": ["CPU Load (Total)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_1min_load": ["CPU Load (1 min)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_5min_load": ["CPU Load (5 min)", UNIT_PERCENTAGE, "mdi:chip"], + "cpu_15min_load": ["CPU Load (15 min)", UNIT_PERCENTAGE, "mdi:chip"], + "memory_real_usage": ["Memory Usage (Real)", UNIT_PERCENTAGE, "mdi:memory"], + "memory_size": ["Memory Size", DATA_MEGABYTES, "mdi:memory"], + "memory_cached": ["Memory Cached", DATA_MEGABYTES, "mdi:memory"], + "memory_available_swap": ["Memory Available (Swap)", DATA_MEGABYTES, "mdi:memory"], + "memory_available_real": ["Memory Available (Real)", DATA_MEGABYTES, "mdi:memory"], + "memory_total_swap": ["Memory Total (Swap)", DATA_MEGABYTES, "mdi:memory"], + "memory_total_real": ["Memory Total (Real)", DATA_MEGABYTES, "mdi:memory"], + "network_up": ["Network Up", DATA_RATE_KILOBYTES_PER_SECOND, "mdi:upload"], + "network_down": ["Network Down", DATA_RATE_KILOBYTES_PER_SECOND, "mdi:download"], +} +STORAGE_VOL_SENSORS = { + "volume_status": ["Status", None, "mdi:checkbox-marked-circle-outline"], + "volume_device_type": ["Type", None, "mdi:harddisk"], + "volume_size_total": ["Total Size", None, "mdi:chart-pie"], + "volume_size_used": ["Used Space", None, "mdi:chart-pie"], + "volume_percentage_used": ["Volume Used", UNIT_PERCENTAGE, "mdi:chart-pie"], + "volume_disk_temp_avg": ["Average Disk Temp", None, "mdi:thermometer"], + "volume_disk_temp_max": ["Maximum Disk Temp", None, "mdi:thermometer"], +} +STORAGE_DISK_SENSORS = { + "disk_name": ["Name", None, "mdi:harddisk"], + "disk_device": ["Device", None, "mdi:dots-horizontal"], + "disk_smart_status": ["Status (Smart)", None, "mdi:checkbox-marked-circle-outline"], + "disk_status": ["Status", None, "mdi:checkbox-marked-circle-outline"], + "disk_exceed_bad_sector_thr": ["Exceeded Max Bad Sectors", None, "mdi:test-tube"], + "disk_below_remain_life_thr": ["Below Min Remaining Life", None, "mdi:test-tube"], + "disk_temp": ["Temperature", None, "mdi:thermometer"], +} + + +TEMP_SENSORS_KEYS = ["volume_disk_temp_avg", "volume_disk_temp_max", "disk_temp"] diff --git a/homeassistant/components/synology_dsm/manifest.json b/homeassistant/components/synology_dsm/manifest.json new file mode 100644 index 000000000000..a6d171f65283 --- /dev/null +++ b/homeassistant/components/synology_dsm/manifest.json @@ -0,0 +1,8 @@ +{ + "domain": "synology_dsm", + "name": "Synology DSM", + "documentation": "https://www.home-assistant.io/integrations/synology_dsm", + "requirements": ["python-synology==0.5.0"], + "codeowners": ["@ProtoThis", "@Quentame"], + "config_flow": true +} diff --git a/homeassistant/components/synology_dsm/sensor.py b/homeassistant/components/synology_dsm/sensor.py new file mode 100644 index 000000000000..aeefbc498937 --- /dev/null +++ b/homeassistant/components/synology_dsm/sensor.py @@ -0,0 +1,201 @@ +"""Support for Synology DSM Sensors.""" +from typing import Dict + +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_DISKS, + CONF_NAME, + DATA_MEGABYTES, + DATA_RATE_KILOBYTES_PER_SECOND, + TEMP_CELSIUS, +) +from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.entity import Entity +from homeassistant.helpers.typing import HomeAssistantType + +from . import SynoApi +from .const import ( + CONF_VOLUMES, + DOMAIN, + STORAGE_DISK_SENSORS, + STORAGE_VOL_SENSORS, + TEMP_SENSORS_KEYS, + UTILISATION_SENSORS, +) + +ATTRIBUTION = "Data provided by Synology" + + +async def async_setup_entry( + hass: HomeAssistantType, entry: ConfigEntry, async_add_entities +) -> None: + """Set up the Synology NAS Sensor.""" + name = entry.data[CONF_NAME] + + api = hass.data[DOMAIN][entry.unique_id] + + sensors = [ + SynoNasUtilSensor(api, name, sensor_type, UTILISATION_SENSORS[sensor_type]) + for sensor_type in UTILISATION_SENSORS + ] + + # Handle all volumes + if api.storage.volumes_ids: + for volume in entry.data.get(CONF_VOLUMES, api.storage.volumes_ids): + sensors += [ + SynoNasStorageSensor( + api, name, sensor_type, STORAGE_VOL_SENSORS[sensor_type], volume + ) + for sensor_type in STORAGE_VOL_SENSORS + ] + + # Handle all disks + if api.storage.disks_ids: + for disk in entry.data.get(CONF_DISKS, api.storage.disks_ids): + sensors += [ + SynoNasStorageSensor( + api, name, sensor_type, STORAGE_DISK_SENSORS[sensor_type], disk + ) + for sensor_type in STORAGE_DISK_SENSORS + ] + + async_add_entities(sensors, True) + + +class SynoNasSensor(Entity): + """Representation of a Synology NAS Sensor.""" + + def __init__( + self, + api: SynoApi, + name: str, + sensor_type: str, + sensor_info: Dict[str, str], + monitored_device: str = None, + ): + """Initialize the sensor.""" + self._api = api + self.sensor_type = sensor_type + self._name = f"{name} {sensor_info[0]}" + self._unit = sensor_info[1] + self._icon = sensor_info[2] + self.monitored_device = monitored_device + + if self.monitored_device: + self._name = f"{self._name} ({self.monitored_device})" + + self._unique_id = f"{self._api.information.serial} {self._name}" + + self._unsub_dispatcher = None + + @property + def unique_id(self) -> str: + """Return a unique ID.""" + return self._unique_id + + @property + def name(self) -> str: + """Return the name.""" + return self._name + + @property + def icon(self) -> str: + """Return the icon.""" + return self._icon + + @property + def unit_of_measurement(self) -> str: + """Return the unit the value is expressed in.""" + if self.sensor_type in TEMP_SENSORS_KEYS: + return self._api.temp_unit + return self._unit + + @property + def device_state_attributes(self) -> Dict[str, any]: + """Return the state attributes.""" + return {ATTR_ATTRIBUTION: ATTRIBUTION} + + @property + def device_info(self) -> Dict[str, any]: + """Return the device information.""" + return { + "identifiers": {(DOMAIN, self._api.information.serial)}, + "name": "Synology NAS", + "manufacturer": "Synology", + "model": self._api.information.model, + "sw_version": self._api.information.version_string, + } + + @property + def should_poll(self) -> bool: + """No polling needed.""" + return False + + async def async_added_to_hass(self): + """Register state update callback.""" + self._unsub_dispatcher = async_dispatcher_connect( + self.hass, self._api.signal_sensor_update, self.async_write_ha_state + ) + + async def async_will_remove_from_hass(self): + """Clean up after entity before removal.""" + self._unsub_dispatcher() + + +class SynoNasUtilSensor(SynoNasSensor): + """Representation a Synology Utilisation Sensor.""" + + @property + def state(self): + """Return the state.""" + if self._unit == DATA_RATE_KILOBYTES_PER_SECOND or self._unit == DATA_MEGABYTES: + attr = getattr(self._api.utilisation, self.sensor_type)(False) + + if attr is None: + return None + + if self._unit == DATA_RATE_KILOBYTES_PER_SECOND: + return round(attr / 1024.0, 1) + if self._unit == DATA_MEGABYTES: + return round(attr / 1024.0 / 1024.0, 1) + else: + return getattr(self._api.utilisation, self.sensor_type) + + +class SynoNasStorageSensor(SynoNasSensor): + """Representation a Synology Storage Sensor.""" + + @property + def state(self): + """Return the state.""" + if self.monitored_device: + if self.sensor_type in TEMP_SENSORS_KEYS: + attr = getattr(self._api.storage, self.sensor_type)( + self.monitored_device + ) + + if attr is None: + return None + + if self._api.temp_unit == TEMP_CELSIUS: + return attr + + return round(attr * 1.8 + 32.0, 1) + + return getattr(self._api.storage, self.sensor_type)(self.monitored_device) + return None + + @property + def device_info(self) -> Dict[str, any]: + """Return the device information.""" + return { + "identifiers": { + (DOMAIN, self._api.information.serial, self.monitored_device) + }, + "name": f"Synology NAS ({self.monitored_device})", + "manufacturer": "Synology", + "model": self._api.information.model, + "sw_version": self._api.information.version_string, + "via_device": (DOMAIN, self._api.information.serial), + } diff --git a/homeassistant/components/synology_dsm/strings.json b/homeassistant/components/synology_dsm/strings.json new file mode 100644 index 000000000000..b9ccf8d10102 --- /dev/null +++ b/homeassistant/components/synology_dsm/strings.json @@ -0,0 +1,26 @@ +{ + "config": { + "title": "Synology DSM", + "step": { + "user": { + "title": "Synology DSM", + "data": { + "name": "Name", + "host": "Host", + "port": "Port", + "ssl": "Use SSL/TLS to connect to your NAS", + "api_version": "DSM version", + "username": "Username", + "password": "Password" + } + } + }, + "error": { + "login": "Login error: please check your username & password", + "unknown": "Unknown error: please retry later or an other configuration" + }, + "abort": { + "already_configured": "Host already configured" + } + } +} diff --git a/homeassistant/components/synologydsm/__init__.py b/homeassistant/components/synologydsm/__init__.py deleted file mode 100644 index 137a3975b99e..000000000000 --- a/homeassistant/components/synologydsm/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""The synologydsm component.""" diff --git a/homeassistant/components/synologydsm/manifest.json b/homeassistant/components/synologydsm/manifest.json deleted file mode 100644 index 1173d2de699f..000000000000 --- a/homeassistant/components/synologydsm/manifest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "domain": "synologydsm", - "name": "SynologyDSM", - "documentation": "https://www.home-assistant.io/integrations/synologydsm", - "requirements": ["python-synology==0.4.0"], - "codeowners": [] -} diff --git a/homeassistant/components/synologydsm/sensor.py b/homeassistant/components/synologydsm/sensor.py deleted file mode 100644 index 84921b3b8d3c..000000000000 --- a/homeassistant/components/synologydsm/sensor.py +++ /dev/null @@ -1,279 +0,0 @@ -"""Support for Synology NAS Sensors.""" -from datetime import timedelta -import logging - -from SynologyDSM import SynologyDSM -import voluptuous as vol - -from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ( - ATTR_ATTRIBUTION, - CONF_API_VERSION, - CONF_DISKS, - CONF_HOST, - CONF_MONITORED_CONDITIONS, - CONF_NAME, - CONF_PASSWORD, - CONF_PORT, - CONF_SSL, - CONF_USERNAME, - DATA_MEGABYTES, - DATA_RATE_KILOBYTES_PER_SECOND, - EVENT_HOMEASSISTANT_START, - TEMP_CELSIUS, - UNIT_PERCENTAGE, -) -import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.entity import Entity -from homeassistant.util import Throttle - -_LOGGER = logging.getLogger(__name__) - -ATTRIBUTION = "Data provided by Synology" - -CONF_VOLUMES = "volumes" -DEFAULT_NAME = "Synology DSM" -DEFAULT_PORT = 5001 - -MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=15) - -_UTILISATION_MON_COND = { - "cpu_other_load": ["CPU Load (Other)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_user_load": ["CPU Load (User)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_system_load": ["CPU Load (System)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_total_load": ["CPU Load (Total)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_1min_load": ["CPU Load (1 min)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_5min_load": ["CPU Load (5 min)", UNIT_PERCENTAGE, "mdi:chip"], - "cpu_15min_load": ["CPU Load (15 min)", UNIT_PERCENTAGE, "mdi:chip"], - "memory_real_usage": ["Memory Usage (Real)", UNIT_PERCENTAGE, "mdi:memory"], - "memory_size": ["Memory Size", DATA_MEGABYTES, "mdi:memory"], - "memory_cached": ["Memory Cached", DATA_MEGABYTES, "mdi:memory"], - "memory_available_swap": ["Memory Available (Swap)", DATA_MEGABYTES, "mdi:memory"], - "memory_available_real": ["Memory Available (Real)", DATA_MEGABYTES, "mdi:memory"], - "memory_total_swap": ["Memory Total (Swap)", DATA_MEGABYTES, "mdi:memory"], - "memory_total_real": ["Memory Total (Real)", DATA_MEGABYTES, "mdi:memory"], - "network_up": ["Network Up", DATA_RATE_KILOBYTES_PER_SECOND, "mdi:upload"], - "network_down": ["Network Down", DATA_RATE_KILOBYTES_PER_SECOND, "mdi:download"], -} -_STORAGE_VOL_MON_COND = { - "volume_status": ["Status", None, "mdi:checkbox-marked-circle-outline"], - "volume_device_type": ["Type", None, "mdi:harddisk"], - "volume_size_total": ["Total Size", None, "mdi:chart-pie"], - "volume_size_used": ["Used Space", None, "mdi:chart-pie"], - "volume_percentage_used": ["Volume Used", UNIT_PERCENTAGE, "mdi:chart-pie"], - "volume_disk_temp_avg": ["Average Disk Temp", None, "mdi:thermometer"], - "volume_disk_temp_max": ["Maximum Disk Temp", None, "mdi:thermometer"], -} -_STORAGE_DSK_MON_COND = { - "disk_name": ["Name", None, "mdi:harddisk"], - "disk_device": ["Device", None, "mdi:dots-horizontal"], - "disk_smart_status": ["Status (Smart)", None, "mdi:checkbox-marked-circle-outline"], - "disk_status": ["Status", None, "mdi:checkbox-marked-circle-outline"], - "disk_exceed_bad_sector_thr": ["Exceeded Max Bad Sectors", None, "mdi:test-tube"], - "disk_below_remain_life_thr": ["Below Min Remaining Life", None, "mdi:test-tube"], - "disk_temp": ["Temperature", None, "mdi:thermometer"], -} - -_MONITORED_CONDITIONS = ( - list(_UTILISATION_MON_COND.keys()) - + list(_STORAGE_VOL_MON_COND.keys()) - + list(_STORAGE_DSK_MON_COND.keys()) -) - -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=True): cv.boolean, - vol.Optional(CONF_API_VERSION): cv.positive_int, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_MONITORED_CONDITIONS): vol.All( - cv.ensure_list, [vol.In(_MONITORED_CONDITIONS)] - ), - vol.Optional(CONF_DISKS): cv.ensure_list, - vol.Optional(CONF_VOLUMES): cv.ensure_list, - } -) - - -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Synology NAS Sensor.""" - - def run_setup(event): - """Wait until Home Assistant is fully initialized before creating. - - Delay the setup until Home Assistant is fully initialized. - This allows any entities to be created already - """ - name = config.get(CONF_NAME) - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - use_ssl = config.get(CONF_SSL) - unit = hass.config.units.temperature_unit - monitored_conditions = config.get(CONF_MONITORED_CONDITIONS) - api_version = config.get(CONF_API_VERSION) - - api = SynoApi(host, port, username, password, unit, use_ssl, api_version) - - sensors = [ - SynoNasUtilSensor(api, name, variable, _UTILISATION_MON_COND[variable]) - for variable in monitored_conditions - if variable in _UTILISATION_MON_COND - ] - - # Handle all volumes - if api.storage.volumes is not None: - for volume in config.get(CONF_VOLUMES, api.storage.volumes): - sensors += [ - SynoNasStorageSensor( - api, name, variable, _STORAGE_VOL_MON_COND[variable], volume - ) - for variable in monitored_conditions - if variable in _STORAGE_VOL_MON_COND - ] - - # Handle all disks - if api.storage.disks is not None: - for disk in config.get(CONF_DISKS, api.storage.disks): - sensors += [ - SynoNasStorageSensor( - api, name, variable, _STORAGE_DSK_MON_COND[variable], disk - ) - for variable in monitored_conditions - if variable in _STORAGE_DSK_MON_COND - ] - - add_entities(sensors, True) - - # Wait until start event is sent to load this component. - hass.bus.listen_once(EVENT_HOMEASSISTANT_START, run_setup) - - -class SynoApi: - """Class to interface with Synology DSM API.""" - - def __init__(self, host, port, username, password, temp_unit, use_ssl, api_version): - """Initialize the API wrapper class.""" - - self.temp_unit = temp_unit - - try: - self._api = SynologyDSM( - host, - port, - username, - password, - use_https=use_ssl, - debugmode=False, - dsm_version=api_version, - ) - except: # noqa: E722 pylint: disable=bare-except - _LOGGER.error("Error setting up Synology DSM") - - # Will be updated when update() gets called. - self.utilisation = self._api.utilisation - self.storage = self._api.storage - - @Throttle(MIN_TIME_BETWEEN_UPDATES) - def update(self): - """Update function for updating api information.""" - self._api.update() - - -class SynoNasSensor(Entity): - """Representation of a Synology NAS Sensor.""" - - def __init__(self, api, name, variable, variable_info, monitor_device=None): - """Initialize the sensor.""" - self.var_id = variable - self.var_name = "{} {}".format(name, variable_info[0]) - self.var_units = variable_info[1] - self.var_icon = variable_info[2] - self.monitor_device = monitor_device - self._api = api - - @property - def name(self): - """Return the name of the sensor, if any.""" - if self.monitor_device is not None: - return f"{self.var_name} ({self.monitor_device})" - return self.var_name - - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return self.var_icon - - @property - def unit_of_measurement(self): - """Return the unit the value is expressed in.""" - if self.var_id in ["volume_disk_temp_avg", "volume_disk_temp_max", "disk_temp"]: - return self._api.temp_unit - return self.var_units - - def update(self): - """Get the latest data for the states.""" - if self._api is not None: - self._api.update() - - @property - def device_state_attributes(self): - """Return the state attributes.""" - return {ATTR_ATTRIBUTION: ATTRIBUTION} - - -class SynoNasUtilSensor(SynoNasSensor): - """Representation a Synology Utilisation Sensor.""" - - @property - def state(self): - """Return the state of the sensor.""" - network_sensors = ["network_up", "network_down"] - memory_sensors = [ - "memory_size", - "memory_cached", - "memory_available_swap", - "memory_available_real", - "memory_total_swap", - "memory_total_real", - ] - - if self.var_id in network_sensors or self.var_id in memory_sensors: - attr = getattr(self._api.utilisation, self.var_id)(False) - - if attr is None: - return None - - if self.var_id in network_sensors: - return round(attr / 1024.0, 1) - if self.var_id in memory_sensors: - return round(attr / 1024.0 / 1024.0, 1) - else: - return getattr(self._api.utilisation, self.var_id) - - -class SynoNasStorageSensor(SynoNasSensor): - """Representation a Synology Utilisation Sensor.""" - - @property - def state(self): - """Return the state of the sensor.""" - temp_sensors = ["volume_disk_temp_avg", "volume_disk_temp_max", "disk_temp"] - - if self.monitor_device is not None: - if self.var_id in temp_sensors: - attr = getattr(self._api.storage, self.var_id)(self.monitor_device) - - if attr is None: - return None - - if self._api.temp_unit == TEMP_CELSIUS: - return attr - - return round(attr * 1.8 + 32.0, 1) - - return getattr(self._api.storage, self.var_id)(self.monitor_device) diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index e00cd1b5936b..4d4509d74438 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -110,6 +110,7 @@ FLOWS = [ "sonos", "spotify", "starline", + "synology_dsm", "tellduslive", "tesla", "toon", diff --git a/requirements_all.txt b/requirements_all.txt index 48322760753a..b755c16d90b2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1666,8 +1666,8 @@ python-sochain-api==0.0.2 # homeassistant.components.songpal python-songpal==0.11.2 -# homeassistant.components.synologydsm -python-synology==0.4.0 +# homeassistant.components.synology_dsm +python-synology==0.5.0 # homeassistant.components.tado python-tado==0.6.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b064ca1b4117..0e3be2edc4a3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -630,6 +630,9 @@ python-miio==0.5.0.1 # homeassistant.components.nest python-nest==4.1.0 +# homeassistant.components.synology_dsm +python-synology==0.5.0 + # homeassistant.components.tado python-tado==0.6.0 diff --git a/tests/components/synology_dsm/__init__.py b/tests/components/synology_dsm/__init__.py new file mode 100644 index 000000000000..c4710e59df9a --- /dev/null +++ b/tests/components/synology_dsm/__init__.py @@ -0,0 +1 @@ +"""Tests for the Synology DSM component.""" diff --git a/tests/components/synology_dsm/conftest.py b/tests/components/synology_dsm/conftest.py new file mode 100644 index 000000000000..7829a3cc999f --- /dev/null +++ b/tests/components/synology_dsm/conftest.py @@ -0,0 +1,13 @@ +"""Configure Synology DSM tests.""" +from unittest.mock import patch + +import pytest + + +@pytest.fixture(name="dsm_bypass_setup", autouse=True) +def dsm_bypass_setup_fixture(): + """Mock component setup.""" + with patch( + "homeassistant.components.synology_dsm.async_setup_entry", return_value=True + ): + yield diff --git a/tests/components/synology_dsm/test_config_flow.py b/tests/components/synology_dsm/test_config_flow.py new file mode 100644 index 000000000000..664ffda7f8ea --- /dev/null +++ b/tests/components/synology_dsm/test_config_flow.py @@ -0,0 +1,234 @@ +"""Tests for the Synology DSM config flow.""" +import logging +from unittest.mock import MagicMock, Mock, patch + +import pytest + +from homeassistant import data_entry_flow +from homeassistant.components.synology_dsm.const import ( + CONF_VOLUMES, + DEFAULT_NAME, + DEFAULT_PORT, + DEFAULT_PORT_SSL, + DEFAULT_SSL, + DOMAIN, +) +from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.const import ( + CONF_DISKS, + CONF_HOST, + CONF_NAME, + CONF_PASSWORD, + CONF_PORT, + CONF_SSL, + CONF_USERNAME, +) +from homeassistant.helpers.typing import HomeAssistantType + +from tests.common import MockConfigEntry + +_LOGGER = logging.getLogger(__name__) + + +NAME = "My Syno" +HOST = "nas.meontheinternet.com" +SERIAL = "mySerial" +HOST_2 = "nas.worldwide.me" +SERIAL_2 = "mySerial2" +PORT = 1234 +SSL = True +USERNAME = "Home_Assistant" +PASSWORD = "password" + + +@pytest.fixture(name="service") +def mock_controller_service(): + """Mock a successful service.""" + with patch( + "homeassistant.components.synology_dsm.config_flow.SynologyDSM" + ) as service_mock: + service_mock.return_value.login = Mock(return_value=True) + service_mock.return_value.information = Mock(serial=SERIAL) + service_mock.return_value.utilisation = Mock(cpu_user_load=1) + service_mock.return_value.storage = Mock(disks_ids=[], volumes_ids=[]) + yield service_mock + + +@pytest.fixture(name="service_login_failed") +def mock_controller_service_login_failed(): + """Mock a failed login.""" + with patch( + "homeassistant.components.synology_dsm.config_flow.SynologyDSM" + ) as service_mock: + service_mock.return_value.login = Mock(return_value=False) + yield service_mock + + +@pytest.fixture(name="service_failed") +def mock_controller_service_failed(): + """Mock a failed service.""" + with patch( + "homeassistant.components.synology_dsm.config_flow.SynologyDSM" + ) as service_mock: + service_mock.return_value.login = Mock(return_value=True) + service_mock.return_value.information = Mock(serial=None) + service_mock.return_value.utilisation = Mock(cpu_user_load=None) + service_mock.return_value.storage = Mock(disks_ids=None, volumes_ids=None) + yield service_mock + + +async def test_user(hass: HomeAssistantType, service: MagicMock): + """Test user config.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=None + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + # test with all provided + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={ + CONF_NAME: NAME, + CONF_HOST: HOST, + CONF_PORT: PORT, + CONF_SSL: SSL, + CONF_USERNAME: USERNAME, + CONF_PASSWORD: PASSWORD, + }, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == SERIAL + assert result["title"] == HOST + assert result["data"][CONF_NAME] == NAME + assert result["data"][CONF_HOST] == HOST + assert result["data"][CONF_PORT] == PORT + assert result["data"][CONF_SSL] == SSL + assert result["data"][CONF_USERNAME] == USERNAME + assert result["data"][CONF_PASSWORD] == PASSWORD + assert result["data"].get(CONF_DISKS) is None + assert result["data"].get(CONF_VOLUMES) is None + + service.return_value.information = Mock(serial=SERIAL_2) + # test without port + False SSL + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={ + CONF_NAME: NAME, + CONF_HOST: HOST, + CONF_SSL: False, + CONF_USERNAME: USERNAME, + CONF_PASSWORD: PASSWORD, + }, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == SERIAL_2 + assert result["title"] == HOST + assert result["data"][CONF_NAME] == NAME + assert result["data"][CONF_HOST] == HOST + assert result["data"][CONF_PORT] == DEFAULT_PORT + assert not result["data"][CONF_SSL] + assert result["data"][CONF_USERNAME] == USERNAME + assert result["data"][CONF_PASSWORD] == PASSWORD + assert result["data"].get(CONF_DISKS) is None + assert result["data"].get(CONF_VOLUMES) is None + + +async def test_import(hass: HomeAssistantType, service: MagicMock): + """Test import step.""" + # import with minimum setup + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == SERIAL + assert result["title"] == HOST + assert result["data"][CONF_NAME] == DEFAULT_NAME + assert result["data"][CONF_HOST] == HOST + assert result["data"][CONF_PORT] == DEFAULT_PORT_SSL + assert result["data"][CONF_SSL] == DEFAULT_SSL + assert result["data"][CONF_USERNAME] == USERNAME + assert result["data"][CONF_PASSWORD] == PASSWORD + assert result["data"].get(CONF_DISKS) is None + assert result["data"].get(CONF_VOLUMES) is None + + service.return_value.information = Mock(serial=SERIAL_2) + # import with all + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={ + CONF_NAME: NAME, + CONF_HOST: HOST_2, + CONF_PORT: PORT, + CONF_SSL: SSL, + CONF_USERNAME: USERNAME, + CONF_PASSWORD: PASSWORD, + CONF_DISKS: ["sda", "sdb", "sdc"], + CONF_VOLUMES: ["volume_1"], + }, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == SERIAL_2 + assert result["title"] == HOST_2 + assert result["data"][CONF_NAME] == NAME + assert result["data"][CONF_HOST] == HOST_2 + assert result["data"][CONF_PORT] == PORT + assert result["data"][CONF_SSL] == SSL + assert result["data"][CONF_USERNAME] == USERNAME + assert result["data"][CONF_PASSWORD] == PASSWORD + assert result["data"][CONF_DISKS] == ["sda", "sdb", "sdc"] + assert result["data"][CONF_VOLUMES] == ["volume_1"] + + +async def test_abort_if_already_setup(hass: HomeAssistantType, service: MagicMock): + """Test we abort if the account is already setup.""" + MockConfigEntry( + domain=DOMAIN, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + unique_id=SERIAL, + ).add_to_hass(hass) + + # Should fail, same HOST:PORT (import) + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + # Should fail, same HOST:PORT (flow) + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_login_failed(hass: HomeAssistantType, service_login_failed: MagicMock): + """Test when we have errors during connection.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["errors"] == {CONF_USERNAME: "login"} + + +async def test_connection_failed(hass: HomeAssistantType, service_failed: MagicMock): + """Test when we have errors during connection.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["errors"] == {"base": "unknown"} From 738ef38ddc70da30b5a1026f5e059e02317ef882 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Mon, 6 Apr 2020 01:09:20 +0200 Subject: [PATCH 157/653] Modbus: isolate common test functions (#33447) Since all entity test functions are going to use the modbus class, isolate the common parts in conftest.py, and thereby make it simpler to write additional test cases. cleaned up test_modbus_sensor.py while splitting the code. --- tests/components/modbus/conftest.py | 96 +++++++++++ tests/components/modbus/test_modbus_sensor.py | 157 +++++++++--------- 2 files changed, 177 insertions(+), 76 deletions(-) create mode 100644 tests/components/modbus/conftest.py diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py new file mode 100644 index 000000000000..043236c503cd --- /dev/null +++ b/tests/components/modbus/conftest.py @@ -0,0 +1,96 @@ +"""The tests for the Modbus sensor component.""" +from datetime import timedelta +import logging +from unittest import mock + +import pytest + +from homeassistant.components.modbus.const import ( + CALL_TYPE_REGISTER_INPUT, + CONF_REGISTER, + CONF_REGISTER_TYPE, + CONF_REGISTERS, + DEFAULT_HUB, + MODBUS_DOMAIN, +) +from homeassistant.const import CONF_NAME, CONF_PLATFORM, CONF_SCAN_INTERVAL +from homeassistant.setup import async_setup_component +import homeassistant.util.dt as dt_util + +from tests.common import MockModule, async_fire_time_changed, mock_integration + +_LOGGER = logging.getLogger(__name__) + + +@pytest.fixture() +def mock_hub(hass): + """Mock hub.""" + mock_integration(hass, MockModule(MODBUS_DOMAIN)) + hub = mock.MagicMock() + hub.name = "hub" + hass.data[MODBUS_DOMAIN] = {DEFAULT_HUB: hub} + return hub + + +common_register_config = {CONF_NAME: "test-config", CONF_REGISTER: 1234} + + +class ReadResult: + """Storage class for register read results.""" + + def __init__(self, register_words): + """Init.""" + self.registers = register_words + + +read_result = None + + +async def simulate_read_registers(unit, address, count): + """Simulate modbus register read.""" + del unit, address, count # not used in simulation, but in real connection + global read_result + return read_result + + +async def run_test( + hass, mock_hub, register_config, entity_domain, register_words, expected +): + """Run test for given config and check that sensor outputs expected result.""" + + # Full sensor configuration + sensor_name = "modbus_test_sensor" + scan_interval = 5 + config = { + entity_domain: { + CONF_PLATFORM: "modbus", + CONF_SCAN_INTERVAL: scan_interval, + CONF_REGISTERS: [ + dict(**{CONF_NAME: sensor_name, CONF_REGISTER: 1234}, **register_config) + ], + } + } + + # Setup inputs for the sensor + global read_result + read_result = ReadResult(register_words) + if register_config.get(CONF_REGISTER_TYPE) == CALL_TYPE_REGISTER_INPUT: + mock_hub.read_input_registers = simulate_read_registers + else: + mock_hub.read_holding_registers = simulate_read_registers + + # Initialize sensor + now = dt_util.utcnow() + with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now): + assert await async_setup_component(hass, entity_domain, config) + + # Trigger update call with time_changed event + now += timedelta(seconds=scan_interval + 1) + with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now): + async_fire_time_changed(hass, now) + await hass.async_block_till_done() + + # Check state + entity_id = f"{entity_domain}.{sensor_name}" + state = hass.states.get(entity_id).state + assert state == expected diff --git a/tests/components/modbus/test_modbus_sensor.py b/tests/components/modbus/test_modbus_sensor.py index 1c4094387a9d..6207a3639372 100644 --- a/tests/components/modbus/test_modbus_sensor.py +++ b/tests/components/modbus/test_modbus_sensor.py @@ -1,8 +1,5 @@ """The tests for the Modbus sensor component.""" -from datetime import timedelta -from unittest import mock - -import pytest +import logging from homeassistant.components.modbus.const import ( CALL_TYPE_REGISTER_HOLDING, @@ -11,78 +8,18 @@ from homeassistant.components.modbus.const import ( CONF_DATA_TYPE, CONF_OFFSET, CONF_PRECISION, - CONF_REGISTER, CONF_REGISTER_TYPE, - CONF_REGISTERS, CONF_REVERSE_ORDER, CONF_SCALE, DATA_TYPE_FLOAT, DATA_TYPE_INT, DATA_TYPE_UINT, - DEFAULT_HUB, - MODBUS_DOMAIN, ) -from homeassistant.const import CONF_NAME, CONF_PLATFORM, CONF_SCAN_INTERVAL -from homeassistant.setup import async_setup_component -import homeassistant.util.dt as dt_util +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN -from tests.common import MockModule, async_fire_time_changed, mock_integration +from .conftest import run_test - -@pytest.fixture() -def mock_hub(hass): - """Mock hub.""" - mock_integration(hass, MockModule(MODBUS_DOMAIN)) - hub = mock.MagicMock() - hub.name = "hub" - hass.data[MODBUS_DOMAIN] = {DEFAULT_HUB: hub} - return hub - - -common_register_config = {CONF_NAME: "test-config", CONF_REGISTER: 1234} - - -class ReadResult: - """Storage class for register read results.""" - - def __init__(self, register_words): - """Init.""" - self.registers = register_words - - -async def run_test(hass, mock_hub, register_config, register_words, expected): - """Run test for given config and check that sensor outputs expected result.""" - - # Full sensor configuration - sensor_name = "modbus_test_sensor" - scan_interval = 5 - config = { - MODBUS_DOMAIN: { - CONF_PLATFORM: "modbus", - CONF_SCAN_INTERVAL: scan_interval, - CONF_REGISTERS: [ - dict(**{CONF_NAME: sensor_name, CONF_REGISTER: 1234}, **register_config) - ], - } - } - - # Setup inputs for the sensor - read_result = ReadResult(register_words) - if register_config.get(CONF_REGISTER_TYPE) == CALL_TYPE_REGISTER_INPUT: - mock_hub.read_input_registers.return_value = read_result - else: - mock_hub.read_holding_registers.return_value = read_result - - # Initialize sensor - now = dt_util.utcnow() - with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now): - assert await async_setup_component(hass, MODBUS_DOMAIN, config) - - # Trigger update call with time_changed event - now += timedelta(seconds=scan_interval + 1) - with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now): - async_fire_time_changed(hass, now) - await hass.async_block_till_done() +_LOGGER = logging.getLogger(__name__) async def test_simple_word_register(hass, mock_hub): @@ -94,14 +31,26 @@ async def test_simple_word_register(hass, mock_hub): CONF_OFFSET: 0, CONF_PRECISION: 0, } - await run_test(hass, mock_hub, register_config, register_words=[0], expected="0") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[0], + expected="0", + ) async def test_optional_conf_keys(hass, mock_hub): """Test handling of optional configuration keys.""" register_config = {} await run_test( - hass, mock_hub, register_config, register_words=[0x8000], expected="-32768" + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[0x8000], + expected="-32768", ) @@ -114,7 +63,14 @@ async def test_offset(hass, mock_hub): CONF_OFFSET: 13, CONF_PRECISION: 0, } - await run_test(hass, mock_hub, register_config, register_words=[7], expected="20") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[7], + expected="20", + ) async def test_scale_and_offset(hass, mock_hub): @@ -126,7 +82,14 @@ async def test_scale_and_offset(hass, mock_hub): CONF_OFFSET: 13, CONF_PRECISION: 0, } - await run_test(hass, mock_hub, register_config, register_words=[7], expected="34") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[7], + expected="34", + ) async def test_ints_can_have_precision(hass, mock_hub): @@ -139,7 +102,12 @@ async def test_ints_can_have_precision(hass, mock_hub): CONF_PRECISION: 4, } await run_test( - hass, mock_hub, register_config, register_words=[7], expected="34.0000" + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[7], + expected="34.0000", ) @@ -152,7 +120,14 @@ async def test_floats_get_rounded_correctly(hass, mock_hub): CONF_OFFSET: 0, CONF_PRECISION: 0, } - await run_test(hass, mock_hub, register_config, register_words=[1], expected="2") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[1], + expected="2", + ) async def test_parameters_as_strings(hass, mock_hub): @@ -164,7 +139,14 @@ async def test_parameters_as_strings(hass, mock_hub): CONF_OFFSET: "5", CONF_PRECISION: "1", } - await run_test(hass, mock_hub, register_config, register_words=[9], expected="18.5") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[9], + expected="18.5", + ) async def test_floating_point_scale(hass, mock_hub): @@ -176,7 +158,14 @@ async def test_floating_point_scale(hass, mock_hub): CONF_OFFSET: 0, CONF_PRECISION: 2, } - await run_test(hass, mock_hub, register_config, register_words=[1], expected="2.40") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[1], + expected="2.40", + ) async def test_floating_point_offset(hass, mock_hub): @@ -188,7 +177,14 @@ async def test_floating_point_offset(hass, mock_hub): CONF_OFFSET: -10.3, CONF_PRECISION: 1, } - await run_test(hass, mock_hub, register_config, register_words=[2], expected="-8.3") + await run_test( + hass, + mock_hub, + register_config, + SENSOR_DOMAIN, + register_words=[2], + expected="-8.3", + ) async def test_signed_two_word_register(hass, mock_hub): @@ -204,6 +200,7 @@ async def test_signed_two_word_register(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF], expected="-1985229329", ) @@ -222,6 +219,7 @@ async def test_unsigned_two_word_register(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF], expected=str(0x89ABCDEF), ) @@ -238,6 +236,7 @@ async def test_reversed(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF], expected=str(0xCDEF89AB), ) @@ -256,6 +255,7 @@ async def test_four_word_register(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF, 0x0123, 0x4567], expected="9920249030613615975", ) @@ -274,6 +274,7 @@ async def test_four_word_register_precision_is_intact_with_int_params(hass, mock hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x0123, 0x4567, 0x89AB, 0xCDEF], expected="163971058432973793", ) @@ -292,6 +293,7 @@ async def test_four_word_register_precision_is_lost_with_float_params(hass, mock hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x0123, 0x4567, 0x89AB, 0xCDEF], expected="163971058432973792", ) @@ -311,6 +313,7 @@ async def test_two_word_input_register(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF], expected=str(0x89ABCDEF), ) @@ -330,6 +333,7 @@ async def test_two_word_holding_register(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[0x89AB, 0xCDEF], expected=str(0x89ABCDEF), ) @@ -349,6 +353,7 @@ async def test_float_data_type(hass, mock_hub): hass, mock_hub, register_config, + SENSOR_DOMAIN, register_words=[16286, 1617], expected="1.23457", ) From 529656cf64d0fd946480bf8eac507fbb183aafb2 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Mon, 6 Apr 2020 01:26:11 +0200 Subject: [PATCH 158/653] UniFi - Improve client tracker attributes based on connection (#32817) * Improve client tracker attributes by setting them to None when client is disconnected * Fix martins comment --- .../components/unifi/device_tracker.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/unifi/device_tracker.py b/homeassistant/components/unifi/device_tracker.py index 43494ec485fc..c5aa74706a1c 100644 --- a/homeassistant/components/unifi/device_tracker.py +++ b/homeassistant/components/unifi/device_tracker.py @@ -16,26 +16,28 @@ from .unifi_client import UniFiClient LOGGER = logging.getLogger(__name__) -DEVICE_ATTRIBUTES = [ +CLIENT_CONNECTED_ATTRIBUTES = [ "_is_guest_by_uap", "ap_mac", "authorized", "essid", - "hostname", "ip", "is_11r", "is_guest", - "mac", - "name", "noted", - "oui", "qos_policy_applied", "radio", "radio_proto", - "site_id", "vlan", ] +CLIENT_STATIC_ATTRIBUTES = [ + "hostname", + "mac", + "name", + "oui", +] + async def async_setup_entry(hass, config_entry, async_add_entities): """Set up device tracker for UniFi component.""" @@ -284,12 +286,14 @@ class UniFiClientTracker(UniFiClient, ScannerEntity): """Return the client state attributes.""" attributes = {} - for variable in DEVICE_ATTRIBUTES: - if variable in self.client.raw: - attributes[variable] = self.client.raw[variable] - attributes["is_wired"] = self.is_wired + for variable in CLIENT_STATIC_ATTRIBUTES + CLIENT_CONNECTED_ATTRIBUTES: + if variable in self.client.raw: + if self.is_disconnected and variable in CLIENT_CONNECTED_ATTRIBUTES: + continue + attributes[variable] = self.client.raw[variable] + return attributes From f7b822d0000aa3b5d150a5cc47855158308f16db Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 6 Apr 2020 00:02:13 +0000 Subject: [PATCH 159/653] [ci skip] Translation update --- .../coronavirus/.translations/hu.json | 16 ++++++++++++++ .../components/cover/.translations/hu.json | 8 +++++++ .../components/doorbird/.translations/ca.json | 4 +++- .../homekit_controller/.translations/hu.json | 2 +- .../components/ipp/.translations/ca.json | 22 +++++++++++++++---- .../components/light/.translations/hu.json | 2 ++ .../minecraft_server/.translations/hu.json | 2 +- .../components/mqtt/.translations/hu.json | 14 +++++++++++- .../components/nut/.translations/ca.json | 10 ++++++--- .../synology_dsm/.translations/en.json | 2 +- .../components/vera/.translations/ca.json | 1 + .../components/vizio/.translations/hu.json | 2 +- 12 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 homeassistant/components/coronavirus/.translations/hu.json diff --git a/homeassistant/components/coronavirus/.translations/hu.json b/homeassistant/components/coronavirus/.translations/hu.json new file mode 100644 index 000000000000..171aedc801d9 --- /dev/null +++ b/homeassistant/components/coronavirus/.translations/hu.json @@ -0,0 +1,16 @@ +{ + "config": { + "abort": { + "already_configured": "Ez az orsz\u00e1g m\u00e1r konfigur\u00e1lva van." + }, + "step": { + "user": { + "data": { + "country": "Orsz\u00e1g" + }, + "title": "V\u00e1lassz egy orsz\u00e1got a megfigyel\u00e9shez" + } + }, + "title": "Koronav\u00edrus" + } +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/hu.json b/homeassistant/components/cover/.translations/hu.json index d460c53109dd..5e91736a263f 100644 --- a/homeassistant/components/cover/.translations/hu.json +++ b/homeassistant/components/cover/.translations/hu.json @@ -1,5 +1,13 @@ { "device_automation": { + "action_type": { + "close": "{entity_name} z\u00e1r\u00e1sa", + "close_tilt": "{entity_name} d\u00f6nt\u00e9s z\u00e1r\u00e1sa", + "open": "{entity_name} nyit\u00e1sa", + "open_tilt": "{entity_name} d\u00f6nt\u00e9s nyit\u00e1sa", + "set_position": "{entity_name} poz\u00edci\u00f3j\u00e1nak be\u00e1ll\u00edt\u00e1sa", + "set_tilt_position": "{entity_name} d\u00f6nt\u00e9si poz\u00edci\u00f3j\u00e1nak be\u00e1ll\u00edt\u00e1sa" + }, "condition_type": { "is_closed": "{entity_name} z\u00e1rva van", "is_closing": "{entity_name} z\u00e1r\u00f3dik", diff --git a/homeassistant/components/doorbird/.translations/ca.json b/homeassistant/components/doorbird/.translations/ca.json index ba6f7341201f..d26da82ad1e9 100644 --- a/homeassistant/components/doorbird/.translations/ca.json +++ b/homeassistant/components/doorbird/.translations/ca.json @@ -1,7 +1,9 @@ { "config": { "abort": { - "already_configured": "Aquest dispositiu DoorBird ja est\u00e0 configurat" + "already_configured": "Aquest dispositiu DoorBird ja est\u00e0 configurat", + "link_local_address": "L'enlla\u00e7 amb adreces locals no est\u00e0 perm\u00e8s", + "not_doorbird_device": "Aquest dispositiu no \u00e9s DoorBird" }, "error": { "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", diff --git a/homeassistant/components/homekit_controller/.translations/hu.json b/homeassistant/components/homekit_controller/.translations/hu.json index 264e635d7f44..53ca9a390157 100644 --- a/homeassistant/components/homekit_controller/.translations/hu.json +++ b/homeassistant/components/homekit_controller/.translations/hu.json @@ -14,7 +14,7 @@ "busy_error": "Az eszk\u00f6z megtagadta a p\u00e1ros\u00edt\u00e1s hozz\u00e1ad\u00e1s\u00e1t, mivel m\u00e1r p\u00e1ros\u00edtva van egy m\u00e1sik vez\u00e9rl\u0151vel.", "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_tries_error": "Az eszk\u00f6z megtagadta a p\u00e1ros\u00edt\u00e1s hozz\u00e1ad\u00e1s\u00e1t, mivel t\u00f6bb mint 100 sikertelen hiteles\u00edt\u00e9si k\u00eds\u00e9rletet kapott.", - "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 jelenleg nem t\u00e1mogatja az eszk\u00f6zt.", + "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." }, diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index 39893c5d2fac..a5b8b104b386 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -1,16 +1,30 @@ { "config": { "abort": { - "already_configured": "Aquesta impressora ja est\u00e0 configurada." + "already_configured": "Aquesta impressora ja est\u00e0 configurada.", + "connection_error": "No s'ha pogut connectar amb la impressora." + }, + "error": { + "connection_error": "No s'ha pogut connectar amb la impressora." }, "flow_title": "Impressora: {name}", "step": { "user": { "data": { + "base_path": "Ruta relativa a la impressora", "host": "Amfitri\u00f3 o adre\u00e7a IP", - "port": "Port" - } + "port": "Port", + "ssl": "La impressora \u00e9s compatible amb comunicaci\u00f3 SSL/TLS", + "verify_ssl": "La impressora utilitza un certificat SSL adequat" + }, + "description": "Configura la impressora amb el protocol d'impressi\u00f3 per Internet (IPP) per integrar-la amb Home Assistant.", + "title": "Enlla\u00e7 d'impressora" + }, + "zeroconf_confirm": { + "description": "Vols afegir la impressora {name} a Home Assistant?", + "title": "Impressora descoberta" } - } + }, + "title": "Protocol d'impressi\u00f3 per Internet (IPP)" } } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/hu.json b/homeassistant/components/light/.translations/hu.json index 7d7e158f3cb0..5192a8c7df2c 100644 --- a/homeassistant/components/light/.translations/hu.json +++ b/homeassistant/components/light/.translations/hu.json @@ -1,6 +1,8 @@ { "device_automation": { "action_type": { + "brightness_decrease": "{entity_name} f\u00e9nyerej\u00e9nek cs\u00f6kkent\u00e9se", + "brightness_increase": "{entity_name} f\u00e9nyerej\u00e9nek n\u00f6vel\u00e9se", "toggle": "{entity_name} fel/lekapcsol\u00e1sa", "turn_off": "{entity_name} lekapcsol\u00e1sa", "turn_on": "{entity_name} felkapcsol\u00e1sa" diff --git a/homeassistant/components/minecraft_server/.translations/hu.json b/homeassistant/components/minecraft_server/.translations/hu.json index 9341bdbe4d18..1443e41ddb33 100644 --- a/homeassistant/components/minecraft_server/.translations/hu.json +++ b/homeassistant/components/minecraft_server/.translations/hu.json @@ -10,7 +10,7 @@ "name": "N\u00e9v", "port": "Port" }, - "title": "Kapcsolja \u00f6ssze a Minecraft szervert" + "title": "Kapcsold \u00f6ssze a Minecraft szervered" } }, "title": "Minecraft szerver" diff --git a/homeassistant/components/mqtt/.translations/hu.json b/homeassistant/components/mqtt/.translations/hu.json index 26361b0e3634..e45c287f44f5 100644 --- a/homeassistant/components/mqtt/.translations/hu.json +++ b/homeassistant/components/mqtt/.translations/hu.json @@ -22,10 +22,22 @@ "data": { "discovery": "Felfedez\u00e9s enged\u00e9lyez\u00e9se" }, - "description": "Szeretn\u00e9d, hogy a Home Assistant csatlakozzon a hass.io addon {addon} \u00e1ltal biztos\u00edtott MQTT br\u00f3kerhez?", + "description": "Be szeretn\u00e9d konfigru\u00e1lni, hogy a Home Assistant a(z) {addon} Hass.io add-on \u00e1ltal biztos\u00edtott MQTT br\u00f3kerhez csatlakozzon?", "title": "MQTT Broker a Hass.io b\u0151v\u00edtm\u00e9nyen kereszt\u00fcl" } }, "title": "MQTT" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "Els\u0151 gomb", + "button_2": "M\u00e1sodik gomb", + "button_3": "Harmadik gomb", + "button_4": "Negyedik gomb", + "button_5": "\u00d6t\u00f6dik gomb", + "button_6": "Hatodik gomb", + "turn_off": "Kikapcsol\u00e1s", + "turn_on": "Bekapcsol\u00e1s" + } } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index 33d2268be5b5..01a21920cfa2 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -4,6 +4,7 @@ "already_configured": "El dispositiu ja est\u00e0 configurat" }, "error": { + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", "unknown": "Error inesperat" }, "step": { @@ -16,16 +17,19 @@ "port": "Port", "resources": "Recursos", "username": "Nom d'usuari" - } + }, + "title": "No s'ha pogut connectar amb el servidor NUT" } - } + }, + "title": "Eines de xarxa UPS (NUT)" }, "options": { "step": { "init": { "data": { "resources": "Recursos" - } + }, + "description": "Selecciona els recursos del sensor" } } } diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json index fea5ee3f4668..327745343bad 100644 --- a/homeassistant/components/synology_dsm/.translations/en.json +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -23,4 +23,4 @@ }, "title": "Synology DSM" } -} +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ca.json b/homeassistant/components/vera/.translations/ca.json index 27ead21ddc5a..d15d12ce6c3e 100644 --- a/homeassistant/components/vera/.translations/ca.json +++ b/homeassistant/components/vera/.translations/ca.json @@ -24,6 +24,7 @@ "exclude": "Identificadors de dispositiu Vera a excloure de Home Assistant.", "lights": "Identificadors de dispositiu dels commutadors Vera a tractar com a llums a Home Assistant." }, + "description": "Consulta la documentaci\u00f3 de Vera per veure els detalls sobre els par\u00e0metres opcionals a: https://www.home-assistant.io/integrations/vera/. Nota: tots els canvis fets aqu\u00ed necessitaran un reinici de Home Assistant. Per esborrar valors, posa-hi un espai.", "title": "Opcions del controlador Vera" } } diff --git a/homeassistant/components/vizio/.translations/hu.json b/homeassistant/components/vizio/.translations/hu.json index 650d5133dbda..7cbbe5fdf11f 100644 --- a/homeassistant/components/vizio/.translations/hu.json +++ b/homeassistant/components/vizio/.translations/hu.json @@ -6,7 +6,7 @@ "already_setup_with_diff_host_and_name": "\u00dagy t\u0171nik, hogy ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva egy m\u00e1sik \u00e1llom\u00e1ssal \u00e9s n\u00e9vvel a sorozatsz\u00e1ma alapj\u00e1n. T\u00e1vol\u00edtsa el a r\u00e9gi bejegyz\u00e9seket a configuration.yaml \u00e9s az Integr\u00e1ci\u00f3k men\u00fcb\u0151l, miel\u0151tt \u00fajra megpr\u00f3b\u00e1ln\u00e1 hozz\u00e1adni ezt az eszk\u00f6zt.", "host_exists": "Vizio-\u00f6sszetev\u0151, amelynek az kiszolg\u00e1l\u00f3neve m\u00e1r konfigur\u00e1lva van.", "name_exists": "Vizio-\u00f6sszetev\u0151, amelynek neve m\u00e1r konfigur\u00e1lva van.", - "updated_entry": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban defini\u00e1lt n\u00e9v \u00e9s/vagy be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt konfigur\u00e1ci\u00f3val, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt.", + "updated_entry": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban defini\u00e1lt n\u00e9v, appok \u00e9s/vagy be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt konfigur\u00e1ci\u00f3val, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt.", "updated_options": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban megadott be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt be\u00e1ll\u00edt\u00e1si \u00e9rt\u00e9kekkel, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt.", "updated_volume_step": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban l\u00e9v\u0151 henger\u0151l\u00e9p\u00e9s m\u00e9rete nem egyezik meg a konfigur\u00e1ci\u00f3s bejegyz\u00e9ssel, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt." }, From e4ee4cf302bbffee59126ea70ea8ea2195fc81b2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 5 Apr 2020 21:33:36 -0500 Subject: [PATCH 160/653] Remove legacy async_add_job from homekit tests (#33727) * Remove legacy async_add_job from homekit tests * Empty commit to rerun CI --- tests/components/homekit/test_accessories.py | 18 ++-- tests/components/homekit/test_homekit.py | 22 ++--- tests/components/homekit/test_type_covers.py | 38 ++++---- tests/components/homekit/test_type_fans.py | 22 ++--- tests/components/homekit/test_type_lights.py | 18 ++-- tests/components/homekit/test_type_locks.py | 8 +- .../homekit/test_type_media_players.py | 62 ++++++++----- .../homekit/test_type_security_systems.py | 12 +-- tests/components/homekit/test_type_sensors.py | 14 +-- .../components/homekit/test_type_switches.py | 32 +++---- .../homekit/test_type_thermostats.py | 92 ++++++++++--------- tests/components/homekit/test_util.py | 4 +- 12 files changed, 184 insertions(+), 158 deletions(-) diff --git a/tests/components/homekit/test_accessories.py b/tests/components/homekit/test_accessories.py index ddca9698987e..e4605392abab 100644 --- a/tests/components/homekit/test_accessories.py +++ b/tests/components/homekit/test_accessories.py @@ -60,15 +60,15 @@ async def test_debounce(hass): now = datetime(2018, 1, 1, 20, 0, 0, tzinfo=dt_util.UTC) with patch("homeassistant.util.dt.utcnow", return_value=now): - await hass.async_add_job(debounce_demo, mock, "value") + await hass.async_add_executor_job(debounce_demo, mock, "value") hass.bus.async_fire(EVENT_TIME_CHANGED, {ATTR_NOW: now + timedelta(seconds=3)}) await hass.async_block_till_done() assert counter == 1 assert len(arguments) == 2 with patch("homeassistant.util.dt.utcnow", return_value=now): - await hass.async_add_job(debounce_demo, mock, "value") - await hass.async_add_job(debounce_demo, mock, "value") + await hass.async_add_executor_job(debounce_demo, mock, "value") + await hass.async_add_executor_job(debounce_demo, mock, "value") hass.bus.async_fire(EVENT_TIME_CHANGED, {ATTR_NOW: now + timedelta(seconds=3)}) await hass.async_block_till_done() @@ -99,7 +99,7 @@ async def test_home_accessory(hass, hk_driver): with patch( "homeassistant.components.homekit.accessories.HomeAccessory.update_state" ) as mock_update_state: - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() state = hass.states.get(entity_id) mock_update_state.assert_called_with(state) @@ -132,7 +132,7 @@ async def test_battery_service(hass, hk_driver, caplog): assert acc._char_low_battery.value == 0 assert acc._char_charging.value == 2 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc._char_battery.value == 50 assert acc._char_low_battery.value == 0 @@ -163,7 +163,7 @@ async def test_battery_service(hass, hk_driver, caplog): assert acc._char_low_battery.value == 0 assert acc._char_charging.value == 2 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc._char_battery.value == 10 assert acc._char_low_battery.value == 1 @@ -197,7 +197,7 @@ async def test_linked_battery_sensor(hass, hk_driver, caplog): acc.update_state = lambda x: None assert acc.linked_battery_sensor == linked_battery - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc._char_battery.value == 50 assert acc._char_low_battery.value == 0 @@ -232,7 +232,7 @@ async def test_linked_battery_sensor(hass, hk_driver, caplog): {CONF_LINKED_BATTERY_SENSOR: linked_battery, CONF_LOW_BATTERY_THRESHOLD: 50}, ) acc.update_state = lambda x: None - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc._char_battery.value == 20 assert acc._char_low_battery.value == 1 @@ -263,7 +263,7 @@ async def test_missing_linked_battery_sensor(hass, hk_driver, caplog): acc.update_state = lambda x: None assert not acc.linked_battery_sensor - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert not acc.linked_battery_sensor diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index 7367f4ae563f..d984eef5fdce 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -129,7 +129,7 @@ async def test_homekit_setup(hass, hk_driver): f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver, patch("homeassistant.util.get_local_ip") as mock_ip: mock_ip.return_value = IP_ADDRESS - await hass.async_add_job(homekit.setup) + await hass.async_add_executor_job(homekit.setup) path = hass.config.path(HOMEKIT_FILE) assert isinstance(homekit.bridge, HomeBridge) @@ -153,7 +153,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver): with patch( f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: - await hass.async_add_job(homekit.setup) + await hass.async_add_executor_job(homekit.setup) mock_driver.assert_called_with( hass, address="172.0.0.0", @@ -172,7 +172,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver): with patch( f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: - await hass.async_add_job(homekit.setup) + await hass.async_add_executor_job(homekit.setup) mock_driver.assert_called_with( hass, address="0.0.0.0", @@ -187,7 +187,7 @@ async def test_homekit_setup_safe_mode(hass, hk_driver): homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True) with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver): - await hass.async_add_job(homekit.setup) + await hass.async_add_executor_job(homekit.setup) assert homekit.driver.safe_mode is True @@ -263,7 +263,7 @@ async def test_homekit_start(hass, hk_driver, debounce_patcher): ) as hk_driver_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.start" ) as hk_driver_start: - await hass.async_add_job(homekit.start) + await hass.async_add_executor_job(homekit.start) mock_add_acc.assert_called_with(state) mock_setup_msg.assert_called_with(hass, pin) @@ -273,7 +273,7 @@ async def test_homekit_start(hass, hk_driver, debounce_patcher): # Test start() if already started hk_driver_start.reset_mock() - await hass.async_add_job(homekit.start) + await hass.async_add_executor_job(homekit.start) assert not hk_driver_start.called @@ -283,16 +283,16 @@ async def test_homekit_stop(hass): homekit.driver = Mock() assert homekit.status == STATUS_READY - await hass.async_add_job(homekit.stop) + await hass.async_add_executor_job(homekit.stop) homekit.status = STATUS_WAIT - await hass.async_add_job(homekit.stop) + await hass.async_add_executor_job(homekit.stop) homekit.status = STATUS_STOPPED - await hass.async_add_job(homekit.stop) + await hass.async_add_executor_job(homekit.stop) assert homekit.driver.stop.called is False # Test if driver is started homekit.status = STATUS_RUNNING - await hass.async_add_job(homekit.stop) + await hass.async_add_executor_job(homekit.stop) assert homekit.driver.stop.called is True @@ -337,5 +337,5 @@ async def test_homekit_too_many_accessories(hass, hk_driver): with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn: - await hass.async_add_job(homekit.start) + await hass.async_add_executor_job(homekit.start) assert mock_warn.called is True diff --git a/tests/components/homekit/test_type_covers.py b/tests/components/homekit/test_type_covers.py index eb7429aa47ef..188a4ec99e35 100644 --- a/tests/components/homekit/test_type_covers.py +++ b/tests/components/homekit/test_type_covers.py @@ -57,7 +57,7 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = cls.garage(hass, hk_driver, "Garage Door", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 4 # GarageDoorOpener @@ -89,7 +89,7 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): call_close_cover = async_mock_service(hass, DOMAIN, "close_cover") call_open_cover = async_mock_service(hass, DOMAIN, "open_cover") - await hass.async_add_job(acc.char_target_state.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() assert call_close_cover assert call_close_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -101,14 +101,14 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_CLOSED) await hass.async_block_till_done() - await hass.async_add_job(acc.char_target_state.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() assert acc.char_current_state.value == 1 assert acc.char_target_state.value == 1 assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_state.client_update_value, 0) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() assert call_open_cover assert call_open_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -120,7 +120,7 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_OPEN) await hass.async_block_till_done() - await hass.async_add_job(acc.char_target_state.client_update_value, 0) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() assert acc.char_current_state.value == 0 assert acc.char_target_state.value == 0 @@ -135,7 +135,7 @@ async def test_window_set_cover_position(hass, hk_driver, cls, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = cls.window(hass, hk_driver, "Cover", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 14 # WindowCovering @@ -176,7 +176,7 @@ async def test_window_set_cover_position(hass, hk_driver, cls, events): # Set from HomeKit call_set_cover_position = async_mock_service(hass, DOMAIN, "set_cover_position") - await hass.async_add_job(acc.char_target_position.client_update_value, 25) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 25) await hass.async_block_till_done() assert call_set_cover_position[0] assert call_set_cover_position[0].data[ATTR_ENTITY_ID] == entity_id @@ -186,7 +186,7 @@ async def test_window_set_cover_position(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == 25 - await hass.async_add_job(acc.char_target_position.client_update_value, 75) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 75) await hass.async_block_till_done() assert call_set_cover_position[1] assert call_set_cover_position[1].data[ATTR_ENTITY_ID] == entity_id @@ -206,7 +206,7 @@ async def test_window_cover_set_tilt(hass, hk_driver, cls, events): ) await hass.async_block_till_done() acc = cls.window(hass, hk_driver, "Cover", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 14 # CATEGORY_WINDOW_COVERING @@ -242,7 +242,7 @@ async def test_window_cover_set_tilt(hass, hk_driver, cls, events): # HomeKit sets tilts between -90 and 90 (degrees), whereas # Homeassistant expects a % between 0 and 100. Keep that in mind # when comparing - await hass.async_add_job(acc.char_target_tilt.client_update_value, 90) + await hass.async_add_executor_job(acc.char_target_tilt.client_update_value, 90) await hass.async_block_till_done() assert call_set_tilt_position[0] assert call_set_tilt_position[0].data[ATTR_ENTITY_ID] == entity_id @@ -252,7 +252,7 @@ async def test_window_cover_set_tilt(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == 100 - await hass.async_add_job(acc.char_target_tilt.client_update_value, 45) + await hass.async_add_executor_job(acc.char_target_tilt.client_update_value, 45) await hass.async_block_till_done() assert call_set_tilt_position[1] assert call_set_tilt_position[1].data[ATTR_ENTITY_ID] == entity_id @@ -269,7 +269,7 @@ async def test_window_open_close(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_UNKNOWN, {ATTR_SUPPORTED_FEATURES: 0}) acc = cls.window_basic(hass, hk_driver, "Cover", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 14 # WindowCovering @@ -312,7 +312,7 @@ async def test_window_open_close(hass, hk_driver, cls, events): call_close_cover = async_mock_service(hass, DOMAIN, "close_cover") call_open_cover = async_mock_service(hass, DOMAIN, "open_cover") - await hass.async_add_job(acc.char_target_position.client_update_value, 25) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 25) await hass.async_block_till_done() assert call_close_cover assert call_close_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -322,7 +322,7 @@ async def test_window_open_close(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_position.client_update_value, 90) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 90) await hass.async_block_till_done() assert call_open_cover[0] assert call_open_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -332,7 +332,7 @@ async def test_window_open_close(hass, hk_driver, cls, events): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_position.client_update_value, 55) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 55) await hass.async_block_till_done() assert call_open_cover[1] assert call_open_cover[1].data[ATTR_ENTITY_ID] == entity_id @@ -351,14 +351,14 @@ async def test_window_open_close_stop(hass, hk_driver, cls, events): entity_id, STATE_UNKNOWN, {ATTR_SUPPORTED_FEATURES: SUPPORT_STOP} ) acc = cls.window_basic(hass, hk_driver, "Cover", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() # Set from HomeKit call_close_cover = async_mock_service(hass, DOMAIN, "close_cover") call_open_cover = async_mock_service(hass, DOMAIN, "open_cover") call_stop_cover = async_mock_service(hass, DOMAIN, "stop_cover") - await hass.async_add_job(acc.char_target_position.client_update_value, 25) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 25) await hass.async_block_till_done() assert call_close_cover assert call_close_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -368,7 +368,7 @@ async def test_window_open_close_stop(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_position.client_update_value, 90) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 90) await hass.async_block_till_done() assert call_open_cover assert call_open_cover[0].data[ATTR_ENTITY_ID] == entity_id @@ -378,7 +378,7 @@ async def test_window_open_close_stop(hass, hk_driver, cls, events): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_position.client_update_value, 55) + await hass.async_add_executor_job(acc.char_target_position.client_update_value, 55) await hass.async_block_till_done() assert call_stop_cover assert call_stop_cover[0].data[ATTR_ENTITY_ID] == entity_id diff --git a/tests/components/homekit/test_type_fans.py b/tests/components/homekit/test_type_fans.py index 9bcca3cc452e..8d51d5a7181a 100644 --- a/tests/components/homekit/test_type_fans.py +++ b/tests/components/homekit/test_type_fans.py @@ -62,7 +62,7 @@ async def test_fan_basic(hass, hk_driver, cls, events): # If there are no speed_list values, then HomeKit speed is unsupported assert acc.char_speed is None - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_active.value == 1 @@ -82,7 +82,7 @@ async def test_fan_basic(hass, hk_driver, cls, events): call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") - await hass.async_add_job(acc.char_active.client_update_value, 1) + await hass.async_add_executor_job(acc.char_active.client_update_value, 1) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id @@ -92,7 +92,7 @@ async def test_fan_basic(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_ON) await hass.async_block_till_done() - await hass.async_add_job(acc.char_active.client_update_value, 0) + await hass.async_add_executor_job(acc.char_active.client_update_value, 0) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id @@ -114,7 +114,7 @@ async def test_fan_direction(hass, hk_driver, cls, events): assert acc.char_direction.value == 0 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_direction.value == 0 @@ -125,7 +125,7 @@ async def test_fan_direction(hass, hk_driver, cls, events): # Set from HomeKit call_set_direction = async_mock_service(hass, DOMAIN, "set_direction") - await hass.async_add_job(acc.char_direction.client_update_value, 0) + await hass.async_add_executor_job(acc.char_direction.client_update_value, 0) await hass.async_block_till_done() assert call_set_direction[0] assert call_set_direction[0].data[ATTR_ENTITY_ID] == entity_id @@ -133,7 +133,7 @@ async def test_fan_direction(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == DIRECTION_FORWARD - await hass.async_add_job(acc.char_direction.client_update_value, 1) + await hass.async_add_executor_job(acc.char_direction.client_update_value, 1) await hass.async_block_till_done() assert call_set_direction[1] assert call_set_direction[1].data[ATTR_ENTITY_ID] == entity_id @@ -156,7 +156,7 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): assert acc.char_swing.value == 0 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_swing.value == 0 @@ -167,7 +167,7 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): # Set from HomeKit call_oscillate = async_mock_service(hass, DOMAIN, "oscillate") - await hass.async_add_job(acc.char_swing.client_update_value, 0) + await hass.async_add_executor_job(acc.char_swing.client_update_value, 0) await hass.async_block_till_done() assert call_oscillate[0] assert call_oscillate[0].data[ATTR_ENTITY_ID] == entity_id @@ -175,7 +175,7 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is False - await hass.async_add_job(acc.char_swing.client_update_value, 1) + await hass.async_add_executor_job(acc.char_swing.client_update_value, 1) await hass.async_block_till_done() assert call_oscillate[1] assert call_oscillate[1].data[ATTR_ENTITY_ID] == entity_id @@ -205,7 +205,7 @@ async def test_fan_speed(hass, hk_driver, cls, events): # speed to 100 when turning on a fan on a freshly booted up server. assert acc.char_speed.value != 0 - await hass.async_add_job(acc.run) + await acc.run_handler() assert ( acc.speed_mapping.speed_ranges == HomeKitSpeedMapping(speed_list).speed_ranges ) @@ -221,7 +221,7 @@ async def test_fan_speed(hass, hk_driver, cls, events): # Set from HomeKit call_set_speed = async_mock_service(hass, DOMAIN, "set_speed") - await hass.async_add_job(acc.char_speed.client_update_value, 42) + await hass.async_add_executor_job(acc.char_speed.client_update_value, 42) await hass.async_block_till_done() acc.speed_mapping.speed_to_states.assert_called_with(42) assert call_set_speed[0] diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index 3ee2e61cc722..ecfa2edbe544 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -68,7 +68,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): assert acc.category == 5 # Lightbulb assert acc.char_on.value == 0 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_on.value == 1 @@ -99,7 +99,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): "mock_addr", ) - await hass.async_add_job(acc.char_on.client_update_value, 1) + await hass.async_add_executor_job(acc.char_on.client_update_value, 1) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id @@ -143,7 +143,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] char_brightness_iid = acc.char_brightness.to_HAP()[HAP_REPR_IID] - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_brightness.value == 100 @@ -262,7 +262,7 @@ async def test_light_color_temperature(hass, hk_driver, cls, events, driver): assert acc.char_color_temperature.value == 153 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_color_temperature.value == 190 @@ -283,7 +283,9 @@ async def test_light_color_temperature(hass, hk_driver, cls, events, driver): }, "mock_addr", ) - await hass.async_add_job(acc.char_color_temperature.client_update_value, 250) + await hass.async_add_executor_job( + acc.char_color_temperature.client_update_value, 250 + ) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id @@ -327,7 +329,7 @@ async def test_light_rgb_color(hass, hk_driver, cls, events, driver): assert acc.char_hue.value == 0 assert acc.char_saturation.value == 75 - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_hue.value == 260 assert acc.char_saturation.value == 90 @@ -420,7 +422,7 @@ async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driv char_hue_iid = acc.char_hue.to_HAP()[HAP_REPR_IID] char_saturation_iid = acc.char_saturation.to_HAP()[HAP_REPR_IID] - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_brightness.value == 100 @@ -497,7 +499,7 @@ async def test_light_set_brightness_and_color_temp( char_brightness_iid = acc.char_brightness.to_HAP()[HAP_REPR_IID] char_color_temperature_iid = acc.char_color_temperature.to_HAP()[HAP_REPR_IID] - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_brightness.value == 100 diff --git a/tests/components/homekit/test_type_locks.py b/tests/components/homekit/test_type_locks.py index 13f7c8db74c8..7899af36995b 100644 --- a/tests/components/homekit/test_type_locks.py +++ b/tests/components/homekit/test_type_locks.py @@ -24,7 +24,7 @@ async def test_lock_unlock(hass, hk_driver, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = Lock(hass, hk_driver, "Lock", entity_id, 2, config) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 6 # DoorLock @@ -56,7 +56,7 @@ async def test_lock_unlock(hass, hk_driver, events): call_lock = async_mock_service(hass, DOMAIN, "lock") call_unlock = async_mock_service(hass, DOMAIN, "unlock") - await hass.async_add_job(acc.char_target_state.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() assert call_lock assert call_lock[0].data[ATTR_ENTITY_ID] == entity_id @@ -65,7 +65,7 @@ async def test_lock_unlock(hass, hk_driver, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_state.client_update_value, 0) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() assert call_unlock assert call_unlock[0].data[ATTR_ENTITY_ID] == entity_id @@ -87,7 +87,7 @@ async def test_no_code(hass, hk_driver, config, events): # Set from HomeKit call_lock = async_mock_service(hass, DOMAIN, "lock") - await hass.async_add_job(acc.char_target_state.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() assert call_lock assert call_lock[0].data[ATTR_ENTITY_ID] == entity_id diff --git a/tests/components/homekit/test_type_media_players.py b/tests/components/homekit/test_type_media_players.py index 1fcc3dde40fb..7248b73afc8e 100644 --- a/tests/components/homekit/test_type_media_players.py +++ b/tests/components/homekit/test_type_media_players.py @@ -57,7 +57,7 @@ async def test_media_player_set_state(hass, hk_driver, events): ) await hass.async_block_till_done() acc = MediaPlayer(hass, hk_driver, "MediaPlayer", entity_id, 2, config) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 8 # Switch @@ -105,49 +105,63 @@ async def test_media_player_set_state(hass, hk_driver, events): call_media_stop = async_mock_service(hass, DOMAIN, "media_stop") call_toggle_mute = async_mock_service(hass, DOMAIN, "volume_mute") - await hass.async_add_job(acc.chars[FEATURE_ON_OFF].client_update_value, True) + await hass.async_add_executor_job( + acc.chars[FEATURE_ON_OFF].client_update_value, True + ) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_ON_OFF].client_update_value, False) + await hass.async_add_executor_job( + acc.chars[FEATURE_ON_OFF].client_update_value, False + ) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_PLAY_PAUSE].client_update_value, True) + await hass.async_add_executor_job( + acc.chars[FEATURE_PLAY_PAUSE].client_update_value, True + ) await hass.async_block_till_done() assert call_media_play assert call_media_play[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 3 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_PLAY_PAUSE].client_update_value, False) + await hass.async_add_executor_job( + acc.chars[FEATURE_PLAY_PAUSE].client_update_value, False + ) await hass.async_block_till_done() assert call_media_pause assert call_media_pause[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 4 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_PLAY_STOP].client_update_value, True) + await hass.async_add_executor_job( + acc.chars[FEATURE_PLAY_STOP].client_update_value, True + ) await hass.async_block_till_done() assert call_media_play assert call_media_play[1].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 5 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_PLAY_STOP].client_update_value, False) + await hass.async_add_executor_job( + acc.chars[FEATURE_PLAY_STOP].client_update_value, False + ) await hass.async_block_till_done() assert call_media_stop assert call_media_stop[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 6 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_TOGGLE_MUTE].client_update_value, True) + await hass.async_add_executor_job( + acc.chars[FEATURE_TOGGLE_MUTE].client_update_value, True + ) await hass.async_block_till_done() assert call_toggle_mute assert call_toggle_mute[0].data[ATTR_ENTITY_ID] == entity_id @@ -155,7 +169,9 @@ async def test_media_player_set_state(hass, hk_driver, events): assert len(events) == 7 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.chars[FEATURE_TOGGLE_MUTE].client_update_value, False) + await hass.async_add_executor_job( + acc.chars[FEATURE_TOGGLE_MUTE].client_update_value, False + ) await hass.async_block_till_done() assert call_toggle_mute assert call_toggle_mute[1].data[ATTR_ENTITY_ID] == entity_id @@ -182,7 +198,7 @@ async def test_media_player_television(hass, hk_driver, events, caplog): ) await hass.async_block_till_done() acc = TelevisionMediaPlayer(hass, hk_driver, "MediaPlayer", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 31 # Television @@ -226,21 +242,21 @@ async def test_media_player_television(hass, hk_driver, events, caplog): call_volume_down = async_mock_service(hass, DOMAIN, "volume_down") call_volume_set = async_mock_service(hass, DOMAIN, "volume_set") - await hass.async_add_job(acc.char_active.client_update_value, 1) + await hass.async_add_executor_job(acc.char_active.client_update_value, 1) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_active.client_update_value, 0) + await hass.async_add_executor_job(acc.char_active.client_update_value, 0) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_remote_key.client_update_value, 11) + await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 11) await hass.async_block_till_done() assert call_media_play_pause assert call_media_play_pause[0].data[ATTR_ENTITY_ID] == entity_id @@ -249,28 +265,28 @@ async def test_media_player_television(hass, hk_driver, events, caplog): hass.states.async_set(entity_id, STATE_PLAYING) await hass.async_block_till_done() - await hass.async_add_job(acc.char_remote_key.client_update_value, 11) + await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 11) await hass.async_block_till_done() assert call_media_pause assert call_media_pause[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 4 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_remote_key.client_update_value, 10) + await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 10) await hass.async_block_till_done() assert len(events) == 4 assert events[-1].data[ATTR_VALUE] is None hass.states.async_set(entity_id, STATE_PAUSED) await hass.async_block_till_done() - await hass.async_add_job(acc.char_remote_key.client_update_value, 11) + await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 11) await hass.async_block_till_done() assert call_media_play assert call_media_play[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 5 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_mute.client_update_value, True) + await hass.async_add_executor_job(acc.char_mute.client_update_value, True) await hass.async_block_till_done() assert call_toggle_mute assert call_toggle_mute[0].data[ATTR_ENTITY_ID] == entity_id @@ -278,7 +294,7 @@ async def test_media_player_television(hass, hk_driver, events, caplog): assert len(events) == 6 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_mute.client_update_value, False) + await hass.async_add_executor_job(acc.char_mute.client_update_value, False) await hass.async_block_till_done() assert call_toggle_mute assert call_toggle_mute[1].data[ATTR_ENTITY_ID] == entity_id @@ -286,7 +302,7 @@ async def test_media_player_television(hass, hk_driver, events, caplog): assert len(events) == 7 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_input_source.client_update_value, 1) + await hass.async_add_executor_job(acc.char_input_source.client_update_value, 1) await hass.async_block_till_done() assert call_select_source assert call_select_source[0].data[ATTR_ENTITY_ID] == entity_id @@ -294,21 +310,21 @@ async def test_media_player_television(hass, hk_driver, events, caplog): assert len(events) == 8 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_volume_selector.client_update_value, 0) + await hass.async_add_executor_job(acc.char_volume_selector.client_update_value, 0) await hass.async_block_till_done() assert call_volume_up assert call_volume_up[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 9 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_volume_selector.client_update_value, 1) + await hass.async_add_executor_job(acc.char_volume_selector.client_update_value, 1) await hass.async_block_till_done() assert call_volume_down assert call_volume_down[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 10 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_volume.client_update_value, 20) + await hass.async_add_executor_job(acc.char_volume.client_update_value, 20) await hass.async_block_till_done() assert call_volume_set[0] assert call_volume_set[0].data[ATTR_ENTITY_ID] == entity_id @@ -329,7 +345,7 @@ async def test_media_player_television_basic(hass, hk_driver, events, caplog): ) await hass.async_block_till_done() acc = TelevisionMediaPlayer(hass, hk_driver, "MediaPlayer", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.chars_tv == [] assert acc.chars_speaker == [] diff --git a/tests/components/homekit/test_type_security_systems.py b/tests/components/homekit/test_type_security_systems.py index bf77d27cbf7a..690cd8f318ff 100644 --- a/tests/components/homekit/test_type_security_systems.py +++ b/tests/components/homekit/test_type_security_systems.py @@ -27,7 +27,7 @@ async def test_switch_set_state(hass, hk_driver, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = SecuritySystem(hass, hk_driver, "SecuritySystem", entity_id, 2, config) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 11 # AlarmSystem @@ -71,7 +71,7 @@ async def test_switch_set_state(hass, hk_driver, events): call_arm_night = async_mock_service(hass, DOMAIN, "alarm_arm_night") call_disarm = async_mock_service(hass, DOMAIN, "alarm_disarm") - await hass.async_add_job(acc.char_target_state.client_update_value, 0) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() assert call_arm_home assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id @@ -80,7 +80,7 @@ async def test_switch_set_state(hass, hk_driver, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_state.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() assert call_arm_away assert call_arm_away[0].data[ATTR_ENTITY_ID] == entity_id @@ -89,7 +89,7 @@ async def test_switch_set_state(hass, hk_driver, events): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_state.client_update_value, 2) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 2) await hass.async_block_till_done() assert call_arm_night assert call_arm_night[0].data[ATTR_ENTITY_ID] == entity_id @@ -98,7 +98,7 @@ async def test_switch_set_state(hass, hk_driver, events): assert len(events) == 3 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_target_state.client_update_value, 3) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 3) await hass.async_block_till_done() assert call_disarm assert call_disarm[0].data[ATTR_ENTITY_ID] == entity_id @@ -120,7 +120,7 @@ async def test_no_alarm_code(hass, hk_driver, config, events): # Set from HomeKit call_arm_home = async_mock_service(hass, DOMAIN, "alarm_arm_home") - await hass.async_add_job(acc.char_target_state.client_update_value, 0) + await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() assert call_arm_home assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index 79d807b77c52..b6bab174962d 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -39,7 +39,7 @@ async def test_temperature(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = TemperatureSensor(hass, hk_driver, "Temperature", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -72,7 +72,7 @@ async def test_humidity(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = HumiditySensor(hass, hk_driver, "Humidity", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -95,7 +95,7 @@ async def test_air_quality(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = AirQualitySensor(hass, hk_driver, "Air Quality", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -126,7 +126,7 @@ async def test_co(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = CarbonMonoxideSensor(hass, hk_driver, "CO", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -165,7 +165,7 @@ async def test_co2(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = CarbonDioxideSensor(hass, hk_driver, "CO2", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -204,7 +204,7 @@ async def test_light(hass, hk_driver): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = LightSensor(hass, hk_driver, "Light", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor @@ -228,7 +228,7 @@ async def test_binary(hass, hk_driver): await hass.async_block_till_done() acc = BinarySensor(hass, hk_driver, "Window Opening", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() assert acc.aid == 2 assert acc.category == 10 # Sensor diff --git a/tests/components/homekit/test_type_switches.py b/tests/components/homekit/test_type_switches.py index aee61ccf2e78..1a24c883c046 100644 --- a/tests/components/homekit/test_type_switches.py +++ b/tests/components/homekit/test_type_switches.py @@ -26,7 +26,7 @@ async def test_outlet_set_state(hass, hk_driver, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = Outlet(hass, hk_driver, "Outlet", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.aid == 2 @@ -47,14 +47,14 @@ async def test_outlet_set_state(hass, hk_driver, events): call_turn_on = async_mock_service(hass, "switch", "turn_on") call_turn_off = async_mock_service(hass, "switch", "turn_off") - await hass.async_add_job(acc.char_on.client_update_value, True) + await hass.async_add_executor_job(acc.char_on.client_update_value, True) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_on.client_update_value, False) + await hass.async_add_executor_job(acc.char_on.client_update_value, False) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id @@ -79,7 +79,7 @@ async def test_switch_set_state(hass, hk_driver, entity_id, attrs, events): hass.states.async_set(entity_id, None, attrs) await hass.async_block_till_done() acc = Switch(hass, hk_driver, "Switch", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.aid == 2 @@ -100,14 +100,14 @@ async def test_switch_set_state(hass, hk_driver, entity_id, attrs, events): call_turn_on = async_mock_service(hass, domain, "turn_on") call_turn_off = async_mock_service(hass, domain, "turn_off") - await hass.async_add_job(acc.char_on.client_update_value, True) + await hass.async_add_executor_job(acc.char_on.client_update_value, True) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_on.client_update_value, False) + await hass.async_add_executor_job(acc.char_on.client_update_value, False) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id @@ -123,25 +123,25 @@ async def test_valve_set_state(hass, hk_driver, events): await hass.async_block_till_done() acc = Valve(hass, hk_driver, "Valve", entity_id, 2, {CONF_TYPE: TYPE_FAUCET}) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.category == 29 # Faucet assert acc.char_valve_type.value == 3 # Water faucet acc = Valve(hass, hk_driver, "Valve", entity_id, 2, {CONF_TYPE: TYPE_SHOWER}) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.category == 30 # Shower assert acc.char_valve_type.value == 2 # Shower head acc = Valve(hass, hk_driver, "Valve", entity_id, 2, {CONF_TYPE: TYPE_SPRINKLER}) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.category == 28 # Sprinkler assert acc.char_valve_type.value == 1 # Irrigation acc = Valve(hass, hk_driver, "Valve", entity_id, 2, {CONF_TYPE: TYPE_VALVE}) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.aid == 2 @@ -165,7 +165,7 @@ async def test_valve_set_state(hass, hk_driver, events): call_turn_on = async_mock_service(hass, "switch", "turn_on") call_turn_off = async_mock_service(hass, "switch", "turn_off") - await hass.async_add_job(acc.char_active.client_update_value, True) + await hass.async_add_executor_job(acc.char_active.client_update_value, True) await hass.async_block_till_done() assert acc.char_in_use.value is True assert call_turn_on @@ -173,7 +173,7 @@ async def test_valve_set_state(hass, hk_driver, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_job(acc.char_active.client_update_value, False) + await hass.async_add_executor_job(acc.char_active.client_update_value, False) await hass.async_block_till_done() assert acc.char_in_use.value is False assert call_turn_off @@ -197,7 +197,7 @@ async def test_reset_switch(hass, hk_driver, entity_id, attrs, events): hass.states.async_set(entity_id, None, attrs) await hass.async_block_till_done() acc = Switch(hass, hk_driver, "Switch", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.activate_only is True @@ -206,7 +206,7 @@ async def test_reset_switch(hass, hk_driver, entity_id, attrs, events): call_turn_on = async_mock_service(hass, domain, "turn_on") call_turn_off = async_mock_service(hass, domain, "turn_off") - await hass.async_add_job(acc.char_on.client_update_value, True) + await hass.async_add_executor_job(acc.char_on.client_update_value, True) await hass.async_block_till_done() assert acc.char_on.value is True assert call_turn_on @@ -221,7 +221,7 @@ async def test_reset_switch(hass, hk_driver, entity_id, attrs, events): assert len(events) == 1 assert not call_turn_off - await hass.async_add_job(acc.char_on.client_update_value, False) + await hass.async_add_executor_job(acc.char_on.client_update_value, False) await hass.async_block_till_done() assert acc.char_on.value is False assert len(events) == 1 @@ -234,7 +234,7 @@ async def test_reset_switch_reload(hass, hk_driver, events): hass.states.async_set(entity_id, None) await hass.async_block_till_done() acc = Switch(hass, hk_driver, "Switch", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.activate_only is True diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index a6ab2fa7cf3a..e974b6d4811d 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -91,7 +91,7 @@ async def test_thermostat(hass, hk_driver, cls, events): ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.aid == 2 @@ -272,7 +272,7 @@ async def test_thermostat(hass, hk_driver, cls, events): call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") - await hass.async_add_job(acc.char_target_temp.client_update_value, 19.0) + await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 19.0) await hass.async_block_till_done() assert call_set_temperature assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id @@ -281,7 +281,7 @@ async def test_thermostat(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "19.0°C" - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 2) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -290,7 +290,7 @@ async def test_thermostat(hass, hk_driver, cls, events): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] == HVAC_MODE_COOL - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 3) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[1].data[ATTR_ENTITY_ID] == entity_id @@ -308,7 +308,7 @@ async def test_thermostat_auto(hass, hk_driver, cls, events): hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 6}) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_cooling_thresh_temp.value == 23.0 @@ -378,7 +378,9 @@ async def test_thermostat_auto(hass, hk_driver, cls, events): # Set from HomeKit call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") - await hass.async_add_job(acc.char_heating_thresh_temp.client_update_value, 20.0) + await hass.async_add_executor_job( + acc.char_heating_thresh_temp.client_update_value, 20.0 + ) await hass.async_block_till_done() assert call_set_temperature[0] assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id @@ -387,7 +389,9 @@ async def test_thermostat_auto(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "heating threshold 20.0°C" - await hass.async_add_job(acc.char_cooling_thresh_temp.client_update_value, 25.0) + await hass.async_add_executor_job( + acc.char_cooling_thresh_temp.client_update_value, 25.0 + ) await hass.async_block_till_done() assert call_set_temperature[1] assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id @@ -405,7 +409,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events): hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 4}) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_target_humidity.value == 50 @@ -430,7 +434,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events): # Set from HomeKit call_set_humidity = async_mock_service(hass, DOMAIN_CLIMATE, "set_humidity") - await hass.async_add_job(acc.char_target_humidity.client_update_value, 35) + await hass.async_add_executor_job(acc.char_target_humidity.client_update_value, 35) await hass.async_block_till_done() assert call_set_humidity[0] assert call_set_humidity[0].data[ATTR_ENTITY_ID] == entity_id @@ -457,7 +461,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_current_heat_cool.value == 1 @@ -492,7 +496,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): # Set from HomeKit call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 1) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 1) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -501,7 +505,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == HVAC_MODE_HEAT - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 0) + 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 == 0 assert len(events) == 2 @@ -517,7 +521,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): await hass.async_block_till_done() with patch.object(hass.config.units, CONF_TEMPERATURE_UNIT, new=TEMP_FAHRENHEIT): acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hass.states.async_set( @@ -541,7 +545,9 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): # Set from HomeKit call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") - await hass.async_add_job(acc.char_cooling_thresh_temp.client_update_value, 23) + await hass.async_add_executor_job( + acc.char_cooling_thresh_temp.client_update_value, 23 + ) await hass.async_block_till_done() assert call_set_temperature[0] assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id @@ -550,7 +556,9 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "cooling threshold 73.5°F" - await hass.async_add_job(acc.char_heating_thresh_temp.client_update_value, 22) + await hass.async_add_executor_job( + acc.char_heating_thresh_temp.client_update_value, 22 + ) await hass.async_block_till_done() assert call_set_temperature[1] assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id @@ -559,7 +567,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] == "heating threshold 71.5°F" - await hass.async_add_job(acc.char_target_temp.client_update_value, 24.0) + await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 24.0) await hass.async_block_till_done() assert call_set_temperature[2] assert call_set_temperature[2].data[ATTR_ENTITY_ID] == entity_id @@ -597,7 +605,7 @@ async def test_thermostat_temperature_step_whole(hass, hk_driver, cls): hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_TARGET_TEMP_STEP: 1}) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.char_target_temp.properties[PROP_MIN_STEP] == 0.1 @@ -658,23 +666,23 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls): await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 1] assert acc.char_target_heat_cool.value == 0 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 0 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 1) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 2) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 @@ -699,26 +707,26 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 1, 3] assert acc.char_target_heat_cool.value == 3 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 3 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 1) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 2) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 3) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -739,26 +747,26 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 1, 3] assert acc.char_target_heat_cool.value == 3 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 3 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 1) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 2) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 3) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -776,23 +784,23 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 3] assert acc.char_target_heat_cool.value == 3 - await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 3 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 1) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 3 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 2) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 3 @@ -804,7 +812,7 @@ async def test_water_heater(hass, hk_driver, cls, events): hass.states.async_set(entity_id, HVAC_MODE_HEAT) await hass.async_block_till_done() acc = cls.water_heater(hass, hk_driver, "WaterHeater", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() assert acc.aid == 2 @@ -848,7 +856,7 @@ async def test_water_heater(hass, hk_driver, cls, events): hass, DOMAIN_WATER_HEATER, "set_temperature" ) - await hass.async_add_job(acc.char_target_temp.client_update_value, 52.0) + await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 52.0) await hass.async_block_till_done() assert call_set_temperature assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id @@ -857,16 +865,16 @@ async def test_water_heater(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "52.0°C" - await hass.async_add_job(acc.char_target_heat_cool.client_update_value, 0) + 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_job(acc.char_target_heat_cool.client_update_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 2) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 with pytest.raises(ValueError): - await hass.async_add_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 @@ -879,7 +887,7 @@ async def test_water_heater_fahrenheit(hass, hk_driver, cls, events): await hass.async_block_till_done() with patch.object(hass.config.units, CONF_TEMPERATURE_UNIT, new=TEMP_FAHRENHEIT): acc = cls.water_heater(hass, hk_driver, "WaterHeater", entity_id, 2, None) - await hass.async_add_job(acc.run) + await acc.run_handler() await hass.async_block_till_done() hass.states.async_set(entity_id, HVAC_MODE_HEAT, {ATTR_TEMPERATURE: 131}) @@ -893,7 +901,7 @@ async def test_water_heater_fahrenheit(hass, hk_driver, cls, events): hass, DOMAIN_WATER_HEATER, "set_temperature" ) - await hass.async_add_job(acc.char_target_temp.client_update_value, 60) + await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 60) await hass.async_block_till_done() assert call_set_temperature assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id diff --git a/tests/components/homekit/test_util.py b/tests/components/homekit/test_util.py index 8898f988f9a3..48764d1ca05e 100644 --- a/tests/components/homekit/test_util.py +++ b/tests/components/homekit/test_util.py @@ -199,7 +199,7 @@ async def test_show_setup_msg(hass): call_create_notification = async_mock_service(hass, DOMAIN, "create") - await hass.async_add_job(show_setup_message, hass, pincode) + await hass.async_add_executor_job(show_setup_message, hass, pincode) await hass.async_block_till_done() assert call_create_notification @@ -211,7 +211,7 @@ async def test_dismiss_setup_msg(hass): """Test dismiss setup message.""" call_dismiss_notification = async_mock_service(hass, DOMAIN, "dismiss") - await hass.async_add_job(dismiss_setup_message, hass) + await hass.async_add_executor_job(dismiss_setup_message, hass) await hass.async_block_till_done() assert call_dismiss_notification From f53dfc4308e43d2f948fba45e23801b8d773abef Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sun, 5 Apr 2020 23:36:23 -0600 Subject: [PATCH 161/653] =?UTF-8?q?Don't=20reinvent=20callback=20handler?= =?UTF-8?q?=20removal=20logic=20in=20several=20integ=E2=80=A6=20(#33726)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homeassistant/components/airvisual/sensor.py | 11 +---------- .../components/ambient_station/__init__.py | 13 ++++--------- homeassistant/components/flunearyou/sensor.py | 11 +---------- homeassistant/components/iqvia/__init__.py | 9 ++------- homeassistant/components/notion/__init__.py | 11 ++--------- homeassistant/components/openuv/__init__.py | 11 +---------- homeassistant/components/rainmachine/__init__.py | 7 ------- .../components/rainmachine/binary_sensor.py | 2 +- homeassistant/components/rainmachine/sensor.py | 2 +- homeassistant/components/rainmachine/switch.py | 6 +++--- 10 files changed, 16 insertions(+), 67 deletions(-) diff --git a/homeassistant/components/airvisual/sensor.py b/homeassistant/components/airvisual/sensor.py index 49a5f53361f7..20e76bf86b67 100644 --- a/homeassistant/components/airvisual/sensor.py +++ b/homeassistant/components/airvisual/sensor.py @@ -95,7 +95,6 @@ class AirVisualSensor(Entity): def __init__(self, airvisual, kind, name, icon, unit, locale, geography_id): """Initialize.""" self._airvisual = airvisual - self._async_unsub_dispatcher_connects = [] self._geography_id = geography_id self._icon = icon self._kind = kind @@ -159,9 +158,7 @@ class AirVisualSensor(Entity): """Update the state.""" self.async_schedule_update_ha_state(True) - self._async_unsub_dispatcher_connects.append( - async_dispatcher_connect(self.hass, TOPIC_UPDATE, update) - ) + self.async_on_remove(async_dispatcher_connect(self.hass, TOPIC_UPDATE, update)) async def async_update(self): """Update the sensor.""" @@ -206,9 +203,3 @@ class AirVisualSensor(Entity): self._attrs["long"] = self._airvisual.geography_data[CONF_LONGITUDE] self._attrs.pop(ATTR_LATITUDE, None) self._attrs.pop(ATTR_LONGITUDE, None) - - async def async_will_remove_from_hass(self) -> None: - """Disconnect dispatcher listener when removed.""" - for cancel in self._async_unsub_dispatcher_connects: - cancel() - self._async_unsub_dispatcher_connects = [] diff --git a/homeassistant/components/ambient_station/__init__.py b/homeassistant/components/ambient_station/__init__.py index f3f2397d214c..66a22d44366e 100644 --- a/homeassistant/components/ambient_station/__init__.py +++ b/homeassistant/components/ambient_station/__init__.py @@ -437,7 +437,6 @@ class AmbientWeatherEntity(Entity): """Initialize the sensor.""" self._ambient = ambient self._device_class = device_class - self._async_unsub_dispatcher_connect = None self._mac_address = mac_address self._sensor_name = sensor_name self._sensor_type = sensor_type @@ -503,18 +502,14 @@ class AmbientWeatherEntity(Entity): self.update_from_latest_data() self.async_write_ha_state() - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, f"ambient_station_data_update_{self._mac_address}", update + self.async_on_remove( + async_dispatcher_connect( + self.hass, f"ambient_station_data_update_{self._mac_address}", update + ) ) self.update_from_latest_data() - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() - self._async_unsub_dispatcher_connect = None - @callback def update_from_latest_data(self): """Update the entity from the latest data.""" diff --git a/homeassistant/components/flunearyou/sensor.py b/homeassistant/components/flunearyou/sensor.py index 6868d21ce1fc..22c56c100389 100644 --- a/homeassistant/components/flunearyou/sensor.py +++ b/homeassistant/components/flunearyou/sensor.py @@ -56,7 +56,6 @@ class FluNearYouSensor(Entity): def __init__(self, fny, sensor_type, name, category, icon, unit): """Initialize the sensor.""" - self._async_unsub_dispatcher_connect = None self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._category = category self._fny = fny @@ -110,20 +109,12 @@ class FluNearYouSensor(Entity): self.update_from_latest_data() self.async_write_ha_state() - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, TOPIC_UPDATE, update - ) - + self.async_on_remove(async_dispatcher_connect(self.hass, TOPIC_UPDATE, update)) await self._fny.async_register_api_interest(self._sensor_type) - self.update_from_latest_data() async def async_will_remove_from_hass(self) -> None: """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() - self._async_unsub_dispatcher_connect = None - self._fny.async_deregister_api_interest(self._sensor_type) @callback diff --git a/homeassistant/components/iqvia/__init__.py b/homeassistant/components/iqvia/__init__.py index 1f487dd345c7..cd75e88bb44b 100644 --- a/homeassistant/components/iqvia/__init__.py +++ b/homeassistant/components/iqvia/__init__.py @@ -239,7 +239,6 @@ class IQVIAEntity(Entity): def __init__(self, iqvia, sensor_type, name, icon, zip_code): """Initialize the sensor.""" - self._async_unsub_dispatcher_connect = None self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._icon = icon self._iqvia = iqvia @@ -301,8 +300,8 @@ class IQVIAEntity(Entity): self.update_from_latest_data() self.async_write_ha_state() - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, TOPIC_DATA_UPDATE, update + self.async_on_remove( + async_dispatcher_connect(self.hass, TOPIC_DATA_UPDATE, update) ) await self._iqvia.async_register_api_interest(self._type) @@ -315,10 +314,6 @@ class IQVIAEntity(Entity): async def async_will_remove_from_hass(self): """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() - self._async_unsub_dispatcher_connect = None - self._iqvia.async_deregister_api_interest(self._type) if self._type == TYPE_ALLERGY_FORECAST: # Entities that lose interest in allergy forecast data should also lose diff --git a/homeassistant/components/notion/__init__.py b/homeassistant/components/notion/__init__.py index d608199f6fc0..b06ba768765f 100644 --- a/homeassistant/components/notion/__init__.py +++ b/homeassistant/components/notion/__init__.py @@ -211,7 +211,6 @@ class NotionEntity(Entity): self, notion, task_id, sensor_id, bridge_id, system_id, name, device_class ): """Initialize the entity.""" - self._async_unsub_dispatcher_connect = None self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._bridge_id = bridge_id self._device_class = device_class @@ -309,18 +308,12 @@ class NotionEntity(Entity): self.update_from_latest_data() self.async_write_ha_state() - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, TOPIC_DATA_UPDATE, update + self.async_on_remove( + async_dispatcher_connect(self.hass, TOPIC_DATA_UPDATE, update) ) self.update_from_latest_data() - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() - self._async_unsub_dispatcher_connect = None - @callback def update_from_latest_data(self): """Update the entity from the latest data.""" diff --git a/homeassistant/components/openuv/__init__.py b/homeassistant/components/openuv/__init__.py index df4ff9735c34..ee8e5f0b8ee4 100644 --- a/homeassistant/components/openuv/__init__.py +++ b/homeassistant/components/openuv/__init__.py @@ -233,7 +233,6 @@ class OpenUvEntity(Entity): def __init__(self, openuv): """Initialize.""" - self._async_unsub_dispatcher_connect = None self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._available = True self._name = None @@ -263,18 +262,10 @@ class OpenUvEntity(Entity): self.update_from_latest_data() self.async_write_ha_state() - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, TOPIC_UPDATE, update - ) + self.async_on_remove(async_dispatcher_connect(self.hass, TOPIC_UPDATE, update)) self.update_from_latest_data() - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() - self._async_unsub_dispatcher_connect = None - def update_from_latest_data(self): """Update the sensor using the latest data.""" raise NotImplementedError diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index 03dc49d74756..e1054f296d0b 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -410,7 +410,6 @@ class RainMachineEntity(Entity): """Initialize.""" self._attrs = {ATTR_ATTRIBUTION: DEFAULT_ATTRIBUTION} self._device_class = None - self._dispatcher_handlers = [] self._name = None self.rainmachine = rainmachine @@ -454,12 +453,6 @@ class RainMachineEntity(Entity): self.update_from_latest_data() self.async_write_ha_state() - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listener when removed.""" - for handler in self._dispatcher_handlers: - handler() - self._dispatcher_handlers = [] - @callback def update_from_latest_data(self): """Update the entity.""" diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 40802af2bfad..e5fdc8d6b46f 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -126,7 +126,7 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice): async def async_added_to_hass(self): """Register callbacks.""" - self._dispatcher_handlers.append( + self.async_on_remove( async_dispatcher_connect(self.hass, SENSOR_UPDATE_TOPIC, self._update_state) ) await self.rainmachine.async_register_sensor_api_interest(self._api_category) diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 287ce29a3cc3..4d48b0cd0498 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -143,7 +143,7 @@ class RainMachineSensor(RainMachineEntity): async def async_added_to_hass(self): """Register callbacks.""" - self._dispatcher_handlers.append( + self.async_on_remove( async_dispatcher_connect(self.hass, SENSOR_UPDATE_TOPIC, self._update_state) ) await self.rainmachine.async_register_sensor_api_interest(self._api_category) diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index fd36e23cb0e5..b93f607f8534 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -188,7 +188,7 @@ class RainMachineProgram(RainMachineSwitch): async def async_added_to_hass(self): """Register callbacks.""" - self._dispatcher_handlers.append( + self.async_on_remove( async_dispatcher_connect( self.hass, PROGRAM_UPDATE_TOPIC, self._update_state ) @@ -248,12 +248,12 @@ class RainMachineZone(RainMachineSwitch): async def async_added_to_hass(self): """Register callbacks.""" - self._dispatcher_handlers.append( + self.async_on_remove( async_dispatcher_connect( self.hass, PROGRAM_UPDATE_TOPIC, self._update_state ) ) - self._dispatcher_handlers.append( + self.async_on_remove( async_dispatcher_connect(self.hass, ZONE_UPDATE_TOPIC, self._update_state) ) From ffa111deb9d2d543b1f6d763519c4bdf0706247f Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Mon, 6 Apr 2020 12:21:52 +0300 Subject: [PATCH 162/653] Fix exceptions in tests for samsung_tv (#33732) --- .../components/samsungtv/test_config_flow.py | 3 +++ .../components/samsungtv/test_media_player.py | 17 ++++--------- tests/ignore_uncaught_exceptions.py | 24 ------------------- 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/tests/components/samsungtv/test_config_flow.py b/tests/components/samsungtv/test_config_flow.py index 65807602f09f..4e5a02588b1b 100644 --- a/tests/components/samsungtv/test_config_flow.py +++ b/tests/components/samsungtv/test_config_flow.py @@ -76,6 +76,7 @@ def remote_fixture(): remote_class.return_value = remote socket = mock.Mock() socket_class.return_value = socket + socket_class.gethostbyname.return_value = "FAKE_IP_ADDRESS" yield remote @@ -91,8 +92,10 @@ def remotews_fixture(): remotews.__enter__ = mock.Mock() remotews.__exit__ = mock.Mock() remotews_class.return_value = remotews + remotews_class().__enter__().token = "FAKE_TOKEN" socket = mock.Mock() socket_class.return_value = socket + socket_class.gethostbyname.return_value = "FAKE_IP_ADDRESS" yield remotews diff --git a/tests/components/samsungtv/test_media_player.py b/tests/components/samsungtv/test_media_player.py index b7881d2ddaa4..c549e57a06ea 100644 --- a/tests/components/samsungtv/test_media_player.py +++ b/tests/components/samsungtv/test_media_player.py @@ -143,6 +143,7 @@ def remotews_fixture(): remote.__enter__ = mock.Mock() remote.__exit__ = mock.Mock() remote_class.return_value = remote + remote_class().__enter__().token = "FAKE_TOKEN" socket1.gethostbyname.return_value = "FAKE_IP_ADDRESS" socket2.gethostbyname.return_value = "FAKE_IP_ADDRESS" yield remote @@ -648,9 +649,7 @@ async def test_play_media(hass, remote): async def test_play_media_invalid_type(hass, remote): """Test for play_media with invalid media type.""" - with patch("homeassistant.components.samsungtv.bridge.Remote") as remote, patch( - "homeassistant.components.samsungtv.config_flow.socket" - ): + with patch("homeassistant.components.samsungtv.bridge.Remote") as remote: url = "https://example.com" await setup_samsungtv(hass, MOCK_CONFIG) remote.reset_mock() @@ -672,9 +671,7 @@ async def test_play_media_invalid_type(hass, remote): async def test_play_media_channel_as_string(hass, remote): """Test for play_media with invalid channel as string.""" - with patch("homeassistant.components.samsungtv.bridge.Remote") as remote, patch( - "homeassistant.components.samsungtv.config_flow.socket" - ): + with patch("homeassistant.components.samsungtv.bridge.Remote") as remote: url = "https://example.com" await setup_samsungtv(hass, MOCK_CONFIG) remote.reset_mock() @@ -696,9 +693,7 @@ async def test_play_media_channel_as_string(hass, remote): async def test_play_media_channel_as_non_positive(hass, remote): """Test for play_media with invalid channel as non positive integer.""" - with patch("homeassistant.components.samsungtv.bridge.Remote") as remote, patch( - "homeassistant.components.samsungtv.config_flow.socket" - ): + with patch("homeassistant.components.samsungtv.bridge.Remote") as remote: await setup_samsungtv(hass, MOCK_CONFIG) remote.reset_mock() assert await hass.services.async_call( @@ -735,9 +730,7 @@ async def test_select_source(hass, remote): async def test_select_source_invalid_source(hass, remote): """Test for select_source with invalid source.""" - with patch("homeassistant.components.samsungtv.bridge.Remote") as remote, patch( - "homeassistant.components.samsungtv.config_flow.socket" - ): + with patch("homeassistant.components.samsungtv.bridge.Remote") as remote: await setup_samsungtv(hass, MOCK_CONFIG) remote.reset_mock() assert await hass.services.async_call( diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 65ace96917d0..64710242132b 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -44,7 +44,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), ("tests.components.qwikswitch.test_init", "test_sensor_device"), ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), - ("tests.components.samsungtv.test_media_player", "test_update_connection_failure"), ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), ] @@ -59,29 +58,6 @@ IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [ "tests.components.smartthings.test_init", "test_config_entry_loads_unconnected_cloud", ), - ("tests.components.samsungtv.test_config_flow", "test_ssdp"), - ("tests.components.samsungtv.test_config_flow", "test_user_websocket"), - ("tests.components.samsungtv.test_config_flow", "test_user_already_configured"), - ("tests.components.samsungtv.test_config_flow", "test_autodetect_websocket"), - ("tests.components.samsungtv.test_config_flow", "test_autodetect_websocket_ssl"), - ("tests.components.samsungtv.test_config_flow", "test_ssdp_already_configured"), - ("tests.components.samsungtv.test_config_flow", "test_ssdp_noprefix"), - ("tests.components.samsungtv.test_config_flow", "test_user_legacy"), - ("tests.components.samsungtv.test_config_flow", "test_autodetect_legacy"), - ( - "tests.components.samsungtv.test_media_player", - "test_select_source_invalid_source", - ), - ( - "tests.components.samsungtv.test_media_player", - "test_play_media_channel_as_string", - ), - ( - "tests.components.samsungtv.test_media_player", - "test_play_media_channel_as_non_positive", - ), - ("tests.components.samsungtv.test_media_player", "test_turn_off_websocket"), - ("tests.components.samsungtv.test_media_player", "test_play_media_invalid_type"), ("tests.components.harmony.test_config_flow", "test_form_import"), ("tests.components.harmony.test_config_flow", "test_form_ssdp"), ("tests.components.harmony.test_config_flow", "test_user_form"), From a1aebe904e436e14c12c202b85e3f0edd295371b Mon Sep 17 00:00:00 2001 From: Jevgeni Kiski Date: Mon, 6 Apr 2020 12:45:37 +0300 Subject: [PATCH 163/653] Add MQTT Alarm Control Panel custom bypass state (#32541) * MQTT Alarm Control Panel to have all available states * MQTT Alarm Control Panel to have all available states * test_arm_custom_bypass_* tests added * MQTT payload_arm_custom_bypass abbreviation --- .../components/mqtt/abbreviations.py | 1 + .../components/mqtt/alarm_control_panel.py | 30 ++++++- .../mqtt/test_alarm_control_panel.py | 80 +++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/mqtt/abbreviations.py b/homeassistant/components/mqtt/abbreviations.py index 6cfab66c3f15..e4262a7c5482 100644 --- a/homeassistant/components/mqtt/abbreviations.py +++ b/homeassistant/components/mqtt/abbreviations.py @@ -85,6 +85,7 @@ ABBREVIATIONS = { "pl_arm_away": "payload_arm_away", "pl_arm_home": "payload_arm_home", "pl_arm_nite": "payload_arm_night", + "pl_arm_custom_b": "payload_arm_custom_bypass", "pl_avail": "payload_available", "pl_cln_sp": "payload_clean_spot", "pl_cls": "payload_close", diff --git a/homeassistant/components/mqtt/alarm_control_panel.py b/homeassistant/components/mqtt/alarm_control_panel.py index 09f735c72a06..ad39eecdcca5 100644 --- a/homeassistant/components/mqtt/alarm_control_panel.py +++ b/homeassistant/components/mqtt/alarm_control_panel.py @@ -8,6 +8,7 @@ from homeassistant.components import mqtt import homeassistant.components.alarm_control_panel as alarm from homeassistant.components.alarm_control_panel.const import ( SUPPORT_ALARM_ARM_AWAY, + SUPPORT_ALARM_ARM_CUSTOM_BYPASS, SUPPORT_ALARM_ARM_HOME, SUPPORT_ALARM_ARM_NIGHT, ) @@ -17,9 +18,12 @@ from homeassistant.const import ( CONF_NAME, CONF_VALUE_TEMPLATE, STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_CUSTOM_BYPASS, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMING, STATE_ALARM_DISARMED, + STATE_ALARM_DISARMING, STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, ) @@ -52,12 +56,14 @@ CONF_PAYLOAD_DISARM = "payload_disarm" CONF_PAYLOAD_ARM_HOME = "payload_arm_home" CONF_PAYLOAD_ARM_AWAY = "payload_arm_away" CONF_PAYLOAD_ARM_NIGHT = "payload_arm_night" +CONF_PAYLOAD_ARM_CUSTOM_BYPASS = "payload_arm_custom_bypass" CONF_COMMAND_TEMPLATE = "command_template" DEFAULT_COMMAND_TEMPLATE = "{{action}}" DEFAULT_ARM_NIGHT = "ARM_NIGHT" DEFAULT_ARM_AWAY = "ARM_AWAY" DEFAULT_ARM_HOME = "ARM_HOME" +DEFAULT_ARM_CUSTOM_BYPASS = "ARM_CUSTOM_BYPASS" DEFAULT_DISARM = "DISARM" DEFAULT_NAME = "MQTT Alarm" PLATFORM_SCHEMA = ( @@ -75,6 +81,9 @@ PLATFORM_SCHEMA = ( vol.Optional(CONF_PAYLOAD_ARM_AWAY, default=DEFAULT_ARM_AWAY): cv.string, vol.Optional(CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME): cv.string, vol.Optional(CONF_PAYLOAD_ARM_NIGHT, default=DEFAULT_ARM_NIGHT): cv.string, + vol.Optional( + CONF_PAYLOAD_ARM_CUSTOM_BYPASS, default=DEFAULT_ARM_CUSTOM_BYPASS + ): cv.string, vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string, vol.Optional(CONF_RETAIN, default=mqtt.DEFAULT_RETAIN): cv.boolean, vol.Required(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, @@ -181,7 +190,10 @@ class MqttAlarm( STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMED_CUSTOM_BYPASS, STATE_ALARM_PENDING, + STATE_ALARM_ARMING, + STATE_ALARM_DISARMING, STATE_ALARM_TRIGGERED, ): _LOGGER.warning("Received unexpected payload: %s", msg.payload) @@ -233,7 +245,12 @@ class MqttAlarm( @property def supported_features(self) -> int: """Return the list of supported features.""" - return SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY | SUPPORT_ALARM_ARM_NIGHT + return ( + SUPPORT_ALARM_ARM_HOME + | SUPPORT_ALARM_ARM_AWAY + | SUPPORT_ALARM_ARM_NIGHT + | SUPPORT_ALARM_ARM_CUSTOM_BYPASS + ) @property def code_format(self): @@ -295,6 +312,17 @@ class MqttAlarm( action = self._config[CONF_PAYLOAD_ARM_NIGHT] self._publish(code, action) + async def async_alarm_arm_custom_bypass(self, code=None): + """Send arm custom bypass command. + + This method is a coroutine. + """ + code_required = self._config[CONF_CODE_ARM_REQUIRED] + if code_required and not self._validate_code(code, "arming custom bypass"): + return + action = self._config[CONF_PAYLOAD_ARM_CUSTOM_BYPASS] + self._publish(code, action) + def _publish(self, code, action): """Publish via mqtt.""" command_template = self._config[CONF_COMMAND_TEMPLATE] diff --git a/tests/components/mqtt/test_alarm_control_panel.py b/tests/components/mqtt/test_alarm_control_panel.py index f8c10516f24a..254449cc129e 100644 --- a/tests/components/mqtt/test_alarm_control_panel.py +++ b/tests/components/mqtt/test_alarm_control_panel.py @@ -5,9 +5,12 @@ import json from homeassistant.components import alarm_control_panel from homeassistant.const import ( STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_CUSTOM_BYPASS, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMING, STATE_ALARM_DISARMED, + STATE_ALARM_DISARMING, STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNKNOWN, @@ -112,7 +115,10 @@ async def test_update_state_via_state_topic(hass, mqtt_mock): STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMED_CUSTOM_BYPASS, STATE_ALARM_PENDING, + STATE_ALARM_ARMING, + STATE_ALARM_DISARMING, STATE_ALARM_TRIGGERED, ): async_fire_mqtt_message(hass, "alarm/state", state) @@ -256,6 +262,80 @@ async def test_arm_night_publishes_mqtt_when_code_not_req(hass, mqtt_mock): ) +async def test_arm_custom_bypass_publishes_mqtt(hass, mqtt_mock): + """Test publishing of MQTT messages while armed.""" + assert await async_setup_component( + hass, + alarm_control_panel.DOMAIN, + { + alarm_control_panel.DOMAIN: { + "platform": "mqtt", + "name": "test", + "state_topic": "alarm/state", + "command_topic": "alarm/command", + } + }, + ) + + await common.async_alarm_arm_custom_bypass(hass) + mqtt_mock.async_publish.assert_called_once_with( + "alarm/command", "ARM_CUSTOM_BYPASS", 0, False + ) + + +async def test_arm_custom_bypass_not_publishes_mqtt_with_invalid_code_when_req( + hass, mqtt_mock +): + """Test not publishing of MQTT messages with invalid code. + + When code_arm_required = True + """ + assert await async_setup_component( + hass, + alarm_control_panel.DOMAIN, + { + alarm_control_panel.DOMAIN: { + "platform": "mqtt", + "name": "test", + "state_topic": "alarm/state", + "command_topic": "alarm/command", + "code": "1234", + "code_arm_required": True, + } + }, + ) + + call_count = mqtt_mock.async_publish.call_count + await common.async_alarm_arm_custom_bypass(hass, "abcd") + assert mqtt_mock.async_publish.call_count == call_count + + +async def test_arm_custom_bypass_publishes_mqtt_when_code_not_req(hass, mqtt_mock): + """Test publishing of MQTT messages. + + When code_arm_required = False + """ + assert await async_setup_component( + hass, + alarm_control_panel.DOMAIN, + { + alarm_control_panel.DOMAIN: { + "platform": "mqtt", + "name": "test", + "state_topic": "alarm/state", + "command_topic": "alarm/command", + "code": "1234", + "code_arm_required": False, + } + }, + ) + + await common.async_alarm_arm_custom_bypass(hass) + mqtt_mock.async_publish.assert_called_once_with( + "alarm/command", "ARM_CUSTOM_BYPASS", 0, False + ) + + async def test_disarm_publishes_mqtt(hass, mqtt_mock): """Test publishing of MQTT messages while disarmed.""" assert await async_setup_component( From b31284b855cb2a8191756021a2b9cc5ea782c0bf Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 6 Apr 2020 12:03:21 +0200 Subject: [PATCH 164/653] Temporarily disable Prettier on CI until issue is resolved (#33734) --- azure-pipelines-ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 200cbe7488f0..38b7a3c32177 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -76,10 +76,12 @@ stages: . venv/bin/activate pre-commit run pyupgrade --all-files --show-diff-on-failure displayName: 'Run pyupgrade' - - script: | - . venv/bin/activate - pre-commit run prettier --all-files --show-diff-on-failure - displayName: 'Run prettier' + # Prettier seems to hang on Azure, unknown why yet. + # Temporarily disable the check to no block PRs + # - script: | + # . venv/bin/activate + # pre-commit run prettier --all-files --show-diff-on-failure + # displayName: 'Run prettier' - job: 'Validate' pool: vmImage: 'ubuntu-latest' From 98a2efcbabc1d0173db0489a519c04a44871c4a9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 6 Apr 2020 12:51:48 +0200 Subject: [PATCH 165/653] Collection of random (mainly) test improvements (#33733) --- homeassistant/config.py | 6 +- homeassistant/config_entries.py | 3 +- tests/components/command_line/test_notify.py | 2 +- tests/components/command_line/test_sensor.py | 32 ++-- tests/components/deconz/test_cover.py | 2 +- tests/components/demo/test_light.py | 18 +-- tests/components/dialogflow/test_init.py | 84 +++++----- tests/components/emulated_hue/test_hue_api.py | 26 +-- tests/components/fan/test_init.py | 6 +- tests/components/google_translate/test_tts.py | 2 +- tests/components/graphite/test_init.py | 2 +- tests/components/hddtemp/test_sensor.py | 6 +- tests/components/input_text/test_init.py | 16 +- tests/components/logbook/test_init.py | 152 +++++++++--------- tests/components/mhz19/test_sensor.py | 20 +-- tests/components/min_max/test_sensor.py | 6 +- .../components/monoprice/test_media_player.py | 40 ++--- tests/components/mqtt/test_init.py | 42 ++--- tests/components/myq/util.py | 4 +- tests/components/nx584/test_binary_sensor.py | 5 +- tests/components/pilight/test_init.py | 9 +- tests/components/rfxtrx/test_init.py | 2 +- tests/components/vultr/test_switch.py | 42 ++--- tests/components/yandextts/test_tts.py | 4 +- tests/components/zwave/test_climate.py | 2 - tests/components/zwave/test_node_entity.py | 16 +- tests/helpers/test_check_config.py | 2 +- tests/helpers/test_condition.py | 4 +- tests/helpers/test_config_validation.py | 12 +- tests/helpers/test_service.py | 18 +-- tests/helpers/test_state.py | 12 +- tests/test_config.py | 22 +-- tests/test_core.py | 62 +++---- 33 files changed, 337 insertions(+), 344 deletions(-) diff --git a/homeassistant/config.py b/homeassistant/config.py index 297680279dbf..b9fdcb085ef3 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -842,11 +842,7 @@ def async_notify_setup_error( message = "The following integrations and platforms could not be set up:\n\n" for name, link in errors.items(): - if link: - part = f"[{name}]({link})" - else: - part = name - + part = f"[{name}]({link})" if link else name message += f" - {part}\n" message += "\nPlease check your config." diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index 905baff895ff..d4f76d9bb376 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -917,8 +917,7 @@ class OptionsFlowManager(data_entry_flow.FlowManager): if entry.domain not in HANDLERS: raise data_entry_flow.UnknownHandler - flow = cast(OptionsFlow, HANDLERS[entry.domain].async_get_options_flow(entry)) - return flow + return cast(OptionsFlow, HANDLERS[entry.domain].async_get_options_flow(entry)) async def async_finish_flow( self, flow: data_entry_flow.FlowHandler, result: Dict[str, Any] diff --git a/tests/components/command_line/test_notify.py b/tests/components/command_line/test_notify.py index cd9371158685..0cb7e9293e95 100644 --- a/tests/components/command_line/test_notify.py +++ b/tests/components/command_line/test_notify.py @@ -91,4 +91,4 @@ class TestCommandLine(unittest.TestCase): assert self.hass.services.call( "notify", "test", {"message": "error"}, blocking=True ) - assert 1 == mock_error.call_count + assert mock_error.call_count == 1 diff --git a/tests/components/command_line/test_sensor.py b/tests/components/command_line/test_sensor.py index e51c0187460d..b923be81888e 100644 --- a/tests/components/command_line/test_sensor.py +++ b/tests/components/command_line/test_sensor.py @@ -40,12 +40,12 @@ class TestCommandSensorSensor(unittest.TestCase): command_line.setup_platform(self.hass, config, add_dev_callback) - assert 1 == len(devices) + assert len(devices) == 1 entity = devices[0] entity.update() - assert "Test" == entity.name - assert "in" == entity.unit_of_measurement - assert "5" == entity.state + assert entity.name == "Test" + assert entity.unit_of_measurement == "in" + assert entity.state == "5" def test_template(self): """Test command sensor with template.""" @@ -61,7 +61,7 @@ class TestCommandSensorSensor(unittest.TestCase): ) entity.update() - assert 5 == float(entity.state) + assert float(entity.state) == 5 def test_template_render(self): """Ensure command with templates get rendered properly.""" @@ -71,7 +71,7 @@ class TestCommandSensorSensor(unittest.TestCase): ) data.update() - assert "Works" == data.value + assert data.value == "Works" def test_bad_command(self): """Test bad command.""" @@ -95,11 +95,11 @@ class TestCommandSensorSensor(unittest.TestCase): self.hass, data, "test", None, None, ["key", "another_key", "key_three"] ) self.sensor.update() - assert "some_json_value" == self.sensor.device_state_attributes["key"] + assert self.sensor.device_state_attributes["key"] == "some_json_value" assert ( - "another_json_value" == self.sensor.device_state_attributes["another_key"] + self.sensor.device_state_attributes["another_key"] == "another_json_value" ) - assert "value_three" == self.sensor.device_state_attributes["key_three"] + assert self.sensor.device_state_attributes["key_three"] == "value_three" @patch("homeassistant.components.command_line.sensor._LOGGER") def test_update_with_json_attrs_no_data(self, mock_logger): @@ -156,12 +156,12 @@ class TestCommandSensorSensor(unittest.TestCase): ["key", "another_key", "key_three", "special_key"], ) self.sensor.update() - assert "some_json_value" == self.sensor.device_state_attributes["key"] + assert self.sensor.device_state_attributes["key"] == "some_json_value" assert ( - "another_json_value" == self.sensor.device_state_attributes["another_key"] + self.sensor.device_state_attributes["another_key"] == "another_json_value" ) - assert "value_three" == self.sensor.device_state_attributes["key_three"] - assert not ("special_key" in self.sensor.device_state_attributes) + assert self.sensor.device_state_attributes["key_three"] == "value_three" + assert "special_key" not in self.sensor.device_state_attributes def test_update_with_unnecessary_json_attrs(self): """Test attributes get extracted from a JSON result.""" @@ -178,8 +178,8 @@ class TestCommandSensorSensor(unittest.TestCase): self.hass, data, "test", None, None, ["key", "another_key"] ) self.sensor.update() - assert "some_json_value" == self.sensor.device_state_attributes["key"] + assert self.sensor.device_state_attributes["key"] == "some_json_value" assert ( - "another_json_value" == self.sensor.device_state_attributes["another_key"] + self.sensor.device_state_attributes["another_key"] == "another_json_value" ) - assert not ("key_three" in self.sensor.device_state_attributes) + assert "key_three" not in self.sensor.device_state_attributes diff --git a/tests/components/deconz/test_cover.py b/tests/components/deconz/test_cover.py index 43bb165b1a63..0eda8eb71abf 100644 --- a/tests/components/deconz/test_cover.py +++ b/tests/components/deconz/test_cover.py @@ -129,7 +129,7 @@ async def test_cover(hass): await hass.async_block_till_done() set_callback.assert_called_with("put", "/lights/1/state", json={"bri_inc": 0}) - """Test that a reported cover position of 255 (deconz-rest-api < 2.05.73) is interpreted correctly.""" + # Test that a reported cover position of 255 (deconz-rest-api < 2.05.73) is interpreted correctly. deconz_old_brightness_cover = hass.states.get("cover.deconz_old_brightness_cover") assert deconz_old_brightness_cover.state == "open" diff --git a/tests/components/demo/test_light.py b/tests/components/demo/test_light.py index 48409d6cc377..47b5c92fd48c 100644 --- a/tests/components/demo/test_light.py +++ b/tests/components/demo/test_light.py @@ -23,26 +23,26 @@ async def test_state_attributes(hass): state = hass.states.get(ENTITY_LIGHT) assert light.is_on(hass, ENTITY_LIGHT) assert (0.4, 0.4) == state.attributes.get(light.ATTR_XY_COLOR) - assert 25 == state.attributes.get(light.ATTR_BRIGHTNESS) + assert state.attributes.get(light.ATTR_BRIGHTNESS) == 25 assert (255, 234, 164) == state.attributes.get(light.ATTR_RGB_COLOR) - assert "rainbow" == state.attributes.get(light.ATTR_EFFECT) + assert state.attributes.get(light.ATTR_EFFECT) == "rainbow" await common.async_turn_on( hass, ENTITY_LIGHT, rgb_color=(251, 253, 255), white_value=254 ) state = hass.states.get(ENTITY_LIGHT) - assert 254 == state.attributes.get(light.ATTR_WHITE_VALUE) + assert state.attributes.get(light.ATTR_WHITE_VALUE) == 254 assert (250, 252, 255) == state.attributes.get(light.ATTR_RGB_COLOR) assert (0.319, 0.326) == state.attributes.get(light.ATTR_XY_COLOR) await common.async_turn_on(hass, ENTITY_LIGHT, color_temp=400, effect="none") state = hass.states.get(ENTITY_LIGHT) - assert 400 == state.attributes.get(light.ATTR_COLOR_TEMP) - assert 153 == state.attributes.get(light.ATTR_MIN_MIREDS) - assert 500 == state.attributes.get(light.ATTR_MAX_MIREDS) - assert "none" == state.attributes.get(light.ATTR_EFFECT) + assert state.attributes.get(light.ATTR_COLOR_TEMP) == 400 + assert state.attributes.get(light.ATTR_MIN_MIREDS) == 153 + assert state.attributes.get(light.ATTR_MAX_MIREDS) == 500 + assert state.attributes.get(light.ATTR_EFFECT) == "none" await common.async_turn_on(hass, ENTITY_LIGHT, kelvin=3000, brightness_pct=50) state = hass.states.get(ENTITY_LIGHT) - assert 333 == state.attributes.get(light.ATTR_COLOR_TEMP) - assert 127 == state.attributes.get(light.ATTR_BRIGHTNESS) + assert state.attributes.get(light.ATTR_COLOR_TEMP) == 333 + assert state.attributes.get(light.ATTR_BRIGHTNESS) == 127 async def test_turn_off(hass): diff --git a/tests/components/dialogflow/test_init.py b/tests/components/dialogflow/test_init.py index 70a75e68c6f7..5c2a71ad88fa 100644 --- a/tests/components/dialogflow/test_init.py +++ b/tests/components/dialogflow/test_init.py @@ -167,8 +167,8 @@ async def test_intent_action_incomplete_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status - assert "" == await response.text() + assert response.status == 200 + assert await response.text() == "" async def test_intent_action_incomplete_v2(fixture): @@ -180,8 +180,8 @@ async def test_intent_action_incomplete_v2(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status - assert "" == await response.text() + assert response.status == 200 + assert await response.text() == "" async def test_intent_slot_filling_v1(fixture): @@ -222,8 +222,8 @@ async def test_intent_slot_filling_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status - assert "" == await response.text() + assert response.status == 200 + assert await response.text() == "" async def test_intent_request_with_parameters_v1(fixture): @@ -233,9 +233,9 @@ async def test_intent_request_with_parameters_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "You told us your sign is virgo." == text + assert text == "You told us your sign is virgo." async def test_intent_request_with_parameters_v2(fixture): @@ -245,9 +245,9 @@ async def test_intent_request_with_parameters_v2(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "You told us your sign is virgo." == text + assert text == "You told us your sign is virgo." async def test_intent_request_with_parameters_but_empty_v1(fixture): @@ -258,9 +258,9 @@ async def test_intent_request_with_parameters_but_empty_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "You told us your sign is ." == text + assert text == "You told us your sign is ." async def test_intent_request_with_parameters_but_empty_v2(fixture): @@ -271,9 +271,9 @@ async def test_intent_request_with_parameters_but_empty_v2(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "You told us your sign is ." == text + assert text == "You told us your sign is ." async def test_intent_request_without_slots_v1(hass, fixture): @@ -290,10 +290,10 @@ async def test_intent_request_without_slots_v1(hass, fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "Anne Therese is at unknown and Paulus is at unknown" == text + assert text == "Anne Therese is at unknown and Paulus is at unknown" hass.states.async_set("device_tracker.paulus", "home") hass.states.async_set("device_tracker.anne_therese", "home") @@ -301,9 +301,9 @@ async def test_intent_request_without_slots_v1(hass, fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "You are both home, you silly" == text + assert text == "You are both home, you silly" async def test_intent_request_without_slots_v2(hass, fixture): @@ -320,10 +320,10 @@ async def test_intent_request_without_slots_v2(hass, fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "Anne Therese is at unknown and Paulus is at unknown" == text + assert text == "Anne Therese is at unknown and Paulus is at unknown" hass.states.async_set("device_tracker.paulus", "home") hass.states.async_set("device_tracker.anne_therese", "home") @@ -331,9 +331,9 @@ async def test_intent_request_without_slots_v2(hass, fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "You are both home, you silly" == text + assert text == "You are both home, you silly" async def test_intent_request_calling_service_v1(fixture, calls): @@ -349,13 +349,13 @@ async def test_intent_request_calling_service_v1(fixture, calls): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status - assert call_count + 1 == len(calls) + assert response.status == 200 + assert len(calls) == call_count + 1 call = calls[-1] - assert "test" == call.domain - assert "dialogflow" == call.service - assert ["switch.test"] == call.data.get("entity_id") - assert "virgo" == call.data.get("hello") + assert call.domain == "test" + assert call.service == "dialogflow" + assert call.data.get("entity_id") == ["switch.test"] + assert call.data.get("hello") == "virgo" async def test_intent_request_calling_service_v2(fixture, calls): @@ -371,13 +371,13 @@ async def test_intent_request_calling_service_v2(fixture, calls): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status - assert call_count + 1 == len(calls) + assert response.status == 200 + assert len(calls) == call_count + 1 call = calls[-1] - assert "test" == call.domain - assert "dialogflow" == call.service - assert ["switch.test"] == call.data.get("entity_id") - assert "virgo" == call.data.get("hello") + assert call.domain == "test" + assert call.service == "dialogflow" + assert call.data.get("entity_id") == ["switch.test"] + assert call.data.get("hello") == "virgo" async def test_intent_with_no_action_v1(fixture): @@ -389,9 +389,9 @@ async def test_intent_with_no_action_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "You have not defined an action in your Dialogflow intent." == text + assert text == "You have not defined an action in your Dialogflow intent." async def test_intent_with_no_action_v2(fixture): @@ -403,9 +403,9 @@ async def test_intent_with_no_action_v2(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "You have not defined an action in your Dialogflow intent." == text + assert text == "You have not defined an action in your Dialogflow intent." async def test_intent_with_unknown_action_v1(fixture): @@ -416,9 +416,9 @@ async def test_intent_with_unknown_action_v1(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("speech") - assert "This intent is not yet configured within Home Assistant." == text + assert text == "This intent is not yet configured within Home Assistant." async def test_intent_with_unknown_action_v2(fixture): @@ -429,6 +429,6 @@ async def test_intent_with_unknown_action_v2(fixture): response = await mock_client.post( f"/api/webhook/{webhook_id}", data=json.dumps(data) ) - assert 200 == response.status + assert response.status == 200 text = (await response.json()).get("fulfillmentText") - assert "This intent is not yet configured within Home Assistant." == text + assert text == "This intent is not yet configured within Home Assistant." diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index 7ecad0183005..c47940e98cdc 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -228,7 +228,7 @@ async def test_light_without_brightness_can_be_turned_off(hass_hue, hue_client): # Verify that SERVICE_TURN_OFF has been called await hass_hue.async_block_till_done() - assert 1 == len(turn_off_calls) + assert len(turn_off_calls) == 1 call = turn_off_calls[-1] assert light.DOMAIN == call.domain @@ -536,16 +536,16 @@ async def test_put_light_state_media_player(hass_hue, hue_client): async def test_close_cover(hass_hue, hue_client): """Test opening cover .""" - COVER_ID = "cover.living_room_window" + cover_id = "cover.living_room_window" # Turn the office light off first await hass_hue.services.async_call( cover.DOMAIN, const.SERVICE_CLOSE_COVER, - {const.ATTR_ENTITY_ID: COVER_ID}, + {const.ATTR_ENTITY_ID: cover_id}, blocking=True, ) - cover_test = hass_hue.states.get(COVER_ID) + cover_test = hass_hue.states.get(cover_id) assert cover_test.state == "closing" for _ in range(7): @@ -553,12 +553,12 @@ async def test_close_cover(hass_hue, hue_client): async_fire_time_changed(hass_hue, future) await hass_hue.async_block_till_done() - cover_test = hass_hue.states.get(COVER_ID) + cover_test = hass_hue.states.get(cover_id) assert cover_test.state == "closed" # Go through the API to turn it on cover_result = await perform_put_light_state( - hass_hue, hue_client, COVER_ID, True, 100 + hass_hue, hue_client, cover_id, True, 100 ) assert cover_result.status == 200 @@ -574,22 +574,22 @@ async def test_close_cover(hass_hue, hue_client): assert len(cover_result_json) == 2 # Check to make sure the state changed - cover_test_2 = hass_hue.states.get(COVER_ID) + cover_test_2 = hass_hue.states.get(cover_id) assert cover_test_2.state == "open" async def test_set_position_cover(hass_hue, hue_client): """Test setting position cover .""" - COVER_ID = "cover.living_room_window" + cover_id = "cover.living_room_window" # Turn the office light off first await hass_hue.services.async_call( cover.DOMAIN, const.SERVICE_CLOSE_COVER, - {const.ATTR_ENTITY_ID: COVER_ID}, + {const.ATTR_ENTITY_ID: cover_id}, blocking=True, ) - cover_test = hass_hue.states.get(COVER_ID) + cover_test = hass_hue.states.get(cover_id) assert cover_test.state == "closing" for _ in range(7): @@ -597,7 +597,7 @@ async def test_set_position_cover(hass_hue, hue_client): async_fire_time_changed(hass_hue, future) await hass_hue.async_block_till_done() - cover_test = hass_hue.states.get(COVER_ID) + cover_test = hass_hue.states.get(cover_id) assert cover_test.state == "closed" level = 20 @@ -605,7 +605,7 @@ async def test_set_position_cover(hass_hue, hue_client): # Go through the API to open cover_result = await perform_put_light_state( - hass_hue, hue_client, COVER_ID, False, brightness + hass_hue, hue_client, cover_id, False, brightness ) assert cover_result.status == 200 @@ -628,7 +628,7 @@ async def test_set_position_cover(hass_hue, hue_client): await hass_hue.async_block_till_done() # Check to make sure the state changed - cover_test_2 = hass_hue.states.get(COVER_ID) + cover_test_2 = hass_hue.states.get(cover_id) assert cover_test_2.state == "open" assert cover_test_2.attributes.get("current_position") == level diff --git a/tests/components/fan/test_init.py b/tests/components/fan/test_init.py index 5d66edea9c74..d9935cc0063d 100644 --- a/tests/components/fan/test_init.py +++ b/tests/components/fan/test_init.py @@ -28,9 +28,9 @@ class TestFanEntity(unittest.TestCase): def test_fanentity(self): """Test fan entity methods.""" - assert "off" == self.fan.state - assert 0 == len(self.fan.speed_list) - assert 0 == self.fan.supported_features + assert self.fan.state == "off" + assert len(self.fan.speed_list) == 0 + assert self.fan.supported_features == 0 assert {"speed_list": []} == self.fan.capability_attributes # Test set_speed not required self.fan.oscillate(True) diff --git a/tests/components/google_translate/test_tts.py b/tests/components/google_translate/test_tts.py index 37609e151bd1..6703852528c4 100644 --- a/tests/components/google_translate/test_tts.py +++ b/tests/components/google_translate/test_tts.py @@ -189,7 +189,7 @@ class TestTTSGooglePlatform: self.url_param["total"] = 9 self.url_param["q"] = "I%20person%20is%20on%20front%20of%20your%20door" self.url_param["textlen"] = 33 - for idx in range(0, 9): + for idx in range(9): self.url_param["idx"] = idx aioclient_mock.get( self.url, params=self.url_param, status=200, content=b"test" diff --git a/tests/components/graphite/test_init.py b/tests/components/graphite/test_init.py index 696d642cf86f..88be3723936f 100644 --- a/tests/components/graphite/test_init.py +++ b/tests/components/graphite/test_init.py @@ -212,6 +212,6 @@ class TestGraphite(unittest.TestCase): mock_queue.get.side_effect = fake_get self.gf.run() # Twice for two events, once for the stop - assert 3 == mock_queue.task_done.call_count + assert mock_queue.task_done.call_count == 3 assert mock_r.call_count == 1 assert mock_r.call_args == mock.call("entity", event.data["new_state"]) diff --git a/tests/components/hddtemp/test_sensor.py b/tests/components/hddtemp/test_sensor.py index f21fbf5d51d3..c5b0c2bb5621 100644 --- a/tests/components/hddtemp/test_sensor.py +++ b/tests/components/hddtemp/test_sensor.py @@ -48,11 +48,9 @@ class TelnetMock: """Return sample values.""" if self.host == "alice.local": raise ConnectionRefusedError - elif self.host == "bob.local": + if self.host == "bob.local": raise socket.gaierror - else: - return self.sample_data - return None + return self.sample_data class TestHDDTempSensor(unittest.TestCase): diff --git a/tests/components/input_text/test_init.py b/tests/components/input_text/test_init.py index 304f7e094959..cc226dc1d874 100644 --- a/tests/components/input_text/test_init.py +++ b/tests/components/input_text/test_init.py @@ -103,19 +103,19 @@ async def test_set_value(hass): entity_id = "input_text.test_1" state = hass.states.get(entity_id) - assert "test" == str(state.state) + assert str(state.state) == "test" set_value(hass, entity_id, "testing") await hass.async_block_till_done() state = hass.states.get(entity_id) - assert "testing" == str(state.state) + assert str(state.state) == "testing" set_value(hass, entity_id, "testing too long") await hass.async_block_till_done() state = hass.states.get(entity_id) - assert "testing" == str(state.state) + assert str(state.state) == "testing" async def test_mode(hass): @@ -144,15 +144,15 @@ async def test_mode(hass): state = hass.states.get("input_text.test_default_text") assert state - assert "text" == state.attributes["mode"] + assert state.attributes["mode"] == "text" state = hass.states.get("input_text.test_explicit_text") assert state - assert "text" == state.attributes["mode"] + assert state.attributes["mode"] == "text" state = hass.states.get("input_text.test_explicit_password") assert state - assert "password" == state.attributes["mode"] + assert state.attributes["mode"] == "password" async def test_restore_state(hass): @@ -273,8 +273,8 @@ async def test_reload(hass, hass_admin_user, hass_read_only_user): assert state_1 is not None assert state_2 is not None assert state_3 is None - assert "test 1" == state_1.state - assert "test 2" == state_2.state + assert state_1.state == "test 1" + assert state_2.state == "test 2" assert state_1.attributes[ATTR_MIN] == 0 assert state_2.attributes[ATTR_MAX] == 100 diff --git a/tests/components/logbook/test_init.py b/tests/components/logbook/test_init.py index 2045aeb1a5a0..2a6c08a668e7 100644 --- a/tests/components/logbook/test_init.py +++ b/tests/components/logbook/test_init.py @@ -94,13 +94,13 @@ class TestComponentLogbook(unittest.TestCase): ) assert len(events) == 1 - assert 1 == len(calls) + assert len(calls) == 1 last_call = calls[-1] - assert "Alarm" == last_call.data.get(logbook.ATTR_NAME) - assert "is triggered" == last_call.data.get(logbook.ATTR_MESSAGE) - assert "switch" == last_call.data.get(logbook.ATTR_DOMAIN) - assert "switch.test_switch" == last_call.data.get(logbook.ATTR_ENTITY_ID) + assert last_call.data.get(logbook.ATTR_NAME) == "Alarm" + assert last_call.data.get(logbook.ATTR_MESSAGE) == "is triggered" + assert last_call.data.get(logbook.ATTR_DOMAIN) == "switch" + assert last_call.data.get(logbook.ATTR_ENTITY_ID) == "switch.test_switch" def test_service_call_create_log_book_entry_no_message(self): """Test if service call create log book entry without message.""" @@ -121,7 +121,7 @@ class TestComponentLogbook(unittest.TestCase): # scheduled. This means that they may not have been processed yet. self.hass.block_till_done() - assert 0 == len(calls) + assert len(calls) == 0 def test_humanify_filter_sensor(self): """Test humanify filter too frequent sensor values.""" @@ -137,7 +137,7 @@ class TestComponentLogbook(unittest.TestCase): entries = list(logbook.humanify(self.hass, (eventA, eventB, eventC))) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], pointB, "bla", domain="sensor", entity_id=entity_id ) @@ -155,7 +155,7 @@ class TestComponentLogbook(unittest.TestCase): entries = list(logbook.humanify(self.hass, (eventA,))) - assert 0 == len(entries) + assert len(entries) == 0 def test_exclude_new_entities(self): """Test if events are excluded on first update.""" @@ -176,7 +176,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -203,7 +203,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -231,7 +231,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -265,7 +265,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -307,7 +307,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="started", domain=ha.DOMAIN ) @@ -348,7 +348,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -387,7 +387,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -419,7 +419,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="stopped", domain=ha.DOMAIN ) @@ -475,7 +475,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 4 == len(entries) + assert len(entries) == 4 self.assert_entry( entries[0], name="Home Assistant", message="started", domain=ha.DOMAIN ) @@ -529,7 +529,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 5 == len(entries) + assert len(entries) == 5 self.assert_entry( entries[0], name="Home Assistant", message="started", domain=ha.DOMAIN ) @@ -563,7 +563,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 1 == len(entries) + assert len(entries) == 1 self.assert_entry( entries[0], pointA, "bla", domain="switch", entity_id=entity_id ) @@ -609,7 +609,7 @@ class TestComponentLogbook(unittest.TestCase): ] entries = list(logbook.humanify(self.hass, events)) - assert 1 == len(entries) + assert len(entries) == 1 self.assert_entry( entries[0], pointB, "kitchen", domain="light", entity_id="light.kitchen" ) @@ -629,7 +629,7 @@ class TestComponentLogbook(unittest.TestCase): ) ) - assert 1 == len(entries) + assert len(entries) == 1 self.assert_entry( entries[0], name="Home Assistant", message="restarted", domain=ha.DOMAIN ) @@ -649,7 +649,7 @@ class TestComponentLogbook(unittest.TestCase): ) ) - assert 2 == len(entries) + assert len(entries) == 2 self.assert_entry( entries[0], name="Home Assistant", message="started", domain=ha.DOMAIN ) @@ -668,19 +668,19 @@ class TestComponentLogbook(unittest.TestCase): eventA = self.create_state_changed_event(pointA, "switch.bla", 10) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "changed to 10" == message + assert message == "changed to 10" # message for a switch turned on eventA = self.create_state_changed_event(pointA, "switch.bla", STATE_ON) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "turned on" == message + assert message == "turned on" # message for a switch turned off eventA = self.create_state_changed_event(pointA, "switch.bla", STATE_OFF) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "turned off" == message + assert message == "turned off" def test_entry_message_from_state_device_tracker(self): """Test if logbook message is correctly created for device tracker.""" @@ -692,13 +692,13 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is away" == message + assert message == "is away" # message for a device tracker "home" state eventA = self.create_state_changed_event(pointA, "device_tracker.john", "work") to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is at work" == message + assert message == "is at work" def test_entry_message_from_state_person(self): """Test if logbook message is correctly created for a person.""" @@ -708,13 +708,13 @@ class TestComponentLogbook(unittest.TestCase): eventA = self.create_state_changed_event(pointA, "person.john", STATE_NOT_HOME) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is away" == message + assert message == "is away" # message for a device tracker "home" state eventA = self.create_state_changed_event(pointA, "person.john", "work") to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is at work" == message + assert message == "is at work" def test_entry_message_from_state_sun(self): """Test if logbook message is correctly created for sun.""" @@ -726,7 +726,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "has risen" == message + assert message == "has risen" # message for a sun set eventA = self.create_state_changed_event( @@ -734,7 +734,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "has set" == message + assert message == "has set" def test_entry_message_from_state_binary_sensor_battery(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -747,7 +747,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is low" == message + assert message == "is low" # message for a binary_sensor battery "normal" state eventA = self.create_state_changed_event( @@ -755,7 +755,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is normal" == message + assert message == "is normal" def test_entry_message_from_state_binary_sensor_connectivity(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -768,7 +768,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is connected" == message + assert message == "is connected" # message for a binary_sensor connectivity "disconnected" state eventA = self.create_state_changed_event( @@ -776,7 +776,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is disconnected" == message + assert message == "is disconnected" def test_entry_message_from_state_binary_sensor_door(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -789,7 +789,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is opened" == message + assert message == "is opened" # message for a binary_sensor door "closed" state eventA = self.create_state_changed_event( @@ -797,7 +797,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is closed" == message + assert message == "is closed" def test_entry_message_from_state_binary_sensor_garage_door(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -810,7 +810,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is opened" == message + assert message == "is opened" # message for a binary_sensor garage_door "closed" state eventA = self.create_state_changed_event( @@ -818,7 +818,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is closed" == message + assert message == "is closed" def test_entry_message_from_state_binary_sensor_opening(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -831,7 +831,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is opened" == message + assert message == "is opened" # message for a binary_sensor opening "closed" state eventA = self.create_state_changed_event( @@ -839,7 +839,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is closed" == message + assert message == "is closed" def test_entry_message_from_state_binary_sensor_window(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -852,7 +852,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is opened" == message + assert message == "is opened" # message for a binary_sensor window "closed" state eventA = self.create_state_changed_event( @@ -860,7 +860,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is closed" == message + assert message == "is closed" def test_entry_message_from_state_binary_sensor_lock(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -873,7 +873,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is unlocked" == message + assert message == "is unlocked" # message for a binary_sensor lock "locked" state eventA = self.create_state_changed_event( @@ -881,7 +881,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is locked" == message + assert message == "is locked" def test_entry_message_from_state_binary_sensor_plug(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -894,7 +894,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is plugged in" == message + assert message == "is plugged in" # message for a binary_sensor plug "pluged" state eventA = self.create_state_changed_event( @@ -902,7 +902,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is unplugged" == message + assert message == "is unplugged" def test_entry_message_from_state_binary_sensor_presence(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -915,7 +915,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is at home" == message + assert message == "is at home" # message for a binary_sensor presence "away" state eventA = self.create_state_changed_event( @@ -923,7 +923,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is away" == message + assert message == "is away" def test_entry_message_from_state_binary_sensor_safety(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -936,7 +936,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is unsafe" == message + assert message == "is unsafe" # message for a binary_sensor safety "safe" state eventA = self.create_state_changed_event( @@ -944,7 +944,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "is safe" == message + assert message == "is safe" def test_entry_message_from_state_binary_sensor_cold(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -957,7 +957,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected cold" == message + assert message == "detected cold" # message for a binary_sensori cold "cleared" state eventA = self.create_state_changed_event( @@ -965,7 +965,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no cold detected)" == message + assert message == "cleared (no cold detected)" def test_entry_message_from_state_binary_sensor_gas(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -978,7 +978,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected gas" == message + assert message == "detected gas" # message for a binary_sensori gas "cleared" state eventA = self.create_state_changed_event( @@ -986,7 +986,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no gas detected)" == message + assert message == "cleared (no gas detected)" def test_entry_message_from_state_binary_sensor_heat(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -999,7 +999,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected heat" == message + assert message == "detected heat" # message for a binary_sensori heat "cleared" state eventA = self.create_state_changed_event( @@ -1007,7 +1007,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no heat detected)" == message + assert message == "cleared (no heat detected)" def test_entry_message_from_state_binary_sensor_light(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1020,7 +1020,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected light" == message + assert message == "detected light" # message for a binary_sensori light "cleared" state eventA = self.create_state_changed_event( @@ -1028,7 +1028,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no light detected)" == message + assert message == "cleared (no light detected)" def test_entry_message_from_state_binary_sensor_moisture(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1041,7 +1041,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected moisture" == message + assert message == "detected moisture" # message for a binary_sensori moisture "cleared" state eventA = self.create_state_changed_event( @@ -1049,7 +1049,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no moisture detected)" == message + assert message == "cleared (no moisture detected)" def test_entry_message_from_state_binary_sensor_motion(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1062,7 +1062,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected motion" == message + assert message == "detected motion" # message for a binary_sensori motion "cleared" state eventA = self.create_state_changed_event( @@ -1070,7 +1070,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no motion detected)" == message + assert message == "cleared (no motion detected)" def test_entry_message_from_state_binary_sensor_occupancy(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1083,7 +1083,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected occupancy" == message + assert message == "detected occupancy" # message for a binary_sensori occupancy "cleared" state eventA = self.create_state_changed_event( @@ -1091,7 +1091,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no occupancy detected)" == message + assert message == "cleared (no occupancy detected)" def test_entry_message_from_state_binary_sensor_power(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1104,7 +1104,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected power" == message + assert message == "detected power" # message for a binary_sensori power "cleared" state eventA = self.create_state_changed_event( @@ -1112,7 +1112,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no power detected)" == message + assert message == "cleared (no power detected)" def test_entry_message_from_state_binary_sensor_problem(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1125,7 +1125,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected problem" == message + assert message == "detected problem" # message for a binary_sensori problem "cleared" state eventA = self.create_state_changed_event( @@ -1133,7 +1133,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no problem detected)" == message + assert message == "cleared (no problem detected)" def test_entry_message_from_state_binary_sensor_smoke(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1146,7 +1146,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected smoke" == message + assert message == "detected smoke" # message for a binary_sensori smoke "cleared" state eventA = self.create_state_changed_event( @@ -1154,7 +1154,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no smoke detected)" == message + assert message == "cleared (no smoke detected)" def test_entry_message_from_state_binary_sensor_sound(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1167,7 +1167,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected sound" == message + assert message == "detected sound" # message for a binary_sensori sound "cleared" state eventA = self.create_state_changed_event( @@ -1175,7 +1175,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no sound detected)" == message + assert message == "cleared (no sound detected)" def test_entry_message_from_state_binary_sensor_vibration(self): """Test if logbook message is correctly created for a binary_sensor.""" @@ -1188,7 +1188,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "detected vibration" == message + assert message == "detected vibration" # message for a binary_sensori vibration "cleared" state eventA = self.create_state_changed_event( @@ -1196,7 +1196,7 @@ class TestComponentLogbook(unittest.TestCase): ) to_state = ha.State.from_dict(eventA.data.get("new_state")) message = logbook._entry_message_from_state(to_state.domain, to_state) - assert "cleared (no vibration detected)" == message + assert message == "cleared (no vibration detected)" def test_process_custom_logbook_entries(self): """Test if custom log book entries get added as an entry.""" @@ -1220,7 +1220,7 @@ class TestComponentLogbook(unittest.TestCase): ) ) - assert 1 == len(entries) + assert len(entries) == 1 self.assert_entry( entries[0], name=name, message=message, domain="sun", entity_id=entity_id ) diff --git a/tests/components/mhz19/test_sensor.py b/tests/components/mhz19/test_sensor.py index 45413a10cda2..0eb86f0198ea 100644 --- a/tests/components/mhz19/test_sensor.py +++ b/tests/components/mhz19/test_sensor.py @@ -57,7 +57,7 @@ class TestMHZ19Sensor(unittest.TestCase): }, mock_add, ) - assert 1 == mock_add.call_count + assert mock_add.call_count == 1 @patch( "pmsensor.co2sensor.read_mh_z19_with_temperature", @@ -98,11 +98,11 @@ class TestMHZ19Sensor(unittest.TestCase): sensor = mhz19.MHZ19Sensor(client, mhz19.SENSOR_CO2, None, "name") sensor.update() - assert "name: CO2" == sensor.name - assert 1000 == sensor.state - assert CONCENTRATION_PARTS_PER_MILLION == sensor.unit_of_measurement + assert sensor.name == "name: CO2" + assert sensor.state == 1000 + assert sensor.unit_of_measurement == CONCENTRATION_PARTS_PER_MILLION assert sensor.should_poll - assert {"temperature": 24} == sensor.device_state_attributes + assert sensor.device_state_attributes == {"temperature": 24} @patch("pmsensor.co2sensor.read_mh_z19_with_temperature", return_value=(1000, 24)) def test_temperature_sensor(self, mock_function): @@ -113,11 +113,11 @@ class TestMHZ19Sensor(unittest.TestCase): sensor = mhz19.MHZ19Sensor(client, mhz19.SENSOR_TEMPERATURE, None, "name") sensor.update() - assert "name: Temperature" == sensor.name - assert 24 == sensor.state - assert "°C" == sensor.unit_of_measurement + assert sensor.name == "name: Temperature" + assert sensor.state == 24 + assert sensor.unit_of_measurement == "°C" assert sensor.should_poll - assert {"co2_concentration": 1000} == sensor.device_state_attributes + assert sensor.device_state_attributes == {"co2_concentration": 1000} @patch("pmsensor.co2sensor.read_mh_z19_with_temperature", return_value=(1000, 24)) def test_temperature_sensor_f(self, mock_function): @@ -130,4 +130,4 @@ class TestMHZ19Sensor(unittest.TestCase): ) sensor.update() - assert 75.2 == sensor.state + assert sensor.state == 75.2 diff --git a/tests/components/min_max/test_sensor.py b/tests/components/min_max/test_sensor.py index 38b725226e7a..891f99ac67ff 100644 --- a/tests/components/min_max/test_sensor.py +++ b/tests/components/min_max/test_sensor.py @@ -221,7 +221,7 @@ class TestMinMaxSensor(unittest.TestCase): state = self.hass.states.get("sensor.test") assert str(float(self.values[0])) == state.state - assert "°C" == state.attributes.get("unit_of_measurement") + assert state.attributes.get("unit_of_measurement") == "°C" self.hass.states.set( entity_ids[1], self.values[1], {ATTR_UNIT_OF_MEASUREMENT: TEMP_FAHRENHEIT} @@ -231,7 +231,7 @@ class TestMinMaxSensor(unittest.TestCase): state = self.hass.states.get("sensor.test") assert STATE_UNKNOWN == state.state - assert "ERR" == state.attributes.get("unit_of_measurement") + assert state.attributes.get("unit_of_measurement") == "ERR" self.hass.states.set( entity_ids[2], self.values[2], {ATTR_UNIT_OF_MEASUREMENT: UNIT_PERCENTAGE} @@ -241,7 +241,7 @@ class TestMinMaxSensor(unittest.TestCase): state = self.hass.states.get("sensor.test") assert STATE_UNKNOWN == state.state - assert "ERR" == state.attributes.get("unit_of_measurement") + assert state.attributes.get("unit_of_measurement") == "ERR" def test_last_sensor(self): """Test the last sensor.""" diff --git a/tests/components/monoprice/test_media_player.py b/tests/components/monoprice/test_media_player.py index 3778f2af04b3..55aac836bc88 100644 --- a/tests/components/monoprice/test_media_player.py +++ b/tests/components/monoprice/test_media_player.py @@ -179,8 +179,8 @@ async def test_service_calls_with_entity_id(hass): # Checking that values were not (!) restored state = hass.states.get(ZONE_1_ID) - assert 1.0 == state.attributes[ATTR_MEDIA_VOLUME_LEVEL] - assert "three" == state.attributes[ATTR_INPUT_SOURCE] + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 1.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "three" # Restoring media player to its previous state await _call_monoprice_service(hass, SERVICE_RESTORE, {"entity_id": ZONE_1_ID}) @@ -188,8 +188,8 @@ async def test_service_calls_with_entity_id(hass): state = hass.states.get(ZONE_1_ID) - assert 0.0 == state.attributes[ATTR_MEDIA_VOLUME_LEVEL] - assert "one" == state.attributes[ATTR_INPUT_SOURCE] + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 0.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "one" async def test_service_calls_with_all_entities(hass): @@ -221,8 +221,8 @@ async def test_service_calls_with_all_entities(hass): state = hass.states.get(ZONE_1_ID) - assert 0.0 == state.attributes[ATTR_MEDIA_VOLUME_LEVEL] - assert "one" == state.attributes[ATTR_INPUT_SOURCE] + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 0.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "one" async def test_service_calls_without_relevant_entities(hass): @@ -254,8 +254,8 @@ async def test_service_calls_without_relevant_entities(hass): state = hass.states.get(ZONE_1_ID) - assert 1.0 == state.attributes[ATTR_MEDIA_VOLUME_LEVEL] - assert "three" == state.attributes[ATTR_INPUT_SOURCE] + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 1.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "three" async def test_restore_without_snapshort(hass): @@ -290,8 +290,8 @@ async def test_update(hass): state = hass.states.get(ZONE_1_ID) - assert 1.0 == state.attributes[ATTR_MEDIA_VOLUME_LEVEL] - assert "three" == state.attributes[ATTR_INPUT_SOURCE] + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 1.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "three" async def test_supported_features(hass): @@ -316,7 +316,7 @@ async def test_source_list(hass): state = hass.states.get(ZONE_1_ID) # Note, the list is sorted! - assert ["one", "three"] == state.attributes[ATTR_INPUT_SOURCE_LIST] + assert state.attributes[ATTR_INPUT_SOURCE_LIST] == ["one", "three"] async def test_source_list_with_options(hass): @@ -325,7 +325,7 @@ async def test_source_list_with_options(hass): state = hass.states.get(ZONE_1_ID) # Note, the list is sorted! - assert ["two", "four"] == state.attributes[ATTR_INPUT_SOURCE_LIST] + assert state.attributes[ATTR_INPUT_SOURCE_LIST] == ["two", "four"] async def test_select_source(hass): @@ -338,7 +338,7 @@ async def test_select_source(hass): SERVICE_SELECT_SOURCE, {"entity_id": ZONE_1_ID, ATTR_INPUT_SOURCE: "three"}, ) - assert 3 == monoprice.zones[11].source + assert monoprice.zones[11].source == 3 # Trying to set unknown source await _call_media_player_service( @@ -346,7 +346,7 @@ async def test_select_source(hass): SERVICE_SELECT_SOURCE, {"entity_id": ZONE_1_ID, ATTR_INPUT_SOURCE: "no name"}, ) - assert 3 == monoprice.zones[11].source + assert monoprice.zones[11].source == 3 async def test_unknown_source(hass): @@ -403,27 +403,27 @@ async def test_volume_up_down(hass): await _call_media_player_service( hass, SERVICE_VOLUME_SET, {"entity_id": ZONE_1_ID, "volume_level": 0.0} ) - assert 0 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 0 await _call_media_player_service( hass, SERVICE_VOLUME_DOWN, {"entity_id": ZONE_1_ID} ) # should not go below zero - assert 0 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 0 await _call_media_player_service(hass, SERVICE_VOLUME_UP, {"entity_id": ZONE_1_ID}) - assert 1 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 1 await _call_media_player_service( hass, SERVICE_VOLUME_SET, {"entity_id": ZONE_1_ID, "volume_level": 1.0} ) - assert 38 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 38 await _call_media_player_service(hass, SERVICE_VOLUME_UP, {"entity_id": ZONE_1_ID}) # should not go above 38 - assert 38 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 38 await _call_media_player_service( hass, SERVICE_VOLUME_DOWN, {"entity_id": ZONE_1_ID} ) - assert 37 == monoprice.zones[11].volume + assert monoprice.zones[11].volume == 37 diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 861b2fa30e8d..d9686719a82d 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -53,12 +53,12 @@ def entity_reg(hass): @pytest.fixture -def mock_MQTT(): +def mock_mqtt(): """Make sure connection is established.""" - with mock.patch("homeassistant.components.mqtt.MQTT") as mock_MQTT: - mock_MQTT.return_value.async_connect.return_value = mock_coro(True) - mock_MQTT.return_value.async_disconnect.return_value = mock_coro(True) - yield mock_MQTT + with mock.patch("homeassistant.components.mqtt.MQTT") as mock_mqtt: + mock_mqtt.return_value.async_connect.return_value = mock_coro(True) + mock_mqtt.return_value.async_disconnect.return_value = mock_coro(True) + yield mock_mqtt async def async_mock_mqtt_client(hass, config=None): @@ -716,7 +716,7 @@ async def test_setup_raises_ConfigEntryNotReady_if_no_connect_broker(hass): await mqtt.async_setup_entry(hass, entry) -async def test_setup_uses_certificate_on_certificate_set_to_auto(hass, mock_MQTT): +async def test_setup_uses_certificate_on_certificate_set_to_auto(hass, mock_mqtt): """Test setup uses bundled certs when certificate is set to auto.""" entry = MockConfigEntry( domain=mqtt.DOMAIN, @@ -725,15 +725,15 @@ async def test_setup_uses_certificate_on_certificate_set_to_auto(hass, mock_MQTT assert await mqtt.async_setup_entry(hass, entry) - assert mock_MQTT.called + assert mock_mqtt.called import requests.certs expectedCertificate = requests.certs.where() - assert mock_MQTT.mock_calls[0][2]["certificate"] == expectedCertificate + assert mock_mqtt.mock_calls[0][2]["certificate"] == expectedCertificate -async def test_setup_does_not_use_certificate_on_mqtts_port(hass, mock_MQTT): +async def test_setup_does_not_use_certificate_on_mqtts_port(hass, mock_mqtt): """Test setup doesn't use bundled certs when ssl set.""" entry = MockConfigEntry( domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker", "port": 8883} @@ -741,22 +741,22 @@ async def test_setup_does_not_use_certificate_on_mqtts_port(hass, mock_MQTT): assert await mqtt.async_setup_entry(hass, entry) - assert mock_MQTT.called - assert mock_MQTT.mock_calls[0][2]["port"] == 8883 + assert mock_mqtt.called + assert mock_mqtt.mock_calls[0][2]["port"] == 8883 import requests.certs mqttsCertificateBundle = requests.certs.where() - assert mock_MQTT.mock_calls[0][2]["port"] != mqttsCertificateBundle + assert mock_mqtt.mock_calls[0][2]["port"] != mqttsCertificateBundle -async def test_setup_without_tls_config_uses_tlsv1_under_python36(hass, mock_MQTT): +async def test_setup_without_tls_config_uses_tlsv1_under_python36(hass, mock_mqtt): """Test setup defaults to TLSv1 under python3.6.""" entry = MockConfigEntry(domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker"}) assert await mqtt.async_setup_entry(hass, entry) - assert mock_MQTT.called + assert mock_mqtt.called import sys @@ -765,10 +765,10 @@ async def test_setup_without_tls_config_uses_tlsv1_under_python36(hass, mock_MQT else: expectedTlsVersion = ssl.PROTOCOL_TLSv1 - assert mock_MQTT.mock_calls[0][2]["tls_version"] == expectedTlsVersion + assert mock_mqtt.mock_calls[0][2]["tls_version"] == expectedTlsVersion -async def test_setup_with_tls_config_uses_tls_version1_2(hass, mock_MQTT): +async def test_setup_with_tls_config_uses_tls_version1_2(hass, mock_mqtt): """Test setup uses specified TLS version.""" entry = MockConfigEntry( domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker", "tls_version": "1.2"} @@ -776,12 +776,12 @@ async def test_setup_with_tls_config_uses_tls_version1_2(hass, mock_MQTT): assert await mqtt.async_setup_entry(hass, entry) - assert mock_MQTT.called + assert mock_mqtt.called - assert mock_MQTT.mock_calls[0][2]["tls_version"] == ssl.PROTOCOL_TLSv1_2 + assert mock_mqtt.mock_calls[0][2]["tls_version"] == ssl.PROTOCOL_TLSv1_2 -async def test_setup_with_tls_config_of_v1_under_python36_only_uses_v1(hass, mock_MQTT): +async def test_setup_with_tls_config_of_v1_under_python36_only_uses_v1(hass, mock_mqtt): """Test setup uses TLSv1.0 if explicitly chosen.""" entry = MockConfigEntry( domain=mqtt.DOMAIN, data={mqtt.CONF_BROKER: "test-broker", "tls_version": "1.0"} @@ -789,8 +789,8 @@ async def test_setup_with_tls_config_of_v1_under_python36_only_uses_v1(hass, moc assert await mqtt.async_setup_entry(hass, entry) - assert mock_MQTT.called - assert mock_MQTT.mock_calls[0][2]["tls_version"] == ssl.PROTOCOL_TLSv1 + assert mock_mqtt.called + assert mock_mqtt.mock_calls[0][2]["tls_version"] == ssl.PROTOCOL_TLSv1 async def test_birth_message(hass): diff --git a/tests/components/myq/util.py b/tests/components/myq/util.py index 48af17188ebc..7cff7bd2af9e 100644 --- a/tests/components/myq/util.py +++ b/tests/components/myq/util.py @@ -23,9 +23,9 @@ async def async_init_integration( def _handle_mock_api_request(method, endpoint, **kwargs): if endpoint == "Login": return {"SecurityToken": 1234} - elif endpoint == "My": + if endpoint == "My": return {"Account": {"Id": 1}} - elif endpoint == "Accounts/1/Devices": + if endpoint == "Accounts/1/Devices": return devices_dict return {} diff --git a/tests/components/nx584/test_binary_sensor.py b/tests/components/nx584/test_binary_sensor.py index 24823e9046a1..a02a4fbe3afc 100644 --- a/tests/components/nx584/test_binary_sensor.py +++ b/tests/components/nx584/test_binary_sensor.py @@ -154,7 +154,7 @@ class TestNX584Watcher(unittest.TestCase): watcher = nx584.NX584Watcher(None, zones) watcher._process_zone_event({"zone": 1, "zone_state": False}) assert not zone1["state"] - assert 1 == mock_update.call_count + assert mock_update.call_count == 1 @mock.patch.object(nx584.NX584ZoneSensor, "schedule_update_ha_state") def test_process_zone_event_missing_zone(self, mock_update): @@ -204,8 +204,7 @@ class TestNX584Watcher(unittest.TestCase): if empty_me: empty_me.pop() raise requests.exceptions.ConnectionError() - else: - raise StopMe() + raise StopMe() watcher = nx584.NX584Watcher(None, {}) with mock.patch.object(watcher, "_run") as mock_inner: diff --git a/tests/components/pilight/test_init.py b/tests/components/pilight/test_init.py index 2a2342a90dcb..d9b4f4859bbf 100644 --- a/tests/components/pilight/test_init.py +++ b/tests/components/pilight/test_init.py @@ -37,11 +37,10 @@ class PilightDaemonSim: def __init__(self, host, port): """Init pilight client, ignore parameters.""" - pass def send_code(self, call): # pylint: disable=no-self-use """Handle pilight.send service callback.""" - _LOGGER.error("PilightDaemonSim payload: " + str(call)) + _LOGGER.error("PilightDaemonSim payload: %s", call) def start(self): """Handle homeassistant.start callback. @@ -61,7 +60,7 @@ class PilightDaemonSim: def set_callback(self, function): """Handle pilight.pilight_received event callback.""" self.callback = function - _LOGGER.error("PilightDaemonSim callback: " + str(function)) + _LOGGER.error("PilightDaemonSim callback: %s", function) @pytest.mark.skip("Flaky") @@ -91,7 +90,7 @@ class TestPilight(unittest.TestCase): mock_client.assert_called_once_with( host=pilight.DEFAULT_HOST, port=pilight.DEFAULT_PORT ) - assert 1 == mock_error.call_count + assert mock_error.call_count == 1 @patch("homeassistant.components.pilight._LOGGER.error") def test_connection_timeout_error(self, mock_error): @@ -106,7 +105,7 @@ class TestPilight(unittest.TestCase): mock_client.assert_called_once_with( host=pilight.DEFAULT_HOST, port=pilight.DEFAULT_PORT ) - assert 1 == mock_error.call_count + assert mock_error.call_count == 1 @patch("pilight.pilight.Client", PilightDaemonSim) @patch("homeassistant.core._LOGGER.error") diff --git a/tests/components/rfxtrx/test_init.py b/tests/components/rfxtrx/test_init.py index ec457af7575b..6b75cc92fc6d 100644 --- a/tests/components/rfxtrx/test_init.py +++ b/tests/components/rfxtrx/test_init.py @@ -4,7 +4,7 @@ import unittest import pytest -from homeassistant.components import rfxtrx as rfxtrx +from homeassistant.components import rfxtrx from homeassistant.core import callback from homeassistant.setup import setup_component diff --git a/tests/components/vultr/test_switch.py b/tests/components/vultr/test_switch.py index 4f61291c4add..6a5c382a2d2b 100644 --- a/tests/components/vultr/test_switch.py +++ b/tests/components/vultr/test_switch.py @@ -72,41 +72,41 @@ class TestVultrSwitchSetup(unittest.TestCase): for device in self.DEVICES: if device.subscription == "555555": - assert "Vultr {}" == device.name + assert device.name == "Vultr {}" tested += 1 device.update() device_attrs = device.device_state_attributes if device.subscription == "555555": - assert "Vultr Another Server" == device.name + assert device.name == "Vultr Another Server" tested += 1 if device.name == "A Server": assert device.is_on is True - assert "on" == device.state - assert "mdi:server" == device.icon - assert "1000" == device_attrs[ATTR_ALLOWED_BANDWIDTH] - assert "yes" == device_attrs[ATTR_AUTO_BACKUPS] - assert "123.123.123.123" == device_attrs[ATTR_IPV4_ADDRESS] - assert "10.05" == device_attrs[ATTR_COST_PER_MONTH] - assert "2013-12-19 14:45:41" == device_attrs[ATTR_CREATED_AT] - assert "576965" == device_attrs[ATTR_SUBSCRIPTION_ID] + assert device.state == "on" + assert device.icon == "mdi:server" + assert device_attrs[ATTR_ALLOWED_BANDWIDTH] == "1000" + assert device_attrs[ATTR_AUTO_BACKUPS] == "yes" + assert device_attrs[ATTR_IPV4_ADDRESS] == "123.123.123.123" + assert device_attrs[ATTR_COST_PER_MONTH] == "10.05" + assert device_attrs[ATTR_CREATED_AT] == "2013-12-19 14:45:41" + assert device_attrs[ATTR_SUBSCRIPTION_ID] == "576965" tested += 1 elif device.name == "Failed Server": assert device.is_on is False - assert "off" == device.state - assert "mdi:server-off" == device.icon - assert "1000" == device_attrs[ATTR_ALLOWED_BANDWIDTH] - assert "no" == device_attrs[ATTR_AUTO_BACKUPS] - assert "192.168.100.50" == device_attrs[ATTR_IPV4_ADDRESS] - assert "73.25" == device_attrs[ATTR_COST_PER_MONTH] - assert "2014-10-13 14:45:41" == device_attrs[ATTR_CREATED_AT] - assert "123456" == device_attrs[ATTR_SUBSCRIPTION_ID] + assert device.state == "off" + assert device.icon == "mdi:server-off" + assert device_attrs[ATTR_ALLOWED_BANDWIDTH] == "1000" + assert device_attrs[ATTR_AUTO_BACKUPS] == "no" + assert device_attrs[ATTR_IPV4_ADDRESS] == "192.168.100.50" + assert device_attrs[ATTR_COST_PER_MONTH] == "73.25" + assert device_attrs[ATTR_CREATED_AT] == "2014-10-13 14:45:41" + assert device_attrs[ATTR_SUBSCRIPTION_ID] == "123456" tested += 1 - assert 4 == tested + assert tested == 4 @requests_mock.Mocker() def test_turn_on(self, mock): @@ -120,7 +120,7 @@ class TestVultrSwitchSetup(unittest.TestCase): device.turn_on() # Turn on - assert 1 == mock_start.call_count + assert mock_start.call_count == 1 @requests_mock.Mocker() def test_turn_off(self, mock): @@ -134,7 +134,7 @@ class TestVultrSwitchSetup(unittest.TestCase): device.turn_off() # Turn off - assert 1 == mock_halt.call_count + assert mock_halt.call_count == 1 def test_invalid_switch_config(self): """Test config type failures.""" diff --git a/tests/components/yandextts/test_tts.py b/tests/components/yandextts/test_tts.py index 182c629d795a..279ed1fbd017 100644 --- a/tests/components/yandextts/test_tts.py +++ b/tests/components/yandextts/test_tts.py @@ -11,7 +11,9 @@ import homeassistant.components.tts as tts from homeassistant.setup import setup_component from tests.common import assert_setup_component, get_test_home_assistant, mock_service -from tests.components.tts.test_init import mutagen_mock # noqa: F401 +from tests.components.tts.test_init import ( # noqa: F401, pylint: disable=unused-import + mutagen_mock, +) class TestTTSYandexPlatform: diff --git a/tests/components/zwave/test_climate.py b/tests/components/zwave/test_climate.py index 3586c992c083..5275ca795067 100644 --- a/tests/components/zwave/test_climate.py +++ b/tests/components/zwave/test_climate.py @@ -853,7 +853,6 @@ def test_fan_action_value_changed(device): def test_aux_heat_unsupported_set(device): """Test aux heat for climate device.""" - device = device assert device.values.primary.data == HVAC_MODE_HEAT device.turn_aux_heat_on() assert device.values.primary.data == HVAC_MODE_HEAT @@ -863,7 +862,6 @@ def test_aux_heat_unsupported_set(device): def test_aux_heat_unsupported_value_changed(device): """Test aux heat for climate device.""" - device = device assert device.is_aux_heat is None device.values.primary.data = HVAC_MODE_HEAT value_changed(device.values.primary) diff --git a/tests/components/zwave/test_node_entity.py b/tests/components/zwave/test_node_entity.py index 28161cfa18b6..4d117179328d 100644 --- a/tests/components/zwave/test_node_entity.py +++ b/tests/components/zwave/test_node_entity.py @@ -615,7 +615,7 @@ class TestZWaveNodeEntity(unittest.TestCase): def test_name(self): """Test name property.""" - assert "Mock Node" == self.entity.name + assert self.entity.name == "Mock Node" def test_state_before_update(self): """Test state before update was called.""" @@ -625,33 +625,33 @@ class TestZWaveNodeEntity(unittest.TestCase): """Test state property.""" self.node.is_ready = False self.entity.node_changed() - assert "initializing" == self.entity.state + assert self.entity.state == "initializing" self.node.is_failed = True self.node.query_stage = "Complete" self.entity.node_changed() - assert "dead" == self.entity.state + assert self.entity.state == "dead" self.node.is_failed = False self.node.is_awake = False self.entity.node_changed() - assert "sleeping" == self.entity.state + assert self.entity.state == "sleeping" def test_state_ready(self): """Test state property.""" self.node.query_stage = "Complete" self.node.is_ready = True self.entity.node_changed() - assert "ready" == self.entity.state + assert self.entity.state == "ready" self.node.is_failed = True self.entity.node_changed() - assert "dead" == self.entity.state + assert self.entity.state == "dead" self.node.is_failed = False self.node.is_awake = False self.entity.node_changed() - assert "sleeping" == self.entity.state + assert self.entity.state == "sleeping" def test_not_polled(self): """Test should_poll property.""" @@ -659,7 +659,7 @@ class TestZWaveNodeEntity(unittest.TestCase): def test_unique_id(self): """Test unique_id.""" - assert "node-567" == self.entity.unique_id + assert self.entity.unique_id == "node-567" def test_unique_id_missing_data(self): """Test unique_id.""" diff --git a/tests/helpers/test_check_config.py b/tests/helpers/test_check_config.py index 0182d830e4c3..7a5d606bcc8b 100644 --- a/tests/helpers/test_check_config.py +++ b/tests/helpers/test_check_config.py @@ -128,7 +128,7 @@ async def test_bootstrap_error(hass, loop): res = await async_check_ha_config_file(hass) log_ha_config(res) - res.errors[0].domain is None + assert res.errors[0].domain is None # Only 1 error expected res.errors.pop(0) diff --git a/tests/helpers/test_condition.py b/tests/helpers/test_condition.py index afa428805e98..4e8e59aad78c 100644 --- a/tests/helpers/test_condition.py +++ b/tests/helpers/test_condition.py @@ -180,7 +180,7 @@ async def test_if_numeric_state_not_raise_on_unavailable(hass): async def test_extract_entities(): """Test extracting entities.""" - condition.async_extract_entities( + assert condition.async_extract_entities( { "condition": "and", "conditions": [ @@ -201,7 +201,7 @@ async def test_extract_entities(): async def test_extract_devices(): """Test extracting devices.""" - condition.async_extract_devices( + assert condition.async_extract_devices( { "condition": "and", "conditions": [ diff --git a/tests/helpers/test_config_validation.py b/tests/helpers/test_config_validation.py index ff269d2b8c6d..1d0824628492 100644 --- a/tests/helpers/test_config_validation.py +++ b/tests/helpers/test_config_validation.py @@ -621,11 +621,11 @@ def test_deprecated_with_invalidation_version(caplog, schema, version): test_data = {"mars": True} with pytest.raises(vol.MultipleInvalid) as exc_info: invalidated_schema(test_data) - assert ( + assert str(exc_info.value) == ( "The 'mars' option (with value 'True') is deprecated, " "please remove it from your configuration. This option will " "become invalid in version 0.1.0" - ) == str(exc_info.value) + ) def test_deprecated_with_replacement_key_and_invalidation_version( @@ -681,11 +681,11 @@ def test_deprecated_with_replacement_key_and_invalidation_version( test_data = {"mars": True} with pytest.raises(vol.MultipleInvalid) as exc_info: invalidated_schema(test_data) - assert ( + assert str(exc_info.value) == ( "The 'mars' option (with value 'True') is deprecated, " "please replace it with 'jupiter'. This option will become " "invalid in version 0.1.0" - ) == str(exc_info.value) + ) def test_deprecated_with_default(caplog, schema): @@ -833,11 +833,11 @@ def test_deprecated_with_replacement_key_invalidation_version_default( test_data = {"mars": True} with pytest.raises(vol.MultipleInvalid) as exc_info: invalidated_schema(test_data) - assert ( + assert str(exc_info.value) == ( "The 'mars' option (with value 'True') is deprecated, " "please replace it with 'jupiter'. This option will become " "invalid in version 0.1.0" - ) == str(exc_info.value) + ) def test_deprecated_cant_find_module(): diff --git a/tests/helpers/test_service.py b/tests/helpers/test_service.py index cc4098a613a0..0f575a7fc542 100644 --- a/tests/helpers/test_service.py +++ b/tests/helpers/test_service.py @@ -11,7 +11,7 @@ import voluptuous as vol # To prevent circular import when running just this file from homeassistant import core as ha, exceptions from homeassistant.auth.permissions import PolicyPermissions -import homeassistant.components # noqa: F401 +import homeassistant.components # noqa: F401, pylint: disable=unused-import from homeassistant.const import ( ATTR_ENTITY_ID, ENTITY_MATCH_ALL, @@ -144,10 +144,10 @@ class TestServiceHelpers(unittest.TestCase): service.call_from_config(self.hass, config) self.hass.block_till_done() - assert "goodbye" == self.calls[0].data["hello"] - assert "complex" == self.calls[0].data["data"]["value"] - assert "simple" == self.calls[0].data["data"]["simple"] - assert "list" == self.calls[0].data["list"][0] + assert self.calls[0].data["hello"] == "goodbye" + assert self.calls[0].data["data"]["value"] == "complex" + assert self.calls[0].data["data"]["simple"] == "simple" + assert self.calls[0].data["list"][0] == "list" def test_passing_variables_to_templates(self): """Test passing variables to templates.""" @@ -167,7 +167,7 @@ class TestServiceHelpers(unittest.TestCase): ) self.hass.block_till_done() - assert "goodbye" == self.calls[0].data["hello"] + assert self.calls[0].data["hello"] == "goodbye" def test_bad_template(self): """Test passing bad template.""" @@ -223,13 +223,13 @@ class TestServiceHelpers(unittest.TestCase): def test_fail_silently_if_no_service(self, mock_log): """Test failing if service is missing.""" service.call_from_config(self.hass, None) - assert 1 == mock_log.call_count + assert mock_log.call_count == 1 service.call_from_config(self.hass, {}) - assert 2 == mock_log.call_count + assert mock_log.call_count == 2 service.call_from_config(self.hass, {"service": "invalid"}) - assert 3 == mock_log.call_count + assert mock_log.call_count == 3 async def test_extract_entity_ids(hass): diff --git a/tests/helpers/test_state.py b/tests/helpers/test_state.py index c2b89406f24e..8a08c06054da 100644 --- a/tests/helpers/test_state.py +++ b/tests/helpers/test_state.py @@ -129,8 +129,8 @@ async def test_reproduce_turn_on(hass): assert len(calls) > 0 last_call = calls[-1] assert last_call.domain == "light" - assert SERVICE_TURN_ON == last_call.service - assert "light.test" == last_call.data.get("entity_id") + assert last_call.service == SERVICE_TURN_ON + assert last_call.data.get("entity_id") == "light.test" async def test_reproduce_turn_off(hass): @@ -146,8 +146,8 @@ async def test_reproduce_turn_off(hass): assert len(calls) > 0 last_call = calls[-1] assert last_call.domain == "light" - assert SERVICE_TURN_OFF == last_call.service - assert "light.test" == last_call.data.get("entity_id") + assert last_call.service == SERVICE_TURN_OFF + assert last_call.data.get("entity_id") == "light.test" async def test_reproduce_complex_data(hass): @@ -167,8 +167,8 @@ async def test_reproduce_complex_data(hass): assert len(calls) > 0 last_call = calls[-1] assert last_call.domain == "light" - assert SERVICE_TURN_ON == last_call.service - assert complex_data == last_call.data.get("rgb_color") + assert last_call.service == SERVICE_TURN_ON + assert last_call.data.get("rgb_color") == complex_data async def test_reproduce_bad_state(hass): diff --git a/tests/test_config.py b/tests/test_config.py index f226c72f7ad5..d0d9148f2dd2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -111,8 +111,8 @@ async def test_ensure_config_exists_uses_existing_config(hass): create_file(YAML_PATH) await config_util.async_ensure_config_exists(hass) - with open(YAML_PATH) as f: - content = f.read() + with open(YAML_PATH) as fp: + content = fp.read() # File created with create_file are empty assert content == "" @@ -127,8 +127,8 @@ def test_load_yaml_config_converts_empty_files_to_dict(): def test_load_yaml_config_raises_error_if_not_dict(): """Test error raised when YAML file is not a dict.""" - with open(YAML_PATH, "w") as f: - f.write("5") + with open(YAML_PATH, "w") as fp: + fp.write("5") with pytest.raises(HomeAssistantError): config_util.load_yaml_config_file(YAML_PATH) @@ -136,8 +136,8 @@ def test_load_yaml_config_raises_error_if_not_dict(): def test_load_yaml_config_raises_error_if_malformed_yaml(): """Test error raised if invalid YAML.""" - with open(YAML_PATH, "w") as f: - f.write(":") + with open(YAML_PATH, "w") as fp: + fp.write(":") with pytest.raises(HomeAssistantError): config_util.load_yaml_config_file(YAML_PATH) @@ -145,8 +145,8 @@ def test_load_yaml_config_raises_error_if_malformed_yaml(): def test_load_yaml_config_raises_error_if_unsafe_yaml(): """Test error raised if unsafe YAML.""" - with open(YAML_PATH, "w") as f: - f.write("hello: !!python/object/apply:os.system") + with open(YAML_PATH, "w") as fp: + fp.write("hello: !!python/object/apply:os.system") with pytest.raises(HomeAssistantError): config_util.load_yaml_config_file(YAML_PATH) @@ -154,9 +154,9 @@ def test_load_yaml_config_raises_error_if_unsafe_yaml(): def test_load_yaml_config_preserves_key_order(): """Test removal of library.""" - with open(YAML_PATH, "w") as f: - f.write("hello: 2\n") - f.write("world: 1\n") + with open(YAML_PATH, "w") as fp: + fp.write("hello: 2\n") + fp.write("world: 1\n") assert [("hello", 2), ("world", 1)] == list( config_util.load_yaml_config_file(YAML_PATH).items() diff --git a/tests/test_core.py b/tests/test_core.py index a28c8571f318..8b4a2ae9f84a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -304,10 +304,11 @@ class TestEvent(unittest.TestCase): def test_repr(self): """Test that repr method works.""" - assert "" == str(ha.Event("TestEvent")) + assert str(ha.Event("TestEvent")) == "" - assert "" == str( - ha.Event("TestEvent", {"beer": "nice"}, ha.EventOrigin.remote) + assert ( + str(ha.Event("TestEvent", {"beer": "nice"}, ha.EventOrigin.remote)) + == "" ) def test_as_dict(self): @@ -402,7 +403,7 @@ class TestEventBus(unittest.TestCase): self.bus.fire("test_event") self.hass.block_till_done() - assert 1 == len(runs) + assert len(runs) == 1 def test_listen_once_event_with_coroutine(self): """Test listen_once_event method.""" @@ -419,7 +420,7 @@ class TestEventBus(unittest.TestCase): self.bus.fire("test_event") self.hass.block_till_done() - assert 1 == len(runs) + assert len(runs) == 1 def test_listen_once_event_with_thread(self): """Test listen_once_event method.""" @@ -435,7 +436,7 @@ class TestEventBus(unittest.TestCase): self.bus.fire("test_event") self.hass.block_till_done() - assert 1 == len(runs) + assert len(runs) == 1 def test_thread_event_listener(self): """Test thread event listener.""" @@ -488,26 +489,26 @@ def test_state_init(): def test_state_domain(): """Test domain.""" state = ha.State("some_domain.hello", "world") - assert "some_domain" == state.domain + assert state.domain == "some_domain" def test_state_object_id(): """Test object ID.""" state = ha.State("domain.hello", "world") - assert "hello" == state.object_id + assert state.object_id == "hello" def test_state_name_if_no_friendly_name_attr(): """Test if there is no friendly name.""" state = ha.State("domain.hello_world", "world") - assert "hello world" == state.name + assert state.name == "hello world" def test_state_name_if_friendly_name_attr(): """Test if there is a friendly name.""" name = "Some Unique Name" state = ha.State("domain.hello_world", "world", {ATTR_FRIENDLY_NAME: name}) - assert name == state.name + assert state.name == name def test_state_dict_conversion(): @@ -535,14 +536,13 @@ def test_state_dict_conversion_with_wrong_data(): def test_state_repr(): """Test state.repr.""" - assert "" == str( - ha.State("happy.happy", "on", last_changed=datetime(1984, 12, 8, 12, 0, 0)) + assert ( + str(ha.State("happy.happy", "on", last_changed=datetime(1984, 12, 8, 12, 0, 0))) + == "" ) assert ( - "" - == str( + str( ha.State( "happy.happy", "on", @@ -550,6 +550,8 @@ def test_state_repr(): datetime(1984, 12, 8, 12, 0, 0), ) ) + == "" ) @@ -578,12 +580,12 @@ class TestStateMachine(unittest.TestCase): def test_entity_ids(self): """Test get_entity_ids method.""" ent_ids = self.states.entity_ids() - assert 2 == len(ent_ids) + assert len(ent_ids) == 2 assert "light.bowl" in ent_ids assert "switch.ac" in ent_ids ent_ids = self.states.entity_ids("light") - assert 1 == len(ent_ids) + assert len(ent_ids) == 1 assert "light.bowl" in ent_ids def test_all(self): @@ -606,16 +608,16 @@ class TestStateMachine(unittest.TestCase): self.hass.block_till_done() assert "light.bowl" not in self.states.entity_ids() - assert 1 == len(events) - assert "light.bowl" == events[0].data.get("entity_id") + assert len(events) == 1 + assert events[0].data.get("entity_id") == "light.bowl" assert events[0].data.get("old_state") is not None - assert "light.bowl" == events[0].data["old_state"].entity_id + assert events[0].data["old_state"].entity_id == "light.bowl" assert events[0].data.get("new_state") is None # If it does not exist, we should get False assert not self.states.remove("light.Bowl") self.hass.block_till_done() - assert 1 == len(events) + assert len(events) == 1 def test_case_insensitivty(self): """Test insensitivty.""" @@ -631,7 +633,7 @@ class TestStateMachine(unittest.TestCase): self.hass.block_till_done() assert self.states.is_state("light.bowl", "off") - assert 1 == len(runs) + assert len(runs) == 1 def test_last_changed_not_updated_on_same_state(self): """Test to not update the existing, same state.""" @@ -659,11 +661,11 @@ class TestStateMachine(unittest.TestCase): self.states.set("light.bowl", "on") self.hass.block_till_done() - assert 0 == len(events) + assert len(events) == 0 self.states.set("light.bowl", "on", None, True) self.hass.block_till_done() - assert 1 == len(events) + assert len(events) == 1 def test_service_call_repr(): @@ -734,7 +736,7 @@ class TestServiceRegistry(unittest.TestCase): assert self.calls_register[-1].data["service"] == "register_calls" assert self.services.call("test_domain", "REGISTER_CALLS", blocking=True) - assert 1 == len(calls) + assert len(calls) == 1 def test_call_non_existing_with_blocking(self): """Test non-existing with blocking.""" @@ -758,7 +760,7 @@ class TestServiceRegistry(unittest.TestCase): assert self.services.call("test_domain", "REGISTER_CALLS", blocking=True) self.hass.block_till_done() - assert 1 == len(calls) + assert len(calls) == 1 def test_async_service_partial(self): """Test registering and calling an wrapped async service.""" @@ -799,7 +801,7 @@ class TestServiceRegistry(unittest.TestCase): assert self.services.call("test_domain", "REGISTER_CALLS", blocking=True) self.hass.block_till_done() - assert 1 == len(calls) + assert len(calls) == 1 def test_remove_service(self): """Test remove service.""" @@ -888,12 +890,12 @@ class TestConfig(unittest.TestCase): def test_path_with_file(self): """Test get_config_path method.""" self.config.config_dir = "/test/ha-config" - assert "/test/ha-config/test.conf" == self.config.path("test.conf") + assert self.config.path("test.conf") == "/test/ha-config/test.conf" def test_path_with_dir_and_file(self): """Test get_config_path method.""" self.config.config_dir = "/test/ha-config" - assert "/test/ha-config/dir/test.conf" == self.config.path("dir", "test.conf") + assert self.config.path("dir", "test.conf") == "/test/ha-config/dir/test.conf" def test_as_dict(self): """Test as dict.""" @@ -1056,7 +1058,7 @@ def test_timer_out_of_sync(mock_monotonic, loop): assert abs(event_data[ATTR_SECONDS] - 2.433333) < 0.001 assert len(funcs) == 2 - fire_time_event, stop_timer = funcs + fire_time_event, _ = funcs assert len(hass.loop.call_later.mock_calls) == 2 From cedf7e3945ff387215018e6a4368c099fd9d8990 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:36:49 +0300 Subject: [PATCH 166/653] Fix unhandled exceptions for config, default_config, harmony (#33731) * replaced MagicMock with CoroutineMock to avoid exception * added conversion to str so mock returns unique-id that doesn't throw json exception * added non-empty config since hass throws exception when config is empty --- homeassistant/components/harmony/util.py | 2 +- tests/components/config/test_group.py | 6 ++++-- tests/components/default_config/test_init.py | 2 +- tests/ignore_uncaught_exceptions.py | 5 ----- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/harmony/util.py b/homeassistant/components/harmony/util.py index 69ed44cb7dac..412aa2c69407 100644 --- a/homeassistant/components/harmony/util.py +++ b/homeassistant/components/harmony/util.py @@ -11,7 +11,7 @@ def find_unique_id_for_remote(harmony: HarmonyAPI): """Find the unique id for both websocket and xmpp clients.""" websocket_unique_id = harmony.hub_config.info.get("activeRemoteId") if websocket_unique_id is not None: - return websocket_unique_id + return str(websocket_unique_id) # fallback to the xmpp unique id if websocket is not available return harmony.config["global"]["timeStampHash"].split(";")[-1] diff --git a/tests/components/config/test_group.py b/tests/components/config/test_group.py index 49d168e27966..d00e0317e9ec 100644 --- a/tests/components/config/test_group.py +++ b/tests/components/config/test_group.py @@ -1,6 +1,8 @@ """Test Group config panel.""" import json -from unittest.mock import MagicMock, patch +from unittest.mock import patch + +from asynctest import CoroutineMock from homeassistant.bootstrap import async_setup_component from homeassistant.components import config @@ -50,7 +52,7 @@ async def test_update_device_config(hass, hass_client): """Mock writing data.""" written.append(data) - mock_call = MagicMock() + mock_call = CoroutineMock() with patch("homeassistant.components.config._read", mock_read), patch( "homeassistant.components.config._write", mock_write diff --git a/tests/components/default_config/test_init.py b/tests/components/default_config/test_init.py index 2ec3467e0db2..8e0862eb0cb7 100644 --- a/tests/components/default_config/test_init.py +++ b/tests/components/default_config/test_init.py @@ -15,4 +15,4 @@ def recorder_url_mock(): async def test_setup(hass): """Test setup.""" - assert await async_setup_component(hass, "default_config", {}) + assert await async_setup_component(hass, "default_config", {"foo": "bar"}) diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 64710242132b..f4720db25eef 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -4,8 +4,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.cast.test_media_player", "test_entry_setup_single_config"), ("tests.components.cast.test_media_player", "test_entry_setup_list_config"), ("tests.components.cast.test_media_player", "test_entry_setup_platform_not_ready"), - ("tests.components.config.test_group", "test_update_device_config"), - ("tests.components.default_config.test_init", "test_setup"), ("tests.components.demo.test_init", "test_setting_up_demo"), ("tests.components.discovery.test_init", "test_discover_config_flow"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_attributes"), @@ -58,7 +56,4 @@ IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [ "tests.components.smartthings.test_init", "test_config_entry_loads_unconnected_cloud", ), - ("tests.components.harmony.test_config_flow", "test_form_import"), - ("tests.components.harmony.test_config_flow", "test_form_ssdp"), - ("tests.components.harmony.test_config_flow", "test_user_form"), ] From 6dfffb23c4c95369d8e6273f214a775baec7a247 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Mon, 6 Apr 2020 11:57:51 -0500 Subject: [PATCH 167/653] Fix Plex debounce wrapper (#33730) * Fix debounce wrapper by converting to async * Review suggestions --- homeassistant/components/plex/__init__.py | 2 +- homeassistant/components/plex/media_player.py | 8 ------- homeassistant/components/plex/server.py | 21 ++++++++++++------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/plex/__init__.py b/homeassistant/components/plex/__init__.py index a73111793a7f..ff36f4f5c320 100644 --- a/homeassistant/components/plex/__init__.py +++ b/homeassistant/components/plex/__init__.py @@ -175,7 +175,7 @@ async def async_setup_entry(hass, entry): unsub = async_dispatcher_connect( hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id), - plex_server.update_platforms, + plex_server.async_update_platforms, ) hass.data[PLEX_DOMAIN][DISPATCHERS].setdefault(server_id, []) hass.data[PLEX_DOMAIN][DISPATCHERS][server_id].append(unsub) diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index 00d1b6084ad0..fd61dfce26f8 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -494,7 +494,6 @@ class PlexMediaPlayer(MediaPlayerDevice): if self.device and "playback" in self._device_protocol_capabilities: self.device.setVolume(int(volume * 100), self._active_media_plexapi_type) self._volume_level = volume # store since we can't retrieve - self.plex_server.update_platforms() @property def volume_level(self): @@ -533,31 +532,26 @@ class PlexMediaPlayer(MediaPlayerDevice): """Send play command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.play(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_pause(self): """Send pause command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.pause(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_stop(self): """Send stop command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.stop(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_next_track(self): """Send next track command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.skipNext(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_previous_track(self): """Send previous track command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.skipPrevious(self._active_media_plexapi_type) - self.plex_server.update_platforms() def play_media(self, media_type, media_id, **kwargs): """Play a piece of media.""" @@ -594,8 +588,6 @@ class PlexMediaPlayer(MediaPlayerDevice): except requests.exceptions.ConnectTimeout: _LOGGER.error("Timed out playing on %s", self.name) - self.plex_server.update_platforms() - def _get_music_media(self, library_name, src): """Find music media and return a Plex media object.""" artist_name = src["artist_name"] diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index 80e7c92640a7..a7b66c3a3ba3 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -12,7 +12,7 @@ import requests.exceptions from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL -from homeassistant.helpers.dispatcher import dispatcher_send +from homeassistant.helpers.dispatcher import async_dispatcher_send, dispatcher_send from homeassistant.helpers.event import async_call_later from .const import ( @@ -51,10 +51,10 @@ def debounce(func): """Handle call_later callback.""" nonlocal unsub unsub = None - await self.hass.async_add_executor_job(func, self) + await func(self) @wraps(func) - def wrapper(self): + async def wrapper(self): """Schedule async callback.""" nonlocal unsub if unsub: @@ -186,8 +186,12 @@ class PlexServer: session, ) + def _fetch_platform_data(self): + """Fetch all data from the Plex server in a single method.""" + return (self._plex_server.clients(), self._plex_server.sessions()) + @debounce - def update_platforms(self): + async def async_update_platforms(self): """Update the platform entities.""" _LOGGER.debug("Updating devices") @@ -209,8 +213,9 @@ class PlexServer: monitored_users.add(new_user) try: - devices = self._plex_server.clients() - sessions = self._plex_server.sessions() + devices, sessions = await self.hass.async_add_executor_job( + self._fetch_platform_data + ) except ( plexapi.exceptions.BadRequest, requests.exceptions.RequestException, @@ -271,13 +276,13 @@ class PlexServer: self._known_idle.add(client_id) if new_entity_configs: - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_NEW_MP_SIGNAL.format(self.machine_identifier), new_entity_configs, ) - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_UPDATE_SENSOR_SIGNAL.format(self.machine_identifier), sessions, From c2a90a4f0d5161888515a2959f96ad71768f4280 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Mon, 6 Apr 2020 19:05:43 +0200 Subject: [PATCH 168/653] Remove global variable from mochad (#33745) --- homeassistant/components/mochad/__init__.py | 8 +++----- homeassistant/components/mochad/light.py | 5 +++-- homeassistant/components/mochad/switch.py | 5 +++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/mochad/__init__.py b/homeassistant/components/mochad/__init__.py index 50156b2b4b3f..6f560aa9ed65 100644 --- a/homeassistant/components/mochad/__init__.py +++ b/homeassistant/components/mochad/__init__.py @@ -15,8 +15,6 @@ import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) -CONTROLLER = None - CONF_COMM_TYPE = "comm_type" DOMAIN = "mochad" @@ -42,22 +40,22 @@ def setup(hass, config): host = conf.get(CONF_HOST) port = conf.get(CONF_PORT) - global CONTROLLER # pylint: disable=global-statement try: - CONTROLLER = MochadCtrl(host, port) + mochad_controller = MochadCtrl(host, port) except exceptions.ConfigurationError: _LOGGER.exception() return False def stop_mochad(event): """Stop the Mochad service.""" - CONTROLLER.disconnect() + mochad_controller.disconnect() def start_mochad(event): """Start the Mochad service.""" hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_mochad) hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_mochad) + hass.data[DOMAIN] = mochad_controller return True diff --git a/homeassistant/components/mochad/light.py b/homeassistant/components/mochad/light.py index 871caadd95ca..1f5cbc6bb95f 100644 --- a/homeassistant/components/mochad/light.py +++ b/homeassistant/components/mochad/light.py @@ -13,7 +13,7 @@ from homeassistant.components.light import ( from homeassistant.const import CONF_ADDRESS, CONF_DEVICES, CONF_NAME, CONF_PLATFORM from homeassistant.helpers import config_validation as cv -from . import CONF_COMM_TYPE, CONTROLLER, DOMAIN, REQ_LOCK +from . import CONF_COMM_TYPE, DOMAIN, REQ_LOCK _LOGGER = logging.getLogger(__name__) @@ -38,8 +38,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up X10 dimmers over a mochad controller.""" + mochad_controller = hass.data[DOMAIN] devs = config.get(CONF_DEVICES) - add_entities([MochadLight(hass, CONTROLLER.ctrl, dev) for dev in devs]) + add_entities([MochadLight(hass, mochad_controller.ctrl, dev) for dev in devs]) return True diff --git a/homeassistant/components/mochad/switch.py b/homeassistant/components/mochad/switch.py index 14fb601f9194..4ce8f6766592 100644 --- a/homeassistant/components/mochad/switch.py +++ b/homeassistant/components/mochad/switch.py @@ -9,7 +9,7 @@ from homeassistant.components.switch import SwitchDevice from homeassistant.const import CONF_ADDRESS, CONF_DEVICES, CONF_NAME, CONF_PLATFORM from homeassistant.helpers import config_validation as cv -from . import CONF_COMM_TYPE, CONTROLLER, DOMAIN, REQ_LOCK +from . import CONF_COMM_TYPE, DOMAIN, REQ_LOCK _LOGGER = logging.getLogger(__name__) @@ -30,8 +30,9 @@ PLATFORM_SCHEMA = vol.Schema( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up X10 switches over a mochad controller.""" + mochad_controller = hass.data[DOMAIN] devs = config.get(CONF_DEVICES) - add_entities([MochadSwitch(hass, CONTROLLER.ctrl, dev) for dev in devs]) + add_entities([MochadSwitch(hass, mochad_controller.ctrl, dev) for dev in devs]) return True From 476072927a5d55b5c4ed774fdc9e5977ba1a8937 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 6 Apr 2020 19:09:44 +0200 Subject: [PATCH 169/653] Collection of random test improvements (#33742) --- tests/components/alert/test_init.py | 16 +- tests/components/alexa/__init__.py | 1 - tests/components/alexa/test_smart_home.py | 26 +- tests/components/demo/test_climate.py | 72 +-- tests/components/demo/test_light.py | 6 +- tests/components/demo/test_lock.py | 63 ++- tests/components/demo/test_vacuum.py | 491 ++++++++---------- tests/components/demo/test_water_heater.py | 182 ++++--- tests/components/melissa/test_climate.py | 30 +- tests/components/water_heater/common.py | 20 +- .../water_heater/test_reproduce_state.py | 18 +- 11 files changed, 438 insertions(+), 487 deletions(-) diff --git a/tests/components/alert/test_init.py b/tests/components/alert/test_init.py index d4de97f3b465..96c36a87edcc 100644 --- a/tests/components/alert/test_init.py +++ b/tests/components/alert/test_init.py @@ -234,15 +234,15 @@ class TestAlert(unittest.TestCase): self.hass.services.register(notify.DOMAIN, NOTIFIER, record_event) assert setup_component(self.hass, alert.DOMAIN, config) - assert 0 == len(events) + assert len(events) == 0 self.hass.states.set("sensor.test", STATE_ON) self.hass.block_till_done() - assert 1 == len(events) + assert len(events) == 1 self.hass.states.set("sensor.test", STATE_OFF) self.hass.block_till_done() - assert 1 == len(events) + assert len(events) == 1 def test_notification(self): """Test notifications.""" @@ -256,15 +256,15 @@ class TestAlert(unittest.TestCase): self.hass.services.register(notify.DOMAIN, NOTIFIER, record_event) assert setup_component(self.hass, alert.DOMAIN, TEST_CONFIG) - assert 0 == len(events) + assert len(events) == 0 self.hass.states.set("sensor.test", STATE_ON) self.hass.block_till_done() - assert 1 == len(events) + assert len(events) == 1 self.hass.states.set("sensor.test", STATE_OFF) self.hass.block_till_done() - assert 2 == len(events) + assert len(events) == 2 def test_sending_non_templated_notification(self): """Test notifications.""" @@ -350,11 +350,11 @@ class TestAlert(unittest.TestCase): self.hass.services.register(notify.DOMAIN, NOTIFIER, record_event) assert setup_component(self.hass, alert.DOMAIN, config) - assert 0 == len(events) + assert len(events) == 0 self.hass.states.set("sensor.test", STATE_ON) self.hass.block_till_done() - assert 0 == len(events) + assert len(events) == 0 def test_noack(self): """Test no ack feature.""" diff --git a/tests/components/alexa/__init__.py b/tests/components/alexa/__init__.py index a3bc548ee287..d9c1a5a40cd3 100644 --- a/tests/components/alexa/__init__.py +++ b/tests/components/alexa/__init__.py @@ -47,7 +47,6 @@ class MockConfig(config.AbstractConfig): async def async_accept_grant(self, code): """Accept a grant.""" - pass DEFAULT_CONFIG = MockConfig(None) diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index 87e3a94beb44..f94091a6741c 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -979,7 +979,7 @@ async def test_media_player(hass): hass, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "ChangeChannel", "media_player#test", @@ -988,7 +988,7 @@ async def test_media_player(hass): payload={"channel": {"number": "24"}, "channelMetadata": {"name": ""}}, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "ChangeChannel", "media_player#test", @@ -997,7 +997,7 @@ async def test_media_player(hass): payload={"channel": {"callSign": "ABC"}, "channelMetadata": {"name": ""}}, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "ChangeChannel", "media_player#test", @@ -1006,7 +1006,7 @@ async def test_media_player(hass): payload={"channel": {"number": ""}, "channelMetadata": {"name": "ABC"}}, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "ChangeChannel", "media_player#test", @@ -1018,7 +1018,7 @@ async def test_media_player(hass): }, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "ChangeChannel", "media_player#test", @@ -1027,7 +1027,7 @@ async def test_media_player(hass): payload={"channel": {"uri": "ABC"}, "channelMetadata": {"name": ""}}, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "SkipChannels", "media_player#test", @@ -1036,7 +1036,7 @@ async def test_media_player(hass): payload={"channelCount": 1}, ) - call, _ = await assert_request_calls_service( + await assert_request_calls_service( "Alexa.ChannelController", "SkipChannels", "media_player#test", @@ -1467,7 +1467,7 @@ async def test_media_player_seek_error(hass): # Test for media_position error. with pytest.raises(AssertionError): - call, msg = await assert_request_calls_service( + _, msg = await assert_request_calls_service( "Alexa.SeekController", "AdjustSeekPosition", "media_player#test_seek", @@ -1707,11 +1707,7 @@ async def assert_percentage_changes( AdjustPercentage, AdjustBrightness, etc. are examples of such requests. """ for result_volume, adjustment in adjustments: - if parameter: - payload = {parameter: adjustment} - else: - payload = {} - + payload = {parameter: adjustment} if parameter else {} call, _ = await assert_request_calls_service( namespace, name, endpoint, service, hass, payload=payload ) @@ -2475,7 +2471,7 @@ async def test_alarm_control_panel_disarmed(hass): properties = await reported_properties(hass, "alarm_control_panel#test_1") properties.assert_equal("Alexa.SecurityPanelController", "armState", "DISARMED") - call, msg = await assert_request_calls_service( + _, msg = await assert_request_calls_service( "Alexa.SecurityPanelController", "Arm", "alarm_control_panel#test_1", @@ -2487,7 +2483,7 @@ async def test_alarm_control_panel_disarmed(hass): properties = ReportedProperties(msg["context"]["properties"]) properties.assert_equal("Alexa.SecurityPanelController", "armState", "ARMED_STAY") - call, msg = await assert_request_calls_service( + _, msg = await assert_request_calls_service( "Alexa.SecurityPanelController", "Arm", "alarm_control_panel#test_1", diff --git a/tests/components/demo/test_climate.py b/tests/components/demo/test_climate.py index 2d1b7a85ff8e..efdab74304a5 100644 --- a/tests/components/demo/test_climate.py +++ b/tests/components/demo/test_climate.py @@ -49,12 +49,12 @@ def test_setup_params(hass): """Test the initial parameters.""" state = hass.states.get(ENTITY_CLIMATE) assert state.state == HVAC_MODE_COOL - assert 21 == state.attributes.get(ATTR_TEMPERATURE) - assert 22 == state.attributes.get(ATTR_CURRENT_TEMPERATURE) - assert "On High" == state.attributes.get(ATTR_FAN_MODE) - assert 67 == state.attributes.get(ATTR_HUMIDITY) - assert 54 == state.attributes.get(ATTR_CURRENT_HUMIDITY) - assert "Off" == state.attributes.get(ATTR_SWING_MODE) + assert state.attributes.get(ATTR_TEMPERATURE) == 21 + assert state.attributes.get(ATTR_CURRENT_TEMPERATURE) == 22 + assert state.attributes.get(ATTR_FAN_MODE) == "On High" + assert state.attributes.get(ATTR_HUMIDITY) == 67 + assert state.attributes.get(ATTR_CURRENT_HUMIDITY) == 54 + assert state.attributes.get(ATTR_SWING_MODE) == "Off" assert STATE_OFF == state.attributes.get(ATTR_AUX_HEAT) assert state.attributes.get(ATTR_HVAC_MODES) == [ "off", @@ -69,54 +69,54 @@ def test_setup_params(hass): def test_default_setup_params(hass): """Test the setup with default parameters.""" state = hass.states.get(ENTITY_CLIMATE) - assert 7 == state.attributes.get(ATTR_MIN_TEMP) - assert 35 == state.attributes.get(ATTR_MAX_TEMP) - assert 30 == state.attributes.get(ATTR_MIN_HUMIDITY) - assert 99 == state.attributes.get(ATTR_MAX_HUMIDITY) + assert state.attributes.get(ATTR_MIN_TEMP) == 7 + assert state.attributes.get(ATTR_MAX_TEMP) == 35 + assert state.attributes.get(ATTR_MIN_HUMIDITY) == 30 + assert state.attributes.get(ATTR_MAX_HUMIDITY) == 99 async def test_set_only_target_temp_bad_attr(hass): """Test setting the target temperature without required attribute.""" state = hass.states.get(ENTITY_CLIMATE) - assert 21 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 21 with pytest.raises(vol.Invalid): await common.async_set_temperature(hass, None, ENTITY_CLIMATE) await hass.async_block_till_done() - assert 21 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 21 async def test_set_only_target_temp(hass): """Test the setting of the target temperature.""" state = hass.states.get(ENTITY_CLIMATE) - assert 21 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 21 await common.async_set_temperature(hass, 30, ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert 30.0 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 30.0 async def test_set_only_target_temp_with_convert(hass): """Test the setting of the target temperature.""" state = hass.states.get(ENTITY_HEATPUMP) - assert 20 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 20 await common.async_set_temperature(hass, 21, ENTITY_HEATPUMP) await hass.async_block_till_done() state = hass.states.get(ENTITY_HEATPUMP) - assert 21.0 == state.attributes.get(ATTR_TEMPERATURE) + assert state.attributes.get(ATTR_TEMPERATURE) == 21.0 async def test_set_target_temp_range(hass): """Test the setting of the target temperature with range.""" state = hass.states.get(ENTITY_ECOBEE) assert state.attributes.get(ATTR_TEMPERATURE) is None - assert 21.0 == state.attributes.get(ATTR_TARGET_TEMP_LOW) - assert 24.0 == state.attributes.get(ATTR_TARGET_TEMP_HIGH) + assert state.attributes.get(ATTR_TARGET_TEMP_LOW) == 21.0 + assert state.attributes.get(ATTR_TARGET_TEMP_HIGH) == 24.0 await common.async_set_temperature( hass, target_temp_high=25, target_temp_low=20, entity_id=ENTITY_ECOBEE @@ -125,16 +125,16 @@ async def test_set_target_temp_range(hass): state = hass.states.get(ENTITY_ECOBEE) assert state.attributes.get(ATTR_TEMPERATURE) is None - assert 20.0 == state.attributes.get(ATTR_TARGET_TEMP_LOW) - assert 25.0 == state.attributes.get(ATTR_TARGET_TEMP_HIGH) + assert state.attributes.get(ATTR_TARGET_TEMP_LOW) == 20.0 + assert state.attributes.get(ATTR_TARGET_TEMP_HIGH) == 25.0 async def test_set_target_temp_range_bad_attr(hass): """Test setting the target temperature range without attribute.""" state = hass.states.get(ENTITY_ECOBEE) assert state.attributes.get(ATTR_TEMPERATURE) is None - assert 21.0 == state.attributes.get(ATTR_TARGET_TEMP_LOW) - assert 24.0 == state.attributes.get(ATTR_TARGET_TEMP_HIGH) + assert state.attributes.get(ATTR_TARGET_TEMP_LOW) == 21.0 + assert state.attributes.get(ATTR_TARGET_TEMP_HIGH) == 24.0 with pytest.raises(vol.Invalid): await common.async_set_temperature( @@ -148,83 +148,83 @@ async def test_set_target_temp_range_bad_attr(hass): state = hass.states.get(ENTITY_ECOBEE) assert state.attributes.get(ATTR_TEMPERATURE) is None - assert 21.0 == state.attributes.get(ATTR_TARGET_TEMP_LOW) - assert 24.0 == state.attributes.get(ATTR_TARGET_TEMP_HIGH) + assert state.attributes.get(ATTR_TARGET_TEMP_LOW) == 21.0 + assert state.attributes.get(ATTR_TARGET_TEMP_HIGH) == 24.0 async def test_set_target_humidity_bad_attr(hass): """Test setting the target humidity without required attribute.""" state = hass.states.get(ENTITY_CLIMATE) - assert 67 == state.attributes.get(ATTR_HUMIDITY) + assert state.attributes.get(ATTR_HUMIDITY) == 67 with pytest.raises(vol.Invalid): await common.async_set_humidity(hass, None, ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert 67 == state.attributes.get(ATTR_HUMIDITY) + assert state.attributes.get(ATTR_HUMIDITY) == 67 async def test_set_target_humidity(hass): """Test the setting of the target humidity.""" state = hass.states.get(ENTITY_CLIMATE) - assert 67 == state.attributes.get(ATTR_HUMIDITY) + assert state.attributes.get(ATTR_HUMIDITY) == 67 await common.async_set_humidity(hass, 64, ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert 64.0 == state.attributes.get(ATTR_HUMIDITY) + assert state.attributes.get(ATTR_HUMIDITY) == 64.0 async def test_set_fan_mode_bad_attr(hass): """Test setting fan mode without required attribute.""" state = hass.states.get(ENTITY_CLIMATE) - assert "On High" == state.attributes.get(ATTR_FAN_MODE) + assert state.attributes.get(ATTR_FAN_MODE) == "On High" with pytest.raises(vol.Invalid): await common.async_set_fan_mode(hass, None, ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert "On High" == state.attributes.get(ATTR_FAN_MODE) + assert state.attributes.get(ATTR_FAN_MODE) == "On High" async def test_set_fan_mode(hass): """Test setting of new fan mode.""" state = hass.states.get(ENTITY_CLIMATE) - assert "On High" == state.attributes.get(ATTR_FAN_MODE) + assert state.attributes.get(ATTR_FAN_MODE) == "On High" await common.async_set_fan_mode(hass, "On Low", ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert "On Low" == state.attributes.get(ATTR_FAN_MODE) + assert state.attributes.get(ATTR_FAN_MODE) == "On Low" async def test_set_swing_mode_bad_attr(hass): """Test setting swing mode without required attribute.""" state = hass.states.get(ENTITY_CLIMATE) - assert "Off" == state.attributes.get(ATTR_SWING_MODE) + assert state.attributes.get(ATTR_SWING_MODE) == "Off" with pytest.raises(vol.Invalid): await common.async_set_swing_mode(hass, None, ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert "Off" == state.attributes.get(ATTR_SWING_MODE) + assert state.attributes.get(ATTR_SWING_MODE) == "Off" async def test_set_swing(hass): """Test setting of new swing mode.""" state = hass.states.get(ENTITY_CLIMATE) - assert "Off" == state.attributes.get(ATTR_SWING_MODE) + assert state.attributes.get(ATTR_SWING_MODE) == "Off" await common.async_set_swing_mode(hass, "Auto", ENTITY_CLIMATE) await hass.async_block_till_done() state = hass.states.get(ENTITY_CLIMATE) - assert "Auto" == state.attributes.get(ATTR_SWING_MODE) + assert state.attributes.get(ATTR_SWING_MODE) == "Auto" async def test_set_hvac_bad_attr_and_state(hass): diff --git a/tests/components/demo/test_light.py b/tests/components/demo/test_light.py index 47b5c92fd48c..5d0fee65aea6 100644 --- a/tests/components/demo/test_light.py +++ b/tests/components/demo/test_light.py @@ -24,15 +24,15 @@ async def test_state_attributes(hass): assert light.is_on(hass, ENTITY_LIGHT) assert (0.4, 0.4) == state.attributes.get(light.ATTR_XY_COLOR) assert state.attributes.get(light.ATTR_BRIGHTNESS) == 25 - assert (255, 234, 164) == state.attributes.get(light.ATTR_RGB_COLOR) + assert state.attributes.get(light.ATTR_RGB_COLOR) == (255, 234, 164) assert state.attributes.get(light.ATTR_EFFECT) == "rainbow" await common.async_turn_on( hass, ENTITY_LIGHT, rgb_color=(251, 253, 255), white_value=254 ) state = hass.states.get(ENTITY_LIGHT) assert state.attributes.get(light.ATTR_WHITE_VALUE) == 254 - assert (250, 252, 255) == state.attributes.get(light.ATTR_RGB_COLOR) - assert (0.319, 0.326) == state.attributes.get(light.ATTR_XY_COLOR) + assert state.attributes.get(light.ATTR_RGB_COLOR) == (250, 252, 255) + assert state.attributes.get(light.ATTR_XY_COLOR) == (0.319, 0.326) await common.async_turn_on(hass, ENTITY_LIGHT, color_temp=400, effect="none") state = hass.states.get(ENTITY_LIGHT) assert state.attributes.get(light.ATTR_COLOR_TEMP) == 400 diff --git a/tests/components/demo/test_lock.py b/tests/components/demo/test_lock.py index 279bd35d12a0..67e3cd6409b7 100644 --- a/tests/components/demo/test_lock.py +++ b/tests/components/demo/test_lock.py @@ -1,10 +1,10 @@ """The tests for the Demo lock platform.""" -import unittest +import pytest from homeassistant.components import lock -from homeassistant.setup import setup_component +from homeassistant.setup import async_setup_component -from tests.common import get_test_home_assistant, mock_service +from tests.common import async_mock_service from tests.components.lock import common FRONT = "lock.front_door" @@ -12,43 +12,38 @@ KITCHEN = "lock.kitchen_door" OPENABLE_LOCK = "lock.openable_lock" -class TestLockDemo(unittest.TestCase): - """Test the demo lock.""" +@pytest.fixture(autouse=True) +def setup_comp(hass): + """Set up demo component.""" + hass.loop.run_until_complete( + async_setup_component(hass, lock.DOMAIN, {lock.DOMAIN: {"platform": "demo"}}) + ) - def setUp(self): # pylint: disable=invalid-name - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - assert setup_component(self.hass, lock.DOMAIN, {"lock": {"platform": "demo"}}) - def tearDown(self): # pylint: disable=invalid-name - """Stop everything that was started.""" - self.hass.stop() +async def test_is_locked(hass): + """Test if lock is locked.""" + assert lock.is_locked(hass, FRONT) + assert hass.states.is_state(FRONT, "locked") - def test_is_locked(self): - """Test if lock is locked.""" - assert lock.is_locked(self.hass, FRONT) - self.hass.states.is_state(FRONT, "locked") + assert not lock.is_locked(hass, KITCHEN) + assert hass.states.is_state(KITCHEN, "unlocked") - assert not lock.is_locked(self.hass, KITCHEN) - self.hass.states.is_state(KITCHEN, "unlocked") - def test_locking(self): - """Test the locking of a lock.""" - common.lock(self.hass, KITCHEN) - self.hass.block_till_done() +async def test_locking(hass): + """Test the locking of a lock.""" + await common.async_lock(hass, KITCHEN) + assert lock.is_locked(hass, KITCHEN) - assert lock.is_locked(self.hass, KITCHEN) - def test_unlocking(self): - """Test the unlocking of a lock.""" - common.unlock(self.hass, FRONT) - self.hass.block_till_done() +async def test_unlocking(hass): + """Test the unlocking of a lock.""" + await common.async_unlock(hass, FRONT) + assert not lock.is_locked(hass, FRONT) - assert not lock.is_locked(self.hass, FRONT) - def test_opening(self): - """Test the opening of a lock.""" - calls = mock_service(self.hass, lock.DOMAIN, lock.SERVICE_OPEN) - common.open_lock(self.hass, OPENABLE_LOCK) - self.hass.block_till_done() - assert 1 == len(calls) +async def test_opening(hass): + """Test the opening of a lock.""" + calls = async_mock_service(hass, lock.DOMAIN, lock.SERVICE_OPEN) + await common.async_open_lock(hass, OPENABLE_LOCK) + await hass.async_block_till_done() + assert len(calls) == 1 diff --git a/tests/components/demo/test_vacuum.py b/tests/components/demo/test_vacuum.py index 2bd39bf7cb33..e64e7d178cdb 100644 --- a/tests/components/demo/test_vacuum.py +++ b/tests/components/demo/test_vacuum.py @@ -1,5 +1,5 @@ """The tests for the Demo vacuum platform.""" -import unittest +import pytest from homeassistant.components import vacuum from homeassistant.components.demo.vacuum import ( @@ -34,9 +34,9 @@ from homeassistant.const import ( STATE_OFF, STATE_ON, ) -from homeassistant.setup import setup_component +from homeassistant.setup import async_setup_component -from tests.common import get_test_home_assistant, mock_service +from tests.common import async_mock_service from tests.components.vacuum import common ENTITY_VACUUM_BASIC = f"{DOMAIN}.{DEMO_VACUUM_BASIC}".lower() @@ -47,326 +47,293 @@ ENTITY_VACUUM_NONE = f"{DOMAIN}.{DEMO_VACUUM_NONE}".lower() ENTITY_VACUUM_STATE = f"{DOMAIN}.{DEMO_VACUUM_STATE}".lower() -class TestVacuumDemo(unittest.TestCase): - """Test the Demo vacuum.""" +@pytest.fixture(autouse=True) +async def setup_demo_vacuum(hass): + """Initialize setup demo vacuum.""" + assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "demo"}}) - def setUp(self): # pylint: disable=invalid-name - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - assert setup_component(self.hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "demo"}}) - def tearDown(self): # pylint: disable=invalid-name - """Stop down everything that was started.""" - self.hass.stop() +async def test_supported_features(hass): + """Test vacuum supported features.""" + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 2047 + assert state.attributes.get(ATTR_STATUS) == "Charging" + assert state.attributes.get(ATTR_BATTERY_LEVEL) == 100 + assert state.attributes.get(ATTR_FAN_SPEED) == "medium" + assert state.attributes.get(ATTR_FAN_SPEED_LIST) == FAN_SPEEDS + assert state.state == STATE_OFF - def test_supported_features(self): - """Test vacuum supported features.""" - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert 2047 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert "Charging" == state.attributes.get(ATTR_STATUS) - assert 100 == state.attributes.get(ATTR_BATTERY_LEVEL) - assert "medium" == state.attributes.get(ATTR_FAN_SPEED) - assert FAN_SPEEDS == state.attributes.get(ATTR_FAN_SPEED_LIST) - assert STATE_OFF == state.state + state = hass.states.get(ENTITY_VACUUM_MOST) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 219 + assert state.attributes.get(ATTR_STATUS) == "Charging" + assert state.attributes.get(ATTR_BATTERY_LEVEL) == 100 + assert state.attributes.get(ATTR_FAN_SPEED) is None + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None + assert state.state == STATE_OFF - state = self.hass.states.get(ENTITY_VACUUM_MOST) - assert 219 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert "Charging" == state.attributes.get(ATTR_STATUS) - assert 100 == state.attributes.get(ATTR_BATTERY_LEVEL) - assert state.attributes.get(ATTR_FAN_SPEED) is None - assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None - assert STATE_OFF == state.state + state = hass.states.get(ENTITY_VACUUM_BASIC) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 195 + assert state.attributes.get(ATTR_STATUS) == "Charging" + assert state.attributes.get(ATTR_BATTERY_LEVEL) == 100 + assert state.attributes.get(ATTR_FAN_SPEED) is None + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None + assert state.state == STATE_OFF - state = self.hass.states.get(ENTITY_VACUUM_BASIC) - assert 195 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert "Charging" == state.attributes.get(ATTR_STATUS) - assert 100 == state.attributes.get(ATTR_BATTERY_LEVEL) - assert state.attributes.get(ATTR_FAN_SPEED) is None - assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None - assert STATE_OFF == state.state + state = hass.states.get(ENTITY_VACUUM_MINIMAL) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 3 + assert state.attributes.get(ATTR_STATUS) is None + assert state.attributes.get(ATTR_BATTERY_LEVEL) is None + assert state.attributes.get(ATTR_FAN_SPEED) is None + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None + assert state.state == STATE_OFF - state = self.hass.states.get(ENTITY_VACUUM_MINIMAL) - assert 3 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert state.attributes.get(ATTR_STATUS) is None - assert state.attributes.get(ATTR_BATTERY_LEVEL) is None - assert state.attributes.get(ATTR_FAN_SPEED) is None - assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None - assert STATE_OFF == state.state + state = hass.states.get(ENTITY_VACUUM_NONE) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 0 + assert state.attributes.get(ATTR_STATUS) is None + assert state.attributes.get(ATTR_BATTERY_LEVEL) is None + assert state.attributes.get(ATTR_FAN_SPEED) is None + assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None + assert state.state == STATE_OFF - state = self.hass.states.get(ENTITY_VACUUM_NONE) - assert 0 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert state.attributes.get(ATTR_STATUS) is None - assert state.attributes.get(ATTR_BATTERY_LEVEL) is None - assert state.attributes.get(ATTR_FAN_SPEED) is None - assert state.attributes.get(ATTR_FAN_SPEED_LIST) is None - assert STATE_OFF == state.state + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == 13436 + assert state.state == STATE_DOCKED + assert state.attributes.get(ATTR_BATTERY_LEVEL) == 100 + assert state.attributes.get(ATTR_FAN_SPEED) == "medium" + assert state.attributes.get(ATTR_FAN_SPEED_LIST) == FAN_SPEEDS - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert 13436 == state.attributes.get(ATTR_SUPPORTED_FEATURES) - assert STATE_DOCKED == state.state - assert 100 == state.attributes.get(ATTR_BATTERY_LEVEL) - assert "medium" == state.attributes.get(ATTR_FAN_SPEED) - assert FAN_SPEEDS == state.attributes.get(ATTR_FAN_SPEED_LIST) - def test_methods(self): - """Test if methods call the services as expected.""" - self.hass.states.set(ENTITY_VACUUM_BASIC, STATE_ON) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_BASIC) +async def test_methods(hass): + """Test if methods call the services as expected.""" + hass.states.async_set(ENTITY_VACUUM_BASIC, STATE_ON) + await hass.async_block_till_done() + assert vacuum.is_on(hass, ENTITY_VACUUM_BASIC) - self.hass.states.set(ENTITY_VACUUM_BASIC, STATE_OFF) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_BASIC) + hass.states.async_set(ENTITY_VACUUM_BASIC, STATE_OFF) + await hass.async_block_till_done() + assert not vacuum.is_on(hass, ENTITY_VACUUM_BASIC) - common.turn_on(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_turn_on(hass, ENTITY_VACUUM_COMPLETE) + assert vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.turn_off(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_turn_off(hass, ENTITY_VACUUM_COMPLETE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.toggle(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_toggle(hass, ENTITY_VACUUM_COMPLETE) + assert vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.start_pause(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_start_pause(hass, ENTITY_VACUUM_COMPLETE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.start_pause(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_start_pause(hass, ENTITY_VACUUM_COMPLETE) + assert vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.stop(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_stop(hass, ENTITY_VACUUM_COMPLETE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert state.attributes.get(ATTR_BATTERY_LEVEL) < 100 - assert "Charging" != state.attributes.get(ATTR_STATUS) + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert state.attributes.get(ATTR_BATTERY_LEVEL) < 100 + assert state.attributes.get(ATTR_STATUS) != "Charging" - common.locate(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert "I'm over here" in state.attributes.get(ATTR_STATUS) + await common.async_locate(hass, ENTITY_VACUUM_COMPLETE) + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert "I'm over here" in state.attributes.get(ATTR_STATUS) - common.return_to_base(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert "Returning home" in state.attributes.get(ATTR_STATUS) + await common.async_return_to_base(hass, ENTITY_VACUUM_COMPLETE) + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert "Returning home" in state.attributes.get(ATTR_STATUS) - common.set_fan_speed( - self.hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_COMPLETE - ) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert FAN_SPEEDS[-1] == state.attributes.get(ATTR_FAN_SPEED) + await common.async_set_fan_speed( + hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_COMPLETE + ) + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert state.attributes.get(ATTR_FAN_SPEED) == FAN_SPEEDS[-1] - common.clean_spot(self.hass, entity_id=ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - assert "spot" in state.attributes.get(ATTR_STATUS) - assert STATE_ON == state.state + await common.async_clean_spot(hass, entity_id=ENTITY_VACUUM_COMPLETE) + state = hass.states.get(ENTITY_VACUUM_COMPLETE) + assert "spot" in state.attributes.get(ATTR_STATUS) + assert state.state == STATE_ON - common.start(self.hass, ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_CLEANING == state.state + await common.async_start(hass, ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state == STATE_CLEANING - common.pause(self.hass, ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_PAUSED == state.state + await common.async_pause(hass, ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state == STATE_PAUSED - common.stop(self.hass, ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_IDLE == state.state + await common.async_stop(hass, ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state == STATE_IDLE - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert state.attributes.get(ATTR_BATTERY_LEVEL) < 100 - assert STATE_DOCKED != state.state + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.attributes.get(ATTR_BATTERY_LEVEL) < 100 + assert state.state != STATE_DOCKED - common.return_to_base(self.hass, ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_RETURNING == state.state + await common.async_return_to_base(hass, ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state == STATE_RETURNING - common.set_fan_speed(self.hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert FAN_SPEEDS[-1] == state.attributes.get(ATTR_FAN_SPEED) + await common.async_set_fan_speed( + hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_STATE + ) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.attributes.get(ATTR_FAN_SPEED) == FAN_SPEEDS[-1] - common.clean_spot(self.hass, entity_id=ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_CLEANING == state.state + await common.async_clean_spot(hass, entity_id=ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state == STATE_CLEANING - def test_unsupported_methods(self): - """Test service calls for unsupported vacuums.""" - self.hass.states.set(ENTITY_VACUUM_NONE, STATE_ON) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) - common.turn_off(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) +async def test_unsupported_methods(hass): + """Test service calls for unsupported vacuums.""" + hass.states.async_set(ENTITY_VACUUM_NONE, STATE_ON) + await hass.async_block_till_done() + assert vacuum.is_on(hass, ENTITY_VACUUM_NONE) - common.stop(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) + await common.async_turn_off(hass, ENTITY_VACUUM_NONE) + assert vacuum.is_on(hass, ENTITY_VACUUM_NONE) - self.hass.states.set(ENTITY_VACUUM_NONE, STATE_OFF) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) + await common.async_stop(hass, ENTITY_VACUUM_NONE) + assert vacuum.is_on(hass, ENTITY_VACUUM_NONE) - common.turn_on(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) + hass.states.async_set(ENTITY_VACUUM_NONE, STATE_OFF) + await hass.async_block_till_done() + assert not vacuum.is_on(hass, ENTITY_VACUUM_NONE) - common.toggle(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) + await common.async_turn_on(hass, ENTITY_VACUUM_NONE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_NONE) - # Non supported methods: - common.start_pause(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_NONE) + await common.async_toggle(hass, ENTITY_VACUUM_NONE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_NONE) - common.locate(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_NONE) - assert state.attributes.get(ATTR_STATUS) is None + # Non supported methods: + await common.async_start_pause(hass, ENTITY_VACUUM_NONE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_NONE) - common.return_to_base(self.hass, ENTITY_VACUUM_NONE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_NONE) - assert state.attributes.get(ATTR_STATUS) is None + await common.async_locate(hass, ENTITY_VACUUM_NONE) + state = hass.states.get(ENTITY_VACUUM_NONE) + assert state.attributes.get(ATTR_STATUS) is None - common.set_fan_speed(self.hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_NONE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_NONE) - assert FAN_SPEEDS[-1] != state.attributes.get(ATTR_FAN_SPEED) + await common.async_return_to_base(hass, ENTITY_VACUUM_NONE) + state = hass.states.get(ENTITY_VACUUM_NONE) + assert state.attributes.get(ATTR_STATUS) is None - common.clean_spot(self.hass, entity_id=ENTITY_VACUUM_BASIC) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_BASIC) - assert "spot" not in state.attributes.get(ATTR_STATUS) - assert STATE_OFF == state.state + await common.async_set_fan_speed(hass, FAN_SPEEDS[-1], entity_id=ENTITY_VACUUM_NONE) + state = hass.states.get(ENTITY_VACUUM_NONE) + assert state.attributes.get(ATTR_FAN_SPEED) != FAN_SPEEDS[-1] - # VacuumDevice should not support start and pause methods. - self.hass.states.set(ENTITY_VACUUM_COMPLETE, STATE_ON) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_clean_spot(hass, entity_id=ENTITY_VACUUM_BASIC) + state = hass.states.get(ENTITY_VACUUM_BASIC) + assert "spot" not in state.attributes.get(ATTR_STATUS) + assert state.state == STATE_OFF - common.pause(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + # VacuumDevice should not support start and pause methods. + hass.states.async_set(ENTITY_VACUUM_COMPLETE, STATE_ON) + await hass.async_block_till_done() + assert vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - self.hass.states.set(ENTITY_VACUUM_COMPLETE, STATE_OFF) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + await common.async_pause(hass, ENTITY_VACUUM_COMPLETE) + assert vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.start(self.hass, ENTITY_VACUUM_COMPLETE) - self.hass.block_till_done() - assert not vacuum.is_on(self.hass, ENTITY_VACUUM_COMPLETE) + hass.states.async_set(ENTITY_VACUUM_COMPLETE, STATE_OFF) + await hass.async_block_till_done() + assert not vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - # StateVacuumDevice does not support on/off - common.turn_on(self.hass, entity_id=ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_CLEANING != state.state + await common.async_start(hass, ENTITY_VACUUM_COMPLETE) + assert not vacuum.is_on(hass, ENTITY_VACUUM_COMPLETE) - common.turn_off(self.hass, entity_id=ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_RETURNING != state.state + # StateVacuumDevice does not support on/off + await common.async_turn_on(hass, entity_id=ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state != STATE_CLEANING - common.toggle(self.hass, entity_id=ENTITY_VACUUM_STATE) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_VACUUM_STATE) - assert STATE_CLEANING != state.state + await common.async_turn_off(hass, entity_id=ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state != STATE_RETURNING - def test_services(self): - """Test vacuum services.""" - # Test send_command - send_command_calls = mock_service(self.hass, DOMAIN, SERVICE_SEND_COMMAND) + await common.async_toggle(hass, entity_id=ENTITY_VACUUM_STATE) + state = hass.states.get(ENTITY_VACUUM_STATE) + assert state.state != STATE_CLEANING - params = {"rotate": 150, "speed": 20} - common.send_command( - self.hass, "test_command", entity_id=ENTITY_VACUUM_BASIC, params=params - ) - self.hass.block_till_done() - assert 1 == len(send_command_calls) - call = send_command_calls[-1] +async def test_services(hass): + """Test vacuum services.""" + # Test send_command + send_command_calls = async_mock_service(hass, DOMAIN, SERVICE_SEND_COMMAND) - assert DOMAIN == call.domain - assert SERVICE_SEND_COMMAND == call.service - assert ENTITY_VACUUM_BASIC == call.data[ATTR_ENTITY_ID] - assert "test_command" == call.data[ATTR_COMMAND] - assert params == call.data[ATTR_PARAMS] + params = {"rotate": 150, "speed": 20} + await common.async_send_command( + hass, "test_command", entity_id=ENTITY_VACUUM_BASIC, params=params + ) + assert len(send_command_calls) == 1 + call = send_command_calls[-1] - # Test set fan speed - set_fan_speed_calls = mock_service(self.hass, DOMAIN, SERVICE_SET_FAN_SPEED) + assert call.domain == DOMAIN + assert call.service == SERVICE_SEND_COMMAND + assert call.data[ATTR_ENTITY_ID] == ENTITY_VACUUM_BASIC + assert call.data[ATTR_COMMAND] == "test_command" + assert call.data[ATTR_PARAMS] == params - common.set_fan_speed(self.hass, FAN_SPEEDS[0], entity_id=ENTITY_VACUUM_COMPLETE) + # Test set fan speed + set_fan_speed_calls = async_mock_service(hass, DOMAIN, SERVICE_SET_FAN_SPEED) - self.hass.block_till_done() - assert 1 == len(set_fan_speed_calls) - call = set_fan_speed_calls[-1] + await common.async_set_fan_speed( + hass, FAN_SPEEDS[0], entity_id=ENTITY_VACUUM_COMPLETE + ) + assert len(set_fan_speed_calls) == 1 + call = set_fan_speed_calls[-1] - assert DOMAIN == call.domain - assert SERVICE_SET_FAN_SPEED == call.service - assert ENTITY_VACUUM_COMPLETE == call.data[ATTR_ENTITY_ID] - assert FAN_SPEEDS[0] == call.data[ATTR_FAN_SPEED] + assert call.domain == DOMAIN + assert call.service == SERVICE_SET_FAN_SPEED + assert call.data[ATTR_ENTITY_ID] == ENTITY_VACUUM_COMPLETE + assert call.data[ATTR_FAN_SPEED] == FAN_SPEEDS[0] - def test_set_fan_speed(self): - """Test vacuum service to set the fan speed.""" - group_vacuums = ",".join( - [ENTITY_VACUUM_BASIC, ENTITY_VACUUM_COMPLETE, ENTITY_VACUUM_STATE] - ) - old_state_basic = self.hass.states.get(ENTITY_VACUUM_BASIC) - old_state_complete = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - old_state_state = self.hass.states.get(ENTITY_VACUUM_STATE) - common.set_fan_speed(self.hass, FAN_SPEEDS[0], entity_id=group_vacuums) +async def test_set_fan_speed(hass): + """Test vacuum service to set the fan speed.""" + group_vacuums = ",".join( + [ENTITY_VACUUM_BASIC, ENTITY_VACUUM_COMPLETE, ENTITY_VACUUM_STATE] + ) + old_state_basic = hass.states.get(ENTITY_VACUUM_BASIC) + old_state_complete = hass.states.get(ENTITY_VACUUM_COMPLETE) + old_state_state = hass.states.get(ENTITY_VACUUM_STATE) - self.hass.block_till_done() - new_state_basic = self.hass.states.get(ENTITY_VACUUM_BASIC) - new_state_complete = self.hass.states.get(ENTITY_VACUUM_COMPLETE) - new_state_state = self.hass.states.get(ENTITY_VACUUM_STATE) + await common.async_set_fan_speed(hass, FAN_SPEEDS[0], entity_id=group_vacuums) - assert old_state_basic == new_state_basic - assert ATTR_FAN_SPEED not in new_state_basic.attributes + new_state_basic = hass.states.get(ENTITY_VACUUM_BASIC) + new_state_complete = hass.states.get(ENTITY_VACUUM_COMPLETE) + new_state_state = hass.states.get(ENTITY_VACUUM_STATE) - assert old_state_complete != new_state_complete - assert FAN_SPEEDS[1] == old_state_complete.attributes[ATTR_FAN_SPEED] - assert FAN_SPEEDS[0] == new_state_complete.attributes[ATTR_FAN_SPEED] + assert old_state_basic == new_state_basic + assert ATTR_FAN_SPEED not in new_state_basic.attributes - assert old_state_state != new_state_state - assert FAN_SPEEDS[1] == old_state_state.attributes[ATTR_FAN_SPEED] - assert FAN_SPEEDS[0] == new_state_state.attributes[ATTR_FAN_SPEED] + assert old_state_complete != new_state_complete + assert old_state_complete.attributes[ATTR_FAN_SPEED] == FAN_SPEEDS[1] + assert new_state_complete.attributes[ATTR_FAN_SPEED] == FAN_SPEEDS[0] - def test_send_command(self): - """Test vacuum service to send a command.""" - group_vacuums = ",".join([ENTITY_VACUUM_BASIC, ENTITY_VACUUM_COMPLETE]) - old_state_basic = self.hass.states.get(ENTITY_VACUUM_BASIC) - old_state_complete = self.hass.states.get(ENTITY_VACUUM_COMPLETE) + assert old_state_state != new_state_state + assert old_state_state.attributes[ATTR_FAN_SPEED] == FAN_SPEEDS[1] + assert new_state_state.attributes[ATTR_FAN_SPEED] == FAN_SPEEDS[0] - common.send_command( - self.hass, "test_command", params={"p1": 3}, entity_id=group_vacuums - ) - self.hass.block_till_done() - new_state_basic = self.hass.states.get(ENTITY_VACUUM_BASIC) - new_state_complete = self.hass.states.get(ENTITY_VACUUM_COMPLETE) +async def test_send_command(hass): + """Test vacuum service to send a command.""" + group_vacuums = ",".join([ENTITY_VACUUM_BASIC, ENTITY_VACUUM_COMPLETE]) + old_state_basic = hass.states.get(ENTITY_VACUUM_BASIC) + old_state_complete = hass.states.get(ENTITY_VACUUM_COMPLETE) - assert old_state_basic == new_state_basic - assert old_state_complete != new_state_complete - assert STATE_ON == new_state_complete.state - assert ( - "Executing test_command({'p1': 3})" - == new_state_complete.attributes[ATTR_STATUS] - ) + await common.async_send_command( + hass, "test_command", params={"p1": 3}, entity_id=group_vacuums + ) + + new_state_basic = hass.states.get(ENTITY_VACUUM_BASIC) + new_state_complete = hass.states.get(ENTITY_VACUUM_COMPLETE) + + assert old_state_basic == new_state_basic + assert old_state_complete != new_state_complete + assert new_state_complete.state == STATE_ON + assert ( + new_state_complete.attributes[ATTR_STATUS] + == "Executing test_command({'p1': 3})" + ) diff --git a/tests/components/demo/test_water_heater.py b/tests/components/demo/test_water_heater.py index 97efd48be4af..b8474e978c44 100644 --- a/tests/components/demo/test_water_heater.py +++ b/tests/components/demo/test_water_heater.py @@ -1,120 +1,114 @@ """The tests for the demo water_heater component.""" -import unittest - import pytest import voluptuous as vol from homeassistant.components import water_heater -from homeassistant.setup import setup_component +from homeassistant.setup import async_setup_component from homeassistant.util.unit_system import IMPERIAL_SYSTEM -from tests.common import get_test_home_assistant from tests.components.water_heater import common ENTITY_WATER_HEATER = "water_heater.demo_water_heater" ENTITY_WATER_HEATER_CELSIUS = "water_heater.demo_water_heater_celsius" -class TestDemowater_heater(unittest.TestCase): - """Test the demo water_heater.""" - - def setUp(self): # pylint: disable=invalid-name - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - self.hass.config.units = IMPERIAL_SYSTEM - assert setup_component( - self.hass, water_heater.DOMAIN, {"water_heater": {"platform": "demo"}} +@pytest.fixture(autouse=True) +def setup_comp(hass): + """Set up demo component.""" + hass.config.units = IMPERIAL_SYSTEM + hass.loop.run_until_complete( + async_setup_component( + hass, water_heater.DOMAIN, {"water_heater": {"platform": "demo"}} ) + ) - def tearDown(self): # pylint: disable=invalid-name - """Stop down everything that was started.""" - self.hass.stop() - def test_setup_params(self): - """Test the initial parameters.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert 119 == state.attributes.get("temperature") - assert "off" == state.attributes.get("away_mode") - assert "eco" == state.attributes.get("operation_mode") +async def test_setup_params(hass): + """Test the initial parameters.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("temperature") == 119 + assert state.attributes.get("away_mode") == "off" + assert state.attributes.get("operation_mode") == "eco" - def test_default_setup_params(self): - """Test the setup with default parameters.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert 110 == state.attributes.get("min_temp") - assert 140 == state.attributes.get("max_temp") - def test_set_only_target_temp_bad_attr(self): - """Test setting the target temperature without required attribute.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert 119 == state.attributes.get("temperature") - with pytest.raises(vol.Invalid): - common.set_temperature(self.hass, None, ENTITY_WATER_HEATER) - self.hass.block_till_done() - assert 119 == state.attributes.get("temperature") +async def test_default_setup_params(hass): + """Test the setup with default parameters.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("min_temp") == 110 + assert state.attributes.get("max_temp") == 140 - def test_set_only_target_temp(self): - """Test the setting of the target temperature.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert 119 == state.attributes.get("temperature") - common.set_temperature(self.hass, 110, ENTITY_WATER_HEATER) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert 110 == state.attributes.get("temperature") - def test_set_operation_bad_attr_and_state(self): - """Test setting operation mode without required attribute. +async def test_set_only_target_temp_bad_attr(hass): + """Test setting the target temperature without required attribute.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("temperature") == 119 + with pytest.raises(vol.Invalid): + await common.async_set_temperature(hass, None, ENTITY_WATER_HEATER) + assert state.attributes.get("temperature") == 119 - Also check the state. - """ - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "eco" == state.attributes.get("operation_mode") - assert "eco" == state.state - with pytest.raises(vol.Invalid): - common.set_operation_mode(self.hass, None, ENTITY_WATER_HEATER) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "eco" == state.attributes.get("operation_mode") - assert "eco" == state.state - def test_set_operation(self): - """Test setting of new operation mode.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "eco" == state.attributes.get("operation_mode") - assert "eco" == state.state - common.set_operation_mode(self.hass, "electric", ENTITY_WATER_HEATER) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "electric" == state.attributes.get("operation_mode") - assert "electric" == state.state +async def test_set_only_target_temp(hass): + """Test the setting of the target temperature.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("temperature") == 119 + await common.async_set_temperature(hass, 110, ENTITY_WATER_HEATER) + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("temperature") == 110 - def test_set_away_mode_bad_attr(self): - """Test setting the away mode without required attribute.""" - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "off" == state.attributes.get("away_mode") - with pytest.raises(vol.Invalid): - common.set_away_mode(self.hass, None, ENTITY_WATER_HEATER) - self.hass.block_till_done() - assert "off" == state.attributes.get("away_mode") - def test_set_away_mode_on(self): - """Test setting the away mode on/true.""" - common.set_away_mode(self.hass, True, ENTITY_WATER_HEATER) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER) - assert "on" == state.attributes.get("away_mode") +async def test_set_operation_bad_attr_and_state(hass): + """Test setting operation mode without required attribute. - def test_set_away_mode_off(self): - """Test setting the away mode off/false.""" - common.set_away_mode(self.hass, False, ENTITY_WATER_HEATER_CELSIUS) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER_CELSIUS) - assert "off" == state.attributes.get("away_mode") + Also check the state. + """ + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("operation_mode") == "eco" + assert state.state == "eco" + with pytest.raises(vol.Invalid): + await common.async_set_operation_mode(hass, None, ENTITY_WATER_HEATER) + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("operation_mode") == "eco" + assert state.state == "eco" - def test_set_only_target_temp_with_convert(self): - """Test the setting of the target temperature.""" - state = self.hass.states.get(ENTITY_WATER_HEATER_CELSIUS) - assert 113 == state.attributes.get("temperature") - common.set_temperature(self.hass, 114, ENTITY_WATER_HEATER_CELSIUS) - self.hass.block_till_done() - state = self.hass.states.get(ENTITY_WATER_HEATER_CELSIUS) - assert 114 == state.attributes.get("temperature") + +async def test_set_operation(hass): + """Test setting of new operation mode.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("operation_mode") == "eco" + assert state.state == "eco" + await common.async_set_operation_mode(hass, "electric", ENTITY_WATER_HEATER) + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("operation_mode") == "electric" + assert state.state == "electric" + + +async def test_set_away_mode_bad_attr(hass): + """Test setting the away mode without required attribute.""" + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("away_mode") == "off" + with pytest.raises(vol.Invalid): + await common.async_set_away_mode(hass, None, ENTITY_WATER_HEATER) + assert state.attributes.get("away_mode") == "off" + + +async def test_set_away_mode_on(hass): + """Test setting the away mode on/true.""" + await common.async_set_away_mode(hass, True, ENTITY_WATER_HEATER) + state = hass.states.get(ENTITY_WATER_HEATER) + assert state.attributes.get("away_mode") == "on" + + +async def test_set_away_mode_off(hass): + """Test setting the away mode off/false.""" + await common.async_set_away_mode(hass, False, ENTITY_WATER_HEATER_CELSIUS) + state = hass.states.get(ENTITY_WATER_HEATER_CELSIUS) + assert state.attributes.get("away_mode") == "off" + + +async def test_set_only_target_temp_with_convert(hass): + """Test the setting of the target temperature.""" + state = hass.states.get(ENTITY_WATER_HEATER_CELSIUS) + assert state.attributes.get("temperature") == 113 + await common.async_set_temperature(hass, 114, ENTITY_WATER_HEATER_CELSIUS) + state = hass.states.get(ENTITY_WATER_HEATER_CELSIUS) + assert state.attributes.get("temperature") == 114 diff --git a/tests/components/melissa/test_climate.py b/tests/components/melissa/test_climate.py index 725cfc7354d1..8976f85f3d12 100644 --- a/tests/components/melissa/test_climate.py +++ b/tests/components/melissa/test_climate.py @@ -84,7 +84,7 @@ async def test_get_name(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert "Melissa 12345678" == thermostat.name + assert thermostat.name == "Melissa 12345678" async def test_current_fan_mode(hass): @@ -106,7 +106,7 @@ async def test_current_temperature(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 27.4 == thermostat.current_temperature + assert thermostat.current_temperature == 27.4 async def test_current_temperature_no_data(hass): @@ -125,7 +125,7 @@ async def test_target_temperature_step(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 1 == thermostat.target_temperature_step + assert thermostat.target_temperature_step == 1 async def test_current_operation(hass): @@ -172,7 +172,7 @@ async def test_target_temperature(hass): device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) await thermostat.async_update() - assert 16 == thermostat.target_temperature + assert thermostat.target_temperature == 16 thermostat._cur_settings = None assert thermostat.target_temperature is None @@ -206,7 +206,7 @@ async def test_min_temp(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 16 == thermostat.min_temp + assert thermostat.min_temp == 16 async def test_max_temp(hass): @@ -215,7 +215,7 @@ async def test_max_temp(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 30 == thermostat.max_temp + assert thermostat.max_temp == 30 async def test_supported_features(hass): @@ -236,7 +236,7 @@ async def test_set_temperature(hass): thermostat = MelissaClimate(api, _SERIAL, device) await thermostat.async_update() await thermostat.async_set_temperature(**{ATTR_TEMPERATURE: 25}) - assert 25 == thermostat.target_temperature + assert thermostat.target_temperature == 25 async def test_fan_mode(hass): @@ -338,10 +338,10 @@ async def test_hass_mode_to_melissa(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 1 == thermostat.hass_mode_to_melissa(HVAC_MODE_FAN_ONLY) - assert 2 == thermostat.hass_mode_to_melissa(HVAC_MODE_HEAT) - assert 3 == thermostat.hass_mode_to_melissa(HVAC_MODE_COOL) - assert 4 == thermostat.hass_mode_to_melissa(HVAC_MODE_DRY) + assert thermostat.hass_mode_to_melissa(HVAC_MODE_FAN_ONLY) == 1 + assert thermostat.hass_mode_to_melissa(HVAC_MODE_HEAT) == 2 + assert thermostat.hass_mode_to_melissa(HVAC_MODE_COOL) == 3 + assert thermostat.hass_mode_to_melissa(HVAC_MODE_DRY) == 4 thermostat.hass_mode_to_melissa("test") mocked_warning.assert_called_once_with( "Melissa have no setting for %s mode", "test" @@ -357,10 +357,10 @@ async def test_hass_fan_to_melissa(hass): api = melissa_mock() device = (await api.async_fetch_devices())[_SERIAL] thermostat = MelissaClimate(api, _SERIAL, device) - assert 0 == thermostat.hass_fan_to_melissa("auto") - assert 1 == thermostat.hass_fan_to_melissa(SPEED_LOW) - assert 2 == thermostat.hass_fan_to_melissa(SPEED_MEDIUM) - assert 3 == thermostat.hass_fan_to_melissa(SPEED_HIGH) + assert thermostat.hass_fan_to_melissa("auto") == 0 + assert thermostat.hass_fan_to_melissa(SPEED_LOW) == 1 + assert thermostat.hass_fan_to_melissa(SPEED_MEDIUM) == 2 + assert thermostat.hass_fan_to_melissa(SPEED_HIGH) == 3 thermostat.hass_fan_to_melissa("test") mocked_warning.assert_called_once_with( "Melissa have no setting for %s fan mode", "test" diff --git a/tests/components/water_heater/common.py b/tests/components/water_heater/common.py index 04fd345577ef..ece283f4bab6 100644 --- a/tests/components/water_heater/common.py +++ b/tests/components/water_heater/common.py @@ -13,22 +13,19 @@ from homeassistant.components.water_heater import ( SERVICE_SET_TEMPERATURE, ) from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE, ENTITY_MATCH_ALL -from homeassistant.loader import bind_hass -@bind_hass -def set_away_mode(hass, away_mode, entity_id=ENTITY_MATCH_ALL): +async def async_set_away_mode(hass, away_mode, entity_id=ENTITY_MATCH_ALL): """Turn all or specified water_heater devices away mode on.""" data = {ATTR_AWAY_MODE: away_mode} if entity_id: data[ATTR_ENTITY_ID] = entity_id - hass.services.call(DOMAIN, SERVICE_SET_AWAY_MODE, data) + await hass.services.async_call(DOMAIN, SERVICE_SET_AWAY_MODE, data, blocking=True) -@bind_hass -def set_temperature( +async def async_set_temperature( hass, temperature=None, entity_id=ENTITY_MATCH_ALL, operation_mode=None ): """Set new target temperature.""" @@ -42,15 +39,18 @@ def set_temperature( if value is not None } _LOGGER.debug("set_temperature start data=%s", kwargs) - hass.services.call(DOMAIN, SERVICE_SET_TEMPERATURE, kwargs) + await hass.services.async_call( + DOMAIN, SERVICE_SET_TEMPERATURE, kwargs, blocking=True + ) -@bind_hass -def set_operation_mode(hass, operation_mode, entity_id=ENTITY_MATCH_ALL): +async def async_set_operation_mode(hass, operation_mode, entity_id=ENTITY_MATCH_ALL): """Set new target operation mode.""" data = {ATTR_OPERATION_MODE: operation_mode} if entity_id is not None: data[ATTR_ENTITY_ID] = entity_id - hass.services.call(DOMAIN, SERVICE_SET_OPERATION_MODE, data) + await hass.services.async_call( + DOMAIN, SERVICE_SET_OPERATION_MODE, data, blocking=True + ) diff --git a/tests/components/water_heater/test_reproduce_state.py b/tests/components/water_heater/test_reproduce_state.py index 0c12d8eb54a6..93e7deb37eea 100644 --- a/tests/components/water_heater/test_reproduce_state.py +++ b/tests/components/water_heater/test_reproduce_state.py @@ -93,32 +93,32 @@ async def test_reproducing_states(hass, caplog): assert turn_off_calls[0].domain == "water_heater" assert turn_off_calls[0].data == {"entity_id": "water_heater.entity_on"} - VALID_OP_CALLS = [ + valid_op_calls = [ {"entity_id": "water_heater.entity_away", ATTR_OPERATION_MODE: STATE_GAS}, {"entity_id": "water_heater.entity_gas", ATTR_OPERATION_MODE: STATE_ECO}, ] assert len(set_op_calls) == 2 for call in set_op_calls: assert call.domain == "water_heater" - assert call.data in VALID_OP_CALLS - VALID_OP_CALLS.remove(call.data) + assert call.data in valid_op_calls + valid_op_calls.remove(call.data) - VALID_TEMP_CALLS = [ + valid_temp_calls = [ {"entity_id": "water_heater.entity_off", ATTR_TEMPERATURE: 45}, {"entity_id": "water_heater.entity_gas", ATTR_TEMPERATURE: 45}, ] assert len(set_temp_calls) == 2 for call in set_temp_calls: assert call.domain == "water_heater" - assert call.data in VALID_TEMP_CALLS - VALID_TEMP_CALLS.remove(call.data) + assert call.data in valid_temp_calls + valid_temp_calls.remove(call.data) - VALID_AWAY_CALLS = [ + valid_away_calls = [ {"entity_id": "water_heater.entity_all", ATTR_AWAY_MODE: False}, {"entity_id": "water_heater.entity_gas", ATTR_AWAY_MODE: True}, ] assert len(set_away_calls) == 2 for call in set_away_calls: assert call.domain == "water_heater" - assert call.data in VALID_AWAY_CALLS - VALID_AWAY_CALLS.remove(call.data) + assert call.data in valid_away_calls + valid_away_calls.remove(call.data) From c39fe36a1c148e919261434f024a52a82f65fd0a Mon Sep 17 00:00:00 2001 From: jjlawren Date: Mon, 6 Apr 2020 12:15:11 -0500 Subject: [PATCH 170/653] Skip parsing Plex session if incomplete (#33534) * Skip parsing session if incomplete * Schedule an update if session data is incomplete * Mark as callback * Remove update() & convert to async, abort if any session is incomplete --- homeassistant/components/plex/sensor.py | 109 ++++++++++++++---------- 1 file changed, 62 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/plex/sensor.py b/homeassistant/components/plex/sensor.py index 0e3aa5d4469a..65c2fab36141 100644 --- a/homeassistant/components/plex/sensor.py +++ b/homeassistant/components/plex/sensor.py @@ -2,14 +2,16 @@ import logging from homeassistant.core import callback -from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send from homeassistant.helpers.entity import Entity +from homeassistant.helpers.event import async_call_later from .const import ( CONF_SERVER_IDENTIFIER, DISPATCHERS, DOMAIN as PLEX_DOMAIN, NAME_FORMAT, + PLEX_UPDATE_PLATFORMS_SIGNAL, PLEX_UPDATE_SENSOR_SIGNAL, SERVERS, ) @@ -47,11 +49,67 @@ class PlexSensor(Entity): ) self.hass.data[PLEX_DOMAIN][DISPATCHERS][server_id].append(unsub) - @callback - def async_refresh_sensor(self, sessions): + async def async_refresh_sensor(self, sessions): """Set instance object and trigger an entity state update.""" + _LOGGER.debug("Refreshing sensor [%s]", self.unique_id) + self.sessions = sessions - self.async_schedule_update_ha_state(True) + + @callback + def update_plex(_): + dispatcher_send( + self.hass, + PLEX_UPDATE_PLATFORMS_SIGNAL.format(self._server.machine_identifier), + ) + + now_playing = [] + for sess in self.sessions: + if sess.TYPE == "photo": + _LOGGER.debug("Photo session detected, skipping: %s", sess) + continue + if not sess.usernames: + _LOGGER.debug( + "Session temporarily incomplete, will try again: %s", sess + ) + async_call_later(self.hass, 5, update_plex) + return + user = sess.usernames[0] + device = sess.players[0].title + now_playing_user = f"{user} - {device}" + now_playing_title = "" + + if sess.TYPE in ["clip", "episode"]: + # example: + # "Supernatural (2005) - s01e13 - Route 666" + season_title = sess.grandparentTitle + show = await self.hass.async_add_executor_job(sess.show) + if show.year is not None: + season_title += f" ({show.year!s})" + season_episode = sess.seasonEpisode + episode_title = sess.title + now_playing_title = ( + f"{season_title} - {season_episode} - {episode_title}" + ) + elif sess.TYPE == "track": + # example: + # "Billy Talent - Afraid of Heights - Afraid of Heights" + track_artist = sess.grandparentTitle + track_album = sess.parentTitle + track_title = sess.title + now_playing_title = f"{track_artist} - {track_album} - {track_title}" + else: + # example: + # "picture_of_last_summer_camp (2015)" + # "The Incredible Hulk (2008)" + now_playing_title = sess.title + if sess.year is not None: + now_playing_title += f" ({sess.year})" + + now_playing.append((now_playing_user, now_playing_title)) + self._state = len(self.sessions) + self._now_playing = now_playing + + self.async_write_ha_state() @property def name(self): @@ -88,49 +146,6 @@ class PlexSensor(Entity): """Return the state attributes.""" return {content[0]: content[1] for content in self._now_playing} - def update(self): - """Update method for Plex sensor.""" - _LOGGER.debug("Refreshing sensor [%s]", self.unique_id) - now_playing = [] - for sess in self.sessions: - if sess.TYPE == "photo": - _LOGGER.debug("Photo session detected, skipping: %s", sess) - continue - user = sess.usernames[0] - device = sess.players[0].title - now_playing_user = f"{user} - {device}" - now_playing_title = "" - - if sess.TYPE in ["clip", "episode"]: - # example: - # "Supernatural (2005) - s01e13 - Route 666" - season_title = sess.grandparentTitle - if sess.show().year is not None: - season_title += f" ({sess.show().year!s})" - season_episode = sess.seasonEpisode - episode_title = sess.title - now_playing_title = ( - f"{season_title} - {season_episode} - {episode_title}" - ) - elif sess.TYPE == "track": - # example: - # "Billy Talent - Afraid of Heights - Afraid of Heights" - track_artist = sess.grandparentTitle - track_album = sess.parentTitle - track_title = sess.title - now_playing_title = f"{track_artist} - {track_album} - {track_title}" - else: - # example: - # "picture_of_last_summer_camp (2015)" - # "The Incredible Hulk (2008)" - now_playing_title = sess.title - if sess.year is not None: - now_playing_title += f" ({sess.year})" - - now_playing.append((now_playing_user, now_playing_title)) - self._state = len(self.sessions) - self._now_playing = now_playing - @property def device_info(self): """Return a device description for device registry.""" From 66ac5d5b766f904a2650e176484b70e49350383d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 6 Apr 2020 12:24:08 -0500 Subject: [PATCH 171/653] =?UTF-8?q?Abort=20rachio=20config=20flow=20if=20t?= =?UTF-8?q?he=20api=20key=20is=20already=20configured=E2=80=A6=20(#33747)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now abort before hitting the api which can be slow and block startup if importing from yaml. --- homeassistant/components/rachio/config_flow.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/rachio/config_flow.py b/homeassistant/components/rachio/config_flow.py index 9eff7c993342..64e78a24f4a4 100644 --- a/homeassistant/components/rachio/config_flow.py +++ b/homeassistant/components/rachio/config_flow.py @@ -62,9 +62,11 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Handle the initial step.""" errors = {} if user_input is not None: + await self.async_set_unique_id(user_input[CONF_API_KEY]) + self._abort_if_unique_id_configured() try: info = await validate_input(self.hass, user_input) - + return self.async_create_entry(title=info["title"], data=user_input) except CannotConnect: errors["base"] = "cannot_connect" except InvalidAuth: @@ -73,11 +75,6 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): _LOGGER.exception("Unexpected exception") errors["base"] = "unknown" - if "base" not in errors: - await self.async_set_unique_id(user_input[CONF_API_KEY]) - self._abort_if_unique_id_configured() - return self.async_create_entry(title=info["title"], data=user_input) - return self.async_show_form( step_id="user", data_schema=DATA_SCHEMA, errors=errors ) From f3b6575272e3949c7dd02ebdb95a165747e07223 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 6 Apr 2020 19:25:09 +0200 Subject: [PATCH 172/653] Fix MQTT debug info for subscriptions with wildcard. (#33744) --- homeassistant/components/mqtt/__init__.py | 17 +++++++--- homeassistant/components/mqtt/debug_info.py | 2 +- homeassistant/components/mqtt/models.py | 1 + tests/components/mqtt/test_init.py | 37 +++++++++++++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 5a4dd701d32b..ff99cf59c0b9 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -388,7 +388,7 @@ def wrap_msg_callback(msg_callback: MessageCallbackType) -> MessageCallbackType: @wraps(msg_callback) async def async_wrapper(msg: Any) -> None: - """Catch and log exception.""" + """Call with deprecated signature.""" await msg_callback(msg.topic, msg.payload, msg.qos) wrapper_func = async_wrapper @@ -396,7 +396,7 @@ def wrap_msg_callback(msg_callback: MessageCallbackType) -> MessageCallbackType: @wraps(msg_callback) def wrapper(msg: Any) -> None: - """Catch and log exception.""" + """Call with deprecated signature.""" msg_callback(msg.topic, msg.payload, msg.qos) wrapper_func = wrapper @@ -808,7 +808,10 @@ class MQTT: if will_message is not None: self._mqttc.will_set( # pylint: disable=no-value-for-parameter - *attr.astuple(will_message) + *attr.astuple( + will_message, + filter=lambda attr, value: attr.name != "subscribed_topic", + ) ) async def async_publish( @@ -940,7 +943,10 @@ class MQTT: if self.birth_message: self.hass.add_job( self.async_publish( # pylint: disable=no-value-for-parameter - *attr.astuple(self.birth_message) + *attr.astuple( + self.birth_message, + filter=lambda attr, value: attr.name != "subscribed_topic", + ) ) ) @@ -976,7 +982,8 @@ class MQTT: continue self.hass.async_run_job( - subscription.callback, Message(msg.topic, payload, msg.qos, msg.retain) + subscription.callback, + Message(msg.topic, payload, msg.qos, msg.retain, subscription.topic), ) def _mqtt_on_disconnect(self, _mqttc, _userdata, result_code: int) -> None: diff --git a/homeassistant/components/mqtt/debug_info.py b/homeassistant/components/mqtt/debug_info.py index ec4ff1676bb8..b51ee619a121 100644 --- a/homeassistant/components/mqtt/debug_info.py +++ b/homeassistant/components/mqtt/debug_info.py @@ -21,7 +21,7 @@ def log_messages(hass: HomeAssistantType, entity_id: str) -> MessageCallbackType def _log_message(msg): """Log message.""" debug_info = hass.data[DATA_MQTT_DEBUG_INFO] - messages = debug_info["entities"][entity_id]["topics"][msg.topic] + messages = debug_info["entities"][entity_id]["topics"][msg.subscribed_topic] messages.append(msg.payload) def _decorator(msg_callback: MessageCallbackType): diff --git a/homeassistant/components/mqtt/models.py b/homeassistant/components/mqtt/models.py index cfdecd3383d1..3a4add57298c 100644 --- a/homeassistant/components/mqtt/models.py +++ b/homeassistant/components/mqtt/models.py @@ -14,6 +14,7 @@ class Message: payload = attr.ib(type=PublishPayloadType) qos = attr.ib(type=int) retain = attr.ib(type=bool) + subscribed_topic = attr.ib(type=str, default=None) MessageCallbackType = Callable[[Message], None] diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index d9686719a82d..637cefcf7442 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -1235,3 +1235,40 @@ async def test_debug_info_non_mqtt(hass, device_reg, entity_reg): debug_info_data = await debug_info.info_for_device(hass, device_entry.id) assert len(debug_info_data["entities"]) == 0 assert len(debug_info_data["triggers"]) == 0 + + +async def test_debug_info_wildcard(hass, mqtt_mock): + """Test debug info.""" + config = { + "device": {"identifiers": ["helloworld"]}, + "platform": "mqtt", + "name": "test", + "state_topic": "sensor/#", + "unique_id": "veryunique", + } + + entry = MockConfigEntry(domain=mqtt.DOMAIN) + entry.add_to_hass(hass) + await async_start(hass, "homeassistant", {}, entry) + registry = await hass.helpers.device_registry.async_get_registry() + + data = json.dumps(config) + async_fire_mqtt_message(hass, "homeassistant/sensor/bla/config", data) + await hass.async_block_till_done() + + device = registry.async_get_device({("mqtt", "helloworld")}, set()) + assert device is not None + + debug_info_data = await debug_info.info_for_device(hass, device.id) + assert len(debug_info_data["entities"][0]["topics"]) >= 1 + assert {"topic": "sensor/#", "messages": []} in debug_info_data["entities"][0][ + "topics" + ] + + async_fire_mqtt_message(hass, "sensor/abc", "123") + + debug_info_data = await debug_info.info_for_device(hass, device.id) + assert len(debug_info_data["entities"][0]["topics"]) >= 1 + assert {"topic": "sensor/#", "messages": ["123"]} in debug_info_data["entities"][0][ + "topics" + ] From 0d2de919a628bccd9c18ac64d7a0ed5e906ec8be Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Mon, 6 Apr 2020 19:32:04 +0200 Subject: [PATCH 173/653] Clean up after global variable deletion (#33743) * Clean up after global variable deletion * Remove self from method calls --- homeassistant/components/arduino/__init__.py | 1 - homeassistant/components/arduino/sensor.py | 4 ---- homeassistant/components/arduino/switch.py | 5 ----- homeassistant/components/bloomsky/__init__.py | 1 - homeassistant/components/sleepiq/__init__.py | 2 -- homeassistant/components/sleepiq/binary_sensor.py | 7 +++---- 6 files changed, 3 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/arduino/__init__.py b/homeassistant/components/arduino/__init__.py index c890e8a8b1e4..e87a625522e1 100644 --- a/homeassistant/components/arduino/__init__.py +++ b/homeassistant/components/arduino/__init__.py @@ -26,7 +26,6 @@ def setup(hass, config): port = config[DOMAIN][CONF_PORT] - board = None try: board = ArduinoBoard(port) except (serial.serialutil.SerialException, FileNotFoundError): diff --git a/homeassistant/components/arduino/sensor.py b/homeassistant/components/arduino/sensor.py index 935aa01a9a70..9178e99e0f99 100644 --- a/homeassistant/components/arduino/sensor.py +++ b/homeassistant/components/arduino/sensor.py @@ -26,10 +26,6 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" board = hass.data[DOMAIN] - if board is None: - _LOGGER.error("A connection has not been made to the Arduino board") - return False - pins = config.get(CONF_PINS) sensors = [] diff --git a/homeassistant/components/arduino/switch.py b/homeassistant/components/arduino/switch.py index 9ea7a8b7a43e..7ce4de69f4f6 100644 --- a/homeassistant/components/arduino/switch.py +++ b/homeassistant/components/arduino/switch.py @@ -33,11 +33,6 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" board = hass.data[DOMAIN] - # Verify that Arduino board is present - if board is None: - _LOGGER.error("A connection has not been made to the Arduino board") - return False - pins = config.get(CONF_PINS) switches = [] diff --git a/homeassistant/components/bloomsky/__init__.py b/homeassistant/components/bloomsky/__init__.py index c9948aa2ff96..ba10c5c74131 100644 --- a/homeassistant/components/bloomsky/__init__.py +++ b/homeassistant/components/bloomsky/__init__.py @@ -30,7 +30,6 @@ def setup(hass, config): """Set up the BloomSky component.""" api_key = config[DOMAIN][CONF_API_KEY] - bloomsky = None try: bloomsky = BloomSky(api_key, hass.config.units.is_metric) except RuntimeError: diff --git a/homeassistant/components/sleepiq/__init__.py b/homeassistant/components/sleepiq/__init__.py index 9227b872080f..3fc065264ca6 100644 --- a/homeassistant/components/sleepiq/__init__.py +++ b/homeassistant/components/sleepiq/__init__.py @@ -36,8 +36,6 @@ def setup(hass, config): Will automatically load sensor components to support devices discovered on the account. """ - data = None - username = config[DOMAIN][CONF_USERNAME] password = config[DOMAIN][CONF_PASSWORD] client = Sleepyq(username, password) diff --git a/homeassistant/components/sleepiq/binary_sensor.py b/homeassistant/components/sleepiq/binary_sensor.py index 2e5028596016..3ba39a38764b 100644 --- a/homeassistant/components/sleepiq/binary_sensor.py +++ b/homeassistant/components/sleepiq/binary_sensor.py @@ -26,10 +26,9 @@ class IsInBedBinarySensor(SleepIQSensor, BinarySensorDevice): def __init__(self, sleepiq_data, bed_id, side): """Initialize the sensor.""" - SleepIQSensor.__init__(self, sleepiq_data, bed_id, side) - self.type = IS_IN_BED + super().__init__(sleepiq_data, bed_id, side) self._state = None - self._name = SENSOR_TYPES[self.type] + self._name = SENSOR_TYPES[IS_IN_BED] self.update() @property @@ -44,5 +43,5 @@ class IsInBedBinarySensor(SleepIQSensor, BinarySensorDevice): def update(self): """Get the latest data from SleepIQ and updates the states.""" - SleepIQSensor.update(self) + super().update() self._state = self.side.is_in_bed From 34ecc803b312cb2d3b8872db20cd4b8c51cfe4d7 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 6 Apr 2020 19:53:39 +0200 Subject: [PATCH 174/653] Pre-commit changes to Prettier and executables check (#33749) --- .pre-commit-config.yaml | 4 +++- azure-pipelines-ci.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 62f634ebc56f..1c153ca82532 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,6 +46,7 @@ repos: rev: v2.4.0 hooks: - id: check-executables-have-shebangs + stages: [manual] - id: check-json - id: no-commit-to-branch args: @@ -57,9 +58,10 @@ repos: hooks: - id: yamllint - repo: https://github.com/prettier/prettier - rev: 2.0.2 + rev: 2.0.4 hooks: - id: prettier + stages: [manual] - repo: local hooks: # Run mypy through our wrapper script in order to get the possible diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 38b7a3c32177..84740a32c625 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -46,7 +46,7 @@ stages: pre-commit install-hooks - script: | . venv/bin/activate - pre-commit run check-executables-have-shebangs --all-files + pre-commit run --hook-stage manual check-executables-have-shebangs --all-files displayName: 'Run executables check' - script: | . venv/bin/activate From db2110f0c69c4977e029cda7b5a429b3ef455dc9 Mon Sep 17 00:00:00 2001 From: Thibault Maekelbergh <6213695+thibmaek@users.noreply.github.com> Date: Mon, 6 Apr 2020 21:15:29 +0200 Subject: [PATCH 175/653] Add some safety checks for property access in NMBS sensor (#33695) --- homeassistant/components/nmbs/sensor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/homeassistant/components/nmbs/sensor.py b/homeassistant/components/nmbs/sensor.py index c6dd7b963ff3..23b8bbea46b0 100644 --- a/homeassistant/components/nmbs/sensor.py +++ b/homeassistant/components/nmbs/sensor.py @@ -152,6 +152,10 @@ class NMBSLiveBoard(Entity): def update(self): """Set the state equal to the next departure.""" liveboard = self._api_client.get_liveboard(self._station) + + if liveboard is None or not liveboard["departures"]: + return + next_departure = liveboard["departures"]["departure"][0] self._attrs = next_departure @@ -266,6 +270,9 @@ class NMBSSensor(Entity): self._station_from, self._station_to ) + if connections is None or not connections["connection"]: + return + if int(connections["connection"][0]["departure"]["left"]) > 0: next_connection = connections["connection"][1] else: From 2dbd8cf72c3abc5faab03d8b8191204441332e17 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 6 Apr 2020 22:23:22 +0200 Subject: [PATCH 176/653] Bump frontend (#33751) --- 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 3059a0fa71cd..3c6e8478c095 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,7 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": ["home-assistant-frontend==20200403.0"], + "requirements": ["home-assistant-frontend==20200406.0"], "dependencies": [ "api", "auth", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index fdb7f8f18d92..f0415aead622 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -12,7 +12,7 @@ cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 hass-nabucasa==0.33.0 -home-assistant-frontend==20200403.0 +home-assistant-frontend==20200406.0 importlib-metadata==1.5.0 jinja2>=2.11.1 netdisco==2.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index b755c16d90b2..f85d2826c05d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -703,7 +703,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200403.0 +home-assistant-frontend==20200406.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0e3be2edc4a3..a89c44446041 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -281,7 +281,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200403.0 +home-assistant-frontend==20200406.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From b3b770476db9ecd23e2374cbc34dae799931a65c Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Mon, 6 Apr 2020 22:29:27 +0200 Subject: [PATCH 177/653] Update azure-pipelines-ci.yml --- azure-pipelines-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 84740a32c625..dac3a361a705 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -166,7 +166,7 @@ stages: . venv/bin/activate pytest --timeout=9 --durations=10 -n auto --dist=loadfile --cov homeassistant --cov-report html -qq -o console_output_style=count -p no:sugar tests - #codecov --token $(codecovToken) + codecov --token $(codecovToken) script/check_dirty displayName: 'Run pytest for python $(python.container) / coverage' condition: and(succeeded(), eq(variables['python.container'], variables['PythonMain'])) From 6ca2c4da3a6690254ca30c8ec66e38f1a5abc4b4 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 6 Apr 2020 15:17:45 -0600 Subject: [PATCH 178/653] =?UTF-8?q?Properly=20demarcate=20websocket=20and?= =?UTF-8?q?=20REST=20API=20callbacks=20in=20SimpliS=E2=80=A6=20(#33706)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Properly demarcate websocket and REST API callbacks in SimpliSafe * Docstring * Method names * Cleanup * Remove spurious logging * Remove redundant method * Fix comment * Code review --- .../components/simplisafe/__init__.py | 174 ++++++++---------- 1 file changed, 79 insertions(+), 95 deletions(-) diff --git a/homeassistant/components/simplisafe/__init__.py b/homeassistant/components/simplisafe/__init__.py index 04c00171b437..53a844ccb9a8 100644 --- a/homeassistant/components/simplisafe/__init__.py +++ b/homeassistant/components/simplisafe/__init__.py @@ -63,7 +63,8 @@ _LOGGER = logging.getLogger(__name__) CONF_ACCOUNTS = "accounts" DATA_LISTENER = "listener" -TOPIC_UPDATE = "simplisafe_update_data_{0}" +TOPIC_UPDATE_REST_API = "simplisafe_update_rest_api_{0}" +TOPIC_UPDATE_WEBSOCKET = "simplisafe_update_websocket_{0}" EVENT_SIMPLISAFE_EVENT = "SIMPLISAFE_EVENT" EVENT_SIMPLISAFE_NOTIFICATION = "SIMPLISAFE_NOTIFICATION" @@ -354,7 +355,6 @@ class SimpliSafeWebsocket: """Initialize.""" self._hass = hass self._websocket = websocket - self.last_events = {} @staticmethod def _on_connect(): @@ -369,8 +369,9 @@ class SimpliSafeWebsocket: def _on_event(self, event): """Define a handler to fire when a new SimpliSafe event arrives.""" _LOGGER.debug("New websocket event: %s", event) - self.last_events[event.system_id] = event - async_dispatcher_send(self._hass, TOPIC_UPDATE.format(event.system_id)) + async_dispatcher_send( + self._hass, TOPIC_UPDATE_WEBSOCKET.format(event.system_id), event + ) if event.event_type not in WEBSOCKET_EVENTS_TO_TRIGGER_HASS_EVENT: return @@ -491,7 +492,9 @@ class SimpliSafe: await system.update() self._async_process_new_notifications(system) _LOGGER.debug('Updated REST API data for "%s"', system.address) - async_dispatcher_send(self._hass, TOPIC_UPDATE.format(system.system_id)) + async_dispatcher_send( + self._hass, TOPIC_UPDATE_REST_API.format(system.system_id) + ) tasks = [update_system(system) for system in self.systems.values()] @@ -538,8 +541,6 @@ class SimpliSafeEntity(Entity): def __init__(self, simplisafe, system, name, *, serial=None): """Initialize.""" - self._async_unsub_dispatcher_connect = None - self._last_processed_websocket_event = None self._name = name self._online = True self._simplisafe = simplisafe @@ -606,90 +607,9 @@ class SimpliSafeEntity(Entity): """Return the unique ID of the entity.""" return self._serial - @callback - def _async_should_ignore_websocket_event(self, event): - """Return whether this entity should ignore a particular websocket event. - - Note that we can't check for a final condition – whether the event belongs to - a particular entity, like a lock – because some events (like arming the system - from a keypad _or_ from the website) should impact the same entity. - """ - # We've already processed this event: - if self._last_processed_websocket_event == event: - return True - - # This is an event for a system other than the one this entity belongs to: - if event.system_id != self._system.system_id: - return True - - # This isn't an event that this entity cares about: - if event.event_type not in self.websocket_events_to_listen_for: - return True - - # This event is targeted at a specific entity whose serial number is different - # from this one's: - if ( - event.event_type in WEBSOCKET_EVENTS_REQUIRING_SERIAL - and event.sensor_serial != self._serial - ): - return True - - return False - - async def async_added_to_hass(self): - """Register callbacks.""" - - @callback - def update(): - """Update the state.""" - self.update_from_latest_data() - self.async_write_ha_state() - - self._async_unsub_dispatcher_connect = async_dispatcher_connect( - self.hass, TOPIC_UPDATE.format(self._system.system_id), update - ) - - self.update_from_latest_data() - - @callback - def update_from_latest_data(self): - """Update the entity.""" - self.async_update_from_rest_api() - - last_websocket_event = self._simplisafe.websocket.last_events.get( - self._system.system_id - ) - - if self._async_should_ignore_websocket_event(last_websocket_event): - return - - self._last_processed_websocket_event = last_websocket_event - - if last_websocket_event.sensor_type: - sensor_type = last_websocket_event.sensor_type.name - else: - sensor_type = None - - self._attrs.update( - { - ATTR_LAST_EVENT_INFO: last_websocket_event.info, - ATTR_LAST_EVENT_SENSOR_NAME: last_websocket_event.sensor_name, - ATTR_LAST_EVENT_SENSOR_TYPE: sensor_type, - ATTR_LAST_EVENT_TIMESTAMP: last_websocket_event.timestamp, - } - ) - self._async_internal_update_from_websocket_event(last_websocket_event) - - @callback - def async_update_from_rest_api(self): - """Update the entity with the provided REST API data.""" - @callback def _async_internal_update_from_websocket_event(self, event): - """Check for connection events and set offline appropriately. - - Should not be called directly. - """ + """Perform internal websocket handling prior to handing off.""" if event.event_type == EVENT_CONNECTION_LOST: self._online = False elif event.event_type == EVENT_CONNECTION_RESTORED: @@ -701,13 +621,77 @@ class SimpliSafeEntity(Entity): if not self._online: return + if event.sensor_type: + sensor_type = event.sensor_type.name + else: + sensor_type = None + + self._attrs.update( + { + ATTR_LAST_EVENT_INFO: event.info, + ATTR_LAST_EVENT_SENSOR_NAME: event.sensor_name, + ATTR_LAST_EVENT_SENSOR_TYPE: sensor_type, + ATTR_LAST_EVENT_TIMESTAMP: event.timestamp, + } + ) + self.async_update_from_websocket_event(event) + async def async_added_to_hass(self): + """Register callbacks.""" + + @callback + def rest_api_update(): + """Update the entity with new REST API data.""" + self.async_update_from_rest_api() + self.async_write_ha_state() + + self.async_on_remove( + async_dispatcher_connect( + self.hass, + TOPIC_UPDATE_REST_API.format(self._system.system_id), + rest_api_update, + ) + ) + + @callback + def websocket_update(event): + """Update the entity with new websocket data.""" + # Ignore this event if it belongs to a system other than this one: + if event.system_id != self._system.system_id: + return + + # Ignore this event if this entity hasn't expressed interest in its type: + if event.event_type not in self.websocket_events_to_listen_for: + return + + # Ignore this event if it belongs to a entity with a different serial + # number from this one's: + if ( + event.event_type in WEBSOCKET_EVENTS_REQUIRING_SERIAL + and event.sensor_serial != self._serial + ): + return + + self._async_internal_update_from_websocket_event(event) + self.async_write_ha_state() + + self.async_on_remove( + async_dispatcher_connect( + self.hass, + TOPIC_UPDATE_WEBSOCKET.format(self._system.system_id), + websocket_update, + ) + ) + + self.async_update_from_rest_api() + + @callback + def async_update_from_rest_api(self): + """Update the entity with the provided REST API data.""" + raise NotImplementedError() + @callback def async_update_from_websocket_event(self, event): - """Update the entity with the provided websocket API data.""" - - async def async_will_remove_from_hass(self) -> None: - """Disconnect dispatcher listener when removed.""" - if self._async_unsub_dispatcher_connect: - self._async_unsub_dispatcher_connect() + """Update the entity with the provided websocket event.""" + raise NotImplementedError() From cf563df42a984a27962e12e650d0cccbecc8580e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 6 Apr 2020 16:30:10 -0500 Subject: [PATCH 179/653] Bump HAP-python to 2.8.1 (#33756) --- homeassistant/components/homekit/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index 417ff9db5bcf..b0c49a58a6a4 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -2,6 +2,6 @@ "domain": "homekit", "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", - "requirements": ["HAP-python==2.8.0"], + "requirements": ["HAP-python==2.8.1"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index f85d2826c05d..a9e808e93a38 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -35,7 +35,7 @@ Adafruit-SHT31==1.0.2 # Adafruit_BBIO==1.1.1 # homeassistant.components.homekit -HAP-python==2.8.0 +HAP-python==2.8.1 # homeassistant.components.mastodon Mastodon.py==1.5.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a89c44446041..07197414bf00 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -4,7 +4,7 @@ -r requirements_test.txt # homeassistant.components.homekit -HAP-python==2.8.0 +HAP-python==2.8.1 # homeassistant.components.mobile_app # homeassistant.components.owntracks From cc1564da4a786fe33d7b9d6b629d6b882a899ff6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 6 Apr 2020 15:11:46 -0700 Subject: [PATCH 180/653] TTS: Wait till files are created in tests (#33760) --- tests/components/tts/test_init.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index 803d3d6f1dbb..c6b847c313e2 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -132,6 +132,7 @@ async def test_setup_component_and_test_service(hass, empty_cache_dir): ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3".format( hass.config.api.base_url ) + await hass.async_block_till_done() assert ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" ).is_file() @@ -164,6 +165,7 @@ async def test_setup_component_and_test_service_with_config_language( ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( hass.config.api.base_url ) + await hass.async_block_till_done() assert ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3" ).is_file() @@ -205,6 +207,7 @@ async def test_setup_component_and_test_service_with_service_language( ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3".format( hass.config.api.base_url ) + await hass.async_block_till_done() assert ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_de_-_demo.mp3" ).is_file() @@ -232,6 +235,7 @@ async def test_setup_component_test_service_with_wrong_service_language( blocking=True, ) assert len(calls) == 0 + await hass.async_block_till_done() assert not ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_lang_-_demo.mp3" ).is_file() @@ -268,6 +272,7 @@ async def test_setup_component_and_test_service_with_service_options( ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{}_demo.mp3".format( hass.config.api.base_url, opt_hash ) + await hass.async_block_till_done() assert ( empty_cache_dir / f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3" @@ -338,6 +343,7 @@ async def test_setup_component_and_test_service_with_service_options_wrong( opt_hash = ctypes.c_size_t(hash(frozenset({"speed": 1}))).value assert len(calls) == 0 + await hass.async_block_till_done() assert not ( empty_cache_dir / f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3" @@ -392,6 +398,7 @@ async def test_setup_component_and_test_service_clear_cache(hass, empty_cache_di # To make sure the file is persisted await hass.async_block_till_done() assert len(calls) == 1 + await hass.async_block_till_done() assert ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" ).is_file() @@ -400,6 +407,7 @@ async def test_setup_component_and_test_service_clear_cache(hass, empty_cache_di tts.DOMAIN, tts.SERVICE_CLEAR_CACHE, {}, blocking=True ) + await hass.async_block_till_done() assert not ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" ).is_file() @@ -529,6 +537,7 @@ async def test_setup_component_test_without_cache(hass, empty_cache_dir): blocking=True, ) assert len(calls) == 1 + await hass.async_block_till_done() assert not ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" ).is_file() @@ -556,6 +565,7 @@ async def test_setup_component_test_with_cache_call_service_without_cache( blocking=True, ) assert len(calls) == 1 + await hass.async_block_till_done() assert not ( empty_cache_dir / "42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" ).is_file() From 98e7865457fb545ae6d4c03c59b94b011f32655f Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 6 Apr 2020 16:14:27 -0600 Subject: [PATCH 181/653] Bump aioambient to 1.1.1 (#33761) --- homeassistant/components/ambient_station/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ambient_station/manifest.json b/homeassistant/components/ambient_station/manifest.json index fd6950a88a57..e73190bb5803 100644 --- a/homeassistant/components/ambient_station/manifest.json +++ b/homeassistant/components/ambient_station/manifest.json @@ -3,6 +3,6 @@ "name": "Ambient Weather Station", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ambient_station", - "requirements": ["aioambient==1.1.0"], + "requirements": ["aioambient==1.1.1"], "codeowners": ["@bachya"] } diff --git a/requirements_all.txt b/requirements_all.txt index a9e808e93a38..554e2138eed1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -140,7 +140,7 @@ aio_geojson_nsw_rfs_incidents==0.3 aio_georss_gdacs==0.3 # homeassistant.components.ambient_station -aioambient==1.1.0 +aioambient==1.1.1 # homeassistant.components.asuswrt aioasuswrt==1.2.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 07197414bf00..45d155cc6b66 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -47,7 +47,7 @@ aio_geojson_nsw_rfs_incidents==0.3 aio_georss_gdacs==0.3 # homeassistant.components.ambient_station -aioambient==1.1.0 +aioambient==1.1.1 # homeassistant.components.asuswrt aioasuswrt==1.2.3 From 648b340e8cf718e1561d2d0ea6e4b5f48784eafb Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 6 Apr 2020 16:28:42 -0600 Subject: [PATCH 182/653] Bump simplisafe-python to 9.0.6 (#33762) --- 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 3cf528adec1e..cd0cda68125c 100644 --- a/homeassistant/components/simplisafe/manifest.json +++ b/homeassistant/components/simplisafe/manifest.json @@ -3,6 +3,6 @@ "name": "SimpliSafe", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/simplisafe", - "requirements": ["simplisafe-python==9.0.5"], + "requirements": ["simplisafe-python==9.0.6"], "codeowners": ["@bachya"] } diff --git a/requirements_all.txt b/requirements_all.txt index 554e2138eed1..65a7af01b2b6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1872,7 +1872,7 @@ simplehound==0.3 simplepush==1.1.4 # homeassistant.components.simplisafe -simplisafe-python==9.0.5 +simplisafe-python==9.0.6 # homeassistant.components.sisyphus sisyphus-control==2.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 45d155cc6b66..0cbb2005dc9a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -700,7 +700,7 @@ sentry-sdk==0.13.5 simplehound==0.3 # homeassistant.components.simplisafe -simplisafe-python==9.0.5 +simplisafe-python==9.0.6 # homeassistant.components.sleepiq sleepyq==0.7 From b48dcca05d304c58305877b05bb84c0a8063463a Mon Sep 17 00:00:00 2001 From: jjlawren Date: Mon, 6 Apr 2020 18:18:13 -0500 Subject: [PATCH 183/653] Defer Plex sensor retry instead of aborting (#33753) --- homeassistant/components/plex/sensor.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/plex/sensor.py b/homeassistant/components/plex/sensor.py index 65c2fab36141..21e8e1a8a582 100644 --- a/homeassistant/components/plex/sensor.py +++ b/homeassistant/components/plex/sensor.py @@ -54,6 +54,7 @@ class PlexSensor(Entity): _LOGGER.debug("Refreshing sensor [%s]", self.unique_id) self.sessions = sessions + update_failed = False @callback def update_plex(_): @@ -71,8 +72,8 @@ class PlexSensor(Entity): _LOGGER.debug( "Session temporarily incomplete, will try again: %s", sess ) - async_call_later(self.hass, 5, update_plex) - return + update_failed = True + continue user = sess.usernames[0] device = sess.players[0].title now_playing_user = f"{user} - {device}" @@ -111,6 +112,9 @@ class PlexSensor(Entity): self.async_write_ha_state() + if update_failed: + async_call_later(self.hass, 5, update_plex) + @property def name(self): """Return the name of the sensor.""" From 0ba04ec1ef2f28137ca2c5a88f0b49c6afc58307 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 7 Apr 2020 00:07:21 +0000 Subject: [PATCH 184/653] [ci skip] Translation update --- .../synology_dsm/.translations/ca.json | 25 ++++++++++++++++++ .../synology_dsm/.translations/da.json | 11 ++++++++ .../synology_dsm/.translations/es.json | 26 +++++++++++++++++++ .../synology_dsm/.translations/ko.json | 26 +++++++++++++++++++ .../synology_dsm/.translations/ru.json | 26 +++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 homeassistant/components/synology_dsm/.translations/ca.json create mode 100644 homeassistant/components/synology_dsm/.translations/da.json create mode 100644 homeassistant/components/synology_dsm/.translations/es.json create mode 100644 homeassistant/components/synology_dsm/.translations/ko.json create mode 100644 homeassistant/components/synology_dsm/.translations/ru.json diff --git a/homeassistant/components/synology_dsm/.translations/ca.json b/homeassistant/components/synology_dsm/.translations/ca.json new file mode 100644 index 000000000000..52a416ed8ab9 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/ca.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "L'amfitri\u00f3 ja est\u00e0 configurat" + }, + "error": { + "login": "Error d\u2019inici de sessi\u00f3: comprova el nom d'usuari i la contrasenya" + }, + "step": { + "user": { + "data": { + "api_version": "Versi\u00f3 DSM", + "host": "Amfitri\u00f3", + "name": "Nom", + "password": "Contrasenya", + "port": "Port", + "ssl": "Utilitza SSL/TLS per connectar-te al servidor NAS", + "username": "Nom d'usuari" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/da.json b/homeassistant/components/synology_dsm/.translations/da.json new file mode 100644 index 000000000000..5085cdbce9e1 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/da.json @@ -0,0 +1,11 @@ +{ + "config": { + "step": { + "user": { + "data": { + "password": "Adgangskode" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json new file mode 100644 index 000000000000..925443a844ee --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "El host ya est\u00e1 configurado." + }, + "error": { + "login": "Error de inicio de sesi\u00f3n: comprueba tu direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a", + "unknown": "Error desconocido: por favor vuelve a intentarlo m\u00e1s tarde o usa otra configuraci\u00f3n" + }, + "step": { + "user": { + "data": { + "api_version": "Versi\u00f3n del DSM", + "host": "Host", + "name": "Nombre", + "password": "Contrase\u00f1a", + "port": "Puerto", + "ssl": "Usar SSL/TLS para conectar con tu NAS", + "username": "Usuario" + }, + "title": "DSM Synology" + } + }, + "title": "DSM Synology" + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ko.json b/homeassistant/components/synology_dsm/.translations/ko.json new file mode 100644 index 000000000000..60fcd9866c12 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/ko.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "\ud638\uc2a4\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4." + }, + "error": { + "login": "\ub85c\uadf8\uc778 \uc624\ub958: \uc0ac\uc6a9\uc790 \uc774\ub984 \ubc0f \ube44\ubc00\ubc88\ud638\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694", + "unknown": "\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uc785\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uac70\ub098 \ub2e4\ub978 \uad6c\uc131\uc744 \uc2dc\ub3c4\ud574\ubcf4\uc138\uc694" + }, + "step": { + "user": { + "data": { + "api_version": "DSM \ubc84\uc804", + "host": "\ud638\uc2a4\ud2b8", + "name": "\uc774\ub984", + "password": "\ube44\ubc00\ubc88\ud638", + "port": "\ud3ec\ud2b8", + "ssl": "SSL/TLS \ub97c \uc0ac\uc6a9\ud558\uc5ec NAS \uc5d0 \uc5f0\uacb0", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ru.json b/homeassistant/components/synology_dsm/.translations/ru.json new file mode 100644 index 000000000000..c76fa9ee9726 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/ru.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." + }, + "error": { + "login": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0445\u043e\u0434\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c.", + "unknown": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435." + }, + "step": { + "user": { + "data": { + "api_version": "\u0412\u0435\u0440\u0441\u0438\u044f DSM", + "host": "\u0425\u043e\u0441\u0442", + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "port": "\u041f\u043e\u0440\u0442", + "ssl": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SSL / TLS \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file From 643848cac4d94d414590d2d271fe9805a14b5373 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 7 Apr 2020 08:44:21 +0200 Subject: [PATCH 185/653] Update azure-pipelines-ci.yml for Azure Pipelines --- azure-pipelines-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index dac3a361a705..0b5c8678f115 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -24,7 +24,6 @@ resources: variables: - name: PythonMain value: '37' - - group: codecov stages: From cb98d629680f772c820c8f296a37a82743bc4869 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Tue, 7 Apr 2020 12:36:40 +0200 Subject: [PATCH 186/653] Patch gdacs entry setup in config flow tests (#33776) --- tests/components/gdacs/test_config_flow.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/components/gdacs/test_config_flow.py b/tests/components/gdacs/test_config_flow.py index f04f8158862d..c3c5f5609c43 100644 --- a/tests/components/gdacs/test_config_flow.py +++ b/tests/components/gdacs/test_config_flow.py @@ -1,6 +1,9 @@ """Define tests for the GDACS config flow.""" from datetime import timedelta +from asynctest import patch +import pytest + from homeassistant import data_entry_flow from homeassistant.components.gdacs import CONF_CATEGORIES, DOMAIN from homeassistant.const import ( @@ -11,6 +14,13 @@ from homeassistant.const import ( ) +@pytest.fixture(name="gdacs_setup", autouse=True) +def gdacs_setup_fixture(): + """Mock gdacs entry setup.""" + with patch("homeassistant.components.gdacs.async_setup_entry", return_value=True): + yield + + async def test_duplicate_error(hass, config_entry): """Test that errors are shown when duplicates are added.""" conf = {CONF_LATITUDE: -41.2, CONF_LONGITUDE: 174.7, CONF_RADIUS: 25} From 93f7f78263f4b3ccbbc564f8c67b5c1f9a6f6851 Mon Sep 17 00:00:00 2001 From: Anton Verburg <47820045+antonverburg@users.noreply.github.com> Date: Tue, 7 Apr 2020 15:43:12 +0200 Subject: [PATCH 187/653] Support for pi4ioe5v9xxxx I2C IO expanders (#28847) * Added support for the Pi4ioe5v9xxxx binary IO expanders. * Correction for black failure * Correction for black failure * Fix for manifest.json * Fix for flake8 fault missing a period * Some modifications I made during tests seem to be disapeared, fixed flake8 and black test now * WIP virtual thermostat * WIP virtual thermostat * WIP * 100% tests coverage * Manifest, codeowners, typo fix * Lint problem * Test file blacked * Add a test case for b4dpxl's question * Update CODEOWNERS * Replacement of generic thermostat * Cleaning * Lint * More lint * Using external PyPI package, removed get() * Fix flake8 checks * removed virtual thermostat * Re-fix black & isort * Re-fix isort 2 * Update homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/pi4ioe5v9xxxx/switch.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/pi4ioe5v9xxxx/switch.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/pi4ioe5v9xxxx/switch.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/pi4ioe5v9xxxx/switch.py Co-Authored-By: J. Nick Koston * black for switch * update to latest version manual merge * Delete test_generic_thermostat.py * Delete .gitignore * Delete climate.py * Delete manifest.json * Delete test_climate.py * Delete test_climate.py * fix thermostat interference * fix thermostat interference 2 * Fix pylint * Update .pre-commit-config.yaml Co-authored-by: Cyril Co-authored-by: Niflou Co-authored-by: J. Nick Koston --- .coveragerc | 2 + CODEOWNERS | 1 + .../components/pi4ioe5v9xxxx/__init__.py | 1 + .../components/pi4ioe5v9xxxx/binary_sensor.py | 80 ++++++++++++++++ .../components/pi4ioe5v9xxxx/manifest.json | 8 ++ .../components/pi4ioe5v9xxxx/switch.py | 92 +++++++++++++++++++ requirements_all.txt | 3 + 7 files changed, 187 insertions(+) create mode 100644 homeassistant/components/pi4ioe5v9xxxx/__init__.py create mode 100644 homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py create mode 100644 homeassistant/components/pi4ioe5v9xxxx/manifest.json create mode 100644 homeassistant/components/pi4ioe5v9xxxx/switch.py diff --git a/.coveragerc b/.coveragerc index ca9a6422f1ba..acf72eb254c3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -526,6 +526,8 @@ omit = homeassistant/components/pencom/switch.py homeassistant/components/philips_js/media_player.py homeassistant/components/pi_hole/sensor.py + homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py + homeassistant/components/pi4ioe5v9xxxx/switch.py homeassistant/components/picotts/tts.py homeassistant/components/piglow/light.py homeassistant/components/pilight/* diff --git a/CODEOWNERS b/CODEOWNERS index 3983ae7364bc..26b8e8b158ba 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -281,6 +281,7 @@ homeassistant/components/panel_iframe/* @home-assistant/frontend homeassistant/components/pcal9535a/* @Shulyaka homeassistant/components/persistent_notification/* @home-assistant/core homeassistant/components/philips_js/* @elupus +homeassistant/components/pi4ioe5v9xxxx/* @antonverburg homeassistant/components/pi_hole/* @fabaff @johnluetke homeassistant/components/pilight/* @trekky12 homeassistant/components/plaato/* @JohNan diff --git a/homeassistant/components/pi4ioe5v9xxxx/__init__.py b/homeassistant/components/pi4ioe5v9xxxx/__init__.py new file mode 100644 index 000000000000..516cfc325752 --- /dev/null +++ b/homeassistant/components/pi4ioe5v9xxxx/__init__.py @@ -0,0 +1 @@ +"""Support for controlling IO expanders from Digital.com (PI4IOE5V9570, PI4IOE5V9674, PI4IOE5V9673, PI4IOE5V96224, PI4IOE5V96248).""" diff --git a/homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py b/homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py new file mode 100644 index 000000000000..89f293d1e0de --- /dev/null +++ b/homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py @@ -0,0 +1,80 @@ +"""Support for binary sensor using RPi GPIO.""" +import logging + +from pi4ioe5v9xxxx import pi4ioe5v9xxxx # pylint: disable=import-error +import voluptuous as vol + +from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorDevice +from homeassistant.const import DEVICE_DEFAULT_NAME +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +CONF_INVERT_LOGIC = "invert_logic" +CONF_PINS = "pins" +CONF_I2CBUS = "i2c_bus" +CONF_I2CADDR = "i2c_address" +CONF_BITS = "bits" + +DEFAULT_INVERT_LOGIC = False +DEFAULT_BITS = 24 +DEFAULT_BUS = 1 +DEFAULT_ADDR = 0x20 + + +_SENSORS_SCHEMA = vol.Schema({cv.positive_int: cv.string}) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_PINS): _SENSORS_SCHEMA, + vol.Optional(CONF_I2CBUS, default=DEFAULT_BUS): cv.positive_int, + vol.Optional(CONF_I2CADDR, default=DEFAULT_ADDR): cv.positive_int, + vol.Optional(CONF_BITS, default=DEFAULT_BITS): cv.positive_int, + vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, + } +) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up the IO expander devices.""" + pins = config[CONF_PINS] + binary_sensors = [] + + pi4ioe5v9xxxx.setup( + i2c_bus=config[CONF_I2CBUS], + i2c_addr=config[CONF_I2CADDR], + bits=config[CONF_BITS], + read_mode=True, + invert=False, + ) + for pin_num, pin_name in pins.items(): + binary_sensors.append( + Pi4ioe5v9BinarySensor(pin_name, pin_num, config[CONF_INVERT_LOGIC]) + ) + add_entities(binary_sensors, True) + + +class Pi4ioe5v9BinarySensor(BinarySensorDevice): + """Represent a binary sensor that uses pi4ioe5v9xxxx IO expander in read mode.""" + + def __init__(self, name, pin, invert_logic): + """Initialize the pi4ioe5v9xxxx sensor.""" + self._name = name or DEVICE_DEFAULT_NAME + self._pin = pin + self._invert_logic = invert_logic + self._state = pi4ioe5v9xxxx.pin_from_memory(self._pin) + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def is_on(self): + """Return the state of the entity.""" + return self._state != self._invert_logic + + def update(self): + """Update the IO state.""" + pi4ioe5v9xxxx.hw_to_memory() + self._state = pi4ioe5v9xxxx.pin_from_memory(self._pin) diff --git a/homeassistant/components/pi4ioe5v9xxxx/manifest.json b/homeassistant/components/pi4ioe5v9xxxx/manifest.json new file mode 100644 index 000000000000..749c5d095a01 --- /dev/null +++ b/homeassistant/components/pi4ioe5v9xxxx/manifest.json @@ -0,0 +1,8 @@ +{ + "domain": "pi4ioe5v9xxxx", + "name": "pi4ioe5v9xxxx IO Expander", + "documentation": "https://www.home-assistant.io/integrations/pi4ioe5v9xxxx", + "requirements": ["pi4ioe5v9xxxx==0.0.2"], + "dependencies": [], + "codeowners": ["@antonverburg"] +} diff --git a/homeassistant/components/pi4ioe5v9xxxx/switch.py b/homeassistant/components/pi4ioe5v9xxxx/switch.py new file mode 100644 index 000000000000..5a889cfc318e --- /dev/null +++ b/homeassistant/components/pi4ioe5v9xxxx/switch.py @@ -0,0 +1,92 @@ +"""Allows to configure a switch using RPi GPIO.""" +import logging + +from pi4ioe5v9xxxx import pi4ioe5v9xxxx # pylint: disable=import-error +import voluptuous as vol + +from homeassistant.components.switch import PLATFORM_SCHEMA +from homeassistant.const import DEVICE_DEFAULT_NAME +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import ToggleEntity + +_LOGGER = logging.getLogger(__name__) + +CONF_PINS = "pins" +CONF_INVERT_LOGIC = "invert_logic" +CONF_I2CBUS = "i2c_bus" +CONF_I2CADDR = "i2c_address" +CONF_BITS = "bits" + +DEFAULT_INVERT_LOGIC = False +DEFAULT_BITS = 24 +DEFAULT_BUS = 1 +DEFAULT_ADDR = 0x20 + +_SWITCHES_SCHEMA = vol.Schema({cv.positive_int: cv.string}) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_PINS): _SWITCHES_SCHEMA, + vol.Optional(CONF_I2CBUS, default=DEFAULT_BUS): cv.positive_int, + vol.Optional(CONF_I2CADDR, default=DEFAULT_ADDR): cv.positive_int, + vol.Optional(CONF_BITS, default=DEFAULT_BITS): cv.positive_int, + vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, + } +) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up the swiches devices.""" + pins = config.get(CONF_PINS) + switches = [] + + pi4ioe5v9xxxx.setup( + i2c_bus=config[CONF_I2CBUS], + i2c_addr=config[CONF_I2CADDR], + bits=config[CONF_BITS], + read_mode=False, + invert=False, + ) + for pin, name in pins.items(): + switches.append(Pi4ioe5v9Switch(name, pin, config[CONF_INVERT_LOGIC])) + add_entities(switches) + + +class Pi4ioe5v9Switch(ToggleEntity): + """Representation of a pi4ioe5v9 IO expansion IO.""" + + def __init__(self, name, pin, invert_logic): + """Initialize the pin.""" + self._name = name or DEVICE_DEFAULT_NAME + self._pin = pin + self._invert_logic = invert_logic + self._state = False + + @property + def name(self): + """Return the name of the switch.""" + return self._name + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def is_on(self): + """Return true if device is on.""" + return self._state + + def turn_on(self, **kwargs): + """Turn the device on.""" + pi4ioe5v9xxxx.pin_to_memory(self._pin, not self._invert_logic) + pi4ioe5v9xxxx.memory_to_hw() + self._state = True + self.schedule_update_ha_state() + + def turn_off(self, **kwargs): + """Turn the device off.""" + pi4ioe5v9xxxx.pin_to_memory(self._pin, self._invert_logic) + pi4ioe5v9xxxx.memory_to_hw() + self._state = False + self.schedule_update_ha_state() diff --git a/requirements_all.txt b/requirements_all.txt index 65a7af01b2b6..13f994e57527 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1014,6 +1014,9 @@ pencompy==0.0.3 # homeassistant.components.unifi_direct pexpect==4.6.0 +# homeassistant.components.pi4ioe5v9xxxx +pi4ioe5v9xxxx==0.0.2 + # homeassistant.components.rpi_pfio pifacecommon==4.2.2 From c19a1bf26d23dc875aff5091d49913b0f307d01a Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Tue, 7 Apr 2020 10:45:48 -0400 Subject: [PATCH 188/653] Add Sense attribution to all Sense sensors (#33775) --- homeassistant/components/sense/sensor.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/homeassistant/components/sense/sensor.py b/homeassistant/components/sense/sensor.py index d3cfb8b9db64..7c774ad8f81b 100644 --- a/homeassistant/components/sense/sensor.py +++ b/homeassistant/components/sense/sensor.py @@ -251,6 +251,11 @@ class SenseTrendsSensor(Entity): """Return the unit of measurement of this entity, if any.""" return self._unit_of_measurement + @property + def device_state_attributes(self): + """Return the state attributes.""" + return {ATTR_ATTRIBUTION: ATTRIBUTION} + @property def icon(self): """Icon to use in the frontend, if any.""" @@ -320,6 +325,11 @@ class SenseEnergyDevice(Entity): """Return the unit of measurement of this entity.""" return POWER_WATT + @property + def device_state_attributes(self): + """Return the state attributes.""" + return {ATTR_ATTRIBUTION: ATTRIBUTION} + @property def device_class(self): """Return the device class of the power sensor.""" From b3286a4a013e1d28a74e876017a06b785f9db903 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Tue, 7 Apr 2020 16:56:48 +0200 Subject: [PATCH 189/653] Fix Modbus review comments (#33755) * update common test for modbus integration * remove log messages from modbus setup function. * Make global method local * Change parameter name to snake_case --- homeassistant/components/modbus/__init__.py | 4 ---- .../components/modbus/binary_sensor.py | 4 ++-- homeassistant/components/modbus/climate.py | 4 ++-- homeassistant/components/modbus/sensor.py | 4 ++-- homeassistant/components/modbus/switch.py | 4 ++-- tests/components/modbus/conftest.py | 22 +++++++------------ 6 files changed, 16 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 869d9f7ac67b..4bbcf185f289 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -97,7 +97,6 @@ async def async_setup(hass, config): """Set up Modbus component.""" hass.data[MODBUS_DOMAIN] = hub_collect = {} - _LOGGER.debug("registering hubs") for client_config in config[MODBUS_DOMAIN]: hub_collect[client_config[CONF_NAME]] = ModbusHub(client_config, hass.loop) @@ -109,7 +108,6 @@ async def async_setup(hass, config): def start_modbus(event): """Start Modbus service.""" for client in hub_collect.values(): - _LOGGER.debug("setup hub %s", client.name) client.setup() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) @@ -161,7 +159,6 @@ class ModbusHub: def __init__(self, client_config, main_loop): """Initialize the Modbus hub.""" - _LOGGER.debug("Preparing setup: %s", client_config) # generic configuration self._loop = main_loop @@ -200,7 +197,6 @@ class ModbusHub: # Client* do deliver loop, client as result but # pylint does not accept that fact - _LOGGER.debug("doing setup") if self._config_type == "serial": _, self._client = ClientSerial( schedulers.ASYNC_IO, diff --git a/homeassistant/components/modbus/binary_sensor.py b/homeassistant/components/modbus/binary_sensor.py index 51dfb7c57952..9989b9d530ac 100644 --- a/homeassistant/components/modbus/binary_sensor.py +++ b/homeassistant/components/modbus/binary_sensor.py @@ -54,7 +54,7 @@ PLATFORM_SCHEMA = vol.All( ) -async def async_setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Modbus binary sensors.""" sensors = [] for entry in config[CONF_INPUTS]: @@ -70,7 +70,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): ) ) - add_entities(sensors) + async_add_entities(sensors) class ModbusBinarySensor(BinarySensorDevice): diff --git a/homeassistant/components/modbus/climate.py b/homeassistant/components/modbus/climate.py index 182dfeef2de0..e5fbcf4d4217 100644 --- a/homeassistant/components/modbus/climate.py +++ b/homeassistant/components/modbus/climate.py @@ -72,7 +72,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -async def async_setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Modbus Thermostat Platform.""" name = config[CONF_NAME] modbus_slave = config[CONF_SLAVE] @@ -91,7 +91,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): hub_name = config[CONF_HUB] hub = hass.data[MODBUS_DOMAIN][hub_name] - add_entities( + async_add_entities( [ ModbusThermostat( hub, diff --git a/homeassistant/components/modbus/sensor.py b/homeassistant/components/modbus/sensor.py index 59abe2fd6d5d..be3bc4c52c6c 100644 --- a/homeassistant/components/modbus/sensor.py +++ b/homeassistant/components/modbus/sensor.py @@ -89,7 +89,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -async def async_setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Modbus sensors.""" sensors = [] data_types = {DATA_TYPE_INT: {1: "h", 2: "i", 4: "q"}} @@ -148,7 +148,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): if not sensors: return False - add_entities(sensors) + async_add_entities(sensors) class ModbusRegisterSensor(RestoreEntity): diff --git a/homeassistant/components/modbus/switch.py b/homeassistant/components/modbus/switch.py index d7d6f121874d..e4ec6a004fbc 100644 --- a/homeassistant/components/modbus/switch.py +++ b/homeassistant/components/modbus/switch.py @@ -76,7 +76,7 @@ PLATFORM_SCHEMA = vol.All( ) -async def async_setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Read configuration and create Modbus devices.""" switches = [] if CONF_COILS in config: @@ -109,7 +109,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): ) ) - add_entities(switches) + async_add_entities(switches) class ModbusCoilSwitch(ToggleEntity, RestoreEntity): diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py index 043236c503cd..d2fff820cdb0 100644 --- a/tests/components/modbus/conftest.py +++ b/tests/components/modbus/conftest.py @@ -32,9 +32,6 @@ def mock_hub(hass): return hub -common_register_config = {CONF_NAME: "test-config", CONF_REGISTER: 1234} - - class ReadResult: """Storage class for register read results.""" @@ -46,18 +43,16 @@ class ReadResult: read_result = None -async def simulate_read_registers(unit, address, count): - """Simulate modbus register read.""" - del unit, address, count # not used in simulation, but in real connection - global read_result - return read_result - - async def run_test( - hass, mock_hub, register_config, entity_domain, register_words, expected + hass, use_mock_hub, register_config, entity_domain, register_words, expected ): """Run test for given config and check that sensor outputs expected result.""" + async def simulate_read_registers(unit, address, count): + """Simulate modbus register read.""" + del unit, address, count # not used in simulation, but in real connection + return read_result + # Full sensor configuration sensor_name = "modbus_test_sensor" scan_interval = 5 @@ -72,12 +67,11 @@ async def run_test( } # Setup inputs for the sensor - global read_result read_result = ReadResult(register_words) if register_config.get(CONF_REGISTER_TYPE) == CALL_TYPE_REGISTER_INPUT: - mock_hub.read_input_registers = simulate_read_registers + use_mock_hub.read_input_registers = simulate_read_registers else: - mock_hub.read_holding_registers = simulate_read_registers + use_mock_hub.read_holding_registers = simulate_read_registers # Initialize sensor now = dt_util.utcnow() From 894aac1b45d23a5222edd1e60338eadebd985a87 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 7 Apr 2020 10:33:43 -0500 Subject: [PATCH 190/653] Update nexia for thermostats without zoning (#33770) * Bump nexia to 0.8.0 --- homeassistant/components/nexia/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index 80f66c51f997..e69ea352c8ea 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,7 +1,7 @@ { "domain": "nexia", "name": "Nexia", - "requirements": ["nexia==0.7.3"], + "requirements": ["nexia==0.8.0"], "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index 13f994e57527..68e65526130c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -921,7 +921,7 @@ netdisco==2.6.0 neurio==0.3.1 # homeassistant.components.nexia -nexia==0.7.3 +nexia==0.8.0 # homeassistant.components.nextcloud nextcloudmonitor==1.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0cbb2005dc9a..3a4a8cd717a7 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -356,7 +356,7 @@ nessclient==0.9.15 netdisco==2.6.0 # homeassistant.components.nexia -nexia==0.7.3 +nexia==0.8.0 # homeassistant.components.nsw_fuel_station nsw-fuel-api-client==1.0.10 From 325e5416effef7e765483a99c6cc37a92a16cf30 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:41:23 +0200 Subject: [PATCH 191/653] Remove global variable from zigbee (#33750) * Remove global variable from zigbee * Pass device instead of hass into the constructor --- homeassistant/components/zigbee/__init__.py | 98 +++++++------------ .../components/zigbee/binary_sensor.py | 7 +- homeassistant/components/zigbee/light.py | 5 +- homeassistant/components/zigbee/sensor.py | 26 +++-- homeassistant/components/zigbee/switch.py | 5 +- 5 files changed, 64 insertions(+), 77 deletions(-) diff --git a/homeassistant/components/zigbee/__init__.py b/homeassistant/components/zigbee/__init__.py index fd9b42398fea..2fa8291538e0 100644 --- a/homeassistant/components/zigbee/__init__.py +++ b/homeassistant/components/zigbee/__init__.py @@ -33,20 +33,8 @@ DEFAULT_DEVICE = "/dev/ttyUSB0" DEFAULT_BAUD = 9600 DEFAULT_ADC_MAX_VOLTS = 1.2 -# Copied from xbee_helper during setup() -GPIO_DIGITAL_OUTPUT_LOW = None -GPIO_DIGITAL_OUTPUT_HIGH = None -ADC_PERCENTAGE = None -DIGITAL_PINS = None -ANALOG_PINS = None -CONVERT_ADC = None -ZIGBEE_EXCEPTION = None -ZIGBEE_TX_FAILURE = None - ATTR_FRAME = "frame" -DEVICE = None - CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema( @@ -71,24 +59,6 @@ PLATFORM_SCHEMA = vol.Schema( def setup(hass, config): """Set up the connection to the Zigbee device.""" - global DEVICE # pylint: disable=global-statement - global GPIO_DIGITAL_OUTPUT_LOW # pylint: disable=global-statement - global GPIO_DIGITAL_OUTPUT_HIGH # pylint: disable=global-statement - global ADC_PERCENTAGE # pylint: disable=global-statement - global DIGITAL_PINS # pylint: disable=global-statement - global ANALOG_PINS # pylint: disable=global-statement - global CONVERT_ADC # pylint: disable=global-statement - global ZIGBEE_EXCEPTION # pylint: disable=global-statement - global ZIGBEE_TX_FAILURE # pylint: disable=global-statement - - GPIO_DIGITAL_OUTPUT_LOW = xb_const.GPIO_DIGITAL_OUTPUT_LOW - GPIO_DIGITAL_OUTPUT_HIGH = xb_const.GPIO_DIGITAL_OUTPUT_HIGH - ADC_PERCENTAGE = xb_const.ADC_PERCENTAGE - DIGITAL_PINS = xb_const.DIGITAL_PINS - ANALOG_PINS = xb_const.ANALOG_PINS - CONVERT_ADC = convert_adc - ZIGBEE_EXCEPTION = ZigBeeException - ZIGBEE_TX_FAILURE = ZigBeeTxFailure usb_device = config[DOMAIN].get(CONF_DEVICE, DEFAULT_DEVICE) baud = int(config[DOMAIN].get(CONF_BAUD, DEFAULT_BAUD)) @@ -97,8 +67,11 @@ def setup(hass, config): except SerialException as exc: _LOGGER.exception("Unable to open serial port for Zigbee: %s", exc) return False - DEVICE = ZigBee(ser) - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, close_serial_port) + zigbee_device = ZigBee(ser) + + def close_serial_port(*args): + """Close the serial port we're using to communicate with the Zigbee.""" + zigbee_device.zb.serial.close() def _frame_received(frame): """Run when a Zigbee frame is received. @@ -108,16 +81,13 @@ def setup(hass, config): """ dispatcher_send(hass, SIGNAL_ZIGBEE_FRAME_RECEIVED, frame) - DEVICE.add_frame_rx_handler(_frame_received) + hass.data[DOMAIN] = zigbee_device + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, close_serial_port) + zigbee_device.add_frame_rx_handler(_frame_received) return True -def close_serial_port(*args): - """Close the serial port we're using to communicate with the Zigbee.""" - DEVICE.zb.serial.close() - - def frame_is_relevant(entity, frame): """Test whether the frame is relevant to the entity.""" if frame.get("source_addr_long") != entity.config.address: @@ -229,13 +199,13 @@ class ZigBeeDigitalOutConfig(ZigBeePinConfig): """ if self._config.get("on_state", "").lower() == "low": bool2state = { - True: GPIO_DIGITAL_OUTPUT_LOW, - False: GPIO_DIGITAL_OUTPUT_HIGH, + True: xb_const.GPIO_DIGITAL_OUTPUT_LOW, + False: xb_const.GPIO_DIGITAL_OUTPUT_HIGH, } else: bool2state = { - True: GPIO_DIGITAL_OUTPUT_HIGH, - False: GPIO_DIGITAL_OUTPUT_LOW, + True: xb_const.GPIO_DIGITAL_OUTPUT_HIGH, + False: xb_const.GPIO_DIGITAL_OUTPUT_LOW, } state2bool = {v: k for k, v in bool2state.items()} return bool2state, state2bool @@ -269,9 +239,10 @@ class ZigBeeAnalogInConfig(ZigBeePinConfig): class ZigBeeDigitalIn(Entity): """Representation of a GPIO pin configured as a digital input.""" - def __init__(self, hass, config): + def __init__(self, config, device): """Initialize the device.""" self._config = config + self._device = device self._state = False async def async_added_to_hass(self): @@ -286,7 +257,7 @@ class ZigBeeDigitalIn(Entity): if not frame_is_relevant(self, frame): return sample = next(iter(frame["samples"])) - pin_name = DIGITAL_PINS[self._config.pin] + pin_name = xb_const.DIGITAL_PINS[self._config.pin] if pin_name not in sample: # Doesn't contain information about our pin return @@ -322,18 +293,18 @@ class ZigBeeDigitalIn(Entity): def update(self): """Ask the Zigbee device what state its input pin is in.""" try: - sample = DEVICE.get_sample(self._config.address) - except ZIGBEE_TX_FAILURE: + sample = self._device.get_sample(self._config.address) + except ZigBeeTxFailure: _LOGGER.warning( "Transmission failure when attempting to get sample from " "Zigbee device at address: %s", hexlify(self._config.address), ) return - except ZIGBEE_EXCEPTION as exc: + except ZigBeeException as exc: _LOGGER.exception("Unable to get sample from Zigbee device: %s", exc) return - pin_name = DIGITAL_PINS[self._config.pin] + pin_name = xb_const.DIGITAL_PINS[self._config.pin] if pin_name not in sample: _LOGGER.warning( "Pin %s (%s) was not in the sample provided by Zigbee device %s.", @@ -351,17 +322,17 @@ class ZigBeeDigitalOut(ZigBeeDigitalIn): def _set_state(self, state): """Initialize the Zigbee digital out device.""" try: - DEVICE.set_gpio_pin( + self._device.set_gpio_pin( self._config.pin, self._config.bool2state[state], self._config.address ) - except ZIGBEE_TX_FAILURE: + except ZigBeeTxFailure: _LOGGER.warning( "Transmission failure when attempting to set output pin on " "Zigbee device at address: %s", hexlify(self._config.address), ) return - except ZIGBEE_EXCEPTION as exc: + except ZigBeeException as exc: _LOGGER.exception("Unable to set digital pin on Zigbee device: %s", exc) return self._state = state @@ -379,15 +350,17 @@ class ZigBeeDigitalOut(ZigBeeDigitalIn): def update(self): """Ask the Zigbee device what its output is set to.""" try: - pin_state = DEVICE.get_gpio_pin(self._config.pin, self._config.address) - except ZIGBEE_TX_FAILURE: + pin_state = self._device.get_gpio_pin( + self._config.pin, self._config.address + ) + except ZigBeeTxFailure: _LOGGER.warning( "Transmission failure when attempting to get output pin status" " from Zigbee device at address: %s", hexlify(self._config.address), ) return - except ZIGBEE_EXCEPTION as exc: + except ZigBeeException as exc: _LOGGER.exception( "Unable to get output pin status from Zigbee device: %s", exc ) @@ -398,9 +371,10 @@ class ZigBeeDigitalOut(ZigBeeDigitalIn): class ZigBeeAnalogIn(Entity): """Representation of a GPIO pin configured as an analog input.""" - def __init__(self, hass, config): + def __init__(self, config, device): """Initialize the ZigBee analog in device.""" self._config = config + self._device = device self._value = None async def async_added_to_hass(self): @@ -415,12 +389,12 @@ class ZigBeeAnalogIn(Entity): if not frame_is_relevant(self, frame): return sample = frame["samples"].pop() - pin_name = ANALOG_PINS[self._config.pin] + pin_name = xb_const.ANALOG_PINS[self._config.pin] if pin_name not in sample: # Doesn't contain information about our pin return - self._value = CONVERT_ADC( - sample[pin_name], ADC_PERCENTAGE, self._config.max_voltage + self._value = convert_adc( + sample[pin_name], xb_const.ADC_PERCENTAGE, self._config.max_voltage ) self.schedule_update_ha_state() @@ -454,17 +428,17 @@ class ZigBeeAnalogIn(Entity): def update(self): """Get the latest reading from the ADC.""" try: - self._value = DEVICE.read_analog_pin( + self._value = self._device.read_analog_pin( self._config.pin, self._config.max_voltage, self._config.address, - ADC_PERCENTAGE, + xb_const.ADC_PERCENTAGE, ) - except ZIGBEE_TX_FAILURE: + except ZigBeeTxFailure: _LOGGER.warning( "Transmission failure when attempting to get sample from " "Zigbee device at address: %s", hexlify(self._config.address), ) - except ZIGBEE_EXCEPTION as exc: + except ZigBeeException as exc: _LOGGER.exception("Unable to get sample from Zigbee device: %s", exc) diff --git a/homeassistant/components/zigbee/binary_sensor.py b/homeassistant/components/zigbee/binary_sensor.py index 8b37107b906e..d32554e5744b 100644 --- a/homeassistant/components/zigbee/binary_sensor.py +++ b/homeassistant/components/zigbee/binary_sensor.py @@ -3,7 +3,7 @@ import voluptuous as vol from homeassistant.components.binary_sensor import BinarySensorDevice -from . import PLATFORM_SCHEMA, ZigBeeDigitalIn, ZigBeeDigitalInConfig +from . import DOMAIN, PLATFORM_SCHEMA, ZigBeeDigitalIn, ZigBeeDigitalInConfig CONF_ON_STATE = "on_state" @@ -15,7 +15,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Optional(CONF_ON_STATE): vol.In(ST def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Zigbee binary sensor platform.""" - add_entities([ZigBeeBinarySensor(hass, ZigBeeDigitalInConfig(config))], True) + zigbee_device = hass.data[DOMAIN] + add_entities( + [ZigBeeBinarySensor(ZigBeeDigitalInConfig(config), zigbee_device)], True + ) class ZigBeeBinarySensor(ZigBeeDigitalIn, BinarySensorDevice): diff --git a/homeassistant/components/zigbee/light.py b/homeassistant/components/zigbee/light.py index 86994a55446c..54f6044c3dd0 100644 --- a/homeassistant/components/zigbee/light.py +++ b/homeassistant/components/zigbee/light.py @@ -3,7 +3,7 @@ import voluptuous as vol from homeassistant.components.light import Light -from . import PLATFORM_SCHEMA, ZigBeeDigitalOut, ZigBeeDigitalOutConfig +from . import DOMAIN, PLATFORM_SCHEMA, ZigBeeDigitalOut, ZigBeeDigitalOutConfig CONF_ON_STATE = "on_state" @@ -17,7 +17,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Create and add an entity based on the configuration.""" - add_entities([ZigBeeLight(hass, ZigBeeDigitalOutConfig(config))]) + zigbee_device = hass.data[DOMAIN] + add_entities([ZigBeeLight(ZigBeeDigitalOutConfig(config), zigbee_device)]) class ZigBeeLight(ZigBeeDigitalOut, Light): diff --git a/homeassistant/components/zigbee/sensor.py b/homeassistant/components/zigbee/sensor.py index 648b3bd5a2f3..0c709a6d1a54 100644 --- a/homeassistant/components/zigbee/sensor.py +++ b/homeassistant/components/zigbee/sensor.py @@ -3,12 +3,18 @@ from binascii import hexlify import logging import voluptuous as vol +from xbee_helper.exceptions import ZigBeeException, ZigBeeTxFailure -from homeassistant.components import zigbee from homeassistant.const import TEMP_CELSIUS from homeassistant.helpers.entity import Entity -from . import PLATFORM_SCHEMA +from . import ( + DOMAIN, + PLATFORM_SCHEMA, + ZigBeeAnalogIn, + ZigBeeAnalogInConfig, + ZigBeeConfig, +) _LOGGER = logging.getLogger(__name__) @@ -32,6 +38,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): Uses the 'type' config value to work out which type of Zigbee sensor we're dealing with and instantiates the relevant classes to handle it. """ + zigbee_device = hass.data[DOMAIN] typ = config.get(CONF_TYPE) try: @@ -40,15 +47,16 @@ def setup_platform(hass, config, add_entities, discovery_info=None): _LOGGER.exception("Unknown Zigbee sensor type: %s", typ) return - add_entities([sensor_class(hass, config_class(config))], True) + add_entities([sensor_class(config_class(config), zigbee_device)], True) class ZigBeeTemperatureSensor(Entity): """Representation of XBee Pro temperature sensor.""" - def __init__(self, hass, config): + def __init__(self, config, device): """Initialize the sensor.""" self._config = config + self._device = device self._temp = None @property @@ -69,19 +77,19 @@ class ZigBeeTemperatureSensor(Entity): def update(self): """Get the latest data.""" try: - self._temp = zigbee.DEVICE.get_temperature(self._config.address) - except zigbee.ZIGBEE_TX_FAILURE: + self._temp = self._device.get_temperature(self._config.address) + except ZigBeeTxFailure: _LOGGER.warning( "Transmission failure when attempting to get sample from " "Zigbee device at address: %s", hexlify(self._config.address), ) - except zigbee.ZIGBEE_EXCEPTION as exc: + except ZigBeeException as exc: _LOGGER.exception("Unable to get sample from Zigbee device: %s", exc) # This must be below the classes to which it refers. TYPE_CLASSES = { - "temperature": (ZigBeeTemperatureSensor, zigbee.ZigBeeConfig), - "analog": (zigbee.ZigBeeAnalogIn, zigbee.ZigBeeAnalogInConfig), + "temperature": (ZigBeeTemperatureSensor, ZigBeeConfig), + "analog": (ZigBeeAnalogIn, ZigBeeAnalogInConfig), } diff --git a/homeassistant/components/zigbee/switch.py b/homeassistant/components/zigbee/switch.py index 71e419e410f1..e29d2c045df4 100644 --- a/homeassistant/components/zigbee/switch.py +++ b/homeassistant/components/zigbee/switch.py @@ -3,7 +3,7 @@ import voluptuous as vol from homeassistant.components.switch import SwitchDevice -from . import PLATFORM_SCHEMA, ZigBeeDigitalOut, ZigBeeDigitalOutConfig +from . import DOMAIN, PLATFORM_SCHEMA, ZigBeeDigitalOut, ZigBeeDigitalOutConfig CONF_ON_STATE = "on_state" @@ -16,7 +16,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Optional(CONF_ON_STATE): vol.In(ST def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Zigbee switch platform.""" - add_entities([ZigBeeSwitch(hass, ZigBeeDigitalOutConfig(config))]) + zigbee_device = hass.data[DOMAIN] + add_entities([ZigBeeSwitch(ZigBeeDigitalOutConfig(config), zigbee_device)]) class ZigBeeSwitch(ZigBeeDigitalOut, SwitchDevice): From a61224c578b7c56e935d7e9e70810c5ca8ed88ca Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 7 Apr 2020 18:01:01 +0200 Subject: [PATCH 192/653] Update Codecov.io configuration (#33783) --- codecov.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/codecov.yml b/codecov.yml index 964e2427fb19..7a9eea730d8f 100644 --- a/codecov.yml +++ b/codecov.yml @@ -6,14 +6,4 @@ coverage: default: target: 90 threshold: 0.09 - notify: - # Notify codecov room in Discord. The webhook URL (encrypted below) ends in /slack which is why we configure a Slack notification. - slack: - default: - url: "secret:TgWDUM4Jw0w7wMJxuxNF/yhSOHglIo1fGwInJnRLEVPy2P2aLimkoK1mtKCowH5TFw+baUXVXT3eAqefbdvIuM8BjRR4aRji95C6CYyD0QHy4N8i7nn1SQkWDPpS8IthYTg07rUDF7s5guurkKv2RrgoCdnnqjAMSzHoExMOF7xUmblMdhBTWJgBpWEhASJy85w/xxjlsE1xoTkzeJu9Q67pTXtRcn+5kb5/vIzPSYg=" -comment: - require_changes: true - layout: reach - branches: - - master - - !dev +comment: false From 5cfae3f1773fc27297bf104a956e35c9b994ae70 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 7 Apr 2020 18:13:02 +0200 Subject: [PATCH 193/653] Add emontnemery as codeowner for cast, mqtt (#33784) --- CODEOWNERS | 3 ++- homeassistant/components/cast/manifest.json | 2 +- homeassistant/components/mqtt/manifest.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 26b8e8b158ba..e8fadc9ed447 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -61,6 +61,7 @@ homeassistant/components/brother/* @bieniu homeassistant/components/brunt/* @eavanvalkenburg homeassistant/components/bt_smarthub/* @jxwolstenholme homeassistant/components/buienradar/* @mjj4791 @ties +homeassistant/components/cast/* @emontnemery homeassistant/components/cert_expiry/* @Cereal2nd @jjlawren homeassistant/components/cisco_ios/* @fbradyirl homeassistant/components/cisco_mobility_express/* @fbradyirl @@ -236,7 +237,7 @@ homeassistant/components/modbus/* @adamchengtkc @janiversen homeassistant/components/monoprice/* @etsinko homeassistant/components/moon/* @fabaff homeassistant/components/mpd/* @fabaff -homeassistant/components/mqtt/* @home-assistant/core +homeassistant/components/mqtt/* @home-assistant/core @emontnemery homeassistant/components/msteams/* @peroyvind homeassistant/components/myq/* @bdraco homeassistant/components/mysensors/* @MartinHjelmare diff --git a/homeassistant/components/cast/manifest.json b/homeassistant/components/cast/manifest.json index e88175076728..f054c7c8e42c 100644 --- a/homeassistant/components/cast/manifest.json +++ b/homeassistant/components/cast/manifest.json @@ -6,5 +6,5 @@ "requirements": ["pychromecast==4.2.0"], "after_dependencies": ["cloud"], "zeroconf": ["_googlecast._tcp.local."], - "codeowners": [] + "codeowners": ["@emontnemery"] } diff --git a/homeassistant/components/mqtt/manifest.json b/homeassistant/components/mqtt/manifest.json index c5063dc14a16..37070627477a 100644 --- a/homeassistant/components/mqtt/manifest.json +++ b/homeassistant/components/mqtt/manifest.json @@ -5,5 +5,5 @@ "documentation": "https://www.home-assistant.io/integrations/mqtt", "requirements": ["hbmqtt==0.9.5", "paho-mqtt==1.5.0"], "dependencies": ["http"], - "codeowners": ["@home-assistant/core"] + "codeowners": ["@home-assistant/core", "@emontnemery"] } From 2304a7697998e08eda34bf64a37cddac96257ff2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 7 Apr 2020 18:15:08 +0200 Subject: [PATCH 194/653] Bumped version to 0.109.0dev0 (#33782) --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 2f1cc75e4a55..b0176d1c004c 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -1,6 +1,6 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 -MINOR_VERSION = 108 +MINOR_VERSION = 109 PATCH_VERSION = "0.dev0" __short_version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__ = f"{__short_version__}.{PATCH_VERSION}" From 60eb488d0cdc8bc321c9fcd99a9520f38cc9504e Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 7 Apr 2020 18:22:03 +0200 Subject: [PATCH 195/653] Bump pyW215 to 0.7.0 (#33786) --- homeassistant/components/dlink/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/dlink/manifest.json b/homeassistant/components/dlink/manifest.json index be4094cca6a6..81a89c8e397e 100644 --- a/homeassistant/components/dlink/manifest.json +++ b/homeassistant/components/dlink/manifest.json @@ -2,6 +2,6 @@ "domain": "dlink", "name": "D-Link Wi-Fi Smart Plugs", "documentation": "https://www.home-assistant.io/integrations/dlink", - "requirements": ["pyW215==0.6.0"], + "requirements": ["pyW215==0.7.0"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 68e65526130c..0a01f7d69383 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1145,7 +1145,7 @@ pyRFXtrx==0.25 pyTibber==0.13.6 # homeassistant.components.dlink -pyW215==0.6.0 +pyW215==0.7.0 # homeassistant.components.w800rf32 pyW800rf32==0.1 From 1f7803c5418a59c4717fc67f245e4c0c876bc873 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Tue, 7 Apr 2020 11:32:43 -0500 Subject: [PATCH 196/653] Catch IPPParseError during config flow (#33769) * Update config_flow.py * Update strings.json * Update config_flow.py * squash. --- homeassistant/components/ipp/config_flow.py | 19 +++++++++-- homeassistant/components/ipp/manifest.json | 2 +- homeassistant/components/ipp/strings.json | 3 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/ipp/test_config_flow.py | 38 +++++++++++++++++++++ 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index e95267e78036..fe0808414ad8 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -2,7 +2,13 @@ import logging from typing import Any, Dict, Optional -from pyipp import IPP, IPPConnectionError, IPPConnectionUpgradeRequired +from pyipp import ( + IPP, + IPPConnectionError, + IPPConnectionUpgradeRequired, + IPPParseError, + IPPResponseError, +) import voluptuous as vol from homeassistant.config_entries import CONN_CLASS_LOCAL_POLL, ConfigFlow @@ -63,8 +69,12 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): info = await validate_input(self.hass, user_input) except IPPConnectionUpgradeRequired: return self._show_setup_form({"base": "connection_upgrade"}) - except IPPConnectionError: + except (IPPConnectionError, IPPResponseError): return self._show_setup_form({"base": "connection_error"}) + except IPPParseError: + _LOGGER.exception("IPP Parse Error") + return self.async_abort(reason="parse_error") + user_input[CONF_UUID] = info[CONF_UUID] await self.async_set_unique_id(user_input[CONF_UUID]) @@ -100,8 +110,11 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): info = await validate_input(self.hass, self.discovery_info) except IPPConnectionUpgradeRequired: return self.async_abort(reason="connection_upgrade") - except IPPConnectionError: + except (IPPConnectionError, IPPResponseError): return self.async_abort(reason="connection_error") + except IPPParseError: + _LOGGER.exception("IPP Parse Error") + return self.async_abort(reason="parse_error") self.discovery_info[CONF_UUID] = info[CONF_UUID] diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 268787043c51..9e491a548962 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.8.3"], + "requirements": ["pyipp==0.9.0"], "codeowners": ["@ctalkington"], "config_flow": true, "quality_scale": "platinum", diff --git a/homeassistant/components/ipp/strings.json b/homeassistant/components/ipp/strings.json index afd82d1f454b..a80a7f2e0ba6 100644 --- a/homeassistant/components/ipp/strings.json +++ b/homeassistant/components/ipp/strings.json @@ -26,7 +26,8 @@ "abort": { "already_configured": "This printer is already configured.", "connection_error": "Failed to connect to printer.", - "connection_upgrade": "Failed to connect to printer due to connection upgrade being required." + "connection_upgrade": "Failed to connect to printer due to connection upgrade being required.", + "parse_error": "Failed to parse response from printer." } } } diff --git a/requirements_all.txt b/requirements_all.txt index 0a01f7d69383..af84a372311b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1341,7 +1341,7 @@ pyintesishome==1.7.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.3 +pyipp==0.9.0 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3a4a8cd717a7..5bdb3034f93b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -524,7 +524,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.8.3 +pyipp==0.9.0 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/tests/components/ipp/test_config_flow.py b/tests/components/ipp/test_config_flow.py index 0682929b7b86..7e16a9fc6e09 100644 --- a/tests/components/ipp/test_config_flow.py +++ b/tests/components/ipp/test_config_flow.py @@ -134,6 +134,44 @@ async def test_zeroconf_connection_upgrade_required( assert result["reason"] == "connection_upgrade" +async def test_user_parse_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort user flow on IPP parse error.""" + aioclient_mock.post( + "http://192.168.1.31:631/ipp/print", + content="BAD", + headers={"Content-Type": "application/ipp"}, + ) + + user_input = MOCK_USER_INPUT.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=user_input, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "parse_error" + + +async def test_zeroconf_parse_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort zeroconf flow on IPP parse error.""" + aioclient_mock.post( + "http://192.168.1.31:631/ipp/print", + content="BAD", + headers={"Content-Type": "application/ipp"}, + ) + + discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "parse_error" + + async def test_user_device_exists_abort( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: From 60bc517d011d26b43f121243a3de9a2683762f76 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 7 Apr 2020 18:33:23 +0200 Subject: [PATCH 197/653] Collection of core tests improvements (#33757) * Collection of core tests improvements * Added some more * Fix aiohttp client response release --- tests/helpers/test_aiohttp_client.py | 175 +++++++++--------------- tests/helpers/test_dispatcher.py | 192 +++++++++++++-------------- tests/helpers/test_entity.py | 80 +++++------ tests/helpers/test_event.py | 40 +++--- tests/helpers/test_service.py | 12 +- tests/helpers/test_state.py | 8 +- tests/test_bootstrap.py | 6 +- tests/test_config.py | 6 +- tests/test_config_entries.py | 74 ++++++++--- tests/test_setup.py | 21 +-- tests/test_util/aiohttp.py | 19 +-- tests/util/test_logging.py | 12 +- 12 files changed, 302 insertions(+), 343 deletions(-) diff --git a/tests/helpers/test_aiohttp_client.py b/tests/helpers/test_aiohttp_client.py index de7057ae9c7a..aabc71ca9d84 100644 --- a/tests/helpers/test_aiohttp_client.py +++ b/tests/helpers/test_aiohttp_client.py @@ -1,6 +1,5 @@ """Test the aiohttp client helper.""" import asyncio -import unittest import aiohttp import pytest @@ -8,9 +7,6 @@ import pytest from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE import homeassistant.helpers.aiohttp_client as client from homeassistant.setup import async_setup_component -from homeassistant.util.async_ import run_callback_threadsafe - -from tests.common import get_test_home_assistant @pytest.fixture @@ -33,130 +29,91 @@ def camera_client(hass, hass_client): yield hass.loop.run_until_complete(hass_client()) -class TestHelpersAiohttpClient(unittest.TestCase): - """Test homeassistant.helpers.aiohttp_client module.""" +async def test_get_clientsession_with_ssl(hass): + """Test init clientsession with ssl.""" + client.async_get_clientsession(hass) - def setup_method(self, method): - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - - def teardown_method(self, method): - """Stop everything that was started.""" - self.hass.stop() - - def test_get_clientsession_with_ssl(self): - """Test init clientsession with ssl.""" - run_callback_threadsafe( - self.hass.loop, client.async_get_clientsession, self.hass - ).result() - - assert isinstance( - self.hass.data[client.DATA_CLIENTSESSION], aiohttp.ClientSession - ) - assert isinstance(self.hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) - - def test_get_clientsession_without_ssl(self): - """Test init clientsession without ssl.""" - run_callback_threadsafe( - self.hass.loop, client.async_get_clientsession, self.hass, False - ).result() - - assert isinstance( - self.hass.data[client.DATA_CLIENTSESSION_NOTVERIFY], aiohttp.ClientSession - ) - assert isinstance( - self.hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector - ) - - def test_create_clientsession_with_ssl_and_cookies(self): - """Test create clientsession with ssl.""" - - def _async_helper(): - return client.async_create_clientsession(self.hass, cookies={"bla": True}) - - session = run_callback_threadsafe(self.hass.loop, _async_helper).result() - - assert isinstance(session, aiohttp.ClientSession) - assert isinstance(self.hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) - - def test_create_clientsession_without_ssl_and_cookies(self): - """Test create clientsession without ssl.""" - - def _async_helper(): - return client.async_create_clientsession( - self.hass, False, cookies={"bla": True} - ) - - session = run_callback_threadsafe(self.hass.loop, _async_helper).result() - - assert isinstance(session, aiohttp.ClientSession) - assert isinstance( - self.hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector - ) - - def test_get_clientsession_cleanup(self): - """Test init clientsession with ssl.""" - run_callback_threadsafe( - self.hass.loop, client.async_get_clientsession, self.hass - ).result() - - assert isinstance( - self.hass.data[client.DATA_CLIENTSESSION], aiohttp.ClientSession - ) - assert isinstance(self.hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) - - self.hass.bus.fire(EVENT_HOMEASSISTANT_CLOSE) - self.hass.block_till_done() - - assert self.hass.data[client.DATA_CLIENTSESSION].closed - assert self.hass.data[client.DATA_CONNECTOR].closed - - def test_get_clientsession_cleanup_without_ssl(self): - """Test init clientsession with ssl.""" - run_callback_threadsafe( - self.hass.loop, client.async_get_clientsession, self.hass, False - ).result() - - assert isinstance( - self.hass.data[client.DATA_CLIENTSESSION_NOTVERIFY], aiohttp.ClientSession - ) - assert isinstance( - self.hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector - ) - - self.hass.bus.fire(EVENT_HOMEASSISTANT_CLOSE) - self.hass.block_till_done() - - assert self.hass.data[client.DATA_CLIENTSESSION_NOTVERIFY].closed - assert self.hass.data[client.DATA_CONNECTOR_NOTVERIFY].closed + assert isinstance(hass.data[client.DATA_CLIENTSESSION], aiohttp.ClientSession) + assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) -@asyncio.coroutine -def test_async_aiohttp_proxy_stream(aioclient_mock, camera_client): +async def test_get_clientsession_without_ssl(hass): + """Test init clientsession without ssl.""" + client.async_get_clientsession(hass, verify_ssl=False) + + assert isinstance( + hass.data[client.DATA_CLIENTSESSION_NOTVERIFY], aiohttp.ClientSession + ) + assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector) + + +async def test_create_clientsession_with_ssl_and_cookies(hass): + """Test create clientsession with ssl.""" + session = client.async_create_clientsession(hass, cookies={"bla": True}) + assert isinstance(session, aiohttp.ClientSession) + assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) + + +async def test_create_clientsession_without_ssl_and_cookies(hass): + """Test create clientsession without ssl.""" + session = client.async_create_clientsession(hass, False, cookies={"bla": True}) + assert isinstance(session, aiohttp.ClientSession) + assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector) + + +async def test_get_clientsession_cleanup(hass): + """Test init clientsession with ssl.""" + client.async_get_clientsession(hass) + + assert isinstance(hass.data[client.DATA_CLIENTSESSION], aiohttp.ClientSession) + assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) + + hass.bus.async_fire(EVENT_HOMEASSISTANT_CLOSE) + await hass.async_block_till_done() + + assert hass.data[client.DATA_CLIENTSESSION].closed + assert hass.data[client.DATA_CONNECTOR].closed + + +async def test_get_clientsession_cleanup_without_ssl(hass): + """Test init clientsession with ssl.""" + client.async_get_clientsession(hass, verify_ssl=False) + + assert isinstance( + hass.data[client.DATA_CLIENTSESSION_NOTVERIFY], aiohttp.ClientSession + ) + assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector) + + hass.bus.async_fire(EVENT_HOMEASSISTANT_CLOSE) + await hass.async_block_till_done() + + assert hass.data[client.DATA_CLIENTSESSION_NOTVERIFY].closed + assert hass.data[client.DATA_CONNECTOR_NOTVERIFY].closed + + +async def test_async_aiohttp_proxy_stream(aioclient_mock, camera_client): """Test that it fetches the given url.""" aioclient_mock.get("http://example.com/mjpeg_stream", content=b"Frame1Frame2Frame3") - resp = yield from camera_client.get("/api/camera_proxy_stream/camera.config_test") + resp = await camera_client.get("/api/camera_proxy_stream/camera.config_test") assert resp.status == 200 assert aioclient_mock.call_count == 1 - body = yield from resp.text() + body = await resp.text() assert body == "Frame1Frame2Frame3" -@asyncio.coroutine -def test_async_aiohttp_proxy_stream_timeout(aioclient_mock, camera_client): +async def test_async_aiohttp_proxy_stream_timeout(aioclient_mock, camera_client): """Test that it fetches the given url.""" aioclient_mock.get("http://example.com/mjpeg_stream", exc=asyncio.TimeoutError()) - resp = yield from camera_client.get("/api/camera_proxy_stream/camera.config_test") + resp = await camera_client.get("/api/camera_proxy_stream/camera.config_test") assert resp.status == 504 -@asyncio.coroutine -def test_async_aiohttp_proxy_stream_client_err(aioclient_mock, camera_client): +async def test_async_aiohttp_proxy_stream_client_err(aioclient_mock, camera_client): """Test that it fetches the given url.""" aioclient_mock.get("http://example.com/mjpeg_stream", exc=aiohttp.ClientError()) - resp = yield from camera_client.get("/api/camera_proxy_stream/camera.config_test") + resp = await camera_client.get("/api/camera_proxy_stream/camera.config_test") assert resp.status == 502 diff --git a/tests/helpers/test_dispatcher.py b/tests/helpers/test_dispatcher.py index 539d9ad16515..d2aa939043c6 100644 --- a/tests/helpers/test_dispatcher.py +++ b/tests/helpers/test_dispatcher.py @@ -1,143 +1,131 @@ """Test dispatcher helpers.""" -import asyncio from functools import partial from homeassistant.core import callback from homeassistant.helpers.dispatcher import ( async_dispatcher_connect, - dispatcher_connect, - dispatcher_send, + async_dispatcher_send, ) -from tests.common import get_test_home_assistant + +async def test_simple_function(hass): + """Test simple function (executor).""" + calls = [] + + def test_funct(data): + """Test function.""" + calls.append(data) + + async_dispatcher_connect(hass, "test", test_funct) + async_dispatcher_send(hass, "test", 3) + await hass.async_block_till_done() + + assert calls == [3] + + async_dispatcher_send(hass, "test", "bla") + await hass.async_block_till_done() + + assert calls == [3, "bla"] -class TestHelpersDispatcher: - """Tests for discovery helper methods.""" +async def test_simple_function_unsub(hass): + """Test simple function (executor) and unsub.""" + calls1 = [] + calls2 = [] - def setup_method(self, method): - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() + def test_funct1(data): + """Test function.""" + calls1.append(data) - def teardown_method(self, method): - """Stop everything that was started.""" - self.hass.stop() + def test_funct2(data): + """Test function.""" + calls2.append(data) - def test_simple_function(self): - """Test simple function (executor).""" - calls = [] + async_dispatcher_connect(hass, "test1", test_funct1) + unsub = async_dispatcher_connect(hass, "test2", test_funct2) + async_dispatcher_send(hass, "test1", 3) + async_dispatcher_send(hass, "test2", 4) + await hass.async_block_till_done() - def test_funct(data): - """Test function.""" - calls.append(data) + assert calls1 == [3] + assert calls2 == [4] - dispatcher_connect(self.hass, "test", test_funct) - dispatcher_send(self.hass, "test", 3) - self.hass.block_till_done() + unsub() - assert calls == [3] + async_dispatcher_send(hass, "test1", 5) + async_dispatcher_send(hass, "test2", 6) + await hass.async_block_till_done() - dispatcher_send(self.hass, "test", "bla") - self.hass.block_till_done() + assert calls1 == [3, 5] + assert calls2 == [4] - assert calls == [3, "bla"] + # check don't kill the flow + unsub() - def test_simple_function_unsub(self): - """Test simple function (executor) and unsub.""" - calls1 = [] - calls2 = [] + async_dispatcher_send(hass, "test1", 7) + async_dispatcher_send(hass, "test2", 8) + await hass.async_block_till_done() - def test_funct1(data): - """Test function.""" - calls1.append(data) + assert calls1 == [3, 5, 7] + assert calls2 == [4] - def test_funct2(data): - """Test function.""" - calls2.append(data) - dispatcher_connect(self.hass, "test1", test_funct1) - unsub = dispatcher_connect(self.hass, "test2", test_funct2) - dispatcher_send(self.hass, "test1", 3) - dispatcher_send(self.hass, "test2", 4) - self.hass.block_till_done() +async def test_simple_callback(hass): + """Test simple callback (async).""" + calls = [] - assert calls1 == [3] - assert calls2 == [4] + @callback + def test_funct(data): + """Test function.""" + calls.append(data) - unsub() + async_dispatcher_connect(hass, "test", test_funct) + async_dispatcher_send(hass, "test", 3) + await hass.async_block_till_done() - dispatcher_send(self.hass, "test1", 5) - dispatcher_send(self.hass, "test2", 6) - self.hass.block_till_done() + assert calls == [3] - assert calls1 == [3, 5] - assert calls2 == [4] + async_dispatcher_send(hass, "test", "bla") + await hass.async_block_till_done() - # check don't kill the flow - unsub() + assert calls == [3, "bla"] - dispatcher_send(self.hass, "test1", 7) - dispatcher_send(self.hass, "test2", 8) - self.hass.block_till_done() - assert calls1 == [3, 5, 7] - assert calls2 == [4] +async def test_simple_coro(hass): + """Test simple coro (async).""" + calls = [] - def test_simple_callback(self): - """Test simple callback (async).""" - calls = [] + async def async_test_funct(data): + """Test function.""" + calls.append(data) - @callback - def test_funct(data): - """Test function.""" - calls.append(data) + async_dispatcher_connect(hass, "test", async_test_funct) + async_dispatcher_send(hass, "test", 3) + await hass.async_block_till_done() - dispatcher_connect(self.hass, "test", test_funct) - dispatcher_send(self.hass, "test", 3) - self.hass.block_till_done() + assert calls == [3] - assert calls == [3] + async_dispatcher_send(hass, "test", "bla") + await hass.async_block_till_done() - dispatcher_send(self.hass, "test", "bla") - self.hass.block_till_done() + assert calls == [3, "bla"] - assert calls == [3, "bla"] - def test_simple_coro(self): - """Test simple coro (async).""" - calls = [] +async def test_simple_function_multiargs(hass): + """Test simple function (executor).""" + calls = [] - @asyncio.coroutine - def test_funct(data): - """Test function.""" - calls.append(data) + def test_funct(data1, data2, data3): + """Test function.""" + calls.append(data1) + calls.append(data2) + calls.append(data3) - dispatcher_connect(self.hass, "test", test_funct) - dispatcher_send(self.hass, "test", 3) - self.hass.block_till_done() + async_dispatcher_connect(hass, "test", test_funct) + async_dispatcher_send(hass, "test", 3, 2, "bla") + await hass.async_block_till_done() - assert calls == [3] - - dispatcher_send(self.hass, "test", "bla") - self.hass.block_till_done() - - assert calls == [3, "bla"] - - def test_simple_function_multiargs(self): - """Test simple function (executor).""" - calls = [] - - def test_funct(data1, data2, data3): - """Test function.""" - calls.append(data1) - calls.append(data2) - calls.append(data3) - - dispatcher_connect(self.hass, "test", test_funct) - dispatcher_send(self.hass, "test", 3, 2, "bla") - self.hass.block_till_done() - - assert calls == [3, 2, "bla"] + assert calls == [3, 2, "bla"] async def test_callback_exception_gets_logged(hass, caplog): @@ -150,7 +138,7 @@ async def test_callback_exception_gets_logged(hass, caplog): # wrap in partial to test message logging. async_dispatcher_connect(hass, "test", partial(bad_handler)) - dispatcher_send(hass, "test", "bad") + async_dispatcher_send(hass, "test", "bad") await hass.async_block_till_done() await hass.async_block_till_done() diff --git a/tests/helpers/test_entity.py b/tests/helpers/test_entity.py index 6dc194c09d4c..dd734bb0dcb0 100644 --- a/tests/helpers/test_entity.py +++ b/tests/helpers/test_entity.py @@ -18,55 +18,57 @@ from tests.common import get_test_home_assistant, mock_registry def test_generate_entity_id_requires_hass_or_ids(): """Ensure we require at least hass or current ids.""" - fmt = "test.{}" with pytest.raises(ValueError): - entity.generate_entity_id(fmt, "hello world") + entity.generate_entity_id("test.{}", "hello world") def test_generate_entity_id_given_keys(): """Test generating an entity id given current ids.""" - fmt = "test.{}" assert ( entity.generate_entity_id( - fmt, "overwrite hidden true", current_ids=["test.overwrite_hidden_true"] + "test.{}", + "overwrite hidden true", + current_ids=["test.overwrite_hidden_true"], ) == "test.overwrite_hidden_true_2" ) assert ( entity.generate_entity_id( - fmt, "overwrite hidden true", current_ids=["test.another_entity"] + "test.{}", "overwrite hidden true", current_ids=["test.another_entity"] ) == "test.overwrite_hidden_true" ) -def test_async_update_support(hass): +async def test_async_update_support(hass): """Test async update getting called.""" sync_update = [] async_update = [] class AsyncEntity(entity.Entity): + """A test entity.""" + entity_id = "sensor.test" def update(self): + """Update entity.""" sync_update.append([1]) ent = AsyncEntity() ent.hass = hass - hass.loop.run_until_complete(ent.async_update_ha_state(True)) + await ent.async_update_ha_state(True) assert len(sync_update) == 1 assert len(async_update) == 0 - @asyncio.coroutine - def async_update_func(): + async def async_update_func(): """Async update.""" async_update.append(1) ent.async_update = async_update_func - hass.loop.run_until_complete(ent.async_update_ha_state(True)) + await ent.async_update_ha_state(True) assert len(sync_update) == 1 assert len(async_update) == 1 @@ -123,13 +125,11 @@ class TestHelpersEntity: assert state.attributes.get(ATTR_DEVICE_CLASS) == "test_class" -@asyncio.coroutine -def test_warn_slow_update(hass): +async def test_warn_slow_update(hass): """Warn we log when entity update takes a long time.""" update_call = False - @asyncio.coroutine - def async_update(): + async def async_update(): """Mock async update.""" nonlocal update_call update_call = True @@ -140,7 +140,7 @@ def test_warn_slow_update(hass): mock_entity.async_update = async_update with patch.object(hass.loop, "call_later", MagicMock()) as mock_call: - yield from mock_entity.async_update_ha_state(True) + await mock_entity.async_update_ha_state(True) assert mock_call.called assert len(mock_call.mock_calls) == 2 @@ -154,13 +154,11 @@ def test_warn_slow_update(hass): assert update_call -@asyncio.coroutine -def test_warn_slow_update_with_exception(hass): +async def test_warn_slow_update_with_exception(hass): """Warn we log when entity update takes a long time and trow exception.""" update_call = False - @asyncio.coroutine - def async_update(): + async def async_update(): """Mock async update.""" nonlocal update_call update_call = True @@ -172,7 +170,7 @@ def test_warn_slow_update_with_exception(hass): mock_entity.async_update = async_update with patch.object(hass.loop, "call_later", MagicMock()) as mock_call: - yield from mock_entity.async_update_ha_state(True) + await mock_entity.async_update_ha_state(True) assert mock_call.called assert len(mock_call.mock_calls) == 2 @@ -186,13 +184,11 @@ def test_warn_slow_update_with_exception(hass): assert update_call -@asyncio.coroutine -def test_warn_slow_device_update_disabled(hass): +async def test_warn_slow_device_update_disabled(hass): """Disable slow update warning with async_device_update.""" update_call = False - @asyncio.coroutine - def async_update(): + async def async_update(): """Mock async update.""" nonlocal update_call update_call = True @@ -203,19 +199,17 @@ def test_warn_slow_device_update_disabled(hass): mock_entity.async_update = async_update with patch.object(hass.loop, "call_later", MagicMock()) as mock_call: - yield from mock_entity.async_device_update(warning=False) + await mock_entity.async_device_update(warning=False) assert not mock_call.called assert update_call -@asyncio.coroutine -def test_async_schedule_update_ha_state(hass): +async def test_async_schedule_update_ha_state(hass): """Warn we log when entity update takes a long time and trow exception.""" update_call = False - @asyncio.coroutine - def async_update(): + async def async_update(): """Mock async update.""" nonlocal update_call update_call = True @@ -226,7 +220,7 @@ def test_async_schedule_update_ha_state(hass): mock_entity.async_update = async_update mock_entity.async_schedule_update_ha_state(True) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert update_call is True @@ -236,6 +230,8 @@ async def test_async_async_request_call_without_lock(hass): updates = [] class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id): """Initialize Async test entity.""" self.entity_id = entity_id @@ -271,6 +267,8 @@ async def test_async_async_request_call_with_lock(hass): test_semaphore = asyncio.Semaphore(1) class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id, lock): """Initialize Async test entity.""" self.entity_id = entity_id @@ -319,6 +317,8 @@ async def test_async_parallel_updates_with_zero(hass): test_lock = asyncio.Event() class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id, count): """Initialize Async test entity.""" self.entity_id = entity_id @@ -354,6 +354,8 @@ async def test_async_parallel_updates_with_zero_on_sync_update(hass): test_lock = threading.Event() class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id, count): """Initialize Async test entity.""" self.entity_id = entity_id @@ -393,6 +395,8 @@ async def test_async_parallel_updates_with_one(hass): test_semaphore = asyncio.Semaphore(1) class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id, count): """Initialize Async test entity.""" self.entity_id = entity_id @@ -467,6 +471,8 @@ async def test_async_parallel_updates_with_two(hass): test_semaphore = asyncio.Semaphore(2) class AsyncEntity(entity.Entity): + """Test entity.""" + def __init__(self, entity_id, count): """Initialize Async test entity.""" self.entity_id = entity_id @@ -474,11 +480,10 @@ async def test_async_parallel_updates_with_two(hass): self._count = count self.parallel_updates = test_semaphore - @asyncio.coroutine - def async_update(self): + async def async_update(self): """Test update.""" updates.append(self._count) - yield from test_lock.acquire() + await test_lock.acquire() ent_1 = AsyncEntity("sensor.test_1", 1) ent_2 = AsyncEntity("sensor.test_2", 2) @@ -529,15 +534,14 @@ async def test_async_parallel_updates_with_two(hass): test_lock.release() -@asyncio.coroutine -def test_async_remove_no_platform(hass): +async def test_async_remove_no_platform(hass): """Test async_remove method when no platform set.""" ent = entity.Entity() ent.hass = hass ent.entity_id = "test.test" - yield from ent.async_update_ha_state() + await ent.async_update_ha_state() assert len(hass.states.async_entity_ids()) == 1 - yield from ent.async_remove() + await ent.async_remove() assert len(hass.states.async_entity_ids()) == 0 @@ -686,6 +690,8 @@ async def test_warn_slow_write_state_custom_component(hass, caplog): """Check that we log a warning if reading properties takes too long.""" class CustomComponentEntity(entity.Entity): + """Custom component entity.""" + __module__ = "custom_components.bla.sensor" mock_entity = CustomComponentEntity() diff --git a/tests/helpers/test_event.py b/tests/helpers/test_event.py index 313710d03b7d..f6e375acf0b3 100644 --- a/tests/helpers/test_event.py +++ b/tests/helpers/test_event.py @@ -1,6 +1,5 @@ """Test event helpers.""" # pylint: disable=protected-access -import asyncio from datetime import datetime, timedelta from unittest.mock import patch @@ -104,8 +103,7 @@ async def test_track_state_change(hass): async_track_state_change(hass, "light.Bowl", wildcard_run_callback) - @asyncio.coroutine - def wildercard_run_callback(entity_id, old_state, new_state): + async def wildercard_run_callback(entity_id, old_state, new_state): wildercard_runs.append((old_state, new_state)) async_track_state_change(hass, MATCH_ALL, wildercard_run_callback) @@ -189,8 +187,7 @@ async def test_track_template(hass): async_track_template(hass, template_condition, wildcard_run_callback) - @asyncio.coroutine - def wildercard_run_callback(entity_id, old_state, new_state): + async def wildercard_run_callback(entity_id, old_state, new_state): wildercard_runs.append((old_state, new_state)) async_track_template( @@ -263,8 +260,7 @@ async def test_track_same_state_simple_trigger(hass): entity_ids="light.Bowl", ) - @asyncio.coroutine - def coroutine_run_callback(): + async def coroutine_run_callback(): coroutine_runs.append(1) async_track_same_state( @@ -738,27 +734,27 @@ async def test_periodic_task_duplicate_time(hass): async def test_periodic_task_entering_dst(hass): """Test periodic task behavior when entering dst.""" - tz = dt_util.get_time_zone("Europe/Vienna") - dt_util.set_default_time_zone(tz) + timezone = dt_util.get_time_zone("Europe/Vienna") + dt_util.set_default_time_zone(timezone) specific_runs = [] unsub = async_track_time_change( hass, lambda x: specific_runs.append(1), hour=2, minute=30, second=0 ) - _send_time_changed(hass, tz.localize(datetime(2018, 3, 25, 1, 50, 0))) + _send_time_changed(hass, timezone.localize(datetime(2018, 3, 25, 1, 50, 0))) await hass.async_block_till_done() assert len(specific_runs) == 0 - _send_time_changed(hass, tz.localize(datetime(2018, 3, 25, 3, 50, 0))) + _send_time_changed(hass, timezone.localize(datetime(2018, 3, 25, 3, 50, 0))) await hass.async_block_till_done() assert len(specific_runs) == 0 - _send_time_changed(hass, tz.localize(datetime(2018, 3, 26, 1, 50, 0))) + _send_time_changed(hass, timezone.localize(datetime(2018, 3, 26, 1, 50, 0))) await hass.async_block_till_done() assert len(specific_runs) == 0 - _send_time_changed(hass, tz.localize(datetime(2018, 3, 26, 2, 50, 0))) + _send_time_changed(hass, timezone.localize(datetime(2018, 3, 26, 2, 50, 0))) await hass.async_block_till_done() assert len(specific_runs) == 1 @@ -767,29 +763,35 @@ async def test_periodic_task_entering_dst(hass): async def test_periodic_task_leaving_dst(hass): """Test periodic task behavior when leaving dst.""" - tz = dt_util.get_time_zone("Europe/Vienna") - dt_util.set_default_time_zone(tz) + timezone = dt_util.get_time_zone("Europe/Vienna") + dt_util.set_default_time_zone(timezone) specific_runs = [] unsub = async_track_time_change( hass, lambda x: specific_runs.append(1), hour=2, minute=30, second=0 ) - _send_time_changed(hass, tz.localize(datetime(2018, 10, 28, 2, 5, 0), is_dst=False)) + _send_time_changed( + hass, timezone.localize(datetime(2018, 10, 28, 2, 5, 0), is_dst=False) + ) await hass.async_block_till_done() assert len(specific_runs) == 0 _send_time_changed( - hass, tz.localize(datetime(2018, 10, 28, 2, 55, 0), is_dst=False) + hass, timezone.localize(datetime(2018, 10, 28, 2, 55, 0), is_dst=False) ) await hass.async_block_till_done() assert len(specific_runs) == 1 - _send_time_changed(hass, tz.localize(datetime(2018, 10, 28, 2, 5, 0), is_dst=True)) + _send_time_changed( + hass, timezone.localize(datetime(2018, 10, 28, 2, 5, 0), is_dst=True) + ) await hass.async_block_till_done() assert len(specific_runs) == 1 - _send_time_changed(hass, tz.localize(datetime(2018, 10, 28, 2, 55, 0), is_dst=True)) + _send_time_changed( + hass, timezone.localize(datetime(2018, 10, 28, 2, 55, 0), is_dst=True) + ) await hass.async_block_till_done() assert len(specific_runs) == 2 diff --git a/tests/helpers/test_service.py b/tests/helpers/test_service.py index 0f575a7fc542..04d0ec64b836 100644 --- a/tests/helpers/test_service.py +++ b/tests/helpers/test_service.py @@ -1,5 +1,4 @@ """Test service helpers.""" -import asyncio from collections import OrderedDict from copy import deepcopy import unittest @@ -286,13 +285,12 @@ async def test_extract_entity_ids_from_area(hass, area_mock): ) -@asyncio.coroutine -def test_async_get_all_descriptions(hass): +async def test_async_get_all_descriptions(hass): """Test async_get_all_descriptions.""" group = hass.components.group group_config = {group.DOMAIN: {}} - yield from async_setup_component(hass, group.DOMAIN, group_config) - descriptions = yield from service.async_get_all_descriptions(hass) + await async_setup_component(hass, group.DOMAIN, group_config) + descriptions = await service.async_get_all_descriptions(hass) assert len(descriptions) == 1 @@ -301,8 +299,8 @@ def test_async_get_all_descriptions(hass): logger = hass.components.logger logger_config = {logger.DOMAIN: {}} - yield from async_setup_component(hass, logger.DOMAIN, logger_config) - descriptions = yield from service.async_get_all_descriptions(hass) + await async_setup_component(hass, logger.DOMAIN, logger_config) + descriptions = await service.async_get_all_descriptions(hass) assert len(descriptions) == 2 diff --git a/tests/helpers/test_state.py b/tests/helpers/test_state.py index 8a08c06054da..26043c370935 100644 --- a/tests/helpers/test_state.py +++ b/tests/helpers/test_state.py @@ -25,8 +25,7 @@ from homeassistant.util import dt as dt_util from tests.common import async_mock_service -@asyncio.coroutine -def test_async_track_states(hass): +async def test_async_track_states(hass): """Test AsyncTrackStates context manager.""" point1 = dt_util.utcnow() point2 = point1 + timedelta(seconds=5) @@ -50,8 +49,7 @@ def test_async_track_states(hass): assert [state2, state3] == sorted(states, key=lambda state: state.entity_id) -@asyncio.coroutine -def test_call_to_component(hass): +async def test_call_to_component(hass): """Test calls to components state reproduction functions.""" with patch( "homeassistant.components.media_player.reproduce_state.async_reproduce_states" @@ -69,7 +67,7 @@ def test_call_to_component(hass): state_climate = ha.State("climate.test", "bad") context = "dummy_context" - yield from state.async_reproduce_state( + await state.async_reproduce_state( hass, [state_media_player, state_climate], blocking=True, diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index 34704ddfb747..72f26ae33ad4 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -1,6 +1,5 @@ """Test the bootstrapping.""" # pylint: disable=protected-access -import asyncio import logging import os from unittest.mock import Mock @@ -29,11 +28,10 @@ _LOGGER = logging.getLogger(__name__) @patch("homeassistant.bootstrap.async_enable_logging", Mock()) -@asyncio.coroutine -def test_home_assistant_core_config_validation(hass): +async def test_home_assistant_core_config_validation(hass): """Test if we pass in wrong information for HA conf.""" # Extensive HA conf validation testing is done - result = yield from bootstrap.async_from_config_dict( + result = await bootstrap.async_from_config_dict( {"homeassistant": {"latitude": "some string"}}, hass ) assert result is None diff --git a/tests/test_config.py b/tests/test_config.py index d0d9148f2dd2..1d96b3d0625e 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,6 +1,5 @@ """Test config utils.""" # pylint: disable=protected-access -import asyncio from collections import OrderedDict import copy import os @@ -740,8 +739,7 @@ async def test_merge_duplicate_keys(merge_log_err, hass): assert len(config["input_select"]) == 1 -@asyncio.coroutine -def test_merge_customize(hass): +async def test_merge_customize(hass): """Test loading core config onto hass object.""" core_config = { "latitude": 60, @@ -755,7 +753,7 @@ def test_merge_customize(hass): "pkg1": {"homeassistant": {"customize": {"b.b": {"friendly_name": "BB"}}}} }, } - yield from config_util.async_process_ha_core_config(hass, core_config) + await config_util.async_process_ha_core_config(hass, core_config) assert hass.data[config_util.DATA_CUSTOMIZE].get("b.b") == {"friendly_name": "BB"} diff --git a/tests/test_config_entries.py b/tests/test_config_entries.py index 17494b6b1101..86eb3919f008 100644 --- a/tests/test_config_entries.py +++ b/tests/test_config_entries.py @@ -314,12 +314,10 @@ async def test_remove_entry_handles_callback_error(hass, manager): assert [item.entry_id for item in manager.async_entries()] == [] -@asyncio.coroutine -def test_remove_entry_raises(hass, manager): +async def test_remove_entry_raises(hass, manager): """Test if a component raises while removing entry.""" - @asyncio.coroutine - def mock_unload_entry(hass, entry): + async def mock_unload_entry(hass, entry): """Mock unload entry function.""" raise Exception("BROKEN") @@ -337,14 +335,13 @@ def test_remove_entry_raises(hass, manager): "test3", ] - result = yield from manager.async_remove("test2") + result = await manager.async_remove("test2") assert result == {"require_restart": True} assert [item.entry_id for item in manager.async_entries()] == ["test1", "test3"] -@asyncio.coroutine -def test_remove_entry_if_not_loaded(hass, manager): +async def test_remove_entry_if_not_loaded(hass, manager): """Test that we can remove an entry that is not loaded.""" mock_unload_entry = MagicMock(return_value=mock_coro(True)) @@ -360,7 +357,7 @@ def test_remove_entry_if_not_loaded(hass, manager): "test3", ] - result = yield from manager.async_remove("test2") + result = await manager.async_remove("test2") assert result == {"require_restart": False} assert [item.entry_id for item in manager.async_entries()] == ["test1", "test3"] @@ -368,8 +365,7 @@ def test_remove_entry_if_not_loaded(hass, manager): assert len(mock_unload_entry.mock_calls) == 0 -@asyncio.coroutine -def test_add_entry_calls_setup_entry(hass, manager): +async def test_add_entry_calls_setup_entry(hass, manager): """Test we call setup_config_entry.""" mock_setup_entry = MagicMock(return_value=mock_coro(True)) @@ -377,18 +373,19 @@ def test_add_entry_calls_setup_entry(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 - @asyncio.coroutine - def async_step_user(self, user_input=None): + async def async_step_user(self, user_input=None): + """Test user step.""" return self.async_create_entry(title="title", data={"token": "supersecret"}) with patch.dict(config_entries.HANDLERS, {"comp": TestFlow, "beer": 5}): - yield from manager.flow.async_init( + await manager.flow.async_init( "comp", context={"source": config_entries.SOURCE_USER} ) - yield from hass.async_block_till_done() + await hass.async_block_till_done() assert len(mock_setup_entry.mock_calls) == 1 p_hass, p_entry = mock_setup_entry.mock_calls[0][1] @@ -397,8 +394,7 @@ def test_add_entry_calls_setup_entry(hass, manager): assert p_entry.data == {"token": "supersecret"} -@asyncio.coroutine -def test_entries_gets_entries(manager): +async def test_entries_gets_entries(manager): """Test entries are filtered by domain.""" MockConfigEntry(domain="test").add_to_manager(manager) entry1 = MockConfigEntry(domain="test2") @@ -409,8 +405,7 @@ def test_entries_gets_entries(manager): assert manager.async_entries("test2") == [entry1, entry2] -@asyncio.coroutine -def test_domains_gets_uniques(manager): +async def test_domains_gets_uniques(manager): """Test we only return each domain once.""" MockConfigEntry(domain="test").add_to_manager(manager) MockConfigEntry(domain="test2").add_to_manager(manager) @@ -429,10 +424,13 @@ async def test_saving_and_loading(hass): mock_entity_platform(hass, "config_flow.test", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" + VERSION = 5 CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("unique") return self.async_create_entry(title="Test Title", data={"token": "abcd"}) @@ -442,11 +440,13 @@ async def test_saving_and_loading(hass): ) class Test2Flow(config_entries.ConfigFlow): + """Test flow.""" + VERSION = 3 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_PUSH - @asyncio.coroutine - def async_step_user(self, user_input=None): + async def async_step_user(self, user_input=None): + """Test user step.""" return self.async_create_entry( title="Test 2 Title", data={"username": "bla"} ) @@ -528,9 +528,12 @@ async def test_discovery_notification(hass): with patch.dict(config_entries.HANDLERS): class TestFlow(config_entries.ConfigFlow, domain="test"): + """Test flow.""" + VERSION = 5 async def async_step_discovery(self, user_input=None): + """Test discovery step.""" if user_input is not None: return self.async_create_entry( title="Test Title", data={"token": "abcd"} @@ -560,9 +563,12 @@ async def test_discovery_notification_not_created(hass): await async_setup_component(hass, "persistent_notification", {}) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" + VERSION = 5 async def async_step_discovery(self, user_input=None): + """Test discovery step.""" return self.async_abort(reason="test") with patch.dict(config_entries.HANDLERS, {"test": TestFlow}): @@ -685,11 +691,15 @@ async def test_entry_options(hass, manager): entry.add_to_manager(manager) class TestFlow: + """Test flow.""" + @staticmethod @callback def async_get_options_flow(config_entry): + """Test options flow.""" + class OptionsFlowHandler(data_entry_flow.FlowHandler): - pass + """Test options flow handler.""" return OptionsFlowHandler() @@ -703,7 +713,6 @@ async def test_entry_options(hass, manager): await manager.options.async_finish_flow(flow, {"data": {"second": True}}) assert entry.data == {"first": True} - assert entry.options == {"second": True} @@ -1014,10 +1023,12 @@ async def test_unqiue_id_persisted(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("mock-unique-id") return self.async_create_entry(title="mock-title", data={}) @@ -1058,10 +1069,12 @@ async def test_unique_id_existing_entry(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" existing_entry = await self.async_set_unique_id("mock-unique-id") assert existing_entry is not None @@ -1100,10 +1113,12 @@ async def test_unique_id_update_existing_entry(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("mock-unique-id") await self._abort_if_unique_id_configured(updates={"host": "1.1.1.1"}) @@ -1134,10 +1149,12 @@ async def test_unique_id_not_update_existing_entry(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("mock-unique-id") await self._abort_if_unique_id_configured(updates={"host": "0.0.0.0"}) @@ -1161,10 +1178,12 @@ async def test_unique_id_in_progress(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("mock-unique-id") return self.async_show_form(step_id="discovery") @@ -1193,10 +1212,12 @@ async def test_finish_flow_aborts_progress(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user step.""" await self.async_set_unique_id("mock-unique-id", raise_on_progress=False) if user_input is None: @@ -1228,10 +1249,12 @@ async def test_unique_id_ignore(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_user(self, user_input=None): + """Test user flow.""" await self.async_set_unique_id("mock-unique-id") return self.async_show_form(step_id="discovery") @@ -1268,10 +1291,12 @@ async def test_unignore_step_form(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_unignore(self, user_input): + """Test unignore step.""" unique_id = user_input["unique_id"] await self.async_set_unique_id(unique_id) return self.async_show_form(step_id="discovery") @@ -1310,10 +1335,12 @@ async def test_unignore_create_entry(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_unignore(self, user_input): + """Test unignore step.""" unique_id = user_input["unique_id"] await self.async_set_unique_id(unique_id) return self.async_create_entry(title="yo", data={}) @@ -1355,6 +1382,7 @@ async def test_unignore_default_impl(hass, manager): mock_entity_platform(hass, "config_flow.comp", None) class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 @@ -1395,10 +1423,12 @@ async def test_partial_flows_hidden(hass, manager): pause_discovery = asyncio.Event() class TestFlow(config_entries.ConfigFlow): + """Test flow.""" VERSION = 1 async def async_step_discovery(self, user_input): + """Test discovery step.""" discovery_started.set() await pause_discovery.wait() return self.async_show_form(step_id="someform") diff --git a/tests/test_setup.py b/tests/test_setup.py index f90a7269752f..daa9c6e84060 100644 --- a/tests/test_setup.py +++ b/tests/test_setup.py @@ -1,6 +1,5 @@ """Test component/platform setup.""" # pylint: disable=protected-access -import asyncio import logging import os import threading @@ -265,8 +264,7 @@ class TestSetup: """Test component setup while waiting for lock is not set up twice.""" result = [] - @asyncio.coroutine - def async_setup(hass, config): + async def async_setup(hass, config): """Tracking Setup.""" result.append(1) @@ -462,21 +460,17 @@ class TestSetup: assert call_order == [1, 1, 2] -@asyncio.coroutine -def test_component_cannot_depend_config(hass): +async def test_component_cannot_depend_config(hass): """Test config is not allowed to be a dependency.""" - result = yield from setup._async_process_dependencies( - hass, None, "test", ["config"] - ) + result = await setup._async_process_dependencies(hass, None, "test", ["config"]) assert not result -@asyncio.coroutine -def test_component_warn_slow_setup(hass): +async def test_component_warn_slow_setup(hass): """Warn we log when a component setup takes a long time.""" mock_integration(hass, MockModule("test_component1")) with mock.patch.object(hass.loop, "call_later", mock.MagicMock()) as mock_call: - result = yield from setup.async_setup_component(hass, "test_component1", {}) + result = await setup.async_setup_component(hass, "test_component1", {}) assert result assert mock_call.called assert len(mock_call.mock_calls) == 3 @@ -489,14 +483,13 @@ def test_component_warn_slow_setup(hass): assert mock_call().cancel.called -@asyncio.coroutine -def test_platform_no_warn_slow(hass): +async def test_platform_no_warn_slow(hass): """Do not warn for long entity setup time.""" mock_integration( hass, MockModule("test_component1", platform_schema=PLATFORM_SCHEMA) ) with mock.patch.object(hass.loop, "call_later", mock.MagicMock()) as mock_call: - result = yield from setup.async_setup_component(hass, "test_component1", {}) + result = await setup.async_setup_component(hass, "test_component1", {}) assert result assert not mock_call.called diff --git a/tests/test_util/aiohttp.py b/tests/test_util/aiohttp.py index e0e1ded32c33..e23ba5cb9f50 100644 --- a/tests/test_util/aiohttp.py +++ b/tests/test_util/aiohttp.py @@ -1,5 +1,4 @@ """Aiohttp test utils.""" -import asyncio from contextlib import contextmanager import json as _json import re @@ -13,7 +12,7 @@ from yarl import URL from homeassistant.const import EVENT_HOMEASSISTANT_CLOSE -retype = type(re.compile("")) +RETYPE = type(re.compile("")) def mock_stream(data): @@ -58,7 +57,7 @@ class AiohttpClientMocker: if content is None: content = b"" - if not isinstance(url, retype): + if not isinstance(url, RETYPE): url = URL(url) if params: url = url.with_query(params) @@ -173,7 +172,7 @@ class AiohttpClientMockResponse: return False # regular expression matching - if isinstance(self._url, retype): + if isinstance(self._url, RETYPE): return self._url.search(str(url)) is not None if ( @@ -220,25 +219,20 @@ class AiohttpClientMockResponse: """Return content.""" return mock_stream(self.response) - @asyncio.coroutine - def read(self): + async def read(self): """Return mock response.""" return self.response - @asyncio.coroutine - def text(self, encoding="utf-8"): + async def text(self, encoding="utf-8"): """Return mock response as a string.""" return self.response.decode(encoding) - @asyncio.coroutine - def json(self, encoding="utf-8"): + async def json(self, encoding="utf-8"): """Return mock response as a json.""" return _json.loads(self.response.decode(encoding)) - @asyncio.coroutine def release(self): """Mock release.""" - pass def raise_for_status(self): """Raise error if status is 400 or higher.""" @@ -253,7 +247,6 @@ class AiohttpClientMockResponse: def close(self): """Mock close.""" - pass @contextmanager diff --git a/tests/util/test_logging.py b/tests/util/test_logging.py index d5f8eb4a2c78..c2c9d4803f9e 100644 --- a/tests/util/test_logging.py +++ b/tests/util/test_logging.py @@ -19,8 +19,7 @@ def test_sensitive_data_filter(): assert sensitive_record.msg == "******* log" -@asyncio.coroutine -def test_async_handler_loop_log(loop): +async def test_async_handler_loop_log(loop): """Test logging data inside from inside the event loop.""" loop._thread_ident = threading.get_ident() @@ -39,13 +38,12 @@ def test_async_handler_loop_log(loop): log_record = logging.makeLogRecord({"msg": "Test Log Record"}) handler.emit(log_record) - yield from handler.async_close(True) + await handler.async_close(True) assert queue.get_nowait().msg == "Test Log Record" assert queue.empty() -@asyncio.coroutine -def test_async_handler_thread_log(loop): +async def test_async_handler_thread_log(loop): """Test logging data from a thread.""" loop._thread_ident = threading.get_ident() @@ -60,8 +58,8 @@ def test_async_handler_thread_log(loop): handler.emit(log_record) handler.close() - yield from loop.run_in_executor(None, add_log) - yield from handler.async_close(True) + await loop.run_in_executor(None, add_log) + await handler.async_close(True) assert queue.get_nowait().msg == "Test Log Record" assert queue.empty() From bee742994eafb560eedfaf43aa0e98a02b33e90a Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Tue, 7 Apr 2020 19:34:13 +0300 Subject: [PATCH 198/653] =?UTF-8?q?Fix=20uncaught=20exceptions=20for=20dis?= =?UTF-8?q?covery,=20unify=5Fdirect,=20spotify,=E2=80=A6=20(#33735)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * used coroutinemock to avoid exception * added spec to mock to remove exception * added the current_user return value so it doesnt throw exception * fix the mocks so properties do not need .return_value * fixed missing mock values that were causing exceptions * moved patch to asynctest so no need to define m_init * fixed black error --- tests/components/cast/test_media_player.py | 9 +++++++-- tests/components/discovery/test_init.py | 3 ++- tests/components/smartthings/test_init.py | 12 ++++++------ tests/components/spotify/test_config_flow.py | 3 ++- .../unifi_direct/test_device_tracker.py | 3 ++- tests/ignore_uncaught_exceptions.py | 19 +------------------ 6 files changed, 20 insertions(+), 29 deletions(-) diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index 93df75db8bab..2f21a1c0f31a 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -22,13 +22,18 @@ from tests.common import MockConfigEntry, mock_coro def cast_mock(): """Mock pychromecast.""" pycast_mock = MagicMock() + dial_mock = MagicMock(name="XXX") + dial_mock.get_device_status.return_value.uuid = "fake_uuid" + dial_mock.get_device_status.return_value.manufacturer = "fake_manufacturer" + dial_mock.get_device_status.return_value.model_name = "fake_model_name" + dial_mock.get_device_status.return_value.friendly_name = "fake_friendly_name" with patch( "homeassistant.components.cast.media_player.pychromecast", pycast_mock ), patch( "homeassistant.components.cast.discovery.pychromecast", pycast_mock ), patch( - "homeassistant.components.cast.helpers.dial", MagicMock() + "homeassistant.components.cast.helpers.dial", dial_mock ), patch( "homeassistant.components.cast.media_player.MultizoneManager", MagicMock() ): @@ -127,7 +132,7 @@ async def test_start_discovery_called_once(hass): """Test pychromecast.start_discovery called exactly once.""" with patch( "homeassistant.components.cast.discovery.pychromecast.start_discovery", - return_value=(None, None), + return_value=(None, Mock()), ) as start_discovery: await async_setup_cast(hass) diff --git a/tests/components/discovery/test_init.py b/tests/components/discovery/test_init.py index 1d11bba9e16e..86865209de30 100644 --- a/tests/components/discovery/test_init.py +++ b/tests/components/discovery/test_init.py @@ -1,6 +1,7 @@ """The tests for the discovery component.""" -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock +from asynctest import patch import pytest from homeassistant import config_entries diff --git a/tests/components/smartthings/test_init.py b/tests/components/smartthings/test_init.py index ae80316676a2..05ea832a81e4 100644 --- a/tests/components/smartthings/test_init.py +++ b/tests/components/smartthings/test_init.py @@ -157,8 +157,8 @@ async def test_scenes_unauthorized_loads_platforms( request_info=request_info, history=None, status=403 ) mock_token = Mock() - mock_token.access_token.return_value = str(uuid4()) - mock_token.refresh_token.return_value = str(uuid4()) + mock_token.access_token = str(uuid4()) + mock_token.refresh_token = str(uuid4()) smartthings_mock.generate_tokens.return_value = mock_token subscriptions = [ subscription_factory(capability) for capability in device.capabilities @@ -189,8 +189,8 @@ async def test_config_entry_loads_platforms( smartthings_mock.devices.return_value = [device] smartthings_mock.scenes.return_value = [scene] mock_token = Mock() - mock_token.access_token.return_value = str(uuid4()) - mock_token.refresh_token.return_value = str(uuid4()) + mock_token.access_token = str(uuid4()) + mock_token.refresh_token = str(uuid4()) smartthings_mock.generate_tokens.return_value = mock_token subscriptions = [ subscription_factory(capability) for capability in device.capabilities @@ -223,8 +223,8 @@ async def test_config_entry_loads_unconnected_cloud( smartthings_mock.devices.return_value = [device] smartthings_mock.scenes.return_value = [scene] mock_token = Mock() - mock_token.access_token.return_value = str(uuid4()) - mock_token.refresh_token.return_value = str(uuid4()) + mock_token.access_token = str(uuid4()) + mock_token.refresh_token = str(uuid4()) smartthings_mock.generate_tokens.return_value = mock_token subscriptions = [ subscription_factory(capability) for capability in device.capabilities diff --git a/tests/components/spotify/test_config_flow.py b/tests/components/spotify/test_config_flow.py index eabaa57d3a8d..3644ca462cad 100644 --- a/tests/components/spotify/test_config_flow.py +++ b/tests/components/spotify/test_config_flow.py @@ -86,7 +86,8 @@ async def test_full_flow(hass, aiohttp_client, aioclient_mock): }, ) - with patch("homeassistant.components.spotify.config_flow.Spotify"): + with patch("homeassistant.components.spotify.config_flow.Spotify") as spotify_mock: + spotify_mock.return_value.current_user.return_value = {"id": "fake_id"} result = await hass.config_entries.flow.async_configure(result["flow_id"]) assert result["data"]["auth_implementation"] == DOMAIN diff --git a/tests/components/unifi_direct/test_device_tracker.py b/tests/components/unifi_direct/test_device_tracker.py index 297bf917dbff..692231d4cad3 100644 --- a/tests/components/unifi_direct/test_device_tracker.py +++ b/tests/components/unifi_direct/test_device_tracker.py @@ -16,6 +16,7 @@ from homeassistant.components.unifi_direct.device_tracker import ( CONF_PORT, DOMAIN, PLATFORM_SCHEMA, + UnifiDeviceScanner, _response_to_json, get_scanner, ) @@ -37,7 +38,7 @@ def setup_comp(hass): os.remove(yaml_devices) -@patch(scanner_path, return_value=mock.MagicMock()) +@patch(scanner_path, return_value=mock.MagicMock(spec=UnifiDeviceScanner)) async def test_get_scanner(unifi_mock, hass): """Test creating an Unifi direct scanner with a password.""" conf_dict = { diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index f4720db25eef..ee256acbbc64 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -1,11 +1,6 @@ """List of modules that have uncaught exceptions today. Will be shrunk over time.""" IGNORE_UNCAUGHT_EXCEPTIONS = [ - ("tests.components.cast.test_media_player", "test_start_discovery_called_once"), - ("tests.components.cast.test_media_player", "test_entry_setup_single_config"), - ("tests.components.cast.test_media_player", "test_entry_setup_list_config"), - ("tests.components.cast.test_media_player", "test_entry_setup_platform_not_ready"), ("tests.components.demo.test_init", "test_setting_up_demo"), - ("tests.components.discovery.test_init", "test_discover_config_flow"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_attributes"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_update_state"), ( @@ -42,18 +37,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), ("tests.components.qwikswitch.test_init", "test_sensor_device"), ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), - ("tests.components.unifi_direct.test_device_tracker", "test_get_scanner"), ] -IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [ - ("tests.components.spotify.test_config_flow", "test_full_flow"), - ("tests.components.smartthings.test_init", "test_config_entry_loads_platforms"), - ( - "tests.components.smartthings.test_init", - "test_scenes_unauthorized_loads_platforms", - ), - ( - "tests.components.smartthings.test_init", - "test_config_entry_loads_unconnected_cloud", - ), -] +IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [] From bb8bbc9c545184835e393871d500a231f80be7bf Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 7 Apr 2020 18:36:35 +0200 Subject: [PATCH 199/653] Collection of tests improvements (#33778) --- tests/components/demo/test_media_player.py | 430 ++++++++++---------- tests/components/media_player/common.py | 147 +++++-- tests/components/shell_command/test_init.py | 12 +- tests/components/version/test_sensor.py | 39 +- 4 files changed, 342 insertions(+), 286 deletions(-) diff --git a/tests/components/demo/test_media_player.py b/tests/components/demo/test_media_player.py index a70e7ea4b5d7..26d0d2165e7e 100644 --- a/tests/components/demo/test_media_player.py +++ b/tests/components/demo/test_media_player.py @@ -1,233 +1,207 @@ """The tests for the Demo Media player platform.""" -import asyncio -import unittest -from unittest.mock import patch - +from asynctest import patch import pytest import voluptuous as vol import homeassistant.components.media_player as mp from homeassistant.helpers.aiohttp_client import DATA_CLIENTSESSION -from homeassistant.setup import async_setup_component, setup_component +from homeassistant.setup import async_setup_component -from tests.common import get_test_home_assistant from tests.components.media_player import common -entity_id = "media_player.walkman" +TEST_ENTITY_ID = "media_player.walkman" -class TestDemoMediaPlayer(unittest.TestCase): - """Test the media_player module.""" - - def setUp(self): # pylint: disable=invalid-name - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() - - def tearDown(self): - """Shut down test instance.""" - self.hass.stop() - - def test_source_select(self): - """Test the input source service.""" - entity_id = "media_player.lounge_room" - - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - state = self.hass.states.get(entity_id) - assert "dvd" == state.attributes.get("source") - - with pytest.raises(vol.Invalid): - common.select_source(self.hass, None, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert "dvd" == state.attributes.get("source") - - common.select_source(self.hass, "xbox", entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert "xbox" == state.attributes.get("source") - - def test_clear_playlist(self): - """Test clear playlist.""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - assert self.hass.states.is_state(entity_id, "playing") - - common.clear_playlist(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "off") - - def test_volume_services(self): - """Test the volume service.""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - state = self.hass.states.get(entity_id) - assert 1.0 == state.attributes.get("volume_level") - - with pytest.raises(vol.Invalid): - common.set_volume_level(self.hass, None, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 1.0 == state.attributes.get("volume_level") - - common.set_volume_level(self.hass, 0.5, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 0.5 == state.attributes.get("volume_level") - - common.volume_down(self.hass, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 0.4 == state.attributes.get("volume_level") - - common.volume_up(self.hass, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 0.5 == state.attributes.get("volume_level") - - assert False is state.attributes.get("is_volume_muted") - - with pytest.raises(vol.Invalid): - common.mute_volume(self.hass, None, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert False is state.attributes.get("is_volume_muted") - - common.mute_volume(self.hass, True, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert True is state.attributes.get("is_volume_muted") - - def test_turning_off_and_on(self): - """Test turn_on and turn_off.""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - assert self.hass.states.is_state(entity_id, "playing") - - common.turn_off(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "off") - assert not mp.is_on(self.hass, entity_id) - - common.turn_on(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "playing") - - common.toggle(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "off") - assert not mp.is_on(self.hass, entity_id) - - def test_playing_pausing(self): - """Test media_pause.""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - assert self.hass.states.is_state(entity_id, "playing") - - common.media_pause(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "paused") - - common.media_play_pause(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "playing") - - common.media_play_pause(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "paused") - - common.media_play(self.hass, entity_id) - self.hass.block_till_done() - assert self.hass.states.is_state(entity_id, "playing") - - def test_prev_next_track(self): - """Test media_next_track and media_previous_track .""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - state = self.hass.states.get(entity_id) - assert 1 == state.attributes.get("media_track") - - common.media_next_track(self.hass, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 2 == state.attributes.get("media_track") - - common.media_next_track(self.hass, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 3 == state.attributes.get("media_track") - - common.media_previous_track(self.hass, entity_id) - self.hass.block_till_done() - state = self.hass.states.get(entity_id) - assert 2 == state.attributes.get("media_track") - - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - ent_id = "media_player.lounge_room" - state = self.hass.states.get(ent_id) - assert 1 == state.attributes.get("media_episode") - - common.media_next_track(self.hass, ent_id) - self.hass.block_till_done() - state = self.hass.states.get(ent_id) - assert 2 == state.attributes.get("media_episode") - - common.media_previous_track(self.hass, ent_id) - self.hass.block_till_done() - state = self.hass.states.get(ent_id) - assert 1 == state.attributes.get("media_episode") - - def test_play_media(self): - """Test play_media .""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - ent_id = "media_player.living_room" - state = self.hass.states.get(ent_id) - assert 0 < (mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features")) - assert state.attributes.get("media_content_id") is not None - - with pytest.raises(vol.Invalid): - common.play_media(self.hass, None, "some_id", ent_id) - self.hass.block_till_done() - state = self.hass.states.get(ent_id) - assert 0 < (mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features")) - assert not "some_id" == state.attributes.get("media_content_id") - - common.play_media(self.hass, "youtube", "some_id", ent_id) - self.hass.block_till_done() - state = self.hass.states.get(ent_id) - assert 0 < (mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features")) - assert "some_id" == state.attributes.get("media_content_id") - - @patch( +@pytest.fixture(name="mock_media_seek") +def media_player_media_seek_fixture(): + """Mock demo YouTube player media seek.""" + with patch( "homeassistant.components.demo.media_player.DemoYoutubePlayer.media_seek", autospec=True, + ) as seek: + yield seek + + +async def test_source_select(hass): + """Test the input source service.""" + entity_id = "media_player.lounge_room" + + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} ) - def test_seek(self, mock_seek): - """Test seek.""" - assert setup_component( - self.hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} - ) - ent_id = "media_player.living_room" - state = self.hass.states.get(ent_id) - assert state.attributes["supported_features"] & mp.SUPPORT_SEEK - assert not mock_seek.called - with pytest.raises(vol.Invalid): - common.media_seek(self.hass, None, ent_id) - self.hass.block_till_done() - assert not mock_seek.called - common.media_seek(self.hass, 100, ent_id) - self.hass.block_till_done() - assert mock_seek.called + state = hass.states.get(entity_id) + assert state.attributes.get("source") == "dvd" + + with pytest.raises(vol.Invalid): + await common.async_select_source(hass, None, entity_id) + state = hass.states.get(entity_id) + assert state.attributes.get("source") == "dvd" + + await common.async_select_source(hass, "xbox", entity_id) + state = hass.states.get(entity_id) + assert state.attributes.get("source") == "xbox" + + +async def test_clear_playlist(hass): + """Test clear playlist.""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + await common.async_clear_playlist(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "off") + + +async def test_volume_services(hass): + """Test the volume service.""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("volume_level") == 1.0 + + with pytest.raises(vol.Invalid): + await common.async_set_volume_level(hass, None, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("volume_level") == 1.0 + + await common.async_set_volume_level(hass, 0.5, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("volume_level") == 0.5 + + await common.async_volume_down(hass, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("volume_level") == 0.4 + + await common.async_volume_up(hass, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("volume_level") == 0.5 + + assert False is state.attributes.get("is_volume_muted") + + with pytest.raises(vol.Invalid): + await common.async_mute_volume(hass, None, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("is_volume_muted") is False + + await common.async_mute_volume(hass, True, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("is_volume_muted") is True + + +async def test_turning_off_and_on(hass): + """Test turn_on and turn_off.""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + await common.async_turn_off(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "off") + assert not mp.is_on(hass, TEST_ENTITY_ID) + + await common.async_turn_on(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + await common.async_toggle(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "off") + assert not mp.is_on(hass, TEST_ENTITY_ID) + + +async def test_playing_pausing(hass): + """Test media_pause.""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + await common.async_media_pause(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "paused") + + await common.async_media_play_pause(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + await common.async_media_play_pause(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "paused") + + await common.async_media_play(hass, TEST_ENTITY_ID) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + + +async def test_prev_next_track(hass): + """Test media_next_track and media_previous_track .""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("media_track") == 1 + + await common.async_media_next_track(hass, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("media_track") == 2 + + await common.async_media_next_track(hass, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("media_track") == 3 + + await common.async_media_previous_track(hass, TEST_ENTITY_ID) + state = hass.states.get(TEST_ENTITY_ID) + assert state.attributes.get("media_track") == 2 + + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + ent_id = "media_player.lounge_room" + state = hass.states.get(ent_id) + assert state.attributes.get("media_episode") == 1 + + await common.async_media_next_track(hass, ent_id) + state = hass.states.get(ent_id) + assert state.attributes.get("media_episode") == 2 + + await common.async_media_previous_track(hass, ent_id) + state = hass.states.get(ent_id) + assert state.attributes.get("media_episode") == 1 + + +async def test_play_media(hass): + """Test play_media .""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + ent_id = "media_player.living_room" + state = hass.states.get(ent_id) + assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0 + assert state.attributes.get("media_content_id") is not None + + with pytest.raises(vol.Invalid): + await common.async_play_media(hass, None, "some_id", ent_id) + state = hass.states.get(ent_id) + assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0 + assert state.attributes.get("media_content_id") != "some_id" + + await common.async_play_media(hass, "youtube", "some_id", ent_id) + state = hass.states.get(ent_id) + assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0 + assert state.attributes.get("media_content_id") == "some_id" + + +async def test_seek(hass, mock_media_seek): + """Test seek.""" + assert await async_setup_component( + hass, mp.DOMAIN, {"media_player": {"platform": "demo"}} + ) + ent_id = "media_player.living_room" + state = hass.states.get(ent_id) + assert state.attributes["supported_features"] & mp.SUPPORT_SEEK + assert not mock_media_seek.called + with pytest.raises(vol.Invalid): + await common.async_media_seek(hass, None, ent_id) + assert not mock_media_seek.called + + await common.async_media_seek(hass, 100, ent_id) + assert mock_media_seek.called async def test_media_image_proxy(hass, hass_client): @@ -239,30 +213,34 @@ async def test_media_image_proxy(hass, hass_client): fake_picture_data = "test.test" class MockResponse: + """Test response.""" + def __init__(self): + """Test response init.""" self.status = 200 self.headers = {"Content-Type": "sometype"} - @asyncio.coroutine - def read(self): + async def read(self): + """Test response read.""" return fake_picture_data.encode("ascii") - @asyncio.coroutine - def release(self): - pass + async def release(self): + """Test response release.""" class MockWebsession: - @asyncio.coroutine - def get(self, url): + """Test websession.""" + + async def get(self, url): + """Test websession get.""" return MockResponse() def detach(self): - pass + """Test websession detach.""" hass.data[DATA_CLIENTSESSION] = MockWebsession() - assert hass.states.is_state(entity_id, "playing") - state = hass.states.get(entity_id) + assert hass.states.is_state(TEST_ENTITY_ID, "playing") + state = hass.states.get(TEST_ENTITY_ID) client = await hass_client() req = await client.get(state.attributes.get("entity_picture")) assert req.status == 200 diff --git a/tests/components/media_player/common.py b/tests/components/media_player/common.py index 5be9a2928299..7b1c9cb45a12 100644 --- a/tests/components/media_player/common.py +++ b/tests/components/media_player/common.py @@ -37,115 +37,192 @@ from homeassistant.const import ( from homeassistant.loader import bind_hass +async def async_turn_on(hass, entity_id=ENTITY_MATCH_ALL): + """Turn on specified media player or all.""" + data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} + await hass.services.async_call(DOMAIN, SERVICE_TURN_ON, data, blocking=True) + + @bind_hass def turn_on(hass, entity_id=ENTITY_MATCH_ALL): """Turn on specified media player or all.""" + hass.add_job(async_turn_on, hass, entity_id) + + +async def async_turn_off(hass, entity_id=ENTITY_MATCH_ALL): + """Turn off specified media player or all.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_TURN_ON, data) + await hass.services.async_call(DOMAIN, SERVICE_TURN_OFF, data, blocking=True) @bind_hass def turn_off(hass, entity_id=ENTITY_MATCH_ALL): """Turn off specified media player or all.""" + hass.add_job(async_turn_off, hass, entity_id) + + +async def async_toggle(hass, entity_id=ENTITY_MATCH_ALL): + """Toggle specified media player or all.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_TURN_OFF, data) + await hass.services.async_call(DOMAIN, SERVICE_TOGGLE, data, blocking=True) @bind_hass def toggle(hass, entity_id=ENTITY_MATCH_ALL): """Toggle specified media player or all.""" + hass.add_job(async_toggle, hass, entity_id) + + +async def async_volume_up(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for volume up.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_TOGGLE, data) + await hass.services.async_call(DOMAIN, SERVICE_VOLUME_UP, data, blocking=True) @bind_hass def volume_up(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for volume up.""" + hass.add_job(async_volume_up, hass, entity_id) + + +async def async_volume_down(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for volume down.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_VOLUME_UP, data) + await hass.services.async_call(DOMAIN, SERVICE_VOLUME_DOWN, data, blocking=True) @bind_hass def volume_down(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for volume down.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_VOLUME_DOWN, data) + hass.add_job(async_volume_down, hass, entity_id) -@bind_hass -def mute_volume(hass, mute, entity_id=ENTITY_MATCH_ALL): +async def async_mute_volume(hass, mute, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for muting the volume.""" data = {ATTR_MEDIA_VOLUME_MUTED: mute} if entity_id: data[ATTR_ENTITY_ID] = entity_id - hass.services.call(DOMAIN, SERVICE_VOLUME_MUTE, data) + await hass.services.async_call(DOMAIN, SERVICE_VOLUME_MUTE, data, blocking=True) @bind_hass -def set_volume_level(hass, volume, entity_id=ENTITY_MATCH_ALL): +def mute_volume(hass, mute, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for muting the volume.""" + hass.add_job(async_mute_volume, hass, mute, entity_id) + + +async def async_set_volume_level(hass, volume, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for setting the volume.""" data = {ATTR_MEDIA_VOLUME_LEVEL: volume} if entity_id: data[ATTR_ENTITY_ID] = entity_id - hass.services.call(DOMAIN, SERVICE_VOLUME_SET, data) + await hass.services.async_call(DOMAIN, SERVICE_VOLUME_SET, data, blocking=True) + + +@bind_hass +def set_volume_level(hass, volume, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for setting the volume.""" + hass.add_job(async_set_volume_level, hass, volume, entity_id) + + +async def async_media_play_pause(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for play/pause.""" + data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} + await hass.services.async_call( + DOMAIN, SERVICE_MEDIA_PLAY_PAUSE, data, blocking=True + ) @bind_hass def media_play_pause(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for play/pause.""" + hass.add_job(async_media_play_pause, hass, entity_id) + + +async def async_media_play(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for play/pause.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_PLAY_PAUSE, data) + await hass.services.async_call(DOMAIN, SERVICE_MEDIA_PLAY, data, blocking=True) @bind_hass def media_play(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for play/pause.""" + hass.add_job(async_media_play, hass, entity_id) + + +async def async_media_pause(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for pause.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_PLAY, data) + await hass.services.async_call(DOMAIN, SERVICE_MEDIA_PAUSE, data, blocking=True) @bind_hass def media_pause(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for pause.""" + hass.add_job(async_media_pause, hass, entity_id) + + +async def async_media_stop(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for stop.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_PAUSE, data) + await hass.services.async_call(DOMAIN, SERVICE_MEDIA_STOP, data, blocking=True) @bind_hass def media_stop(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for stop.""" + hass.add_job(async_media_stop, hass, entity_id) + + +async def async_media_next_track(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for next track.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_STOP, data) + await hass.services.async_call( + DOMAIN, SERVICE_MEDIA_NEXT_TRACK, data, blocking=True + ) @bind_hass def media_next_track(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for next track.""" + hass.add_job(async_media_next_track, hass, entity_id) + + +async def async_media_previous_track(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for prev track.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_NEXT_TRACK, data) + await hass.services.async_call( + DOMAIN, SERVICE_MEDIA_PREVIOUS_TRACK, data, blocking=True + ) @bind_hass def media_previous_track(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for prev track.""" + hass.add_job(async_media_previous_track, hass, entity_id) + + +async def async_media_seek(hass, position, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command to seek in current playing media.""" data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_MEDIA_PREVIOUS_TRACK, data) + data[ATTR_MEDIA_SEEK_POSITION] = position + await hass.services.async_call(DOMAIN, SERVICE_MEDIA_SEEK, data, blocking=True) @bind_hass def media_seek(hass, position, entity_id=ENTITY_MATCH_ALL): """Send the media player the command to seek in current playing media.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - data[ATTR_MEDIA_SEEK_POSITION] = position - hass.services.call(DOMAIN, SERVICE_MEDIA_SEEK, data) + hass.add_job(async_media_seek, hass, position, entity_id) -@bind_hass -def play_media(hass, media_type, media_id, entity_id=ENTITY_MATCH_ALL, enqueue=None): +async def async_play_media( + hass, media_type, media_id, entity_id=ENTITY_MATCH_ALL, enqueue=None +): """Send the media player the command for playing media.""" data = {ATTR_MEDIA_CONTENT_TYPE: media_type, ATTR_MEDIA_CONTENT_ID: media_id} @@ -155,22 +232,38 @@ def play_media(hass, media_type, media_id, entity_id=ENTITY_MATCH_ALL, enqueue=N if enqueue: data[ATTR_MEDIA_ENQUEUE] = enqueue - hass.services.call(DOMAIN, SERVICE_PLAY_MEDIA, data) + await hass.services.async_call(DOMAIN, SERVICE_PLAY_MEDIA, data, blocking=True) @bind_hass -def select_source(hass, source, entity_id=ENTITY_MATCH_ALL): +def play_media(hass, media_type, media_id, entity_id=ENTITY_MATCH_ALL, enqueue=None): + """Send the media player the command for playing media.""" + hass.add_job(async_play_media, hass, media_type, media_id, entity_id, enqueue) + + +async def async_select_source(hass, source, entity_id=ENTITY_MATCH_ALL): """Send the media player the command to select input source.""" data = {ATTR_INPUT_SOURCE: source} if entity_id: data[ATTR_ENTITY_ID] = entity_id - hass.services.call(DOMAIN, SERVICE_SELECT_SOURCE, data) + await hass.services.async_call(DOMAIN, SERVICE_SELECT_SOURCE, data, blocking=True) + + +@bind_hass +def select_source(hass, source, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command to select input source.""" + hass.add_job(async_select_source, hass, source, entity_id) + + +async def async_clear_playlist(hass, entity_id=ENTITY_MATCH_ALL): + """Send the media player the command for clear playlist.""" + data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} + await hass.services.async_call(DOMAIN, SERVICE_CLEAR_PLAYLIST, data, blocking=True) @bind_hass def clear_playlist(hass, entity_id=ENTITY_MATCH_ALL): """Send the media player the command for clear playlist.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - hass.services.call(DOMAIN, SERVICE_CLEAR_PLAYLIST, data) + hass.add_job(async_clear_playlist, hass, entity_id) diff --git a/tests/components/shell_command/test_init.py b/tests/components/shell_command/test_init.py index f046b5087f6f..a5e8cb1d9469 100644 --- a/tests/components/shell_command/test_init.py +++ b/tests/components/shell_command/test_init.py @@ -95,7 +95,7 @@ class TestShellCommand(unittest.TestCase): self.hass.block_till_done() cmd = mock_call.mock_calls[0][1][0] - assert 1 == mock_call.call_count + assert mock_call.call_count == 1 assert "ls /bin" == cmd @patch( @@ -121,7 +121,7 @@ class TestShellCommand(unittest.TestCase): self.hass.block_till_done() cmd = mock_call.mock_calls[0][1] - assert 1 == mock_call.call_count + assert mock_call.call_count == 1 assert ("ls", "/bin", "Works") == cmd @patch( @@ -143,8 +143,8 @@ class TestShellCommand(unittest.TestCase): self.hass.services.call("shell_command", "test_service", blocking=True) self.hass.block_till_done() - assert 1 == mock_call.call_count - assert 1 == mock_error.call_count + assert mock_call.call_count == 1 + assert mock_error.call_count == 1 assert not os.path.isfile(path) @patch("homeassistant.components.shell_command._LOGGER.debug") @@ -160,7 +160,7 @@ class TestShellCommand(unittest.TestCase): self.hass.services.call("shell_command", "test_service", blocking=True) self.hass.block_till_done() - assert 1 == mock_output.call_count + assert mock_output.call_count == 1 assert test_phrase.encode() + b"\n" == mock_output.call_args_list[0][0][-1] @patch("homeassistant.components.shell_command._LOGGER.debug") @@ -176,5 +176,5 @@ class TestShellCommand(unittest.TestCase): self.hass.services.call("shell_command", "test_service", blocking=True) self.hass.block_till_done() - assert 1 == mock_output.call_count + assert mock_output.call_count == 1 assert test_phrase.encode() + b"\n" == mock_output.call_args_list[0][0][-1] diff --git a/tests/components/version/test_sensor.py b/tests/components/version/test_sensor.py index 012ca6e67051..164b4090e5ff 100644 --- a/tests/components/version/test_sensor.py +++ b/tests/components/version/test_sensor.py @@ -1,41 +1,26 @@ """The test for the version sensor platform.""" -import asyncio -import unittest from unittest.mock import patch -from homeassistant.setup import setup_component - -from tests.common import get_test_home_assistant +from homeassistant.setup import async_setup_component MOCK_VERSION = "10.0" -class TestVersionSensor(unittest.TestCase): +async def test_version_sensor(hass): """Test the Version sensor.""" + config = {"sensor": {"platform": "version"}} - def setup_method(self, method): - """Set up things to be run when tests are started.""" - self.hass = get_test_home_assistant() + assert await async_setup_component(hass, "sensor", config) - def teardown_method(self, method): - """Stop everything that was started.""" - self.hass.stop() - def test_version_sensor(self): - """Test the Version sensor.""" - config = {"sensor": {"platform": "version"}} +async def test_version(hass): + """Test the Version sensor.""" + config = {"sensor": {"platform": "version", "name": "test"}} - assert setup_component(self.hass, "sensor", config) + with patch("homeassistant.const.__version__", MOCK_VERSION): + assert await async_setup_component(hass, "sensor", config) + await hass.async_block_till_done() - @asyncio.coroutine - def test_version(self): - """Test the Version sensor.""" - config = {"sensor": {"platform": "version", "name": "test"}} + state = hass.states.get("sensor.test") - with patch("homeassistant.const.__version__", MOCK_VERSION): - assert setup_component(self.hass, "sensor", config) - self.hass.block_till_done() - - state = self.hass.states.get("sensor.test") - - assert state.state == "10.0" + assert state.state == "10.0" From 3697ea7b278ecdc0043e7b2dff919f5e3c21ad83 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Tue, 7 Apr 2020 19:37:54 +0300 Subject: [PATCH 200/653] Remove uncaught exceptions from rflink (#33709) Co-authored-by: Paulus Schoutsen --- tests/components/rflink/test_init.py | 18 +++++++++++------- tests/ignore_uncaught_exceptions.py | 1 - 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tests/components/rflink/test_init.py b/tests/components/rflink/test_init.py index 135f6322e2da..5946adc90a6c 100644 --- a/tests/components/rflink/test_init.py +++ b/tests/components/rflink/test_init.py @@ -2,6 +2,9 @@ from unittest.mock import Mock +import pytest +from voluptuous.error import MultipleInvalid + from homeassistant.bootstrap import async_setup_component from homeassistant.components.rflink import ( CONF_RECONNECT_INTERVAL, @@ -169,16 +172,17 @@ async def test_send_command_invalid_arguments(hass, monkeypatch): _, _, protocol, _ = await mock_rflink(hass, config, domain, monkeypatch) # one argument missing - hass.async_create_task( - hass.services.async_call(domain, SERVICE_SEND_COMMAND, {"command": "on"}) - ) - hass.async_create_task( - hass.services.async_call( + with pytest.raises(MultipleInvalid): + await hass.services.async_call(domain, SERVICE_SEND_COMMAND, {"command": "on"}) + + with pytest.raises(MultipleInvalid): + await hass.services.async_call( domain, SERVICE_SEND_COMMAND, {"device_id": "newkaku_0000c6c2_1"} ) - ) + # no arguments - hass.async_create_task(hass.services.async_call(domain, SERVICE_SEND_COMMAND, {})) + with pytest.raises(MultipleInvalid): + await hass.services.async_call(domain, SERVICE_SEND_COMMAND, {}) await hass.async_block_till_done() assert protocol.send_command_ack.call_args_list == [] diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index ee256acbbc64..72da24d38da0 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -36,7 +36,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.local_file.test_camera", "test_file_not_readable"), ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), ("tests.components.qwikswitch.test_init", "test_sensor_device"), - ("tests.components.rflink.test_init", "test_send_command_invalid_arguments"), ] IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [] From ddef681dd2b1136cffeeb3141cda489e2eaed7a4 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 7 Apr 2020 18:38:22 +0200 Subject: [PATCH 201/653] Improve MQTT debug info for subscriptions with wildcard (#33752) --- homeassistant/components/mqtt/debug_info.py | 37 +++++++++------ homeassistant/components/mqtt/subscription.py | 10 ++-- tests/components/mqtt/test_common.py | 46 +++++++++++-------- tests/components/mqtt/test_init.py | 21 +++++---- 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/mqtt/debug_info.py b/homeassistant/components/mqtt/debug_info.py index b51ee619a121..796453ec9e72 100644 --- a/homeassistant/components/mqtt/debug_info.py +++ b/homeassistant/components/mqtt/debug_info.py @@ -21,8 +21,10 @@ def log_messages(hass: HomeAssistantType, entity_id: str) -> MessageCallbackType def _log_message(msg): """Log message.""" debug_info = hass.data[DATA_MQTT_DEBUG_INFO] - messages = debug_info["entities"][entity_id]["topics"][msg.subscribed_topic] - messages.append(msg.payload) + messages = debug_info["entities"][entity_id]["subscriptions"][ + msg.subscribed_topic + ] + messages.append((msg.payload, msg.topic)) def _decorator(msg_callback: MessageCallbackType): @wraps(msg_callback) @@ -37,24 +39,26 @@ def log_messages(hass: HomeAssistantType, entity_id: str) -> MessageCallbackType return _decorator -def add_topic(hass, message_callback, topic): - """Prepare debug data for topic.""" +def add_subscription(hass, message_callback, subscription): + """Prepare debug data for subscription.""" entity_id = getattr(message_callback, "__entity_id", None) if entity_id: debug_info = hass.data.setdefault( DATA_MQTT_DEBUG_INFO, {"entities": {}, "triggers": {}} ) entity_info = debug_info["entities"].setdefault( - entity_id, {"topics": {}, "discovery_data": {}} + entity_id, {"subscriptions": {}, "discovery_data": {}} ) - entity_info["topics"][topic] = deque([], STORED_MESSAGES) + entity_info["subscriptions"][subscription] = deque([], STORED_MESSAGES) -def remove_topic(hass, message_callback, topic): - """Remove debug data for topic.""" +def remove_subscription(hass, message_callback, subscription): + """Remove debug data for subscription.""" entity_id = getattr(message_callback, "__entity_id", None) if entity_id and entity_id in hass.data[DATA_MQTT_DEBUG_INFO]["entities"]: - hass.data[DATA_MQTT_DEBUG_INFO]["entities"][entity_id]["topics"].pop(topic) + hass.data[DATA_MQTT_DEBUG_INFO]["entities"][entity_id]["subscriptions"].pop( + subscription + ) def add_entity_discovery_data(hass, discovery_data, entity_id): @@ -63,7 +67,7 @@ def add_entity_discovery_data(hass, discovery_data, entity_id): DATA_MQTT_DEBUG_INFO, {"entities": {}, "triggers": {}} ) entity_info = debug_info["entities"].setdefault( - entity_id, {"topics": {}, "discovery_data": {}} + entity_id, {"subscriptions": {}, "discovery_data": {}} ) entity_info["discovery_data"] = discovery_data @@ -117,9 +121,14 @@ async def info_for_device(hass, device_id): continue entity_info = mqtt_debug_info["entities"][entry.entity_id] - topics = [ - {"topic": topic, "messages": list(messages)} - for topic, messages in entity_info["topics"].items() + subscriptions = [ + { + "topic": topic, + "messages": [ + {"payload": msg[0], "topic": msg[1]} for msg in list(messages) + ], + } + for topic, messages in entity_info["subscriptions"].items() ] discovery_data = { "topic": entity_info["discovery_data"].get(ATTR_DISCOVERY_TOPIC, ""), @@ -128,7 +137,7 @@ async def info_for_device(hass, device_id): mqtt_info["entities"].append( { "entity_id": entry.entity_id, - "topics": topics, + "subscriptions": subscriptions, "discovery_data": discovery_data, } ) diff --git a/homeassistant/components/mqtt/subscription.py b/homeassistant/components/mqtt/subscription.py index b4793a49dca1..c1de08d5be81 100644 --- a/homeassistant/components/mqtt/subscription.py +++ b/homeassistant/components/mqtt/subscription.py @@ -34,14 +34,16 @@ class EntitySubscription: if other is not None and other.unsubscribe_callback is not None: other.unsubscribe_callback() # Clear debug data if it exists - debug_info.remove_topic(self.hass, other.message_callback, other.topic) + debug_info.remove_subscription( + self.hass, other.message_callback, other.topic + ) if self.topic is None: # We were asked to remove the subscription or not to create it return # Prepare debug data - debug_info.add_topic(self.hass, self.message_callback, self.topic) + debug_info.add_subscription(self.hass, self.message_callback, self.topic) self.unsubscribe_callback = await mqtt.async_subscribe( hass, self.topic, self.message_callback, self.qos, self.encoding @@ -96,7 +98,9 @@ async def async_subscribe_topics( if remaining.unsubscribe_callback is not None: remaining.unsubscribe_callback() # Clear debug data if it exists - debug_info.remove_topic(hass, remaining.message_callback, remaining.topic) + debug_info.remove_subscription( + hass, remaining.message_callback, remaining.topic + ) return new_state diff --git a/tests/components/mqtt/test_common.py b/tests/components/mqtt/test_common.py index 0d1b892611d2..3e95e5a1afed 100644 --- a/tests/components/mqtt/test_common.py +++ b/tests/components/mqtt/test_common.py @@ -551,9 +551,9 @@ async def help_test_entity_debug_info(hass, mqtt_mock, domain, config): == f"homeassistant/{domain}/bla/config" ) assert debug_info_data["entities"][0]["discovery_data"]["payload"] == config - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert {"topic": "test-topic", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] assert len(debug_info_data["triggers"]) == 0 @@ -581,24 +581,27 @@ async def help_test_entity_debug_info_max_messages(hass, mqtt_mock, domain, conf assert device is not None debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert {"topic": "test-topic", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] for i in range(0, debug_info.STORED_MESSAGES + 1): async_fire_mqtt_message(hass, "test-topic", f"{i}") debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert ( - len(debug_info_data["entities"][0]["topics"][0]["messages"]) + len(debug_info_data["entities"][0]["subscriptions"][0]["messages"]) == debug_info.STORED_MESSAGES ) - messages = [f"{i}" for i in range(1, debug_info.STORED_MESSAGES + 1)] + messages = [ + {"topic": "test-topic", "payload": f"{i}"} + for i in range(1, debug_info.STORED_MESSAGES + 1) + ] assert {"topic": "test-topic", "messages": messages} in debug_info_data["entities"][ 0 - ]["topics"] + ]["subscriptions"] async def help_test_entity_debug_info_message( @@ -634,16 +637,19 @@ async def help_test_entity_debug_info_message( assert device is not None debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) >= 1 - assert {"topic": topic, "messages": []} in debug_info_data["entities"][0]["topics"] + assert len(debug_info_data["entities"][0]["subscriptions"]) >= 1 + assert {"topic": topic, "messages": []} in debug_info_data["entities"][0][ + "subscriptions" + ] async_fire_mqtt_message(hass, topic, payload) debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) >= 1 - assert {"topic": topic, "messages": [payload]} in debug_info_data["entities"][0][ - "topics" - ] + assert len(debug_info_data["entities"][0]["subscriptions"]) >= 1 + assert { + "topic": topic, + "messages": [{"topic": topic, "payload": payload}], + } in debug_info_data["entities"][0]["subscriptions"] async def help_test_entity_debug_info_remove(hass, mqtt_mock, domain, config): @@ -675,9 +681,9 @@ async def help_test_entity_debug_info_remove(hass, mqtt_mock, domain, config): == f"homeassistant/{domain}/bla/config" ) assert debug_info_data["entities"][0]["discovery_data"]["payload"] == config - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert {"topic": "test-topic", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] assert len(debug_info_data["triggers"]) == 0 assert debug_info_data["entities"][0]["entity_id"] == f"{domain}.test" @@ -723,9 +729,9 @@ async def help_test_entity_debug_info_update_entity_id(hass, mqtt_mock, domain, ) assert debug_info_data["entities"][0]["discovery_data"]["payload"] == config assert debug_info_data["entities"][0]["entity_id"] == f"{domain}.test" - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert {"topic": "test-topic", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] assert len(debug_info_data["triggers"]) == 0 @@ -741,9 +747,9 @@ async def help_test_entity_debug_info_update_entity_id(hass, mqtt_mock, domain, ) assert debug_info_data["entities"][0]["discovery_data"]["payload"] == config assert debug_info_data["entities"][0]["entity_id"] == f"{domain}.milk" - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 assert {"topic": "test-topic", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] assert len(debug_info_data["triggers"]) == 0 assert ( diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 637cefcf7442..de8444446d58 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -1030,7 +1030,7 @@ async def test_mqtt_ws_get_device_debug_info( "entities": [ { "entity_id": "sensor.mqtt_sensor", - "topics": [{"topic": "foobar/sensor", "messages": []}], + "subscriptions": [{"topic": "foobar/sensor", "messages": []}], "discovery_data": { "payload": config, "topic": "homeassistant/sensor/bla/config", @@ -1110,10 +1110,10 @@ async def test_debug_info_multiple_devices(hass, mqtt_mock): assert len(debug_info_data["entities"]) == 1 assert len(debug_info_data["triggers"]) == 0 discovery_data = debug_info_data["entities"][0]["discovery_data"] - assert len(debug_info_data["entities"][0]["topics"]) == 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) == 1 topic = d["config"]["state_topic"] assert {"topic": topic, "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] else: assert len(debug_info_data["entities"]) == 0 @@ -1199,7 +1199,7 @@ async def test_debug_info_multiple_entities_triggers(hass, mqtt_mock): discovery_data = [e["discovery_data"] for e in debug_info_data["entities"]] topic = c["config"]["state_topic"] assert {"topic": topic, "messages": []} in [ - t for e in debug_info_data["entities"] for t in e["topics"] + t for e in debug_info_data["entities"] for t in e["subscriptions"] ] else: discovery_data = [e["discovery_data"] for e in debug_info_data["triggers"]] @@ -1260,15 +1260,16 @@ async def test_debug_info_wildcard(hass, mqtt_mock): assert device is not None debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) >= 1 + assert len(debug_info_data["entities"][0]["subscriptions"]) >= 1 assert {"topic": "sensor/#", "messages": []} in debug_info_data["entities"][0][ - "topics" + "subscriptions" ] async_fire_mqtt_message(hass, "sensor/abc", "123") debug_info_data = await debug_info.info_for_device(hass, device.id) - assert len(debug_info_data["entities"][0]["topics"]) >= 1 - assert {"topic": "sensor/#", "messages": ["123"]} in debug_info_data["entities"][0][ - "topics" - ] + assert len(debug_info_data["entities"][0]["subscriptions"]) >= 1 + assert { + "topic": "sensor/#", + "messages": [{"topic": "sensor/abc", "payload": "123"}], + } in debug_info_data["entities"][0]["subscriptions"] From 9d38413e7c3dea382ba8fcc665805b6c62d07de1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 7 Apr 2020 09:59:04 -0700 Subject: [PATCH 202/653] Upgrade hass-cloud to 0.34 (#33789) --- homeassistant/components/cloud/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/cloud/manifest.json b/homeassistant/components/cloud/manifest.json index b8c2bc277f09..e499c93c3a3e 100644 --- a/homeassistant/components/cloud/manifest.json +++ b/homeassistant/components/cloud/manifest.json @@ -2,7 +2,7 @@ "domain": "cloud", "name": "Home Assistant Cloud", "documentation": "https://www.home-assistant.io/integrations/cloud", - "requirements": ["hass-nabucasa==0.33.0"], + "requirements": ["hass-nabucasa==0.34.0"], "dependencies": ["http", "webhook", "alexa"], "after_dependencies": ["google_assistant"], "codeowners": ["@home-assistant/cloud"] diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index f0415aead622..c3cca9662fc5 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -11,7 +11,7 @@ ciso8601==2.1.3 cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 -hass-nabucasa==0.33.0 +hass-nabucasa==0.34.0 home-assistant-frontend==20200406.0 importlib-metadata==1.5.0 jinja2>=2.11.1 diff --git a/requirements_all.txt b/requirements_all.txt index af84a372311b..4f4784f0611b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -673,7 +673,7 @@ habitipy==0.2.0 hangups==0.4.9 # homeassistant.components.cloud -hass-nabucasa==0.33.0 +hass-nabucasa==0.34.0 # homeassistant.components.mqtt hbmqtt==0.9.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5bdb3034f93b..a47bdbd0f818 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -263,7 +263,7 @@ ha-ffmpeg==2.0 hangups==0.4.9 # homeassistant.components.cloud -hass-nabucasa==0.33.0 +hass-nabucasa==0.34.0 # homeassistant.components.mqtt hbmqtt==0.9.5 From 8fb89854d39d3bb8467cb1cc7f42edb39388d0a3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 7 Apr 2020 10:13:55 -0700 Subject: [PATCH 203/653] Fix flaky TP-Link test (#33790) --- homeassistant/components/tplink/light.py | 12 ------------ homeassistant/components/tplink/switch.py | 11 ----------- tests/components/tplink/test_init.py | 2 ++ 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 7e07f7931f51..14d6b362dca9 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -35,23 +35,11 @@ ATTR_DAILY_ENERGY_KWH = "daily_energy_kwh" ATTR_MONTHLY_ENERGY_KWH = "monthly_energy_kwh" -async def async_setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the platform. - - Deprecated. - """ - _LOGGER.warning( - "Loading as a platform is no longer supported, " - "convert to use the tplink component." - ) - - async def async_setup_entry(hass: HomeAssistantType, config_entry, async_add_entities): """Set up switches.""" await async_add_entities_retry( hass, async_add_entities, hass.data[TPLINK_DOMAIN][CONF_LIGHT], add_entity ) - return True diff --git a/homeassistant/components/tplink/switch.py b/homeassistant/components/tplink/switch.py index b6ca69f4ccd2..59d993477dfb 100644 --- a/homeassistant/components/tplink/switch.py +++ b/homeassistant/components/tplink/switch.py @@ -24,17 +24,6 @@ ATTR_TOTAL_ENERGY_KWH = "total_energy_kwh" ATTR_CURRENT_A = "current_a" -async def async_setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the platform. - - Deprecated. - """ - _LOGGER.warning( - "Loading as a platform is no longer supported, " - "convert to use the tplink component." - ) - - def add_entity(device: SmartPlug, async_add_entities): """Check if device is online and add the entity.""" # Attempt to get the sysinfo. If it fails, it will raise an diff --git a/tests/components/tplink/test_init.py b/tests/components/tplink/test_init.py index d30a05ddbf89..85bf07818640 100644 --- a/tests/components/tplink/test_init.py +++ b/tests/components/tplink/test_init.py @@ -116,6 +116,8 @@ async def test_configuring_devices_from_multiple_sources(hass): "homeassistant.components.tplink.common.Discover.discover" ) as discover, patch( "homeassistant.components.tplink.common.SmartDevice._query_helper" + ), patch( + "homeassistant.config_entries.ConfigEntries.async_forward_entry_setup" ): discover_device_fail = SmartPlug("123.123.123.123") discover_device_fail.get_sysinfo = MagicMock(side_effect=SmartDeviceException()) From 81569f10c0bfb3ede3c8dd386b8a08c19ea1e4f8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 7 Apr 2020 12:16:31 -0500 Subject: [PATCH 204/653] Fix nuheat reverting to auto mode after setting temp hold (#33772) * Fix nuheat reverting to auto mode after setting temp hold * clamp temp --- homeassistant/components/nuheat/climate.py | 31 +++++++++++++++++++--- homeassistant/components/nuheat/const.py | 9 ++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/nuheat/climate.py b/homeassistant/components/nuheat/climate.py index f8d6bf1d8df1..c1d591c03eb4 100644 --- a/homeassistant/components/nuheat/climate.py +++ b/homeassistant/components/nuheat/climate.py @@ -1,6 +1,7 @@ """Support for NuHeat thermostats.""" -from datetime import timedelta +from datetime import datetime, timedelta import logging +import time from nuheat.config import SCHEDULE_HOLD, SCHEDULE_RUN, SCHEDULE_TEMPORARY_HOLD from nuheat.util import ( @@ -24,7 +25,16 @@ from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT from homeassistant.helpers import event as event_helper from homeassistant.util import Throttle -from .const import DOMAIN, MANUFACTURER, NUHEAT_API_STATE_SHIFT_DELAY +from .const import ( + DOMAIN, + MANUFACTURER, + NUHEAT_API_STATE_SHIFT_DELAY, + NUHEAT_DATETIME_FORMAT, + NUHEAT_KEY_HOLD_SET_POINT_DATE_TIME, + NUHEAT_KEY_SCHEDULE_MODE, + NUHEAT_KEY_SET_POINT_TEMP, + TEMP_HOLD_TIME_SEC, +) _LOGGER = logging.getLogger(__name__) @@ -218,9 +228,22 @@ class NuHeatThermostat(ClimateDevice): target_schedule_mode, ) - self._thermostat.set_target_temperature( - target_temperature, target_schedule_mode + target_temperature = max( + min(self._thermostat.max_temperature, target_temperature), + self._thermostat.min_temperature, ) + + request = { + NUHEAT_KEY_SET_POINT_TEMP: target_temperature, + NUHEAT_KEY_SCHEDULE_MODE: target_schedule_mode, + } + + if target_schedule_mode == SCHEDULE_TEMPORARY_HOLD: + request[NUHEAT_KEY_HOLD_SET_POINT_DATE_TIME] = datetime.fromtimestamp( + time.time() + TEMP_HOLD_TIME_SEC + ).strftime(NUHEAT_DATETIME_FORMAT) + + self._thermostat.set_data(request) self._schedule_mode = target_schedule_mode self._target_temperature = target_temperature self._schedule_update() diff --git a/homeassistant/components/nuheat/const.py b/homeassistant/components/nuheat/const.py index 1bb6c3825e79..bd44dcb17110 100644 --- a/homeassistant/components/nuheat/const.py +++ b/homeassistant/components/nuheat/const.py @@ -8,4 +8,11 @@ CONF_SERIAL_NUMBER = "serial_number" MANUFACTURER = "NuHeat" -NUHEAT_API_STATE_SHIFT_DELAY = 4 +NUHEAT_API_STATE_SHIFT_DELAY = 1 + +TEMP_HOLD_TIME_SEC = 43200 + +NUHEAT_KEY_SET_POINT_TEMP = "SetPointTemp" +NUHEAT_KEY_SCHEDULE_MODE = "ScheduleMode" +NUHEAT_KEY_HOLD_SET_POINT_DATE_TIME = "HoldSetPointDateTime" +NUHEAT_DATETIME_FORMAT = "%a, %d %b %Y %H:%M:%S GMT" From 3873b237046bb73436756938345d2817c54062d9 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Tue, 7 Apr 2020 12:17:16 -0500 Subject: [PATCH 205/653] Fix minor async issues in Plex (#33785) * Fix minor async context issues * Annotate callback --- homeassistant/components/plex/sensor.py | 7 +++++-- homeassistant/components/plex/server.py | 12 +++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/plex/sensor.py b/homeassistant/components/plex/sensor.py index 21e8e1a8a582..f4d5d24049c1 100644 --- a/homeassistant/components/plex/sensor.py +++ b/homeassistant/components/plex/sensor.py @@ -2,7 +2,10 @@ import logging from homeassistant.core import callback -from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send +from homeassistant.helpers.dispatcher import ( + async_dispatcher_connect, + async_dispatcher_send, +) from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import async_call_later @@ -58,7 +61,7 @@ class PlexSensor(Entity): @callback def update_plex(_): - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(self._server.machine_identifier), ) diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index a7b66c3a3ba3..4134ad4e32b2 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -12,7 +12,8 @@ import requests.exceptions from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL -from homeassistant.helpers.dispatcher import async_dispatcher_send, dispatcher_send +from homeassistant.core import callback +from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.event import async_call_later from .const import ( @@ -175,11 +176,12 @@ class PlexServer: if config_entry_update_needed: raise ShouldUpdateConfigEntry - def refresh_entity(self, machine_identifier, device, session): + @callback + def async_refresh_entity(self, machine_identifier, device, session): """Forward refresh dispatch to media_player.""" unique_id = f"{self.machine_identifier}:{machine_identifier}" _LOGGER.debug("Refreshing %s", unique_id) - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_UPDATE_MEDIA_PLAYER_SIGNAL.format(unique_id), device, @@ -262,7 +264,7 @@ class PlexServer: if client_id in new_clients: new_entity_configs.append(client_data) else: - self.refresh_entity( + self.async_refresh_entity( client_id, client_data["device"], client_data.get("session") ) @@ -272,7 +274,7 @@ class PlexServer: self._known_clients - self._known_idle - ignored_clients ).difference(available_clients) for client_id in idle_clients: - self.refresh_entity(client_id, None, None) + self.async_refresh_entity(client_id, None, None) self._known_idle.add(client_id) if new_entity_configs: From 078ce6766e17d197efcf03fe0182fb46836ddc3e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 7 Apr 2020 12:22:35 -0500 Subject: [PATCH 206/653] Add discovery support to synology_dsm (#33729) * Add discovery support to synology_dsm * Remove debug * black * Fix mocks * Merge strings * Move placeholders * add missing placeholders * reorder * use constants in test * Remove CONF_NAME (only displayed in discovery now) * test reduction * Shorten long name * Use name for name but NOT for unique_id, remove CONF_NAME from yaml config * Use Synology for the name for now, hopefully we can use the hostname later * lint * Remove name from strings * remove =None * show login errors at username field * Update tests/components/synology_dsm/test_config_flow.py Co-Authored-By: Quentame * Update tests/components/synology_dsm/test_config_flow.py Co-Authored-By: Quentame * Update homeassistant/components/synology_dsm/const.py Co-authored-by: Quentame --- .../synology_dsm/.translations/en.json | 59 +++--- .../components/synology_dsm/__init__.py | 4 +- .../components/synology_dsm/config_flow.py | 182 ++++++++++++------ .../components/synology_dsm/const.py | 2 +- .../components/synology_dsm/manifest.json | 8 +- .../components/synology_dsm/sensor.py | 18 +- .../components/synology_dsm/strings.json | 15 +- homeassistant/generated/ssdp.py | 6 + .../synology_dsm/test_config_flow.py | 69 +++++-- 9 files changed, 243 insertions(+), 120 deletions(-) diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json index 327745343bad..77bd1250033b 100644 --- a/homeassistant/components/synology_dsm/.translations/en.json +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -1,26 +1,37 @@ { - "config": { - "abort": { - "already_configured": "Host already configured" - }, - "error": { - "login": "Login error: please check your username & password", - "unknown": "Unknown error: please retry later or an other configuration" - }, - "step": { - "user": { - "data": { - "api_version": "DSM version", - "host": "Host", - "name": "Name", - "password": "Password", - "port": "Port", - "ssl": "Use SSL/TLS to connect to your NAS", - "username": "Username" - }, - "title": "Synology DSM" - } - }, - "title": "Synology DSM" + "config": { + "title": "Synology DSM", + "flow_title": "Synology DSM {name} ({host})", + "step": { + "user": { + "title": "Synology DSM", + "data": { + "host": "Host", + "port": "Port (Optional)", + "ssl": "Use SSL/TLS to connect to your NAS", + "api_version": "DSM version", + "username": "Username", + "password": "Password" + } + }, + "link": { + "title": "Synology DSM", + "description": "Do you want to setup {name} ({host})?", + "data": { + "ssl": "Use SSL/TLS to connect to your NAS", + "api_version": "DSM version", + "username": "Username", + "password": "Password", + "port": "Port (Optional)" + } + } + }, + "error": { + "login": "Login error: please check your username & password", + "unknown": "Unknown error: please retry later or an other configuration" + }, + "abort": { + "already_configured": "Host already configured" } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py index e2ada59ec1d8..874afb185840 100644 --- a/homeassistant/components/synology_dsm/__init__.py +++ b/homeassistant/components/synology_dsm/__init__.py @@ -12,7 +12,6 @@ from homeassistant.const import ( CONF_API_VERSION, CONF_DISKS, CONF_HOST, - CONF_NAME, CONF_PASSWORD, CONF_PORT, CONF_SSL, @@ -23,11 +22,10 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.typing import HomeAssistantType -from .const import CONF_VOLUMES, DEFAULT_DSM_VERSION, DEFAULT_NAME, DEFAULT_SSL, DOMAIN +from .const import CONF_VOLUMES, DEFAULT_DSM_VERSION, DEFAULT_SSL, DOMAIN CONFIG_SCHEMA = vol.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT): cv.port, vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py index fd23931f13f5..f34e01d55bcc 100644 --- a/homeassistant/components/synology_dsm/config_flow.py +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -1,11 +1,12 @@ """Config flow to configure the Synology DSM integration.""" +import logging +from urllib.parse import urlparse + from synology_dsm import SynologyDSM -from synology_dsm.api.core.utilization import SynoCoreUtilization -from synology_dsm.api.dsm.information import SynoDSMInformation -from synology_dsm.api.storage.storage import SynoStorage import voluptuous as vol -from homeassistant import config_entries +from homeassistant import config_entries, exceptions +from homeassistant.components import ssdp from homeassistant.const import ( CONF_API_VERSION, CONF_DISKS, @@ -20,13 +21,42 @@ from homeassistant.const import ( from .const import ( CONF_VOLUMES, DEFAULT_DSM_VERSION, - DEFAULT_NAME, DEFAULT_PORT, DEFAULT_PORT_SSL, DEFAULT_SSL, ) from .const import DOMAIN # pylint: disable=unused-import +_LOGGER = logging.getLogger(__name__) + + +def _discovery_schema_with_defaults(discovery_info): + return vol.Schema(_ordered_shared_schema(discovery_info)) + + +def _user_schema_with_defaults(user_input): + user_schema = { + vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, + } + user_schema.update(_ordered_shared_schema(user_input)) + + return vol.Schema(user_schema) + + +def _ordered_shared_schema(schema_input): + return { + vol.Required(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str, + vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str, + vol.Optional(CONF_PORT, default=schema_input.get(CONF_PORT, "")): str, + vol.Optional(CONF_SSL, default=schema_input.get(CONF_SSL, DEFAULT_SSL)): bool, + vol.Optional( + CONF_API_VERSION, + default=schema_input.get(CONF_API_VERSION, DEFAULT_DSM_VERSION), + ): vol.All( + vol.Coerce(int), vol.In([5, 6]), # DSM versions supported by the library + ), + } + class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Handle a config flow.""" @@ -34,40 +64,28 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): VERSION = 1 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + def __init__(self): + """Initialize the synology_dsm config flow.""" + self.discovered_conf = {} + async def _show_setup_form(self, user_input=None, errors=None): """Show the setup form to the user.""" - - if user_input is None: + if not user_input: user_input = {} + if self.discovered_conf: + user_input.update(self.discovered_conf) + step_id = "link" + data_schema = _discovery_schema_with_defaults(user_input) + else: + step_id = "user" + data_schema = _user_schema_with_defaults(user_input) + return self.async_show_form( - step_id="user", - data_schema=vol.Schema( - { - vol.Optional( - CONF_NAME, default=user_input.get(CONF_NAME, DEFAULT_NAME) - ): str, - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, - vol.Optional(CONF_PORT, default=user_input.get(CONF_PORT, "")): str, - vol.Optional( - CONF_SSL, default=user_input.get(CONF_SSL, DEFAULT_SSL) - ): bool, - vol.Optional( - CONF_API_VERSION, - default=user_input.get(CONF_API_VERSION, DEFAULT_DSM_VERSION), - ): vol.All( - vol.Coerce(int), - vol.In([5, 6]), # DSM versions supported by the library - ), - vol.Required( - CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") - ): str, - vol.Required( - CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") - ): str, - } - ), + step_id=step_id, + data_schema=data_schema, errors=errors or {}, + description_placeholders=self.discovered_conf or {}, ) async def async_step_user(self, user_input=None): @@ -77,7 +95,9 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): if user_input is None: return await self._show_setup_form(user_input, None) - name = user_input.get(CONF_NAME, DEFAULT_NAME) + if self.discovered_conf: + user_input.update(self.discovered_conf) + host = user_input[CONF_HOST] port = user_input.get(CONF_PORT) username = user_input[CONF_USERNAME] @@ -95,35 +115,23 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): host, port, username, password, use_ssl, dsm_version=api_version, ) - if not await self.hass.async_add_executor_job(api.login): + try: + serial = await self.hass.async_add_executor_job( + _login_and_fetch_syno_info, api + ) + except InvalidAuth: errors[CONF_USERNAME] = "login" - return await self._show_setup_form(user_input, errors) + except InvalidData: + errors["base"] = "missing_data" - information: SynoDSMInformation = await self.hass.async_add_executor_job( - getattr, api, "information" - ) - utilisation: SynoCoreUtilization = await self.hass.async_add_executor_job( - getattr, api, "utilisation" - ) - storage: SynoStorage = await self.hass.async_add_executor_job( - getattr, api, "storage" - ) - - if ( - information.serial is None - or utilisation.cpu_user_load is None - or storage.disks_ids is None - or storage.volumes_ids is None - ): - errors["base"] = "unknown" + if errors: return await self._show_setup_form(user_input, errors) # Check if already configured - await self.async_set_unique_id(information.serial) + await self.async_set_unique_id(serial) self._abort_if_unique_id_configured() config_data = { - CONF_NAME: name, CONF_HOST: host, CONF_PORT: port, CONF_SSL: use_ssl, @@ -131,12 +139,70 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): CONF_PASSWORD: password, } if user_input.get(CONF_DISKS): - config_data.update({CONF_DISKS: user_input[CONF_DISKS]}) + config_data[CONF_DISKS] = user_input[CONF_DISKS] if user_input.get(CONF_VOLUMES): - config_data.update({CONF_VOLUMES: user_input[CONF_VOLUMES]}) + config_data[CONF_VOLUMES] = user_input[CONF_VOLUMES] - return self.async_create_entry(title=host, data=config_data,) + return self.async_create_entry(title=host, data=config_data) + + async def async_step_ssdp(self, discovery_info): + """Handle a discovered synology_dsm.""" + parsed_url = urlparse(discovery_info[ssdp.ATTR_SSDP_LOCATION]) + friendly_name = ( + discovery_info[ssdp.ATTR_UPNP_FRIENDLY_NAME].split("(", 1)[0].strip() + ) + + if self._host_already_configured(parsed_url.hostname): + return self.async_abort(reason="already_configured") + + self.discovered_conf = { + CONF_NAME: friendly_name, + CONF_HOST: parsed_url.hostname, + } + # pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167 + self.context["title_placeholders"] = self.discovered_conf + return await self.async_step_user() async def async_step_import(self, user_input=None): """Import a config entry.""" return await self.async_step_user(user_input) + + async def async_step_link(self, user_input=None): + """Link a config entry from discovery.""" + return await self.async_step_user(user_input) + + def _host_already_configured(self, hostname): + """See if we already have a host matching user input configured.""" + existing_hosts = { + entry.data[CONF_HOST] for entry in self._async_current_entries() + } + return hostname in existing_hosts + + +def _login_and_fetch_syno_info(api): + """Login to the NAS and fetch basic data.""" + if not api.login(): + raise InvalidAuth + + # These do i/o + information = api.information + utilisation = api.utilisation + storage = api.storage + + if ( + information.serial is None + or utilisation.cpu_user_load is None + or storage.disks_ids is None + or storage.volumes_ids is None + ): + raise InvalidData + + return information.serial + + +class InvalidData(exceptions.HomeAssistantError): + """Error to indicate we get invalid data from the nas.""" + + +class InvalidAuth(exceptions.HomeAssistantError): + """Error to indicate there is invalid auth.""" diff --git a/homeassistant/components/synology_dsm/const.py b/homeassistant/components/synology_dsm/const.py index 7323413636ba..dc58302fa32a 100644 --- a/homeassistant/components/synology_dsm/const.py +++ b/homeassistant/components/synology_dsm/const.py @@ -8,7 +8,7 @@ from homeassistant.const import ( DOMAIN = "synology_dsm" CONF_VOLUMES = "volumes" -DEFAULT_NAME = "Synology DSM" +BASE_NAME = "Synology" DEFAULT_SSL = True DEFAULT_PORT = 5000 DEFAULT_PORT_SSL = 5001 diff --git a/homeassistant/components/synology_dsm/manifest.json b/homeassistant/components/synology_dsm/manifest.json index a6d171f65283..e2f730ddc8d3 100644 --- a/homeassistant/components/synology_dsm/manifest.json +++ b/homeassistant/components/synology_dsm/manifest.json @@ -4,5 +4,11 @@ "documentation": "https://www.home-assistant.io/integrations/synology_dsm", "requirements": ["python-synology==0.5.0"], "codeowners": ["@ProtoThis", "@Quentame"], - "config_flow": true + "config_flow": true, + "ssdp": [ + { + "manufacturer": "Synology", + "deviceType": "urn:schemas-upnp-org:device:Basic:1" + } + ] } diff --git a/homeassistant/components/synology_dsm/sensor.py b/homeassistant/components/synology_dsm/sensor.py index aeefbc498937..6e5a486ab890 100644 --- a/homeassistant/components/synology_dsm/sensor.py +++ b/homeassistant/components/synology_dsm/sensor.py @@ -5,7 +5,6 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_ATTRIBUTION, CONF_DISKS, - CONF_NAME, DATA_MEGABYTES, DATA_RATE_KILOBYTES_PER_SECOND, TEMP_CELSIUS, @@ -16,6 +15,7 @@ from homeassistant.helpers.typing import HomeAssistantType from . import SynoApi from .const import ( + BASE_NAME, CONF_VOLUMES, DOMAIN, STORAGE_DISK_SENSORS, @@ -31,12 +31,11 @@ async def async_setup_entry( hass: HomeAssistantType, entry: ConfigEntry, async_add_entities ) -> None: """Set up the Synology NAS Sensor.""" - name = entry.data[CONF_NAME] api = hass.data[DOMAIN][entry.unique_id] sensors = [ - SynoNasUtilSensor(api, name, sensor_type, UTILISATION_SENSORS[sensor_type]) + SynoNasUtilSensor(api, sensor_type, UTILISATION_SENSORS[sensor_type]) for sensor_type in UTILISATION_SENSORS ] @@ -45,7 +44,7 @@ async def async_setup_entry( for volume in entry.data.get(CONF_VOLUMES, api.storage.volumes_ids): sensors += [ SynoNasStorageSensor( - api, name, sensor_type, STORAGE_VOL_SENSORS[sensor_type], volume + api, sensor_type, STORAGE_VOL_SENSORS[sensor_type], volume ) for sensor_type in STORAGE_VOL_SENSORS ] @@ -55,7 +54,7 @@ async def async_setup_entry( for disk in entry.data.get(CONF_DISKS, api.storage.disks_ids): sensors += [ SynoNasStorageSensor( - api, name, sensor_type, STORAGE_DISK_SENSORS[sensor_type], disk + api, sensor_type, STORAGE_DISK_SENSORS[sensor_type], disk ) for sensor_type in STORAGE_DISK_SENSORS ] @@ -69,7 +68,6 @@ class SynoNasSensor(Entity): def __init__( self, api: SynoApi, - name: str, sensor_type: str, sensor_info: Dict[str, str], monitored_device: str = None, @@ -77,15 +75,15 @@ class SynoNasSensor(Entity): """Initialize the sensor.""" self._api = api self.sensor_type = sensor_type - self._name = f"{name} {sensor_info[0]}" + self._name = f"{BASE_NAME} {sensor_info[0]}" self._unit = sensor_info[1] self._icon = sensor_info[2] self.monitored_device = monitored_device + self._unique_id = f"{self._api.information.serial}_{sensor_info[0]}" if self.monitored_device: - self._name = f"{self._name} ({self.monitored_device})" - - self._unique_id = f"{self._api.information.serial} {self._name}" + self._name += f" ({self.monitored_device})" + self._unique_id += f"_{self.monitored_device}" self._unsub_dispatcher = None diff --git a/homeassistant/components/synology_dsm/strings.json b/homeassistant/components/synology_dsm/strings.json index b9ccf8d10102..77bd1250033b 100644 --- a/homeassistant/components/synology_dsm/strings.json +++ b/homeassistant/components/synology_dsm/strings.json @@ -1,18 +1,29 @@ { "config": { "title": "Synology DSM", + "flow_title": "Synology DSM {name} ({host})", "step": { "user": { "title": "Synology DSM", "data": { - "name": "Name", "host": "Host", - "port": "Port", + "port": "Port (Optional)", "ssl": "Use SSL/TLS to connect to your NAS", "api_version": "DSM version", "username": "Username", "password": "Password" } + }, + "link": { + "title": "Synology DSM", + "description": "Do you want to setup {name} ({host})?", + "data": { + "ssl": "Use SSL/TLS to connect to your NAS", + "api_version": "DSM version", + "username": "Username", + "password": "Password", + "port": "Port (Optional)" + } } }, "error": { diff --git a/homeassistant/generated/ssdp.py b/homeassistant/generated/ssdp.py index c9832ea2d862..4aa8eabe9d93 100644 --- a/homeassistant/generated/ssdp.py +++ b/homeassistant/generated/ssdp.py @@ -70,6 +70,12 @@ SSDP = { "st": "urn:schemas-upnp-org:device:ZonePlayer:1" } ], + "synology_dsm": [ + { + "deviceType": "urn:schemas-upnp-org:device:Basic:1", + "manufacturer": "Synology" + } + ], "wemo": [ { "manufacturer": "Belkin International Inc." diff --git a/tests/components/synology_dsm/test_config_flow.py b/tests/components/synology_dsm/test_config_flow.py index 664ffda7f8ea..27ae28aa50ea 100644 --- a/tests/components/synology_dsm/test_config_flow.py +++ b/tests/components/synology_dsm/test_config_flow.py @@ -4,16 +4,16 @@ from unittest.mock import MagicMock, Mock, patch import pytest -from homeassistant import data_entry_flow +from homeassistant import data_entry_flow, setup +from homeassistant.components import ssdp from homeassistant.components.synology_dsm.const import ( CONF_VOLUMES, - DEFAULT_NAME, DEFAULT_PORT, DEFAULT_PORT_SSL, DEFAULT_SSL, DOMAIN, ) -from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_SSDP, SOURCE_USER from homeassistant.const import ( CONF_DISKS, CONF_HOST, @@ -47,10 +47,10 @@ def mock_controller_service(): with patch( "homeassistant.components.synology_dsm.config_flow.SynologyDSM" ) as service_mock: - service_mock.return_value.login = Mock(return_value=True) - service_mock.return_value.information = Mock(serial=SERIAL) - service_mock.return_value.utilisation = Mock(cpu_user_load=1) - service_mock.return_value.storage = Mock(disks_ids=[], volumes_ids=[]) + service_mock.return_value.information.serial = SERIAL + service_mock.return_value.utilisation.cpu_user_load = 1 + service_mock.return_value.storage.disks_ids = [] + service_mock.return_value.storage.volumes_ids = [] yield service_mock @@ -70,10 +70,10 @@ def mock_controller_service_failed(): with patch( "homeassistant.components.synology_dsm.config_flow.SynologyDSM" ) as service_mock: - service_mock.return_value.login = Mock(return_value=True) - service_mock.return_value.information = Mock(serial=None) - service_mock.return_value.utilisation = Mock(cpu_user_load=None) - service_mock.return_value.storage = Mock(disks_ids=None, volumes_ids=None) + service_mock.return_value.information.serial = None + service_mock.return_value.utilisation.cpu_user_load = None + service_mock.return_value.storage.disks_ids = None + service_mock.return_value.storage.volumes_ids = None yield service_mock @@ -90,7 +90,6 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): DOMAIN, context={"source": SOURCE_USER}, data={ - CONF_NAME: NAME, CONF_HOST: HOST, CONF_PORT: PORT, CONF_SSL: SSL, @@ -101,7 +100,6 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["result"].unique_id == SERIAL assert result["title"] == HOST - assert result["data"][CONF_NAME] == NAME assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == PORT assert result["data"][CONF_SSL] == SSL @@ -110,7 +108,7 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): assert result["data"].get(CONF_DISKS) is None assert result["data"].get(CONF_VOLUMES) is None - service.return_value.information = Mock(serial=SERIAL_2) + service.return_value.information.serial = SERIAL_2 # test without port + False SSL result = await hass.config_entries.flow.async_init( DOMAIN, @@ -126,7 +124,6 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["result"].unique_id == SERIAL_2 assert result["title"] == HOST - assert result["data"][CONF_NAME] == NAME assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == DEFAULT_PORT assert not result["data"][CONF_SSL] @@ -147,7 +144,6 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["result"].unique_id == SERIAL assert result["title"] == HOST - assert result["data"][CONF_NAME] == DEFAULT_NAME assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == DEFAULT_PORT_SSL assert result["data"][CONF_SSL] == DEFAULT_SSL @@ -156,13 +152,12 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): assert result["data"].get(CONF_DISKS) is None assert result["data"].get(CONF_VOLUMES) is None - service.return_value.information = Mock(serial=SERIAL_2) + service.return_value.information.serial = SERIAL_2 # import with all result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_IMPORT}, data={ - CONF_NAME: NAME, CONF_HOST: HOST_2, CONF_PORT: PORT, CONF_SSL: SSL, @@ -175,7 +170,6 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["result"].unique_id == SERIAL_2 assert result["title"] == HOST_2 - assert result["data"][CONF_NAME] == NAME assert result["data"][CONF_HOST] == HOST_2 assert result["data"][CONF_PORT] == PORT assert result["data"][CONF_SSL] == SSL @@ -223,7 +217,9 @@ async def test_login_failed(hass: HomeAssistantType, service_login_failed: Magic assert result["errors"] == {CONF_USERNAME: "login"} -async def test_connection_failed(hass: HomeAssistantType, service_failed: MagicMock): +async def test_missing_data_after_login( + hass: HomeAssistantType, service_failed: MagicMock +): """Test when we have errors during connection.""" result = await hass.config_entries.flow.async_init( DOMAIN, @@ -231,4 +227,35 @@ async def test_connection_failed(hass: HomeAssistantType, service_failed: MagicM data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["errors"] == {"base": "unknown"} + assert result["errors"] == {"base": "missing_data"} + + +async def test_form_ssdp(hass: HomeAssistantType, service: MagicMock): + """Test we can setup from ssdp.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_SSDP}, + data={ + ssdp.ATTR_SSDP_LOCATION: "http://192.168.1.5:5000", + ssdp.ATTR_UPNP_FRIENDLY_NAME: "mydsm", + }, + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "link" + assert result["errors"] == {} + + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD} + ) + + assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result2["title"] == "192.168.1.5" + assert result2["data"] == { + CONF_HOST: "192.168.1.5", + CONF_PORT: DEFAULT_PORT_SSL, + CONF_PASSWORD: PASSWORD, + CONF_SSL: DEFAULT_SSL, + CONF_USERNAME: USERNAME, + } From d54ee773753443f24d4d1a5ff88d32b739bc0088 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Tue, 7 Apr 2020 13:57:51 -0500 Subject: [PATCH 207/653] Update directv remote platform tests service calls (#33793) * Update test_remote.py * Update test_remote.py --- tests/components/directv/test_remote.py | 86 ++++++------------------- 1 file changed, 19 insertions(+), 67 deletions(-) diff --git a/tests/components/directv/test_remote.py b/tests/components/directv/test_remote.py index 1e598b358928..f93d839b78cf 100644 --- a/tests/components/directv/test_remote.py +++ b/tests/components/directv/test_remote.py @@ -1,22 +1,12 @@ """The tests for the DirecTV remote platform.""" -from typing import Any, List - from asynctest import patch from homeassistant.components.remote import ( ATTR_COMMAND, - ATTR_DELAY_SECS, - ATTR_DEVICE, - ATTR_NUM_REPEATS, DOMAIN as REMOTE_DOMAIN, SERVICE_SEND_COMMAND, ) -from homeassistant.const import ( - ATTR_ENTITY_ID, - ENTITY_MATCH_ALL, - SERVICE_TURN_OFF, - SERVICE_TURN_ON, -) +from homeassistant.const import ATTR_ENTITY_ID, SERVICE_TURN_OFF, SERVICE_TURN_ON from homeassistant.helpers.typing import HomeAssistantType from tests.components.directv import setup_integration @@ -30,56 +20,6 @@ UNAVAILABLE_ENTITY_ID = f"{REMOTE_DOMAIN}.unavailable_client" # pylint: disable=redefined-outer-name -async def async_send_command( - hass: HomeAssistantType, - command: List[str], - entity_id: Any = ENTITY_MATCH_ALL, - device: str = None, - num_repeats: str = None, - delay_secs: str = None, -) -> None: - """Send a command to a device.""" - data = {ATTR_COMMAND: command} - - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - if device: - data[ATTR_DEVICE] = device - - if num_repeats: - data[ATTR_NUM_REPEATS] = num_repeats - - if delay_secs: - data[ATTR_DELAY_SECS] = delay_secs - - await hass.services.async_call(REMOTE_DOMAIN, SERVICE_SEND_COMMAND, data) - - -async def async_turn_on( - hass: HomeAssistantType, entity_id: Any = ENTITY_MATCH_ALL -) -> None: - """Turn on device.""" - data = {} - - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(REMOTE_DOMAIN, SERVICE_TURN_ON, data) - - -async def async_turn_off( - hass: HomeAssistantType, entity_id: Any = ENTITY_MATCH_ALL -) -> None: - """Turn off remote.""" - data = {} - - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(REMOTE_DOMAIN, SERVICE_TURN_OFF, data) - - async def test_setup( hass: HomeAssistantType, aioclient_mock: AiohttpClientMocker ) -> None: @@ -115,16 +55,28 @@ async def test_main_services( await setup_integration(hass, aioclient_mock) with patch("directv.DIRECTV.remote") as remote_mock: - await async_turn_off(hass, MAIN_ENTITY_ID) - await hass.async_block_till_done() + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: MAIN_ENTITY_ID}, + blocking=True, + ) remote_mock.assert_called_once_with("poweroff", "0") with patch("directv.DIRECTV.remote") as remote_mock: - await async_turn_on(hass, MAIN_ENTITY_ID) - await hass.async_block_till_done() + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: MAIN_ENTITY_ID}, + blocking=True, + ) remote_mock.assert_called_once_with("poweron", "0") with patch("directv.DIRECTV.remote") as remote_mock: - await async_send_command(hass, ["dash"], MAIN_ENTITY_ID) - await hass.async_block_till_done() + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_SEND_COMMAND, + {ATTR_ENTITY_ID: MAIN_ENTITY_ID, ATTR_COMMAND: ["dash"]}, + blocking=True, + ) remote_mock.assert_called_once_with("dash", "0") From 46bbe816f62e4db20057637676b26434a7441bef Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 7 Apr 2020 21:06:05 +0200 Subject: [PATCH 208/653] Remove None from dict.get(key, None) (#33794) --- homeassistant/auth/mfa_modules/notify.py | 6 ++-- homeassistant/components/abode/__init__.py | 9 ++---- .../components/acer_projector/switch.py | 2 +- .../components/alexa/capabilities.py | 2 +- .../components/anel_pwrctrl/switch.py | 2 +- .../components/bluesound/media_player.py | 32 +++++++++---------- homeassistant/components/buienradar/camera.py | 2 +- homeassistant/components/buienradar/sensor.py | 28 ++++++++-------- .../components/buienradar/weather.py | 2 +- .../components/cover/device_condition.py | 4 +-- homeassistant/components/darksky/sensor.py | 2 +- .../components/ddwrt/device_tracker.py | 6 ++-- homeassistant/components/dominos/__init__.py | 2 +- homeassistant/components/ecobee/weather.py | 2 +- homeassistant/components/ecovacs/vacuum.py | 4 +-- .../components/emulated_hue/__init__.py | 2 +- .../components/emulated_hue/hue_api.py | 2 +- homeassistant/components/flexit/climate.py | 4 +-- homeassistant/components/garadget/cover.py | 2 +- homeassistant/components/google/__init__.py | 2 +- homeassistant/components/hdmi_cec/__init__.py | 2 +- .../components/homekit/type_thermostats.py | 10 +++--- homeassistant/components/html5/notify.py | 2 +- homeassistant/components/icloud/__init__.py | 2 +- homeassistant/components/icloud/account.py | 2 +- homeassistant/components/kankun/switch.py | 4 +-- .../components/konnected/__init__.py | 6 ++-- .../components/mediaroom/media_player.py | 4 +-- homeassistant/components/nexia/climate.py | 8 ++--- homeassistant/components/pushover/notify.py | 18 +++++------ .../components/radiotherm/climate.py | 2 +- .../components/raspihats/__init__.py | 2 +- homeassistant/components/recorder/__init__.py | 2 +- homeassistant/components/rflink/__init__.py | 2 +- homeassistant/components/rflink/light.py | 2 +- homeassistant/components/sql/sensor.py | 2 +- homeassistant/components/statistics/sensor.py | 2 +- homeassistant/components/telegram/notify.py | 4 +-- homeassistant/components/toon/__init__.py | 2 +- homeassistant/components/torque/sensor.py | 3 +- homeassistant/components/zabbix/__init__.py | 4 +-- homeassistant/components/zwave/__init__.py | 2 +- homeassistant/scripts/check_config.py | 2 +- .../components/asuswrt/test_device_tracker.py | 2 +- tests/components/template/test_fan.py | 6 ++-- 45 files changed, 104 insertions(+), 110 deletions(-) diff --git a/homeassistant/auth/mfa_modules/notify.py b/homeassistant/auth/mfa_modules/notify.py index 80d0fa3f9736..d8c28409b2d1 100644 --- a/homeassistant/auth/mfa_modules/notify.py +++ b/homeassistant/auth/mfa_modules/notify.py @@ -204,7 +204,7 @@ class NotifyAuthModule(MultiFactorAuthModule): await self._async_load() assert self._user_settings is not None - notify_setting = self._user_settings.get(user_id, None) + notify_setting = self._user_settings.get(user_id) if notify_setting is None: return False @@ -222,7 +222,7 @@ class NotifyAuthModule(MultiFactorAuthModule): await self._async_load() assert self._user_settings is not None - notify_setting = self._user_settings.get(user_id, None) + notify_setting = self._user_settings.get(user_id) if notify_setting is None: raise ValueError("Cannot find user_id") @@ -246,7 +246,7 @@ class NotifyAuthModule(MultiFactorAuthModule): await self._async_load() assert self._user_settings is not None - notify_setting = self._user_settings.get(user_id, None) + notify_setting = self._user_settings.get(user_id) if notify_setting is None: _LOGGER.error("Cannot find user %s", user_id) return diff --git a/homeassistant/components/abode/__init__.py b/homeassistant/components/abode/__init__.py index 84d1d34bd786..85e05e89cc17 100644 --- a/homeassistant/components/abode/__init__.py +++ b/homeassistant/components/abode/__init__.py @@ -187,7 +187,7 @@ def setup_hass_services(hass): def trigger_automation(call): """Trigger an Abode automation.""" - entity_ids = call.data.get(ATTR_ENTITY_ID, None) + entity_ids = call.data.get(ATTR_ENTITY_ID) target_entities = [ entity_id @@ -303,7 +303,7 @@ class AbodeEntity(Entity): async def async_will_remove_from_hass(self): """Unsubscribe from Abode connection status updates.""" await self.hass.async_add_executor_job( - self._data.abode.events.remove_connection_status_callback, self.unique_id, + self._data.abode.events.remove_connection_status_callback, self.unique_id ) def _update_connection_status(self): @@ -396,10 +396,7 @@ class AbodeAutomation(AbodeEntity): @property def device_state_attributes(self): """Return the state attributes.""" - return { - ATTR_ATTRIBUTION: ATTRIBUTION, - "type": "CUE automation", - } + return {ATTR_ATTRIBUTION: ATTRIBUTION, "type": "CUE automation"} @property def unique_id(self): diff --git a/homeassistant/components/acer_projector/switch.py b/homeassistant/components/acer_projector/switch.py index b28d67562d4b..bc97a844a5ac 100644 --- a/homeassistant/components/acer_projector/switch.py +++ b/homeassistant/components/acer_projector/switch.py @@ -152,7 +152,7 @@ class AcerSwitch(SwitchDevice): self._available = False for key in self._attributes: - msg = CMD_DICT.get(key, None) + msg = CMD_DICT.get(key) if msg: awns = self._write_read_format(msg) self._attributes[key] = awns diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py index 5e1932ceb679..7451d15eb1c4 100644 --- a/homeassistant/components/alexa/capabilities.py +++ b/homeassistant/components/alexa/capabilities.py @@ -1086,7 +1086,7 @@ class AlexaPowerLevelController(AlexaCapability): if self.entity.domain == fan.DOMAIN: speed = self.entity.attributes.get(fan.ATTR_SPEED) - return PERCENTAGE_FAN_MAP.get(speed, None) + return PERCENTAGE_FAN_MAP.get(speed) return None diff --git a/homeassistant/components/anel_pwrctrl/switch.py b/homeassistant/components/anel_pwrctrl/switch.py index be6a76e3b6b8..36306f181141 100644 --- a/homeassistant/components/anel_pwrctrl/switch.py +++ b/homeassistant/components/anel_pwrctrl/switch.py @@ -30,7 +30,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up PwrCtrl devices/switches.""" - host = config.get(CONF_HOST, None) + host = config.get(CONF_HOST) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) port_recv = config.get(CONF_PORT_RECV) diff --git a/homeassistant/components/bluesound/media_player.py b/homeassistant/components/bluesound/media_player.py index 86e62adc6188..a0f1d38ba772 100644 --- a/homeassistant/components/bluesound/media_player.py +++ b/homeassistant/components/bluesound/media_player.py @@ -155,11 +155,11 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= hass, async_add_entities, discovery_info.get(CONF_HOST), - discovery_info.get(CONF_PORT, None), + discovery_info.get(CONF_PORT), ) return - hosts = config.get(CONF_HOSTS, None) + hosts = config.get(CONF_HOSTS) if hosts: for host in hosts: _add_player( @@ -258,7 +258,7 @@ class BluesoundPlayer(MediaPlayerDevice): if not self._icon: self._icon = self._sync_status.get("@icon", self.host) - master = self._sync_status.get("master", None) + master = self._sync_status.get("master") if master is not None: self._is_master = False master_host = master.get("#text") @@ -276,7 +276,7 @@ class BluesoundPlayer(MediaPlayerDevice): else: if self._master is not None: self._master = None - slaves = self._sync_status.get("slave", None) + slaves = self._sync_status.get("slave") self._is_master = slaves is not None if on_updated_cb: @@ -404,7 +404,7 @@ class BluesoundPlayer(MediaPlayerDevice): self._last_status_update = dt_util.utcnow() self._status = xmltodict.parse(result)["status"].copy() - group_name = self._status.get("groupName", None) + group_name = self._status.get("groupName") if group_name != self._group_name: _LOGGER.debug("Group name change detected on device: %s", self.host) self._group_name = group_name @@ -555,7 +555,7 @@ class BluesoundPlayer(MediaPlayerDevice): if self.is_grouped and not self.is_master: return STATE_GROUPED - status = self._status.get("state", None) + status = self._status.get("state") if status in ("pause", "stop"): return STATE_PAUSED if status in ("stream", "play"): @@ -568,7 +568,7 @@ class BluesoundPlayer(MediaPlayerDevice): if self._status is None or (self.is_grouped and not self.is_master): return None - return self._status.get("title1", None) + return self._status.get("title1") @property def media_artist(self): @@ -579,9 +579,9 @@ class BluesoundPlayer(MediaPlayerDevice): if self.is_grouped and not self.is_master: return self._group_name - artist = self._status.get("artist", None) + artist = self._status.get("artist") if not artist: - artist = self._status.get("title2", None) + artist = self._status.get("title2") return artist @property @@ -590,9 +590,9 @@ class BluesoundPlayer(MediaPlayerDevice): if self._status is None or (self.is_grouped and not self.is_master): return None - album = self._status.get("album", None) + album = self._status.get("album") if not album: - album = self._status.get("title3", None) + album = self._status.get("title3") return album @property @@ -601,7 +601,7 @@ class BluesoundPlayer(MediaPlayerDevice): if self._status is None or (self.is_grouped and not self.is_master): return None - url = self._status.get("image", None) + url = self._status.get("image") if not url: return if url[0] == "/": @@ -619,7 +619,7 @@ class BluesoundPlayer(MediaPlayerDevice): if self._last_status_update is None or mediastate == STATE_IDLE: return None - position = self._status.get("secs", None) + position = self._status.get("secs") if position is None: return None @@ -635,7 +635,7 @@ class BluesoundPlayer(MediaPlayerDevice): if self._status is None or (self.is_grouped and not self.is_master): return None - duration = self._status.get("totlen", None) + duration = self._status.get("totlen") if duration is None: return None return float(duration) @@ -648,9 +648,9 @@ class BluesoundPlayer(MediaPlayerDevice): @property def volume_level(self): """Volume level of the media player (0..1).""" - volume = self._status.get("volume", None) + volume = self._status.get("volume") if self.is_grouped: - volume = self._sync_status.get("@volume", None) + volume = self._sync_status.get("@volume") if volume is not None: return int(volume) / 100 diff --git a/homeassistant/components/buienradar/camera.py b/homeassistant/components/buienradar/camera.py index b685bdb5c731..78c8f82d1ffd 100644 --- a/homeassistant/components/buienradar/camera.py +++ b/homeassistant/components/buienradar/camera.py @@ -128,7 +128,7 @@ class BuienradarCam(Camera): _LOG.debug("HTTP 304 - success") return True - last_modified = res.headers.get("Last-Modified", None) + last_modified = res.headers.get("Last-Modified") if last_modified: self._last_modified = last_modified diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index 235390d00135..ddaeec94228b 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -256,7 +256,7 @@ class BrSensor(Entity): """Generate a unique id using coordinates and sensor type.""" # The combination of the location, name and sensor type is unique return "{:2.6f}{:2.6f}{}".format( - coordinates[CONF_LATITUDE], coordinates[CONF_LONGITUDE], self.type, + coordinates[CONF_LATITUDE], coordinates[CONF_LONGITUDE], self.type ) @callback @@ -307,17 +307,17 @@ class BrSensor(Entity): return False if condition: - new_state = condition.get(CONDITION, None) + new_state = condition.get(CONDITION) if self.type.startswith(SYMBOL): - new_state = condition.get(EXACTNL, None) + new_state = condition.get(EXACTNL) if self.type.startswith("conditioncode"): - new_state = condition.get(CONDCODE, None) + new_state = condition.get(CONDCODE) if self.type.startswith("conditiondetailed"): - new_state = condition.get(DETAILED, None) + new_state = condition.get(DETAILED) if self.type.startswith("conditionexact"): - new_state = condition.get(EXACT, None) + new_state = condition.get(EXACT) - img = condition.get(IMAGE, None) + img = condition.get(IMAGE) if new_state != self._state or img != self._entity_picture: self._state = new_state @@ -346,20 +346,20 @@ class BrSensor(Entity): if self.type == SYMBOL or self.type.startswith(CONDITION): # update weather symbol & status text - condition = data.get(CONDITION, None) + condition = data.get(CONDITION) if condition: if self.type == SYMBOL: - new_state = condition.get(EXACTNL, None) + new_state = condition.get(EXACTNL) if self.type == CONDITION: - new_state = condition.get(CONDITION, None) + new_state = condition.get(CONDITION) if self.type == "conditioncode": - new_state = condition.get(CONDCODE, None) + new_state = condition.get(CONDCODE) if self.type == "conditiondetailed": - new_state = condition.get(DETAILED, None) + new_state = condition.get(DETAILED) if self.type == "conditionexact": - new_state = condition.get(EXACT, None) + new_state = condition.get(EXACT) - img = condition.get(IMAGE, None) + img = condition.get(IMAGE) if new_state != self._state or img != self._entity_picture: self._state = new_state diff --git a/homeassistant/components/buienradar/weather.py b/homeassistant/components/buienradar/weather.py index 32e8babde909..bd54f42fc211 100644 --- a/homeassistant/components/buienradar/weather.py +++ b/homeassistant/components/buienradar/weather.py @@ -101,7 +101,7 @@ class BrWeather(WeatherEntity): def __init__(self, data, config): """Initialise the platform with a data instance and station name.""" - self._stationname = config.get(CONF_NAME, None) + self._stationname = config.get(CONF_NAME) self._forecast = config.get(CONF_FORECAST) self._data = data diff --git a/homeassistant/components/cover/device_condition.py b/homeassistant/components/cover/device_condition.py index 7c6dc5fed722..0bcec2a6e43d 100644 --- a/homeassistant/components/cover/device_condition.py +++ b/homeassistant/components/cover/device_condition.py @@ -191,8 +191,8 @@ def async_condition_from_config( position = "current_position" if config[CONF_TYPE] == "is_tilt_position": position = "current_tilt_position" - min_pos = config.get(CONF_ABOVE, None) - max_pos = config.get(CONF_BELOW, None) + min_pos = config.get(CONF_ABOVE) + max_pos = config.get(CONF_BELOW) value_template = template.Template( # type: ignore f"{{{{ state.attributes.{position} }}}}" ) diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index 0d6814fca10d..1517f47a2d58 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -492,7 +492,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): units = "us" forecast_data = DarkSkyData( - api_key=config.get(CONF_API_KEY, None), + api_key=config.get(CONF_API_KEY), latitude=latitude, longitude=longitude, units=units, diff --git a/homeassistant/components/ddwrt/device_tracker.py b/homeassistant/components/ddwrt/device_tracker.py index bd2728d03dca..a6bdb9c527bd 100644 --- a/homeassistant/components/ddwrt/device_tracker.py +++ b/homeassistant/components/ddwrt/device_tracker.py @@ -86,7 +86,7 @@ class DdWrtDeviceScanner(DeviceScanner): if not data: return None - dhcp_leases = data.get("dhcp_leases", None) + dhcp_leases = data.get("dhcp_leases") if not dhcp_leases: return None @@ -124,9 +124,9 @@ class DdWrtDeviceScanner(DeviceScanner): self.last_results = [] if self.wireless_only: - active_clients = data.get("active_wireless", None) + active_clients = data.get("active_wireless") else: - active_clients = data.get("arp_table", None) + active_clients = data.get("arp_table") if not active_clients: return False diff --git a/homeassistant/components/dominos/__init__.py b/homeassistant/components/dominos/__init__.py index 78852fa2699a..d39773842552 100644 --- a/homeassistant/components/dominos/__init__.py +++ b/homeassistant/components/dominos/__init__.py @@ -113,7 +113,7 @@ class Dominos: def handle_order(self, call): """Handle ordering pizza.""" - entity_ids = call.data.get(ATTR_ORDER_ENTITY, None) + entity_ids = call.data.get(ATTR_ORDER_ENTITY) target_orders = [ order diff --git a/homeassistant/components/ecobee/weather.py b/homeassistant/components/ecobee/weather.py index 457d924d2fb3..a7fe8d8a0f87 100644 --- a/homeassistant/components/ecobee/weather.py +++ b/homeassistant/components/ecobee/weather.py @@ -179,7 +179,7 @@ class EcobeeWeather(WeatherEntity): """Get the latest weather data.""" await self.data.update() thermostat = self.data.ecobee.get_thermostat(self._index) - self.weather = thermostat.get("weather", None) + self.weather = thermostat.get("weather") def _process_forecast(json): diff --git a/homeassistant/components/ecovacs/vacuum.py b/homeassistant/components/ecovacs/vacuum.py index 806c0b412850..8b6115970bb8 100644 --- a/homeassistant/components/ecovacs/vacuum.py +++ b/homeassistant/components/ecovacs/vacuum.py @@ -55,7 +55,7 @@ class EcovacsVacuum(VacuumDevice): """Initialize the Ecovacs Vacuum.""" self.device = device self.device.connect_and_wait_until_ready() - if self.device.vacuum.get("nick", None) is not None: + if self.device.vacuum.get("nick") is not None: self._name = str(self.device.vacuum["nick"]) else: # In case there is no nickname defined, use the device id @@ -96,7 +96,7 @@ class EcovacsVacuum(VacuumDevice): @property def unique_id(self) -> str: """Return an unique ID.""" - return self.device.vacuum.get("did", None) + return self.device.vacuum.get("did") @property def is_on(self): diff --git a/homeassistant/components/emulated_hue/__init__.py b/homeassistant/components/emulated_hue/__init__.py index 1c37d0215a8a..da6e7acab404 100644 --- a/homeassistant/components/emulated_hue/__init__.py +++ b/homeassistant/components/emulated_hue/__init__.py @@ -230,7 +230,7 @@ class Config: self._entities_with_hidden_attr_in_config = {} for entity_id in self.entities: - hidden_value = self.entities[entity_id].get(CONF_ENTITY_HIDDEN, None) + hidden_value = self.entities[entity_id].get(CONF_ENTITY_HIDDEN) if hidden_value is not None: self._entities_with_hidden_attr_in_config[entity_id] = hidden_value diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index 06a579608985..ecb0241c724b 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -537,7 +537,7 @@ def get_entity_state(config, entity): if data[STATE_ON]: data[STATE_BRIGHTNESS] = entity.attributes.get(ATTR_BRIGHTNESS, 0) - hue_sat = entity.attributes.get(ATTR_HS_COLOR, None) + hue_sat = entity.attributes.get(ATTR_HS_COLOR) if hue_sat is not None: hue = hue_sat[0] sat = hue_sat[1] diff --git a/homeassistant/components/flexit/climate.py b/homeassistant/components/flexit/climate.py index fb031359693e..68e13abf8d1d 100644 --- a/homeassistant/components/flexit/climate.py +++ b/homeassistant/components/flexit/climate.py @@ -36,8 +36,8 @@ SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE | SUPPORT_FAN_MODE def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Flexit Platform.""" - modbus_slave = config.get(CONF_SLAVE, None) - name = config.get(CONF_NAME, None) + modbus_slave = config.get(CONF_SLAVE) + name = config.get(CONF_NAME) hub = hass.data[MODBUS_DOMAIN][config.get(CONF_HUB)] add_entities([Flexit(hub, modbus_slave, name)], True) diff --git a/homeassistant/components/garadget/cover.py b/homeassistant/components/garadget/cover.py index 5a43c3c72817..a1f324be1ff4 100644 --- a/homeassistant/components/garadget/cover.py +++ b/homeassistant/components/garadget/cover.py @@ -229,7 +229,7 @@ class GaradgetCover(CoverDevice): try: status = self._get_variable("doorStatus") _LOGGER.debug("Current Status: %s", status["status"]) - self._state = STATES_MAP.get(status["status"], None) + self._state = STATES_MAP.get(status["status"]) self.time_in_state = status["time"] self.signal = status["signal"] self.sensor = status["sensor"] diff --git a/homeassistant/components/google/__init__.py b/homeassistant/components/google/__init__.py index ec5afde0bacf..93afb43cf525 100644 --- a/homeassistant/components/google/__init__.py +++ b/homeassistant/components/google/__init__.py @@ -234,7 +234,7 @@ def setup_services(hass, hass_config, track_new_found_calendars, calendar_servic def _found_calendar(call): """Check if we know about a calendar and generate PLATFORM_DISCOVER.""" calendar = get_calendar_info(hass, call.data) - if hass.data[DATA_INDEX].get(calendar[CONF_CAL_ID], None) is not None: + if hass.data[DATA_INDEX].get(calendar[CONF_CAL_ID]) is not None: return hass.data[DATA_INDEX].update({calendar[CONF_CAL_ID]: calendar}) diff --git a/homeassistant/components/hdmi_cec/__init__.py b/homeassistant/components/hdmi_cec/__init__.py index b460020546fa..471a2dd0f46b 100644 --- a/homeassistant/components/hdmi_cec/__init__.py +++ b/homeassistant/components/hdmi_cec/__init__.py @@ -202,7 +202,7 @@ def setup(hass: HomeAssistant, base_config): if multiprocessing.cpu_count() < 2 else None ) - host = base_config[DOMAIN].get(CONF_HOST, None) + host = base_config[DOMAIN].get(CONF_HOST) display_name = base_config[DOMAIN].get(CONF_DISPLAY_NAME, DEFAULT_DISPLAY_NAME) if host: adapter = TcpAdapter(host, name=display_name, activate_source=False) diff --git a/homeassistant/components/homekit/type_thermostats.py b/homeassistant/components/homekit/type_thermostats.py index 98905e045c5a..ebb8ae3883e9 100644 --- a/homeassistant/components/homekit/type_thermostats.py +++ b/homeassistant/components/homekit/type_thermostats.py @@ -73,9 +73,7 @@ from .util import temperature_to_homekit, temperature_to_states _LOGGER = logging.getLogger(__name__) -HC_HOMEKIT_VALID_MODES_WATER_HEATER = { - "Heat": 1, -} +HC_HOMEKIT_VALID_MODES_WATER_HEATER = {"Heat": 1} UNIT_HASS_TO_HOMEKIT = {TEMP_CELSIUS: 0, TEMP_FAHRENHEIT: 1} UNIT_HOMEKIT_TO_HASS = {c: s for s, c in UNIT_HASS_TO_HOMEKIT.items()} @@ -138,7 +136,7 @@ class Thermostat(HomeAccessory): ) # Target mode characteristics - hc_modes = state.attributes.get(ATTR_HVAC_MODES, None) + hc_modes = state.attributes.get(ATTR_HVAC_MODES) if hc_modes is None: _LOGGER.error( "%s: HVAC modes not yet available. Please disable auto start for homekit.", @@ -239,7 +237,7 @@ class Thermostat(HomeAccessory): setter_callback=self.set_target_humidity, ) self.char_current_humidity = serv_thermostat.configure_char( - CHAR_CURRENT_HUMIDITY, value=50, + CHAR_CURRENT_HUMIDITY, value=50 ) def get_temperature_range(self): @@ -278,7 +276,7 @@ class Thermostat(HomeAccessory): _LOGGER.debug("%s: Set target humidity to %d", self.entity_id, value) params = {ATTR_ENTITY_ID: self.entity_id, ATTR_HUMIDITY: value} self.call_service( - DOMAIN_CLIMATE, SERVICE_SET_HUMIDITY, params, f"{value}{UNIT_PERCENTAGE}", + DOMAIN_CLIMATE, SERVICE_SET_HUMIDITY, params, f"{value}{UNIT_PERCENTAGE}" ) @debounce diff --git a/homeassistant/components/html5/notify.py b/homeassistant/components/html5/notify.py index 679968d1b8d5..6970ebbedb4e 100644 --- a/homeassistant/components/html5/notify.py +++ b/homeassistant/components/html5/notify.py @@ -335,7 +335,7 @@ class HTML5PushCallbackView(HomeAssistantView): def check_authorization_header(self, request): """Check the authorization header.""" - auth = request.headers.get(AUTHORIZATION, None) + auth = request.headers.get(AUTHORIZATION) if not auth: return self.json_message( "Authorization header is expected", status_code=HTTP_UNAUTHORIZED diff --git a/homeassistant/components/icloud/__init__.py b/homeassistant/components/icloud/__init__.py index ba0f42432cca..3879d15cda88 100644 --- a/homeassistant/components/icloud/__init__.py +++ b/homeassistant/components/icloud/__init__.py @@ -186,7 +186,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool if account_identifier is None: return None - icloud_account = hass.data[DOMAIN].get(account_identifier, None) + icloud_account = hass.data[DOMAIN].get(account_identifier) if icloud_account is None: for account in hass.data[DOMAIN].values(): if account.name == account_identifier: diff --git a/homeassistant/components/icloud/account.py b/homeassistant/components/icloud/account.py index 50a3e74f78f8..e0d9a6086055 100644 --- a/homeassistant/components/icloud/account.py +++ b/homeassistant/components/icloud/account.py @@ -167,7 +167,7 @@ class IcloudAccount: ): continue - if self._devices.get(device_id, None) is not None: + if self._devices.get(device_id) is not None: # Seen device -> updating _LOGGER.debug("Updating iCloud device: %s", device_name) self._devices[device_id].update(status) diff --git a/homeassistant/components/kankun/switch.py b/homeassistant/components/kankun/switch.py index 4f7ba5c8b060..d9f4db62572f 100644 --- a/homeassistant/components/kankun/switch.py +++ b/homeassistant/components/kankun/switch.py @@ -47,10 +47,10 @@ def setup_platform(hass, config, add_entities_callback, discovery_info=None): KankunSwitch( hass, properties.get(CONF_NAME, dev_name), - properties.get(CONF_HOST, None), + properties.get(CONF_HOST), properties.get(CONF_PORT, DEFAULT_PORT), properties.get(CONF_PATH, DEFAULT_PATH), - properties.get(CONF_USERNAME, None), + properties.get(CONF_USERNAME), properties.get(CONF_PASSWORD), ) ) diff --git a/homeassistant/components/konnected/__init__.py b/homeassistant/components/konnected/__init__.py index 8df6f7cead62..75cc3126c24a 100644 --- a/homeassistant/components/konnected/__init__.py +++ b/homeassistant/components/konnected/__init__.py @@ -245,7 +245,7 @@ async def async_setup(hass: HomeAssistant, config: dict): # hass.async_add_job to avoid a deadlock. hass.async_create_task( hass.config_entries.flow.async_init( - DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=device, + DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=device ) ) return True @@ -314,7 +314,7 @@ class KonnectedView(HomeAssistantView): hass = request.app["hass"] data = hass.data[DOMAIN] - auth = request.headers.get(AUTHORIZATION, None) + auth = request.headers.get(AUTHORIZATION) tokens = [] if hass.data[DOMAIN].get(CONF_ACCESS_TOKEN): tokens.extend([hass.data[DOMAIN][CONF_ACCESS_TOKEN]]) @@ -417,7 +417,7 @@ class KonnectedView(HomeAssistantView): zone_entity_id = zone.get(ATTR_ENTITY_ID) if zone_entity_id: resp["state"] = self.binary_value( - hass.states.get(zone_entity_id).state, zone[CONF_ACTIVATION], + hass.states.get(zone_entity_id).state, zone[CONF_ACTIVATION] ) return self.json(resp) diff --git a/homeassistant/components/mediaroom/media_player.py b/homeassistant/components/mediaroom/media_player.py index dd67cc287832..492c347959ea 100644 --- a/homeassistant/components/mediaroom/media_player.py +++ b/homeassistant/components/mediaroom/media_player.py @@ -70,7 +70,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= known_hosts = hass.data.get(DATA_MEDIAROOM) if known_hosts is None: known_hosts = hass.data[DATA_MEDIAROOM] = [] - host = config.get(CONF_HOST, None) + host = config.get(CONF_HOST) if host: async_add_entities( [ @@ -101,7 +101,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= if not config[CONF_OPTIMISTIC]: - already_installed = hass.data.get(DISCOVERY_MEDIAROOM, None) + already_installed = hass.data.get(DISCOVERY_MEDIAROOM) if not already_installed: hass.data[DISCOVERY_MEDIAROOM] = await install_mediaroom_protocol( responses_callback=callback_notify diff --git a/homeassistant/components/nexia/climate.py b/homeassistant/components/nexia/climate.py index 8af1be20b1e9..a3a747d01231 100644 --- a/homeassistant/components/nexia/climate.py +++ b/homeassistant/components/nexia/climate.py @@ -121,7 +121,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): SERVICE_SET_HUMIDIFY_SETPOINT, ) platform.async_register_entity_service( - SERVICE_SET_AIRCLEANER_MODE, SET_AIRCLEANER_SCHEMA, SERVICE_SET_AIRCLEANER_MODE, + SERVICE_SET_AIRCLEANER_MODE, SET_AIRCLEANER_SCHEMA, SERVICE_SET_AIRCLEANER_MODE ) entities = [] @@ -323,9 +323,9 @@ class NexiaZone(NexiaThermostatZoneEntity, ClimateDevice): def set_temperature(self, **kwargs): """Set target temperature.""" - new_heat_temp = kwargs.get(ATTR_TARGET_TEMP_LOW, None) - new_cool_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH, None) - set_temp = kwargs.get(ATTR_TEMPERATURE, None) + new_heat_temp = kwargs.get(ATTR_TARGET_TEMP_LOW) + new_cool_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH) + set_temp = kwargs.get(ATTR_TEMPERATURE) deadband = self._thermostat.get_deadband() cur_cool_temp = self._zone.get_cooling_setpoint() diff --git a/homeassistant/components/pushover/notify.py b/homeassistant/components/pushover/notify.py index 01d4d8fddde7..952a399157ca 100644 --- a/homeassistant/components/pushover/notify.py +++ b/homeassistant/components/pushover/notify.py @@ -58,17 +58,17 @@ class PushoverNotificationService(BaseNotificationService): # Extract params from data dict title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) data = dict(kwargs.get(ATTR_DATA) or {}) - url = data.get(ATTR_URL, None) - url_title = data.get(ATTR_URL_TITLE, None) - priority = data.get(ATTR_PRIORITY, None) - retry = data.get(ATTR_RETRY, None) - expire = data.get(ATTR_EXPIRE, None) - callback_url = data.get(ATTR_CALLBACK_URL, None) - timestamp = data.get(ATTR_TIMESTAMP, None) - sound = data.get(ATTR_SOUND, None) + url = data.get(ATTR_URL) + url_title = data.get(ATTR_URL_TITLE) + priority = data.get(ATTR_PRIORITY) + retry = data.get(ATTR_RETRY) + expire = data.get(ATTR_EXPIRE) + callback_url = data.get(ATTR_CALLBACK_URL) + timestamp = data.get(ATTR_TIMESTAMP) + sound = data.get(ATTR_SOUND) html = 1 if data.get(ATTR_HTML, False) else 0 - image = data.get(ATTR_ATTACHMENT, None) + image = data.get(ATTR_ATTACHMENT) # Check for attachment if image is not None: # Only allow attachments from whitelisted paths, check valid path diff --git a/homeassistant/components/radiotherm/climate.py b/homeassistant/components/radiotherm/climate.py index cba7a736df28..acbd6fe7e5ee 100644 --- a/homeassistant/components/radiotherm/climate.py +++ b/homeassistant/components/radiotherm/climate.py @@ -198,7 +198,7 @@ class RadioThermostat(ClimateDevice): def set_fan_mode(self, fan_mode): """Turn fan on/off.""" - code = FAN_MODE_TO_CODE.get(fan_mode, None) + code = FAN_MODE_TO_CODE.get(fan_mode) if code is not None: self.device.fmode = code diff --git a/homeassistant/components/raspihats/__init__.py b/homeassistant/components/raspihats/__init__.py index fb544d3ebcc5..e6fd3d7bb597 100644 --- a/homeassistant/components/raspihats/__init__.py +++ b/homeassistant/components/raspihats/__init__.py @@ -95,7 +95,7 @@ class I2CHatsDIScanner: state = (value >> channel) & 0x01 old_state = (old_value >> channel) & 0x01 if state != old_state: - callback = callbacks.get(channel, None) + callback = callbacks.get(channel) if callback is not None: callback(state) setattr(digital_inputs, self._OLD_VALUE, value) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index ffd377200538..56f5b53326cd 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -149,7 +149,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: db_max_retries = conf[CONF_DB_MAX_RETRIES] db_retry_wait = conf[CONF_DB_RETRY_WAIT] - db_url = conf.get(CONF_DB_URL, None) + db_url = conf.get(CONF_DB_URL) if not db_url: db_url = DEFAULT_URL.format(hass_config_path=hass.config.path(DEFAULT_DB_FILE)) diff --git a/homeassistant/components/rflink/__init__.py b/homeassistant/components/rflink/__init__.py index 76b225bd93ac..542c63f3b7ac 100644 --- a/homeassistant/components/rflink/__init__.py +++ b/homeassistant/components/rflink/__init__.py @@ -158,7 +158,7 @@ async def async_setup(hass, config): return # Lookup entities who registered this device id as device id or alias - event_id = event.get(EVENT_KEY_ID, None) + event_id = event.get(EVENT_KEY_ID) is_group_event = ( event_type == EVENT_KEY_COMMAND diff --git a/homeassistant/components/rflink/light.py b/homeassistant/components/rflink/light.py index 18650d2038e5..348fff0da9af 100644 --- a/homeassistant/components/rflink/light.py +++ b/homeassistant/components/rflink/light.py @@ -82,7 +82,7 @@ def entity_type_for_device_id(device_id): "newkaku": TYPE_HYBRID } protocol = device_id.split("_")[0] - return entity_type_mapping.get(protocol, None) + return entity_type_mapping.get(protocol) def entity_class_for_type(entity_type): diff --git a/homeassistant/components/sql/sensor.py b/homeassistant/components/sql/sensor.py index 52899c7da803..f19941ed0433 100644 --- a/homeassistant/components/sql/sensor.py +++ b/homeassistant/components/sql/sensor.py @@ -44,7 +44,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the SQL sensor platform.""" - db_url = config.get(CONF_DB_URL, None) + db_url = config.get(CONF_DB_URL) if not db_url: db_url = DEFAULT_URL.format(hass_config_path=hass.config.path(DEFAULT_DB_FILE)) diff --git a/homeassistant/components/statistics/sensor.py b/homeassistant/components/statistics/sensor.py index 0fb08a0fecb8..226d278633b4 100644 --- a/homeassistant/components/statistics/sensor.py +++ b/homeassistant/components/statistics/sensor.py @@ -69,7 +69,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= entity_id = config.get(CONF_ENTITY_ID) name = config.get(CONF_NAME) sampling_size = config.get(CONF_SAMPLING_SIZE) - max_age = config.get(CONF_MAX_AGE, None) + max_age = config.get(CONF_MAX_AGE) precision = config.get(CONF_PRECISION) async_add_entities( diff --git a/homeassistant/components/telegram/notify.py b/homeassistant/components/telegram/notify.py index ceb660d9e1df..673935d8283d 100644 --- a/homeassistant/components/telegram/notify.py +++ b/homeassistant/components/telegram/notify.py @@ -62,14 +62,14 @@ class TelegramNotificationService(BaseNotificationService): # Send a photo, video, document, or location if data is not None and ATTR_PHOTO in data: - photos = data.get(ATTR_PHOTO, None) + photos = data.get(ATTR_PHOTO) photos = photos if isinstance(photos, list) else [photos] for photo_data in photos: service_data.update(photo_data) self.hass.services.call(DOMAIN, "send_photo", service_data=service_data) return if data is not None and ATTR_VIDEO in data: - videos = data.get(ATTR_VIDEO, None) + videos = data.get(ATTR_VIDEO) videos = videos if isinstance(videos, list) else [videos] for video_data in videos: service_data.update(video_data) diff --git a/homeassistant/components/toon/__init__.py b/homeassistant/components/toon/__init__.py index 612561707b1d..b078dab898db 100644 --- a/homeassistant/components/toon/__init__.py +++ b/homeassistant/components/toon/__init__.py @@ -96,7 +96,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigType) -> bool: def update(call): """Service call to manually update the data.""" - called_display = call.data.get(CONF_DISPLAY, None) + called_display = call.data.get(CONF_DISPLAY) for toon_data in hass.data[DATA_TOON].values(): if ( called_display and called_display == toon_data.display_name diff --git a/homeassistant/components/torque/sensor.py b/homeassistant/components/torque/sensor.py index dbb650a8b48d..fd7eddbb48a0 100644 --- a/homeassistant/components/torque/sensor.py +++ b/homeassistant/components/torque/sensor.py @@ -102,8 +102,7 @@ class TorqueReceiveDataView(HomeAssistantView): for pid in names: if pid not in self.sensors: self.sensors[pid] = TorqueSensor( - ENTITY_NAME_FORMAT.format(self.vehicle, names[pid]), - units.get(pid, None), + ENTITY_NAME_FORMAT.format(self.vehicle, names[pid]), units.get(pid) ) hass.async_add_job(self.add_entities, [self.sensors[pid]]) diff --git a/homeassistant/components/zabbix/__init__.py b/homeassistant/components/zabbix/__init__.py index 0926f35af383..b6576fc6893d 100644 --- a/homeassistant/components/zabbix/__init__.py +++ b/homeassistant/components/zabbix/__init__.py @@ -46,8 +46,8 @@ def setup(hass, config): schema = "http" url = urljoin("{}://{}".format(schema, conf[CONF_HOST]), conf[CONF_PATH]) - username = conf.get(CONF_USERNAME, None) - password = conf.get(CONF_PASSWORD, None) + username = conf.get(CONF_USERNAME) + password = conf.get(CONF_PASSWORD) zapi = ZabbixAPI(url) try: diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 279cd5b8eb0d..f8149782db68 100644 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -297,7 +297,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= if discovery_info is None or DATA_NETWORK not in hass.data: return False - device = hass.data[DATA_DEVICES].get(discovery_info[const.DISCOVERY_DEVICE], None) + device = hass.data[DATA_DEVICES].get(discovery_info[const.DISCOVERY_DEVICE]) if device is None: return False diff --git a/homeassistant/scripts/check_config.py b/homeassistant/scripts/check_config.py index 25b25f41a208..627f5b9d976c 100644 --- a/homeassistant/scripts/check_config.py +++ b/homeassistant/scripts/check_config.py @@ -118,7 +118,7 @@ def run(script_args: List) -> int: if domain == ERROR_STR: continue print(" ", color(C_HEAD, domain + ":")) - dump_dict(res["components"].get(domain, None)) + dump_dict(res["components"].get(domain)) if args.secrets: flatsecret: Dict[str, str] = {} diff --git a/tests/components/asuswrt/test_device_tracker.py b/tests/components/asuswrt/test_device_tracker.py index 62e5ed891ffa..3954808aa373 100644 --- a/tests/components/asuswrt/test_device_tracker.py +++ b/tests/components/asuswrt/test_device_tracker.py @@ -33,7 +33,7 @@ async def test_network_unreachable(hass): hass, DOMAIN, {DOMAIN: {CONF_HOST: "fake_host", CONF_USERNAME: "fake_user"}} ) assert result - assert hass.data.get(DATA_ASUSWRT, None) is None + assert hass.data.get(DATA_ASUSWRT) is None async def test_get_scanner_with_password_no_pubkey(hass): diff --git a/tests/components/template/test_fan.py b/tests/components/template/test_fan.py index b6b0a87c9f26..fb02e4f32278 100644 --- a/tests/components/template/test_fan.py +++ b/tests/components/template/test_fan.py @@ -594,9 +594,9 @@ def _verify( state = hass.states.get(_TEST_FAN) attributes = state.attributes assert state.state == expected_state - assert attributes.get(ATTR_SPEED, None) == expected_speed - assert attributes.get(ATTR_OSCILLATING, None) == expected_oscillating - assert attributes.get(ATTR_DIRECTION, None) == expected_direction + assert attributes.get(ATTR_SPEED) == expected_speed + assert attributes.get(ATTR_OSCILLATING) == expected_oscillating + assert attributes.get(ATTR_DIRECTION) == expected_direction async def _register_components(hass, speed_list=None): From d95ffb3aa3e85388963432fc0177fc47b82e7a0f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 7 Apr 2020 22:42:17 +0200 Subject: [PATCH 209/653] Updated frontend to 20200407.1 (#33799) --- 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 3c6e8478c095..efd9f99b18a8 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,7 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": ["home-assistant-frontend==20200406.0"], + "requirements": ["home-assistant-frontend==20200407.1"], "dependencies": [ "api", "auth", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index c3cca9662fc5..2e14525a103a 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -12,7 +12,7 @@ cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 hass-nabucasa==0.34.0 -home-assistant-frontend==20200406.0 +home-assistant-frontend==20200407.1 importlib-metadata==1.5.0 jinja2>=2.11.1 netdisco==2.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index 4f4784f0611b..64d4727312c8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -703,7 +703,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200406.0 +home-assistant-frontend==20200407.1 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a47bdbd0f818..0adf42251665 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -281,7 +281,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200406.0 +home-assistant-frontend==20200407.1 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From d7e3b0b755b1f09ed14238ba9f78e41d1ec791fa Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 7 Apr 2020 22:45:56 +0200 Subject: [PATCH 210/653] Clean up access to config in various integrations v2 (#33763) --- homeassistant/components/anel_pwrctrl/switch.py | 8 ++++---- .../components/anthemav/media_player.py | 4 ++-- homeassistant/components/apcupsd/__init__.py | 4 ++-- .../components/apcupsd/binary_sensor.py | 2 +- homeassistant/components/apns/notify.py | 8 ++++---- homeassistant/components/aqualogic/sensor.py | 2 +- homeassistant/components/aqualogic/switch.py | 2 +- homeassistant/components/aquostv/media_player.py | 12 ++++++------ homeassistant/components/arduino/sensor.py | 2 +- homeassistant/components/arduino/switch.py | 8 ++++---- homeassistant/components/arest/binary_sensor.py | 4 ++-- homeassistant/components/arest/sensor.py | 6 +++--- homeassistant/components/arest/switch.py | 8 ++++---- homeassistant/components/arlo/__init__.py | 6 +++--- .../components/arlo/alarm_control_panel.py | 6 +++--- homeassistant/components/arlo/sensor.py | 2 +- .../components/asterisk_mbox/__init__.py | 6 +++--- homeassistant/components/aurora/binary_sensor.py | 4 ++-- homeassistant/components/baidu/tts.py | 16 ++++++++-------- .../components/bayesian/binary_sensor.py | 8 ++++---- 20 files changed, 59 insertions(+), 59 deletions(-) diff --git a/homeassistant/components/anel_pwrctrl/switch.py b/homeassistant/components/anel_pwrctrl/switch.py index 36306f181141..cc6011d9b651 100644 --- a/homeassistant/components/anel_pwrctrl/switch.py +++ b/homeassistant/components/anel_pwrctrl/switch.py @@ -31,10 +31,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up PwrCtrl devices/switches.""" host = config.get(CONF_HOST) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - port_recv = config.get(CONF_PORT_RECV) - port_send = config.get(CONF_PORT_SEND) + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + port_recv = config[CONF_PORT_RECV] + port_send = config[CONF_PORT_SEND] try: master = DeviceMaster( diff --git a/homeassistant/components/anthemav/media_player.py b/homeassistant/components/anthemav/media_player.py index 40317ef17282..434692ce6f55 100644 --- a/homeassistant/components/anthemav/media_player.py +++ b/homeassistant/components/anthemav/media_player.py @@ -53,8 +53,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up our socket to the AVR.""" - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) + host = config[CONF_HOST] + port = config[CONF_PORT] name = config.get(CONF_NAME) device = None diff --git a/homeassistant/components/apcupsd/__init__.py b/homeassistant/components/apcupsd/__init__.py index 967b5855a511..1f024bf58823 100644 --- a/homeassistant/components/apcupsd/__init__.py +++ b/homeassistant/components/apcupsd/__init__.py @@ -37,8 +37,8 @@ CONFIG_SCHEMA = vol.Schema( def setup(hass, config): """Use config values to set up a function enabling status retrieval.""" conf = config[DOMAIN] - host = conf.get(CONF_HOST) - port = conf.get(CONF_PORT) + host = conf[CONF_HOST] + port = conf[CONF_PORT] apcups_data = APCUPSdData(host, port) hass.data[DOMAIN] = apcups_data diff --git a/homeassistant/components/apcupsd/binary_sensor.py b/homeassistant/components/apcupsd/binary_sensor.py index e07f97c928c7..000e738052d7 100644 --- a/homeassistant/components/apcupsd/binary_sensor.py +++ b/homeassistant/components/apcupsd/binary_sensor.py @@ -32,7 +32,7 @@ class OnlineStatus(BinarySensorDevice): @property def name(self): """Return the name of the UPS online status sensor.""" - return self._config.get(CONF_NAME) + return self._config[CONF_NAME] @property def is_on(self): diff --git a/homeassistant/components/apns/notify.py b/homeassistant/components/apns/notify.py index 3cd43ee36ae6..59b2a7aa9fae 100644 --- a/homeassistant/components/apns/notify.py +++ b/homeassistant/components/apns/notify.py @@ -45,10 +45,10 @@ REGISTER_SERVICE_SCHEMA = vol.Schema( def get_service(hass, config, discovery_info=None): """Return push service.""" - name = config.get(CONF_NAME) - cert_file = config.get(CONF_CERTFILE) - topic = config.get(CONF_TOPIC) - sandbox = config.get(CONF_SANDBOX) + name = config[CONF_NAME] + cert_file = config[CONF_CERTFILE] + topic = config[CONF_TOPIC] + sandbox = config[CONF_SANDBOX] service = ApnsNotificationService(hass, name, topic, sandbox, cert_file) hass.services.register( diff --git a/homeassistant/components/aqualogic/sensor.py b/homeassistant/components/aqualogic/sensor.py index ce2ecb89d8f2..74a70f0b11ce 100644 --- a/homeassistant/components/aqualogic/sensor.py +++ b/homeassistant/components/aqualogic/sensor.py @@ -52,7 +52,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= sensors = [] processor = hass.data[DOMAIN] - for sensor_type in config.get(CONF_MONITORED_CONDITIONS): + for sensor_type in config[CONF_MONITORED_CONDITIONS]: sensors.append(AquaLogicSensor(processor, sensor_type)) async_add_entities(sensors) diff --git a/homeassistant/components/aqualogic/switch.py b/homeassistant/components/aqualogic/switch.py index c00510b563a2..d949175bc6e2 100644 --- a/homeassistant/components/aqualogic/switch.py +++ b/homeassistant/components/aqualogic/switch.py @@ -39,7 +39,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= switches = [] processor = hass.data[DOMAIN] - for switch_type in config.get(CONF_MONITORED_CONDITIONS): + for switch_type in config[CONF_MONITORED_CONDITIONS]: switches.append(AquaLogicSwitch(processor, switch_type)) async_add_entities(switches) diff --git a/homeassistant/components/aquostv/media_player.py b/homeassistant/components/aquostv/media_player.py index 3895dafe1fa9..d5383590868d 100644 --- a/homeassistant/components/aquostv/media_player.py +++ b/homeassistant/components/aquostv/media_player.py @@ -79,11 +79,11 @@ SOURCES = { def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Sharp Aquos TV platform.""" - name = config.get(CONF_NAME) - port = config.get(CONF_PORT) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - power_on_enabled = config.get("power_on_enabled") + name = config[CONF_NAME] + port = config[CONF_PORT] + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + power_on_enabled = config["power_on_enabled"] if discovery_info: _LOGGER.debug("%s", discovery_info) @@ -96,7 +96,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): add_entities([SharpAquosTVDevice(name, remote, power_on_enabled)]) return True - host = config.get(CONF_HOST) + host = config[CONF_HOST] remote = sharp_aquos_rc.TV(host, port, username, password, 15, 1) add_entities([SharpAquosTVDevice(name, remote, power_on_enabled)]) diff --git a/homeassistant/components/arduino/sensor.py b/homeassistant/components/arduino/sensor.py index 9178e99e0f99..8da656d217ab 100644 --- a/homeassistant/components/arduino/sensor.py +++ b/homeassistant/components/arduino/sensor.py @@ -26,7 +26,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" board = hass.data[DOMAIN] - pins = config.get(CONF_PINS) + pins = config[CONF_PINS] sensors = [] for pinnum, pin in pins.items(): diff --git a/homeassistant/components/arduino/switch.py b/homeassistant/components/arduino/switch.py index 7ce4de69f4f6..ea6f36ac7f53 100644 --- a/homeassistant/components/arduino/switch.py +++ b/homeassistant/components/arduino/switch.py @@ -33,7 +33,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Arduino platform.""" board = hass.data[DOMAIN] - pins = config.get(CONF_PINS) + pins = config[CONF_PINS] switches = [] for pinnum, pin in pins.items(): @@ -47,13 +47,13 @@ class ArduinoSwitch(SwitchDevice): def __init__(self, pin, options, board): """Initialize the Pin.""" self._pin = pin - self._name = options.get(CONF_NAME) + self._name = options[CONF_NAME] self.pin_type = CONF_TYPE self.direction = "out" - self._state = options.get(CONF_INITIAL) + self._state = options[CONF_INITIAL] - if options.get(CONF_NEGATE): + if options[CONF_NEGATE]: self.turn_on_handler = board.set_digital_out_low self.turn_off_handler = board.set_digital_out_high else: diff --git a/homeassistant/components/arest/binary_sensor.py b/homeassistant/components/arest/binary_sensor.py index 3bd0a85c6f01..d84b79f1d4c5 100644 --- a/homeassistant/components/arest/binary_sensor.py +++ b/homeassistant/components/arest/binary_sensor.py @@ -30,8 +30,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the aREST binary sensor.""" - resource = config.get(CONF_RESOURCE) - pin = config.get(CONF_PIN) + resource = config[CONF_RESOURCE] + pin = config[CONF_PIN] device_class = config.get(CONF_DEVICE_CLASS) try: diff --git a/homeassistant/components/arest/sensor.py b/homeassistant/components/arest/sensor.py index 1bb34a11693c..b118422ef8ce 100644 --- a/homeassistant/components/arest/sensor.py +++ b/homeassistant/components/arest/sensor.py @@ -51,9 +51,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the aREST sensor.""" - resource = config.get(CONF_RESOURCE) - var_conf = config.get(CONF_MONITORED_VARIABLES) - pins = config.get(CONF_PINS) + resource = config[CONF_RESOURCE] + var_conf = config[CONF_MONITORED_VARIABLES] + pins = config[CONF_PINS] try: response = requests.get(resource, timeout=10).json() diff --git a/homeassistant/components/arest/switch.py b/homeassistant/components/arest/switch.py index d3a513916273..298ac106dec6 100644 --- a/homeassistant/components/arest/switch.py +++ b/homeassistant/components/arest/switch.py @@ -40,7 +40,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the aREST switches.""" - resource = config.get(CONF_RESOURCE) + resource = config[CONF_RESOURCE] try: response = requests.get(resource, timeout=10) @@ -54,7 +54,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): return False dev = [] - pins = config.get(CONF_PINS) + pins = config[CONF_PINS] for pinnum, pin in pins.items(): dev.append( ArestSwitchPin( @@ -62,11 +62,11 @@ def setup_platform(hass, config, add_entities, discovery_info=None): config.get(CONF_NAME, response.json()[CONF_NAME]), pin.get(CONF_NAME), pinnum, - pin.get(CONF_INVERT), + pin[CONF_INVERT], ) ) - functions = config.get(CONF_FUNCTIONS) + functions = config[CONF_FUNCTIONS] for funcname, func in functions.items(): dev.append( ArestSwitchFunction( diff --git a/homeassistant/components/arlo/__init__.py b/homeassistant/components/arlo/__init__.py index 40d75d557bbd..3cc0ec607a5e 100644 --- a/homeassistant/components/arlo/__init__.py +++ b/homeassistant/components/arlo/__init__.py @@ -43,9 +43,9 @@ CONFIG_SCHEMA = vol.Schema( def setup(hass, config): """Set up an Arlo component.""" conf = config[DOMAIN] - username = conf.get(CONF_USERNAME) - password = conf.get(CONF_PASSWORD) - scan_interval = conf.get(CONF_SCAN_INTERVAL) + username = conf[CONF_USERNAME] + password = conf[CONF_PASSWORD] + scan_interval = conf[CONF_SCAN_INTERVAL] try: diff --git a/homeassistant/components/arlo/alarm_control_panel.py b/homeassistant/components/arlo/alarm_control_panel.py index 5e5597f50dab..7440db0495e7 100644 --- a/homeassistant/components/arlo/alarm_control_panel.py +++ b/homeassistant/components/arlo/alarm_control_panel.py @@ -53,9 +53,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if not arlo.base_stations: return - home_mode_name = config.get(CONF_HOME_MODE_NAME) - away_mode_name = config.get(CONF_AWAY_MODE_NAME) - night_mode_name = config.get(CONF_NIGHT_MODE_NAME) + home_mode_name = config[CONF_HOME_MODE_NAME] + away_mode_name = config[CONF_AWAY_MODE_NAME] + night_mode_name = config[CONF_NIGHT_MODE_NAME] base_stations = [] for base_station in arlo.base_stations: base_stations.append( diff --git a/homeassistant/components/arlo/sensor.py b/homeassistant/components/arlo/sensor.py index 10f8d6701089..9942ce687f43 100644 --- a/homeassistant/components/arlo/sensor.py +++ b/homeassistant/components/arlo/sensor.py @@ -51,7 +51,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): return sensors = [] - for sensor_type in config.get(CONF_MONITORED_CONDITIONS): + for sensor_type in config[CONF_MONITORED_CONDITIONS]: if sensor_type == "total_cameras": sensors.append(ArloSensor(SENSOR_TYPES[sensor_type][0], arlo, sensor_type)) else: diff --git a/homeassistant/components/asterisk_mbox/__init__.py b/homeassistant/components/asterisk_mbox/__init__.py index 1ecba9f4c8fb..ca5112673021 100644 --- a/homeassistant/components/asterisk_mbox/__init__.py +++ b/homeassistant/components/asterisk_mbox/__init__.py @@ -43,9 +43,9 @@ def setup(hass, config): """Set up for the Asterisk Voicemail box.""" conf = config.get(DOMAIN) - host = conf.get(CONF_HOST) - port = conf.get(CONF_PORT) - password = conf.get(CONF_PASSWORD) + host = conf[CONF_HOST] + port = conf[CONF_PORT] + password = conf[CONF_PASSWORD] hass.data[DOMAIN] = AsteriskData(hass, host, port, password, config) diff --git a/homeassistant/components/aurora/binary_sensor.py b/homeassistant/components/aurora/binary_sensor.py index 6963d836685a..e2f07276c6ce 100644 --- a/homeassistant/components/aurora/binary_sensor.py +++ b/homeassistant/components/aurora/binary_sensor.py @@ -41,8 +41,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): _LOGGER.error("Lat. or long. not set in Home Assistant config") return False - name = config.get(CONF_NAME) - threshold = config.get(CONF_THRESHOLD) + name = config[CONF_NAME] + threshold = config[CONF_THRESHOLD] try: aurora_data = AuroraData(hass.config.latitude, hass.config.longitude, threshold) diff --git a/homeassistant/components/baidu/tts.py b/homeassistant/components/baidu/tts.py index 4208750b7fcc..2d0857de135e 100644 --- a/homeassistant/components/baidu/tts.py +++ b/homeassistant/components/baidu/tts.py @@ -63,21 +63,21 @@ class BaiduTTSProvider(Provider): def __init__(self, hass, conf): """Init Baidu TTS service.""" self.hass = hass - self._lang = conf.get(CONF_LANG) + self._lang = conf[CONF_LANG] self._codec = "mp3" self.name = "BaiduTTS" self._app_data = { - "appid": conf.get(CONF_APP_ID), - "apikey": conf.get(CONF_API_KEY), - "secretkey": conf.get(CONF_SECRET_KEY), + "appid": conf[CONF_APP_ID], + "apikey": conf[CONF_API_KEY], + "secretkey": conf[CONF_SECRET_KEY], } self._speech_conf_data = { - _OPTIONS[CONF_PERSON]: conf.get(CONF_PERSON), - _OPTIONS[CONF_PITCH]: conf.get(CONF_PITCH), - _OPTIONS[CONF_SPEED]: conf.get(CONF_SPEED), - _OPTIONS[CONF_VOLUME]: conf.get(CONF_VOLUME), + _OPTIONS[CONF_PERSON]: conf[CONF_PERSON], + _OPTIONS[CONF_PITCH]: conf[CONF_PITCH], + _OPTIONS[CONF_SPEED]: conf[CONF_SPEED], + _OPTIONS[CONF_VOLUME]: conf[CONF_VOLUME], } @property diff --git a/homeassistant/components/bayesian/binary_sensor.py b/homeassistant/components/bayesian/binary_sensor.py index 78b30557fce2..724cb756f651 100644 --- a/homeassistant/components/bayesian/binary_sensor.py +++ b/homeassistant/components/bayesian/binary_sensor.py @@ -97,10 +97,10 @@ def update_probability(prior, prob_given_true, prob_given_false): async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Bayesian Binary sensor.""" - name = config.get(CONF_NAME) - observations = config.get(CONF_OBSERVATIONS) - prior = config.get(CONF_PRIOR) - probability_threshold = config.get(CONF_PROBABILITY_THRESHOLD) + name = config[CONF_NAME] + observations = config[CONF_OBSERVATIONS] + prior = config[CONF_PRIOR] + probability_threshold = config[CONF_PROBABILITY_THRESHOLD] device_class = config.get(CONF_DEVICE_CLASS) async_add_entities( From eae21be5b9766fbefbaa0b71a7745e6e4b77e3c5 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 7 Apr 2020 23:14:28 +0200 Subject: [PATCH 211/653] Improve string formatting v6 (#33698) --- homeassistant/components/evohome/__init__.py | 4 ++-- .../components/google_travel_time/sensor.py | 2 +- homeassistant/components/nest/config_flow.py | 2 +- homeassistant/components/nest/sensor.py | 2 +- .../components/nissan_leaf/binary_sensor.py | 4 ++-- homeassistant/components/nissan_leaf/switch.py | 2 +- .../components/nmap_tracker/device_tracker.py | 2 +- homeassistant/components/nmbs/sensor.py | 4 ++-- homeassistant/components/no_ip/__init__.py | 2 +- homeassistant/components/notion/__init__.py | 6 ++---- homeassistant/components/nut/sensor.py | 2 +- homeassistant/components/octoprint/__init__.py | 5 +++-- homeassistant/components/octoprint/sensor.py | 2 +- homeassistant/components/onvif/camera.py | 2 +- .../openalpr_cloud/image_processing.py | 2 +- .../openalpr_local/image_processing.py | 2 +- .../components/opencv/image_processing.py | 6 ++---- homeassistant/components/opengarage/cover.py | 5 +++-- .../components/openhardwaremonitor/sensor.py | 5 +++-- homeassistant/components/openuv/__init__.py | 6 +++--- homeassistant/components/openuv/config_flow.py | 12 +++++------- homeassistant/util/__init__.py | 2 +- tests/components/august/mocks.py | 9 +++------ tests/components/automation/test_litejet.py | 2 +- tests/components/emulated_hue/test_hue_api.py | 2 +- tests/components/group/test_init.py | 2 +- tests/components/hddtemp/test_sensor.py | 8 ++++---- tests/components/influxdb/test_init.py | 2 +- tests/components/litejet/test_light.py | 2 +- tests/components/litejet/test_scene.py | 2 +- tests/components/litejet/test_switch.py | 2 +- .../manual_mqtt/test_alarm_control_panel.py | 8 ++++---- tests/components/plant/test_init.py | 18 +++++++++--------- tests/components/proximity/test_init.py | 6 +++--- tests/components/rflink/test_sensor.py | 4 ++-- .../smartthings/test_binary_sensor.py | 4 ++-- tests/components/smartthings/test_sensor.py | 2 +- tests/components/tts/conftest.py | 2 +- tests/components/wunderground/test_sensor.py | 2 +- tests/components/xiaomi/test_device_tracker.py | 2 +- tests/components/yessssms/test_notify.py | 4 ++-- tests/util/test_json.py | 2 +- tests/util/test_ruamel_yaml.py | 2 +- 43 files changed, 81 insertions(+), 87 deletions(-) diff --git a/homeassistant/components/evohome/__init__.py b/homeassistant/components/evohome/__init__.py index f56c92d65722..e4d2cf00e71b 100644 --- a/homeassistant/components/evohome/__init__.py +++ b/homeassistant/components/evohome/__init__.py @@ -86,7 +86,7 @@ SET_ZONE_OVERRIDE_SCHEMA = vol.Schema( vol.Coerce(float), vol.Range(min=4.0, max=35.0) ), vol.Optional(ATTR_DURATION_UNTIL): vol.All( - cv.time_period, vol.Range(min=timedelta(days=0), max=timedelta(days=1)), + cv.time_period, vol.Range(min=timedelta(days=0), max=timedelta(days=1)) ), } ) @@ -121,7 +121,7 @@ def convert_dict(dictionary: Dict[str, Any]) -> Dict[str, Any]: """Convert a string to snake_case.""" string = re.sub(r"[\-\.\s]", "_", str(key)) return (string[0]).lower() + re.sub( - r"[A-Z]", lambda matched: "_" + matched.group(0).lower(), string[1:] + r"[A-Z]", lambda matched: f"_{matched.group(0).lower()}", string[1:] ) return { diff --git a/homeassistant/components/google_travel_time/sensor.py b/homeassistant/components/google_travel_time/sensor.py index 5e99b42b1153..098c6d2d59c9 100644 --- a/homeassistant/components/google_travel_time/sensor.py +++ b/homeassistant/components/google_travel_time/sensor.py @@ -321,7 +321,7 @@ class GoogleTravelTimeSensor(Entity): def _get_location_from_attributes(entity): """Get the lat/long string from an entities attributes.""" attr = entity.attributes - return "{},{}".format(attr.get(ATTR_LATITUDE), attr.get(ATTR_LONGITUDE)) + return f"{attr.get(ATTR_LATITUDE)},{attr.get(ATTR_LONGITUDE)}" def _resolve_zone(self, friendly_name): entities = self._hass.states.all() diff --git a/homeassistant/components/nest/config_flow.py b/homeassistant/components/nest/config_flow.py index b8fa2ad93f58..8f7a0909f339 100644 --- a/homeassistant/components/nest/config_flow.py +++ b/homeassistant/components/nest/config_flow.py @@ -100,7 +100,7 @@ class NestFlowHandler(config_entries.ConfigFlow): with async_timeout.timeout(10): tokens = await flow["convert_code"](user_input["code"]) return self._entry_from_tokens( - "Nest (via {})".format(flow["name"]), flow, tokens + f"Nest (via {flow['name']})", flow, tokens ) except asyncio.TimeoutError: diff --git a/homeassistant/components/nest/sensor.py b/homeassistant/components/nest/sensor.py index 082b5b19b5f4..f7e727e0e2db 100644 --- a/homeassistant/components/nest/sensor.py +++ b/homeassistant/components/nest/sensor.py @@ -203,6 +203,6 @@ class NestTempSensor(NestSensorDevice): if isinstance(temp, tuple): low, high = temp - self._state = "{}-{}".format(int(low), int(high)) + self._state = f"{int(low)}-{int(high)}" else: self._state = round(temp, 1) diff --git a/homeassistant/components/nissan_leaf/binary_sensor.py b/homeassistant/components/nissan_leaf/binary_sensor.py index 1ee450df87d0..786d495cc9b7 100644 --- a/homeassistant/components/nissan_leaf/binary_sensor.py +++ b/homeassistant/components/nissan_leaf/binary_sensor.py @@ -28,7 +28,7 @@ class LeafPluggedInSensor(LeafEntity, BinarySensorDevice): @property def name(self): """Sensor name.""" - return "{} {}".format(self.car.leaf.nickname, "Plug Status") + return f"{self.car.leaf.nickname} Plug Status" @property def is_on(self): @@ -49,7 +49,7 @@ class LeafChargingSensor(LeafEntity, BinarySensorDevice): @property def name(self): """Sensor name.""" - return "{} {}".format(self.car.leaf.nickname, "Charging Status") + return f"{self.car.leaf.nickname} Charging Status" @property def is_on(self): diff --git a/homeassistant/components/nissan_leaf/switch.py b/homeassistant/components/nissan_leaf/switch.py index e15d595d65b9..d95d3e4ed39c 100644 --- a/homeassistant/components/nissan_leaf/switch.py +++ b/homeassistant/components/nissan_leaf/switch.py @@ -27,7 +27,7 @@ class LeafClimateSwitch(LeafEntity, ToggleEntity): @property def name(self): """Switch name.""" - return "{} {}".format(self.car.leaf.nickname, "Climate Control") + return f"{self.car.leaf.nickname} Climate Control" def log_registration(self): """Log registration.""" diff --git a/homeassistant/components/nmap_tracker/device_tracker.py b/homeassistant/components/nmap_tracker/device_tracker.py index d41e80f17a2f..0a8c177b08cf 100644 --- a/homeassistant/components/nmap_tracker/device_tracker.py +++ b/homeassistant/components/nmap_tracker/device_tracker.py @@ -109,7 +109,7 @@ class NmapDeviceScanner(DeviceScanner): last_results = [] exclude_hosts = self.exclude if exclude_hosts: - options += " --exclude {}".format(",".join(exclude_hosts)) + options += f" --exclude {','.join(exclude_hosts)}" try: result = scanner.scan(hosts=" ".join(self.hosts), arguments=options) diff --git a/homeassistant/components/nmbs/sensor.py b/homeassistant/components/nmbs/sensor.py index 23b8bbea46b0..bdf4658434c4 100644 --- a/homeassistant/components/nmbs/sensor.py +++ b/homeassistant/components/nmbs/sensor.py @@ -159,8 +159,8 @@ class NMBSLiveBoard(Entity): next_departure = liveboard["departures"]["departure"][0] self._attrs = next_departure - self._state = "Track {} - {}".format( - next_departure["platform"], next_departure["station"] + self._state = ( + f"Track {next_departure['platform']} - {next_departure['station']}" ) diff --git a/homeassistant/components/no_ip/__init__.py b/homeassistant/components/no_ip/__init__.py index 12d0fb08ad30..9efaac79562a 100644 --- a/homeassistant/components/no_ip/__init__.py +++ b/homeassistant/components/no_ip/__init__.py @@ -83,7 +83,7 @@ async def _update_no_ip(hass, session, domain, auth_str, timeout): params = {"hostname": domain} headers = { - AUTHORIZATION: "Basic {}".format(auth_str.decode("utf-8")), + AUTHORIZATION: f"Basic {auth_str.decode('utf-8')}", USER_AGENT: HA_USER_AGENT, } diff --git a/homeassistant/components/notion/__init__.py b/homeassistant/components/notion/__init__.py index b06ba768765f..a1c54d962999 100644 --- a/homeassistant/components/notion/__init__.py +++ b/homeassistant/components/notion/__init__.py @@ -254,9 +254,7 @@ class NotionEntity(Entity): @property def name(self): """Return the name of the sensor.""" - return "{}: {}".format( - self._notion.sensors[self._sensor_id]["name"], self._name - ) + return f"{self._notion.sensors[self._sensor_id]['name']}: {self._name}" @property def should_poll(self): @@ -267,7 +265,7 @@ class NotionEntity(Entity): def unique_id(self): """Return a unique, unchanging string that represents this sensor.""" task = self._notion.tasks[self._task_id] - return "{}_{}".format(self._sensor_id, task["task_type"]) + return f"{self._sensor_id}_{task['task_type']}" async def _update_bridge_id(self): """Update the entity's bridge ID if it has changed. diff --git a/homeassistant/components/nut/sensor.py b/homeassistant/components/nut/sensor.py index a611c8d4268d..f6e809d52806 100644 --- a/homeassistant/components/nut/sensor.py +++ b/homeassistant/components/nut/sensor.py @@ -122,7 +122,7 @@ class NUTSensor(Entity): self._firmware = firmware self._model = model self._device_name = name - self._name = "{} {}".format(name, SENSOR_TYPES[sensor_type][0]) + self._name = f"{name} {SENSOR_TYPES[sensor_type][0]}" self._unit = SENSOR_TYPES[sensor_type][1] self._state = None self._unique_id = unique_id diff --git a/homeassistant/components/octoprint/__init__.py b/homeassistant/components/octoprint/__init__.py index dba7e656aff0..9e8f1dff6c65 100644 --- a/homeassistant/components/octoprint/__init__.py +++ b/homeassistant/components/octoprint/__init__.py @@ -145,8 +145,9 @@ def setup(hass, config): for printer in config[DOMAIN]: name = printer[CONF_NAME] ssl = "s" if printer[CONF_SSL] else "" - base_url = "http{}://{}:{}{}api/".format( - ssl, printer[CONF_HOST], printer[CONF_PORT], printer[CONF_PATH] + base_url = ( + f"http{ssl}://{printer[CONF_HOST]}:{printer[CONF_PORT]}" + f"{printer[CONF_PATH]}api/" ) api_key = printer[CONF_API_KEY] number_of_tools = printer[CONF_NUMBER_OF_TOOLS] diff --git a/homeassistant/components/octoprint/sensor.py b/homeassistant/components/octoprint/sensor.py index 83b247c39cbb..9c488564ea95 100644 --- a/homeassistant/components/octoprint/sensor.py +++ b/homeassistant/components/octoprint/sensor.py @@ -91,7 +91,7 @@ class OctoPrintSensor(Entity): if tool is None: self._name = f"{sensor_name} {condition}" else: - self._name = "{} {} {} {}".format(sensor_name, condition, tool, "temp") + self._name = f"{sensor_name} {condition} {tool} temp" self.sensor_type = sensor_type self.api = api self._state = None diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 0c6a3bffa1bd..d623f1d879bf 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -183,7 +183,7 @@ class ONVIFHassCamera(Camera): self._port, self._username, self._password, - "{}/wsdl/".format(os.path.dirname(onvif.__file__)), + f"{os.path.dirname(onvif.__file__)}/wsdl/", transport=transport, ) diff --git a/homeassistant/components/openalpr_cloud/image_processing.py b/homeassistant/components/openalpr_cloud/image_processing.py index 13d8cf75e7cb..41a631937d78 100644 --- a/homeassistant/components/openalpr_cloud/image_processing.py +++ b/homeassistant/components/openalpr_cloud/image_processing.py @@ -86,7 +86,7 @@ class OpenAlprCloudEntity(ImageProcessingAlprEntity): if name: self._name = name else: - self._name = "OpenAlpr {}".format(split_entity_id(camera_entity)[1]) + self._name = f"OpenAlpr {split_entity_id(camera_entity)[1]}" @property def confidence(self): diff --git a/homeassistant/components/openalpr_local/image_processing.py b/homeassistant/components/openalpr_local/image_processing.py index b2e90ad5597b..c7c96b05872c 100644 --- a/homeassistant/components/openalpr_local/image_processing.py +++ b/homeassistant/components/openalpr_local/image_processing.py @@ -161,7 +161,7 @@ class OpenAlprLocalEntity(ImageProcessingAlprEntity): if name: self._name = name else: - self._name = "OpenAlpr {}".format(split_entity_id(camera_entity)[1]) + self._name = f"OpenAlpr {split_entity_id(camera_entity)[1]}" @property def confidence(self): diff --git a/homeassistant/components/opencv/image_processing.py b/homeassistant/components/opencv/image_processing.py index c2cd62237d76..f35d063de504 100644 --- a/homeassistant/components/opencv/image_processing.py +++ b/homeassistant/components/opencv/image_processing.py @@ -75,9 +75,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def _create_processor_from_config(hass, camera_entity, config): """Create an OpenCV processor from configuration.""" classifier_config = config.get(CONF_CLASSIFIER) - name = "{} {}".format( - config[CONF_NAME], split_entity_id(camera_entity)[1].replace("_", " ") - ) + name = f"{config[CONF_NAME]} {split_entity_id(camera_entity)[1].replace('_', ' ')}" processor = OpenCVImageProcessor(hass, camera_entity, name, classifier_config) @@ -132,7 +130,7 @@ class OpenCVImageProcessor(ImageProcessingEntity): if name: self._name = name else: - self._name = "OpenCV {}".format(split_entity_id(camera_entity)[1]) + self._name = f"OpenCV {split_entity_id(camera_entity)[1]}" self._classifiers = classifiers self._matches = {} self._total_matches = 0 diff --git a/homeassistant/components/opengarage/cover.py b/homeassistant/components/opengarage/cover.py index 26a69fa11afa..0bb9d7a7c5b0 100644 --- a/homeassistant/components/opengarage/cover.py +++ b/homeassistant/components/opengarage/cover.py @@ -79,8 +79,9 @@ class OpenGarageCover(CoverDevice): def __init__(self, args): """Initialize the cover.""" - self.opengarage_url = "{}://{}:{}".format( - "https" if args[CONF_SSL] else "http", args[CONF_HOST], args[CONF_PORT] + self.opengarage_url = ( + f"http{'s' if args[CONF_SSL] else ''}://" + f"{args[CONF_HOST]}:{args[CONF_PORT]}" ) self._name = args[CONF_NAME] self._device_key = args[CONF_DEVICE_KEY] diff --git a/homeassistant/components/openhardwaremonitor/sensor.py b/homeassistant/components/openhardwaremonitor/sensor.py index 0729943a7702..c0c71405ab3a 100644 --- a/homeassistant/components/openhardwaremonitor/sensor.py +++ b/homeassistant/components/openhardwaremonitor/sensor.py @@ -125,8 +125,9 @@ class OpenHardwareMonitorData: def refresh(self): """Download and parse JSON from OHM.""" - data_url = "http://{}:{}/data.json".format( - self._config.get(CONF_HOST), self._config.get(CONF_PORT) + data_url = ( + f"http://{self._config.get(CONF_HOST)}:" + f"{self._config.get(CONF_PORT)}/data.json" ) try: diff --git a/homeassistant/components/openuv/__init__.py b/homeassistant/components/openuv/__init__.py index ee8e5f0b8ee4..e6a302975a56 100644 --- a/homeassistant/components/openuv/__init__.py +++ b/homeassistant/components/openuv/__init__.py @@ -82,9 +82,9 @@ async def async_setup(hass, config): conf = config[DOMAIN] - identifier = "{}, {}".format( - conf.get(CONF_LATITUDE, hass.config.latitude), - conf.get(CONF_LONGITUDE, hass.config.longitude), + identifier = ( + f"{conf.get(CONF_LATITUDE, hass.config.latitude)}, " + f"{conf.get(CONF_LONGITUDE, hass.config.longitude)}" ) if identifier in configured_instances(hass): return True diff --git a/homeassistant/components/openuv/config_flow.py b/homeassistant/components/openuv/config_flow.py index aa6e58d60362..821c9624c587 100644 --- a/homeassistant/components/openuv/config_flow.py +++ b/homeassistant/components/openuv/config_flow.py @@ -20,10 +20,8 @@ from .const import DOMAIN def configured_instances(hass): """Return a set of configured OpenUV instances.""" return { - "{}, {}".format( - entry.data.get(CONF_LATITUDE, hass.config.latitude), - entry.data.get(CONF_LONGITUDE, hass.config.longitude), - ) + f"{entry.data.get(CONF_LATITUDE, hass.config.latitude)}, " + f"{entry.data.get(CONF_LONGITUDE, hass.config.longitude)}" for entry in hass.config_entries.async_entries(DOMAIN) } @@ -60,9 +58,9 @@ class OpenUvFlowHandler(config_entries.ConfigFlow): if not user_input: return await self._show_form() - identifier = "{}, {}".format( - user_input.get(CONF_LATITUDE, self.hass.config.latitude), - user_input.get(CONF_LONGITUDE, self.hass.config.longitude), + identifier = ( + f"{user_input.get(CONF_LATITUDE, self.hass.config.latitude)}, " + f"{user_input.get(CONF_LONGITUDE, self.hass.config.longitude)}" ) if identifier in configured_instances(self.hass): return await self._show_form({CONF_LATITUDE: "identifier_exists"}) diff --git a/homeassistant/util/__init__.py b/homeassistant/util/__init__.py index d80f97754490..ee423a33b527 100644 --- a/homeassistant/util/__init__.py +++ b/homeassistant/util/__init__.py @@ -53,7 +53,7 @@ def repr_helper(inp: Any) -> str: """Help creating a more readable string representation of objects.""" if isinstance(inp, (dict, MappingProxyType)): return ", ".join( - repr_helper(key) + "=" + repr_helper(item) for key, item in inp.items() + f"{repr_helper(key)}={repr_helper(item)}" for key, item in inp.items() ) if isinstance(inp, datetime): return as_local(inp).isoformat() diff --git a/tests/components/august/mocks.py b/tests/components/august/mocks.py index 651a17ac80f0..62249e0fb1e9 100644 --- a/tests/components/august/mocks.py +++ b/tests/components/august/mocks.py @@ -64,10 +64,7 @@ async def _create_august_with_devices( if api_call_side_effects is None: api_call_side_effects = {} - device_data = { - "doorbells": [], - "locks": [], - } + device_data = {"doorbells": [], "locks": []} for device in devices: if isinstance(device, LockDetail): device_data["locks"].append( @@ -212,7 +209,7 @@ def _mock_august_doorbell_data(deviceid="mockdeviceid1", houseid="mockhouseid1") return { "_id": deviceid, "DeviceID": deviceid, - "name": deviceid + " Name", + "name": f"{deviceid} Name", "HouseID": houseid, "UserType": "owner", "serialNumber": "mockserial", @@ -232,7 +229,7 @@ def _mock_august_lock_data(lockid="mocklockid1", houseid="mockhouseid1"): return { "_id": lockid, "LockID": lockid, - "LockName": lockid + " Name", + "LockName": f"{lockid} Name", "HouseID": houseid, "UserType": "owner", "SerialNumber": "mockserial", diff --git a/tests/components/automation/test_litejet.py b/tests/components/automation/test_litejet.py index 710b16d1b48a..c001f417982e 100644 --- a/tests/components/automation/test_litejet.py +++ b/tests/components/automation/test_litejet.py @@ -28,7 +28,7 @@ def calls(hass): def get_switch_name(number): """Get a mock switch name.""" - return "Mock Switch #" + str(number) + return f"Mock Switch #{number}" @pytest.fixture diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index c47940e98cdc..e9925132b005 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -289,7 +289,7 @@ async def test_reachable_for_state(hass_hue, hue_client, state, is_reachable): async def test_discover_full_state(hue_client): """Test the discovery of full state.""" - result = await hue_client.get("/api/" + HUE_API_USERNAME) + result = await hue_client.get(f"/api/{HUE_API_USERNAME}") assert result.status == 200 assert "application/json" in result.headers["content-type"] diff --git a/tests/components/group/test_init.py b/tests/components/group/test_init.py index 9cc75ff39aa2..467bd1ede955 100644 --- a/tests/components/group/test_init.py +++ b/tests/components/group/test_init.py @@ -285,7 +285,7 @@ class TestComponentsGroup(unittest.TestCase): group_conf = OrderedDict() group_conf["second_group"] = { - "entities": "light.Bowl, " + test_group.entity_id, + "entities": f"light.Bowl, {test_group.entity_id}", "icon": "mdi:work", } group_conf["test_group"] = "hello.world,sensor.happy" diff --git a/tests/components/hddtemp/test_sensor.py b/tests/components/hddtemp/test_sensor.py index c5b0c2bb5621..1b6150fbc3f4 100644 --- a/tests/components/hddtemp/test_sensor.py +++ b/tests/components/hddtemp/test_sensor.py @@ -110,7 +110,7 @@ class TestHDDTempSensor(unittest.TestCase): ) assert ( state.attributes.get("friendly_name") - == "HD Temperature " + reference["device"] + == f"HD Temperature {reference['device']}" ) @patch("telnetlib.Telnet", new=TelnetMock) @@ -123,7 +123,7 @@ class TestHDDTempSensor(unittest.TestCase): reference = self.reference[state.attributes.get("device")] - assert state.attributes.get("friendly_name") == "FooBar " + reference["device"] + assert state.attributes.get("friendly_name") == f"FooBar {reference['device']}" @patch("telnetlib.Telnet", new=TelnetMock) def test_hddtemp_one_disk(self): @@ -143,7 +143,7 @@ class TestHDDTempSensor(unittest.TestCase): ) assert ( state.attributes.get("friendly_name") - == "HD Temperature " + reference["device"] + == f"HD Temperature {reference['device']}" ) @patch("telnetlib.Telnet", new=TelnetMock) @@ -179,7 +179,7 @@ class TestHDDTempSensor(unittest.TestCase): ) assert ( state.attributes.get("friendly_name") - == "HD Temperature " + reference["device"] + == f"HD Temperature {reference['device']}" ) @patch("telnetlib.Telnet", new=TelnetMock) diff --git a/tests/components/influxdb/test_init.py b/tests/components/influxdb/test_init.py index 958bcc9d9754..bdfd41eae83d 100644 --- a/tests/components/influxdb/test_init.py +++ b/tests/components/influxdb/test_init.py @@ -666,7 +666,7 @@ class TestInfluxDB(unittest.TestCase): state = mock.MagicMock( state=1, domain=comp["domain"], - entity_id=comp["domain"] + "." + comp["id"], + entity_id=f"{comp['domain']}.{comp['id']}", object_id=comp["id"], attributes={}, ) diff --git a/tests/components/litejet/test_light.py b/tests/components/litejet/test_light.py index 304487ca5028..e08bd5c27ac6 100644 --- a/tests/components/litejet/test_light.py +++ b/tests/components/litejet/test_light.py @@ -31,7 +31,7 @@ class TestLiteJetLight(unittest.TestCase): self.load_deactivated_callbacks = {} def get_load_name(number): - return "Mock Load #" + str(number) + return f"Mock Load #{number}" def on_load_activated(number, callback): self.load_activated_callbacks[number] = callback diff --git a/tests/components/litejet/test_scene.py b/tests/components/litejet/test_scene.py index 48f5559799ee..c2297af6d3f5 100644 --- a/tests/components/litejet/test_scene.py +++ b/tests/components/litejet/test_scene.py @@ -27,7 +27,7 @@ class TestLiteJetScene(unittest.TestCase): self.hass.start() def get_scene_name(number): - return "Mock Scene #" + str(number) + return f"Mock Scene #{number}" self.mock_lj = mock_pylitejet.return_value self.mock_lj.loads.return_value = range(0) diff --git a/tests/components/litejet/test_switch.py b/tests/components/litejet/test_switch.py index 1244d8d9a251..2f897045c924 100644 --- a/tests/components/litejet/test_switch.py +++ b/tests/components/litejet/test_switch.py @@ -31,7 +31,7 @@ class TestLiteJetSwitch(unittest.TestCase): self.switch_released_callbacks = {} def get_switch_name(number): - return "Mock Switch #" + str(number) + return f"Mock Switch #{number}" def on_switch_pressed(number, callback): self.switch_pressed_callbacks[number] = callback diff --git a/tests/components/manual_mqtt/test_alarm_control_panel.py b/tests/components/manual_mqtt/test_alarm_control_panel.py index 9567391e273c..1ac6bca91c4c 100644 --- a/tests/components/manual_mqtt/test_alarm_control_panel.py +++ b/tests/components/manual_mqtt/test_alarm_control_panel.py @@ -189,7 +189,7 @@ class TestAlarmControlPanelManualMqtt(unittest.TestCase): assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state - common.alarm_arm_home(self.hass, CODE + "2") + common.alarm_arm_home(self.hass, f"{CODE}2") self.hass.block_till_done() assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state @@ -342,7 +342,7 @@ class TestAlarmControlPanelManualMqtt(unittest.TestCase): assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state - common.alarm_arm_away(self.hass, CODE + "2") + common.alarm_arm_away(self.hass, f"{CODE}2") self.hass.block_till_done() assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state @@ -473,7 +473,7 @@ class TestAlarmControlPanelManualMqtt(unittest.TestCase): assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state - common.alarm_arm_night(self.hass, CODE + "2") + common.alarm_arm_night(self.hass, f"{CODE}2") self.hass.block_till_done() assert STATE_ALARM_DISARMED == self.hass.states.get(entity_id).state @@ -942,7 +942,7 @@ class TestAlarmControlPanelManualMqtt(unittest.TestCase): "platform": "manual_mqtt", "name": "test", "pending_time": 5, - "code": CODE + "2", + "code": f"{CODE}2", "disarm_after_trigger": False, "command_topic": "alarm/command", "state_topic": "alarm/state", diff --git a/tests/components/plant/test_init.py b/tests/components/plant/test_init.py index 280ad9a0efe6..5250fb0fa70e 100644 --- a/tests/components/plant/test_init.py +++ b/tests/components/plant/test_init.py @@ -99,7 +99,7 @@ class TestPlant(unittest.TestCase): self.hass, plant.DOMAIN, {plant.DOMAIN: {plant_name: GOOD_CONFIG}} ) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert 5 == state.attributes[plant.READING_MOISTURE] def test_update_states(self): @@ -113,7 +113,7 @@ class TestPlant(unittest.TestCase): ) self.hass.states.set(MOISTURE_ENTITY, 5, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"}) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert STATE_PROBLEM == state.state assert 5 == state.attributes[plant.READING_MOISTURE] @@ -130,7 +130,7 @@ class TestPlant(unittest.TestCase): MOISTURE_ENTITY, STATE_UNAVAILABLE, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"} ) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert state.state == STATE_PROBLEM assert state.attributes[plant.READING_MOISTURE] == STATE_UNAVAILABLE @@ -145,14 +145,14 @@ class TestPlant(unittest.TestCase): ) self.hass.states.set(MOISTURE_ENTITY, 42, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"}) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert state.state == STATE_OK assert state.attributes[plant.READING_MOISTURE] == 42 self.hass.states.set( MOISTURE_ENTITY, STATE_UNAVAILABLE, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"} ) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert state.state == STATE_PROBLEM assert state.attributes[plant.READING_MOISTURE] == STATE_UNAVAILABLE @@ -184,7 +184,7 @@ class TestPlant(unittest.TestCase): ) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert STATE_UNKNOWN == state.state max_brightness = state.attributes.get(plant.ATTR_MAX_BRIGHTNESS_HISTORY) assert 30 == max_brightness @@ -197,17 +197,17 @@ class TestPlant(unittest.TestCase): ) self.hass.states.set(BRIGHTNESS_ENTITY, 100, {ATTR_UNIT_OF_MEASUREMENT: "lux"}) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert STATE_PROBLEM == state.state self.hass.states.set(BRIGHTNESS_ENTITY, 600, {ATTR_UNIT_OF_MEASUREMENT: "lux"}) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert STATE_OK == state.state self.hass.states.set(BRIGHTNESS_ENTITY, 100, {ATTR_UNIT_OF_MEASUREMENT: "lux"}) self.hass.block_till_done() - state = self.hass.states.get("plant." + plant_name) + state = self.hass.states.get(f"plant.{plant_name}") assert STATE_OK == state.state diff --git a/tests/components/proximity/test_init.py b/tests/components/proximity/test_init.py index 826a73bece20..d3b6f9274e59 100644 --- a/tests/components/proximity/test_init.py +++ b/tests/components/proximity/test_init.py @@ -48,14 +48,14 @@ class TestProximity(unittest.TestCase): proximities = ["home", "work"] for prox in proximities: - state = self.hass.states.get("proximity." + prox) + state = self.hass.states.get(f"proximity.{prox}") assert state.state == "not set" assert state.attributes.get("nearest") == "not set" assert state.attributes.get("dir_of_travel") == "not set" - self.hass.states.set("proximity." + prox, "0") + self.hass.states.set(f"proximity.{prox}", "0") self.hass.block_till_done() - state = self.hass.states.get("proximity." + prox) + state = self.hass.states.get(f"proximity.{prox}") assert state.state == "0" def test_proximities_setup(self): diff --git a/tests/components/rflink/test_sensor.py b/tests/components/rflink/test_sensor.py index a4904f5bc9b5..f60b1c3584ce 100644 --- a/tests/components/rflink/test_sensor.py +++ b/tests/components/rflink/test_sensor.py @@ -181,7 +181,7 @@ async def test_race_condition(hass, monkeypatch): assert updated_sensor # test state of new sensor - new_sensor = hass.states.get(DOMAIN + ".test3") + new_sensor = hass.states.get(f"{DOMAIN}.test3") assert new_sensor assert new_sensor.state == "ok" @@ -191,6 +191,6 @@ async def test_race_condition(hass, monkeypatch): assert tmp_entity not in hass.data[DATA_ENTITY_LOOKUP][EVENT_KEY_SENSOR]["test3"] # test state of new sensor - new_sensor = hass.states.get(DOMAIN + ".test3") + new_sensor = hass.states.get(f"{DOMAIN}.test3") assert new_sensor assert new_sensor.state == "ko" diff --git a/tests/components/smartthings/test_binary_sensor.py b/tests/components/smartthings/test_binary_sensor.py index 300e2ac4b46a..b007fff7caf3 100644 --- a/tests/components/smartthings/test_binary_sensor.py +++ b/tests/components/smartthings/test_binary_sensor.py @@ -40,7 +40,7 @@ async def test_entity_state(hass, device_factory): await setup_platform(hass, BINARY_SENSOR_DOMAIN, devices=[device]) state = hass.states.get("binary_sensor.motion_sensor_1_motion") assert state.state == "off" - assert state.attributes[ATTR_FRIENDLY_NAME] == device.label + " " + Attribute.motion + assert state.attributes[ATTR_FRIENDLY_NAME] == f"{device.label} {Attribute.motion}" async def test_entity_and_device_attributes(hass, device_factory): @@ -56,7 +56,7 @@ async def test_entity_and_device_attributes(hass, device_factory): # Assert entry = entity_registry.async_get("binary_sensor.motion_sensor_1_motion") assert entry - assert entry.unique_id == device.device_id + "." + Attribute.motion + assert entry.unique_id == f"{device.device_id}.{Attribute.motion}" entry = device_registry.async_get_device({(DOMAIN, device.device_id)}, []) assert entry assert entry.name == device.label diff --git a/tests/components/smartthings/test_sensor.py b/tests/components/smartthings/test_sensor.py index f61172c3b974..6d2b73d787d8 100644 --- a/tests/components/smartthings/test_sensor.py +++ b/tests/components/smartthings/test_sensor.py @@ -84,7 +84,7 @@ async def test_entity_and_device_attributes(hass, device_factory): # Assert entry = entity_registry.async_get("sensor.sensor_1_battery") assert entry - assert entry.unique_id == f"{device.device_id}." + Attribute.battery + assert entry.unique_id == f"{device.device_id}.{Attribute.battery}" entry = device_registry.async_get_device({(DOMAIN, device.device_id)}, []) assert entry assert entry.name == device.label diff --git a/tests/components/tts/conftest.py b/tests/components/tts/conftest.py index 7f5b06b71ee2..3580880fedbc 100644 --- a/tests/components/tts/conftest.py +++ b/tests/components/tts/conftest.py @@ -15,4 +15,4 @@ def pytest_runtest_makereport(item, call): # set a report attribute for each phase of a call, which can # be "setup", "call", "teardown" - setattr(item, "rep_" + rep.when, rep) + setattr(item, f"rep_{rep.when}", rep) diff --git a/tests/components/wunderground/test_sensor.py b/tests/components/wunderground/test_sensor.py index 5f74a837cf34..a2f681f8e97a 100644 --- a/tests/components/wunderground/test_sensor.py +++ b/tests/components/wunderground/test_sensor.py @@ -138,7 +138,7 @@ async def test_invalid_data(hass, aioclient_mock): await async_setup_component(hass, "sensor", {"sensor": VALID_CONFIG}) for condition in VALID_CONFIG["monitored_conditions"]: - state = hass.states.get("sensor.pws_" + condition) + state = hass.states.get(f"sensor.pws_{condition}") assert state.state == STATE_UNKNOWN diff --git a/tests/components/xiaomi/test_device_tracker.py b/tests/components/xiaomi/test_device_tracker.py index 76788d0c3e89..5d65aee76165 100644 --- a/tests/components/xiaomi/test_device_tracker.py +++ b/tests/components/xiaomi/test_device_tracker.py @@ -70,7 +70,7 @@ def mocked_requests(*args, **kwargs): }, 200, ) - if str(args[0]).endswith("timedOut/" + URL_LIST_END) and FIRST_CALL is True: + if str(args[0]).endswith(f"timedOut/{URL_LIST_END}") and FIRST_CALL is True: FIRST_CALL = False # deliver an error when called with expired token return MockResponse({"code": "401", "msg": "Invalid token"}, 200) diff --git a/tests/components/yessssms/test_notify.py b/tests/components/yessssms/test_notify.py index f1eec4da942a..94f9c846d649 100644 --- a/tests/components/yessssms/test_notify.py +++ b/tests/components/yessssms/test_notify.py @@ -245,7 +245,7 @@ class TestNotifyYesssSMS(unittest.TestCase): # pylint: disable=protected-access self.yessssms.yesss._kontomanager, status_code=200, - text="test..." + login + "", + text=f"test...{login}", ) mock.register_uri( "POST", @@ -312,7 +312,7 @@ class TestNotifyYesssSMS(unittest.TestCase): # pylint: disable=protected-access self.yessssms.yesss._kontomanager, status_code=200, - text="test..." + login + "", + text=f"test...{login}", ) mock.register_uri( "POST", diff --git a/tests/util/test_json.py b/tests/util/test_json.py index bc93ef54a4b6..ed699c8ededc 100644 --- a/tests/util/test_json.py +++ b/tests/util/test_json.py @@ -38,7 +38,7 @@ def teardown(): def _path_for(leaf_name): - return os.path.join(TMP_DIR, leaf_name + ".json") + return os.path.join(TMP_DIR, f"{leaf_name}.json") def test_save_and_load(): diff --git a/tests/util/test_ruamel_yaml.py b/tests/util/test_ruamel_yaml.py index 79ed4a4f4d11..b4e78a883afa 100644 --- a/tests/util/test_ruamel_yaml.py +++ b/tests/util/test_ruamel_yaml.py @@ -129,7 +129,7 @@ def teardown(): def _path_for(leaf_name): - return os.path.join(TMP_DIR, leaf_name + ".yaml") + return os.path.join(TMP_DIR, f"{leaf_name}.yaml") def test_save_and_load(): From 8b5ab3221f4407cf36216a8dc1cc6979cecc02b1 Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Tue, 7 Apr 2020 18:19:31 -0500 Subject: [PATCH 212/653] Handle QVR Pro dropping connection (#33591) * Handle QVR Pro dropping connection * Update homeassistant/components/qvr_pro/camera.py Co-Authored-By: Paulus Schoutsen * Update homeassistant/components/qvr_pro/manifest.json Co-authored-by: Paulus Schoutsen --- homeassistant/components/qvr_pro/camera.py | 7 +++++++ homeassistant/components/qvr_pro/manifest.json | 2 +- requirements_all.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/qvr_pro/camera.py b/homeassistant/components/qvr_pro/camera.py index 28f607165a7e..9dd8e3c4f20b 100644 --- a/homeassistant/components/qvr_pro/camera.py +++ b/homeassistant/components/qvr_pro/camera.py @@ -90,6 +90,13 @@ class QVRProCamera(Camera): def camera_image(self): """Get image bytes from camera.""" + try: + return self._client.get_snapshot(self.guid) + + except QVRResponseError as ex: + _LOGGER.error("Error getting image: %s", ex) + self._client.connect() + return self._client.get_snapshot(self.guid) async def stream_source(self): diff --git a/homeassistant/components/qvr_pro/manifest.json b/homeassistant/components/qvr_pro/manifest.json index 5a81f1ce37ab..d6365afd213a 100644 --- a/homeassistant/components/qvr_pro/manifest.json +++ b/homeassistant/components/qvr_pro/manifest.json @@ -2,6 +2,6 @@ "domain": "qvr_pro", "name": "QVR Pro", "documentation": "https://www.home-assistant.io/integrations/qvr_pro", - "requirements": ["pyqvrpro==0.51"], + "requirements": ["pyqvrpro==0.52"], "codeowners": ["@oblogic7"] } diff --git a/requirements_all.txt b/requirements_all.txt index 64d4727312c8..7f62e9e3044c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1499,7 +1499,7 @@ pypoint==1.1.2 pyps4-2ndscreen==1.0.7 # homeassistant.components.qvr_pro -pyqvrpro==0.51 +pyqvrpro==0.52 # homeassistant.components.qwikswitch pyqwikswitch==0.93 From ad619817c6e3d129ceaf7d200c31a687b3b8ceba Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 8 Apr 2020 00:08:19 +0000 Subject: [PATCH 213/653] [ci skip] Translation update --- .../components/airly/.translations/bg.json | 1 - .../components/airly/.translations/ca.json | 1 - .../components/airly/.translations/da.json | 1 - .../components/airly/.translations/de.json | 1 - .../components/airly/.translations/en.json | 1 - .../airly/.translations/es-419.json | 1 - .../components/airly/.translations/es.json | 1 - .../components/airly/.translations/fr.json | 1 - .../components/airly/.translations/hu.json | 1 - .../components/airly/.translations/it.json | 1 - .../components/airly/.translations/ko.json | 1 - .../components/airly/.translations/lb.json | 1 - .../components/airly/.translations/nl.json | 1 - .../components/airly/.translations/no.json | 1 - .../components/airly/.translations/pl.json | 1 - .../components/airly/.translations/ru.json | 1 - .../components/airly/.translations/sl.json | 1 - .../components/airly/.translations/sv.json | 1 - .../airly/.translations/zh-Hant.json | 1 - .../airvisual/.translations/ca.json | 3 +- .../airvisual/.translations/de.json | 3 +- .../airvisual/.translations/en.json | 3 +- .../airvisual/.translations/es.json | 3 +- .../airvisual/.translations/fr.json | 3 +- .../airvisual/.translations/it.json | 3 +- .../airvisual/.translations/ko.json | 3 +- .../airvisual/.translations/lb.json | 5 +- .../airvisual/.translations/no.json | 3 +- .../airvisual/.translations/pl.json | 3 +- .../airvisual/.translations/ru.json | 3 +- .../airvisual/.translations/sl.json | 3 +- .../airvisual/.translations/zh-Hant.json | 3 +- .../ambient_station/.translations/bg.json | 1 - .../ambient_station/.translations/ca.json | 1 - .../ambient_station/.translations/da.json | 1 - .../ambient_station/.translations/de.json | 1 - .../ambient_station/.translations/en.json | 1 - .../ambient_station/.translations/es-419.json | 1 - .../ambient_station/.translations/es.json | 1 - .../ambient_station/.translations/fr.json | 1 - .../ambient_station/.translations/hu.json | 1 - .../ambient_station/.translations/it.json | 1 - .../ambient_station/.translations/ko.json | 1 - .../ambient_station/.translations/lb.json | 1 - .../ambient_station/.translations/nl.json | 1 - .../ambient_station/.translations/no.json | 1 - .../ambient_station/.translations/pl.json | 1 - .../ambient_station/.translations/pt-BR.json | 1 - .../ambient_station/.translations/pt.json | 1 - .../ambient_station/.translations/ru.json | 1 - .../ambient_station/.translations/sl.json | 1 - .../ambient_station/.translations/sv.json | 1 - .../.translations/zh-Hans.json | 1 - .../.translations/zh-Hant.json | 1 - .../components/axis/.translations/ca.json | 3 +- .../components/axis/.translations/da.json | 3 +- .../components/axis/.translations/de.json | 3 +- .../components/axis/.translations/en.json | 3 +- .../components/axis/.translations/es.json | 3 +- .../components/axis/.translations/fr.json | 3 +- .../components/axis/.translations/hu.json | 3 - .../components/axis/.translations/it.json | 3 +- .../components/axis/.translations/ko.json | 3 +- .../components/axis/.translations/lb.json | 3 +- .../components/axis/.translations/nl.json | 3 +- .../components/axis/.translations/no.json | 3 +- .../components/axis/.translations/pl.json | 3 +- .../components/axis/.translations/pt-BR.json | 3 +- .../components/axis/.translations/ru.json | 3 +- .../components/axis/.translations/sl.json | 3 +- .../components/axis/.translations/sv.json | 3 +- .../axis/.translations/zh-Hant.json | 3 +- .../binary_sensor/.translations/bg.json | 2 - .../binary_sensor/.translations/ca.json | 2 - .../binary_sensor/.translations/da.json | 2 - .../binary_sensor/.translations/de.json | 2 - .../binary_sensor/.translations/en.json | 2 - .../binary_sensor/.translations/es-419.json | 2 - .../binary_sensor/.translations/es.json | 2 - .../binary_sensor/.translations/fr.json | 2 - .../binary_sensor/.translations/hu.json | 2 - .../binary_sensor/.translations/it.json | 2 - .../binary_sensor/.translations/ko.json | 2 - .../binary_sensor/.translations/lb.json | 2 - .../binary_sensor/.translations/nl.json | 2 - .../binary_sensor/.translations/no.json | 2 - .../binary_sensor/.translations/pl.json | 2 - .../binary_sensor/.translations/pt.json | 1 - .../binary_sensor/.translations/ru.json | 2 - .../binary_sensor/.translations/sl.json | 2 - .../binary_sensor/.translations/sv.json | 2 - .../binary_sensor/.translations/zh-Hans.json | 1 - .../binary_sensor/.translations/zh-Hant.json | 2 - .../cert_expiry/.translations/bg.json | 9 +-- .../cert_expiry/.translations/ca.json | 7 +- .../cert_expiry/.translations/da.json | 9 +-- .../cert_expiry/.translations/de.json | 7 +- .../cert_expiry/.translations/en.json | 7 +- .../cert_expiry/.translations/es-419.json | 9 +-- .../cert_expiry/.translations/es.json | 7 +- .../cert_expiry/.translations/fr.json | 7 +- .../cert_expiry/.translations/it.json | 7 +- .../cert_expiry/.translations/ko.json | 7 +- .../cert_expiry/.translations/lb.json | 7 +- .../cert_expiry/.translations/nl.json | 9 +-- .../cert_expiry/.translations/no.json | 7 +- .../cert_expiry/.translations/pl.json | 7 +- .../cert_expiry/.translations/pt-BR.json | 5 -- .../cert_expiry/.translations/ru.json | 7 +- .../cert_expiry/.translations/sl.json | 7 +- .../cert_expiry/.translations/sv.json | 9 +-- .../cert_expiry/.translations/zh-Hant.json | 7 +- .../components/cover/.translations/lb.json | 4 +- .../components/deconz/.translations/bg.json | 18 ----- .../components/deconz/.translations/ca.json | 18 ----- .../components/deconz/.translations/cs.json | 7 -- .../components/deconz/.translations/da.json | 18 ----- .../components/deconz/.translations/de.json | 18 ----- .../components/deconz/.translations/en.json | 18 ----- .../deconz/.translations/es-419.json | 22 ------ .../components/deconz/.translations/es.json | 18 ----- .../components/deconz/.translations/fr.json | 18 ----- .../components/deconz/.translations/he.json | 7 -- .../components/deconz/.translations/hr.json | 5 -- .../components/deconz/.translations/hu.json | 17 ----- .../components/deconz/.translations/id.json | 7 -- .../components/deconz/.translations/it.json | 18 ----- .../components/deconz/.translations/ko.json | 18 ----- .../components/deconz/.translations/lb.json | 18 ----- .../components/deconz/.translations/nl.json | 18 ----- .../components/deconz/.translations/nn.json | 7 -- .../components/deconz/.translations/no.json | 18 ----- .../components/deconz/.translations/pl.json | 18 ----- .../deconz/.translations/pt-BR.json | 22 ------ .../components/deconz/.translations/pt.json | 7 -- .../components/deconz/.translations/ru.json | 18 ----- .../components/deconz/.translations/sl.json | 18 ----- .../components/deconz/.translations/sv.json | 18 ----- .../components/deconz/.translations/vi.json | 7 -- .../deconz/.translations/zh-Hans.json | 7 -- .../deconz/.translations/zh-Hant.json | 18 ----- .../components/directv/.translations/ca.json | 3 +- .../components/directv/.translations/de.json | 3 +- .../components/directv/.translations/en.json | 3 +- .../components/directv/.translations/es.json | 3 +- .../components/directv/.translations/fr.json | 3 +- .../components/directv/.translations/it.json | 3 +- .../components/directv/.translations/ko.json | 3 +- .../components/directv/.translations/lb.json | 7 +- .../components/directv/.translations/no.json | 3 +- .../components/directv/.translations/pl.json | 7 +- .../components/directv/.translations/ru.json | 3 +- .../components/directv/.translations/sl.json | 3 +- .../directv/.translations/zh-Hant.json | 3 +- .../flunearyou/.translations/lb.json | 1 + .../geonetnz_quakes/.translations/bg.json | 3 - .../geonetnz_quakes/.translations/ca.json | 3 - .../geonetnz_quakes/.translations/da.json | 3 - .../geonetnz_quakes/.translations/de.json | 3 - .../geonetnz_quakes/.translations/en.json | 3 - .../geonetnz_quakes/.translations/es.json | 3 - .../geonetnz_quakes/.translations/fr.json | 3 - .../geonetnz_quakes/.translations/it.json | 3 - .../geonetnz_quakes/.translations/ko.json | 3 - .../geonetnz_quakes/.translations/lb.json | 3 - .../geonetnz_quakes/.translations/nl.json | 3 - .../geonetnz_quakes/.translations/no.json | 3 - .../geonetnz_quakes/.translations/pl.json | 3 - .../geonetnz_quakes/.translations/pt-BR.json | 3 - .../geonetnz_quakes/.translations/ru.json | 3 - .../geonetnz_quakes/.translations/sl.json | 3 - .../geonetnz_quakes/.translations/sv.json | 3 - .../.translations/zh-Hant.json | 3 - .../components/harmony/.translations/ca.json | 1 - .../components/harmony/.translations/de.json | 1 - .../components/harmony/.translations/en.json | 1 - .../components/harmony/.translations/es.json | 1 - .../components/harmony/.translations/fr.json | 1 - .../components/harmony/.translations/it.json | 1 - .../components/harmony/.translations/ko.json | 1 - .../components/harmony/.translations/lb.json | 1 - .../components/harmony/.translations/no.json | 1 - .../components/harmony/.translations/pl.json | 1 - .../components/harmony/.translations/ru.json | 1 - .../harmony/.translations/zh-Hant.json | 1 - .../components/heos/.translations/pl.json | 2 +- .../huawei_lte/.translations/lb.json | 2 +- .../components/ipp/.translations/ca.json | 3 +- .../components/ipp/.translations/en.json | 3 +- .../konnected/.translations/ca.json | 1 + .../konnected/.translations/lb.json | 2 +- .../components/melcloud/.translations/pl.json | 2 +- .../minecraft_server/.translations/ca.json | 3 +- .../minecraft_server/.translations/da.json | 3 +- .../minecraft_server/.translations/de.json | 3 +- .../minecraft_server/.translations/en.json | 3 +- .../minecraft_server/.translations/es.json | 3 +- .../minecraft_server/.translations/fr.json | 3 +- .../minecraft_server/.translations/hu.json | 3 +- .../minecraft_server/.translations/it.json | 3 +- .../minecraft_server/.translations/ko.json | 3 +- .../minecraft_server/.translations/lb.json | 3 +- .../minecraft_server/.translations/lv.json | 3 +- .../minecraft_server/.translations/nl.json | 3 +- .../minecraft_server/.translations/no.json | 3 +- .../minecraft_server/.translations/pl.json | 3 +- .../minecraft_server/.translations/ru.json | 3 +- .../minecraft_server/.translations/sl.json | 3 +- .../minecraft_server/.translations/sv.json | 3 +- .../minecraft_server/.translations/tr.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../components/notion/.translations/bg.json | 1 - .../components/notion/.translations/ca.json | 1 - .../components/notion/.translations/da.json | 1 - .../components/notion/.translations/de.json | 1 - .../components/notion/.translations/en.json | 1 - .../notion/.translations/es-419.json | 1 - .../components/notion/.translations/es.json | 1 - .../components/notion/.translations/fr.json | 1 - .../components/notion/.translations/hr.json | 1 - .../components/notion/.translations/hu.json | 1 - .../components/notion/.translations/it.json | 1 - .../components/notion/.translations/ko.json | 1 - .../components/notion/.translations/lb.json | 1 - .../components/notion/.translations/nl.json | 1 - .../components/notion/.translations/no.json | 1 - .../components/notion/.translations/pl.json | 1 - .../notion/.translations/pt-BR.json | 1 - .../components/notion/.translations/ru.json | 1 - .../components/notion/.translations/sl.json | 1 - .../components/notion/.translations/sv.json | 1 - .../notion/.translations/zh-Hans.json | 1 - .../notion/.translations/zh-Hant.json | 1 - .../components/nut/.translations/pl.json | 37 ++++++++++ .../opentherm_gw/.translations/bg.json | 4 +- .../opentherm_gw/.translations/ca.json | 4 +- .../opentherm_gw/.translations/da.json | 4 +- .../opentherm_gw/.translations/de.json | 4 +- .../opentherm_gw/.translations/en.json | 4 +- .../opentherm_gw/.translations/es.json | 4 +- .../opentherm_gw/.translations/fr.json | 4 +- .../opentherm_gw/.translations/hu.json | 4 +- .../opentherm_gw/.translations/it.json | 4 +- .../opentherm_gw/.translations/ko.json | 4 +- .../opentherm_gw/.translations/lb.json | 4 +- .../opentherm_gw/.translations/nl.json | 4 +- .../opentherm_gw/.translations/no.json | 4 +- .../opentherm_gw/.translations/pl.json | 4 +- .../opentherm_gw/.translations/ru.json | 4 +- .../opentherm_gw/.translations/sl.json | 4 +- .../opentherm_gw/.translations/sv.json | 4 +- .../opentherm_gw/.translations/zh-Hant.json | 4 +- .../components/plex/.translations/bg.json | 21 ------ .../components/plex/.translations/ca.json | 21 ------ .../components/plex/.translations/cs.json | 3 - .../components/plex/.translations/da.json | 21 ------ .../components/plex/.translations/de.json | 21 ------ .../components/plex/.translations/en.json | 21 ------ .../components/plex/.translations/es-419.json | 21 ------ .../components/plex/.translations/es.json | 21 ------ .../components/plex/.translations/fr.json | 21 ------ .../components/plex/.translations/hu.json | 15 ---- .../components/plex/.translations/it.json | 21 ------ .../components/plex/.translations/ko.json | 21 ------ .../components/plex/.translations/lb.json | 21 ------ .../components/plex/.translations/lv.json | 8 --- .../components/plex/.translations/nl.json | 21 ------ .../components/plex/.translations/no.json | 21 ------ .../components/plex/.translations/pl.json | 21 ------ .../components/plex/.translations/pt-BR.json | 1 - .../components/plex/.translations/ru.json | 21 ------ .../components/plex/.translations/sl.json | 21 ------ .../components/plex/.translations/sv.json | 21 ------ .../plex/.translations/zh-Hant.json | 21 ------ .../components/rachio/.translations/pl.json | 2 +- .../components/roku/.translations/ca.json | 3 +- .../components/roku/.translations/de.json | 3 +- .../components/roku/.translations/en.json | 3 +- .../components/roku/.translations/es.json | 3 +- .../components/roku/.translations/fr.json | 3 +- .../components/roku/.translations/it.json | 3 +- .../components/roku/.translations/ko.json | 3 +- .../components/roku/.translations/lb.json | 3 +- .../components/roku/.translations/no.json | 3 +- .../components/roku/.translations/pl.json | 3 +- .../components/roku/.translations/ru.json | 3 +- .../components/roku/.translations/sl.json | 3 +- .../roku/.translations/zh-Hant.json | 3 +- .../samsungtv/.translations/ca.json | 1 - .../samsungtv/.translations/da.json | 1 - .../samsungtv/.translations/de.json | 1 - .../samsungtv/.translations/en.json | 1 - .../samsungtv/.translations/es.json | 1 - .../samsungtv/.translations/fr.json | 1 - .../samsungtv/.translations/hu.json | 1 - .../samsungtv/.translations/it.json | 1 - .../samsungtv/.translations/ko.json | 1 - .../samsungtv/.translations/lb.json | 1 - .../samsungtv/.translations/nl.json | 1 - .../samsungtv/.translations/no.json | 1 - .../samsungtv/.translations/pl.json | 1 - .../samsungtv/.translations/ru.json | 1 - .../samsungtv/.translations/sl.json | 1 - .../samsungtv/.translations/sv.json | 1 - .../samsungtv/.translations/tr.json | 1 - .../samsungtv/.translations/zh-Hant.json | 1 - .../components/sensor/.translations/lb.json | 36 +++++----- .../simplisafe/.translations/bg.json | 1 - .../simplisafe/.translations/ca.json | 1 - .../simplisafe/.translations/cs.json | 1 - .../simplisafe/.translations/da.json | 1 - .../simplisafe/.translations/de.json | 1 - .../simplisafe/.translations/en.json | 1 - .../simplisafe/.translations/es-419.json | 1 - .../simplisafe/.translations/es.json | 1 - .../simplisafe/.translations/fr.json | 1 - .../simplisafe/.translations/it.json | 1 - .../simplisafe/.translations/ko.json | 1 - .../simplisafe/.translations/lb.json | 1 - .../simplisafe/.translations/nl.json | 1 - .../simplisafe/.translations/no.json | 1 - .../simplisafe/.translations/pl.json | 1 - .../simplisafe/.translations/pt-BR.json | 1 - .../simplisafe/.translations/pt.json | 1 - .../simplisafe/.translations/ro.json | 1 - .../simplisafe/.translations/ru.json | 1 - .../simplisafe/.translations/sl.json | 1 - .../simplisafe/.translations/sv.json | 1 - .../simplisafe/.translations/uk.json | 1 - .../simplisafe/.translations/zh-Hans.json | 1 - .../simplisafe/.translations/zh-Hant.json | 1 - .../components/switch/.translations/bg.json | 4 +- .../components/switch/.translations/ca.json | 4 +- .../components/switch/.translations/da.json | 4 +- .../components/switch/.translations/de.json | 4 +- .../components/switch/.translations/en.json | 4 +- .../switch/.translations/es-419.json | 4 +- .../components/switch/.translations/es.json | 4 +- .../components/switch/.translations/fr.json | 4 +- .../components/switch/.translations/hu.json | 4 +- .../components/switch/.translations/it.json | 4 +- .../components/switch/.translations/ko.json | 4 +- .../components/switch/.translations/lb.json | 4 +- .../components/switch/.translations/lv.json | 4 -- .../components/switch/.translations/nl.json | 4 +- .../components/switch/.translations/no.json | 4 +- .../components/switch/.translations/pl.json | 4 +- .../components/switch/.translations/ru.json | 4 +- .../components/switch/.translations/sl.json | 4 +- .../components/switch/.translations/sv.json | 4 +- .../switch/.translations/zh-Hant.json | 4 +- .../synology_dsm/.translations/ca.json | 3 +- .../synology_dsm/.translations/da.json | 9 ++- .../synology_dsm/.translations/en.json | 71 ++++++++++--------- .../synology_dsm/.translations/es.json | 4 +- .../synology_dsm/.translations/lb.json | 26 +++++++ .../synology_dsm/.translations/nl.json | 37 ++++++++++ .../transmission/.translations/bg.json | 10 +-- .../transmission/.translations/ca.json | 10 +-- .../transmission/.translations/da.json | 10 +-- .../transmission/.translations/de.json | 10 +-- .../transmission/.translations/en.json | 10 +-- .../transmission/.translations/es.json | 10 +-- .../transmission/.translations/fr.json | 10 +-- .../transmission/.translations/hu.json | 9 --- .../transmission/.translations/it.json | 10 +-- .../transmission/.translations/ko.json | 10 +-- .../transmission/.translations/lb.json | 10 +-- .../transmission/.translations/nl.json | 10 +-- .../transmission/.translations/no.json | 10 +-- .../transmission/.translations/pl.json | 10 +-- .../transmission/.translations/pt-BR.json | 10 +-- .../transmission/.translations/ru.json | 10 +-- .../transmission/.translations/sl.json | 10 +-- .../transmission/.translations/sv.json | 10 +-- .../transmission/.translations/zh-Hant.json | 10 +-- .../components/unifi/.translations/lb.json | 5 +- .../components/vilfo/.translations/pl.json | 2 +- .../components/vizio/.translations/ca.json | 28 +------- .../components/vizio/.translations/da.json | 12 +--- .../components/vizio/.translations/de.json | 28 +------- .../components/vizio/.translations/en.json | 28 +------- .../components/vizio/.translations/es.json | 28 +------- .../components/vizio/.translations/fr.json | 26 +------ .../components/vizio/.translations/hu.json | 12 +--- .../components/vizio/.translations/it.json | 28 +------- .../components/vizio/.translations/ko.json | 28 +------- .../components/vizio/.translations/lb.json | 32 ++------- .../components/vizio/.translations/nl.json | 12 +--- .../components/vizio/.translations/no.json | 28 +------- .../components/vizio/.translations/pl.json | 28 +------- .../components/vizio/.translations/ru.json | 28 +------- .../components/vizio/.translations/sl.json | 28 +------- .../components/vizio/.translations/sv.json | 12 +--- .../vizio/.translations/zh-Hant.json | 28 +------- .../components/withings/.translations/bg.json | 10 --- .../components/withings/.translations/ca.json | 10 +-- .../components/withings/.translations/da.json | 10 +-- .../components/withings/.translations/de.json | 10 +-- .../components/withings/.translations/en.json | 10 +-- .../withings/.translations/es-419.json | 11 --- .../components/withings/.translations/es.json | 10 +-- .../components/withings/.translations/fr.json | 10 +-- .../components/withings/.translations/hu.json | 10 +-- .../components/withings/.translations/it.json | 10 +-- .../components/withings/.translations/ko.json | 10 +-- .../components/withings/.translations/lb.json | 10 +-- .../components/withings/.translations/lv.json | 8 --- .../components/withings/.translations/nl.json | 10 +-- .../components/withings/.translations/no.json | 10 +-- .../components/withings/.translations/pl.json | 10 +-- .../components/withings/.translations/ru.json | 10 +-- .../components/withings/.translations/sl.json | 10 +-- .../components/withings/.translations/sv.json | 10 +-- .../withings/.translations/zh-Hant.json | 10 +-- .../components/wwlln/.translations/bg.json | 3 - .../components/wwlln/.translations/ca.json | 6 +- .../components/wwlln/.translations/cy.json | 3 - .../components/wwlln/.translations/da.json | 3 - .../components/wwlln/.translations/de.json | 6 +- .../components/wwlln/.translations/en.json | 6 +- .../wwlln/.translations/es-419.json | 3 - .../components/wwlln/.translations/es.json | 6 +- .../components/wwlln/.translations/fr.json | 6 +- .../components/wwlln/.translations/hr.json | 3 - .../components/wwlln/.translations/it.json | 6 +- .../components/wwlln/.translations/ko.json | 6 +- .../components/wwlln/.translations/lb.json | 6 +- .../components/wwlln/.translations/nl.json | 3 - .../components/wwlln/.translations/no.json | 6 +- .../components/wwlln/.translations/pl.json | 6 +- .../components/wwlln/.translations/pt-BR.json | 3 - .../components/wwlln/.translations/ru.json | 3 - .../components/wwlln/.translations/sl.json | 6 +- .../components/wwlln/.translations/sv.json | 3 - .../wwlln/.translations/zh-Hans.json | 3 - .../wwlln/.translations/zh-Hant.json | 6 +- 437 files changed, 403 insertions(+), 2321 deletions(-) create mode 100644 homeassistant/components/nut/.translations/pl.json create mode 100644 homeassistant/components/synology_dsm/.translations/lb.json create mode 100644 homeassistant/components/synology_dsm/.translations/nl.json diff --git a/homeassistant/components/airly/.translations/bg.json b/homeassistant/components/airly/.translations/bg.json index c91190d9852b..e09d9c0d62ff 100644 --- a/homeassistant/components/airly/.translations/bg.json +++ b/homeassistant/components/airly/.translations/bg.json @@ -2,7 +2,6 @@ "config": { "error": { "auth": "API \u043a\u043b\u044e\u0447\u044a\u0442 \u043d\u0435 \u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0435\u043d.", - "name_exists": "\u0418\u043c\u0435\u0442\u043e \u0432\u0435\u0447\u0435 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430.", "wrong_location": "\u0412 \u0442\u0430\u0437\u0438 \u043e\u0431\u043b\u0430\u0441\u0442 \u043d\u044f\u043c\u0430 \u0438\u0437\u043c\u0435\u0440\u0432\u0430\u0442\u0435\u043b\u043d\u0438 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043d\u0430 Airly." }, "step": { diff --git a/homeassistant/components/airly/.translations/ca.json b/homeassistant/components/airly/.translations/ca.json index 4c5a7a6bd59e..00ef4c7180e7 100644 --- a/homeassistant/components/airly/.translations/ca.json +++ b/homeassistant/components/airly/.translations/ca.json @@ -5,7 +5,6 @@ }, "error": { "auth": "La clau API no \u00e9s correcta.", - "name_exists": "El nom ja existeix.", "wrong_location": "No hi ha estacions de mesura Airly en aquesta zona." }, "step": { diff --git a/homeassistant/components/airly/.translations/da.json b/homeassistant/components/airly/.translations/da.json index 52bf903d5a83..b33e9b18da8e 100644 --- a/homeassistant/components/airly/.translations/da.json +++ b/homeassistant/components/airly/.translations/da.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API-n\u00f8glen er ikke korrekt.", - "name_exists": "Navnet findes allerede.", "wrong_location": "Ingen Airly-m\u00e5lestationer i dette omr\u00e5de." }, "step": { diff --git a/homeassistant/components/airly/.translations/de.json b/homeassistant/components/airly/.translations/de.json index ef2b2d64a4e2..727b67e3245c 100644 --- a/homeassistant/components/airly/.translations/de.json +++ b/homeassistant/components/airly/.translations/de.json @@ -5,7 +5,6 @@ }, "error": { "auth": "Der API-Schl\u00fcssel ist nicht korrekt.", - "name_exists": "Name existiert bereits", "wrong_location": "Keine Airly Luftmessstation an diesem Ort" }, "step": { diff --git a/homeassistant/components/airly/.translations/en.json b/homeassistant/components/airly/.translations/en.json index cae6854d2311..ef485ec610f9 100644 --- a/homeassistant/components/airly/.translations/en.json +++ b/homeassistant/components/airly/.translations/en.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API key is not correct.", - "name_exists": "Name already exists.", "wrong_location": "No Airly measuring stations in this area." }, "step": { diff --git a/homeassistant/components/airly/.translations/es-419.json b/homeassistant/components/airly/.translations/es-419.json index 749244938635..41f7e29b4088 100644 --- a/homeassistant/components/airly/.translations/es-419.json +++ b/homeassistant/components/airly/.translations/es-419.json @@ -2,7 +2,6 @@ "config": { "error": { "auth": "La clave API no es correcta.", - "name_exists": "El nombre ya existe.", "wrong_location": "No hay estaciones de medici\u00f3n Airly en esta \u00e1rea." }, "step": { diff --git a/homeassistant/components/airly/.translations/es.json b/homeassistant/components/airly/.translations/es.json index 6fd18eb747c3..b364a45c344e 100644 --- a/homeassistant/components/airly/.translations/es.json +++ b/homeassistant/components/airly/.translations/es.json @@ -5,7 +5,6 @@ }, "error": { "auth": "La clave de la API no es correcta.", - "name_exists": "El nombre ya existe.", "wrong_location": "No hay estaciones de medici\u00f3n Airly en esta zona." }, "step": { diff --git a/homeassistant/components/airly/.translations/fr.json b/homeassistant/components/airly/.translations/fr.json index f2fdbbd97547..b11493e337f8 100644 --- a/homeassistant/components/airly/.translations/fr.json +++ b/homeassistant/components/airly/.translations/fr.json @@ -5,7 +5,6 @@ }, "error": { "auth": "La cl\u00e9 API n'est pas correcte.", - "name_exists": "Le nom existe d\u00e9j\u00e0.", "wrong_location": "Aucune station de mesure Airly dans cette zone." }, "step": { diff --git a/homeassistant/components/airly/.translations/hu.json b/homeassistant/components/airly/.translations/hu.json index 30898c61abb6..ae3990c31ce0 100644 --- a/homeassistant/components/airly/.translations/hu.json +++ b/homeassistant/components/airly/.translations/hu.json @@ -5,7 +5,6 @@ }, "error": { "auth": "Az API kulcs nem megfelel\u0151.", - "name_exists": "A n\u00e9v m\u00e1r l\u00e9tezik", "wrong_location": "Ezen a ter\u00fcleten nincs Airly m\u00e9r\u0151\u00e1llom\u00e1s." }, "step": { diff --git a/homeassistant/components/airly/.translations/it.json b/homeassistant/components/airly/.translations/it.json index c52e77881c02..0453d397bc45 100644 --- a/homeassistant/components/airly/.translations/it.json +++ b/homeassistant/components/airly/.translations/it.json @@ -5,7 +5,6 @@ }, "error": { "auth": "La chiave API non \u00e8 corretta.", - "name_exists": "Il nome \u00e8 gi\u00e0 esistente", "wrong_location": "Nessuna stazione di misurazione Airly in quest'area." }, "step": { diff --git a/homeassistant/components/airly/.translations/ko.json b/homeassistant/components/airly/.translations/ko.json index b64a16635a61..75b9bcfc1c4e 100644 --- a/homeassistant/components/airly/.translations/ko.json +++ b/homeassistant/components/airly/.translations/ko.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API \ud0a4\uac00 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", - "name_exists": "\uc774\ub984\uc774 \uc774\ubbf8 \uc874\uc7ac\ud569\ub2c8\ub2e4.", "wrong_location": "\uc774 \uc9c0\uc5ed\uc5d0\ub294 Airly \uce21\uc815 \uc2a4\ud14c\uc774\uc158\uc774 \uc5c6\uc2b5\ub2c8\ub2e4." }, "step": { diff --git a/homeassistant/components/airly/.translations/lb.json b/homeassistant/components/airly/.translations/lb.json index 8c2f5c615f31..75c77d9481e4 100644 --- a/homeassistant/components/airly/.translations/lb.json +++ b/homeassistant/components/airly/.translations/lb.json @@ -5,7 +5,6 @@ }, "error": { "auth": "Api Schl\u00ebssel ass net korrekt.", - "name_exists": "Numm g\u00ebtt et schonn", "wrong_location": "Keng Airly Moos Statioun an d\u00ebsem Ber\u00e4ich" }, "step": { diff --git a/homeassistant/components/airly/.translations/nl.json b/homeassistant/components/airly/.translations/nl.json index a9c6865ad916..2e9c97c82326 100644 --- a/homeassistant/components/airly/.translations/nl.json +++ b/homeassistant/components/airly/.translations/nl.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API-sleutel is niet correct.", - "name_exists": "Naam bestaat al.", "wrong_location": "Geen Airly meetstations in dit gebied." }, "step": { diff --git a/homeassistant/components/airly/.translations/no.json b/homeassistant/components/airly/.translations/no.json index 79dfcd7307eb..492e14713510 100644 --- a/homeassistant/components/airly/.translations/no.json +++ b/homeassistant/components/airly/.translations/no.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API-n\u00f8kkelen er ikke korrekt.", - "name_exists": "Navnet finnes allerede.", "wrong_location": "Ingen Airly m\u00e5lestasjoner i dette omr\u00e5det." }, "step": { diff --git a/homeassistant/components/airly/.translations/pl.json b/homeassistant/components/airly/.translations/pl.json index 5274a4383b65..85918d7c711b 100644 --- a/homeassistant/components/airly/.translations/pl.json +++ b/homeassistant/components/airly/.translations/pl.json @@ -5,7 +5,6 @@ }, "error": { "auth": "Klucz API jest nieprawid\u0142owy.", - "name_exists": "Nazwa ju\u017c istnieje.", "wrong_location": "Brak stacji pomiarowych Airly w tym rejonie." }, "step": { diff --git a/homeassistant/components/airly/.translations/ru.json b/homeassistant/components/airly/.translations/ru.json index 5094d3f4d1eb..7846d8173c44 100644 --- a/homeassistant/components/airly/.translations/ru.json +++ b/homeassistant/components/airly/.translations/ru.json @@ -5,7 +5,6 @@ }, "error": { "auth": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API.", - "name_exists": "\u042d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.", "wrong_location": "\u0412 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 Airly." }, "step": { diff --git a/homeassistant/components/airly/.translations/sl.json b/homeassistant/components/airly/.translations/sl.json index f8ca4e5b6d53..d77979979109 100644 --- a/homeassistant/components/airly/.translations/sl.json +++ b/homeassistant/components/airly/.translations/sl.json @@ -5,7 +5,6 @@ }, "error": { "auth": "Klju\u010d API ni pravilen.", - "name_exists": "Ime \u017ee obstaja", "wrong_location": "Na tem obmo\u010dju ni merilnih postaj Airly." }, "step": { diff --git a/homeassistant/components/airly/.translations/sv.json b/homeassistant/components/airly/.translations/sv.json index 5b81b4625a2a..7c7d10f47dc4 100644 --- a/homeassistant/components/airly/.translations/sv.json +++ b/homeassistant/components/airly/.translations/sv.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API-nyckeln \u00e4r inte korrekt.", - "name_exists": "Namnet finns redan.", "wrong_location": "Inga Airly m\u00e4tstationer i detta omr\u00e5de." }, "step": { diff --git a/homeassistant/components/airly/.translations/zh-Hant.json b/homeassistant/components/airly/.translations/zh-Hant.json index 5bc0a52f3948..66934d7a986d 100644 --- a/homeassistant/components/airly/.translations/zh-Hant.json +++ b/homeassistant/components/airly/.translations/zh-Hant.json @@ -5,7 +5,6 @@ }, "error": { "auth": "API \u5bc6\u9470\u4e0d\u6b63\u78ba\u3002", - "name_exists": "\u8a72\u540d\u7a31\u5df2\u5b58\u5728", "wrong_location": "\u8a72\u5340\u57df\u6c92\u6709 Arily \u76e3\u6e2c\u7ad9\u3002" }, "step": { diff --git a/homeassistant/components/airvisual/.translations/ca.json b/homeassistant/components/airvisual/.translations/ca.json index 66cd796d752b..070eeee8b514 100644 --- a/homeassistant/components/airvisual/.translations/ca.json +++ b/homeassistant/components/airvisual/.translations/ca.json @@ -11,8 +11,7 @@ "data": { "api_key": "Clau API", "latitude": "Latitud", - "longitude": "Longitud", - "show_on_map": "Mostra al mapa l'\u00e0rea geogr\u00e0fica monitoritzada" + "longitude": "Longitud" }, "description": "Monitoritzaci\u00f3 de la qualitat de l'aire per ubicaci\u00f3 geogr\u00e0fica.", "title": "Configura AirVisual" diff --git a/homeassistant/components/airvisual/.translations/de.json b/homeassistant/components/airvisual/.translations/de.json index fc603318ab42..02f259004280 100644 --- a/homeassistant/components/airvisual/.translations/de.json +++ b/homeassistant/components/airvisual/.translations/de.json @@ -11,8 +11,7 @@ "data": { "api_key": "API-Schl\u00fcssel", "latitude": "Breitengrad", - "longitude": "L\u00e4ngengrad", - "show_on_map": "Zeigen Sie die \u00fcberwachte Geografie auf der Karte an" + "longitude": "L\u00e4ngengrad" }, "description": "\u00dcberwachen Sie die Luftqualit\u00e4t an einem geografischen Ort.", "title": "Konfigurieren Sie AirVisual" diff --git a/homeassistant/components/airvisual/.translations/en.json b/homeassistant/components/airvisual/.translations/en.json index 982ed8e13e77..30d501f1af6b 100644 --- a/homeassistant/components/airvisual/.translations/en.json +++ b/homeassistant/components/airvisual/.translations/en.json @@ -11,8 +11,7 @@ "data": { "api_key": "API Key", "latitude": "Latitude", - "longitude": "Longitude", - "show_on_map": "Show monitored geography on the map" + "longitude": "Longitude" }, "description": "Monitor air quality in a geographical location.", "title": "Configure AirVisual" diff --git a/homeassistant/components/airvisual/.translations/es.json b/homeassistant/components/airvisual/.translations/es.json index a1054c79098b..752593ce29dc 100644 --- a/homeassistant/components/airvisual/.translations/es.json +++ b/homeassistant/components/airvisual/.translations/es.json @@ -11,8 +11,7 @@ "data": { "api_key": "Clave API", "latitude": "Latitud", - "longitude": "Longitud", - "show_on_map": "Mostrar geograf\u00eda monitorizada en el mapa" + "longitude": "Longitud" }, "description": "Monitorizar la calidad del aire en una ubicaci\u00f3n geogr\u00e1fica.", "title": "Configurar AirVisual" diff --git a/homeassistant/components/airvisual/.translations/fr.json b/homeassistant/components/airvisual/.translations/fr.json index 9f32bbf5d94c..6ee4377db953 100644 --- a/homeassistant/components/airvisual/.translations/fr.json +++ b/homeassistant/components/airvisual/.translations/fr.json @@ -11,8 +11,7 @@ "data": { "api_key": "Cl\u00e9 API", "latitude": "Latitude", - "longitude": "Longitude", - "show_on_map": "Afficher la g\u00e9ographie surveill\u00e9e sur la carte" + "longitude": "Longitude" }, "description": "Surveiller la qualit\u00e9 de l\u2019air dans un emplacement g\u00e9ographique.", "title": "Configurer AirVisual" diff --git a/homeassistant/components/airvisual/.translations/it.json b/homeassistant/components/airvisual/.translations/it.json index 7d309fdb22a7..762c99ec4d76 100644 --- a/homeassistant/components/airvisual/.translations/it.json +++ b/homeassistant/components/airvisual/.translations/it.json @@ -11,8 +11,7 @@ "data": { "api_key": "Chiave API", "latitude": "Latitudine", - "longitude": "Logitudine", - "show_on_map": "Mostra l'area geografica monitorata sulla mappa" + "longitude": "Logitudine" }, "description": "Monitorare la qualit\u00e0 dell'aria in una posizione geografica.", "title": "Configura AirVisual" diff --git a/homeassistant/components/airvisual/.translations/ko.json b/homeassistant/components/airvisual/.translations/ko.json index bb01114a5e3e..4e1511b2d2d4 100644 --- a/homeassistant/components/airvisual/.translations/ko.json +++ b/homeassistant/components/airvisual/.translations/ko.json @@ -11,8 +11,7 @@ "data": { "api_key": "API \ud0a4", "latitude": "\uc704\ub3c4", - "longitude": "\uacbd\ub3c4", - "show_on_map": "\uc9c0\ub3c4\uc5d0 \ubaa8\ub2c8\ud130\ub9c1\ub41c \uc9c0\ub9ac \uc815\ubcf4 \ud45c\uc2dc" + "longitude": "\uacbd\ub3c4" }, "description": "\uc9c0\ub9ac\uc801 \uc704\uce58\uc5d0\uc11c \ub300\uae30\uc9c8\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud569\ub2c8\ub2e4.", "title": "AirVisual \uad6c\uc131" diff --git a/homeassistant/components/airvisual/.translations/lb.json b/homeassistant/components/airvisual/.translations/lb.json index 8dcc8ded10d8..a7f20253ef10 100644 --- a/homeassistant/components/airvisual/.translations/lb.json +++ b/homeassistant/components/airvisual/.translations/lb.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "D\u00ebsen App Schl\u00ebssel g\u00ebtt scho benotzt" + "already_configured": "D\u00ebs Koordinate si schon registr\u00e9iert." }, "error": { "invalid_api_key": "Ong\u00ebltegen API Schl\u00ebssel" @@ -11,8 +11,7 @@ "data": { "api_key": "API Schl\u00ebssel", "latitude": "Breedegrad", - "longitude": "L\u00e4ngegrad", - "show_on_map": "Iwwerwaachte Geografie op der Kaart uweisen" + "longitude": "L\u00e4ngegrad" }, "description": "Loft Qualit\u00e9it an enger geografescher Lag iwwerwaachen.", "title": "AirVisual konfigur\u00e9ieren" diff --git a/homeassistant/components/airvisual/.translations/no.json b/homeassistant/components/airvisual/.translations/no.json index 82533db387f4..2a2a1fcd07cc 100644 --- a/homeassistant/components/airvisual/.translations/no.json +++ b/homeassistant/components/airvisual/.translations/no.json @@ -11,8 +11,7 @@ "data": { "api_key": "API-n\u00f8kkel", "latitude": "Breddegrad", - "longitude": "Lengdegrad", - "show_on_map": "Vis overv\u00e5ket geografi p\u00e5 kartet" + "longitude": "Lengdegrad" }, "description": "Overv\u00e5k luftkvaliteten p\u00e5 et geografisk sted.", "title": "Konfigurer AirVisual" diff --git a/homeassistant/components/airvisual/.translations/pl.json b/homeassistant/components/airvisual/.translations/pl.json index ebcbc12e4057..99c74c3e5cd6 100644 --- a/homeassistant/components/airvisual/.translations/pl.json +++ b/homeassistant/components/airvisual/.translations/pl.json @@ -11,8 +11,7 @@ "data": { "api_key": "Klucz API", "latitude": "Szeroko\u015b\u0107 geograficzna", - "longitude": "D\u0142ugo\u015b\u0107 geograficzna", - "show_on_map": "Wy\u015bwietlaj encje na mapie" + "longitude": "D\u0142ugo\u015b\u0107 geograficzna" }, "description": "Monitoruj jako\u015b\u0107 powietrza w okre\u015blonej lokalizacji geograficznej.", "title": "Konfiguracja AirVisual" diff --git a/homeassistant/components/airvisual/.translations/ru.json b/homeassistant/components/airvisual/.translations/ru.json index 61d4b45eb380..e8682a0188a3 100644 --- a/homeassistant/components/airvisual/.translations/ru.json +++ b/homeassistant/components/airvisual/.translations/ru.json @@ -11,8 +11,7 @@ "data": { "api_key": "\u041a\u043b\u044e\u0447 API", "latitude": "\u0428\u0438\u0440\u043e\u0442\u0430", - "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430", - "show_on_map": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435" + "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430" }, "description": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438.", "title": "AirVisual" diff --git a/homeassistant/components/airvisual/.translations/sl.json b/homeassistant/components/airvisual/.translations/sl.json index 97ed91592d5d..6511c7b6da8a 100644 --- a/homeassistant/components/airvisual/.translations/sl.json +++ b/homeassistant/components/airvisual/.translations/sl.json @@ -11,8 +11,7 @@ "data": { "api_key": "API Klju\u010d", "latitude": "Zemljepisna \u0161irina", - "longitude": "Zemljepisna dol\u017eina", - "show_on_map": "Prika\u017ei nadzorovano obmo\u010dje na zemljevidu" + "longitude": "Zemljepisna dol\u017eina" }, "description": "Spremljajte kakovost zraka na zemljepisni lokaciji.", "title": "Nastavite AirVisual" diff --git a/homeassistant/components/airvisual/.translations/zh-Hant.json b/homeassistant/components/airvisual/.translations/zh-Hant.json index 5c347e3b251a..e40926d4a082 100644 --- a/homeassistant/components/airvisual/.translations/zh-Hant.json +++ b/homeassistant/components/airvisual/.translations/zh-Hant.json @@ -11,8 +11,7 @@ "data": { "api_key": "API \u5bc6\u9470", "latitude": "\u7def\u5ea6", - "longitude": "\u7d93\u5ea6", - "show_on_map": "\u65bc\u5730\u5716\u4e0a\u986f\u793a\u76e3\u63a7\u4f4d\u7f6e\u3002" + "longitude": "\u7d93\u5ea6" }, "description": "\u4f9d\u5730\u7406\u4f4d\u7f6e\u76e3\u63a7\u7a7a\u6c23\u54c1\u8cea\u3002", "title": "\u8a2d\u5b9a AirVisual" diff --git a/homeassistant/components/ambient_station/.translations/bg.json b/homeassistant/components/ambient_station/.translations/bg.json index 2099038f0043..df9fe8866ac8 100644 --- a/homeassistant/components/ambient_station/.translations/bg.json +++ b/homeassistant/components/ambient_station/.translations/bg.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Application \u0438/\u0438\u043b\u0438 API \u043a\u043b\u044e\u0447\u044a\u0442 \u0432\u0435\u0447\u0435 \u0441\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043d\u0438", "invalid_key": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d API \u043a\u043b\u044e\u0447 \u0438/\u0438\u043b\u0438 Application \u043a\u043b\u044e\u0447", "no_devices": "\u041d\u0435 \u0441\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0430" }, diff --git a/homeassistant/components/ambient_station/.translations/ca.json b/homeassistant/components/ambient_station/.translations/ca.json index 280a90354b05..0991c74b0a5d 100644 --- a/homeassistant/components/ambient_station/.translations/ca.json +++ b/homeassistant/components/ambient_station/.translations/ca.json @@ -4,7 +4,6 @@ "already_configured": "Aquesta clau d'aplicaci\u00f3 ja est\u00e0 en \u00fas." }, "error": { - "identifier_exists": "Clau d'aplicaci\u00f3 i/o clau API ja registrada", "invalid_key": "Clau API i/o clau d'aplicaci\u00f3 inv\u00e0lida/es", "no_devices": "No s'ha trobat cap dispositiu al compte" }, diff --git a/homeassistant/components/ambient_station/.translations/da.json b/homeassistant/components/ambient_station/.translations/da.json index 6428508687df..5028a84eb317 100644 --- a/homeassistant/components/ambient_station/.translations/da.json +++ b/homeassistant/components/ambient_station/.translations/da.json @@ -4,7 +4,6 @@ "already_configured": "Denne appn\u00f8gle er allerede i brug." }, "error": { - "identifier_exists": "Applikationsn\u00f8gle og/eller API n\u00f8gle er allerede registreret", "invalid_key": "Ugyldig API n\u00f8gle og/eller applikationsn\u00f8gle", "no_devices": "Ingen enheder fundet i konto" }, diff --git a/homeassistant/components/ambient_station/.translations/de.json b/homeassistant/components/ambient_station/.translations/de.json index 451a2e70e68d..9213007e935d 100644 --- a/homeassistant/components/ambient_station/.translations/de.json +++ b/homeassistant/components/ambient_station/.translations/de.json @@ -4,7 +4,6 @@ "already_configured": "Dieser App-Schl\u00fcssel wird bereits verwendet." }, "error": { - "identifier_exists": "Anwendungsschl\u00fcssel und / oder API-Schl\u00fcssel bereits registriert", "invalid_key": "Ung\u00fcltiger API Key und / oder Anwendungsschl\u00fcssel", "no_devices": "Keine Ger\u00e4te im Konto gefunden" }, diff --git a/homeassistant/components/ambient_station/.translations/en.json b/homeassistant/components/ambient_station/.translations/en.json index 8b8e71d5316c..c3e2a40ab13a 100644 --- a/homeassistant/components/ambient_station/.translations/en.json +++ b/homeassistant/components/ambient_station/.translations/en.json @@ -4,7 +4,6 @@ "already_configured": "This app key is already in use." }, "error": { - "identifier_exists": "Application Key and/or API Key already registered", "invalid_key": "Invalid API Key and/or Application Key", "no_devices": "No devices found in account" }, diff --git a/homeassistant/components/ambient_station/.translations/es-419.json b/homeassistant/components/ambient_station/.translations/es-419.json index 268a6ba001e4..4cca42afbf4e 100644 --- a/homeassistant/components/ambient_station/.translations/es-419.json +++ b/homeassistant/components/ambient_station/.translations/es-419.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Clave de aplicaci\u00f3n y/o clave de API ya registrada", "invalid_key": "Clave de API y/o clave de aplicaci\u00f3n no v\u00e1lida", "no_devices": "No se han encontrado dispositivos en la cuenta." }, diff --git a/homeassistant/components/ambient_station/.translations/es.json b/homeassistant/components/ambient_station/.translations/es.json index d575db2ba71b..ae8b829d56e5 100644 --- a/homeassistant/components/ambient_station/.translations/es.json +++ b/homeassistant/components/ambient_station/.translations/es.json @@ -4,7 +4,6 @@ "already_configured": "Esta clave API ya est\u00e1 en uso." }, "error": { - "identifier_exists": "La clave API y/o la clave de aplicaci\u00f3n ya est\u00e1 registrada", "invalid_key": "Clave API y/o clave de aplicaci\u00f3n no v\u00e1lida", "no_devices": "No se han encontrado dispositivos en la cuenta" }, diff --git a/homeassistant/components/ambient_station/.translations/fr.json b/homeassistant/components/ambient_station/.translations/fr.json index 00f4e3d02fcb..34490332c129 100644 --- a/homeassistant/components/ambient_station/.translations/fr.json +++ b/homeassistant/components/ambient_station/.translations/fr.json @@ -4,7 +4,6 @@ "already_configured": "Cette cl\u00e9 d'application est d\u00e9j\u00e0 utilis\u00e9e." }, "error": { - "identifier_exists": "Cl\u00e9 d'application et / ou cl\u00e9 API d\u00e9j\u00e0 enregistr\u00e9e", "invalid_key": "Cl\u00e9 d'API et / ou cl\u00e9 d'application non valide", "no_devices": "Aucun appareil trouv\u00e9 dans le compte" }, diff --git a/homeassistant/components/ambient_station/.translations/hu.json b/homeassistant/components/ambient_station/.translations/hu.json index 222b512c39f8..6febc6ec20da 100644 --- a/homeassistant/components/ambient_station/.translations/hu.json +++ b/homeassistant/components/ambient_station/.translations/hu.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Alkalmaz\u00e1s kulcsot \u00e9s/vagy az API kulcsot m\u00e1r regisztr\u00e1lt\u00e1k", "invalid_key": "\u00c9rv\u00e9nytelen API kulcs \u00e9s / vagy alkalmaz\u00e1skulcs", "no_devices": "Nincs a fi\u00f3kodban tal\u00e1lhat\u00f3 eszk\u00f6z" }, diff --git a/homeassistant/components/ambient_station/.translations/it.json b/homeassistant/components/ambient_station/.translations/it.json index 6bfaaac8f01d..e5c27bd39397 100644 --- a/homeassistant/components/ambient_station/.translations/it.json +++ b/homeassistant/components/ambient_station/.translations/it.json @@ -4,7 +4,6 @@ "already_configured": "Questa chiave dell'app \u00e8 gi\u00e0 in uso." }, "error": { - "identifier_exists": "API Key e/o Application Key gi\u00e0 registrata", "invalid_key": "API Key e/o Application Key non valida", "no_devices": "Nessun dispositivo trovato nell'account" }, diff --git a/homeassistant/components/ambient_station/.translations/ko.json b/homeassistant/components/ambient_station/.translations/ko.json index 3379411678ba..2aa386889570 100644 --- a/homeassistant/components/ambient_station/.translations/ko.json +++ b/homeassistant/components/ambient_station/.translations/ko.json @@ -4,7 +4,6 @@ "already_configured": "\uc774 \uc571 \ud0a4\ub294 \uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4." }, "error": { - "identifier_exists": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud0a4 \ud639\uc740 API \ud0a4\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "invalid_key": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud0a4 \ud639\uc740 API \ud0a4\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "no_devices": "\uacc4\uc815\uc5d0 \uae30\uae30\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4" }, diff --git a/homeassistant/components/ambient_station/.translations/lb.json b/homeassistant/components/ambient_station/.translations/lb.json index 891051bae00e..1c6f9224c570 100644 --- a/homeassistant/components/ambient_station/.translations/lb.json +++ b/homeassistant/components/ambient_station/.translations/lb.json @@ -4,7 +4,6 @@ "already_configured": "D\u00ebsen App Schl\u00ebssel g\u00ebtt scho benotzt" }, "error": { - "identifier_exists": "Applikatioun's Schl\u00ebssel an/oder API Schl\u00ebssel ass scho registr\u00e9iert", "invalid_key": "Ong\u00ebltegen API Schl\u00ebssel an/oder Applikatioun's Schl\u00ebssel", "no_devices": "Keng Apparater am Kont fonnt" }, diff --git a/homeassistant/components/ambient_station/.translations/nl.json b/homeassistant/components/ambient_station/.translations/nl.json index a070128eefe4..bc8f90057e39 100644 --- a/homeassistant/components/ambient_station/.translations/nl.json +++ b/homeassistant/components/ambient_station/.translations/nl.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Applicatiesleutel en/of API-sleutel al geregistreerd", "invalid_key": "Ongeldige API-sleutel en/of applicatiesleutel", "no_devices": "Geen apparaten gevonden in account" }, diff --git a/homeassistant/components/ambient_station/.translations/no.json b/homeassistant/components/ambient_station/.translations/no.json index 2b915aafce1c..b69081286ed0 100644 --- a/homeassistant/components/ambient_station/.translations/no.json +++ b/homeassistant/components/ambient_station/.translations/no.json @@ -4,7 +4,6 @@ "already_configured": "Denne app n\u00f8kkelen er allerede i bruk." }, "error": { - "identifier_exists": "Programn\u00f8kkel og/eller API-n\u00f8kkel er allerede registrert", "invalid_key": "Ugyldig API-n\u00f8kkel og/eller programn\u00f8kkel", "no_devices": "Ingen enheter funnet i kontoen" }, diff --git a/homeassistant/components/ambient_station/.translations/pl.json b/homeassistant/components/ambient_station/.translations/pl.json index 5da886f05cd8..45d98e64dbbd 100644 --- a/homeassistant/components/ambient_station/.translations/pl.json +++ b/homeassistant/components/ambient_station/.translations/pl.json @@ -4,7 +4,6 @@ "already_configured": "Ten klucz aplikacji jest ju\u017c w u\u017cyciu." }, "error": { - "identifier_exists": "Klucz aplikacji i/lub klucz API ju\u017c jest zarejestrowany.", "invalid_key": "Nieprawid\u0142owy klucz API i/lub klucz aplikacji", "no_devices": "Nie znaleziono urz\u0105dze\u0144 na koncie" }, diff --git a/homeassistant/components/ambient_station/.translations/pt-BR.json b/homeassistant/components/ambient_station/.translations/pt-BR.json index 61f5cea5e26c..533d46ca8b78 100644 --- a/homeassistant/components/ambient_station/.translations/pt-BR.json +++ b/homeassistant/components/ambient_station/.translations/pt-BR.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Chave de aplicativo e / ou chave de API j\u00e1 registrada", "invalid_key": "Chave de API e / ou chave de aplicativo inv\u00e1lidas", "no_devices": "Nenhum dispositivo encontrado na conta" }, diff --git a/homeassistant/components/ambient_station/.translations/pt.json b/homeassistant/components/ambient_station/.translations/pt.json index 92746b29f3d6..61d8bf3ae1ce 100644 --- a/homeassistant/components/ambient_station/.translations/pt.json +++ b/homeassistant/components/ambient_station/.translations/pt.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Chave de aplica\u00e7\u00e3o e/ou chave de API j\u00e1 registradas.", "invalid_key": "Chave de API e/ou chave de aplica\u00e7\u00e3o inv\u00e1lidas", "no_devices": "Nenhum dispositivo encontrado na conta" }, diff --git a/homeassistant/components/ambient_station/.translations/ru.json b/homeassistant/components/ambient_station/.translations/ru.json index 07f3907eea1d..e1f01d1567fe 100644 --- a/homeassistant/components/ambient_station/.translations/ru.json +++ b/homeassistant/components/ambient_station/.translations/ru.json @@ -4,7 +4,6 @@ "already_configured": "\u042d\u0442\u043e\u0442 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f." }, "error": { - "identifier_exists": "\u041a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 API \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d.", "invalid_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API \u0438/\u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", "no_devices": "\u0412 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b." }, diff --git a/homeassistant/components/ambient_station/.translations/sl.json b/homeassistant/components/ambient_station/.translations/sl.json index d5cf039b9f4f..4f9389e7e498 100644 --- a/homeassistant/components/ambient_station/.translations/sl.json +++ b/homeassistant/components/ambient_station/.translations/sl.json @@ -4,7 +4,6 @@ "already_configured": "Ta klju\u010d za aplikacijo je \u017ee v uporabi." }, "error": { - "identifier_exists": "Aplikacijski klju\u010d in / ali klju\u010d API je \u017ee registriran", "invalid_key": "Neveljaven klju\u010d API in / ali klju\u010d aplikacije", "no_devices": "V ra\u010dunu ni najdene nobene naprave" }, diff --git a/homeassistant/components/ambient_station/.translations/sv.json b/homeassistant/components/ambient_station/.translations/sv.json index c429d4395030..2f68fe4332d6 100644 --- a/homeassistant/components/ambient_station/.translations/sv.json +++ b/homeassistant/components/ambient_station/.translations/sv.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Applikationsnyckel och/eller API-nyckel \u00e4r redan registrerade", "invalid_key": "Ogiltigt API-nyckel och/eller applikationsnyckel", "no_devices": "Inga enheter hittades i kontot" }, diff --git a/homeassistant/components/ambient_station/.translations/zh-Hans.json b/homeassistant/components/ambient_station/.translations/zh-Hans.json index 866c06316f1c..dc6f2d51ee9e 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hans.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hans.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Application Key \u548c/\u6216 API Key \u5df2\u6ce8\u518c", "invalid_key": "\u65e0\u6548\u7684 API \u5bc6\u94a5\u548c/\u6216 Application Key", "no_devices": "\u6ca1\u6709\u5728\u5e10\u6237\u4e2d\u627e\u5230\u8bbe\u5907" }, diff --git a/homeassistant/components/ambient_station/.translations/zh-Hant.json b/homeassistant/components/ambient_station/.translations/zh-Hant.json index 6de1579f6ffa..fdc7b87aa6bc 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hant.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hant.json @@ -4,7 +4,6 @@ "already_configured": "\u6b64\u61c9\u7528\u7a0b\u5f0f\u5bc6\u9470\u5df2\u88ab\u4f7f\u7528\u3002" }, "error": { - "identifier_exists": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u5df2\u8a3b\u518a", "invalid_key": "API \u5bc6\u9470\u53ca/\u6216\u61c9\u7528\u5bc6\u9470\u7121\u6548", "no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u8a2d\u5099" }, diff --git a/homeassistant/components/axis/.translations/ca.json b/homeassistant/components/axis/.translations/ca.json index 58f5c0e4ad25..b391af0e609e 100644 --- a/homeassistant/components/axis/.translations/ca.json +++ b/homeassistant/components/axis/.translations/ca.json @@ -4,8 +4,7 @@ "already_configured": "El dispositiu ja est\u00e0 configurat", "bad_config_file": "Dades incorrectes del fitxer de configuraci\u00f3", "link_local_address": "L'enlla\u00e7 d'adreces locals no est\u00e0 disponible", - "not_axis_device": "El dispositiu descobert no \u00e9s un dispositiu Axis", - "updated_configuration": "S'ha actualitzat la configuraci\u00f3 del dispositiu amb l'adre\u00e7a nova" + "not_axis_device": "El dispositiu descobert no \u00e9s un dispositiu Axis" }, "error": { "already_configured": "El dispositiu ja est\u00e0 configurat", diff --git a/homeassistant/components/axis/.translations/da.json b/homeassistant/components/axis/.translations/da.json index 355dbad83d5e..21f33d120f7a 100644 --- a/homeassistant/components/axis/.translations/da.json +++ b/homeassistant/components/axis/.translations/da.json @@ -4,8 +4,7 @@ "already_configured": "Enheden er allerede konfigureret", "bad_config_file": "Forkerte data fra konfigurationsfilen", "link_local_address": "Link lokale adresser underst\u00f8ttes ikke", - "not_axis_device": "Fundet enhed ikke en Axis enhed", - "updated_configuration": "Opdaterede enhedskonfiguration med ny v\u00e6rtsadresse" + "not_axis_device": "Fundet enhed ikke en Axis enhed" }, "error": { "already_configured": "Enheden er allerede konfigureret", diff --git a/homeassistant/components/axis/.translations/de.json b/homeassistant/components/axis/.translations/de.json index a92c948a2a7d..f238b00e847d 100644 --- a/homeassistant/components/axis/.translations/de.json +++ b/homeassistant/components/axis/.translations/de.json @@ -4,8 +4,7 @@ "already_configured": "Ger\u00e4t ist bereits konfiguriert", "bad_config_file": "Fehlerhafte Daten aus der Konfigurationsdatei", "link_local_address": "Link-local Adressen werden nicht unterst\u00fctzt", - "not_axis_device": "Erkanntes Ger\u00e4t ist kein Axis-Ger\u00e4t", - "updated_configuration": "Ger\u00e4tekonfiguration mit neuer Hostadresse aktualisiert" + "not_axis_device": "Erkanntes Ger\u00e4t ist kein Axis-Ger\u00e4t" }, "error": { "already_configured": "Ger\u00e4t ist bereits konfiguriert", diff --git a/homeassistant/components/axis/.translations/en.json b/homeassistant/components/axis/.translations/en.json index 1f00800422cb..b56cb0c5b742 100644 --- a/homeassistant/components/axis/.translations/en.json +++ b/homeassistant/components/axis/.translations/en.json @@ -4,8 +4,7 @@ "already_configured": "Device is already configured", "bad_config_file": "Bad data from configuration file", "link_local_address": "Link local addresses are not supported", - "not_axis_device": "Discovered device not an Axis device", - "updated_configuration": "Updated device configuration with new host address" + "not_axis_device": "Discovered device not an Axis device" }, "error": { "already_configured": "Device is already configured", diff --git a/homeassistant/components/axis/.translations/es.json b/homeassistant/components/axis/.translations/es.json index 885e8f689136..3f7db674fdf4 100644 --- a/homeassistant/components/axis/.translations/es.json +++ b/homeassistant/components/axis/.translations/es.json @@ -4,8 +4,7 @@ "already_configured": "El dispositivo ya est\u00e1 configurado", "bad_config_file": "Datos err\u00f3neos en el archivo de configuraci\u00f3n", "link_local_address": "Las direcciones de enlace locales no son compatibles", - "not_axis_device": "El dispositivo descubierto no es un dispositivo de Axis", - "updated_configuration": "Configuraci\u00f3n del dispositivo actualizada con la nueva direcci\u00f3n de host" + "not_axis_device": "El dispositivo descubierto no es un dispositivo de Axis" }, "error": { "already_configured": "El dispositivo ya est\u00e1 configurado", diff --git a/homeassistant/components/axis/.translations/fr.json b/homeassistant/components/axis/.translations/fr.json index 07cfbd465041..608e12d020ac 100644 --- a/homeassistant/components/axis/.translations/fr.json +++ b/homeassistant/components/axis/.translations/fr.json @@ -4,8 +4,7 @@ "already_configured": "L'appareil est d\u00e9j\u00e0 configur\u00e9", "bad_config_file": "Mauvaises donn\u00e9es du fichier de configuration", "link_local_address": "Les adresses locales ne sont pas prises en charge", - "not_axis_device": "L'appareil d\u00e9couvert n'est pas un appareil Axis", - "updated_configuration": "Mise \u00e0 jour de la configuration du dispositif avec la nouvelle adresse de l'h\u00f4te" + "not_axis_device": "L'appareil d\u00e9couvert n'est pas un appareil Axis" }, "error": { "already_configured": "L'appareil est d\u00e9j\u00e0 configur\u00e9", diff --git a/homeassistant/components/axis/.translations/hu.json b/homeassistant/components/axis/.translations/hu.json index 4f05087cad8b..b6347e21744b 100644 --- a/homeassistant/components/axis/.translations/hu.json +++ b/homeassistant/components/axis/.translations/hu.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "updated_configuration": "Friss\u00edtett eszk\u00f6zkonfigur\u00e1ci\u00f3 \u00faj \u00e1llom\u00e1sc\u00edmmel" - }, "error": { "already_configured": "Az eszk\u00f6zt m\u00e1r konfigur\u00e1ltuk", "device_unavailable": "Az eszk\u00f6z nem \u00e9rhet\u0151 el", diff --git a/homeassistant/components/axis/.translations/it.json b/homeassistant/components/axis/.translations/it.json index 9e2eecf57472..3f303140c684 100644 --- a/homeassistant/components/axis/.translations/it.json +++ b/homeassistant/components/axis/.translations/it.json @@ -4,8 +4,7 @@ "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", "bad_config_file": "Dati errati dal file di configurazione", "link_local_address": "Gli indirizzi locali di collegamento non sono supportati", - "not_axis_device": "Il dispositivo rilevato non \u00e8 un dispositivo Axis", - "updated_configuration": "Configurazione del dispositivo aggiornata con nuovo indirizzo host" + "not_axis_device": "Il dispositivo rilevato non \u00e8 un dispositivo Axis" }, "error": { "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", diff --git a/homeassistant/components/axis/.translations/ko.json b/homeassistant/components/axis/.translations/ko.json index 3f1aa97f2661..648bd3cfd7da 100644 --- a/homeassistant/components/axis/.translations/ko.json +++ b/homeassistant/components/axis/.translations/ko.json @@ -4,8 +4,7 @@ "already_configured": "\uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "bad_config_file": "\uad6c\uc131 \ud30c\uc77c\uc5d0 \uc798\ubabb\ub41c \ub370\uc774\ud130\uac00 \uc788\uc2b5\ub2c8\ub2e4", "link_local_address": "\ub85c\uceec \uc8fc\uc18c \uc5f0\uacb0\uc740 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4", - "not_axis_device": "\ubc1c\uacac\ub41c \uae30\uae30\ub294 Axis \uae30\uae30\uac00 \uc544\ub2d9\ub2c8\ub2e4", - "updated_configuration": "\uc0c8\ub85c\uc6b4 \ud638\uc2a4\ud2b8 \uc8fc\uc18c\ub85c \uc5c5\ub370\uc774\ud2b8\ub41c \uae30\uae30 \uad6c\uc131" + "not_axis_device": "\ubc1c\uacac\ub41c \uae30\uae30\ub294 Axis \uae30\uae30\uac00 \uc544\ub2d9\ub2c8\ub2e4" }, "error": { "already_configured": "\uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", diff --git a/homeassistant/components/axis/.translations/lb.json b/homeassistant/components/axis/.translations/lb.json index 589932cd68e2..24ee0e241254 100644 --- a/homeassistant/components/axis/.translations/lb.json +++ b/homeassistant/components/axis/.translations/lb.json @@ -4,8 +4,7 @@ "already_configured": "Apparat ass scho konfigur\u00e9iert", "bad_config_file": "Feelerhaft Donn\u00e9e\u00eb aus der Konfiguratioun's Datei", "link_local_address": "Lokal Link Adressen ginn net \u00ebnnerst\u00ebtzt", - "not_axis_device": "Entdeckten Apparat ass keen Axis Apparat", - "updated_configuration": "Konfiguratioun vum Apparat gouf mat der neier Adress aktualis\u00e9iert" + "not_axis_device": "Entdeckten Apparat ass keen Axis Apparat" }, "error": { "already_configured": "Apparat ass scho konfigur\u00e9iert", diff --git a/homeassistant/components/axis/.translations/nl.json b/homeassistant/components/axis/.translations/nl.json index b512690e2a36..10fc8c02d66a 100644 --- a/homeassistant/components/axis/.translations/nl.json +++ b/homeassistant/components/axis/.translations/nl.json @@ -4,8 +4,7 @@ "already_configured": "Apparaat is al geconfigureerd", "bad_config_file": "Slechte gegevens van het configuratiebestand", "link_local_address": "Link-lokale adressen worden niet ondersteund", - "not_axis_device": "Ontdekte apparaat, is geen Axis-apparaat", - "updated_configuration": "Bijgewerkte apparaatconfiguratie met nieuw hostadres" + "not_axis_device": "Ontdekte apparaat, is geen Axis-apparaat" }, "error": { "already_configured": "Apparaat is al geconfigureerd", diff --git a/homeassistant/components/axis/.translations/no.json b/homeassistant/components/axis/.translations/no.json index 010472d2cce4..1ad7a446cfa5 100644 --- a/homeassistant/components/axis/.translations/no.json +++ b/homeassistant/components/axis/.translations/no.json @@ -4,8 +4,7 @@ "already_configured": "Enheten er allerede konfigurert", "bad_config_file": "D\u00e5rlige data fra konfigurasjonsfilen", "link_local_address": "Linking av lokale adresser st\u00f8ttes ikke", - "not_axis_device": "Oppdaget enhet ikke en Axis enhet", - "updated_configuration": "Oppdatert enhetskonfigurasjonen med ny vertsadresse" + "not_axis_device": "Oppdaget enhet ikke en Axis enhet" }, "error": { "already_configured": "Enheten er allerede konfigurert", diff --git a/homeassistant/components/axis/.translations/pl.json b/homeassistant/components/axis/.translations/pl.json index 9f7bb55147dd..dd1a63039e2c 100644 --- a/homeassistant/components/axis/.translations/pl.json +++ b/homeassistant/components/axis/.translations/pl.json @@ -4,8 +4,7 @@ "already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane.", "bad_config_file": "B\u0142\u0119dne dane z pliku konfiguracyjnego", "link_local_address": "Po\u0142\u0105czenie lokalnego adresu nie jest obs\u0142ugiwane", - "not_axis_device": "Wykryte urz\u0105dzenie nie jest urz\u0105dzeniem Axis", - "updated_configuration": "Zaktualizowano konfiguracj\u0119 urz\u0105dzenia o nowy adres hosta" + "not_axis_device": "Wykryte urz\u0105dzenie nie jest urz\u0105dzeniem Axis" }, "error": { "already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane.", diff --git a/homeassistant/components/axis/.translations/pt-BR.json b/homeassistant/components/axis/.translations/pt-BR.json index ceb6325af60d..453c8fa36430 100644 --- a/homeassistant/components/axis/.translations/pt-BR.json +++ b/homeassistant/components/axis/.translations/pt-BR.json @@ -4,8 +4,7 @@ "already_configured": "O dispositivo j\u00e1 est\u00e1 configurado", "bad_config_file": "Dados incorretos do arquivo de configura\u00e7\u00e3o", "link_local_address": "Link de endere\u00e7os locais n\u00e3o s\u00e3o suportados", - "not_axis_device": "Dispositivo descoberto n\u00e3o \u00e9 um dispositivo Axis", - "updated_configuration": "Configura\u00e7\u00e3o do dispositivo atualizada com novo endere\u00e7o de host" + "not_axis_device": "Dispositivo descoberto n\u00e3o \u00e9 um dispositivo Axis" }, "error": { "already_configured": "O dispositivo j\u00e1 est\u00e1 configurado", diff --git a/homeassistant/components/axis/.translations/ru.json b/homeassistant/components/axis/.translations/ru.json index b0da189d20ff..d9e3a40d3043 100644 --- a/homeassistant/components/axis/.translations/ru.json +++ b/homeassistant/components/axis/.translations/ru.json @@ -4,8 +4,7 @@ "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", "bad_config_file": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.", "link_local_address": "\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.", - "not_axis_device": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c Axis.", - "updated_configuration": "\u0410\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d." + "not_axis_device": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c Axis." }, "error": { "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", diff --git a/homeassistant/components/axis/.translations/sl.json b/homeassistant/components/axis/.translations/sl.json index 44a701ed1179..9d66831b91a6 100644 --- a/homeassistant/components/axis/.translations/sl.json +++ b/homeassistant/components/axis/.translations/sl.json @@ -4,8 +4,7 @@ "already_configured": "Naprava je \u017ee konfigurirana", "bad_config_file": "Slabi podatki iz konfiguracijske datoteke", "link_local_address": "Lokalni naslovi povezave niso podprti", - "not_axis_device": "Odkrita naprava ni naprava Axis", - "updated_configuration": "Posodobljena konfiguracija naprave z novim naslovom gostitelja" + "not_axis_device": "Odkrita naprava ni naprava Axis" }, "error": { "already_configured": "Naprava je \u017ee konfigurirana", diff --git a/homeassistant/components/axis/.translations/sv.json b/homeassistant/components/axis/.translations/sv.json index 59761c7202fb..76ceaf7cbd71 100644 --- a/homeassistant/components/axis/.translations/sv.json +++ b/homeassistant/components/axis/.translations/sv.json @@ -4,8 +4,7 @@ "already_configured": "Enheten \u00e4r redan konfigurerad", "bad_config_file": "Felaktig data fr\u00e5n konfigurationsfilen", "link_local_address": "Link local addresses are not supported", - "not_axis_device": "Uppt\u00e4ckte enhet som inte \u00e4r en Axis enhet", - "updated_configuration": "Uppdaterad enhetskonfiguration med ny v\u00e4rdadress" + "not_axis_device": "Uppt\u00e4ckte enhet som inte \u00e4r en Axis enhet" }, "error": { "already_configured": "Enheten \u00e4r redan konfigurerad", diff --git a/homeassistant/components/axis/.translations/zh-Hant.json b/homeassistant/components/axis/.translations/zh-Hant.json index ac552afe583a..41ecfdb80b77 100644 --- a/homeassistant/components/axis/.translations/zh-Hant.json +++ b/homeassistant/components/axis/.translations/zh-Hant.json @@ -4,8 +4,7 @@ "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "bad_config_file": "\u8a2d\u5b9a\u6a94\u6848\u8cc7\u6599\u7121\u6548\u932f\u8aa4", "link_local_address": "\u4e0d\u652f\u63f4\u9023\u7d50\u672c\u5730\u7aef\u4f4d\u5740", - "not_axis_device": "\u6240\u767c\u73fe\u7684\u8a2d\u5099\u4e26\u975e Axis \u8a2d\u5099", - "updated_configuration": "\u4f7f\u7528\u65b0\u4e3b\u6a5f\u7aef\u4f4d\u5740\u66f4\u65b0\u88dd\u7f6e\u8a2d\u5b9a" + "not_axis_device": "\u6240\u767c\u73fe\u7684\u8a2d\u5099\u4e26\u975e Axis \u8a2d\u5099" }, "error": { "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", diff --git a/homeassistant/components/binary_sensor/.translations/bg.json b/homeassistant/components/binary_sensor/.translations/bg.json index 373866ecd8c2..3006b8cadbc0 100644 --- a/homeassistant/components/binary_sensor/.translations/bg.json +++ b/homeassistant/components/binary_sensor/.translations/bg.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} \u0438\u0437\u0442\u043e\u0449\u0435\u043d\u0430 \u0431\u0430\u0442\u0435\u0440\u0438\u044f", - "closed": "{entity_name} \u0437\u0430\u0442\u0432\u043e\u0440\u0435\u043d", "cold": "{entity_name} \u0441\u0435 \u0438\u0437\u0441\u0442\u0443\u0434\u0438", "connected": "{entity_name} \u0441\u0432\u044a\u0440\u0437\u0430\u043d", "gas": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u0434\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430 \u0433\u0430\u0437", @@ -54,7 +53,6 @@ "light": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u0434\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430 \u0441\u0432\u0435\u0442\u043b\u0438\u043d\u0430", "locked": "{entity_name} \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d", "moist": "{entity_name} \u0441\u0442\u0430\u043d\u0430 \u0432\u043b\u0430\u0436\u0435\u043d", - "moist\u00a7": "{entity_name} \u0441\u0442\u0430\u0432\u0430 \u0432\u043b\u0430\u0436\u0435\u043d", "motion": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435", "moving": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435", "no_gas": "{entity_name} \u0441\u043f\u0440\u044f \u0434\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430 \u0433\u0430\u0437", diff --git a/homeassistant/components/binary_sensor/.translations/ca.json b/homeassistant/components/binary_sensor/.translations/ca.json index 8bbd19a0d45c..3a3485a3be71 100644 --- a/homeassistant/components/binary_sensor/.translations/ca.json +++ b/homeassistant/components/binary_sensor/.translations/ca.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "Bateria de {entity_name} baixa", - "closed": "{entity_name} est\u00e0 tancat", "cold": "{entity_name} es torna fred", "connected": "{entity_name} est\u00e0 connectat", "gas": "{entity_name} ha comen\u00e7at a detectar gas", @@ -54,7 +53,6 @@ "light": "{entity_name} ha comen\u00e7at a detectar llum", "locked": "{entity_name} est\u00e0 bloquejat", "moist": "{entity_name} es torna humit", - "moist\u00a7": "{entity_name} es torna humit", "motion": "{entity_name} ha comen\u00e7at a detectar moviment", "moving": "{entity_name} ha comen\u00e7at a moure's", "no_gas": "{entity_name} ha deixat de detectar gas", diff --git a/homeassistant/components/binary_sensor/.translations/da.json b/homeassistant/components/binary_sensor/.translations/da.json index 19229c16cb34..ffa68b094be4 100644 --- a/homeassistant/components/binary_sensor/.translations/da.json +++ b/homeassistant/components/binary_sensor/.translations/da.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} lavt batteriniveau", - "closed": "{entity_name} lukket", "cold": "{entity_name} blev kold", "connected": "{entity_name} tilsluttet", "gas": "{entity_name} begyndte at registrere gas", @@ -54,7 +53,6 @@ "light": "{entity_name} begyndte at registrere lys", "locked": "{entity_name} l\u00e5st", "moist": "{entity_name} blev fugtig", - "moist\u00a7": "{entity_name} blev fugtig", "motion": "{entity_name} begyndte at registrere bev\u00e6gelse", "moving": "{entity_name} begyndte at bev\u00e6ge sig", "no_gas": "{entity_name} stoppede med at registrere gas", diff --git a/homeassistant/components/binary_sensor/.translations/de.json b/homeassistant/components/binary_sensor/.translations/de.json index e246198864bb..55a079ca42af 100644 --- a/homeassistant/components/binary_sensor/.translations/de.json +++ b/homeassistant/components/binary_sensor/.translations/de.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} Batterie schwach", - "closed": "{entity_name} geschlossen", "cold": "{entity_name} wurde kalt", "connected": "{entity_name} verbunden", "gas": "{entity_name} hat Gas detektiert", @@ -54,7 +53,6 @@ "light": "{entity_name} hat Licht detektiert", "locked": "{entity_name} gesperrt", "moist": "{entity_name} wurde feucht", - "moist\u00a7": "{entity_name} wurde feucht", "motion": "{entity_name} hat Bewegungen detektiert", "moving": "{entity_name} hat angefangen sich zu bewegen", "no_gas": "{entity_name} hat kein Gas mehr erkannt", diff --git a/homeassistant/components/binary_sensor/.translations/en.json b/homeassistant/components/binary_sensor/.translations/en.json index 93b61893980e..213d947236ca 100644 --- a/homeassistant/components/binary_sensor/.translations/en.json +++ b/homeassistant/components/binary_sensor/.translations/en.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} battery low", - "closed": "{entity_name} closed", "cold": "{entity_name} became cold", "connected": "{entity_name} connected", "gas": "{entity_name} started detecting gas", @@ -54,7 +53,6 @@ "light": "{entity_name} started detecting light", "locked": "{entity_name} locked", "moist": "{entity_name} became moist", - "moist\u00a7": "{entity_name} became moist", "motion": "{entity_name} started detecting motion", "moving": "{entity_name} started moving", "no_gas": "{entity_name} stopped detecting gas", diff --git a/homeassistant/components/binary_sensor/.translations/es-419.json b/homeassistant/components/binary_sensor/.translations/es-419.json index e727e18775af..18b5e060818d 100644 --- a/homeassistant/components/binary_sensor/.translations/es-419.json +++ b/homeassistant/components/binary_sensor/.translations/es-419.json @@ -44,7 +44,6 @@ }, "trigger_type": { "bat_low": "{entity_name} bater\u00eda baja", - "closed": "{entity_name} cerrado", "cold": "{entity_name} se enfri\u00f3", "connected": "{entity_name} conectado", "gas": "{entity_name} comenz\u00f3 a detectar gas", @@ -52,7 +51,6 @@ "light": "{entity_name} comenz\u00f3 a detectar luz", "locked": "{entity_name} bloqueado", "moist": "{entity_name} se humedeci\u00f3", - "moist\u00a7": "{entity_name} se humedeci\u00f3", "motion": "{entity_name} comenz\u00f3 a detectar movimiento", "moving": "{entity_name} comenz\u00f3 a moverse", "no_gas": "{entity_name} dej\u00f3 de detectar gas", diff --git a/homeassistant/components/binary_sensor/.translations/es.json b/homeassistant/components/binary_sensor/.translations/es.json index 9720fb974f6b..02fbc4652522 100644 --- a/homeassistant/components/binary_sensor/.translations/es.json +++ b/homeassistant/components/binary_sensor/.translations/es.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} bater\u00eda baja", - "closed": "{entity_name} cerrado", "cold": "{entity_name} se enfri\u00f3", "connected": "{entity_name} conectado", "gas": "{entity_name} empez\u00f3 a detectar gas", @@ -54,7 +53,6 @@ "light": "{entity_name} empez\u00f3 a detectar la luz", "locked": "{entity_name} bloqueado", "moist": "{entity_name} se humedece", - "moist\u00a7": "{entity_name} se humedeci\u00f3", "motion": "{entity_name} comenz\u00f3 a detectar movimiento", "moving": "{entity_name} empez\u00f3 a moverse", "no_gas": "{entity_name} dej\u00f3 de detectar gas", diff --git a/homeassistant/components/binary_sensor/.translations/fr.json b/homeassistant/components/binary_sensor/.translations/fr.json index 65abfbcd0bd8..f5b2e2bfd97d 100644 --- a/homeassistant/components/binary_sensor/.translations/fr.json +++ b/homeassistant/components/binary_sensor/.translations/fr.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} batterie faible", - "closed": "{entity_name} ferm\u00e9", "cold": "{entity_name} est devenu froid", "connected": "{entity_name} connect\u00e9", "gas": "{entity_name} a commenc\u00e9 \u00e0 d\u00e9tecter du gaz", @@ -54,7 +53,6 @@ "light": "{entity_name} a commenc\u00e9 \u00e0 d\u00e9tecter la lumi\u00e8re", "locked": "{entity_name} verrouill\u00e9", "moist": "{entity_name} est devenu humide", - "moist\u00a7": "{entity_name} est devenu humide", "motion": "{entity_name} a commenc\u00e9 \u00e0 d\u00e9tecter du mouvement", "moving": "{entity_name} a commenc\u00e9 \u00e0 se d\u00e9placer", "no_gas": "{entity_name} a arr\u00eat\u00e9 de d\u00e9tecter le gaz", diff --git a/homeassistant/components/binary_sensor/.translations/hu.json b/homeassistant/components/binary_sensor/.translations/hu.json index 7ec9b5268e2f..d53e869e0756 100644 --- a/homeassistant/components/binary_sensor/.translations/hu.json +++ b/homeassistant/components/binary_sensor/.translations/hu.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} akkufesz\u00fclts\u00e9g alacsony", - "closed": "{entity_name} be lett csukva", "cold": "{entity_name} hideg lett", "connected": "{entity_name} csatlakozik", "gas": "{entity_name} g\u00e1zt \u00e9rz\u00e9kel", @@ -54,7 +53,6 @@ "light": "{entity_name} f\u00e9nyt \u00e9rz\u00e9kel", "locked": "{entity_name} be lett z\u00e1rva", "moist": "{entity_name} nedves lett", - "moist\u00a7": "{entity_name} nedves lett", "motion": "{entity_name} mozg\u00e1st \u00e9rz\u00e9kel", "moving": "{entity_name} mozog", "no_gas": "{entity_name} m\u00e1r nem \u00e9rz\u00e9kel g\u00e1zt", diff --git a/homeassistant/components/binary_sensor/.translations/it.json b/homeassistant/components/binary_sensor/.translations/it.json index 74d295f30559..db897b68da01 100644 --- a/homeassistant/components/binary_sensor/.translations/it.json +++ b/homeassistant/components/binary_sensor/.translations/it.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} batteria scarica", - "closed": "{entity_name} \u00e8 chiuso", "cold": "{entity_name} \u00e8 diventato freddo", "connected": "{entity_name} connesso", "gas": "{entity_name} ha iniziato a rilevare il gas", @@ -54,7 +53,6 @@ "light": "{entity_name} ha iniziato a rilevare la luce", "locked": "{entity_name} bloccato", "moist": "{entity_name} diventato umido", - "moist\u00a7": "{entity_name} \u00e8 diventato umido", "motion": "{entity_name} ha iniziato a rilevare il movimento", "moving": "{entity_name} ha iniziato a muoversi", "no_gas": "{entity_name} ha smesso la rilevazione di gas", diff --git a/homeassistant/components/binary_sensor/.translations/ko.json b/homeassistant/components/binary_sensor/.translations/ko.json index 7fa745a9a9a5..733d3a8de8fd 100644 --- a/homeassistant/components/binary_sensor/.translations/ko.json +++ b/homeassistant/components/binary_sensor/.translations/ko.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} \ubc30\ud130\ub9ac \uc794\ub7c9\uc774 \ubd80\uc871\ud574\uc9c8 \ub54c", - "closed": "{entity_name} \uc774(\uac00) \ub2eb\ud790 \ub54c", "cold": "{entity_name} \uc774(\uac00) \ucc28\uac00\uc6cc\uc9c8 \ub54c", "connected": "{entity_name} \uc774(\uac00) \uc5f0\uacb0\ub420 \ub54c", "gas": "{entity_name} \uc774(\uac00) \uac00\uc2a4\ub97c \uac10\uc9c0\ud560 \ub54c", @@ -54,7 +53,6 @@ "light": "{entity_name} \uc774(\uac00) \ube5b\uc744 \uac10\uc9c0\ud560 \ub54c", "locked": "{entity_name} \uc774(\uac00) \uc7a0\uae38 \ub54c", "moist": "{entity_name} \uc774(\uac00) \uc2b5\ud574\uc9c8 \ub54c", - "moist\u00a7": "{entity_name} \uc774(\uac00) \uc2b5\ud574\uc9c8 \ub54c", "motion": "{entity_name} \uc774(\uac00) \uc6c0\uc9c1\uc784\uc744 \uac10\uc9c0\ud560 \ub54c", "moving": "{entity_name} \uc774(\uac00) \uc6c0\uc9c1\uc77c \ub54c", "no_gas": "{entity_name} \uc774(\uac00) \uac00\uc2a4\ub97c \uac10\uc9c0\ud558\uc9c0 \uc54a\uac8c \ub420 \ub54c", diff --git a/homeassistant/components/binary_sensor/.translations/lb.json b/homeassistant/components/binary_sensor/.translations/lb.json index c65ae94396bb..7120b1bb2893 100644 --- a/homeassistant/components/binary_sensor/.translations/lb.json +++ b/homeassistant/components/binary_sensor/.translations/lb.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} Batterie niddereg", - "closed": "{entity_name} gouf zougemaach", "cold": "{entity_name} gouf kal", "connected": "{entity_name} ass verbonnen", "gas": "{entity_name} huet ugefaangen Gas z'entdecken", @@ -54,7 +53,6 @@ "light": "{entity_name} huet ugefange Luucht z'entdecken", "locked": "{entity_name} gespaart", "moist": "{entity_name} gouf fiicht", - "moist\u00a7": "{entity_name} gouf fiicht", "motion": "{entity_name} huet ugefaange Beweegung z'entdecken", "moving": "{entity_name} huet ugefaangen sech ze beweegen", "no_gas": "{entity_name} huet opgehale Gas z'entdecken", diff --git a/homeassistant/components/binary_sensor/.translations/nl.json b/homeassistant/components/binary_sensor/.translations/nl.json index 508a06b38a2a..04d40ecf9b8b 100644 --- a/homeassistant/components/binary_sensor/.translations/nl.json +++ b/homeassistant/components/binary_sensor/.translations/nl.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} batterij bijna leeg", - "closed": "{entity_name} gesloten", "cold": "{entity_name} werd koud", "connected": "{entity_name} verbonden", "gas": "{entity_name} begon gas te detecteren", @@ -54,7 +53,6 @@ "light": "{entity_name} begon licht te detecteren", "locked": "{entity_name} vergrendeld", "moist": "{entity_name} werd vochtig", - "moist\u00a7": "{entity_name} werd vochtig", "motion": "{entity_name} begon beweging te detecteren", "moving": "{entity_name} begon te bewegen", "no_gas": "{entity_name} is gestopt met het detecteren van gas", diff --git a/homeassistant/components/binary_sensor/.translations/no.json b/homeassistant/components/binary_sensor/.translations/no.json index 4194102948b8..b82dd8b05337 100644 --- a/homeassistant/components/binary_sensor/.translations/no.json +++ b/homeassistant/components/binary_sensor/.translations/no.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} lavt batteri", - "closed": "{entity_name} stengt", "cold": "{entity_name} ble kald", "connected": "{entity_name} tilkoblet", "gas": "{entity_name} begynte \u00e5 registrere gass", @@ -54,7 +53,6 @@ "light": "{entity_name} begynte \u00e5 registrere lys", "locked": "{entity_name} l\u00e5st", "moist": "{entity_name} ble fuktig", - "moist\u00a7": "{entity_name} ble fuktig", "motion": "{entity_name} begynte \u00e5 registrere bevegelse", "moving": "{entity_name} begynte \u00e5 bevege seg", "no_gas": "{entity_name} sluttet \u00e5 registrere gass", diff --git a/homeassistant/components/binary_sensor/.translations/pl.json b/homeassistant/components/binary_sensor/.translations/pl.json index bc474e3d514f..ef174e723364 100644 --- a/homeassistant/components/binary_sensor/.translations/pl.json +++ b/homeassistant/components/binary_sensor/.translations/pl.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "nast\u0105pi roz\u0142adowanie baterii {entity_name}", - "closed": "nast\u0105pi zamkni\u0119cie {entity_name}", "cold": "sensor {entity_name} wykryje zimno", "connected": "nast\u0105pi pod\u0142\u0105czenie {entity_name}", "gas": "sensor {entity_name} wykryje gaz", @@ -54,7 +53,6 @@ "light": "sensor {entity_name} wykryje \u015bwiat\u0142o", "locked": "nast\u0105pi zamkni\u0119cie {entity_name}", "moist": "nast\u0105pi wykrycie wilgoci {entity_name}", - "moist\u00a7": "sensor {entity_name} wykryje wilgo\u0107", "motion": "sensor {entity_name} wykryje ruch", "moving": "sensor {entity_name} zacznie porusza\u0107 si\u0119", "no_gas": "sensor {entity_name} przestanie wykrywa\u0107 gaz", diff --git a/homeassistant/components/binary_sensor/.translations/pt.json b/homeassistant/components/binary_sensor/.translations/pt.json index aa16576d2c13..caea4c6c97a0 100644 --- a/homeassistant/components/binary_sensor/.translations/pt.json +++ b/homeassistant/components/binary_sensor/.translations/pt.json @@ -17,7 +17,6 @@ "is_vibration": "{entity_name} est\u00e1 a detectar vibra\u00e7\u00f5es" }, "trigger_type": { - "closed": "{entity_name} est\u00e1 fechado", "moist": "ficou h\u00famido {entity_name}", "not_opened": "fechado {entity_name}", "not_plugged_in": "{entity_name} desligado", diff --git a/homeassistant/components/binary_sensor/.translations/ru.json b/homeassistant/components/binary_sensor/.translations/ru.json index 4c9cfb99a1cc..fe1323c67448 100644 --- a/homeassistant/components/binary_sensor/.translations/ru.json +++ b/homeassistant/components/binary_sensor/.translations/ru.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0439 \u0437\u0430\u0440\u044f\u0434", - "closed": "{entity_name} \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f", "cold": "{entity_name} \u043e\u0445\u043b\u0430\u0436\u0434\u0430\u0435\u0442\u0441\u044f", "connected": "{entity_name} \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", "gas": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0433\u0430\u0437", @@ -54,7 +53,6 @@ "light": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u0435\u0442", "locked": "{entity_name} \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f", "moist": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u043b\u0430\u0433\u0443", - "moist\u00a7": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u043b\u0430\u0433\u0443", "motion": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435", "moving": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435", "no_gas": "{entity_name} \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0433\u0430\u0437", diff --git a/homeassistant/components/binary_sensor/.translations/sl.json b/homeassistant/components/binary_sensor/.translations/sl.json index 2004caeb3428..234146e2e6f6 100644 --- a/homeassistant/components/binary_sensor/.translations/sl.json +++ b/homeassistant/components/binary_sensor/.translations/sl.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} ima prazno baterijo", - "closed": "{entity_name} zaprto", "cold": "{entity_name} je postal hladen", "connected": "{entity_name} povezan", "gas": "{entity_name} za\u010del zaznavati plin", @@ -54,7 +53,6 @@ "light": "{entity_name} za\u010del zaznavati svetlobo", "locked": "{entity_name} zaklenjen", "moist": "{entity_name} postal vla\u017een", - "moist\u00a7": "{entity_name} postal vla\u017een", "motion": "{entity_name} za\u010del zaznavati gibanje", "moving": "{entity_name} se je za\u010del premikati", "no_gas": "{entity_name} prenehal zaznavati plin", diff --git a/homeassistant/components/binary_sensor/.translations/sv.json b/homeassistant/components/binary_sensor/.translations/sv.json index 5df2ce17c92b..ec5d57daa791 100644 --- a/homeassistant/components/binary_sensor/.translations/sv.json +++ b/homeassistant/components/binary_sensor/.translations/sv.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name} batteri l\u00e5gt", - "closed": "{entity_name} st\u00e4ngd", "cold": "{entity_name} blev kall", "connected": "{entity_name} ansluten", "gas": "{entity_name} b\u00f6rjade detektera gas", @@ -54,7 +53,6 @@ "light": "{entity_name} b\u00f6rjade uppt\u00e4cka ljus", "locked": "{entity_name} l\u00e5st", "moist": "{entity_name} blev fuktig", - "moist\u00a7": "{entity_name} blev fuktig", "motion": "{entity_name} b\u00f6rjade detektera r\u00f6relse", "moving": "{entity_name} b\u00f6rjade r\u00f6ra sig", "no_gas": "{entity_name} slutade uppt\u00e4cka gas", diff --git a/homeassistant/components/binary_sensor/.translations/zh-Hans.json b/homeassistant/components/binary_sensor/.translations/zh-Hans.json index aeb24e5056a1..9ad8e67e6b8d 100644 --- a/homeassistant/components/binary_sensor/.translations/zh-Hans.json +++ b/homeassistant/components/binary_sensor/.translations/zh-Hans.json @@ -44,7 +44,6 @@ }, "trigger_type": { "bat_low": "{entity_name} \u7535\u6c60\u7535\u91cf\u4f4e", - "closed": "{entity_name} \u5df2\u5173\u95ed", "cold": "{entity_name} \u53d8\u51b7", "connected": "{entity_name} \u5df2\u8fde\u63a5", "gas": "{entity_name} \u5f00\u59cb\u68c0\u6d4b\u5230\u71c3\u6c14\u6cc4\u6f0f", diff --git a/homeassistant/components/binary_sensor/.translations/zh-Hant.json b/homeassistant/components/binary_sensor/.translations/zh-Hant.json index 712c0fbd7c1b..7b48833dd7b5 100644 --- a/homeassistant/components/binary_sensor/.translations/zh-Hant.json +++ b/homeassistant/components/binary_sensor/.translations/zh-Hant.json @@ -46,7 +46,6 @@ }, "trigger_type": { "bat_low": "{entity_name}\u96fb\u91cf\u4f4e", - "closed": "{entity_name}\u5df2\u95dc\u9589", "cold": "{entity_name}\u5df2\u8b8a\u51b7", "connected": "{entity_name}\u5df2\u9023\u7dda", "gas": "{entity_name}\u5df2\u958b\u59cb\u5075\u6e2c\u6c23\u9ad4", @@ -54,7 +53,6 @@ "light": "{entity_name}\u5df2\u958b\u59cb\u5075\u6e2c\u5149\u7dda", "locked": "{entity_name}\u5df2\u4e0a\u9396", "moist": "{entity_name}\u5df2\u8b8a\u6f6e\u6fd5", - "moist\u00a7": "{entity_name}\u5df2\u8b8a\u6f6e\u6fd5", "motion": "{entity_name}\u5df2\u5075\u6e2c\u5230\u52d5\u4f5c", "moving": "{entity_name}\u958b\u59cb\u79fb\u52d5", "no_gas": "{entity_name}\u5df2\u505c\u6b62\u5075\u6e2c\u6c23\u9ad4", diff --git a/homeassistant/components/cert_expiry/.translations/bg.json b/homeassistant/components/cert_expiry/.translations/bg.json index a4a36cb04dca..cf89911071b0 100644 --- a/homeassistant/components/cert_expiry/.translations/bg.json +++ b/homeassistant/components/cert_expiry/.translations/bg.json @@ -1,15 +1,8 @@ { "config": { - "abort": { - "host_port_exists": "\u0422\u0430\u0437\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442 \u0435 \u0432\u0435\u0447\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0430" - }, "error": { - "certificate_error": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0430\u043d", - "certificate_fetch_failed": "\u041d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043c\u0438\u0437\u0432\u043b\u0435\u0447\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043e\u0442 \u0442\u0430\u0437\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442", "connection_timeout": "\u041d\u0435\u0432\u044a\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442 \u0437\u0430 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 \u0442\u043e\u0437\u0438 \u0430\u0434\u0440\u0435\u0441", - "host_port_exists": "\u0422\u0430\u0437\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442 \u0435 \u0432\u0435\u0447\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0430", - "resolve_failed": "\u0422\u043e\u0437\u0438 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d", - "wrong_host": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u043d\u0435 \u0441\u044a\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0430 \u043d\u0430 \u0438\u043c\u0435\u0442\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0430" + "resolve_failed": "\u0422\u043e\u0437\u0438 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/ca.json b/homeassistant/components/cert_expiry/.translations/ca.json index 4786e258ff85..dce3519f09f0 100644 --- a/homeassistant/components/cert_expiry/.translations/ca.json +++ b/homeassistant/components/cert_expiry/.translations/ca.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Aquesta combinaci\u00f3 d'amfitri\u00f3 i port ja est\u00e0 configurada", - "host_port_exists": "Aquesta combinaci\u00f3 d'amfitri\u00f3 i port ja est\u00e0 configurada", "import_failed": "La importaci\u00f3 des de configuraci\u00f3 ha fallat" }, "error": { - "certificate_error": "El certificat no ha pogut ser validat", - "certificate_fetch_failed": "No s'ha pogut obtenir el certificat des d'aquesta combinaci\u00f3 d'amfitri\u00f3 i port", "connection_refused": "La connexi\u00f3 s'ha rebutjat en connectar-se a l'amfitri\u00f3", "connection_timeout": "S'ha acabat el temps d'espera durant la connexi\u00f3 amb l'amfitri\u00f3.", - "host_port_exists": "Aquesta combinaci\u00f3 d'amfitri\u00f3 i port ja est\u00e0 configurada", - "resolve_failed": "No s'ha pogut resoldre l'amfitri\u00f3", - "wrong_host": "El certificat no coincideix amb el nom de l'amfitri\u00f3" + "resolve_failed": "No s'ha pogut resoldre l'amfitri\u00f3" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/da.json b/homeassistant/components/cert_expiry/.translations/da.json index 26ee436860aa..cf5f42338c34 100644 --- a/homeassistant/components/cert_expiry/.translations/da.json +++ b/homeassistant/components/cert_expiry/.translations/da.json @@ -1,15 +1,8 @@ { "config": { - "abort": { - "host_port_exists": "Denne v\u00e6rt- og portkombination er allerede konfigureret" - }, "error": { - "certificate_error": "Certifikatet kunne ikke valideres", - "certificate_fetch_failed": "Kan ikke hente certifikat fra denne v\u00e6rt- og portkombination", "connection_timeout": "Timeout ved tilslutning til denne v\u00e6rt", - "host_port_exists": "Denne v\u00e6rt- og portkombination er allerede konfigureret", - "resolve_failed": "V\u00e6rten kunne ikke findes", - "wrong_host": "Certifikatet stemmer ikke overens med v\u00e6rtsnavnet" + "resolve_failed": "V\u00e6rten kunne ikke findes" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/de.json b/homeassistant/components/cert_expiry/.translations/de.json index edf116203c71..119d172690a8 100644 --- a/homeassistant/components/cert_expiry/.translations/de.json +++ b/homeassistant/components/cert_expiry/.translations/de.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Diese Kombination aus Host und Port ist bereits konfiguriert.", - "host_port_exists": "Diese Kombination aus Host und Port ist bereits konfiguriert.", "import_failed": "Import aus Konfiguration fehlgeschlagen" }, "error": { - "certificate_error": "Zertifikat konnte nicht validiert werden", - "certificate_fetch_failed": "Zertifikat kann von dieser Kombination aus Host und Port nicht abgerufen werden", "connection_refused": "Verbindung beim Herstellen einer Verbindung zum Host abgelehnt", "connection_timeout": "Zeit\u00fcberschreitung beim Herstellen einer Verbindung mit diesem Host", - "host_port_exists": "Diese Kombination aus Host und Port ist bereits konfiguriert.", - "resolve_failed": "Dieser Host kann nicht aufgel\u00f6st werden", - "wrong_host": "Zertifikat stimmt nicht mit Hostname \u00fcberein" + "resolve_failed": "Dieser Host kann nicht aufgel\u00f6st werden" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/en.json b/homeassistant/components/cert_expiry/.translations/en.json index 1c1b9a882e31..5aca41f7f78a 100644 --- a/homeassistant/components/cert_expiry/.translations/en.json +++ b/homeassistant/components/cert_expiry/.translations/en.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "This host and port combination is already configured", - "host_port_exists": "This host and port combination is already configured", "import_failed": "Import from config failed" }, "error": { - "certificate_error": "Certificate could not be validated", - "certificate_fetch_failed": "Can not fetch certificate from this host and port combination", "connection_refused": "Connection refused when connecting to host", "connection_timeout": "Timeout when connecting to this host", - "host_port_exists": "This host and port combination is already configured", - "resolve_failed": "This host can not be resolved", - "wrong_host": "Certificate does not match hostname" + "resolve_failed": "This host can not be resolved" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/es-419.json b/homeassistant/components/cert_expiry/.translations/es-419.json index e350faffcb3d..4e0b1ffca5d2 100644 --- a/homeassistant/components/cert_expiry/.translations/es-419.json +++ b/homeassistant/components/cert_expiry/.translations/es-419.json @@ -1,15 +1,8 @@ { "config": { - "abort": { - "host_port_exists": "Esta combinaci\u00f3n de host y puerto ya est\u00e1 configurada" - }, "error": { - "certificate_error": "El certificado no pudo ser validado", - "certificate_fetch_failed": "No se puede recuperar el certificado de esta combinaci\u00f3n de host y puerto", "connection_timeout": "Tiempo de espera al conectarse a este host", - "host_port_exists": "Esta combinaci\u00f3n de host y puerto ya est\u00e1 configurada", - "resolve_failed": "Este host no puede resolverse", - "wrong_host": "El certificado no coincide con el nombre de host" + "resolve_failed": "Este host no puede resolverse" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/es.json b/homeassistant/components/cert_expiry/.translations/es.json index 628f2b22e210..7cc44d7038ab 100644 --- a/homeassistant/components/cert_expiry/.translations/es.json +++ b/homeassistant/components/cert_expiry/.translations/es.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Esta combinaci\u00f3n de host y puerto ya est\u00e1 configurada", - "host_port_exists": "Esta combinaci\u00f3n de host y puerto ya est\u00e1 configurada", "import_failed": "No se pudo importar desde la configuraci\u00f3n" }, "error": { - "certificate_error": "El certificado no pudo ser validado", - "certificate_fetch_failed": "No se puede obtener el certificado de esta combinaci\u00f3n de host y puerto", "connection_refused": "Conexi\u00f3n rechazada al conectarse al host", "connection_timeout": "Tiempo de espera agotado al conectar a este host", - "host_port_exists": "Esta combinaci\u00f3n de host y puerto ya est\u00e1 configurada", - "resolve_failed": "Este host no se puede resolver", - "wrong_host": "El certificado no coincide con el nombre de host" + "resolve_failed": "Este host no se puede resolver" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/fr.json b/homeassistant/components/cert_expiry/.translations/fr.json index 245b899fadf6..18398a2b0481 100644 --- a/homeassistant/components/cert_expiry/.translations/fr.json +++ b/homeassistant/components/cert_expiry/.translations/fr.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Cette combinaison h\u00f4te et port est d\u00e9j\u00e0 configur\u00e9e", - "host_port_exists": "Cette combinaison h\u00f4te / port est d\u00e9j\u00e0 configur\u00e9e", "import_failed": "\u00c9chec de l'importation \u00e0 partir de la configuration" }, "error": { - "certificate_error": "Le certificat n'a pas pu \u00eatre valid\u00e9", - "certificate_fetch_failed": "Impossible de r\u00e9cup\u00e9rer le certificat de cette combinaison h\u00f4te / port", "connection_refused": "Connexion refus\u00e9e lors de la connexion \u00e0 l'h\u00f4te", "connection_timeout": "D\u00e9lai d'attente lors de la connexion \u00e0 cet h\u00f4te", - "host_port_exists": "Cette combinaison h\u00f4te / port est d\u00e9j\u00e0 configur\u00e9e", - "resolve_failed": "Cet h\u00f4te ne peut pas \u00eatre r\u00e9solu", - "wrong_host": "Le certificat ne correspond pas au nom d'h\u00f4te" + "resolve_failed": "Cet h\u00f4te ne peut pas \u00eatre r\u00e9solu" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/it.json b/homeassistant/components/cert_expiry/.translations/it.json index e7a2801423d8..e88afa7caefc 100644 --- a/homeassistant/components/cert_expiry/.translations/it.json +++ b/homeassistant/components/cert_expiry/.translations/it.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Questa combinazione di host e porta \u00e8 gi\u00e0 configurata", - "host_port_exists": "Questa combinazione di host e porta \u00e8 gi\u00e0 configurata", "import_failed": "Importazione dalla configurazione non riuscita" }, "error": { - "certificate_error": "Il certificato non pu\u00f2 essere convalidato", - "certificate_fetch_failed": "Non \u00e8 possibile recuperare il certificato da questa combinazione di host e porta", "connection_refused": "Connessione rifiutata durante la connessione all'host", "connection_timeout": "Tempo scaduto collegandosi a questo host", - "host_port_exists": "Questa combinazione di host e porta \u00e8 gi\u00e0 configurata", - "resolve_failed": "Questo host non pu\u00f2 essere risolto", - "wrong_host": "Il certificato non corrisponde al nome host" + "resolve_failed": "Questo host non pu\u00f2 essere risolto" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/ko.json b/homeassistant/components/cert_expiry/.translations/ko.json index 060bf6e26bd7..962f9ebe42cd 100644 --- a/homeassistant/components/cert_expiry/.translations/ko.json +++ b/homeassistant/components/cert_expiry/.translations/ko.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "\ud638\uc2a4\ud2b8\uc640 \ud3ec\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", - "host_port_exists": "\ud638\uc2a4\ud2b8\uc640 \ud3ec\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "import_failed": "\uad6c\uc131\uc5d0\uc11c \uac00\uc838\uc624\uae30 \uc2e4\ud328" }, "error": { - "certificate_error": "\uc778\uc99d\uc11c\ub97c \ud655\uc778\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", - "certificate_fetch_failed": "\ud574\ub2f9 \ud638\uc2a4\ud2b8\uc640 \ud3ec\ud2b8\uc5d0\uc11c \uc778\uc99d\uc11c\ub97c \uac00\uc838 \uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", "connection_refused": "\ud638\uc2a4\ud2b8\uc5d0 \uc5f0\uacb0\uc774 \uac70\ubd80\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "connection_timeout": "\ud638\uc2a4\ud2b8 \uc5f0\uacb0 \uc2dc\uac04\uc774 \ucd08\uacfc\ud588\uc2b5\ub2c8\ub2e4", - "host_port_exists": "\ud638\uc2a4\ud2b8\uc640 \ud3ec\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", - "resolve_failed": "\ud638\uc2a4\ud2b8\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", - "wrong_host": "\uc778\uc99d\uc11c\uac00 \ud638\uc2a4\ud2b8 \uc774\ub984\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4" + "resolve_failed": "\ud638\uc2a4\ud2b8\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/lb.json b/homeassistant/components/cert_expiry/.translations/lb.json index 77aa6093dfaf..55ac013f96a6 100644 --- a/homeassistant/components/cert_expiry/.translations/lb.json +++ b/homeassistant/components/cert_expiry/.translations/lb.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "D\u00ebs Kombinatioun vun Host an Port sinn scho konfigur\u00e9iert", - "host_port_exists": "D\u00ebsen Host an Port sinn scho konfigur\u00e9iert", "import_failed": "Import vun der Konfiguratioun feelgeschloen" }, "error": { - "certificate_error": "Zertifikat konnt net valid\u00e9iert ginn", - "certificate_fetch_failed": "Kann keen Zertifikat vun d\u00ebsen Host a Port recuper\u00e9ieren", "connection_refused": "Verbindung refus\u00e9iert beim verbannen mam Host", "connection_timeout": "Z\u00e4it Iwwerschreidung beim verbannen.", - "host_port_exists": "D\u00ebsen Host an Port sinn scho konfigur\u00e9iert", - "resolve_failed": "D\u00ebsen Host kann net opgel\u00e9ist ginn", - "wrong_host": "Zertifikat entspr\u00e9cht net den Numm vum Apparat" + "resolve_failed": "D\u00ebsen Host kann net opgel\u00e9ist ginn" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/nl.json b/homeassistant/components/cert_expiry/.translations/nl.json index 0544c8c02c14..7c9fbe675657 100644 --- a/homeassistant/components/cert_expiry/.translations/nl.json +++ b/homeassistant/components/cert_expiry/.translations/nl.json @@ -1,15 +1,8 @@ { "config": { - "abort": { - "host_port_exists": "Deze combinatie van host en poort is al geconfigureerd" - }, "error": { - "certificate_error": "Certificaat kon niet worden gevalideerd", - "certificate_fetch_failed": "Kan certificaat niet ophalen van deze combinatie van host en poort", "connection_timeout": "Time-out bij verbinding maken met deze host", - "host_port_exists": "Deze combinatie van host en poort is al geconfigureerd", - "resolve_failed": "Deze host kon niet gevonden worden", - "wrong_host": "Certificaat komt niet overeen met hostnaam" + "resolve_failed": "Deze host kon niet gevonden worden" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/no.json b/homeassistant/components/cert_expiry/.translations/no.json index e5faab749950..a798ead27b6b 100644 --- a/homeassistant/components/cert_expiry/.translations/no.json +++ b/homeassistant/components/cert_expiry/.translations/no.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Denne verts- og portkombinasjonen er allerede konfigurert", - "host_port_exists": "Denne verts- og portkombinasjonen er allerede konfigurert", "import_failed": "Import fra config mislyktes" }, "error": { - "certificate_error": "Sertifikatet kunne ikke valideres", - "certificate_fetch_failed": "Kan ikke hente sertifikat fra denne verts- og portkombinasjonen", "connection_refused": "Tilkoblingen ble nektet da den koblet til verten", "connection_timeout": "Tidsavbrudd n\u00e5r du kobler til denne verten", - "host_port_exists": "Denne verts- og portkombinasjonen er allerede konfigurert", - "resolve_failed": "Denne verten kan ikke l\u00f8ses", - "wrong_host": "Sertifikatet samsvarer ikke med vertsnavn" + "resolve_failed": "Denne verten kan ikke l\u00f8ses" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/pl.json b/homeassistant/components/cert_expiry/.translations/pl.json index a4806ff13aaa..510b75658a2a 100644 --- a/homeassistant/components/cert_expiry/.translations/pl.json +++ b/homeassistant/components/cert_expiry/.translations/pl.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Ta kombinacja hosta i portu jest ju\u017c skonfigurowana", - "host_port_exists": "Ten host z tym portem jest ju\u017c skonfigurowany.", "import_failed": "Import z konfiguracji nie powi\u00f3d\u0142 si\u0119" }, "error": { - "certificate_error": "Nie mo\u017cna zweryfikowa\u0107 certyfikatu", - "certificate_fetch_failed": "Nie mo\u017cna pobra\u0107 certyfikatu z tej kombinacji hosta i portu", "connection_refused": "Po\u0142\u0105czenie odrzucone podczas \u0142\u0105czenia z hostem", "connection_timeout": "Przekroczono limit czasu po\u0142\u0105czenia z hostem.", - "host_port_exists": "Ten host z tym portem jest ju\u017c skonfigurowany.", - "resolve_failed": "Tego hosta nie mo\u017cna rozwi\u0105za\u0107", - "wrong_host": "Certyfikat nie pasuje do nazwy hosta" + "resolve_failed": "Tego hosta nie mo\u017cna rozwi\u0105za\u0107" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/pt-BR.json b/homeassistant/components/cert_expiry/.translations/pt-BR.json index 06534314e009..0c0e272e23bf 100644 --- a/homeassistant/components/cert_expiry/.translations/pt-BR.json +++ b/homeassistant/components/cert_expiry/.translations/pt-BR.json @@ -1,12 +1,7 @@ { "config": { - "abort": { - "host_port_exists": "Essa combina\u00e7\u00e3o de host e porta j\u00e1 est\u00e1 configurada" - }, "error": { - "certificate_fetch_failed": "N\u00e3o \u00e9 poss\u00edvel buscar o certificado dessa combina\u00e7\u00e3o de host e porta", "connection_timeout": "Tempo limite ao conectar-se a este host", - "host_port_exists": "Essa combina\u00e7\u00e3o de host e porta j\u00e1 est\u00e1 configurada", "resolve_failed": "Este host n\u00e3o pode ser resolvido" }, "step": { diff --git a/homeassistant/components/cert_expiry/.translations/ru.json b/homeassistant/components/cert_expiry/.translations/ru.json index 04a41704500d..39c78acc4c0e 100644 --- a/homeassistant/components/cert_expiry/.translations/ru.json +++ b/homeassistant/components/cert_expiry/.translations/ru.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "\u042d\u0442\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u0438 \u043f\u043e\u0440\u0442\u0430 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.", - "host_port_exists": "\u042d\u0442\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u0438 \u043f\u043e\u0440\u0442\u0430 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.", "import_failed": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438." }, "error": { - "certificate_error": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442.", - "certificate_fetch_failed": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0445\u043e\u0441\u0442\u0430 \u0438 \u043f\u043e\u0440\u0442\u0430.", "connection_refused": "\u041f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0445\u043e\u0441\u0442\u0443 \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438.", "connection_timeout": "\u0418\u0441\u0442\u0435\u043a\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0445\u043e\u0441\u0442\u0443.", - "host_port_exists": "\u042d\u0442\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u0438 \u043f\u043e\u0440\u0442\u0430 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.", - "resolve_failed": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0441\u0442.", - "wrong_host": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438." + "resolve_failed": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0441\u0442." }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/sl.json b/homeassistant/components/cert_expiry/.translations/sl.json index 284b0b960ba3..605eb0b8182b 100644 --- a/homeassistant/components/cert_expiry/.translations/sl.json +++ b/homeassistant/components/cert_expiry/.translations/sl.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "Ta kombinacija gostitelja in vrat je \u017ee konfigurirana", - "host_port_exists": "Ta kombinacija gostitelja in vrat je \u017ee konfigurirana", "import_failed": "Uvoz iz konfiguracije ni uspel" }, "error": { - "certificate_error": "Certifikata ni bilo mogo\u010de preveriti", - "certificate_fetch_failed": "Iz te kombinacije gostitelja in vrat ni mogo\u010de pridobiti potrdila", "connection_refused": "Povezava zavrnjena, ko ste se povezali z gostiteljem", "connection_timeout": "\u010casovna omejitev za povezavo s tem gostiteljem je potekla", - "host_port_exists": "Ta kombinacija gostitelja in vrat je \u017ee konfigurirana", - "resolve_failed": "Tega gostitelja ni mogo\u010de razre\u0161iti", - "wrong_host": "Potrdilo se ne ujema z imenom gostitelja" + "resolve_failed": "Tega gostitelja ni mogo\u010de razre\u0161iti" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/sv.json b/homeassistant/components/cert_expiry/.translations/sv.json index bdccf51b2cd1..2655bb40f08d 100644 --- a/homeassistant/components/cert_expiry/.translations/sv.json +++ b/homeassistant/components/cert_expiry/.translations/sv.json @@ -1,15 +1,8 @@ { "config": { - "abort": { - "host_port_exists": "Denna v\u00e4rd- och portkombination \u00e4r redan konfigurerad" - }, "error": { - "certificate_error": "Certifikatet kunde inte valideras", - "certificate_fetch_failed": "Kan inte h\u00e4mta certifikat fr\u00e5n denna v\u00e4rd- och portkombination", "connection_timeout": "Timeout vid anslutning till den h\u00e4r v\u00e4rden", - "host_port_exists": "Denna v\u00e4rd- och portkombination \u00e4r redan konfigurerad", - "resolve_failed": "Denna v\u00e4rd kan inte resolveras", - "wrong_host": "Certifikatet matchar inte v\u00e4rdnamnet" + "resolve_failed": "Denna v\u00e4rd kan inte resolveras" }, "step": { "user": { diff --git a/homeassistant/components/cert_expiry/.translations/zh-Hant.json b/homeassistant/components/cert_expiry/.translations/zh-Hant.json index 833e2370ddef..f08e3e277e96 100644 --- a/homeassistant/components/cert_expiry/.translations/zh-Hant.json +++ b/homeassistant/components/cert_expiry/.translations/zh-Hant.json @@ -2,17 +2,12 @@ "config": { "abort": { "already_configured": "\u6b64\u4e3b\u6a5f\u7aef\u8207\u901a\u8a0a\u57e0\u7d44\u5408\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", - "host_port_exists": "\u6b64\u4e3b\u6a5f\u7aef\u8207\u901a\u8a0a\u57e0\u7d44\u5408\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "import_failed": "\u532f\u5165\u8a2d\u5b9a\u5931\u6557" }, "error": { - "certificate_error": "\u8a8d\u8b49\u7121\u6cd5\u78ba\u8a8d", - "certificate_fetch_failed": "\u7121\u6cd5\u81ea\u6b64\u4e3b\u6a5f\u7aef\u8207\u901a\u8a0a\u57e0\u7d44\u5408\u7372\u5f97\u8a8d\u8b49", "connection_refused": "\u9023\u7dda\u81f3\u4e3b\u6a5f\u6642\u906d\u62d2\u7d55", "connection_timeout": "\u9023\u7dda\u81f3\u4e3b\u6a5f\u7aef\u903e\u6642", - "host_port_exists": "\u6b64\u4e3b\u6a5f\u7aef\u8207\u901a\u8a0a\u57e0\u7d44\u5408\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", - "resolve_failed": "\u4e3b\u6a5f\u7aef\u7121\u6cd5\u89e3\u6790", - "wrong_host": "\u8a8d\u8b49\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26\u5408" + "resolve_failed": "\u4e3b\u6a5f\u7aef\u7121\u6cd5\u89e3\u6790" }, "step": { "user": { diff --git a/homeassistant/components/cover/.translations/lb.json b/homeassistant/components/cover/.translations/lb.json index 07742d4f0e0f..4cbbf3488728 100644 --- a/homeassistant/components/cover/.translations/lb.json +++ b/homeassistant/components/cover/.translations/lb.json @@ -13,8 +13,8 @@ "is_closing": "{entity_name} g\u00ebtt zougemaach", "is_open": "{entity_name} ass op", "is_opening": "{entity_name} g\u00ebtt opgemaach", - "is_position": "{entity_name} positioun ass", - "is_tilt_position": "{entity_name} kipp positioun ass" + "is_position": "Aktuell {entity_name} positioun ass", + "is_tilt_position": "Aktuell {entity_name} kipp positioun ass" }, "trigger_type": { "closed": "{entity_name} gouf zougemaach", diff --git a/homeassistant/components/deconz/.translations/bg.json b/homeassistant/components/deconz/.translations/bg.json index fb75fc81f5fe..3bcbb5923019 100644 --- a/homeassistant/components/deconz/.translations/bg.json +++ b/homeassistant/components/deconz/.translations/bg.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee \u0448\u043b\u044e\u0437 ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043d\u0438 \u0441\u0435\u043d\u0437\u043e\u0440\u0438", - "allow_deconz_groups": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0433\u0440\u0443\u043f\u0438 \u043e\u0442 deCONZ" - }, "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 Home Assistant \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0437\u0432\u0430 \u0441 deCONZ \u0431\u0430\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043a\u0430\u0442\u0430 \u0437\u0430 hass.io {addon}?", "title": "deCONZ Zigbee \u0431\u0430\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0447\u0440\u0435\u0437 Hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430" }, @@ -31,13 +27,6 @@ "link": { "description": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438 deCONZ \u0448\u043b\u044e\u0437\u0430 \u0437\u0430 \u0434\u0430 \u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430 \u0441 Home Assistant.\n\n1. \u041e\u0442\u0438\u0434\u0435\u0442\u0435 \u043d\u0430 deCONZ Settings -> Gateway -> Advanced\n2. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 \"Authenticate app\"", "title": "\u0412\u0440\u044a\u0437\u043a\u0430 \u0441 deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043d\u0438 \u0441\u0435\u043d\u0437\u043e\u0440\u0438", - "allow_deconz_groups": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0433\u0440\u0443\u043f\u0438 \u043e\u0442 deCONZ" - }, - "title": "\u0414\u043e\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u043e\u043f\u0446\u0438\u0438 \u0437\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 deCONZ" } }, "title": "deCONZ Zigbee \u0448\u043b\u044e\u0437" @@ -90,13 +79,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 deCONZ CLIP \u0441\u0435\u043d\u0437\u043e\u0440\u0438", - "allow_deconz_groups": "\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 deCONZ \u0441\u0432\u0435\u0442\u043b\u0438\u043d\u043d\u0438 \u0433\u0440\u0443\u043f\u0438" - }, - "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0442\u0430 \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 deCONZ CLIP \u0441\u0435\u043d\u0437\u043e\u0440\u0438", diff --git a/homeassistant/components/deconz/.translations/ca.json b/homeassistant/components/deconz/.translations/ca.json index e690d597dce8..ee386bece554 100644 --- a/homeassistant/components/deconz/.translations/ca.json +++ b/homeassistant/components/deconz/.translations/ca.json @@ -14,10 +14,6 @@ "flow_title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Permet la importaci\u00f3 de sensors virtuals", - "allow_deconz_groups": "Permet la importaci\u00f3 de grups deCONZ" - }, "description": "Vols configurar Home Assistant perqu\u00e8 es connecti amb la passarel\u00b7la deCONZ proporcionada pel complement de Hass.io: {addon}?", "title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee (complement de Hass.io)" }, @@ -31,13 +27,6 @@ "link": { "description": "Desbloqueja la teva passarel\u00b7la d'enlla\u00e7 deCONZ per a registrar-te amb Home Assistant.\n\n1. V\u00e9s a la configuraci\u00f3 del sistema deCONZ -> Passarel\u00b7la -> Avan\u00e7at\n2. Prem el bot\u00f3 \"Autenticar applicaci\u00f3\"", "title": "Vincular amb deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Permet la importaci\u00f3 de sensors virtuals", - "allow_deconz_groups": "Permetre la importaci\u00f3 de grups deCONZ" - }, - "title": "Opcions de configuraci\u00f3 addicionals de deCONZ" } }, "title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Permet sensors deCONZ CLIP", - "allow_deconz_groups": "Permet grups de llums deCONZ" - }, - "description": "Configura la visibilitat dels tipus dels dispositius deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Permet sensors deCONZ CLIP", diff --git a/homeassistant/components/deconz/.translations/cs.json b/homeassistant/components/deconz/.translations/cs.json index 954d1c8eb6ef..544ab0ff2ed3 100644 --- a/homeassistant/components/deconz/.translations/cs.json +++ b/homeassistant/components/deconz/.translations/cs.json @@ -24,13 +24,6 @@ "link": { "description": "Odemkn\u011bte br\u00e1nu deCONZ, pro registraci v Home Assistant. \n\n 1. P\u0159ejd\u011bte do nastaven\u00ed syst\u00e9mu deCONZ \n 2. Stiskn\u011bte tla\u010d\u00edtko \"Unlock Gateway\"", "title": "Propojit s deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Povolit import virtu\u00e1ln\u00edch \u010didel", - "allow_deconz_groups": "Povolit import skupin deCONZ" - }, - "title": "Dal\u0161\u00ed mo\u017enosti konfigurace pro deCONZ" } }, "title": "Br\u00e1na deCONZ Zigbee" diff --git a/homeassistant/components/deconz/.translations/da.json b/homeassistant/components/deconz/.translations/da.json index d1af7e1f4ba1..91dd0ea9a54a 100644 --- a/homeassistant/components/deconz/.translations/da.json +++ b/homeassistant/components/deconz/.translations/da.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Tillad import af virtuelle sensorer", - "allow_deconz_groups": "Tillad import af deCONZ-grupper" - }, "description": "Vil du konfigurere Home Assistant til at oprette forbindelse til deCONZ-gateway'en leveret af Hass.io-tilf\u00f8jelsen {addon}?", "title": "deCONZ Zigbee-gateway via Hass.io-tilf\u00f8jelse" }, @@ -31,13 +27,6 @@ "link": { "description": "L\u00e5s din deCONZ-gateway op for at registrere dig med Home Assistant. \n\n 1. G\u00e5 til deCONZ settings -> Gateway -> Advanced\n 2. Tryk p\u00e5 knappen \"Authenticate app\"", "title": "Forbind med deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Tillad import af virtuelle sensorer", - "allow_deconz_groups": "Tillad import af deCONZ-grupper" - }, - "title": "Ekstra konfigurationsindstillinger for deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Tillad deCONZ CLIP-sensorer", - "allow_deconz_groups": "Tillad deCONZ-lysgrupper" - }, - "description": "Konfigurer synligheden af deCONZ-enhedstyper" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Tillad deCONZ CLIP-sensorer", diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index c3ad3cd24c83..1b2daecbc4ed 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee Gateway", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Import virtueller Sensoren zulassen", - "allow_deconz_groups": "Import von deCONZ-Gruppen zulassen" - }, "description": "M\u00f6chtest du Home Assistant so konfigurieren, dass er eine Verbindung mit dem deCONZ Gateway herstellt, der vom Add-on hass.io {addon} bereitgestellt wird?", "title": "deCONZ Zigbee Gateway \u00fcber das Hass.io Add-on" }, @@ -31,13 +27,6 @@ "link": { "description": "Entsperre dein deCONZ-Gateway, um es bei Home Assistant zu registrieren. \n\n 1. Gehe in die deCONZ-Systemeinstellungen \n 2. Dr\u00fccke die Taste \"Gateway entsperren\"", "title": "Mit deCONZ verbinden" - }, - "options": { - "data": { - "allow_clip_sensor": "Import virtueller Sensoren zulassen", - "allow_deconz_groups": "Import von deCONZ-Gruppen zulassen" - }, - "title": "Weitere Konfigurationsoptionen f\u00fcr deCONZ" } }, "title": "deCONZ Zigbee Gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "deCONZ CLIP-Sensoren zulassen", - "allow_deconz_groups": "deCONZ-Lichtgruppen zulassen" - }, - "description": "Konfigurieren der Sichtbarkeit von deCONZ-Ger\u00e4tetypen" - }, "deconz_devices": { "data": { "allow_clip_sensor": "deCONZ CLIP-Sensoren zulassen", diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index 756636ad90a4..2c9562359f59 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Allow importing virtual sensors", - "allow_deconz_groups": "Allow importing deCONZ groups" - }, "description": "Do you want to configure Home Assistant to connect to the deCONZ gateway provided by the Hass.io add-on {addon}?", "title": "deCONZ Zigbee gateway via Hass.io add-on" }, @@ -31,13 +27,6 @@ "link": { "description": "Unlock your deCONZ gateway to register with Home Assistant.\n\n1. Go to deCONZ Settings -> Gateway -> Advanced\n2. Press \"Authenticate app\" button", "title": "Link with deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Allow importing virtual sensors", - "allow_deconz_groups": "Allow importing deCONZ groups" - }, - "title": "Extra configuration options for deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Allow deCONZ CLIP sensors", - "allow_deconz_groups": "Allow deCONZ light groups" - }, - "description": "Configure visibility of deCONZ device types" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Allow deCONZ CLIP sensors", diff --git a/homeassistant/components/deconz/.translations/es-419.json b/homeassistant/components/deconz/.translations/es-419.json index 448b654c86e4..ea65ffbab334 100644 --- a/homeassistant/components/deconz/.translations/es-419.json +++ b/homeassistant/components/deconz/.translations/es-419.json @@ -13,10 +13,6 @@ }, "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Permitir la importaci\u00f3n de sensores virtuales", - "allow_deconz_groups": "Permitir la importaci\u00f3n de grupos deCONZ" - }, "description": "\u00bfDesea configurar Home Assistant para conectarse a la puerta de enlace deCONZ proporcionada por el complemento hass.io {addon}?", "title": "deCONZ Zigbee gateway a trav\u00e9s del complemento Hass.io" }, @@ -30,13 +26,6 @@ "link": { "description": "Desbloquee su puerta de enlace deCONZ para registrarse con Home Assistant. \n\n 1. Vaya a Configuraci\u00f3n deCONZ - > Gateway - > Avanzado \n 2. Presione el bot\u00f3n \"Autenticar aplicaci\u00f3n\"", "title": "Enlazar con deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Permitir la importaci\u00f3n de sensores virtuales", - "allow_deconz_groups": "Permitir la importaci\u00f3n de grupos deCONZ" - }, - "title": "Opciones de configuraci\u00f3n adicionales para deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -59,16 +48,5 @@ "remote_button_rotated": "Bot\u00f3n girado \"{subtype}\"", "remote_gyro_activated": "Dispositivo agitado" } - }, - "options": { - "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Permitir sensores deCONZ CLIP", - "allow_deconz_groups": "Permitir grupos de luz deCONZ" - }, - "description": "Configurar la visibilidad de los tipos de dispositivos deCONZ" - } - } } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/es.json b/homeassistant/components/deconz/.translations/es.json index 047be1c7933c..517170fe225a 100644 --- a/homeassistant/components/deconz/.translations/es.json +++ b/homeassistant/components/deconz/.translations/es.json @@ -14,10 +14,6 @@ "flow_title": "pasarela deCONZ Zigbee ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Permitir importar sensores virtuales", - "allow_deconz_groups": "Permite importar grupos de deCONZ" - }, "description": "\u00bfQuieres configurar Home Assistant para que se conecte al gateway de deCONZ proporcionado por el add-on {addon} de hass.io?", "title": "Add-on deCONZ Zigbee v\u00eda Hass.io" }, @@ -31,13 +27,6 @@ "link": { "description": "Desbloquea tu gateway de deCONZ para registrarte con Home Assistant.\n\n1. Dir\u00edgete a deCONZ Settings -> Gateway -> Advanced\n2. Pulsa el bot\u00f3n \"Authenticate app\"", "title": "Enlazar con deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Permitir importar sensores virtuales", - "allow_deconz_groups": "Permitir la importaci\u00f3n de grupos deCONZ" - }, - "title": "Opciones de configuraci\u00f3n adicionales para deCONZ" } }, "title": "Pasarela Zigbee deCONZ" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Permitir sensores deCONZ CLIP", - "allow_deconz_groups": "Permitir grupos de luz deCONZ" - }, - "description": "Configurar la visibilidad de los tipos de dispositivos deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Permitir sensores deCONZ CLIP", diff --git a/homeassistant/components/deconz/.translations/fr.json b/homeassistant/components/deconz/.translations/fr.json index 2213dcf2d490..0c2ecf9edb88 100644 --- a/homeassistant/components/deconz/.translations/fr.json +++ b/homeassistant/components/deconz/.translations/fr.json @@ -14,10 +14,6 @@ "flow_title": "Passerelle deCONZ Zigbee ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Autoriser l'importation de capteurs virtuels", - "allow_deconz_groups": "Autoriser l'importation des groupes deCONZ" - }, "description": "Voulez-vous configurer Home Assistant pour qu'il se connecte \u00e0 la passerelle deCONZ fournie par l'add-on hass.io {addon} ?", "title": "Passerelle deCONZ Zigbee via l'add-on Hass.io" }, @@ -31,13 +27,6 @@ "link": { "description": "D\u00e9verrouillez votre passerelle deCONZ pour vous enregistrer avec Home Assistant. \n\n 1. Acc\u00e9dez aux param\u00e8tres avanc\u00e9s du syst\u00e8me deCONZ \n 2. Cliquez sur \"D\u00e9verrouiller la passerelle\"", "title": "Lien vers deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Autoriser l'importation de capteurs virtuels", - "allow_deconz_groups": "Autoriser l'importation des groupes deCONZ" - }, - "title": "Options de configuration suppl\u00e9mentaires pour deCONZ" } }, "title": "Passerelle deCONZ Zigbee" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Autoriser les capteurs deCONZ CLIP", - "allow_deconz_groups": "Autoriser les groupes de lumi\u00e8res deCONZ" - }, - "description": "Configurer la visibilit\u00e9 des appareils de type deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Autoriser les capteurs deCONZ CLIP", diff --git a/homeassistant/components/deconz/.translations/he.json b/homeassistant/components/deconz/.translations/he.json index 89a2d69950e4..da7878e94afc 100644 --- a/homeassistant/components/deconz/.translations/he.json +++ b/homeassistant/components/deconz/.translations/he.json @@ -19,13 +19,6 @@ "link": { "description": "\u05d1\u05d8\u05dc \u05d0\u05ea \u05e0\u05e2\u05d9\u05dc\u05ea \u05d4\u05de\u05e9\u05e8 deCONZ \u05e9\u05dc\u05da \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd Home Assistant.\n\n 1. \u05e2\u05d1\u05d5\u05e8 \u05d0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05e2\u05e8\u05db\u05ea deCONZ \n .2 \u05dc\u05d7\u05e5 \u05e2\u05dc \"Unlock Gateway\"", "title": "\u05e7\u05e9\u05e8 \u05e2\u05dd deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05d9\u05d9\u05d1\u05d0 \u05d7\u05d9\u05d9\u05e9\u05e0\u05d9\u05dd \u05d5\u05d9\u05e8\u05d8\u05d5\u05d0\u05dc\u05d9\u05d9\u05dd", - "allow_deconz_groups": "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05d9\u05d9\u05d1\u05d0 \u05e7\u05d1\u05d5\u05e6\u05d5\u05ea deCONZ" - }, - "title": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05ea\u05e6\u05d5\u05e8\u05d4 \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea \u05e2\u05d1\u05d5\u05e8 deCONZ" } }, "title": "\u05de\u05d2\u05e9\u05e8 deCONZ Zigbee" diff --git a/homeassistant/components/deconz/.translations/hr.json b/homeassistant/components/deconz/.translations/hr.json index 2f2eb6df214b..1700ec050bf5 100644 --- a/homeassistant/components/deconz/.translations/hr.json +++ b/homeassistant/components/deconz/.translations/hr.json @@ -6,11 +6,6 @@ "host": "Host", "port": "Port" } - }, - "options": { - "data": { - "allow_clip_sensor": "Dopusti uvoz virtualnih senzora" - } } } } diff --git a/homeassistant/components/deconz/.translations/hu.json b/homeassistant/components/deconz/.translations/hu.json index c5bf9718127a..31148c80e30d 100644 --- a/homeassistant/components/deconz/.translations/hu.json +++ b/homeassistant/components/deconz/.translations/hu.json @@ -14,9 +14,6 @@ "flow_title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Virtu\u00e1lis \u00e9rz\u00e9kel\u0151k import\u00e1l\u00e1s\u00e1nak enged\u00e9lyez\u00e9se" - }, "title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 a Hass.io kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" }, "init": { @@ -29,13 +26,6 @@ "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", "title": "Kapcsol\u00f3d\u00e1s a deCONZ-hoz" - }, - "options": { - "data": { - "allow_clip_sensor": "Virtu\u00e1lis szenzorok import\u00e1l\u00e1s\u00e1nak enged\u00e9lyez\u00e9se", - "allow_deconz_groups": "deCONZ csoportok import\u00e1l\u00e1s\u00e1nak enged\u00e9lyez\u00e9se" - }, - "title": "Extra be\u00e1ll\u00edt\u00e1si lehet\u0151s\u00e9gek a deCONZhoz" } }, "title": "deCONZ Zigbee gateway" @@ -94,13 +84,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Enged\u00e9lyezze a deCONZ CLIP \u00e9rz\u00e9kel\u0151ket", - "allow_deconz_groups": "DeCONZ f\u00e9nycsoportok enged\u00e9lyez\u00e9se" - }, - "description": "A deCONZ eszk\u00f6zt\u00edpusok l\u00e1that\u00f3s\u00e1g\u00e1nak konfigur\u00e1l\u00e1sa" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Enged\u00e9lyezze a deCONZ CLIP \u00e9rz\u00e9kel\u0151ket", diff --git a/homeassistant/components/deconz/.translations/id.json b/homeassistant/components/deconz/.translations/id.json index 7d0b3163a40b..72aaa84e70da 100644 --- a/homeassistant/components/deconz/.translations/id.json +++ b/homeassistant/components/deconz/.translations/id.json @@ -19,13 +19,6 @@ "link": { "description": "Buka gerbang deCONZ Anda untuk mendaftar dengan Home Assistant. \n\n 1. Pergi ke pengaturan sistem deCONZ \n 2. Tekan tombol \"Buka Kunci Gateway\"", "title": "Tautan dengan deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Izinkan mengimpor sensor virtual", - "allow_deconz_groups": "Izinkan mengimpor grup deCONZ" - }, - "title": "Opsi konfigurasi tambahan untuk deCONZ" } }, "title": "deCONZ Zigbee gateway" diff --git a/homeassistant/components/deconz/.translations/it.json b/homeassistant/components/deconz/.translations/it.json index f6223cec6c14..e12668f082cd 100644 --- a/homeassistant/components/deconz/.translations/it.json +++ b/homeassistant/components/deconz/.translations/it.json @@ -14,10 +14,6 @@ "flow_title": "Gateway Zigbee deCONZ ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Consenti l'importazione di sensori virtuali", - "allow_deconz_groups": "Consenti l'importazione di gruppi deCONZ" - }, "description": "Vuoi configurare Home Assistant per connettersi al gateway deCONZ fornito dal componente aggiuntivo di Hass.io: {addon}?", "title": "Gateway Pigmee deCONZ tramite il componente aggiuntivo di Hass.io" }, @@ -31,13 +27,6 @@ "link": { "description": "Sblocca il tuo gateway deCONZ per registrarti con Home Assistant.\n\n1. Vai a Impostazioni deCONZ -> Gateway -> Avanzate\n2. Premere il pulsante \"Autentica app\"", "title": "Collega con deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Consenti l'importazione di sensori virtuali", - "allow_deconz_groups": "Consenti l'importazione di gruppi deCONZ" - }, - "title": "Opzioni di configurazione extra per deCONZ" } }, "title": "Gateway Zigbee deCONZ" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Consentire sensori CLIP deCONZ", - "allow_deconz_groups": "Consentire gruppi luce deCONZ" - }, - "description": "Configurare la visibilit\u00e0 dei tipi di dispositivi deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Consentire sensori CLIP deCONZ", diff --git a/homeassistant/components/deconz/.translations/ko.json b/homeassistant/components/deconz/.translations/ko.json index 1b72545bc094..00b9c1f437a2 100644 --- a/homeassistant/components/deconz/.translations/ko.json +++ b/homeassistant/components/deconz/.translations/ko.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774 ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "\uac00\uc0c1 \uc13c\uc11c \uac00\uc838\uc624\uae30 \ud5c8\uc6a9", - "allow_deconz_groups": "deCONZ \uadf8\ub8f9 \uac00\uc838\uc624\uae30 \ud5c8\uc6a9" - }, "description": "Hass.io {addon} \uc560\ub4dc\uc628\uc5d0\uc11c \uc81c\uacf5\ub41c deCONZ \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant \ub97c \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Hass.io \uc560\ub4dc\uc628\uc758 deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774" }, @@ -31,13 +27,6 @@ "link": { "description": "deCONZ \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc5b8\ub77d\ud558\uc5ec Home Assistant \uc5d0 \uc5f0\uacb0\ud558\uae30.\n\n1. deCONZ \uc2dc\uc2a4\ud15c \uc124\uc815\uc73c\ub85c \uc774\ub3d9\ud558\uc138\uc694\n2. \"Authenticate app\" \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694", "title": "deCONZ\uc640 \uc5f0\uacb0" - }, - "options": { - "data": { - "allow_clip_sensor": "\uac00\uc0c1 \uc13c\uc11c \uac00\uc838\uc624\uae30 \ud5c8\uc6a9", - "allow_deconz_groups": "deCONZ \uadf8\ub8f9 \uac00\uc838\uc624\uae30 \ud5c8\uc6a9" - }, - "title": "deCONZ \ucd94\uac00 \uad6c\uc131 \uc635\uc158" } }, "title": "deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "deCONZ CLIP \uc13c\uc11c \ud5c8\uc6a9", - "allow_deconz_groups": "deCONZ \ub77c\uc774\ud2b8 \uadf8\ub8f9 \ud5c8\uc6a9" - }, - "description": "deCONZ \uae30\uae30 \uc720\ud615\uc758 \ud45c\uc2dc \uc5ec\ubd80 \uad6c\uc131" - }, "deconz_devices": { "data": { "allow_clip_sensor": "deCONZ CLIP \uc13c\uc11c \ud5c8\uc6a9", diff --git a/homeassistant/components/deconz/.translations/lb.json b/homeassistant/components/deconz/.translations/lb.json index 42fd840524f3..61479cb78e2f 100644 --- a/homeassistant/components/deconz/.translations/lb.json +++ b/homeassistant/components/deconz/.translations/lb.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Erlaabt den Import vun virtuellen Sensoren", - "allow_deconz_groups": "Erlaabt den Import vun deCONZ Gruppen" - }, "description": "W\u00ebllt dir Home Assistant konfigur\u00e9iere fir sech mat der deCONZ gateway ze verbannen d\u00e9i vum hass.io add-on {addon} bereet gestallt g\u00ebtt?", "title": "deCONZ Zigbee gateway via Hass.io add-on" }, @@ -31,13 +27,6 @@ "link": { "description": "Entsperrt \u00e4r deCONZ gateway fir se mat Home Assistant ze registr\u00e9ieren.\n\n1. Gidd op deCONZ System Astellungen\n2. Dr\u00e9ckt \"Unlock\" Gateway Kn\u00e4ppchen", "title": "Link mat deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Erlaabt den Import vun virtuellen Sensoren", - "allow_deconz_groups": "Erlaabt den Import vun deCONZ Gruppen" - }, - "title": "Extra Konfiguratiouns Optiounen fir deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "deCONZ Clip Sensoren erlaben", - "allow_deconz_groups": "deCONZ Luucht Gruppen erlaben" - }, - "description": "Visibilit\u00e9it vun deCONZ Apparater konfigur\u00e9ieren" - }, "deconz_devices": { "data": { "allow_clip_sensor": "deCONZ Clip Sensoren erlaben", diff --git a/homeassistant/components/deconz/.translations/nl.json b/homeassistant/components/deconz/.translations/nl.json index 585c09c5339e..611d38ba9500 100644 --- a/homeassistant/components/deconz/.translations/nl.json +++ b/homeassistant/components/deconz/.translations/nl.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ( {host} )", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Sta het importeren van virtuele sensoren toe", - "allow_deconz_groups": "Sta de import van deCONZ-groepen toe" - }, "description": "Wilt u de Home Assistant configureren om verbinding te maken met de deCONZ gateway van de hass.io add-on {addon}?", "title": "deCONZ Zigbee Gateway via Hass.io add-on" }, @@ -31,13 +27,6 @@ "link": { "description": "Ontgrendel je deCONZ gateway om te registreren met Home Assistant.\n\n1. Ga naar deCONZ systeeminstellingen (Instellingen -> Gateway -> Geavanceerd)\n2. Druk op de knop \"Gateway ontgrendelen\"", "title": "Koppel met deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Sta het importeren van virtuele sensoren toe", - "allow_deconz_groups": "Sta de import van deCONZ-groepen toe" - }, - "title": "Extra configuratieopties voor deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "DeCONZ CLIP sensoren toestaan", - "allow_deconz_groups": "DeCONZ-lichtgroepen toestaan" - }, - "description": "De zichtbaarheid van deCONZ-apparaattypen configureren" - }, "deconz_devices": { "data": { "allow_clip_sensor": "DeCONZ CLIP sensoren toestaan", diff --git a/homeassistant/components/deconz/.translations/nn.json b/homeassistant/components/deconz/.translations/nn.json index 46933ced4276..986795e11c97 100644 --- a/homeassistant/components/deconz/.translations/nn.json +++ b/homeassistant/components/deconz/.translations/nn.json @@ -19,13 +19,6 @@ "link": { "description": "L\u00e5s opp deCONZ-gatewayen din for \u00e5 registrere den med Home Assistant.\n\n1. G\u00e5 til systeminnstillingane til deCONZ\n2. Trykk p\u00e5 \"L\u00e5s opp gateway\"-knappen", "title": "Link med deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Tillat importering av virtuelle sensorar", - "allow_deconz_groups": "Tillat \u00e5 importera deCONZ-grupper" - }, - "title": "Ekstra konfigurasjonsalternativ for deCONZ" } }, "title": "deCONZ Zigbee gateway" diff --git a/homeassistant/components/deconz/.translations/no.json b/homeassistant/components/deconz/.translations/no.json index e7c5893b4f1e..a10ae01e25f3 100644 --- a/homeassistant/components/deconz/.translations/no.json +++ b/homeassistant/components/deconz/.translations/no.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Tillat import av virtuelle sensorer", - "allow_deconz_groups": "Tillat import av deCONZ grupper" - }, "description": "Vil du konfigurere Home Assistant til \u00e5 koble seg til deCONZ-gateway levert av Hass.io-tillegget {addon} ?", "title": "deCONZ Zigbee gateway via Hass.io tillegg" }, @@ -31,13 +27,6 @@ "link": { "description": "L\u00e5s opp deCONZ-gatewayen din for \u00e5 registrere deg med Home Assistant. \n\n 1. G\u00e5 til deCONZ-systeminnstillinger -> Gateway -> Avansert \n 2. Trykk p\u00e5 \"L\u00e5s opp gateway\" knappen", "title": "Koble til deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Tillat import av virtuelle sensorer", - "allow_deconz_groups": "Tillat import av deCONZ grupper" - }, - "title": "Ekstra konfigurasjonsalternativer for deCONZ" } }, "title": "deCONZ Zigbee gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Tillat deCONZ CLIP-sensorer", - "allow_deconz_groups": "Tillat deCONZ lys grupper" - }, - "description": "Konfigurere synlighet av deCONZ enhetstyper" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Tillat deCONZ CLIP-sensorer", diff --git a/homeassistant/components/deconz/.translations/pl.json b/homeassistant/components/deconz/.translations/pl.json index d12e633bf23a..ace1f4182a45 100644 --- a/homeassistant/components/deconz/.translations/pl.json +++ b/homeassistant/components/deconz/.translations/pl.json @@ -14,10 +14,6 @@ "flow_title": "Bramka deCONZ Zigbee ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Zezwalaj na importowanie wirtualnych sensor\u00f3w", - "allow_deconz_groups": "Zezwalaj na importowanie grup deCONZ" - }, "description": "Czy chcesz skonfigurowa\u0107 Home Assistant, aby po\u0142\u0105czy\u0142 si\u0119 z bramk\u0105 deCONZ dostarczon\u0105 przez dodatek Hass.io {addon}?", "title": "Bramka deCONZ Zigbee przez dodatek Hass.io" }, @@ -31,13 +27,6 @@ "link": { "description": "Odblokuj bramk\u0119 deCONZ, aby zarejestrowa\u0107 j\u0105 w Home Assistant. \n\n 1. Przejd\u017a do ustawienia deCONZ > bramka > Zaawansowane\n 2. Naci\u015bnij przycisk \"Uwierzytelnij aplikacj\u0119\"", "title": "Po\u0142\u0105cz z deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Zezwalaj na importowanie wirtualnych sensor\u00f3w", - "allow_deconz_groups": "Zezw\u00f3l na importowanie grup deCONZ" - }, - "title": "Dodatkowe opcje konfiguracji dla deCONZ" } }, "title": "Brama deCONZ Zigbee" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Zezwalaj na czujniki deCONZ CLIP", - "allow_deconz_groups": "Zezwalaj na grupy \u015bwiate\u0142 deCONZ" - }, - "description": "Skonfiguruj widoczno\u015b\u0107 urz\u0105dze\u0144 deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Zezwalaj na czujniki deCONZ CLIP", diff --git a/homeassistant/components/deconz/.translations/pt-BR.json b/homeassistant/components/deconz/.translations/pt-BR.json index 8d54c470846b..6d800bb02699 100644 --- a/homeassistant/components/deconz/.translations/pt-BR.json +++ b/homeassistant/components/deconz/.translations/pt-BR.json @@ -13,10 +13,6 @@ }, "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais", - "allow_deconz_groups": "Permitir a importa\u00e7\u00e3o de grupos deCONZ" - }, "description": "Deseja configurar o Home Assistant para conectar-se ao gateway deCONZ fornecido pelo add-on hass.io {addon} ?", "title": "Gateway deCONZ Zigbee via add-on Hass.io" }, @@ -30,26 +26,8 @@ "link": { "description": "Desbloqueie o seu gateway deCONZ para se registar no Home Assistant. \n\n 1. V\u00e1 para as configura\u00e7\u00f5es do sistema deCONZ \n 2. Pressione o bot\u00e3o \"Desbloquear Gateway\"", "title": "Linkar com deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais", - "allow_deconz_groups": "Permitir a importa\u00e7\u00e3o de grupos deCONZ" - }, - "title": "Op\u00e7\u00f5es extras de configura\u00e7\u00e3o para deCONZ" } }, "title": "Gateway deCONZ Zigbee" - }, - "options": { - "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Permitir sensores deCONZ CLIP", - "allow_deconz_groups": "Permitir grupos de luz deCONZ" - }, - "description": "Configurar visibilidade dos tipos de dispositivos deCONZ" - } - } } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pt.json b/homeassistant/components/deconz/.translations/pt.json index f24d7692a555..f0ea9e57ca05 100644 --- a/homeassistant/components/deconz/.translations/pt.json +++ b/homeassistant/components/deconz/.translations/pt.json @@ -19,13 +19,6 @@ "link": { "description": "Desbloqueie o seu gateway deCONZ para se registar no Home Assistant. \n\n 1. V\u00e1 para as configura\u00e7\u00f5es do sistema deCONZ \n 2. Pressione o bot\u00e3o \"Desbloquear Gateway\"", "title": "Liga\u00e7\u00e3o com deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais", - "allow_deconz_groups": "Permitir a importa\u00e7\u00e3o de grupos deCONZ" - }, - "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o extra para deCONZ" } }, "title": "Gateway Zigbee deCONZ" diff --git a/homeassistant/components/deconz/.translations/ru.json b/homeassistant/components/deconz/.translations/ru.json index 054c85f595ac..4d89f5ff8e01 100644 --- a/homeassistant/components/deconz/.translations/ru.json +++ b/homeassistant/components/deconz/.translations/ru.json @@ -14,10 +14,6 @@ "flow_title": "\u0428\u043b\u044e\u0437 Zigbee deCONZ ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432", - "allow_deconz_groups": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0433\u0440\u0443\u043f\u043f deCONZ" - }, "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 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a deCONZ (\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Hass.io \"{addon}\")?", "title": "Zigbee \u0448\u043b\u044e\u0437 deCONZ (\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Hass.io)" }, @@ -31,13 +27,6 @@ "link": { "description": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0448\u043b\u044e\u0437 deCONZ \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 Home Assistant:\n\n1. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b deCONZ -> Gateway -> Advanced.\n2. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00abAuthenticate app\u00bb.", "title": "\u0421\u0432\u044f\u0437\u044c \u0441 deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432", - "allow_deconz_groups": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0433\u0440\u0443\u043f\u043f deCONZ" - }, - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 deCONZ" } }, "title": "deCONZ" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440\u044b deCONZ CLIP", - "allow_deconz_groups": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f deCONZ" - }, - "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440\u044b deCONZ CLIP", diff --git a/homeassistant/components/deconz/.translations/sl.json b/homeassistant/components/deconz/.translations/sl.json index d8d98c103c35..15927059d32e 100644 --- a/homeassistant/components/deconz/.translations/sl.json +++ b/homeassistant/components/deconz/.translations/sl.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee prehod ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Dovoli uvoz virtualnih senzorjev", - "allow_deconz_groups": "Dovoli uvoz deCONZ skupin" - }, "description": "Ali \u017eelite konfigurirati Home Assistant za povezavo s prehodom deCONZ, ki ga ponuja dodatek Hass.io {addon} ?", "title": "deCONZ Zigbee prehod preko dodatka Hass.io" }, @@ -31,13 +27,6 @@ "link": { "description": "Odklenite va\u0161 deCONZ gateway za registracijo s Home Assistant-om. \n1. Pojdite v deCONZ sistemske nastavitve\n2. Pritisnite tipko \"odkleni prehod\"", "title": "Povezava z deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Dovoli uvoz virtualnih senzorjev", - "allow_deconz_groups": "Dovoli uvoz deCONZ skupin" - }, - "title": "Dodatne mo\u017enosti konfiguracije za deCONZ" } }, "title": "deCONZ Zigbee prehod" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Dovoli deCONZ CLIP senzorje", - "allow_deconz_groups": "Dovolite deCONZ skupine lu\u010di" - }, - "description": "Konfiguracija vidnosti tipov naprav deCONZ" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Dovoli deCONZ CLIP senzorje", diff --git a/homeassistant/components/deconz/.translations/sv.json b/homeassistant/components/deconz/.translations/sv.json index 3d74d6cb9443..11a8aac485a0 100644 --- a/homeassistant/components/deconz/.translations/sv.json +++ b/homeassistant/components/deconz/.translations/sv.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "Till\u00e5t import av virtuella sensorer", - "allow_deconz_groups": "Till\u00e5t import av deCONZ-grupper" - }, "description": "Vill du konfigurera Home Assistant att ansluta till den deCONZ-gateway som tillhandah\u00e5lls av Hass.io-till\u00e4gget {addon}?", "title": "deCONZ Zigbee gateway via Hass.io till\u00e4gg" }, @@ -31,13 +27,6 @@ "link": { "description": "L\u00e5s upp din deCONZ-gateway f\u00f6r att registrera dig med Home Assistant. \n\n 1. G\u00e5 till deCONZ-systeminst\u00e4llningarna \n 2. Tryck p\u00e5 \"L\u00e5s upp gateway\"-knappen", "title": "L\u00e4nka med deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "Till\u00e5t import av virtuella sensorer", - "allow_deconz_groups": "Till\u00e5t import av deCONZ-grupper" - }, - "title": "Extra konfigurationsalternativ f\u00f6r deCONZ" } }, "title": "deCONZ Zigbee Gateway" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "Till\u00e5t deCONZ CLIP-sensorer", - "allow_deconz_groups": "Till\u00e5t deCONZ ljusgrupper" - }, - "description": "Konfigurera synlighet f\u00f6r deCONZ-enhetstyper" - }, "deconz_devices": { "data": { "allow_clip_sensor": "Till\u00e5t deCONZ CLIP-sensorer", diff --git a/homeassistant/components/deconz/.translations/vi.json b/homeassistant/components/deconz/.translations/vi.json index 00f1d9be57f0..75d8969495b4 100644 --- a/homeassistant/components/deconz/.translations/vi.json +++ b/homeassistant/components/deconz/.translations/vi.json @@ -13,13 +13,6 @@ "data": { "port": "C\u1ed5ng (gi\u00e1 tr\u1ecb m\u1eb7c \u0111\u1ecbnh: '80')" } - }, - "options": { - "data": { - "allow_clip_sensor": "Cho ph\u00e9p nh\u1eadp c\u1ea3m bi\u1ebfn \u1ea3o", - "allow_deconz_groups": "Cho ph\u00e9p nh\u1eadp c\u00e1c nh\u00f3m deCONZ" - }, - "title": "T\u00f9y ch\u1ecdn c\u1ea5u h\u00ecnh b\u1ed5 sung cho deCONZ" } } } diff --git a/homeassistant/components/deconz/.translations/zh-Hans.json b/homeassistant/components/deconz/.translations/zh-Hans.json index ce51a54ac77c..ada31494619d 100644 --- a/homeassistant/components/deconz/.translations/zh-Hans.json +++ b/homeassistant/components/deconz/.translations/zh-Hans.json @@ -19,13 +19,6 @@ "link": { "description": "\u89e3\u9501\u60a8\u7684 deCONZ \u7f51\u5173\u4ee5\u6ce8\u518c\u5230 Home Assistant\u3002 \n\n 1. \u524d\u5f80 deCONZ \u7cfb\u7edf\u8bbe\u7f6e\n 2. \u70b9\u51fb\u201c\u89e3\u9501\u7f51\u5173\u201d\u6309\u94ae", "title": "\u8fde\u63a5 deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "\u5141\u8bb8\u5bfc\u5165\u865a\u62df\u4f20\u611f\u5668", - "allow_deconz_groups": "\u5141\u8bb8\u5bfc\u5165 deCONZ \u7fa4\u7ec4" - }, - "title": "deCONZ \u7684\u9644\u52a0\u914d\u7f6e\u9879" } }, "title": "deCONZ" diff --git a/homeassistant/components/deconz/.translations/zh-Hant.json b/homeassistant/components/deconz/.translations/zh-Hant.json index 073ebd784c61..07b7c6e997be 100644 --- a/homeassistant/components/deconz/.translations/zh-Hant.json +++ b/homeassistant/components/deconz/.translations/zh-Hant.json @@ -14,10 +14,6 @@ "flow_title": "deCONZ Zigbee \u9598\u9053\u5668\uff08{host}\uff09", "step": { "hassio_confirm": { - "data": { - "allow_clip_sensor": "\u5141\u8a31\u532f\u5165\u865b\u64ec\u611f\u61c9\u5668", - "allow_deconz_groups": "\u5141\u8a31\u532f\u5165 deCONZ \u7fa4\u7d44" - }, "description": "\u662f\u5426\u8981\u8a2d\u5b9a Home Assistant \u4ee5\u9023\u7dda\u81f3 Hass.io \u9644\u52a0\u6574\u5408 {addon} \u4e4b deCONZ \u9598\u9053\u5668\uff1f", "title": "\u900f\u904e Hass.io \u9644\u52a0\u7d44\u4ef6 deCONZ Zigbee \u9598\u9053\u5668" }, @@ -31,13 +27,6 @@ "link": { "description": "\u89e3\u9664 deCONZ \u9598\u9053\u5668\u9396\u5b9a\uff0c\u4ee5\u65bc Home Assistant \u9032\u884c\u8a3b\u518a\u3002\n\n1. \u9032\u5165 deCONZ \u7cfb\u7d71\u8a2d\u5b9a -> \u9598\u9053\u5668 -> \u9032\u968e\u8a2d\u5b9a\n2. \u6309\u4e0b\u300c\u8a8d\u8b49\u7a0b\u5f0f\uff08Authenticate app\uff09\u300d\u6309\u9215", "title": "\u9023\u7d50\u81f3 deCONZ" - }, - "options": { - "data": { - "allow_clip_sensor": "\u5141\u8a31\u532f\u5165\u865b\u64ec\u611f\u61c9\u5668", - "allow_deconz_groups": "\u5141\u8a31\u532f\u5165 deCONZ \u7fa4\u7d44" - }, - "title": "deCONZ \u9644\u52a0\u8a2d\u5b9a\u9078\u9805" } }, "title": "deCONZ Zigbee \u9598\u9053\u5668" @@ -96,13 +85,6 @@ }, "options": { "step": { - "async_step_deconz_devices": { - "data": { - "allow_clip_sensor": "\u5141\u8a31 deCONZ CLIP \u611f\u61c9\u5668", - "allow_deconz_groups": "\u5141\u8a31 deCONZ \u71c8\u5149\u7fa4\u7d44" - }, - "description": "\u8a2d\u5b9a deCONZ \u53ef\u8996\u8a2d\u5099\u985e\u578b" - }, "deconz_devices": { "data": { "allow_clip_sensor": "\u5141\u8a31 deCONZ CLIP \u611f\u61c9\u5668", diff --git a/homeassistant/components/directv/.translations/ca.json b/homeassistant/components/directv/.translations/ca.json index a88e1feb2e9b..4bdc104e7dea 100644 --- a/homeassistant/components/directv/.translations/ca.json +++ b/homeassistant/components/directv/.translations/ca.json @@ -5,8 +5,7 @@ "unknown": "Error inesperat" }, "error": { - "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", - "unknown": "Error inesperat" + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/de.json b/homeassistant/components/directv/.translations/de.json index b6074c732f65..98a9e81f6613 100644 --- a/homeassistant/components/directv/.translations/de.json +++ b/homeassistant/components/directv/.translations/de.json @@ -5,8 +5,7 @@ "unknown": "Unerwarteter Fehler" }, "error": { - "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", - "unknown": "Unerwarteter Fehler" + "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/en.json b/homeassistant/components/directv/.translations/en.json index f5105477c458..774ce1f2035e 100644 --- a/homeassistant/components/directv/.translations/en.json +++ b/homeassistant/components/directv/.translations/en.json @@ -5,8 +5,7 @@ "unknown": "Unexpected error" }, "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" + "cannot_connect": "Failed to connect, please try again" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/es.json b/homeassistant/components/directv/.translations/es.json index ef9edd6dd731..f23f83481e5f 100644 --- a/homeassistant/components/directv/.translations/es.json +++ b/homeassistant/components/directv/.translations/es.json @@ -5,8 +5,7 @@ "unknown": "Error inesperado" }, "error": { - "cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo.", - "unknown": "Error inesperado" + "cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo." }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/fr.json b/homeassistant/components/directv/.translations/fr.json index 6ba9237a3ad0..d7262f50eaff 100644 --- a/homeassistant/components/directv/.translations/fr.json +++ b/homeassistant/components/directv/.translations/fr.json @@ -5,8 +5,7 @@ "unknown": "Erreur inattendue" }, "error": { - "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer", - "unknown": "Erreur inattendue" + "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/it.json b/homeassistant/components/directv/.translations/it.json index 4fe98fc60242..777b66d5c910 100644 --- a/homeassistant/components/directv/.translations/it.json +++ b/homeassistant/components/directv/.translations/it.json @@ -5,8 +5,7 @@ "unknown": "Errore imprevisto" }, "error": { - "cannot_connect": "Impossibile connettersi, si prega di riprovare", - "unknown": "Errore imprevisto" + "cannot_connect": "Impossibile connettersi, si prega di riprovare" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/ko.json b/homeassistant/components/directv/.translations/ko.json index 46ad9b15e499..5099b264085a 100644 --- a/homeassistant/components/directv/.translations/ko.json +++ b/homeassistant/components/directv/.translations/ko.json @@ -5,8 +5,7 @@ "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" }, "error": { - "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", - "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694." }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/lb.json b/homeassistant/components/directv/.translations/lb.json index 4a0c1267d2bd..4e2a09c6befa 100644 --- a/homeassistant/components/directv/.translations/lb.json +++ b/homeassistant/components/directv/.translations/lb.json @@ -5,12 +5,15 @@ "unknown": "Onerwaarte Feeler" }, "error": { - "cannot_connect": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol.", - "unknown": "Onerwaarte Feeler" + "cannot_connect": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol." }, "flow_title": "DirecTV: {name}", "step": { "ssdp_confirm": { + "data": { + "one": "Een", + "other": "Aner" + }, "description": "Soll {name} konfigur\u00e9iert ginn?", "title": "Mam DirecTV Receiver verbannen" }, diff --git a/homeassistant/components/directv/.translations/no.json b/homeassistant/components/directv/.translations/no.json index b010b1aac019..be2500b38b32 100644 --- a/homeassistant/components/directv/.translations/no.json +++ b/homeassistant/components/directv/.translations/no.json @@ -5,8 +5,7 @@ "unknown": "Uventet feil" }, "error": { - "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", - "unknown": "Uventet feil" + "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen" }, "flow_title": "", "step": { diff --git a/homeassistant/components/directv/.translations/pl.json b/homeassistant/components/directv/.translations/pl.json index c02e69601c88..d9de1368ec51 100644 --- a/homeassistant/components/directv/.translations/pl.json +++ b/homeassistant/components/directv/.translations/pl.json @@ -5,8 +5,7 @@ "unknown": "Niespodziewany b\u0142\u0105d." }, "error": { - "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.", - "unknown": "Niespodziewany b\u0142\u0105d." + "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie." }, "flow_title": "DirecTV: {name}", "step": { @@ -18,13 +17,13 @@ "other": "inne" }, "description": "Czy chcesz skonfigurowa\u0107 {name}?", - "title": "Po\u0142\u0105cz si\u0119 z odbiornikiem DirecTV" + "title": "Po\u0142\u0105czenie z odbiornikiem DirecTV" }, "user": { "data": { "host": "Nazwa hosta lub adres IP" }, - "title": "Po\u0142\u0105cz si\u0119 z odbiornikiem DirecTV" + "title": "Po\u0142\u0105czenie z odbiornikiem DirecTV" } }, "title": "DirecTV" diff --git a/homeassistant/components/directv/.translations/ru.json b/homeassistant/components/directv/.translations/ru.json index 7fc53b8b8eaf..08e18b89bf13 100644 --- a/homeassistant/components/directv/.translations/ru.json +++ b/homeassistant/components/directv/.translations/ru.json @@ -5,8 +5,7 @@ "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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", - "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437." }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/sl.json b/homeassistant/components/directv/.translations/sl.json index ce3d6fac9eb9..ab20a6ec4245 100644 --- a/homeassistant/components/directv/.translations/sl.json +++ b/homeassistant/components/directv/.translations/sl.json @@ -5,8 +5,7 @@ "unknown": "Nepri\u010dakovana napaka" }, "error": { - "cannot_connect": "Povezava ni uspela, poskusite znova", - "unknown": "Nepri\u010dakovana napaka" + "cannot_connect": "Povezava ni uspela, poskusite znova" }, "flow_title": "DirecTV: {name}", "step": { diff --git a/homeassistant/components/directv/.translations/zh-Hant.json b/homeassistant/components/directv/.translations/zh-Hant.json index 38b89b729ada..b7a1bb41f53d 100644 --- a/homeassistant/components/directv/.translations/zh-Hant.json +++ b/homeassistant/components/directv/.translations/zh-Hant.json @@ -5,8 +5,7 @@ "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, "error": { - "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", - "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21" }, "flow_title": "DirecTV\uff1a{name}", "step": { diff --git a/homeassistant/components/flunearyou/.translations/lb.json b/homeassistant/components/flunearyou/.translations/lb.json index f2be7cf7ca63..03c8d0bce098 100644 --- a/homeassistant/components/flunearyou/.translations/lb.json +++ b/homeassistant/components/flunearyou/.translations/lb.json @@ -12,6 +12,7 @@ "latitude": "Breedegrad", "longitude": "L\u00e4ngegrad" }, + "description": "Iwwerwach Benotzer-bas\u00e9iert an CDC Berichter fir Koordinaten.", "title": "Flu Near You konfigur\u00e9ieren" } }, diff --git a/homeassistant/components/geonetnz_quakes/.translations/bg.json b/homeassistant/components/geonetnz_quakes/.translations/bg.json index 48d6eacda917..c907a6bafd98 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/bg.json +++ b/homeassistant/components/geonetnz_quakes/.translations/bg.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0432\u0435\u0447\u0435 \u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043d\u043e" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/ca.json b/homeassistant/components/geonetnz_quakes/.translations/ca.json index 7a88d3d2c72c..c422c1768a7b 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ca.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ca.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "La ubicaci\u00f3 ja est\u00e0 configurada." }, - "error": { - "identifier_exists": "Ubicaci\u00f3 ja registrada" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/da.json b/homeassistant/components/geonetnz_quakes/.translations/da.json index 0d0e927bc4be..15847cdadc92 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/da.json +++ b/homeassistant/components/geonetnz_quakes/.translations/da.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Placering allerede registreret" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/de.json b/homeassistant/components/geonetnz_quakes/.translations/de.json index 4f5a5cde750e..a9d3c8dca79b 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/de.json +++ b/homeassistant/components/geonetnz_quakes/.translations/de.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Der Standort ist bereits konfiguriert." }, - "error": { - "identifier_exists": "Standort bereits registriert" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/en.json b/homeassistant/components/geonetnz_quakes/.translations/en.json index ed83ab494363..41fafa5763bb 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/en.json +++ b/homeassistant/components/geonetnz_quakes/.translations/en.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Location is already configured." }, - "error": { - "identifier_exists": "Location already registered" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/es.json b/homeassistant/components/geonetnz_quakes/.translations/es.json index f50823186c38..daab68f1111b 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/es.json +++ b/homeassistant/components/geonetnz_quakes/.translations/es.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "La ubicaci\u00f3n ya est\u00e1 configurada." }, - "error": { - "identifier_exists": "Ubicaci\u00f3n ya registrada" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/fr.json b/homeassistant/components/geonetnz_quakes/.translations/fr.json index 39aee7a66949..0a6fb7936285 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/fr.json +++ b/homeassistant/components/geonetnz_quakes/.translations/fr.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "L'emplacement est d\u00e9j\u00e0 configur\u00e9." }, - "error": { - "identifier_exists": "Emplacement d\u00e9j\u00e0 enregistr\u00e9" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/it.json b/homeassistant/components/geonetnz_quakes/.translations/it.json index 7b65c27f161a..2b2cac02737d 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/it.json +++ b/homeassistant/components/geonetnz_quakes/.translations/it.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "La posizione \u00e8 gi\u00e0 configurata." }, - "error": { - "identifier_exists": "Localit\u00e0 gi\u00e0 registrata" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/ko.json b/homeassistant/components/geonetnz_quakes/.translations/ko.json index 04adb36e5d2f..30c534b18e01 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ko.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ko.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "\uc704\uce58\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4." }, - "error": { - "identifier_exists": "\uc704\uce58\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/lb.json b/homeassistant/components/geonetnz_quakes/.translations/lb.json index ea9d1682eda8..a4cbecc58185 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/lb.json +++ b/homeassistant/components/geonetnz_quakes/.translations/lb.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Standuert ass scho konfigu\u00e9iert." }, - "error": { - "identifier_exists": "Standuert ass scho registr\u00e9iert" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/nl.json b/homeassistant/components/geonetnz_quakes/.translations/nl.json index d6af28240eb3..4495dee078df 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/nl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/nl.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Locatie al geregistreerd" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/no.json b/homeassistant/components/geonetnz_quakes/.translations/no.json index df69f6a3913e..82160a4295f3 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/no.json +++ b/homeassistant/components/geonetnz_quakes/.translations/no.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Plasseringen er allerede konfigurert." }, - "error": { - "identifier_exists": "Beliggenhet allerede er registrert" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/pl.json b/homeassistant/components/geonetnz_quakes/.translations/pl.json index 5de41e72ef60..b9763b61fccb 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pl.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Lokalizacja jest ju\u017c skonfigurowana." }, - "error": { - "identifier_exists": "Lokalizacja jest ju\u017c zarejestrowana." - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json index 7e3ee3b24dab..1dcf264b3f6d 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Localiza\u00e7\u00e3o j\u00e1 registrada" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/ru.json b/homeassistant/components/geonetnz_quakes/.translations/ru.json index e8bf8499be68..0b3d23bfa3b4 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ru.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ru.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." }, - "error": { - "identifier_exists": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e." - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/sl.json b/homeassistant/components/geonetnz_quakes/.translations/sl.json index 1176c08f4538..03f265f2719d 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sl.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "Lokacija je \u017ee nastavljena." }, - "error": { - "identifier_exists": "Lokacija je \u017ee registrirana" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/sv.json b/homeassistant/components/geonetnz_quakes/.translations/sv.json index 13058ad3ad2a..3e27c3408087 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sv.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sv.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Plats redan registrerad" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json index 3d312978bb23..f46e74a35bce 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json +++ b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "\u4f4d\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002" }, - "error": { - "identifier_exists": "\u5ea7\u6a19\u5df2\u8a3b\u518a" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/harmony/.translations/ca.json b/homeassistant/components/harmony/.translations/ca.json index 75fded469a85..f4e77752936d 100644 --- a/homeassistant/components/harmony/.translations/ca.json +++ b/homeassistant/components/harmony/.translations/ca.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", - "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", "unknown": "Error inesperat" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/de.json b/homeassistant/components/harmony/.translations/de.json index 84187ef1d524..70a5c8707ce5 100644 --- a/homeassistant/components/harmony/.translations/de.json +++ b/homeassistant/components/harmony/.translations/de.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", - "invalid_auth": "Ung\u00fcltige Authentifizierung", "unknown": "Unerwarteter Fehler" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/en.json b/homeassistant/components/harmony/.translations/en.json index 697d5572373d..00054dbc51e7 100644 --- a/homeassistant/components/harmony/.translations/en.json +++ b/homeassistant/components/harmony/.translations/en.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Failed to connect, please try again", - "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/es.json b/homeassistant/components/harmony/.translations/es.json index f8e8bd9ea7e3..300b2e4cb8db 100644 --- a/homeassistant/components/harmony/.translations/es.json +++ b/homeassistant/components/harmony/.translations/es.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo", - "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "unknown": "Error inesperado" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/fr.json b/homeassistant/components/harmony/.translations/fr.json index e927254b9e29..60848bea459f 100644 --- a/homeassistant/components/harmony/.translations/fr.json +++ b/homeassistant/components/harmony/.translations/fr.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer", - "invalid_auth": "Authentification non valide", "unknown": "Erreur inattendue" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/it.json b/homeassistant/components/harmony/.translations/it.json index 36d06ef565c0..4b88151f3d6f 100644 --- a/homeassistant/components/harmony/.translations/it.json +++ b/homeassistant/components/harmony/.translations/it.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Impossibile connettersi, si prega di riprovare", - "invalid_auth": "Autenticazione non valida", "unknown": "Errore imprevisto" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/ko.json b/homeassistant/components/harmony/.translations/ko.json index 6106ce8a89dd..392c06390aa7 100644 --- a/homeassistant/components/harmony/.translations/ko.json +++ b/homeassistant/components/harmony/.translations/ko.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", - "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" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/lb.json b/homeassistant/components/harmony/.translations/lb.json index 64536a014070..6cd2ab7d7bf1 100644 --- a/homeassistant/components/harmony/.translations/lb.json +++ b/homeassistant/components/harmony/.translations/lb.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol.", - "invalid_auth": "Ong\u00eblteg Authentifikatioun", "unknown": "Onerwaarte Feeler" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/no.json b/homeassistant/components/harmony/.translations/no.json index 6c989f8068b0..4dd86965bfd8 100644 --- a/homeassistant/components/harmony/.translations/no.json +++ b/homeassistant/components/harmony/.translations/no.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", - "invalid_auth": "Ugyldig godkjenning", "unknown": "Uventet feil" }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/pl.json b/homeassistant/components/harmony/.translations/pl.json index a9f611d0f353..e5ace2e0d1d7 100644 --- a/homeassistant/components/harmony/.translations/pl.json +++ b/homeassistant/components/harmony/.translations/pl.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.", - "invalid_auth": "Niepoprawne uwierzytelnienie.", "unknown": "Niespodziewany b\u0142\u0105d." }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/ru.json b/homeassistant/components/harmony/.translations/ru.json index cdeb809da125..b89296616b33 100644 --- a/homeassistant/components/harmony/.translations/ru.json +++ b/homeassistant/components/harmony/.translations/ru.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", - "invalid_auth": "\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f.", "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." }, "flow_title": "Logitech Harmony Hub {name}", diff --git a/homeassistant/components/harmony/.translations/zh-Hant.json b/homeassistant/components/harmony/.translations/zh-Hant.json index 7cdbad1a70d6..9e523c672909 100644 --- a/homeassistant/components/harmony/.translations/zh-Hant.json +++ b/homeassistant/components/harmony/.translations/zh-Hant.json @@ -5,7 +5,6 @@ }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", - "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, "flow_title": "\u7f85\u6280 Harmony Hub {name}", diff --git a/homeassistant/components/heos/.translations/pl.json b/homeassistant/components/heos/.translations/pl.json index d427acc3a986..e494a6b34df9 100644 --- a/homeassistant/components/heos/.translations/pl.json +++ b/homeassistant/components/heos/.translations/pl.json @@ -13,7 +13,7 @@ "host": "Host" }, "description": "Wprowad\u017a nazw\u0119 hosta lub adres IP urz\u0105dzenia Heos (najlepiej pod\u0142\u0105czonego przewodowo do sieci).", - "title": "Po\u0142\u0105cz si\u0119 z Heos" + "title": "Po\u0142\u0105czenie z Heos" } }, "title": "Heos" diff --git a/homeassistant/components/huawei_lte/.translations/lb.json b/homeassistant/components/huawei_lte/.translations/lb.json index 56d383edba32..d99c31d2d634 100644 --- a/homeassistant/components/huawei_lte/.translations/lb.json +++ b/homeassistant/components/huawei_lte/.translations/lb.json @@ -33,7 +33,7 @@ "step": { "init": { "data": { - "name": "Numm vum Notifikatioun's Service", + "name": "Numm vum Notifikatioun's Service (Restart n\u00e9ideg bei \u00c4nnerung)", "recipient": "Empf\u00e4nger vun SMS Notifikatioune", "track_new_devices": "Nei Apparater verfollegen" } diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index a5b8b104b386..f193878d9527 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -2,7 +2,8 @@ "config": { "abort": { "already_configured": "Aquesta impressora ja est\u00e0 configurada.", - "connection_error": "No s'ha pogut connectar amb la impressora." + "connection_error": "No s'ha pogut connectar amb la impressora.", + "connection_upgrade": "No s'ha pogut connectar amb la impressora, es necessita actualitzar la connexi\u00f3." }, "error": { "connection_error": "No s'ha pogut connectar amb la impressora." diff --git a/homeassistant/components/ipp/.translations/en.json b/homeassistant/components/ipp/.translations/en.json index df84cbefa290..c3fc9be6d452 100644 --- a/homeassistant/components/ipp/.translations/en.json +++ b/homeassistant/components/ipp/.translations/en.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "This printer is already configured.", "connection_error": "Failed to connect to printer.", - "connection_upgrade": "Failed to connect to printer due to connection upgrade being required." + "connection_upgrade": "Failed to connect to printer due to connection upgrade being required.", + "parse_error": "Failed to parse response from printer." }, "error": { "connection_error": "Failed to connect to printer.", diff --git a/homeassistant/components/konnected/.translations/ca.json b/homeassistant/components/konnected/.translations/ca.json index d5fbb60ae71a..80e7208391b1 100644 --- a/homeassistant/components/konnected/.translations/ca.json +++ b/homeassistant/components/konnected/.translations/ca.json @@ -91,6 +91,7 @@ "data": { "activation": "Sortida quan estigui ON", "momentary": "Durada del pols (ms) (opcional)", + "more_states": "Configura estats addicionals per a aquesta zona", "name": "Nom (opcional)", "pause": "Pausa entre polsos (ms) (opcional)", "repeat": "Repeticions (-1 = infinit) (opcional)" diff --git a/homeassistant/components/konnected/.translations/lb.json b/homeassistant/components/konnected/.translations/lb.json index 984e3b79f54e..6ad04254611c 100644 --- a/homeassistant/components/konnected/.translations/lb.json +++ b/homeassistant/components/konnected/.translations/lb.json @@ -11,7 +11,7 @@ }, "step": { "confirm": { - "description": "Modell: {model}\nHost: {host}\nPort: {port}\n\nDir k\u00ebnnt den I/O a Panel Verhaalen an de Konnected Alarm Panel Astellunge konfigur\u00e9ieren.", + "description": "Modell: {model}\nID: {id}\nHost: {host}\nPort: {port}\n\nDir k\u00ebnnt den I/O a Panel Verhaalen an de Konnected Alarm Panel Astellunge konfigur\u00e9ieren.", "title": "Konnected Apparat parat" }, "import_confirm": { diff --git a/homeassistant/components/melcloud/.translations/pl.json b/homeassistant/components/melcloud/.translations/pl.json index 9abb68ca85a4..60cc9843607f 100644 --- a/homeassistant/components/melcloud/.translations/pl.json +++ b/homeassistant/components/melcloud/.translations/pl.json @@ -15,7 +15,7 @@ "username": "Adres e-mail u\u017cywany do logowania do MELCloud" }, "description": "Po\u0142\u0105cz u\u017cywaj\u0105c swojego konta MELCloud.", - "title": "Po\u0142\u0105cz si\u0119 z MELCloud" + "title": "Po\u0142\u0105czenie z MELCloud" } }, "title": "MELCloud" diff --git a/homeassistant/components/minecraft_server/.translations/ca.json b/homeassistant/components/minecraft_server/.translations/ca.json index 86856ac2d11a..e205090d0cd7 100644 --- a/homeassistant/components/minecraft_server/.translations/ca.json +++ b/homeassistant/components/minecraft_server/.translations/ca.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Amfitri\u00f3", - "name": "Nom", - "port": "Port" + "name": "Nom" }, "description": "Configuraci\u00f3 d'una inst\u00e0ncia de servidor de Minecraft per poder monitoritzar-lo.", "title": "Enlla\u00e7 del servidor de Minecraft" diff --git a/homeassistant/components/minecraft_server/.translations/da.json b/homeassistant/components/minecraft_server/.translations/da.json index bf930f2f2775..e536234ffdb3 100644 --- a/homeassistant/components/minecraft_server/.translations/da.json +++ b/homeassistant/components/minecraft_server/.translations/da.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "V\u00e6rt", - "name": "Navn", - "port": "Port" + "name": "Navn" }, "description": "Konfigurer din Minecraft-server-instans for at tillade overv\u00e5gning.", "title": "Forbind din Minecraft-server" diff --git a/homeassistant/components/minecraft_server/.translations/de.json b/homeassistant/components/minecraft_server/.translations/de.json index 004263082392..31f0fe2c0f09 100644 --- a/homeassistant/components/minecraft_server/.translations/de.json +++ b/homeassistant/components/minecraft_server/.translations/de.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Name", - "port": "Port" + "name": "Name" }, "description": "Richte deine Minecraft Server-Instanz ein, um es \u00fcberwachen zu k\u00f6nnen.", "title": "Verkn\u00fcpfe deinen Minecraft Server" diff --git a/homeassistant/components/minecraft_server/.translations/en.json b/homeassistant/components/minecraft_server/.translations/en.json index d0f7a5d6300d..fa04208cac9a 100644 --- a/homeassistant/components/minecraft_server/.translations/en.json +++ b/homeassistant/components/minecraft_server/.translations/en.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Name", - "port": "Port" + "name": "Name" }, "description": "Set up your Minecraft Server instance to allow monitoring.", "title": "Link your Minecraft Server" diff --git a/homeassistant/components/minecraft_server/.translations/es.json b/homeassistant/components/minecraft_server/.translations/es.json index 14831ef45e14..a4509ba68d49 100644 --- a/homeassistant/components/minecraft_server/.translations/es.json +++ b/homeassistant/components/minecraft_server/.translations/es.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Nombre", - "port": "Puerto" + "name": "Nombre" }, "description": "Configura tu instancia de Minecraft Server para permitir la supervisi\u00f3n.", "title": "Enlace su servidor Minecraft" diff --git a/homeassistant/components/minecraft_server/.translations/fr.json b/homeassistant/components/minecraft_server/.translations/fr.json index bf87c6f3d738..c52021806d8e 100644 --- a/homeassistant/components/minecraft_server/.translations/fr.json +++ b/homeassistant/components/minecraft_server/.translations/fr.json @@ -7,8 +7,7 @@ "user": { "data": { "host": "H\u00f4te", - "name": "Nom", - "port": "Port" + "name": "Nom" }, "title": "Reliez votre serveur Minecraft" } diff --git a/homeassistant/components/minecraft_server/.translations/hu.json b/homeassistant/components/minecraft_server/.translations/hu.json index 1443e41ddb33..4cf4a7a72fba 100644 --- a/homeassistant/components/minecraft_server/.translations/hu.json +++ b/homeassistant/components/minecraft_server/.translations/hu.json @@ -7,8 +7,7 @@ "user": { "data": { "host": "Kiszolg\u00e1l\u00f3", - "name": "N\u00e9v", - "port": "Port" + "name": "N\u00e9v" }, "title": "Kapcsold \u00f6ssze a Minecraft szervered" } diff --git a/homeassistant/components/minecraft_server/.translations/it.json b/homeassistant/components/minecraft_server/.translations/it.json index 5861eebcc9a4..a17ed15a5464 100644 --- a/homeassistant/components/minecraft_server/.translations/it.json +++ b/homeassistant/components/minecraft_server/.translations/it.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Nome", - "port": "Porta" + "name": "Nome" }, "description": "Configurare l'istanza del Server Minecraft per consentire il monitoraggio.", "title": "Collega il tuo Server Minecraft" diff --git a/homeassistant/components/minecraft_server/.translations/ko.json b/homeassistant/components/minecraft_server/.translations/ko.json index 66b281cc5d9c..ee3ee24db705 100644 --- a/homeassistant/components/minecraft_server/.translations/ko.json +++ b/homeassistant/components/minecraft_server/.translations/ko.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "\ud638\uc2a4\ud2b8", - "name": "\uc774\ub984", - "port": "\ud3ec\ud2b8" + "name": "\uc774\ub984" }, "description": "\ubaa8\ub2c8\ud130\ub9c1\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d Minecraft \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694.", "title": "Minecraft \uc11c\ubc84 \uc5f0\uacb0" diff --git a/homeassistant/components/minecraft_server/.translations/lb.json b/homeassistant/components/minecraft_server/.translations/lb.json index f95dd0620052..231572024694 100644 --- a/homeassistant/components/minecraft_server/.translations/lb.json +++ b/homeassistant/components/minecraft_server/.translations/lb.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Apparat", - "name": "Numm", - "port": "Port" + "name": "Numm" }, "description": "Riicht deng Minecraft Server Instanz a fir d'Iwwerwaachung z'erlaben", "title": "Verbann d\u00e4in Minecraft Server" diff --git a/homeassistant/components/minecraft_server/.translations/lv.json b/homeassistant/components/minecraft_server/.translations/lv.json index 7de2aaadfc8b..a46db9e75e57 100644 --- a/homeassistant/components/minecraft_server/.translations/lv.json +++ b/homeassistant/components/minecraft_server/.translations/lv.json @@ -3,8 +3,7 @@ "step": { "user": { "data": { - "name": "Nosaukums", - "port": "Ports" + "name": "Nosaukums" } } } diff --git a/homeassistant/components/minecraft_server/.translations/nl.json b/homeassistant/components/minecraft_server/.translations/nl.json index 75e19bc25501..4f42a16362b0 100644 --- a/homeassistant/components/minecraft_server/.translations/nl.json +++ b/homeassistant/components/minecraft_server/.translations/nl.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Naam", - "port": "Poort" + "name": "Naam" }, "description": "Stel uw Minecraft server in om monitoring toe te staan.", "title": "Koppel uw Minecraft server" diff --git a/homeassistant/components/minecraft_server/.translations/no.json b/homeassistant/components/minecraft_server/.translations/no.json index c49c76865e41..cd627cbe4ba1 100644 --- a/homeassistant/components/minecraft_server/.translations/no.json +++ b/homeassistant/components/minecraft_server/.translations/no.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Vert", - "name": "Navn", - "port": "" + "name": "Navn" }, "description": "Konfigurer Minecraft Server-forekomsten slik at den kan overv\u00e5kes.", "title": "Link din Minecraft Server" diff --git a/homeassistant/components/minecraft_server/.translations/pl.json b/homeassistant/components/minecraft_server/.translations/pl.json index f9c4a515566a..e277579ea23d 100644 --- a/homeassistant/components/minecraft_server/.translations/pl.json +++ b/homeassistant/components/minecraft_server/.translations/pl.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Nazwa", - "port": "Port" + "name": "Nazwa" }, "description": "Skonfiguruj instancj\u0119 serwera Minecraft, aby umo\u017cliwi\u0107 monitorowanie.", "title": "Po\u0142\u0105cz sw\u00f3j serwer Minecraft" diff --git a/homeassistant/components/minecraft_server/.translations/ru.json b/homeassistant/components/minecraft_server/.translations/ru.json index 916b342ee4a9..a07b84077a90 100644 --- a/homeassistant/components/minecraft_server/.translations/ru.json +++ b/homeassistant/components/minecraft_server/.translations/ru.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "\u0425\u043e\u0441\u0442", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", - "port": "\u041f\u043e\u0440\u0442" + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435" }, "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0412\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Minecraft.", "title": "Minecraft Server" diff --git a/homeassistant/components/minecraft_server/.translations/sl.json b/homeassistant/components/minecraft_server/.translations/sl.json index cf8a8af54ee8..d1ed6a36c35e 100644 --- a/homeassistant/components/minecraft_server/.translations/sl.json +++ b/homeassistant/components/minecraft_server/.translations/sl.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Gostitelj", - "name": "Ime", - "port": "Vrata" + "name": "Ime" }, "description": "Nastavite svoj Minecraft stre\u017enik, da omogo\u010dite spremljanje.", "title": "Pove\u017eite svoj Minecraft stre\u017enik" diff --git a/homeassistant/components/minecraft_server/.translations/sv.json b/homeassistant/components/minecraft_server/.translations/sv.json index acf941878dda..e95938f1590e 100644 --- a/homeassistant/components/minecraft_server/.translations/sv.json +++ b/homeassistant/components/minecraft_server/.translations/sv.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "V\u00e4rd", - "name": "Namn", - "port": "Port" + "name": "Namn" }, "description": "St\u00e4ll in din Minecraft Server-instans f\u00f6r att till\u00e5ta \u00f6vervakning.", "title": "L\u00e4nka din Minecraft-server" diff --git a/homeassistant/components/minecraft_server/.translations/tr.json b/homeassistant/components/minecraft_server/.translations/tr.json index 595c16869822..fb76f697cd54 100644 --- a/homeassistant/components/minecraft_server/.translations/tr.json +++ b/homeassistant/components/minecraft_server/.translations/tr.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "Host", - "name": "Ad", - "port": "Port" + "name": "Ad" }, "description": "G\u00f6zetmeye izin vermek i\u00e7in Minecraft server nesnesini ayarla.", "title": "Minecraft Servern\u0131 ba\u011fla" diff --git a/homeassistant/components/minecraft_server/.translations/zh-Hant.json b/homeassistant/components/minecraft_server/.translations/zh-Hant.json index c451ad710655..fbcde2a6be15 100644 --- a/homeassistant/components/minecraft_server/.translations/zh-Hant.json +++ b/homeassistant/components/minecraft_server/.translations/zh-Hant.json @@ -12,8 +12,7 @@ "user": { "data": { "host": "\u4e3b\u6a5f\u7aef", - "name": "\u540d\u7a31", - "port": "\u901a\u8a0a\u57e0" + "name": "\u540d\u7a31" }, "description": "\u8a2d\u5b9a Minecraft \u4f3a\u670d\u5668\u4ee5\u9032\u884c\u76e3\u63a7\u3002", "title": "\u9023\u7d50 Minecraft \u4f3a\u670d\u5668" diff --git a/homeassistant/components/notion/.translations/bg.json b/homeassistant/components/notion/.translations/bg.json index 33ce361958ab..1c78180e2a85 100644 --- a/homeassistant/components/notion/.translations/bg.json +++ b/homeassistant/components/notion/.translations/bg.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e\u0442\u043e \u0438\u043c\u0435 \u0432\u0435\u0447\u0435 \u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043d\u043e", "invalid_credentials": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0430", "no_devices": "\u041d\u0435 \u0441\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0430" }, diff --git a/homeassistant/components/notion/.translations/ca.json b/homeassistant/components/notion/.translations/ca.json index 09f598ef5d1a..b6e73a5e209c 100644 --- a/homeassistant/components/notion/.translations/ca.json +++ b/homeassistant/components/notion/.translations/ca.json @@ -4,7 +4,6 @@ "already_configured": "Aquest nom d'usuari ja est\u00e0 en \u00fas." }, "error": { - "identifier_exists": "Nom d'usuari ja registrat", "invalid_credentials": "Nom d'usuari o contrasenya incorrectes", "no_devices": "No s'han trobat dispositius al compte" }, diff --git a/homeassistant/components/notion/.translations/da.json b/homeassistant/components/notion/.translations/da.json index 784d106b94c7..6b139fa6e668 100644 --- a/homeassistant/components/notion/.translations/da.json +++ b/homeassistant/components/notion/.translations/da.json @@ -4,7 +4,6 @@ "already_configured": "Dette brugernavn er allerede i brug." }, "error": { - "identifier_exists": "Brugernavn er allerede registreret", "invalid_credentials": "Ugyldigt brugernavn eller adgangskode", "no_devices": "Ingen enheder fundet i konto" }, diff --git a/homeassistant/components/notion/.translations/de.json b/homeassistant/components/notion/.translations/de.json index e11a16458c97..1ccd8c86bdc7 100644 --- a/homeassistant/components/notion/.translations/de.json +++ b/homeassistant/components/notion/.translations/de.json @@ -4,7 +4,6 @@ "already_configured": "Dieser Benutzername wird bereits benutzt." }, "error": { - "identifier_exists": "Benutzername bereits registriert", "invalid_credentials": "Ung\u00fcltiger Benutzername oder Passwort", "no_devices": "Keine Ger\u00e4te im Konto gefunden" }, diff --git a/homeassistant/components/notion/.translations/en.json b/homeassistant/components/notion/.translations/en.json index 2476293a2165..b729b368c37e 100644 --- a/homeassistant/components/notion/.translations/en.json +++ b/homeassistant/components/notion/.translations/en.json @@ -4,7 +4,6 @@ "already_configured": "This username is already in use." }, "error": { - "identifier_exists": "Username already registered", "invalid_credentials": "Invalid username or password", "no_devices": "No devices found in account" }, diff --git a/homeassistant/components/notion/.translations/es-419.json b/homeassistant/components/notion/.translations/es-419.json index 1f4968f24e13..ad2f19b0668c 100644 --- a/homeassistant/components/notion/.translations/es-419.json +++ b/homeassistant/components/notion/.translations/es-419.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Nombre de usuario ya registrado", "invalid_credentials": "Nombre de usuario o contrase\u00f1a inv\u00e1lidos", "no_devices": "No se han encontrado dispositivos en la cuenta." }, diff --git a/homeassistant/components/notion/.translations/es.json b/homeassistant/components/notion/.translations/es.json index 08d02bd74932..7293e8f229f8 100644 --- a/homeassistant/components/notion/.translations/es.json +++ b/homeassistant/components/notion/.translations/es.json @@ -4,7 +4,6 @@ "already_configured": "Esta nombre de usuario ya est\u00e1 en uso." }, "error": { - "identifier_exists": "Nombre de usuario ya registrado", "invalid_credentials": "Usuario o contrase\u00f1a no v\u00e1lido", "no_devices": "No se han encontrado dispositivos en la cuenta" }, diff --git a/homeassistant/components/notion/.translations/fr.json b/homeassistant/components/notion/.translations/fr.json index 4477c6929932..ae24ba704196 100644 --- a/homeassistant/components/notion/.translations/fr.json +++ b/homeassistant/components/notion/.translations/fr.json @@ -4,7 +4,6 @@ "already_configured": "Ce nom d'utilisateur est d\u00e9j\u00e0 utilis\u00e9." }, "error": { - "identifier_exists": "Nom d'utilisateur d\u00e9j\u00e0 enregistr\u00e9", "invalid_credentials": "Nom d'utilisateur ou mot de passe invalide", "no_devices": "Aucun appareil trouv\u00e9 sur le compte" }, diff --git a/homeassistant/components/notion/.translations/hr.json b/homeassistant/components/notion/.translations/hr.json index b20317a236a7..93ab9a4bf512 100644 --- a/homeassistant/components/notion/.translations/hr.json +++ b/homeassistant/components/notion/.translations/hr.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Korisni\u010dko ime je ve\u0107 registrirano", "invalid_credentials": "Neispravno korisni\u010dko ime ili lozinka", "no_devices": "Nisu prona\u0111eni ure\u0111aji na ra\u010dunu" }, diff --git a/homeassistant/components/notion/.translations/hu.json b/homeassistant/components/notion/.translations/hu.json index 79878858ddcd..285e6c7b4858 100644 --- a/homeassistant/components/notion/.translations/hu.json +++ b/homeassistant/components/notion/.translations/hu.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Felhaszn\u00e1l\u00f3n\u00e9v m\u00e1r regisztr\u00e1lva van", "invalid_credentials": "\u00c9rv\u00e9nytelen felhaszn\u00e1l\u00f3n\u00e9v vagy jelsz\u00f3", "no_devices": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a fi\u00f3kban" }, diff --git a/homeassistant/components/notion/.translations/it.json b/homeassistant/components/notion/.translations/it.json index 18ad0987aa7b..e33b50f19389 100644 --- a/homeassistant/components/notion/.translations/it.json +++ b/homeassistant/components/notion/.translations/it.json @@ -4,7 +4,6 @@ "already_configured": "Questo nome utente \u00e8 gi\u00e0 in uso." }, "error": { - "identifier_exists": "Nome utente gi\u00e0 registrato", "invalid_credentials": "Nome utente o password non validi", "no_devices": "Nessun dispositivo trovato nell'account" }, diff --git a/homeassistant/components/notion/.translations/ko.json b/homeassistant/components/notion/.translations/ko.json index 52c7b6339cb0..c848684ab597 100644 --- a/homeassistant/components/notion/.translations/ko.json +++ b/homeassistant/components/notion/.translations/ko.json @@ -4,7 +4,6 @@ "already_configured": "\uc774 \uc0ac\uc6a9\uc790 \uc774\ub984\uc740 \uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4." }, "error": { - "identifier_exists": "\uc0ac\uc6a9\uc790 \uc774\ub984\uc774 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "invalid_credentials": "\uc0ac\uc6a9\uc790 \uc774\ub984 \ub610\ub294 \ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "no_devices": "\uacc4\uc815\uc5d0 \ub4f1\ub85d\ub41c \uae30\uae30\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4" }, diff --git a/homeassistant/components/notion/.translations/lb.json b/homeassistant/components/notion/.translations/lb.json index bc9fa9633b25..b5d2eabd5071 100644 --- a/homeassistant/components/notion/.translations/lb.json +++ b/homeassistant/components/notion/.translations/lb.json @@ -4,7 +4,6 @@ "already_configured": "D\u00ebse Benotzernumm g\u00ebtt scho benotzt." }, "error": { - "identifier_exists": "Benotzernumm ass scho registr\u00e9iert", "invalid_credentials": "Ong\u00ebltege Benotzernumm oder Passwuert", "no_devices": "Keng Apparater am Kont fonnt" }, diff --git a/homeassistant/components/notion/.translations/nl.json b/homeassistant/components/notion/.translations/nl.json index c26fb50e0757..f45ea87f972b 100644 --- a/homeassistant/components/notion/.translations/nl.json +++ b/homeassistant/components/notion/.translations/nl.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Gebruikersnaam al geregistreerd", "invalid_credentials": "Ongeldige gebruikersnaam of wachtwoord", "no_devices": "Geen apparaten gevonden in account" }, diff --git a/homeassistant/components/notion/.translations/no.json b/homeassistant/components/notion/.translations/no.json index 16105e680c59..302ef3f2b395 100644 --- a/homeassistant/components/notion/.translations/no.json +++ b/homeassistant/components/notion/.translations/no.json @@ -4,7 +4,6 @@ "already_configured": "Dette brukernavnet er allerede i bruk." }, "error": { - "identifier_exists": "Brukernavn er allerede registrert", "invalid_credentials": "Ugyldig brukernavn eller passord", "no_devices": "Ingen enheter funnet i kontoen" }, diff --git a/homeassistant/components/notion/.translations/pl.json b/homeassistant/components/notion/.translations/pl.json index 07facb21e93d..fb9ffaad9c02 100644 --- a/homeassistant/components/notion/.translations/pl.json +++ b/homeassistant/components/notion/.translations/pl.json @@ -4,7 +4,6 @@ "already_configured": "Ta nazwa u\u017cytkownika jest ju\u017c w u\u017cyciu." }, "error": { - "identifier_exists": "Nazwa u\u017cytkownika jest ju\u017c zarejestrowana.", "invalid_credentials": "Nieprawid\u0142owa nazwa u\u017cytkownika lub has\u0142o", "no_devices": "Nie znaleziono urz\u0105dze\u0144 na koncie" }, diff --git a/homeassistant/components/notion/.translations/pt-BR.json b/homeassistant/components/notion/.translations/pt-BR.json index 4e81ac036655..5f790c02a40b 100644 --- a/homeassistant/components/notion/.translations/pt-BR.json +++ b/homeassistant/components/notion/.translations/pt-BR.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Nome de usu\u00e1rio j\u00e1 registrado", "invalid_credentials": "Usu\u00e1rio ou senha inv\u00e1lidos", "no_devices": "Nenhum dispositivo encontrado na conta" }, diff --git a/homeassistant/components/notion/.translations/ru.json b/homeassistant/components/notion/.translations/ru.json index 6e64ebbe7aab..41627cc6ab04 100644 --- a/homeassistant/components/notion/.translations/ru.json +++ b/homeassistant/components/notion/.translations/ru.json @@ -4,7 +4,6 @@ "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f." }, "error": { - "identifier_exists": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430.", "invalid_credentials": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c.", "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." }, diff --git a/homeassistant/components/notion/.translations/sl.json b/homeassistant/components/notion/.translations/sl.json index c5577f52a244..5abe6164038e 100644 --- a/homeassistant/components/notion/.translations/sl.json +++ b/homeassistant/components/notion/.translations/sl.json @@ -4,7 +4,6 @@ "already_configured": "To uporabni\u0161ko ime je \u017ee v uporabi." }, "error": { - "identifier_exists": "Uporabni\u0161ko ime je \u017ee registrirano", "invalid_credentials": "Neveljavno uporabni\u0161ko ime ali geslo", "no_devices": "V ra\u010dunu ni najdene nobene naprave" }, diff --git a/homeassistant/components/notion/.translations/sv.json b/homeassistant/components/notion/.translations/sv.json index 958cc48af282..896481802466 100644 --- a/homeassistant/components/notion/.translations/sv.json +++ b/homeassistant/components/notion/.translations/sv.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "Anv\u00e4ndarnamn \u00e4r redan anv\u00e4nt", "invalid_credentials": "Felaktigt anv\u00e4ndarnamn eller l\u00f6senord", "no_devices": "Inga enheter hittades p\u00e5 kontot" }, diff --git a/homeassistant/components/notion/.translations/zh-Hans.json b/homeassistant/components/notion/.translations/zh-Hans.json index 81d937279569..0e61657f6154 100644 --- a/homeassistant/components/notion/.translations/zh-Hans.json +++ b/homeassistant/components/notion/.translations/zh-Hans.json @@ -1,7 +1,6 @@ { "config": { "error": { - "identifier_exists": "\u7528\u6237\u540d\u5df2\u6ce8\u518c", "invalid_credentials": "\u65e0\u6548\u7684\u7528\u6237\u540d\u6216\u5bc6\u7801", "no_devices": "\u5e10\u6237\u4e2d\u627e\u4e0d\u5230\u8bbe\u5907" }, diff --git a/homeassistant/components/notion/.translations/zh-Hant.json b/homeassistant/components/notion/.translations/zh-Hant.json index c426dfa32652..2767c504b78e 100644 --- a/homeassistant/components/notion/.translations/zh-Hant.json +++ b/homeassistant/components/notion/.translations/zh-Hant.json @@ -4,7 +4,6 @@ "already_configured": "\u6b64\u4f7f\u7528\u8005\u540d\u7a31\u5df2\u88ab\u4f7f\u7528\u3002" }, "error": { - "identifier_exists": "\u4f7f\u7528\u8005\u540d\u7a31\u5df2\u8a3b\u518a", "invalid_credentials": "\u4f7f\u7528\u8005\u540d\u7a31\u6216\u5bc6\u78bc\u7121\u6548", "no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u8a2d\u5099" }, diff --git a/homeassistant/components/nut/.translations/pl.json b/homeassistant/components/nut/.translations/pl.json new file mode 100644 index 000000000000..ee9a67b243b8 --- /dev/null +++ b/homeassistant/components/nut/.translations/pl.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane." + }, + "error": { + "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.", + "unknown": "Niespodziewany b\u0142\u0105d." + }, + "step": { + "user": { + "data": { + "alias": "Alias", + "host": "Host", + "name": "Nazwa", + "password": "Has\u0142o", + "port": "Port", + "resources": "Zasoby", + "username": "Nazwa u\u017cytkownika" + }, + "description": "Je\u015bli do serwera NUT pod\u0142\u0105czonych jest wiele zasilaczy UPS, wprowad\u017a w polu Alias nazw\u0119 zasilacza UPS, kt\u00f3rego dotyczy zapytanie.", + "title": "Po\u0142\u0105cz z serwerem NUT" + } + }, + "title": "Sieciowe narz\u0119dzia UPS (NUT)" + }, + "options": { + "step": { + "init": { + "data": { + "resources": "Zasoby" + }, + "description": "Wybierz zasoby sensor\u00f3w" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/bg.json b/homeassistant/components/opentherm_gw/.translations/bg.json index cd109579f645..fe9a611f1151 100644 --- a/homeassistant/components/opentherm_gw/.translations/bg.json +++ b/homeassistant/components/opentherm_gw/.translations/bg.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "\u041f\u044a\u0442 \u0438\u043b\u0438 URL \u0430\u0434\u0440\u0435\u0441", - "floor_temperature": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043d\u0430 \u043f\u043e\u0434\u0430", "id": "ID", - "name": "\u0418\u043c\u0435", - "precision": "\u041f\u0440\u0435\u0446\u0438\u0437\u043d\u043e\u0441\u0442 \u043d\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u043d\u0430 \u043a\u043b\u0438\u043c\u0430\u0442\u0430" + "name": "\u0418\u043c\u0435" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/ca.json b/homeassistant/components/opentherm_gw/.translations/ca.json index 07567149063c..4d39dec36624 100644 --- a/homeassistant/components/opentherm_gw/.translations/ca.json +++ b/homeassistant/components/opentherm_gw/.translations/ca.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Ruta o URL", - "floor_temperature": "Temperatura del pis", "id": "ID", - "name": "Nom", - "precision": "Precisi\u00f3 de la temperatura" + "name": "Nom" }, "title": "Passarel\u00b7la d'OpenTherm" } diff --git a/homeassistant/components/opentherm_gw/.translations/da.json b/homeassistant/components/opentherm_gw/.translations/da.json index 743adb715f68..bbdec393ab06 100644 --- a/homeassistant/components/opentherm_gw/.translations/da.json +++ b/homeassistant/components/opentherm_gw/.translations/da.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Sti eller webadresse", - "floor_temperature": "Gulvklima-temperatur", "id": "Id", - "name": "Navn", - "precision": "Klimatemperatur-pr\u00e6cision" + "name": "Navn" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/de.json b/homeassistant/components/opentherm_gw/.translations/de.json index c29be320d20d..92217c51c044 100644 --- a/homeassistant/components/opentherm_gw/.translations/de.json +++ b/homeassistant/components/opentherm_gw/.translations/de.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Pfad oder URL", - "floor_temperature": "Boden-Temperatur", "id": "ID", - "name": "Name", - "precision": "Genauigkeit der Temperatur" + "name": "Name" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/en.json b/homeassistant/components/opentherm_gw/.translations/en.json index a7e143505a8a..5ba5d232bfcc 100644 --- a/homeassistant/components/opentherm_gw/.translations/en.json +++ b/homeassistant/components/opentherm_gw/.translations/en.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Path or URL", - "floor_temperature": "Floor climate temperature", "id": "ID", - "name": "Name", - "precision": "Climate temperature precision" + "name": "Name" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/es.json b/homeassistant/components/opentherm_gw/.translations/es.json index bb8a8b20f367..9acfbb4bf677 100644 --- a/homeassistant/components/opentherm_gw/.translations/es.json +++ b/homeassistant/components/opentherm_gw/.translations/es.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Ruta o URL", - "floor_temperature": "Temperatura del suelo", "id": "ID", - "name": "Nombre", - "precision": "Precisi\u00f3n de la temperatura clim\u00e1tica" + "name": "Nombre" }, "title": "Gateway OpenTherm" } diff --git a/homeassistant/components/opentherm_gw/.translations/fr.json b/homeassistant/components/opentherm_gw/.translations/fr.json index edde63d62b47..7508612580d7 100644 --- a/homeassistant/components/opentherm_gw/.translations/fr.json +++ b/homeassistant/components/opentherm_gw/.translations/fr.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Chemin ou URL", - "floor_temperature": "Temp\u00e9rature du sol", "id": "ID", - "name": "Nom", - "precision": "Pr\u00e9cision de la temp\u00e9rature climatique" + "name": "Nom" }, "title": "Passerelle OpenTherm" } diff --git a/homeassistant/components/opentherm_gw/.translations/hu.json b/homeassistant/components/opentherm_gw/.translations/hu.json index 8a0780581fde..1a00570d324c 100644 --- a/homeassistant/components/opentherm_gw/.translations/hu.json +++ b/homeassistant/components/opentherm_gw/.translations/hu.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "El\u00e9r\u00e9si \u00fat vagy URL", - "floor_temperature": "Padl\u00f3 kl\u00edma h\u0151m\u00e9rs\u00e9klete", "id": "ID", - "name": "N\u00e9v", - "precision": "Kl\u00edma h\u0151m\u00e9rs\u00e9klet pontoss\u00e1ga" + "name": "N\u00e9v" }, "title": "OpenTherm \u00e1tj\u00e1r\u00f3" } diff --git a/homeassistant/components/opentherm_gw/.translations/it.json b/homeassistant/components/opentherm_gw/.translations/it.json index 73c3a8db9709..c1392fdd077d 100644 --- a/homeassistant/components/opentherm_gw/.translations/it.json +++ b/homeassistant/components/opentherm_gw/.translations/it.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Percorso o URL", - "floor_temperature": "Temperatura climatica del pavimento", "id": "ID", - "name": "Nome", - "precision": "Precisione della temperatura climatica" + "name": "Nome" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/ko.json b/homeassistant/components/opentherm_gw/.translations/ko.json index f370427625d1..a51efdb197b9 100644 --- a/homeassistant/components/opentherm_gw/.translations/ko.json +++ b/homeassistant/components/opentherm_gw/.translations/ko.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "\uacbd\ub85c \ub610\ub294 URL", - "floor_temperature": "\uc2e4\ub0b4\uc628\ub3c4 \uc18c\uc218\uc810 \ubc84\ub9bc", "id": "ID", - "name": "\uc774\ub984", - "precision": "\uc2e4\ub0b4\uc628\ub3c4 \uc815\ubc00\ub3c4" + "name": "\uc774\ub984" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/lb.json b/homeassistant/components/opentherm_gw/.translations/lb.json index 505815dcb4dc..3a057ec4e3b0 100644 --- a/homeassistant/components/opentherm_gw/.translations/lb.json +++ b/homeassistant/components/opentherm_gw/.translations/lb.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Pfad oder URL", - "floor_temperature": "Buedem Klima Temperatur", "id": "ID", - "name": "Numm", - "precision": "Klima Temperatur Prezisioun" + "name": "Numm" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/nl.json b/homeassistant/components/opentherm_gw/.translations/nl.json index dbed3326b4a2..331307d3bca9 100644 --- a/homeassistant/components/opentherm_gw/.translations/nl.json +++ b/homeassistant/components/opentherm_gw/.translations/nl.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Pad of URL", - "floor_temperature": "Vloertemperatuur", "id": "ID", - "name": "Naam", - "precision": "Klimaattemperatuur precisie" + "name": "Naam" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/no.json b/homeassistant/components/opentherm_gw/.translations/no.json index d05a8efe1683..6b30b85931d6 100644 --- a/homeassistant/components/opentherm_gw/.translations/no.json +++ b/homeassistant/components/opentherm_gw/.translations/no.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Bane eller URL-adresse", - "floor_temperature": "Gulv klimatemperatur", "id": "", - "name": "Navn", - "precision": "Klima temperaturpresisjon" + "name": "Navn" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/pl.json b/homeassistant/components/opentherm_gw/.translations/pl.json index 88791781e3f5..9d945eac27e9 100644 --- a/homeassistant/components/opentherm_gw/.translations/pl.json +++ b/homeassistant/components/opentherm_gw/.translations/pl.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "\u015acie\u017cka lub adres URL", - "floor_temperature": "Zaokr\u0105glanie warto\u015bci w d\u00f3\u0142", "id": "Identyfikator", - "name": "Nazwa", - "precision": "Precyzja temperatury" + "name": "Nazwa" }, "title": "Bramka OpenTherm" } diff --git a/homeassistant/components/opentherm_gw/.translations/ru.json b/homeassistant/components/opentherm_gw/.translations/ru.json index 0719857a7d30..6ad69e23c236 100644 --- a/homeassistant/components/opentherm_gw/.translations/ru.json +++ b/homeassistant/components/opentherm_gw/.translations/ru.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "\u041f\u0443\u0442\u044c \u0438\u043b\u0438 URL-\u0430\u0434\u0440\u0435\u0441", - "floor_temperature": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u043b\u0430", "id": "ID", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", - "precision": "\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b" + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435" }, "title": "OpenTherm" } diff --git a/homeassistant/components/opentherm_gw/.translations/sl.json b/homeassistant/components/opentherm_gw/.translations/sl.json index bba6421ed3d6..8eabe6839bbc 100644 --- a/homeassistant/components/opentherm_gw/.translations/sl.json +++ b/homeassistant/components/opentherm_gw/.translations/sl.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "Pot ali URL", - "floor_temperature": "Temperatura nadstropja", "id": "ID", - "name": "Ime", - "precision": "Natan\u010dnost temperature" + "name": "Ime" }, "title": "OpenTherm Prehod" } diff --git a/homeassistant/components/opentherm_gw/.translations/sv.json b/homeassistant/components/opentherm_gw/.translations/sv.json index 89ce4d75674b..61562b9562fb 100644 --- a/homeassistant/components/opentherm_gw/.translations/sv.json +++ b/homeassistant/components/opentherm_gw/.translations/sv.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "S\u00f6kv\u00e4g eller URL", - "floor_temperature": "Golvtemperatur", "id": "ID", - "name": "Namn", - "precision": "Klimatemperaturprecision" + "name": "Namn" }, "title": "OpenTherm Gateway" } diff --git a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json index 0d2842ce7679..6c6db9481568 100644 --- a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json +++ b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json @@ -10,10 +10,8 @@ "init": { "data": { "device": "\u8def\u5f91\u6216 URL", - "floor_temperature": "\u6a13\u5c64\u6eab\u5ea6", "id": "ID", - "name": "\u540d\u7a31", - "precision": "\u6eab\u63a7\u7cbe\u6e96\u5ea6" + "name": "\u540d\u7a31" }, "title": "OpenTherm \u9598\u9053\u5668" } diff --git a/homeassistant/components/plex/.translations/bg.json b/homeassistant/components/plex/.translations/bg.json index adfdd98ebaff..53d15e1205e5 100644 --- a/homeassistant/components/plex/.translations/bg.json +++ b/homeassistant/components/plex/.translations/bg.json @@ -4,7 +4,6 @@ "all_configured": "\u0412\u0441\u0438\u0447\u043a\u0438 \u0441\u0432\u044a\u0440\u0437\u0430\u043d\u0438 \u0441\u044a\u0440\u0432\u044a\u0440\u0438 \u0432\u0435\u0447\u0435 \u0441\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0438", "already_configured": "\u0422\u043e\u0437\u0438 Plex \u0441\u044a\u0440\u0432\u044a\u0440 \u0432\u0435\u0447\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d", "already_in_progress": "Plex \u0441\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430", - "discovery_no_file": "\u041d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d \u0441\u0442\u0430\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u0435\u043d \u0444\u0430\u0439\u043b", "invalid_import": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0430\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430", "non-interactive": "\u041d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0435\u043d \u0438\u043c\u043f\u043e\u0440\u0442", "token_request_timeout": "\u0418\u0437\u0442\u0435\u0447\u0435 \u0432\u0440\u0435\u043c\u0435\u0442\u043e \u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u0430 \u043e\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f", "no_servers": "\u041d\u044f\u043c\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0438, \u0441\u0432\u044a\u0440\u0437\u0430\u043d\u0438 \u0441 \u0442\u043e\u0437\u0438 \u0430\u043a\u0430\u0443\u043d\u0442", - "no_token": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043e\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u0435\u043d \u043a\u043e\u0434 \u0438\u043b\u0438 \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u044a\u0447\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430", "not_found": "Plex \u0441\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d" }, "step": { - "manual_setup": { - "data": { - "host": "\u0410\u0434\u0440\u0435\u0441", - "port": "\u041f\u043e\u0440\u0442", - "ssl": "\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 SSL", - "token": "\u041a\u043e\u0434 (\u0430\u043a\u043e \u0441\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430)", - "verify_ssl": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442" - }, - "title": "Plex \u0441\u044a\u0440\u0432\u044a\u0440" - }, "select_server": { "data": { "server": "\u0421\u044a\u0440\u0432\u044a\u0440" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0435\u0442\u0435 \u0441 \u043e\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 plex.tv.", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 Plex \u0441\u044a\u0440\u0432\u044a\u0440" - }, - "user": { - "data": { - "manual_setup": "\u0420\u044a\u0447\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430", - "token": "Plex \u043a\u043e\u0434" - }, - "description": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0435\u0442\u0435 \u0441 \u043e\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 plex.tv \u0438\u043b\u0438 \u0440\u044a\u0447\u043d\u043e \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 \u0441\u044a\u0440\u0432\u044a\u0440.", - "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 Plex \u0441\u044a\u0440\u0432\u044a\u0440" } }, "title": "Plex" @@ -53,7 +33,6 @@ "step": { "plex_mp_settings": { "data": { - "show_all_controls": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438", "use_episode_art": "\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u0430\u043a\u0430\u0442 \u0437\u0430 \u0435\u043f\u0438\u0437\u043e\u0434\u0430" }, "description": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Plex Media Players" diff --git a/homeassistant/components/plex/.translations/ca.json b/homeassistant/components/plex/.translations/ca.json index d562d62b602a..46b7759a04db 100644 --- a/homeassistant/components/plex/.translations/ca.json +++ b/homeassistant/components/plex/.translations/ca.json @@ -4,7 +4,6 @@ "all_configured": "Tots els servidors enlla\u00e7ats ja estan configurats", "already_configured": "Aquest servidor Plex ja est\u00e0 configurat", "already_in_progress": "S\u2019est\u00e0 configurant Plex", - "discovery_no_file": "No s'ha trobat cap fitxer de configuraci\u00f3 heretat", "invalid_import": "La configuraci\u00f3 importada \u00e9s inv\u00e0lida", "non-interactive": "Importaci\u00f3 no interactiva", "token_request_timeout": "S'ha acabat el temps d'espera durant l'obtenci\u00f3 del testimoni.", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Ha fallat l'autoritzaci\u00f3", "no_servers": "No hi ha servidors enlla\u00e7ats amb el compte", - "no_token": "Proporciona un testimoni d'autenticaci\u00f3 o selecciona configuraci\u00f3 manual", "not_found": "No s'ha trobat el servidor Plex" }, "step": { - "manual_setup": { - "data": { - "host": "Amfitri\u00f3", - "port": "Port", - "ssl": "Utilitza SSL", - "token": "Testimoni d'autenticaci\u00f3 (si \u00e9s necessari)", - "verify_ssl": "Verifica el certificat SSL" - }, - "title": "Servidor Plex" - }, "select_server": { "data": { "server": "Servidor" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Continua l'autoritzaci\u00f3 a plex.tv.", "title": "Connexi\u00f3 amb el servidor Plex" - }, - "user": { - "data": { - "manual_setup": "Configuraci\u00f3 manual", - "token": "Testimoni d'autenticaci\u00f3 Plex" - }, - "description": "Introdueix un testimoni d'autenticaci\u00f3 Plex per configurar-ho autom\u00e0ticament.", - "title": "Connexi\u00f3 amb el servidor Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignora els nous usuaris gestionats/compartits", "monitored_users": "Usuaris monitoritzats", - "show_all_controls": "Mostra tots els controls", "use_episode_art": "Utilitza imatges de l'episodi" }, "description": "Opcions dels reproductors multim\u00e8dia Plex" diff --git a/homeassistant/components/plex/.translations/cs.json b/homeassistant/components/plex/.translations/cs.json index e033cd5c514e..dc84548da7fd 100644 --- a/homeassistant/components/plex/.translations/cs.json +++ b/homeassistant/components/plex/.translations/cs.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "discovery_no_file": "Nebyl nalezen \u017e\u00e1dn\u00fd star\u0161\u00ed konfigura\u010dn\u00ed soubor" - }, "step": { "start_website_auth": { "description": "Pokra\u010dujte v autorizaci na plex.tv.", diff --git a/homeassistant/components/plex/.translations/da.json b/homeassistant/components/plex/.translations/da.json index 9b80373727d7..7bfdda60b377 100644 --- a/homeassistant/components/plex/.translations/da.json +++ b/homeassistant/components/plex/.translations/da.json @@ -4,7 +4,6 @@ "all_configured": "Alle linkede servere er allerede konfigureret", "already_configured": "Denne Plex-server er allerede konfigureret", "already_in_progress": "Plex konfigureres", - "discovery_no_file": "Der blev ikke fundet nogen \u00e6ldre konfigurationsfil", "invalid_import": "Importeret konfiguration er ugyldig", "non-interactive": "Ikke-interaktiv import", "token_request_timeout": "Timeout ved hentning af token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Godkendelse mislykkedes", "no_servers": "Ingen servere knyttet til konto", - "no_token": "Angiv et token eller v\u00e6lg manuel ops\u00e6tning", "not_found": "Plex-server ikke fundet" }, "step": { - "manual_setup": { - "data": { - "host": "V\u00e6rt", - "port": "Port", - "ssl": "Brug SSL", - "token": "Token (hvis n\u00f8dvendigt)", - "verify_ssl": "Bekr\u00e6ft SSL-certifikat" - }, - "title": "Plex-server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Forts\u00e6t for at godkende p\u00e5 plex.tv.", "title": "Forbind Plex-server" - }, - "user": { - "data": { - "manual_setup": "Manuel ops\u00e6tning", - "token": "Plex-token" - }, - "description": "Indtast et Plex-token til automatisk ops\u00e6tning eller konfigurerer en server manuelt.", - "title": "Tilslut Plex-server" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorer nye administrerede/delte brugere", "monitored_users": "Monitorerede brugere", - "show_all_controls": "Vis alle kontrolelementer", "use_episode_art": "Brug episodekunst" }, "description": "Indstillinger for Plex-medieafspillere" diff --git a/homeassistant/components/plex/.translations/de.json b/homeassistant/components/plex/.translations/de.json index ea8f4b60de43..c86ffb97d3a9 100644 --- a/homeassistant/components/plex/.translations/de.json +++ b/homeassistant/components/plex/.translations/de.json @@ -4,7 +4,6 @@ "all_configured": "Alle verkn\u00fcpften Server sind bereits konfiguriert", "already_configured": "Dieser Plex-Server ist bereits konfiguriert", "already_in_progress": "Plex wird konfiguriert", - "discovery_no_file": "Es wurde keine alte Konfigurationsdatei gefunden", "invalid_import": "Die importierte Konfiguration ist ung\u00fcltig", "non-interactive": "Nicht interaktiver Import", "token_request_timeout": "Zeit\u00fcberschreitung beim Erhalt des Tokens", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Autorisation fehlgeschlagen", "no_servers": "Keine Server sind mit dem Konto verbunden", - "no_token": "Bereitstellen eines Tokens oder Ausw\u00e4hlen der manuellen Einrichtung", "not_found": "Plex-Server nicht gefunden" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Port", - "ssl": "SSL verwenden", - "token": "Token (falls erforderlich)", - "verify_ssl": "SSL-Zertifikat \u00fcberpr\u00fcfen" - }, - "title": "Plex Server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Weiter zur Autorisierung unter plex.tv.", "title": "Plex Server verbinden" - }, - "user": { - "data": { - "manual_setup": "Manuelle Einrichtung", - "token": "Plex Token" - }, - "description": "Fahre mit der Autorisierung unter plex.tv fort oder konfiguriere einen Server manuell.", - "title": "Plex Server verbinden" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorieren neuer verwalteter/freigegebener Benutzer", "monitored_users": "\u00dcberwachte Benutzer", - "show_all_controls": "Alle Steuerelemente anzeigen", "use_episode_art": "Episode-Bilder verwenden" }, "description": "Optionen f\u00fcr Plex-Media-Player" diff --git a/homeassistant/components/plex/.translations/en.json b/homeassistant/components/plex/.translations/en.json index 4567171af779..b9ca9b355eef 100644 --- a/homeassistant/components/plex/.translations/en.json +++ b/homeassistant/components/plex/.translations/en.json @@ -4,7 +4,6 @@ "all_configured": "All linked servers already configured", "already_configured": "This Plex server is already configured", "already_in_progress": "Plex is being configured", - "discovery_no_file": "No legacy configuration file found", "invalid_import": "Imported configuration is invalid", "non-interactive": "Non-interactive import", "token_request_timeout": "Timed out obtaining token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Authorization failed", "no_servers": "No servers linked to account", - "no_token": "Provide a token or select manual setup", "not_found": "Plex server not found" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Port", - "ssl": "Use SSL", - "token": "Token (if required)", - "verify_ssl": "Verify SSL certificate" - }, - "title": "Plex server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Continue to authorize at plex.tv.", "title": "Connect Plex server" - }, - "user": { - "data": { - "manual_setup": "Manual setup", - "token": "Plex token" - }, - "description": "Continue to authorize at plex.tv or manually configure a server.", - "title": "Connect Plex server" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignore new managed/shared users", "monitored_users": "Monitored users", - "show_all_controls": "Show all controls", "use_episode_art": "Use episode art" }, "description": "Options for Plex Media Players" diff --git a/homeassistant/components/plex/.translations/es-419.json b/homeassistant/components/plex/.translations/es-419.json index 2fc98a70ead8..0546fcd7adff 100644 --- a/homeassistant/components/plex/.translations/es-419.json +++ b/homeassistant/components/plex/.translations/es-419.json @@ -11,33 +11,15 @@ "error": { "faulty_credentials": "Autorizaci\u00f3n fallida", "no_servers": "No hay servidores vinculados a la cuenta", - "no_token": "Proporcione un token o seleccione la configuraci\u00f3n manual", "not_found": "Servidor Plex no encontrado" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Puerto", - "ssl": "Usar SSL", - "token": "Token (si es necesario)", - "verify_ssl": "Verificar el certificado SSL" - }, - "title": "Servidor Plex" - }, "select_server": { "data": { "server": "Servidor" }, "description": "M\u00faltiples servidores disponibles, seleccione uno:", "title": "Seleccionar servidor Plex" - }, - "user": { - "data": { - "manual_setup": "Configuraci\u00f3n manual", - "token": "Token Plex" - }, - "title": "Conectar servidor Plex" } }, "title": "Plex" @@ -45,9 +27,6 @@ "options": { "step": { "plex_mp_settings": { - "data": { - "show_all_controls": "Mostrar todos los controles" - }, "description": "Opciones para reproductores multimedia Plex" } } diff --git a/homeassistant/components/plex/.translations/es.json b/homeassistant/components/plex/.translations/es.json index 24127a7332c6..3de562db21d8 100644 --- a/homeassistant/components/plex/.translations/es.json +++ b/homeassistant/components/plex/.translations/es.json @@ -4,7 +4,6 @@ "all_configured": "Todos los servidores vinculados ya configurados", "already_configured": "Este servidor Plex ya est\u00e1 configurado", "already_in_progress": "Plex se est\u00e1 configurando", - "discovery_no_file": "No se ha encontrado ning\u00fan archivo de configuraci\u00f3n antiguo", "invalid_import": "La configuraci\u00f3n importada no es v\u00e1lida", "non-interactive": "Importaci\u00f3n no interactiva", "token_request_timeout": "Tiempo de espera agotado para la obtenci\u00f3n del token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Error en la autorizaci\u00f3n", "no_servers": "No hay servidores vinculados a la cuenta", - "no_token": "Proporcione un token o seleccione la configuraci\u00f3n manual", "not_found": "No se ha encontrado el servidor Plex" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Puerto", - "ssl": "Usar SSL", - "token": "Token (es necesario)", - "verify_ssl": "Verificar certificado SSL" - }, - "title": "Servidor Plex" - }, "select_server": { "data": { "server": "Servidor" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Contin\u00fae en plex.tv para autorizar", "title": "Conectar servidor Plex" - }, - "user": { - "data": { - "manual_setup": "Configuraci\u00f3n manual", - "token": "Token Plex" - }, - "description": "Introduzca un token Plex para la configuraci\u00f3n autom\u00e1tica o configure manualmente un servidor.", - "title": "Conectar servidor Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorar nuevos usuarios administrados/compartidos", "monitored_users": "Usuarios monitorizados", - "show_all_controls": "Mostrar todos los controles", "use_episode_art": "Usar el arte de episodios" }, "description": "Opciones para reproductores multimedia Plex" diff --git a/homeassistant/components/plex/.translations/fr.json b/homeassistant/components/plex/.translations/fr.json index 4c1af21aaf13..354a5eaecf97 100644 --- a/homeassistant/components/plex/.translations/fr.json +++ b/homeassistant/components/plex/.translations/fr.json @@ -4,7 +4,6 @@ "all_configured": "Tous les serveurs li\u00e9s sont d\u00e9j\u00e0 configur\u00e9s", "already_configured": "Ce serveur Plex est d\u00e9j\u00e0 configur\u00e9", "already_in_progress": "Plex en cours de configuration", - "discovery_no_file": "Aucun fichier de configuration h\u00e9rit\u00e9 trouv\u00e9", "invalid_import": "La configuration import\u00e9e est invalide", "non-interactive": "Importation non interactive", "token_request_timeout": "D\u00e9lai d'obtention du jeton", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "L'autorisation \u00e0 \u00e9chou\u00e9e", "no_servers": "Aucun serveur li\u00e9 au compte", - "no_token": "Fournir un jeton ou s\u00e9lectionner l'installation manuelle", "not_found": "Serveur Plex introuvable" }, "step": { - "manual_setup": { - "data": { - "host": "H\u00f4te", - "port": "Port", - "ssl": "Utiliser SSL", - "token": "Jeton (si n\u00e9cessaire)", - "verify_ssl": "V\u00e9rifier le certificat SSL" - }, - "title": "Serveur Plex" - }, "select_server": { "data": { "server": "Serveur" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Continuer d'autoriser sur plex.tv.", "title": "Connecter un serveur Plex" - }, - "user": { - "data": { - "manual_setup": "Installation manuelle", - "token": "Jeton plex" - }, - "description": "Continuez pour autoriser plex.tv ou configurez manuellement un serveur.", - "title": "Connecter un serveur Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorer les nouveaux utilisateurs g\u00e9r\u00e9s/partag\u00e9s", "monitored_users": "Utilisateurs surveill\u00e9s", - "show_all_controls": "Afficher tous les contr\u00f4les", "use_episode_art": "Utiliser l'art de l'\u00e9pisode" }, "description": "Options pour lecteurs multim\u00e9dia Plex" diff --git a/homeassistant/components/plex/.translations/hu.json b/homeassistant/components/plex/.translations/hu.json index 4712fb37b551..c59e31a3b957 100644 --- a/homeassistant/components/plex/.translations/hu.json +++ b/homeassistant/components/plex/.translations/hu.json @@ -4,7 +4,6 @@ "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 Plex konfigur\u00e1l\u00e1sa folyamatban van", - "discovery_no_file": "Nem tal\u00e1lhat\u00f3 r\u00e9gi konfigur\u00e1ci\u00f3s f\u00e1jl", "invalid_import": "Az import\u00e1lt konfigur\u00e1ci\u00f3 \u00e9rv\u00e9nytelen", "non-interactive": "Nem interakt\u00edv import\u00e1l\u00e1s", "token_request_timeout": "Token k\u00e9r\u00e9sre sz\u00e1nt id\u0151 lej\u00e1rt", @@ -16,12 +15,6 @@ "not_found": "A Plex szerver nem tal\u00e1lhat\u00f3" }, "step": { - "manual_setup": { - "data": { - "host": "Kiszolg\u00e1l\u00f3", - "port": "Port" - } - }, "select_server": { "data": { "server": "szerver" @@ -32,13 +25,6 @@ "start_website_auth": { "description": "Folytassa az enged\u00e9lyez\u00e9st a plex.tv webhelyen.", "title": "Plex-kiszolg\u00e1l\u00f3 csatlakoztat\u00e1sa" - }, - "user": { - "data": { - "token": "Plex token" - }, - "description": "Folytassa az enged\u00e9lyez\u00e9st a plex.tv webhelyen, vagy manu\u00e1lisan konfigur\u00e1lja a szervert.", - "title": "Plex-kiszolg\u00e1l\u00f3 csatlakoztat\u00e1sa" } }, "title": "Plex" @@ -47,7 +33,6 @@ "step": { "plex_mp_settings": { "data": { - "show_all_controls": "Az \u00f6sszes vez\u00e9rl\u0151 megjelen\u00edt\u00e9se", "use_episode_art": "Haszn\u00e1lja az epiz\u00f3d bor\u00edt\u00f3j\u00e1t" }, "description": "Plex media lej\u00e1tsz\u00f3k be\u00e1ll\u00edt\u00e1sai" diff --git a/homeassistant/components/plex/.translations/it.json b/homeassistant/components/plex/.translations/it.json index e5ff4e01dc0c..bb48d95bc515 100644 --- a/homeassistant/components/plex/.translations/it.json +++ b/homeassistant/components/plex/.translations/it.json @@ -4,7 +4,6 @@ "all_configured": "Tutti i server collegati sono gi\u00e0 configurati", "already_configured": "Questo server Plex \u00e8 gi\u00e0 configurato", "already_in_progress": "Plex \u00e8 in fase di configurazione", - "discovery_no_file": "Non \u00e8 stato trovato nessun file di configurazione da sostituire", "invalid_import": "La configurazione importata non \u00e8 valida", "non-interactive": "Importazione non interattiva", "token_request_timeout": "Timeout per l'ottenimento del token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Autorizzazione non riuscita", "no_servers": "Nessun server collegato all'account", - "no_token": "Fornire un token o selezionare la configurazione manuale", "not_found": "Server Plex non trovato" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Porta", - "ssl": "Usa SSL", - "token": "Token (se richiesto)", - "verify_ssl": "Verificare il certificato SSL" - }, - "title": "Server Plex" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Continuare ad autorizzare su plex.tv.", "title": "Collegare il server Plex" - }, - "user": { - "data": { - "manual_setup": "Configurazione manuale", - "token": "Token Plex" - }, - "description": "Continuare ad autorizzare plex.tv o configurare manualmente un server.", - "title": "Collegare il server Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignora nuovi utenti gestiti/condivisi", "monitored_users": "Utenti monitorati", - "show_all_controls": "Mostra tutti i controlli", "use_episode_art": "Usa la grafica dell'episodio" }, "description": "Opzioni per i lettori multimediali Plex" diff --git a/homeassistant/components/plex/.translations/ko.json b/homeassistant/components/plex/.translations/ko.json index 3292fab0a8e0..5cb49836f4d9 100644 --- a/homeassistant/components/plex/.translations/ko.json +++ b/homeassistant/components/plex/.translations/ko.json @@ -4,7 +4,6 @@ "all_configured": "\uc774\ubbf8 \uad6c\uc131\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\ub41c \uc11c\ubc84", "already_configured": "\uc774 Plex \uc11c\ubc84\ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "already_in_progress": "Plex \ub97c \uad6c\uc131 \uc911\uc785\ub2c8\ub2e4", - "discovery_no_file": "\ub808\uac70\uc2dc \uad6c\uc131 \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", "invalid_import": "\uac00\uc838\uc628 \uad6c\uc131 \ub0b4\uc6a9\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", "non-interactive": "\ube44 \ub300\ud654\ud615 \uac00\uc838\uc624\uae30", "token_request_timeout": "\ud1a0\ud070 \ud68d\ub4dd \uc2dc\uac04\uc774 \ucd08\uacfc\ud588\uc2b5\ub2c8\ub2e4", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "\uc778\uc99d\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", "no_servers": "\uacc4\uc815\uc5d0 \uc5f0\uacb0\ub41c \uc11c\ubc84\uac00 \uc5c6\uc2b5\ub2c8\ub2e4", - "no_token": "\ud1a0\ud070\uc744 \uc785\ub825\ud558\uac70\ub098 \uc218\ub3d9 \uc124\uc815\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694", "not_found": "Plex \uc11c\ubc84\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4" }, "step": { - "manual_setup": { - "data": { - "host": "\ud638\uc2a4\ud2b8", - "port": "\ud3ec\ud2b8", - "ssl": "SSL \uc0ac\uc6a9", - "token": "\ud1a0\ud070 (\ud544\uc694\ud55c \uacbd\uc6b0)", - "verify_ssl": "SSL \uc778\uc99d\uc11c \uac80\uc99d" - }, - "title": "Plex \uc11c\ubc84" - }, "select_server": { "data": { "server": "\uc11c\ubc84" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "plex.tv \uc5d0\uc11c \uc778\uc99d\uc744 \uc9c4\ud589\ud574\uc8fc\uc138\uc694.", "title": "Plex \uc11c\ubc84 \uc5f0\uacb0" - }, - "user": { - "data": { - "manual_setup": "\uc218\ub3d9 \uc124\uc815", - "token": "Plex \ud1a0\ud070" - }, - "description": "plex.tv \uc5d0\uc11c \uc778\uc99d\uc744 \uc9c4\ud589\ud558\uac70\ub098 \uc11c\ubc84\ub97c \uc218\ub3d9\uc73c\ub85c \uc124\uc815\ud574\uc8fc\uc138\uc694.", - "title": "Plex \uc11c\ubc84 \uc5f0\uacb0" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "\uc0c8\ub85c\uc6b4 \uad00\ub9ac/\uacf5\uc720 \uc0ac\uc6a9\uc790 \ubb34\uc2dc", "monitored_users": "\ubaa8\ub2c8\ud130\ub9c1\ub418\ub294 \uc0ac\uc6a9\uc790", - "show_all_controls": "\ubaa8\ub4e0 \ucee8\ud2b8\ub864 \ud45c\uc2dc\ud558\uae30", "use_episode_art": "\uc5d0\ud53c\uc18c\ub4dc \uc544\ud2b8 \uc0ac\uc6a9" }, "description": "Plex \ubbf8\ub514\uc5b4 \ud50c\ub808\uc774\uc5b4 \uc635\uc158" diff --git a/homeassistant/components/plex/.translations/lb.json b/homeassistant/components/plex/.translations/lb.json index 6ed9d372fc1d..c8b910b6dc58 100644 --- a/homeassistant/components/plex/.translations/lb.json +++ b/homeassistant/components/plex/.translations/lb.json @@ -4,7 +4,6 @@ "all_configured": "All verbonne Server sinn scho konfigur\u00e9iert", "already_configured": "D\u00ebse Plex Server ass scho konfigur\u00e9iert", "already_in_progress": "Plex g\u00ebtt konfigur\u00e9iert", - "discovery_no_file": "Kee Konfiguratioun Fichier am ale Format fonnt.", "invalid_import": "D\u00e9i importiert Konfiguratioun ass ong\u00eblteg", "non-interactive": "Net interaktiven Import", "token_request_timeout": "Z\u00e4it Iwwerschreidung beim kr\u00e9ien vum Jeton", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Feeler beider Autorisatioun", "no_servers": "Kee Server as mam Kont verbonnen", - "no_token": "Gitt en Token un oder wielt manuelle Setup", "not_found": "Kee Plex Server fonnt" }, "step": { - "manual_setup": { - "data": { - "host": "Apparat", - "port": "Port", - "ssl": "SSL benotzen", - "token": "Jeton (falls n\u00e9ideg)", - "verify_ssl": "SSL Zertifikat iwwerpr\u00e9iwen" - }, - "title": "Plex Server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Weiderfueren op plex.tv fir d'Autorisatioun.", "title": "Plex Server verbannen" - }, - "user": { - "data": { - "manual_setup": "Manuell Konfiguratioun", - "token": "Jeton fir de Plex" - }, - "description": "Gitt een Jeton fir de Plex un fir eng automatesch Konfiguratioun", - "title": "Plex Server verbannen" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Nei verwalt / gedeelt Benotzer ignor\u00e9ieren", "monitored_users": "Iwwerwaachte Benotzer", - "show_all_controls": "Weis all Kontrollen", "use_episode_art": "Benotz Biller vun der Episode" }, "description": "Optioune fir Plex Medie Spiller" diff --git a/homeassistant/components/plex/.translations/lv.json b/homeassistant/components/plex/.translations/lv.json index 23cda3fce4b8..39d4b3d70963 100644 --- a/homeassistant/components/plex/.translations/lv.json +++ b/homeassistant/components/plex/.translations/lv.json @@ -7,14 +7,6 @@ "not_found": "Plex serveris nav atrasts" }, "step": { - "manual_setup": { - "data": { - "port": "Ports", - "ssl": "Izmantot SSL", - "verify_ssl": "P\u0101rbaud\u012bt SSL sertifik\u0101tu" - }, - "title": "Plex serveris" - }, "select_server": { "data": { "server": "Serveris" diff --git a/homeassistant/components/plex/.translations/nl.json b/homeassistant/components/plex/.translations/nl.json index 515ee8798c7d..79ae6506d86c 100644 --- a/homeassistant/components/plex/.translations/nl.json +++ b/homeassistant/components/plex/.translations/nl.json @@ -4,7 +4,6 @@ "all_configured": "Alle gekoppelde servers zijn al geconfigureerd", "already_configured": "Deze Plex-server is al geconfigureerd", "already_in_progress": "Plex wordt geconfigureerd", - "discovery_no_file": "Geen legacy configuratiebestand gevonden", "invalid_import": "Ge\u00efmporteerde configuratie is ongeldig", "non-interactive": "Niet-interactieve import", "token_request_timeout": "Time-out verkrijgen van token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Autorisatie mislukt", "no_servers": "Geen servers gekoppeld aan account", - "no_token": "Geef een token op of selecteer handmatige installatie", "not_found": "Plex-server niet gevonden" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Poort", - "ssl": "Gebruik SSL", - "token": "Token (indien nodig)", - "verify_ssl": "Controleer SSL-certificaat" - }, - "title": "Plex server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Ga verder met autoriseren bij plex.tv.", "title": "Verbind de Plex server" - }, - "user": { - "data": { - "manual_setup": "Handmatig setup", - "token": "Plex token" - }, - "description": "Ga verder met autoriseren bij plex.tv of configureer een server.", - "title": "Verbind de Plex server" } }, "title": "Plex" @@ -53,7 +33,6 @@ "step": { "plex_mp_settings": { "data": { - "show_all_controls": "Toon alle bedieningselementen", "use_episode_art": "Gebruik aflevering kunst" }, "description": "Opties voor Plex-mediaspelers" diff --git a/homeassistant/components/plex/.translations/no.json b/homeassistant/components/plex/.translations/no.json index 29d43cb8275b..be76411d8ac6 100644 --- a/homeassistant/components/plex/.translations/no.json +++ b/homeassistant/components/plex/.translations/no.json @@ -4,7 +4,6 @@ "all_configured": "Alle knyttet servere som allerede er konfigurert", "already_configured": "Denne Plex-serveren er allerede konfigurert", "already_in_progress": "Plex blir konfigurert", - "discovery_no_file": "Ingen eldre konfigurasjonsfil funnet", "invalid_import": "Den importerte konfigurasjonen er ugyldig", "non-interactive": "Ikke-interaktiv import", "token_request_timeout": "Tidsavbrudd ved innhenting av token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Autorisasjonen mislyktes", "no_servers": "Ingen servere koblet til kontoen", - "no_token": "Angi et token eller velg manuelt oppsett", "not_found": "Plex-server ikke funnet" }, "step": { - "manual_setup": { - "data": { - "host": "Vert", - "port": "", - "ssl": "Bruk SSL", - "token": "Token (hvis n\u00f8dvendig)", - "verify_ssl": "Verifisere SSL-sertifikat" - }, - "title": "Plex-server" - }, "select_server": { "data": { "server": "" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Fortsett \u00e5 autorisere p\u00e5 plex.tv.", "title": "Koble til Plex-server" - }, - "user": { - "data": { - "manual_setup": "Manuelt oppsett", - "token": "Plex token" - }, - "description": "Fortsett \u00e5 autorisere p\u00e5 plex.tv eller manuelt konfigurere en server.", - "title": "Koble til Plex-server" } }, "title": "" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorer nye administrerte/delte brukere", "monitored_users": "Overv\u00e5kede brukere", - "show_all_controls": "Vis alle kontroller", "use_episode_art": "Bruk episode bilde" }, "description": "Alternativer for Plex Media Players" diff --git a/homeassistant/components/plex/.translations/pl.json b/homeassistant/components/plex/.translations/pl.json index 6531b552000e..8b21562a87e5 100644 --- a/homeassistant/components/plex/.translations/pl.json +++ b/homeassistant/components/plex/.translations/pl.json @@ -4,7 +4,6 @@ "all_configured": "Wszystkie znalezione serwery s\u0105 ju\u017c skonfigurowane.", "already_configured": "Ten serwer Plex jest ju\u017c skonfigurowany.", "already_in_progress": "Plex jest konfigurowany", - "discovery_no_file": "Nie znaleziono pliku konfiguracyjnego", "invalid_import": "Zaimportowana konfiguracja jest nieprawid\u0142owa", "non-interactive": "Nieinteraktywny import", "token_request_timeout": "Przekroczono limit czasu na uzyskanie tokena.", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Autoryzacja nie powiod\u0142a si\u0119", "no_servers": "Brak serwer\u00f3w po\u0142\u0105czonych z kontem", - "no_token": "Wprowad\u017a token lub wybierz konfiguracj\u0119 r\u0119czn\u0105", "not_found": "Nie znaleziono serwera Plex" }, "step": { - "manual_setup": { - "data": { - "host": "Host", - "port": "Port", - "ssl": "U\u017cyj SSL", - "token": "Token (je\u015bli wymagany)", - "verify_ssl": "Weryfikacja certyfikatu SSL" - }, - "title": "Serwer Plex" - }, "select_server": { "data": { "server": "Serwer" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Kontynuuj, by dokona\u0107 autoryzacji w plex.tv.", "title": "Po\u0142\u0105cz z serwerem Plex" - }, - "user": { - "data": { - "manual_setup": "Konfiguracja r\u0119czna", - "token": "Token Plex" - }, - "description": "Wprowad\u017a token Plex do automatycznej konfiguracji.", - "title": "Po\u0142\u0105cz z serwerem Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignoruj nowych zarz\u0105dzanych/wsp\u00f3\u0142dzielonych u\u017cytkownik\u00f3w", "monitored_users": "Monitorowani u\u017cytkownicy", - "show_all_controls": "Poka\u017c wszystkie elementy steruj\u0105ce", "use_episode_art": "U\u017cyj grafiki odcinka" }, "description": "Opcje dla odtwarzaczy multimedialnych Plex" diff --git a/homeassistant/components/plex/.translations/pt-BR.json b/homeassistant/components/plex/.translations/pt-BR.json index be97c7fdcb72..0248fc948571 100644 --- a/homeassistant/components/plex/.translations/pt-BR.json +++ b/homeassistant/components/plex/.translations/pt-BR.json @@ -8,7 +8,6 @@ "step": { "plex_mp_settings": { "data": { - "show_all_controls": "Mostrar todos os controles", "use_episode_art": "Usar arte epis\u00f3dio" }, "description": "Op\u00e7\u00f5es para Plex Media Players" diff --git a/homeassistant/components/plex/.translations/ru.json b/homeassistant/components/plex/.translations/ru.json index 2da10b1e8c47..851a2f16ae1f 100644 --- a/homeassistant/components/plex/.translations/ru.json +++ b/homeassistant/components/plex/.translations/ru.json @@ -4,7 +4,6 @@ "all_configured": "\u0412\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b.", "already_configured": "\u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 Plex \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d.", "already_in_progress": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430.", - "discovery_no_file": "\u0421\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.", "invalid_import": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u0430.", "non-interactive": "\u041d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043c\u043f\u043e\u0440\u0442.", "token_request_timeout": "\u0418\u0441\u0442\u0435\u043a\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430.", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.", "no_servers": "\u041d\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\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_token": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d \u0438\u043b\u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443.", "not_found": "\u0421\u0435\u0440\u0432\u0435\u0440 Plex \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d." }, "step": { - "manual_setup": { - "data": { - "host": "\u0425\u043e\u0441\u0442", - "port": "\u041f\u043e\u0440\u0442", - "ssl": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SSL", - "token": "\u0422\u043e\u043a\u0435\u043d (\u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f)", - "verify_ssl": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 SSL" - }, - "title": "\u0421\u0435\u0440\u0432\u0435\u0440 Plex" - }, "select_server": { "data": { "server": "\u0421\u0435\u0440\u0432\u0435\u0440" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "\u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 plex.tv.", "title": "Plex" - }, - "user": { - "data": { - "manual_setup": "\u0420\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430", - "token": "\u0422\u043e\u043a\u0435\u043d" - }, - "description": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439\u0442\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 plex.tv \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.", - "title": "Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445/\u043e\u0431\u0449\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439", "monitored_users": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", - "show_all_controls": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f", "use_episode_art": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432" }, "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b" diff --git a/homeassistant/components/plex/.translations/sl.json b/homeassistant/components/plex/.translations/sl.json index 40ba84b9f41d..20ad2ca0a02c 100644 --- a/homeassistant/components/plex/.translations/sl.json +++ b/homeassistant/components/plex/.translations/sl.json @@ -4,7 +4,6 @@ "all_configured": "Vsi povezani stre\u017eniki so \u017ee konfigurirani", "already_configured": "Ta stre\u017enik Plex je \u017ee konfiguriran", "already_in_progress": "Plex se konfigurira", - "discovery_no_file": "Podedovane konfiguracijske datoteke ni bilo", "invalid_import": "Uvo\u017eena konfiguracija ni veljavna", "non-interactive": "Neinteraktivni uvoz", "token_request_timeout": "Potekla \u010dasovna omejitev za pridobitev \u017eetona", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Avtorizacija ni uspela", "no_servers": "Ni stre\u017enikov povezanih z ra\u010dunom", - "no_token": "Vnesite \u017eeton ali izberite ro\u010dno nastavitev", "not_found": "Plex stre\u017enika ni mogo\u010de najti" }, "step": { - "manual_setup": { - "data": { - "host": "Gostitelj", - "port": "Vrata", - "ssl": "Uporaba SSL", - "token": "\u017deton (po potrebi)", - "verify_ssl": "Preverite SSL potrdilo" - }, - "title": "Plex stre\u017enik" - }, "select_server": { "data": { "server": "Stre\u017enik" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Nadaljujte z avtorizacijo na plex.tv.", "title": "Pove\u017eite stre\u017enik Plex" - }, - "user": { - "data": { - "manual_setup": "Ro\u010dna nastavitev", - "token": "Plex \u017eeton" - }, - "description": "Nadaljujte z avtorizacijo na plex.tv ali ro\u010dno konfigurirajte stre\u017enik.", - "title": "Pove\u017eite stre\u017enik Plex" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "Ignorirajte nove upravljane/deljene uporabnike", "monitored_users": "Nadzorovani uporabniki", - "show_all_controls": "Poka\u017ei vse kontrole", "use_episode_art": "Uporabi naslovno sliko epizode" }, "description": "Mo\u017enosti za predvajalnike Plex" diff --git a/homeassistant/components/plex/.translations/sv.json b/homeassistant/components/plex/.translations/sv.json index 25152e9dc812..42afc3eeaa9d 100644 --- a/homeassistant/components/plex/.translations/sv.json +++ b/homeassistant/components/plex/.translations/sv.json @@ -4,7 +4,6 @@ "all_configured": "Alla l\u00e4nkade servrar har redan konfigurerats", "already_configured": "Denna Plex-server \u00e4r redan konfigurerad", "already_in_progress": "Plex konfigureras", - "discovery_no_file": "Ingen \u00e4ldre konfigurationsfil hittades", "invalid_import": "Importerad konfiguration \u00e4r ogiltig", "non-interactive": "Icke-interaktiv import", "token_request_timeout": "Timeout att erh\u00e5lla token", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "Auktoriseringen misslyckades", "no_servers": "Inga servrar l\u00e4nkade till konto", - "no_token": "Ange en token eller v\u00e4lj manuell inst\u00e4llning", "not_found": "Plex-server hittades inte" }, "step": { - "manual_setup": { - "data": { - "host": "V\u00e4rd", - "port": "Port", - "ssl": "Anv\u00e4nd SSL", - "token": "Token (om det beh\u00f6vs)", - "verify_ssl": "Verifiera SSL-certifikat" - }, - "title": "Plex-server" - }, "select_server": { "data": { "server": "Server" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "Forts\u00e4tt att auktorisera p\u00e5 plex.tv.", "title": "Anslut Plex-servern" - }, - "user": { - "data": { - "manual_setup": "Manuell inst\u00e4llning", - "token": "Plex-token" - }, - "description": "Forts\u00e4tt att auktorisera p\u00e5 plex.tv eller konfigurera en server manuellt.", - "title": "Anslut Plex-servern" } }, "title": "Plex" @@ -53,7 +33,6 @@ "step": { "plex_mp_settings": { "data": { - "show_all_controls": "Visa alla kontroller", "use_episode_art": "Anv\u00e4nd avsnittsbild" }, "description": "Alternativ f\u00f6r Plex-mediaspelare" diff --git a/homeassistant/components/plex/.translations/zh-Hant.json b/homeassistant/components/plex/.translations/zh-Hant.json index 436333b0a79c..6d46b8bc1541 100644 --- a/homeassistant/components/plex/.translations/zh-Hant.json +++ b/homeassistant/components/plex/.translations/zh-Hant.json @@ -4,7 +4,6 @@ "all_configured": "\u6240\u6709\u7d81\u5b9a\u4f3a\u670d\u5668\u90fd\u5df2\u8a2d\u5b9a\u5b8c\u6210", "already_configured": "Plex \u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "already_in_progress": "Plex \u5df2\u7d93\u8a2d\u5b9a", - "discovery_no_file": "\u627e\u4e0d\u5230\u820a\u7248\u8a2d\u5b9a\u6a94\u6848", "invalid_import": "\u532f\u5165\u4e4b\u8a2d\u5b9a\u7121\u6548", "non-interactive": "\u7121\u4e92\u52d5\u532f\u5165", "token_request_timeout": "\u53d6\u5f97\u5bc6\u9470\u903e\u6642", @@ -13,20 +12,9 @@ "error": { "faulty_credentials": "\u9a57\u8b49\u5931\u6557", "no_servers": "\u6b64\u5e33\u865f\u672a\u7d81\u5b9a\u4f3a\u670d\u5668", - "no_token": "\u63d0\u4f9b\u5bc6\u9470\u6216\u9078\u64c7\u624b\u52d5\u8a2d\u5b9a", "not_found": "\u627e\u4e0d\u5230 Plex \u4f3a\u670d\u5668" }, "step": { - "manual_setup": { - "data": { - "host": "\u4e3b\u6a5f\u7aef", - "port": "\u901a\u8a0a\u57e0", - "ssl": "\u4f7f\u7528 SSL", - "token": "\u5bc6\u9470\uff08\u5982\u679c\u9700\u8981\uff09", - "verify_ssl": "\u78ba\u8a8d SSL \u8a8d\u8b49" - }, - "title": "Plex \u4f3a\u670d\u5668" - }, "select_server": { "data": { "server": "\u4f3a\u670d\u5668" @@ -37,14 +25,6 @@ "start_website_auth": { "description": "\u7e7c\u7e8c\u65bc Plex.tv \u9032\u884c\u8a8d\u8b49\u3002", "title": "\u9023\u7dda\u81f3 Plex \u4f3a\u670d\u5668" - }, - "user": { - "data": { - "manual_setup": "\u624b\u52d5\u8a2d\u5b9a", - "token": "Plex \u5bc6\u9470" - }, - "description": "\u7e7c\u7e8c\u65bc Plex.tv \u9032\u884c\u8a8d\u8b49\u6216\u624b\u52d5\u8a2d\u5b9a\u4f3a\u670d\u5668\u3002", - "title": "\u9023\u7dda\u81f3 Plex \u4f3a\u670d\u5668" } }, "title": "Plex" @@ -55,7 +35,6 @@ "data": { "ignore_new_shared_users": "\u5ffd\u7565\u65b0\u589e\u7ba1\u7406/\u5206\u4eab\u4f7f\u7528\u8005", "monitored_users": "\u5df2\u76e3\u63a7\u4f7f\u7528\u8005", - "show_all_controls": "\u986f\u793a\u6240\u6709\u63a7\u5236", "use_episode_art": "\u4f7f\u7528\u5f71\u96c6\u5287\u7167" }, "description": "Plex \u64ad\u653e\u5668\u9078\u9805" diff --git a/homeassistant/components/rachio/.translations/pl.json b/homeassistant/components/rachio/.translations/pl.json index b186a764cd12..3c07ea850c0f 100644 --- a/homeassistant/components/rachio/.translations/pl.json +++ b/homeassistant/components/rachio/.translations/pl.json @@ -14,7 +14,7 @@ "api_key": "Klucz API dla konta Rachio." }, "description": "B\u0119dziesz potrzebowa\u0142 klucza API ze strony https://app.rach.io/. Wybierz 'Account Settings', a nast\u0119pnie kliknij 'GET API KEY'.", - "title": "Po\u0142\u0105cz si\u0119 z urz\u0105dzeniem Rachio" + "title": "Po\u0142\u0105czenie z urz\u0105dzeniem Rachio" } }, "title": "Rachio" diff --git a/homeassistant/components/roku/.translations/ca.json b/homeassistant/components/roku/.translations/ca.json index 727c4e79d733..3f9897784f98 100644 --- a/homeassistant/components/roku/.translations/ca.json +++ b/homeassistant/components/roku/.translations/ca.json @@ -5,8 +5,7 @@ "unknown": "Error inesperat" }, "error": { - "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", - "unknown": "Error inesperat" + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/de.json b/homeassistant/components/roku/.translations/de.json index d3c02cc1373a..3954d9d549dc 100644 --- a/homeassistant/components/roku/.translations/de.json +++ b/homeassistant/components/roku/.translations/de.json @@ -5,8 +5,7 @@ "unknown": "Unerwarteter Fehler" }, "error": { - "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", - "unknown": "Unerwarteter Fehler" + "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/en.json b/homeassistant/components/roku/.translations/en.json index a92570c70190..30c53e1d89e0 100644 --- a/homeassistant/components/roku/.translations/en.json +++ b/homeassistant/components/roku/.translations/en.json @@ -5,8 +5,7 @@ "unknown": "Unexpected error" }, "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" + "cannot_connect": "Failed to connect, please try again" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/es.json b/homeassistant/components/roku/.translations/es.json index a472d079efbc..ffa850f6ebe0 100644 --- a/homeassistant/components/roku/.translations/es.json +++ b/homeassistant/components/roku/.translations/es.json @@ -5,8 +5,7 @@ "unknown": "Error inesperado" }, "error": { - "cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo.", - "unknown": "Error inesperado" + "cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo." }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/fr.json b/homeassistant/components/roku/.translations/fr.json index ff24f46e921b..a76f68f2f616 100644 --- a/homeassistant/components/roku/.translations/fr.json +++ b/homeassistant/components/roku/.translations/fr.json @@ -5,8 +5,7 @@ "unknown": "Erreur inattendue" }, "error": { - "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer", - "unknown": "Erreur inattendue" + "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/it.json b/homeassistant/components/roku/.translations/it.json index 375679137007..c530504c6eca 100644 --- a/homeassistant/components/roku/.translations/it.json +++ b/homeassistant/components/roku/.translations/it.json @@ -5,8 +5,7 @@ "unknown": "Errore imprevisto" }, "error": { - "cannot_connect": "Impossibile connettersi, si prega di riprovare", - "unknown": "Errore imprevisto" + "cannot_connect": "Impossibile connettersi, si prega di riprovare" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/ko.json b/homeassistant/components/roku/.translations/ko.json index 75045d148655..d7cad509da13 100644 --- a/homeassistant/components/roku/.translations/ko.json +++ b/homeassistant/components/roku/.translations/ko.json @@ -5,8 +5,7 @@ "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" }, "error": { - "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", - "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694." }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/lb.json b/homeassistant/components/roku/.translations/lb.json index 789dac2eed74..da6136334ce5 100644 --- a/homeassistant/components/roku/.translations/lb.json +++ b/homeassistant/components/roku/.translations/lb.json @@ -5,8 +5,7 @@ "unknown": "Onerwaarte Feeler" }, "error": { - "cannot_connect": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol.", - "unknown": "Onerwaarte Feeler" + "cannot_connect": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol." }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/no.json b/homeassistant/components/roku/.translations/no.json index cabc68de3f72..df56aa5d35d6 100644 --- a/homeassistant/components/roku/.translations/no.json +++ b/homeassistant/components/roku/.translations/no.json @@ -5,8 +5,7 @@ "unknown": "Uventet feil" }, "error": { - "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", - "unknown": "Uventet feil" + "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/pl.json b/homeassistant/components/roku/.translations/pl.json index db3ef261f074..b92aab58df61 100644 --- a/homeassistant/components/roku/.translations/pl.json +++ b/homeassistant/components/roku/.translations/pl.json @@ -4,8 +4,7 @@ "already_configured": "Urz\u0105dzenie Roku jest ju\u017c skonfigurowane." }, "error": { - "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.", - "unknown": "Niespodziewany b\u0142\u0105d." + "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie." }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/ru.json b/homeassistant/components/roku/.translations/ru.json index b1825654c9db..0db5f9718aa1 100644 --- a/homeassistant/components/roku/.translations/ru.json +++ b/homeassistant/components/roku/.translations/ru.json @@ -5,8 +5,7 @@ "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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", - "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437." }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/sl.json b/homeassistant/components/roku/.translations/sl.json index f47067b33928..0745151cb0aa 100644 --- a/homeassistant/components/roku/.translations/sl.json +++ b/homeassistant/components/roku/.translations/sl.json @@ -5,8 +5,7 @@ "unknown": "Nepri\u010dakovana napaka" }, "error": { - "cannot_connect": "Povezava ni uspela, poskusite znova", - "unknown": "Nepri\u010dakovana napaka" + "cannot_connect": "Povezava ni uspela, poskusite znova" }, "flow_title": "Roku: {name}", "step": { diff --git a/homeassistant/components/roku/.translations/zh-Hant.json b/homeassistant/components/roku/.translations/zh-Hant.json index 2d6a606ef779..529fcb604c7b 100644 --- a/homeassistant/components/roku/.translations/zh-Hant.json +++ b/homeassistant/components/roku/.translations/zh-Hant.json @@ -5,8 +5,7 @@ "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, "error": { - "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", - "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21" }, "flow_title": "Roku\uff1a{name}", "step": { diff --git a/homeassistant/components/samsungtv/.translations/ca.json b/homeassistant/components/samsungtv/.translations/ca.json index 7ca5879a5c08..a742cc546b88 100644 --- a/homeassistant/components/samsungtv/.translations/ca.json +++ b/homeassistant/components/samsungtv/.translations/ca.json @@ -4,7 +4,6 @@ "already_configured": "La Samsung TV ja configurada.", "already_in_progress": "La configuraci\u00f3 de la Samsung TV ja est\u00e0 en curs.", "auth_missing": "Home Assistant no est\u00e0 autenticat per connectar-se amb aquesta Samsung TV.", - "not_found": "No s'han trobat Samsung TV's compatibles a la xarxa.", "not_successful": "No s'ha pogut connectar amb el dispositiu Samsung TV.", "not_supported": "Actualment aquest dispositiu Samsung TV no \u00e9s compatible." }, diff --git a/homeassistant/components/samsungtv/.translations/da.json b/homeassistant/components/samsungtv/.translations/da.json index 379fd5d8b6d2..7a6b5540c59f 100644 --- a/homeassistant/components/samsungtv/.translations/da.json +++ b/homeassistant/components/samsungtv/.translations/da.json @@ -4,7 +4,6 @@ "already_configured": "Dette Samsung-tv er allerede konfigureret.", "already_in_progress": "Samsung-tv-konfiguration er allerede i gang.", "auth_missing": "Home Assistant er ikke godkendt til at oprette forbindelse til dette Samsung-tv. Tjek dit tvs indstillinger for at godkende Home Assistant.", - "not_found": "Der blev ikke fundet nogen underst\u00f8ttede Samsung-tv-enheder p\u00e5 netv\u00e6rket.", "not_successful": "Kan ikke oprette forbindelse til denne Samsung tv-enhed.", "not_supported": "Dette Samsung TV underst\u00f8ttes i \u00f8jeblikket ikke." }, diff --git a/homeassistant/components/samsungtv/.translations/de.json b/homeassistant/components/samsungtv/.translations/de.json index e5e8611362ca..24afa67038dd 100644 --- a/homeassistant/components/samsungtv/.translations/de.json +++ b/homeassistant/components/samsungtv/.translations/de.json @@ -4,7 +4,6 @@ "already_configured": "Dieser Samsung TV ist bereits konfiguriert", "already_in_progress": "Der Konfigurationsablauf f\u00fcr Samsung TV wird bereits ausgef\u00fchrt.", "auth_missing": "Home Assistant ist nicht berechtigt, eine Verbindung zu diesem Samsung TV herzustellen. \u00dcberpr\u00fcfe die Einstellungen deines Fernsehger\u00e4ts, um Home Assistant zu autorisieren.", - "not_found": "Keine unterst\u00fctzten Samsung TV-Ger\u00e4te im Netzwerk gefunden.", "not_successful": "Es kann keine Verbindung zu diesem Samsung-Fernsehger\u00e4t hergestellt werden.", "not_supported": "Dieses Samsung TV-Ger\u00e4t wird derzeit nicht unterst\u00fctzt." }, diff --git a/homeassistant/components/samsungtv/.translations/en.json b/homeassistant/components/samsungtv/.translations/en.json index 2d3856fbaffd..37dc84d3e305 100644 --- a/homeassistant/components/samsungtv/.translations/en.json +++ b/homeassistant/components/samsungtv/.translations/en.json @@ -4,7 +4,6 @@ "already_configured": "This Samsung TV is already configured.", "already_in_progress": "Samsung TV configuration is already in progress.", "auth_missing": "Home Assistant is not authorized to connect to this Samsung TV. Please check your TV's settings to authorize Home Assistant.", - "not_found": "No supported Samsung TV devices found on the network.", "not_successful": "Unable to connect to this Samsung TV device.", "not_supported": "This Samsung TV device is currently not supported." }, diff --git a/homeassistant/components/samsungtv/.translations/es.json b/homeassistant/components/samsungtv/.translations/es.json index 4466b329a2a3..91581de59a15 100644 --- a/homeassistant/components/samsungtv/.translations/es.json +++ b/homeassistant/components/samsungtv/.translations/es.json @@ -4,7 +4,6 @@ "already_configured": "Este televisor Samsung ya est\u00e1 configurado.", "already_in_progress": "La configuraci\u00f3n del televisor Samsung ya est\u00e1 en progreso.", "auth_missing": "Home Assistant no est\u00e1 autenticado para conectarse a este televisor Samsung.", - "not_found": "No se encontraron televisiones Samsung compatibles en la red.", "not_successful": "No se puede conectar a este dispositivo Samsung TV.", "not_supported": "Esta televisi\u00f3n Samsung actualmente no es compatible." }, diff --git a/homeassistant/components/samsungtv/.translations/fr.json b/homeassistant/components/samsungtv/.translations/fr.json index e381660a3e2c..8e722a7add0d 100644 --- a/homeassistant/components/samsungtv/.translations/fr.json +++ b/homeassistant/components/samsungtv/.translations/fr.json @@ -4,7 +4,6 @@ "already_configured": "Ce t\u00e9l\u00e9viseur Samsung est d\u00e9j\u00e0 configur\u00e9.", "already_in_progress": "La configuration du t\u00e9l\u00e9viseur Samsung est d\u00e9j\u00e0 en cours.", "auth_missing": "Home Assistant n'est pas authentifi\u00e9 pour se connecter \u00e0 ce t\u00e9l\u00e9viseur Samsung.", - "not_found": "Aucun t\u00e9l\u00e9viseur Samsung pris en charge trouv\u00e9 sur le r\u00e9seau.", "not_successful": "Impossible de se connecter \u00e0 cet appareil Samsung TV.", "not_supported": "Ce t\u00e9l\u00e9viseur Samsung n'est actuellement pas pris en charge." }, diff --git a/homeassistant/components/samsungtv/.translations/hu.json b/homeassistant/components/samsungtv/.translations/hu.json index c7a046428bce..6ed1d8067391 100644 --- a/homeassistant/components/samsungtv/.translations/hu.json +++ b/homeassistant/components/samsungtv/.translations/hu.json @@ -4,7 +4,6 @@ "already_configured": "Ez a Samsung TV m\u00e1r konfigur\u00e1lva van.", "already_in_progress": "A Samsung TV konfigur\u00e1l\u00e1sa m\u00e1r folyamatban van.", "auth_missing": "A Home Assistant nem jogosult csatlakozni ehhez a Samsung TV-hez. Ellen\u0151rizze a TV-k\u00e9sz\u00fcl\u00e9k\u00e9ben a Home Assistant enged\u00e9lyez\u00e9si be\u00e1ll\u00edt\u00e1sait.", - "not_found": "A h\u00e1l\u00f3zaton nem tal\u00e1lhat\u00f3 t\u00e1mogatott Samsung TV-eszk\u00f6z.", "not_successful": "Nem lehet csatlakozni ehhez a Samsung TV k\u00e9sz\u00fcl\u00e9khez.", "not_supported": "Ez a Samsung TV k\u00e9sz\u00fcl\u00e9k jelenleg nem t\u00e1mogatott." }, diff --git a/homeassistant/components/samsungtv/.translations/it.json b/homeassistant/components/samsungtv/.translations/it.json index 3d2d4dd8e11f..692f91efea90 100644 --- a/homeassistant/components/samsungtv/.translations/it.json +++ b/homeassistant/components/samsungtv/.translations/it.json @@ -4,7 +4,6 @@ "already_configured": "Questo Samsung TV \u00e8 gi\u00e0 configurato.", "already_in_progress": "La configurazione di Samsung TV \u00e8 gi\u00e0 in corso.", "auth_missing": "Home Assistant non \u00e8 autorizzato a connettersi a questo Samsung TV. Controlla le impostazioni del tuo TV per autorizzare Home Assistant.", - "not_found": "Nessun dispositivo Samsung TV supportato trovato sulla rete.", "not_successful": "Impossibile connettersi a questo dispositivo Samsung TV.", "not_supported": "Questo dispositivo Samsung TV non \u00e8 attualmente supportato." }, diff --git a/homeassistant/components/samsungtv/.translations/ko.json b/homeassistant/components/samsungtv/.translations/ko.json index 0226fd52dc09..20b4496b4288 100644 --- a/homeassistant/components/samsungtv/.translations/ko.json +++ b/homeassistant/components/samsungtv/.translations/ko.json @@ -4,7 +4,6 @@ "already_configured": "\uc774 \uc0bc\uc131 TV \ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "already_in_progress": "\uc0bc\uc131 TV \uad6c\uc131\uc774 \uc774\ubbf8 \uc9c4\ud589\uc911\uc785\ub2c8\ub2e4.", "auth_missing": "Home Assistant \uac00 \ud574\ub2f9 \uc0bc\uc131 TV \uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. TV \uc124\uc815\uc744 \ud655\uc778\ud558\uc5ec Home Assistant \ub97c \uc2b9\uc778\ud574\uc8fc\uc138\uc694.", - "not_found": "\uc9c0\uc6d0\ub418\ub294 \uc0bc\uc131 TV \ubaa8\ub378\uc774 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ubc1c\uacac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.", "not_successful": "\uc0bc\uc131 TV \uae30\uae30\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", "not_supported": "\uc774 \uc0bc\uc131 TV \ubaa8\ub378\uc740 \ud604\uc7ac \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4." }, diff --git a/homeassistant/components/samsungtv/.translations/lb.json b/homeassistant/components/samsungtv/.translations/lb.json index b3a94a1a2a6f..39ec28d6992d 100644 --- a/homeassistant/components/samsungtv/.translations/lb.json +++ b/homeassistant/components/samsungtv/.translations/lb.json @@ -4,7 +4,6 @@ "already_configured": "D\u00ebs Samsung TV ass scho konfigur\u00e9iert.", "already_in_progress": "Konfiguratioun fir d\u00ebs Samsung TV ass schonn am gaang.", "auth_missing": "Home Assistant ass net authentifiz\u00e9iert fir sech mat d\u00ebsem Samsung TV ze verbannen.", - "not_found": "Keng \u00ebnnerst\u00ebtzte Samsung TV am Netzwierk fonnt.", "not_successful": "Keng Verbindung mat d\u00ebsem Samsung TV Apparat m\u00e9iglech.", "not_supported": "D\u00ebsen Samsung TV Modell g\u00ebtt momentan net \u00ebnnerst\u00ebtzt" }, diff --git a/homeassistant/components/samsungtv/.translations/nl.json b/homeassistant/components/samsungtv/.translations/nl.json index 09c0bba05a38..3dcb9e59d74c 100644 --- a/homeassistant/components/samsungtv/.translations/nl.json +++ b/homeassistant/components/samsungtv/.translations/nl.json @@ -4,7 +4,6 @@ "already_configured": "Deze Samsung TV is al geconfigureerd.", "already_in_progress": "Samsung TV configuratie is al in uitvoering.", "auth_missing": "Home Assistant is niet geautoriseerd om verbinding te maken met deze Samsung TV.", - "not_found": "Geen ondersteunde Samsung TV-apparaten gevonden op het netwerk.", "not_successful": "Niet in staat om verbinding te maken met dit Samsung TV toestel.", "not_supported": "Deze Samsung TV wordt momenteel niet ondersteund." }, diff --git a/homeassistant/components/samsungtv/.translations/no.json b/homeassistant/components/samsungtv/.translations/no.json index 55a03edc728f..6e02251f271b 100644 --- a/homeassistant/components/samsungtv/.translations/no.json +++ b/homeassistant/components/samsungtv/.translations/no.json @@ -4,7 +4,6 @@ "already_configured": "Denne Samsung TV-en er allerede konfigurert.", "already_in_progress": "Samsung TV-konfigurasjon p\u00e5g\u00e5r allerede.", "auth_missing": "Home Assistant er ikke autorisert til \u00e5 koble til denne Samsung-TV. Vennligst kontroller innstillingene for TV-en for \u00e5 autorisere Home Assistent.", - "not_found": "Ingen st\u00f8ttede Samsung TV-enheter funnet i nettverket.", "not_successful": "Kan ikke koble til denne Samsung TV-enheten.", "not_supported": "Denne Samsung TV-enhetene st\u00f8ttes forel\u00f8pig ikke." }, diff --git a/homeassistant/components/samsungtv/.translations/pl.json b/homeassistant/components/samsungtv/.translations/pl.json index 200d8d2cf9ac..02231169b65f 100644 --- a/homeassistant/components/samsungtv/.translations/pl.json +++ b/homeassistant/components/samsungtv/.translations/pl.json @@ -4,7 +4,6 @@ "already_configured": "Ten telewizor Samsung jest ju\u017c skonfigurowany.", "already_in_progress": "Konfiguracja telewizora Samsung jest ju\u017c w toku.", "auth_missing": "Home Assistant nie jest uwierzytelniony, aby po\u0142\u0105czy\u0107 si\u0119 z tym telewizorem Samsung.", - "not_found": "W sieci nie znaleziono obs\u0142ugiwanych telewizor\u00f3w Samsung.", "not_successful": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 urz\u0105dzeniem Samsung TV.", "not_supported": "Ten telewizor Samsung nie jest obecnie obs\u0142ugiwany." }, diff --git a/homeassistant/components/samsungtv/.translations/ru.json b/homeassistant/components/samsungtv/.translations/ru.json index 14f772c5e1d6..016979eb330c 100644 --- a/homeassistant/components/samsungtv/.translations/ru.json +++ b/homeassistant/components/samsungtv/.translations/ru.json @@ -4,7 +4,6 @@ "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", "already_in_progress": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.", "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. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430.", - "not_found": "\u0412 \u0441\u0435\u0442\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.", "not_successful": "\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_supported": "\u042d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \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." }, diff --git a/homeassistant/components/samsungtv/.translations/sl.json b/homeassistant/components/samsungtv/.translations/sl.json index 95286476ed01..bbf39de3409d 100644 --- a/homeassistant/components/samsungtv/.translations/sl.json +++ b/homeassistant/components/samsungtv/.translations/sl.json @@ -4,7 +4,6 @@ "already_configured": "Ta televizor Samsung je \u017ee konfiguriran.", "already_in_progress": "Konfiguracija Samsung TV je \u017ee v teku.", "auth_missing": "Home Assistant nima dovoljenja za povezavo s tem televizorjem Samsung. Preverite nastavitve televizorja, da ga pooblastite.", - "not_found": "V omre\u017eju ni bilo najdenih nobenih podprtih naprav Samsung TV.", "not_successful": "Povezave s to napravo Samsung TV ni mogo\u010de vzpostaviti.", "not_supported": "Ta naprava Samsung TV trenutno ni podprta." }, diff --git a/homeassistant/components/samsungtv/.translations/sv.json b/homeassistant/components/samsungtv/.translations/sv.json index f75e82385062..423bf61a7509 100644 --- a/homeassistant/components/samsungtv/.translations/sv.json +++ b/homeassistant/components/samsungtv/.translations/sv.json @@ -4,7 +4,6 @@ "already_configured": "Denna Samsung TV \u00e4r redan konfigurerad.", "already_in_progress": "Samsung TV-konfiguration p\u00e5g\u00e5r redan.", "auth_missing": "Home Assistant har inte beh\u00f6righet att ansluta till denna Samsung TV. Kontrollera tv:ns inst\u00e4llningar f\u00f6r att godk\u00e4nna Home Assistant.", - "not_found": "Inga Samsung TV-enheter som st\u00f6ds finns i n\u00e4tverket.", "not_successful": "Det g\u00e5r inte att ansluta till denna Samsung TV-enhet.", "not_supported": "Denna Samsung TV-enhet st\u00f6ds f\u00f6r n\u00e4rvarande inte." }, diff --git a/homeassistant/components/samsungtv/.translations/tr.json b/homeassistant/components/samsungtv/.translations/tr.json index 3cf1f135e1fd..e23969be8a2d 100644 --- a/homeassistant/components/samsungtv/.translations/tr.json +++ b/homeassistant/components/samsungtv/.translations/tr.json @@ -4,7 +4,6 @@ "already_configured": "Bu Samsung TV zaten ayarlanm\u0131\u015f.", "already_in_progress": "Samsung TV ayar\u0131 zaten s\u00fcr\u00fcyor.", "auth_missing": "Home Assistant'\u0131n bu Samsung TV'ye ba\u011flanma izni yok. Home Assistant'\u0131 yetkilendirmek i\u00e7in l\u00fctfen TV'nin ayarlar\u0131n\u0131 kontrol et.", - "not_found": "A\u011fda desteklenen Samsung TV cihaz\u0131 bulunamad\u0131.", "not_successful": "Bu Samsung TV cihaz\u0131na ba\u011flan\u0131lam\u0131yor.", "not_supported": "Bu Samsung TV cihaz\u0131 \u015fu anda desteklenmiyor." }, diff --git a/homeassistant/components/samsungtv/.translations/zh-Hant.json b/homeassistant/components/samsungtv/.translations/zh-Hant.json index 80cfa32a6bf3..d12d47551c8f 100644 --- a/homeassistant/components/samsungtv/.translations/zh-Hant.json +++ b/homeassistant/components/samsungtv/.translations/zh-Hant.json @@ -4,7 +4,6 @@ "already_configured": "\u4e09\u661f\u96fb\u8996\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "already_in_progress": "\u4e09\u661f\u96fb\u8996\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d\u3002", "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\u8a2d\u5b9a\u4ee5\u76e1\u8208\u9a57\u8b49\u3002", - "not_found": "\u5728\u7db2\u8def\u4e0a\u627e\u4e0d\u5230\u652f\u63f4\u7684\u4e09\u661f\u96fb\u8996\u3002", "not_successful": "\u7121\u6cd5\u9023\u7dda\u81f3\u4e09\u661f\u96fb\u8996\u8a2d\u5099\u3002", "not_supported": "\u4e0d\u652f\u63f4\u6b64\u6b3e\u4e09\u661f\u96fb\u8996\u3002" }, diff --git a/homeassistant/components/sensor/.translations/lb.json b/homeassistant/components/sensor/.translations/lb.json index 01a4e89c9f46..f999e3c16f0a 100644 --- a/homeassistant/components/sensor/.translations/lb.json +++ b/homeassistant/components/sensor/.translations/lb.json @@ -1,26 +1,26 @@ { "device_automation": { "condition_type": { - "is_battery_level": "{entity_name} Batterie niveau", - "is_humidity": "{entity_name} Fiichtegkeet", - "is_illuminance": "{entity_name} Beliichtung", - "is_power": "{entity_name} Leeschtung", - "is_pressure": "{entity_name} Drock", - "is_signal_strength": "{entity_name} Signal St\u00e4erkt", - "is_temperature": "{entity_name} Temperatur", - "is_timestamp": "{entity_name} Z\u00e4itstempel", - "is_value": "{entity_name} W\u00e4ert" + "is_battery_level": "Aktuell {entity_name} Batterie niveau", + "is_humidity": "Aktuell {entity_name} Fiichtegkeet", + "is_illuminance": "Aktuell {entity_name} Beliichtung", + "is_power": "Aktuell {entity_name} Leeschtung", + "is_pressure": "Aktuell {entity_name} Drock", + "is_signal_strength": "Aktuell {entity_name} Signal St\u00e4erkt", + "is_temperature": "Aktuell {entity_name} Temperatur", + "is_timestamp": "Aktuelle {entity_name} Z\u00e4itstempel", + "is_value": "Aktuelle {entity_name} W\u00e4ert" }, "trigger_type": { - "battery_level": "{entity_name} Batterie niveau", - "humidity": "{entity_name} Fiichtegkeet", - "illuminance": "{entity_name} Beliichtung", - "power": "{entity_name} Leeschtung", - "pressure": "{entity_name} Drock", - "signal_strength": "{entity_name} Signal St\u00e4erkt", - "temperature": "{entity_name} Temperatur", - "timestamp": "{entity_name} Z\u00e4itstempel", - "value": "{entity_name} W\u00e4ert" + "battery_level": "{entity_name} Batterie niveau \u00e4nnert", + "humidity": "{entity_name} Fiichtegkeet \u00e4nnert", + "illuminance": "{entity_name} Beliichtung \u00e4nnert", + "power": "{entity_name} Leeschtung \u00e4nnert", + "pressure": "{entity_name} Drock \u00e4nnert", + "signal_strength": "{entity_name} Signal St\u00e4erkt \u00e4nnert", + "temperature": "{entity_name} Temperatur \u00e4nnert", + "timestamp": "{entity_name} Z\u00e4itstempel \u00e4nnert", + "value": "{entity_name} W\u00e4ert \u00e4nnert" } } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/bg.json b/homeassistant/components/simplisafe/.translations/bg.json index 4f15cc674b03..0ec8fd3c6b1e 100644 --- a/homeassistant/components/simplisafe/.translations/bg.json +++ b/homeassistant/components/simplisafe/.translations/bg.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "\u041a\u043e\u0434 (\u0437\u0430 Home Assistant)", "password": "\u041f\u0430\u0440\u043e\u043b\u0430", "username": "E-mail \u0430\u0434\u0440\u0435\u0441" }, diff --git a/homeassistant/components/simplisafe/.translations/ca.json b/homeassistant/components/simplisafe/.translations/ca.json index 1f772071b597..f2d9db5797d3 100644 --- a/homeassistant/components/simplisafe/.translations/ca.json +++ b/homeassistant/components/simplisafe/.translations/ca.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Codi (pel Home Assistant)", "password": "Contrasenya", "username": "Correu electr\u00f2nic" }, diff --git a/homeassistant/components/simplisafe/.translations/cs.json b/homeassistant/components/simplisafe/.translations/cs.json index f4a47c5c3445..2160dc226d97 100644 --- a/homeassistant/components/simplisafe/.translations/cs.json +++ b/homeassistant/components/simplisafe/.translations/cs.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "K\u00f3d (pro Home Assistant)", "password": "Heslo", "username": "E-mailov\u00e1 adresa" }, diff --git a/homeassistant/components/simplisafe/.translations/da.json b/homeassistant/components/simplisafe/.translations/da.json index ccd829795209..39324fe5f512 100644 --- a/homeassistant/components/simplisafe/.translations/da.json +++ b/homeassistant/components/simplisafe/.translations/da.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Kode (til Home Assistant)", "password": "Adgangskode", "username": "Emailadresse" }, diff --git a/homeassistant/components/simplisafe/.translations/de.json b/homeassistant/components/simplisafe/.translations/de.json index 8c615a80c3fe..08d5b31d202e 100644 --- a/homeassistant/components/simplisafe/.translations/de.json +++ b/homeassistant/components/simplisafe/.translations/de.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Code (f\u00fcr Home Assistant)", "password": "Passwort", "username": "E-Mail-Adresse" }, diff --git a/homeassistant/components/simplisafe/.translations/en.json b/homeassistant/components/simplisafe/.translations/en.json index c9d92c9e445f..60c3784ee9d2 100644 --- a/homeassistant/components/simplisafe/.translations/en.json +++ b/homeassistant/components/simplisafe/.translations/en.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Code (for Home Assistant)", "password": "Password", "username": "Email Address" }, diff --git a/homeassistant/components/simplisafe/.translations/es-419.json b/homeassistant/components/simplisafe/.translations/es-419.json index 709d045c3486..bf4127fbd843 100644 --- a/homeassistant/components/simplisafe/.translations/es-419.json +++ b/homeassistant/components/simplisafe/.translations/es-419.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "C\u00f3digo (para Home Assistant)", "password": "Contrase\u00f1a", "username": "Direcci\u00f3n de correo electr\u00f3nico" }, diff --git a/homeassistant/components/simplisafe/.translations/es.json b/homeassistant/components/simplisafe/.translations/es.json index dfd87be27213..fe159cf9fa8d 100644 --- a/homeassistant/components/simplisafe/.translations/es.json +++ b/homeassistant/components/simplisafe/.translations/es.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "C\u00f3digo (para Home Assistant)", "password": "Contrase\u00f1a", "username": "Direcci\u00f3n de correo electr\u00f3nico" }, diff --git a/homeassistant/components/simplisafe/.translations/fr.json b/homeassistant/components/simplisafe/.translations/fr.json index 0f5049ecce49..e204fa96f1b2 100644 --- a/homeassistant/components/simplisafe/.translations/fr.json +++ b/homeassistant/components/simplisafe/.translations/fr.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Code (pour Home Assistant)", "password": "Mot de passe", "username": "Adresse e-mail" }, diff --git a/homeassistant/components/simplisafe/.translations/it.json b/homeassistant/components/simplisafe/.translations/it.json index 80f684cff7ca..71581e845f46 100644 --- a/homeassistant/components/simplisafe/.translations/it.json +++ b/homeassistant/components/simplisafe/.translations/it.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Codice (Home Assistant)", "password": "Password", "username": "Indirizzo E-mail" }, diff --git a/homeassistant/components/simplisafe/.translations/ko.json b/homeassistant/components/simplisafe/.translations/ko.json index 17d50bc1508b..53e67cd5506e 100644 --- a/homeassistant/components/simplisafe/.translations/ko.json +++ b/homeassistant/components/simplisafe/.translations/ko.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "\ucf54\ub4dc (Home Assistant \uc6a9)", "password": "\ube44\ubc00\ubc88\ud638", "username": "\uc774\uba54\uc77c \uc8fc\uc18c" }, diff --git a/homeassistant/components/simplisafe/.translations/lb.json b/homeassistant/components/simplisafe/.translations/lb.json index 81f4c82fcc76..a7e56f817d50 100644 --- a/homeassistant/components/simplisafe/.translations/lb.json +++ b/homeassistant/components/simplisafe/.translations/lb.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Code (fir Home Assistant)", "password": "Passwuert", "username": "E-Mail Adress" }, diff --git a/homeassistant/components/simplisafe/.translations/nl.json b/homeassistant/components/simplisafe/.translations/nl.json index c84593c0b239..bad1c4081440 100644 --- a/homeassistant/components/simplisafe/.translations/nl.json +++ b/homeassistant/components/simplisafe/.translations/nl.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "Code (voor Home Assistant)", "password": "Wachtwoord", "username": "E-mailadres" }, diff --git a/homeassistant/components/simplisafe/.translations/no.json b/homeassistant/components/simplisafe/.translations/no.json index 83a3f8cbaf9a..436fba8fd066 100644 --- a/homeassistant/components/simplisafe/.translations/no.json +++ b/homeassistant/components/simplisafe/.translations/no.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Kode (for Home Assistant)", "password": "Passord", "username": "E-postadresse" }, diff --git a/homeassistant/components/simplisafe/.translations/pl.json b/homeassistant/components/simplisafe/.translations/pl.json index 75a38230e881..b673d28a7cac 100644 --- a/homeassistant/components/simplisafe/.translations/pl.json +++ b/homeassistant/components/simplisafe/.translations/pl.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Kod (dla Home Assistant'a)", "password": "Has\u0142o", "username": "Adres e-mail" }, diff --git a/homeassistant/components/simplisafe/.translations/pt-BR.json b/homeassistant/components/simplisafe/.translations/pt-BR.json index 819cb1d95e06..2f1fe9ca10ac 100644 --- a/homeassistant/components/simplisafe/.translations/pt-BR.json +++ b/homeassistant/components/simplisafe/.translations/pt-BR.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "C\u00f3digo (para o Home Assistant)", "password": "Senha", "username": "Endere\u00e7o de e-mail" }, diff --git a/homeassistant/components/simplisafe/.translations/pt.json b/homeassistant/components/simplisafe/.translations/pt.json index 47929161976f..809c8fc29a4a 100644 --- a/homeassistant/components/simplisafe/.translations/pt.json +++ b/homeassistant/components/simplisafe/.translations/pt.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "C\u00f3digo (para Home Assistant)", "password": "Palavra-passe", "username": "Endere\u00e7o de e-mail" }, diff --git a/homeassistant/components/simplisafe/.translations/ro.json b/homeassistant/components/simplisafe/.translations/ro.json index b7e281a2bc22..33f284e93c27 100644 --- a/homeassistant/components/simplisafe/.translations/ro.json +++ b/homeassistant/components/simplisafe/.translations/ro.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "Cod (pentru Home Assistant)", "password": "Parola", "username": "Adresa de email" }, diff --git a/homeassistant/components/simplisafe/.translations/ru.json b/homeassistant/components/simplisafe/.translations/ru.json index 070ac3f3425b..1e06319672ac 100644 --- a/homeassistant/components/simplisafe/.translations/ru.json +++ b/homeassistant/components/simplisafe/.translations/ru.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "\u041a\u043e\u0434 (\u0434\u043b\u044f Home Assistant)", "password": "\u041f\u0430\u0440\u043e\u043b\u044c", "username": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b" }, diff --git a/homeassistant/components/simplisafe/.translations/sl.json b/homeassistant/components/simplisafe/.translations/sl.json index fde16021d695..15131fb1198c 100644 --- a/homeassistant/components/simplisafe/.translations/sl.json +++ b/homeassistant/components/simplisafe/.translations/sl.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "Koda (za Home Assistant)", "password": "Geslo", "username": "E-po\u0161tni naslov" }, diff --git a/homeassistant/components/simplisafe/.translations/sv.json b/homeassistant/components/simplisafe/.translations/sv.json index 4666a9ea182e..28ae99c1dc41 100644 --- a/homeassistant/components/simplisafe/.translations/sv.json +++ b/homeassistant/components/simplisafe/.translations/sv.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "Kod (f\u00f6r Home Assistant)", "password": "L\u00f6senord", "username": "E-postadress" }, diff --git a/homeassistant/components/simplisafe/.translations/uk.json b/homeassistant/components/simplisafe/.translations/uk.json index 4dee0ed5f4dd..c7938df009eb 100644 --- a/homeassistant/components/simplisafe/.translations/uk.json +++ b/homeassistant/components/simplisafe/.translations/uk.json @@ -3,7 +3,6 @@ "step": { "user": { "data": { - "code": "\u041a\u043e\u0434 (\u0434\u043b\u044f Home Assistant)", "password": "\u041f\u0430\u0440\u043e\u043b\u044c", "username": "\u0410\u0434\u0440\u0435\u0441\u0430 \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0457 \u043f\u043e\u0448\u0442\u0438" }, diff --git a/homeassistant/components/simplisafe/.translations/zh-Hans.json b/homeassistant/components/simplisafe/.translations/zh-Hans.json index 4c57baea77f8..2981ee716347 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hans.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hans.json @@ -7,7 +7,6 @@ "step": { "user": { "data": { - "code": "\u4ee3\u7801\uff08\u7528\u4e8eHome Assistant\uff09", "password": "\u5bc6\u7801", "username": "\u7535\u5b50\u90ae\u4ef6\u5730\u5740" }, diff --git a/homeassistant/components/simplisafe/.translations/zh-Hant.json b/homeassistant/components/simplisafe/.translations/zh-Hant.json index 981fa5b59cf5..bbe44a4fdea4 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hant.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hant.json @@ -10,7 +10,6 @@ "step": { "user": { "data": { - "code": "\u9a57\u8b49\u78bc\uff08Home Assistant \u7528\uff09", "password": "\u5bc6\u78bc", "username": "\u96fb\u5b50\u90f5\u4ef6\u5730\u5740" }, diff --git a/homeassistant/components/switch/.translations/bg.json b/homeassistant/components/switch/.translations/bg.json index 64a3ea94e1b5..19a853dba974 100644 --- a/homeassistant/components/switch/.translations/bg.json +++ b/homeassistant/components/switch/.translations/bg.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} \u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d", - "is_on": "{entity_name} \u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d", - "turn_off": "\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 {entity_name}", - "turn_on": "\u0412\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 {entity_name}" + "is_on": "{entity_name} \u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d" }, "trigger_type": { "turned_off": "\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 {entity_name}", diff --git a/homeassistant/components/switch/.translations/ca.json b/homeassistant/components/switch/.translations/ca.json index dbf5e1526564..0f1101eca75c 100644 --- a/homeassistant/components/switch/.translations/ca.json +++ b/homeassistant/components/switch/.translations/ca.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} est\u00e0 apagat", - "is_on": "{entity_name} est\u00e0 enc\u00e8s", - "turn_off": "{entity_name} desactivat", - "turn_on": "{entity_name} activat" + "is_on": "{entity_name} est\u00e0 enc\u00e8s" }, "trigger_type": { "turned_off": "{entity_name} desactivat", diff --git a/homeassistant/components/switch/.translations/da.json b/homeassistant/components/switch/.translations/da.json index 2514a56a010c..eefa1e8bb6e1 100644 --- a/homeassistant/components/switch/.translations/da.json +++ b/homeassistant/components/switch/.translations/da.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} er fra", - "is_on": "{entity_name} er til", - "turn_off": "{entity_name} slukket", - "turn_on": "{entity_name} t\u00e6ndt" + "is_on": "{entity_name} er til" }, "trigger_type": { "turned_off": "{entity_name} slukkede", diff --git a/homeassistant/components/switch/.translations/de.json b/homeassistant/components/switch/.translations/de.json index 5396facadd7d..76496da6dc84 100644 --- a/homeassistant/components/switch/.translations/de.json +++ b/homeassistant/components/switch/.translations/de.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} ist ausgeschaltet", - "is_on": "{entity_name} ist eingeschaltet", - "turn_off": "{entity_name} ausgeschaltet", - "turn_on": "{entity_name} eingeschaltet" + "is_on": "{entity_name} ist eingeschaltet" }, "trigger_type": { "turned_off": "{entity_name} ausgeschaltet", diff --git a/homeassistant/components/switch/.translations/en.json b/homeassistant/components/switch/.translations/en.json index 391a071cb8f4..3f37de5331e3 100644 --- a/homeassistant/components/switch/.translations/en.json +++ b/homeassistant/components/switch/.translations/en.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} is off", - "is_on": "{entity_name} is on", - "turn_off": "{entity_name} turned off", - "turn_on": "{entity_name} turned on" + "is_on": "{entity_name} is on" }, "trigger_type": { "turned_off": "{entity_name} turned off", diff --git a/homeassistant/components/switch/.translations/es-419.json b/homeassistant/components/switch/.translations/es-419.json index f96078520360..b42b2ce56fa0 100644 --- a/homeassistant/components/switch/.translations/es-419.json +++ b/homeassistant/components/switch/.translations/es-419.json @@ -6,9 +6,7 @@ }, "condition_type": { "is_off": "{entity_name} est\u00e1 apagado", - "is_on": "{entity_name} est\u00e1 encendido", - "turn_off": "{entity_name} apagado", - "turn_on": "{entity_name} encendido" + "is_on": "{entity_name} est\u00e1 encendido" }, "trigger_type": { "turned_off": "{entity_name} apagado", diff --git a/homeassistant/components/switch/.translations/es.json b/homeassistant/components/switch/.translations/es.json index 24dbc2cdc1ff..c6790619182c 100644 --- a/homeassistant/components/switch/.translations/es.json +++ b/homeassistant/components/switch/.translations/es.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} est\u00e1 apagada", - "is_on": "{entity_name} est\u00e1 encendida", - "turn_off": "{entity_name} apagado", - "turn_on": "{entity_name} encendido" + "is_on": "{entity_name} est\u00e1 encendida" }, "trigger_type": { "turned_off": "{entity_name} apagado", diff --git a/homeassistant/components/switch/.translations/fr.json b/homeassistant/components/switch/.translations/fr.json index 807b85c5fb56..adc91477a232 100644 --- a/homeassistant/components/switch/.translations/fr.json +++ b/homeassistant/components/switch/.translations/fr.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} est \u00e9teint", - "is_on": "{entity_name} est allum\u00e9", - "turn_off": "{entity_name} \u00e9teint", - "turn_on": "{entity_name} allum\u00e9" + "is_on": "{entity_name} est allum\u00e9" }, "trigger_type": { "turned_off": "{entity_name} \u00e9teint", diff --git a/homeassistant/components/switch/.translations/hu.json b/homeassistant/components/switch/.translations/hu.json index c3ea3190694b..3fba61a48486 100644 --- a/homeassistant/components/switch/.translations/hu.json +++ b/homeassistant/components/switch/.translations/hu.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} ki van kapcsolva", - "is_on": "{entity_name} be van kapcsolva", - "turn_off": "{entity_name} ki lett kapcsolva", - "turn_on": "{entity_name} be lett kapcsolva" + "is_on": "{entity_name} be van kapcsolva" }, "trigger_type": { "turned_off": "{entity_name} ki lett kapcsolva", diff --git a/homeassistant/components/switch/.translations/it.json b/homeassistant/components/switch/.translations/it.json index ec742e4113bd..32f479b8b5c6 100644 --- a/homeassistant/components/switch/.translations/it.json +++ b/homeassistant/components/switch/.translations/it.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} \u00e8 disattivato", - "is_on": "{entity_name} \u00e8 attivo", - "turn_off": "{entity_name} disattivato", - "turn_on": "{entity_name} attivato" + "is_on": "{entity_name} \u00e8 attivo" }, "trigger_type": { "turned_off": "{entity_name} disattivato", diff --git a/homeassistant/components/switch/.translations/ko.json b/homeassistant/components/switch/.translations/ko.json index d3b9b1dd1690..b923fdb210e6 100644 --- a/homeassistant/components/switch/.translations/ko.json +++ b/homeassistant/components/switch/.translations/ko.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} \uc774(\uac00) \uaebc\uc838 \uc788\uc73c\uba74", - "is_on": "{entity_name} \uc774(\uac00) \ucf1c\uc838 \uc788\uc73c\uba74", - "turn_off": "{entity_name} \uc774(\uac00) \uaebc\uc838 \uc788\uc73c\uba74", - "turn_on": "{entity_name} \uc774(\uac00) \ucf1c\uc838 \uc788\uc73c\uba74" + "is_on": "{entity_name} \uc774(\uac00) \ucf1c\uc838 \uc788\uc73c\uba74" }, "trigger_type": { "turned_off": "{entity_name} \uc774(\uac00) \uaebc\uc9c8 \ub54c", diff --git a/homeassistant/components/switch/.translations/lb.json b/homeassistant/components/switch/.translations/lb.json index 8e974a0a8de1..a7f807e8dcda 100644 --- a/homeassistant/components/switch/.translations/lb.json +++ b/homeassistant/components/switch/.translations/lb.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} ass aus", - "is_on": "{entity_name} ass un", - "turn_off": "{entity_name} gouf ausgeschalt", - "turn_on": "{entity_name} gouf ugeschalt" + "is_on": "{entity_name} ass un" }, "trigger_type": { "turned_off": "{entity_name} gouf ausgeschalt", diff --git a/homeassistant/components/switch/.translations/lv.json b/homeassistant/components/switch/.translations/lv.json index 784a9a37afa7..7668dfa5ac86 100644 --- a/homeassistant/components/switch/.translations/lv.json +++ b/homeassistant/components/switch/.translations/lv.json @@ -1,9 +1,5 @@ { "device_automation": { - "condition_type": { - "turn_off": "{entity_name} tika izsl\u0113gta", - "turn_on": "{entity_name} tika iesl\u0113gta" - }, "trigger_type": { "turned_off": "{entity_name} tika izsl\u0113gta", "turned_on": "{entity_name} tika iesl\u0113gta" diff --git a/homeassistant/components/switch/.translations/nl.json b/homeassistant/components/switch/.translations/nl.json index 5e2aa6747a4c..905ad4130904 100644 --- a/homeassistant/components/switch/.translations/nl.json +++ b/homeassistant/components/switch/.translations/nl.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} is uitgeschakeld", - "is_on": "{entity_name} is ingeschakeld", - "turn_off": "{entity_name} uitgeschakeld", - "turn_on": "{entity_name} ingeschakeld" + "is_on": "{entity_name} is ingeschakeld" }, "trigger_type": { "turned_off": "{entity_name} uitgeschakeld", diff --git a/homeassistant/components/switch/.translations/no.json b/homeassistant/components/switch/.translations/no.json index 3469079f230b..785e9ca2912e 100644 --- a/homeassistant/components/switch/.translations/no.json +++ b/homeassistant/components/switch/.translations/no.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} er av", - "is_on": "{entity_name} er p\u00e5", - "turn_off": "{entity_name} sl\u00e5tt av", - "turn_on": "{entity_name} sl\u00e5tt p\u00e5" + "is_on": "{entity_name} er p\u00e5" }, "trigger_type": { "turned_off": "{entity_name} sl\u00e5tt av", diff --git a/homeassistant/components/switch/.translations/pl.json b/homeassistant/components/switch/.translations/pl.json index 3d352aa2b58d..930694de8ca8 100644 --- a/homeassistant/components/switch/.translations/pl.json +++ b/homeassistant/components/switch/.translations/pl.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "prze\u0142\u0105cznik {entity_name} jest wy\u0142\u0105czony", - "is_on": "prze\u0142\u0105cznik {entity_name} jest w\u0142\u0105czony", - "turn_off": "prze\u0142\u0105cznik {entity_name} wy\u0142\u0105czony", - "turn_on": "prze\u0142\u0105cznik {entity_name} w\u0142\u0105czony" + "is_on": "prze\u0142\u0105cznik {entity_name} jest w\u0142\u0105czony" }, "trigger_type": { "turned_off": "nast\u0105pi wy\u0142\u0105czenie {entity_name}", diff --git a/homeassistant/components/switch/.translations/ru.json b/homeassistant/components/switch/.translations/ru.json index 74503eea60b0..8ca964606ae8 100644 --- a/homeassistant/components/switch/.translations/ru.json +++ b/homeassistant/components/switch/.translations/ru.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} \u0432 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438", - "is_on": "{entity_name} \u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438", - "turn_off": "{entity_name} \u0432 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438", - "turn_on": "{entity_name} \u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438" + "is_on": "{entity_name} \u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438" }, "trigger_type": { "turned_off": "{entity_name} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", diff --git a/homeassistant/components/switch/.translations/sl.json b/homeassistant/components/switch/.translations/sl.json index f1b851b05b6f..bef4f1583b6b 100644 --- a/homeassistant/components/switch/.translations/sl.json +++ b/homeassistant/components/switch/.translations/sl.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} je izklopljen", - "is_on": "{entity_name} je vklopljen", - "turn_off": "{entity_name} izklopljen", - "turn_on": "{entity_name} vklopljen" + "is_on": "{entity_name} je vklopljen" }, "trigger_type": { "turned_off": "{entity_name} izklopljen", diff --git a/homeassistant/components/switch/.translations/sv.json b/homeassistant/components/switch/.translations/sv.json index 3ec36265e52c..ed5367e0013a 100644 --- a/homeassistant/components/switch/.translations/sv.json +++ b/homeassistant/components/switch/.translations/sv.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name} \u00e4r avst\u00e4ngd", - "is_on": "{entity_name} \u00e4r p\u00e5", - "turn_off": "{entity_name} st\u00e4ngdes av", - "turn_on": "{entity_name} slogs p\u00e5" + "is_on": "{entity_name} \u00e4r p\u00e5" }, "trigger_type": { "turned_off": "{entity_name} st\u00e4ngdes av", diff --git a/homeassistant/components/switch/.translations/zh-Hant.json b/homeassistant/components/switch/.translations/zh-Hant.json index 3eaac8404975..d8bda90de857 100644 --- a/homeassistant/components/switch/.translations/zh-Hant.json +++ b/homeassistant/components/switch/.translations/zh-Hant.json @@ -7,9 +7,7 @@ }, "condition_type": { "is_off": "{entity_name}\u5df2\u95dc\u9589", - "is_on": "{entity_name}\u5df2\u958b\u555f", - "turn_off": "{entity_name}\u5df2\u95dc\u9589", - "turn_on": "{entity_name}\u5df2\u958b\u555f" + "is_on": "{entity_name}\u5df2\u958b\u555f" }, "trigger_type": { "turned_off": "{entity_name}\u5df2\u95dc\u9589", diff --git a/homeassistant/components/synology_dsm/.translations/ca.json b/homeassistant/components/synology_dsm/.translations/ca.json index 52a416ed8ab9..39b99ac9306e 100644 --- a/homeassistant/components/synology_dsm/.translations/ca.json +++ b/homeassistant/components/synology_dsm/.translations/ca.json @@ -4,7 +4,8 @@ "already_configured": "L'amfitri\u00f3 ja est\u00e0 configurat" }, "error": { - "login": "Error d\u2019inici de sessi\u00f3: comprova el nom d'usuari i la contrasenya" + "login": "Error d\u2019inici de sessi\u00f3: comprova el nom d'usuari i la contrasenya", + "unknown": "Error desconegut: torna-ho a provar m\u00e9s tard o revisa la configuraci\u00f3" }, "step": { "user": { diff --git a/homeassistant/components/synology_dsm/.translations/da.json b/homeassistant/components/synology_dsm/.translations/da.json index 5085cdbce9e1..f95e08df3c18 100644 --- a/homeassistant/components/synology_dsm/.translations/da.json +++ b/homeassistant/components/synology_dsm/.translations/da.json @@ -1,9 +1,16 @@ { "config": { "step": { + "link": { + "data": { + "password": "Adgangskode", + "username": "Brugernavn" + } + }, "user": { "data": { - "password": "Adgangskode" + "password": "Adgangskode", + "username": "Brugernavn" } } } diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json index 77bd1250033b..3bac6d162885 100644 --- a/homeassistant/components/synology_dsm/.translations/en.json +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -1,37 +1,38 @@ { - "config": { - "title": "Synology DSM", - "flow_title": "Synology DSM {name} ({host})", - "step": { - "user": { - "title": "Synology DSM", - "data": { - "host": "Host", - "port": "Port (Optional)", - "ssl": "Use SSL/TLS to connect to your NAS", - "api_version": "DSM version", - "username": "Username", - "password": "Password" - } - }, - "link": { - "title": "Synology DSM", - "description": "Do you want to setup {name} ({host})?", - "data": { - "ssl": "Use SSL/TLS to connect to your NAS", - "api_version": "DSM version", - "username": "Username", - "password": "Password", - "port": "Port (Optional)" - } - } - }, - "error": { - "login": "Login error: please check your username & password", - "unknown": "Unknown error: please retry later or an other configuration" - }, - "abort": { - "already_configured": "Host already configured" + "config": { + "abort": { + "already_configured": "Host already configured" + }, + "error": { + "login": "Login error: please check your username & password", + "unknown": "Unknown error: please retry later or an other configuration" + }, + "flow_title": "Synology DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "DSM version", + "password": "Password", + "port": "Port (Optional)", + "ssl": "Use SSL/TLS to connect to your NAS", + "username": "Username" + }, + "description": "Do you want to setup {name} ({host})?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "DSM version", + "host": "Host", + "name": "Name", + "password": "Password", + "port": "Port (Optional)", + "ssl": "Use SSL/TLS to connect to your NAS", + "username": "Username" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" } - } -} +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json index 925443a844ee..fafedb50a0e4 100644 --- a/homeassistant/components/synology_dsm/.translations/es.json +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -18,9 +18,9 @@ "ssl": "Usar SSL/TLS para conectar con tu NAS", "username": "Usuario" }, - "title": "DSM Synology" + "title": "Synology DSM" } }, - "title": "DSM Synology" + "title": "Synology DSM" } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/lb.json b/homeassistant/components/synology_dsm/.translations/lb.json new file mode 100644 index 000000000000..92026cbe2d82 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/lb.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Apparat ass scho konfigur\u00e9iert" + }, + "error": { + "login": "Feeler beim Login: iwwerpr\u00e9if de Benotzernumm & Passwuert", + "unknown": "Onbekannte Feeler: prob\u00e9ier sp\u00e9ider nach emol oder mat enger aner Konfiguratioun" + }, + "step": { + "user": { + "data": { + "api_version": "DSM Versioun", + "host": "Apparat", + "name": "Numm", + "password": "Passwuert", + "port": "Port", + "ssl": "Benotzt SSL/TLS fir sech mam NAS ze verbannen", + "username": "Benotzernumm" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/nl.json b/homeassistant/components/synology_dsm/.translations/nl.json new file mode 100644 index 000000000000..1927227b65f1 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/nl.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured": "Host is al geconfigureerd." + }, + "error": { + "unknown": "Onbekende fout: probeer het later opnieuw of een andere configuratie" + }, + "flow_title": "Synology DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "DSM-versie", + "password": "Wachtwoord", + "port": "Poort (optioneel)", + "ssl": "Gebruik SSL/TLS om verbinding te maken met uw NAS", + "username": "Gebruikersnaam" + }, + "description": "Wil je {name} ({host}) instellen?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "DSM-versie", + "host": "Host", + "name": "Naam", + "password": "Wachtwoord", + "port": "Poort (optioneel)", + "ssl": "Gebruik SSL/TLS om verbinding te maken met uw NAS", + "username": "Gebruikersnaam" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/bg.json b/homeassistant/components/transmission/.translations/bg.json index 98160b899258..3278f7a3a4cf 100644 --- a/homeassistant/components/transmission/.translations/bg.json +++ b/homeassistant/components/transmission/.translations/bg.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "\u0410\u0434\u0440\u0435\u0441\u044a\u0442 \u0432\u0435\u0447\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d.", - "one_instance_allowed": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0435 \u0441\u0430\u043c\u043e \u0435\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f." + "already_configured": "\u0410\u0434\u0440\u0435\u0441\u044a\u0442 \u0432\u0435\u0447\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d." }, "error": { "cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 \u0430\u0434\u0440\u0435\u0441\u0430", @@ -10,12 +9,6 @@ "wrong_credentials": "\u0413\u0440\u0435\u0448\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0430" }, "step": { - "options": { - "data": { - "scan_interval": "\u0427\u0435\u0441\u0442\u043e\u0442\u0430 \u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435" - }, - "title": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435" - }, "user": { "data": { "host": "\u0410\u0434\u0440\u0435\u0441", @@ -35,7 +28,6 @@ "data": { "scan_interval": "\u0427\u0435\u0441\u0442\u043e\u0442\u0430 \u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435" }, - "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438\u0442\u0435 \u0437\u0430 Transmission", "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438\u0442\u0435 \u0437\u0430 Transmission" } } diff --git a/homeassistant/components/transmission/.translations/ca.json b/homeassistant/components/transmission/.translations/ca.json index f621574683fc..7630b50cdcf4 100644 --- a/homeassistant/components/transmission/.translations/ca.json +++ b/homeassistant/components/transmission/.translations/ca.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "L'amfitri\u00f3 ja est\u00e0 configurat.", - "one_instance_allowed": "Nom\u00e9s cal una sola inst\u00e0ncia." + "already_configured": "L'amfitri\u00f3 ja est\u00e0 configurat." }, "error": { "cannot_connect": "No s'ha pogut connectar amb l'amfitri\u00f3", @@ -10,12 +9,6 @@ "wrong_credentials": "Nom d'usuari o contrasenya incorrectes" }, "step": { - "options": { - "data": { - "scan_interval": "Freq\u00fc\u00e8ncia d\u2019actualitzaci\u00f3" - }, - "title": "Opcions de configuraci\u00f3" - }, "user": { "data": { "host": "Amfitri\u00f3", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Freq\u00fc\u00e8ncia d\u2019actualitzaci\u00f3" }, - "description": "Opcions de configuraci\u00f3 de Transmission", "title": "Opcions de configuraci\u00f3 de Transmission" } } diff --git a/homeassistant/components/transmission/.translations/da.json b/homeassistant/components/transmission/.translations/da.json index e84ec938ee29..feabb364344a 100644 --- a/homeassistant/components/transmission/.translations/da.json +++ b/homeassistant/components/transmission/.translations/da.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "V\u00e6rten er allerede konfigureret.", - "one_instance_allowed": "Kun en enkelt instans er n\u00f8dvendig." + "already_configured": "V\u00e6rten er allerede konfigureret." }, "error": { "cannot_connect": "Kunne ikke oprette forbindelse til v\u00e6rt", @@ -10,12 +9,6 @@ "wrong_credentials": "Ugyldigt brugernavn eller adgangskode" }, "step": { - "options": { - "data": { - "scan_interval": "Opdateringsfrekvens" - }, - "title": "Konfigurationsmuligheder" - }, "user": { "data": { "host": "V\u00e6rt", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Opdateringsfrekvens" }, - "description": "Konfigurationsindstillinger for Transmission", "title": "Konfigurationsindstillinger for Transmission" } } diff --git a/homeassistant/components/transmission/.translations/de.json b/homeassistant/components/transmission/.translations/de.json index 736a6d726597..c3d912e5e77a 100644 --- a/homeassistant/components/transmission/.translations/de.json +++ b/homeassistant/components/transmission/.translations/de.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Host ist bereits konfiguriert.", - "one_instance_allowed": "Nur eine einzige Instanz ist notwendig." + "already_configured": "Host ist bereits konfiguriert." }, "error": { "cannot_connect": "Verbindung zum Host nicht m\u00f6glich", @@ -10,12 +9,6 @@ "wrong_credentials": "Falscher Benutzername oder Kennwort" }, "step": { - "options": { - "data": { - "scan_interval": "Aktualisierungsfrequenz" - }, - "title": "Konfigurationsoptionen" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Aktualisierungsfrequenz" }, - "description": "Konfigurieren von Optionen f\u00fcr Transmission", "title": "Konfiguriere die Optionen f\u00fcr die \u00dcbertragung" } } diff --git a/homeassistant/components/transmission/.translations/en.json b/homeassistant/components/transmission/.translations/en.json index aa8b99a49142..3605f21e1409 100644 --- a/homeassistant/components/transmission/.translations/en.json +++ b/homeassistant/components/transmission/.translations/en.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Host is already configured.", - "one_instance_allowed": "Only a single instance is necessary." + "already_configured": "Host is already configured." }, "error": { "cannot_connect": "Unable to Connect to host", @@ -10,12 +9,6 @@ "wrong_credentials": "Wrong username or password" }, "step": { - "options": { - "data": { - "scan_interval": "Update frequency" - }, - "title": "Configure Options" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Update frequency" }, - "description": "Configure options for Transmission", "title": "Configure options for Transmission" } } diff --git a/homeassistant/components/transmission/.translations/es.json b/homeassistant/components/transmission/.translations/es.json index 06ea19e72b8c..a1d0f3647694 100644 --- a/homeassistant/components/transmission/.translations/es.json +++ b/homeassistant/components/transmission/.translations/es.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "El host ya est\u00e1 configurado.", - "one_instance_allowed": "S\u00f3lo se necesita una sola instancia." + "already_configured": "El host ya est\u00e1 configurado." }, "error": { "cannot_connect": "No se puede conectar al host", @@ -10,12 +9,6 @@ "wrong_credentials": "Nombre de usuario o contrase\u00f1a incorrectos" }, "step": { - "options": { - "data": { - "scan_interval": "Frecuencia de actualizaci\u00f3n" - }, - "title": "Configurar opciones" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Frecuencia de actualizaci\u00f3n" }, - "description": "Configurar opciones para la transmisi\u00f3n", "title": "Configurar opciones para la transmisi\u00f3n" } } diff --git a/homeassistant/components/transmission/.translations/fr.json b/homeassistant/components/transmission/.translations/fr.json index 3c267b36a088..c7a782017970 100644 --- a/homeassistant/components/transmission/.translations/fr.json +++ b/homeassistant/components/transmission/.translations/fr.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "L'h\u00f4te est d\u00e9j\u00e0 configur\u00e9.", - "one_instance_allowed": "Une seule instance est n\u00e9cessaire." + "already_configured": "L'h\u00f4te est d\u00e9j\u00e0 configur\u00e9." }, "error": { "cannot_connect": "Impossible de se connecter \u00e0 l'h\u00f4te", @@ -10,12 +9,6 @@ "wrong_credentials": "Mauvais nom d'utilisateur ou mot de passe" }, "step": { - "options": { - "data": { - "scan_interval": "Fr\u00e9quence de mise \u00e0 jour" - }, - "title": "Configurer les options" - }, "user": { "data": { "host": "H\u00f4te", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Fr\u00e9quence de mise \u00e0 jour" }, - "description": "Configurer les options pour Transmission", "title": "Configurer les options pour Transmission" } } diff --git a/homeassistant/components/transmission/.translations/hu.json b/homeassistant/components/transmission/.translations/hu.json index 14bf5c28bdfd..cbd2f44c3400 100644 --- a/homeassistant/components/transmission/.translations/hu.json +++ b/homeassistant/components/transmission/.translations/hu.json @@ -1,20 +1,11 @@ { "config": { - "abort": { - "one_instance_allowed": "Csak egyetlen p\u00e9ld\u00e1nyra van sz\u00fcks\u00e9g." - }, "error": { "cannot_connect": "Nem lehet csatlakozni az \u00e1llom\u00e1shoz", "name_exists": "A n\u00e9v m\u00e1r l\u00e9tezik", "wrong_credentials": "Rossz felhaszn\u00e1l\u00f3n\u00e9v vagy jelsz\u00f3" }, "step": { - "options": { - "data": { - "scan_interval": "Friss\u00edt\u00e9si gyakoris\u00e1g" - }, - "title": "Be\u00e1ll\u00edt\u00e1sok konfigur\u00e1l\u00e1sa" - }, "user": { "data": { "host": "Kiszolg\u00e1l\u00f3", diff --git a/homeassistant/components/transmission/.translations/it.json b/homeassistant/components/transmission/.translations/it.json index a7c4c675856e..8a1f01783c12 100644 --- a/homeassistant/components/transmission/.translations/it.json +++ b/homeassistant/components/transmission/.translations/it.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "L'host \u00e8 gi\u00e0 configurato.", - "one_instance_allowed": "\u00c8 necessaria solo una singola istanza." + "already_configured": "L'host \u00e8 gi\u00e0 configurato." }, "error": { "cannot_connect": "Impossibile connettersi all'host", @@ -10,12 +9,6 @@ "wrong_credentials": "Nome utente o password non validi" }, "step": { - "options": { - "data": { - "scan_interval": "Frequenza di aggiornamento" - }, - "title": "Configura opzioni" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Frequenza di aggiornamento" }, - "description": "Configurare le opzioni per Trasmissione", "title": "Configurare le opzioni per Transmission" } } diff --git a/homeassistant/components/transmission/.translations/ko.json b/homeassistant/components/transmission/.translations/ko.json index 507d4e84789d..4d3537818b79 100644 --- a/homeassistant/components/transmission/.translations/ko.json +++ b/homeassistant/components/transmission/.translations/ko.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "\ud638\uc2a4\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "one_instance_allowed": "\ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \ud544\uc694\ud569\ub2c8\ub2e4." + "already_configured": "\ud638\uc2a4\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4." }, "error": { "cannot_connect": "\ud638\uc2a4\ud2b8\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", @@ -10,12 +9,6 @@ "wrong_credentials": "\uc0ac\uc6a9\uc790 \uc774\ub984 \ub610\ub294 \ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" }, "step": { - "options": { - "data": { - "scan_interval": "\uc5c5\ub370\uc774\ud2b8 \ube48\ub3c4" - }, - "title": "\uc635\uc158 \uc124\uc815" - }, "user": { "data": { "host": "\ud638\uc2a4\ud2b8", @@ -35,7 +28,6 @@ "data": { "scan_interval": "\uc5c5\ub370\uc774\ud2b8 \ube48\ub3c4" }, - "description": "Transmission \uc635\uc158 \uc124\uc815", "title": "Transmission \uc635\uc158 \uc124\uc815" } } diff --git a/homeassistant/components/transmission/.translations/lb.json b/homeassistant/components/transmission/.translations/lb.json index a012bcd8cde2..0533574efb01 100644 --- a/homeassistant/components/transmission/.translations/lb.json +++ b/homeassistant/components/transmission/.translations/lb.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Apparat ass scho konfigur\u00e9iert", - "one_instance_allowed": "N\u00ebmmen eng eenzeg Instanz ass n\u00e9ideg." + "already_configured": "Apparat ass scho konfigur\u00e9iert" }, "error": { "cannot_connect": "Kann sech net mam Server verbannen.", @@ -10,12 +9,6 @@ "wrong_credentials": "Falsche Benotzernumm oder Passwuert" }, "step": { - "options": { - "data": { - "scan_interval": "Intervalle vun de Mise \u00e0 jour" - }, - "title": "Optioune konfigur\u00e9ieren" - }, "user": { "data": { "host": "Server", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Intervalle vun de Mise \u00e0 jour" }, - "description": "Optioune fir Transmission konfigur\u00e9ieren", "title": "Optioune fir Transmission konfigur\u00e9ieren" } } diff --git a/homeassistant/components/transmission/.translations/nl.json b/homeassistant/components/transmission/.translations/nl.json index ccb9c5695623..5abf25e286c0 100644 --- a/homeassistant/components/transmission/.translations/nl.json +++ b/homeassistant/components/transmission/.translations/nl.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Host is al geconfigureerd.", - "one_instance_allowed": "Slechts \u00e9\u00e9n instantie is nodig." + "already_configured": "Host is al geconfigureerd." }, "error": { "cannot_connect": "Kan geen verbinding maken met host", @@ -10,12 +9,6 @@ "wrong_credentials": "verkeerde gebruikersnaam of wachtwoord" }, "step": { - "options": { - "data": { - "scan_interval": "Update frequentie" - }, - "title": "Configureer opties" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Update frequentie" }, - "description": "Configureer opties voor Transmission", "title": "Configureer de opties voor Transmission" } } diff --git a/homeassistant/components/transmission/.translations/no.json b/homeassistant/components/transmission/.translations/no.json index c46a6d782eab..d18a854d6e38 100644 --- a/homeassistant/components/transmission/.translations/no.json +++ b/homeassistant/components/transmission/.translations/no.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Verten er allerede konfigurert.", - "one_instance_allowed": "Bare en enkel instans er n\u00f8dvendig." + "already_configured": "Verten er allerede konfigurert." }, "error": { "cannot_connect": "Kan ikke koble til vert", @@ -10,12 +9,6 @@ "wrong_credentials": "Ugyldig brukernavn eller passord" }, "step": { - "options": { - "data": { - "scan_interval": "Oppdater frekvens" - }, - "title": "Konfigurer alternativer" - }, "user": { "data": { "host": "Vert", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Oppdater frekvens" }, - "description": "Konfigurer alternativer for Transmission", "title": "Konfigurer alternativer for Transmission" } } diff --git a/homeassistant/components/transmission/.translations/pl.json b/homeassistant/components/transmission/.translations/pl.json index 5aac538766bd..f3e8c01f3d76 100644 --- a/homeassistant/components/transmission/.translations/pl.json +++ b/homeassistant/components/transmission/.translations/pl.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Host jest ju\u017c skonfigurowany.", - "one_instance_allowed": "Wymagana jest tylko jedna instancja." + "already_configured": "Host jest ju\u017c skonfigurowany." }, "error": { "cannot_connect": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z hostem", @@ -10,12 +9,6 @@ "wrong_credentials": "Nieprawid\u0142owa nazwa u\u017cytkownika lub has\u0142o" }, "step": { - "options": { - "data": { - "scan_interval": "Cz\u0119stotliwo\u015b\u0107 aktualizacji" - }, - "title": "Opcje" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Cz\u0119stotliwo\u015b\u0107 aktualizacji" }, - "description": "Konfiguracja opcji dla Transmission", "title": "Konfiguracja opcji dla Transmission" } } diff --git a/homeassistant/components/transmission/.translations/pt-BR.json b/homeassistant/components/transmission/.translations/pt-BR.json index de854e1273c8..2c162e66ce79 100644 --- a/homeassistant/components/transmission/.translations/pt-BR.json +++ b/homeassistant/components/transmission/.translations/pt-BR.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "O host j\u00e1 est\u00e1 configurado.", - "one_instance_allowed": "Apenas uma \u00fanica inst\u00e2ncia \u00e9 necess\u00e1ria." + "already_configured": "O host j\u00e1 est\u00e1 configurado." }, "error": { "cannot_connect": "N\u00e3o foi poss\u00edvel conectar ao host", @@ -10,12 +9,6 @@ "wrong_credentials": "Nome de usu\u00e1rio ou senha incorretos" }, "step": { - "options": { - "data": { - "scan_interval": "Frequ\u00eancia de atualiza\u00e7\u00e3o" - }, - "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o" - }, "user": { "data": { "host": "Host", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Frequ\u00eancia de atualiza\u00e7\u00e3o" }, - "description": "Configurar op\u00e7\u00f5es para transmiss\u00e3o", "title": "Configurar op\u00e7\u00f5es para Transmission" } } diff --git a/homeassistant/components/transmission/.translations/ru.json b/homeassistant/components/transmission/.translations/ru.json index 9f876dde5054..ad43d3ee6001 100644 --- a/homeassistant/components/transmission/.translations/ru.json +++ b/homeassistant/components/transmission/.translations/ru.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "one_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\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 \u043a \u0445\u043e\u0441\u0442\u0443.", @@ -10,12 +9,6 @@ "wrong_credentials": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c." }, "step": { - "options": { - "data": { - "scan_interval": "\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f" - }, - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Transmission" - }, "user": { "data": { "host": "\u0425\u043e\u0441\u0442", @@ -35,7 +28,6 @@ "data": { "scan_interval": "\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f" }, - "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Transmission", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Transmission" } } diff --git a/homeassistant/components/transmission/.translations/sl.json b/homeassistant/components/transmission/.translations/sl.json index 37ce27e19f41..765fb284c3a6 100644 --- a/homeassistant/components/transmission/.translations/sl.json +++ b/homeassistant/components/transmission/.translations/sl.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "Gostitelj je \u017ee konfiguriran.", - "one_instance_allowed": "Potrebna je samo ena instanca." + "already_configured": "Gostitelj je \u017ee konfiguriran." }, "error": { "cannot_connect": "Ni mogo\u010de vzpostaviti povezave z gostiteljem", @@ -10,12 +9,6 @@ "wrong_credentials": "Napa\u010dno uporabni\u0161ko ime ali geslo" }, "step": { - "options": { - "data": { - "scan_interval": "Pogostost posodabljanja" - }, - "title": "Nastavite mo\u017enosti" - }, "user": { "data": { "host": "Gostitelj", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Pogostost posodabljanja" }, - "description": "Nastavite mo\u017enosti za Transmission", "title": "Nastavite mo\u017enosti za Transmission" } } diff --git a/homeassistant/components/transmission/.translations/sv.json b/homeassistant/components/transmission/.translations/sv.json index b2a00771e858..289c9f985e3b 100644 --- a/homeassistant/components/transmission/.translations/sv.json +++ b/homeassistant/components/transmission/.translations/sv.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "V\u00e4rden \u00e4r redan konfigurerad.", - "one_instance_allowed": "Endast en enda instans \u00e4r n\u00f6dv\u00e4ndig." + "already_configured": "V\u00e4rden \u00e4r redan konfigurerad." }, "error": { "cannot_connect": "Det g\u00e5r inte att ansluta till v\u00e4rden", @@ -10,12 +9,6 @@ "wrong_credentials": "Fel anv\u00e4ndarnamn eller l\u00f6senord" }, "step": { - "options": { - "data": { - "scan_interval": "Uppdateringsfrekvens" - }, - "title": "Konfigurera alternativ" - }, "user": { "data": { "host": "V\u00e4rd", @@ -35,7 +28,6 @@ "data": { "scan_interval": "Uppdateringsfrekvens" }, - "description": "Konfigurera alternativ f\u00f6r Transmission", "title": "Konfigurera alternativ f\u00f6r Transmission" } } diff --git a/homeassistant/components/transmission/.translations/zh-Hant.json b/homeassistant/components/transmission/.translations/zh-Hant.json index 304babc991ef..6ae573211c67 100644 --- a/homeassistant/components/transmission/.translations/zh-Hant.json +++ b/homeassistant/components/transmission/.translations/zh-Hant.json @@ -1,8 +1,7 @@ { "config": { "abort": { - "already_configured": "\u4e3b\u6a5f\u7aef\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002", - "one_instance_allowed": "\u50c5\u9700\u8a2d\u5b9a\u4e00\u7d44\u7269\u4ef6\u5373\u53ef\u3002" + "already_configured": "\u4e3b\u6a5f\u7aef\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002" }, "error": { "cannot_connect": "\u7121\u6cd5\u9023\u7dda\u81f3\u4e3b\u6a5f\u7aef", @@ -10,12 +9,6 @@ "wrong_credentials": "\u4f7f\u7528\u8005\u540d\u7a31\u6216\u5bc6\u78bc\u932f\u8aa4" }, "step": { - "options": { - "data": { - "scan_interval": "\u66f4\u65b0\u983b\u7387" - }, - "title": "\u8a2d\u5b9a\u9078\u9805" - }, "user": { "data": { "host": "\u4e3b\u6a5f\u7aef", @@ -35,7 +28,6 @@ "data": { "scan_interval": "\u66f4\u65b0\u983b\u7387" }, - "description": "Transmission \u8a2d\u5b9a\u9078\u9805", "title": "Transmission \u8a2d\u5b9a\u9078\u9805" } } diff --git a/homeassistant/components/unifi/.translations/lb.json b/homeassistant/components/unifi/.translations/lb.json index 527c2f11a281..a3d7d685ed2c 100644 --- a/homeassistant/components/unifi/.translations/lb.json +++ b/homeassistant/components/unifi/.translations/lb.json @@ -35,6 +35,7 @@ "new_client": "Neie Client fir Netzwierk Zougang Kontroll b\u00e4isetzen", "poe_clients": "POE Kontroll vun Clienten erlaben" }, + "description": "Client Kontroll konfigur\u00e9ieren\n\nErstell Schalter fir Serienummer d\u00e9i sollen fir Netzwierk Zougangs Kontroll kontroll\u00e9iert ginn.", "title": "UniFi Optiounen 2/3" }, "device_tracker": { @@ -46,7 +47,7 @@ "track_wired_clients": "Kabel Netzwierk Cliente abez\u00e9ien" }, "description": "Apparate verfollegen ariichten", - "title": "UniFi Optiounen" + "title": "UniFi Optiounen 1/3" }, "init": { "data": { @@ -59,7 +60,7 @@ "allow_bandwidth_sensors": "Bandbreet Benotzung Sensore fir Netzwierk Cliente erstellen" }, "description": "Statistik Sensoren konfigur\u00e9ieren", - "title": "UniFi Optiounen" + "title": "UniFi Optiounen 3/3" } } } diff --git a/homeassistant/components/vilfo/.translations/pl.json b/homeassistant/components/vilfo/.translations/pl.json index aef0c14703f6..e9cd91209a47 100644 --- a/homeassistant/components/vilfo/.translations/pl.json +++ b/homeassistant/components/vilfo/.translations/pl.json @@ -15,7 +15,7 @@ "host": "Nazwa hosta lub adres IP routera" }, "description": "Skonfiguruj integracj\u0119 routera Vilfo. Potrzebujesz nazwy hosta/adresu IP routera Vilfo i tokena dost\u0119pu do interfejsu API. Aby uzyska\u0107 dodatkowe informacje na temat tej integracji i sposobu uzyskania niezb\u0119dnych danych do konfiguracji, odwied\u017a: https://www.home-assistant.io/integrations/vilfo", - "title": "Po\u0142\u0105cz si\u0119 z routerem Vilfo" + "title": "Po\u0142\u0105czenie z routerem Vilfo" } }, "title": "Router Vilfo" diff --git a/homeassistant/components/vizio/.translations/ca.json b/homeassistant/components/vizio/.translations/ca.json index c8cfa5637792..6b9a3a89134b 100644 --- a/homeassistant/components/vizio/.translations/ca.json +++ b/homeassistant/components/vizio/.translations/ca.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "El flux de dades de configuraci\u00f3 pel component Vizio ja est\u00e0 en curs.", "already_setup": "Aquesta entrada ja ha estat configurada.", - "already_setup_with_diff_host_and_name": "Sembla que aquesta entrada ja s'ha configurat amb un amfitri\u00f3 i nom diferents a partir del n\u00famero de s\u00e8rie. Elimina les entrades antigues de configuraction.yaml i del men\u00fa d'integracions abans de provar d'afegir el dispositiu novament.", - "host_exists": "Ja existeix un component Vizio configurat amb el host.", - "name_exists": "Ja existeix un component Vizio configurat amb el nom.", - "updated_entry": "Aquesta entrada ja s'ha configurat per\u00f2 el nom i les opcions definides a la configuraci\u00f3 no coincideixen amb els valors importats anteriorment, en conseq\u00fc\u00e8ncia, s'han actualitzat.", - "updated_options": "Aquesta entrada ja s'ha configurat per\u00f2 les opcions definides a la configuraci\u00f3 no coincideixen amb els valors importats anteriorment, en conseq\u00fc\u00e8ncia, s'han actualitzat.", - "updated_volume_step": "Aquesta entrada ja s'ha configurat per\u00f2 la mida de l'increment de volum definit a la configuraci\u00f3 no coincideix, en conseq\u00fc\u00e8ncia, s'ha actualitzat." + "updated_entry": "Aquesta entrada ja s'ha configurat per\u00f2 el nom i les opcions definides a la configuraci\u00f3 no coincideixen amb els valors importats anteriorment, en conseq\u00fc\u00e8ncia, s'han actualitzat." }, "error": { "cant_connect": "No s'ha pogut connectar amb el dispositiu. [Comprova la documentaci\u00f3](https://www.home-assistant.io/integrations/vizio/) i torna a verificar que: \n - El dispositiu est\u00e0 engegat \n - El dispositiu est\u00e0 connectat a la xarxa \n - Els valors que has intridu\u00eft s\u00f3n correctes\n abans d\u2019intentar tornar a presentar.", "complete_pairing failed": "No s'ha pogut completar l'emparellament. Verifica que el PIN proporcionat sigui el correcte i que el televisor segueix connectat a la xarxa abans de provar-ho de nou.", "host_exists": "Dispositiu Vizio amb aquest nom d'amfitri\u00f3 ja configurat.", - "name_exists": "Dispositiu Vizio amb aquest nom ja configurat.", - "tv_needs_token": "Si el tipus de dispositiu \u00e9s 'tv', cal un testimoni d'acc\u00e9s v\u00e0lid (token)." + "name_exists": "Dispositiu Vizio amb aquest nom ja configurat." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "El dispositiu Vizio SmartCast est\u00e0 connectat a Home Assistant.\n\nEl testimoni d'acc\u00e9s (Access Token) \u00e9s '**{access_token}**'.", "title": "Emparellament completat" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Aplicacions a incloure o excloure", - "include_or_exclude": "Incloure o excloure aplicacions?" - }, - "description": "Si tens una Smart TV, pots filtrar de manera opcional la teva llista de canals escollint quines aplicacions vols incloure o excloure de la llista. Pots ometre aquest pas si el teu televisor no admet aplicacions.", - "title": "Configuraci\u00f3 d'Aplicacions per a Smart TV" - }, "user": { "data": { "access_token": "Testimoni d'acc\u00e9s", @@ -50,14 +35,6 @@ }, "description": "Nom\u00e9s es necessita testimoni d'acc\u00e9s per als televisors. Si est\u00e0s configurant un televisor i encara no tens un testimoni d'acc\u00e9s, deixeu-ho en blanc per poder fer el proc\u00e9s d'emparellament.", "title": "Configuraci\u00f3 del client de Vizio SmartCast" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Aplicacions a incloure o excloure", - "include_or_exclude": "Incloure o excloure aplicacions?" - }, - "description": "Si tens una Smart TV, pots filtrar de manera opcional la teva llista de canals escollint quines aplicacions vols incloure o excloure de la llista. Pots ometre aquest pas si el teu televisor no admet aplicacions.", - "title": "Configuraci\u00f3 d'Aplicacions per a Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Aplicacions a incloure o excloure", "include_or_exclude": "Incloure o excloure aplicacions?", - "timeout": "Temps d'espera de les sol\u00b7licituds API (en segons)", "volume_step": "Mida del pas de volum" }, "description": "Si tens una Smart TV, pots filtrar de manera opcional la teva llista de canals escollint quines aplicacions vols incloure o excloure de la llista.", diff --git a/homeassistant/components/vizio/.translations/da.json b/homeassistant/components/vizio/.translations/da.json index 9bfd5864025c..5317c1c2adb7 100644 --- a/homeassistant/components/vizio/.translations/da.json +++ b/homeassistant/components/vizio/.translations/da.json @@ -1,20 +1,13 @@ { "config": { "abort": { - "already_in_progress": "Konfigurationsproces for Vizio-komponenten er allerede i gang.", "already_setup": "Denne post er allerede blevet konfigureret.", - "already_setup_with_diff_host_and_name": "Denne post ser ud til allerede at v\u00e6re konfigureret med en anden v\u00e6rt og navn baseret p\u00e5 dens serienummer. Fjern eventuelle gamle poster fra din configuration.yaml og i menuen Integrationer, f\u00f8r du fors\u00f8ger at tilf\u00f8je denne enhed igen.", - "host_exists": "Vizio-komponent med v\u00e6rt er allerede konfigureret.", - "name_exists": "Vizio-komponent med navn er allerede konfigureret.", - "updated_entry": "Denne post er allerede konfigureret, men navnet og/eller indstillingerne, der er defineret i konfigurationen, stemmer ikke overens med den tidligere importerede konfiguration, s\u00e5 konfigurationsposten er blevet opdateret i overensstemmelse hermed.", - "updated_options": "Denne post er allerede konfigureret, men indstillingerne, der er defineret i konfigurationen, stemmer ikke overens med de tidligere importerede indstillingsv\u00e6rdier, s\u00e5 konfigurationsposten er blevet opdateret i overensstemmelse hermed.", - "updated_volume_step": "Denne post er allerede konfigureret, men lydstyrketrinst\u00f8rrelsen i konfigurationen stemmer ikke overens med konfigurationsposten, s\u00e5 konfigurationsposten er blevet opdateret i overensstemmelse hermed." + "updated_entry": "Denne post er allerede konfigureret, men navnet og/eller indstillingerne, der er defineret i konfigurationen, stemmer ikke overens med den tidligere importerede konfiguration, s\u00e5 konfigurationsposten er blevet opdateret i overensstemmelse hermed." }, "error": { "cant_connect": "Kunne ikke oprette forbindelse til enheden. [Gennemg\u00e5 dokumentationen] (https://www.home-assistant.io/integrations/vizio/), og bekr\u00e6ft, at: \n - Enheden er t\u00e6ndt \n - Enheden er tilsluttet netv\u00e6rket \n - De angivne v\u00e6rdier er korrekte \n f\u00f8r du fors\u00f8ger at indsende igen.", "host_exists": "Vizio-enhed med den specificerede v\u00e6rt er allerede konfigureret.", - "name_exists": "Vizio-enhed med det specificerede navn er allerede konfigureret.", - "tv_needs_token": "N\u00e5r enhedstypen er 'tv', skal der bruges en gyldig adgangstoken." + "name_exists": "Vizio-enhed med det specificerede navn er allerede konfigureret." }, "step": { "user": { @@ -33,7 +26,6 @@ "step": { "init": { "data": { - "timeout": "Timeout for API-anmodning (sekunder)", "volume_step": "Lydstyrkestrinst\u00f8rrelse" }, "title": "Opdater Vizo SmartCast-indstillinger" diff --git a/homeassistant/components/vizio/.translations/de.json b/homeassistant/components/vizio/.translations/de.json index a3b695269439..2197d27de715 100644 --- a/homeassistant/components/vizio/.translations/de.json +++ b/homeassistant/components/vizio/.translations/de.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Konfigurationsablauf f\u00fcr die Vizio-Komponente wird bereits ausgef\u00fchrt.", "already_setup": "Dieser Eintrag wurde bereits eingerichtet.", - "already_setup_with_diff_host_and_name": "Dieser Eintrag scheint bereits mit einem anderen Host und Namen basierend auf seiner Seriennummer eingerichtet worden zu sein. Bitte entfernen Sie alle alten Eintr\u00e4ge aus Ihrer configuration.yaml und aus dem Men\u00fc Integrationen, bevor Sie erneut versuchen, dieses Ger\u00e4t hinzuzuf\u00fcgen.", - "host_exists": "Vizio-Komponent mit bereits konfiguriertem Host.", - "name_exists": "Vizio-Komponent mit bereits konfiguriertem Namen.", - "updated_entry": "Dieser Eintrag wurde bereits eingerichtet, aber der Name, die Apps und / oder die in der Konfiguration definierten Optionen stimmen nicht mit der zuvor importierten Konfiguration \u00fcberein, sodass der Konfigurationseintrag entsprechend aktualisiert wurde.", - "updated_options": "Dieser Eintrag wurde bereits eingerichtet, aber die in der Konfiguration definierten Optionen stimmen nicht mit den zuvor importierten Optionswerten \u00fcberein, daher wurde der Konfigurationseintrag entsprechend aktualisiert.", - "updated_volume_step": "Dieser Eintrag wurde bereits eingerichtet, aber die Lautst\u00e4rken-Schrittgr\u00f6\u00dfe in der Konfiguration stimmt nicht mit dem Konfigurationseintrag \u00fcberein, sodass der Konfigurationseintrag entsprechend aktualisiert wurde." + "updated_entry": "Dieser Eintrag wurde bereits eingerichtet, aber der Name, die Apps und / oder die in der Konfiguration definierten Optionen stimmen nicht mit der zuvor importierten Konfiguration \u00fcberein, sodass der Konfigurationseintrag entsprechend aktualisiert wurde." }, "error": { "cant_connect": "Es konnte keine Verbindung zum Ger\u00e4t hergestellt werden. [\u00dcberpr\u00fcfen Sie die Dokumentation] (https://www.home-assistant.io/integrations/vizio/) und \u00fcberpr\u00fcfen Sie Folgendes erneut:\n- Das Ger\u00e4t ist eingeschaltet\n- Das Ger\u00e4t ist mit dem Netzwerk verbunden\n- Die von Ihnen eingegebenen Werte sind korrekt\nbevor sie versuchen, erneut zu \u00fcbermitteln.", "complete_pairing failed": "Das Pairing kann nicht abgeschlossen werden. Stellen Sie sicher, dass die von Ihnen angegebene PIN korrekt ist und das Fernsehger\u00e4t weiterhin mit Strom versorgt und mit dem Netzwerk verbunden ist, bevor Sie es erneut versuchen.", "host_exists": "Vizio-Ger\u00e4t mit angegebenem Host bereits konfiguriert.", - "name_exists": "Vizio-Ger\u00e4t mit angegebenem Namen bereits konfiguriert.", - "tv_needs_token": "Wenn der Ger\u00e4tetyp \"TV\" ist, wird ein g\u00fcltiger Zugriffstoken ben\u00f6tigt." + "name_exists": "Vizio-Ger\u00e4t mit angegebenem Namen bereits konfiguriert." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Ihr Vizio SmartCast-Fernseher ist jetzt mit Home Assistant verbunden. \n\n Ihr Zugriffstoken ist '**{access_token}**'.", "title": "Kopplung abgeschlossen" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Apps zum Einschlie\u00dfen oder Ausschlie\u00dfen", - "include_or_exclude": "Apps einschlie\u00dfen oder ausschlie\u00dfen?" - }, - "description": "Wenn Sie \u00fcber ein Smart TV verf\u00fcgen, k\u00f6nnen Sie Ihre Quellliste optional filtern, indem Sie ausw\u00e4hlen, welche Apps in Ihre Quellliste aufgenommen oder ausgeschlossen werden sollen. Sie k\u00f6nnen diesen Schritt f\u00fcr Fernsehger\u00e4te \u00fcberspringen, die keine Apps unterst\u00fctzen.", - "title": "Konfigurieren Sie Apps f\u00fcr Ihr Smart TV" - }, "user": { "data": { "access_token": "Zugangstoken", @@ -50,14 +35,6 @@ }, "description": "Ein Zugriffstoken wird nur f\u00fcr Fernsehger\u00e4te ben\u00f6tigt. Wenn Sie ein Fernsehger\u00e4t konfigurieren und noch kein Zugriffstoken haben, lassen Sie es leer, um einen Pairing-Vorgang durchzuf\u00fchren.", "title": "Richten Sie das Vizio SmartCast-Ger\u00e4t ein" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Apps zum Einschlie\u00dfen oder Ausschlie\u00dfen", - "include_or_exclude": "Apps einschlie\u00dfen oder ausschlie\u00dfen?" - }, - "description": "Wenn Sie \u00fcber ein Smart TV verf\u00fcgen, k\u00f6nnen Sie Ihre Quellliste optional filtern, indem Sie ausw\u00e4hlen, welche Apps in Ihre Quellliste aufgenommen oder ausgeschlossen werden sollen. Sie k\u00f6nnen diesen Schritt f\u00fcr Fernsehger\u00e4te \u00fcberspringen, die keine Apps unterst\u00fctzen.", - "title": "Konfigurieren Sie Apps f\u00fcr Ihr Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Apps zum Einschlie\u00dfen oder Ausschlie\u00dfen", "include_or_exclude": "Apps einschlie\u00dfen oder ausschlie\u00dfen?", - "timeout": "API Request Timeout (Sekunden)", "volume_step": "Lautst\u00e4rken-Schrittgr\u00f6\u00dfe" }, "description": "Wenn Sie \u00fcber ein Smart-TV-Ger\u00e4t verf\u00fcgen, k\u00f6nnen Sie Ihre Quellliste optional filtern, indem Sie ausw\u00e4hlen, welche Apps in Ihre Quellliste aufgenommen oder ausgeschlossen werden sollen.", diff --git a/homeassistant/components/vizio/.translations/en.json b/homeassistant/components/vizio/.translations/en.json index ec82f41c079f..f4b03e1eb82c 100644 --- a/homeassistant/components/vizio/.translations/en.json +++ b/homeassistant/components/vizio/.translations/en.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Config flow for vizio component already in progress.", "already_setup": "This entry has already been setup.", - "already_setup_with_diff_host_and_name": "This entry appears to have already been setup with a different host and name based on its serial number. Please remove any old entries from your configuration.yaml and from the Integrations menu before reattempting to add this device.", - "host_exists": "Vizio component with host already configured.", - "name_exists": "Vizio component with name already configured.", - "updated_entry": "This entry has already been setup but the name, apps, and/or options defined in the configuration do not match the previously imported configuration, so the configuration entry has been updated accordingly.", - "updated_options": "This entry has already been setup but the options defined in the config do not match the previously imported options values so the config entry has been updated accordingly.", - "updated_volume_step": "This entry has already been setup but the volume step size in the config does not match the config entry so the config entry has been updated accordingly." + "updated_entry": "This entry has already been setup but the name, apps, and/or options defined in the configuration do not match the previously imported configuration, so the configuration entry has been updated accordingly." }, "error": { "cant_connect": "Could not connect to the device. [Review the docs](https://www.home-assistant.io/integrations/vizio/) and re-verify that:\n- The device is powered on\n- The device is connected to the network\n- The values you filled in are accurate\nbefore attempting to resubmit.", "complete_pairing failed": "Unable to complete pairing. Ensure the PIN you provided is correct and the TV is still powered and connected to the network before resubmitting.", "host_exists": "Vizio device with specified host already configured.", - "name_exists": "Vizio device with specified name already configured.", - "tv_needs_token": "When Device Type is `tv` then a valid Access Token is needed." + "name_exists": "Vizio device with specified name already configured." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Your Vizio SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'.", "title": "Pairing Complete" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Apps to Include or Exclude", - "include_or_exclude": "Include or Exclude Apps?" - }, - "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list. You can skip this step for TVs that don't support apps.", - "title": "Configure Apps for Smart TV" - }, "user": { "data": { "access_token": "Access Token", @@ -50,14 +35,6 @@ }, "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", "title": "Setup Vizio SmartCast Device" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Apps to Include or Exclude", - "include_or_exclude": "Include or Exclude Apps?" - }, - "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list. You can skip this step for TVs that don't support apps.", - "title": "Configure Apps for Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Apps to Include or Exclude", "include_or_exclude": "Include or Exclude Apps?", - "timeout": "API Request Timeout (seconds)", "volume_step": "Volume Step Size" }, "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", diff --git a/homeassistant/components/vizio/.translations/es.json b/homeassistant/components/vizio/.translations/es.json index 68e855fa5a8e..eb35fbb0b5b7 100644 --- a/homeassistant/components/vizio/.translations/es.json +++ b/homeassistant/components/vizio/.translations/es.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Configurar el flujo para el componente vizio que ya est\u00e1 en marcha.", "already_setup": "Esta entrada ya ha sido configurada.", - "already_setup_with_diff_host_and_name": "Esta entrada parece haber sido ya configurada con un host y un nombre diferentes basados en su n\u00famero de serie. Elimine las entradas antiguas de su archivo configuration.yaml y del men\u00fa Integraciones antes de volver a intentar agregar este dispositivo.", - "host_exists": "Host ya configurado del componente de Vizio", - "name_exists": "Nombre ya configurado del componente de Vizio", - "updated_entry": "Esta entrada ya ha sido configurada pero el nombre y/o las opciones definidas en la configuraci\u00f3n no coinciden con la configuraci\u00f3n previamente importada, por lo que la entrada de la configuraci\u00f3n ha sido actualizada en consecuencia.", - "updated_options": "Esta entrada ya ha sido configurada pero las opciones definidas en la configuraci\u00f3n no coinciden con los valores de las opciones importadas previamente, por lo que la entrada de la configuraci\u00f3n ha sido actualizada en consecuencia.", - "updated_volume_step": "Esta entrada ya ha sido configurada pero el tama\u00f1o del paso de volumen en la configuraci\u00f3n no coincide con la entrada de la configuraci\u00f3n, por lo que la entrada de la configuraci\u00f3n ha sido actualizada en consecuencia." + "updated_entry": "Esta entrada ya ha sido configurada pero el nombre y/o las opciones definidas en la configuraci\u00f3n no coinciden con la configuraci\u00f3n previamente importada, por lo que la entrada de la configuraci\u00f3n ha sido actualizada en consecuencia." }, "error": { "cant_connect": "No se pudo conectar al dispositivo. [Revise los documentos] (https://www.home-assistant.io/integrations/vizio/) y vuelva a verificar que:\n- El dispositivo est\u00e1 encendido\n- El dispositivo est\u00e1 conectado a la red\n- Los valores que ha rellenado son precisos\nantes de intentar volver a enviar.", "complete_pairing failed": "No se pudo completar el emparejamiento. Aseg\u00farate de que el PIN que has proporcionado es correcto y que el televisor sigue encendido y conectado a la red antes de volver a enviarlo.", "host_exists": "El host ya est\u00e1 configurado.", - "name_exists": "Nombre ya configurado.", - "tv_needs_token": "Cuando el tipo de dispositivo es `tv`, se necesita un token de acceso v\u00e1lido." + "name_exists": "Nombre ya configurado." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Su dispositivo Vizio SmartCast TV ahora est\u00e1 conectado a Home Assistant.\n\nEl Token de Acceso es '**{access_token}**'.", "title": "Emparejamiento Completado" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Aplicaciones para incluir o excluir", - "include_or_exclude": "\u00bfIncluir o excluir aplicaciones?" - }, - "description": "Si tiene un Smart TV, opcionalmente puede filtrar su lista de origen eligiendo qu\u00e9 aplicaciones incluir o excluir en su lista de origen. Puede omitir este paso para televisores que no admiten aplicaciones.", - "title": "Configurar aplicaciones para Smart TV" - }, "user": { "data": { "access_token": "Token de acceso", @@ -50,14 +35,6 @@ }, "description": "Todos los campos son obligatorios excepto el Token de Acceso. Si decides no proporcionar un Token de Acceso y tu Tipo de Dispositivo es \"tv\", se te llevar\u00e1 por un proceso de emparejamiento con tu dispositivo para que se pueda recuperar un Token de Acceso.\n\nPara pasar por el proceso de emparejamiento, antes de pulsar en Enviar, aseg\u00farese de que tu TV est\u00e9 encendida y conectada a la red. Tambi\u00e9n es necesario poder ver la pantalla.", "title": "Configurar el cliente de Vizio SmartCast" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Aplicaciones para incluir o excluir", - "include_or_exclude": "\u00bfIncluir o excluir aplicaciones?" - }, - "description": "Si tienes un Smart TV, puedes opcionalmente filtrar tu lista de fuentes eligiendo qu\u00e9 aplicaciones incluir o excluir en tu lista de fuentes. Puedes omitir este paso para televisores que no admiten aplicaciones.", - "title": "Configurar aplicaciones para Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Aplicaciones para incluir o excluir", "include_or_exclude": "\u00bfIncluir o excluir aplicaciones?", - "timeout": "Tiempo de espera de solicitud de API (segundos)", "volume_step": "Tama\u00f1o del paso de volumen" }, "description": "Si tienes un Smart TV, opcionalmente puedes filtrar su lista de fuentes eligiendo qu\u00e9 aplicaciones incluir o excluir en su lista de fuentes.", diff --git a/homeassistant/components/vizio/.translations/fr.json b/homeassistant/components/vizio/.translations/fr.json index bf672e9dfb98..0c0ff56af69f 100644 --- a/homeassistant/components/vizio/.translations/fr.json +++ b/homeassistant/components/vizio/.translations/fr.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Flux de configuration pour le composant Vizio d\u00e9j\u00e0 en cours.", "already_setup": "Cette entr\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e.", - "already_setup_with_diff_host_and_name": "Cette entr\u00e9e semble avoir d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e avec un h\u00f4te et un nom diff\u00e9rents en fonction de son num\u00e9ro de s\u00e9rie. Veuillez supprimer toutes les anciennes entr\u00e9es de votre configuration.yaml et du menu Int\u00e9grations avant de r\u00e9essayer d'ajouter ce p\u00e9riph\u00e9rique.", - "host_exists": "Composant Vizio avec h\u00f4te d\u00e9j\u00e0 configur\u00e9.", - "name_exists": "Composant Vizio dont le nom est d\u00e9j\u00e0 configur\u00e9.", - "updated_entry": "Cette entr\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e mais le nom et/ou les options d\u00e9finis dans la configuration ne correspondent pas \u00e0 la configuration pr\u00e9c\u00e9demment import\u00e9e, de sorte que l'entr\u00e9e de configuration a \u00e9t\u00e9 mise \u00e0 jour en cons\u00e9quence.", - "updated_options": "Cette entr\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e mais les options d\u00e9finies dans la configuration ne correspondent pas aux valeurs des options pr\u00e9c\u00e9demment import\u00e9es, de sorte que l'entr\u00e9e de configuration a \u00e9t\u00e9 mise \u00e0 jour en cons\u00e9quence.", - "updated_volume_step": "Cette entr\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e, mais la taille du pas du volume dans la configuration ne correspond pas \u00e0 l'entr\u00e9e de configuration, de sorte que l'entr\u00e9e de configuration a \u00e9t\u00e9 mise \u00e0 jour en cons\u00e9quence." + "updated_entry": "Cette entr\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9e mais le nom et/ou les options d\u00e9finis dans la configuration ne correspondent pas \u00e0 la configuration pr\u00e9c\u00e9demment import\u00e9e, de sorte que l'entr\u00e9e de configuration a \u00e9t\u00e9 mise \u00e0 jour en cons\u00e9quence." }, "error": { "cant_connect": "Impossible de se connecter \u00e0 l'appareil. [V\u00e9rifier les documents](https://www.home-assistant.io/integrations/vizio/) et rev\u00e9rifier que:\n- L'appareil est sous tension\n- L'appareil est connect\u00e9 au r\u00e9seau\n- Les valeurs que vous avez saisies sont exactes\navant d'essayer de le soumettre \u00e0 nouveau.", "complete_pairing failed": "Impossible de terminer l'appariement. Assurez-vous que le code PIN que vous avez fourni est correct et que le t\u00e9l\u00e9viseur est toujours aliment\u00e9 et connect\u00e9 au r\u00e9seau avant de soumettre \u00e0 nouveau.", "host_exists": "H\u00f4te d\u00e9j\u00e0 configur\u00e9.", - "name_exists": "Nom d\u00e9j\u00e0 configur\u00e9.", - "tv_needs_token": "Lorsque le type de p\u00e9riph\u00e9rique est \" TV \", un jeton d'acc\u00e8s valide est requis." + "name_exists": "Nom d\u00e9j\u00e0 configur\u00e9." }, "step": { "pair_tv": { @@ -31,13 +24,6 @@ "pairing_complete_import": { "title": "Appairage termin\u00e9" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Applications \u00e0 inclure ou \u00e0 exclure", - "include_or_exclude": "Inclure ou exclure des applications?" - }, - "title": "Configurer les applications pour Smart TV" - }, "user": { "data": { "access_token": "Jeton d'acc\u00e8s", @@ -47,13 +33,6 @@ }, "description": "Un jeton d'acc\u00e8s n'est n\u00e9cessaire que pour les t\u00e9l\u00e9viseurs. Si vous configurez un t\u00e9l\u00e9viseur et que vous n'avez pas encore de jeton d'acc\u00e8s, laissez-le vide pour passer par un processus de couplage.", "title": "Configurer le client Vizio SmartCast" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Applications \u00e0 inclure ou \u00e0 exclure", - "include_or_exclude": "Inclure ou exclure des applications?" - }, - "title": "Configurer les applications pour Smart TV" } }, "title": "Vizio SmartCast" @@ -64,7 +43,6 @@ "data": { "apps_to_include_or_exclude": "Applications \u00e0 inclure ou \u00e0 exclure", "include_or_exclude": "Inclure ou exclure des applications?", - "timeout": "D\u00e9lai d'expiration de la demande d'API (secondes)", "volume_step": "Taille du pas de volume" }, "description": "Si vous avez une Smart TV, vous pouvez \u00e9ventuellement filtrer votre liste de sources en choisissant les applications \u00e0 inclure ou \u00e0 exclure dans votre liste de sources.", diff --git a/homeassistant/components/vizio/.translations/hu.json b/homeassistant/components/vizio/.translations/hu.json index 7cbbe5fdf11f..c8b74f33e3d2 100644 --- a/homeassistant/components/vizio/.translations/hu.json +++ b/homeassistant/components/vizio/.translations/hu.json @@ -1,20 +1,13 @@ { "config": { "abort": { - "already_in_progress": "A vizio komponens konfigur\u00e1ci\u00f3s folyamata m\u00e1r folyamatban van.", "already_setup": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva.", - "already_setup_with_diff_host_and_name": "\u00dagy t\u0171nik, hogy ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva egy m\u00e1sik \u00e1llom\u00e1ssal \u00e9s n\u00e9vvel a sorozatsz\u00e1ma alapj\u00e1n. T\u00e1vol\u00edtsa el a r\u00e9gi bejegyz\u00e9seket a configuration.yaml \u00e9s az Integr\u00e1ci\u00f3k men\u00fcb\u0151l, miel\u0151tt \u00fajra megpr\u00f3b\u00e1ln\u00e1 hozz\u00e1adni ezt az eszk\u00f6zt.", - "host_exists": "Vizio-\u00f6sszetev\u0151, amelynek az kiszolg\u00e1l\u00f3neve m\u00e1r konfigur\u00e1lva van.", - "name_exists": "Vizio-\u00f6sszetev\u0151, amelynek neve m\u00e1r konfigur\u00e1lva van.", - "updated_entry": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban defini\u00e1lt n\u00e9v, appok \u00e9s/vagy be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt konfigur\u00e1ci\u00f3val, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt.", - "updated_options": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban megadott be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt be\u00e1ll\u00edt\u00e1si \u00e9rt\u00e9kekkel, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt.", - "updated_volume_step": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban l\u00e9v\u0151 henger\u0151l\u00e9p\u00e9s m\u00e9rete nem egyezik meg a konfigur\u00e1ci\u00f3s bejegyz\u00e9ssel, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt." + "updated_entry": "Ez a bejegyz\u00e9s m\u00e1r be van \u00e1ll\u00edtva, de a konfigur\u00e1ci\u00f3ban defini\u00e1lt n\u00e9v, appok \u00e9s/vagy be\u00e1ll\u00edt\u00e1sok nem egyeznek meg a kor\u00e1bban import\u00e1lt konfigur\u00e1ci\u00f3val, \u00edgy a konfigur\u00e1ci\u00f3s bejegyz\u00e9s ennek megfelel\u0151en friss\u00fclt." }, "error": { "cant_connect": "Nem lehetett csatlakozni az eszk\u00f6zh\u00f6z. [Tekintsd \u00e1t a dokumentumokat] (https://www.home-assistant.io/integrations/vizio/) \u00e9s \u00fajra ellen\u0151rizd, hogy:\n- A k\u00e9sz\u00fcl\u00e9k be van kapcsolva\n- A k\u00e9sz\u00fcl\u00e9k csatlakozik a h\u00e1l\u00f3zathoz\n- A kit\u00f6lt\u00f6tt \u00e9rt\u00e9kek pontosak\nmiel\u0151tt \u00fajra elk\u00fclden\u00e9d.", "host_exists": "A megadott kiszolg\u00e1l\u00f3n\u00e9vvel rendelkez\u0151 Vizio-eszk\u00f6z m\u00e1r konfigur\u00e1lva van.", - "name_exists": "A megadott n\u00e9vvel rendelkez\u0151 Vizio-eszk\u00f6z m\u00e1r konfigur\u00e1lva van.", - "tv_needs_token": "Ha az eszk\u00f6z t\u00edpusa \"tv\", akkor \u00e9rv\u00e9nyes hozz\u00e1f\u00e9r\u00e9si tokenre van sz\u00fcks\u00e9g." + "name_exists": "A megadott n\u00e9vvel rendelkez\u0151 Vizio-eszk\u00f6z m\u00e1r konfigur\u00e1lva van." }, "step": { "user": { @@ -32,7 +25,6 @@ "step": { "init": { "data": { - "timeout": "API-k\u00e9r\u00e9s id\u0151t\u00fall\u00e9p\u00e9se (m\u00e1sodpercben)", "volume_step": "Hanger\u0151 l\u00e9p\u00e9s nagys\u00e1ga" }, "title": "Friss\u00edtse a Vizo SmartCast be\u00e1ll\u00edt\u00e1sokat" diff --git a/homeassistant/components/vizio/.translations/it.json b/homeassistant/components/vizio/.translations/it.json index eef86bf78cba..4a26a40ad56a 100644 --- a/homeassistant/components/vizio/.translations/it.json +++ b/homeassistant/components/vizio/.translations/it.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Il flusso di configurazione per vizio \u00e8 gi\u00e0 in corso.", "already_setup": "Questa voce \u00e8 gi\u00e0 stata configurata.", - "already_setup_with_diff_host_and_name": "Sembra che questa voce sia gi\u00e0 stata configurata con un host e un nome diversi in base al suo numero seriale. Rimuovere eventuali voci precedenti da configuration.yaml e dal menu Integrazioni prima di tentare nuovamente di aggiungere questo dispositivo.", - "host_exists": "Componente Vizio con host gi\u00e0 configurato.", - "name_exists": "Componente Vizio con nome gi\u00e0 configurato.", - "updated_entry": "Questa voce \u00e8 gi\u00e0 stata configurata, ma il nome, le app e/o le opzioni definite nella configurazione non corrispondono alla configurazione importata in precedenza, pertanto la voce di configurazione \u00e8 stata aggiornata di conseguenza.", - "updated_options": "Questa voce \u00e8 gi\u00e0 stata impostata, ma le opzioni definite nella configurazione non corrispondono ai valori delle opzioni importate in precedenza, quindi la voce di configurazione \u00e8 stata aggiornata di conseguenza.", - "updated_volume_step": "Questa voce \u00e8 gi\u00e0 stata impostata, ma la dimensione del passo del volume nella configurazione non corrisponde alla voce di configurazione, quindi \u00e8 stata aggiornata di conseguenza." + "updated_entry": "Questa voce \u00e8 gi\u00e0 stata configurata, ma il nome, le app e/o le opzioni definite nella configurazione non corrispondono alla configurazione importata in precedenza, pertanto la voce di configurazione \u00e8 stata aggiornata di conseguenza." }, "error": { "cant_connect": "Impossibile connettersi al dispositivo. [Esamina i documenti] (https://www.home-assistant.io/integrations/vizio/) e verifica nuovamente che: \n - Il dispositivo sia acceso \n - Il dispositivo sia collegato alla rete \n - I valori inseriti siano corretti \n prima di ritentare.", "complete_pairing failed": "Impossibile completare l'associazione. Assicurarsi che il PIN fornito sia corretto e che il televisore sia ancora alimentato e connesso alla rete prima di inviarlo di nuovo.", "host_exists": "Dispositivo Vizio con host specificato gi\u00e0 configurato.", - "name_exists": "Dispositivo Vizio con il nome specificato gi\u00e0 configurato.", - "tv_needs_token": "Quando Device Type \u00e8 `tv`, \u00e8 necessario un token di accesso valido." + "name_exists": "Dispositivo Vizio con il nome specificato gi\u00e0 configurato." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Il dispositivo Vizio SmartCast TV \u00e8 ora connesso a Home Assistant. \n\nIl tuo Token di Accesso \u00e8 '**{access_token}**'.", "title": "Associazione completata" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "App da includere o escludere", - "include_or_exclude": "Includere o Escludere le App?" - }, - "description": "Se si dispone di una Smart TV, \u00e8 possibile filtrare facoltativamente l'elenco di origine scegliendo le app da includere o escludere in esso. \u00c8 possibile saltare questo passaggio per i televisori che non supportano le app.", - "title": "Configura le app per Smart TV" - }, "user": { "data": { "access_token": "Token di accesso", @@ -50,14 +35,6 @@ }, "description": "Un Token di Accesso \u00e8 necessario solo per i televisori. Se si sta configurando un televisore e non si dispone ancora di un Token di Accesso, lasciarlo vuoto per passare attraverso un processo di associazione.", "title": "Configurazione del dispositivo SmartCast Vizio" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "App da Includere o Escludere", - "include_or_exclude": "Includere o Escludere le App?" - }, - "description": "Se si dispone di una Smart TV, \u00e8 possibile filtrare facoltativamente l'elenco di origine scegliendo le app da includere o escludere in esso. \u00c8 possibile saltare questo passaggio per i televisori che non supportano le app.", - "title": "Configura le app per Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "App da includere o escludere", "include_or_exclude": "Includere o escludere app?", - "timeout": "Timeout richiesta API (secondi)", "volume_step": "Dimensione del passo del volume" }, "description": "Se si dispone di una Smart TV, \u00e8 possibile filtrare l'elenco di origine scegliendo le app da includere o escludere in esso.", diff --git a/homeassistant/components/vizio/.translations/ko.json b/homeassistant/components/vizio/.translations/ko.json index 33edb72733ad..df2fb243f886 100644 --- a/homeassistant/components/vizio/.translations/ko.json +++ b/homeassistant/components/vizio/.translations/ko.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "vizio \uad6c\uc131 \uc694\uc18c\uc5d0 \ub300\ud55c \uad6c\uc131 \ud50c\ub85c\uc6b0\uac00 \uc774\ubbf8 \uc9c4\ud589 \uc911\uc785\ub2c8\ub2e4.", "already_setup": "\uc774 \ud56d\ubaa9\uc740 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "already_setup_with_diff_host_and_name": "\uc774 \ud56d\ubaa9\uc740 \uc2dc\ub9ac\uc5bc \ubc88\ud638\ub85c \ub2e4\ub978 \ud638\uc2a4\ud2b8 \ubc0f \uc774\ub984\uc73c\ub85c \uc774\ubbf8 \uc124\uc815\ub418\uc5b4\uc788\ub294 \uac83\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4. \uc774 \uae30\uae30\ub97c \ucd94\uac00\ud558\uae30 \uc804\uc5d0 configuration.yaml \ubc0f \ud1b5\ud569 \uad6c\uc131\uc694\uc18c \uba54\ub274\uc5d0\uc11c \uc774\uc804 \ud56d\ubaa9\uc744 \uc81c\uac70\ud574\uc8fc\uc138\uc694.", - "host_exists": "\ud574\ub2f9 \ud638\uc2a4\ud2b8\uc758 Vizio \uad6c\uc131 \uc694\uc18c\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "name_exists": "\ud574\ub2f9 \uc774\ub984\uc758 Vizio \uad6c\uc131 \uc694\uc18c\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "updated_entry": "\uc774 \ud56d\ubaa9\uc740 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc9c0\ub9cc \uad6c\uc131\uc5d0 \uc815\uc758\ub41c \uc774\ub984, \uc571 \ud639\uc740 \uc635\uc158\uc774 \uc774\uc804\uc5d0 \uac00\uc838\uc628 \uad6c\uc131 \ub0b4\uc6a9\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uad6c\uc131 \ud56d\ubaa9\uc774 \uadf8\uc5d0 \ub530\ub77c \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "updated_options": "\uc774 \ud56d\ubaa9\uc740 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc9c0\ub9cc \uad6c\uc131\uc5d0 \uc815\uc758\ub41c \uc635\uc158\uc774 \uc774\uc804\uc5d0 \uac00\uc838\uc628 \uc635\uc158 \uac12\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uad6c\uc131 \ud56d\ubaa9\uc774 \uadf8\uc5d0 \ub530\ub77c \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "updated_volume_step": "\uc774 \ud56d\ubaa9\uc740 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc9c0\ub9cc \uad6c\uc131\uc758 \ubcfc\ub968 \ub2e8\uacc4 \ud06c\uae30\uac00 \uad6c\uc131 \ud56d\ubaa9\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uad6c\uc131 \ud56d\ubaa9\uc774 \uadf8\uc5d0 \ub530\ub77c \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4." + "updated_entry": "\uc774 \ud56d\ubaa9\uc740 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc9c0\ub9cc \uad6c\uc131\uc5d0 \uc815\uc758\ub41c \uc774\ub984, \uc571 \ud639\uc740 \uc635\uc158\uc774 \uc774\uc804\uc5d0 \uac00\uc838\uc628 \uad6c\uc131 \ub0b4\uc6a9\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uad6c\uc131 \ud56d\ubaa9\uc774 \uadf8\uc5d0 \ub530\ub77c \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4." }, "error": { "cant_connect": "\uae30\uae30\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. [\uc548\ub0b4\ub97c \ucc38\uace0] (https://www.home-assistant.io/integrations/vizio/)\ud558\uace0 \uc591\uc2dd\uc744 \ub2e4\uc2dc \uc81c\ucd9c\ud558\uae30 \uc804\uc5d0 \ub2e4\uc74c\uc744 \ub2e4\uc2dc \ud655\uc778\ud574\uc8fc\uc138\uc694.\n- \uae30\uae30 \uc804\uc6d0\uc774 \ucf1c\uc838 \uc788\uc2b5\ub2c8\uae4c?\n- \uae30\uae30\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc2b5\ub2c8\uae4c?\n- \uc785\ub825\ud55c \ub0b4\uc6a9\uc774 \uc62c\ubc14\ub985\ub2c8\uae4c?", "complete_pairing failed": "\ud398\uc5b4\ub9c1\uc744 \uc644\ub8cc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc785\ub825\ud55c PIN \uc774 \uc62c\ubc14\ub978\uc9c0 \ud655\uc778\ud558\uace0 \ub2e4\uc74c \uacfc\uc815\uc744 \uc9c4\ud589\ud558\uae30 \uc804\uc5d0 TV \uc758 \uc804\uc6d0\uc774 \ucf1c\uc838 \uc788\uace0 \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud574\uc8fc\uc138\uc694.", "host_exists": "\uc124\uc815\ub41c \ud638\uc2a4\ud2b8\uc758 Vizio \uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "name_exists": "\uc124\uc815\ub41c \uc774\ub984\uc758 Vizio \uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "tv_needs_token": "\uae30\uae30 \uc720\ud615\uc774 'tv' \uc778 \uacbd\uc6b0 \uc720\ud6a8\ud55c \uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \ud544\uc694\ud569\ub2c8\ub2e4." + "name_exists": "\uc124\uc815\ub41c \uc774\ub984\uc758 Vizio \uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Vizio SmartCast TV \uac00 Home Assistant \uc5d0 \uc5f0\uacb0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \n\n\uc561\uc138\uc2a4 \ud1a0\ud070\uc740 '**{access_token}**' \uc785\ub2c8\ub2e4.", "title": "\ud398\uc5b4\ub9c1 \uc644\ub8cc" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "\ud3ec\ud568 \ub610\ub294 \uc81c\uc678 \ud560 \uc571", - "include_or_exclude": "\uc571\uc744 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?" - }, - "description": "\uc2a4\ub9c8\ud2b8 TV \uac00 \uc788\ub294 \uacbd\uc6b0 \uc120\ud0dd\uc0ac\ud56d\uc73c\ub85c \uc18c\uc2a4 \ubaa9\ub85d\uc5d0 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud560 \uc571\uc744 \uc120\ud0dd\ud558\uc5ec \uc18c\uc2a4 \ubaa9\ub85d\uc744 \ud544\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc571\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 TV\uc758 \uacbd\uc6b0 \uc774 \ub2e8\uacc4\ub97c \uac74\ub108\ub6f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "title": "\uc2a4\ub9c8\ud2b8 TV \uc6a9 \uc571 \uad6c\uc131" - }, "user": { "data": { "access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070", @@ -50,14 +35,6 @@ }, "description": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc740 TV \uc5d0\ub9cc \ud544\uc694\ud569\ub2c8\ub2e4. TV \ub97c \uad6c\uc131\ud558\uace0 \uc788\uace0 \uc544\uc9c1 \uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \uc5c6\ub294 \uacbd\uc6b0 \ud398\uc5b4\ub9c1 \uacfc\uc815\uc744 \uc9c4\ud589\ud558\ub824\uba74 \ube44\uc6cc\ub450\uc138\uc694.", "title": "Vizio SmartCast \uae30\uae30 \uc124\uc815" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "\ud3ec\ud568 \ub610\ub294 \uc81c\uc678 \ud560 \uc571", - "include_or_exclude": "\uc571\uc744 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?" - }, - "description": "\uc2a4\ub9c8\ud2b8 TV \uac00 \uc788\ub294 \uacbd\uc6b0 \uc120\ud0dd\uc0ac\ud56d\uc73c\ub85c \uc18c\uc2a4 \ubaa9\ub85d\uc5d0 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud560 \uc571\uc744 \uc120\ud0dd\ud558\uc5ec \uc18c\uc2a4 \ubaa9\ub85d\uc744 \ud544\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc571\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 TV\uc758 \uacbd\uc6b0 \uc774 \ub2e8\uacc4\ub97c \uac74\ub108\ub6f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "title": "\uc2a4\ub9c8\ud2b8 TV \uc6a9 \uc571 \uad6c\uc131" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "\ud3ec\ud568 \ub610\ub294 \uc81c\uc678 \ud560 \uc571", "include_or_exclude": "\uc571\uc744 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "timeout": "API \uc694\uccad \uc2dc\uac04 \ucd08\uacfc (\ucd08)", "volume_step": "\ubcfc\ub968 \ub2e8\uacc4 \ud06c\uae30" }, "description": "\uc2a4\ub9c8\ud2b8 TV \uac00 \uc788\ub294 \uacbd\uc6b0 \uc120\ud0dd\uc0ac\ud56d\uc73c\ub85c \uc18c\uc2a4 \ubaa9\ub85d\uc5d0 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud560 \uc571\uc744 \uc120\ud0dd\ud558\uc5ec \uc18c\uc2a4 \ubaa9\ub85d\uc744 \ud544\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", diff --git a/homeassistant/components/vizio/.translations/lb.json b/homeassistant/components/vizio/.translations/lb.json index b37f7fda4a55..3146c8756a8a 100644 --- a/homeassistant/components/vizio/.translations/lb.json +++ b/homeassistant/components/vizio/.translations/lb.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Konfiguratioun's Oflaf fir Vizio Komponent ass schonn am gaangen.", "already_setup": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert.", - "already_setup_with_diff_host_and_name": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert mat engem aneren Host an Numm bas\u00e9ierend unhand vu\u00a0senger Seriennummer. L\u00e4scht w.e.g. al Entr\u00e9e vun \u00e4rer configuration.yaml a\u00a0vum Integratioun's Men\u00fc ier dir prob\u00e9iert d\u00ebsen Apparate r\u00ebm b\u00e4i ze setzen.", - "host_exists": "Vizio Komponent mam Host ass schon konfigur\u00e9iert.", - "name_exists": "Vizio Komponent mam Numm ass scho konfigur\u00e9iert.", - "updated_entry": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert mee d\u00e9i defin\u00e9ierten Numm an/oder Optiounen an der Konfiguratioun st\u00ebmmen net mat deene virdrun import\u00e9ierten Optiounen iwwereneen, esou gouf d'Entr\u00e9e deementspriechend aktualis\u00e9iert.", - "updated_options": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert mee d\u00e9i defin\u00e9iert Optiounen an der Konfiguratioun st\u00ebmmen net mat deene virdrun import\u00e9ierten Optiounen iwwereneen, esou gouf d'Entr\u00e9e deementspriechend aktualis\u00e9iert.", - "updated_volume_step": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert mee d\u00e9i defin\u00e9iert Lautst\u00e4erkt Schr\u00ebtt Gr\u00e9isst an der Konfiguratioun st\u00ebmmt net mat der Konfiguratioun iwwereneen, esou gouf d'Entr\u00e9e deementspriechend aktualis\u00e9iert." + "updated_entry": "D\u00ebs Entr\u00e9e ass scho konfigur\u00e9iert mee d\u00e9i defin\u00e9ierten Numm an/oder Optiounen an der Konfiguratioun st\u00ebmmen net mat deene virdrun import\u00e9ierten Optiounen iwwereneen, esou gouf d'Entr\u00e9e deementspriechend aktualis\u00e9iert." }, "error": { "cant_connect": "Konnt sech net mam Apparat verbannen. [Iwwerpr\u00e9ift Dokumentatioun] (https://www.home-assistant.io/integrations/vizio/) a stellt s\u00e9cher dass:\n- Den Apparat ass un\n- Den Apparat ass mam Netzwierk verbonnen\n- D'Optiounen d\u00e9i dir aginn hutt si korrekt\nier dir d'Verbindung nees prob\u00e9iert", "complete_pairing failed": "Feeler beim ofschl\u00e9isse vun der Kopplung. Iwwerpr\u00e9if dass de PIN korrekt an da de Fernsee nach \u00ebmmer ugeschalt a mam Netzwierk verbonnen ass ier de n\u00e4chste Versuch gestart g\u00ebtt.", "host_exists": "Vizio Apparat mat d\u00ebsem Host ass scho konfigur\u00e9iert.", - "name_exists": "Vizio Apparat mat d\u00ebsen Numm ass scho konfigur\u00e9iert.", - "tv_needs_token": "Wann den Typ vum Apparat `tv`ass da g\u00ebtt ee g\u00ebltegen Acc\u00e8s Jeton ben\u00e9idegt." + "name_exists": "Vizio Apparat mat d\u00ebsen Numm ass scho konfigur\u00e9iert." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "D\u00e4in Visio SmartCast Apparat ass elo mam Home Assistant verbonnen.\n\nD\u00e4in Acc\u00e8s Jeton ass '**{access_token}**'.", "title": "Kopplung ofgeschloss" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Apps fir mat abegr\u00e4ifen oder auszeschl\u00e9issen", - "include_or_exclude": "Apps mat abez\u00e9ien oder auschl\u00e9issen?" - }, - "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn. D\u00ebse Schratt kann iwwerspronge ginn fir TV's d\u00e9i keng Apps support\u00e9ieren.", - "title": "Apps fir Smart TV konfigur\u00e9ieren" - }, "user": { "data": { "access_token": "Acc\u00e8ss Jeton", @@ -48,16 +33,8 @@ "host": ":", "name": "Numm" }, - "description": "All Felder sinn noutwendeg ausser Acc\u00e8s Jeton. Wann keen Acc\u00e8s Jeton uginn ass, an den Typ vun Apparat ass 'TV', da g\u00ebtt e Kopplungs Prozess mam Apparat gestart fir een Acc\u00e8s Jeton z'erstellen.\n\nFir de Kopplung Prozess ofzesch\u00e9issen,ier op \"ofsch\u00e9cken\" klickt, pr\u00e9ift datt de Fernsee ugeschalt a mam Netzwierk verbonnen ass. Du muss och k\u00ebnnen op de Bildschierm gesinn.", - "title": "Vizo Smartcast ariichten" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Apps fir mat abegr\u00e4ifen oder auszeschl\u00e9issen", - "include_or_exclude": "Apps mat abez\u00e9ien oder auschl\u00e9issen?" - }, - "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn. D\u00ebse Schratt kann iwwerspronge ginn fir TV's d\u00e9i keng Apps support\u00e9ieren.", - "title": "Apps fir Smart TV konfigur\u00e9ieren" + "description": "Een Access Jeton g\u00ebtt nn\u00ebmme fir Fernseher gebraucht. Wann Dir e Fernseh konfigur\u00e9iert a keen Access Jeton hutt, da loosst et eidel fir duerch dee Pairing Prozess ze goen.", + "title": "Vizo Smartcast Apparat ariichten" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Apps fir mat abegr\u00e4ifen oder auszeschl\u00e9issen", "include_or_exclude": "Apps mat abez\u00e9ien oder auschl\u00e9issen?", - "timeout": "Z\u00e4itiwwerscheidung bei der Ufro vun der API (sekonnen)", "volume_step": "Lautst\u00e4erkt Schr\u00ebtt Gr\u00e9isst" }, "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn.", diff --git a/homeassistant/components/vizio/.translations/nl.json b/homeassistant/components/vizio/.translations/nl.json index bbc95d73bbc9..797836e01456 100644 --- a/homeassistant/components/vizio/.translations/nl.json +++ b/homeassistant/components/vizio/.translations/nl.json @@ -1,20 +1,13 @@ { "config": { "abort": { - "already_in_progress": "Configuratie stroom voor vizio component al in uitvoering.", "already_setup": "Dit item is al ingesteld.", - "already_setup_with_diff_host_and_name": "Dit item lijkt al te zijn ingesteld met een andere host en naam op basis van het serienummer. Verwijder alle oude vermeldingen uit uw configuratie.yaml en uit het menu Integraties voordat u opnieuw probeert dit apparaat toe te voegen.", - "host_exists": "Vizio apparaat met opgegeven host al geconfigureerd.", - "name_exists": "Vizio apparaat met opgegeven naam al geconfigureerd.", - "updated_entry": "Dit item is al ingesteld, maar de naam en/of opties die zijn gedefinieerd in de configuratie komen niet overeen met de eerder ge\u00efmporteerde configuratie, dus het configuratie-item is dienovereenkomstig bijgewerkt.", - "updated_options": "Dit item is al ingesteld, maar de opties die in de configuratie zijn gedefinieerd komen niet overeen met de eerder ge\u00efmporteerde optiewaarden, dus de configuratie-invoer is dienovereenkomstig bijgewerkt.", - "updated_volume_step": "Dit item is al ingesteld, maar de volumestapgrootte in de configuratie komt niet overeen met het configuratie-item, dus het configuratie-item is dienovereenkomstig bijgewerkt." + "updated_entry": "Dit item is al ingesteld, maar de naam en/of opties die zijn gedefinieerd in de configuratie komen niet overeen met de eerder ge\u00efmporteerde configuratie, dus het configuratie-item is dienovereenkomstig bijgewerkt." }, "error": { "cant_connect": "Kan geen verbinding maken met het apparaat. [Bekijk de documenten] (https://www.home-assistant.io/integrations/vizio/) en controleer of:\n- Het apparaat is ingeschakeld\n- Het apparaat is aangesloten op het netwerk\n- De waarden die u ingevuld correct zijn\nvoordat u weer probeert om opnieuw in te dienen.", "host_exists": "Vizio apparaat met opgegeven host al geconfigureerd.", - "name_exists": "Vizio apparaat met opgegeven naam al geconfigureerd.", - "tv_needs_token": "Wanneer het apparaattype `tv` is, dan is er een geldig toegangstoken nodig." + "name_exists": "Vizio apparaat met opgegeven naam al geconfigureerd." }, "step": { "user": { @@ -33,7 +26,6 @@ "step": { "init": { "data": { - "timeout": "Time-out van API-aanvragen (seconden)", "volume_step": "Volume Stapgrootte" }, "title": "Update Vizo SmartCast Opties" diff --git a/homeassistant/components/vizio/.translations/no.json b/homeassistant/components/vizio/.translations/no.json index 6391ac20aa73..65e96945e466 100644 --- a/homeassistant/components/vizio/.translations/no.json +++ b/homeassistant/components/vizio/.translations/no.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Konfigurasjons flyt for Vizio komponent er allerede i gang.", "already_setup": "Denne oppf\u00f8ringen er allerede konfigurert.", - "already_setup_with_diff_host_and_name": "Denne oppf\u00f8ringen ser ut til \u00e5 allerede v\u00e6re konfigurert med en annen vert og navn basert p\u00e5 serienummeret. Fjern den gamle oppf\u00f8ringer fra konfigurasjonen.yaml og fra integrasjonsmenyen f\u00f8r du pr\u00f8ver ut \u00e5 legge til denne enheten p\u00e5 nytt.", - "host_exists": "Vizio komponent med vert allerede konfigurert.", - "name_exists": "Vizio-komponent med navn som allerede er konfigurert.", - "updated_entry": "Dette innlegget har allerede v\u00e6rt oppsett, men navnet, apps, og/eller alternativer som er definert i konfigurasjon som ikke stemmer med det som tidligere er importert konfigurasjon, s\u00e5 konfigurasjonen innlegget har blitt oppdatert i henhold til dette.", - "updated_options": "Denne oppf\u00f8ringen er allerede konfigurert, men alternativene som er definert i konfigurasjonen samsvarer ikke med de tidligere importerte alternativverdiene, s\u00e5 konfigurasjonsoppf\u00f8ringen er oppdatert deretter.", - "updated_volume_step": "Denne oppf\u00f8ringen er allerede konfigurert, men volumstrinnst\u00f8rrelsen i konfigurasjonen samsvarer ikke med konfigurasjonsoppf\u00f8ringen, s\u00e5 konfigurasjonsoppf\u00f8ringen er oppdatert deretter." + "updated_entry": "Dette innlegget har allerede v\u00e6rt oppsett, men navnet, apps, og/eller alternativer som er definert i konfigurasjon som ikke stemmer med det som tidligere er importert konfigurasjon, s\u00e5 konfigurasjonen innlegget har blitt oppdatert i henhold til dette." }, "error": { "cant_connect": "Kunne ikke koble til enheten. [Se gjennom dokumentene] (https://www.home-assistant.io/integrations/vizio/) og bekreft at: \n - Enheten er sl\u00e5tt p\u00e5 \n - Enheten er koblet til nettverket \n - Verdiene du fylte ut er n\u00f8yaktige \n f\u00f8r du pr\u00f8ver \u00e5 sende inn p\u00e5 nytt.", "complete_pairing failed": "Kan ikke fullf\u00f8re sammenkoblingen. Forsikre deg om at PIN-koden du oppga er riktig, og at TV-en fortsatt er p\u00e5 og tilkoblet nettverket f\u00f8r du sender inn p\u00e5 nytt.", "host_exists": "Vizio-enhet med spesifisert vert allerede konfigurert.", - "name_exists": "Vizio-enhet med spesifisert navn allerede konfigurert.", - "tv_needs_token": "N\u00e5r enhetstype er `tv`, er det n\u00f8dvendig med en gyldig tilgangstoken." + "name_exists": "Vizio-enhet med spesifisert navn allerede konfigurert." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Din Vizio SmartCast TV er n\u00e5 koblet til Home Assistant.\n\nTilgangstokenet er **{access_token}**.", "title": "Sammenkoblingen Er Fullf\u00f8rt" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Apper \u00e5 inkludere eller ekskludere", - "include_or_exclude": "Inkluder eller ekskludere apper?" - }, - "description": "Hvis du har en Smart TV, kan du eventuelt filtrere kildelisten din ved \u00e5 velge hvilke apper du vil inkludere eller ekskludere i kildelisten. Du kan hoppe over dette trinnet for TV-er som ikke st\u00f8tter apper.", - "title": "Konfigurere Apper for Smart TV" - }, "user": { "data": { "access_token": "Tilgangstoken", @@ -50,14 +35,6 @@ }, "description": "En tilgangstoken er bare n\u00f8dvendig for TV-er. Hvis du konfigurerer en TV og ikke har tilgangstoken enn\u00e5, m\u00e5 du la den st\u00e5 tom for \u00e5 g\u00e5 gjennom en sammenkoblingsprosess.", "title": "Sett opp Vizio SmartCast-enhet" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Apper \u00e5 inkludere eller ekskludere", - "include_or_exclude": "Inkluder eller ekskludere apper?" - }, - "description": "Hvis du har en Smart TV, kan du eventuelt filtrere kildelisten din ved \u00e5 velge hvilke apper du vil inkludere eller ekskludere i kildelisten. Du kan hoppe over dette trinnet for TV-er som ikke st\u00f8tter apper.", - "title": "Konfigurere Apper for Smart TV" } }, "title": "" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Apper \u00e5 inkludere eller ekskludere", "include_or_exclude": "Inkluder eller ekskludere apper?", - "timeout": "Tidsavbrudd for API-foresp\u00f8rsel (sekunder)", "volume_step": "St\u00f8rrelse p\u00e5 volum trinn" }, "description": "Hvis du har en Smart-TV, kan du eventuelt filtrere kildelisten ved \u00e5 velge hvilke apper som skal inkluderes eller utelates i kildelisten.", diff --git a/homeassistant/components/vizio/.translations/pl.json b/homeassistant/components/vizio/.translations/pl.json index 91ed0b2dd536..2537279d998d 100644 --- a/homeassistant/components/vizio/.translations/pl.json +++ b/homeassistant/components/vizio/.translations/pl.json @@ -1,20 +1,13 @@ { "config": { "abort": { - "already_in_progress": "Konfiguracja komponentu Vizio jest ju\u017c w trakcie.", "already_setup": "Ten komponent jest ju\u017c skonfigurowany.", - "already_setup_with_diff_host_and_name": "Wygl\u0105da na to, \u017ce ten wpis zosta\u0142 ju\u017c skonfigurowany z innym hostem i nazw\u0105 na podstawie jego numeru seryjnego. Usu\u0144 wszystkie stare wpisy z pliku configuration.yaml i z menu Integracje przed ponown\u0105 pr\u00f3b\u0105 dodania tego urz\u0105dzenia.", - "host_exists": "Komponent Vizio dla tego hosta jest ju\u017c skonfigurowany.", - "name_exists": "Komponent Vizio dla tej nazwy jest ju\u017c skonfigurowany.", - "updated_entry": "Ten wpis zosta\u0142 ju\u017c skonfigurowany, ale nazwa i/lub opcje zdefiniowane w konfiguracji nie pasuj\u0105 do wcze\u015bniej zaimportowanych warto\u015bci, wi\u0119c wpis konfiguracji zosta\u0142 odpowiednio zaktualizowany.", - "updated_options": "Ten wpis zosta\u0142 ju\u017c skonfigurowany, ale opcje zdefiniowane w konfiguracji nie pasuj\u0105 do wcze\u015bniej zaimportowanych warto\u015bci, wi\u0119c wpis konfiguracji zosta\u0142 odpowiednio zaktualizowany.", - "updated_volume_step": "Ten wpis zosta\u0142 ju\u017c skonfigurowany, ale rozmiar skoku g\u0142o\u015bno\u015bci w konfiguracji nie pasuje do wpisu konfiguracji, wi\u0119c wpis konfiguracji zosta\u0142 odpowiednio zaktualizowany." + "updated_entry": "Ten wpis zosta\u0142 ju\u017c skonfigurowany, ale nazwa i/lub opcje zdefiniowane w konfiguracji nie pasuj\u0105 do wcze\u015bniej zaimportowanych warto\u015bci, wi\u0119c wpis konfiguracji zosta\u0142 odpowiednio zaktualizowany." }, "error": { "cant_connect": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z urz\u0105dzeniem. [Przejrzyj dokumentacj\u0119] (https://www.home-assistant.io/integrations/vizio/) i ponownie sprawd\u017a, czy: \n - urz\u0105dzenie jest w\u0142\u0105czone,\n - urz\u0105dzenie jest pod\u0142\u0105czone do sieci,\n - wprowadzone warto\u015bci s\u0105 prawid\u0142owe,\n przed pr\u00f3b\u0105 ponownego przes\u0142ania.", "host_exists": "Urz\u0105dzenie Vizio z okre\u015blonym hostem jest ju\u017c skonfigurowane.", - "name_exists": "Urz\u0105dzenie Vizio o okre\u015blonej nazwie jest ju\u017c skonfigurowane.", - "tv_needs_token": "Gdy typem urz\u0105dzenia jest `tv` potrzebny jest prawid\u0142owy token dost\u0119pu." + "name_exists": "Urz\u0105dzenie Vizio o okre\u015blonej nazwie jest ju\u017c skonfigurowane." }, "step": { "pair_tv": { @@ -28,14 +21,6 @@ "pairing_complete_import": { "title": "Parowanie zako\u0144czone" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Aplikacje do do\u0142\u0105czenia lub wykluczenia", - "include_or_exclude": "Do\u0142\u0105czanie lub wykluczanie aplikacji" - }, - "description": "Je\u015bli telewizor obs\u0142uguje aplikacje, mo\u017cesz opcjonalnie filtrowa\u0107 aplikacje, kt\u00f3re maj\u0105 zosta\u0107 uwzgl\u0119dnione lub wykluczone z listy \u017ar\u00f3de\u0142. Mo\u017cesz pomin\u0105\u0107 ten krok dla telewizor\u00f3w, kt\u00f3re nie obs\u0142uguj\u0105 aplikacji.", - "title": "Konfigurowanie aplikacji dla smart TV" - }, "user": { "data": { "access_token": "Token dost\u0119pu", @@ -44,14 +29,6 @@ "name": "Nazwa" }, "title": "Konfiguracja klienta Vizio SmartCast" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Aplikacje do do\u0142\u0105czenia lub wykluczenia", - "include_or_exclude": "Do\u0142\u0105czy\u0107 czy wykluczy\u0107 aplikacje?" - }, - "description": "Je\u015bli telewizor obs\u0142uguje aplikacje, mo\u017cesz opcjonalnie filtrowa\u0107 aplikacje, kt\u00f3re maj\u0105 zosta\u0107 uwzgl\u0119dnione lub wykluczone z listy \u017ar\u00f3de\u0142. Mo\u017cesz pomin\u0105\u0107 ten krok dla telewizor\u00f3w, kt\u00f3re nie obs\u0142uguj\u0105 aplikacji.", - "title": "Skonfiguruj aplikacje dla Smart TV" } }, "title": "Vizio SmartCast" @@ -62,7 +39,6 @@ "data": { "apps_to_include_or_exclude": "Aplikacje do do\u0142\u0105czenia lub wykluczenia", "include_or_exclude": "Do\u0142\u0105czanie lub wykluczanie aplikacji", - "timeout": "Limit czasu \u017c\u0105dania API (sekundy)", "volume_step": "Skok g\u0142o\u015bno\u015bci" }, "description": "Je\u015bli telewizor obs\u0142uguje aplikacje, mo\u017cesz opcjonalnie filtrowa\u0107 aplikacje, kt\u00f3re maj\u0105 zosta\u0107 uwzgl\u0119dnione lub wykluczone z listy \u017ar\u00f3de\u0142. Mo\u017cesz pomin\u0105\u0107 ten krok dla telewizor\u00f3w, kt\u00f3re nie obs\u0142uguj\u0105 aplikacji.", diff --git a/homeassistant/components/vizio/.translations/ru.json b/homeassistant/components/vizio/.translations/ru.json index 9162b2b0fe64..e1e6ac73b9d4 100644 --- a/homeassistant/components/vizio/.translations/ru.json +++ b/homeassistant/components/vizio/.translations/ru.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.", "already_setup": "\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430.", - "already_setup_with_diff_host_and_name": "\u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u044d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0445\u043e\u0441\u0442\u043e\u043c \u0438 \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0435\u0433\u043e \u0441\u0435\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0434\u0430\u043b\u0438\u0442\u0435 \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0412\u0430\u0448\u0435\u0433\u043e configuration.yaml \u0438 \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \"\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438\" \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", - "host_exists": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "name_exists": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "updated_entry": "\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430.", - "updated_options": "\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430.", - "updated_volume_step": "\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043d\u043e \u0448\u0430\u0433 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430." + "updated_entry": "\u042d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430." }, "error": { "cant_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. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e:\n- \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e;\n- \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u0441\u0435\u0442\u0438;\n- \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u0432\u0435\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.\n\n\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438](https://www.home-assistant.io/integrations/vizio/) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.", "complete_pairing failed": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0412\u0430\u043c\u0438 PIN-\u043a\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439, \u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0441\u0435\u0442\u0438.", "host_exists": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "name_exists": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "tv_needs_token": "\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f `tv` \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430." + "name_exists": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Vizio SmartCast \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a Home Assistant. \n\n\u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - '**{access_token}**'.", "title": "\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439", - "include_or_exclude": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?" - }, - "description": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Smart TV, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Smart TV" - }, "user": { "data": { "access_token": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430", @@ -50,14 +35,6 @@ }, "description": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0412\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0438 \u0443 \u0412\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f.", "title": "Vizio SmartCast" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439", - "include_or_exclude": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?" - }, - "description": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Smart TV, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Smart TV" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439", "include_or_exclude": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?", - "timeout": "\u0422\u0430\u0439\u043c-\u0430\u0443\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 API (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)", "volume_step": "\u0428\u0430\u0433 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438" }, "description": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Smart TV, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.", diff --git a/homeassistant/components/vizio/.translations/sl.json b/homeassistant/components/vizio/.translations/sl.json index 8163846aec08..ed325acd868a 100644 --- a/homeassistant/components/vizio/.translations/sl.json +++ b/homeassistant/components/vizio/.translations/sl.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Konfiguracijski tok za komponento vizio je \u017ee v teku.", "already_setup": "Ta vnos je \u017ee nastavljen.", - "already_setup_with_diff_host_and_name": "Zdi se, da je bil ta vnos \u017ee nastavljen z drugim gostiteljem in imenom glede na njegovo serijsko \u0161tevilko. Pred ponovnim poskusom dodajanja te naprave, odstranite vse stare vnose iz config.yaml in iz menija Integrations.", - "host_exists": "VIZIO komponenta z gostiteljem \u017ee nastavljen.", - "name_exists": "Vizio komponenta z imenom je \u017ee konfigurirana.", - "updated_entry": "Ta vnos je bil \u017ee nastavljen, vendar se ime, aplikacije in/ali mo\u017enosti, dolo\u010dene v konfiguraciji, ne ujemajo s predhodno uvo\u017eeno konfiguracijo, zato je bil konfiguracijski vnos ustrezno posodobljen.", - "updated_options": "Ta vnos je \u017ee nastavljen, vendar se mo\u017enosti, definirane v config-u, ne ujemajo s predhodno uvo\u017eenimi vrednostmi, zato je bil vnos konfiguracije ustrezno posodobljen.", - "updated_volume_step": "Ta vnos je \u017ee nastavljen, vendar velikost koraka glasnosti v config-u ne ustreza vnosu konfiguracije, zato je bil vnos konfiguracije ustrezno posodobljen." + "updated_entry": "Ta vnos je bil \u017ee nastavljen, vendar se ime, aplikacije in/ali mo\u017enosti, dolo\u010dene v konfiguraciji, ne ujemajo s predhodno uvo\u017eeno konfiguracijo, zato je bil konfiguracijski vnos ustrezno posodobljen." }, "error": { "cant_connect": "Ni bilo mogo\u010de povezati z napravo. [Preglejte dokumente] (https://www.home-assistant.io/integrations/vizio/) in ponovno preverite, ali: \n \u2013 Naprava je vklopljena \n \u2013 Naprava je povezana z omre\u017ejem \n \u2013 Vrednosti, ki ste jih izpolnili, so to\u010dne \nnato poskusite ponovno.", "complete_pairing failed": "Seznanjanja ni mogo\u010de dokon\u010dati. Zagotovite, da je PIN, ki ste ga vnesli, pravilen in da je televizor \u0161e vedno vklopljen in priklju\u010den na omre\u017eje, preden ponovno poizkusite.", "host_exists": "Naprava Vizio z dolo\u010denim gostiteljem je \u017ee konfigurirana.", - "name_exists": "Naprava Vizio z navedenim imenom je \u017ee konfigurirana.", - "tv_needs_token": "Ko je vrsta naprave\u00bb TV \u00ab, je potreben veljaven \u017eeton za dostop." + "name_exists": "Naprava Vizio z navedenim imenom je \u017ee konfigurirana." }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Va\u0161 VIZIO SmartCast TV je zdaj priklju\u010den na Home Assistant.\n\n\u017deton za dostop je '**{access_token}**'.", "title": "Seznanjanje je kon\u010dano" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "Aplikacije za vklju\u010ditev ali izklju\u010ditev", - "include_or_exclude": "Vklju\u010di ali Izklju\u010di Aplikacije?" - }, - "description": "\u010ce imate pametni TV, lahko po izbiri filtrirate seznam virov tako, da izberete, katere aplikacije \u017eelite vklju\u010diti ali izklju\u010diti na seznamu virov. Ta korak lahko presko\u010dite za televizorje, ki ne podpirajo aplikacij.", - "title": "Konfigurirajte aplikacije za pametno televizijo" - }, "user": { "data": { "access_token": "\u017deton za dostop", @@ -50,14 +35,6 @@ }, "description": "Dostopni \u017eeton je potreben samo za televizorje. \u010ce konfigurirate televizor in \u0161e nimate \u017eetona za dostop, ga pustite prazno in boste \u0161li, da bo \u0161el skozi postopek seznanjanja.", "title": "Namestite Vizio SmartCast napravo" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "Aplikacije za vklju\u010ditev ali izklju\u010ditev", - "include_or_exclude": "Vklju\u010di ali Izklju\u010di Aplikacije?" - }, - "description": "\u010ce imate pametni TV, lahko po izbiri filtrirate seznam virov tako, da izberete, katere aplikacije \u017eelite vklju\u010diti ali izklju\u010diti na seznamu virov. Ta korak lahko presko\u010dite za televizorje, ki ne podpirajo aplikacij.", - "title": "Konfigurirajte aplikacije za pametno televizijo" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "Aplikacije za vklju\u010ditev ali izklju\u010ditev", "include_or_exclude": "Vklju\u010di ali Izklju\u010di Aplikacije?", - "timeout": "\u010casovna omejitev zahteve za API (sekunde)", "volume_step": "Velikost koraka glasnosti" }, "description": "\u010ce imate pametni TV, lahko po izbiri filtrirate seznam virov tako, da izberete, katere aplikacije \u017eelite vklju\u010diti ali izklju\u010diti na seznamu virov.", diff --git a/homeassistant/components/vizio/.translations/sv.json b/homeassistant/components/vizio/.translations/sv.json index 072b441a0715..bafd7d1bd2fb 100644 --- a/homeassistant/components/vizio/.translations/sv.json +++ b/homeassistant/components/vizio/.translations/sv.json @@ -1,20 +1,13 @@ { "config": { "abort": { - "already_in_progress": "Konfigurationsfl\u00f6de f\u00f6r vizio-komponenten p\u00e5g\u00e5r\nredan.", "already_setup": "Den h\u00e4r posten har redan st\u00e4llts in.", - "already_setup_with_diff_host_and_name": "Den h\u00e4r posten verkar redan ha st\u00e4llts in med en annan v\u00e4rd och ett annat namn baserat p\u00e5 dess serienummer. Ta bort alla gamla poster fr\u00e5n configuration.yaml och fr\u00e5n menyn Integrationer innan du f\u00f6rs\u00f6ker l\u00e4gga till den h\u00e4r enheten igen.", - "host_exists": "Vizio-komponenten med v\u00e4rdnamnet \u00e4r redan konfigurerad.", - "name_exists": "Vizio-komponent med namn redan konfigurerad.", - "updated_entry": "Den h\u00e4r posten har redan konfigurerats, men namnet och/eller alternativen som definierats i konfigurationen matchar inte den tidigare importerade konfigurationen och d\u00e4rf\u00f6r har konfigureringsposten uppdaterats i enlighet med detta.", - "updated_options": "Den h\u00e4r posten har redan st\u00e4llts in men de alternativ som definierats i konfigurationen matchar inte de tidigare importerade alternativv\u00e4rdena s\u00e5 konfigurationsposten har uppdaterats i enlighet med detta.", - "updated_volume_step": "Den h\u00e4r posten har redan st\u00e4llts in men volymstegstorleken i konfigurationen matchar inte konfigurationsposten s\u00e5 konfigurationsposten har uppdaterats i enlighet med detta." + "updated_entry": "Den h\u00e4r posten har redan konfigurerats, men namnet och/eller alternativen som definierats i konfigurationen matchar inte den tidigare importerade konfigurationen och d\u00e4rf\u00f6r har konfigureringsposten uppdaterats i enlighet med detta." }, "error": { "cant_connect": "Det gick inte att ansluta till enheten. [Granska dokumentationen] (https://www.home-assistant.io/integrations/vizio/) och p\u00e5 nytt kontrollera att\n- Enheten \u00e4r p\u00e5slagen\n- Enheten \u00e4r ansluten till n\u00e4tverket\n- De v\u00e4rden du fyllt i \u00e4r korrekta\ninnan du f\u00f6rs\u00f6ker skicka in igen.", "host_exists": "Vizio-enheten med angivet v\u00e4rdnamn \u00e4r redan konfigurerad.", - "name_exists": "Vizio-enheten med angivet namn \u00e4r redan konfigurerad.", - "tv_needs_token": "N\u00e4r Enhetstyp \u00e4r 'tv' beh\u00f6vs en giltig \u00e5tkomsttoken." + "name_exists": "Vizio-enheten med angivet namn \u00e4r redan konfigurerad." }, "step": { "user": { @@ -33,7 +26,6 @@ "step": { "init": { "data": { - "timeout": "Timeout f\u00f6r API-anrop (sekunder)", "volume_step": "Storlek p\u00e5 volymsteg" }, "title": "Uppdatera Vizo SmartCast-alternativ" diff --git a/homeassistant/components/vizio/.translations/zh-Hant.json b/homeassistant/components/vizio/.translations/zh-Hant.json index 4d826a287f69..eb396428e68d 100644 --- a/homeassistant/components/vizio/.translations/zh-Hant.json +++ b/homeassistant/components/vizio/.translations/zh-Hant.json @@ -1,21 +1,14 @@ { "config": { "abort": { - "already_in_progress": "Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d\u3002", "already_setup": "\u6b64\u7269\u4ef6\u5df2\u8a2d\u5b9a\u904e\u3002", - "already_setup_with_diff_host_and_name": "\u6839\u64da\u6240\u63d0\u4f9b\u7684\u5e8f\u865f\uff0c\u6b64\u7269\u4ef6\u4f3c\u4e4e\u5df2\u7d93\u4f7f\u7528\u4e0d\u540c\u7684\u4e3b\u6a5f\u7aef\u8207\u540d\u7a31\u9032\u884c\u8a2d\u5b9a\u3002\u8acb\u5f9e\u6574\u5408\u9078\u55ae Config.yaml \u4e2d\u79fb\u9664\u820a\u7269\u4ef6\uff0c\u7136\u5f8c\u518d\u65b0\u589e\u6b64\u8a2d\u5099\u3002", - "host_exists": "\u4f9d\u4e3b\u6a5f\u7aef\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d\u3002", - "name_exists": "\u4f9d\u540d\u7a31\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d\u3002", - "updated_entry": "\u6b64\u7269\u4ef6\u5df2\u7d93\u8a2d\u5b9a\uff0c\u4f46\u8a2d\u5b9a\u4e4b\u540d\u7a31\u3001App \u53ca/\u6216\u9078\u9805\u8207\u5148\u524d\u532f\u5165\u7684\u7269\u4ef6\u9078\u9805\u503c\u4e0d\u5408\uff0c\u56e0\u6b64\u8a2d\u5b9a\u5c07\u6703\u8ddf\u8457\u66f4\u65b0\u3002", - "updated_options": "\u6b64\u7269\u4ef6\u5df2\u7d93\u8a2d\u5b9a\uff0c\u4f46\u8a2d\u5b9a\u4e4b\u9078\u9805\u5b9a\u7fa9\u8207\u7269\u4ef6\u9078\u9805\u503c\u4e0d\u5408\uff0c\u56e0\u6b64\u8a2d\u5b9a\u5c07\u6703\u8ddf\u8457\u66f4\u65b0\u3002", - "updated_volume_step": "\u6b64\u7269\u4ef6\u5df2\u7d93\u8a2d\u5b9a\uff0c\u4f46\u8a2d\u5b9a\u4e4b\u97f3\u91cf\u5927\u5c0f\u8207\u7269\u4ef6\u8a2d\u5b9a\u4e0d\u5408\uff0c\u56e0\u6b64\u8a2d\u5b9a\u5c07\u6703\u8ddf\u8457\u66f4\u65b0\u3002" + "updated_entry": "\u6b64\u7269\u4ef6\u5df2\u7d93\u8a2d\u5b9a\uff0c\u4f46\u8a2d\u5b9a\u4e4b\u540d\u7a31\u3001App \u53ca/\u6216\u9078\u9805\u8207\u5148\u524d\u532f\u5165\u7684\u7269\u4ef6\u9078\u9805\u503c\u4e0d\u5408\uff0c\u56e0\u6b64\u8a2d\u5b9a\u5c07\u6703\u8ddf\u8457\u66f4\u65b0\u3002" }, "error": { "cant_connect": "\u7121\u6cd5\u9023\u7dda\u81f3\u8a2d\u5099\u3002[\u8acb\u53c3\u8003\u8aaa\u660e\u6587\u4ef6](https://www.home-assistant.io/integrations/vizio/) \u4e26\u78ba\u8a8d\u4ee5\u4e0b\u9805\u76ee\uff1a\n- \u8a2d\u5099\u5df2\u958b\u6a5f\n- \u8a2d\u5099\u5df2\u9023\u7dda\u81f3\u7db2\u8def\n- \u586b\u5beb\u8cc7\u6599\u6b63\u78ba\n\u7136\u5f8c\u518d\u91cd\u65b0\u50b3\u9001\u3002", "complete_pairing failed": "\u7121\u6cd5\u5b8c\u6210\u914d\u5c0d\uff0c\u50b3\u9001\u524d\u3001\u8acb\u78ba\u5b9a\u6240\u8f38\u5165\u7684 PIN \u78bc\u3001\u540c\u6642\u96fb\u8996\u5df2\u7d93\u958b\u555f\u4e26\u9023\u7dda\u81f3\u7db2\u8def\u3002", "host_exists": "\u4f9d\u4e3b\u6a5f\u7aef\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002", - "name_exists": "\u4f9d\u540d\u7a31\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002", - "tv_needs_token": "\u7576\u8a2d\u5099\u985e\u5225\u70ba\u300cTV\u300d\u6642\uff0c\u9700\u8981\u5b58\u53d6\u5bc6\u9470\u3002" + "name_exists": "\u4f9d\u540d\u7a31\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002" }, "step": { "pair_tv": { @@ -33,14 +26,6 @@ "description": "Vizio SmartCast TV \u8a2d\u5099\u5df2\u9023\u7dda\u81f3 Home Assistant\u3002\n\n\u5b58\u53d6\u5bc6\u9470\u70ba\u300c**{access_token}**\u300d\u3002", "title": "\u914d\u5c0d\u5b8c\u6210" }, - "tv_apps": { - "data": { - "apps_to_include_or_exclude": "\u6240\u8981\u5305\u542b\u6216\u6392\u9664\u7684 App", - "include_or_exclude": "\u5305\u542b\u6216\u6392\u9664 App\uff1f" - }, - "description": "\u5047\u5982\u60a8\u64c1\u6709 Smart TV\u3001\u53ef\u4ee5\u65bc\u4f86\u6e90\u5217\u8868\u4e2d\u9078\u64c7\u6216\u6392\u9664\u904e\u6ffe App\u3002\u5047\u5982\u96fb\u8996\u4e0d\u652f\u63f4 App\u3001\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002", - "title": "Smart TV \u8a2d\u5b9a App" - }, "user": { "data": { "access_token": "\u5b58\u53d6\u5bc6\u9470", @@ -50,14 +35,6 @@ }, "description": "\u6b64\u96fb\u8996\u50c5\u9700\u5b58\u53d6\u5bc6\u9470\u3002\u5047\u5982\u60a8\u6b63\u5728\u8a2d\u5b9a\u96fb\u8996\u3001\u5c1a\u672a\u53d6\u5f97\u5bc6\u9470\uff0c\u4fdd\u6301\u7a7a\u767d\u4ee5\u9032\u884c\u914d\u5c0d\u904e\u7a0b\u3002", "title": "\u8a2d\u5b9a Vizio SmartCast \u8a2d\u5099" - }, - "user_tv": { - "data": { - "apps_to_include_or_exclude": "\u6240\u8981\u5305\u542b\u6216\u6392\u9664\u7684 App", - "include_or_exclude": "\u5305\u542b\u6216\u6392\u9664 App\uff1f" - }, - "description": "\u5047\u5982\u60a8\u64c1\u6709 Smart TV\u3001\u53ef\u4ee5\u65bc\u4f86\u6e90\u5217\u8868\u4e2d\u9078\u64c7\u6216\u6392\u9664\u904e\u6ffe App\u3002\u5047\u5982\u96fb\u8996\u4e0d\u652f\u63f4 App\u3001\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002", - "title": "Smart TV \u8a2d\u5b9a App" } }, "title": "Vizio SmartCast" @@ -68,7 +45,6 @@ "data": { "apps_to_include_or_exclude": "\u6240\u8981\u5305\u542b\u6216\u6392\u9664\u7684 App", "include_or_exclude": "\u5305\u542b\u6216\u6392\u9664 App\uff1f", - "timeout": "API \u8acb\u6c42\u903e\u6642\uff08\u79d2\uff09", "volume_step": "\u97f3\u91cf\u5927\u5c0f" }, "description": "\u5047\u5982\u60a8\u64c1\u6709 Smart TV\u3001\u53ef\u7531\u4f86\u6e90\u5217\u8868\u4e2d\u9078\u64c7\u6240\u8981\u904e\u6ffe\u5305\u542b\u6216\u6392\u9664\u7684 App\u3002\u3002", diff --git a/homeassistant/components/withings/.translations/bg.json b/homeassistant/components/withings/.translations/bg.json index 4064b21ca6b0..30e384e0bc0b 100644 --- a/homeassistant/components/withings/.translations/bg.json +++ b/homeassistant/components/withings/.translations/bg.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "no_flows": "\u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 Withings, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0430\u0442\u0435. \u041c\u043e\u043b\u044f, \u043f\u0440\u043e\u0447\u0435\u0442\u0435\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430." - }, "create_entry": { "default": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0438\u0440\u0430\u043d\u0435 \u0441 Withings \u0437\u0430 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b." }, @@ -13,13 +10,6 @@ }, "description": "\u041a\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b \u0441\u0442\u0435 \u0438\u0437\u0431\u0440\u0430\u043b\u0438 \u043d\u0430 \u0443\u0435\u0431\u0441\u0430\u0439\u0442\u0430 \u043d\u0430 Withings? \u0412\u0430\u0436\u043d\u043e \u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0442\u0435 \u0434\u0430 \u0441\u044a\u0432\u043f\u0430\u0434\u0430\u0442, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u0435\u043d \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438.", "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b." - }, - "user": { - "data": { - "profile": "\u041f\u0440\u043e\u0444\u0438\u043b" - }, - "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b, \u043a\u044a\u043c \u043a\u043e\u0439\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0441\u0432\u044a\u0440\u0436\u0435\u0442\u0435 Home Assistant \u0441 Withings. \u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0442\u0430 \u043d\u0430 Withings \u043d\u0435 \u0437\u0430\u0431\u0440\u0430\u0432\u044f\u0439\u0442\u0435 \u0434\u0430 \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0435\u0434\u0438\u043d \u0438 \u0441\u044a\u0449 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u043d\u044f\u043c\u0430 \u0434\u0430 \u0431\u044a\u0434\u0430\u0442 \u0441\u0432\u044a\u0440\u0437\u0430\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e.", - "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/ca.json b/homeassistant/components/withings/.translations/ca.json index edb95a946aaf..6363ddf19836 100644 --- a/homeassistant/components/withings/.translations/ca.json +++ b/homeassistant/components/withings/.translations/ca.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "S'ha acabat el temps d'espera durant la generaci\u00f3 de l'URL d'autoritzaci\u00f3.", - "missing_configuration": "La integraci\u00f3 Withings no est\u00e0 configurada. Mira'n la documentaci\u00f3.", - "no_flows": "Necessites configurar Withings abans de poder autenticar't-hi. Llegeix la documentaci\u00f3." + "missing_configuration": "La integraci\u00f3 Withings no est\u00e0 configurada. Mira'n la documentaci\u00f3." }, "create_entry": { "default": "Autenticaci\u00f3 exitosa amb Withings per al perfil seleccionat." @@ -18,13 +17,6 @@ }, "description": "Quin perfil has seleccionat al lloc web de Withings? \u00c9s important que els perfils coincideixin sin\u00f3, les dades no s\u2019etiquetaran correctament.", "title": "Perfil d'usuari." - }, - "user": { - "data": { - "profile": "Perfil" - }, - "description": "Selecciona un perfil d'usuari amb el qual vols que Home Assistant s'uneixi amb un perfil de Withings. A la p\u00e0gina de Withings, assegura't de seleccionar el mateix usuari o, les dades no seran les correctes.", - "title": "Perfil d'usuari." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/da.json b/homeassistant/components/withings/.translations/da.json index 72d851ad873a..09e73e4ea8e0 100644 --- a/homeassistant/components/withings/.translations/da.json +++ b/homeassistant/components/withings/.translations/da.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Timeout ved generering af godkendelses-url.", - "missing_configuration": "Withings-integrationen er ikke konfigureret. F\u00f8lg venligst dokumentationen.", - "no_flows": "Du skal konfigurere Withings, f\u00f8r du kan godkende med den. L\u00e6s venligst dokumentationen." + "missing_configuration": "Withings-integrationen er ikke konfigureret. F\u00f8lg venligst dokumentationen." }, "create_entry": { "default": "Godkendt med Withings." @@ -18,13 +17,6 @@ }, "description": "Hvilken profil har du valgt p\u00e5 Withings hjemmeside? Det er vigtigt, at profilerne matcher, ellers vil data blive m\u00e6rket forkert.", "title": "Brugerprofil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "V\u00e6lg en brugerprofil, som du vil have Home Assistant til at tilknytte med en Withings-profil. P\u00e5 siden Withings skal du s\u00f8rge for at v\u00e6lge den samme bruger eller data vil ikke blive m\u00e6rket korrekt.", - "title": "Brugerprofil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/de.json b/homeassistant/components/withings/.translations/de.json index ae8ab6795935..6295d9188486 100644 --- a/homeassistant/components/withings/.translations/de.json +++ b/homeassistant/components/withings/.translations/de.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Zeit\u00fcberschreitung beim Erstellen der Autorisierungs-URL.", - "missing_configuration": "Die Withings-Integration ist nicht konfiguriert. Bitte folgen Sie der Dokumentation.", - "no_flows": "Withings muss konfiguriert werden, bevor die Integration authentifiziert werden kann. Bitte lies die Dokumentation." + "missing_configuration": "Die Withings-Integration ist nicht konfiguriert. Bitte folgen Sie der Dokumentation." }, "create_entry": { "default": "Erfolgreiche Authentifizierung mit Withings." @@ -18,13 +17,6 @@ }, "description": "Welches Profil hast du auf der Withings-Website ausgew\u00e4hlt? Es ist wichtig, dass die Profile \u00fcbereinstimmen, da sonst die Daten falsch beschriftet werden.", "title": "Benutzerprofil" - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "W\u00e4hle ein Benutzerprofil aus, dem Home Assistant ein Withings-Profil zuordnen soll. Stelle sicher, dass du auf der Withings-Seite denselben Benutzer ausw\u00e4hlst, da sonst die Daten nicht korrekt gekennzeichnet werden.", - "title": "Benutzerprofil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/en.json b/homeassistant/components/withings/.translations/en.json index c39ac530ae63..eefa54b94908 100644 --- a/homeassistant/components/withings/.translations/en.json +++ b/homeassistant/components/withings/.translations/en.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Timeout generating authorize url.", - "missing_configuration": "The Withings integration is not configured. Please follow the documentation.", - "no_flows": "You need to configure Withings before being able to authenticate with it. Please read the documentation." + "missing_configuration": "The Withings integration is not configured. Please follow the documentation." }, "create_entry": { "default": "Successfully authenticated with Withings." @@ -18,13 +17,6 @@ }, "description": "Which profile did you select on the Withings website? It's important the profiles match, otherwise data will be mis-labeled.", "title": "User Profile." - }, - "user": { - "data": { - "profile": "Profile" - }, - "description": "Select a user profile to which you want Home Assistant to map with a Withings profile. On the withings page, be sure to select the same user or data will not be labeled correctly.", - "title": "User Profile." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/es-419.json b/homeassistant/components/withings/.translations/es-419.json index 485150d29288..f0490e5724b8 100644 --- a/homeassistant/components/withings/.translations/es-419.json +++ b/homeassistant/components/withings/.translations/es-419.json @@ -1,19 +1,8 @@ { "config": { - "abort": { - "no_flows": "Debe configurar Withings antes de poder autenticarse con \u00e9l. Por favor lea la documentaci\u00f3n." - }, "create_entry": { "default": "Autenticado correctamente con Withings para el perfil seleccionado." }, - "step": { - "user": { - "data": { - "profile": "Perfil" - }, - "title": "Perfil del usuario." - } - }, "title": "Withings" } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/es.json b/homeassistant/components/withings/.translations/es.json index c239d7d8db94..f3e2c36ae727 100644 --- a/homeassistant/components/withings/.translations/es.json +++ b/homeassistant/components/withings/.translations/es.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Tiempo de espera agotado para la autorizaci\u00f3n de la url.", - "missing_configuration": "La integraci\u00f3n de Withings no est\u00e1 configurada. Por favor, siga la documentaci\u00f3n.", - "no_flows": "Debe configurar Withings antes de poder autenticarse con \u00e9l. Por favor, lea la documentaci\u00f3n." + "missing_configuration": "La integraci\u00f3n de Withings no est\u00e1 configurada. Por favor, siga la documentaci\u00f3n." }, "create_entry": { "default": "Autenticado correctamente con Withings para el perfil seleccionado." @@ -18,13 +17,6 @@ }, "description": "\u00bfQu\u00e9 perfil seleccion\u00f3 en el sitio web de Withings? Es importante que los perfiles coincidan, de lo contrario los datos se etiquetar\u00e1n incorrectamente.", "title": "Perfil de usuario." - }, - "user": { - "data": { - "profile": "Perfil" - }, - "description": "Seleccione un perfil de usuario para el cual desea que Home Assistant se conecte con el perfil de Withings. En la p\u00e1gina de Withings, aseg\u00farese de seleccionar el mismo usuario o los datos no se identificar\u00e1n correctamente.", - "title": "Perfil de usuario." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/fr.json b/homeassistant/components/withings/.translations/fr.json index a9a0db55005d..d178ef6c8894 100644 --- a/homeassistant/components/withings/.translations/fr.json +++ b/homeassistant/components/withings/.translations/fr.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "D\u00e9lai d'expiration g\u00e9n\u00e9rant une URL d'autorisation.", - "missing_configuration": "L'int\u00e9gration Withings n'est pas configur\u00e9e. Veuillez suivre la documentation.", - "no_flows": "Vous devez configurer Withings avant de pouvoir vous authentifier avec celui-ci. Veuillez lire la documentation." + "missing_configuration": "L'int\u00e9gration Withings n'est pas configur\u00e9e. Veuillez suivre la documentation." }, "create_entry": { "default": "Authentifi\u00e9 avec succ\u00e8s \u00e0 Withings pour le profil s\u00e9lectionn\u00e9." @@ -18,13 +17,6 @@ }, "description": "Quel profil avez-vous s\u00e9lectionn\u00e9 sur le site Withings? Il est important que les profils correspondent, sinon les donn\u00e9es seront mal \u00e9tiquet\u00e9es.", "title": "Profil utilisateur" - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "S\u00e9lectionnez l'utilisateur que vous souhaitez associer \u00e0 Withings. Sur la page withings, veillez \u00e0 s\u00e9lectionner le m\u00eame utilisateur, sinon les donn\u00e9es ne seront pas \u00e9tiquet\u00e9es correctement.", - "title": "Profil utilisateur" } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/hu.json b/homeassistant/components/withings/.translations/hu.json index 503013e402f8..b13cf9ec5244 100644 --- a/homeassistant/components/withings/.translations/hu.json +++ b/homeassistant/components/withings/.translations/hu.json @@ -2,8 +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 Withings integr\u00e1ci\u00f3 nincs konfigur\u00e1lva. K\u00e9rj\u00fck, k\u00f6vesse a dokument\u00e1ci\u00f3t.", - "no_flows": "Konfigur\u00e1lnia kell a Withings-et, miel\u0151tt hiteles\u00edtheti mag\u00e1t vele. K\u00e9rj\u00fck, olvassa el a dokument\u00e1ci\u00f3t." + "missing_configuration": "A Withings integr\u00e1ci\u00f3 nincs konfigur\u00e1lva. K\u00e9rj\u00fck, k\u00f6vesse a dokument\u00e1ci\u00f3t." }, "create_entry": { "default": "A Withings sikeresen hiteles\u00edtett." @@ -18,13 +17,6 @@ }, "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.", "title": "Felhaszn\u00e1l\u00f3i profil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "V\u00e1lasszon egy felhaszn\u00e1l\u00f3i profilt, amelyet szeretn\u00e9, hogy a Home Assistant hozz\u00e1rendeljen a Withings profilhoz. \u00dcgyeljen arra, hogy ugyanazt a felhaszn\u00e1l\u00f3t v\u00e1lassza a Withings oldalon, k\u00fcl\u00f6nben az adatok nem lesznek megfelel\u0151en felcimk\u00e9zve.", - "title": "Felhaszn\u00e1l\u00f3i profil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/it.json b/homeassistant/components/withings/.translations/it.json index 4a6f5e67965d..6deeff074899 100644 --- a/homeassistant/components/withings/.translations/it.json +++ b/homeassistant/components/withings/.translations/it.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Timeout durante la generazione dell'URL di autorizzazione.", - "missing_configuration": "Il componente Withings non \u00e8 configurato. Si prega di seguire la documentazione.", - "no_flows": "\u00c8 necessario configurare Withings prima di potersi autenticare con esso. Si prega di leggere la documentazione." + "missing_configuration": "Il componente Withings non \u00e8 configurato. Si prega di seguire la documentazione." }, "create_entry": { "default": "Autenticazione riuscita con Withings." @@ -18,13 +17,6 @@ }, "description": "Quale profilo hai selezionato sul sito web di Withings? \u00c8 importante che i profili corrispondano, altrimenti i dati avranno con un'errata etichettatura.", "title": "Profilo utente." - }, - "user": { - "data": { - "profile": "Profilo" - }, - "description": "Seleziona un profilo utente a cui desideri associare Home Assistant con un profilo Withings. Nella pagina Withings, assicurati di selezionare lo stesso utente o i dati non saranno etichettati correttamente.", - "title": "Profilo utente." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/ko.json b/homeassistant/components/withings/.translations/ko.json index 4ff2a80434a6..8cdd85119199 100644 --- a/homeassistant/components/withings/.translations/ko.json +++ b/homeassistant/components/withings/.translations/ko.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "\uc778\uc99d url \uc0dd\uc131 \uc2dc\uac04\uc774 \ucd08\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "missing_configuration": "Withings \uad6c\uc131\uc694\uc18c\uac00 \uad6c\uc131\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc124\uba85\uc11c\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694.", - "no_flows": "Withings \ub97c \uc778\uc99d\ud558\ub824\uba74 \uba3c\uc800 Withings \ub97c \uad6c\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. [\uc548\ub0b4](https://www.home-assistant.io/components/withings/) \ub97c \uc77d\uc5b4\ubcf4\uc138\uc694." + "missing_configuration": "Withings \uad6c\uc131\uc694\uc18c\uac00 \uad6c\uc131\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc124\uba85\uc11c\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694." }, "create_entry": { "default": "Withings \ub85c \uc131\uacf5\uc801\uc73c\ub85c \uc778\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4." @@ -18,13 +17,6 @@ }, "description": "Withings \uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc5b4\ub5a4 \ud504\ub85c\ud544\uc744 \uc120\ud0dd\ud558\uc168\ub098\uc694? \ud504\ub85c\ud544\uc774 \uc77c\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74, \ub370\uc774\ud130\uc5d0 \ub808\uc774\ube14\uc774 \uc798\ubabb \uc9c0\uc815\ub429\ub2c8\ub2e4.", "title": "\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544." - }, - "user": { - "data": { - "profile": "\ud504\ub85c\ud544" - }, - "description": "Home Assistant \uac00 Withings \ud504\ub85c\ud544\uacfc \ub9f5\ud551\ud560 \uc0ac\uc6a9\uc790 \ud504\ub85c\ud544\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694. Withings \ud398\uc774\uc9c0\uc5d0\uc11c \ub3d9\uc77c\ud55c \uc0ac\uc6a9\uc790\ub97c \uc120\ud0dd\ud574\uc57c\ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ub370\uc774\ud130\uc5d0 \uc62c\ubc14\ub978 \ub808\uc774\ube14\uc774 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", - "title": "\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/lb.json b/homeassistant/components/withings/.translations/lb.json index 4f3fb27e7b2c..1984ef6f5861 100644 --- a/homeassistant/components/withings/.translations/lb.json +++ b/homeassistant/components/withings/.translations/lb.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Z\u00e4it Iwwerschreidung beim gener\u00e9ieren vun der Autorisatiouns URL.", - "missing_configuration": "Withings Integratioun ass nach net konfigur\u00e9iert. Follegt w.e.g der Dokumentatioun.", - "no_flows": "Dir musst Withingss konfigur\u00e9ieren, ier Dir d\u00ebs Authentifiz\u00e9ierung k\u00ebnnt benotzen. Liest w.e.g. d'Instruktioune." + "missing_configuration": "Withings Integratioun ass nach net konfigur\u00e9iert. Follegt w.e.g der Dokumentatioun." }, "create_entry": { "default": "Erfollegr\u00e4ich mam ausgewielte Profile mat Withings authentifiz\u00e9iert." @@ -18,13 +17,6 @@ }, "description": "W\u00e9ie Profil hutt dir op der Withings Webs\u00e4it ausgewielt? Et ass wichteg dass Profiller passen, soss ginn Donn\u00e9e\u00eb falsch gekennzeechent.", "title": "Benotzer Profil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "Wielt ee Benotzer Profile aus dee mam Withings Profile soll verbonne ginn. Stellt s\u00e9cher dass dir op der Withings S\u00e4it deeselwechte Benotzer auswielt, soss ginn d'Donn\u00e9e net richteg ugewisen.", - "title": "Benotzer Profil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/lv.json b/homeassistant/components/withings/.translations/lv.json index 3f7cf20fdb48..7d8b268367c3 100644 --- a/homeassistant/components/withings/.translations/lv.json +++ b/homeassistant/components/withings/.translations/lv.json @@ -1,13 +1,5 @@ { "config": { - "step": { - "user": { - "data": { - "profile": "Profils" - }, - "title": "Lietot\u0101ja profils." - } - }, "title": "Withings" } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/nl.json b/homeassistant/components/withings/.translations/nl.json index 0b01fc8c16a8..d534acc5c093 100644 --- a/homeassistant/components/withings/.translations/nl.json +++ b/homeassistant/components/withings/.translations/nl.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Time-out tijdens genereren autorisatie url.", - "missing_configuration": "De Withings integratie is niet geconfigureerd. Gelieve de documentatie te volgen.", - "no_flows": "U moet Withings configureren voordat u zich ermee kunt verifi\u00ebren. [Gelieve de documentatie te lezen]" + "missing_configuration": "De Withings integratie is niet geconfigureerd. Gelieve de documentatie te volgen." }, "create_entry": { "default": "Succesvol geverifieerd met Withings voor het geselecteerde profiel." @@ -18,13 +17,6 @@ }, "description": "Welk profiel hebt u op de website van Withings selecteren? Het is belangrijk dat de profielen overeenkomen, anders worden gegevens verkeerd gelabeld.", "title": "Gebruikersprofiel." - }, - "user": { - "data": { - "profile": "Profiel" - }, - "description": "Selecteer een gebruikersprofiel waaraan u Home Assistant wilt toewijzen met een Withings-profiel. Zorg ervoor dat u op de pagina Withings dezelfde gebruiker selecteert, anders worden de gegevens niet correct gelabeld.", - "title": "Gebruikersprofiel." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/no.json b/homeassistant/components/withings/.translations/no.json index 1c4a8c0fb71c..fac2fa3a8fc3 100644 --- a/homeassistant/components/withings/.translations/no.json +++ b/homeassistant/components/withings/.translations/no.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Tidsavbrudd ved generering av autoriseringsadresse.", - "missing_configuration": "Withings-integreringen er ikke konfigurert. Vennligst f\u00f8lg dokumentasjonen.", - "no_flows": "Du m\u00e5 konfigurere Withings f\u00f8r du kan godkjenne med den. Vennligst les dokumentasjonen." + "missing_configuration": "Withings-integreringen er ikke konfigurert. Vennligst f\u00f8lg dokumentasjonen." }, "create_entry": { "default": "Vellykket godkjent med Withings." @@ -18,13 +17,6 @@ }, "description": "Hvilken profil valgte du p\u00e5 Withings nettsted? Det er viktig at profilene samsvarer, ellers blir data feilmerket.", "title": "Brukerprofil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "Velg en brukerprofil som du vil at Home Assistant skal kartlegge med en Withings-profil. P\u00e5 Withings-siden m\u00e5 du passe p\u00e5 at du velger samme bruker ellers vil ikke dataen bli merket riktig.", - "title": "Brukerprofil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/pl.json b/homeassistant/components/withings/.translations/pl.json index afe35bd06cfa..c20f7a9ba538 100644 --- a/homeassistant/components/withings/.translations/pl.json +++ b/homeassistant/components/withings/.translations/pl.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Min\u0105\u0142 limit czasu generowania url autoryzacji.", - "missing_configuration": "Integracja z Withings nie jest skonfigurowana. Post\u0119puj zgodnie z dokumentacj\u0105.", - "no_flows": "Musisz skonfigurowa\u0107 Withings, aby m\u00f3c si\u0119 z nim uwierzytelni\u0107. Zapoznaj si\u0119 z dokumentacj\u0105." + "missing_configuration": "Integracja z Withings nie jest skonfigurowana. Post\u0119puj zgodnie z dokumentacj\u0105." }, "create_entry": { "default": "Pomy\u015blnie uwierzytelniono z Withings dla wybranego profilu" @@ -18,13 +17,6 @@ }, "description": "Kt\u00f3ry profil wybra\u0142e\u015b na stronie Withings? Wa\u017cne jest, aby profile si\u0119 zgadza\u0142y, w przeciwnym razie dane zostan\u0105 b\u0142\u0119dnie oznaczone.", "title": "Profil u\u017cytkownika" - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "Wybierz profil u\u017cytkownika Withings, na kt\u00f3ry chcesz po\u0142\u0105czy\u0107 z Home Assistant'em. Na stronie Withings wybierz ten sam profil u\u017cytkownika, by dane by\u0142y poprawnie oznaczone.", - "title": "Profil u\u017cytkownika" } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/ru.json b/homeassistant/components/withings/.translations/ru.json index 407bcf48c1a8..eba162904532 100644 --- a/homeassistant/components/withings/.translations/ru.json +++ b/homeassistant/components/withings/.translations/ru.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "\u0418\u0441\u0442\u0435\u043a\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.", - "missing_configuration": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Withings \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438.", - "no_flows": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Withings \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438." + "missing_configuration": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Withings \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438." }, "create_entry": { "default": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e." @@ -18,13 +17,6 @@ }, "description": "\u041a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0412\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Withings? \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u0438\u043d\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b.", "title": "Withings" - }, - "user": { - "data": { - "profile": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c" - }, - "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 Withings \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438\u043d\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.", - "title": "Withings" } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/sl.json b/homeassistant/components/withings/.translations/sl.json index faa76ac93332..1de0a0d6ce7e 100644 --- a/homeassistant/components/withings/.translations/sl.json +++ b/homeassistant/components/withings/.translations/sl.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "\u010casovna omejitev za generiranje potrditvenega URL-ja je potekla.", - "missing_configuration": "Integracija Withings ni konfigurirana. Prosimo, upo\u0161tevajte dokumentacijo.", - "no_flows": "Withings morate prvo konfigurirati, preden ga boste lahko uporabili za overitev. Prosimo, preberite dokumentacijo." + "missing_configuration": "Integracija Withings ni konfigurirana. Prosimo, upo\u0161tevajte dokumentacijo." }, "create_entry": { "default": "Uspe\u0161no overjen z Withings." @@ -18,13 +17,6 @@ }, "description": "Kateri profil ste izbrali na spletni strani Withings? Pomembno je, da se profili ujemajo, sicer bodo podatki napa\u010dno ozna\u010deni.", "title": "Uporabni\u0161ki profil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "Izberite uporabni\u0161ki profil, za katerega \u017eelite, da se Home Assistant prika\u017ee s profilom Withings. Na Withings strani ne pozabite izbrati istega uporabnika sicer podatki ne bodo pravilno ozna\u010deni.", - "title": "Uporabni\u0161ki profil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/sv.json b/homeassistant/components/withings/.translations/sv.json index dc8954af2c73..dfaa09d52f02 100644 --- a/homeassistant/components/withings/.translations/sv.json +++ b/homeassistant/components/withings/.translations/sv.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Skapandet av en auktoriseringsadress \u00f6verskred tidsgr\u00e4nsen.", - "missing_configuration": "Withings-integrationen \u00e4r inte konfigurerad. V\u00e4nligen f\u00f6lj dokumentationen.", - "no_flows": "Du m\u00e5ste konfigurera Withings innan du kan autentisera med den. L\u00e4s dokumentationen." + "missing_configuration": "Withings-integrationen \u00e4r inte konfigurerad. V\u00e4nligen f\u00f6lj dokumentationen." }, "create_entry": { "default": "Lyckad autentisering med Withings." @@ -18,13 +17,6 @@ }, "description": "Vilken profil valde du p\u00e5 Withings webbplats? Det \u00e4r viktigt att profilerna matchar, annars kommer data att vara felm\u00e4rkta.", "title": "Anv\u00e4ndarprofil." - }, - "user": { - "data": { - "profile": "Profil" - }, - "description": "V\u00e4lj en anv\u00e4ndarprofil som du vill att Home Assistant ska kartl\u00e4gga med en Withings-profil. Var noga med att v\u00e4lja samma anv\u00e4ndare p\u00e5 visningssidan eller s\u00e5 kommer inte data att betecknas korrekt.", - "title": "Anv\u00e4ndarprofil." } }, "title": "Withings" diff --git a/homeassistant/components/withings/.translations/zh-Hant.json b/homeassistant/components/withings/.translations/zh-Hant.json index 06870c4020a8..61ae1fd8e06a 100644 --- a/homeassistant/components/withings/.translations/zh-Hant.json +++ b/homeassistant/components/withings/.translations/zh-Hant.json @@ -2,8 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "\u7522\u751f\u8a8d\u8b49 URL \u6642\u903e\u6642\u3002", - "missing_configuration": "Withings \u6574\u5408\u5c1a\u672a\u8a2d\u7f6e\uff0c\u8acb\u53c3\u95b1\u6587\u4ef6\u8aaa\u660e\u3002", - "no_flows": "\u5fc5\u9808\u5148\u8a2d\u5b9a Withings \u65b9\u80fd\u9032\u884c\u8a8d\u8b49\u3002\u8acb\u53c3\u95b1\u6587\u4ef6\u3002" + "missing_configuration": "Withings \u6574\u5408\u5c1a\u672a\u8a2d\u7f6e\uff0c\u8acb\u53c3\u95b1\u6587\u4ef6\u8aaa\u660e\u3002" }, "create_entry": { "default": "\u5df2\u6210\u529f\u8a8d\u8b49 Withings \u8a2d\u5099\u3002" @@ -18,13 +17,6 @@ }, "description": "\u65bc Withings \u7db2\u7ad9\u6240\u9078\u64c7\u7684\u500b\u4eba\u8a2d\u5b9a\u70ba\u4f55\uff1f\u5047\u5982\u500b\u4eba\u8a2d\u5b9a\u4e0d\u7b26\u5408\u7684\u8a71\uff0c\u8cc7\u6599\u5c07\u6703\u6a19\u793a\u932f\u8aa4\u3002", "title": "\u500b\u4eba\u8a2d\u5b9a\u3002" - }, - "user": { - "data": { - "profile": "\u500b\u4eba\u8a2d\u5b9a" - }, - "description": "\u9078\u64c7 Home Assistant \u6240\u8981\u5c0d\u61c9\u4f7f\u7528\u7684 Withings \u500b\u4eba\u8a2d\u5b9a\u3002\u65bc Withings \u9801\u9762\u3001\u78ba\u5b9a\u9078\u53d6\u76f8\u540c\u7684\u4f7f\u7528\u8005\uff0c\u5426\u5247\u8cc7\u6599\u5c07\u7121\u6cd5\u6b63\u78ba\u6a19\u793a\u3002", - "title": "\u500b\u4eba\u8a2d\u5b9a\u3002" } }, "title": "Withings" diff --git a/homeassistant/components/wwlln/.translations/bg.json b/homeassistant/components/wwlln/.translations/bg.json index c083218c4437..f252518fcab0 100644 --- a/homeassistant/components/wwlln/.translations/bg.json +++ b/homeassistant/components/wwlln/.translations/bg.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0432\u0435\u0447\u0435 \u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043d\u043e" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/ca.json b/homeassistant/components/wwlln/.translations/ca.json index 736689c34d5e..f7fe15f27ecd 100644 --- a/homeassistant/components/wwlln/.translations/ca.json +++ b/homeassistant/components/wwlln/.translations/ca.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Aquesta ubicaci\u00f3 ja est\u00e0 registrada.", - "window_too_small": "Una finestra massa petita pot provocar que Home Assistant perdi esdeveniments." - }, - "error": { - "identifier_exists": "Ubicaci\u00f3 ja registrada" + "already_configured": "Aquesta ubicaci\u00f3 ja est\u00e0 registrada." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/cy.json b/homeassistant/components/wwlln/.translations/cy.json index e9de2acbdc6d..6050207304f3 100644 --- a/homeassistant/components/wwlln/.translations/cy.json +++ b/homeassistant/components/wwlln/.translations/cy.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Enw eisoes wedi gofrestru" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/da.json b/homeassistant/components/wwlln/.translations/da.json index 5d4f4c40b5d4..df10f39657ab 100644 --- a/homeassistant/components/wwlln/.translations/da.json +++ b/homeassistant/components/wwlln/.translations/da.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Lokalitet er allerede registreret" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/de.json b/homeassistant/components/wwlln/.translations/de.json index c02da263f899..487f2294dc69 100644 --- a/homeassistant/components/wwlln/.translations/de.json +++ b/homeassistant/components/wwlln/.translations/de.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Dieser Standort ist bereits registriert.", - "window_too_small": "Ein zu kleines Fenster f\u00fchrt dazu, dass Home Assistant Ereignisse verpasst." - }, - "error": { - "identifier_exists": "Standort bereits registriert" + "already_configured": "Dieser Standort ist bereits registriert." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/en.json b/homeassistant/components/wwlln/.translations/en.json index a12a5079f9b0..48896cc86821 100644 --- a/homeassistant/components/wwlln/.translations/en.json +++ b/homeassistant/components/wwlln/.translations/en.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "This location is already registered.", - "window_too_small": "A too-small window will cause Home Assistant to miss events." - }, - "error": { - "identifier_exists": "Location already registered" + "already_configured": "This location is already registered." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/es-419.json b/homeassistant/components/wwlln/.translations/es-419.json index d185410a4ef3..6b2e5d23ffbe 100644 --- a/homeassistant/components/wwlln/.translations/es-419.json +++ b/homeassistant/components/wwlln/.translations/es-419.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Lugar ya registrado" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/es.json b/homeassistant/components/wwlln/.translations/es.json index ee377673181b..22eb2c1e7041 100644 --- a/homeassistant/components/wwlln/.translations/es.json +++ b/homeassistant/components/wwlln/.translations/es.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Esta ubicaci\u00f3n ya est\u00e1 registrada.", - "window_too_small": "Una ventana demasiado peque\u00f1a provocar\u00e1 que Home Assistant se pierda eventos." - }, - "error": { - "identifier_exists": "Ubicaci\u00f3n ya registrada" + "already_configured": "Esta ubicaci\u00f3n ya est\u00e1 registrada." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/fr.json b/homeassistant/components/wwlln/.translations/fr.json index ad16a7e3a8dc..d19114286ad1 100644 --- a/homeassistant/components/wwlln/.translations/fr.json +++ b/homeassistant/components/wwlln/.translations/fr.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Cet emplacement est d\u00e9j\u00e0 enregistr\u00e9.", - "window_too_small": "Une fen\u00eatre trop petite emp\u00eachera Home Assistant de manquer des \u00e9v\u00e9nements." - }, - "error": { - "identifier_exists": "Emplacement d\u00e9j\u00e0 enregistr\u00e9" + "already_configured": "Cet emplacement est d\u00e9j\u00e0 enregistr\u00e9." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/hr.json b/homeassistant/components/wwlln/.translations/hr.json index 09ca1a0273f2..3dec14ffa174 100644 --- a/homeassistant/components/wwlln/.translations/hr.json +++ b/homeassistant/components/wwlln/.translations/hr.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Lokacija je ve\u0107 registrirana" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/it.json b/homeassistant/components/wwlln/.translations/it.json index 35cbb8b9bc05..1733cfdf172a 100644 --- a/homeassistant/components/wwlln/.translations/it.json +++ b/homeassistant/components/wwlln/.translations/it.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Questa posizione \u00e8 gi\u00e0 registrata.", - "window_too_small": "Una finestra troppo piccola far\u00e0 s\u00ec che Home Assistant perda gli eventi." - }, - "error": { - "identifier_exists": "Localit\u00e0 gi\u00e0 registrata" + "already_configured": "Questa posizione \u00e8 gi\u00e0 registrata." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/ko.json b/homeassistant/components/wwlln/.translations/ko.json index bc4a483a077e..a71ebe3ea0c3 100644 --- a/homeassistant/components/wwlln/.translations/ko.json +++ b/homeassistant/components/wwlln/.translations/ko.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "\uc774 \uc704\uce58\ub294 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4", - "window_too_small": "\ucc3d\uc774 \ub108\ubb34 \uc791\uc73c\uba74 Home Assistant \uac00 \uc774\ubca4\ud2b8\ub97c \ub193\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4." - }, - "error": { - "identifier_exists": "\uc704\uce58\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + "already_configured": "\uc774 \uc704\uce58\ub294 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4" }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/lb.json b/homeassistant/components/wwlln/.translations/lb.json index 00b5c35e0551..9632cb372b20 100644 --- a/homeassistant/components/wwlln/.translations/lb.json +++ b/homeassistant/components/wwlln/.translations/lb.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "D\u00ebse Standuert ass scho registr\u00e9iert", - "window_too_small": "Eng ze kleng F\u00ebnster f\u00e9iert dozou dass Home Assistant Evenementer verpasst." - }, - "error": { - "identifier_exists": "Standuert ass scho registr\u00e9iert" + "already_configured": "D\u00ebse Standuert ass scho registr\u00e9iert" }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/nl.json b/homeassistant/components/wwlln/.translations/nl.json index 8cf0e80806d6..542c53f0c034 100644 --- a/homeassistant/components/wwlln/.translations/nl.json +++ b/homeassistant/components/wwlln/.translations/nl.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Locatie al geregistreerd" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/no.json b/homeassistant/components/wwlln/.translations/no.json index ca9822d2733a..fab8810ba5e4 100644 --- a/homeassistant/components/wwlln/.translations/no.json +++ b/homeassistant/components/wwlln/.translations/no.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Denne plasseringen er allerede registrert.", - "window_too_small": "Et for lite vindu vil f\u00f8re til at Home Assistant g\u00e5r glipp av hendelser." - }, - "error": { - "identifier_exists": "Lokasjon allerede registrert" + "already_configured": "Denne plasseringen er allerede registrert." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/pl.json b/homeassistant/components/wwlln/.translations/pl.json index a202c6110860..22d84209b7fd 100644 --- a/homeassistant/components/wwlln/.translations/pl.json +++ b/homeassistant/components/wwlln/.translations/pl.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Ta lokalizacja jest ju\u017c zarejestrowana.", - "window_too_small": "Zbyt ma\u0142e okno spowoduje, \u017ce Home Assistant przegapi wydarzenia." - }, - "error": { - "identifier_exists": "Lokalizacja jest ju\u017c zarejestrowana." + "already_configured": "Ta lokalizacja jest ju\u017c zarejestrowana." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/pt-BR.json b/homeassistant/components/wwlln/.translations/pt-BR.json index 30b39a4431cd..296588f66a8e 100644 --- a/homeassistant/components/wwlln/.translations/pt-BR.json +++ b/homeassistant/components/wwlln/.translations/pt-BR.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Localiza\u00e7\u00e3o j\u00e1 registrada" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/ru.json b/homeassistant/components/wwlln/.translations/ru.json index b0e39a518980..b67d70e057be 100644 --- a/homeassistant/components/wwlln/.translations/ru.json +++ b/homeassistant/components/wwlln/.translations/ru.json @@ -3,9 +3,6 @@ "abort": { "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." }, - "error": { - "identifier_exists": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e." - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/sl.json b/homeassistant/components/wwlln/.translations/sl.json index 396180249e20..11fc4f00db8e 100644 --- a/homeassistant/components/wwlln/.translations/sl.json +++ b/homeassistant/components/wwlln/.translations/sl.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "Ta lokacija je \u017ee registrirana.", - "window_too_small": "Premajhno okno bo povzro\u010dilo, da bo Home Assistant zamudil dogodke." - }, - "error": { - "identifier_exists": "Lokacija je \u017ee registrirana" + "already_configured": "Ta lokacija je \u017ee registrirana." }, "step": { "user": { diff --git a/homeassistant/components/wwlln/.translations/sv.json b/homeassistant/components/wwlln/.translations/sv.json index 4aa525f7a2ae..3180c5434527 100644 --- a/homeassistant/components/wwlln/.translations/sv.json +++ b/homeassistant/components/wwlln/.translations/sv.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "Platsen \u00e4r redan registrerad" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/zh-Hans.json b/homeassistant/components/wwlln/.translations/zh-Hans.json index d719802ad7a7..e53d33512e18 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hans.json +++ b/homeassistant/components/wwlln/.translations/zh-Hans.json @@ -1,8 +1,5 @@ { "config": { - "error": { - "identifier_exists": "\u4f4d\u7f6e\u5df2\u7ecf\u6ce8\u518c" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/wwlln/.translations/zh-Hant.json b/homeassistant/components/wwlln/.translations/zh-Hant.json index b75c07a0813b..fac13ffe77f2 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hant.json +++ b/homeassistant/components/wwlln/.translations/zh-Hant.json @@ -1,11 +1,7 @@ { "config": { "abort": { - "already_configured": "\u6b64\u4f4d\u7f6e\u5df2\u8a3b\u518a\u3002", - "window_too_small": "\u904e\u5c0f\u7684\u8996\u7a97\u5c07\u5c0e\u81f4 Home Assistant \u932f\u904e\u4e8b\u4ef6\u3002" - }, - "error": { - "identifier_exists": "\u5ea7\u6a19\u5df2\u8a3b\u518a" + "already_configured": "\u6b64\u4f4d\u7f6e\u5df2\u8a3b\u518a\u3002" }, "step": { "user": { From ba8ae174876119266832ba044a91c460857955ff Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 02:31:41 -0700 Subject: [PATCH 214/653] Fix hue ct (#33791) --- homeassistant/components/hue/light.py | 6 +++--- tests/components/hue/test_light.py | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/hue/light.py b/homeassistant/components/hue/light.py index fa9dfe7615f9..4d81108c5eb4 100644 --- a/homeassistant/components/hue/light.py +++ b/homeassistant/components/hue/light.py @@ -280,7 +280,7 @@ class HueLight(Light): @property def min_mireds(self): """Return the coldest color_temp that this light supports.""" - if self.is_group: + if self.is_group or "ct" not in self.light.controlcapabilities: return super().min_mireds return self.light.controlcapabilities["ct"]["min"] @@ -288,8 +288,8 @@ class HueLight(Light): @property def max_mireds(self): """Return the warmest color_temp that this light supports.""" - if self.is_group: - return super().min_mireds + if self.is_group or "ct" not in self.light.controlcapabilities: + return super().max_mireds return self.light.controlcapabilities["ct"]["max"] diff --git a/tests/components/hue/test_light.py b/tests/components/hue/test_light.py index c4a2a2fc09a5..fede00cfd7d6 100644 --- a/tests/components/hue/test_light.py +++ b/tests/components/hue/test_light.py @@ -109,7 +109,6 @@ LIGHT_2_CAPABILITIES = { "maxlumen": 600, "colorgamuttype": "A", "colorgamut": [[0.704, 0.296], [0.2151, 0.7106], [0.138, 0.08]], - "ct": {"min": 153, "max": 500}, }, "streaming": {"renderer": True, "proxy": False}, } From c6c7dd10f5b9d66ec9105736929cc73e79b768b3 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Wed, 8 Apr 2020 12:59:38 +0200 Subject: [PATCH 215/653] Clean up access to config in various integrations (#33759) --- homeassistant/components/acer_projector/switch.py | 8 ++++---- homeassistant/components/ads/__init__.py | 4 ++-- homeassistant/components/ads/binary_sensor.py | 4 ++-- homeassistant/components/ads/light.py | 4 ++-- homeassistant/components/ads/sensor.py | 6 +++--- homeassistant/components/ads/switch.py | 9 ++++++--- homeassistant/components/aladdin_connect/cover.py | 4 ++-- homeassistant/components/alarmdecoder/__init__.py | 8 ++++---- homeassistant/components/alert/__init__.py | 14 +++++++------- homeassistant/components/alpha_vantage/sensor.py | 6 +++--- homeassistant/components/amazon_polly/tts.py | 6 +++--- 11 files changed, 38 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/acer_projector/switch.py b/homeassistant/components/acer_projector/switch.py index bc97a844a5ac..9afc99635221 100644 --- a/homeassistant/components/acer_projector/switch.py +++ b/homeassistant/components/acer_projector/switch.py @@ -61,10 +61,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Connect with serial port and return Acer Projector.""" - serial_port = config.get(CONF_FILENAME) - name = config.get(CONF_NAME) - timeout = config.get(CONF_TIMEOUT) - write_timeout = config.get(CONF_WRITE_TIMEOUT) + serial_port = config[CONF_FILENAME] + name = config[CONF_NAME] + timeout = config[CONF_TIMEOUT] + write_timeout = config[CONF_WRITE_TIMEOUT] add_entities([AcerSwitch(serial_port, name, timeout, write_timeout)], True) diff --git a/homeassistant/components/ads/__init__.py b/homeassistant/components/ads/__init__.py index adaaaa08b7f7..15d58eb46204 100644 --- a/homeassistant/components/ads/__init__.py +++ b/homeassistant/components/ads/__init__.py @@ -82,9 +82,9 @@ def setup(hass, config): conf = config[DOMAIN] - net_id = conf.get(CONF_DEVICE) + net_id = conf[CONF_DEVICE] ip_address = conf.get(CONF_IP_ADDRESS) - port = conf.get(CONF_PORT) + port = conf[CONF_PORT] client = pyads.Connection(net_id, port, ip_address) diff --git a/homeassistant/components/ads/binary_sensor.py b/homeassistant/components/ads/binary_sensor.py index fd6d77873b5f..9e2f7b0cc4a4 100644 --- a/homeassistant/components/ads/binary_sensor.py +++ b/homeassistant/components/ads/binary_sensor.py @@ -29,8 +29,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Binary Sensor platform for ADS.""" ads_hub = hass.data.get(DATA_ADS) - ads_var = config.get(CONF_ADS_VAR) - name = config.get(CONF_NAME) + ads_var = config[CONF_ADS_VAR] + name = config[CONF_NAME] device_class = config.get(CONF_DEVICE_CLASS) ads_sensor = AdsBinarySensor(ads_hub, name, ads_var, device_class) diff --git a/homeassistant/components/ads/light.py b/homeassistant/components/ads/light.py index b9626b9e969f..384bd2e83a6f 100644 --- a/homeassistant/components/ads/light.py +++ b/homeassistant/components/ads/light.py @@ -36,9 +36,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the light platform for ADS.""" ads_hub = hass.data.get(DATA_ADS) - ads_var_enable = config.get(CONF_ADS_VAR) + ads_var_enable = config[CONF_ADS_VAR] ads_var_brightness = config.get(CONF_ADS_VAR_BRIGHTNESS) - name = config.get(CONF_NAME) + name = config[CONF_NAME] add_entities([AdsLight(ads_hub, ads_var_enable, ads_var_brightness, name)]) diff --git a/homeassistant/components/ads/sensor.py b/homeassistant/components/ads/sensor.py index 3bdcbfc95f81..134acae3f943 100644 --- a/homeassistant/components/ads/sensor.py +++ b/homeassistant/components/ads/sensor.py @@ -36,9 +36,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up an ADS sensor device.""" ads_hub = hass.data.get(ads.DATA_ADS) - ads_var = config.get(CONF_ADS_VAR) - ads_type = config.get(CONF_ADS_TYPE) - name = config.get(CONF_NAME) + ads_var = config[CONF_ADS_VAR] + ads_type = config[CONF_ADS_TYPE] + name = config[CONF_NAME] unit_of_measurement = config.get(CONF_UNIT_OF_MEASUREMENT) factor = config.get(CONF_ADS_FACTOR) diff --git a/homeassistant/components/ads/switch.py b/homeassistant/components/ads/switch.py index 3590b6af88e5..64c797ff3097 100644 --- a/homeassistant/components/ads/switch.py +++ b/homeassistant/components/ads/switch.py @@ -14,7 +14,10 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = "ADS Switch" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - {vol.Required(CONF_ADS_VAR): cv.string, vol.Optional(CONF_NAME): cv.string} + { + vol.Required(CONF_ADS_VAR): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + } ) @@ -22,8 +25,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up switch platform for ADS.""" ads_hub = hass.data.get(DATA_ADS) - name = config.get(CONF_NAME) - ads_var = config.get(CONF_ADS_VAR) + name = config[CONF_NAME] + ads_var = config[CONF_ADS_VAR] add_entities([AdsSwitch(ads_hub, name, ads_var)]) diff --git a/homeassistant/components/aladdin_connect/cover.py b/homeassistant/components/aladdin_connect/cover.py index 351703c5cb37..eaa2dfc85f00 100644 --- a/homeassistant/components/aladdin_connect/cover.py +++ b/homeassistant/components/aladdin_connect/cover.py @@ -42,8 +42,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Aladdin Connect platform.""" - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] acc = AladdinConnectClient(username, password) try: diff --git a/homeassistant/components/alarmdecoder/__init__.py b/homeassistant/components/alarmdecoder/__init__.py index 5e143fcca81e..c70bcdcc45cc 100644 --- a/homeassistant/components/alarmdecoder/__init__.py +++ b/homeassistant/components/alarmdecoder/__init__.py @@ -187,12 +187,12 @@ def setup(hass, config): controller = False if device_type == "socket": - host = device.get(CONF_HOST) - port = device.get(CONF_DEVICE_PORT) + host = device[CONF_HOST] + port = device[CONF_DEVICE_PORT] controller = AlarmDecoder(SocketDevice(interface=(host, port))) elif device_type == "serial": - path = device.get(CONF_DEVICE_PATH) - baud = device.get(CONF_DEVICE_BAUD) + path = device[CONF_DEVICE_PATH] + baud = device[CONF_DEVICE_BAUD] controller = AlarmDecoder(SerialDevice(interface=path)) elif device_type == "usb": AlarmDecoder(USBDevice.find()) diff --git a/homeassistant/components/alert/__init__.py b/homeassistant/components/alert/__init__.py index aa8d19dc40fe..f3b15a7af572 100644 --- a/homeassistant/components/alert/__init__.py +++ b/homeassistant/components/alert/__init__.py @@ -79,15 +79,15 @@ async def async_setup(hass, config): if not cfg: cfg = {} - name = cfg.get(CONF_NAME) - watched_entity_id = cfg.get(CONF_ENTITY_ID) - alert_state = cfg.get(CONF_STATE) - repeat = cfg.get(CONF_REPEAT) - skip_first = cfg.get(CONF_SKIP_FIRST) + name = cfg[CONF_NAME] + watched_entity_id = cfg[CONF_ENTITY_ID] + alert_state = cfg[CONF_STATE] + repeat = cfg[CONF_REPEAT] + skip_first = cfg[CONF_SKIP_FIRST] message_template = cfg.get(CONF_ALERT_MESSAGE) done_message_template = cfg.get(CONF_DONE_MESSAGE) - notifiers = cfg.get(CONF_NOTIFIERS) - can_ack = cfg.get(CONF_CAN_ACK) + notifiers = cfg[CONF_NOTIFIERS] + can_ack = cfg[CONF_CAN_ACK] title_template = cfg.get(CONF_TITLE) data = cfg.get(CONF_DATA) diff --git a/homeassistant/components/alpha_vantage/sensor.py b/homeassistant/components/alpha_vantage/sensor.py index 7d871c286e57..0d0aec47915e 100644 --- a/homeassistant/components/alpha_vantage/sensor.py +++ b/homeassistant/components/alpha_vantage/sensor.py @@ -64,7 +64,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Alpha Vantage sensor.""" - api_key = config.get(CONF_API_KEY) + api_key = config[CONF_API_KEY] symbols = config.get(CONF_SYMBOLS, []) conversions = config.get(CONF_FOREIGN_EXCHANGE, []) @@ -162,8 +162,8 @@ class AlphaVantageForeignExchange(Entity): def __init__(self, foreign_exchange, config): """Initialize the sensor.""" self._foreign_exchange = foreign_exchange - self._from_currency = config.get(CONF_FROM) - self._to_currency = config.get(CONF_TO) + self._from_currency = config[CONF_FROM] + self._to_currency = config[CONF_TO] if CONF_NAME in config: self._name = config.get(CONF_NAME) else: diff --git a/homeassistant/components/amazon_polly/tts.py b/homeassistant/components/amazon_polly/tts.py index bcb4a24e95b9..ef3fe4e3ccbf 100644 --- a/homeassistant/components/amazon_polly/tts.py +++ b/homeassistant/components/amazon_polly/tts.py @@ -147,7 +147,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def get_engine(hass, config, discovery_info=None): """Set up Amazon Polly speech component.""" - output_format = config.get(CONF_OUTPUT_FORMAT) + output_format = config[CONF_OUTPUT_FORMAT] sample_rate = config.get(CONF_SAMPLE_RATE, DEFAULT_SAMPLE_RATES[output_format]) if sample_rate not in SUPPORTED_SAMPLE_RATES_MAP.get(output_format): _LOGGER.error( @@ -163,7 +163,7 @@ def get_engine(hass, config, discovery_info=None): boto3.setup_default_session(profile_name=profile) aws_config = { - CONF_REGION: config.get(CONF_REGION), + CONF_REGION: config[CONF_REGION], CONF_ACCESS_KEY_ID: config.get(CONF_ACCESS_KEY_ID), CONF_SECRET_ACCESS_KEY: config.get(CONF_SECRET_ACCESS_KEY), } @@ -197,7 +197,7 @@ class AmazonPollyProvider(Provider): self.config = config self.supported_langs = supported_languages self.all_voices = all_voices - self.default_voice = self.config.get(CONF_VOICE) + self.default_voice = self.config[CONF_VOICE] self.name = "Amazon Polly" @property From 14f035a39b8f82fce3a90f9c2456eb48f531dc3a Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 8 Apr 2020 13:12:07 +0200 Subject: [PATCH 216/653] Upgrade sqlalchemy to 1.3.16 (#33810) --- homeassistant/components/recorder/manifest.json | 2 +- homeassistant/components/sql/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/recorder/manifest.json b/homeassistant/components/recorder/manifest.json index d21c46c9e62e..0d662c572bdd 100644 --- a/homeassistant/components/recorder/manifest.json +++ b/homeassistant/components/recorder/manifest.json @@ -2,7 +2,7 @@ "domain": "recorder", "name": "Recorder", "documentation": "https://www.home-assistant.io/integrations/recorder", - "requirements": ["sqlalchemy==1.3.15"], + "requirements": ["sqlalchemy==1.3.16"], "codeowners": [], "quality_scale": "internal" } diff --git a/homeassistant/components/sql/manifest.json b/homeassistant/components/sql/manifest.json index 306e65e04704..9bfc5b35288b 100644 --- a/homeassistant/components/sql/manifest.json +++ b/homeassistant/components/sql/manifest.json @@ -2,6 +2,6 @@ "domain": "sql", "name": "SQL", "documentation": "https://www.home-assistant.io/integrations/sql", - "requirements": ["sqlalchemy==1.3.15"], + "requirements": ["sqlalchemy==1.3.16"], "codeowners": ["@dgomes"] } diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 2e14525a103a..c71c49e12776 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -22,7 +22,7 @@ pytz>=2019.03 pyyaml==5.3.1 requests==2.23.0 ruamel.yaml==0.15.100 -sqlalchemy==1.3.15 +sqlalchemy==1.3.16 voluptuous-serialize==2.3.0 voluptuous==0.11.7 zeroconf==0.25.0 diff --git a/requirements_all.txt b/requirements_all.txt index 7f62e9e3044c..c23f06f0dd44 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1947,7 +1947,7 @@ spotipy==2.10.0 # homeassistant.components.recorder # homeassistant.components.sql -sqlalchemy==1.3.15 +sqlalchemy==1.3.16 # homeassistant.components.starline starline==0.1.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0adf42251665..434a5cb7acd3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -722,7 +722,7 @@ spotipy==2.10.0 # homeassistant.components.recorder # homeassistant.components.sql -sqlalchemy==1.3.15 +sqlalchemy==1.3.16 # homeassistant.components.starline starline==0.1.3 From b0978f064f147f4fc1f7066b27a6c0152629e69d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 8 Apr 2020 13:12:18 +0200 Subject: [PATCH 217/653] Upgrade shodan to 1.23.0 (#33811) --- homeassistant/components/shodan/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/shodan/manifest.json b/homeassistant/components/shodan/manifest.json index 0e8ce3dc963a..264ae3655f65 100644 --- a/homeassistant/components/shodan/manifest.json +++ b/homeassistant/components/shodan/manifest.json @@ -2,6 +2,6 @@ "domain": "shodan", "name": "Shodan", "documentation": "https://www.home-assistant.io/integrations/shodan", - "requirements": ["shodan==1.22.0"], + "requirements": ["shodan==1.23.0"], "codeowners": ["@fabaff"] } diff --git a/requirements_all.txt b/requirements_all.txt index c23f06f0dd44..546bf169d38f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1866,7 +1866,7 @@ sentry-sdk==0.13.5 sharp_aquos_rc==0.3.2 # homeassistant.components.shodan -shodan==1.22.0 +shodan==1.23.0 # homeassistant.components.sighthound simplehound==0.3 From f5b7deda72b3f56cfb40a743723c263e531a8f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9-Marc=20Simard?= Date: Wed, 8 Apr 2020 10:52:39 -0400 Subject: [PATCH 218/653] Add counters for GitHub repo forks, clones, views (#33300) * Add counters for GitHub repo forks, clones, views * Rename uniques to unique --- homeassistant/components/github/sensor.py | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/homeassistant/components/github/sensor.py b/homeassistant/components/github/sensor.py index 26199763036d..68b5586207af 100644 --- a/homeassistant/components/github/sensor.py +++ b/homeassistant/components/github/sensor.py @@ -30,6 +30,11 @@ ATTR_LATEST_OPEN_PULL_REQUEST_URL = "latest_open_pull_request_url" ATTR_OPEN_PULL_REQUESTS = "open_pull_requests" ATTR_PATH = "path" ATTR_STARGAZERS = "stargazers" +ATTR_FORKS = "forks" +ATTR_CLONES = "clones" +ATTR_CLONES_UNIQUE = "clones_unique" +ATTR_VIEWS = "views" +ATTR_VIEWS_UNIQUE = "views_unique" DEFAULT_NAME = "GitHub" @@ -86,6 +91,11 @@ class GitHubSensor(Entity): self._pull_request_count = None self._latest_open_pr_url = None self._stargazers = None + self._forks = None + self._clones = None + self._clones_unique = None + self._views = None + self._views_unique = None self._github_data = github_data @property @@ -122,6 +132,11 @@ class GitHubSensor(Entity): ATTR_LATEST_OPEN_PULL_REQUEST_URL: self._latest_open_pr_url, ATTR_OPEN_PULL_REQUESTS: self._pull_request_count, ATTR_STARGAZERS: self._stargazers, + ATTR_FORKS: self._forks, + ATTR_CLONES: self._clones, + ATTR_CLONES_UNIQUE: self._clones_unique, + ATTR_VIEWS: self._views, + ATTR_VIEWS_UNIQUE: self._views_unique, } if self._latest_release_tag is not None: attrs[ATTR_LATEST_RELEASE_TAG] = self._latest_release_tag @@ -154,6 +169,11 @@ class GitHubSensor(Entity): self._pull_request_count = self._github_data.pull_request_count self._latest_open_pr_url = self._github_data.latest_open_pr_url self._stargazers = self._github_data.stargazers + self._forks = self._github_data.forks + self._clones = self._github_data.clones + self._clones_unique = self._github_data.clones_unique + self._views = self._github_data.views + self._views_unique = self._github_data.views_unique class GitHubData: @@ -190,6 +210,11 @@ class GitHubData: self.pull_request_count = None self.latest_open_pr_url = None self.stargazers = None + self.forks = None + self.clones = None + self.clones_unique = None + self.views = None + self.views_unique = None def update(self): """Update GitHub Sensor.""" @@ -197,6 +222,7 @@ class GitHubData: repo = self._github_obj.get_repo(self.repository_path) self.stargazers = repo.stargazers_count + self.forks = repo.forks_count open_issues = repo.get_issues(state="open", sort="created") if open_issues is not None: @@ -218,6 +244,16 @@ class GitHubData: if releases and releases.totalCount > 0: self.latest_release_url = releases[0].html_url + clones = repo.get_clones_traffic() + if clones is not None: + self.clones = clones.get("count") + self.clones_unique = clones.get("uniques") + + views = repo.get_views_traffic() + if views is not None: + self.views = views.get("count") + self.views_unique = views.get("uniques") + self.available = True except self._github.GithubException as err: _LOGGER.error("GitHub error for %s: %s", self.repository_path, err) From a3e84791c6bed7e841205be76bcd210d7db6234d Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Wed, 8 Apr 2020 11:22:25 -0400 Subject: [PATCH 219/653] Convert nws integration to component configuration (#31398) * convert nws to component configuration * add more debug logging * remove assumed state * move initialization of data into init * refactor update logic * use forecast success for checking available entities * Split unique_id into more usable pieces. use a base_unique_id for each entry. Add domain for signaling to entities. Each entity in each platform can use base_unique_id to form individual unique_id's. * Revert "move initialization of data into init" This reverts commit 09eb0220469285b10f0500f5f6def67415931a81. * add silver quality scale to manifest * unsubscribe listener in will_remove_from_hass * initialize _unsub_listener in __init__ * use async_on_remove * remove scan interval from configuration * Use better name Co-Authored-By: J. Nick Koston Co-authored-by: J. Nick Koston --- homeassistant/components/nws/__init__.py | 177 +++++++++++++++- homeassistant/components/nws/const.py | 54 +++++ homeassistant/components/nws/manifest.json | 3 +- homeassistant/components/nws/weather.py | 231 +++++++-------------- tests/components/nws/conftest.py | 24 +++ tests/components/nws/const.py | 4 + tests/components/nws/test_init.py | 67 ++++++ tests/components/nws/test_weather.py | 209 +++++++++---------- 8 files changed, 496 insertions(+), 273 deletions(-) create mode 100644 homeassistant/components/nws/const.py create mode 100644 tests/components/nws/conftest.py create mode 100644 tests/components/nws/test_init.py diff --git a/homeassistant/components/nws/__init__.py b/homeassistant/components/nws/__init__.py index dde2f6dee11c..1a046c4a05d6 100644 --- a/homeassistant/components/nws/__init__.py +++ b/homeassistant/components/nws/__init__.py @@ -1 +1,176 @@ -"""NWS Integration.""" +"""The National Weather Service integration.""" +import asyncio +import datetime +import logging + +import aiohttp +from pynws import SimpleNWS +import voluptuous as vol + +from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.core import HomeAssistant +from homeassistant.helpers import discovery +from homeassistant.helpers.aiohttp_client import async_get_clientsession +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.event import async_track_time_interval + +from .const import CONF_STATION, DOMAIN + +_LOGGER = logging.getLogger(__name__) + +_INDIVIDUAL_SCHEMA = vol.Schema( + { + vol.Required(CONF_API_KEY): cv.string, + vol.Inclusive( + CONF_LATITUDE, "coordinates", "Latitude and longitude must exist together" + ): cv.latitude, + vol.Inclusive( + CONF_LONGITUDE, "coordinates", "Latitude and longitude must exist together" + ): cv.longitude, + vol.Optional(CONF_STATION): cv.string, + } +) + +CONFIG_SCHEMA = vol.Schema( + {DOMAIN: vol.All(cv.ensure_list, [_INDIVIDUAL_SCHEMA])}, extra=vol.ALLOW_EXTRA, +) + +PLATFORMS = ["weather"] + +DEFAULT_SCAN_INTERVAL = datetime.timedelta(minutes=10) + + +def base_unique_id(latitude, longitude): + """Return unique id for entries in configuration.""" + return f"{latitude}_{longitude}" + + +def signal_unique_id(latitude, longitude): + """Return unique id for signaling to entries in configuration from component.""" + return f"{DOMAIN}_{base_unique_id(latitude,longitude)}" + + +async def async_setup(hass: HomeAssistant, config: dict): + """Set up the National Weather Service integration.""" + if DOMAIN not in config: + return True + + hass.data[DOMAIN] = hass.data.get(DOMAIN, {}) + for entry in config[DOMAIN]: + latitude = entry.get(CONF_LATITUDE, hass.config.latitude) + longitude = entry.get(CONF_LONGITUDE, hass.config.longitude) + api_key = entry[CONF_API_KEY] + + client_session = async_get_clientsession(hass) + + if base_unique_id(latitude, longitude) in hass.data[DOMAIN]: + _LOGGER.error( + "Duplicate entry in config: latitude %s latitude: %s", + latitude, + longitude, + ) + continue + + nws_data = NwsData(hass, latitude, longitude, api_key, client_session) + hass.data[DOMAIN][base_unique_id(latitude, longitude)] = nws_data + async_track_time_interval(hass, nws_data.async_update, DEFAULT_SCAN_INTERVAL) + + for component in PLATFORMS: + hass.async_create_task( + discovery.async_load_platform(hass, component, DOMAIN, {}, config) + ) + + return True + + +class NwsData: + """Data class for National Weather Service integration.""" + + def __init__(self, hass, latitude, longitude, api_key, websession): + """Initialize the data.""" + self.hass = hass + self.latitude = latitude + self.longitude = longitude + ha_api_key = f"{api_key} homeassistant" + self.nws = SimpleNWS(latitude, longitude, ha_api_key, websession) + + self.update_observation_success = True + self.update_forecast_success = True + self.update_forecast_hourly_success = True + + async def async_set_station(self, station): + """ + Set to desired station. + + If None, nearest station is used. + """ + await self.nws.set_station(station) + _LOGGER.debug("Nearby station list: %s", self.nws.stations) + + @property + def station(self): + """Return station name.""" + return self.nws.station + + @property + def observation(self): + """Return observation.""" + return self.nws.observation + + @property + def forecast(self): + """Return day+night forecast.""" + return self.nws.forecast + + @property + def forecast_hourly(self): + """Return hourly forecast.""" + return self.nws.forecast_hourly + + @staticmethod + async def _async_update_item(update_call, update_type, station_name, success): + try: + _LOGGER.debug("Updating %s for station %s", update_type, station_name) + await update_call() + + if success: + _LOGGER.warning( + "Success updating %s for station %s", update_type, station_name + ) + success = True + except (aiohttp.ClientError, asyncio.TimeoutError) as err: + if success: + _LOGGER.warning( + "Error updating %s for station %s: %s", + update_type, + station_name, + err, + ) + success = False + + async def async_update(self, now=None): + """Update all data.""" + + await self._async_update_item( + self.nws.update_observation, + "observation", + self.station, + self.update_observation_success, + ) + await self._async_update_item( + self.nws.update_forecast, + "forecast", + self.station, + self.update_forecast_success, + ) + await self._async_update_item( + self.nws.update_forecast_hourly, + "forecast_hourly", + self.station, + self.update_forecast_hourly_success, + ) + + async_dispatcher_send( + self.hass, signal_unique_id(self.latitude, self.longitude) + ) diff --git a/homeassistant/components/nws/const.py b/homeassistant/components/nws/const.py new file mode 100644 index 000000000000..769f927ea71a --- /dev/null +++ b/homeassistant/components/nws/const.py @@ -0,0 +1,54 @@ +"""Constants for National Weather Service Integration.""" +DOMAIN = "nws" + +CONF_STATION = "station" + +ATTRIBUTION = "Data from National Weather Service/NOAA" + +ATTR_FORECAST_DETAILED_DESCRIPTION = "detailed_description" +ATTR_FORECAST_PRECIP_PROB = "precipitation_probability" +ATTR_FORECAST_DAYTIME = "daytime" + +CONDITION_CLASSES = { + "exceptional": [ + "Tornado", + "Hurricane conditions", + "Tropical storm conditions", + "Dust", + "Smoke", + "Haze", + "Hot", + "Cold", + ], + "snowy": ["Snow", "Sleet", "Blizzard"], + "snowy-rainy": [ + "Rain/snow", + "Rain/sleet", + "Freezing rain/snow", + "Freezing rain", + "Rain/freezing rain", + ], + "hail": [], + "lightning-rainy": [ + "Thunderstorm (high cloud cover)", + "Thunderstorm (medium cloud cover)", + "Thunderstorm (low cloud cover)", + ], + "lightning": [], + "pouring": [], + "rainy": [ + "Rain", + "Rain showers (high cloud cover)", + "Rain showers (low cloud cover)", + ], + "windy-variant": ["Mostly cloudy and windy", "Overcast and windy"], + "windy": [ + "Fair/clear and windy", + "A few clouds and windy", + "Partly cloudy and windy", + ], + "fog": ["Fog/mist"], + "clear": ["Fair/clear"], # sunny and clear-night + "cloudy": ["Mostly cloudy", "Overcast"], + "partlycloudy": ["A few clouds", "Partly cloudy"], +} diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index 17c4c9062668..b4b6e402941c 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -3,5 +3,6 @@ "name": "National Weather Service (NWS)", "documentation": "https://www.home-assistant.io/integrations/nws", "codeowners": ["@MatthewFlamm"], - "requirements": ["pynws==0.10.4"] + "requirements": ["pynws==0.10.4"], + "quality_scale": "silver" } diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index a0ce1449479f..0c409bef3ca8 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -1,12 +1,8 @@ """Support for NWS weather service.""" -from collections import OrderedDict -from datetime import timedelta -from json import JSONDecodeError +import asyncio import logging import aiohttp -from pynws import SimpleNWS -import voluptuous as vol from homeassistant.components.weather import ( ATTR_FORECAST_CONDITION, @@ -14,15 +10,11 @@ from homeassistant.components.weather import ( ATTR_FORECAST_TIME, ATTR_FORECAST_WIND_BEARING, ATTR_FORECAST_WIND_SPEED, - PLATFORM_SCHEMA, WeatherEntity, ) from homeassistant.const import ( - CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, - CONF_MODE, - CONF_NAME, LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_MILES, @@ -32,110 +24,26 @@ from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, ) +from homeassistant.core import callback from homeassistant.exceptions import PlatformNotReady -from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.aiohttp_client import async_get_clientsession -from homeassistant.util import Throttle +from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.util.distance import convert as convert_distance from homeassistant.util.pressure import convert as convert_pressure from homeassistant.util.temperature import convert as convert_temperature +from . import base_unique_id, signal_unique_id +from .const import ( + ATTR_FORECAST_DAYTIME, + ATTR_FORECAST_DETAILED_DESCRIPTION, + ATTR_FORECAST_PRECIP_PROB, + ATTRIBUTION, + CONDITION_CLASSES, + CONF_STATION, + DOMAIN, +) + _LOGGER = logging.getLogger(__name__) -ATTRIBUTION = "Data from National Weather Service/NOAA" - -SCAN_INTERVAL = timedelta(minutes=15) -MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5) - -CONF_STATION = "station" - -ATTR_FORECAST_DETAIL_DESCRIPTION = "detailed_description" -ATTR_FORECAST_PRECIP_PROB = "precipitation_probability" -ATTR_FORECAST_DAYTIME = "daytime" - -# Ordered so that a single condition can be chosen from multiple weather codes. -# Catalog of NWS icon weather codes listed at: -# https://api.weather.gov/icons -CONDITION_CLASSES = OrderedDict( - [ - ( - "exceptional", - [ - "Tornado", - "Hurricane conditions", - "Tropical storm conditions", - "Dust", - "Smoke", - "Haze", - "Hot", - "Cold", - ], - ), - ("snowy", ["Snow", "Sleet", "Blizzard"]), - ( - "snowy-rainy", - [ - "Rain/snow", - "Rain/sleet", - "Freezing rain/snow", - "Freezing rain", - "Rain/freezing rain", - ], - ), - ("hail", []), - ( - "lightning-rainy", - [ - "Thunderstorm (high cloud cover)", - "Thunderstorm (medium cloud cover)", - "Thunderstorm (low cloud cover)", - ], - ), - ("lightning", []), - ("pouring", []), - ( - "rainy", - [ - "Rain", - "Rain showers (high cloud cover)", - "Rain showers (low cloud cover)", - ], - ), - ("windy-variant", ["Mostly cloudy and windy", "Overcast and windy"]), - ( - "windy", - [ - "Fair/clear and windy", - "A few clouds and windy", - "Partly cloudy and windy", - ], - ), - ("fog", ["Fog/mist"]), - ("clear", ["Fair/clear"]), # sunny and clear-night - ("cloudy", ["Mostly cloudy", "Overcast"]), - ("partlycloudy", ["A few clouds", "Partly cloudy"]), - ] -) - -ERRORS = (aiohttp.ClientError, JSONDecodeError) - -FORECAST_MODE = ["daynight", "hourly"] - -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - { - vol.Optional(CONF_NAME): cv.string, - vol.Inclusive( - CONF_LATITUDE, "coordinates", "Latitude and longitude must exist together" - ): cv.latitude, - vol.Inclusive( - CONF_LONGITUDE, "coordinates", "Latitude and longitude must exist together" - ): cv.longitude, - vol.Optional(CONF_MODE, default="daynight"): vol.In(FORECAST_MODE), - vol.Optional(CONF_STATION): cv.string, - vol.Required(CONF_API_KEY): cv.string, - } -) - def convert_condition(time, weather): """ @@ -165,85 +73,73 @@ def convert_condition(time, weather): return cond, max(prec_probs) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info): """Set up the NWS weather platform.""" - latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) station = config.get(CONF_STATION) - api_key = config[CONF_API_KEY] - mode = config[CONF_MODE] - websession = async_get_clientsession(hass) - # ID request as being from HA, pynws prepends the api_key in addition - api_key_ha = f"{api_key} homeassistant" - nws = SimpleNWS(latitude, longitude, api_key_ha, websession) + nws_data = hass.data[DOMAIN][base_unique_id(latitude, longitude)] - _LOGGER.debug("Setting up station: %s", station) try: - await nws.set_station(station) - except ERRORS as status: - _LOGGER.error( - "Error getting station list for %s: %s", (latitude, longitude), status - ) + await nws_data.async_set_station(station) + except (aiohttp.ClientError, asyncio.TimeoutError) as err: + _LOGGER.error("Error automatically setting station: %s", str(err)) raise PlatformNotReady - _LOGGER.debug("Station list: %s", nws.stations) - _LOGGER.debug( - "Initialized for coordinates %s, %s -> station %s", - latitude, - longitude, - nws.station, - ) + await nws_data.async_update() - async_add_entities([NWSWeather(nws, mode, hass.config.units, config)], True) + async_add_entities( + [ + NWSWeather(nws_data, "daynight", hass.config.units), + NWSWeather(nws_data, "hourly", hass.config.units), + ], + False, + ) class NWSWeather(WeatherEntity): """Representation of a weather condition.""" - def __init__(self, nws, mode, units, config): + def __init__(self, nws, mode, units): """Initialise the platform with a data instance and station name.""" self.nws = nws - self.station_name = config.get(CONF_NAME, self.nws.station) + self.station = nws.station + self.latitude = nws.latitude + self.longitude = nws.longitude + self.is_metric = units.is_metric self.mode = mode self.observation = None self._forecast = None - @Throttle(MIN_TIME_BETWEEN_UPDATES) - async def async_update(self): - """Update Condition.""" - _LOGGER.debug("Updating station observations %s", self.nws.station) - try: - await self.nws.update_observation() - except ERRORS as status: - _LOGGER.error( - "Error updating observation from station %s: %s", - self.nws.station, - status, + async def async_added_to_hass(self) -> None: + """Set up a listener and load data.""" + self.async_on_remove( + async_dispatcher_connect( + self.hass, + signal_unique_id(self.latitude, self.longitude), + self._update_callback, ) - else: - self.observation = self.nws.observation - _LOGGER.debug("Observation: %s", self.observation) - _LOGGER.debug("Updating forecast") - try: - if self.mode == "daynight": - await self.nws.update_forecast() - else: - await self.nws.update_forecast_hourly() - except ERRORS as status: - _LOGGER.error( - "Error updating forecast from station %s: %s", self.nws.station, status - ) - return + ) + self._update_callback() + + @callback + def _update_callback(self) -> None: + """Load data from integration.""" + self.observation = self.nws.observation if self.mode == "daynight": self._forecast = self.nws.forecast else: self._forecast = self.nws.forecast_hourly - _LOGGER.debug("Forecast: %s", self._forecast) - _LOGGER.debug("Finished updating") + + self.async_schedule_update_ha_state() + + @property + def should_poll(self) -> bool: + """Entities do not individually poll.""" + return False @property def attribution(self): @@ -253,7 +149,7 @@ class NWSWeather(WeatherEntity): @property def name(self): """Return the name of the station.""" - return self.station_name + return f"{self.station} {self.mode.title()}" @property def temperature(self): @@ -354,7 +250,7 @@ class NWSWeather(WeatherEntity): forecast = [] for forecast_entry in self._forecast: data = { - ATTR_FORECAST_DETAIL_DESCRIPTION: forecast_entry.get( + ATTR_FORECAST_DETAILED_DESCRIPTION: forecast_entry.get( "detailedForecast" ), ATTR_FORECAST_TEMP: forecast_entry.get("temperature"), @@ -385,3 +281,20 @@ class NWSWeather(WeatherEntity): data[ATTR_FORECAST_WIND_SPEED] = None forecast.append(data) return forecast + + @property + def unique_id(self): + """Return a unique_id for this entity.""" + return f"{base_unique_id(self.latitude, self.longitude)}_{self.mode}" + + @property + def available(self): + """Return if state is available.""" + if self.mode == "daynight": + return ( + self.nws.update_observation_success and self.nws.update_forecast_success + ) + return ( + self.nws.update_observation_success + and self.nws.update_forecast_hourly_success + ) diff --git a/tests/components/nws/conftest.py b/tests/components/nws/conftest.py new file mode 100644 index 000000000000..0f28dec1d26f --- /dev/null +++ b/tests/components/nws/conftest.py @@ -0,0 +1,24 @@ +"""Fixtures for National Weather Service tests.""" +from unittest.mock import patch + +import pytest + +from tests.common import mock_coro +from tests.components.nws.const import DEFAULT_FORECAST, DEFAULT_OBSERVATION + + +@pytest.fixture() +def mock_simple_nws(): + """Mock pynws SimpleNWS with default values.""" + with patch("homeassistant.components.nws.SimpleNWS") as mock_nws: + instance = mock_nws.return_value + instance.set_station.return_value = mock_coro() + instance.update_observation.return_value = mock_coro() + instance.update_forecast.return_value = mock_coro() + instance.update_forecast_hourly.return_value = mock_coro() + instance.station = "ABC" + instance.stations = ["ABC"] + instance.observation = DEFAULT_OBSERVATION + instance.forecast = DEFAULT_FORECAST + instance.forecast_hourly = DEFAULT_FORECAST + yield mock_nws diff --git a/tests/components/nws/const.py b/tests/components/nws/const.py index 2a9bf060b734..26490e512f9a 100644 --- a/tests/components/nws/const.py +++ b/tests/components/nws/const.py @@ -1,4 +1,5 @@ """Helpers for interacting with pynws.""" +from homeassistant.components.nws.const import DOMAIN from homeassistant.components.nws.weather import ATTR_FORECAST_PRECIP_PROB from homeassistant.components.weather import ( ATTR_FORECAST_CONDITION, @@ -14,6 +15,7 @@ from homeassistant.components.weather import ( ATTR_WEATHER_WIND_SPEED, ) from homeassistant.const import ( + CONF_API_KEY, LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_MILES, @@ -27,6 +29,8 @@ from homeassistant.util.distance import convert as convert_distance from homeassistant.util.pressure import convert as convert_pressure from homeassistant.util.temperature import convert as convert_temperature +MINIMAL_CONFIG = {DOMAIN: [{CONF_API_KEY: "test"}]} + DEFAULT_STATIONS = ["ABC", "XYZ"] DEFAULT_OBSERVATION = { diff --git a/tests/components/nws/test_init.py b/tests/components/nws/test_init.py new file mode 100644 index 000000000000..015e4ad81c80 --- /dev/null +++ b/tests/components/nws/test_init.py @@ -0,0 +1,67 @@ +"""Tests for init module.""" +from homeassistant.components import nws +from homeassistant.components.nws.const import CONF_STATION, DOMAIN +from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.setup import async_setup_component + +from tests.common import assert_setup_component +from tests.components.nws.const import MINIMAL_CONFIG + +LATLON_CONFIG = { + DOMAIN: [{CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}] +} +FULL_CONFIG = { + DOMAIN: [ + { + CONF_API_KEY: "test", + CONF_LATITUDE: 45.0, + CONF_LONGITUDE: -75.0, + CONF_STATION: "XYZ", + } + ] +} +DUPLICATE_CONFIG = { + DOMAIN: [ + {CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}, + {CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}, + ] +} + + +async def test_no_config(hass, mock_simple_nws): + """Test that nws does not setup with no config.""" + with assert_setup_component(0): + assert await async_setup_component(hass, DOMAIN, {}) is True + assert DOMAIN not in hass.data + + +async def test_successful_minimal_config(hass, mock_simple_nws): + """Test that nws setup with minimal config.""" + hass.config.latitude = 40.0 + hass.config.longitude = -75.0 + with assert_setup_component(1): + assert await async_setup_component(hass, DOMAIN, MINIMAL_CONFIG) is True + assert DOMAIN in hass.data + assert nws.base_unique_id(40.0, -75.0) in hass.data[DOMAIN] + + +async def test_successful_latlon_config(hass, mock_simple_nws): + """Test that nws setup with latlon config.""" + with assert_setup_component(1): + assert await async_setup_component(hass, DOMAIN, LATLON_CONFIG) is True + assert DOMAIN in hass.data + assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] + + +async def test_successful_full_config(hass, mock_simple_nws): + """Test that nws setup with full config.""" + with assert_setup_component(1): + assert await async_setup_component(hass, DOMAIN, FULL_CONFIG) is True + assert DOMAIN in hass.data + assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] + + +async def test_unsuccessful_duplicate_config(hass, mock_simple_nws): + """Test that nws setup with duplicate config.""" + assert await async_setup_component(hass, DOMAIN, DUPLICATE_CONFIG) is True + assert len(hass.data[DOMAIN]) == 1 diff --git a/tests/components/nws/test_weather.py b/tests/components/nws/test_weather.py index f2b390a22357..d0e097326c72 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -1,35 +1,26 @@ """Tests for the NWS weather component.""" -from unittest.mock import patch +from datetime import timedelta import aiohttp import pytest +from homeassistant.components import nws from homeassistant.components.weather import ATTR_FORECAST 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 .const import ( - DEFAULT_FORECAST, - DEFAULT_OBSERVATION, +from tests.common import async_fire_time_changed +from tests.components.nws.const import ( EXPECTED_FORECAST_IMPERIAL, EXPECTED_FORECAST_METRIC, EXPECTED_OBSERVATION_IMPERIAL, EXPECTED_OBSERVATION_METRIC, + MINIMAL_CONFIG, NONE_FORECAST, NONE_OBSERVATION, ) -from tests.common import mock_coro - -MINIMAL_CONFIG = { - "weather": { - "platform": "nws", - "api_key": "x@example.com", - "latitude": 40.0, - "longitude": -85.0, - } -} - HOURLY_CONFIG = { "weather": { "platform": "nws", @@ -48,21 +39,29 @@ HOURLY_CONFIG = { (METRIC_SYSTEM, EXPECTED_OBSERVATION_METRIC, EXPECTED_FORECAST_METRIC), ], ) -async def test_imperial_metric(hass, units, result_observation, result_forecast): +async def test_imperial_metric( + hass, units, result_observation, result_forecast, mock_simple_nws +): """Test with imperial and metric units.""" hass.config.units = units - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.return_value = mock_coro() - instance.update_forecast.return_value = mock_coro() - instance.observation = DEFAULT_OBSERVATION - instance.forecast = DEFAULT_FORECAST + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() - await async_setup_component(hass, "weather", MINIMAL_CONFIG) + state = hass.states.get("weather.abc_hourly") + + assert state + assert state.state == "sunny" + + data = state.attributes + for key, value in result_observation.items(): + assert data.get(key) == value + + forecast = data.get(ATTR_FORECAST) + for key, value in result_forecast.items(): + assert forecast[0].get(key) == value + + state = hass.states.get("weather.abc_daynight") - state = hass.states.get("weather.abc") assert state assert state.state == "sunny" @@ -75,50 +74,17 @@ async def test_imperial_metric(hass, units, result_observation, result_forecast) assert forecast[0].get(key) == value -async def test_hourly(hass): - """Test with hourly option.""" - hass.config.units = IMPERIAL_SYSTEM - - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.return_value = mock_coro() - instance.update_forecast_hourly.return_value = mock_coro() - instance.observation = DEFAULT_OBSERVATION - instance.forecast_hourly = DEFAULT_FORECAST - - await async_setup_component(hass, "weather", HOURLY_CONFIG) - - state = hass.states.get("weather.abc") - assert state - assert state.state == "sunny" - - data = state.attributes - for key, value in EXPECTED_OBSERVATION_IMPERIAL.items(): - assert data.get(key) == value - - forecast = data.get(ATTR_FORECAST) - for key, value in EXPECTED_FORECAST_IMPERIAL.items(): - assert forecast[0].get(key) == value - - -async def test_none_values(hass): +async def test_none_values(hass, mock_simple_nws): """Test with none values in observation and forecast dicts.""" - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.return_value = mock_coro() - instance.update_forecast.return_value = mock_coro() - instance.observation = NONE_OBSERVATION - instance.forecast = NONE_FORECAST - await async_setup_component(hass, "weather", MINIMAL_CONFIG) + instance = mock_simple_nws.return_value + instance.observation = NONE_OBSERVATION + instance.forecast = NONE_FORECAST - state = hass.states.get("weather.abc") - assert state + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + state = hass.states.get("weather.abc_daynight") assert state.state == "unknown" - data = state.attributes for key in EXPECTED_OBSERVATION_IMPERIAL: assert data.get(key) is None @@ -128,19 +94,16 @@ async def test_none_values(hass): assert forecast[0].get(key) is None -async def test_none(hass): +async def test_none(hass, mock_simple_nws): """Test with None as observation and forecast.""" - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.return_value = mock_coro() - instance.update_forecast.return_value = mock_coro() - instance.observation = None - instance.forecast = None - await async_setup_component(hass, "weather", MINIMAL_CONFIG) + instance = mock_simple_nws.return_value + instance.observation = None + instance.forecast = None - state = hass.states.get("weather.abc") + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + state = hass.states.get("weather.abc_daynight") assert state assert state.state == "unknown" @@ -152,46 +115,68 @@ async def test_none(hass): assert forecast is None -async def test_error_station(hass): +async def test_error_station(hass, mock_simple_nws): """Test error in setting station.""" - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.side_effect = aiohttp.ClientError - instance.update_observation.return_value = mock_coro() - instance.update_forecast.return_value = mock_coro() - instance.observation = None - instance.forecast = None - await async_setup_component(hass, "weather", MINIMAL_CONFIG) - state = hass.states.get("weather.abc") - assert state is None + instance = mock_simple_nws.return_value + instance.set_station.side_effect = aiohttp.ClientError + + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) is True + await hass.async_block_till_done() + + assert hass.states.get("weather.abc_hourly") is None + assert hass.states.get("weather.abc_daynight") is None -async def test_error_observation(hass, caplog): +async def test_error_observation(hass, mock_simple_nws, caplog): """Test error during update observation.""" - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.side_effect = aiohttp.ClientError - instance.update_forecast.return_value = mock_coro() - instance.observation = None - instance.forecast = None - await async_setup_component(hass, "weather", MINIMAL_CONFIG) + instance = mock_simple_nws.return_value + instance.update_observation.side_effect = aiohttp.ClientError - assert "Error updating observation from station ABC" in caplog.text + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + instance.update_observation.side_effect = None + + future_time = dt_util.utcnow() + timedelta(minutes=15) + async_fire_time_changed(hass, future_time) + await hass.async_block_till_done() + + assert "Error updating observation" in caplog.text + assert "Success updating observation" in caplog.text -async def test_error_forecast(hass, caplog): +async def test_error_forecast(hass, caplog, mock_simple_nws): """Test error during update forecast.""" - with patch("homeassistant.components.nws.weather.SimpleNWS") as mock_nws: - instance = mock_nws.return_value - instance.station = "ABC" - instance.set_station.return_value = mock_coro() - instance.update_observation.return_value = mock_coro() - instance.update_forecast.side_effect = aiohttp.ClientError - instance.observation = None - instance.forecast = None - await async_setup_component(hass, "weather", MINIMAL_CONFIG) - assert "Error updating forecast from station ABC" in caplog.text + instance = mock_simple_nws.return_value + instance.update_forecast.side_effect = aiohttp.ClientError + + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + instance.update_forecast.side_effect = None + + future_time = dt_util.utcnow() + timedelta(minutes=15) + async_fire_time_changed(hass, future_time) + await hass.async_block_till_done() + + assert "Error updating forecast" in caplog.text + assert "Success updating forecast" in caplog.text + + +async def test_error_forecast_hourly(hass, caplog, mock_simple_nws): + """Test error during update forecast hourly.""" + instance = mock_simple_nws.return_value + instance.update_forecast_hourly.side_effect = aiohttp.ClientError + + assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + instance.update_forecast_hourly.side_effect = None + + future_time = dt_util.utcnow() + timedelta(minutes=15) + async_fire_time_changed(hass, future_time) + await hass.async_block_till_done() + + assert "Error updating forecast_hourly" in caplog.text + assert "Success updating forecast_hourly" in caplog.text From 57bbbbcf26c24c5ba2d76fa1efadbf76895040bb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 8 Apr 2020 17:24:53 +0200 Subject: [PATCH 220/653] Update translations --- .../components/doorbird/.translations/lb.json | 2 +- .../homekit_controller/.translations/lb.json | 2 +- .../icloud/.translations/zh-Hant.json | 2 +- .../components/ipp/.translations/ca.json | 6 ++- .../components/ipp/.translations/lb.json | 3 +- .../components/ipp/.translations/ru.json | 3 +- .../components/ipp/.translations/zh-Hant.json | 3 +- .../konnected/.translations/ca.json | 7 +++- .../konnected/.translations/lb.json | 2 +- .../linky/.translations/zh-Hant.json | 2 +- .../components/nut/.translations/ca.json | 1 + .../samsungtv/.translations/lb.json | 4 +- .../synology_dsm/.translations/ca.json | 12 ++++++ .../synology_dsm/.translations/lb.json | 14 ++++++- .../synology_dsm/.translations/ru.json | 12 ++++++ .../synology_dsm/.translations/zh-Hant.json | 38 +++++++++++++++++++ .../components/unifi/.translations/lb.json | 2 +- .../components/withings/.translations/lb.json | 2 +- 18 files changed, 101 insertions(+), 16 deletions(-) create mode 100644 homeassistant/components/synology_dsm/.translations/zh-Hant.json diff --git a/homeassistant/components/doorbird/.translations/lb.json b/homeassistant/components/doorbird/.translations/lb.json index ba29b19df8a7..bbe77a36aff1 100644 --- a/homeassistant/components/doorbird/.translations/lb.json +++ b/homeassistant/components/doorbird/.translations/lb.json @@ -10,7 +10,7 @@ "invalid_auth": "Ong\u00eblteg Authentifikatioun", "unknown": "Onerwaarte Feeler" }, - "flow_title": "DoorBird {name{ ({host})", + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/homekit_controller/.translations/lb.json b/homeassistant/components/homekit_controller/.translations/lb.json index ca7bce445082..e12789dcb409 100644 --- a/homeassistant/components/homekit_controller/.translations/lb.json +++ b/homeassistant/components/homekit_controller/.translations/lb.json @@ -14,7 +14,7 @@ "busy_error": "Den Apparat huet en Kupplungs Versuch refus\u00e9iert, well en scho mat engem anere Kontroller verbonnen ass.", "max_peers_error": "Den Apparat huet den Kupplungs Versuch refus\u00e9iert well et keng fr\u00e4i Pairing Memoire huet.", "max_tries_error": "Den Apparat huet den Kupplungs Versuch refus\u00e9iert well et m\u00e9i w\u00e9i 100 net erfollegr\u00e4ich Authentifikatioun's Versich erhalen huet.", - "pairing_failed": "Eng onerwaarte Feeler ass opgetruede beim Kupplung's Versuch mat d\u00ebsem Apparat. D\u00ebst kann e tempor\u00e4re Feeler sinn oder \u00c4ren Apparat g\u00ebtt aktuell net \u00ebnnerst\u00ebtzt.", + "pairing_failed": "Eng onerwaarte Feeler ass opgetruede beim Kupplung's Versuch mat d\u00ebsem Apparat. D\u00ebst kann e tempor\u00e4re Feeler sinn oder D\u00e4in Apparat g\u00ebtt aktuell net \u00ebnnerst\u00ebtzt.", "unable_to_pair": "Feeler beim verbannen, prob\u00e9iert w.e.g. nach emol.", "unknown_error": "Apparat mellt een onbekannte Feeler. Verbindung net m\u00e9iglech." }, diff --git a/homeassistant/components/icloud/.translations/zh-Hant.json b/homeassistant/components/icloud/.translations/zh-Hant.json index cdaff703be7b..935693f87c15 100644 --- a/homeassistant/components/icloud/.translations/zh-Hant.json +++ b/homeassistant/components/icloud/.translations/zh-Hant.json @@ -5,7 +5,7 @@ "no_device": "\u8a2d\u5099\u7686\u672a\u958b\u555f\u300c\u5c0b\u627e\u6211\u7684 iPhone\u300d\u529f\u80fd\u3002" }, "error": { - "login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u79d8\u5bc6\u6b63\u78ba\u6027", + "login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u5bc6\u78bc", "send_verification_code": "\u50b3\u9001\u9a57\u8b49\u78bc\u5931\u6557", "validate_verification_code": "\u7121\u6cd5\u9a57\u8b49\u8f38\u5165\u9a57\u8b49\u78bc\uff0c\u9078\u64c7\u4e00\u90e8\u4fe1\u4efb\u8a2d\u5099\u3001\u7136\u5f8c\u91cd\u65b0\u57f7\u884c\u9a57\u8b49\u3002" }, diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index f193878d9527..284907b27560 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -3,10 +3,12 @@ "abort": { "already_configured": "Aquesta impressora ja est\u00e0 configurada.", "connection_error": "No s'ha pogut connectar amb la impressora.", - "connection_upgrade": "No s'ha pogut connectar amb la impressora, es necessita actualitzar la connexi\u00f3." + "connection_upgrade": "No s'ha pogut connectar amb la impressora, es necessita actualitzar la connexi\u00f3.", + "parse_error": "No s'ha pogut analitzar la resposta de la impressora." }, "error": { - "connection_error": "No s'ha pogut connectar amb la impressora." + "connection_error": "No s'ha pogut connectar amb la impressora.", + "connection_upgrade": "No s'ha pogut connectar amb la impressora. Prova-ho novament amb l'opci\u00f3 SSL/TLS activada." }, "flow_title": "Impressora: {name}", "step": { diff --git a/homeassistant/components/ipp/.translations/lb.json b/homeassistant/components/ipp/.translations/lb.json index bdda2cf1c14b..459eaacac4de 100644 --- a/homeassistant/components/ipp/.translations/lb.json +++ b/homeassistant/components/ipp/.translations/lb.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "D\u00ebse Printer ass scho konfigur\u00e9iert.", "connection_error": "Feeler beim verbannen mam Printer.", - "connection_upgrade": "Feeler beim verbannen mam Printer well eng Aktualis\u00e9ierung vun der Verbindung erfuerderlech ass." + "connection_upgrade": "Feeler beim verbannen mam Printer well eng Aktualis\u00e9ierung vun der Verbindung erfuerderlech ass.", + "parse_error": "Feeler beim ausliesen vun der \u00c4ntwert vum Printer." }, "error": { "connection_error": "Feeler beim verbannen mam Printer.", diff --git a/homeassistant/components/ipp/.translations/ru.json b/homeassistant/components/ipp/.translations/ru.json index 902289b2e8fd..b6bdbc8b2c05 100644 --- a/homeassistant/components/ipp/.translations/ru.json +++ b/homeassistant/components/ipp/.translations/ru.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", "connection_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443.", - "connection_upgrade": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f." + "connection_upgrade": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.", + "parse_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430." }, "error": { "connection_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443.", diff --git a/homeassistant/components/ipp/.translations/zh-Hant.json b/homeassistant/components/ipp/.translations/zh-Hant.json index fe79b4b88cd0..97d3056f60ca 100644 --- a/homeassistant/components/ipp/.translations/zh-Hant.json +++ b/homeassistant/components/ipp/.translations/zh-Hant.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "\u6b64\u5370\u8868\u6a5f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "connection_error": "\u5370\u8868\u6a5f\u9023\u7dda\u5931\u6557\u3002", - "connection_upgrade": "\u7531\u65bc\u9700\u8981\u5148\u5347\u7d1a\u9023\u7dda\u3001\u9023\u7dda\u81f3\u5370\u8868\u6a5f\u5931\u6557\u3002" + "connection_upgrade": "\u7531\u65bc\u9700\u8981\u5148\u5347\u7d1a\u9023\u7dda\u3001\u9023\u7dda\u81f3\u5370\u8868\u6a5f\u5931\u6557\u3002", + "parse_error": "\u7372\u5f97\u5370\u8868\u6a5f\u56de\u61c9\u5931\u6557\u3002" }, "error": { "connection_error": "\u5370\u8868\u6a5f\u9023\u7dda\u5931\u6557\u3002", diff --git a/homeassistant/components/konnected/.translations/ca.json b/homeassistant/components/konnected/.translations/ca.json index 80e7208391b1..1c7b4e69ec64 100644 --- a/homeassistant/components/konnected/.translations/ca.json +++ b/homeassistant/components/konnected/.translations/ca.json @@ -33,6 +33,9 @@ "abort": { "not_konn_panel": "No s'ha reconegut com a un dispositiu Konnected.io" }, + "error": { + "bad_host": "L'URL de sustituci\u00f3 de l'amfitri\u00f3 de l'API \u00e9s inv\u00e0lid" + }, "step": { "options_binary": { "data": { @@ -82,7 +85,9 @@ }, "options_misc": { "data": { - "blink": "Parpelleja el LED del panell quan s'envien canvis d'estat" + "api_host": "Substitueix l'URL d'amfitri\u00f3 d'API (opcional)", + "blink": "Parpelleja el LED del panell quan s'envien canvis d'estat", + "override_api_host": "Substitueix l'URL per defecte del panell d'amfitri\u00f3 de l'API de Home Assistant" }, "description": "Selecciona el comportament desitjat del panell", "title": "Configuraci\u00f3 diversos" diff --git a/homeassistant/components/konnected/.translations/lb.json b/homeassistant/components/konnected/.translations/lb.json index 6ad04254611c..f411c06a3e18 100644 --- a/homeassistant/components/konnected/.translations/lb.json +++ b/homeassistant/components/konnected/.translations/lb.json @@ -103,7 +103,7 @@ "pause": "Pausen zw\u00ebscht den Impulser (ms) (optional)", "repeat": "Unzuel vu Widderhuelungen (-1= onendlech) (optional)" }, - "description": "Wielt w.e.g. d'Ausgaboptiounen fir {zone}", + "description": "Wielt w.e.g. d'Ausgaboptiounen fir {zone}: Status {state}", "title": "\u00cbmschltbaren Ausgang konfigur\u00e9ieren" } }, diff --git a/homeassistant/components/linky/.translations/zh-Hant.json b/homeassistant/components/linky/.translations/zh-Hant.json index 92ad3ef0ca1a..611428432ee4 100644 --- a/homeassistant/components/linky/.translations/zh-Hant.json +++ b/homeassistant/components/linky/.translations/zh-Hant.json @@ -7,7 +7,7 @@ "access": "\u7121\u6cd5\u8a2a\u554f Enedis.fr\uff0c\u8acb\u6aa2\u67e5\u60a8\u7684\u7db2\u969b\u7db2\u8def\u9023\u7dda", "enedis": "Endis.fr \u56de\u5831\u932f\u8aa4\uff1a\u8acb\u7a0d\u5f8c\u518d\u8a66\uff08\u901a\u5e38\u907f\u958b\u591c\u9593 11 - \u51cc\u6668 2 \u9ede\u4e4b\u9593\uff09", "unknown": "\u672a\u77e5\u932f\u8aa4\uff1a\u8acb\u7a0d\u5f8c\u518d\u8a66\uff08\u901a\u5e38\u907f\u958b\u591c\u9593 11 - \u51cc\u6668 2 \u9ede\u4e4b\u9593\uff09", - "wrong_login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u79d8\u5bc6\u6b63\u78ba\u6027" + "wrong_login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u5bc6\u78bc" }, "step": { "user": { diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index 01a21920cfa2..0c81dfb3ec75 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -18,6 +18,7 @@ "resources": "Recursos", "username": "Nom d'usuari" }, + "description": "Si m\u00faltiples SAI (UPS) connectats al servidor NUT, introdueix el nom UPS per consultar al camp 'Alies'.", "title": "No s'ha pogut connectar amb el servidor NUT" } }, diff --git a/homeassistant/components/samsungtv/.translations/lb.json b/homeassistant/components/samsungtv/.translations/lb.json index 39ec28d6992d..6fc78c96fdd1 100644 --- a/homeassistant/components/samsungtv/.translations/lb.json +++ b/homeassistant/components/samsungtv/.translations/lb.json @@ -3,14 +3,14 @@ "abort": { "already_configured": "D\u00ebs Samsung TV ass scho konfigur\u00e9iert.", "already_in_progress": "Konfiguratioun fir d\u00ebs Samsung TV ass schonn am gaang.", - "auth_missing": "Home Assistant ass net authentifiz\u00e9iert fir sech mat d\u00ebsem Samsung TV ze verbannen.", + "auth_missing": "Home Assistant ass net authentifiz\u00e9iert fir sech mat d\u00ebsem Samsung TV ze verbannen. Iwwerpr\u00e9if d'Astellunge vum Fernseh fir Home Assistant z'erlaben.", "not_successful": "Keng Verbindung mat d\u00ebsem Samsung TV Apparat m\u00e9iglech.", "not_supported": "D\u00ebsen Samsung TV Modell g\u00ebtt momentan net \u00ebnnerst\u00ebtzt" }, "flow_title": "Samsnung TV:{model}", "step": { "confirm": { - "description": "W\u00ebllt dir de Samsung TV {model} ariichten?. Falls dir Home Assistant nach ni domat verbonnen hutt misst den TV eng Meldung mat enger Authentifiz\u00e9ierung uweisen. Manuell Konfiguratioun g\u00ebtt iwwerschriwwen.", + "description": "W\u00ebllt dir de Samsung TV {model} ariichten?. Falls dir Home Assistant nach ni domat verbonnen hutt misst den TV eng Meldung mat enger Authentifiz\u00e9ierung uweisen. Manuell Konfiguratioun fir d\u00ebse TV g\u00ebtt iwwerschriwwen.", "title": "Samsnung TV" }, "user": { diff --git a/homeassistant/components/synology_dsm/.translations/ca.json b/homeassistant/components/synology_dsm/.translations/ca.json index 39b99ac9306e..ce408778b55e 100644 --- a/homeassistant/components/synology_dsm/.translations/ca.json +++ b/homeassistant/components/synology_dsm/.translations/ca.json @@ -7,7 +7,19 @@ "login": "Error d\u2019inici de sessi\u00f3: comprova el nom d'usuari i la contrasenya", "unknown": "Error desconegut: torna-ho a provar m\u00e9s tard o revisa la configuraci\u00f3" }, + "flow_title": "Synology DSM {name} ({host})", "step": { + "link": { + "data": { + "api_version": "Versi\u00f3 DSM", + "password": "Contrasenya", + "port": "Port (opcional)", + "ssl": "Utilitza SSL/TLS per connectar-te al servidor NAS", + "username": "Nom d'usuari" + }, + "description": "Vols configurar {name} ({host})?", + "title": "Synology DSM" + }, "user": { "data": { "api_version": "Versi\u00f3 DSM", diff --git a/homeassistant/components/synology_dsm/.translations/lb.json b/homeassistant/components/synology_dsm/.translations/lb.json index 92026cbe2d82..553a29634372 100644 --- a/homeassistant/components/synology_dsm/.translations/lb.json +++ b/homeassistant/components/synology_dsm/.translations/lb.json @@ -7,14 +7,26 @@ "login": "Feeler beim Login: iwwerpr\u00e9if de Benotzernumm & Passwuert", "unknown": "Onbekannte Feeler: prob\u00e9ier sp\u00e9ider nach emol oder mat enger aner Konfiguratioun" }, + "flow_title": "Synology DSM {name} ({host})", "step": { + "link": { + "data": { + "api_version": "DSM Versioun", + "password": "Passwuert", + "port": "Port (Optionell)", + "ssl": "Benotz SSL/TLS fir d'Verbindung mam NAS", + "username": "Benotzernumm" + }, + "description": "Soll {name} ({host}) konfigur\u00e9iert ginn?", + "title": "Synology DSM" + }, "user": { "data": { "api_version": "DSM Versioun", "host": "Apparat", "name": "Numm", "password": "Passwuert", - "port": "Port", + "port": "Port (Optionell)", "ssl": "Benotzt SSL/TLS fir sech mam NAS ze verbannen", "username": "Benotzernumm" }, diff --git a/homeassistant/components/synology_dsm/.translations/ru.json b/homeassistant/components/synology_dsm/.translations/ru.json index c76fa9ee9726..0f79ca2a0266 100644 --- a/homeassistant/components/synology_dsm/.translations/ru.json +++ b/homeassistant/components/synology_dsm/.translations/ru.json @@ -7,7 +7,19 @@ "login": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0445\u043e\u0434\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c.", "unknown": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435." }, + "flow_title": "Synology DSM {name} ({host})", "step": { + "link": { + "data": { + "api_version": "\u0412\u0435\u0440\u0441\u0438\u044f DSM", + "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\u043e\u0432\u0430\u0442\u044c SSL / TLS \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "description": "\u0425\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c {name} ({host})?", + "title": "Synology DSM" + }, "user": { "data": { "api_version": "\u0412\u0435\u0440\u0441\u0438\u044f DSM", diff --git a/homeassistant/components/synology_dsm/.translations/zh-Hant.json b/homeassistant/components/synology_dsm/.translations/zh-Hant.json new file mode 100644 index 000000000000..76144afa4c58 --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/zh-Hant.json @@ -0,0 +1,38 @@ +{ + "config": { + "abort": { + "already_configured": "\u4e3b\u6a5f\u7aef\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u5bc6\u78bc", + "unknown": "\u672a\u77e5\u932f\u8aa4\uff1a\u8acb\u7a0d\u5f8c\u518d\u8a66\u6216\u4f7f\u7528\u5176\u4ed6\u8a2d\u5b9a" + }, + "flow_title": "\u7fa4\u6689 DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "DSM \u7248\u672c", + "password": "\u5bc6\u78bc", + "port": "\u901a\u8a0a\u57e0\uff08\u9078\u9805\uff09", + "ssl": "\u4f7f\u7528 SSL/TLS \u9023\u7dda\u81f3 NAS", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "description": "\u662f\u5426\u8981\u8a2d\u5b9a {name} ({host})\uff1f", + "title": "\u7fa4\u6689 DSM" + }, + "user": { + "data": { + "api_version": "DSM \u7248\u672c", + "host": "\u4e3b\u6a5f\u7aef", + "name": "\u540d\u7a31", + "password": "\u5bc6\u78bc", + "port": "\u901a\u8a0a\u57e0\uff08\u9078\u9805\uff09", + "ssl": "\u4f7f\u7528 SSL/TLS \u9023\u7dda\u81f3 NAS", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "title": "\u7fa4\u6689 DSM" + } + }, + "title": "\u7fa4\u6689 DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/lb.json b/homeassistant/components/unifi/.translations/lb.json index a3d7d685ed2c..26872a9f9a2b 100644 --- a/homeassistant/components/unifi/.translations/lb.json +++ b/homeassistant/components/unifi/.translations/lb.json @@ -57,7 +57,7 @@ }, "statistics_sensors": { "data": { - "allow_bandwidth_sensors": "Bandbreet Benotzung Sensore fir Netzwierk Cliente erstellen" + "allow_bandwidth_sensors": "Bandbreet Benotzung Sensore fir Netzwierk Cliente" }, "description": "Statistik Sensoren konfigur\u00e9ieren", "title": "UniFi Optiounen 3/3" diff --git a/homeassistant/components/withings/.translations/lb.json b/homeassistant/components/withings/.translations/lb.json index 1984ef6f5861..14e6be4091ed 100644 --- a/homeassistant/components/withings/.translations/lb.json +++ b/homeassistant/components/withings/.translations/lb.json @@ -5,7 +5,7 @@ "missing_configuration": "Withings Integratioun ass nach net konfigur\u00e9iert. Follegt w.e.g der Dokumentatioun." }, "create_entry": { - "default": "Erfollegr\u00e4ich mam ausgewielte Profile mat Withings authentifiz\u00e9iert." + "default": "Erfollegr\u00e4ich mat Withings authentifiz\u00e9iert." }, "step": { "pick_implementation": { From 1c4b563e547fc113e114c817db9487c3254920ed Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 8 Apr 2020 12:39:36 -0400 Subject: [PATCH 221/653] Bump pylutron-caseta version to 0.6.1 (#33815) --- homeassistant/components/lutron_caseta/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/lutron_caseta/manifest.json b/homeassistant/components/lutron_caseta/manifest.json index 831f6ef8bf14..90c9d4fc9c97 100644 --- a/homeassistant/components/lutron_caseta/manifest.json +++ b/homeassistant/components/lutron_caseta/manifest.json @@ -2,6 +2,6 @@ "domain": "lutron_caseta", "name": "Lutron Caseta", "documentation": "https://www.home-assistant.io/integrations/lutron_caseta", - "requirements": ["pylutron-caseta==0.6.0"], + "requirements": ["pylutron-caseta==0.6.1"], "codeowners": ["@swails"] } diff --git a/requirements_all.txt b/requirements_all.txt index 546bf169d38f..4a5178601026 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1383,7 +1383,7 @@ pylitejet==0.1 pyloopenergy==0.1.3 # homeassistant.components.lutron_caseta -pylutron-caseta==0.6.0 +pylutron-caseta==0.6.1 # homeassistant.components.lutron pylutron==0.2.5 From 7383e816092d33280f5db11affb0da57ac75341d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 11:45:45 -0500 Subject: [PATCH 222/653] Convert nut to a multi step config flow (#33803) * Convert nut to a multi step config flow * Users can now choose the ups they want in step 2 (or skipped if only one) * Users can now select the resources they want to monitor based on what is actually available on the device * CONF_NAME has been removed as we now get the name from NUT * Device classes have been added which allows the battery charge state to be seen in the devices UI * Remove update_interval as its for a followup PR * explict * reduce * fix bug, add tests for options flow * Test for dupe import * Test for dupe import * Call step directly * Update homeassistant/components/nut/config_flow.py Co-Authored-By: Martin Hjelmare Co-authored-by: Martin Hjelmare --- .../components/nut/.translations/en.json | 77 +++---- homeassistant/components/nut/__init__.py | 13 +- homeassistant/components/nut/config_flow.py | 151 ++++++++++---- homeassistant/components/nut/const.py | 191 ++++++++++++------ homeassistant/components/nut/sensor.py | 31 ++- homeassistant/components/nut/strings.json | 19 +- tests/components/nut/test_config_flow.py | 160 +++++++++++++-- 7 files changed, 482 insertions(+), 160 deletions(-) diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index 66ea276eca0c..6519d914df23 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -1,37 +1,46 @@ { - "config": { - "abort": { - "already_configured": "Device is already configured" - }, - "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" - }, - "step": { - "user": { - "data": { - "alias": "Alias", - "host": "Host", - "name": "Name", - "password": "Password", - "port": "Port", - "resources": "Resources", - "username": "Username" - }, - "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", - "title": "Connect to the NUT server" - } - }, - "title": "Network UPS Tools (NUT)" - }, - "options": { - "step": { - "init": { - "data": { - "resources": "Resources" - }, - "description": "Choose Sensor Resources" - } + "config": { + "title": "Network UPS Tools (NUT)", + "step": { + "user": { + "title": "Connect to the NUT server", + "data": { + "host": "Host", + "port": "Port", + "username": "Username", + "password": "Password" } + }, + "ups": { + "title": "Choose the UPS to Monitor", + "data": { + "alias": "Alias", + "resources": "Resources" + } + }, + "resources": { + "title": "Choose the Resources to Monitor", + "data": { + "resources": "Resources" + } + } + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "abort": { + "already_configured": "Device is already configured" } -} \ No newline at end of file + }, + "options": { + "step": { + "init": { + "description": "Choose Sensor Resources.", + "data": { + "resources": "Resources" + } + } + } + } +} diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index a990cdf94b82..793dd5f2f3e8 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -23,6 +23,7 @@ from .const import ( PYNUT_FIRMWARE, PYNUT_MANUFACTURER, PYNUT_MODEL, + PYNUT_NAME, PYNUT_STATUS, PYNUT_UNIQUE_ID, ) @@ -65,6 +66,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): PYNUT_MANUFACTURER: _manufacturer_from_status(status), PYNUT_MODEL: _model_from_status(status), PYNUT_FIRMWARE: _firmware_from_status(status), + PYNUT_NAME: data.name, } entry.add_update_listener(_async_update_listener) @@ -186,10 +188,19 @@ class PyNUTData: self.update() return self._status + @property + def name(self): + """Return the name of the ups.""" + return self._alias + + def list_ups(self): + """List UPSes connected to the NUT server.""" + return self._client.list_ups() + def _get_alias(self): """Get the ups alias from NUT.""" try: - return next(iter(self._client.list_ups())) + return next(iter(self.list_ups())) except PyNUTError as err: _LOGGER.error("Failure getting NUT ups alias, %s", err) return None diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index 04889bb3f3fc..53bfe7554ea2 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -7,7 +7,6 @@ from homeassistant import config_entries, core, exceptions from homeassistant.const import ( CONF_ALIAS, CONF_HOST, - CONF_NAME, CONF_PASSWORD, CONF_PORT, CONF_RESOURCES, @@ -17,7 +16,7 @@ from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from . import PyNUTData, find_resources_in_config_entry, pynutdata_status -from .const import DEFAULT_HOST, DEFAULT_NAME, DEFAULT_PORT, SENSOR_TYPES +from .const import DEFAULT_HOST, DEFAULT_PORT, SENSOR_TYPES from .const import DOMAIN # pylint:disable=unused-import _LOGGER = logging.getLogger(__name__) @@ -27,17 +26,39 @@ SENSOR_DICT = {sensor_id: SENSOR_TYPES[sensor_id][0] for sensor_id in SENSOR_TYP DATA_SCHEMA = vol.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): str, - vol.Required(CONF_RESOURCES): cv.multi_select(SENSOR_DICT), vol.Optional(CONF_HOST, default=DEFAULT_HOST): str, vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_ALIAS): str, vol.Optional(CONF_USERNAME): str, vol.Optional(CONF_PASSWORD): str, } ) +def _resource_schema(available_resources, selected_resources): + """Resource selection schema.""" + + known_available_resources = { + sensor_id: sensor[0] + for sensor_id, sensor in SENSOR_TYPES.items() + if sensor_id in available_resources + } + + return vol.Schema( + { + vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( + known_available_resources + ) + } + ) + + +def _ups_schema(ups_list): + """UPS selection schema.""" + ups_map = {ups: ups for ups in ups_list} + + return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_map)}) + + async def validate_input(hass: core.HomeAssistant, data): """Validate the user input allows us to connect. @@ -52,16 +73,22 @@ async def validate_input(hass: core.HomeAssistant, data): data = PyNUTData(host, port, alias, username, password) - status = await hass.async_add_executor_job(pynutdata_status, data) + ups_list = await hass.async_add_executor_job(data.list_ups) + if not ups_list: + raise CannotConnect + status = await hass.async_add_executor_job(pynutdata_status, data) if not status: raise CannotConnect - return {"title": _format_host_port_alias(host, port, alias)} + return {"ups_list": ups_list, "available_resources": status} -def _format_host_port_alias(host, port, alias): +def _format_host_port_alias(user_input): """Format a host, port, and alias so it can be used for comparison or display.""" + host = user_input[CONF_HOST] + port = user_input[CONF_PORT] + alias = user_input.get(CONF_ALIAS) if alias: return f"{alias}@{host}:{port}" return f"{host}:{port}" @@ -73,40 +100,96 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): VERSION = 1 CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL - async def async_step_user(self, user_input=None): - """Handle the initial step.""" + def __init__(self): + """Initialize the nut config flow.""" + self.nut_config = {} + self.available_resources = {} + self.ups_list = None + self.title = None + + async def async_step_import(self, user_input=None): + """Handle the import.""" errors = {} if user_input is not None: - if self._host_port_alias_already_configured( - user_input[CONF_HOST], user_input[CONF_PORT], user_input.get(CONF_ALIAS) - ): + if self._host_port_alias_already_configured(user_input): return self.async_abort(reason="already_configured") - try: - info = await validate_input(self.hass, user_input) - except CannotConnect: - errors["base"] = "cannot_connect" - except Exception: # pylint: disable=broad-except - _LOGGER.exception("Unexpected exception") - errors["base"] = "unknown" + _, errors = await self._async_validate_or_error(user_input) - if "base" not in errors: - return self.async_create_entry(title=info["title"], data=user_input) + if not errors: + title = _format_host_port_alias(user_input) + return self.async_create_entry(title=title, data=user_input) return self.async_show_form( step_id="user", data_schema=DATA_SCHEMA, errors=errors ) - def _host_port_alias_already_configured(self, host, port, alias): + async def async_step_user(self, user_input=None): + """Handle the user input.""" + errors = {} + if user_input is not None: + info, errors = await self._async_validate_or_error(user_input) + + if not errors: + self.nut_config.update(user_input) + if len(info["ups_list"]) > 1: + self.ups_list = info["ups_list"] + return await self.async_step_ups() + + self.available_resources.update(info["available_resources"]) + return await self.async_step_resources() + + return self.async_show_form( + step_id="user", data_schema=DATA_SCHEMA, errors=errors + ) + + async def async_step_ups(self, user_input=None): + """Handle the picking the ups.""" + errors = {} + + if user_input is not None: + self.nut_config.update(user_input) + if self._host_port_alias_already_configured(self.nut_config): + return self.async_abort(reason="already_configured") + info, errors = await self._async_validate_or_error(self.nut_config) + if not errors: + self.available_resources.update(info["available_resources"]) + return await self.async_step_resources() + + return self.async_show_form( + step_id="ups", data_schema=_ups_schema(self.ups_list), errors=errors, + ) + + async def async_step_resources(self, user_input=None): + """Handle the picking the resources.""" + if user_input is None: + return self.async_show_form( + step_id="resources", + data_schema=_resource_schema(self.available_resources, []), + ) + + self.nut_config.update(user_input) + title = _format_host_port_alias(self.nut_config) + return self.async_create_entry(title=title, data=self.nut_config) + + def _host_port_alias_already_configured(self, user_input): """See if we already have a nut entry matching user input configured.""" existing_host_port_aliases = { - _format_host_port_alias(host, port, alias) + _format_host_port_alias(entry.data) for entry in self._async_current_entries() } - return _format_host_port_alias(host, port, alias) in existing_host_port_aliases + return _format_host_port_alias(user_input) in existing_host_port_aliases - async def async_step_import(self, user_input): - """Handle import.""" - return await self.async_step_user(user_input) + async def _async_validate_or_error(self, config): + errors = {} + info = {} + try: + info = await validate_input(self.hass, config) + except CannotConnect: + errors["base"] = "cannot_connect" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + return info, errors @staticmethod @callback @@ -129,14 +212,12 @@ class OptionsFlowHandler(config_entries.OptionsFlow): resources = find_resources_in_config_entry(self.config_entry) - data_schema = vol.Schema( - { - vol.Required(CONF_RESOURCES, default=resources): cv.multi_select( - SENSOR_DICT - ), - } + info = await validate_input(self.hass, self.config_entry.data) + + return self.async_show_form( + step_id="init", + data_schema=_resource_schema(info["available_resources"], resources), ) - return self.async_show_form(step_id="init", data_schema=data_schema) class CannotConnect(exceptions.HomeAssistantError): diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index ea164e70b937..d7138ef865cb 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -1,4 +1,9 @@ """The nut component.""" +from homeassistant.components.sensor import ( + DEVICE_CLASS_BATTERY, + DEVICE_CLASS_POWER, + DEVICE_CLASS_TEMPERATURE, +) from homeassistant.const import POWER_WATT, TEMP_CELSIUS, TIME_SECONDS, UNIT_PERCENTAGE DOMAIN = "nut" @@ -19,91 +24,146 @@ PYNUT_UNIQUE_ID = "unique_id" PYNUT_MANUFACTURER = "manufacturer" PYNUT_MODEL = "model" PYNUT_FIRMWARE = "firmware" +PYNUT_NAME = "name" SENSOR_TYPES = { - "ups.status.display": ["Status", "", "mdi:information-outline"], - "ups.status": ["Status Data", "", "mdi:information-outline"], - "ups.alarm": ["Alarms", "", "mdi:alarm"], - "ups.temperature": ["UPS Temperature", TEMP_CELSIUS, "mdi:thermometer"], - "ups.load": ["Load", UNIT_PERCENTAGE, "mdi:gauge"], - "ups.load.high": ["Overload Setting", UNIT_PERCENTAGE, "mdi:gauge"], - "ups.id": ["System identifier", "", "mdi:information-outline"], - "ups.delay.start": ["Load Restart Delay", TIME_SECONDS, "mdi:timer"], - "ups.delay.reboot": ["UPS Reboot Delay", TIME_SECONDS, "mdi:timer"], - "ups.delay.shutdown": ["UPS Shutdown Delay", TIME_SECONDS, "mdi:timer"], - "ups.timer.start": ["Load Start Timer", TIME_SECONDS, "mdi:timer"], - "ups.timer.reboot": ["Load Reboot Timer", TIME_SECONDS, "mdi:timer"], - "ups.timer.shutdown": ["Load Shutdown Timer", TIME_SECONDS, "mdi:timer"], - "ups.test.interval": ["Self-Test Interval", TIME_SECONDS, "mdi:timer"], - "ups.test.result": ["Self-Test Result", "", "mdi:information-outline"], - "ups.test.date": ["Self-Test Date", "", "mdi:calendar"], - "ups.display.language": ["Language", "", "mdi:information-outline"], - "ups.contacts": ["External Contacts", "", "mdi:information-outline"], - "ups.efficiency": ["Efficiency", UNIT_PERCENTAGE, "mdi:gauge"], - "ups.power": ["Current Apparent Power", "VA", "mdi:flash"], - "ups.power.nominal": ["Nominal Power", "VA", "mdi:flash"], - "ups.realpower": ["Current Real Power", POWER_WATT, "mdi:flash"], - "ups.realpower.nominal": ["Nominal Real Power", POWER_WATT, "mdi:flash"], - "ups.beeper.status": ["Beeper Status", "", "mdi:information-outline"], - "ups.type": ["UPS Type", "", "mdi:information-outline"], - "ups.watchdog.status": ["Watchdog Status", "", "mdi:information-outline"], - "ups.start.auto": ["Start on AC", "", "mdi:information-outline"], - "ups.start.battery": ["Start on Battery", "", "mdi:information-outline"], - "ups.start.reboot": ["Reboot on Battery", "", "mdi:information-outline"], - "ups.shutdown": ["Shutdown Ability", "", "mdi:information-outline"], - "battery.charge": ["Battery Charge", UNIT_PERCENTAGE, "mdi:gauge"], - "battery.charge.low": ["Low Battery Setpoint", UNIT_PERCENTAGE, "mdi:gauge"], + "ups.status.display": ["Status", "", "mdi:information-outline", None], + "ups.status": ["Status Data", "", "mdi:information-outline", None], + "ups.alarm": ["Alarms", "", "mdi:alarm", None], + "ups.temperature": [ + "UPS Temperature", + TEMP_CELSIUS, + "mdi:thermometer", + DEVICE_CLASS_TEMPERATURE, + ], + "ups.load": ["Load", UNIT_PERCENTAGE, "mdi:gauge", None], + "ups.load.high": ["Overload Setting", UNIT_PERCENTAGE, "mdi:gauge", None], + "ups.id": ["System identifier", "", "mdi:information-outline", None], + "ups.delay.start": ["Load Restart Delay", TIME_SECONDS, "mdi:timer", None], + "ups.delay.reboot": ["UPS Reboot Delay", TIME_SECONDS, "mdi:timer", None], + "ups.delay.shutdown": ["UPS Shutdown Delay", TIME_SECONDS, "mdi:timer", None], + "ups.timer.start": ["Load Start Timer", TIME_SECONDS, "mdi:timer", None], + "ups.timer.reboot": ["Load Reboot Timer", TIME_SECONDS, "mdi:timer", None], + "ups.timer.shutdown": ["Load Shutdown Timer", TIME_SECONDS, "mdi:timer", None], + "ups.test.interval": ["Self-Test Interval", TIME_SECONDS, "mdi:timer", None], + "ups.test.result": ["Self-Test Result", "", "mdi:information-outline", None], + "ups.test.date": ["Self-Test Date", "", "mdi:calendar", None], + "ups.display.language": ["Language", "", "mdi:information-outline", None], + "ups.contacts": ["External Contacts", "", "mdi:information-outline", None], + "ups.efficiency": ["Efficiency", UNIT_PERCENTAGE, "mdi:gauge", None], + "ups.power": ["Current Apparent Power", "VA", "mdi:flash", None], + "ups.power.nominal": ["Nominal Power", "VA", "mdi:flash", None], + "ups.realpower": [ + "Current Real Power", + POWER_WATT, + "mdi:flash", + DEVICE_CLASS_POWER, + ], + "ups.realpower.nominal": [ + "Nominal Real Power", + POWER_WATT, + "mdi:flash", + DEVICE_CLASS_POWER, + ], + "ups.beeper.status": ["Beeper Status", "", "mdi:information-outline", None], + "ups.type": ["UPS Type", "", "mdi:information-outline", None], + "ups.watchdog.status": ["Watchdog Status", "", "mdi:information-outline", None], + "ups.start.auto": ["Start on AC", "", "mdi:information-outline", None], + "ups.start.battery": ["Start on Battery", "", "mdi:information-outline", None], + "ups.start.reboot": ["Reboot on Battery", "", "mdi:information-outline", None], + "ups.shutdown": ["Shutdown Ability", "", "mdi:information-outline", None], + "battery.charge": [ + "Battery Charge", + UNIT_PERCENTAGE, + "mdi:gauge", + DEVICE_CLASS_BATTERY, + ], + "battery.charge.low": ["Low Battery Setpoint", UNIT_PERCENTAGE, "mdi:gauge", None], "battery.charge.restart": [ "Minimum Battery to Start", UNIT_PERCENTAGE, "mdi:gauge", + None, ], "battery.charge.warning": [ "Warning Battery Setpoint", UNIT_PERCENTAGE, "mdi:gauge", + None, ], - "battery.charger.status": ["Charging Status", "", "mdi:information-outline"], - "battery.voltage": ["Battery Voltage", "V", "mdi:flash"], - "battery.voltage.nominal": ["Nominal Battery Voltage", "V", "mdi:flash"], - "battery.voltage.low": ["Low Battery Voltage", "V", "mdi:flash"], - "battery.voltage.high": ["High Battery Voltage", "V", "mdi:flash"], - "battery.capacity": ["Battery Capacity", "Ah", "mdi:flash"], - "battery.current": ["Battery Current", "A", "mdi:flash"], - "battery.current.total": ["Total Battery Current", "A", "mdi:flash"], - "battery.temperature": ["Battery Temperature", TEMP_CELSIUS, "mdi:thermometer"], - "battery.runtime": ["Battery Runtime", TIME_SECONDS, "mdi:timer"], - "battery.runtime.low": ["Low Battery Runtime", TIME_SECONDS, "mdi:timer"], + "battery.charger.status": ["Charging Status", "", "mdi:information-outline", None], + "battery.voltage": ["Battery Voltage", "V", "mdi:flash", None], + "battery.voltage.nominal": ["Nominal Battery Voltage", "V", "mdi:flash", None], + "battery.voltage.low": ["Low Battery Voltage", "V", "mdi:flash", None], + "battery.voltage.high": ["High Battery Voltage", "V", "mdi:flash", None], + "battery.capacity": ["Battery Capacity", "Ah", "mdi:flash", None], + "battery.current": ["Battery Current", "A", "mdi:flash", None], + "battery.current.total": ["Total Battery Current", "A", "mdi:flash", None], + "battery.temperature": [ + "Battery Temperature", + TEMP_CELSIUS, + "mdi:thermometer", + DEVICE_CLASS_TEMPERATURE, + ], + "battery.runtime": ["Battery Runtime", TIME_SECONDS, "mdi:timer", None], + "battery.runtime.low": ["Low Battery Runtime", TIME_SECONDS, "mdi:timer", None], "battery.runtime.restart": [ "Minimum Battery Runtime to Start", TIME_SECONDS, "mdi:timer", + None, ], "battery.alarm.threshold": [ "Battery Alarm Threshold", "", "mdi:information-outline", + None, ], - "battery.date": ["Battery Date", "", "mdi:calendar"], - "battery.mfr.date": ["Battery Manuf. Date", "", "mdi:calendar"], - "battery.packs": ["Number of Batteries", "", "mdi:information-outline"], - "battery.packs.bad": ["Number of Bad Batteries", "", "mdi:information-outline"], - "battery.type": ["Battery Chemistry", "", "mdi:information-outline"], - "input.sensitivity": ["Input Power Sensitivity", "", "mdi:information-outline"], - "input.transfer.low": ["Low Voltage Transfer", "V", "mdi:flash"], - "input.transfer.high": ["High Voltage Transfer", "V", "mdi:flash"], - "input.transfer.reason": ["Voltage Transfer Reason", "", "mdi:information-outline"], - "input.voltage": ["Input Voltage", "V", "mdi:flash"], - "input.voltage.nominal": ["Nominal Input Voltage", "V", "mdi:flash"], - "input.frequency": ["Input Line Frequency", "hz", "mdi:flash"], - "input.frequency.nominal": ["Nominal Input Line Frequency", "hz", "mdi:flash"], - "input.frequency.status": ["Input Frequency Status", "", "mdi:information-outline"], - "output.current": ["Output Current", "A", "mdi:flash"], - "output.current.nominal": ["Nominal Output Current", "A", "mdi:flash"], - "output.voltage": ["Output Voltage", "V", "mdi:flash"], - "output.voltage.nominal": ["Nominal Output Voltage", "V", "mdi:flash"], - "output.frequency": ["Output Frequency", "hz", "mdi:flash"], - "output.frequency.nominal": ["Nominal Output Frequency", "hz", "mdi:flash"], + "battery.date": ["Battery Date", "", "mdi:calendar", None], + "battery.mfr.date": ["Battery Manuf. Date", "", "mdi:calendar", None], + "battery.packs": ["Number of Batteries", "", "mdi:information-outline", None], + "battery.packs.bad": [ + "Number of Bad Batteries", + "", + "mdi:information-outline", + None, + ], + "battery.type": ["Battery Chemistry", "", "mdi:information-outline", None], + "input.sensitivity": [ + "Input Power Sensitivity", + "", + "mdi:information-outline", + None, + ], + "input.transfer.low": ["Low Voltage Transfer", "V", "mdi:flash", None], + "input.transfer.high": ["High Voltage Transfer", "V", "mdi:flash", None], + "input.transfer.reason": [ + "Voltage Transfer Reason", + "", + "mdi:information-outline", + None, + ], + "input.voltage": ["Input Voltage", "V", "mdi:flash", None], + "input.voltage.nominal": ["Nominal Input Voltage", "V", "mdi:flash", None], + "input.frequency": ["Input Line Frequency", "hz", "mdi:flash", None], + "input.frequency.nominal": [ + "Nominal Input Line Frequency", + "hz", + "mdi:flash", + None, + ], + "input.frequency.status": [ + "Input Frequency Status", + "", + "mdi:information-outline", + None, + ], + "output.current": ["Output Current", "A", "mdi:flash", None], + "output.current.nominal": ["Nominal Output Current", "A", "mdi:flash", None], + "output.voltage": ["Output Voltage", "V", "mdi:flash", None], + "output.voltage.nominal": ["Nominal Output Voltage", "V", "mdi:flash", None], + "output.frequency": ["Output Frequency", "hz", "mdi:flash", None], + "output.frequency.nominal": ["Nominal Output Frequency", "hz", "mdi:flash", None], } STATE_TYPES = { @@ -123,3 +183,8 @@ STATE_TYPES = { "FSD": "Forced Shutdown", "ALARM": "Alarm", } + +SENSOR_NAME = 0 +SENSOR_UNIT = 1 +SENSOR_ICON = 2 +SENSOR_DEVICE_CLASS = 3 diff --git a/homeassistant/components/nut/sensor.py b/homeassistant/components/nut/sensor.py index f6e809d52806..15c090017621 100644 --- a/homeassistant/components/nut/sensor.py +++ b/homeassistant/components/nut/sensor.py @@ -31,9 +31,14 @@ from .const import ( PYNUT_FIRMWARE, PYNUT_MANUFACTURER, PYNUT_MODEL, + PYNUT_NAME, PYNUT_STATUS, PYNUT_UNIQUE_ID, + SENSOR_DEVICE_CLASS, + SENSOR_ICON, + SENSOR_NAME, SENSOR_TYPES, + SENSOR_UNIT, STATE_TYPES, ) @@ -69,7 +74,6 @@ def setup_platform(hass, config, add_entities, discovery_info=None): async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the NUT sensors.""" - config = config_entry.data pynut_data = hass.data[DOMAIN][config_entry.entry_id] data = pynut_data[PYNUT_DATA] status = pynut_data[PYNUT_STATUS] @@ -77,10 +81,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities): manufacturer = pynut_data[PYNUT_MANUFACTURER] model = pynut_data[PYNUT_MODEL] firmware = pynut_data[PYNUT_FIRMWARE] + name = pynut_data[PYNUT_NAME] entities = [] - name = config[CONF_NAME] if CONF_RESOURCES in config_entry.options: resources = config_entry.options[CONF_RESOURCES] else: @@ -96,7 +100,13 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ): entities.append( NUTSensor( - name, data, sensor_type, unique_id, manufacturer, model, firmware + name.title(), + data, + sensor_type, + unique_id, + manufacturer, + model, + firmware, ) ) else: @@ -122,8 +132,8 @@ class NUTSensor(Entity): self._firmware = firmware self._model = model self._device_name = name - self._name = f"{name} {SENSOR_TYPES[sensor_type][0]}" - self._unit = SENSOR_TYPES[sensor_type][1] + self._name = f"{name} {SENSOR_TYPES[sensor_type][SENSOR_NAME]}" + self._unit = SENSOR_TYPES[sensor_type][SENSOR_UNIT] self._state = None self._unique_id = unique_id self._display_state = None @@ -161,7 +171,16 @@ class NUTSensor(Entity): @property def icon(self): """Icon to use in the frontend, if any.""" - return SENSOR_TYPES[self._type][2] + if SENSOR_TYPES[self._type][SENSOR_DEVICE_CLASS]: + # The UI will assign an icon + # if it has a class + return None + return SENSOR_TYPES[self._type][SENSOR_ICON] + + @property + def device_class(self): + """Device class of the sensor.""" + return SENSOR_TYPES[self._type][SENSOR_DEVICE_CLASS] @property def state(self): diff --git a/homeassistant/components/nut/strings.json b/homeassistant/components/nut/strings.json index 8e5f5ee2fcbb..6519d914df23 100644 --- a/homeassistant/components/nut/strings.json +++ b/homeassistant/components/nut/strings.json @@ -4,14 +4,23 @@ "step": { "user": { "title": "Connect to the NUT server", - "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", "data": { - "name": "Name", "host": "Host", "port": "Port", - "alias": "Alias", "username": "Username", - "password": "Password", + "password": "Password" + } + }, + "ups": { + "title": "Choose the UPS to Monitor", + "data": { + "alias": "Alias", + "resources": "Resources" + } + }, + "resources": { + "title": "Choose the Resources to Monitor", + "data": { "resources": "Resources" } } @@ -27,7 +36,7 @@ "options": { "step": { "init": { - "description": "Choose Sensor Resources", + "description": "Choose Sensor Resources.", "data": { "resources": "Resources" } diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index 362f6c0b2ba2..38953ebd235c 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -1,18 +1,28 @@ """Test the Network UPS Tools (NUT) config flow.""" from asynctest import MagicMock, patch -from homeassistant import config_entries, setup +from homeassistant import config_entries, data_entry_flow, setup from homeassistant.components.nut.const import DOMAIN +from homeassistant.const import CONF_RESOURCES + +from tests.common import MockConfigEntry + +VALID_CONFIG = { + "host": "localhost", + "port": 123, + "name": "name", + "resources": ["battery.charge"], +} -def _get_mock_pynutclient(list_vars=None): +def _get_mock_pynutclient(list_vars=None, list_ups=None): pynutclient = MagicMock() - type(pynutclient).list_ups = MagicMock(return_value=["ups1"]) + type(pynutclient).list_ups = MagicMock(return_value=list_ups) type(pynutclient).list_vars = MagicMock(return_value=list_vars) return pynutclient -async def test_form(hass): +async def test_form_user_one_ups(hass): """Test we get the form.""" await setup.async_setup_component(hass, "persistent_notification", {}) result = await hass.config_entries.flow.async_init( @@ -21,7 +31,25 @@ async def test_form(hass): assert result["type"] == "form" assert result["errors"] == {} - mock_pynut = _get_mock_pynutclient(list_vars={"battery.voltage": "voltage"}) + mock_pynut = _get_mock_pynutclient( + list_vars={"battery.voltage": "voltage"}, list_ups=["ups1"] + ) + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + "host": "1.1.1.1", + "username": "test-username", + "password": "test-password", + "port": 2222, + }, + ) + + assert result2["step_id"] == "resources" + assert result2["type"] == "form" with patch( "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, @@ -30,6 +58,40 @@ async def test_form(hass): ) as mock_setup, patch( "homeassistant.components.nut.async_setup_entry", return_value=True, ) as mock_setup_entry: + result3 = await hass.config_entries.flow.async_configure( + result2["flow_id"], {"resources": ["battery.voltage"]}, + ) + + assert result3["type"] == "create_entry" + assert result3["title"] == "1.1.1.1:2222" + assert result3["data"] == { + "host": "1.1.1.1", + "password": "test-password", + "port": 2222, + "resources": ["battery.voltage"], + "username": "test-username", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_user_multiple_ups(hass): + """Test we get the form.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + mock_pynut = _get_mock_pynutclient( + list_vars={"battery.voltage": "voltage"}, list_ups=["ups1", "ups2"] + ) + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { @@ -37,20 +99,41 @@ async def test_form(hass): "username": "test-username", "password": "test-password", "port": 2222, - "alias": "ups1", - "resources": ["battery.charge"], }, ) - assert result2["type"] == "create_entry" - assert result2["title"] == "ups1@1.1.1.1:2222" - assert result2["data"] == { - "alias": "ups1", + assert result2["step_id"] == "ups" + assert result2["type"] == "form" + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ): + result3 = await hass.config_entries.flow.async_configure( + result2["flow_id"], {"alias": "ups2"}, + ) + + assert result3["step_id"] == "resources" + assert result3["type"] == "form" + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ), patch( + "homeassistant.components.nut.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.nut.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result4 = await hass.config_entries.flow.async_configure( + result3["flow_id"], {"resources": ["battery.voltage"]}, + ) + + assert result4["type"] == "create_entry" + assert result4["title"] == "ups2@1.1.1.1:2222" + assert result4["data"] == { "host": "1.1.1.1", - "name": "NUT UPS", "password": "test-password", + "alias": "ups2", "port": 2222, - "resources": ["battery.charge"], + "resources": ["battery.voltage"], "username": "test-username", } await hass.async_block_till_done() @@ -62,7 +145,9 @@ async def test_form_import(hass): """Test we get the form with import source.""" await setup.async_setup_component(hass, "persistent_notification", {}) - mock_pynut = _get_mock_pynutclient(list_vars={"battery.voltage": "serial"}) + mock_pynut = _get_mock_pynutclient( + list_vars={"battery.voltage": "serial"}, list_ups=["ups1"] + ) with patch( "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, @@ -95,6 +180,20 @@ async def test_form_import(hass): assert len(mock_setup_entry.mock_calls) == 1 +async def test_form_import_dupe(hass): + """Test we get abort on duplicate import.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + entry = MockConfigEntry(domain=DOMAIN, data=VALID_CONFIG) + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": "import"}, data=VALID_CONFIG + ) + assert result["type"] == "abort" + assert result["reason"] == "already_configured" + + async def test_form_cannot_connect(hass): """Test we handle cannot connect error.""" result = await hass.config_entries.flow.async_init( @@ -113,10 +212,39 @@ async def test_form_cannot_connect(hass): "username": "test-username", "password": "test-password", "port": 2222, - "alias": "ups1", - "resources": ["battery.charge"], }, ) assert result2["type"] == "form" assert result2["errors"] == {"base": "cannot_connect"} + + +async def test_options_flow(hass): + """Test config flow options.""" + + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id="abcde12345", + data=VALID_CONFIG, + options={CONF_RESOURCES: ["battery.charge"]}, + ) + config_entry.add_to_hass(hass) + + mock_pynut = _get_mock_pynutclient( + list_vars={"battery.voltage": "voltage"}, list_ups=["ups1"] + ) + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ), patch("homeassistant.components.nut.async_setup_entry", return_value=True): + result = await hass.config_entries.options.async_init(config_entry.entry_id) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "init" + + result = await hass.config_entries.options.async_configure( + result["flow_id"], user_input={CONF_RESOURCES: ["battery.voltage"]} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert config_entry.options == {CONF_RESOURCES: ["battery.voltage"]} From 8d61893c395a5841f06838a7117c6d74dc99f30f Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Wed, 8 Apr 2020 18:47:38 +0200 Subject: [PATCH 223/653] Use HTTP_OK constant (#33798) * Use http ok constant * Remove incorrect use * Run isort * Fix pylint by adding missing imports * Fix pylint by fixing one import --- homeassistant/components/aftership/sensor.py | 6 +++--- homeassistant/components/alexa/auth.py | 3 ++- homeassistant/components/api/__init__.py | 3 ++- homeassistant/components/arest/binary_sensor.py | 10 ++++++++-- homeassistant/components/arest/sensor.py | 3 ++- homeassistant/components/arest/switch.py | 14 +++++++------- homeassistant/components/auth/__init__.py | 7 ++++--- homeassistant/components/bloomsky/__init__.py | 4 ++-- homeassistant/components/bluesound/media_player.py | 5 +++-- homeassistant/components/buienradar/util.py | 4 ++-- homeassistant/components/clickatell/notify.py | 4 ++-- homeassistant/components/clicksend/notify.py | 5 +++-- homeassistant/components/clicksend_tts/notify.py | 5 +++-- homeassistant/components/cloud/client.py | 3 ++- homeassistant/components/cloud/google_config.py | 4 ++-- homeassistant/components/cloud/http_api.py | 3 ++- homeassistant/components/ddwrt/device_tracker.py | 3 ++- homeassistant/components/doorbird/__init__.py | 7 ++++--- homeassistant/components/downloader/__init__.py | 3 ++- .../components/dte_energy_bridge/sensor.py | 4 ++-- .../components/dublin_bus_transport/sensor.py | 4 ++-- homeassistant/components/emoncms/sensor.py | 3 ++- .../components/emoncms_history/__init__.py | 3 ++- homeassistant/components/facebook/notify.py | 4 ++-- homeassistant/components/flock/notify.py | 4 ++-- homeassistant/components/foursquare/__init__.py | 4 ++-- homeassistant/components/google_translate/tts.py | 3 ++- homeassistant/components/hangouts/hangouts_bot.py | 3 ++- homeassistant/components/hassio/auth.py | 5 +++-- homeassistant/components/hassio/handler.py | 4 ++-- homeassistant/components/haveibeenpwned/sensor.py | 4 ++-- .../components/hitron_coda/device_tracker.py | 12 +++++++++--- homeassistant/components/http/view.py | 10 ++++++---- homeassistant/components/ifttt/__init__.py | 4 ++-- homeassistant/components/lifx_cloud/scene.py | 4 ++-- .../components/linksys_smart/device_tracker.py | 6 +++--- .../components/llamalab_automate/notify.py | 4 ++-- homeassistant/components/lockitron/lock.py | 8 ++++---- homeassistant/components/london_air/sensor.py | 3 ++- homeassistant/components/media_player/__init__.py | 9 +++++---- homeassistant/components/mobile_app/helpers.py | 5 +++-- homeassistant/components/mobile_app/notify.py | 3 ++- homeassistant/components/nfandroidtv/notify.py | 4 ++-- homeassistant/components/nissan_leaf/__init__.py | 4 ++-- .../components/openalpr_cloud/image_processing.py | 4 ++-- .../components/openexchangerates/sensor.py | 3 ++- homeassistant/components/prowl/notify.py | 4 ++-- homeassistant/components/pushsafer/notify.py | 3 ++- homeassistant/components/rachio/config_flow.py | 6 +++--- homeassistant/components/rachio/device.py | 6 +++--- homeassistant/components/radarr/sensor.py | 3 ++- homeassistant/components/rest/notify.py | 3 ++- homeassistant/components/rest/switch.py | 5 +++-- homeassistant/components/rocketchat/notify.py | 10 ++++++++-- homeassistant/components/route53/__init__.py | 4 ++-- .../components/rss_feed_template/__init__.py | 5 ++++- homeassistant/components/sigfox/sensor.py | 4 ++-- homeassistant/components/sky_hub/device_tracker.py | 4 ++-- homeassistant/components/sonarr/sensor.py | 3 ++- .../components/squeezebox/media_player.py | 3 ++- homeassistant/components/startca/sensor.py | 3 ++- homeassistant/components/synology_chat/notify.py | 4 ++-- homeassistant/components/tado/device_tracker.py | 4 ++-- homeassistant/components/teksavvy/sensor.py | 3 ++- homeassistant/components/tomato/device_tracker.py | 3 ++- homeassistant/components/traccar/__init__.py | 2 +- homeassistant/components/tts/__init__.py | 6 +++--- homeassistant/components/twitter/notify.py | 10 +++++----- homeassistant/components/ubus/device_tracker.py | 4 ++-- homeassistant/components/uk_transport/sensor.py | 4 ++-- homeassistant/components/viaggiatreno/sensor.py | 4 ++-- homeassistant/components/voicerss/tts.py | 4 ++-- homeassistant/components/volumio/media_player.py | 3 ++- homeassistant/components/webhook/__init__.py | 7 ++++--- homeassistant/components/wsdot/sensor.py | 3 ++- homeassistant/components/xiaomi/device_tracker.py | 6 +++--- homeassistant/components/yandextts/tts.py | 4 ++-- homeassistant/components/yr/sensor.py | 3 ++- homeassistant/util/aiohttp.py | 4 +++- 79 files changed, 214 insertions(+), 154 deletions(-) diff --git a/homeassistant/components/aftership/sensor.py b/homeassistant/components/aftership/sensor.py index 9e0d8939da4a..83ab52499dab 100644 --- a/homeassistant/components/aftership/sensor.py +++ b/homeassistant/components/aftership/sensor.py @@ -6,7 +6,7 @@ from pyaftership.tracker import Tracking import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_NAME, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -66,7 +66,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= await aftership.get_trackings() - if not aftership.meta or aftership.meta["code"] != 200: + if not aftership.meta or aftership.meta["code"] != HTTP_OK: _LOGGER.error( "No tracking data found. Check API key is correct: %s", aftership.meta ) @@ -164,7 +164,7 @@ class AfterShipSensor(Entity): if not self.aftership.meta: _LOGGER.error("Unknown errors when querying") return - if self.aftership.meta["code"] != 200: + if self.aftership.meta["code"] != HTTP_OK: _LOGGER.error( "Errors when querying AfterShip. %s", str(self.aftership.meta) ) diff --git a/homeassistant/components/alexa/auth.py b/homeassistant/components/alexa/auth.py index 94789c33305f..3b7984f56d3c 100644 --- a/homeassistant/components/alexa/auth.py +++ b/homeassistant/components/alexa/auth.py @@ -7,6 +7,7 @@ import logging import aiohttp import async_timeout +from homeassistant.const import HTTP_OK from homeassistant.core import callback from homeassistant.helpers import aiohttp_client from homeassistant.util import dt @@ -118,7 +119,7 @@ class Auth: _LOGGER.debug("LWA response header: %s", response.headers) _LOGGER.debug("LWA response status: %s", response.status) - if response.status != 200: + if response.status != HTTP_OK: _LOGGER.error("Error calling LWA to get auth token.") return None diff --git a/homeassistant/components/api/__init__.py b/homeassistant/components/api/__init__.py index e11bc5e61f91..8d0cd44070cb 100644 --- a/homeassistant/components/api/__init__.py +++ b/homeassistant/components/api/__init__.py @@ -17,6 +17,7 @@ from homeassistant.const import ( HTTP_BAD_REQUEST, HTTP_CREATED, HTTP_NOT_FOUND, + HTTP_OK, MATCH_ALL, URL_API, URL_API_COMPONENTS, @@ -250,7 +251,7 @@ class APIEntityStateView(HomeAssistantView): ) # Read the state back for our response - status_code = HTTP_CREATED if is_new_state else 200 + status_code = HTTP_CREATED if is_new_state else HTTP_OK resp = self.json(hass.states.get(entity_id), status_code) resp.headers.add("Location", f"/api/states/{entity_id}") diff --git a/homeassistant/components/arest/binary_sensor.py b/homeassistant/components/arest/binary_sensor.py index d84b79f1d4c5..1b914f80aa7f 100644 --- a/homeassistant/components/arest/binary_sensor.py +++ b/homeassistant/components/arest/binary_sensor.py @@ -10,7 +10,13 @@ from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA, BinarySensorDevice, ) -from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME, CONF_PIN, CONF_RESOURCE +from homeassistant.const import ( + CONF_DEVICE_CLASS, + CONF_NAME, + CONF_PIN, + CONF_RESOURCE, + HTTP_OK, +) import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle @@ -74,7 +80,7 @@ class ArestBinarySensor(BinarySensorDevice): if self._pin is not None: request = requests.get(f"{self._resource}/mode/{self._pin}/i", timeout=10) - if request.status_code != 200: + if request.status_code != HTTP_OK: _LOGGER.error("Can't set mode of %s", self._resource) @property diff --git a/homeassistant/components/arest/sensor.py b/homeassistant/components/arest/sensor.py index b118422ef8ce..638c0e2557a5 100644 --- a/homeassistant/components/arest/sensor.py +++ b/homeassistant/components/arest/sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_RESOURCE, CONF_UNIT_OF_MEASUREMENT, CONF_VALUE_TEMPLATE, + HTTP_OK, ) from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv @@ -149,7 +150,7 @@ class ArestSensor(Entity): if self._pin is not None: request = requests.get(f"{self._resource}/mode/{self._pin}/i", timeout=10) - if request.status_code != 200: + if request.status_code != HTTP_OK: _LOGGER.error("Can't set mode of %s", self._resource) @property diff --git a/homeassistant/components/arest/switch.py b/homeassistant/components/arest/switch.py index 298ac106dec6..875211f5f0b6 100644 --- a/homeassistant/components/arest/switch.py +++ b/homeassistant/components/arest/switch.py @@ -6,7 +6,7 @@ import requests import voluptuous as vol from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchDevice -from homeassistant.const import CONF_NAME, CONF_RESOURCE +from homeassistant.const import CONF_NAME, CONF_RESOURCE, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -116,7 +116,7 @@ class ArestSwitchFunction(ArestSwitchBase): request = requests.get(f"{self._resource}/{self._func}", timeout=10) - if request.status_code != 200: + if request.status_code != HTTP_OK: _LOGGER.error("Can't find function") return @@ -133,7 +133,7 @@ class ArestSwitchFunction(ArestSwitchBase): f"{self._resource}/{self._func}", timeout=10, params={"params": "1"} ) - if request.status_code == 200: + if request.status_code == HTTP_OK: self._state = True else: _LOGGER.error("Can't turn on function %s at %s", self._func, self._resource) @@ -144,7 +144,7 @@ class ArestSwitchFunction(ArestSwitchBase): f"{self._resource}/{self._func}", timeout=10, params={"params": "0"} ) - if request.status_code == 200: + if request.status_code == HTTP_OK: self._state = False else: _LOGGER.error( @@ -172,7 +172,7 @@ class ArestSwitchPin(ArestSwitchBase): self.invert = invert request = requests.get(f"{self._resource}/mode/{self._pin}/o", timeout=10) - if request.status_code != 200: + if request.status_code != HTTP_OK: _LOGGER.error("Can't set mode") self._available = False @@ -182,7 +182,7 @@ class ArestSwitchPin(ArestSwitchBase): request = requests.get( f"{self._resource}/digital/{self._pin}/{turn_on_payload}", timeout=10 ) - if request.status_code == 200: + if request.status_code == HTTP_OK: self._state = True else: _LOGGER.error("Can't turn on pin %s at %s", self._pin, self._resource) @@ -193,7 +193,7 @@ class ArestSwitchPin(ArestSwitchBase): request = requests.get( f"{self._resource}/digital/{self._pin}/{turn_off_payload}", timeout=10 ) - if request.status_code == 200: + if request.status_code == HTTP_OK: self._state = False else: _LOGGER.error("Can't turn off pin %s at %s", self._pin, self._resource) diff --git a/homeassistant/components/auth/__init__.py b/homeassistant/components/auth/__init__.py index 888ef98a582a..6733361f5c3b 100644 --- a/homeassistant/components/auth/__init__.py +++ b/homeassistant/components/auth/__init__.py @@ -132,6 +132,7 @@ from homeassistant.components.http.auth import async_sign_path from homeassistant.components.http.ban import log_invalid_auth from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView +from homeassistant.const import HTTP_OK from homeassistant.core import HomeAssistant, callback from homeassistant.loader import bind_hass from homeassistant.util import dt as dt_util @@ -271,15 +272,15 @@ class TokenView(HomeAssistantView): token = data.get("token") if token is None: - return web.Response(status=200) + return web.Response(status=HTTP_OK) refresh_token = await hass.auth.async_get_refresh_token_by_token(token) if refresh_token is None: - return web.Response(status=200) + return web.Response(status=HTTP_OK) await hass.auth.async_remove_refresh_token(refresh_token) - return web.Response(status=200) + return web.Response(status=HTTP_OK) async def _async_handle_auth_code(self, hass, data, remote_addr): """Handle authorization code request.""" diff --git a/homeassistant/components/bloomsky/__init__.py b/homeassistant/components/bloomsky/__init__.py index ba10c5c74131..929f8218144a 100644 --- a/homeassistant/components/bloomsky/__init__.py +++ b/homeassistant/components/bloomsky/__init__.py @@ -6,7 +6,7 @@ from aiohttp.hdrs import AUTHORIZATION import requests import voluptuous as vol -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.helpers import discovery import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle @@ -72,7 +72,7 @@ class BloomSky: if response.status_code == 405: _LOGGER.error("You have no bloomsky devices configured") return - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error("Invalid HTTP response: %s", response.status_code) return # Create dictionary keyed off of the device unique id diff --git a/homeassistant/components/bluesound/media_player.py b/homeassistant/components/bluesound/media_player.py index a0f1d38ba772..eb1ce5f30dc5 100644 --- a/homeassistant/components/bluesound/media_player.py +++ b/homeassistant/components/bluesound/media_player.py @@ -38,6 +38,7 @@ from homeassistant.const import ( CONF_PORT, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, + HTTP_OK, STATE_IDLE, STATE_OFF, STATE_PAUSED, @@ -354,7 +355,7 @@ class BluesoundPlayer(MediaPlayerDevice): with async_timeout.timeout(10): response = await websession.get(url) - if response.status == 200: + if response.status == HTTP_OK: result = await response.text() if result: data = xmltodict.parse(result) @@ -398,7 +399,7 @@ class BluesoundPlayer(MediaPlayerDevice): url, headers={CONNECTION: KEEP_ALIVE} ) - if response.status == 200: + if response.status == HTTP_OK: result = await response.text() self._is_online = True self._last_status_update = dt_util.utcnow() diff --git a/homeassistant/components/buienradar/util.py b/homeassistant/components/buienradar/util.py index 900b1caaf979..4c69678d215d 100644 --- a/homeassistant/components/buienradar/util.py +++ b/homeassistant/components/buienradar/util.py @@ -25,7 +25,7 @@ from buienradar.constants import ( ) from buienradar.urls import JSON_FEED_URL, json_precipitation_forecast_url -from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.event import async_track_point_in_utc_time from homeassistant.util import dt as dt_util @@ -92,7 +92,7 @@ class BrData: result[STATUS_CODE] = resp.status result[CONTENT] = await resp.text() - if resp.status == 200: + if resp.status == HTTP_OK: result[SUCCESS] = True else: result[MESSAGE] = "Got http statuscode: %d" % (resp.status) diff --git a/homeassistant/components/clickatell/notify.py b/homeassistant/components/clickatell/notify.py index d59a553a4f62..f1a27be83b9b 100644 --- a/homeassistant/components/clickatell/notify.py +++ b/homeassistant/components/clickatell/notify.py @@ -5,7 +5,7 @@ import requests import voluptuous as vol from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationService -from homeassistant.const import CONF_API_KEY, CONF_RECIPIENT +from homeassistant.const import CONF_API_KEY, CONF_RECIPIENT, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -37,5 +37,5 @@ class ClickatellNotificationService(BaseNotificationService): data = {"apiKey": self.api_key, "to": self.recipient, "content": message} resp = requests.get(BASE_API_URL, params=data, timeout=5) - if (resp.status_code != 200) or (resp.status_code != 201): + if (resp.status_code != HTTP_OK) or (resp.status_code != 201): _LOGGER.error("Error %s : %s", resp.status_code, resp.text) diff --git a/homeassistant/components/clicksend/notify.py b/homeassistant/components/clicksend/notify.py index 42136e9a09cb..18562260431c 100644 --- a/homeassistant/components/clicksend/notify.py +++ b/homeassistant/components/clicksend/notify.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_SENDER, CONF_USERNAME, CONTENT_TYPE_JSON, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -80,7 +81,7 @@ class ClicksendNotificationService(BaseNotificationService): auth=(self.username, self.api_key), timeout=TIMEOUT, ) - if resp.status_code == 200: + if resp.status_code == HTTP_OK: return obj = json.loads(resp.text) @@ -100,6 +101,6 @@ def _authenticate(config): auth=(config[CONF_USERNAME], config[CONF_API_KEY]), timeout=TIMEOUT, ) - if resp.status_code != 200: + if resp.status_code != HTTP_OK: return False return True diff --git a/homeassistant/components/clicksend_tts/notify.py b/homeassistant/components/clicksend_tts/notify.py index 400e72a7d0cb..0847f3fb907e 100644 --- a/homeassistant/components/clicksend_tts/notify.py +++ b/homeassistant/components/clicksend_tts/notify.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_RECIPIENT, CONF_USERNAME, CONTENT_TYPE_JSON, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -87,7 +88,7 @@ class ClicksendNotificationService(BaseNotificationService): timeout=TIMEOUT, ) - if resp.status_code == 200: + if resp.status_code == HTTP_OK: return obj = json.loads(resp.text) response_msg = obj["response_msg"] @@ -107,7 +108,7 @@ def _authenticate(config): timeout=TIMEOUT, ) - if resp.status_code != 200: + if resp.status_code != HTTP_OK: return False return True diff --git a/homeassistant/components/cloud/client.py b/homeassistant/components/cloud/client.py index ef73d4356d5c..a17f536db724 100644 --- a/homeassistant/components/cloud/client.py +++ b/homeassistant/components/cloud/client.py @@ -12,6 +12,7 @@ from homeassistant.components.alexa import ( smart_home as alexa_sh, ) from homeassistant.components.google_assistant import const as gc, smart_home as ga +from homeassistant.const import HTTP_OK from homeassistant.core import Context, callback from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.typing import HomeAssistantType @@ -174,7 +175,7 @@ class CloudClient(Interface): break if found is None: - return {"status": 200} + return {"status": HTTP_OK} request = MockRequest( content=payload["body"].encode("utf-8"), diff --git a/homeassistant/components/cloud/google_config.py b/homeassistant/components/cloud/google_config.py index 1074aaa68b3c..8420a1bea7e6 100644 --- a/homeassistant/components/cloud/google_config.py +++ b/homeassistant/components/cloud/google_config.py @@ -6,7 +6,7 @@ from hass_nabucasa import cloud_api from hass_nabucasa.google_report_state import ErrorResponse from homeassistant.components.google_assistant.helpers import AbstractConfig -from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES +from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES, HTTP_OK from homeassistant.helpers import entity_registry from .const import ( @@ -124,7 +124,7 @@ class CloudGoogleConfig(AbstractConfig): async def _async_request_sync_devices(self, agent_user_id: str): """Trigger a sync with Google.""" if self._sync_entities_lock.locked(): - return 200 + return HTTP_OK async with self._sync_entities_lock: resp = await cloud_api.async_google_actions_request_sync(self._cloud) diff --git a/homeassistant/components/cloud/http_api.py b/homeassistant/components/cloud/http_api.py index c532a2063a7a..09dae3efc24e 100644 --- a/homeassistant/components/cloud/http_api.py +++ b/homeassistant/components/cloud/http_api.py @@ -19,6 +19,7 @@ from homeassistant.components.google_assistant import helpers as google_helpers from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.websocket_api import const as ws_const +from homeassistant.const import HTTP_OK from homeassistant.core import callback from .const import ( @@ -321,7 +322,7 @@ async def websocket_subscription(hass, connection, msg): with async_timeout.timeout(REQUEST_TIMEOUT): response = await cloud.fetch_subscription_info() - if response.status != 200: + if response.status != HTTP_OK: connection.send_message( websocket_api.error_message( msg["id"], "request_failed", "Failed to request subscription" diff --git a/homeassistant/components/ddwrt/device_tracker.py b/homeassistant/components/ddwrt/device_tracker.py index a6bdb9c527bd..27f6895fc43d 100644 --- a/homeassistant/components/ddwrt/device_tracker.py +++ b/homeassistant/components/ddwrt/device_tracker.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_SSL, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -152,7 +153,7 @@ class DdWrtDeviceScanner(DeviceScanner): except requests.exceptions.Timeout: _LOGGER.exception("Connection to the router timed out") return - if response.status_code == 200: + if response.status_code == HTTP_OK: return _parse_ddwrt_response(response.text) if response.status_code == 401: # Authentication error diff --git a/homeassistant/components/doorbird/__init__.py b/homeassistant/components/doorbird/__init__.py index bbbaa3d340c8..b70b0a3061cf 100644 --- a/homeassistant/components/doorbird/__init__.py +++ b/homeassistant/components/doorbird/__init__.py @@ -18,6 +18,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME, + HTTP_OK, ) from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import ConfigEntryNotReady @@ -71,7 +72,7 @@ async def async_setup(hass: HomeAssistant, config: dict): hass.async_create_task( hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data=doorstation_config, + DOMAIN, context={"source": SOURCE_IMPORT}, data=doorstation_config ) ) @@ -359,10 +360,10 @@ class DoorBirdRequestView(HomeAssistantView): hass.bus.async_fire(RESET_DEVICE_FAVORITES, {"token": token}) message = f"HTTP Favorites cleared for {device.slug}" - return web.Response(status=200, text=message) + return web.Response(status=HTTP_OK, text=message) hass.bus.async_fire(f"{DOMAIN}_{event}", event_data) log_entry(hass, f"Doorbird {event}", "event was fired.", DOMAIN) - return web.Response(status=200, text="OK") + return web.Response(status=HTTP_OK, text="OK") diff --git a/homeassistant/components/downloader/__init__.py b/homeassistant/components/downloader/__init__.py index 9054943ca525..0c87f04e3abf 100644 --- a/homeassistant/components/downloader/__init__.py +++ b/homeassistant/components/downloader/__init__.py @@ -7,6 +7,7 @@ import threading import requests import voluptuous as vol +from homeassistant.const import HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.util import sanitize_filename @@ -76,7 +77,7 @@ def setup(hass, config): req = requests.get(url, stream=True, timeout=10) - if req.status_code != 200: + if req.status_code != HTTP_OK: _LOGGER.warning( "downloading '%s' failed, status_code=%d", url, req.status_code ) diff --git a/homeassistant/components/dte_energy_bridge/sensor.py b/homeassistant/components/dte_energy_bridge/sensor.py index 826f9cf5acb5..c0725219a9a6 100644 --- a/homeassistant/components/dte_energy_bridge/sensor.py +++ b/homeassistant/components/dte_energy_bridge/sensor.py @@ -5,7 +5,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -85,7 +85,7 @@ class DteEnergyBridgeSensor(Entity): ) return - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.warning( "Invalid status_code from DTE Energy Bridge: %s (%s)", response.status_code, diff --git a/homeassistant/components/dublin_bus_transport/sensor.py b/homeassistant/components/dublin_bus_transport/sensor.py index e75775bf75f5..41c7df7889ec 100644 --- a/homeassistant/components/dublin_bus_transport/sensor.py +++ b/homeassistant/components/dublin_bus_transport/sensor.py @@ -11,7 +11,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, HTTP_OK, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util @@ -148,7 +148,7 @@ class PublicTransportData: response = requests.get(_RESOURCE, params, timeout=10) - if response.status_code != 200: + if response.status_code != HTTP_OK: self.info = [ {ATTR_DUE_AT: "n/a", ATTR_ROUTE: self.route, ATTR_DUE_IN: "n/a"} ] diff --git a/homeassistant/components/emoncms/sensor.py b/homeassistant/components/emoncms/sensor.py index c07544058402..dca9c870022e 100644 --- a/homeassistant/components/emoncms/sensor.py +++ b/homeassistant/components/emoncms/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_UNIT_OF_MEASUREMENT, CONF_URL, CONF_VALUE_TEMPLATE, + HTTP_OK, POWER_WATT, STATE_UNKNOWN, ) @@ -245,7 +246,7 @@ class EmonCmsData: _LOGGER.error(exception) return else: - if req.status_code == 200: + if req.status_code == HTTP_OK: self.data = req.json() else: _LOGGER.error( diff --git a/homeassistant/components/emoncms_history/__init__.py b/homeassistant/components/emoncms_history/__init__.py index fd38da1cac17..85b48c557554 100644 --- a/homeassistant/components/emoncms_history/__init__.py +++ b/homeassistant/components/emoncms_history/__init__.py @@ -10,6 +10,7 @@ from homeassistant.const import ( CONF_SCAN_INTERVAL, CONF_URL, CONF_WHITELIST, + HTTP_OK, STATE_UNAVAILABLE, STATE_UNKNOWN, ) @@ -58,7 +59,7 @@ def setup(hass, config): _LOGGER.error("Error saving data '%s' to '%s'", payload, fullurl) else: - if req.status_code != 200: + if req.status_code != HTTP_OK: _LOGGER.error( "Error saving data %s to %s (http status code = %d)", payload, diff --git a/homeassistant/components/facebook/notify.py b/homeassistant/components/facebook/notify.py index 34d5b14cf257..0ce2fbfc665e 100644 --- a/homeassistant/components/facebook/notify.py +++ b/homeassistant/components/facebook/notify.py @@ -12,7 +12,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONTENT_TYPE_JSON +from homeassistant.const import CONTENT_TYPE_JSON, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -76,7 +76,7 @@ class FacebookNotificationService(BaseNotificationService): headers={CONTENT_TYPE: CONTENT_TYPE_JSON}, timeout=10, ) - if resp.status_code != 200: + if resp.status_code != HTTP_OK: log_error(resp) diff --git a/homeassistant/components/flock/notify.py b/homeassistant/components/flock/notify.py index 107c837970d2..7bdd1b33c5b2 100644 --- a/homeassistant/components/flock/notify.py +++ b/homeassistant/components/flock/notify.py @@ -6,7 +6,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationService -from homeassistant.const import CONF_ACCESS_TOKEN +from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -44,7 +44,7 @@ class FlockNotificationService(BaseNotificationService): response = await self._session.post(self._url, json=payload) result = await response.json() - if response.status != 200 or "error" in result: + if response.status != HTTP_OK or "error" in result: _LOGGER.error( "Flock service returned HTTP status %d, response %s", response.status, diff --git a/homeassistant/components/foursquare/__init__.py b/homeassistant/components/foursquare/__init__.py index 07d177ebf30f..bae0336a63e2 100644 --- a/homeassistant/components/foursquare/__init__.py +++ b/homeassistant/components/foursquare/__init__.py @@ -5,7 +5,7 @@ import requests import voluptuous as vol from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_BAD_REQUEST +from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_BAD_REQUEST, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -55,7 +55,7 @@ def setup(hass, config): url = f"https://api.foursquare.com/v2/checkins/add?oauth_token={config[CONF_ACCESS_TOKEN]}&v=20160802&m=swarm" response = requests.post(url, data=call.data, timeout=10) - if response.status_code not in (200, 201): + if response.status_code not in (HTTP_OK, 201): _LOGGER.exception( "Error checking in user. Response %d: %s:", response.status_code, diff --git a/homeassistant/components/google_translate/tts.py b/homeassistant/components/google_translate/tts.py index e35a229ab98e..36543e0515ef 100644 --- a/homeassistant/components/google_translate/tts.py +++ b/homeassistant/components/google_translate/tts.py @@ -11,6 +11,7 @@ import voluptuous as vol import yarl from homeassistant.components.tts import CONF_LANG, PLATFORM_SCHEMA, Provider +from homeassistant.const import HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession _LOGGER = logging.getLogger(__name__) @@ -142,7 +143,7 @@ class GoogleProvider(Provider): GOOGLE_SPEECH_URL, params=url_param, headers=self.headers ) - if request.status != 200: + if request.status != HTTP_OK: _LOGGER.error( "Error %d on load URL %s", request.status, request.url ) diff --git a/homeassistant/components/hangouts/hangouts_bot.py b/homeassistant/components/hangouts/hangouts_bot.py index b3dfdecac2ae..56045f0eb1cf 100644 --- a/homeassistant/components/hangouts/hangouts_bot.py +++ b/homeassistant/components/hangouts/hangouts_bot.py @@ -7,6 +7,7 @@ import aiohttp import hangups from hangups import ChatMessageEvent, ChatMessageSegment, Client, get_auth, hangouts_pb2 +from homeassistant.const import HTTP_OK from homeassistant.core import callback from homeassistant.helpers import dispatcher, intent from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -273,7 +274,7 @@ class HangoutsBot: try: websession = async_get_clientsession(self.hass) async with websession.get(uri, timeout=5) as response: - if response.status != 200: + if response.status != HTTP_OK: _LOGGER.error( "Fetch image failed, %s, %s", response.status, response ) diff --git a/homeassistant/components/hassio/auth.py b/homeassistant/components/hassio/auth.py index f8474e0fd24f..b95690641cdc 100644 --- a/homeassistant/components/hassio/auth.py +++ b/homeassistant/components/hassio/auth.py @@ -15,6 +15,7 @@ from homeassistant.auth.models import User from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.const import KEY_HASS_USER, KEY_REAL_IP from homeassistant.components.http.data_validator import RequestDataValidator +from homeassistant.const import HTTP_OK from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv @@ -93,7 +94,7 @@ class HassIOAuth(HassIOBaseAuth): self._check_access(request) await self._check_login(data[ATTR_USERNAME], data[ATTR_PASSWORD]) - return web.Response(status=200) + return web.Response(status=HTTP_OK) async def _check_login(self, username, password): """Check User credentials.""" @@ -117,7 +118,7 @@ class HassIOPasswordReset(HassIOBaseAuth): self._check_access(request) await self._change_password(data[ATTR_USERNAME], data[ATTR_PASSWORD]) - return web.Response(status=200) + return web.Response(status=HTTP_OK) async def _change_password(self, username, password): """Check User credentials.""" diff --git a/homeassistant/components/hassio/handler.py b/homeassistant/components/hassio/handler.py index bb41e5335d79..91b369255428 100644 --- a/homeassistant/components/hassio/handler.py +++ b/homeassistant/components/hassio/handler.py @@ -12,7 +12,7 @@ from homeassistant.components.http import ( CONF_SSL_CERTIFICATE, DEFAULT_SERVER_HOST, ) -from homeassistant.const import SERVER_PORT +from homeassistant.const import HTTP_OK, SERVER_PORT from .const import X_HASSIO @@ -167,7 +167,7 @@ class HassIO: headers={X_HASSIO: os.environ.get("HASSIO_TOKEN", "")}, ) - if request.status not in (200, 400): + if request.status not in (HTTP_OK, 400): _LOGGER.error("%s return code %d.", command, request.status) raise HassioAPIError() diff --git a/homeassistant/components/haveibeenpwned/sensor.py b/homeassistant/components/haveibeenpwned/sensor.py index 00a39aae8f49..51b06917142e 100644 --- a/homeassistant/components/haveibeenpwned/sensor.py +++ b/homeassistant/components/haveibeenpwned/sensor.py @@ -7,7 +7,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_EMAIL +from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_EMAIL, HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_point_in_time @@ -158,7 +158,7 @@ class HaveIBeenPwnedData: _LOGGER.error("Failed fetching data for %s", self._email) return - if req.status_code == 200: + if req.status_code == HTTP_OK: self.data[self._email] = sorted( req.json(), key=lambda k: k["AddedDate"], reverse=True ) diff --git a/homeassistant/components/hitron_coda/device_tracker.py b/homeassistant/components/hitron_coda/device_tracker.py index 12b03acbcc50..a49e3cc6d217 100644 --- a/homeassistant/components/hitron_coda/device_tracker.py +++ b/homeassistant/components/hitron_coda/device_tracker.py @@ -10,7 +10,13 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_TYPE, CONF_USERNAME +from homeassistant.const import ( + CONF_HOST, + CONF_PASSWORD, + CONF_TYPE, + CONF_USERNAME, + HTTP_OK, +) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -83,7 +89,7 @@ class HitronCODADeviceScanner(DeviceScanner): except requests.exceptions.Timeout: _LOGGER.error("Connection to the router timed out at URL %s", self._url) return False - if res.status_code != 200: + if res.status_code != HTTP_OK: _LOGGER.error("Connection failed with http code %s", res.status_code) return False try: @@ -109,7 +115,7 @@ class HitronCODADeviceScanner(DeviceScanner): except requests.exceptions.Timeout: _LOGGER.error("Connection to the router timed out at URL %s", self._url) return False - if res.status_code != 200: + if res.status_code != HTTP_OK: _LOGGER.error("Connection failed with http code %s", res.status_code) return False try: diff --git a/homeassistant/components/http/view.py b/homeassistant/components/http/view.py index bb7c5816c775..40ca43ff6951 100644 --- a/homeassistant/components/http/view.py +++ b/homeassistant/components/http/view.py @@ -13,7 +13,7 @@ from aiohttp.web_exceptions import ( import voluptuous as vol from homeassistant import exceptions -from homeassistant.const import CONTENT_TYPE_JSON +from homeassistant.const import CONTENT_TYPE_JSON, HTTP_OK from homeassistant.core import Context, is_callback from homeassistant.helpers.json import JSONEncoder @@ -44,7 +44,7 @@ class HomeAssistantView: return Context(user_id=user.id) @staticmethod - def json(result, status_code=200, headers=None): + def json(result, status_code=HTTP_OK, headers=None): """Return a JSON response.""" try: msg = json.dumps( @@ -62,7 +62,9 @@ class HomeAssistantView: response.enable_compression() return response - def json_message(self, message, status_code=200, message_code=None, headers=None): + def json_message( + self, message, status_code=HTTP_OK, message_code=None, headers=None + ): """Return a JSON message response.""" data = {"message": message} if message_code is not None: @@ -132,7 +134,7 @@ def request_handler_factory(view, handler): # The method handler returned a ready-made Response, how nice of it return result - status_code = 200 + status_code = HTTP_OK if isinstance(result, tuple): result, status_code = result diff --git a/homeassistant/components/ifttt/__init__.py b/homeassistant/components/ifttt/__init__.py index c060c5f88156..cb1bb9f64cf7 100644 --- a/homeassistant/components/ifttt/__init__.py +++ b/homeassistant/components/ifttt/__init__.py @@ -6,7 +6,7 @@ import pyfttt import requests import voluptuous as vol -from homeassistant.const import CONF_WEBHOOK_ID +from homeassistant.const import CONF_WEBHOOK_ID, HTTP_OK from homeassistant.helpers import config_entry_flow import homeassistant.helpers.config_validation as cv @@ -75,7 +75,7 @@ async def async_setup(hass, config): for target, key in target_keys.items(): res = pyfttt.send_event(key, event, value1, value2, value3) - if res.status_code != 200: + if res.status_code != HTTP_OK: _LOGGER.error("IFTTT reported error sending event to %s.", target) except requests.exceptions.RequestException: _LOGGER.exception("Error communicating with IFTTT") diff --git a/homeassistant/components/lifx_cloud/scene.py b/homeassistant/components/lifx_cloud/scene.py index 08e044a46e07..7b0fca67bd60 100644 --- a/homeassistant/components/lifx_cloud/scene.py +++ b/homeassistant/components/lifx_cloud/scene.py @@ -8,7 +8,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.scene import Scene -from homeassistant.const import CONF_PLATFORM, CONF_TIMEOUT, CONF_TOKEN +from homeassistant.const import CONF_PLATFORM, CONF_TIMEOUT, CONF_TOKEN, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -44,7 +44,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= return False status = scenes_resp.status - if status == 200: + if status == HTTP_OK: data = await scenes_resp.json() devices = [] for scene in data: diff --git a/homeassistant/components/linksys_smart/device_tracker.py b/homeassistant/components/linksys_smart/device_tracker.py index a2a8e317133d..1f31ddc03a17 100644 --- a/homeassistant/components/linksys_smart/device_tracker.py +++ b/homeassistant/components/linksys_smart/device_tracker.py @@ -9,7 +9,7 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_HOST, HTTP_OK import homeassistant.helpers.config_validation as cv DEFAULT_TIMEOUT = 10 @@ -37,7 +37,7 @@ class LinksysSmartWifiDeviceScanner(DeviceScanner): # Check if the access point is accessible response = self._make_request() - if not response.status_code == 200: + if not response.status_code == HTTP_OK: raise ConnectionError("Cannot connect to Linksys Access Point") def scan_devices(self): @@ -56,7 +56,7 @@ class LinksysSmartWifiDeviceScanner(DeviceScanner): self.last_results = {} response = self._make_request() - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error( "Got HTTP status code %d when getting device list", response.status_code ) diff --git a/homeassistant/components/llamalab_automate/notify.py b/homeassistant/components/llamalab_automate/notify.py index 5a3d4e0df38b..f093edbbc6bf 100644 --- a/homeassistant/components/llamalab_automate/notify.py +++ b/homeassistant/components/llamalab_automate/notify.py @@ -5,7 +5,7 @@ import requests import voluptuous as vol from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationService -from homeassistant.const import CONF_API_KEY, CONF_DEVICE +from homeassistant.const import CONF_API_KEY, CONF_DEVICE, HTTP_OK from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -51,5 +51,5 @@ class AutomateNotificationService(BaseNotificationService): } response = requests.post(_RESOURCE, json=data) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error("Error sending message: %s", response) diff --git a/homeassistant/components/lockitron/lock.py b/homeassistant/components/lockitron/lock.py index 8ff8f4303553..7d34bb02472d 100644 --- a/homeassistant/components/lockitron/lock.py +++ b/homeassistant/components/lockitron/lock.py @@ -5,7 +5,7 @@ import requests import voluptuous as vol from homeassistant.components.lock import PLATFORM_SCHEMA, LockDevice -from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ID +from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ID, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -25,7 +25,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): response = requests.get( f"{BASE_URL}/v2/locks/{device_id}?access_token={access_token}", timeout=5 ) - if response.status_code == 200: + if response.status_code == HTTP_OK: add_entities([Lockitron(response.json()["state"], access_token, device_id)]) else: _LOGGER.error("Error retrieving lock status during init: %s", response.text) @@ -67,7 +67,7 @@ class Lockitron(LockDevice): f"{BASE_URL}/v2/locks/{self.device_id}?access_token={self.access_token}", timeout=5, ) - if response.status_code == 200: + if response.status_code == HTTP_OK: self._state = response.json()["state"] else: _LOGGER.error("Error retrieving lock status: %s", response.text) @@ -78,7 +78,7 @@ class Lockitron(LockDevice): f"{BASE_URL}/v2/locks/{self.device_id}?access_token={self.access_token}&state={requested_state}", timeout=5, ) - if response.status_code == 200: + if response.status_code == HTTP_OK: return response.json()["state"] _LOGGER.error( diff --git a/homeassistant/components/london_air/sensor.py b/homeassistant/components/london_air/sensor.py index 7eb410cacab4..c7104ac19ad4 100644 --- a/homeassistant/components/london_air/sensor.py +++ b/homeassistant/components/london_air/sensor.py @@ -6,6 +6,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -83,7 +84,7 @@ class APIData: def update(self): """Get the latest data from TFL.""" response = requests.get(URL, timeout=10) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.warning("Invalid response from API") else: self.data = parse_api_response(response.json()) diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 757dd00897d5..86b5d7581495 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -18,6 +18,7 @@ import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView from homeassistant.const import ( + HTTP_OK, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY, @@ -211,7 +212,7 @@ async def async_setup(hass, config): SERVICE_TURN_OFF, {}, "async_turn_off", [SUPPORT_TURN_OFF] ) component.async_register_entity_service( - SERVICE_TOGGLE, {}, "async_toggle", [SUPPORT_TURN_OFF | SUPPORT_TURN_ON], + SERVICE_TOGGLE, {}, "async_toggle", [SUPPORT_TURN_OFF | SUPPORT_TURN_ON] ) component.async_register_entity_service( SERVICE_VOLUME_UP, @@ -241,7 +242,7 @@ async def async_setup(hass, config): SERVICE_MEDIA_STOP, {}, "async_media_stop", [SUPPORT_STOP] ) component.async_register_entity_service( - SERVICE_MEDIA_NEXT_TRACK, {}, "async_media_next_track", [SUPPORT_NEXT_TRACK], + SERVICE_MEDIA_NEXT_TRACK, {}, "async_media_next_track", [SUPPORT_NEXT_TRACK] ) component.async_register_entity_service( SERVICE_MEDIA_PREVIOUS_TRACK, @@ -250,7 +251,7 @@ async def async_setup(hass, config): [SUPPORT_PREVIOUS_TRACK], ) component.async_register_entity_service( - SERVICE_CLEAR_PLAYLIST, {}, "async_clear_playlist", [SUPPORT_CLEAR_PLAYLIST], + SERVICE_CLEAR_PLAYLIST, {}, "async_clear_playlist", [SUPPORT_CLEAR_PLAYLIST] ) component.async_register_entity_service( SERVICE_VOLUME_SET, @@ -832,7 +833,7 @@ async def _async_fetch_image(hass, url): with async_timeout.timeout(10): response = await websession.get(url) - if response.status == 200: + if response.status == HTTP_OK: content = await response.read() content_type = response.headers.get(CONTENT_TYPE) if content_type: diff --git a/homeassistant/components/mobile_app/helpers.py b/homeassistant/components/mobile_app/helpers.py index 400ff31be89e..7c7ceb3a8276 100644 --- a/homeassistant/components/mobile_app/helpers.py +++ b/homeassistant/components/mobile_app/helpers.py @@ -7,6 +7,7 @@ from aiohttp.web import Response, json_response from nacl.encoding import Base64Encoder from nacl.secret import SecretBox +from homeassistant.const import HTTP_OK from homeassistant.core import Context from homeassistant.helpers.json import JSONEncoder from homeassistant.helpers.typing import HomeAssistantType @@ -90,7 +91,7 @@ def registration_context(registration: Dict) -> Context: return Context(user_id=registration[CONF_USER_ID]) -def empty_okay_response(headers: Dict = None, status: int = 200) -> Response: +def empty_okay_response(headers: Dict = None, status: int = HTTP_OK) -> Response: """Return a Response with empty JSON object and a 200.""" return Response( text="{}", status=status, content_type="application/json", headers=headers @@ -144,7 +145,7 @@ def savable_state(hass: HomeAssistantType) -> Dict: def webhook_response( - data, *, registration: Dict, status: int = 200, headers: Dict = None + data, *, registration: Dict, status: int = HTTP_OK, headers: Dict = None ) -> Response: """Return a encrypted response if registration supports it.""" data = json.dumps(data, cls=JSONEncoder) diff --git a/homeassistant/components/mobile_app/notify.py b/homeassistant/components/mobile_app/notify.py index 00f4577ad9ef..f3c79103111f 100644 --- a/homeassistant/components/mobile_app/notify.py +++ b/homeassistant/components/mobile_app/notify.py @@ -12,6 +12,7 @@ from homeassistant.components.notify import ( ATTR_TITLE_DEFAULT, BaseNotificationService, ) +from homeassistant.const import HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.util.dt as dt_util @@ -134,7 +135,7 @@ class MobileAppNotificationService(BaseNotificationService): response = await self._session.post(push_url, json=data) result = await response.json() - if response.status in [200, 201, 202]: + if response.status in [HTTP_OK, 201, 202]: log_rate_limits(self.hass, entry_data[ATTR_DEVICE_NAME], result) continue diff --git a/homeassistant/components/nfandroidtv/notify.py b/homeassistant/components/nfandroidtv/notify.py index 280733affd26..db2b22650efc 100644 --- a/homeassistant/components/nfandroidtv/notify.py +++ b/homeassistant/components/nfandroidtv/notify.py @@ -14,7 +14,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONF_HOST, CONF_TIMEOUT, UNIT_PERCENTAGE +from homeassistant.const import CONF_HOST, CONF_TIMEOUT, HTTP_OK, UNIT_PERCENTAGE import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -238,7 +238,7 @@ class NFAndroidTVNotificationService(BaseNotificationService): try: _LOGGER.debug("Payload: %s", str(payload)) response = requests.post(self._target, files=payload, timeout=self._timeout) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error("Error sending message: %s", str(response)) except requests.exceptions.ConnectionError as err: _LOGGER.error("Error communicating with %s: %s", self._target, str(err)) diff --git a/homeassistant/components/nissan_leaf/__init__.py b/homeassistant/components/nissan_leaf/__init__.py index f5f23f2f1140..a1e6d74b4f32 100644 --- a/homeassistant/components/nissan_leaf/__init__.py +++ b/homeassistant/components/nissan_leaf/__init__.py @@ -7,7 +7,7 @@ import sys from pycarwings2 import CarwingsError, Session import voluptuous as vol -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_OK from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import load_platform @@ -287,7 +287,7 @@ class LeafDataStore: if server_response is not None: _LOGGER.debug("Server Response: %s", server_response.__dict__) - if server_response.answer["status"] == 200: + if server_response.answer["status"] == HTTP_OK: self.data[DATA_BATTERY] = server_response.battery_percent # pycarwings2 library doesn't always provide cruising rnages diff --git a/homeassistant/components/openalpr_cloud/image_processing.py b/homeassistant/components/openalpr_cloud/image_processing.py index 41a631937d78..8f04b0838fe8 100644 --- a/homeassistant/components/openalpr_cloud/image_processing.py +++ b/homeassistant/components/openalpr_cloud/image_processing.py @@ -17,7 +17,7 @@ from homeassistant.components.image_processing import ( from homeassistant.components.openalpr_local.image_processing import ( ImageProcessingAlprEntity, ) -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.core import split_entity_id from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -121,7 +121,7 @@ class OpenAlprCloudEntity(ImageProcessingAlprEntity): data = await request.json() - if request.status != 200: + if request.status != HTTP_OK: _LOGGER.error("Error %d -> %s.", request.status, data.get("error")) return diff --git a/homeassistant/components/openexchangerates/sensor.py b/homeassistant/components/openexchangerates/sensor.py index cc6da709dff5..9846e305291b 100644 --- a/homeassistant/components/openexchangerates/sensor.py +++ b/homeassistant/components/openexchangerates/sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_BASE, CONF_NAME, CONF_QUOTE, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -49,7 +50,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): rest = OpenexchangeratesData(_RESOURCE, parameters, quote) response = requests.get(_RESOURCE, params=parameters, timeout=10) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error("Check your OpenExchangeRates API key") return False diff --git a/homeassistant/components/prowl/notify.py b/homeassistant/components/prowl/notify.py index d5167ebfdc95..ada7fbb5f340 100644 --- a/homeassistant/components/prowl/notify.py +++ b/homeassistant/components/prowl/notify.py @@ -12,7 +12,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -57,7 +57,7 @@ class ProwlNotificationService(BaseNotificationService): response = await session.post(url, data=payload) result = await response.text() - if response.status != 200 or "error" in result: + if response.status != HTTP_OK or "error" in result: _LOGGER.error( "Prowl service returned http status %d, response %s", response.status, diff --git a/homeassistant/components/pushsafer/notify.py b/homeassistant/components/pushsafer/notify.py index 436191ab8647..12735764b4ba 100644 --- a/homeassistant/components/pushsafer/notify.py +++ b/homeassistant/components/pushsafer/notify.py @@ -15,6 +15,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) +from homeassistant.const import HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -118,7 +119,7 @@ class PushsaferNotificationService(BaseNotificationService): for target in targets: payload["d"] = target response = requests.post(_RESOURCE, data=payload, timeout=CONF_TIMEOUT) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.error("Pushsafer failed with: %s", response.text) else: _LOGGER.debug("Push send: %s", response.json()) diff --git a/homeassistant/components/rachio/config_flow.py b/homeassistant/components/rachio/config_flow.py index 64e78a24f4a4..2f5835ad614e 100644 --- a/homeassistant/components/rachio/config_flow.py +++ b/homeassistant/components/rachio/config_flow.py @@ -5,7 +5,7 @@ from rachiopy import Rachio import voluptuous as vol from homeassistant import config_entries, core, exceptions -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.core import callback from .const import ( @@ -33,13 +33,13 @@ async def validate_input(hass: core.HomeAssistant, data): try: data = await hass.async_add_executor_job(rachio.person.getInfo) _LOGGER.debug("rachio.person.getInfo: %s", data) - if int(data[0][KEY_STATUS]) != 200: + if int(data[0][KEY_STATUS]) != HTTP_OK: raise InvalidAuth rachio_id = data[1][KEY_ID] data = await hass.async_add_executor_job(rachio.person.get, rachio_id) _LOGGER.debug("rachio.person.get: %s", data) - if int(data[0][KEY_STATUS]) != 200: + if int(data[0][KEY_STATUS]) != HTTP_OK: raise CannotConnect username = data[1][KEY_USERNAME] diff --git a/homeassistant/components/rachio/device.py b/homeassistant/components/rachio/device.py index 7ff47f7a2215..f7357a1b2dc9 100644 --- a/homeassistant/components/rachio/device.py +++ b/homeassistant/components/rachio/device.py @@ -3,7 +3,7 @@ import logging from typing import Optional -from homeassistant.const import EVENT_HOMEASSISTANT_STOP +from homeassistant.const import EVENT_HOMEASSISTANT_STOP, HTTP_OK from .const import ( KEY_DEVICES, @@ -40,12 +40,12 @@ class RachioPerson: def setup(self, hass): """Rachio device setup.""" response = self.rachio.person.getInfo() - assert int(response[0][KEY_STATUS]) == 200, "API key error" + assert int(response[0][KEY_STATUS]) == HTTP_OK, "API key error" self._id = response[1][KEY_ID] # Use user ID to get user data data = self.rachio.person.get(self._id) - assert int(data[0][KEY_STATUS]) == 200, "User ID error" + assert int(data[0][KEY_STATUS]) == HTTP_OK, "User ID error" self.username = data[1][KEY_USERNAME] devices = data[1][KEY_DEVICES] for controller in devices: diff --git a/homeassistant/components/radarr/sensor.py b/homeassistant/components/radarr/sensor.py index 6cfdd53653d6..30051d929db6 100644 --- a/homeassistant/components/radarr/sensor.py +++ b/homeassistant/components/radarr/sensor.py @@ -23,6 +23,7 @@ from homeassistant.const import ( DATA_TERABYTES, DATA_YOTTABYTES, DATA_ZETTABYTES, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -193,7 +194,7 @@ class RadarrSensor(Entity): self._state = None return - if res.status_code == 200: + if res.status_code == HTTP_OK: if self.type in ["upcoming", "movies", "commands"]: self.data = res.json() self._state = len(self.data) diff --git a/homeassistant/components/rest/notify.py b/homeassistant/components/rest/notify.py index 4f3de14b7313..b97398411306 100644 --- a/homeassistant/components/rest/notify.py +++ b/homeassistant/components/rest/notify.py @@ -23,6 +23,7 @@ from homeassistant.const import ( CONF_VERIFY_SSL, HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -195,7 +196,7 @@ class RestNotificationService(BaseNotificationService): _LOGGER.exception( "Client error. Response %d: %s:", response.status_code, response.reason ) - elif response.status_code >= 200 and response.status_code < 300: + elif response.status_code >= HTTP_OK and response.status_code < 300: _LOGGER.debug( "Success. Response %d: %s:", response.status_code, response.reason ) diff --git a/homeassistant/components/rest/switch.py b/homeassistant/components/rest/switch.py index fe409a46be74..71df1852e7ab 100644 --- a/homeassistant/components/rest/switch.py +++ b/homeassistant/components/rest/switch.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_TIMEOUT, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_OK, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -153,7 +154,7 @@ class RestSwitch(SwitchDevice): try: req = await self.set_device_state(body_on_t) - if req.status == 200: + if req.status == HTTP_OK: self._state = True else: _LOGGER.error( @@ -168,7 +169,7 @@ class RestSwitch(SwitchDevice): try: req = await self.set_device_state(body_off_t) - if req.status == 200: + if req.status == HTTP_OK: self._state = False else: _LOGGER.error( diff --git a/homeassistant/components/rocketchat/notify.py b/homeassistant/components/rocketchat/notify.py index 2b5b8dcd235f..efb2288f4d8d 100644 --- a/homeassistant/components/rocketchat/notify.py +++ b/homeassistant/components/rocketchat/notify.py @@ -13,7 +13,13 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONF_PASSWORD, CONF_ROOM, CONF_URL, CONF_USERNAME +from homeassistant.const import ( + CONF_PASSWORD, + CONF_ROOM, + CONF_URL, + CONF_USERNAME, + HTTP_OK, +) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -62,7 +68,7 @@ class RocketChatNotificationService(BaseNotificationService): """Send a message to Rocket.Chat.""" data = kwargs.get(ATTR_DATA) or {} resp = self._server.chat_post_message(message, channel=self._room, **data) - if resp.status_code == 200: + if resp.status_code == HTTP_OK: success = resp.json()["success"] if not success: _LOGGER.error("Unable to post Rocket.Chat message") diff --git a/homeassistant/components/route53/__init__.py b/homeassistant/components/route53/__init__.py index a84475ab8a19..cda4ba9dc86a 100644 --- a/homeassistant/components/route53/__init__.py +++ b/homeassistant/components/route53/__init__.py @@ -7,7 +7,7 @@ import boto3 from ipify import exceptions, get_ip import voluptuous as vol -from homeassistant.const import CONF_DOMAIN, CONF_TTL, CONF_ZONE +from homeassistant.const import CONF_DOMAIN, CONF_TTL, CONF_ZONE, HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import track_time_interval @@ -118,5 +118,5 @@ def _update_route53( ) _LOGGER.debug("Response is %s", response) - if response["ResponseMetadata"]["HTTPStatusCode"] != 200: + if response["ResponseMetadata"]["HTTPStatusCode"] != HTTP_OK: _LOGGER.warning(response) diff --git a/homeassistant/components/rss_feed_template/__init__.py b/homeassistant/components/rss_feed_template/__init__.py index 69bc94742679..b979e4d52614 100644 --- a/homeassistant/components/rss_feed_template/__init__.py +++ b/homeassistant/components/rss_feed_template/__init__.py @@ -5,6 +5,7 @@ from aiohttp import web import voluptuous as vol from homeassistant.components.http import HomeAssistantView +from homeassistant.const import HTTP_OK import homeassistant.helpers.config_validation as cv CONTENT_TYPE_XML = "text/xml" @@ -98,4 +99,6 @@ class RssView(HomeAssistantView): response += "\n" - return web.Response(body=response, content_type=CONTENT_TYPE_XML, status=200) + return web.Response( + body=response, content_type=CONTENT_TYPE_XML, status=HTTP_OK + ) diff --git a/homeassistant/components/sigfox/sensor.py b/homeassistant/components/sigfox/sensor.py index da07290f422b..6df6e1d0c82f 100644 --- a/homeassistant/components/sigfox/sensor.py +++ b/homeassistant/components/sigfox/sensor.py @@ -8,7 +8,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -66,7 +66,7 @@ class SigfoxAPI: """Check API credentials are valid.""" url = urljoin(API_URL, "devicetypes") response = requests.get(url, auth=self._auth, timeout=10) - if response.status_code != 200: + if response.status_code != HTTP_OK: if response.status_code == 401: _LOGGER.error("Invalid credentials for Sigfox API") else: diff --git a/homeassistant/components/sky_hub/device_tracker.py b/homeassistant/components/sky_hub/device_tracker.py index c7dc1092b739..2537196f21dd 100644 --- a/homeassistant/components/sky_hub/device_tracker.py +++ b/homeassistant/components/sky_hub/device_tracker.py @@ -10,7 +10,7 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_HOST, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -85,7 +85,7 @@ def _get_skyhub_data(url): except requests.exceptions.Timeout: _LOGGER.exception("Connection to the router timed out") return - if response.status_code == 200: + if response.status_code == HTTP_OK: return _parse_skyhub_response(response.text) _LOGGER.error("Invalid response from Sky Hub: %s", response) diff --git a/homeassistant/components/sonarr/sensor.py b/homeassistant/components/sonarr/sensor.py index c0781b37603a..ac9b81be7a43 100644 --- a/homeassistant/components/sonarr/sensor.py +++ b/homeassistant/components/sonarr/sensor.py @@ -23,6 +23,7 @@ from homeassistant.const import ( DATA_TERABYTES, DATA_YOTTABYTES, DATA_ZETTABYTES, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -220,7 +221,7 @@ class SonarrSensor(Entity): self._state = None return - if res.status_code == 200: + if res.status_code == HTTP_OK: if self.type in ["upcoming", "queue", "series", "commands"]: if self.days == 1 and self.type == "upcoming": # Sonarr API returns an empty array if start and end dates diff --git a/homeassistant/components/squeezebox/media_player.py b/homeassistant/components/squeezebox/media_player.py index 0610d4d9cf28..57305a3b4c05 100644 --- a/homeassistant/components/squeezebox/media_player.py +++ b/homeassistant/components/squeezebox/media_player.py @@ -33,6 +33,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_PORT, CONF_USERNAME, + HTTP_OK, STATE_IDLE, STATE_OFF, STATE_PAUSED, @@ -223,7 +224,7 @@ class LogitechMediaServer: with async_timeout.timeout(TIMEOUT): response = await websession.post(url, data=data, auth=auth) - if response.status != 200: + if response.status != HTTP_OK: _LOGGER.error( "Query failed, response code: %s Full message: %s", response.status, diff --git a/homeassistant/components/startca/sensor.py b/homeassistant/components/startca/sensor.py index b6d90b99302b..19c80a82e9fe 100644 --- a/homeassistant/components/startca/sensor.py +++ b/homeassistant/components/startca/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_MONITORED_VARIABLES, CONF_NAME, DATA_GIGABYTES, + HTTP_OK, UNIT_PERCENTAGE, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -146,7 +147,7 @@ class StartcaData: url = f"https://www.start.ca/support/usage/api?key={self.api_key}" with async_timeout.timeout(REQUEST_TIMEOUT): req = await self.websession.get(url) - if req.status != 200: + if req.status != HTTP_OK: _LOGGER.error("Request failed with status: %u", req.status) return False diff --git a/homeassistant/components/synology_chat/notify.py b/homeassistant/components/synology_chat/notify.py index 3e1aeb4ce138..c8f665cb408c 100644 --- a/homeassistant/components/synology_chat/notify.py +++ b/homeassistant/components/synology_chat/notify.py @@ -10,7 +10,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONF_RESOURCE, CONF_VERIFY_SSL +from homeassistant.const import CONF_RESOURCE, CONF_VERIFY_SSL, HTTP_OK import homeassistant.helpers.config_validation as cv ATTR_FILE_URL = "file_url" @@ -57,7 +57,7 @@ class SynologyChatNotificationService(BaseNotificationService): self._resource, data=to_send, timeout=10, verify=self._verify_ssl ) - if response.status_code not in (200, 201): + if response.status_code not in (HTTP_OK, 201): _LOGGER.exception( "Error sending message. Response %d: %s:", response.status_code, diff --git a/homeassistant/components/tado/device_tracker.py b/homeassistant/components/tado/device_tracker.py index ea797754da8d..5d87bfe8e34f 100644 --- a/homeassistant/components/tado/device_tracker.py +++ b/homeassistant/components/tado/device_tracker.py @@ -13,7 +13,7 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_OK from homeassistant.helpers.aiohttp_client import async_create_clientsession import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle @@ -114,7 +114,7 @@ class TadoDeviceScanner(DeviceScanner): response = await self.websession.get(url) - if response.status != 200: + if response.status != HTTP_OK: _LOGGER.warning("Error %d on %s.", response.status, self.tadoapiurl) return False diff --git a/homeassistant/components/teksavvy/sensor.py b/homeassistant/components/teksavvy/sensor.py index 0d2d290fed9c..96331cb5347b 100644 --- a/homeassistant/components/teksavvy/sensor.py +++ b/homeassistant/components/teksavvy/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( CONF_MONITORED_VARIABLES, CONF_NAME, DATA_GIGABYTES, + HTTP_OK, UNIT_PERCENTAGE, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -144,7 +145,7 @@ class TekSavvyData: ) with async_timeout.timeout(REQUEST_TIMEOUT): req = await self.websession.get(url, headers=headers) - if req.status != 200: + if req.status != HTTP_OK: _LOGGER.error("Request failed with status: %u", req.status) return False diff --git a/homeassistant/components/tomato/device_tracker.py b/homeassistant/components/tomato/device_tracker.py index 35db0671772d..873da5a78640 100644 --- a/homeassistant/components/tomato/device_tracker.py +++ b/homeassistant/components/tomato/device_tracker.py @@ -18,6 +18,7 @@ from homeassistant.const import ( CONF_SSL, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -102,7 +103,7 @@ class TomatoDeviceScanner(DeviceScanner): # Calling and parsing the Tomato api here. We only need the # wldev and dhcpd_lease values. - if response.status_code == 200: + if response.status_code == HTTP_OK: for param, value in self.parse_api_pattern.findall(response.text): diff --git a/homeassistant/components/traccar/__init__.py b/homeassistant/components/traccar/__init__.py index 7e94ab0a3510..034822921355 100644 --- a/homeassistant/components/traccar/__init__.py +++ b/homeassistant/components/traccar/__init__.py @@ -28,7 +28,7 @@ _LOGGER = logging.getLogger(__name__) TRACKER_UPDATE = f"{DOMAIN}_tracker_update" -DEFAULT_ACCURACY = 200 +DEFAULT_ACCURACY = HTTP_OK DEFAULT_BATTERY = -1 diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index d9d513198ce4..726490b20302 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -22,7 +22,7 @@ from homeassistant.components.media_player.const import ( MEDIA_TYPE_MUSIC, SERVICE_PLAY_MEDIA, ) -from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM +from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM, HTTP_OK from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_per_platform, discovery @@ -507,7 +507,7 @@ def _get_cache_files(cache_dir): record = _RE_VOICE_FILE.match(file_data) if record: key = KEY_PATTERN.format( - record.group(1), record.group(2), record.group(3), record.group(4), + record.group(1), record.group(2), record.group(3), record.group(4) ) cache[key.lower()] = file_data.lower() return cache @@ -543,7 +543,7 @@ class TextToSpeechUrlView(HomeAssistantView): url = await self.tts.async_get_url( p_type, message, cache=cache, language=language, options=options ) - resp = self.json({"url": url}, 200) + resp = self.json({"url": url}, HTTP_OK) except HomeAssistantError as err: _LOGGER.error("Error on init tts: %s", err) resp = self.json({"error": err}, 400) diff --git a/homeassistant/components/twitter/notify.py b/homeassistant/components/twitter/notify.py index 768e1ee73166..62e8fc17dffa 100644 --- a/homeassistant/components/twitter/notify.py +++ b/homeassistant/components/twitter/notify.py @@ -14,7 +14,7 @@ from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ) -from homeassistant.const import CONF_ACCESS_TOKEN, CONF_USERNAME +from homeassistant.const import CONF_ACCESS_TOKEN, CONF_USERNAME, HTTP_OK import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import async_track_point_in_time @@ -88,7 +88,7 @@ class TwitterNotificationService(BaseNotificationService): if self.user: user_resp = self.api.request("users/lookup", {"screen_name": self.user}) user_id = user_resp.json()[0]["id"] - if user_resp.status_code != 200: + if user_resp.status_code != HTTP_OK: self.log_error_resp(user_resp) else: _LOGGER.debug("Message posted: %s", user_resp.json()) @@ -108,7 +108,7 @@ class TwitterNotificationService(BaseNotificationService): "statuses/update", {"status": message, "media_ids": media_id} ) - if resp.status_code != 200: + if resp.status_code != HTTP_OK: self.log_error_resp(resp) else: _LOGGER.debug("Message posted: %s", resp.json()) @@ -171,7 +171,7 @@ class TwitterNotificationService(BaseNotificationService): while bytes_sent < total_bytes: chunk = file.read(4 * 1024 * 1024) resp = self.upload_media_append(chunk, media_id, segment_id) - if resp.status_code not in range(200, 299): + if resp.status_code not in range(HTTP_OK, 299): self.log_error_resp_append(resp) return None segment_id = segment_id + 1 @@ -200,7 +200,7 @@ class TwitterNotificationService(BaseNotificationService): {"command": "STATUS", "media_id": media_id}, method_override="GET", ) - if resp.status_code != 200: + if resp.status_code != HTTP_OK: _LOGGER.error("media processing error: %s", resp.json()) processing_info = resp.json()["processing_info"] diff --git a/homeassistant/components/ubus/device_tracker.py b/homeassistant/components/ubus/device_tracker.py index 1f5b5b4b1b64..4cefefc2f96b 100644 --- a/homeassistant/components/ubus/device_tracker.py +++ b/homeassistant/components/ubus/device_tracker.py @@ -11,7 +11,7 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, HTTP_OK from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv @@ -214,7 +214,7 @@ def _req_json_rpc(url, session_id, rpcmethod, subsystem, method, **params): except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): return - if res.status_code == 200: + if res.status_code == HTTP_OK: response = res.json() if "error" in response: if ( diff --git a/homeassistant/components/uk_transport/sensor.py b/homeassistant/components/uk_transport/sensor.py index 77929436283d..e7c01479a962 100644 --- a/homeassistant/components/uk_transport/sensor.py +++ b/homeassistant/components/uk_transport/sensor.py @@ -7,7 +7,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_MODE, TIME_MINUTES +from homeassistant.const import CONF_MODE, HTTP_OK, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -133,7 +133,7 @@ class UkTransportSensor(Entity): ) response = requests.get(self._url, params=request_params) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.warning("Invalid response from API") elif "error" in response.json(): if "exceeded" in response.json()["error"]: diff --git a/homeassistant/components/viaggiatreno/sensor.py b/homeassistant/components/viaggiatreno/sensor.py index 783581a07552..5de968f5eacc 100644 --- a/homeassistant/components/viaggiatreno/sensor.py +++ b/homeassistant/components/viaggiatreno/sensor.py @@ -7,7 +7,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, TIME_MINUTES +from homeassistant.const import ATTR_ATTRIBUTION, HTTP_OK, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -72,7 +72,7 @@ async def async_http_request(hass, uri): session = hass.helpers.aiohttp_client.async_get_clientsession(hass) with async_timeout.timeout(REQUEST_TIMEOUT): req = await session.get(uri) - if req.status != 200: + if req.status != HTTP_OK: return {"error": req.status} json_response = await req.json() return json_response diff --git a/homeassistant/components/voicerss/tts.py b/homeassistant/components/voicerss/tts.py index 9f87dabf94fe..52a3f9f1b1c9 100644 --- a/homeassistant/components/voicerss/tts.py +++ b/homeassistant/components/voicerss/tts.py @@ -7,7 +7,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.tts import CONF_LANG, PLATFORM_SCHEMA, Provider -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -175,7 +175,7 @@ class VoiceRSSProvider(Provider): with async_timeout.timeout(10): request = await websession.post(VOICERSS_API_URL, data=form_data) - if request.status != 200: + if request.status != HTTP_OK: _LOGGER.error( "Error %d on load url %s.", request.status, request.url ) diff --git a/homeassistant/components/volumio/media_player.py b/homeassistant/components/volumio/media_player.py index 5778df8c3672..6d46b6015e0a 100644 --- a/homeassistant/components/volumio/media_player.py +++ b/homeassistant/components/volumio/media_player.py @@ -31,6 +31,7 @@ from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_PORT, + HTTP_OK, STATE_IDLE, STATE_PAUSED, STATE_PLAYING, @@ -127,7 +128,7 @@ class Volumio(MediaPlayerDevice): try: websession = async_get_clientsession(self.hass) response = await websession.get(url, params=params) - if response.status == 200: + if response.status == HTTP_OK: data = await response.json() else: _LOGGER.error( diff --git a/homeassistant/components/webhook/__init__.py b/homeassistant/components/webhook/__init__.py index 217baf42f3ad..84ebdaddad07 100644 --- a/homeassistant/components/webhook/__init__.py +++ b/homeassistant/components/webhook/__init__.py @@ -7,6 +7,7 @@ import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.http.view import HomeAssistantView +from homeassistant.const import HTTP_OK from homeassistant.core import callback from homeassistant.loader import bind_hass @@ -71,16 +72,16 @@ async def async_handle_webhook(hass, webhook_id, request): # Always respond successfully to not give away if a hook exists or not. if webhook is None: _LOGGER.warning("Received message for unregistered webhook %s", webhook_id) - return Response(status=200) + return Response(status=HTTP_OK) try: response = await webhook["handler"](hass, webhook_id, request) if response is None: - response = Response(status=200) + response = Response(status=HTTP_OK) return response except Exception: # pylint: disable=broad-except _LOGGER.exception("Error processing webhook %s", webhook_id) - return Response(status=200) + return Response(status=HTTP_OK) async def async_setup(hass, config): diff --git a/homeassistant/components/wsdot/sensor.py b/homeassistant/components/wsdot/sensor.py index 6ee55aa387fa..786fd07f6265 100644 --- a/homeassistant/components/wsdot/sensor.py +++ b/homeassistant/components/wsdot/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_API_KEY, CONF_ID, CONF_NAME, + HTTP_OK, TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv @@ -112,7 +113,7 @@ class WashingtonStateTravelTimeSensor(WashingtonStateTransportSensor): } response = requests.get(RESOURCE, params, timeout=10) - if response.status_code != 200: + if response.status_code != HTTP_OK: _LOGGER.warning("Invalid response from WSDOT API") else: self._data = response.json() diff --git a/homeassistant/components/xiaomi/device_tracker.py b/homeassistant/components/xiaomi/device_tracker.py index df16b13b9311..530140b524f3 100644 --- a/homeassistant/components/xiaomi/device_tracker.py +++ b/homeassistant/components/xiaomi/device_tracker.py @@ -9,7 +9,7 @@ from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DeviceScanner, ) -from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, HTTP_OK import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -112,7 +112,7 @@ def _retrieve_list(host, token, **kwargs): except requests.exceptions.Timeout: _LOGGER.exception("Connection to the router timed out at URL %s", url) return - if res.status_code != 200: + if res.status_code != HTTP_OK: _LOGGER.exception("Connection failed with http code %s", res.status_code) return try: @@ -150,7 +150,7 @@ def _get_token(host, username, password): except requests.exceptions.Timeout: _LOGGER.exception("Connection to the router timed out") return - if res.status_code == 200: + if res.status_code == HTTP_OK: try: result = res.json() except ValueError: diff --git a/homeassistant/components/yandextts/tts.py b/homeassistant/components/yandextts/tts.py index b06df4b7a425..32b77e08df47 100644 --- a/homeassistant/components/yandextts/tts.py +++ b/homeassistant/components/yandextts/tts.py @@ -7,7 +7,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.tts import CONF_LANG, PLATFORM_SCHEMA, Provider -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, HTTP_OK from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -133,7 +133,7 @@ class YandexSpeechKitProvider(Provider): request = await websession.get(YANDEX_API_URL, params=url_param) - if request.status != 200: + if request.status != HTTP_OK: _LOGGER.error( "Error %d on load URL %s", request.status, request.url ) diff --git a/homeassistant/components/yr/sensor.py b/homeassistant/components/yr/sensor.py index 2061c061dd07..e477f4a3c891 100644 --- a/homeassistant/components/yr/sensor.py +++ b/homeassistant/components/yr/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE, DEVICE_CLASS_TEMPERATURE, + HTTP_OK, PRESSURE_HPA, SPEED_METERS_PER_SECOND, TEMP_CELSIUS, @@ -185,7 +186,7 @@ class YrData: websession = async_get_clientsession(self.hass) with async_timeout.timeout(10): resp = await websession.get(self._url, params=self._urlparams) - if resp.status != 200: + if resp.status != HTTP_OK: try_again(f"{resp.url} returned {resp.status}") return text = await resp.text() diff --git a/homeassistant/util/aiohttp.py b/homeassistant/util/aiohttp.py index 69911986f57f..d43929dd7778 100644 --- a/homeassistant/util/aiohttp.py +++ b/homeassistant/util/aiohttp.py @@ -5,6 +5,8 @@ from urllib.parse import parse_qsl from multidict import CIMultiDict, MultiDict +from homeassistant.const import HTTP_OK + class MockRequest: """Mock an aiohttp request.""" @@ -13,7 +15,7 @@ class MockRequest: self, content: bytes, method: str = "GET", - status: int = 200, + status: int = HTTP_OK, headers: Optional[Dict[str, str]] = None, query_string: Optional[str] = None, url: str = "", From c3decc65310b6647baa816e43f4fc05d173f3f50 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 8 Apr 2020 19:31:44 +0200 Subject: [PATCH 224/653] Do not ban supervisor ip if set (#33781) * Use asynctest patch instead of mock_coro * Add test for supervisor ip ban * Do not ban supervisor ip if set * Extract supervisor ip helper * Check supervisor ip before banning * Remove added blank line * Clean up get supervisor ip Co-Authored-By: Pascal Vizeli Co-authored-by: Pascal Vizeli --- homeassistant/components/hassio/__init__.py | 8 +++ homeassistant/components/http/ban.py | 6 ++ tests/components/conftest.py | 8 +-- tests/components/http/test_ban.py | 76 ++++++++++++++++++--- 4 files changed, 82 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/hassio/__init__.py b/homeassistant/components/hassio/__init__.py index bcb751faa648..f13db03ca4c9 100644 --- a/homeassistant/components/hassio/__init__.py +++ b/homeassistant/components/hassio/__init__.py @@ -143,6 +143,14 @@ def is_hassio(hass): return DOMAIN in hass.config.components +@callback +def get_supervisor_ip(): + """Return the supervisor ip address.""" + if "SUPERVISOR" not in os.environ: + return None + return os.environ["SUPERVISOR"].partition(":")[0] + + async def async_setup(hass, config): """Set up the Hass.io component.""" # Check local setup diff --git a/homeassistant/components/http/ban.py b/homeassistant/components/http/ban.py index 38eda8e9b3f5..7fffd19c467d 100644 --- a/homeassistant/components/http/ban.py +++ b/homeassistant/components/http/ban.py @@ -110,6 +110,12 @@ async def process_wrong_login(request): request.app[KEY_FAILED_LOGIN_ATTEMPTS][remote_addr] += 1 + # Supervisor IP should never be banned + if "hassio" in hass.config.components and hass.components.hassio.get_supervisor_ip() == str( + remote_addr + ): + return + if ( request.app[KEY_FAILED_LOGIN_ATTEMPTS][remote_addr] >= request.app[KEY_LOGIN_THRESHOLD] diff --git a/tests/components/conftest.py b/tests/components/conftest.py index 528e804a01aa..1670e0c24852 100644 --- a/tests/components/conftest.py +++ b/tests/components/conftest.py @@ -1,16 +1,12 @@ """Fixtures for component testing.""" -from unittest.mock import patch - +from asynctest import patch import pytest -from tests.common import mock_coro - @pytest.fixture(autouse=True) def prevent_io(): """Fixture to prevent certain I/O from happening.""" with patch( - "homeassistant.components.http.ban.async_load_ip_bans_config", - side_effect=lambda *args: mock_coro([]), + "homeassistant.components.http.ban.async_load_ip_bans_config", return_value=[], ): yield diff --git a/tests/components/http/test_ban.py b/tests/components/http/test_ban.py index 8d9d19b6a12e..28be5cc45c35 100644 --- a/tests/components/http/test_ban.py +++ b/tests/components/http/test_ban.py @@ -1,11 +1,14 @@ """The tests for the Home Assistant HTTP component.""" # pylint: disable=protected-access from ipaddress import ip_address -from unittest.mock import Mock, mock_open, patch +import os +from unittest.mock import Mock, mock_open from aiohttp import web from aiohttp.web_exceptions import HTTPUnauthorized from aiohttp.web_middlewares import middleware +from asynctest import patch +import pytest import homeassistant.components.http as http from homeassistant.components.http import KEY_AUTHENTICATED @@ -21,20 +24,31 @@ from homeassistant.setup import async_setup_component from . import mock_real_ip -from tests.common import mock_coro - +SUPERVISOR_IP = "1.2.3.4" BANNED_IPS = ["200.201.202.203", "100.64.0.2"] +BANNED_IPS_WITH_SUPERVISOR = BANNED_IPS + [SUPERVISOR_IP] + + +@pytest.fixture(name="hassio_env") +def hassio_env_fixture(): + """Fixture to inject hassio env.""" + with patch.dict(os.environ, {"HASSIO": "127.0.0.1"}), patch( + "homeassistant.components.hassio.HassIO.is_connected", + return_value={"result": "ok", "data": {}}, + ), patch.dict(os.environ, {"HASSIO_TOKEN": "123456"}): + yield async def test_access_from_banned_ip(hass, aiohttp_client): """Test accessing to server from banned IP. Both trusted and not.""" app = web.Application() + app["hass"] = hass setup_bans(hass, app, 5) set_real_ip = mock_real_ip(app) with patch( "homeassistant.components.http.ban.async_load_ip_bans_config", - return_value=mock_coro([IpBan(banned_ip) for banned_ip in BANNED_IPS]), + return_value=[IpBan(banned_ip) for banned_ip in BANNED_IPS], ): client = await aiohttp_client(app) @@ -44,6 +58,48 @@ async def test_access_from_banned_ip(hass, aiohttp_client): assert resp.status == 403 +@pytest.mark.parametrize( + "remote_addr, bans, status", + list(zip(BANNED_IPS_WITH_SUPERVISOR, [1, 1, 0], [403, 403, 401])), +) +async def test_access_from_supervisor_ip( + remote_addr, bans, status, hass, aiohttp_client, hassio_env +): + """Test accessing to server from supervisor IP.""" + app = web.Application() + app["hass"] = hass + + async def unauth_handler(request): + """Return a mock web response.""" + raise HTTPUnauthorized + + app.router.add_get("/", unauth_handler) + setup_bans(hass, app, 1) + mock_real_ip(app)(remote_addr) + + with patch( + "homeassistant.components.http.ban.async_load_ip_bans_config", return_value=[], + ): + client = await aiohttp_client(app) + + assert await async_setup_component(hass, "hassio", {"hassio": {}}) + + m_open = mock_open() + + with patch.dict(os.environ, {"SUPERVISOR": SUPERVISOR_IP}), patch( + "homeassistant.components.http.ban.open", m_open, create=True + ): + resp = await client.get("/") + assert resp.status == 401 + assert len(app[KEY_BANNED_IPS]) == bans + assert m_open.call_count == bans + + # second request should be forbidden if banned + resp = await client.get("/") + assert resp.status == status + assert len(app[KEY_BANNED_IPS]) == bans + + async def test_ban_middleware_not_loaded_by_config(hass): """Test accessing to server from banned IP when feature is off.""" with patch("homeassistant.components.http.setup_bans") as mock_setup: @@ -77,26 +133,26 @@ async def test_ip_bans_file_creation(hass, aiohttp_client): with patch( "homeassistant.components.http.ban.async_load_ip_bans_config", - return_value=mock_coro([IpBan(banned_ip) for banned_ip in BANNED_IPS]), + return_value=[IpBan(banned_ip) for banned_ip in BANNED_IPS], ): client = await aiohttp_client(app) - m = mock_open() + m_open = mock_open() - with patch("homeassistant.components.http.ban.open", m, create=True): + with patch("homeassistant.components.http.ban.open", m_open, create=True): resp = await client.get("/") assert resp.status == 401 assert len(app[KEY_BANNED_IPS]) == len(BANNED_IPS) - assert m.call_count == 0 + assert m_open.call_count == 0 resp = await client.get("/") assert resp.status == 401 assert len(app[KEY_BANNED_IPS]) == len(BANNED_IPS) + 1 - m.assert_called_once_with(hass.config.path(IP_BANS_FILE), "a") + m_open.assert_called_once_with(hass.config.path(IP_BANS_FILE), "a") resp = await client.get("/") assert resp.status == 403 - assert m.call_count == 1 + assert m_open.call_count == 1 async def test_failed_login_attempts_counter(hass, aiohttp_client): From 10d25c798e861b58f0d286e492b313b0f28e194c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 10:48:36 -0700 Subject: [PATCH 225/653] Add script to clean up translations (#33802) --- script/translations_clean.py | 116 +++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 script/translations_clean.py diff --git a/script/translations_clean.py b/script/translations_clean.py new file mode 100644 index 000000000000..d801ce0a3085 --- /dev/null +++ b/script/translations_clean.py @@ -0,0 +1,116 @@ +"""Find translation keys that are in Lokalise but no longer defined in source.""" +import json +import pathlib +import sys + +import requests + +INTEGRATION_DIR = pathlib.Path("homeassistant/components") +PROJECT_ID = "130246255a974bd3b5e8a1.51616605" + + +class Lokalise: + """Lokalise API.""" + + def __init__(self, project_id, token): + """Initialize Lokalise API.""" + self.project_id = project_id + self.token = token + + def request(self, method, path, data): + """Make a request to the Lokalise API.""" + method = method.upper() + kwargs = {"headers": {"x-api-token": self.token}} + if method == "GET": + kwargs["params"] = data + else: + kwargs["json"] = data + + req = requests.request( + method, + f"https://api.lokalise.com/api2/projects/{self.project_id}/{path}", + **kwargs, + ) + req.raise_for_status() + return req.json() + + def keys_list(self, params={}): + """Fetch key ID from a name. + + https://app.lokalise.com/api2docs/curl/#transition-list-all-keys-get + """ + return self.request("GET", "keys", params)["keys"] + + def keys_delete_multiple(self, key_ids): + """Delete multiple keys. + + https://app.lokalise.com/api2docs/curl/#transition-delete-multiple-keys-delete + """ + return self.request("DELETE", "keys", {"keys": key_ids}) + + +def find_extra(base, translations, path_prefix, missing_keys): + """Find all keys that are in translations but not in base.""" + for key, value in translations.items(): + cur_path = f"{path_prefix}::{key}" if path_prefix else key + + # Value is either a dict or a string + if isinstance(value, dict): + base_search = None if base is None else base.get(key) + find_extra(base_search, value, cur_path, missing_keys) + + elif base is None or key not in base: + missing_keys.append(cur_path) + + +def find(): + """Find all missing keys.""" + missing_keys = [] + + for int_dir in INTEGRATION_DIR.iterdir(): + strings = int_dir / "strings.json" + + if not strings.is_file(): + continue + + translations = int_dir / ".translations" / "en.json" + + strings_json = json.loads(strings.read_text()) + translations_json = json.loads(translations.read_text()) + + find_extra( + strings_json, translations_json, f"component::{int_dir.name}", missing_keys + ) + + return missing_keys + + +def run(): + """Clean translations.""" + missing_keys = find() + + if not missing_keys: + print("No missing translations!") + return 0 + + lokalise = Lokalise(PROJECT_ID, pathlib.Path(".lokalise_token").read_text().strip()) + + to_delete = [] + + for key in missing_keys: + print("Processing", key) + key_data = lokalise.keys_list({"filter_keys": key}) + if len(key_data) != 1: + print( + f"Lookin up key in Lokalise returns {len(key_data)} results, expected 1" + ) + continue + to_delete.append(key_data[0]["key_id"]) + + print("Deleting keys:", ", ".join(map(str, to_delete))) + print(lokalise.keys_delete_multiple(to_delete)) + return 0 + + +if __name__ == "__main__": + sys.exit(run()) From 5ff50e8b4f4d97c06653dd2152f02aaa3a34441e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 11:13:08 -0700 Subject: [PATCH 226/653] Update aioswitcher (#33821) --- homeassistant/components/switcher_kis/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/switcher_kis/manifest.json b/homeassistant/components/switcher_kis/manifest.json index 9974b885d9e4..bc6082768978 100644 --- a/homeassistant/components/switcher_kis/manifest.json +++ b/homeassistant/components/switcher_kis/manifest.json @@ -3,5 +3,5 @@ "name": "Switcher", "documentation": "https://www.home-assistant.io/integrations/switcher_kis/", "codeowners": ["@tomerfi"], - "requirements": ["aioswitcher==2019.4.26"] + "requirements": ["aioswitcher==1.1.0"] } diff --git a/requirements_all.txt b/requirements_all.txt index 4a5178601026..4c5e1e21c2b6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -208,7 +208,7 @@ aiopvpc==1.0.2 aiopylgtv==0.3.3 # homeassistant.components.switcher_kis -aioswitcher==2019.4.26 +aioswitcher==1.1.0 # homeassistant.components.unifi aiounifi==15 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 434a5cb7acd3..8fe4681c1910 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -91,7 +91,7 @@ aiopvpc==1.0.2 aiopylgtv==0.3.3 # homeassistant.components.switcher_kis -aioswitcher==2019.4.26 +aioswitcher==1.1.0 # homeassistant.components.unifi aiounifi==15 From 3b246fb40a9f33212e4a9dc987ecba8f294bfad4 Mon Sep 17 00:00:00 2001 From: Jason Cheatham Date: Wed, 8 Apr 2020 14:42:15 -0400 Subject: [PATCH 227/653] Load integrations with requirements in device_automation (#33714) * Load integrations with requirements in device_automation - Split cached loader behavior out of async_get_integration - Use cached loader for both async_get_integration and async_get_integration_with_requirements - Use async_get_integration_with_requirements for device_automation resolves #33104 * Duplicate caching logic in requirements, remove loader mods * Update homeassistant/requirements.py Co-authored-by: Paulus Schoutsen --- .../components/device_automation/__init__.py | 5 +-- homeassistant/requirements.py | 34 +++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/device_automation/__init__.py b/homeassistant/components/device_automation/__init__.py index 95b3fc9fdb36..33685b2bc1ce 100644 --- a/homeassistant/components/device_automation/__init__.py +++ b/homeassistant/components/device_automation/__init__.py @@ -13,7 +13,8 @@ from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_PLATFORM from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv from homeassistant.helpers.entity_registry import async_entries_for_device -from homeassistant.loader import IntegrationNotFound, async_get_integration +from homeassistant.loader import IntegrationNotFound +from homeassistant.requirements import async_get_integration_with_requirements from .exceptions import DeviceNotFound, InvalidDeviceAutomationConfig @@ -80,7 +81,7 @@ async def async_get_device_automation_platform( """ platform_name = TYPES[automation_type][0] try: - integration = await async_get_integration(hass, domain) + integration = await async_get_integration_with_requirements(hass, domain) platform = integration.get_platform(platform_name) except IntegrationNotFound: raise InvalidDeviceAutomationConfig(f"Integration '{domain}' not found") diff --git a/homeassistant/requirements.py b/homeassistant/requirements.py index 317fffe84bf8..505704f63c2d 100644 --- a/homeassistant/requirements.py +++ b/homeassistant/requirements.py @@ -3,15 +3,21 @@ import asyncio import logging import os from pathlib import Path -from typing import Any, Dict, Iterable, List, Optional, Set +from typing import Any, Dict, Iterable, List, Optional, Set, Union, cast from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError -from homeassistant.loader import Integration, async_get_integration +from homeassistant.loader import ( + Integration, + IntegrationNotFound, + _async_mount_config_dir, + async_get_integration, +) import homeassistant.util.package as pkg_util DATA_PIP_LOCK = "pip_lock" DATA_PKG_CACHE = "pkg_cache" +DATA_INTEGRATIONS_WITH_REQS = "integrations_with_reqs" CONSTRAINT_FILE = "package_constraints.txt" PROGRESS_FILE = ".pip_progress" _LOGGER = logging.getLogger(__name__) @@ -19,6 +25,7 @@ DISCOVERY_INTEGRATIONS: Dict[str, Iterable[str]] = { "ssdp": ("ssdp",), "zeroconf": ("zeroconf", "homekit"), } +_UNDEF = object() class RequirementsNotFound(HomeAssistantError): @@ -50,6 +57,27 @@ async def async_get_integration_with_requirements( if hass.config.skip_pip: return integration + cache = hass.data.get(DATA_INTEGRATIONS_WITH_REQS) + if cache is None: + cache = hass.data[DATA_INTEGRATIONS_WITH_REQS] = {} + + int_or_evt: Union[Integration, asyncio.Event, None] = cache.get(domain, _UNDEF) + + if isinstance(int_or_evt, asyncio.Event): + await int_or_evt.wait() + int_or_evt = cache.get(domain, _UNDEF) + + # When we have waited and it's _UNDEF, it doesn't exist + # We don't cache that it doesn't exist, or else people can't fix it + # and then restart, because their config will never be valid. + if int_or_evt is _UNDEF: + raise IntegrationNotFound(domain) + + if int_or_evt is not _UNDEF: + return cast(Integration, int_or_evt) + + event = cache[domain] = asyncio.Event() + if integration.requirements: await async_process_requirements( hass, integration.domain, integration.requirements @@ -77,6 +105,8 @@ async def async_get_integration_with_requirements( ] ) + cache[domain] = integration + event.set() return integration From cec3b5739037a30e41c87e3881cbb3816e65d2ca Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 13:56:11 -0500 Subject: [PATCH 228/653] Fix thermostats that do not support off under homekit (#33809) TargetHeatingCoolingState: value=0 is an invalid value. would be raised when a thermostat did not support off. --- .../components/homekit/type_thermostats.py | 2 +- .../homekit/test_type_thermostats.py | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/homekit/type_thermostats.py b/homeassistant/components/homekit/type_thermostats.py index ebb8ae3883e9..d1bcb600d84b 100644 --- a/homeassistant/components/homekit/type_thermostats.py +++ b/homeassistant/components/homekit/type_thermostats.py @@ -175,7 +175,7 @@ class Thermostat(HomeAccessory): self.char_target_heat_cool = serv_thermostat.configure_char( CHAR_TARGET_HEATING_COOLING, - value=0, + value=list(hc_valid_values.values())[0], setter_callback=self.set_heat_cool, valid_values=hc_valid_values, ) diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index e974b6d4811d..7fe2f41b7366 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -805,6 +805,41 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 3 +async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls): + """Test a thermostat that has no off.""" + entity_id = "climate.test" + + hass.states.async_set( + entity_id, HVAC_MODE_AUTO, {ATTR_HVAC_MODES: [HVAC_MODE_AUTO, HVAC_MODE_HEAT]} + ) + + await hass.async_block_till_done() + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + await acc.run_handler() + await hass.async_block_till_done() + hap = acc.char_target_heat_cool.to_HAP() + assert hap["valid-values"] == [1, 3] + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 3 + + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 1) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + with pytest.raises(ValueError): + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 2) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + with pytest.raises(ValueError): + await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 0) + await hass.async_block_till_done() + assert acc.char_target_heat_cool.value == 1 + + async def test_water_heater(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "water_heater.test" From ea709d06303ec98ccd68d324ed8ecf75aa634bac Mon Sep 17 00:00:00 2001 From: Robert Van Gorkom Date: Wed, 8 Apr 2020 11:57:42 -0700 Subject: [PATCH 229/653] Remove withings sleep state (#33817) --- homeassistant/components/withings/const.py | 1 - homeassistant/components/withings/sensor.py | 41 --------------------- tests/components/withings/test_init.py | 5 --- 3 files changed, 47 deletions(-) diff --git a/homeassistant/components/withings/const.py b/homeassistant/components/withings/const.py index 781420b347ac..172a17d29145 100644 --- a/homeassistant/components/withings/const.py +++ b/homeassistant/components/withings/const.py @@ -48,7 +48,6 @@ MEAS_SLEEP_REM_DURATION_SECONDS = "sleep_rem_duration_seconds" MEAS_SLEEP_RESPIRATORY_RATE_AVERAGE = "sleep_respiratory_average_bpm" MEAS_SLEEP_RESPIRATORY_RATE_MAX = "sleep_respiratory_max_bpm" MEAS_SLEEP_RESPIRATORY_RATE_MIN = "sleep_respiratory_min_bpm" -MEAS_SLEEP_STATE = "sleep_state" MEAS_SLEEP_TOSLEEP_DURATION_SECONDS = "sleep_tosleep_duration_seconds" MEAS_SLEEP_TOWAKEUP_DURATION_SECONDS = "sleep_towakeup_duration_seconds" MEAS_SLEEP_WAKEUP_COUNT = "sleep_wakeup_count" diff --git a/homeassistant/components/withings/sensor.py b/homeassistant/components/withings/sensor.py index 61e4dab8510c..4061e3207cc6 100644 --- a/homeassistant/components/withings/sensor.py +++ b/homeassistant/components/withings/sensor.py @@ -6,9 +6,7 @@ from withings_api.common import ( MeasureGetMeasResponse, MeasureGroupAttribs, MeasureType, - SleepGetResponse, SleepGetSummaryResponse, - SleepState, get_measure_value, ) @@ -73,16 +71,6 @@ class WithingsMeasureAttribute(WithingsAttribute): """Model measure attributes.""" -class WithingsSleepStateAttribute(WithingsAttribute): - """Model sleep data attributes.""" - - def __init__( - self, measurement: str, friendly_name: str, unit_of_measurement: str, icon: str - ) -> None: - """Initialize sleep state attribute.""" - super().__init__(measurement, None, friendly_name, unit_of_measurement, icon) - - class WithingsSleepSummaryAttribute(WithingsAttribute): """Models sleep summary attributes.""" @@ -196,9 +184,6 @@ WITHINGS_ATTRIBUTES = [ SPEED_METERS_PER_SECOND, None, ), - WithingsSleepStateAttribute( - const.MEAS_SLEEP_STATE, "Sleep state", None, "mdi:sleep" - ), WithingsSleepSummaryAttribute( const.MEAS_SLEEP_WAKEUP_DURATION_SECONDS, GetSleepSummaryField.WAKEUP_DURATION.value, @@ -359,11 +344,6 @@ class WithingsHealthSensor(Entity): await self._data_manager.update_measures() await self.async_update_measure(self._data_manager.measures) - elif isinstance(self._attribute, WithingsSleepStateAttribute): - _LOGGER.debug("Updating sleep state") - await self._data_manager.update_sleep() - await self.async_update_sleep_state(self._data_manager.sleep) - elif isinstance(self._attribute, WithingsSleepSummaryAttribute): _LOGGER.debug("Updating sleep summary state") await self._data_manager.update_sleep_summary() @@ -386,27 +366,6 @@ class WithingsHealthSensor(Entity): self._state = round(value, 2) - async def async_update_sleep_state(self, data: SleepGetResponse) -> None: - """Update the sleep state data.""" - if not data.series: - _LOGGER.debug("No sleep data, setting state to %s", None) - self._state = None - return - - sorted_series = sorted(data.series, key=lambda serie: serie.startdate) - serie = sorted_series[len(sorted_series) - 1] - state = None - if serie.state == SleepState.AWAKE: - state = const.STATE_AWAKE - elif serie.state == SleepState.LIGHT: - state = const.STATE_LIGHT - elif serie.state == SleepState.DEEP: - state = const.STATE_DEEP - elif serie.state == SleepState.REM: - state = const.STATE_REM - - self._state = state - async def async_update_sleep_summary(self, data: SleepGetSummaryResponse) -> None: """Update the sleep summary data.""" if not data.series: diff --git a/tests/components/withings/test_init.py b/tests/components/withings/test_init.py index ae717bc1839b..f6f36ba8eff2 100644 --- a/tests/components/withings/test_init.py +++ b/tests/components/withings/test_init.py @@ -412,13 +412,8 @@ async def test_full_setup(hass: HomeAssistant, aiohttp_client, aioclient_mock) - (profiles[0], const.MEAS_SLEEP_RESPIRATORY_RATE_AVERAGE, 2320), (profiles[0], const.MEAS_SLEEP_RESPIRATORY_RATE_MIN, 2520), (profiles[0], const.MEAS_SLEEP_RESPIRATORY_RATE_MAX, 2720), - (profiles[0], const.MEAS_SLEEP_STATE, const.STATE_DEEP), - (profiles[1], const.MEAS_SLEEP_STATE, STATE_UNKNOWN), (profiles[1], const.MEAS_HYDRATION, STATE_UNKNOWN), - (profiles[2], const.MEAS_SLEEP_STATE, const.STATE_AWAKE), - (profiles[3], const.MEAS_SLEEP_STATE, const.STATE_LIGHT), (profiles[3], const.MEAS_FAT_FREE_MASS_KG, STATE_UNKNOWN), - (profiles[4], const.MEAS_SLEEP_STATE, const.STATE_REM), ) for (profile, meas, value) in expected_states: assert_state_equals(hass, profile, meas, value) From 173c276c5cb7ad71f0a47999cf9ea00bd2e67f32 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 12:03:56 -0700 Subject: [PATCH 230/653] Lint --- homeassistant/requirements.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homeassistant/requirements.py b/homeassistant/requirements.py index 505704f63c2d..d8d852b6964f 100644 --- a/homeassistant/requirements.py +++ b/homeassistant/requirements.py @@ -10,7 +10,6 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.loader import ( Integration, IntegrationNotFound, - _async_mount_config_dir, async_get_integration, ) import homeassistant.util.package as pkg_util From 292dcb7e37366fccb573a60892bc92cb838048aa Mon Sep 17 00:00:00 2001 From: danbishop Date: Wed, 8 Apr 2020 20:07:43 +0100 Subject: [PATCH 231/653] Update sensor.py (#33788) Add missing semi-colons to html entities on notification message --- homeassistant/components/octoprint/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/octoprint/sensor.py b/homeassistant/components/octoprint/sensor.py index 9c488564ea95..c7b81df2ef86 100644 --- a/homeassistant/components/octoprint/sensor.py +++ b/homeassistant/components/octoprint/sensor.py @@ -32,7 +32,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): "If you do not want to have your printer on
" " at all times, and you would like to monitor
" "temperatures, please add
" - "bed and/or number_of_tools to your configuration
" + "bed and/or number_of_tools to your configuration
" "and restart.", title=NOTIFICATION_TITLE, notification_id=NOTIFICATION_ID, From df744c5944dbee2015965bbbb9136e349bc1112e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 12:36:45 -0700 Subject: [PATCH 232/653] Speed up TP-Link lights (#33606) * Speed up TP-Link lights * Color temp kan be None * hs as int, force color temp=0 * Fix color temp? * Additional tplink cleanups to reduce api calls * Update test to return state, remove Throttle * Fix state restore on off/on * Fix lights without hue/sat Co-authored-by: J. Nick Koston --- homeassistant/components/tplink/light.py | 286 ++++++++++++++--------- tests/components/tplink/test_light.py | 3 +- 2 files changed, 173 insertions(+), 116 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 14d6b362dca9..9ba47c525099 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -15,18 +15,22 @@ from homeassistant.components.light import ( SUPPORT_COLOR_TEMP, Light, ) +from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.device_registry as dr from homeassistant.helpers.typing import HomeAssistantType from homeassistant.util.color import ( color_temperature_kelvin_to_mired as kelvin_to_mired, color_temperature_mired_to_kelvin as mired_to_kelvin, ) +import homeassistant.util.dt as dt_util from . import CONF_LIGHT, DOMAIN as TPLINK_DOMAIN from .common import async_add_entities_retry PARALLEL_UPDATES = 0 SCAN_INTERVAL = timedelta(seconds=5) +CURRENT_POWER_UPDATE_INTERVAL = timedelta(seconds=60) +HISTORICAL_POWER_UPDATE_INTERVAL = timedelta(minutes=60) _LOGGER = logging.getLogger(__name__) @@ -34,6 +38,21 @@ ATTR_CURRENT_POWER_W = "current_power_w" ATTR_DAILY_ENERGY_KWH = "daily_energy_kwh" ATTR_MONTHLY_ENERGY_KWH = "monthly_energy_kwh" +LIGHT_STATE_DFT_ON = "dft_on_state" +LIGHT_STATE_ON_OFF = "on_off" +LIGHT_STATE_BRIGHTNESS = "brightness" +LIGHT_STATE_COLOR_TEMP = "color_temp" +LIGHT_STATE_HUE = "hue" +LIGHT_STATE_SATURATION = "saturation" +LIGHT_STATE_ERROR_MSG = "err_msg" + +LIGHT_SYSINFO_MAC = "mac" +LIGHT_SYSINFO_ALIAS = "alias" +LIGHT_SYSINFO_MODEL = "model" +LIGHT_SYSINFO_IS_DIMMABLE = "is_dimmable" +LIGHT_SYSINFO_IS_VARIABLE_COLOR_TEMP = "is_variable_color_temp" +LIGHT_SYSINFO_IS_COLOR = "is_color" + async def async_setup_entry(hass: HomeAssistantType, config_entry, async_add_entities): """Set up switches.""" @@ -70,7 +89,21 @@ class LightState(NamedTuple): brightness: int color_temp: float hs: Tuple[int, int] - emeter_params: dict + + def to_param(self): + """Return a version that we can send to the bulb.""" + if self.color_temp: + color_temp = mired_to_kelvin(self.color_temp) + else: + color_temp = None + + return { + LIGHT_STATE_ON_OFF: 1 if self.state else 0, + LIGHT_STATE_BRIGHTNESS: brightness_to_percentage(self.brightness), + LIGHT_STATE_COLOR_TEMP: color_temp, + LIGHT_STATE_HUE: self.hs[0] if self.hs else 0, + LIGHT_STATE_SATURATION: self.hs[1] if self.hs else 0, + } class LightFeatures(NamedTuple): @@ -95,6 +128,9 @@ class TPLinkSmartBulb(Light): self._light_state = cast(LightState, None) self._is_available = True self._is_setting_light_state = False + self._last_current_power_update = None + self._last_historical_power_update = None + self._emeter_params = {} @property def unique_id(self): @@ -125,45 +161,42 @@ class TPLinkSmartBulb(Light): @property def device_state_attributes(self): """Return the state attributes of the device.""" - return self._light_state.emeter_params + return self._emeter_params async def async_turn_on(self, **kwargs): """Turn the light on.""" - brightness = ( - int(kwargs[ATTR_BRIGHTNESS]) - if ATTR_BRIGHTNESS in kwargs - else self._light_state.brightness - if self._light_state.brightness is not None - else 255 - ) - color_tmp = ( - int(kwargs[ATTR_COLOR_TEMP]) - if ATTR_COLOR_TEMP in kwargs - else self._light_state.color_temp - ) + if ATTR_BRIGHTNESS in kwargs: + brightness = int(kwargs[ATTR_BRIGHTNESS]) + elif self._light_state.brightness is not None: + brightness = self._light_state.brightness + else: + brightness = 255 - await self.async_set_light_state_retry( + if ATTR_COLOR_TEMP in kwargs: + color_tmp = int(kwargs[ATTR_COLOR_TEMP]) + else: + color_tmp = self._light_state.color_temp + + if ATTR_HS_COLOR in kwargs: + # TP-Link requires integers. + hue_sat = tuple(int(val) for val in kwargs[ATTR_HS_COLOR]) + + # TP-Link cannot have both color temp and hue_sat + color_tmp = 0 + else: + hue_sat = self._light_state.hs + + await self._async_set_light_state_retry( self._light_state, - LightState( - state=True, - brightness=brightness, - color_temp=color_tmp, - hs=tuple(kwargs.get(ATTR_HS_COLOR, self._light_state.hs or ())), - emeter_params=self._light_state.emeter_params, + self._light_state._replace( + state=True, brightness=brightness, color_temp=color_tmp, hs=hue_sat, ), ) async def async_turn_off(self, **kwargs): """Turn the light off.""" - await self.async_set_light_state_retry( - self._light_state, - LightState( - state=False, - brightness=self._light_state.brightness, - color_temp=self._light_state.color_temp, - hs=self._light_state.hs, - emeter_params=self._light_state.emeter_params, - ), + await self._async_set_light_state_retry( + self._light_state, self._light_state._replace(state=False), ) @property @@ -202,21 +235,11 @@ class TPLinkSmartBulb(Light): if self._is_setting_light_state: return - # Initial run, perform call blocking. - if not self._light_features: - self.do_update_retry(False) - # Subsequent runs should not block. - else: - self.hass.add_job(self.do_update_retry, True) - - def do_update_retry(self, update_state: bool) -> None: - """Update state data with retry.""" "" try: # Update light features only once. - self._light_features = ( - self._light_features or self.get_light_features_retry() - ) - self._light_state = self.get_light_state_retry(self._light_features) + if not self._light_features: + self._light_features = self._get_light_features_retry() + self._light_state = self._get_light_state_retry() self._is_available = True except (SmartDeviceException, OSError) as ex: if self._is_available: @@ -225,45 +248,42 @@ class TPLinkSmartBulb(Light): ) self._is_available = False - # The local variables were updates asyncronousally, - # we need the entity registry to poll this object's properties for - # updated information. Calling schedule_update_ha_state will only - # cause a loop. - if update_state: - self.schedule_update_ha_state() - @property def supported_features(self): """Flag supported features.""" return self._light_features.supported_features - def get_light_features_retry(self) -> LightFeatures: + def _get_light_features_retry(self) -> LightFeatures: """Retry the retrieval of the supported features.""" try: - return self.get_light_features() + return self._get_light_features() except (SmartDeviceException, OSError): pass _LOGGER.debug("Retrying getting light features") - return self.get_light_features() + return self._get_light_features() - def get_light_features(self): + def _get_light_features(self): """Determine all supported features in one go.""" sysinfo = self.smartbulb.sys_info supported_features = 0 + # Calling api here as it reformats mac = self.smartbulb.mac - alias = self.smartbulb.alias - model = self.smartbulb.model + alias = sysinfo[LIGHT_SYSINFO_ALIAS] + model = sysinfo[LIGHT_SYSINFO_MODEL] min_mireds = None max_mireds = None - if self.smartbulb.is_dimmable: + if sysinfo.get(LIGHT_SYSINFO_IS_DIMMABLE): supported_features += SUPPORT_BRIGHTNESS - if getattr(self.smartbulb, "is_variable_color_temp", False): + if sysinfo.get(LIGHT_SYSINFO_IS_VARIABLE_COLOR_TEMP): supported_features += SUPPORT_COLOR_TEMP - min_mireds = kelvin_to_mired(self.smartbulb.valid_temperature_range[1]) - max_mireds = kelvin_to_mired(self.smartbulb.valid_temperature_range[0]) - if getattr(self.smartbulb, "is_color", False): + # Have to make another api request here in + # order to not re-implement pyHS100 here + max_range, min_range = self.smartbulb.valid_temperature_range + min_mireds = kelvin_to_mired(min_range) + max_mireds = kelvin_to_mired(max_range) + if sysinfo.get(LIGHT_SYSINFO_IS_COLOR): supported_features += SUPPORT_COLOR return LightFeatures( @@ -276,110 +296,146 @@ class TPLinkSmartBulb(Light): max_mireds=max_mireds, ) - def get_light_state_retry(self, light_features: LightFeatures) -> LightState: + def _get_light_state_retry(self) -> LightState: """Retry the retrieval of getting light states.""" try: - return self.get_light_state(light_features) + return self._get_light_state() except (SmartDeviceException, OSError): pass _LOGGER.debug("Retrying getting light state") - return self.get_light_state(light_features) + return self._get_light_state() - def get_light_state(self, light_features: LightFeatures) -> LightState: - """Get the light state.""" - emeter_params = {} + def _light_state_from_params(self, light_state_params) -> LightState: brightness = None color_temp = None hue_saturation = None - state = self.smartbulb.state == SmartBulb.BULB_STATE_ON + light_features = self._light_features + + state = bool(light_state_params[LIGHT_STATE_ON_OFF]) + + if not state and LIGHT_STATE_DFT_ON in light_state_params: + light_state_params = light_state_params[LIGHT_STATE_DFT_ON] if light_features.supported_features & SUPPORT_BRIGHTNESS: - brightness = brightness_from_percentage(self.smartbulb.brightness) + brightness = brightness_from_percentage( + light_state_params[LIGHT_STATE_BRIGHTNESS] + ) if light_features.supported_features & SUPPORT_COLOR_TEMP: - if self.smartbulb.color_temp is not None and self.smartbulb.color_temp != 0: - color_temp = kelvin_to_mired(self.smartbulb.color_temp) + if ( + light_state_params.get(LIGHT_STATE_COLOR_TEMP) is not None + and light_state_params[LIGHT_STATE_COLOR_TEMP] != 0 + ): + color_temp = kelvin_to_mired(light_state_params[LIGHT_STATE_COLOR_TEMP]) if light_features.supported_features & SUPPORT_COLOR: - hue, sat, _ = self.smartbulb.hsv - hue_saturation = (hue, sat) - - if self.smartbulb.has_emeter: - emeter_params[ATTR_CURRENT_POWER_W] = "{:.1f}".format( - self.smartbulb.current_consumption() + hue_saturation = ( + light_state_params[LIGHT_STATE_HUE], + light_state_params[LIGHT_STATE_SATURATION], ) - daily_statistics = self.smartbulb.get_emeter_daily() - monthly_statistics = self.smartbulb.get_emeter_monthly() - try: - emeter_params[ATTR_DAILY_ENERGY_KWH] = "{:.3f}".format( - daily_statistics[int(time.strftime("%d"))] - ) - emeter_params[ATTR_MONTHLY_ENERGY_KWH] = "{:.3f}".format( - monthly_statistics[int(time.strftime("%m"))] - ) - except KeyError: - # device returned no daily/monthly history - pass return LightState( state=state, brightness=brightness, color_temp=color_temp, hs=hue_saturation, - emeter_params=emeter_params, ) - async def async_set_light_state_retry( + def _get_light_state(self) -> LightState: + """Get the light state.""" + self._update_emeter() + return self._light_state_from_params(self.smartbulb.get_light_state()) + + def _update_emeter(self): + if not self.smartbulb.has_emeter: + return + + now = dt_util.utcnow() + if ( + not self._last_current_power_update + or self._last_current_power_update + CURRENT_POWER_UPDATE_INTERVAL < now + ): + self._last_current_power_update = now + self._emeter_params[ATTR_CURRENT_POWER_W] = "{:.1f}".format( + self.smartbulb.current_consumption() + ) + + if ( + not self._last_historical_power_update + or self._last_historical_power_update + HISTORICAL_POWER_UPDATE_INTERVAL + < now + ): + self._last_historical_power_update = now + daily_statistics = self.smartbulb.get_emeter_daily() + monthly_statistics = self.smartbulb.get_emeter_monthly() + try: + self._emeter_params[ATTR_DAILY_ENERGY_KWH] = "{:.3f}".format( + daily_statistics[int(time.strftime("%d"))] + ) + self._emeter_params[ATTR_MONTHLY_ENERGY_KWH] = "{:.3f}".format( + monthly_statistics[int(time.strftime("%m"))] + ) + except KeyError: + # device returned no daily/monthly history + pass + + async def _async_set_light_state_retry( self, old_light_state: LightState, new_light_state: LightState ) -> None: """Set the light state with retry.""" - # Optimistically setting the light state. - self._light_state = new_light_state - # Tell the device to set the states. + if not _light_state_diff(old_light_state, new_light_state): + # Nothing to do, avoid the executor + return + self._is_setting_light_state = True try: - await self.hass.async_add_executor_job( - self.set_light_state, old_light_state, new_light_state + light_state_params = await self.hass.async_add_executor_job( + self._set_light_state, old_light_state, new_light_state ) self._is_available = True self._is_setting_light_state = False + if LIGHT_STATE_ERROR_MSG in light_state_params: + raise HomeAssistantError(light_state_params[LIGHT_STATE_ERROR_MSG]) + self._light_state = self._light_state_from_params(light_state_params) return except (SmartDeviceException, OSError): pass try: _LOGGER.debug("Retrying setting light state") - await self.hass.async_add_executor_job( - self.set_light_state, old_light_state, new_light_state + light_state_params = await self.hass.async_add_executor_job( + self._set_light_state, old_light_state, new_light_state ) self._is_available = True + if LIGHT_STATE_ERROR_MSG in light_state_params: + raise HomeAssistantError(light_state_params[LIGHT_STATE_ERROR_MSG]) + self._light_state = self._light_state_from_params(light_state_params) except (SmartDeviceException, OSError) as ex: self._is_available = False _LOGGER.warning("Could not set data for %s: %s", self.smartbulb.host, ex) self._is_setting_light_state = False - def set_light_state( + def _set_light_state( self, old_light_state: LightState, new_light_state: LightState ) -> None: """Set the light state.""" - # Calling the API with the new state information. - if new_light_state.state != old_light_state.state: - if new_light_state.state: - self.smartbulb.state = SmartBulb.BULB_STATE_ON - else: - self.smartbulb.state = SmartBulb.BULB_STATE_OFF - return + diff = _light_state_diff(old_light_state, new_light_state) - if new_light_state.color_temp != old_light_state.color_temp: - self.smartbulb.color_temp = mired_to_kelvin(new_light_state.color_temp) + if not diff: + return - brightness_pct = brightness_to_percentage(new_light_state.brightness) - if new_light_state.hs != old_light_state.hs and len(new_light_state.hs) > 1: - hue, sat = new_light_state.hs - hsv = (int(hue), int(sat), brightness_pct) - self.smartbulb.hsv = hsv - elif new_light_state.brightness != old_light_state.brightness: - self.smartbulb.brightness = brightness_pct + return self.smartbulb.set_light_state(diff) + + +def _light_state_diff(old_light_state: LightState, new_light_state: LightState): + old_state_param = old_light_state.to_param() + new_state_param = new_light_state.to_param() + + return { + key: value + for key, value in new_state_param.items() + if new_state_param.get(key) != old_state_param.get(key) + } diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index e13870b8ee2e..f6f27a888c5c 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -85,6 +85,7 @@ def light_mock_data_fixture() -> None: light_state.update(state) light_state["dft_on_state"] = drt_on_state + return light_state set_light_state_patch = patch( "homeassistant.components.tplink.common.SmartBulb.set_light_state", @@ -310,7 +311,7 @@ async def test_get_light_state_retry( if set_state_call_count == 1: raise SmartDeviceException() - light_mock_data.set_light_state(state_data) + return light_mock_data.set_light_state(state_data) light_mock_data.set_light_state_mock.side_effect = set_light_state_side_effect From d03248962d04a0483b8dab0fbbe95024a7d1620a Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 8 Apr 2020 14:44:52 -0500 Subject: [PATCH 233/653] Update to pyipp==0.9.1 (#33819) --- homeassistant/components/ipp/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 9e491a548962..4be57f13fbbf 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.9.0"], + "requirements": ["pyipp==0.9.1"], "codeowners": ["@ctalkington"], "config_flow": true, "quality_scale": "platinum", diff --git a/requirements_all.txt b/requirements_all.txt index 4c5e1e21c2b6..a9287834fa2c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1341,7 +1341,7 @@ pyintesishome==1.7.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.0 +pyipp==0.9.1 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8fe4681c1910..d4f9369fbb13 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -524,7 +524,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.0 +pyipp==0.9.1 # homeassistant.components.iqvia pyiqvia==0.2.1 From 588409c784c356b937d4c0eeed99313786706a1b Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Wed, 8 Apr 2020 21:48:20 +0200 Subject: [PATCH 234/653] Fix isort problem in homeassistant/requirements.py (#33828) --- homeassistant/requirements.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/homeassistant/requirements.py b/homeassistant/requirements.py index d8d852b6964f..0b4560c8ac36 100644 --- a/homeassistant/requirements.py +++ b/homeassistant/requirements.py @@ -7,11 +7,7 @@ from typing import Any, Dict, Iterable, List, Optional, Set, Union, cast from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError -from homeassistant.loader import ( - Integration, - IntegrationNotFound, - async_get_integration, -) +from homeassistant.loader import Integration, IntegrationNotFound, async_get_integration import homeassistant.util.package as pkg_util DATA_PIP_LOCK = "pip_lock" From ceb171974d84f0cccce051688464b8e1e65c6fd4 Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Wed, 8 Apr 2020 21:48:46 +0200 Subject: [PATCH 235/653] Fix kef DSP_SCAN_INTERVAL timedelta (#33825) reported on https://community.home-assistant.io/t/kef-ls50-wireless/70269/134 --- homeassistant/components/kef/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/kef/media_player.py b/homeassistant/components/kef/media_player.py index 2a2272120063..14e6e6b406f0 100644 --- a/homeassistant/components/kef/media_player.py +++ b/homeassistant/components/kef/media_player.py @@ -67,7 +67,7 @@ SERVICE_LOW_HZ = "set_low_hz" SERVICE_SUB_DB = "set_sub_db" SERVICE_UPDATE_DSP = "update_dsp" -DSP_SCAN_INTERVAL = 3600 +DSP_SCAN_INTERVAL = timedelta(seconds=3600) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { From 0b715b751d67c9e6c5dfc0f2313d3d89e260ba5a Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Wed, 8 Apr 2020 13:49:05 -0600 Subject: [PATCH 236/653] Fix unhandled exception in Recollect Waste (#33823) --- homeassistant/components/recollect_waste/sensor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/recollect_waste/sensor.py b/homeassistant/components/recollect_waste/sensor.py index 17496f3d3613..bc1ace5369f2 100644 --- a/homeassistant/components/recollect_waste/sensor.py +++ b/homeassistant/components/recollect_waste/sensor.py @@ -1,4 +1,5 @@ """Support for Recollect Waste curbside collection pickup.""" +from datetime import timedelta import logging import recollect_waste @@ -16,7 +17,7 @@ CONF_PLACE_ID = "place_id" CONF_SERVICE_ID = "service_id" DEFAULT_NAME = "recollect_waste" ICON = "mdi:trash-can-outline" -SCAN_INTERVAL = 86400 +SCAN_INTERVAL = timedelta(days=1) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( From b09b5729a36e69f517703038a38e197ff5c13f42 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 14:56:22 -0500 Subject: [PATCH 237/653] Accommodate mysql servers with a low wait_timeout (#33638) Some providers have set their wait_timeout to 60s in order to pack as many users as they can on a machine. The mysql default is 28800 seconds (8 hours) Since mysql connection build and tear down is relativity expensive, we want to avoid being disconnected. We now accommodate this scenario with the following: 1. Raise the mysql session wait_timeout 28800 when we connect 2. The event session now does a 30 second keep alive to ensure the connection stays open --- homeassistant/components/recorder/__init__.py | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 56f5b53326cd..ad160a1ba8fe 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -5,12 +5,11 @@ import concurrent.futures from datetime import datetime, timedelta import logging import queue -from sqlite3 import Connection import threading import time from typing import Any, Dict, Optional -from sqlalchemy import create_engine, exc +from sqlalchemy import create_engine, exc, select from sqlalchemy.engine import Engine from sqlalchemy.event import listens_for from sqlalchemy.orm import scoped_session, sessionmaker @@ -61,6 +60,7 @@ DEFAULT_URL = "sqlite:///{hass_config_path}" DEFAULT_DB_FILE = "home-assistant_v2.db" DEFAULT_DB_MAX_RETRIES = 10 DEFAULT_DB_RETRY_WAIT = 3 +KEEPALIVE_TIME = 30 CONF_DB_URL = "db_url" CONF_DB_MAX_RETRIES = "db_max_retries" @@ -223,6 +223,7 @@ class Recorder(threading.Thread): self.exclude_t = exclude.get(CONF_EVENT_TYPES, []) self._timechanges_seen = 0 + self._keepalive_count = 0 self.event_session = None self.get_session = None @@ -353,6 +354,10 @@ class Recorder(threading.Thread): continue if event.event_type == EVENT_TIME_CHANGED: self.queue.task_done() + self._keepalive_count += 1 + if self._keepalive_count >= KEEPALIVE_TIME: + self._keepalive_count = 0 + self._send_keep_alive() if self.commit_interval: self._timechanges_seen += 1 if self._timechanges_seen >= self.commit_interval: @@ -400,6 +405,18 @@ class Recorder(threading.Thread): self.queue.task_done() + def _send_keep_alive(self): + try: + _LOGGER.debug("Sending keepalive") + self.event_session.connection().scalar(select([1])) + return + except Exception as err: # pylint: disable=broad-except + # Must catch the exception to prevent the loop from collapsing + _LOGGER.error( + "Error in database connectivity during keepalive: %s.", err, + ) + self._reopen_event_session() + def _commit_event_session_or_retry(self): tries = 1 while tries <= self.db_max_retries: @@ -419,7 +436,7 @@ class Recorder(threading.Thread): ) else: _LOGGER.error( - "Error in database connectivity: %s. " + "Error in database connectivity during commit: %s. " "(retrying in %s seconds)", err, self.db_retry_wait, @@ -435,6 +452,15 @@ class Recorder(threading.Thread): "Error in database update. Could not save " "after %d tries. Giving up", tries, ) + self._reopen_event_session() + + def _reopen_event_session(self): + try: + self.event_session.rollback() + except Exception as err: # pylint: disable=broad-except + # Must catch the exception to prevent the loop from collapsing + _LOGGER.exception("Error while rolling back event session: %s", err) + try: self.event_session.close() except Exception as err: # pylint: disable=broad-except @@ -470,15 +496,23 @@ class Recorder(threading.Thread): # pylint: disable=unused-variable @listens_for(Engine, "connect") - def set_sqlite_pragma(dbapi_connection, connection_record): - """Set sqlite's WAL mode.""" - if isinstance(dbapi_connection, Connection): + def setup_connection(dbapi_connection, connection_record): + """Dbapi specific connection settings.""" + + # We do not import sqlite3 here so mysql/other + # users do not have to pay for it to be loaded in + # memory + if self.db_url == "sqlite://" or ":memory:" in self.db_url: old_isolation = dbapi_connection.isolation_level dbapi_connection.isolation_level = None cursor = dbapi_connection.cursor() cursor.execute("PRAGMA journal_mode=WAL") cursor.close() dbapi_connection.isolation_level = old_isolation + elif self.db_url.startswith("mysql"): + cursor = dbapi_connection.cursor() + cursor.execute("SET session wait_timeout=28800") + cursor.close() if self.db_url == "sqlite://" or ":memory:" in self.db_url: kwargs["connect_args"] = {"check_same_thread": False} From 7dd42bc32d70f5ef2bb7a5910226a6672523d3eb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 14:57:27 -0500 Subject: [PATCH 238/653] Separate august keypads into their own device (#33665) The keypad has its own unique id so its better represented as its own device. This fixes showing the keypad battery state for the lock in the UI. --- homeassistant/components/august/__init__.py | 7 ++ homeassistant/components/august/sensor.py | 95 ++++++++++++++------- tests/components/august/test_sensor.py | 38 +++------ 3 files changed, 79 insertions(+), 61 deletions(-) diff --git a/homeassistant/components/august/__init__.py b/homeassistant/components/august/__init__.py index 280bd9879658..1b25564b8a6c 100644 --- a/homeassistant/components/august/__init__.py +++ b/homeassistant/components/august/__init__.py @@ -262,6 +262,13 @@ class AugustData(AugustSubscriberMixin): await self._async_update_device_detail( self._locks_by_id[device_id], self._api.async_get_lock_detail ) + # keypads are always attached to locks + if ( + device_id in self._device_detail_by_id + and self._device_detail_by_id[device_id].keypad is not None + ): + keypad = self._device_detail_by_id[device_id].keypad + self._device_detail_by_id[keypad.device_id] = keypad elif device_id in self._doorbells_by_id: await self._async_update_device_detail( self._doorbells_by_id[device_id], diff --git a/homeassistant/components/august/sensor.py b/homeassistant/components/august/sensor.py index 018837a81dc3..3276f8b073b3 100644 --- a/homeassistant/components/august/sensor.py +++ b/homeassistant/components/august/sensor.py @@ -7,6 +7,7 @@ from homeassistant.components.sensor import DEVICE_CLASS_BATTERY from homeassistant.const import ATTR_ENTITY_PICTURE, UNIT_PERCENTAGE from homeassistant.core import callback from homeassistant.helpers.entity import Entity +from homeassistant.helpers.entity_registry import async_get_registry from homeassistant.helpers.restore_state import RestoreEntity from .const import ( @@ -33,21 +34,12 @@ def _retrieve_device_battery_state(detail): def _retrieve_linked_keypad_battery_state(detail): """Get the latest state of the sensor.""" - if detail.keypad is None: - return None - - return detail.keypad.battery_percentage + return detail.battery_percentage SENSOR_TYPES_BATTERY = { - "device_battery": { - "name": "Battery", - "state_provider": _retrieve_device_battery_state, - }, - "linked_keypad_battery": { - "name": "Keypad Battery", - "state_provider": _retrieve_linked_keypad_battery_state, - }, + "device_battery": {"state_provider": _retrieve_device_battery_state}, + "linked_keypad_battery": {"state_provider": _retrieve_linked_keypad_battery_state}, } @@ -55,7 +47,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the August sensors.""" data = hass.data[DOMAIN][config_entry.entry_id][DATA_AUGUST] devices = [] - + migrate_unique_id_devices = [] operation_sensors = [] batteries = { "device_battery": [], @@ -68,30 +60,62 @@ async def async_setup_entry(hass, config_entry, async_add_entities): batteries["linked_keypad_battery"].append(device) operation_sensors.append(device) - for sensor_type in SENSOR_TYPES_BATTERY: - for device in batteries[sensor_type]: - state_provider = SENSOR_TYPES_BATTERY[sensor_type]["state_provider"] - detail = data.get_device_detail(device.device_id) - state = state_provider(detail) - sensor_name = SENSOR_TYPES_BATTERY[sensor_type]["name"] - if state is None: - _LOGGER.debug( - "Not adding battery sensor %s for %s because it is not present", - sensor_name, - device.device_name, - ) - else: - _LOGGER.debug( - "Adding battery sensor %s for %s", sensor_name, device.device_name, - ) - devices.append(AugustBatterySensor(data, sensor_type, device)) + for device in batteries["device_battery"]: + state_provider = SENSOR_TYPES_BATTERY["device_battery"]["state_provider"] + detail = data.get_device_detail(device.device_id) + if detail is None or state_provider(detail) is None: + _LOGGER.debug( + "Not adding battery sensor for %s because it is not present", + device.device_name, + ) + continue + _LOGGER.debug( + "Adding battery sensor for %s", device.device_name, + ) + devices.append(AugustBatterySensor(data, "device_battery", device, device)) + + for device in batteries["linked_keypad_battery"]: + detail = data.get_device_detail(device.device_id) + + if detail.keypad is None: + _LOGGER.debug( + "Not adding keypad battery sensor for %s because it is not present", + device.device_name, + ) + continue + _LOGGER.debug( + "Adding keypad battery sensor for %s", device.device_name, + ) + keypad_battery_sensor = AugustBatterySensor( + data, "linked_keypad_battery", detail.keypad, device + ) + devices.append(keypad_battery_sensor) + migrate_unique_id_devices.append(keypad_battery_sensor) for device in operation_sensors: devices.append(AugustOperatorSensor(data, device)) + await _async_migrate_old_unique_ids(hass, migrate_unique_id_devices) + async_add_entities(devices, True) +async def _async_migrate_old_unique_ids(hass, devices): + """Keypads now have their own serial number.""" + registry = await async_get_registry(hass) + for device in devices: + old_entity_id = registry.async_get_entity_id( + "sensor", DOMAIN, device.old_unique_id + ) + if old_entity_id is not None: + _LOGGER.debug( + "Migrating unique_id from [%s] to [%s]", + device.old_unique_id, + device.unique_id, + ) + registry.async_update_entity(old_entity_id, new_unique_id=device.unique_id) + + class AugustOperatorSensor(AugustEntityMixin, RestoreEntity, Entity): """Representation of an August lock operation sensor.""" @@ -194,12 +218,13 @@ class AugustOperatorSensor(AugustEntityMixin, RestoreEntity, Entity): class AugustBatterySensor(AugustEntityMixin, Entity): """Representation of an August sensor.""" - def __init__(self, data, sensor_type, device): + def __init__(self, data, sensor_type, device, old_device): """Initialize the sensor.""" super().__init__(data, device) self._data = data self._sensor_type = sensor_type self._device = device + self._old_device = old_device self._state = None self._available = False self._update_from_data() @@ -228,8 +253,7 @@ class AugustBatterySensor(AugustEntityMixin, Entity): def name(self): """Return the name of the sensor.""" device_name = self._device.device_name - sensor_name = SENSOR_TYPES_BATTERY[self._sensor_type]["name"] - return f"{device_name} {sensor_name}" + return f"{device_name} Battery" @callback def _update_from_data(self): @@ -242,3 +266,8 @@ class AugustBatterySensor(AugustEntityMixin, Entity): def unique_id(self) -> str: """Get the unique id of the device sensor.""" return f"{self._device_id}_{self._sensor_type}" + + @property + def old_unique_id(self) -> str: + """Get the old unique id of the device sensor.""" + return f"{self._old_device.device_id}_{self._sensor_type}" diff --git a/tests/components/august/test_sensor.py b/tests/components/august/test_sensor.py index 8c52d80c3370..bf87a2888a54 100644 --- a/tests/components/august/test_sensor.py +++ b/tests/components/august/test_sensor.py @@ -71,21 +71,12 @@ async def test_create_lock_with_linked_keypad(hass): assert entry assert entry.unique_id == "A6697750D607098BAE8D6BAA11EF8063_device_battery" - sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery = hass.states.get( - "sensor.a6697750d607098bae8d6baa11ef8063_name_keypad_battery" - ) - assert sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery.state == "60" - assert ( - sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery.attributes[ - "unit_of_measurement" - ] - == "%" - ) - entry = entity_registry.async_get( - "sensor.a6697750d607098bae8d6baa11ef8063_name_keypad_battery" - ) + state = hass.states.get("sensor.front_door_lock_keypad_battery") + assert state.state == "60" + assert state.attributes["unit_of_measurement"] == "%" + entry = entity_registry.async_get("sensor.front_door_lock_keypad_battery") assert entry - assert entry.unique_id == "A6697750D607098BAE8D6BAA11EF8063_linked_keypad_battery" + assert entry.unique_id == "5bc65c24e6ef2a263e1450a8_linked_keypad_battery" async def test_create_lock_with_low_battery_linked_keypad(hass): @@ -110,21 +101,12 @@ async def test_create_lock_with_low_battery_linked_keypad(hass): assert entry assert entry.unique_id == "A6697750D607098BAE8D6BAA11EF8063_device_battery" - sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery = hass.states.get( - "sensor.a6697750d607098bae8d6baa11ef8063_name_keypad_battery" - ) - assert sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery.state == "10" - assert ( - sensor_a6697750d607098bae8d6baa11ef8063_name_keypad_battery.attributes[ - "unit_of_measurement" - ] - == "%" - ) - entry = entity_registry.async_get( - "sensor.a6697750d607098bae8d6baa11ef8063_name_keypad_battery" - ) + state = hass.states.get("sensor.front_door_lock_keypad_battery") + assert state.state == "10" + assert state.attributes["unit_of_measurement"] == "%" + entry = entity_registry.async_get("sensor.front_door_lock_keypad_battery") assert entry - assert entry.unique_id == "A6697750D607098BAE8D6BAA11EF8063_linked_keypad_battery" + assert entry.unique_id == "5bc65c24e6ef2a263e1450a8_linked_keypad_battery" # No activity means it will be unavailable until someone unlocks/locks it lock_operator_sensor = entity_registry.async_get( From 2d1002d40da81f5540e88022e3ac8039f39cd163 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Wed, 8 Apr 2020 22:04:47 +0200 Subject: [PATCH 239/653] Fix modbus transaction response (#33824) Sometimes a modbus server do not respond to a transaction, this is a contradiction to the modbus protocol specification, but merely a matter of fact. Use asynio.await_for() to provoke a timeout, and close the transaction. --- homeassistant/components/modbus/__init__.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 4bbcf185f289..6bb6c7fb1a20 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -2,6 +2,7 @@ import asyncio import logging +from async_timeout import timeout from pymodbus.client.asynchronous import schedulers from pymodbus.client.asynchronous.serial import AsyncModbusSerialClient as ClientSerial from pymodbus.client.asynchronous.tcp import AsyncModbusTCPClient as ClientTCP @@ -242,7 +243,12 @@ class ModbusHub: await self._connect_delay() async with self._lock: kwargs = {"unit": unit} if unit else {} - result = await func(address, count, **kwargs) + try: + async with timeout(self._config_timeout): + result = await func(address, count, **kwargs) + except asyncio.TimeoutError: + result = None + if isinstance(result, (ModbusException, ExceptionResponse)): _LOGGER.error("Hub %s Exception (%s)", self._config_name, result) return result @@ -252,7 +258,11 @@ class ModbusHub: await self._connect_delay() async with self._lock: kwargs = {"unit": unit} if unit else {} - await func(address, value, **kwargs) + try: + async with timeout(self._config_timeout): + func(address, value, **kwargs) + except asyncio.TimeoutError: + return async def read_coils(self, unit, address, count): """Read coils.""" From 15ab63a4c23f3a31fd4d65abcd4d15e2db3b19b0 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Wed, 8 Apr 2020 23:19:39 +0200 Subject: [PATCH 240/653] UniFi: Add UDM/P (UniFi OS) support (#33766) * Fix get_controller and all tests:wq * Bump dependency to v16 --- homeassistant/components/unifi/controller.py | 1 + homeassistant/components/unifi/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/unifi/test_config_flow.py | 12 ++++++ tests/components/unifi/test_controller.py | 39 ++++++++++---------- tests/components/unifi/test_switch.py | 8 ++-- 7 files changed, 40 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index 03e079c01707..864d131d287f 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -327,6 +327,7 @@ async def get_controller( try: with async_timeout.timeout(10): + await controller.check_unifi_os() await controller.login() return controller diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index 54b474e95cc2..a02a52d15106 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,7 +3,7 @@ "name": "Ubiquiti UniFi", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": ["aiounifi==15"], + "requirements": ["aiounifi==16"], "codeowners": ["@kane610"], "quality_scale": "platinum" } diff --git a/requirements_all.txt b/requirements_all.txt index a9287834fa2c..4ae2a070efc3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -211,7 +211,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==15 +aiounifi==16 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d4f9369fbb13..c51f9ada7ae1 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -94,7 +94,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==15 +aiounifi==16 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/tests/components/unifi/test_config_flow.py b/tests/components/unifi/test_config_flow.py index b89dbfeb700e..3366ec1641d1 100644 --- a/tests/components/unifi/test_config_flow.py +++ b/tests/components/unifi/test_config_flow.py @@ -52,6 +52,8 @@ async def test_flow_works(hass, aioclient_mock, mock_discovery): CONF_VERIFY_SSL: False, } + aioclient_mock.get("https://1.2.3.4:1234", status=302) + aioclient_mock.post( "https://1.2.3.4:1234/api/login", json={"data": "login successful", "meta": {"rc": "ok"}}, @@ -101,6 +103,8 @@ async def test_flow_works_multiple_sites(hass, aioclient_mock): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + aioclient_mock.get("https://1.2.3.4:1234", status=302) + aioclient_mock.post( "https://1.2.3.4:1234/api/login", json={"data": "login successful", "meta": {"rc": "ok"}}, @@ -150,6 +154,8 @@ async def test_flow_fails_site_already_configured(hass, aioclient_mock): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + aioclient_mock.get("https://1.2.3.4:1234", status=302) + aioclient_mock.post( "https://1.2.3.4:1234/api/login", json={"data": "login successful", "meta": {"rc": "ok"}}, @@ -188,6 +194,8 @@ async def test_flow_fails_user_credentials_faulty(hass, aioclient_mock): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + aioclient_mock.get("https://1.2.3.4:1234", status=302) + with patch("aiounifi.Controller.login", side_effect=aiounifi.errors.Unauthorized): result = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -213,6 +221,8 @@ async def test_flow_fails_controller_unavailable(hass, aioclient_mock): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + aioclient_mock.get("https://1.2.3.4:1234", status=302) + with patch("aiounifi.Controller.login", side_effect=aiounifi.errors.RequestError): result = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -238,6 +248,8 @@ async def test_flow_fails_unknown_problem(hass, aioclient_mock): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + aioclient_mock.get("https://1.2.3.4:1234", status=302) + with patch("aiounifi.Controller.login", side_effect=Exception): result = await hass.config_entries.flow.async_configure( result["flow_id"], diff --git a/tests/components/unifi/test_controller.py b/tests/components/unifi/test_controller.py index d3ff905e7b3a..ad334f848ba7 100644 --- a/tests/components/unifi/test_controller.py +++ b/tests/components/unifi/test_controller.py @@ -4,7 +4,7 @@ from copy import deepcopy from datetime import timedelta import aiounifi -from asynctest import Mock, patch +from asynctest import patch import pytest from homeassistant.components import unifi @@ -68,11 +68,7 @@ async def setup_unifi_integration( controllers=None, ): """Create the UniFi controller.""" - configuration = {} - if controllers: - configuration = {unifi.DOMAIN: {unifi.CONF_CONTROLLERS: controllers}} - - assert await async_setup_component(hass, unifi.DOMAIN, configuration) + assert await async_setup_component(hass, unifi.DOMAIN, {}) config_entry = MockConfigEntry( domain=unifi.DOMAIN, @@ -108,20 +104,21 @@ async def setup_unifi_integration( async def mock_request(self, method, path, json=None): mock_requests.append({"method": method, "path": path, "json": json}) - if path == "s/{site}/stat/sta" and mock_client_responses: + if path == "/stat/sta" and mock_client_responses: return mock_client_responses.popleft() - if path == "s/{site}/stat/device" and mock_device_responses: + if path == "/stat/device" and mock_device_responses: return mock_device_responses.popleft() - if path == "s/{site}/rest/user" and mock_client_all_responses: + if path == "/rest/user" and mock_client_all_responses: return mock_client_all_responses.popleft() - if path == "s/{site}/rest/wlanconf" and mock_wlans_responses: + if path == "/rest/wlanconf" and mock_wlans_responses: return mock_wlans_responses.popleft() return {} - # "aiounifi.Controller.start_websocket", return_value=True - with patch("aiounifi.Controller.login", return_value=True), patch( - "aiounifi.Controller.sites", return_value=sites - ), patch("aiounifi.Controller.request", new=mock_request), patch.object( + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( + "aiounifi.Controller.login", return_value=True, + ), patch("aiounifi.Controller.sites", return_value=sites), patch( + "aiounifi.Controller.request", new=mock_request + ), patch.object( aiounifi.websocket.WSClient, "start", return_value=True ): await hass.config_entries.async_setup(config_entry.entry_id) @@ -244,7 +241,9 @@ async def test_wireless_client_event_calls_update_wireless_devices(hass): async def test_get_controller(hass): """Successful call.""" - with patch("aiounifi.Controller.login", return_value=Mock()): + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( + "aiounifi.Controller.login", return_value=True + ): assert await unifi.controller.get_controller(hass, **CONTROLLER_DATA) @@ -252,13 +251,15 @@ async def test_get_controller_verify_ssl_false(hass): """Successful call with verify ssl set to false.""" controller_data = dict(CONTROLLER_DATA) controller_data[CONF_VERIFY_SSL] = False - with patch("aiounifi.Controller.login", return_value=Mock()): + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( + "aiounifi.Controller.login", return_value=True + ): assert await unifi.controller.get_controller(hass, **controller_data) async def test_get_controller_login_failed(hass): """Check that get_controller can handle a failed login.""" - with patch( + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( "aiounifi.Controller.login", side_effect=aiounifi.Unauthorized ), pytest.raises(unifi.errors.AuthenticationRequired): await unifi.controller.get_controller(hass, **CONTROLLER_DATA) @@ -266,7 +267,7 @@ async def test_get_controller_login_failed(hass): async def test_get_controller_controller_unavailable(hass): """Check that get_controller can handle controller being unavailable.""" - with patch( + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( "aiounifi.Controller.login", side_effect=aiounifi.RequestError ), pytest.raises(unifi.errors.CannotConnect): await unifi.controller.get_controller(hass, **CONTROLLER_DATA) @@ -274,7 +275,7 @@ async def test_get_controller_controller_unavailable(hass): async def test_get_controller_unknown_error(hass): """Check that get_controller can handle unknown errors.""" - with patch( + with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( "aiounifi.Controller.login", side_effect=aiounifi.AiounifiException ), pytest.raises(unifi.errors.AuthenticationRequired): await unifi.controller.get_controller(hass, **CONTROLLER_DATA) diff --git a/tests/components/unifi/test_switch.py b/tests/components/unifi/test_switch.py index a6b33c2aa344..cc777b8ad7f0 100644 --- a/tests/components/unifi/test_switch.py +++ b/tests/components/unifi/test_switch.py @@ -286,7 +286,7 @@ async def test_switches(hass): assert controller.mock_requests[4] == { "json": {"mac": "00:00:00:00:01:01", "cmd": "block-sta"}, "method": "post", - "path": "s/{site}/cmd/stamgr/", + "path": "/cmd/stamgr", } await hass.services.async_call( @@ -296,7 +296,7 @@ async def test_switches(hass): assert controller.mock_requests[5] == { "json": {"mac": "00:00:00:00:01:01", "cmd": "unblock-sta"}, "method": "post", - "path": "s/{site}/cmd/stamgr/", + "path": "/cmd/stamgr", } @@ -397,7 +397,7 @@ async def test_new_client_discovered_on_poe_control(hass): "port_overrides": [{"port_idx": 1, "portconf_id": "1a1", "poe_mode": "off"}] }, "method": "put", - "path": "s/{site}/rest/device/mock-id", + "path": "/rest/device/mock-id", } await hass.services.async_call( @@ -411,7 +411,7 @@ async def test_new_client_discovered_on_poe_control(hass): ] }, "method": "put", - "path": "s/{site}/rest/device/mock-id", + "path": "/rest/device/mock-id", } switch_2 = hass.states.get("switch.poe_client_2") From fb8f8133a057cf403b522a9737e5588c50291c49 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Wed, 8 Apr 2020 23:20:03 +0200 Subject: [PATCH 241/653] Use HTTP_INTERNAL_SERVER_ERROR constant (#33832) --- homeassistant/components/cloud/http_api.py | 11 +++++++---- .../components/conversation/__init__.py | 3 ++- homeassistant/components/free_mobile/notify.py | 8 ++++++-- .../components/google_assistant/http.py | 6 +++--- homeassistant/components/hue/bridge.py | 3 ++- homeassistant/components/mailbox/__init__.py | 5 +++-- .../components/media_player/__init__.py | 3 ++- homeassistant/components/nexia/__init__.py | 12 +++++++----- homeassistant/components/nexia/config_flow.py | 7 +++++-- homeassistant/components/nuheat/__init__.py | 12 ++++++++++-- homeassistant/components/nuheat/config_flow.py | 7 +++++-- homeassistant/components/rest/notify.py | 11 +++++++++-- tests/components/abode/test_config_flow.py | 6 ++++-- tests/components/buienradar/test_camera.py | 3 ++- tests/components/cloud/test_http_api.py | 15 ++++++++------- tests/components/directv/__init__.py | 6 +++--- tests/components/foobot/test_sensor.py | 3 ++- tests/components/generic/test_camera.py | 3 ++- tests/components/hassio/test_auth.py | 3 ++- tests/components/html5/test_notify.py | 7 ++++--- tests/components/mailbox/test_init.py | 3 ++- tests/components/marytts/test_tts.py | 3 ++- tests/components/melcloud/test_config_flow.py | 18 ++++++++++-------- tests/components/nuheat/test_config_flow.py | 8 ++++---- tests/components/rest/test_switch.py | 7 ++++--- tests/components/smartthings/test_init.py | 9 +++++---- tests/components/yessssms/test_notify.py | 9 +++++++-- 27 files changed, 122 insertions(+), 69 deletions(-) diff --git a/homeassistant/components/cloud/http_api.py b/homeassistant/components/cloud/http_api.py index 09dae3efc24e..8a30c4d94967 100644 --- a/homeassistant/components/cloud/http_api.py +++ b/homeassistant/components/cloud/http_api.py @@ -19,7 +19,7 @@ from homeassistant.components.google_assistant import helpers as google_helpers from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.websocket_api import const as ws_const -from homeassistant.const import HTTP_OK +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR, HTTP_OK from homeassistant.core import callback from .const import ( @@ -64,11 +64,11 @@ SCHEMA_WS_HOOK_DELETE = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( _CLOUD_ERRORS = { InvalidTrustedNetworks: ( - 500, + HTTP_INTERNAL_SERVER_ERROR, "Remote UI not compatible with 127.0.0.1/::1 as a trusted network.", ), InvalidTrustedProxies: ( - 500, + HTTP_INTERNAL_SERVER_ERROR, "Remote UI not compatible with 127.0.0.1/::1 as trusted proxies.", ), } @@ -115,7 +115,10 @@ async def async_setup(hass): auth.Unauthenticated: (401, "Authentication failed."), auth.PasswordChangeRequired: (400, "Password change required."), asyncio.TimeoutError: (502, "Unable to reach the Home Assistant cloud."), - aiohttp.ClientError: (500, "Error making internal request"), + aiohttp.ClientError: ( + HTTP_INTERNAL_SERVER_ERROR, + "Error making internal request", + ), } ) diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index 91031c141ddc..dd17eca67924 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -7,6 +7,7 @@ import voluptuous as vol from homeassistant import core from homeassistant.components import http, websocket_api from homeassistant.components.http.data_validator import RequestDataValidator +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.helpers import config_validation as cv, intent from homeassistant.loader import bind_hass @@ -145,7 +146,7 @@ class ConversationProcessView(http.HomeAssistantView): "message": str(err), }, }, - status_code=500, + status_code=HTTP_INTERNAL_SERVER_ERROR, ) return self.json(intent_result) diff --git a/homeassistant/components/free_mobile/notify.py b/homeassistant/components/free_mobile/notify.py index 8b5273f39d11..c28b56271b9c 100644 --- a/homeassistant/components/free_mobile/notify.py +++ b/homeassistant/components/free_mobile/notify.py @@ -5,7 +5,11 @@ from freesms import FreeClient import voluptuous as vol from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationService -from homeassistant.const import CONF_ACCESS_TOKEN, CONF_USERNAME +from homeassistant.const import ( + CONF_ACCESS_TOKEN, + CONF_USERNAME, + HTTP_INTERNAL_SERVER_ERROR, +) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -37,5 +41,5 @@ class FreeSMSNotificationService(BaseNotificationService): _LOGGER.error("Too much SMS send in a few time") elif resp.status_code == 403: _LOGGER.error("Wrong Username/Password") - elif resp.status_code == 500: + elif resp.status_code == HTTP_INTERNAL_SERVER_ERROR: _LOGGER.error("Server error, try later") diff --git a/homeassistant/components/google_assistant/http.py b/homeassistant/components/google_assistant/http.py index 4c16e230e92b..7b75a36f8bb9 100644 --- a/homeassistant/components/google_assistant/http.py +++ b/homeassistant/components/google_assistant/http.py @@ -10,7 +10,7 @@ import jwt # Typing imports from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES +from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES, HTTP_INTERNAL_SERVER_ERROR from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.util import dt as dt_util @@ -177,7 +177,7 @@ class GoogleConfig(AbstractConfig): return error.status except (asyncio.TimeoutError, ClientError): _LOGGER.error("Could not contact %s", url) - return 500 + return HTTP_INTERNAL_SERVER_ERROR async def async_call_homegraph_api(self, url, data): """Call a homegraph api with authentication.""" @@ -212,7 +212,7 @@ class GoogleConfig(AbstractConfig): return error.status except (asyncio.TimeoutError, ClientError): _LOGGER.error("Could not contact %s", url) - return 500 + return HTTP_INTERNAL_SERVER_ERROR async def async_report_state(self, message, agent_user_id: str): """Send a state report to Google.""" diff --git a/homeassistant/components/hue/bridge.py b/homeassistant/components/hue/bridge.py index 37089e54b002..977a6717f1b7 100644 --- a/homeassistant/components/hue/bridge.py +++ b/homeassistant/components/hue/bridge.py @@ -10,6 +10,7 @@ import slugify as unicode_slug import voluptuous as vol from homeassistant import core +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client, config_validation as cv @@ -134,7 +135,7 @@ class HueBridge: # We only retry if it's a server error. So raise on all 4XX errors. if ( isinstance(err, client_exceptions.ClientResponseError) - and err.status < 500 + and err.status < HTTP_INTERNAL_SERVER_ERROR ): raise diff --git a/homeassistant/components/mailbox/__init__.py b/homeassistant/components/mailbox/__init__.py index 2275c5eba48d..c3a24fe9b029 100644 --- a/homeassistant/components/mailbox/__init__.py +++ b/homeassistant/components/mailbox/__init__.py @@ -9,6 +9,7 @@ from aiohttp.web_exceptions import HTTPNotFound import async_timeout from homeassistant.components.http import HomeAssistantView +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_per_platform, discovery @@ -255,8 +256,8 @@ class MailboxMediaView(MailboxView): except StreamError as err: error_msg = "Error getting media: %s" % (err) _LOGGER.error(error_msg) - return web.Response(status=500) + return web.Response(status=HTTP_INTERNAL_SERVER_ERROR) if stream: return web.Response(body=stream, content_type=mailbox.media_type) - return web.Response(status=500) + return web.Response(status=HTTP_INTERNAL_SERVER_ERROR) diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 86b5d7581495..81f0fa010b0a 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -18,6 +18,7 @@ import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView from homeassistant.const import ( + HTTP_INTERNAL_SERVER_ERROR, HTTP_OK, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE, @@ -878,7 +879,7 @@ class MediaPlayerImageView(HomeAssistantView): data, content_type = await player.async_get_media_image() if data is None: - return web.Response(status=500) + return web.Response(status=HTTP_INTERNAL_SERVER_ERROR) headers = {CACHE_CONTROL: "max-age=3600"} return web.Response(body=data, content_type=content_type, headers=headers) diff --git a/homeassistant/components/nexia/__init__.py b/homeassistant/components/nexia/__init__.py index 5c317794c2ae..fd0b708576d7 100644 --- a/homeassistant/components/nexia/__init__.py +++ b/homeassistant/components/nexia/__init__.py @@ -9,7 +9,7 @@ from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady import homeassistant.helpers.config_validation as cv @@ -28,7 +28,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Required(CONF_PASSWORD): cv.string, }, extra=vol.ALLOW_EXTRA, - ), + ) }, extra=vol.ALLOW_EXTRA, ) @@ -73,10 +73,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): _LOGGER.error("Unable to connect to Nexia service: %s", ex) raise ConfigEntryNotReady except HTTPError as http_ex: - if http_ex.response.status_code >= 400 and http_ex.response.status_code < 500: + if ( + http_ex.response.status_code >= 400 + and http_ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR + ): _LOGGER.error( - "Access error from Nexia service, please check credentials: %s", - http_ex, + "Access error from Nexia service, please check credentials: %s", http_ex ) return False _LOGGER.error("HTTP error from Nexia service: %s", http_ex) diff --git a/homeassistant/components/nexia/config_flow.py b/homeassistant/components/nexia/config_flow.py index 5844cb8da20b..01d4dc406cf3 100644 --- a/homeassistant/components/nexia/config_flow.py +++ b/homeassistant/components/nexia/config_flow.py @@ -6,7 +6,7 @@ from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol from homeassistant import config_entries, core, exceptions -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR from .const import DOMAIN # pylint:disable=unused-import @@ -34,7 +34,10 @@ async def validate_input(hass: core.HomeAssistant, data): raise CannotConnect except HTTPError as http_ex: _LOGGER.error("HTTP error from Nexia service: %s", http_ex) - if http_ex.response.status_code >= 400 and http_ex.response.status_code < 500: + if ( + http_ex.response.status_code >= 400 + and http_ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR + ): raise InvalidAuth raise CannotConnect diff --git a/homeassistant/components/nuheat/__init__.py b/homeassistant/components/nuheat/__init__.py index ca47f831370e..6b49a3b975ba 100644 --- a/homeassistant/components/nuheat/__init__.py +++ b/homeassistant/components/nuheat/__init__.py @@ -7,7 +7,12 @@ import requests import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry -from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import ( + CONF_DEVICES, + CONF_PASSWORD, + CONF_USERNAME, + HTTP_INTERNAL_SERVER_ERROR, +) from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import config_validation as cv @@ -78,7 +83,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): except requests.exceptions.Timeout: raise ConfigEntryNotReady except requests.exceptions.HTTPError as ex: - if ex.response.status_code > 400 and ex.response.status_code < 500: + if ( + ex.response.status_code > 400 + and ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR + ): _LOGGER.error("Failed to login to nuheat: %s", ex) return False raise ConfigEntryNotReady diff --git a/homeassistant/components/nuheat/config_flow.py b/homeassistant/components/nuheat/config_flow.py index 4f12f590057e..cf2f3398309e 100644 --- a/homeassistant/components/nuheat/config_flow.py +++ b/homeassistant/components/nuheat/config_flow.py @@ -6,7 +6,7 @@ import requests.exceptions import voluptuous as vol from homeassistant import config_entries, core, exceptions -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR from .const import CONF_SERIAL_NUMBER from .const import DOMAIN # pylint:disable=unused-import @@ -34,7 +34,10 @@ async def validate_input(hass: core.HomeAssistant, data): except requests.exceptions.Timeout: raise CannotConnect except requests.exceptions.HTTPError as ex: - if ex.response.status_code > 400 and ex.response.status_code < 500: + if ( + ex.response.status_code > 400 + and ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR + ): raise InvalidAuth raise CannotConnect # diff --git a/homeassistant/components/rest/notify.py b/homeassistant/components/rest/notify.py index b97398411306..60b000eae1ee 100644 --- a/homeassistant/components/rest/notify.py +++ b/homeassistant/components/rest/notify.py @@ -23,6 +23,7 @@ from homeassistant.const import ( CONF_VERIFY_SSL, HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION, + HTTP_INTERNAL_SERVER_ERROR, HTTP_OK, ) import homeassistant.helpers.config_validation as cv @@ -188,11 +189,17 @@ class RestNotificationService(BaseNotificationService): verify=self._verify_ssl, ) - if response.status_code >= 500 and response.status_code < 600: + if ( + response.status_code >= HTTP_INTERNAL_SERVER_ERROR + and response.status_code < 600 + ): _LOGGER.exception( "Server error. Response %d: %s:", response.status_code, response.reason ) - elif response.status_code >= 400 and response.status_code < 500: + elif ( + response.status_code >= 400 + and response.status_code < HTTP_INTERNAL_SERVER_ERROR + ): _LOGGER.exception( "Client error. Response %d: %s:", response.status_code, response.reason ) diff --git a/tests/components/abode/test_config_flow.py b/tests/components/abode/test_config_flow.py index 5e32c9232450..d9762296e708 100644 --- a/tests/components/abode/test_config_flow.py +++ b/tests/components/abode/test_config_flow.py @@ -5,7 +5,7 @@ from abodepy.exceptions import AbodeAuthenticationException from homeassistant import data_entry_flow from homeassistant.components.abode import config_flow -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR from tests.common import MockConfigEntry @@ -74,7 +74,9 @@ async def test_connection_error(hass): with patch( "homeassistant.components.abode.config_flow.Abode", - side_effect=AbodeAuthenticationException((500, "connection error")), + side_effect=AbodeAuthenticationException( + (HTTP_INTERNAL_SERVER_ERROR, "connection error") + ), ): result = await flow.async_step_user(user_input=conf) assert result["errors"] == {"base": "connection_error"} diff --git a/tests/components/buienradar/test_camera.py b/tests/components/buienradar/test_camera.py index 0a3c67d97d35..96c5d2ec67c1 100644 --- a/tests/components/buienradar/test_camera.py +++ b/tests/components/buienradar/test_camera.py @@ -3,6 +3,7 @@ import asyncio from aiohttp.client_exceptions import ClientResponseError +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util @@ -202,7 +203,7 @@ async def test_retries_after_error(aioclient_mock, hass, hass_client): client = await hass_client() - aioclient_mock.get(radar_map_url(), text=None, status=500) + aioclient_mock.get(radar_map_url(), text=None, status=HTTP_INTERNAL_SERVER_ERROR) # A 404 should not return data and throw: try: diff --git a/tests/components/cloud/test_http_api.py b/tests/components/cloud/test_http_api.py index 8bfa6185e9b6..8cb4a0b96368 100644 --- a/tests/components/cloud/test_http_api.py +++ b/tests/components/cloud/test_http_api.py @@ -15,6 +15,7 @@ from homeassistant.components.alexa import errors as alexa_errors from homeassistant.components.alexa.entities import LightCapabilities from homeassistant.components.cloud.const import DOMAIN, RequireRelink from homeassistant.components.google_assistant.helpers import GoogleEntity +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.core import State from . import mock_cloud, mock_cloud_prefs @@ -99,10 +100,10 @@ async def test_google_actions_sync_fails(mock_cognito, mock_cloud_login, cloud_c """Test syncing Google Actions gone bad.""" with patch( "hass_nabucasa.cloud_api.async_google_actions_request_sync", - return_value=mock_coro(Mock(status=500)), + return_value=mock_coro(Mock(status=HTTP_INTERNAL_SERVER_ERROR)), ) as mock_request_sync: req = await cloud_client.post("/api/cloud/google_actions/sync") - assert req.status == 500 + assert req.status == HTTP_INTERNAL_SERVER_ERROR assert len(mock_request_sync.mock_calls) == 1 @@ -436,7 +437,7 @@ async def test_websocket_subscription_fail( hass, hass_ws_client, aioclient_mock, mock_auth, mock_cloud_login ): """Test querying the status.""" - aioclient_mock.get(SUBSCRIPTION_INFO_URL, status=500) + aioclient_mock.get(SUBSCRIPTION_INFO_URL, status=HTTP_INTERNAL_SERVER_ERROR) client = await hass_ws_client(hass) await client.send_json({"id": 5, "type": "cloud/subscription"}) response = await client.receive_json() @@ -611,7 +612,7 @@ async def test_enabling_remote_trusted_networks_local4( response = await client.receive_json() assert not response["success"] - assert response["error"]["code"] == 500 + assert response["error"]["code"] == HTTP_INTERNAL_SERVER_ERROR assert ( response["error"]["message"] == "Remote UI not compatible with 127.0.0.1/::1 as a trusted network." @@ -643,7 +644,7 @@ async def test_enabling_remote_trusted_networks_local6( response = await client.receive_json() assert not response["success"] - assert response["error"]["code"] == 500 + assert response["error"]["code"] == HTTP_INTERNAL_SERVER_ERROR assert ( response["error"]["message"] == "Remote UI not compatible with 127.0.0.1/::1 as a trusted network." @@ -744,7 +745,7 @@ async def test_enabling_remote_trusted_proxies_local4( response = await client.receive_json() assert not response["success"] - assert response["error"]["code"] == 500 + assert response["error"]["code"] == HTTP_INTERNAL_SERVER_ERROR assert ( response["error"]["message"] == "Remote UI not compatible with 127.0.0.1/::1 as trusted proxies." @@ -768,7 +769,7 @@ async def test_enabling_remote_trusted_proxies_local6( response = await client.receive_json() assert not response["success"] - assert response["error"]["code"] == 500 + assert response["error"]["code"] == HTTP_INTERNAL_SERVER_ERROR assert ( response["error"]["message"] == "Remote UI not compatible with 127.0.0.1/::1 as trusted proxies." diff --git a/tests/components/directv/__init__.py b/tests/components/directv/__init__.py index cd0f72307d87..d34ab0266afc 100644 --- a/tests/components/directv/__init__.py +++ b/tests/components/directv/__init__.py @@ -1,7 +1,7 @@ """Tests for the DirecTV component.""" from homeassistant.components.directv.const import CONF_RECEIVER_ID, DOMAIN from homeassistant.components.ssdp import ATTR_SSDP_LOCATION -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_HOST, HTTP_INTERNAL_SERVER_ERROR from homeassistant.helpers.typing import HomeAssistantType from tests.common import MockConfigEntry, load_fixture @@ -34,7 +34,7 @@ def mock_connection(aioclient_mock: AiohttpClientMocker) -> None: aioclient_mock.get( f"http://{HOST}:8080/info/mode", params={"clientAddr": "9XXXXXXXXXX9"}, - status=500, + status=HTTP_INTERNAL_SERVER_ERROR, text=load_fixture("directv/info-mode-error.json"), headers={"Content-Type": "application/json"}, ) @@ -80,7 +80,7 @@ async def setup_integration( """Set up the DirecTV integration in Home Assistant.""" if setup_error: aioclient_mock.get( - f"http://{HOST}:8080/info/getVersion", status=500, + f"http://{HOST}:8080/info/getVersion", status=HTTP_INTERNAL_SERVER_ERROR ) else: mock_connection(aioclient_mock) diff --git a/tests/components/foobot/test_sensor.py b/tests/components/foobot/test_sensor.py index f8cf38395f20..10cc3eb47b68 100644 --- a/tests/components/foobot/test_sensor.py +++ b/tests/components/foobot/test_sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_PARTS_PER_BILLION, CONCENTRATION_PARTS_PER_MILLION, + HTTP_INTERNAL_SERVER_ERROR, TEMP_CELSIUS, UNIT_PERCENTAGE, ) @@ -83,7 +84,7 @@ async def test_setup_temporary_error(hass, aioclient_mock): """Expected failures caused by temporary errors in API response.""" fake_async_add_entities = MagicMock() - errors = [429, 500] + errors = [429, HTTP_INTERNAL_SERVER_ERROR] for error in errors: aioclient_mock.get(re.compile("api.foobot.io/v2/owner/.*"), status=error) with pytest.raises(PlatformNotReady): diff --git a/tests/components/generic/test_camera.py b/tests/components/generic/test_camera.py index 7f49d1b89790..9b0466dda937 100644 --- a/tests/components/generic/test_camera.py +++ b/tests/components/generic/test_camera.py @@ -2,6 +2,7 @@ import asyncio from unittest import mock +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.setup import async_setup_component @@ -117,7 +118,7 @@ async def test_limit_refetch(aioclient_mock, hass, hass_client): with mock.patch("async_timeout.timeout", side_effect=asyncio.TimeoutError()): resp = await client.get("/api/camera_proxy/camera.config_test") assert aioclient_mock.call_count == 0 - assert resp.status == 500 + assert resp.status == HTTP_INTERNAL_SERVER_ERROR hass.states.async_set("sensor.temp", "10") diff --git a/tests/components/hassio/test_auth.py b/tests/components/hassio/test_auth.py index 189273c58026..621efa1cb9ef 100644 --- a/tests/components/hassio/test_auth.py +++ b/tests/components/hassio/test_auth.py @@ -1,6 +1,7 @@ """The tests for the hassio component.""" from unittest.mock import Mock, patch +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.exceptions import HomeAssistantError from tests.common import mock_coro @@ -186,5 +187,5 @@ async def test_password_no_user(hass, hassio_client_supervisor): ) # Check we got right response - assert resp.status == 500 + assert resp.status == HTTP_INTERNAL_SERVER_ERROR assert not mock_save.called diff --git a/tests/components/html5/test_notify.py b/tests/components/html5/test_notify.py index a9fd998f003b..4a62eb76c27d 100644 --- a/tests/components/html5/test_notify.py +++ b/tests/components/html5/test_notify.py @@ -5,6 +5,7 @@ from unittest.mock import MagicMock, mock_open, patch from aiohttp.hdrs import AUTHORIZATION import homeassistant.components.html5.notify as html5 +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.exceptions import HomeAssistantError from homeassistant.setup import async_setup_component @@ -335,7 +336,7 @@ async def test_registering_new_device_fails_view(hass, hass_client): ): resp = await client.post(REGISTER_URL, data=json.dumps(SUBSCRIPTION_4)) - assert resp.status == 500 + assert resp.status == HTTP_INTERNAL_SERVER_ERROR assert registrations == {} @@ -380,7 +381,7 @@ async def test_registering_existing_device_fails_view(hass, hass_client): mock_save.side_effect = HomeAssistantError resp = await client.post(REGISTER_URL, data=json.dumps(SUBSCRIPTION_4)) - assert resp.status == 500 + assert resp.status == HTTP_INTERNAL_SERVER_ERROR assert registrations == {"unnamed device": SUBSCRIPTION_1} @@ -451,7 +452,7 @@ async def test_unregistering_device_view_handles_save_error(hass, hass_client): data=json.dumps({"subscription": SUBSCRIPTION_1["subscription"]}), ) - assert resp.status == 500, resp.response + assert resp.status == HTTP_INTERNAL_SERVER_ERROR, resp.response assert registrations == { "some device": SUBSCRIPTION_1, "other device": SUBSCRIPTION_2, diff --git a/tests/components/mailbox/test_init.py b/tests/components/mailbox/test_init.py index ea52f98f70ed..f35c763bf741 100644 --- a/tests/components/mailbox/test_init.py +++ b/tests/components/mailbox/test_init.py @@ -5,6 +5,7 @@ import pytest from homeassistant.bootstrap import async_setup_component import homeassistant.components.mailbox as mailbox +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR @pytest.fixture @@ -90,7 +91,7 @@ async def test_get_media_from_invalid_msgid(mock_http_client): url = "/api/mailbox/media/DemoMailbox/%s" % (msgsha) req = await mock_http_client.get(url) - assert req.status == 500 + assert req.status == HTTP_INTERNAL_SERVER_ERROR async def test_delete_from_invalid_mailbox(mock_http_client): diff --git a/tests/components/marytts/test_tts.py b/tests/components/marytts/test_tts.py index d8a96b2db52e..70a29fe11e18 100644 --- a/tests/components/marytts/test_tts.py +++ b/tests/components/marytts/test_tts.py @@ -11,6 +11,7 @@ from homeassistant.components.media_player.const import ( SERVICE_PLAY_MEDIA, ) import homeassistant.components.tts as tts +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.setup import setup_component from tests.common import assert_setup_component, get_test_home_assistant, mock_service @@ -122,7 +123,7 @@ class TestTTSMaryTTSPlatform: conn = Mock() response = Mock() conn.getresponse.return_value = response - response.status = 500 + response.status = HTTP_INTERNAL_SERVER_ERROR response.reason = "test" response.readline.return_value = "content" diff --git a/tests/components/melcloud/test_config_flow.py b/tests/components/melcloud/test_config_flow.py index 90c766f0831a..4cd64afa053d 100644 --- a/tests/components/melcloud/test_config_flow.py +++ b/tests/components/melcloud/test_config_flow.py @@ -8,6 +8,7 @@ import pytest from homeassistant import config_entries from homeassistant.components.melcloud.const import DOMAIN +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from tests.common import MockConfigEntry @@ -50,7 +51,7 @@ async def test_form(hass, mock_login, mock_get_devices): with patch( "homeassistant.components.melcloud.async_setup", return_value=True ) as mock_setup, patch( - "homeassistant.components.melcloud.async_setup_entry", return_value=True, + "homeassistant.components.melcloud.async_setup_entry", return_value=True ) as mock_setup_entry: result2 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -89,7 +90,11 @@ async def test_form_errors(hass, mock_login, mock_get_devices, error, reason): @pytest.mark.parametrize( "error,message", - [(401, "invalid_auth"), (403, "invalid_auth"), (500, "cannot_connect")], + [ + (401, "invalid_auth"), + (403, "invalid_auth"), + (HTTP_INTERNAL_SERVER_ERROR, "cannot_connect"), + ], ) async def test_form_response_errors( hass, mock_login, mock_get_devices, mock_request_info, error, message @@ -112,7 +117,7 @@ async def test_import_with_token(hass, mock_login, mock_get_devices): with patch( "homeassistant.components.melcloud.async_setup", return_value=True ) as mock_setup, patch( - "homeassistant.components.melcloud.async_setup_entry", return_value=True, + "homeassistant.components.melcloud.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_init( DOMAIN, @@ -135,10 +140,7 @@ async def test_token_refresh(hass, mock_login, mock_get_devices): """Re-configuration with existing username should refresh token.""" mock_entry = MockConfigEntry( domain=DOMAIN, - data={ - "username": "test-email@test-domain.com", - "token": "test-original-token", - }, + data={"username": "test-email@test-domain.com", "token": "test-original-token"}, unique_id="test-email@test-domain.com", ) mock_entry.add_to_hass(hass) @@ -146,7 +148,7 @@ async def test_token_refresh(hass, mock_login, mock_get_devices): with patch( "homeassistant.components.melcloud.async_setup", return_value=True ) as mock_setup, patch( - "homeassistant.components.melcloud.async_setup_entry", return_value=True, + "homeassistant.components.melcloud.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_init( DOMAIN, diff --git a/tests/components/nuheat/test_config_flow.py b/tests/components/nuheat/test_config_flow.py index d6e10e1dc7c4..338509f09d17 100644 --- a/tests/components/nuheat/test_config_flow.py +++ b/tests/components/nuheat/test_config_flow.py @@ -4,7 +4,7 @@ import requests from homeassistant import config_entries, setup from homeassistant.components.nuheat.const import CONF_SERIAL_NUMBER, DOMAIN -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR from .mocks import _get_mock_thermostat_run @@ -29,7 +29,7 @@ async def test_form_user(hass): ), patch( "homeassistant.components.nuheat.async_setup", return_value=True ) as mock_setup, patch( - "homeassistant.components.nuheat.async_setup_entry", return_value=True, + "homeassistant.components.nuheat.async_setup_entry", return_value=True ) as mock_setup_entry: result2 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -67,7 +67,7 @@ async def test_form_import(hass): ), patch( "homeassistant.components.nuheat.async_setup", return_value=True ) as mock_setup, patch( - "homeassistant.components.nuheat.async_setup_entry", return_value=True, + "homeassistant.components.nuheat.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_init( DOMAIN, @@ -139,7 +139,7 @@ async def test_form_invalid_thermostat(hass): ) response_mock = MagicMock() - type(response_mock).status_code = 500 + type(response_mock).status_code = HTTP_INTERNAL_SERVER_ERROR with patch( "homeassistant.components.nuheat.config_flow.nuheat.NuHeat.authenticate", diff --git a/tests/components/rest/test_switch.py b/tests/components/rest/test_switch.py index d1e4ac05514b..bba6ac3dc893 100644 --- a/tests/components/rest/test_switch.py +++ b/tests/components/rest/test_switch.py @@ -4,6 +4,7 @@ import asyncio import aiohttp import homeassistant.components.rest.switch as rest +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.helpers.template import Template from homeassistant.setup import setup_component @@ -140,7 +141,7 @@ class TestRestSwitch: def test_turn_on_status_not_ok(self, aioclient_mock): """Test turn_on when error status returned.""" - aioclient_mock.post(self.resource, status=500) + aioclient_mock.post(self.resource, status=HTTP_INTERNAL_SERVER_ERROR) asyncio.run_coroutine_threadsafe( self.switch.async_turn_on(), self.hass.loop ).result() @@ -150,7 +151,7 @@ class TestRestSwitch: def test_turn_on_timeout(self, aioclient_mock): """Test turn_on when timeout occurs.""" - aioclient_mock.post(self.resource, status=500) + aioclient_mock.post(self.resource, status=HTTP_INTERNAL_SERVER_ERROR) asyncio.run_coroutine_threadsafe( self.switch.async_turn_on(), self.hass.loop ).result() @@ -169,7 +170,7 @@ class TestRestSwitch: def test_turn_off_status_not_ok(self, aioclient_mock): """Test turn_off when error status returned.""" - aioclient_mock.post(self.resource, status=500) + aioclient_mock.post(self.resource, status=HTTP_INTERNAL_SERVER_ERROR) asyncio.run_coroutine_threadsafe( self.switch.async_turn_off(), self.hass.loop ).result() diff --git a/tests/components/smartthings/test_init.py b/tests/components/smartthings/test_init.py index 05ea832a81e4..4093f3753f14 100644 --- a/tests/components/smartthings/test_init.py +++ b/tests/components/smartthings/test_init.py @@ -17,6 +17,7 @@ from homeassistant.components.smartthings.const import ( SIGNAL_SMARTTHINGS_UPDATE, SUPPORTED_PLATFORMS, ) +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.setup import async_setup_component @@ -80,7 +81,7 @@ async def test_recoverable_api_errors_raise_not_ready( config_entry.add_to_hass(hass) request_info = Mock(real_url="http://example.com") smartthings_mock.app.side_effect = ClientResponseError( - request_info=request_info, history=None, status=500 + request_info=request_info, history=None, status=HTTP_INTERNAL_SERVER_ERROR ) with pytest.raises(ConfigEntryNotReady): @@ -96,7 +97,7 @@ async def test_scenes_api_errors_raise_not_ready( smartthings_mock.app.return_value = app smartthings_mock.installed_app.return_value = installed_app smartthings_mock.scenes.side_effect = ClientResponseError( - request_info=request_info, history=None, status=500 + request_info=request_info, history=None, status=HTTP_INTERNAL_SERVER_ERROR ) with pytest.raises(ConfigEntryNotReady): await smartthings.async_setup_entry(hass, config_entry) @@ -325,7 +326,7 @@ async def test_remove_entry_installedapp_api_error( request_info = Mock(real_url="http://example.com") # Arrange smartthings_mock.delete_installed_app.side_effect = ClientResponseError( - request_info=request_info, history=None, status=500 + request_info=request_info, history=None, status=HTTP_INTERNAL_SERVER_ERROR ) # Act with pytest.raises(ClientResponseError): @@ -354,7 +355,7 @@ async def test_remove_entry_app_api_error(hass, config_entry, smartthings_mock): # Arrange request_info = Mock(real_url="http://example.com") smartthings_mock.delete_app.side_effect = ClientResponseError( - request_info=request_info, history=None, status=500 + request_info=request_info, history=None, status=HTTP_INTERNAL_SERVER_ERROR ) # Act with pytest.raises(ClientResponseError): diff --git a/tests/components/yessssms/test_notify.py b/tests/components/yessssms/test_notify.py index 94f9c846d649..992185bf1024 100644 --- a/tests/components/yessssms/test_notify.py +++ b/tests/components/yessssms/test_notify.py @@ -8,7 +8,12 @@ import requests_mock from homeassistant.components.yessssms.const import CONF_PROVIDER import homeassistant.components.yessssms.notify as yessssms -from homeassistant.const import CONF_PASSWORD, CONF_RECIPIENT, CONF_USERNAME +from homeassistant.const import ( + CONF_PASSWORD, + CONF_RECIPIENT, + CONF_USERNAME, + HTTP_INTERNAL_SERVER_ERROR, +) from homeassistant.setup import async_setup_component @@ -318,7 +323,7 @@ class TestNotifyYesssSMS(unittest.TestCase): "POST", # pylint: disable=protected-access self.yessssms.yesss._websms_url, - status_code=500, + status_code=HTTP_INTERNAL_SERVER_ERROR, ) message = "Testing YesssSMS platform :)" From ac9429988bb8a5dfbfebcae9ada52bb2d5089290 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 16:29:59 -0500 Subject: [PATCH 242/653] Add a config flow for flume (#33419) * Add a config flow for flume * Sensors no longer block Home Assistant startup since the flume api can take > 60s to respond on the first poll * Update to 0.4.0 to resolve the blocking startup issue * Missed conversion to FlumeAuth * FlumeAuth can do i/o if the token is expired, wrap it * workaround async_add_entities updating disabled entities * Fix conflict --- CODEOWNERS | 2 +- .../components/flume/.translations/en.json | 25 +++ homeassistant/components/flume/__init__.py | 100 +++++++++++- homeassistant/components/flume/config_flow.py | 104 +++++++++++++ homeassistant/components/flume/const.py | 24 +++ homeassistant/components/flume/manifest.json | 11 +- homeassistant/components/flume/sensor.py | 144 ++++++++++------- homeassistant/components/flume/strings.json | 25 +++ homeassistant/generated/config_flows.py | 1 + requirements_all.txt | 2 +- requirements_test_all.txt | 3 + tests/components/flume/__init__.py | 1 + tests/components/flume/test_config_flow.py | 146 ++++++++++++++++++ 13 files changed, 527 insertions(+), 61 deletions(-) create mode 100644 homeassistant/components/flume/.translations/en.json create mode 100644 homeassistant/components/flume/config_flow.py create mode 100644 homeassistant/components/flume/const.py create mode 100644 homeassistant/components/flume/strings.json create mode 100644 tests/components/flume/__init__.py create mode 100644 tests/components/flume/test_config_flow.py diff --git a/CODEOWNERS b/CODEOWNERS index e8fadc9ed447..edc15f00899f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -121,7 +121,7 @@ homeassistant/components/filter/* @dgomes homeassistant/components/fitbit/* @robbiet480 homeassistant/components/fixer/* @fabaff homeassistant/components/flock/* @fabaff -homeassistant/components/flume/* @ChrisMandich +homeassistant/components/flume/* @ChrisMandich @bdraco homeassistant/components/flunearyou/* @bachya homeassistant/components/fortigate/* @kifeo homeassistant/components/fortios/* @kimfrellsen diff --git a/homeassistant/components/flume/.translations/en.json b/homeassistant/components/flume/.translations/en.json new file mode 100644 index 000000000000..ed557133a9bb --- /dev/null +++ b/homeassistant/components/flume/.translations/en.json @@ -0,0 +1,25 @@ +{ + "config" : { + "error" : { + "unknown" : "Unexpected error", + "invalid_auth" : "Invalid authentication", + "cannot_connect" : "Failed to connect, please try again" + }, + "step" : { + "user" : { + "description" : "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", + "title" : "Connect to your Flume Account", + "data" : { + "username" : "Username", + "client_secret" : "Client Secret", + "client_id" : "Client ID", + "password" : "Password" + } + } + }, + "abort" : { + "already_configured" : "This account is already configured" + }, + "title" : "Flume" + } +} diff --git a/homeassistant/components/flume/__init__.py b/homeassistant/components/flume/__init__.py index ab626e1f1560..2c18864194ec 100644 --- a/homeassistant/components/flume/__init__.py +++ b/homeassistant/components/flume/__init__.py @@ -1 +1,99 @@ -"""The Flume component.""" +"""The flume integration.""" +import asyncio +from functools import partial +import logging + +from pyflume import FlumeAuth, FlumeDeviceList +from requests import Session +from requests.exceptions import RequestException + +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ConfigEntryNotReady + +from .const import ( + BASE_TOKEN_FILENAME, + CONF_CLIENT_ID, + CONF_CLIENT_SECRET, + DOMAIN, + FLUME_AUTH, + FLUME_DEVICES, + FLUME_HTTP_SESSION, + PLATFORMS, +) + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup(hass: HomeAssistant, config: dict): + """Set up the flume component.""" + hass.data.setdefault(DOMAIN, {}) + return True + + +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): + """Set up flume from a config entry.""" + + config = entry.data + + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + client_id = config[CONF_CLIENT_ID] + client_secret = config[CONF_CLIENT_SECRET] + flume_token_full_path = hass.config.path(f"{BASE_TOKEN_FILENAME}-{username}") + + http_session = Session() + + try: + flume_auth = await hass.async_add_executor_job( + partial( + FlumeAuth, + username, + password, + client_id, + client_secret, + flume_token_file=flume_token_full_path, + http_session=http_session, + ) + ) + flume_devices = await hass.async_add_executor_job( + partial(FlumeDeviceList, flume_auth, http_session=http_session,) + ) + except RequestException: + raise ConfigEntryNotReady + except Exception as ex: # pylint: disable=broad-except + _LOGGER.error("Invalid credentials for flume: %s", ex) + return False + + hass.data[DOMAIN][entry.entry_id] = { + FLUME_DEVICES: flume_devices, + FLUME_AUTH: flume_auth, + FLUME_HTTP_SESSION: http_session, + } + + for component in PLATFORMS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, component) + ) + + return True + + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(entry, component) + for component in PLATFORMS + ] + ) + ) + + hass.data[DOMAIN][entry.entry_id][FLUME_HTTP_SESSION].close() + + if unload_ok: + hass.data[DOMAIN].pop(entry.entry_id) + + return unload_ok diff --git a/homeassistant/components/flume/config_flow.py b/homeassistant/components/flume/config_flow.py new file mode 100644 index 000000000000..3232245a4a99 --- /dev/null +++ b/homeassistant/components/flume/config_flow.py @@ -0,0 +1,104 @@ +"""Config flow for flume integration.""" +from functools import partial +import logging + +from pyflume import FlumeAuth, FlumeDeviceList +from requests.exceptions import RequestException +import voluptuous as vol + +from homeassistant import config_entries, core, exceptions +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME + +from .const import BASE_TOKEN_FILENAME, CONF_CLIENT_ID, CONF_CLIENT_SECRET +from .const import DOMAIN # pylint:disable=unused-import + +_LOGGER = logging.getLogger(__name__) + +# If flume ever implements a login page for oauth +# we can use the oauth2 support built into Home Assistant. +# +# Currently they only implement the token endpoint +# +DATA_SCHEMA = vol.Schema( + { + vol.Required(CONF_USERNAME): str, + vol.Required(CONF_PASSWORD): str, + vol.Required(CONF_CLIENT_ID): str, + vol.Required(CONF_CLIENT_SECRET): str, + } +) + + +async def validate_input(hass: core.HomeAssistant, data): + """Validate the user input allows us to connect. + + Data has the keys from DATA_SCHEMA with values provided by the user. + """ + username = data[CONF_USERNAME] + password = data[CONF_PASSWORD] + client_id = data[CONF_CLIENT_ID] + client_secret = data[CONF_CLIENT_SECRET] + flume_token_full_path = hass.config.path(f"{BASE_TOKEN_FILENAME}-{username}") + + try: + flume_auth = await hass.async_add_executor_job( + partial( + FlumeAuth, + username, + password, + client_id, + client_secret, + flume_token_file=flume_token_full_path, + ) + ) + flume_devices = await hass.async_add_executor_job(FlumeDeviceList, flume_auth) + except RequestException: + raise CannotConnect + except Exception: # pylint: disable=broad-except + raise InvalidAuth + if not flume_devices or not flume_devices.device_list: + raise CannotConnect + + # Return info that you want to store in the config entry. + return {"title": username} + + +class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for flume.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + + async def async_step_user(self, user_input=None): + """Handle the initial step.""" + errors = {} + if user_input is not None: + await self.async_set_unique_id(user_input[CONF_USERNAME]) + self._abort_if_unique_id_configured() + + try: + info = await validate_input(self.hass, user_input) + return self.async_create_entry(title=info["title"], data=user_input) + except CannotConnect: + errors["base"] = "cannot_connect" + except InvalidAuth: + errors["base"] = "invalid_auth" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + + return self.async_show_form( + step_id="user", data_schema=DATA_SCHEMA, errors=errors + ) + + async def async_step_import(self, user_input): + """Handle import.""" + return await self.async_step_user(user_input) + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" + + +class InvalidAuth(exceptions.HomeAssistantError): + """Error to indicate there is invalid auth.""" diff --git a/homeassistant/components/flume/const.py b/homeassistant/components/flume/const.py new file mode 100644 index 000000000000..17bbb60edb0c --- /dev/null +++ b/homeassistant/components/flume/const.py @@ -0,0 +1,24 @@ +"""The Flume component.""" +DOMAIN = "flume" + +PLATFORMS = ["sensor"] + +DEFAULT_NAME = "Flume Sensor" + +CONF_CLIENT_ID = "client_id" +CONF_CLIENT_SECRET = "client_secret" +FLUME_TYPE_SENSOR = 2 + +FLUME_AUTH = "flume_auth" +FLUME_HTTP_SESSION = "http_session" +FLUME_DEVICES = "devices" + + +CONF_TOKEN_FILE = "token_filename" +BASE_TOKEN_FILENAME = "FLUME_TOKEN_FILE" + + +KEY_DEVICE_TYPE = "type" +KEY_DEVICE_ID = "id" +KEY_DEVICE_LOCATION = "location" +KEY_DEVICE_LOCATION_NAME = "name" diff --git a/homeassistant/components/flume/manifest.json b/homeassistant/components/flume/manifest.json index 71d0992e9fd9..b0bf08cd8fad 100644 --- a/homeassistant/components/flume/manifest.json +++ b/homeassistant/components/flume/manifest.json @@ -2,6 +2,13 @@ "domain": "flume", "name": "flume", "documentation": "https://www.home-assistant.io/integrations/flume/", - "requirements": ["pyflume==0.3.0"], - "codeowners": ["@ChrisMandich"] + "requirements": [ + "pyflume==0.4.0" + ], + "dependencies": [], + "codeowners": [ + "@ChrisMandich", + "@bdraco" + ], + "config_flow": true } diff --git a/homeassistant/components/flume/sensor.py b/homeassistant/components/flume/sensor.py index 2694842134f5..ff320f41dd1e 100644 --- a/homeassistant/components/flume/sensor.py +++ b/homeassistant/components/flume/sensor.py @@ -2,23 +2,34 @@ from datetime import timedelta import logging -from pyflume import FlumeData, FlumeDeviceList -from requests import Session +from pyflume import FlumeData import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity +from homeassistant.util import Throttle -LOGGER = logging.getLogger(__name__) +from .const import ( + CONF_CLIENT_ID, + CONF_CLIENT_SECRET, + DEFAULT_NAME, + DOMAIN, + FLUME_AUTH, + FLUME_DEVICES, + FLUME_HTTP_SESSION, + FLUME_TYPE_SENSOR, + KEY_DEVICE_ID, + KEY_DEVICE_LOCATION, + KEY_DEVICE_LOCATION_NAME, + KEY_DEVICE_TYPE, +) -DEFAULT_NAME = "Flume Sensor" - -CONF_CLIENT_ID = "client_id" -CONF_CLIENT_SECRET = "client_secret" -FLUME_TYPE_SENSOR = 2 +_LOGGER = logging.getLogger(__name__) +MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) SCAN_INTERVAL = timedelta(minutes=1) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( @@ -27,68 +38,77 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_CLIENT_ID): cv.string, vol.Required(CONF_CLIENT_SECRET): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_NAME): cv.string, } ) def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Flume sensor.""" - username = config[CONF_USERNAME] - password = config[CONF_PASSWORD] - client_id = config[CONF_CLIENT_ID] - client_secret = config[CONF_CLIENT_SECRET] - flume_token_file = hass.config.path("FLUME_TOKEN_FILE") - time_zone = str(hass.config.time_zone) - name = config[CONF_NAME] - flume_entity_list = [] + """Import the platform into a config entry.""" - http_session = Session() - - flume_devices = FlumeDeviceList( - username, - password, - client_id, - client_secret, - flume_token_file, - http_session=http_session, + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=config + ) ) - for device in flume_devices.device_list: - if device["type"] == FLUME_TYPE_SENSOR: - device_id = device["id"] - device_name = device["location"]["name"] - flume = FlumeData( - username, - password, - client_id, - client_secret, - device_id, - time_zone, - SCAN_INTERVAL, - flume_token_file, - update_on_init=False, - http_session=http_session, - ) - flume_entity_list.append( - FlumeSensor(flume, f"{name} {device_name}", device_id) - ) +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up the Flume sensor.""" + + flume_domain_data = hass.data[DOMAIN][config_entry.entry_id] + + flume_auth = flume_domain_data[FLUME_AUTH] + http_session = flume_domain_data[FLUME_HTTP_SESSION] + flume_devices = flume_domain_data[FLUME_DEVICES] + + config = config_entry.data + name = config.get(CONF_NAME, DEFAULT_NAME) + + flume_entity_list = [] + for device in flume_devices.device_list: + if device[KEY_DEVICE_TYPE] != FLUME_TYPE_SENSOR: + continue + + device_id = device[KEY_DEVICE_ID] + device_name = device[KEY_DEVICE_LOCATION][KEY_DEVICE_LOCATION_NAME] + device_friendly_name = f"{name} {device_name}" + flume_device = FlumeData( + flume_auth, + device_id, + SCAN_INTERVAL, + update_on_init=False, + http_session=http_session, + ) + flume_entity_list.append( + FlumeSensor(flume_device, device_friendly_name, device_id) + ) if flume_entity_list: - add_entities(flume_entity_list, True) + async_add_entities(flume_entity_list) class FlumeSensor(Entity): """Representation of the Flume sensor.""" - def __init__(self, flume, name, device_id): + def __init__(self, flume_device, name, device_id): """Initialize the Flume sensor.""" - self.flume = flume + self._flume_device = flume_device self._name = name self._device_id = device_id - self._state = None + self._undo_track_sensor = None self._available = False + self._state = None + + @property + def device_info(self): + """Device info for the flume sensor.""" + return { + "name": self._name, + "identifiers": {(DOMAIN, self._device_id)}, + "manufacturer": "Flume, Inc.", + "model": "Flume Smart Water Monitor", + } @property def name(self): @@ -116,11 +136,23 @@ class FlumeSensor(Entity): """Device unique ID.""" return self._device_id + @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): """Get the latest data and updates the states.""" - self._available = False - self.flume.update() - new_value = self.flume.value - if new_value is not None: - self._available = True - self._state = new_value + _LOGGER.debug("Updating flume sensor: %s", self._name) + try: + self._flume_device.update_force() + except Exception as ex: # pylint: disable=broad-except + if self._available: + _LOGGER.error("Update of flume sensor %s failed: %s", self._name, ex) + self._available = False + return + _LOGGER.debug("Successful update of flume sensor: %s", self._name) + self._state = self._flume_device.value + self._available = True + + async def async_added_to_hass(self): + """Request an update when added.""" + # We do ask for an update with async_add_entities() + # because it will update disabled entities + self.async_schedule_update_ha_state() diff --git a/homeassistant/components/flume/strings.json b/homeassistant/components/flume/strings.json new file mode 100644 index 000000000000..ed557133a9bb --- /dev/null +++ b/homeassistant/components/flume/strings.json @@ -0,0 +1,25 @@ +{ + "config" : { + "error" : { + "unknown" : "Unexpected error", + "invalid_auth" : "Invalid authentication", + "cannot_connect" : "Failed to connect, please try again" + }, + "step" : { + "user" : { + "description" : "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", + "title" : "Connect to your Flume Account", + "data" : { + "username" : "Username", + "client_secret" : "Client Secret", + "client_id" : "Client ID", + "password" : "Password" + } + } + }, + "abort" : { + "already_configured" : "This account is already configured" + }, + "title" : "Flume" + } +} diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 4d4509d74438..bbc6c7d2cfbc 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -31,6 +31,7 @@ FLOWS = [ "elkm1", "emulated_roku", "esphome", + "flume", "flunearyou", "freebox", "garmin_connect", diff --git a/requirements_all.txt b/requirements_all.txt index 4ae2a070efc3..5325986cc7e6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1283,7 +1283,7 @@ pyflexit==0.3 pyflic-homeassistant==0.4.dev0 # homeassistant.components.flume -pyflume==0.3.0 +pyflume==0.4.0 # homeassistant.components.flunearyou pyflunearyou==1.0.7 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c51f9ada7ae1..f5a436a1166b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -495,6 +495,9 @@ pyeverlights==0.1.0 # homeassistant.components.fido pyfido==2.1.1 +# homeassistant.components.flume +pyflume==0.4.0 + # homeassistant.components.flunearyou pyflunearyou==1.0.7 diff --git a/tests/components/flume/__init__.py b/tests/components/flume/__init__.py new file mode 100644 index 000000000000..9e1bf64c74d9 --- /dev/null +++ b/tests/components/flume/__init__.py @@ -0,0 +1 @@ +"""Tests for the flume integration.""" diff --git a/tests/components/flume/test_config_flow.py b/tests/components/flume/test_config_flow.py new file mode 100644 index 000000000000..6ce3391c2c63 --- /dev/null +++ b/tests/components/flume/test_config_flow.py @@ -0,0 +1,146 @@ +"""Test the flume config flow.""" +from asynctest import MagicMock, patch +import requests.exceptions + +from homeassistant import config_entries, setup +from homeassistant.components.flume.const import DOMAIN + + +def _get_mocked_flume_device_list(): + flume_device_list_mock = MagicMock() + type(flume_device_list_mock).device_list = ["mock"] + return flume_device_list_mock + + +async def test_form(hass): + """Test we get the form and can setup from user input.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + mock_flume_device_list = _get_mocked_flume_device_list() + + with patch( + "homeassistant.components.flume.config_flow.FlumeAuth", return_value=True, + ), patch( + "homeassistant.components.flume.config_flow.FlumeDeviceList", + return_value=mock_flume_device_list, + ), patch( + "homeassistant.components.flume.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.flume.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + }, + ) + + assert result2["type"] == "create_entry" + assert result2["title"] == "test-username" + assert result2["data"] == { + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_import(hass): + """Test we can import the sensor platform config.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + mock_flume_device_list = _get_mocked_flume_device_list() + + with patch( + "homeassistant.components.flume.config_flow.FlumeAuth", return_value=True, + ), patch( + "homeassistant.components.flume.config_flow.FlumeDeviceList", + return_value=mock_flume_device_list, + ), patch( + "homeassistant.components.flume.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.flume.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={ + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + }, + ) + + assert result["type"] == "create_entry" + assert result["title"] == "test-username" + assert result["data"] == { + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_invalid_auth(hass): + """Test we handle invalid auth.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.flume.config_flow.FlumeAuth", return_value=True, + ), patch( + "homeassistant.components.flume.config_flow.FlumeDeviceList", + side_effect=Exception, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + }, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "invalid_auth"} + + +async def test_form_cannot_connect(hass): + """Test we handle cannot connect error.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + with patch( + "homeassistant.components.flume.config_flow.FlumeAuth", return_value=True, + ), patch( + "homeassistant.components.flume.config_flow.FlumeDeviceList", + side_effect=requests.exceptions.ConnectionError(), + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + "username": "test-username", + "password": "test-password", + "client_id": "client_id", + "client_secret": "client_secret", + }, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "cannot_connect"} From 9a40d5b7edd1687d1258b520e78ee94ee148f717 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Thu, 9 Apr 2020 00:57:47 +0200 Subject: [PATCH 243/653] Use HTTP_NOT_FOUND constant (#33835) --- .../components/alexa/flash_briefings.py | 3 ++- homeassistant/components/auth/login_flow.py | 9 ++++--- homeassistant/components/config/__init__.py | 6 ++--- .../components/config/config_entries.py | 3 ++- .../components/haveibeenpwned/sensor.py | 10 ++++++-- .../components/media_player/__init__.py | 3 ++- .../components/thethingsnetwork/sensor.py | 4 +-- homeassistant/components/tts/__init__.py | 4 +-- homeassistant/helpers/data_entry_flow.py | 9 ++++--- .../components/alexa/test_flash_briefings.py | 3 ++- .../components/alexa/test_smart_home_http.py | 3 ++- tests/components/api/test_init.py | 2 +- tests/components/cloud/test_google_config.py | 7 +++--- tests/components/config/test_zwave.py | 15 +++++------ tests/components/ecobee/test_climate.py | 2 +- tests/components/emulated_hue/test_hue_api.py | 7 +++--- tests/components/frontend/test_init.py | 7 +++--- tests/components/generic/test_camera.py | 4 +-- tests/components/konnected/test_init.py | 25 ++++++++----------- tests/components/mailbox/test_init.py | 8 +++--- .../components/rss_feed_template/test_init.py | 3 ++- tests/components/shopping_list/test_init.py | 3 ++- .../smartthings/test_config_flow.py | 3 ++- tests/components/startca/test_sensor.py | 6 +++-- tests/components/stream/test_hls.py | 5 ++-- tests/components/stt/test_init.py | 5 ++-- tests/components/teksavvy/test_sensor.py | 4 +-- tests/components/tesla/test_config_flow.py | 8 +++--- tests/components/tts/test_init.py | 5 ++-- 29 files changed, 98 insertions(+), 78 deletions(-) diff --git a/homeassistant/components/alexa/flash_briefings.py b/homeassistant/components/alexa/flash_briefings.py index 45d31d6088af..1205fd580913 100644 --- a/homeassistant/components/alexa/flash_briefings.py +++ b/homeassistant/components/alexa/flash_briefings.py @@ -4,6 +4,7 @@ import logging import uuid from homeassistant.components import http +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.core import callback from homeassistant.helpers import template import homeassistant.util.dt as dt_util @@ -54,7 +55,7 @@ class AlexaFlashBriefingView(http.HomeAssistantView): if self.flash_briefings.get(briefing_id) is None: err = "No configured Alexa flash briefing was found for: %s" _LOGGER.error(err, briefing_id) - return b"", 404 + return b"", HTTP_NOT_FOUND briefing = [] diff --git a/homeassistant/components/auth/login_flow.py b/homeassistant/components/auth/login_flow.py index 6f8d27510181..229cbb0c9dfa 100644 --- a/homeassistant/components/auth/login_flow.py +++ b/homeassistant/components/auth/login_flow.py @@ -79,6 +79,7 @@ from homeassistant.components.http.ban import ( ) from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView +from homeassistant.const import HTTP_NOT_FOUND from . import indieauth @@ -185,7 +186,7 @@ class LoginFlowIndexView(HomeAssistantView): }, ) except data_entry_flow.UnknownHandler: - return self.json_message("Invalid handler specified", 404) + return self.json_message("Invalid handler specified", HTTP_NOT_FOUND) except data_entry_flow.UnknownStep: return self.json_message("Handler does not support init", 400) @@ -212,7 +213,7 @@ class LoginFlowResourceView(HomeAssistantView): async def get(self, request): """Do not allow getting status of a flow in progress.""" - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) @RequestDataValidator(vol.Schema({"client_id": str}, extra=vol.ALLOW_EXTRA)) @log_invalid_auth @@ -233,7 +234,7 @@ class LoginFlowResourceView(HomeAssistantView): result = await self._flow_mgr.async_configure(flow_id, data) except data_entry_flow.UnknownFlow: - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) except vol.Invalid: return self.json_message("User input malformed", 400) @@ -257,6 +258,6 @@ class LoginFlowResourceView(HomeAssistantView): try: self._flow_mgr.async_abort(flow_id) except data_entry_flow.UnknownFlow: - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) return self.json_message("Flow aborted") diff --git a/homeassistant/components/config/__init__.py b/homeassistant/components/config/__init__.py index 682e23dd14c7..12a3adbd7017 100644 --- a/homeassistant/components/config/__init__.py +++ b/homeassistant/components/config/__init__.py @@ -6,7 +6,7 @@ import os import voluptuous as vol from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CONF_ID, EVENT_COMPONENT_LOADED +from homeassistant.const import CONF_ID, EVENT_COMPONENT_LOADED, HTTP_NOT_FOUND from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.setup import ATTR_COMPONENT @@ -120,7 +120,7 @@ class BaseEditConfigView(HomeAssistantView): value = self._get_value(hass, current, config_key) if value is None: - return self.json_message("Resource not found", 404) + return self.json_message("Resource not found", HTTP_NOT_FOUND) return self.json(value) @@ -172,7 +172,7 @@ class BaseEditConfigView(HomeAssistantView): path = hass.config.path(self.path) if value is None: - return self.json_message("Resource not found", 404) + return self.json_message("Resource not found", HTTP_NOT_FOUND) self._delete_value(hass, current, config_key) await hass.async_add_executor_job(_write, path, current) diff --git a/homeassistant/components/config/config_entries.py b/homeassistant/components/config/config_entries.py index c69a3ed57391..f80d63d437a1 100644 --- a/homeassistant/components/config/config_entries.py +++ b/homeassistant/components/config/config_entries.py @@ -7,6 +7,7 @@ from homeassistant import config_entries, data_entry_flow from homeassistant.auth.permissions.const import CAT_CONFIG_ENTRIES from homeassistant.components import websocket_api from homeassistant.components.http import HomeAssistantView +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.exceptions import Unauthorized import homeassistant.helpers.config_validation as cv from homeassistant.helpers.data_entry_flow import ( @@ -105,7 +106,7 @@ class ConfigManagerEntryResourceView(HomeAssistantView): try: result = await hass.config_entries.async_remove(entry_id) except config_entries.UnknownEntry: - return self.json_message("Invalid entry specified", 404) + return self.json_message("Invalid entry specified", HTTP_NOT_FOUND) return self.json(result) diff --git a/homeassistant/components/haveibeenpwned/sensor.py b/homeassistant/components/haveibeenpwned/sensor.py index 51b06917142e..0f5a9b5ebfd8 100644 --- a/homeassistant/components/haveibeenpwned/sensor.py +++ b/homeassistant/components/haveibeenpwned/sensor.py @@ -7,7 +7,13 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_EMAIL, HTTP_OK +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_API_KEY, + CONF_EMAIL, + HTTP_NOT_FOUND, + HTTP_OK, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_point_in_time @@ -167,7 +173,7 @@ class HaveIBeenPwnedData: # the forced updates try this current email again self.set_next_email() - elif req.status_code == 404: + elif req.status_code == HTTP_NOT_FOUND: self.data[self._email] = [] # only goto next email if we had data so that diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 81f0fa010b0a..a8c87effb10a 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -19,6 +19,7 @@ from homeassistant.components import websocket_api from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView from homeassistant.const import ( HTTP_INTERNAL_SERVER_ERROR, + HTTP_NOT_FOUND, HTTP_OK, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE, @@ -865,7 +866,7 @@ class MediaPlayerImageView(HomeAssistantView): """Start a get request.""" player = self.component.get_entity(entity_id) if player is None: - status = 404 if request[KEY_AUTHENTICATED] else 401 + status = HTTP_NOT_FOUND if request[KEY_AUTHENTICATED] else 401 return web.Response(status=status) authenticated = ( diff --git a/homeassistant/components/thethingsnetwork/sensor.py b/homeassistant/components/thethingsnetwork/sensor.py index 3ba58a688fe1..35a16d30f320 100644 --- a/homeassistant/components/thethingsnetwork/sensor.py +++ b/homeassistant/components/thethingsnetwork/sensor.py @@ -8,7 +8,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONTENT_TYPE_JSON +from homeassistant.const import CONTENT_TYPE_JSON, HTTP_NOT_FOUND from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -139,7 +139,7 @@ class TtnDataStorage: _LOGGER.error("Not authorized for Application ID: %s", self._app_id) return None - if status == 404: + if status == HTTP_NOT_FOUND: _LOGGER.error("Application ID is not available: %s", self._app_id) return None diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index 726490b20302..6eeab8d6b1ef 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -22,7 +22,7 @@ from homeassistant.components.media_player.const import ( MEDIA_TYPE_MUSIC, SERVICE_PLAY_MEDIA, ) -from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM, HTTP_OK +from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM, HTTP_NOT_FOUND, HTTP_OK from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_per_platform, discovery @@ -568,6 +568,6 @@ class TextToSpeechView(HomeAssistantView): content, data = await self.tts.async_read_tts(filename) except HomeAssistantError as err: _LOGGER.error("Error on load tts: %s", err) - return web.Response(status=404) + return web.Response(status=HTTP_NOT_FOUND) return web.Response(body=data, content_type=content) diff --git a/homeassistant/helpers/data_entry_flow.py b/homeassistant/helpers/data_entry_flow.py index 2b92887eac39..951b6d4c7488 100644 --- a/homeassistant/helpers/data_entry_flow.py +++ b/homeassistant/helpers/data_entry_flow.py @@ -5,6 +5,7 @@ import voluptuous as vol from homeassistant import config_entries, data_entry_flow from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.data_validator import RequestDataValidator +from homeassistant.const import HTTP_NOT_FOUND import homeassistant.helpers.config_validation as cv # mypy: allow-untyped-calls, allow-untyped-defs @@ -62,7 +63,7 @@ class FlowManagerIndexView(_BaseFlowManagerView): handler, context={"source": config_entries.SOURCE_USER} ) except data_entry_flow.UnknownHandler: - return self.json_message("Invalid handler specified", 404) + return self.json_message("Invalid handler specified", HTTP_NOT_FOUND) except data_entry_flow.UnknownStep: return self.json_message("Handler does not support user", 400) @@ -79,7 +80,7 @@ class FlowManagerResourceView(_BaseFlowManagerView): try: result = await self._flow_mgr.async_configure(flow_id) except data_entry_flow.UnknownFlow: - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) result = self._prepare_result_json(result) @@ -91,7 +92,7 @@ class FlowManagerResourceView(_BaseFlowManagerView): try: result = await self._flow_mgr.async_configure(flow_id, data) except data_entry_flow.UnknownFlow: - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) except vol.Invalid: return self.json_message("User input malformed", 400) @@ -104,6 +105,6 @@ class FlowManagerResourceView(_BaseFlowManagerView): try: self._flow_mgr.async_abort(flow_id) except data_entry_flow.UnknownFlow: - return self.json_message("Invalid flow specified", 404) + return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) return self.json_message("Flow aborted") diff --git a/tests/components/alexa/test_flash_briefings.py b/tests/components/alexa/test_flash_briefings.py index d459ee2cc322..14dbe7336fb0 100644 --- a/tests/components/alexa/test_flash_briefings.py +++ b/tests/components/alexa/test_flash_briefings.py @@ -6,6 +6,7 @@ import pytest from homeassistant.components import alexa from homeassistant.components.alexa import const +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.core import callback from homeassistant.setup import async_setup_component @@ -69,7 +70,7 @@ def _flash_briefing_req(client, briefing_id): async def test_flash_briefing_invalid_id(alexa_client): """Test an invalid Flash Briefing ID.""" req = await _flash_briefing_req(alexa_client, 10000) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND text = await req.text() assert text == "" diff --git a/tests/components/alexa/test_smart_home_http.py b/tests/components/alexa/test_smart_home_http.py index f242a421eac2..46db47dc2c94 100644 --- a/tests/components/alexa/test_smart_home_http.py +++ b/tests/components/alexa/test_smart_home_http.py @@ -2,6 +2,7 @@ import json from homeassistant.components.alexa import DOMAIN, smart_home_http +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from . import get_new_request @@ -38,4 +39,4 @@ async def test_http_api_disabled(hass, hass_client): config = {"alexa": {}} response = await do_http_discovery(config, hass, hass_client) - assert response.status == 404 + assert response.status == HTTP_NOT_FOUND diff --git a/tests/components/api/test_init.py b/tests/components/api/test_init.py index 4417f3d4f91f..e73b65661c92 100644 --- a/tests/components/api/test_init.py +++ b/tests/components/api/test_init.py @@ -52,7 +52,7 @@ async def test_api_get_state(hass, mock_api_client): async def test_api_get_non_existing_state(hass, mock_api_client): """Test if the debug interface allows us to get a state.""" resp = await mock_api_client.get("/api/states/does_not_exist") - assert resp.status == 404 + assert resp.status == const.HTTP_NOT_FOUND async def test_api_state_change(hass, mock_api_client): diff --git a/tests/components/cloud/test_google_config.py b/tests/components/cloud/test_google_config.py index 4f08c4c37d0d..1070730ba96b 100644 --- a/tests/components/cloud/test_google_config.py +++ b/tests/components/cloud/test_google_config.py @@ -4,6 +4,7 @@ from unittest.mock import Mock, patch from homeassistant.components.cloud import GACTIONS_SCHEMA from homeassistant.components.cloud.google_config import CloudGoogleConfig from homeassistant.components.google_assistant import helpers as ga_helpers +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED from homeassistant.util.dt import utcnow @@ -41,14 +42,14 @@ async def test_sync_entities(aioclient_mock, hass, cloud_prefs): GACTIONS_SCHEMA({}), "mock-user-id", cloud_prefs, - Mock(auth=Mock(async_check_token=Mock(side_effect=mock_coro)),), + Mock(auth=Mock(async_check_token=Mock(side_effect=mock_coro))), ) with patch( "hass_nabucasa.cloud_api.async_google_actions_request_sync", - return_value=mock_coro(Mock(status=404)), + return_value=mock_coro(Mock(status=HTTP_NOT_FOUND)), ) as mock_request_sync: - assert await config.async_sync_entities("user") == 404 + assert await config.async_sync_entities("user") == HTTP_NOT_FOUND assert len(mock_request_sync.mock_calls) == 1 diff --git a/tests/components/config/test_zwave.py b/tests/components/config/test_zwave.py index 059cdb1f1e8c..3624554843a7 100644 --- a/tests/components/config/test_zwave.py +++ b/tests/components/config/test_zwave.py @@ -7,6 +7,7 @@ import pytest from homeassistant.bootstrap import async_setup_component from homeassistant.components import config from homeassistant.components.zwave import DATA_NETWORK, const +from homeassistant.const import HTTP_NOT_FOUND from tests.mock.zwave import MockEntityValues, MockNode, MockValue @@ -181,7 +182,7 @@ async def test_get_groups_nonode(hass, client): resp = await client.get("/api/zwave/groups/2") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert result == {"message": "Node not found"} @@ -244,7 +245,7 @@ async def test_get_config_nonode(hass, client): resp = await client.get("/api/zwave/config/2") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert result == {"message": "Node not found"} @@ -257,7 +258,7 @@ async def test_get_usercodes_nonode(hass, client): resp = await client.get("/api/zwave/usercodes/2") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert result == {"message": "Node not found"} @@ -323,7 +324,7 @@ async def test_save_config_no_network(hass, client): """Test saving configuration without network data.""" resp = await client.post("/api/zwave/saveconfig") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert result == {"message": "No Z-Wave network data found"} @@ -400,7 +401,7 @@ async def test_get_protection_values_nonexisting_node(hass, client): resp = await client.get("/api/zwave/protection/18") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert not node.get_protections.called assert not node.get_protection_item.called @@ -515,7 +516,7 @@ async def test_set_protection_value_nonexisting_node(hass, client): data=json.dumps({"value_id": "123456", "selection": "Protecton by Sequence"}), ) - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert not node.set_protection.called assert result == {"message": "Node not found"} @@ -535,7 +536,7 @@ async def test_set_protection_value_missing_class(hass, client): data=json.dumps({"value_id": "123456", "selection": "Protecton by Sequence"}), ) - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND result = await resp.json() assert not node.set_protection.called assert result == {"message": "No protection commandclass on this node"} diff --git a/tests/components/ecobee/test_climate.py b/tests/components/ecobee/test_climate.py index 0c0ca7850267..63476a9b7175 100644 --- a/tests/components/ecobee/test_climate.py +++ b/tests/components/ecobee/test_climate.py @@ -64,7 +64,7 @@ class TestEcobee(unittest.TestCase): def test_current_temperature(self): """Test current temperature.""" assert 30 == self.thermostat.current_temperature - self.ecobee["runtime"]["actualTemperature"] = 404 + self.ecobee["runtime"]["actualTemperature"] = const.HTTP_NOT_FOUND assert 40.4 == self.thermostat.current_temperature def test_target_temperature_low(self): diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index e9925132b005..a6b4113e3140 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -34,6 +34,7 @@ from homeassistant.components.emulated_hue.hue_api import ( ) from homeassistant.const import ( ATTR_ENTITY_ID, + HTTP_NOT_FOUND, SERVICE_TURN_OFF, SERVICE_TURN_ON, STATE_OFF, @@ -450,7 +451,7 @@ async def test_put_light_state(hass_hue, hue_client): kitchen_result = await perform_put_light_state( hass_hue, hue_client, "light.kitchen_light", True ) - assert kitchen_result.status == 404 + assert kitchen_result.status == HTTP_NOT_FOUND async def test_put_light_state_script(hass_hue, hue_client): @@ -684,11 +685,11 @@ async def test_entity_not_found(hue_client): """Test for entity which are not found.""" result = await hue_client.get("/api/username/lights/not.existant_entity") - assert result.status == 404 + assert result.status == HTTP_NOT_FOUND result = await hue_client.put("/api/username/lights/not.existant_entity/state") - assert result.status == 404 + assert result.status == HTTP_NOT_FOUND async def test_allowed_methods(hue_client): diff --git a/tests/components/frontend/test_init.py b/tests/components/frontend/test_init.py index 36243972fb6d..2d07fb333142 100644 --- a/tests/components/frontend/test_init.py +++ b/tests/components/frontend/test_init.py @@ -13,6 +13,7 @@ from homeassistant.components.frontend import ( EVENT_PANELS_UPDATED, ) from homeassistant.components.websocket_api.const import TYPE_RESULT +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from tests.common import async_capture_events, mock_coro @@ -97,7 +98,7 @@ async def test_dont_cache_service_worker(mock_http_client): async def test_404(mock_http_client): """Test for HTTP 404 error.""" resp = await mock_http_client.get("/not-existing") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND async def test_we_cannot_POST_to_root(mock_http_client): @@ -219,7 +220,7 @@ async def test_get_panels(hass, hass_ws_client, mock_http_client): events = async_capture_events(hass, EVENT_PANELS_UPDATED) resp = await mock_http_client.get("/map") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND hass.components.frontend.async_register_built_in_panel( "map", "Map", "mdi:tooltip-account", require_admin=True @@ -247,7 +248,7 @@ async def test_get_panels(hass, hass_ws_client, mock_http_client): hass.components.frontend.async_remove_panel("map") resp = await mock_http_client.get("/map") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND assert len(events) == 2 diff --git a/tests/components/generic/test_camera.py b/tests/components/generic/test_camera.py index 9b0466dda937..e519e0f94163 100644 --- a/tests/components/generic/test_camera.py +++ b/tests/components/generic/test_camera.py @@ -2,7 +2,7 @@ import asyncio from unittest import mock -from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR, HTTP_NOT_FOUND from homeassistant.setup import async_setup_component @@ -94,7 +94,7 @@ async def test_limit_refetch(aioclient_mock, hass, hass_client): aioclient_mock.get("http://example.com/5a", text="hello world") aioclient_mock.get("http://example.com/10a", text="hello world") aioclient_mock.get("http://example.com/15a", text="hello planet") - aioclient_mock.get("http://example.com/20a", status=404) + aioclient_mock.get("http://example.com/20a", status=HTTP_NOT_FOUND) await async_setup_component( hass, diff --git a/tests/components/konnected/test_init.py b/tests/components/konnected/test_init.py index 2a9c3f8cd4fc..280712912662 100644 --- a/tests/components/konnected/test_init.py +++ b/tests/components/konnected/test_init.py @@ -4,6 +4,7 @@ import pytest from homeassistant.components import konnected from homeassistant.components.konnected import config_flow +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from tests.common import MockConfigEntry @@ -254,7 +255,7 @@ async def test_setup_defined_hosts_known_auth(hass): config_flow.CONF_ID: "aabbccddeeff", config_flow.CONF_HOST: "0.0.0.0", config_flow.CONF_PORT: 1234, - }, + } ], } }, @@ -303,11 +304,7 @@ async def test_setup_multiple(hass): { konnected.CONF_ID: "aabbccddeeff", "binary_sensors": [ - { - "zone": 4, - "type": "motion", - "name": "Hallway Motion", - }, + {"zone": 4, "type": "motion", "name": "Hallway Motion"}, { "zone": 5, "type": "window", @@ -334,7 +331,7 @@ async def test_setup_multiple(hass): "momentary": 65, "pause": 55, "repeat": 4, - }, + } ], }, ], @@ -469,23 +466,23 @@ async def test_api(hass, aiohttp_client, mock_panel): # Test the get endpoint for switch status polling resp = await client.get("/api/konnected") - assert resp.status == 404 # no device provided + assert resp.status == HTTP_NOT_FOUND # no device provided resp = await client.get("/api/konnected/223344556677") - assert resp.status == 404 # unknown device provided + assert resp.status == HTTP_NOT_FOUND # unknown device provided resp = await client.get("/api/konnected/device/112233445566") - assert resp.status == 404 # no zone provided + assert resp.status == HTTP_NOT_FOUND # no zone provided result = await resp.json() assert result == {"message": "Switch on zone or pin unknown not configured"} resp = await client.get("/api/konnected/device/112233445566?zone=8") - assert resp.status == 404 # invalid zone + assert resp.status == HTTP_NOT_FOUND # invalid zone result = await resp.json() assert result == {"message": "Switch on zone or pin 8 not configured"} resp = await client.get("/api/konnected/device/112233445566?pin=12") - assert resp.status == 404 # invalid pin + assert resp.status == HTTP_NOT_FOUND # invalid pin result = await resp.json() assert result == {"message": "Switch on zone or pin 12 not configured"} @@ -501,7 +498,7 @@ async def test_api(hass, aiohttp_client, mock_panel): # Test the post endpoint for sensor updates resp = await client.post("/api/konnected/device", json={"zone": "1", "state": 1}) - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND resp = await client.post( "/api/konnected/device/112233445566", json={"zone": "1", "state": 1} @@ -622,7 +619,7 @@ async def test_state_updates(hass, aiohttp_client, mock_panel): entry.add_to_hass(hass) # Add empty data field to ensure we process it correctly (possible if entry is ignored) - entry = MockConfigEntry(domain="konnected", title="Konnected Alarm Panel", data={},) + entry = MockConfigEntry(domain="konnected", title="Konnected Alarm Panel", data={}) entry.add_to_hass(hass) assert ( diff --git a/tests/components/mailbox/test_init.py b/tests/components/mailbox/test_init.py index f35c763bf741..a2b2583bdb53 100644 --- a/tests/components/mailbox/test_init.py +++ b/tests/components/mailbox/test_init.py @@ -5,7 +5,7 @@ import pytest from homeassistant.bootstrap import async_setup_component import homeassistant.components.mailbox as mailbox -from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR, HTTP_NOT_FOUND @pytest.fixture @@ -73,7 +73,7 @@ async def test_get_messages_from_invalid_mailbox(mock_http_client): url = "/api/mailbox/messages/mailbox.invalid_mailbox" req = await mock_http_client.get(url) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND async def test_get_media_from_invalid_mailbox(mock_http_client): @@ -82,7 +82,7 @@ async def test_get_media_from_invalid_mailbox(mock_http_client): url = "/api/mailbox/media/mailbox.invalid_mailbox/%s" % (msgsha) req = await mock_http_client.get(url) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND async def test_get_media_from_invalid_msgid(mock_http_client): @@ -100,4 +100,4 @@ async def test_delete_from_invalid_mailbox(mock_http_client): url = "/api/mailbox/delete/mailbox.invalid_mailbox/%s" % (msgsha) req = await mock_http_client.delete(url) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND diff --git a/tests/components/rss_feed_template/test_init.py b/tests/components/rss_feed_template/test_init.py index fe06c6d8c1a6..e0637b709e05 100644 --- a/tests/components/rss_feed_template/test_init.py +++ b/tests/components/rss_feed_template/test_init.py @@ -2,6 +2,7 @@ from defusedxml import ElementTree import pytest +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component @@ -29,7 +30,7 @@ def mock_http_client(loop, hass, hass_client): async def test_get_nonexistant_feed(mock_http_client): """Test if we can retrieve the correct rss feed.""" resp = await mock_http_client.get("/api/rss_template/otherfeed") - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND async def test_get_rss_feed(mock_http_client, hass): diff --git a/tests/components/shopping_list/test_init.py b/tests/components/shopping_list/test_init.py index 82b0d9b455d7..b89301146658 100644 --- a/tests/components/shopping_list/test_init.py +++ b/tests/components/shopping_list/test_init.py @@ -1,6 +1,7 @@ """Test shopping list component.""" from homeassistant.components.websocket_api.const import TYPE_RESULT +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.helpers import intent @@ -171,7 +172,7 @@ async def test_api_update_fails(hass, hass_client, sl_setup): client = await hass_client() resp = await client.post("/api/shopping_list/non_existing", json={"name": "soda"}) - assert resp.status == 404 + assert resp.status == HTTP_NOT_FOUND beer_id = hass.data["shopping_list"].items[0]["id"] resp = await client.post(f"/api/shopping_list/item/{beer_id}", json={"name": 123}) diff --git a/tests/components/smartthings/test_config_flow.py b/tests/components/smartthings/test_config_flow.py index f299727b948f..0d533910b544 100644 --- a/tests/components/smartthings/test_config_flow.py +++ b/tests/components/smartthings/test_config_flow.py @@ -15,6 +15,7 @@ from homeassistant.components.smartthings.const import ( CONF_REFRESH_TOKEN, DOMAIN, ) +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from tests.common import MockConfigEntry, mock_coro @@ -160,7 +161,7 @@ async def test_unknown_api_error(hass, smartthings_mock): request_info = Mock(real_url="http://example.com") smartthings_mock.apps.side_effect = ClientResponseError( - request_info=request_info, history=None, status=404 + request_info=request_info, history=None, status=HTTP_NOT_FOUND ) result = await flow.async_step_user({"access_token": str(uuid4())}) diff --git a/tests/components/startca/test_sensor.py b/tests/components/startca/test_sensor.py index 23cc892900b5..f3c6af51df5d 100644 --- a/tests/components/startca/test_sensor.py +++ b/tests/components/startca/test_sensor.py @@ -1,7 +1,7 @@ """Tests for the Start.ca sensor platform.""" from homeassistant.bootstrap import async_setup_component from homeassistant.components.startca.sensor import StartcaData -from homeassistant.const import DATA_GIGABYTES, UNIT_PERCENTAGE +from homeassistant.const import DATA_GIGABYTES, HTTP_NOT_FOUND, UNIT_PERCENTAGE from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -197,7 +197,9 @@ async def test_unlimited_setup(hass, aioclient_mock): async def test_bad_return_code(hass, aioclient_mock): """Test handling a return code that isn't HTTP OK.""" - aioclient_mock.get("https://www.start.ca/support/usage/api?key=NOTAKEY", status=404) + aioclient_mock.get( + "https://www.start.ca/support/usage/api?key=NOTAKEY", status=HTTP_NOT_FOUND + ) scd = StartcaData(hass.loop, async_get_clientsession(hass), "NOTAKEY", 400) diff --git a/tests/components/stream/test_hls.py b/tests/components/stream/test_hls.py index 888f56efb293..3de50d3309c1 100644 --- a/tests/components/stream/test_hls.py +++ b/tests/components/stream/test_hls.py @@ -5,6 +5,7 @@ from urllib.parse import urlparse import pytest from homeassistant.components.stream import request_stream +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -49,7 +50,7 @@ async def test_hls_stream(hass, hass_client): # Ensure playlist not accessible after stream ends fail_response = await http_client.get(parsed_url.path) - assert fail_response.status == 404 + assert fail_response.status == HTTP_NOT_FOUND @pytest.mark.skip("Flaky in CI") @@ -86,7 +87,7 @@ async def test_stream_timeout(hass, hass_client): # Ensure playlist not accessible fail_response = await http_client.get(parsed_url.path) - assert fail_response.status == 404 + assert fail_response.status == HTTP_NOT_FOUND @pytest.mark.skip("Flaky in CI") diff --git a/tests/components/stt/test_init.py b/tests/components/stt/test_init.py index 1e69fa2494ad..9658ab921409 100644 --- a/tests/components/stt/test_init.py +++ b/tests/components/stt/test_init.py @@ -1,6 +1,7 @@ """Test STT component setup.""" from homeassistant.components import stt +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component @@ -16,7 +17,7 @@ async def test_demo_settings_not_exists(hass, hass_client): response = await client.get("/api/stt/beer") - assert response.status == 404 + assert response.status == HTTP_NOT_FOUND async def test_demo_speech_not_exists(hass, hass_client): @@ -26,4 +27,4 @@ async def test_demo_speech_not_exists(hass, hass_client): response = await client.post("/api/stt/beer", data=b"test") - assert response.status == 404 + assert response.status == HTTP_NOT_FOUND diff --git a/tests/components/teksavvy/test_sensor.py b/tests/components/teksavvy/test_sensor.py index e3e7eae36a84..049a1ddc60c2 100644 --- a/tests/components/teksavvy/test_sensor.py +++ b/tests/components/teksavvy/test_sensor.py @@ -1,7 +1,7 @@ """Tests for the TekSavvy sensor platform.""" from homeassistant.bootstrap import async_setup_component from homeassistant.components.teksavvy.sensor import TekSavvyData -from homeassistant.const import DATA_GIGABYTES, UNIT_PERCENTAGE +from homeassistant.const import DATA_GIGABYTES, HTTP_NOT_FOUND, UNIT_PERCENTAGE from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -173,7 +173,7 @@ async def test_bad_return_code(hass, aioclient_mock): "https://api.teksavvy.com/" "web/Usage/UsageSummaryRecords?" "$filter=IsCurrent%20eq%20true", - status=404, + status=HTTP_NOT_FOUND, ) tsd = TekSavvyData(hass.loop, async_get_clientsession(hass), "notakey", 400) diff --git a/tests/components/tesla/test_config_flow.py b/tests/components/tesla/test_config_flow.py index 00e7ba78cc11..8698fddbeabc 100644 --- a/tests/components/tesla/test_config_flow.py +++ b/tests/components/tesla/test_config_flow.py @@ -17,6 +17,7 @@ from homeassistant.const import ( CONF_SCAN_INTERVAL, CONF_TOKEN, CONF_USERNAME, + HTTP_NOT_FOUND, ) from tests.common import MockConfigEntry, mock_coro @@ -81,7 +82,7 @@ async def test_form_cannot_connect(hass): with patch( "homeassistant.components.tesla.config_flow.TeslaAPI.connect", - side_effect=TeslaException(code=404), + side_effect=TeslaException(code=HTTP_NOT_FOUND), ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -147,10 +148,7 @@ async def test_option_flow(hass): user_input={CONF_SCAN_INTERVAL: 350, CONF_WAKE_ON_START: True}, ) assert result["type"] == "create_entry" - assert result["data"] == { - CONF_SCAN_INTERVAL: 350, - CONF_WAKE_ON_START: True, - } + assert result["data"] == {CONF_SCAN_INTERVAL: 350, CONF_WAKE_ON_START: True} async def test_option_flow_defaults(hass): diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index c6b847c313e2..8b516e4bf9fb 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -16,6 +16,7 @@ from homeassistant.components.media_player.const import ( ) import homeassistant.components.tts as tts from homeassistant.components.tts import _get_cache_files +from homeassistant.const import HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from tests.common import assert_setup_component, async_mock_service @@ -500,7 +501,7 @@ async def test_setup_component_and_web_view_wrong_file(hass, hass_client): url = "/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_en_-_demo.mp3" req = await client.get(url) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND async def test_setup_component_and_web_view_wrong_filename(hass, hass_client): @@ -515,7 +516,7 @@ async def test_setup_component_and_web_view_wrong_filename(hass, hass_client): url = "/api/tts_proxy/265944dsk32c1b2a621be5930510bb2cd_en_-_demo.mp3" req = await client.get(url) - assert req.status == 404 + assert req.status == HTTP_NOT_FOUND async def test_setup_component_test_without_cache(hass, empty_cache_dir): From 7cc683658b9d6bca86cc0cd3c4c0a2986d93d4f1 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 9 Apr 2020 00:07:25 +0000 Subject: [PATCH 244/653] [ci skip] Translation update --- .../components/doorbird/.translations/ru.json | 2 +- .../components/elkm1/.translations/ru.json | 6 +- .../components/flume/.translations/en.json | 46 +++++----- .../components/nuheat/.translations/ru.json | 2 +- .../components/nut/.translations/ca.json | 13 +++ .../components/nut/.translations/en.json | 88 ++++++++++--------- .../components/nut/.translations/ru.json | 13 +++ .../pvpc_hourly_pricing/.translations/ca.json | 2 +- .../components/rachio/.translations/ru.json | 2 +- 9 files changed, 102 insertions(+), 72 deletions(-) diff --git a/homeassistant/components/doorbird/.translations/ru.json b/homeassistant/components/doorbird/.translations/ru.json index 1c034d6d68b4..589de2b6838d 100644 --- a/homeassistant/components/doorbird/.translations/ru.json +++ b/homeassistant/components/doorbird/.translations/ru.json @@ -15,7 +15,7 @@ "user": { "data": { "host": "\u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \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", "username": "\u041b\u043e\u0433\u0438\u043d" }, diff --git a/homeassistant/components/elkm1/.translations/ru.json b/homeassistant/components/elkm1/.translations/ru.json index 11e04ad816c6..d33fb66f122f 100644 --- a/homeassistant/components/elkm1/.translations/ru.json +++ b/homeassistant/components/elkm1/.translations/ru.json @@ -13,13 +13,13 @@ "user": { "data": { "address": "IP-\u0430\u0434\u0440\u0435\u0441, \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442.", - "password": "\u041f\u0430\u0440\u043e\u043b\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0438 'secure')", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'secure')", "prefix": "\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 (\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0435\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d ElkM1).", "protocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b", "temperature_unit": "\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", - "username": "\u041b\u043e\u0433\u0438\u043d (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0438 'secure')" + "username": "\u041b\u043e\u0433\u0438\u043d (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'secure')" }, - "description": "\u0421\u0442\u0440\u043e\u043a\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0435 'addres[:port]' \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0439 'secure' \u0438 'non-secure'. \u041f\u0440\u0438\u043c\u0435\u0440: '192.168.1.1'. \u041f\u043e\u0440\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 2101 \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0438 'non-secure'\u00bb \u0438 2601 \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0438 'secure'\u00bb. \u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0435 'tty[:baud]'. \u041f\u0440\u0438\u043c\u0435\u0440: '/dev/ttyS1'. Baud \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u0435\u043d 115200.", + "description": "\u0421\u0442\u0440\u043e\u043a\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'addres[:port]' (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: '192.168.1.1'). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 'port' \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 2101 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'non-secure' \u0438 2601 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'secure'. \u0414\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'serial' \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'tty[:baud]' (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: '/dev/ttyS1'). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 'baud' \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u0435\u043d 115200.", "title": "Elk-M1 Control" } }, diff --git a/homeassistant/components/flume/.translations/en.json b/homeassistant/components/flume/.translations/en.json index ed557133a9bb..e9fa25b30fbd 100644 --- a/homeassistant/components/flume/.translations/en.json +++ b/homeassistant/components/flume/.translations/en.json @@ -1,25 +1,25 @@ { - "config" : { - "error" : { - "unknown" : "Unexpected error", - "invalid_auth" : "Invalid authentication", - "cannot_connect" : "Failed to connect, please try again" - }, - "step" : { - "user" : { - "description" : "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", - "title" : "Connect to your Flume Account", - "data" : { - "username" : "Username", - "client_secret" : "Client Secret", - "client_id" : "Client ID", - "password" : "Password" + "config": { + "abort": { + "already_configured": "This account is already configured" + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "client_id": "Client ID", + "client_secret": "Client Secret", + "password": "Password", + "username": "Username" + }, + "description": "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", + "title": "Connect to your Flume Account" } - } - }, - "abort" : { - "already_configured" : "This account is already configured" - }, - "title" : "Flume" - } -} + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ru.json b/homeassistant/components/nuheat/.translations/ru.json index 9a2ff139dd2e..e7ba18d393a6 100644 --- a/homeassistant/components/nuheat/.translations/ru.json +++ b/homeassistant/components/nuheat/.translations/ru.json @@ -13,7 +13,7 @@ "user": { "data": { "password": "\u041f\u0430\u0440\u043e\u043b\u044c", - "serial_number": "\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430.", + "serial_number": "\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430", "username": "\u041b\u043e\u0433\u0438\u043d" }, "description": "\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0438\u043b\u0438 ID \u0412\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430, \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 https://MyNuHeat.com.", diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index 0c81dfb3ec75..ddca023d728a 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -8,6 +8,19 @@ "unknown": "Error inesperat" }, "step": { + "resources": { + "data": { + "resources": "Recursos" + }, + "title": "Selecciona els recursos a monitoritzar" + }, + "ups": { + "data": { + "alias": "\u00c0lies", + "resources": "Recursos" + }, + "title": "Selecciona el SAI (UPS) a monitoritzar" + }, "user": { "data": { "alias": "\u00c0lies", diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index 6519d914df23..939fa7c9cbe3 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -1,46 +1,50 @@ { - "config": { - "title": "Network UPS Tools (NUT)", - "step": { - "user": { - "title": "Connect to the NUT server", - "data": { - "host": "Host", - "port": "Port", - "username": "Username", - "password": "Password" - } - }, - "ups": { - "title": "Choose the UPS to Monitor", - "data": { - "alias": "Alias", - "resources": "Resources" - } - }, - "resources": { - "title": "Choose the Resources to Monitor", - "data": { - "resources": "Resources" - } - } + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "step": { + "resources": { + "data": { + "resources": "Resources" + }, + "title": "Choose the Resources to Monitor" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Resources" + }, + "title": "Choose the UPS to Monitor" + }, + "user": { + "data": { + "alias": "Alias", + "host": "Host", + "name": "Name", + "password": "Password", + "port": "Port", + "resources": "Resources", + "username": "Username" + }, + "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", + "title": "Connect to the NUT server" + } + }, + "title": "Network UPS Tools (NUT)" }, - "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" - }, - "abort": { - "already_configured": "Device is already configured" - } - }, - "options": { - "step": { - "init": { - "description": "Choose Sensor Resources.", - "data": { - "resources": "Resources" + "options": { + "step": { + "init": { + "data": { + "resources": "Resources" + }, + "description": "Choose Sensor Resources." + } } - } } - } -} +} \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json index 7bc48ec2e3f6..706a98936f28 100644 --- a/homeassistant/components/nut/.translations/ru.json +++ b/homeassistant/components/nut/.translations/ru.json @@ -8,6 +8,19 @@ "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." }, "step": { + "resources": { + "data": { + "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b" + }, + "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430" + }, + "ups": { + "data": { + "alias": "\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c", + "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b" + }, + "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0418\u0411\u041f \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430" + }, "user": { "data": { "alias": "\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c", diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json index 0a7af79fab38..db996c75c39b 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json @@ -9,7 +9,7 @@ "name": "Nom del sensor", "tariff": "Tarifa contractada (1, 2 o 3 per\u00edodes)" }, - "description": "Aquest sensor utilitza l'API oficial de la xarxa el\u00e8ctrica espanyola (REE) per obtenir els [preus per hora de l\u2019electricitat (PVPC)](https://www.esios.ree.es/es/pvpc) a Espanya.\nPer a m\u00e9s informaci\u00f3, consulta la [documentaci\u00f3 de la integraci\u00f3](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/). \n\nSelecciona la tarifa contractada, en funci\u00f3 del nombre de per\u00edodes que t\u00e9: \n - 1 per\u00edode: normal (sense discriminaci\u00f3)\n - 2 per\u00edodes: discriminaci\u00f3 (tarifa nocturna) \n - 3 per\u00edodes: cotxe el\u00e8ctric (tarifa nocturna de 3 per\u00edodes)", + "description": "Aquest sensor utilitza l'API oficial de la xarxa el\u00e8ctrica espanyola (REE) per obtenir els [preus per hora de l\u2019electricitat (PVPC)](https://www.esios.ree.es/es/pvpc) a Espanya.\nPer a m\u00e9s informaci\u00f3, consulta la [documentaci\u00f3 de la integraci\u00f3](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/). \n\nSelecciona la tarifa contractada, cadascuna t\u00e9 un nombre determinat de per\u00edodes: \n - 1 per\u00edode: normal (sense discriminaci\u00f3)\n - 2 per\u00edodes: discriminaci\u00f3 (tarifa nocturna) \n - 3 per\u00edodes: cotxe el\u00e8ctric (tarifa nocturna de 3 per\u00edodes)", "title": "Selecci\u00f3 de tarifa" } }, diff --git a/homeassistant/components/rachio/.translations/ru.json b/homeassistant/components/rachio/.translations/ru.json index 619f5d4bb0e4..cb97cdac9dca 100644 --- a/homeassistant/components/rachio/.translations/ru.json +++ b/homeassistant/components/rachio/.translations/ru.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "api_key": "\u041a\u043b\u044e\u0447 API \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Rachio." + "api_key": "\u041a\u043b\u044e\u0447 API \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Rachio" }, "description": "\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u044e\u0447 API \u043e\u0442 https://app.rach.io/. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 'Account Settings', \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 'GET API KEY'.", "title": "Rachio" From bdb998bdb3e2a3f867ccee7a0d30e306fe85be6c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 8 Apr 2020 17:18:09 -0700 Subject: [PATCH 245/653] Fix last flaky TTS test (#33849) --- tests/components/tts/test_init.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py index 8b516e4bf9fb..61bb78a0827e 100644 --- a/tests/components/tts/test_init.py +++ b/tests/components/tts/test_init.py @@ -1,6 +1,5 @@ """The tests for the TTS component.""" import ctypes -import os from unittest.mock import PropertyMock, patch import pytest @@ -311,12 +310,11 @@ async def test_setup_component_and_test_with_service_options_def(hass, empty_cac ] == "{}/api/tts_proxy/42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{}_demo.mp3".format( hass.config.api.base_url, opt_hash ) - assert os.path.isfile( - os.path.join( - empty_cache_dir, - f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3", - ) - ) + await hass.async_block_till_done() + assert ( + empty_cache_dir + / f"42f18378fd4393d18c8dd11d03fa9563c1e54491_de_{opt_hash}_demo.mp3" + ).is_file() async def test_setup_component_and_test_service_with_service_options_wrong( From 8be7cb4539e6083e40fe99f6f7fad2bf27abe27a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 20:26:10 -0500 Subject: [PATCH 246/653] Update nut to use DataUpdateCoordinator (#33831) * Convert nut to use DataUpdateCoordinator * Adjust per review * ups_list is a dict with {id: name, ...} --- homeassistant/components/nut/__init__.py | 44 +++++++++---- homeassistant/components/nut/config_flow.py | 18 ++---- homeassistant/components/nut/const.py | 3 +- homeassistant/components/nut/sensor.py | 71 +++++++++++---------- tests/components/nut/test_config_flow.py | 6 +- 5 files changed, 81 insertions(+), 61 deletions(-) diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index 793dd5f2f3e8..de1bcca5b31d 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -1,7 +1,9 @@ """The nut component.""" import asyncio +from datetime import timedelta import logging +import async_timeout from pynut2.nut2 import PyNUTClient, PyNUTError from homeassistant.config_entries import ConfigEntry @@ -15,8 +17,10 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import ( + COORDINATOR, DOMAIN, PLATFORMS, PYNUT_DATA, @@ -24,7 +28,6 @@ from .const import ( PYNUT_MANUFACTURER, PYNUT_MODEL, PYNUT_NAME, - PYNUT_STATUS, PYNUT_UNIQUE_ID, ) @@ -51,7 +54,22 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): data = PyNUTData(host, port, alias, username, password) - status = await hass.async_add_executor_job(pynutdata_status, data) + async def async_update_data(): + """Fetch data from NUT.""" + async with async_timeout.timeout(10): + return await hass.async_add_executor_job(data.update) + + coordinator = DataUpdateCoordinator( + hass, + _LOGGER, + name="NUT resource status", + update_method=async_update_data, + update_interval=timedelta(seconds=60), + ) + + # Fetch initial data so we have data when entities subscribe + await coordinator.async_refresh() + status = data.status if not status: _LOGGER.error("NUT Sensor has no data, unable to set up") @@ -60,8 +78,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): _LOGGER.debug("NUT Sensors Available: %s", status) hass.data[DOMAIN][entry.entry_id] = { + COORDINATOR: coordinator, PYNUT_DATA: data, - PYNUT_STATUS: status, PYNUT_UNIQUE_ID: _unique_id_from_status(status), PYNUT_MANUFACTURER: _manufacturer_from_status(status), PYNUT_MODEL: _model_from_status(status), @@ -143,11 +161,6 @@ def find_resources_in_config_entry(config_entry): return config_entry.data[CONF_RESOURCES] -def pynutdata_status(data): - """Wrap for data update as a callable.""" - return data.status - - async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): """Unload a config entry.""" unload_ok = all( @@ -180,12 +193,12 @@ class PyNUTData: # Establish client with persistent=False to open/close connection on # each update call. This is more reliable with async. self._client = PyNUTClient(self._host, port, username, password, 5, False) + self.ups_list = None self._status = None @property def status(self): """Get latest update if throttle allows. Return status.""" - self.update() return self._status @property @@ -193,18 +206,21 @@ class PyNUTData: """Return the name of the ups.""" return self._alias - def list_ups(self): - """List UPSes connected to the NUT server.""" - return self._client.list_ups() - def _get_alias(self): """Get the ups alias from NUT.""" try: - return next(iter(self.list_ups())) + ups_list = self._client.list_ups() except PyNUTError as err: _LOGGER.error("Failure getting NUT ups alias, %s", err) return None + if not ups_list: + _LOGGER.error("Empty list while getting NUT ups aliases") + return None + + self.ups_list = ups_list + return list(ups_list)[0] + def _get_status(self): """Get the ups status from NUT.""" if self._alias is None: diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index 53bfe7554ea2..505fd2a5e4fb 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -15,7 +15,7 @@ from homeassistant.const import ( from homeassistant.core import callback import homeassistant.helpers.config_validation as cv -from . import PyNUTData, find_resources_in_config_entry, pynutdata_status +from . import PyNUTData, find_resources_in_config_entry from .const import DEFAULT_HOST, DEFAULT_PORT, SENSOR_TYPES from .const import DOMAIN # pylint:disable=unused-import @@ -54,9 +54,7 @@ def _resource_schema(available_resources, selected_resources): def _ups_schema(ups_list): """UPS selection schema.""" - ups_map = {ups: ups for ups in ups_list} - - return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_map)}) + return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_list)}) async def validate_input(hass: core.HomeAssistant, data): @@ -72,16 +70,12 @@ async def validate_input(hass: core.HomeAssistant, data): password = data.get(CONF_PASSWORD) data = PyNUTData(host, port, alias, username, password) - - ups_list = await hass.async_add_executor_job(data.list_ups) - if not ups_list: - raise CannotConnect - - status = await hass.async_add_executor_job(pynutdata_status, data) + await hass.async_add_executor_job(data.update) + status = data.status if not status: raise CannotConnect - return {"ups_list": ups_list, "available_resources": status} + return {"ups_list": data.ups_list, "available_resources": status} def _format_host_port_alias(user_input): @@ -135,6 +129,8 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): self.ups_list = info["ups_list"] return await self.async_step_ups() + if self._host_port_alias_already_configured(self.nut_config): + return self.async_abort(reason="already_configured") self.available_resources.update(info["available_resources"]) return await self.async_step_resources() diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index d7138ef865cb..ae960cc43255 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -18,8 +18,9 @@ DEFAULT_PORT = 3493 KEY_STATUS = "ups.status" KEY_STATUS_DISPLAY = "ups.status.display" +COORDINATOR = "coordinator" + PYNUT_DATA = "data" -PYNUT_STATUS = "status" PYNUT_UNIQUE_ID = "unique_id" PYNUT_MANUFACTURER = "manufacturer" PYNUT_MODEL = "model" diff --git a/homeassistant/components/nut/sensor.py b/homeassistant/components/nut/sensor.py index 15c090017621..07abe27b4268 100644 --- a/homeassistant/components/nut/sensor.py +++ b/homeassistant/components/nut/sensor.py @@ -1,5 +1,4 @@ """Provides a sensor to track various status aspects of a UPS.""" -from datetime import timedelta import logging import voluptuous as vol @@ -21,6 +20,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from .const import ( + COORDINATOR, DEFAULT_HOST, DEFAULT_NAME, DEFAULT_PORT, @@ -32,7 +32,6 @@ from .const import ( PYNUT_MANUFACTURER, PYNUT_MODEL, PYNUT_NAME, - PYNUT_STATUS, PYNUT_UNIQUE_ID, SENSOR_DEVICE_CLASS, SENSOR_ICON, @@ -45,9 +44,6 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -SCAN_INTERVAL = timedelta(seconds=60) - - PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, @@ -75,13 +71,14 @@ async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the NUT sensors.""" pynut_data = hass.data[DOMAIN][config_entry.entry_id] - data = pynut_data[PYNUT_DATA] - status = pynut_data[PYNUT_STATUS] unique_id = pynut_data[PYNUT_UNIQUE_ID] manufacturer = pynut_data[PYNUT_MANUFACTURER] model = pynut_data[PYNUT_MODEL] firmware = pynut_data[PYNUT_FIRMWARE] name = pynut_data[PYNUT_NAME] + coordinator = pynut_data[COORDINATOR] + data = pynut_data[PYNUT_DATA] + status = data.status entities = [] @@ -100,8 +97,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ): entities.append( NUTSensor( - name.title(), + coordinator, data, + name.title(), sensor_type, unique_id, manufacturer, @@ -123,10 +121,18 @@ class NUTSensor(Entity): """Representation of a sensor entity for NUT status values.""" def __init__( - self, name, data, sensor_type, unique_id, manufacturer, model, firmware + self, + coordinator, + data, + name, + sensor_type, + unique_id, + manufacturer, + model, + firmware, ): """Initialize the sensor.""" - self._data = data + self._coordinator = coordinator self._type = sensor_type self._manufacturer = manufacturer self._firmware = firmware @@ -134,10 +140,8 @@ class NUTSensor(Entity): self._device_name = name self._name = f"{name} {SENSOR_TYPES[sensor_type][SENSOR_NAME]}" self._unit = SENSOR_TYPES[sensor_type][SENSOR_UNIT] - self._state = None + self._data = data self._unique_id = unique_id - self._display_state = None - self._available = False @property def device_info(self): @@ -185,41 +189,42 @@ class NUTSensor(Entity): @property def state(self): """Return entity state from ups.""" - return self._state + if self._type == KEY_STATUS_DISPLAY: + return _format_display_state(self._data.status) + return self._data.status.get(self._type) @property def unit_of_measurement(self): """Return the unit of measurement of this entity, if any.""" return self._unit + @property + def should_poll(self): + """No need to poll. Coordinator notifies entity of updates.""" + return False + @property def available(self): - """Return if the device is polling successfully.""" - return self._available + """Return if entity is available.""" + return self._coordinator.last_update_success @property def device_state_attributes(self): """Return the sensor attributes.""" - return {ATTR_STATE: self._display_state} + return {ATTR_STATE: _format_display_state(self._data.status)} - def update(self): - """Get the latest status and use it to update our sensor state.""" - status = self._data.status + async def async_update(self): + """Update the entity. - if status is None: - self._available = False - return + Only used by the generic entity update service. + """ + await self._coordinator.async_request_refresh() - self._available = True - self._display_state = _format_display_state(status) - # In case of the display status sensor, keep a human-readable form - # as the sensor state. - if self._type == KEY_STATUS_DISPLAY: - self._state = self._display_state - elif self._type not in status: - self._state = None - else: - self._state = status[self._type] + async def async_added_to_hass(self): + """When entity is added to hass.""" + self.async_on_remove( + self._coordinator.async_add_listener(self.async_write_ha_state) + ) def _format_display_state(status): diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index 38953ebd235c..c110df0576ae 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -86,7 +86,8 @@ async def test_form_user_multiple_ups(hass): assert result["errors"] == {} mock_pynut = _get_mock_pynutclient( - list_vars={"battery.voltage": "voltage"}, list_ups=["ups1", "ups2"] + list_vars={"battery.voltage": "voltage"}, + list_ups={"ups1": "UPS 1", "ups2": "UPS2"}, ) with patch( @@ -146,7 +147,8 @@ async def test_form_import(hass): await setup.async_setup_component(hass, "persistent_notification", {}) mock_pynut = _get_mock_pynutclient( - list_vars={"battery.voltage": "serial"}, list_ups=["ups1"] + list_vars={"battery.voltage": "serial"}, + list_ups={"ups1": "UPS 1", "ups2": "UPS2"}, ) with patch( From ff936302d7f26a000f4e8abe9e4249ae147fd955 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 20:29:46 -0500 Subject: [PATCH 247/653] Fix Doorbird yaml import aborted if discovery finds it first (#33843) --- .../components/doorbird/config_flow.py | 36 +++++++--- tests/components/doorbird/test_config_flow.py | 67 +++++++++++++++++++ 2 files changed, 92 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/doorbird/config_flow.py b/homeassistant/components/doorbird/config_flow.py index aa712a63ed0b..52f941163442 100644 --- a/homeassistant/components/doorbird/config_flow.py +++ b/homeassistant/components/doorbird/config_flow.py @@ -68,17 +68,8 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Handle the initial step.""" errors = {} if user_input is not None: - try: - info = await validate_input(self.hass, user_input) - except CannotConnect: - errors["base"] = "cannot_connect" - except InvalidAuth: - errors["base"] = "invalid_auth" - except Exception: # pylint: disable=broad-except - _LOGGER.exception("Unexpected exception") - errors["base"] = "unknown" - - if "base" not in errors: + info, errors = await self._async_validate_or_error(user_input) + if not errors: await self.async_set_unique_id(info["mac_addr"]) self._abort_if_unique_id_configured() return self.async_create_entry(title=info["title"], data=user_input) @@ -119,8 +110,31 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def async_step_import(self, user_input): """Handle import.""" + if user_input: + info, errors = await self._async_validate_or_error(user_input) + if not errors: + await self.async_set_unique_id( + info["mac_addr"], raise_on_progress=False + ) + self._abort_if_unique_id_configured() + return self.async_create_entry(title=info["title"], data=user_input) return await self.async_step_user(user_input) + async def _async_validate_or_error(self, user_input): + """Validate doorbird or error.""" + errors = {} + info = {} + try: + info = await validate_input(self.hass, user_input) + except CannotConnect: + errors["base"] = "cannot_connect" + except InvalidAuth: + errors["base"] = "invalid_auth" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + return info, errors + @staticmethod @callback def async_get_options_flow(config_entry): diff --git a/tests/components/doorbird/test_config_flow.py b/tests/components/doorbird/test_config_flow.py index f911787c1c33..8b49f87bd0bd 100644 --- a/tests/components/doorbird/test_config_flow.py +++ b/tests/components/doorbird/test_config_flow.py @@ -127,6 +127,73 @@ async def test_form_import(hass): assert len(mock_setup_entry.mock_calls) == 1 +async def test_form_import_with_zeroconf_already_discovered(hass): + """Test we get the form with import source.""" + await hass.async_add_executor_job( + init_recorder_component, hass + ) # force in memory db + + await setup.async_setup_component(hass, "persistent_notification", {}) + + # Running the zeroconf init will make the unique id + # in progress + zero_conf = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_ZEROCONF}, + data={ + "properties": {"macaddress": "1CCAE3DOORBIRD"}, + "name": "Doorstation - abc123._axis-video._tcp.local.", + "host": "192.168.1.5", + }, + ) + assert zero_conf["type"] == data_entry_flow.RESULT_TYPE_FORM + assert zero_conf["step_id"] == "user" + assert zero_conf["errors"] == {} + + import_config = VALID_CONFIG.copy() + import_config[CONF_EVENTS] = ["event1", "event2", "event3"] + import_config[CONF_TOKEN] = "imported_token" + import_config[ + CONF_CUSTOM_URL + ] = "http://legacy.custom.url/should/only/come/in/from/yaml" + + doorbirdapi = _get_mock_doorbirdapi_return_values( + ready=[True], info={"WIFI_MAC_ADDR": "1CCAE3DOORBIRD"} + ) + with patch( + "homeassistant.components.doorbird.config_flow.DoorBird", + return_value=doorbirdapi, + ), patch("homeassistant.components.logbook.async_setup", return_value=True), patch( + "homeassistant.components.doorbird.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.doorbird.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data=import_config, + ) + + assert result["type"] == "create_entry" + assert result["title"] == "1.2.3.4" + assert result["data"] == { + "host": "1.2.3.4", + "name": "mydoorbird", + "password": "password", + "username": "friend", + "events": ["event1", "event2", "event3"], + "token": "imported_token", + # This will go away once we convert to cloud hooks + "hass_url_override": "http://legacy.custom.url/should/only/come/in/from/yaml", + } + # It is not possible to import options at this time + # so they end up in the config entry data and are + # used a fallback when they are not in options + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + async def test_form_zeroconf_wrong_oui(hass): """Test we abort when we get the wrong OUI via zeroconf.""" await hass.async_add_executor_job( From d494da271a990fa91137f8f9678fa572db8ea507 Mon Sep 17 00:00:00 2001 From: Alexei Chetroi Date: Wed, 8 Apr 2020 21:36:11 -0400 Subject: [PATCH 248/653] Bump up ZHA dependencies (#33856) --- homeassistant/components/zha/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json index 9a53a29fe5ed..008e758c96e4 100644 --- a/homeassistant/components/zha/manifest.json +++ b/homeassistant/components/zha/manifest.json @@ -8,7 +8,7 @@ "zha-quirks==0.0.38", "zigpy-cc==0.3.1", "zigpy-deconz==0.8.0", - "zigpy-homeassistant==0.18.1", + "zigpy-homeassistant==0.18.2", "zigpy-xbee-homeassistant==0.11.0", "zigpy-zigate==0.5.1" ], diff --git a/requirements_all.txt b/requirements_all.txt index 5325986cc7e6..82e1601e907b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2196,7 +2196,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.1 +zigpy-homeassistant==0.18.2 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f5a436a1166b..51c3e1a83b12 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -821,7 +821,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.1 +zigpy-homeassistant==0.18.2 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 From daf941e7717c8ba62468fbecd3383493be3c8f81 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 8 Apr 2020 20:40:45 -0500 Subject: [PATCH 249/653] Fix missed async conversion in flume. (#33855) --- homeassistant/components/flume/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/flume/sensor.py b/homeassistant/components/flume/sensor.py index ff320f41dd1e..21a19a3a56c0 100644 --- a/homeassistant/components/flume/sensor.py +++ b/homeassistant/components/flume/sensor.py @@ -43,7 +43,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -def setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Import the platform into a config entry.""" hass.async_create_task( From b46eee04e475a1211e10252bca30c4a46f1d474e Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Wed, 8 Apr 2020 23:44:33 -0400 Subject: [PATCH 250/653] =?UTF-8?q?Fix=20vizio=20bug=20that=20occurs=20whe?= =?UTF-8?q?n=20CONF=5FAPPS=20isn't=20in=20config=20entry=E2=80=A6=20(#3385?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix bug when search for string in dict fails when dict is null * another bug fix that I only noticed because of this other bug * add test to cover failure scenario * update docstring * add additional assertions to cover failure scenario that's being fixed --- homeassistant/components/vizio/config_flow.py | 4 +-- tests/components/vizio/test_config_flow.py | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/vizio/config_flow.py b/homeassistant/components/vizio/config_flow.py index ba3ac5107bbc..51f00ad98bbf 100644 --- a/homeassistant/components/vizio/config_flow.py +++ b/homeassistant/components/vizio/config_flow.py @@ -125,8 +125,8 @@ class VizioOptionsConfigFlow(config_entries.OptionsFlow): default_include_or_exclude = ( CONF_EXCLUDE if self.config_entry.options - and CONF_EXCLUDE in self.config_entry.options.get(CONF_APPS) - else CONF_EXCLUDE + and CONF_EXCLUDE in self.config_entry.options.get(CONF_APPS, {}) + else CONF_INCLUDE ) options.update( { diff --git a/tests/components/vizio/test_config_flow.py b/tests/components/vizio/test_config_flow.py index a8a760d8ca26..b5b10534759f 100644 --- a/tests/components/vizio/test_config_flow.py +++ b/tests/components/vizio/test_config_flow.py @@ -9,6 +9,7 @@ from homeassistant.components.media_player import DEVICE_CLASS_SPEAKER, DEVICE_C from homeassistant.components.vizio.config_flow import _get_config_schema from homeassistant.components.vizio.const import ( CONF_APPS, + CONF_APPS_TO_INCLUDE_OR_EXCLUDE, CONF_INCLUDE, CONF_VOLUME_STEP, DEFAULT_NAME, @@ -176,6 +177,39 @@ async def test_tv_options_flow_with_apps(hass: HomeAssistantType) -> None: assert result["data"][CONF_APPS] == {CONF_INCLUDE: [CURRENT_APP]} +async def test_tv_options_flow_start_with_volume(hass: HomeAssistantType) -> None: + """Test options config flow for TV with providing apps option after providing volume step in initial config.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=MOCK_USER_VALID_TV_CONFIG, + options={CONF_VOLUME_STEP: VOLUME_STEP}, + ) + entry.add_to_hass(hass) + + assert entry.options + assert entry.options == {CONF_VOLUME_STEP: VOLUME_STEP} + assert CONF_APPS not in entry.options + assert CONF_APPS_TO_INCLUDE_OR_EXCLUDE not in entry.options + + result = await hass.config_entries.options.async_init(entry.entry_id, data=None) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "init" + + options = {CONF_VOLUME_STEP: VOLUME_STEP} + options.update(MOCK_INCLUDE_APPS) + + result = await hass.config_entries.options.async_configure( + result["flow_id"], user_input=options + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == "" + assert result["data"][CONF_VOLUME_STEP] == VOLUME_STEP + assert CONF_APPS in result["data"] + assert result["data"][CONF_APPS] == {CONF_INCLUDE: [CURRENT_APP]} + + async def test_user_host_already_configured( hass: HomeAssistantType, vizio_connect: pytest.fixture, From 21dfee831f19a8c6ae9ae8cb1c859505a2b25be7 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Thu, 9 Apr 2020 09:26:06 +0200 Subject: [PATCH 251/653] Clean up access to config in various integrations v3 (#33842) --- .../components/bbb_gpio/binary_sensor.py | 10 +++++----- homeassistant/components/bbb_gpio/switch.py | 8 ++++---- homeassistant/components/bbox/sensor.py | 2 +- homeassistant/components/bh1750/sensor.py | 14 ++++++------- homeassistant/components/bitcoin/sensor.py | 2 +- homeassistant/components/bizkaibus/sensor.py | 2 +- .../components/blinksticklight/light.py | 4 ++-- homeassistant/components/blinkt/light.py | 2 +- homeassistant/components/blockchain/sensor.py | 4 ++-- .../components/bloomsky/binary_sensor.py | 2 +- homeassistant/components/bloomsky/sensor.py | 2 +- .../bluetooth_tracker/device_tracker.py | 2 +- homeassistant/components/bme280/sensor.py | 20 +++++++++---------- homeassistant/components/bme680/sensor.py | 16 +++++++-------- .../components/braviatv/media_player.py | 12 +++++------ .../components/brottsplatskartan/sensor.py | 2 +- 16 files changed, 52 insertions(+), 52 deletions(-) diff --git a/homeassistant/components/bbb_gpio/binary_sensor.py b/homeassistant/components/bbb_gpio/binary_sensor.py index 3ef13c117a21..b1245aeabde2 100644 --- a/homeassistant/components/bbb_gpio/binary_sensor.py +++ b/homeassistant/components/bbb_gpio/binary_sensor.py @@ -35,7 +35,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Beaglebone Black GPIO devices.""" - pins = config.get(CONF_PINS) + pins = config[CONF_PINS] binary_sensors = [] @@ -50,10 +50,10 @@ class BBBGPIOBinarySensor(BinarySensorDevice): def __init__(self, pin, params): """Initialize the Beaglebone Black binary sensor.""" self._pin = pin - self._name = params.get(CONF_NAME) or DEVICE_DEFAULT_NAME - self._bouncetime = params.get(CONF_BOUNCETIME) - self._pull_mode = params.get(CONF_PULL_MODE) - self._invert_logic = params.get(CONF_INVERT_LOGIC) + self._name = params[CONF_NAME] or DEVICE_DEFAULT_NAME + self._bouncetime = params[CONF_BOUNCETIME] + self._pull_mode = params[CONF_PULL_MODE] + self._invert_logic = params[CONF_INVERT_LOGIC] bbb_gpio.setup_input(self._pin, self._pull_mode) self._state = bbb_gpio.read_input(self._pin) diff --git a/homeassistant/components/bbb_gpio/switch.py b/homeassistant/components/bbb_gpio/switch.py index eb75c6f374cd..cc776c21f9ee 100644 --- a/homeassistant/components/bbb_gpio/switch.py +++ b/homeassistant/components/bbb_gpio/switch.py @@ -30,7 +30,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the BeagleBone Black GPIO devices.""" - pins = config.get(CONF_PINS) + pins = config[CONF_PINS] switches = [] for pin, params in pins.items(): @@ -44,9 +44,9 @@ class BBBGPIOSwitch(ToggleEntity): def __init__(self, pin, params): """Initialize the pin.""" self._pin = pin - self._name = params.get(CONF_NAME) or DEVICE_DEFAULT_NAME - self._state = params.get(CONF_INITIAL) - self._invert_logic = params.get(CONF_INVERT_LOGIC) + self._name = params[CONF_NAME] or DEVICE_DEFAULT_NAME + self._state = params[CONF_INITIAL] + self._invert_logic = params[CONF_INVERT_LOGIC] bbb_gpio.setup_output(self._pin) diff --git a/homeassistant/components/bbox/sensor.py b/homeassistant/components/bbox/sensor.py index 259066d45618..13c8f5bb03f0 100644 --- a/homeassistant/components/bbox/sensor.py +++ b/homeassistant/components/bbox/sensor.py @@ -74,7 +74,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): _LOGGER.error(error) return False - name = config.get(CONF_NAME) + name = config[CONF_NAME] sensors = [] for variable in config[CONF_MONITORED_VARIABLES]: diff --git a/homeassistant/components/bh1750/sensor.py b/homeassistant/components/bh1750/sensor.py index 924bfcd55076..df8e87f751d1 100644 --- a/homeassistant/components/bh1750/sensor.py +++ b/homeassistant/components/bh1750/sensor.py @@ -63,10 +63,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the BH1750 sensor.""" - name = config.get(CONF_NAME) - bus_number = config.get(CONF_I2C_BUS) - i2c_address = config.get(CONF_I2C_ADDRESS) - operation_mode = config.get(CONF_OPERATION_MODE) + name = config[CONF_NAME] + bus_number = config[CONF_I2C_BUS] + i2c_address = config[CONF_I2C_ADDRESS] + operation_mode = config[CONF_OPERATION_MODE] bus = smbus.SMBus(bus_number) @@ -76,8 +76,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= bus, i2c_address, operation_mode=operation_mode, - measurement_delay=config.get(CONF_DELAY), - sensitivity=config.get(CONF_SENSITIVITY), + measurement_delay=config[CONF_DELAY], + sensitivity=config[CONF_SENSITIVITY], logger=_LOGGER, ) ) @@ -85,7 +85,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= _LOGGER.error("BH1750 sensor not detected at %s", i2c_address) return False - dev = [BH1750Sensor(sensor, name, SENSOR_UNIT, config.get(CONF_MULTIPLIER))] + dev = [BH1750Sensor(sensor, name, SENSOR_UNIT, config[CONF_MULTIPLIER])] _LOGGER.info( "Setup of BH1750 light sensor at %s in mode %s is complete", i2c_address, diff --git a/homeassistant/components/bitcoin/sensor.py b/homeassistant/components/bitcoin/sensor.py index a488fa1e2faf..c748b2f72f94 100644 --- a/homeassistant/components/bitcoin/sensor.py +++ b/homeassistant/components/bitcoin/sensor.py @@ -63,7 +63,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Bitcoin sensors.""" - currency = config.get(CONF_CURRENCY) + currency = config[CONF_CURRENCY] if currency not in exchangerates.get_ticker(): _LOGGER.warning("Currency %s is not available. Using USD", currency) diff --git a/homeassistant/components/bizkaibus/sensor.py b/homeassistant/components/bizkaibus/sensor.py index c58873473d5c..0b8e2682f30b 100644 --- a/homeassistant/components/bizkaibus/sensor.py +++ b/homeassistant/components/bizkaibus/sensor.py @@ -30,7 +30,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Bizkaibus public transport sensor.""" - name = config.get(CONF_NAME) + name = config[CONF_NAME] stop = config[CONF_STOP_ID] route = config[CONF_ROUTE] diff --git a/homeassistant/components/blinksticklight/light.py b/homeassistant/components/blinksticklight/light.py index 197213f74737..4eab2fc3d110 100644 --- a/homeassistant/components/blinksticklight/light.py +++ b/homeassistant/components/blinksticklight/light.py @@ -35,8 +35,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Blinkstick device specified by serial number.""" - name = config.get(CONF_NAME) - serial = config.get(CONF_SERIAL) + name = config[CONF_NAME] + serial = config[CONF_SERIAL] stick = blinkstick.find_by_serial(serial) diff --git a/homeassistant/components/blinkt/light.py b/homeassistant/components/blinkt/light.py index 0fedc2b794ba..d9ef2ac6a7e1 100644 --- a/homeassistant/components/blinkt/light.py +++ b/homeassistant/components/blinkt/light.py @@ -35,7 +35,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): # ensure that the lights are off when exiting blinkt.set_clear_on_exit() - name = config.get(CONF_NAME) + name = config[CONF_NAME] add_entities( [BlinktLight(blinkt, name, index) for index in range(blinkt.NUM_PIXELS)] diff --git a/homeassistant/components/blockchain/sensor.py b/homeassistant/components/blockchain/sensor.py index acf869579578..feb9d582cff0 100644 --- a/homeassistant/components/blockchain/sensor.py +++ b/homeassistant/components/blockchain/sensor.py @@ -33,8 +33,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Blockchain.com sensors.""" - addresses = config.get(CONF_ADDRESSES) - name = config.get(CONF_NAME) + addresses = config[CONF_ADDRESSES] + name = config[CONF_NAME] for address in addresses: if not validate_address(address): diff --git a/homeassistant/components/bloomsky/binary_sensor.py b/homeassistant/components/bloomsky/binary_sensor.py index 0a410401b54d..140d7e638a74 100644 --- a/homeassistant/components/bloomsky/binary_sensor.py +++ b/homeassistant/components/bloomsky/binary_sensor.py @@ -25,7 +25,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available BloomSky weather binary sensors.""" # Default needed in case of discovery - sensors = config.get(CONF_MONITORED_CONDITIONS, SENSOR_TYPES) + sensors = config[CONF_MONITORED_CONDITIONS] bloomsky = hass.data[DOMAIN] for device in bloomsky.devices.values(): diff --git a/homeassistant/components/bloomsky/sensor.py b/homeassistant/components/bloomsky/sensor.py index 812bbc91947b..2b4563dab834 100644 --- a/homeassistant/components/bloomsky/sensor.py +++ b/homeassistant/components/bloomsky/sensor.py @@ -60,7 +60,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the available BloomSky weather sensors.""" # Default needed in case of discovery - sensors = config.get(CONF_MONITORED_CONDITIONS, SENSOR_TYPES) + sensors = config[CONF_MONITORED_CONDITIONS] bloomsky = hass.data[DOMAIN] for device in bloomsky.devices.values(): diff --git a/homeassistant/components/bluetooth_tracker/device_tracker.py b/homeassistant/components/bluetooth_tracker/device_tracker.py index d833f60c84f2..af49266bef4b 100644 --- a/homeassistant/components/bluetooth_tracker/device_tracker.py +++ b/homeassistant/components/bluetooth_tracker/device_tracker.py @@ -112,7 +112,7 @@ async def async_setup_scanner( hass: HomeAssistantType, config: dict, async_see, discovery_info=None ): """Set up the Bluetooth Scanner.""" - device_id: int = config.get(CONF_DEVICE_ID) + device_id: int = config[CONF_DEVICE_ID] interval = config.get(CONF_SCAN_INTERVAL, SCAN_INTERVAL) request_rssi = config.get(CONF_REQUEST_RSSI, False) update_bluetooth_lock = asyncio.Lock() diff --git a/homeassistant/components/bme280/sensor.py b/homeassistant/components/bme280/sensor.py index 28e22c10f200..893ddbf54e98 100644 --- a/homeassistant/components/bme280/sensor.py +++ b/homeassistant/components/bme280/sensor.py @@ -85,22 +85,22 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= """Set up the BME280 sensor.""" SENSOR_TYPES[SENSOR_TEMP][1] = hass.config.units.temperature_unit - name = config.get(CONF_NAME) - i2c_address = config.get(CONF_I2C_ADDRESS) + name = config[CONF_NAME] + i2c_address = config[CONF_I2C_ADDRESS] - bus = smbus.SMBus(config.get(CONF_I2C_BUS)) + bus = smbus.SMBus(config[CONF_I2C_BUS]) sensor = await hass.async_add_job( partial( BME280, bus, i2c_address, - osrs_t=config.get(CONF_OVERSAMPLING_TEMP), - osrs_p=config.get(CONF_OVERSAMPLING_PRES), - osrs_h=config.get(CONF_OVERSAMPLING_HUM), - mode=config.get(CONF_OPERATION_MODE), - t_sb=config.get(CONF_T_STANDBY), - filter_mode=config.get(CONF_FILTER_MODE), - delta_temp=config.get(CONF_DELTA_TEMP), + osrs_t=config[CONF_OVERSAMPLING_TEMP], + osrs_p=config[CONF_OVERSAMPLING_PRES], + osrs_h=config[CONF_OVERSAMPLING_HUM], + mode=config[CONF_OPERATION_MODE], + t_sb=config[CONF_T_STANDBY], + filter_mode=config[CONF_FILTER_MODE], + delta_temp=config[CONF_DELTA_TEMP], logger=_LOGGER, ) ) diff --git a/homeassistant/components/bme680/sensor.py b/homeassistant/components/bme680/sensor.py index ba5a3267a231..2d274c077a40 100644 --- a/homeassistant/components/bme680/sensor.py +++ b/homeassistant/components/bme680/sensor.py @@ -109,7 +109,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the BME680 sensor.""" SENSOR_TYPES[SENSOR_TEMP][1] = hass.config.units.temperature_unit - name = config.get(CONF_NAME) + name = config[CONF_NAME] sensor_handler = await hass.async_add_job(_setup_bme680, config) if sensor_handler is None: @@ -132,8 +132,8 @@ def _setup_bme680(config): sensor = None try: # pylint: disable=no-member - i2c_address = config.get(CONF_I2C_ADDRESS) - bus = SMBus(config.get(CONF_I2C_BUS)) + i2c_address = config[CONF_I2C_ADDRESS] + bus = SMBus(config[CONF_I2C_BUS]) sensor = bme680.BME680(i2c_address, bus) # Configure Oversampling @@ -145,10 +145,10 @@ def _setup_bme680(config): 8: bme680.OS_8X, 16: bme680.OS_16X, } - sensor.set_temperature_oversample(os_lookup[config.get(CONF_OVERSAMPLING_TEMP)]) - sensor.set_temp_offset(config.get(CONF_TEMP_OFFSET)) - sensor.set_humidity_oversample(os_lookup[config.get(CONF_OVERSAMPLING_HUM)]) - sensor.set_pressure_oversample(os_lookup[config.get(CONF_OVERSAMPLING_PRES)]) + sensor.set_temperature_oversample(os_lookup[config[CONF_OVERSAMPLING_TEMP]]) + sensor.set_temp_offset(config[CONF_TEMP_OFFSET]) + sensor.set_humidity_oversample(os_lookup[config[CONF_OVERSAMPLING_HUM]]) + sensor.set_pressure_oversample(os_lookup[config[CONF_OVERSAMPLING_PRES]]) # Configure IIR Filter filter_lookup = { @@ -161,7 +161,7 @@ def _setup_bme680(config): 63: bme680.FILTER_SIZE_63, 127: bme680.FILTER_SIZE_127, } - sensor.set_filter(filter_lookup[config.get(CONF_FILTER_SIZE)]) + sensor.set_filter(filter_lookup[config[CONF_FILTER_SIZE]]) # Configure the Gas Heater if ( diff --git a/homeassistant/components/braviatv/media_player.py b/homeassistant/components/braviatv/media_player.py index 31cc98f7e4ba..5e0c9f040586 100644 --- a/homeassistant/components/braviatv/media_player.py +++ b/homeassistant/components/braviatv/media_player.py @@ -61,7 +61,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Sony Bravia TV platform.""" - host = config.get(CONF_HOST) + host = config[CONF_HOST] if host is None: return @@ -74,7 +74,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if host_ip == host: pin = host_config["pin"] mac = host_config["mac"] - name = config.get(CONF_NAME) + name = config[CONF_NAME] braviarc = BraviaRC(host, mac) if not braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME): raise PlatformNotReady @@ -91,8 +91,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): def setup_bravia(config, pin, hass, add_entities): """Set up a Sony Bravia TV based on host parameter.""" - host = config.get(CONF_HOST) - name = config.get(CONF_NAME) + host = config[CONF_HOST] + name = config[CONF_NAME] if pin is None: request_configuration(config, hass, add_entities) @@ -128,8 +128,8 @@ def setup_bravia(config, pin, hass, add_entities): def request_configuration(config, hass, add_entities): """Request configuration steps from the user.""" - host = config.get(CONF_HOST) - name = config.get(CONF_NAME) + host = config[CONF_HOST] + name = config[CONF_NAME] configurator = hass.components.configurator diff --git a/homeassistant/components/brottsplatskartan/sensor.py b/homeassistant/components/brottsplatskartan/sensor.py index feb066a6f3f9..7b2c3e585e30 100644 --- a/homeassistant/components/brottsplatskartan/sensor.py +++ b/homeassistant/components/brottsplatskartan/sensor.py @@ -65,7 +65,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): area = config.get(CONF_AREA) latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) - name = config.get(CONF_NAME) + name = config[CONF_NAME] # Every Home Assistant instance should have their own unique # app parameter: https://brottsplatskartan.se/sida/api From 1adb45f74e96fc5eff137a3727647a7e428e123c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 9 Apr 2020 00:54:02 -0700 Subject: [PATCH 252/653] Check status code on onvif snapshot (#33865) --- homeassistant/components/onvif/camera.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index d623f1d879bf..299c9026b0e9 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -516,7 +516,8 @@ class ONVIFHassCamera(Camera): """Read image from a URL.""" try: response = requests.get(self._snapshot, timeout=5, auth=auth) - return response.content + if response.status_code < 300: + return response.content except requests.exceptions.RequestException as error: _LOGGER.error( "Fetch snapshot image failed from %s, falling back to FFmpeg; %s", From 87e7e7fe8a11e29b1651c874497b8550d78b4d2a Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Apr 2020 10:20:48 +0200 Subject: [PATCH 253/653] Fix slide open/close percentage (#33739) * Fix Open/Close percentage * Update __init__.py * Apply suggestions from code review Co-authored-by: Martin Hjelmare --- homeassistant/components/slide/__init__.py | 30 +++++++++++++++++----- homeassistant/components/slide/const.py | 4 ++- homeassistant/components/slide/cover.py | 15 ++++++++--- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/slide/__init__.py b/homeassistant/components/slide/__init__.py index ccf4465577b2..2fd3df1acb71 100644 --- a/homeassistant/components/slide/__init__.py +++ b/homeassistant/components/slide/__init__.py @@ -1,4 +1,4 @@ -"""Component for the Go Slide API.""" +"""Component for the Slide API.""" from datetime import timedelta import logging @@ -19,7 +19,15 @@ from homeassistant.helpers import config_validation as cv from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.event import async_call_later, async_track_time_interval -from .const import API, COMPONENT, DEFAULT_RETRY, DOMAIN, SLIDES +from .const import ( + API, + COMPONENT, + CONF_INVERT_POSITION, + DEFAULT_OFFSET, + DEFAULT_RETRY, + DOMAIN, + SLIDES, +) _LOGGER = logging.getLogger(__name__) @@ -34,6 +42,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, + vol.Optional(CONF_INVERT_POSITION, default=False): cv.boolean, } ) }, @@ -60,7 +69,7 @@ async def async_setup(hass, config): for slide in result: if "device_id" not in slide: _LOGGER.error( - "Found invalid Slide entry, device_id is missing. Entry=%s", slide, + "Found invalid Slide entry, device_id is missing. Entry=%s", slide ) continue @@ -73,6 +82,7 @@ async def async_setup(hass, config): oldpos = slidenew.get("pos") slidenew["pos"] = None slidenew["online"] = False + slidenew["invert"] = config[DOMAIN][CONF_INVERT_POSITION] if "device_info" not in slide: _LOGGER.error( @@ -91,15 +101,21 @@ async def async_setup(hass, config): if oldpos is None or oldpos == slidenew["pos"]: slidenew["state"] = ( - STATE_CLOSED if slidenew["pos"] > 0.95 else STATE_OPEN + STATE_CLOSED + if slidenew["pos"] > (1 - DEFAULT_OFFSET) + else STATE_OPEN ) elif oldpos < slidenew["pos"]: slidenew["state"] = ( - STATE_CLOSED if slidenew["pos"] >= 0.95 else STATE_CLOSING + STATE_CLOSED + if slidenew["pos"] >= (1 - DEFAULT_OFFSET) + else STATE_CLOSING ) else: slidenew["state"] = ( - STATE_OPEN if slidenew["pos"] <= 0.05 else STATE_OPENING + STATE_OPEN + if slidenew["pos"] <= DEFAULT_OFFSET + else STATE_OPENING ) elif "code" in slide["device_info"]: _LOGGER.warning( @@ -135,7 +151,7 @@ async def async_setup(hass, config): result = await hass.data[DOMAIN][API].login() except (goslideapi.ClientConnectionError, goslideapi.ClientTimeoutError) as err: _LOGGER.error( - "Error connecting to Slide Cloud: %s, going to retry in %s seconds", + "Error connecting to Slide Cloud: %s, going to retry in %s second(s)", err, DEFAULT_RETRY, ) diff --git a/homeassistant/components/slide/const.py b/homeassistant/components/slide/const.py index de3d2e560c1f..9748e5e0f8c8 100644 --- a/homeassistant/components/slide/const.py +++ b/homeassistant/components/slide/const.py @@ -1,7 +1,9 @@ -"""Define constants for the Go Slide component.""" +"""Define constants for the Slide component.""" API = "api" COMPONENT = "cover" +CONF_INVERT_POSITION = "invert_position" DOMAIN = "slide" SLIDES = "slides" +DEFAULT_OFFSET = 0.15 DEFAULT_RETRY = 120 diff --git a/homeassistant/components/slide/cover.py b/homeassistant/components/slide/cover.py index a567a9bf61b4..f50226b9f011 100644 --- a/homeassistant/components/slide/cover.py +++ b/homeassistant/components/slide/cover.py @@ -1,4 +1,4 @@ -"""Support for Go Slide slides.""" +"""Support for Slide slides.""" import logging @@ -12,13 +12,13 @@ from homeassistant.components.cover import ( ) from homeassistant.const import ATTR_ID -from .const import API, DOMAIN, SLIDES +from .const import API, DEFAULT_OFFSET, DOMAIN, SLIDES _LOGGER = logging.getLogger(__name__) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Set up cover(s) for Go Slide platform.""" + """Set up cover(s) for Slide platform.""" if discovery_info is None: return @@ -33,7 +33,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class SlideCover(CoverDevice): - """Representation of a Go Slide cover.""" + """Representation of a Slide cover.""" def __init__(self, api, slide): """Initialize the cover.""" @@ -42,6 +42,7 @@ class SlideCover(CoverDevice): self._id = slide["id"] self._unique_id = slide["mac"] self._name = slide["name"] + self._invert = slide["invert"] @property def unique_id(self): @@ -95,6 +96,10 @@ class SlideCover(CoverDevice): """Return the current position of cover shutter.""" pos = self._slide["pos"] if pos is not None: + if (1 - pos) <= DEFAULT_OFFSET or pos <= DEFAULT_OFFSET: + pos = round(pos) + if not self._invert: + pos = 1 - pos pos = int(pos * 100) return pos @@ -115,6 +120,8 @@ class SlideCover(CoverDevice): async def async_set_cover_position(self, **kwargs): """Move the cover to a specific position.""" position = kwargs[ATTR_POSITION] / 100 + if not self._invert: + position = 1 - position if self._slide["pos"] is not None: if position > self._slide["pos"]: From 38455395778bb948867052d03b09492077fad3fb Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 9 Apr 2020 10:58:19 +0200 Subject: [PATCH 254/653] Lookup manufacturer name for casts (#33845) * Lookup manufacturer name, remove use of get_multizone_status * Bump pychromecast * Bump pychromecast * Fix test --- homeassistant/components/cast/helpers.py | 28 ++++++++------------- homeassistant/components/cast/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/cast/test_media_player.py | 4 +-- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/cast/helpers.py b/homeassistant/components/cast/helpers.py index b39f8a6ef25f..0f0dc5f6358d 100644 --- a/homeassistant/components/cast/helpers.py +++ b/homeassistant/components/cast/helpers.py @@ -3,6 +3,7 @@ from typing import Optional, Tuple import attr from pychromecast import dial +from pychromecast.const import CAST_MANUFACTURERS from .const import DEFAULT_PORT @@ -20,7 +21,6 @@ class ChromecastInfo: uuid = attr.ib( type=Optional[str], converter=attr.converters.optional(str), default=None ) # always convert UUID to string if not None - manufacturer = attr.ib(type=str, default="") model_name = attr.ib(type=str, default="") friendly_name = attr.ib(type=Optional[str], default=None) is_dynamic_group = attr.ib(type=Optional[bool], default=None) @@ -52,6 +52,13 @@ class ChromecastInfo: """Return the host+port tuple.""" return self.host, self.port + @property + def manufacturer(self) -> str: + """Return the manufacturer.""" + if not self.model_name: + return None + return CAST_MANUFACTURERS.get(self.model_name.lower(), "Google Inc.") + def fill_out_missing_chromecast_info(self) -> "ChromecastInfo": """Return a new ChromecastInfo object with missing attributes filled in. @@ -62,22 +69,8 @@ class ChromecastInfo: # audio group, so checking via HTTP won't give us any new information. return self - # Fill out missing information via HTTP dial. if self.is_audio_group: is_dynamic_group = False - http_group_status = None - dynamic_groups = [] - if self.uuid: - http_group_status = dial.get_multizone_status( - self.host, - services=[self.service], - zconf=ChromeCastZeroconf.get_zeroconf(), - ) - if http_group_status is not None: - dynamic_groups = [ - str(g.uuid) for g in http_group_status.dynamic_groups - ] - is_dynamic_group = self.uuid in dynamic_groups return ChromecastInfo( service=self.service, @@ -85,11 +78,11 @@ class ChromecastInfo: port=self.port, uuid=self.uuid, friendly_name=self.friendly_name, - manufacturer=self.manufacturer, model_name=self.model_name, is_dynamic_group=is_dynamic_group, ) + # Fill out some missing information (friendly_name, uuid) via HTTP dial. http_device_status = dial.get_device_status( self.host, services=[self.service], zconf=ChromeCastZeroconf.get_zeroconf() ) @@ -103,8 +96,7 @@ class ChromecastInfo: port=self.port, uuid=(self.uuid or http_device_status.uuid), friendly_name=(self.friendly_name or http_device_status.friendly_name), - manufacturer=(self.manufacturer or http_device_status.manufacturer), - model_name=(self.model_name or http_device_status.model_name), + model_name=self.model_name, ) def same_dynamic_group(self, other: "ChromecastInfo") -> bool: diff --git a/homeassistant/components/cast/manifest.json b/homeassistant/components/cast/manifest.json index f054c7c8e42c..0a7ce383118c 100644 --- a/homeassistant/components/cast/manifest.json +++ b/homeassistant/components/cast/manifest.json @@ -3,7 +3,7 @@ "name": "Google Cast", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/cast", - "requirements": ["pychromecast==4.2.0"], + "requirements": ["pychromecast==4.2.3"], "after_dependencies": ["cloud"], "zeroconf": ["_googlecast._tcp.local."], "codeowners": ["@emontnemery"] diff --git a/requirements_all.txt b/requirements_all.txt index 82e1601e907b..80390c66f6b6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1205,7 +1205,7 @@ pycfdns==0.0.1 pychannels==1.0.0 # homeassistant.components.cast -pychromecast==4.2.0 +pychromecast==4.2.3 # homeassistant.components.cmus pycmus==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 51c3e1a83b12..e091ca2554cf 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -475,7 +475,7 @@ pyblackbird==0.5 pybotvac==0.0.17 # homeassistant.components.cast -pychromecast==4.2.0 +pychromecast==4.2.3 # homeassistant.components.coolmaster pycoolmasternet==0.0.4 diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index 2f21a1c0f31a..3a40e9065d34 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -182,9 +182,7 @@ async def test_internal_discovery_callback_fill_out(hass): discover_cast, _ = await async_setup_cast_internal_discovery(hass) info = get_fake_chromecast_info(uuid=None) - full_info = attr.evolve( - info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID - ) + full_info = attr.evolve(info, model_name="", friendly_name="Speaker", uuid=FakeUUID) with patch( "homeassistant.components.cast.helpers.dial.get_device_status", From dd7fbef948b6496a2662ddfbdb6c9c509e34aa27 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Thu, 9 Apr 2020 13:53:23 +0200 Subject: [PATCH 255/653] Fix modbus default delay (#33877) * solve modbus issue #33872 CONF_DELAY was used in a serial connection, which is not permitted. Sometimes async_update is called after async_setup is completed, but before event EVENT_HOMEASSISTANT_START is issued, leading to a missing object. * resolve review comment. Do not wait for start event, but activate pymodbus directly in async setup. * review 2 Remark, this does not work, async_setup hangs. clean start_modbus() from async calls, leaving only the pymodbus setup. * review 2a Moved listen_once back to start_modbus, since it is sync. --- homeassistant/components/modbus/__init__.py | 33 ++++++++++----------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 6bb6c7fb1a20..3c488bd3245f 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -21,7 +21,6 @@ from homeassistant.const import ( CONF_PORT, CONF_TIMEOUT, CONF_TYPE, - EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, ) import homeassistant.helpers.config_validation as cv @@ -106,27 +105,13 @@ async def async_setup(hass, config): for client in hub_collect.values(): del client - def start_modbus(event): + def start_modbus(): """Start Modbus service.""" for client in hub_collect.values(): client.setup() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) - # Register services for modbus - hass.services.async_register( - MODBUS_DOMAIN, - SERVICE_WRITE_REGISTER, - write_register, - schema=SERVICE_WRITE_REGISTER_SCHEMA, - ) - hass.services.async_register( - MODBUS_DOMAIN, - SERVICE_WRITE_COIL, - write_coil, - schema=SERVICE_WRITE_COIL_SCHEMA, - ) - async def write_register(service): """Write Modbus registers.""" unit = int(float(service.data[ATTR_UNIT])) @@ -150,8 +135,19 @@ async def async_setup(hass, config): client_name = service.data[ATTR_HUB] await hub_collect[client_name].write_coil(unit, address, state) - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, start_modbus) + # do not wait for EVENT_HOMEASSISTANT_START, activate pymodbus now + await hass.async_add_executor_job(start_modbus) + # Register services for modbus + hass.services.async_register( + MODBUS_DOMAIN, + SERVICE_WRITE_REGISTER, + write_register, + schema=SERVICE_WRITE_REGISTER_SCHEMA, + ) + hass.services.async_register( + MODBUS_DOMAIN, SERVICE_WRITE_COIL, write_coil, schema=SERVICE_WRITE_COIL_SCHEMA, + ) return True @@ -169,7 +165,7 @@ class ModbusHub: self._config_type = client_config[CONF_TYPE] self._config_port = client_config[CONF_PORT] self._config_timeout = client_config[CONF_TIMEOUT] - self._config_delay = client_config[CONF_DELAY] + self._config_delay = 0 if self._config_type == "serial": # serial configuration @@ -181,6 +177,7 @@ class ModbusHub: else: # network configuration self._config_host = client_config[CONF_HOST] + self._config_delay = client_config[CONF_DELAY] @property def name(self): From 45b28b8b00e43f033c1ffce0655e3a791e2424dc Mon Sep 17 00:00:00 2001 From: Quentame Date: Thu, 9 Apr 2020 16:06:01 +0200 Subject: [PATCH 256/653] Add local_ip unique_id & icon and single_instance_allowed (#33483) * Add config flow + sensor unique_id & icon to local_ip * single_instance_allowed * Fix test * Martin's review * Name deprecated --- .../components/local_ip/.translations/en.json | 2 +- homeassistant/components/local_ip/__init__.py | 18 ++++++----- .../components/local_ip/config_flow.py | 21 +++++-------- homeassistant/components/local_ip/const.py | 6 ++++ homeassistant/components/local_ip/sensor.py | 20 ++++++++++--- .../components/local_ip/strings.json | 2 +- tests/components/local_ip/test_config_flow.py | 30 ++++++++++++++----- tests/components/local_ip/test_init.py | 4 +-- 8 files changed, 66 insertions(+), 37 deletions(-) create mode 100644 homeassistant/components/local_ip/const.py diff --git a/homeassistant/components/local_ip/.translations/en.json b/homeassistant/components/local_ip/.translations/en.json index 869bb5a23d5c..69cbaa457d51 100644 --- a/homeassistant/components/local_ip/.translations/en.json +++ b/homeassistant/components/local_ip/.translations/en.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Integration is already configured with an existing sensor with that name" + "single_instance_allowed": "Only a single configuration of Local IP is allowed." }, "step": { "user": { diff --git a/homeassistant/components/local_ip/__init__.py b/homeassistant/components/local_ip/__init__.py index c93b7a5a81bc..f787c0287624 100644 --- a/homeassistant/components/local_ip/__init__.py +++ b/homeassistant/components/local_ip/__init__.py @@ -1,16 +1,20 @@ """Get the local IP address of the Home Assistant instance.""" import voluptuous as vol -from homeassistant import config_entries +from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_NAME from homeassistant.core import HomeAssistant import homeassistant.helpers.config_validation as cv -DOMAIN = "local_ip" -PLATFORM = "sensor" +from .const import DOMAIN, PLATFORM CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Optional(CONF_NAME, default=DOMAIN): cv.string})}, + { + DOMAIN: vol.All( + cv.deprecated(CONF_NAME, invalidation_version="0.110"), + vol.Schema({vol.Optional(CONF_NAME, default=DOMAIN): cv.string}), + ) + }, extra=vol.ALLOW_EXTRA, ) @@ -21,14 +25,14 @@ async def async_setup(hass: HomeAssistant, config: dict): if conf: hass.async_create_task( hass.config_entries.flow.async_init( - DOMAIN, data=conf, context={"source": config_entries.SOURCE_IMPORT} + DOMAIN, data=conf, context={"source": SOURCE_IMPORT} ) ) return True -async def async_setup_entry(hass: HomeAssistant, entry: config_entries.ConfigEntry): +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): """Set up local_ip from a config entry.""" hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, PLATFORM) @@ -37,6 +41,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: config_entries.ConfigEnt return True -async def async_unload_entry(hass: HomeAssistant, entry: config_entries.ConfigEntry): +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): """Unload a config entry.""" return await hass.config_entries.async_forward_entry_unload(entry, PLATFORM) diff --git a/homeassistant/components/local_ip/config_flow.py b/homeassistant/components/local_ip/config_flow.py index 58a666a68f34..7d563cae7c4c 100644 --- a/homeassistant/components/local_ip/config_flow.py +++ b/homeassistant/components/local_ip/config_flow.py @@ -1,9 +1,8 @@ """Config flow for local_ip.""" -import voluptuous as vol from homeassistant import config_entries -from . import DOMAIN +from .const import DOMAIN class SimpleConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): @@ -14,20 +13,14 @@ class SimpleConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def async_step_user(self, user_input=None): """Handle the initial step.""" - if user_input is not None: - if any( - user_input["name"] == entry.data["name"] - for entry in self._async_current_entries() - ): - return self.async_abort(reason="already_configured") - return self.async_create_entry(title=user_input["name"], data=user_input) + if self._async_current_entries(): + return self.async_abort(reason="single_instance_allowed") - return self.async_show_form( - step_id="user", - data_schema=vol.Schema({vol.Required("name", default=DOMAIN): str}), - errors={}, - ) + if user_input is None: + return self.async_show_form(step_id="user") + + return self.async_create_entry(title=DOMAIN, data=user_input) async def async_step_import(self, import_info): """Handle import from config file.""" diff --git a/homeassistant/components/local_ip/const.py b/homeassistant/components/local_ip/const.py new file mode 100644 index 000000000000..e18246a97309 --- /dev/null +++ b/homeassistant/components/local_ip/const.py @@ -0,0 +1,6 @@ +"""Local IP constants.""" + +DOMAIN = "local_ip" +PLATFORM = "sensor" + +SENSOR = "address" diff --git a/homeassistant/components/local_ip/sensor.py b/homeassistant/components/local_ip/sensor.py index 274a11faec6e..d159b641fa29 100644 --- a/homeassistant/components/local_ip/sensor.py +++ b/homeassistant/components/local_ip/sensor.py @@ -1,20 +1,22 @@ """Sensor platform for local_ip.""" -from homeassistant.core import HomeAssistant +from homeassistant.const import CONF_NAME from homeassistant.helpers.entity import Entity from homeassistant.util import get_local_ip +from .const import DOMAIN, SENSOR -async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entities): + +async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the platform from config_entry.""" - name = config_entry.data["name"] + name = config_entry.data.get(CONF_NAME) or DOMAIN async_add_entities([IPSensor(name)], True) class IPSensor(Entity): """A simple sensor.""" - def __init__(self, name: str): + def __init__(self, name): """Initialize the sensor.""" self._state = None self._name = name @@ -24,11 +26,21 @@ class IPSensor(Entity): """Return the name of the sensor.""" return self._name + @property + def unique_id(self): + """Return the unique id of the sensor.""" + return SENSOR + @property def state(self): """Return the state of the sensor.""" return self._state + @property + def icon(self): + """Return the icon of the sensor.""" + return "mdi:ip" + def update(self): """Fetch new state data for the sensor.""" self._state = get_local_ip() diff --git a/homeassistant/components/local_ip/strings.json b/homeassistant/components/local_ip/strings.json index 43a88be33251..f8e907b46d56 100644 --- a/homeassistant/components/local_ip/strings.json +++ b/homeassistant/components/local_ip/strings.json @@ -10,7 +10,7 @@ } }, "abort": { - "already_configured": "Integration is already configured with an existing sensor with that name" + "single_instance_allowed": "Only a single configuration of Local IP is allowed." } } } diff --git a/tests/components/local_ip/test_config_flow.py b/tests/components/local_ip/test_config_flow.py index f355e5c75b2d..f6b3ebf6c8ec 100644 --- a/tests/components/local_ip/test_config_flow.py +++ b/tests/components/local_ip/test_config_flow.py @@ -1,19 +1,33 @@ """Tests for the local_ip config_flow.""" -from homeassistant.components.local_ip import DOMAIN +from homeassistant import data_entry_flow +from homeassistant.components.local_ip.const import DOMAIN +from homeassistant.config_entries import SOURCE_USER + +from tests.common import MockConfigEntry async def test_config_flow(hass): """Test we can finish a config flow.""" result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": "user"} + DOMAIN, context={"source": SOURCE_USER} ) - assert result["type"] == "form" + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - result = await hass.config_entries.flow.async_configure( - result["flow_id"], {"name": "test"} - ) - assert result["type"] == "create_entry" + result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY await hass.async_block_till_done() - state = hass.states.get("sensor.test") + state = hass.states.get(f"sensor.{DOMAIN}") assert state + + +async def test_already_setup(hass): + """Test we abort if already setup.""" + MockConfigEntry(domain=DOMAIN, data={},).add_to_hass(hass) + + # Should fail, same NAME + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER} + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "single_instance_allowed" diff --git a/tests/components/local_ip/test_init.py b/tests/components/local_ip/test_init.py index fb43f06eea2b..3f5c4395f2d9 100644 --- a/tests/components/local_ip/test_init.py +++ b/tests/components/local_ip/test_init.py @@ -9,7 +9,7 @@ from homeassistant.util import get_local_ip @pytest.fixture(name="config") def config_fixture(): """Create hass config fixture.""" - return {DOMAIN: {"name": "test"}} + return {DOMAIN: {}} async def test_basic_setup(hass, config): @@ -17,6 +17,6 @@ async def test_basic_setup(hass, config): assert await async_setup_component(hass, DOMAIN, config) await hass.async_block_till_done() local_ip = await hass.async_add_executor_job(get_local_ip) - state = hass.states.get("sensor.test") + state = hass.states.get(f"sensor.{DOMAIN}") assert state assert state.state == local_ip From 90f7cd2d4406ead90f1e07c61308b5957e05c517 Mon Sep 17 00:00:00 2001 From: Lennart Henke Date: Thu, 9 Apr 2020 16:10:17 +0200 Subject: [PATCH 257/653] Fix nextcloud sensor mappings (#33840) --- homeassistant/components/nextcloud/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/nextcloud/__init__.py b/homeassistant/components/nextcloud/__init__.py index 39eb16ec2659..12c17e6081d5 100644 --- a/homeassistant/components/nextcloud/__init__.py +++ b/homeassistant/components/nextcloud/__init__.py @@ -63,7 +63,7 @@ SENSORS = ( "nextcloud_storage_num_files", "nextcloud_storage_num_storages", "nextcloud_storage_num_storages_local", - "nextcloud_storage_num_storage_home", + "nextcloud_storage_num_storages_home", "nextcloud_storage_num_storages_other", "nextcloud_shares_num_shares", "nextcloud_shares_num_shares_user", @@ -83,9 +83,9 @@ SENSORS = ( "nextcloud_database_type", "nextcloud_database_version", "nextcloud_database_version", - "nextcloud_activeusers_last5minutes", - "nextcloud_activeusers_last1hour", - "nextcloud_activeusers_last24hours", + "nextcloud_activeUsers_last5minutes", + "nextcloud_activeUsers_last1hour", + "nextcloud_activeUsers_last24hours", ) From a4c9446b8d75d1b36b1ca97c9f62e005a091ca45 Mon Sep 17 00:00:00 2001 From: On Freund Date: Thu, 9 Apr 2020 18:04:12 +0300 Subject: [PATCH 258/653] Fix Monoprice robustness (#33869) * Silently handle update failures * Limite parallel updates * Remove return values * Remove trailing return * Add test for empty update --- .../components/monoprice/media_player.py | 15 ++++-- .../components/monoprice/test_media_player.py | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/monoprice/media_player.py b/homeassistant/components/monoprice/media_player.py index d85c219691e2..9073ab224f13 100644 --- a/homeassistant/components/monoprice/media_player.py +++ b/homeassistant/components/monoprice/media_player.py @@ -1,6 +1,8 @@ """Support for interfacing with Monoprice 6 zone home audio controller.""" import logging +from serial import SerialException + from homeassistant import core from homeassistant.components.media_player import MediaPlayerDevice from homeassistant.components.media_player.const import ( @@ -18,6 +20,8 @@ from .const import CONF_SOURCES, DOMAIN, SERVICE_RESTORE, SERVICE_SNAPSHOT _LOGGER = logging.getLogger(__name__) +PARALLEL_UPDATES = 1 + SUPPORT_MONOPRICE = ( SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_SET @@ -127,9 +131,15 @@ class MonopriceZone(MediaPlayerDevice): def update(self): """Retrieve latest state.""" - state = self._monoprice.zone_status(self._zone_id) + try: + state = self._monoprice.zone_status(self._zone_id) + except SerialException: + _LOGGER.warning("Could not update zone %d", self._zone_id) + return + if not state: - return False + return + self._state = STATE_ON if state.power else STATE_OFF self._volume = state.volume self._mute = state.mute @@ -138,7 +148,6 @@ class MonopriceZone(MediaPlayerDevice): self._source = self._source_id_name[idx] else: self._source = None - return True @property def entity_registry_enabled_default(self): diff --git a/tests/components/monoprice/test_media_player.py b/tests/components/monoprice/test_media_player.py index 55aac836bc88..0006364b94ed 100644 --- a/tests/components/monoprice/test_media_player.py +++ b/tests/components/monoprice/test_media_player.py @@ -294,6 +294,58 @@ async def test_update(hass): assert state.attributes[ATTR_INPUT_SOURCE] == "three" +async def test_failed_update(hass): + """Test updating failure from monoprice.""" + monoprice = MockMonoprice() + await _setup_monoprice(hass, monoprice) + + # Changing media player to new state + await _call_media_player_service( + hass, SERVICE_VOLUME_SET, {"entity_id": ZONE_1_ID, "volume_level": 0.0} + ) + await _call_media_player_service( + hass, SERVICE_SELECT_SOURCE, {"entity_id": ZONE_1_ID, "source": "one"} + ) + + monoprice.set_source(11, 3) + monoprice.set_volume(11, 38) + + with patch.object(MockMonoprice, "zone_status", side_effect=SerialException): + await async_update_entity(hass, ZONE_1_ID) + await hass.async_block_till_done() + + state = hass.states.get(ZONE_1_ID) + + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 0.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "one" + + +async def test_empty_update(hass): + """Test updating with no state from monoprice.""" + monoprice = MockMonoprice() + await _setup_monoprice(hass, monoprice) + + # Changing media player to new state + await _call_media_player_service( + hass, SERVICE_VOLUME_SET, {"entity_id": ZONE_1_ID, "volume_level": 0.0} + ) + await _call_media_player_service( + hass, SERVICE_SELECT_SOURCE, {"entity_id": ZONE_1_ID, "source": "one"} + ) + + monoprice.set_source(11, 3) + monoprice.set_volume(11, 38) + + with patch.object(MockMonoprice, "zone_status", return_value=None): + await async_update_entity(hass, ZONE_1_ID) + await hass.async_block_till_done() + + state = hass.states.get(ZONE_1_ID) + + assert state.attributes[ATTR_MEDIA_VOLUME_LEVEL] == 0.0 + assert state.attributes[ATTR_INPUT_SOURCE] == "one" + + async def test_supported_features(hass): """Test supported features property.""" await _setup_monoprice(hass, MockMonoprice()) From 70ee9d7f2694be5cd0ff2c18093778a1a3eadd63 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 9 Apr 2020 17:21:01 +0200 Subject: [PATCH 259/653] Updated frontend to 20200407.2 (#33891) --- 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 efd9f99b18a8..3a4919dacaea 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,7 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": ["home-assistant-frontend==20200407.1"], + "requirements": ["home-assistant-frontend==20200407.2"], "dependencies": [ "api", "auth", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index c71c49e12776..bf5b924bdbd3 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -12,7 +12,7 @@ cryptography==2.9 defusedxml==0.6.0 distro==1.4.0 hass-nabucasa==0.34.0 -home-assistant-frontend==20200407.1 +home-assistant-frontend==20200407.2 importlib-metadata==1.5.0 jinja2>=2.11.1 netdisco==2.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index 80390c66f6b6..c9c5814a5b50 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -703,7 +703,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200407.1 +home-assistant-frontend==20200407.2 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e091ca2554cf..c577567635da 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -281,7 +281,7 @@ hole==0.5.1 holidays==0.10.1 # homeassistant.components.frontend -home-assistant-frontend==20200407.1 +home-assistant-frontend==20200407.2 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From bc26be3c11ea40ed8d423f35a0fcbaf7b9cf7cb4 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Thu, 9 Apr 2020 17:41:17 +0200 Subject: [PATCH 260/653] Add and use HTTP_FORBIDDEN constant (#33839) --- homeassistant/components/auth/__init__.py | 4 ++-- homeassistant/components/free_mobile/notify.py | 3 ++- homeassistant/components/melcloud/config_flow.py | 8 ++++---- homeassistant/components/onboarding/views.py | 11 ++++++++--- homeassistant/components/smartthings/__init__.py | 14 +++++++------- .../components/smartthings/config_flow.py | 4 ++-- homeassistant/const.py | 1 + tests/components/airly/test_config_flow.py | 12 ++++++++++-- tests/components/foobot/test_sensor.py | 3 ++- tests/components/http/test_ban.py | 13 +++++++++---- tests/components/melcloud/test_config_flow.py | 4 ++-- tests/components/onboarding/test_views.py | 5 +++-- tests/components/smartthings/test_config_flow.py | 4 ++-- tests/components/smartthings/test_init.py | 8 ++++---- tests/components/yandextts/test_tts.py | 3 ++- 15 files changed, 60 insertions(+), 37 deletions(-) diff --git a/homeassistant/components/auth/__init__.py b/homeassistant/components/auth/__init__.py index 6733361f5c3b..4c540cab8437 100644 --- a/homeassistant/components/auth/__init__.py +++ b/homeassistant/components/auth/__init__.py @@ -132,7 +132,7 @@ from homeassistant.components.http.auth import async_sign_path from homeassistant.components.http.ban import log_invalid_auth from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView -from homeassistant.const import HTTP_OK +from homeassistant.const import HTTP_FORBIDDEN, HTTP_OK from homeassistant.core import HomeAssistant, callback from homeassistant.loader import bind_hass from homeassistant.util import dt as dt_util @@ -313,7 +313,7 @@ class TokenView(HomeAssistantView): if not user.is_active: return self.json( {"error": "access_denied", "error_description": "User is not active"}, - status_code=403, + status_code=HTTP_FORBIDDEN, ) refresh_token = await hass.auth.async_create_refresh_token(user, client_id) diff --git a/homeassistant/components/free_mobile/notify.py b/homeassistant/components/free_mobile/notify.py index c28b56271b9c..a2bee1f0037b 100644 --- a/homeassistant/components/free_mobile/notify.py +++ b/homeassistant/components/free_mobile/notify.py @@ -8,6 +8,7 @@ from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationSer from homeassistant.const import ( CONF_ACCESS_TOKEN, CONF_USERNAME, + HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR, ) import homeassistant.helpers.config_validation as cv @@ -39,7 +40,7 @@ class FreeSMSNotificationService(BaseNotificationService): _LOGGER.error("At least one parameter is missing") elif resp.status_code == 402: _LOGGER.error("Too much SMS send in a few time") - elif resp.status_code == 403: + elif resp.status_code == HTTP_FORBIDDEN: _LOGGER.error("Wrong Username/Password") elif resp.status_code == HTTP_INTERNAL_SERVER_ERROR: _LOGGER.error("Server error, try later") diff --git a/homeassistant/components/melcloud/config_flow.py b/homeassistant/components/melcloud/config_flow.py index 6bda8cc3c282..ed6fc31c4148 100644 --- a/homeassistant/components/melcloud/config_flow.py +++ b/homeassistant/components/melcloud/config_flow.py @@ -9,7 +9,7 @@ import pymelcloud import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME, HTTP_FORBIDDEN from .const import DOMAIN # pylint: disable=unused-import @@ -27,7 +27,7 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): await self.async_set_unique_id(username) self._abort_if_unique_id_configured({CONF_TOKEN: token}) return self.async_create_entry( - title=username, data={CONF_USERNAME: username, CONF_TOKEN: token}, + title=username, data={CONF_USERNAME: username, CONF_TOKEN: token} ) async def _create_client( @@ -40,7 +40,7 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Create client.""" if password is None and token is None: raise ValueError( - "Invalid internal state. Called without either password or token", + "Invalid internal state. Called without either password or token" ) try: @@ -57,7 +57,7 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): self.hass.helpers.aiohttp_client.async_get_clientsession(), ) except ClientResponseError as err: - if err.status == 401 or err.status == 403: + if err.status == 401 or err.status == HTTP_FORBIDDEN: return self.async_abort(reason="invalid_auth") return self.async_abort(reason="cannot_connect") except (asyncio.TimeoutError, ClientError): diff --git a/homeassistant/components/onboarding/views.py b/homeassistant/components/onboarding/views.py index fa859861fb72..32a71ce14e46 100644 --- a/homeassistant/components/onboarding/views.py +++ b/homeassistant/components/onboarding/views.py @@ -6,6 +6,7 @@ import voluptuous as vol from homeassistant.auth.const import GROUP_ID_ADMIN from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView +from homeassistant.const import HTTP_FORBIDDEN from homeassistant.core import callback from .const import ( @@ -95,7 +96,7 @@ class UserOnboardingView(_BaseOnboardingView): async with self._lock: if self._async_is_done(): - return self.json_message("User step already done", 403) + return self.json_message("User step already done", HTTP_FORBIDDEN) provider = _async_get_hass_provider(hass) await provider.async_initialize() @@ -147,7 +148,9 @@ class CoreConfigOnboardingView(_BaseOnboardingView): async with self._lock: if self._async_is_done(): - return self.json_message("Core config step already done", 403) + return self.json_message( + "Core config step already done", HTTP_FORBIDDEN + ) await self._async_mark_done(hass) @@ -173,7 +176,9 @@ class IntegrationOnboardingView(_BaseOnboardingView): async with self._lock: if self._async_is_done(): - return self.json_message("Integration step already done", 403) + return self.json_message( + "Integration step already done", HTTP_FORBIDDEN + ) await self._async_mark_done(hass) diff --git a/homeassistant/components/smartthings/__init__.py b/homeassistant/components/smartthings/__init__.py index a1ea4f98c854..97a7d32a9c19 100644 --- a/homeassistant/components/smartthings/__init__.py +++ b/homeassistant/components/smartthings/__init__.py @@ -9,7 +9,7 @@ from pysmartapp.event import EVENT_TYPE_DEVICE from pysmartthings import Attribute, Capability, SmartThings from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_ACCESS_TOKEN +from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_FORBIDDEN from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.dispatcher import ( @@ -145,7 +145,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry): hass.data[DOMAIN][DATA_BROKERS][entry.entry_id] = broker except ClientResponseError as ex: - if ex.status in (401, 403): + if ex.status in (401, HTTP_FORBIDDEN): _LOGGER.exception( "Unable to setup configuration entry '%s' - please reconfigure the integration", entry.title, @@ -182,7 +182,7 @@ async def async_get_entry_scenes(entry: ConfigEntry, api): try: return await api.scenes(location_id=entry.data[CONF_LOCATION_ID]) except ClientResponseError as ex: - if ex.status == 403: + if ex.status == HTTP_FORBIDDEN: _LOGGER.exception( "Unable to load scenes for configuration entry '%s' because the access token does not have the required access", entry.title, @@ -209,12 +209,12 @@ async def async_remove_entry(hass: HomeAssistantType, entry: ConfigEntry) -> Non """Perform clean-up when entry is being removed.""" api = SmartThings(async_get_clientsession(hass), entry.data[CONF_ACCESS_TOKEN]) - # Remove the installed_app, which if already removed raises a 403 error. + # Remove the installed_app, which if already removed raises a HTTP_FORBIDDEN error. installed_app_id = entry.data[CONF_INSTALLED_APP_ID] try: await api.delete_installed_app(installed_app_id) except ClientResponseError as ex: - if ex.status == 403: + if ex.status == HTTP_FORBIDDEN: _LOGGER.debug( "Installed app %s has already been removed", installed_app_id, @@ -225,7 +225,7 @@ async def async_remove_entry(hass: HomeAssistantType, entry: ConfigEntry) -> Non _LOGGER.debug("Removed installed app %s", installed_app_id) # Remove the app if not referenced by other entries, which if already - # removed raises a 403 error. + # removed raises a HTTP_FORBIDDEN error. all_entries = hass.config_entries.async_entries(DOMAIN) app_id = entry.data[CONF_APP_ID] app_count = sum(1 for entry in all_entries if entry.data[CONF_APP_ID] == app_id) @@ -239,7 +239,7 @@ async def async_remove_entry(hass: HomeAssistantType, entry: ConfigEntry) -> Non try: await api.delete_app(app_id) except ClientResponseError as ex: - if ex.status == 403: + if ex.status == HTTP_FORBIDDEN: _LOGGER.debug("App %s has already been removed", app_id, exc_info=True) else: raise diff --git a/homeassistant/components/smartthings/config_flow.py b/homeassistant/components/smartthings/config_flow.py index 54c9f815008e..249635f9b2a5 100644 --- a/homeassistant/components/smartthings/config_flow.py +++ b/homeassistant/components/smartthings/config_flow.py @@ -6,7 +6,7 @@ from pysmartthings import APIResponseError, AppOAuth, SmartThings import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import CONF_ACCESS_TOKEN +from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_FORBIDDEN from homeassistant.helpers.aiohttp_client import async_get_clientsession from .const import ( @@ -122,7 +122,7 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow): except ClientResponseError as ex: if ex.status == 401: errors[CONF_ACCESS_TOKEN] = "token_unauthorized" - elif ex.status == 403: + elif ex.status == HTTP_FORBIDDEN: errors[CONF_ACCESS_TOKEN] = "token_forbidden" else: errors["base"] = "app_setup_error" diff --git a/homeassistant/const.py b/homeassistant/const.py index b0176d1c004c..42b944e9fb3e 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -527,6 +527,7 @@ HTTP_CREATED = 201 HTTP_MOVED_PERMANENTLY = 301 HTTP_BAD_REQUEST = 400 HTTP_UNAUTHORIZED = 401 +HTTP_FORBIDDEN = 403 HTTP_NOT_FOUND = 404 HTTP_METHOD_NOT_ALLOWED = 405 HTTP_UNPROCESSABLE_ENTITY = 422 diff --git a/tests/components/airly/test_config_flow.py b/tests/components/airly/test_config_flow.py index 1f14e96ed373..83e7d5d210ec 100644 --- a/tests/components/airly/test_config_flow.py +++ b/tests/components/airly/test_config_flow.py @@ -7,7 +7,13 @@ from asynctest import patch from homeassistant import data_entry_flow from homeassistant.components.airly.const import DOMAIN from homeassistant.config_entries import SOURCE_USER -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME +from homeassistant.const import ( + CONF_API_KEY, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, + HTTP_FORBIDDEN, +) from tests.common import MockConfigEntry, load_fixture @@ -33,7 +39,9 @@ async def test_invalid_api_key(hass): """Test that errors are shown when API key is invalid.""" with patch( "airly._private._RequestsHandler.get", - side_effect=AirlyError(403, {"message": "Invalid authentication credentials"}), + side_effect=AirlyError( + HTTP_FORBIDDEN, {"message": "Invalid authentication credentials"} + ), ): result = await hass.config_entries.flow.async_init( diff --git a/tests/components/foobot/test_sensor.py b/tests/components/foobot/test_sensor.py index 10cc3eb47b68..37a0310d1634 100644 --- a/tests/components/foobot/test_sensor.py +++ b/tests/components/foobot/test_sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_PARTS_PER_BILLION, CONCENTRATION_PARTS_PER_MILLION, + HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR, TEMP_CELSIUS, UNIT_PERCENTAGE, @@ -71,7 +72,7 @@ async def test_setup_permanent_error(hass, aioclient_mock): """Expected failures caused by permanent errors in API response.""" fake_async_add_entities = MagicMock() - errors = [400, 401, 403] + errors = [400, 401, HTTP_FORBIDDEN] for error in errors: aioclient_mock.get(re.compile("api.foobot.io/v2/owner/.*"), status=error) result = await foobot.async_setup_platform( diff --git a/tests/components/http/test_ban.py b/tests/components/http/test_ban.py index 28be5cc45c35..ddf08de42b4a 100644 --- a/tests/components/http/test_ban.py +++ b/tests/components/http/test_ban.py @@ -20,6 +20,7 @@ from homeassistant.components.http.ban import ( setup_bans, ) from homeassistant.components.http.view import request_handler_factory +from homeassistant.const import HTTP_FORBIDDEN from homeassistant.setup import async_setup_component from . import mock_real_ip @@ -55,12 +56,16 @@ async def test_access_from_banned_ip(hass, aiohttp_client): for remote_addr in BANNED_IPS: set_real_ip(remote_addr) resp = await client.get("/") - assert resp.status == 403 + assert resp.status == HTTP_FORBIDDEN @pytest.mark.parametrize( "remote_addr, bans, status", - list(zip(BANNED_IPS_WITH_SUPERVISOR, [1, 1, 0], [403, 403, 401])), + list( + zip( + BANNED_IPS_WITH_SUPERVISOR, [1, 1, 0], [HTTP_FORBIDDEN, HTTP_FORBIDDEN, 401] + ) + ), ) async def test_access_from_supervisor_ip( remote_addr, bans, status, hass, aiohttp_client, hassio_env @@ -78,7 +83,7 @@ async def test_access_from_supervisor_ip( mock_real_ip(app)(remote_addr) with patch( - "homeassistant.components.http.ban.async_load_ip_bans_config", return_value=[], + "homeassistant.components.http.ban.async_load_ip_bans_config", return_value=[] ): client = await aiohttp_client(app) @@ -151,7 +156,7 @@ async def test_ip_bans_file_creation(hass, aiohttp_client): m_open.assert_called_once_with(hass.config.path(IP_BANS_FILE), "a") resp = await client.get("/") - assert resp.status == 403 + assert resp.status == HTTP_FORBIDDEN assert m_open.call_count == 1 diff --git a/tests/components/melcloud/test_config_flow.py b/tests/components/melcloud/test_config_flow.py index 4cd64afa053d..c936807484a1 100644 --- a/tests/components/melcloud/test_config_flow.py +++ b/tests/components/melcloud/test_config_flow.py @@ -8,7 +8,7 @@ import pytest from homeassistant import config_entries from homeassistant.components.melcloud.const import DOMAIN -from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR from tests.common import MockConfigEntry @@ -92,7 +92,7 @@ async def test_form_errors(hass, mock_login, mock_get_devices, error, reason): "error,message", [ (401, "invalid_auth"), - (403, "invalid_auth"), + (HTTP_FORBIDDEN, "invalid_auth"), (HTTP_INTERNAL_SERVER_ERROR, "cannot_connect"), ], ) diff --git a/tests/components/onboarding/test_views.py b/tests/components/onboarding/test_views.py index c7c9782e9a82..91ed8d7ae5cc 100644 --- a/tests/components/onboarding/test_views.py +++ b/tests/components/onboarding/test_views.py @@ -6,6 +6,7 @@ import pytest from homeassistant.components import onboarding from homeassistant.components.onboarding import const, views +from homeassistant.const import HTTP_FORBIDDEN from homeassistant.setup import async_setup_component from . import mock_storage @@ -65,7 +66,7 @@ async def test_onboarding_user_already_done(hass, hass_storage, aiohttp_client): }, ) - assert resp.status == 403 + assert resp.status == HTTP_FORBIDDEN async def test_onboarding_user(hass, hass_storage, aiohttp_client): @@ -179,7 +180,7 @@ async def test_onboarding_user_race(hass, hass_storage, aiohttp_client): res1, res2 = await asyncio.gather(resp1, resp2) - assert sorted([res1.status, res2.status]) == [200, 403] + assert sorted([res1.status, res2.status]) == [200, HTTP_FORBIDDEN] async def test_onboarding_integration(hass, hass_storage, hass_client): diff --git a/tests/components/smartthings/test_config_flow.py b/tests/components/smartthings/test_config_flow.py index 0d533910b544..cd43659fccb4 100644 --- a/tests/components/smartthings/test_config_flow.py +++ b/tests/components/smartthings/test_config_flow.py @@ -15,7 +15,7 @@ from homeassistant.components.smartthings.const import ( CONF_REFRESH_TOKEN, DOMAIN, ) -from homeassistant.const import HTTP_NOT_FOUND +from homeassistant.const import HTTP_FORBIDDEN, HTTP_NOT_FOUND from homeassistant.setup import async_setup_component from tests.common import MockConfigEntry, mock_coro @@ -103,7 +103,7 @@ async def test_token_forbidden(hass, smartthings_mock): request_info = Mock(real_url="http://example.com") smartthings_mock.apps.side_effect = ClientResponseError( - request_info=request_info, history=None, status=403 + request_info=request_info, history=None, status=HTTP_FORBIDDEN ) result = await flow.async_step_user({"access_token": str(uuid4())}) diff --git a/tests/components/smartthings/test_init.py b/tests/components/smartthings/test_init.py index 4093f3753f14..78142ae3fc48 100644 --- a/tests/components/smartthings/test_init.py +++ b/tests/components/smartthings/test_init.py @@ -17,7 +17,7 @@ from homeassistant.components.smartthings.const import ( SIGNAL_SMARTTHINGS_UPDATE, SUPPORTED_PLATFORMS, ) -from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.setup import async_setup_component @@ -155,7 +155,7 @@ async def test_scenes_unauthorized_loads_platforms( smartthings_mock.installed_app.return_value = installed_app smartthings_mock.devices.return_value = [device] smartthings_mock.scenes.side_effect = ClientResponseError( - request_info=request_info, history=None, status=403 + request_info=request_info, history=None, status=HTTP_FORBIDDEN ) mock_token = Mock() mock_token.access_token = str(uuid4()) @@ -307,10 +307,10 @@ async def test_remove_entry_already_deleted(hass, config_entry, smartthings_mock request_info = Mock(real_url="http://example.com") # Arrange smartthings_mock.delete_installed_app.side_effect = ClientResponseError( - request_info=request_info, history=None, status=403 + request_info=request_info, history=None, status=HTTP_FORBIDDEN ) smartthings_mock.delete_app.side_effect = ClientResponseError( - request_info=request_info, history=None, status=403 + request_info=request_info, history=None, status=HTTP_FORBIDDEN ) # Act await smartthings.async_remove_entry(hass, config_entry) diff --git a/tests/components/yandextts/test_tts.py b/tests/components/yandextts/test_tts.py index 279ed1fbd017..b1bf1bc8ab53 100644 --- a/tests/components/yandextts/test_tts.py +++ b/tests/components/yandextts/test_tts.py @@ -8,6 +8,7 @@ from homeassistant.components.media_player.const import ( SERVICE_PLAY_MEDIA, ) import homeassistant.components.tts as tts +from homeassistant.const import HTTP_FORBIDDEN from homeassistant.setup import setup_component from tests.common import assert_setup_component, get_test_home_assistant, mock_service @@ -198,7 +199,7 @@ class TestTTSYandexPlatform: "speed": 1, } aioclient_mock.get( - self._base_url, status=403, content=b"test", params=url_param + self._base_url, status=HTTP_FORBIDDEN, content=b"test", params=url_param ) config = {tts.DOMAIN: {"platform": "yandextts", "api_key": "1234567xx"}} From 32499dc8fea35bb849b23ab3c0b2d420e50f7fac Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 9 Apr 2020 09:51:23 -0700 Subject: [PATCH 261/653] Fix onvif consistent return (#33898) --- homeassistant/components/onvif/camera.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 299c9026b0e9..87c96e38c321 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -525,6 +525,8 @@ class ONVIFHassCamera(Camera): error, ) + return None + image = await self.hass.async_add_job(fetch) if image is None: From c651ce06c559e045d7ba449759189102300c1c3c Mon Sep 17 00:00:00 2001 From: vermium-sifell <47034338+vermium-sifell@users.noreply.github.com> Date: Thu, 9 Apr 2020 18:56:17 +0200 Subject: [PATCH 262/653] Add Direct Message support for Discord integration (#33692) * Update notify.py * Update notify.py * Update notify.py Added a comment * Update notify.py * Update notify.py * Update notify.py * Update notify.py * Update notify.py --- homeassistant/components/discord/notify.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/discord/notify.py b/homeassistant/components/discord/notify.py index 19c25a2fd451..e4558b103bd2 100644 --- a/homeassistant/components/discord/notify.py +++ b/homeassistant/components/discord/notify.py @@ -39,7 +39,6 @@ class DiscordNotificationService(BaseNotificationService): """Check if a file exists on disk and is in authorized path.""" if not self.hass.config.is_allowed_path(filename): return False - return os.path.isfile(filename) async def async_send_message(self, message, **kwargs): @@ -52,7 +51,6 @@ class DiscordNotificationService(BaseNotificationService): if ATTR_TARGET not in kwargs: _LOGGER.error("No target specified") return None - data = kwargs.get(ATTR_DATA) or {} if ATTR_IMAGES in data: @@ -67,7 +65,6 @@ class DiscordNotificationService(BaseNotificationService): images.append(image) else: _LOGGER.warning("Image not found: %s", image) - # pylint: disable=unused-variable @discord_bot.event async def on_ready(): @@ -75,19 +72,19 @@ class DiscordNotificationService(BaseNotificationService): try: for channelid in kwargs[ATTR_TARGET]: channelid = int(channelid) - channel = discord_bot.get_channel(channelid) + channel = discord_bot.get_channel( + channelid + ) or discord_bot.get_user(channelid) if channel is None: _LOGGER.warning("Channel not found for id: %s", channelid) continue - # Must create new instances of File for each channel. files = None if images: files = [] for image in images: files.append(discord.File(image)) - await channel.send(message, files=files) except (discord.errors.HTTPException, discord.errors.NotFound) as error: _LOGGER.warning("Communication error: %s", error) From f2fbe657c4d7f2fc71dd4551fcc96771d3baef4a Mon Sep 17 00:00:00 2001 From: Kris Bennett <1435262+i00@users.noreply.github.com> Date: Fri, 10 Apr 2020 03:37:55 +1000 Subject: [PATCH 263/653] Add tradfri cover model to the cover entity attributes (#33674) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ikea Blind Battery * Ikea Blind Battery * Ikea Blind Battery * Ikea Blind Battery * IKEA Blinds Battery * IKEA Blinds Battery * Update cover.py * Clean up * Remove unused import Co-authored-by: Martin Hjelmare Co-authored-by: Joakim Sørensen --- homeassistant/components/tradfri/const.py | 1 + homeassistant/components/tradfri/cover.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/tradfri/const.py b/homeassistant/components/tradfri/const.py index 88225d3282a6..ffb5d64f6d73 100644 --- a/homeassistant/components/tradfri/const.py +++ b/homeassistant/components/tradfri/const.py @@ -9,6 +9,7 @@ ATTR_TRADFRI_GATEWAY = "Gateway" ATTR_TRADFRI_GATEWAY_MODEL = "E1526" ATTR_TRADFRI_MANUFACTURER = "IKEA of Sweden" ATTR_TRANSITION_TIME = "transition_time" +ATTR_MODEL = "model" CONF_ALLOW_TRADFRI_GROUPS = "allow_tradfri_groups" CONF_IDENTITY = "identity" CONF_IMPORT_GROUPS = "import_groups" diff --git a/homeassistant/components/tradfri/cover.py b/homeassistant/components/tradfri/cover.py index d978e5129204..744ba2e13b1a 100644 --- a/homeassistant/components/tradfri/cover.py +++ b/homeassistant/components/tradfri/cover.py @@ -3,7 +3,7 @@ from homeassistant.components.cover import ATTR_POSITION, CoverDevice from .base_class import TradfriBaseDevice -from .const import CONF_GATEWAY_ID, KEY_API, KEY_GATEWAY +from .const import ATTR_MODEL, CONF_GATEWAY_ID, KEY_API, KEY_GATEWAY async def async_setup_entry(hass, config_entry, async_add_entities): @@ -29,6 +29,12 @@ class TradfriCover(TradfriBaseDevice, CoverDevice): self._refresh(device) + @property + def device_state_attributes(self): + """Return the state attributes.""" + attr = {ATTR_MODEL: self._device.device_info.model_number} + return attr + @property def current_cover_position(self): """Return current position of cover. From d510384c0d96a3ed572a4d9dbef17b424b9cf390 Mon Sep 17 00:00:00 2001 From: Carlos Gustavo Sarmiento Date: Thu, 9 Apr 2020 12:37:53 -0700 Subject: [PATCH 264/653] Remove print() from Bayesian Binary Sensor (#33916) --- homeassistant/components/bayesian/binary_sensor.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/homeassistant/components/bayesian/binary_sensor.py b/homeassistant/components/bayesian/binary_sensor.py index 724cb756f651..d3994c3c4210 100644 --- a/homeassistant/components/bayesian/binary_sensor.py +++ b/homeassistant/components/bayesian/binary_sensor.py @@ -298,8 +298,6 @@ class BayesianBinarySensor(BinarySensorDevice): @property def device_state_attributes(self): """Return the state attributes of the sensor.""" - print(self.current_observations) - print(self.observations_by_entity) return { ATTR_OBSERVATIONS: list(self.current_observations.values()), ATTR_OCCURRED_OBSERVATION_ENTITIES: list( From 4c38e6cfa5c3eee5ca14bff6af83c793ffd0a1ec Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:43:42 +0200 Subject: [PATCH 265/653] Use HTTP_BAD_REQUEST constant (#33797) --- homeassistant/components/abode/config_flow.py | 4 ++-- homeassistant/components/auth/__init__.py | 22 ++++++++++--------- homeassistant/components/auth/login_flow.py | 16 ++++++++------ homeassistant/components/calendar/__init__.py | 6 ++--- .../components/cloud/alexa_config.py | 4 ++-- homeassistant/components/cloud/http_api.py | 16 +++++++++----- homeassistant/components/config/__init__.py | 13 +++++++---- homeassistant/components/config/zwave.py | 4 ++-- .../components/free_mobile/notify.py | 3 ++- .../components/hassio/addon_panel.py | 3 ++- homeassistant/components/hassio/handler.py | 4 ++-- homeassistant/components/http/ban.py | 3 ++- .../components/http/data_validator.py | 8 +++++-- .../components/logi_circle/config_flow.py | 4 ++-- .../components/mobile_app/helpers.py | 4 ++-- homeassistant/components/nexia/__init__.py | 9 ++++++-- homeassistant/components/nexia/config_flow.py | 9 ++++++-- homeassistant/components/nuheat/__init__.py | 3 ++- .../components/nuheat/config_flow.py | 9 ++++++-- homeassistant/components/rest/notify.py | 3 ++- homeassistant/components/rest/switch.py | 3 ++- .../components/rest_command/__init__.py | 3 ++- homeassistant/components/tts/__init__.py | 16 ++++++++++---- homeassistant/components/xmpp/notify.py | 3 ++- 24 files changed, 111 insertions(+), 61 deletions(-) diff --git a/homeassistant/components/abode/config_flow.py b/homeassistant/components/abode/config_flow.py index 5c2c5e7b8434..18146551a569 100644 --- a/homeassistant/components/abode/config_flow.py +++ b/homeassistant/components/abode/config_flow.py @@ -5,7 +5,7 @@ from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_BAD_REQUEST from homeassistant.core import callback from .const import DEFAULT_CACHEDB, DOMAIN, LOGGER # pylint: disable=unused-import @@ -46,7 +46,7 @@ class AbodeFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): except (AbodeException, ConnectTimeout, HTTPError) as ex: LOGGER.error("Unable to connect to Abode: %s", str(ex)) - if ex.errcode == 400: + if ex.errcode == HTTP_BAD_REQUEST: return self._show_form({"base": "invalid_credentials"}) return self._show_form({"base": "connection_error"}) diff --git a/homeassistant/components/auth/__init__.py b/homeassistant/components/auth/__init__.py index 4c540cab8437..5b1ca46c41bd 100644 --- a/homeassistant/components/auth/__init__.py +++ b/homeassistant/components/auth/__init__.py @@ -132,7 +132,7 @@ from homeassistant.components.http.auth import async_sign_path from homeassistant.components.http.ban import log_invalid_auth from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView -from homeassistant.const import HTTP_FORBIDDEN, HTTP_OK +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_FORBIDDEN, HTTP_OK from homeassistant.core import HomeAssistant, callback from homeassistant.loader import bind_hass from homeassistant.util import dt as dt_util @@ -261,7 +261,9 @@ class TokenView(HomeAssistantView): hass, data, str(request[KEY_REAL_IP]) ) - return self.json({"error": "unsupported_grant_type"}, status_code=400) + return self.json( + {"error": "unsupported_grant_type"}, status_code=HTTP_BAD_REQUEST + ) async def _async_handle_revoke_token(self, hass, data): """Handle revoke token request.""" @@ -288,7 +290,7 @@ class TokenView(HomeAssistantView): if client_id is None or not indieauth.verify_client_id(client_id): return self.json( {"error": "invalid_request", "error_description": "Invalid client id"}, - status_code=400, + status_code=HTTP_BAD_REQUEST, ) code = data.get("code") @@ -296,7 +298,7 @@ class TokenView(HomeAssistantView): if code is None: return self.json( {"error": "invalid_request", "error_description": "Invalid code"}, - status_code=400, + status_code=HTTP_BAD_REQUEST, ) user = self._retrieve_user(client_id, RESULT_TYPE_USER, code) @@ -304,7 +306,7 @@ class TokenView(HomeAssistantView): if user is None or not isinstance(user, User): return self.json( {"error": "invalid_request", "error_description": "Invalid code"}, - status_code=400, + status_code=HTTP_BAD_REQUEST, ) # refresh user @@ -336,21 +338,21 @@ class TokenView(HomeAssistantView): if client_id is not None and not indieauth.verify_client_id(client_id): return self.json( {"error": "invalid_request", "error_description": "Invalid client id"}, - status_code=400, + status_code=HTTP_BAD_REQUEST, ) token = data.get("refresh_token") if token is None: - return self.json({"error": "invalid_request"}, status_code=400) + return self.json({"error": "invalid_request"}, status_code=HTTP_BAD_REQUEST) refresh_token = await hass.auth.async_get_refresh_token_by_token(token) if refresh_token is None: - return self.json({"error": "invalid_grant"}, status_code=400) + return self.json({"error": "invalid_grant"}, status_code=HTTP_BAD_REQUEST) if refresh_token.client_id != client_id: - return self.json({"error": "invalid_request"}, status_code=400) + return self.json({"error": "invalid_request"}, status_code=HTTP_BAD_REQUEST) access_token = hass.auth.async_create_access_token(refresh_token, remote_addr) @@ -386,7 +388,7 @@ class LinkUserView(HomeAssistantView): ) if credentials is None: - return self.json_message("Invalid code", status_code=400) + return self.json_message("Invalid code", status_code=HTTP_BAD_REQUEST) await hass.auth.async_link_user(user, credentials) return self.json_message("User linked") diff --git a/homeassistant/components/auth/login_flow.py b/homeassistant/components/auth/login_flow.py index 229cbb0c9dfa..c5d824ce617d 100644 --- a/homeassistant/components/auth/login_flow.py +++ b/homeassistant/components/auth/login_flow.py @@ -79,7 +79,7 @@ from homeassistant.components.http.ban import ( ) from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.http.view import HomeAssistantView -from homeassistant.const import HTTP_NOT_FOUND +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_NOT_FOUND from . import indieauth @@ -104,7 +104,7 @@ class AuthProvidersView(HomeAssistantView): if not hass.components.onboarding.async_is_user_onboarded(): return self.json_message( message="Onboarding not finished", - status_code=400, + status_code=HTTP_BAD_REQUEST, message_code="onboarding_required", ) @@ -170,7 +170,9 @@ class LoginFlowIndexView(HomeAssistantView): if not await indieauth.verify_redirect_uri( request.app["hass"], data["client_id"], data["redirect_uri"] ): - return self.json_message("invalid client id or redirect uri", 400) + return self.json_message( + "invalid client id or redirect uri", HTTP_BAD_REQUEST + ) if isinstance(data["handler"], list): handler = tuple(data["handler"]) @@ -188,7 +190,7 @@ class LoginFlowIndexView(HomeAssistantView): except data_entry_flow.UnknownHandler: return self.json_message("Invalid handler specified", HTTP_NOT_FOUND) except data_entry_flow.UnknownStep: - return self.json_message("Handler does not support init", 400) + return self.json_message("Handler does not support init", HTTP_BAD_REQUEST) if result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY: await process_success_login(request) @@ -222,7 +224,7 @@ class LoginFlowResourceView(HomeAssistantView): client_id = data.pop("client_id") if not indieauth.verify_client_id(client_id): - return self.json_message("Invalid client id", 400) + return self.json_message("Invalid client id", HTTP_BAD_REQUEST) try: # do not allow change ip during login flow @@ -230,13 +232,13 @@ class LoginFlowResourceView(HomeAssistantView): if flow["flow_id"] == flow_id and flow["context"][ "ip_address" ] != request.get(KEY_REAL_IP): - return self.json_message("IP address changed", 400) + return self.json_message("IP address changed", HTTP_BAD_REQUEST) result = await self._flow_mgr.async_configure(flow_id, data) except data_entry_flow.UnknownFlow: return self.json_message("Invalid flow specified", HTTP_NOT_FOUND) except vol.Invalid: - return self.json_message("User input malformed", 400) + return self.json_message("User input malformed", HTTP_BAD_REQUEST) if result["type"] != data_entry_flow.RESULT_TYPE_CREATE_ENTRY: # @log_invalid_auth does not work here since it returns HTTP 200 diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index e930a0de5973..6f7427a02347 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -6,7 +6,7 @@ import re from aiohttp import web from homeassistant.components import http -from homeassistant.const import STATE_OFF, STATE_ON +from homeassistant.const import HTTP_BAD_REQUEST, STATE_OFF, STATE_ON from homeassistant.helpers.config_validation import ( # noqa: F401 PLATFORM_SCHEMA, PLATFORM_SCHEMA_BASE, @@ -182,12 +182,12 @@ class CalendarEventView(http.HomeAssistantView): start = request.query.get("start") end = request.query.get("end") if None in (start, end, entity): - return web.Response(status=400) + return web.Response(status=HTTP_BAD_REQUEST) try: start_date = dt.parse_datetime(start) end_date = dt.parse_datetime(end) except (ValueError, AttributeError): - return web.Response(status=400) + return web.Response(status=HTTP_BAD_REQUEST) event_list = await entity.async_get_events( request.app["hass"], start_date, end_date ) diff --git a/homeassistant/components/cloud/alexa_config.py b/homeassistant/components/cloud/alexa_config.py index 86b3532e00e3..dc1f5c11b5d8 100644 --- a/homeassistant/components/cloud/alexa_config.py +++ b/homeassistant/components/cloud/alexa_config.py @@ -13,7 +13,7 @@ from homeassistant.components.alexa import ( errors as alexa_errors, state_report as alexa_state_report, ) -from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES +from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES, HTTP_BAD_REQUEST from homeassistant.core import callback from homeassistant.helpers import entity_registry from homeassistant.helpers.event import async_call_later @@ -114,7 +114,7 @@ class AlexaConfig(alexa_config.AbstractConfig): resp = await cloud_api.async_alexa_access_token(self._cloud) body = await resp.json() - if resp.status == 400: + if resp.status == HTTP_BAD_REQUEST: if body["reason"] in ("RefreshTokenNotFound", "UnknownRegion"): if self.should_report_state: await self._prefs.async_update(alexa_report_state=False) diff --git a/homeassistant/components/cloud/http_api.py b/homeassistant/components/cloud/http_api.py index 8a30c4d94967..03fd8400dfa8 100644 --- a/homeassistant/components/cloud/http_api.py +++ b/homeassistant/components/cloud/http_api.py @@ -19,7 +19,7 @@ from homeassistant.components.google_assistant import helpers as google_helpers from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.data_validator import RequestDataValidator from homeassistant.components.websocket_api import const as ws_const -from homeassistant.const import HTTP_INTERNAL_SERVER_ERROR, HTTP_OK +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_INTERNAL_SERVER_ERROR, HTTP_OK from homeassistant.core import callback from .const import ( @@ -109,11 +109,17 @@ async def async_setup(hass): _CLOUD_ERRORS.update( { - auth.UserNotFound: (400, "User does not exist."), - auth.UserNotConfirmed: (400, "Email not confirmed."), - auth.UserExists: (400, "An account with the given email already exists."), + auth.UserNotFound: (HTTP_BAD_REQUEST, "User does not exist."), + auth.UserNotConfirmed: (HTTP_BAD_REQUEST, "Email not confirmed."), + auth.UserExists: ( + HTTP_BAD_REQUEST, + "An account with the given email already exists.", + ), auth.Unauthenticated: (401, "Authentication failed."), - auth.PasswordChangeRequired: (400, "Password change required."), + auth.PasswordChangeRequired: ( + HTTP_BAD_REQUEST, + "Password change required.", + ), asyncio.TimeoutError: (502, "Unable to reach the Home Assistant cloud."), aiohttp.ClientError: ( HTTP_INTERNAL_SERVER_ERROR, diff --git a/homeassistant/components/config/__init__.py b/homeassistant/components/config/__init__.py index 12a3adbd7017..d7a257b1d9b5 100644 --- a/homeassistant/components/config/__init__.py +++ b/homeassistant/components/config/__init__.py @@ -6,7 +6,12 @@ import os import voluptuous as vol from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CONF_ID, EVENT_COMPONENT_LOADED, HTTP_NOT_FOUND +from homeassistant.const import ( + CONF_ID, + EVENT_COMPONENT_LOADED, + HTTP_BAD_REQUEST, + HTTP_NOT_FOUND, +) from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.setup import ATTR_COMPONENT @@ -129,12 +134,12 @@ class BaseEditConfigView(HomeAssistantView): try: data = await request.json() except ValueError: - return self.json_message("Invalid JSON specified", 400) + return self.json_message("Invalid JSON specified", HTTP_BAD_REQUEST) try: self.key_schema(config_key) except vol.Invalid as err: - return self.json_message(f"Key malformed: {err}", 400) + return self.json_message(f"Key malformed: {err}", HTTP_BAD_REQUEST) hass = request.app["hass"] @@ -146,7 +151,7 @@ class BaseEditConfigView(HomeAssistantView): else: self.data_schema(data) except (vol.Invalid, HomeAssistantError) as err: - return self.json_message(f"Message malformed: {err}", 400) + return self.json_message(f"Message malformed: {err}", HTTP_BAD_REQUEST) path = hass.config.path(self.path) diff --git a/homeassistant/components/config/zwave.py b/homeassistant/components/config/zwave.py index 7e045934f7d2..b8331d8192b8 100644 --- a/homeassistant/components/config/zwave.py +++ b/homeassistant/components/config/zwave.py @@ -6,7 +6,7 @@ from aiohttp.web import Response from homeassistant.components.http import HomeAssistantView from homeassistant.components.zwave import DEVICE_CONFIG_SCHEMA_ENTRY, const -from homeassistant.const import HTTP_NOT_FOUND, HTTP_OK +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_OK import homeassistant.core as ha import homeassistant.helpers.config_validation as cv @@ -51,7 +51,7 @@ class ZWaveLogView(HomeAssistantView): try: lines = int(request.query.get("lines", 0)) except ValueError: - return Response(text="Invalid datetime", status=400) + return Response(text="Invalid datetime", status=HTTP_BAD_REQUEST) hass = request.app["hass"] response = await hass.async_add_job(self._get_log, hass, lines) diff --git a/homeassistant/components/free_mobile/notify.py b/homeassistant/components/free_mobile/notify.py index a2bee1f0037b..a4351bfe6788 100644 --- a/homeassistant/components/free_mobile/notify.py +++ b/homeassistant/components/free_mobile/notify.py @@ -8,6 +8,7 @@ from homeassistant.components.notify import PLATFORM_SCHEMA, BaseNotificationSer from homeassistant.const import ( CONF_ACCESS_TOKEN, CONF_USERNAME, + HTTP_BAD_REQUEST, HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR, ) @@ -36,7 +37,7 @@ class FreeSMSNotificationService(BaseNotificationService): """Send a message to the Free Mobile user cell.""" resp = self.free_client.send_sms(message) - if resp.status_code == 400: + if resp.status_code == HTTP_BAD_REQUEST: _LOGGER.error("At least one parameter is missing") elif resp.status_code == 402: _LOGGER.error("Too much SMS send in a few time") diff --git a/homeassistant/components/hassio/addon_panel.py b/homeassistant/components/hassio/addon_panel.py index cb509cb19a12..d8616a825789 100644 --- a/homeassistant/components/hassio/addon_panel.py +++ b/homeassistant/components/hassio/addon_panel.py @@ -5,6 +5,7 @@ import logging from aiohttp import web from homeassistant.components.http import HomeAssistantView +from homeassistant.const import HTTP_BAD_REQUEST from homeassistant.helpers.typing import HomeAssistantType from .const import ATTR_ADMIN, ATTR_ENABLE, ATTR_ICON, ATTR_PANELS, ATTR_TITLE @@ -52,7 +53,7 @@ class HassIOAddonPanel(HomeAssistantView): # Panel exists for add-on slug if addon not in panels or not panels[addon][ATTR_ENABLE]: _LOGGER.error("Panel is not enable for %s", addon) - return web.Response(status=400) + return web.Response(status=HTTP_BAD_REQUEST) data = panels[addon] # Register panel diff --git a/homeassistant/components/hassio/handler.py b/homeassistant/components/hassio/handler.py index 91b369255428..d929f2d3e82d 100644 --- a/homeassistant/components/hassio/handler.py +++ b/homeassistant/components/hassio/handler.py @@ -12,7 +12,7 @@ from homeassistant.components.http import ( CONF_SSL_CERTIFICATE, DEFAULT_SERVER_HOST, ) -from homeassistant.const import HTTP_OK, SERVER_PORT +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_OK, SERVER_PORT from .const import X_HASSIO @@ -167,7 +167,7 @@ class HassIO: headers={X_HASSIO: os.environ.get("HASSIO_TOKEN", "")}, ) - if request.status not in (HTTP_OK, 400): + if request.status not in (HTTP_OK, HTTP_BAD_REQUEST): _LOGGER.error("%s return code %d.", command, request.status) raise HassioAPIError() diff --git a/homeassistant/components/http/ban.py b/homeassistant/components/http/ban.py index 7fffd19c467d..8b8d2bc56713 100644 --- a/homeassistant/components/http/ban.py +++ b/homeassistant/components/http/ban.py @@ -10,6 +10,7 @@ from aiohttp.web_exceptions import HTTPForbidden, HTTPUnauthorized import voluptuous as vol from homeassistant.config import load_yaml_config_file +from homeassistant.const import HTTP_BAD_REQUEST from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv @@ -81,7 +82,7 @@ def log_invalid_auth(func): async def handle_req(view, request, *args, **kwargs): """Try to log failed login attempts if response status >= 400.""" resp = await func(view, request, *args, **kwargs) - if resp.status >= 400: + if resp.status >= HTTP_BAD_REQUEST: await process_wrong_login(request) return resp diff --git a/homeassistant/components/http/data_validator.py b/homeassistant/components/http/data_validator.py index 51b3b5617e49..84bdb4e1c174 100644 --- a/homeassistant/components/http/data_validator.py +++ b/homeassistant/components/http/data_validator.py @@ -4,6 +4,8 @@ import logging import voluptuous as vol +from homeassistant.const import HTTP_BAD_REQUEST + # mypy: allow-untyped-defs _LOGGER = logging.getLogger(__name__) @@ -38,14 +40,16 @@ class RequestDataValidator: except ValueError: if not self._allow_empty or (await request.content.read()) != b"": _LOGGER.error("Invalid JSON received.") - return view.json_message("Invalid JSON.", 400) + return view.json_message("Invalid JSON.", HTTP_BAD_REQUEST) data = {} try: kwargs["data"] = self._schema(data) except vol.Invalid as err: _LOGGER.error("Data does not match schema: %s", err) - return view.json_message(f"Message format incorrect: {err}", 400) + return view.json_message( + f"Message format incorrect: {err}", HTTP_BAD_REQUEST + ) result = await method(view, request, *args, **kwargs) return result diff --git a/homeassistant/components/logi_circle/config_flow.py b/homeassistant/components/logi_circle/config_flow.py index bc585153b646..527353eebf60 100644 --- a/homeassistant/components/logi_circle/config_flow.py +++ b/homeassistant/components/logi_circle/config_flow.py @@ -9,7 +9,7 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CONF_SENSORS +from homeassistant.const import CONF_SENSORS, HTTP_BAD_REQUEST from homeassistant.core import callback from .const import ( @@ -207,5 +207,5 @@ class LogiCircleAuthCallbackView(HomeAssistantView): ) return self.json_message("Authorisation code saved") return self.json_message( - "Authorisation code missing from query string", status_code=400 + "Authorisation code missing from query string", status_code=HTTP_BAD_REQUEST ) diff --git a/homeassistant/components/mobile_app/helpers.py b/homeassistant/components/mobile_app/helpers.py index 7c7ceb3a8276..b2cb3d22e4b7 100644 --- a/homeassistant/components/mobile_app/helpers.py +++ b/homeassistant/components/mobile_app/helpers.py @@ -7,7 +7,7 @@ from aiohttp.web import Response, json_response from nacl.encoding import Base64Encoder from nacl.secret import SecretBox -from homeassistant.const import HTTP_OK +from homeassistant.const import HTTP_BAD_REQUEST, HTTP_OK from homeassistant.core import Context from homeassistant.helpers.json import JSONEncoder from homeassistant.helpers.typing import HomeAssistantType @@ -99,7 +99,7 @@ def empty_okay_response(headers: Dict = None, status: int = HTTP_OK) -> Response def error_response( - code: str, message: str, status: int = 400, headers: dict = None + code: str, message: str, status: int = HTTP_BAD_REQUEST, headers: dict = None ) -> Response: """Return an error Response.""" return json_response( diff --git a/homeassistant/components/nexia/__init__.py b/homeassistant/components/nexia/__init__.py index fd0b708576d7..9a595ab7a94a 100644 --- a/homeassistant/components/nexia/__init__.py +++ b/homeassistant/components/nexia/__init__.py @@ -9,7 +9,12 @@ from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import ( + CONF_PASSWORD, + CONF_USERNAME, + HTTP_BAD_REQUEST, + HTTP_INTERNAL_SERVER_ERROR, +) from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady import homeassistant.helpers.config_validation as cv @@ -74,7 +79,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): raise ConfigEntryNotReady except HTTPError as http_ex: if ( - http_ex.response.status_code >= 400 + http_ex.response.status_code >= HTTP_BAD_REQUEST and http_ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR ): _LOGGER.error( diff --git a/homeassistant/components/nexia/config_flow.py b/homeassistant/components/nexia/config_flow.py index 01d4dc406cf3..d99be94aaf9a 100644 --- a/homeassistant/components/nexia/config_flow.py +++ b/homeassistant/components/nexia/config_flow.py @@ -6,7 +6,12 @@ from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol from homeassistant import config_entries, core, exceptions -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import ( + CONF_PASSWORD, + CONF_USERNAME, + HTTP_BAD_REQUEST, + HTTP_INTERNAL_SERVER_ERROR, +) from .const import DOMAIN # pylint:disable=unused-import @@ -35,7 +40,7 @@ async def validate_input(hass: core.HomeAssistant, data): except HTTPError as http_ex: _LOGGER.error("HTTP error from Nexia service: %s", http_ex) if ( - http_ex.response.status_code >= 400 + http_ex.response.status_code >= HTTP_BAD_REQUEST and http_ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR ): raise InvalidAuth diff --git a/homeassistant/components/nuheat/__init__.py b/homeassistant/components/nuheat/__init__.py index 6b49a3b975ba..4c7455be3c0a 100644 --- a/homeassistant/components/nuheat/__init__.py +++ b/homeassistant/components/nuheat/__init__.py @@ -11,6 +11,7 @@ from homeassistant.const import ( CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME, + HTTP_BAD_REQUEST, HTTP_INTERNAL_SERVER_ERROR, ) from homeassistant.core import HomeAssistant @@ -84,7 +85,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): raise ConfigEntryNotReady except requests.exceptions.HTTPError as ex: if ( - ex.response.status_code > 400 + ex.response.status_code > HTTP_BAD_REQUEST and ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR ): _LOGGER.error("Failed to login to nuheat: %s", ex) diff --git a/homeassistant/components/nuheat/config_flow.py b/homeassistant/components/nuheat/config_flow.py index cf2f3398309e..bdbdfe22ea31 100644 --- a/homeassistant/components/nuheat/config_flow.py +++ b/homeassistant/components/nuheat/config_flow.py @@ -6,7 +6,12 @@ import requests.exceptions import voluptuous as vol from homeassistant import config_entries, core, exceptions -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import ( + CONF_PASSWORD, + CONF_USERNAME, + HTTP_BAD_REQUEST, + HTTP_INTERNAL_SERVER_ERROR, +) from .const import CONF_SERIAL_NUMBER from .const import DOMAIN # pylint:disable=unused-import @@ -35,7 +40,7 @@ async def validate_input(hass: core.HomeAssistant, data): raise CannotConnect except requests.exceptions.HTTPError as ex: if ( - ex.response.status_code > 400 + ex.response.status_code > HTTP_BAD_REQUEST and ex.response.status_code < HTTP_INTERNAL_SERVER_ERROR ): raise InvalidAuth diff --git a/homeassistant/components/rest/notify.py b/homeassistant/components/rest/notify.py index 60b000eae1ee..9860334afbf2 100644 --- a/homeassistant/components/rest/notify.py +++ b/homeassistant/components/rest/notify.py @@ -21,6 +21,7 @@ from homeassistant.const import ( CONF_RESOURCE, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_BAD_REQUEST, HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION, HTTP_INTERNAL_SERVER_ERROR, @@ -197,7 +198,7 @@ class RestNotificationService(BaseNotificationService): "Server error. Response %d: %s:", response.status_code, response.reason ) elif ( - response.status_code >= 400 + response.status_code >= HTTP_BAD_REQUEST and response.status_code < HTTP_INTERNAL_SERVER_ERROR ): _LOGGER.exception( diff --git a/homeassistant/components/rest/switch.py b/homeassistant/components/rest/switch.py index 71df1852e7ab..84d503bb09e9 100644 --- a/homeassistant/components/rest/switch.py +++ b/homeassistant/components/rest/switch.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_TIMEOUT, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_BAD_REQUEST, HTTP_OK, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -95,7 +96,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) req = await switch.get_device_state(hass) - if req.status >= 400: + if req.status >= HTTP_BAD_REQUEST: _LOGGER.error("Got non-ok response from resource: %s", req.status) else: async_add_entities([switch]) diff --git a/homeassistant/components/rest_command/__init__.py b/homeassistant/components/rest_command/__init__.py index bb2ede6d555e..dc7337c7569c 100644 --- a/homeassistant/components/rest_command/__init__.py +++ b/homeassistant/components/rest_command/__init__.py @@ -15,6 +15,7 @@ from homeassistant.const import ( CONF_URL, CONF_USERNAME, CONF_VERIFY_SSL, + HTTP_BAD_REQUEST, ) from homeassistant.core import callback from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -119,7 +120,7 @@ async def async_setup(hass, config): timeout=timeout, ) as response: - if response.status < 400: + if response.status < HTTP_BAD_REQUEST: _LOGGER.debug( "Success. Url: %s. Status code: %d.", response.url, diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index 6eeab8d6b1ef..1946207337ba 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -22,7 +22,13 @@ from homeassistant.components.media_player.const import ( MEDIA_TYPE_MUSIC, SERVICE_PLAY_MEDIA, ) -from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM, HTTP_NOT_FOUND, HTTP_OK +from homeassistant.const import ( + ATTR_ENTITY_ID, + CONF_PLATFORM, + HTTP_BAD_REQUEST, + HTTP_NOT_FOUND, + HTTP_OK, +) from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_per_platform, discovery @@ -529,9 +535,11 @@ class TextToSpeechUrlView(HomeAssistantView): try: data = await request.json() except ValueError: - return self.json_message("Invalid JSON specified", 400) + return self.json_message("Invalid JSON specified", HTTP_BAD_REQUEST) if not data.get(ATTR_PLATFORM) and data.get(ATTR_MESSAGE): - return self.json_message("Must specify platform and message", 400) + return self.json_message( + "Must specify platform and message", HTTP_BAD_REQUEST + ) p_type = data[ATTR_PLATFORM] message = data[ATTR_MESSAGE] @@ -546,7 +554,7 @@ class TextToSpeechUrlView(HomeAssistantView): resp = self.json({"url": url}, HTTP_OK) except HomeAssistantError as err: _LOGGER.error("Error on init tts: %s", err) - resp = self.json({"error": err}, 400) + resp = self.json({"error": err}, HTTP_BAD_REQUEST) return resp diff --git a/homeassistant/components/xmpp/notify.py b/homeassistant/components/xmpp/notify.py index 28d426986578..0aba4a8bd152 100644 --- a/homeassistant/components/xmpp/notify.py +++ b/homeassistant/components/xmpp/notify.py @@ -29,6 +29,7 @@ from homeassistant.const import ( CONF_RESOURCE, CONF_ROOM, CONF_SENDER, + HTTP_BAD_REQUEST, ) import homeassistant.helpers.config_validation as cv import homeassistant.helpers.template as template_helper @@ -262,7 +263,7 @@ async def async_send_message( result = await hass.async_add_executor_job(get_url, url) - if result.status_code >= 400: + if result.status_code >= HTTP_BAD_REQUEST: _LOGGER.error("Could not load file from %s", url) return None From 9535dd87b098f7159a31ab0a8a7fa5a6233b4095 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Thu, 9 Apr 2020 22:15:20 +0200 Subject: [PATCH 266/653] Rename domain import in modbus (#33906) --- homeassistant/components/modbus/__init__.py | 13 ++++++------- tests/components/modbus/conftest.py | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 3c488bd3245f..1e889043fae9 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -35,7 +35,7 @@ from .const import ( CONF_PARITY, CONF_STOPBITS, DEFAULT_HUB, - MODBUS_DOMAIN, + MODBUS_DOMAIN as DOMAIN, SERVICE_WRITE_COIL, SERVICE_WRITE_REGISTER, ) @@ -68,7 +68,7 @@ ETHERNET_SCHEMA = BASE_SCHEMA.extend( ) CONFIG_SCHEMA = vol.Schema( - {MODBUS_DOMAIN: vol.All(cv.ensure_list, [vol.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA)])}, + {DOMAIN: vol.All(cv.ensure_list, [vol.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA)])}, extra=vol.ALLOW_EXTRA, ) @@ -95,9 +95,9 @@ SERVICE_WRITE_COIL_SCHEMA = vol.Schema( async def async_setup(hass, config): """Set up Modbus component.""" - hass.data[MODBUS_DOMAIN] = hub_collect = {} + hass.data[DOMAIN] = hub_collect = {} - for client_config in config[MODBUS_DOMAIN]: + for client_config in config[DOMAIN]: hub_collect[client_config[CONF_NAME]] = ModbusHub(client_config, hass.loop) def stop_modbus(event): @@ -140,13 +140,13 @@ async def async_setup(hass, config): # Register services for modbus hass.services.async_register( - MODBUS_DOMAIN, + DOMAIN, SERVICE_WRITE_REGISTER, write_register, schema=SERVICE_WRITE_REGISTER_SCHEMA, ) hass.services.async_register( - MODBUS_DOMAIN, SERVICE_WRITE_COIL, write_coil, schema=SERVICE_WRITE_COIL_SCHEMA, + DOMAIN, SERVICE_WRITE_COIL, write_coil, schema=SERVICE_WRITE_COIL_SCHEMA, ) return True @@ -204,7 +204,6 @@ class ModbusHub: stopbits=self._config_stopbits, bytesize=self._config_bytesize, parity=self._config_parity, - timeout=self._config_timeout, loop=self._loop, ) elif self._config_type == "rtuovertcp": diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py index d2fff820cdb0..d9cd62313b47 100644 --- a/tests/components/modbus/conftest.py +++ b/tests/components/modbus/conftest.py @@ -11,7 +11,7 @@ from homeassistant.components.modbus.const import ( CONF_REGISTER_TYPE, CONF_REGISTERS, DEFAULT_HUB, - MODBUS_DOMAIN, + MODBUS_DOMAIN as DOMAIN, ) from homeassistant.const import CONF_NAME, CONF_PLATFORM, CONF_SCAN_INTERVAL from homeassistant.setup import async_setup_component @@ -25,10 +25,10 @@ _LOGGER = logging.getLogger(__name__) @pytest.fixture() def mock_hub(hass): """Mock hub.""" - mock_integration(hass, MockModule(MODBUS_DOMAIN)) + mock_integration(hass, MockModule(DOMAIN)) hub = mock.MagicMock() hub.name = "hub" - hass.data[MODBUS_DOMAIN] = {DEFAULT_HUB: hub} + hass.data[DOMAIN] = {DEFAULT_HUB: hub} return hub From 425c97626a4e92c20ac47b1a5792e70fb441b1b4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 9 Apr 2020 14:13:20 -0700 Subject: [PATCH 267/653] Consolidate translation script (#33911) * Consolidate translation script * Remove commented code --- azure-pipelines-translation.yml | 3 +- script/translations/__init__.py | 1 + script/translations/__main__.py | 40 ++++++++++++++ script/translations/const.py | 4 ++ .../download.py} | 53 ++++++++++++++++--- script/translations/error.py | 10 ++++ script/translations/util.py | 22 ++++++++ script/translations_download | 39 -------------- 8 files changed, 123 insertions(+), 49 deletions(-) create mode 100644 script/translations/__init__.py create mode 100644 script/translations/__main__.py create mode 100644 script/translations/const.py rename script/{translations_download_split.py => translations/download.py} (73%) create mode 100644 script/translations/error.py create mode 100644 script/translations/util.py delete mode 100755 script/translations_download diff --git a/azure-pipelines-translation.yml b/azure-pipelines-translation.yml index 0791cbcaab15..e448f45565bb 100644 --- a/azure-pipelines-translation.yml +++ b/azure-pipelines-translation.yml @@ -54,9 +54,8 @@ jobs: - template: templates/azp-step-git-init.yaml@azure - script: | export LOKALISE_TOKEN="$(lokaliseToken)" - export AZURE_BRANCH="$(Build.SourceBranchName)" - ./script/translations_download + python3 -m script.translations download displayName: 'Download Translation' - script: | git checkout dev diff --git a/script/translations/__init__.py b/script/translations/__init__.py new file mode 100644 index 000000000000..49c4b9b4b00c --- /dev/null +++ b/script/translations/__init__.py @@ -0,0 +1 @@ +"""Translation helper scripts.""" diff --git a/script/translations/__main__.py b/script/translations/__main__.py new file mode 100644 index 000000000000..f2f8b0a38911 --- /dev/null +++ b/script/translations/__main__.py @@ -0,0 +1,40 @@ +"""Validate manifests.""" +import argparse +from pathlib import Path +import sys + +from . import download, error + + +def get_arguments() -> argparse.Namespace: + """Get parsed passed in arguments.""" + parser = argparse.ArgumentParser(description="Home Assistant Scaffolder") + parser.add_argument("action", type=str, choices=["download"]) + parser.add_argument("--debug", action="store_true", help="Enable log output") + + arguments = parser.parse_args() + + return arguments + + +def main(): + """Run a translation script.""" + if not Path("requirements_all.txt").is_file(): + print("Run from project root") + return 1 + + args = get_arguments() + + if args.action == "download": + download.run(args) + + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except error.ExitApp as err: + print() + print(f"Fatal Error: {err.reason}") + sys.exit(err.exit_code) diff --git a/script/translations/const.py b/script/translations/const.py new file mode 100644 index 000000000000..39daf02c204b --- /dev/null +++ b/script/translations/const.py @@ -0,0 +1,4 @@ +"""Translation constants.""" + +PROJECT_ID = "130246255a974bd3b5e8a1.51616605" +DOCKER_IMAGE = "b8329d20280263cad04f65b843e54b9e8e6909a348a678eac959550b5ef5c75f" diff --git a/script/translations_download_split.py b/script/translations/download.py similarity index 73% rename from script/translations_download_split.py rename to script/translations/download.py index 86944ec9f90e..1bb8d80f5522 100755 --- a/script/translations_download_split.py +++ b/script/translations/download.py @@ -3,10 +3,51 @@ import glob import json import os +import pathlib import re +import subprocess from typing import Dict, List, Union +from .const import DOCKER_IMAGE, PROJECT_ID +from .error import ExitApp +from .util import get_lokalise_token + FILENAME_FORMAT = re.compile(r"strings\.(?P\w+)\.json") +LOCAL_DIR = pathlib.Path("build/translations-download").absolute() + + +def run_download_docker(args): + """Run the Docker image to download the translations.""" + pipe_null = {} if args.debug else {"stdout": subprocess.DEVNULL} + + print("Running Docker to download latest translations.") + run = subprocess.run( + [ + "docker", + "run", + "-v", + f"{LOCAL_DIR}:/opt/dest/locale", + "--rm", + f"lokalise/lokalise-cli@sha256:{DOCKER_IMAGE}", + # Lokalise command + "lokalise", + "export", + PROJECT_ID, + "--token", + get_lokalise_token(), + "--export_empty", + "skip", + "--type", + "json", + "--unzip_to", + "/opt/dest", + ], + **pipe_null, + ) + print() + + if run.returncode != 0: + raise ExitApp("Failed to download translations") def load_json(filename: str) -> Union[List, Dict]: @@ -95,18 +136,14 @@ def save_language_translations(lang, translations): save_json(path, platform_translations) -def main(): +def run(args): """Run the script.""" - if not os.path.isfile("requirements_all.txt"): - print("Run this from HA root dir") - return + LOCAL_DIR.mkdir(parents=True, exist_ok=True) + + run_download_docker(args) paths = glob.iglob("build/translations-download/*.json") for path in paths: lang = get_language(path) translations = load_json(path) save_language_translations(lang, translations) - - -if __name__ == "__main__": - main() diff --git a/script/translations/error.py b/script/translations/error.py new file mode 100644 index 000000000000..bc8f21c23b5b --- /dev/null +++ b/script/translations/error.py @@ -0,0 +1,10 @@ +"""Errors for translations.""" + + +class ExitApp(Exception): + """Exception to indicate app should exit.""" + + def __init__(self, reason, exit_code=1): + """Initialize the exit app exception.""" + self.reason = reason + self.exit_code = exit_code diff --git a/script/translations/util.py b/script/translations/util.py new file mode 100644 index 000000000000..806a84457a34 --- /dev/null +++ b/script/translations/util.py @@ -0,0 +1,22 @@ +"""Translation utils.""" +import os +import pathlib + +from .error import ExitApp + + +def get_lokalise_token(): + """Get lokalise token.""" + token = os.environ.get("LOKALISE_TOKEN") + + if token is not None: + return token + + token_file = pathlib.Path(".lokalise_token") + + if not token_file.is_file(): + raise ExitApp( + "Lokalise token not found in env LOKALISE_TOKEN or file .lokalise_token" + ) + + return token_file.read_text().strip() diff --git a/script/translations_download b/script/translations_download deleted file mode 100755 index 2fa16604af1f..000000000000 --- a/script/translations_download +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -# Safe bash settings -# -e Exit on command fail -# -u Exit on unset variable -# -o pipefail Exit if piped command has error code -set -eu -o pipefail - -cd "$(dirname "$0")/.." - -if [ -z "${LOKALISE_TOKEN-}" ] && [ ! -f .lokalise_token ] ; then - echo "Lokalise API token is required to download the latest set of" \ - "translations. Please create an account by using the following link:" \ - "https://lokalise.co/signup/130246255a974bd3b5e8a1.51616605/all/" \ - "Place your token in a new file \".lokalise_token\" in the repo" \ - "root directory." - exit 1 -fi - -# Load token from file if not already in the environment -[ -z "${LOKALISE_TOKEN-}" ] && LOKALISE_TOKEN="$(<.lokalise_token)" - -PROJECT_ID="130246255a974bd3b5e8a1.51616605" -LOCAL_DIR="$(pwd)/build/translations-download" -FILE_FORMAT=json - -mkdir -p ${LOCAL_DIR} - -docker run \ - -v ${LOCAL_DIR}:/opt/dest/locale \ - --rm \ - lokalise/lokalise-cli@sha256:b8329d20280263cad04f65b843e54b9e8e6909a348a678eac959550b5ef5c75f lokalise \ - --token ${LOKALISE_TOKEN} \ - export ${PROJECT_ID} \ - --export_empty skip \ - --type json \ - --unzip_to /opt/dest - -script/translations_download_split.py From 6b2baae0de965bdb2a15c04584260c526f9aebf5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 9 Apr 2020 17:07:39 -0500 Subject: [PATCH 268/653] Fix tplink HS220 dimmers (#33909) * HS220 dimmers are handled as lights with a limited feature set --- homeassistant/components/tplink/light.py | 37 ++++- tests/components/tplink/test_light.py | 177 ++++++++++++++++++++++- 2 files changed, 210 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 9ba47c525099..c9d61784d0bb 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -345,7 +345,7 @@ class TPLinkSmartBulb(Light): def _get_light_state(self) -> LightState: """Get the light state.""" self._update_emeter() - return self._light_state_from_params(self.smartbulb.get_light_state()) + return self._light_state_from_params(self._get_device_state()) def _update_emeter(self): if not self.smartbulb.has_emeter: @@ -427,7 +427,40 @@ class TPLinkSmartBulb(Light): if not diff: return - return self.smartbulb.set_light_state(diff) + return self._set_device_state(diff) + + def _get_device_state(self): + """State of the bulb or smart dimmer switch.""" + if isinstance(self.smartbulb, SmartBulb): + return self.smartbulb.get_light_state() + + # Its not really a bulb, its a dimmable SmartPlug (aka Wall Switch) + return { + LIGHT_STATE_ON_OFF: self.smartbulb.state, + LIGHT_STATE_BRIGHTNESS: self.smartbulb.brightness, + LIGHT_STATE_COLOR_TEMP: 0, + LIGHT_STATE_HUE: 0, + LIGHT_STATE_SATURATION: 0, + } + + def _set_device_state(self, state): + """Set state of the bulb or smart dimmer switch.""" + if isinstance(self.smartbulb, SmartBulb): + return self.smartbulb.set_light_state(state) + + # Its not really a bulb, its a dimmable SmartPlug (aka Wall Switch) + if LIGHT_STATE_BRIGHTNESS in state: + # Brightness of 0 is accepted by the + # device but the underlying library rejects it + # so we turn off instead. + if state[LIGHT_STATE_BRIGHTNESS]: + self.smartbulb.brightness = state[LIGHT_STATE_BRIGHTNESS] + else: + self.smartbulb.state = 0 + elif LIGHT_STATE_ON_OFF in state: + self.smartbulb.state = state[LIGHT_STATE_ON_OFF] + + return self._get_device_state() def _light_state_diff(old_light_state: LightState, new_light_state: LightState): diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index f6f27a888c5c..09c23c6f0e54 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -1,6 +1,6 @@ """Tests for light platform.""" from typing import Callable, NamedTuple -from unittest.mock import Mock, patch +from unittest.mock import Mock, PropertyMock, patch from pyHS100 import SmartDeviceException import pytest @@ -16,7 +16,11 @@ from homeassistant.components.light import ( ATTR_HS_COLOR, DOMAIN as LIGHT_DOMAIN, ) -from homeassistant.components.tplink.common import CONF_DISCOVERY, CONF_LIGHT +from homeassistant.components.tplink.common import ( + CONF_DIMMER, + CONF_DISCOVERY, + CONF_LIGHT, +) from homeassistant.const import ( ATTR_ENTITY_ID, CONF_HOST, @@ -41,6 +45,16 @@ class LightMockData(NamedTuple): get_emeter_monthly_mock: Mock +class SmartSwitchMockData(NamedTuple): + """Mock smart switch data.""" + + sys_info: dict + light_state: dict + state_mock: Mock + brightness_mock: Mock + get_sysinfo_mock: Mock + + @pytest.fixture(name="light_mock_data") def light_mock_data_fixture() -> None: """Create light mock data.""" @@ -152,6 +166,75 @@ def light_mock_data_fixture() -> None: ) +@pytest.fixture(name="dimmer_switch_mock_data") +def dimmer_switch_mock_data_fixture() -> None: + """Create dimmer switch mock data.""" + sys_info = { + "sw_ver": "1.2.3", + "hw_ver": "2.3.4", + "mac": "aa:bb:cc:dd:ee:ff", + "mic_mac": "00:11:22:33:44", + "type": "switch", + "hwId": "1234", + "fwId": "4567", + "oemId": "891011", + "dev_name": "dimmer1", + "rssi": 11, + "latitude": "0", + "longitude": "0", + "is_color": False, + "is_dimmable": True, + "is_variable_color_temp": False, + "model": "HS220", + "alias": "dimmer1", + "feature": ":", + } + + light_state = { + "on_off": 1, + "brightness": 13, + } + + def state(*args, **kwargs): + nonlocal light_state + if len(args) == 0: + return light_state["on_off"] + light_state["on_off"] = args[0] + + def brightness(*args, **kwargs): + nonlocal light_state + if len(args) == 0: + return light_state["brightness"] + if light_state["brightness"] == 0: + light_state["on_off"] = 0 + else: + light_state["on_off"] = 1 + light_state["brightness"] = args[0] + + get_sysinfo_patch = patch( + "homeassistant.components.tplink.common.SmartDevice.get_sysinfo", + return_value=sys_info, + ) + state_patch = patch( + "homeassistant.components.tplink.common.SmartPlug.state", + new_callable=PropertyMock, + side_effect=state, + ) + brightness_patch = patch( + "homeassistant.components.tplink.common.SmartPlug.brightness", + new_callable=PropertyMock, + side_effect=brightness, + ) + with brightness_patch as brightness_mock, state_patch as state_mock, get_sysinfo_patch as get_sysinfo_mock: + yield SmartSwitchMockData( + sys_info=sys_info, + light_state=light_state, + brightness_mock=brightness_mock, + state_mock=state_mock, + get_sysinfo_mock=get_sysinfo_mock, + ) + + async def update_entity(hass: HomeAssistant, entity_id: str) -> None: """Run an update action for an entity.""" await hass.services.async_call( @@ -160,6 +243,96 @@ async def update_entity(hass: HomeAssistant, entity_id: str) -> None: await hass.async_block_till_done() +async def test_smartswitch( + hass: HomeAssistant, dimmer_switch_mock_data: SmartSwitchMockData +) -> None: + """Test function.""" + light_state = dimmer_switch_mock_data.light_state + + await async_setup_component(hass, HA_DOMAIN, {}) + await hass.async_block_till_done() + + await async_setup_component( + hass, + tplink.DOMAIN, + { + tplink.DOMAIN: { + CONF_DISCOVERY: False, + CONF_DIMMER: [{CONF_HOST: "123.123.123.123"}], + } + }, + ) + await hass.async_block_till_done() + + assert hass.states.get("light.dimmer1") + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: "light.dimmer1"}, + blocking=True, + ) + await hass.async_block_till_done() + await update_entity(hass, "light.dimmer1") + + assert hass.states.get("light.dimmer1").state == "off" + assert light_state["on_off"] == 0 + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "light.dimmer1", ATTR_BRIGHTNESS: 50}, + blocking=True, + ) + await hass.async_block_till_done() + await update_entity(hass, "light.dimmer1") + + state = hass.states.get("light.dimmer1") + assert state.state == "on" + assert state.attributes["brightness"] == 48.45 + assert light_state["on_off"] == 1 + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "light.dimmer1", ATTR_BRIGHTNESS: 55}, + blocking=True, + ) + await hass.async_block_till_done() + await update_entity(hass, "light.dimmer1") + + state = hass.states.get("light.dimmer1") + assert state.state == "on" + assert state.attributes["brightness"] == 53.55 + assert light_state["brightness"] == 21 + + light_state["on_off"] = 0 + light_state["brightness"] = 66 + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: "light.dimmer1"}, + blocking=True, + ) + await hass.async_block_till_done() + await update_entity(hass, "light.dimmer1") + + state = hass.states.get("light.dimmer1") + assert state.state == "off" + + await hass.services.async_call( + LIGHT_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: "light.dimmer1"}, blocking=True, + ) + await hass.async_block_till_done() + await update_entity(hass, "light.dimmer1") + + state = hass.states.get("light.dimmer1") + assert state.state == "on" + assert state.attributes["brightness"] == 168.3 + assert light_state["brightness"] == 66 + + async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> None: """Test function.""" light_state = light_mock_data.light_state From 30c6ace0f39d06146306558b517057e78cb27c47 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 10 Apr 2020 00:40:51 +0200 Subject: [PATCH 269/653] Rewrite MQTT & demo Lock tests (#33838) * Refactor tests to remove tests.lock.common * Remove unused is_locked hass binding * Import constants via entity component * Import constants via entity component * Fix light vs lock in naming --- homeassistant/components/lock/__init__.py | 7 -- tests/components/demo/test_init.py | 6 +- tests/components/demo/test_lock.py | 52 ++++++++----- tests/components/lock/common.py | 84 -------------------- tests/components/mqtt/test_lock.py | 95 +++++++++++++---------- 5 files changed, 90 insertions(+), 154 deletions(-) delete mode 100644 tests/components/lock/common.py diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index 92da3a030853..1b79108846f5 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -22,7 +22,6 @@ from homeassistant.helpers.config_validation import ( # noqa: F401 ) from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity_component import EntityComponent -from homeassistant.loader import bind_hass # mypy: allow-untyped-defs, no-check-untyped-defs @@ -45,12 +44,6 @@ _LOGGER = logging.getLogger(__name__) PROP_TO_ATTR = {"changed_by": ATTR_CHANGED_BY, "code_format": ATTR_CODE_FORMAT} -@bind_hass -def is_locked(hass, entity_id): - """Return if the lock is locked based on the statemachine.""" - return hass.states.is_state(entity_id, STATE_LOCKED) - - async def async_setup(hass, config): """Track states and offer events for locks.""" component = hass.data[DOMAIN] = EntityComponent( diff --git a/tests/components/demo/test_init.py b/tests/components/demo/test_init.py index 422ca55b399d..5644aa891ebc 100644 --- a/tests/components/demo/test_init.py +++ b/tests/components/demo/test_init.py @@ -4,7 +4,7 @@ import os import pytest -from homeassistant.components import demo +from homeassistant.components.demo import DOMAIN from homeassistant.components.device_tracker.legacy import YAML_DEVICES from homeassistant.helpers.json import JSONEncoder from homeassistant.setup import async_setup_component @@ -28,14 +28,14 @@ def demo_cleanup(hass): async def test_setting_up_demo(hass): """Test if we can set up the demo and dump it to JSON.""" - assert await async_setup_component(hass, demo.DOMAIN, {"demo": {}}) + assert await async_setup_component(hass, DOMAIN, {DOMAIN: {}}) await hass.async_start() # This is done to make sure entity components don't accidentally store # non-JSON-serializable data in the state machine. try: json.dumps(hass.states.async_all(), cls=JSONEncoder) - except Exception: + except Exception: # pylint: disable=broad-except pytest.fail( "Unable to convert all demo entities to JSON. " "Wrong data in state machine!" diff --git a/tests/components/demo/test_lock.py b/tests/components/demo/test_lock.py index 67e3cd6409b7..68d5a884cf09 100644 --- a/tests/components/demo/test_lock.py +++ b/tests/components/demo/test_lock.py @@ -1,11 +1,19 @@ """The tests for the Demo lock platform.""" import pytest -from homeassistant.components import lock +from homeassistant.components.demo import DOMAIN +from homeassistant.components.lock import ( + DOMAIN as LOCK_DOMAIN, + SERVICE_LOCK, + SERVICE_OPEN, + SERVICE_UNLOCK, + STATE_LOCKED, + STATE_UNLOCKED, +) +from homeassistant.const import ATTR_ENTITY_ID from homeassistant.setup import async_setup_component from tests.common import async_mock_service -from tests.components.lock import common FRONT = "lock.front_door" KITCHEN = "lock.kitchen_door" @@ -16,34 +24,40 @@ OPENABLE_LOCK = "lock.openable_lock" def setup_comp(hass): """Set up demo component.""" hass.loop.run_until_complete( - async_setup_component(hass, lock.DOMAIN, {lock.DOMAIN: {"platform": "demo"}}) + async_setup_component(hass, LOCK_DOMAIN, {LOCK_DOMAIN: {"platform": DOMAIN}}) ) -async def test_is_locked(hass): - """Test if lock is locked.""" - assert lock.is_locked(hass, FRONT) - assert hass.states.is_state(FRONT, "locked") - - assert not lock.is_locked(hass, KITCHEN) - assert hass.states.is_state(KITCHEN, "unlocked") - - async def test_locking(hass): """Test the locking of a lock.""" - await common.async_lock(hass, KITCHEN) - assert lock.is_locked(hass, KITCHEN) + state = hass.states.get(KITCHEN) + assert state.state == STATE_UNLOCKED + + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: KITCHEN}, blocking=True + ) + + state = hass.states.get(KITCHEN) + assert state.state == STATE_LOCKED async def test_unlocking(hass): """Test the unlocking of a lock.""" - await common.async_unlock(hass, FRONT) - assert not lock.is_locked(hass, FRONT) + state = hass.states.get(FRONT) + assert state.state == STATE_LOCKED + + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: FRONT}, blocking=True + ) + + state = hass.states.get(FRONT) + assert state.state == STATE_UNLOCKED async def test_opening(hass): """Test the opening of a lock.""" - calls = async_mock_service(hass, lock.DOMAIN, lock.SERVICE_OPEN) - await common.async_open_lock(hass, OPENABLE_LOCK) - await hass.async_block_till_done() + calls = async_mock_service(hass, LOCK_DOMAIN, SERVICE_OPEN) + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_OPEN, {ATTR_ENTITY_ID: OPENABLE_LOCK}, blocking=True + ) assert len(calls) == 1 diff --git a/tests/components/lock/common.py b/tests/components/lock/common.py deleted file mode 100644 index ec477cba78d1..000000000000 --- a/tests/components/lock/common.py +++ /dev/null @@ -1,84 +0,0 @@ -"""Collection of helper methods. - -All containing methods are legacy helpers that should not be used by new -components. Instead call the service directly. -""" -from homeassistant.components.lock import DOMAIN -from homeassistant.const import ( - ATTR_CODE, - ATTR_ENTITY_ID, - ENTITY_MATCH_ALL, - SERVICE_LOCK, - SERVICE_OPEN, - SERVICE_UNLOCK, -) -from homeassistant.loader import bind_hass - - -@bind_hass -def lock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Lock all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - hass.services.call(DOMAIN, SERVICE_LOCK, data) - - -async def async_lock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Lock all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(DOMAIN, SERVICE_LOCK, data, blocking=True) - - -@bind_hass -def unlock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Unlock all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - hass.services.call(DOMAIN, SERVICE_UNLOCK, data) - - -async def async_unlock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Lock all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(DOMAIN, SERVICE_UNLOCK, data, blocking=True) - - -@bind_hass -def open_lock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Open all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - hass.services.call(DOMAIN, SERVICE_OPEN, data) - - -async def async_open_lock(hass, entity_id=ENTITY_MATCH_ALL, code=None): - """Lock all or specified locks.""" - data = {} - if code: - data[ATTR_CODE] = code - if entity_id: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(DOMAIN, SERVICE_OPEN, data, blocking=True) diff --git a/tests/components/mqtt/test_lock.py b/tests/components/mqtt/test_lock.py index 803fd6c3ab38..a6e011021529 100644 --- a/tests/components/mqtt/test_lock.py +++ b/tests/components/mqtt/test_lock.py @@ -1,6 +1,12 @@ """The tests for the MQTT lock platform.""" -from homeassistant.components import lock -from homeassistant.const import ATTR_ASSUMED_STATE, STATE_LOCKED, STATE_UNLOCKED +from homeassistant.components.lock import ( + DOMAIN as LOCK_DOMAIN, + SERVICE_LOCK, + SERVICE_UNLOCK, + STATE_LOCKED, + STATE_UNLOCKED, +) +from homeassistant.const import ATTR_ASSUMED_STATE, ATTR_ENTITY_ID from homeassistant.setup import async_setup_component from .test_common import ( @@ -26,10 +32,9 @@ from .test_common import ( ) from tests.common import async_fire_mqtt_message -from tests.components.lock import common DEFAULT_CONFIG = { - lock.DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"} + LOCK_DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"} } @@ -37,9 +42,9 @@ async def test_controlling_state_via_topic(hass, mqtt_mock): """Test the controlling state via topic.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "state_topic": "state-topic", @@ -71,9 +76,9 @@ async def test_controlling_non_default_state_via_topic(hass, mqtt_mock): """Test the controlling state via topic.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "state_topic": "state-topic", @@ -105,9 +110,9 @@ async def test_controlling_state_via_topic_and_json_message(hass, mqtt_mock): """Test the controlling state via topic and JSON message.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "state_topic": "state-topic", @@ -141,9 +146,9 @@ async def test_controlling_non_default_state_via_topic_and_json_message( """Test the controlling state via topic and JSON message.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "state_topic": "state-topic", @@ -175,9 +180,9 @@ async def test_sending_mqtt_commands_and_optimistic(hass, mqtt_mock): """Test optimistic mode without state topic.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "command_topic": "command-topic", @@ -193,7 +198,9 @@ async def test_sending_mqtt_commands_and_optimistic(hass, mqtt_mock): assert state.state is STATE_UNLOCKED assert state.attributes.get(ATTR_ASSUMED_STATE) - await common.async_lock(hass, "lock.test") + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True + ) mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False) mqtt_mock.async_publish.reset_mock() @@ -201,7 +208,9 @@ async def test_sending_mqtt_commands_and_optimistic(hass, mqtt_mock): assert state.state is STATE_LOCKED assert state.attributes.get(ATTR_ASSUMED_STATE) - await common.async_unlock(hass, "lock.test") + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True + ) mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False) mqtt_mock.async_publish.reset_mock() @@ -214,9 +223,9 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): """Test optimistic mode without state topic.""" assert await async_setup_component( hass, - lock.DOMAIN, + LOCK_DOMAIN, { - lock.DOMAIN: { + LOCK_DOMAIN: { "platform": "mqtt", "name": "test", "state_topic": "state-topic", @@ -234,7 +243,9 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): assert state.state is STATE_UNLOCKED assert state.attributes.get(ATTR_ASSUMED_STATE) - await common.async_lock(hass, "lock.test") + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True + ) mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False) mqtt_mock.async_publish.reset_mock() @@ -242,7 +253,9 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): assert state.state is STATE_LOCKED assert state.attributes.get(ATTR_ASSUMED_STATE) - await common.async_unlock(hass, "lock.test") + await hass.services.async_call( + LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True + ) mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False) mqtt_mock.async_publish.reset_mock() @@ -254,63 +267,63 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(hass, mqtt_mock): async def test_availability_without_topic(hass, mqtt_mock): """Test availability without defined availability topic.""" await help_test_availability_without_topic( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_default_availability_payload(hass, mqtt_mock): """Test availability by default payload with defined topic.""" await help_test_default_availability_payload( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_custom_availability_payload(hass, mqtt_mock): """Test availability by custom payload with defined topic.""" await help_test_custom_availability_payload( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_setting_attribute_via_mqtt_json_message(hass, mqtt_mock): """Test the setting of attribute via MQTT with JSON payload.""" await help_test_setting_attribute_via_mqtt_json_message( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_setting_attribute_with_template(hass, mqtt_mock): """Test the setting of attribute via MQTT with JSON payload.""" await help_test_setting_attribute_with_template( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_update_with_json_attrs_not_dict(hass, mqtt_mock, caplog): """Test attributes get extracted from a JSON result.""" await help_test_update_with_json_attrs_not_dict( - hass, mqtt_mock, caplog, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, caplog, LOCK_DOMAIN, DEFAULT_CONFIG ) -async def test_update_with_json_attrs_bad_JSON(hass, mqtt_mock, caplog): +async def test_update_with_json_attrs_bad_json(hass, mqtt_mock, caplog): """Test attributes get extracted from a JSON result.""" await help_test_update_with_json_attrs_bad_JSON( - hass, mqtt_mock, caplog, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, caplog, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_discovery_update_attr(hass, mqtt_mock, caplog): """Test update of discovered MQTTAttributes.""" await help_test_discovery_update_attr( - hass, mqtt_mock, caplog, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, caplog, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_unique_id(hass): """Test unique id option only creates one lock per unique_id.""" config = { - lock.DOMAIN: [ + LOCK_DOMAIN: [ { "platform": "mqtt", "name": "Test 1", @@ -327,13 +340,13 @@ async def test_unique_id(hass): }, ] } - await help_test_unique_id(hass, lock.DOMAIN, config) + await help_test_unique_id(hass, LOCK_DOMAIN, config) async def test_discovery_removal_lock(hass, mqtt_mock, caplog): """Test removal of discovered lock.""" data = '{ "name": "test",' ' "command_topic": "test_topic" }' - await help_test_discovery_removal(hass, mqtt_mock, caplog, lock.DOMAIN, data) + await help_test_discovery_removal(hass, mqtt_mock, caplog, LOCK_DOMAIN, data) async def test_discovery_update_lock(hass, mqtt_mock, caplog): @@ -350,60 +363,60 @@ async def test_discovery_update_lock(hass, mqtt_mock, caplog): ' "command_topic": "command_topic",' ' "availability_topic": "availability_topic2" }' ) - await help_test_discovery_update(hass, mqtt_mock, caplog, lock.DOMAIN, data1, data2) + await help_test_discovery_update(hass, mqtt_mock, caplog, LOCK_DOMAIN, data1, data2) async def test_discovery_broken(hass, mqtt_mock, caplog): """Test handling of bad discovery message.""" data1 = '{ "name": "Beer" }' data2 = '{ "name": "Milk",' ' "command_topic": "test_topic" }' - await help_test_discovery_broken(hass, mqtt_mock, caplog, lock.DOMAIN, data1, data2) + await help_test_discovery_broken(hass, mqtt_mock, caplog, LOCK_DOMAIN, data1, data2) async def test_entity_device_info_with_connection(hass, mqtt_mock): """Test MQTT lock device registry integration.""" await help_test_entity_device_info_with_connection( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_device_info_with_identifier(hass, mqtt_mock): """Test MQTT lock device registry integration.""" await help_test_entity_device_info_with_identifier( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_device_info_update(hass, mqtt_mock): """Test device registry update.""" await help_test_entity_device_info_update( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_device_info_remove(hass, mqtt_mock): """Test device registry remove.""" await help_test_entity_device_info_remove( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_id_update_subscriptions(hass, mqtt_mock): """Test MQTT subscriptions are managed when entity_id is updated.""" await help_test_entity_id_update_subscriptions( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_id_update_discovery_update(hass, mqtt_mock): """Test MQTT discovery update when entity_id is updated.""" await help_test_entity_id_update_discovery_update( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) async def test_entity_debug_info_message(hass, mqtt_mock): """Test MQTT debug info.""" await help_test_entity_debug_info_message( - hass, mqtt_mock, lock.DOMAIN, DEFAULT_CONFIG + hass, mqtt_mock, LOCK_DOMAIN, DEFAULT_CONFIG ) From 42ca566e05f3bbdbc5dd37d94aa9b94457396b17 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Thu, 9 Apr 2020 17:49:09 -0500 Subject: [PATCH 270/653] Improve Plex debounce/throttle logic (#33805) * Improve Plex debounce/throttle logic * Use Debouncer helper, rewrite affected tests * Mock storage so files aren't left behind * Don't bother with wrapper method, store debouncer call during init * Test cleanup from review * Don't patch own code in tests --- homeassistant/components/plex/server.py | 38 ++--- tests/components/plex/common.py | 20 --- tests/components/plex/test_config_flow.py | 6 +- tests/components/plex/test_init.py | 155 +++++++++++--------- tests/components/plex/test_server.py | 166 +++++++++++++--------- 5 files changed, 200 insertions(+), 185 deletions(-) delete mode 100644 tests/components/plex/common.py diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index 4134ad4e32b2..d9e2d2bd9cca 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -1,5 +1,4 @@ """Shared class to maintain Plex server instances.""" -from functools import partial, wraps import logging import ssl from urllib.parse import urlparse @@ -13,8 +12,8 @@ import requests.exceptions from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL from homeassistant.core import callback +from homeassistant.helpers.debounce import Debouncer from homeassistant.helpers.dispatcher import async_dispatcher_send -from homeassistant.helpers.event import async_call_later from .const import ( CONF_CLIENT_IDENTIFIER, @@ -43,31 +42,6 @@ plexapi.X_PLEX_PRODUCT = X_PLEX_PRODUCT plexapi.X_PLEX_VERSION = X_PLEX_VERSION -def debounce(func): - """Decorate function to debounce callbacks from Plex websocket.""" - - unsub = None - - async def call_later_listener(self, _): - """Handle call_later callback.""" - nonlocal unsub - unsub = None - await func(self) - - @wraps(func) - async def wrapper(self): - """Schedule async callback.""" - nonlocal unsub - if unsub: - _LOGGER.debug("Throttling update of %s", self.friendly_name) - unsub() # pylint: disable=not-callable - unsub = async_call_later( - self.hass, DEBOUNCE_TIMEOUT, partial(call_later_listener, self), - ) - - return wrapper - - class PlexServer: """Manages a single Plex server connection.""" @@ -87,6 +61,13 @@ class PlexServer: self._accounts = [] self._owner_username = None self._version = None + self.async_update_platforms = Debouncer( + hass, + _LOGGER, + cooldown=DEBOUNCE_TIMEOUT, + immediate=True, + function=self._async_update_platforms, + ).async_call # Header conditionally added as it is not available in config entry v1 if CONF_CLIENT_IDENTIFIER in server_config: @@ -192,8 +173,7 @@ class PlexServer: """Fetch all data from the Plex server in a single method.""" return (self._plex_server.clients(), self._plex_server.sessions()) - @debounce - async def async_update_platforms(self): + async def _async_update_platforms(self): """Update the platform entities.""" _LOGGER.debug("Updating devices") diff --git a/tests/components/plex/common.py b/tests/components/plex/common.py deleted file mode 100644 index adc6f4e0299d..000000000000 --- a/tests/components/plex/common.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Common fixtures and functions for Plex tests.""" -from datetime import timedelta - -from homeassistant.components.plex.const import ( - DEBOUNCE_TIMEOUT, - PLEX_UPDATE_PLATFORMS_SIGNAL, -) -from homeassistant.helpers.dispatcher import async_dispatcher_send -import homeassistant.util.dt as dt_util - -from tests.common import async_fire_time_changed - - -async def trigger_plex_update(hass, server_id): - """Update Plex by sending signal and jumping ahead by debounce timeout.""" - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() - next_update = dt_util.utcnow() + timedelta(seconds=DEBOUNCE_TIMEOUT) - async_fire_time_changed(hass, next_update) - await hass.async_block_till_done() diff --git a/tests/components/plex/test_config_flow.py b/tests/components/plex/test_config_flow.py index bd5d45c0246b..d839ccc674b8 100644 --- a/tests/components/plex/test_config_flow.py +++ b/tests/components/plex/test_config_flow.py @@ -15,13 +15,14 @@ from homeassistant.components.plex.const import ( CONF_USE_EPISODE_ART, DOMAIN, PLEX_SERVER_CONFIG, + PLEX_UPDATE_PLATFORMS_SIGNAL, SERVERS, ) from homeassistant.config_entries import ENTRY_STATE_LOADED from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TOKEN, CONF_URL +from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.setup import async_setup_component -from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS, MOCK_SERVERS, MOCK_TOKEN from .mock_classes import MockPlexAccount, MockPlexServer @@ -415,7 +416,8 @@ async def test_option_flow_new_users_available(hass, caplog): server_id = mock_plex_server.machineIdentifier - await trigger_plex_update(hass, server_id) + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users diff --git a/tests/components/plex/test_init.py b/tests/components/plex/test_init.py index cd1ea8725bd4..ef2199b11c53 100644 --- a/tests/components/plex/test_init.py +++ b/tests/components/plex/test_init.py @@ -3,8 +3,9 @@ import copy from datetime import timedelta import ssl -from asynctest import patch +from asynctest import ClockedTestCase, patch import plexapi +import pytest import requests from homeassistant.components.media_player import DOMAIN as MP_DOMAIN @@ -23,14 +24,19 @@ from homeassistant.const import ( CONF_URL, CONF_VERIFY_SSL, ) +from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util -from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS, MOCK_SERVERS, MOCK_TOKEN from .mock_classes import MockPlexAccount, MockPlexServer -from tests.common import MockConfigEntry, async_fire_time_changed +from tests.common import ( + MockConfigEntry, + async_fire_time_changed, + async_test_home_assistant, + mock_storage, +) async def test_setup_with_config(hass): @@ -67,70 +73,90 @@ async def test_setup_with_config(hass): assert loaded_server.plex_server == mock_plex_server - assert server_id in hass.data[const.DOMAIN][const.DISPATCHERS] - assert server_id in hass.data[const.DOMAIN][const.WEBSOCKETS] - assert ( - hass.data[const.DOMAIN][const.PLATFORMS_COMPLETED][server_id] == const.PLATFORMS - ) +class TestClockedPlex(ClockedTestCase): + """Create clock-controlled asynctest class.""" -async def test_setup_with_config_entry(hass, caplog): - """Test setup component with config.""" + @pytest.fixture(autouse=True) + def inject_fixture(self, caplog): + """Inject pytest fixtures as instance attributes.""" + self.caplog = caplog - mock_plex_server = MockPlexServer() + async def setUp(self): + """Initialize this test class.""" + self.hass = await async_test_home_assistant(self.loop) + self.mock_storage = mock_storage() + self.mock_storage.__enter__() - entry = MockConfigEntry( - domain=const.DOMAIN, - data=DEFAULT_DATA, - options=DEFAULT_OPTIONS, - unique_id=DEFAULT_DATA["server_id"], - ) + async def tearDown(self): + """Clean up the HomeAssistant instance.""" + await self.hass.async_stop() + self.mock_storage.__exit__(None, None, None) - with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( - "homeassistant.components.plex.PlexWebsocket.listen" - ) as mock_listen: - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) + async def test_setup_with_config_entry(self): + """Test setup component with config.""" + hass = self.hass + + mock_plex_server = MockPlexServer() + + entry = MockConfigEntry( + domain=const.DOMAIN, + data=DEFAULT_DATA, + options=DEFAULT_OPTIONS, + unique_id=DEFAULT_DATA["server_id"], + ) + + with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( + "homeassistant.components.plex.PlexWebsocket.listen" + ) as mock_listen: + entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert mock_listen.called + + assert len(hass.config_entries.async_entries(const.DOMAIN)) == 1 + assert entry.state == ENTRY_STATE_LOADED + + server_id = mock_plex_server.machineIdentifier + loaded_server = hass.data[const.DOMAIN][const.SERVERS][server_id] + + assert loaded_server.plex_server == mock_plex_server + + async_dispatcher_send( + hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id) + ) await hass.async_block_till_done() - assert mock_listen.called + sensor = hass.states.get("sensor.plex_plex_server_1") + assert sensor.state == str(len(mock_plex_server.accounts)) - assert len(hass.config_entries.async_entries(const.DOMAIN)) == 1 - assert entry.state == ENTRY_STATE_LOADED - - server_id = mock_plex_server.machineIdentifier - loaded_server = hass.data[const.DOMAIN][const.SERVERS][server_id] - - assert loaded_server.plex_server == mock_plex_server - - assert server_id in hass.data[const.DOMAIN][const.DISPATCHERS] - assert server_id in hass.data[const.DOMAIN][const.WEBSOCKETS] - assert ( - hass.data[const.DOMAIN][const.PLATFORMS_COMPLETED][server_id] == const.PLATFORMS - ) - - await trigger_plex_update(hass, server_id) - - sensor = hass.states.get("sensor.plex_plex_server_1") - assert sensor.state == str(len(mock_plex_server.accounts)) - - await trigger_plex_update(hass, server_id) - - for test_exception in ( - plexapi.exceptions.BadRequest, - requests.exceptions.RequestException, - ): - with patch.object( - mock_plex_server, "clients", side_effect=test_exception - ) as patched_clients_bad_request: - await trigger_plex_update(hass, server_id) - - assert patched_clients_bad_request.called - assert ( - f"Could not connect to Plex server: {mock_plex_server.friendlyName}" - in caplog.text + # Ensure existing entities refresh + await self.advance(const.DEBOUNCE_TIMEOUT) + async_dispatcher_send( + hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id) ) - caplog.clear() + await hass.async_block_till_done() + + for test_exception in ( + plexapi.exceptions.BadRequest, + requests.exceptions.RequestException, + ): + with patch.object( + mock_plex_server, "clients", side_effect=test_exception + ) as patched_clients_bad_request: + await self.advance(const.DEBOUNCE_TIMEOUT) + async_dispatcher_send( + hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id) + ) + await hass.async_block_till_done() + + assert patched_clients_bad_request.called + assert ( + f"Could not connect to Plex server: {mock_plex_server.friendlyName}" + in self.caplog.text + ) + self.caplog.clear() async def test_set_config_entry_unique_id(hass): @@ -251,22 +277,12 @@ async def test_unload_config_entry(hass): assert loaded_server.plex_server == mock_plex_server - assert server_id in hass.data[const.DOMAIN][const.DISPATCHERS] - assert server_id in hass.data[const.DOMAIN][const.WEBSOCKETS] - assert ( - hass.data[const.DOMAIN][const.PLATFORMS_COMPLETED][server_id] == const.PLATFORMS - ) - with patch("homeassistant.components.plex.PlexWebsocket.close") as mock_close: await hass.config_entries.async_unload(entry.entry_id) assert mock_close.called assert entry.state == ENTRY_STATE_NOT_LOADED - assert server_id not in hass.data[const.DOMAIN][const.SERVERS] - assert server_id not in hass.data[const.DOMAIN][const.DISPATCHERS] - assert server_id not in hass.data[const.DOMAIN][const.WEBSOCKETS] - async def test_setup_with_photo_session(hass): """Test setup component with config.""" @@ -292,7 +308,8 @@ async def test_setup_with_photo_session(hass): server_id = mock_plex_server.machineIdentifier - await trigger_plex_update(hass, server_id) + async_dispatcher_send(hass, const.PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() media_player = hass.states.get("media_player.plex_product_title") assert media_player.state == "idle" diff --git a/tests/components/plex/test_server.py b/tests/components/plex/test_server.py index 3b70f30189af..6eff97ae7dc5 100644 --- a/tests/components/plex/test_server.py +++ b/tests/components/plex/test_server.py @@ -1,8 +1,7 @@ """Tests for Plex server.""" import copy -from datetime import timedelta -from asynctest import patch +from asynctest import ClockedTestCase, patch from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.components.plex.const import ( @@ -14,13 +13,11 @@ from homeassistant.components.plex.const import ( SERVERS, ) from homeassistant.helpers.dispatcher import async_dispatcher_send -import homeassistant.util.dt as dt_util -from .common import trigger_plex_update from .const import DEFAULT_DATA, DEFAULT_OPTIONS from .mock_classes import MockPlexServer -from tests.common import MockConfigEntry, async_fire_time_changed +from tests.common import MockConfigEntry, async_test_home_assistant, mock_storage async def test_new_users_available(hass): @@ -48,7 +45,8 @@ async def test_new_users_available(hass): server_id = mock_plex_server.machineIdentifier - await trigger_plex_update(hass, server_id) + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users @@ -86,7 +84,8 @@ async def test_new_ignored_users_available(hass, caplog): server_id = mock_plex_server.machineIdentifier - await trigger_plex_update(hass, server_id) + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users @@ -100,72 +99,109 @@ async def test_new_ignored_users_available(hass, caplog): assert sensor.state == str(len(mock_plex_server.accounts)) -async def test_mark_sessions_idle(hass): - """Test marking media_players as idle when sessions end.""" - entry = MockConfigEntry( - domain=DOMAIN, - data=DEFAULT_DATA, - options=DEFAULT_OPTIONS, - unique_id=DEFAULT_DATA["server_id"], - ) +class TestClockedPlex(ClockedTestCase): + """Create clock-controlled asynctest class.""" - mock_plex_server = MockPlexServer(config_entry=entry) + async def setUp(self): + """Initialize this test class.""" + self.hass = await async_test_home_assistant(self.loop) + self.mock_storage = mock_storage() + self.mock_storage.__enter__() - with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( - "homeassistant.components.plex.PlexWebsocket.listen" - ): - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) + async def tearDown(self): + """Clean up the HomeAssistant instance.""" + await self.hass.async_stop() + self.mock_storage.__exit__(None, None, None) + + async def test_mark_sessions_idle(self): + """Test marking media_players as idle when sessions end.""" + hass = self.hass + + entry = MockConfigEntry( + domain=DOMAIN, + data=DEFAULT_DATA, + options=DEFAULT_OPTIONS, + unique_id=DEFAULT_DATA["server_id"], + ) + + mock_plex_server = MockPlexServer(config_entry=entry) + + with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( + "homeassistant.components.plex.PlexWebsocket.listen" + ): + entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + server_id = mock_plex_server.machineIdentifier + + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) await hass.async_block_till_done() - server_id = mock_plex_server.machineIdentifier + sensor = hass.states.get("sensor.plex_plex_server_1") + assert sensor.state == str(len(mock_plex_server.accounts)) - await trigger_plex_update(hass, server_id) + mock_plex_server.clear_clients() + mock_plex_server.clear_sessions() - sensor = hass.states.get("sensor.plex_plex_server_1") - assert sensor.state == str(len(mock_plex_server.accounts)) - - mock_plex_server.clear_clients() - mock_plex_server.clear_sessions() - - await trigger_plex_update(hass, server_id) - - sensor = hass.states.get("sensor.plex_plex_server_1") - assert sensor.state == "0" - - -async def test_debouncer(hass, caplog): - """Test debouncer decorator logic.""" - entry = MockConfigEntry( - domain=DOMAIN, - data=DEFAULT_DATA, - options=DEFAULT_OPTIONS, - unique_id=DEFAULT_DATA["server_id"], - ) - - mock_plex_server = MockPlexServer(config_entry=entry) - - with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( - "homeassistant.components.plex.PlexWebsocket.listen" - ): - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) + await self.advance(DEBOUNCE_TIMEOUT) + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) await hass.async_block_till_done() - server_id = mock_plex_server.machineIdentifier + sensor = hass.states.get("sensor.plex_plex_server_1") + assert sensor.state == "0" - # First two updates are skipped - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - await hass.async_block_till_done() + async def test_debouncer(self): + """Test debouncer behavior.""" + hass = self.hass - next_update = dt_util.utcnow() + timedelta(seconds=DEBOUNCE_TIMEOUT) - async_fire_time_changed(hass, next_update) - await hass.async_block_till_done() + entry = MockConfigEntry( + domain=DOMAIN, + data=DEFAULT_DATA, + options=DEFAULT_OPTIONS, + unique_id=DEFAULT_DATA["server_id"], + ) - assert ( - caplog.text.count(f"Throttling update of {mock_plex_server.friendlyName}") == 2 - ) + mock_plex_server = MockPlexServer(config_entry=entry) + + with patch("plexapi.server.PlexServer", return_value=mock_plex_server), patch( + "homeassistant.components.plex.PlexWebsocket.listen" + ): + entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + server_id = mock_plex_server.machineIdentifier + + with patch.object(mock_plex_server, "clients", return_value=[]), patch.object( + mock_plex_server, "sessions", return_value=[] + ) as mock_update: + # Called immediately + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + assert mock_update.call_count == 1 + + # Throttled + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + assert mock_update.call_count == 1 + + # Throttled + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + assert mock_update.call_count == 1 + + # Called from scheduler + await self.advance(DEBOUNCE_TIMEOUT) + await hass.async_block_till_done() + assert mock_update.call_count == 2 + + # Throttled + async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) + await hass.async_block_till_done() + assert mock_update.call_count == 2 + + # Called from scheduler + await self.advance(DEBOUNCE_TIMEOUT) + await hass.async_block_till_done() + assert mock_update.call_count == 3 From 127cc744a4f242f3713041ce4ba19e5bcd079ece Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 9 Apr 2020 19:09:05 -0400 Subject: [PATCH 271/653] Bump pyvizio version for vizio (#33924) --- homeassistant/components/vizio/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/vizio/manifest.json b/homeassistant/components/vizio/manifest.json index 22b4911d8cfb..02904bedbdeb 100644 --- a/homeassistant/components/vizio/manifest.json +++ b/homeassistant/components/vizio/manifest.json @@ -2,7 +2,7 @@ "domain": "vizio", "name": "VIZIO SmartCast", "documentation": "https://www.home-assistant.io/integrations/vizio", - "requirements": ["pyvizio==0.1.45"], + "requirements": ["pyvizio==0.1.46"], "codeowners": ["@raman325"], "config_flow": true, "zeroconf": ["_viziocast._tcp.local."], diff --git a/requirements_all.txt b/requirements_all.txt index c9c5814a5b50..255dd1c9538f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1743,7 +1743,7 @@ pyversasense==0.0.6 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.45 +pyvizio==0.1.46 # homeassistant.components.velux pyvlx==0.2.12 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c577567635da..2fcc32d1c223 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -661,7 +661,7 @@ pyvera==0.3.7 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.45 +pyvizio==0.1.46 # homeassistant.components.html5 pywebpush==1.9.2 From c2d1db61b694ff470a2f867a196b58216d8b24bc Mon Sep 17 00:00:00 2001 From: Kit Klein <33464407+kit-klein@users.noreply.github.com> Date: Thu, 9 Apr 2020 19:16:33 -0400 Subject: [PATCH 272/653] Exclude access token from host info updates in Konnected config flow (#33912) * black updates * test that host update doesn't impact access token --- homeassistant/components/konnected/config_flow.py | 11 +++++------ tests/components/konnected/test_config_flow.py | 8 +++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/konnected/config_flow.py b/homeassistant/components/konnected/config_flow.py index 6a3631a8c0d4..a6b01560c50b 100644 --- a/homeassistant/components/konnected/config_flow.py +++ b/homeassistant/components/konnected/config_flow.py @@ -283,11 +283,6 @@ class KonnectedFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): # build config info and wait for user confirmation self.data[CONF_HOST] = user_input[CONF_HOST] self.data[CONF_PORT] = user_input[CONF_PORT] - self.data[CONF_ACCESS_TOKEN] = self.hass.data.get(DOMAIN, {}).get( - CONF_ACCESS_TOKEN - ) or "".join( - random.choices(f"{string.ascii_uppercase}{string.digits}", k=20) - ) # brief delay to allow processing of recent status req await asyncio.sleep(0.1) @@ -343,8 +338,12 @@ class KonnectedFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): }, ) - # Attach default options and create entry + # Create access token, attach default options and create entry self.data[CONF_DEFAULT_OPTIONS] = self.options + self.data[CONF_ACCESS_TOKEN] = self.hass.data.get(DOMAIN, {}).get( + CONF_ACCESS_TOKEN + ) or "".join(random.choices(f"{string.ascii_uppercase}{string.digits}", k=20)) + return self.async_create_entry( title=KONN_PANEL_MODEL_NAMES[self.data[CONF_MODEL]], data=self.data, ) diff --git a/tests/components/konnected/test_config_flow.py b/tests/components/konnected/test_config_flow.py index 917afc5357ab..0bf6e7846ae1 100644 --- a/tests/components/konnected/test_config_flow.py +++ b/tests/components/konnected/test_config_flow.py @@ -362,10 +362,11 @@ async def test_ssdp_host_update(hass, mock_panel): ) assert result["type"] == "abort" - # confirm the host value was updated + # confirm the host value was updated, access_token was not entry = hass.config_entries.async_entries(config_flow.DOMAIN)[0] assert entry.data["host"] == "1.1.1.1" assert entry.data["port"] == 1234 + assert entry.data["access_token"] == "11223344556677889900" async def test_import_existing_config(hass, mock_panel): @@ -494,6 +495,7 @@ async def test_import_existing_config_entry(hass, mock_panel): data={ "host": "0.0.0.0", "port": 1111, + "access_token": "ORIGINALTOKEN", "id": "112233445566", "extra": "something", }, @@ -546,14 +548,14 @@ async def test_import_existing_config_entry(hass, mock_panel): assert result["type"] == "abort" - # We should have updated the entry + # We should have updated the host info but not the access token assert len(hass.config_entries.async_entries("konnected")) == 1 assert hass.config_entries.async_entries("konnected")[0].data == { "host": "1.2.3.4", "port": 1234, + "access_token": "ORIGINALTOKEN", "id": "112233445566", "model": "Konnected Pro", - "access_token": "SUPERSECRETTOKEN", "extra": "something", } From a000af5c034e58e1c93368fcdd6d72176f16260f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 9 Apr 2020 19:10:02 -0500 Subject: [PATCH 273/653] Fix tplink HS220 dimmers (round 2) (#33928) * HS220 dimmers are handled as lights with a limited feature set * Dimmers look up has has_emeter every call so this is cached as well now to resovle the performance issue. --- homeassistant/components/tplink/light.py | 20 +++++++---- tests/components/tplink/test_light.py | 42 +++++++++++------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index c9d61784d0bb..7e41d5af9e86 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -40,6 +40,7 @@ ATTR_MONTHLY_ENERGY_KWH = "monthly_energy_kwh" LIGHT_STATE_DFT_ON = "dft_on_state" LIGHT_STATE_ON_OFF = "on_off" +LIGHT_STATE_RELAY_STATE = "relay_state" LIGHT_STATE_BRIGHTNESS = "brightness" LIGHT_STATE_COLOR_TEMP = "color_temp" LIGHT_STATE_HUE = "hue" @@ -116,6 +117,7 @@ class LightFeatures(NamedTuple): supported_features: int min_mireds: float max_mireds: float + has_emeter: bool class TPLinkSmartBulb(Light): @@ -273,8 +275,9 @@ class TPLinkSmartBulb(Light): model = sysinfo[LIGHT_SYSINFO_MODEL] min_mireds = None max_mireds = None + has_emeter = self.smartbulb.has_emeter - if sysinfo.get(LIGHT_SYSINFO_IS_DIMMABLE): + if sysinfo.get(LIGHT_SYSINFO_IS_DIMMABLE) or LIGHT_STATE_BRIGHTNESS in sysinfo: supported_features += SUPPORT_BRIGHTNESS if sysinfo.get(LIGHT_SYSINFO_IS_VARIABLE_COLOR_TEMP): supported_features += SUPPORT_COLOR_TEMP @@ -294,6 +297,7 @@ class TPLinkSmartBulb(Light): supported_features=supported_features, min_mireds=min_mireds, max_mireds=max_mireds, + has_emeter=has_emeter, ) def _get_light_state_retry(self) -> LightState: @@ -348,7 +352,7 @@ class TPLinkSmartBulb(Light): return self._light_state_from_params(self._get_device_state()) def _update_emeter(self): - if not self.smartbulb.has_emeter: + if not self._light_features.has_emeter: return now = dt_util.utcnow() @@ -434,10 +438,11 @@ class TPLinkSmartBulb(Light): if isinstance(self.smartbulb, SmartBulb): return self.smartbulb.get_light_state() + sysinfo = self.smartbulb.sys_info # Its not really a bulb, its a dimmable SmartPlug (aka Wall Switch) return { - LIGHT_STATE_ON_OFF: self.smartbulb.state, - LIGHT_STATE_BRIGHTNESS: self.smartbulb.brightness, + LIGHT_STATE_ON_OFF: sysinfo[LIGHT_STATE_RELAY_STATE], + LIGHT_STATE_BRIGHTNESS: sysinfo.get(LIGHT_STATE_BRIGHTNESS, 0), LIGHT_STATE_COLOR_TEMP: 0, LIGHT_STATE_HUE: 0, LIGHT_STATE_SATURATION: 0, @@ -456,9 +461,12 @@ class TPLinkSmartBulb(Light): if state[LIGHT_STATE_BRIGHTNESS]: self.smartbulb.brightness = state[LIGHT_STATE_BRIGHTNESS] else: - self.smartbulb.state = 0 + self.smartbulb.state = self.smartbulb.SWITCH_STATE_OFF elif LIGHT_STATE_ON_OFF in state: - self.smartbulb.state = state[LIGHT_STATE_ON_OFF] + if state[LIGHT_STATE_ON_OFF]: + self.smartbulb.state = self.smartbulb.SWITCH_STATE_ON + else: + self.smartbulb.state = self.smartbulb.SWITCH_STATE_OFF return self._get_device_state() diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 09c23c6f0e54..27d00024706e 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -49,7 +49,6 @@ class SmartSwitchMockData(NamedTuple): """Mock smart switch data.""" sys_info: dict - light_state: dict state_mock: Mock brightness_mock: Mock get_sysinfo_mock: Mock @@ -188,28 +187,28 @@ def dimmer_switch_mock_data_fixture() -> None: "model": "HS220", "alias": "dimmer1", "feature": ":", - } - - light_state = { - "on_off": 1, + "relay_state": 1, "brightness": 13, } def state(*args, **kwargs): - nonlocal light_state + nonlocal sys_info if len(args) == 0: - return light_state["on_off"] - light_state["on_off"] = args[0] + return sys_info["relay_state"] + if args[0] == "ON": + sys_info["relay_state"] = 1 + else: + sys_info["relay_state"] = 0 def brightness(*args, **kwargs): - nonlocal light_state + nonlocal sys_info if len(args) == 0: - return light_state["brightness"] - if light_state["brightness"] == 0: - light_state["on_off"] = 0 + return sys_info["brightness"] + if sys_info["brightness"] == 0: + sys_info["relay_state"] = 0 else: - light_state["on_off"] = 1 - light_state["brightness"] = args[0] + sys_info["relay_state"] = 1 + sys_info["brightness"] = args[0] get_sysinfo_patch = patch( "homeassistant.components.tplink.common.SmartDevice.get_sysinfo", @@ -228,7 +227,6 @@ def dimmer_switch_mock_data_fixture() -> None: with brightness_patch as brightness_mock, state_patch as state_mock, get_sysinfo_patch as get_sysinfo_mock: yield SmartSwitchMockData( sys_info=sys_info, - light_state=light_state, brightness_mock=brightness_mock, state_mock=state_mock, get_sysinfo_mock=get_sysinfo_mock, @@ -247,7 +245,7 @@ async def test_smartswitch( hass: HomeAssistant, dimmer_switch_mock_data: SmartSwitchMockData ) -> None: """Test function.""" - light_state = dimmer_switch_mock_data.light_state + sys_info = dimmer_switch_mock_data.sys_info await async_setup_component(hass, HA_DOMAIN, {}) await hass.async_block_till_done() @@ -276,7 +274,7 @@ async def test_smartswitch( await update_entity(hass, "light.dimmer1") assert hass.states.get("light.dimmer1").state == "off" - assert light_state["on_off"] == 0 + assert sys_info["relay_state"] == 0 await hass.services.async_call( LIGHT_DOMAIN, @@ -290,7 +288,7 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" assert state.attributes["brightness"] == 48.45 - assert light_state["on_off"] == 1 + assert sys_info["relay_state"] == 1 await hass.services.async_call( LIGHT_DOMAIN, @@ -304,10 +302,10 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" assert state.attributes["brightness"] == 53.55 - assert light_state["brightness"] == 21 + assert sys_info["brightness"] == 21 - light_state["on_off"] = 0 - light_state["brightness"] = 66 + sys_info["relay_state"] = 0 + sys_info["brightness"] = 66 await hass.services.async_call( LIGHT_DOMAIN, @@ -330,7 +328,7 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" assert state.attributes["brightness"] == 168.3 - assert light_state["brightness"] == 66 + assert sys_info["brightness"] == 66 async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> None: From 2edfa822372dba456fe6d39992fa06e30f3bea54 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 9 Apr 2020 19:44:04 -0500 Subject: [PATCH 274/653] Guard IPP against negative ink levels (#33931) --- homeassistant/components/ipp/sensor.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/ipp/sensor.py b/homeassistant/components/ipp/sensor.py index 1ce162500c57..fd278d3df2ef 100644 --- a/homeassistant/components/ipp/sensor.py +++ b/homeassistant/components/ipp/sensor.py @@ -116,7 +116,12 @@ class IPPMarkerSensor(IPPSensor): @property def state(self) -> Union[None, str, int, float]: """Return the state of the sensor.""" - return self.coordinator.data.markers[self.marker_index].level + level = self.coordinator.data.markers[self.marker_index].level + + if level >= 0: + return level + + return None class IPPPrinterSensor(IPPSensor): From e9c412bac66cfdb825159f88474125b7d26138f1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 9 Apr 2020 17:52:33 -0700 Subject: [PATCH 275/653] Migrate translations upload (#33926) * Migrate translations upload * Fix token in download command * Minor cleanup --- azure-pipelines-translation.yml | 2 +- script/translations/__main__.py | 6 +- script/translations/const.py | 2 + script/translations/download.py | 11 ++-- script/translations/upload.py | 77 ++++++++++++++++++++++ script/translations/util.py | 12 ++++ script/translations_upload | 45 ------------- script/translations_upload_merge.py | 99 ----------------------------- 8 files changed, 100 insertions(+), 154 deletions(-) create mode 100755 script/translations/upload.py delete mode 100755 script/translations_upload delete mode 100755 script/translations_upload_merge.py diff --git a/azure-pipelines-translation.yml b/azure-pipelines-translation.yml index e448f45565bb..9f4db8d2005d 100644 --- a/azure-pipelines-translation.yml +++ b/azure-pipelines-translation.yml @@ -37,7 +37,7 @@ jobs: export LOKALISE_TOKEN="$(lokaliseToken)" export AZURE_BRANCH="$(Build.SourceBranchName)" - ./script/translations_upload + python3 -m script.translations upload displayName: 'Upload Translation' - job: 'Download' diff --git a/script/translations/__main__.py b/script/translations/__main__.py index f2f8b0a38911..c08aefc0bee7 100644 --- a/script/translations/__main__.py +++ b/script/translations/__main__.py @@ -3,13 +3,13 @@ import argparse from pathlib import Path import sys -from . import download, error +from . import download, error, upload def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" parser = argparse.ArgumentParser(description="Home Assistant Scaffolder") - parser.add_argument("action", type=str, choices=["download"]) + parser.add_argument("action", type=str, choices=["download", "upload"]) parser.add_argument("--debug", action="store_true", help="Enable log output") arguments = parser.parse_args() @@ -27,6 +27,8 @@ def main(): if args.action == "download": download.run(args) + elif args.action == "upload": + upload.run(args) return 0 diff --git a/script/translations/const.py b/script/translations/const.py index 39daf02c204b..f70cc72811e7 100644 --- a/script/translations/const.py +++ b/script/translations/const.py @@ -1,4 +1,6 @@ """Translation constants.""" +import pathlib PROJECT_ID = "130246255a974bd3b5e8a1.51616605" DOCKER_IMAGE = "b8329d20280263cad04f65b843e54b9e8e6909a348a678eac959550b5ef5c75f" +INTEGRATIONS_DIR = pathlib.Path("homeassistant/components") diff --git a/script/translations/download.py b/script/translations/download.py index 1bb8d80f5522..aed94b9266d0 100755 --- a/script/translations/download.py +++ b/script/translations/download.py @@ -16,10 +16,8 @@ FILENAME_FORMAT = re.compile(r"strings\.(?P\w+)\.json") LOCAL_DIR = pathlib.Path("build/translations-download").absolute() -def run_download_docker(args): +def run_download_docker(): """Run the Docker image to download the translations.""" - pipe_null = {} if args.debug else {"stdout": subprocess.DEVNULL} - print("Running Docker to download latest translations.") run = subprocess.run( [ @@ -31,10 +29,10 @@ def run_download_docker(args): f"lokalise/lokalise-cli@sha256:{DOCKER_IMAGE}", # Lokalise command "lokalise", - "export", - PROJECT_ID, "--token", get_lokalise_token(), + "export", + PROJECT_ID, "--export_empty", "skip", "--type", @@ -42,7 +40,6 @@ def run_download_docker(args): "--unzip_to", "/opt/dest", ], - **pipe_null, ) print() @@ -140,7 +137,7 @@ def run(args): """Run the script.""" LOCAL_DIR.mkdir(parents=True, exist_ok=True) - run_download_docker(args) + run_download_docker() paths = glob.iglob("build/translations-download/*.json") for path in paths: diff --git a/script/translations/upload.py b/script/translations/upload.py new file mode 100755 index 000000000000..0b5fb237126f --- /dev/null +++ b/script/translations/upload.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Merge all translation sources into a single JSON file.""" +import json +import os +import pathlib +import re +import subprocess + +from .const import DOCKER_IMAGE, INTEGRATIONS_DIR, PROJECT_ID +from .error import ExitApp +from .util import get_current_branch, get_lokalise_token + +FILENAME_FORMAT = re.compile(r"strings\.(?P\w+)\.json") +LOCAL_FILE = pathlib.Path("build/translations-upload.json").absolute() +CONTAINER_FILE = "/opt/src/build/translations-upload.json" +LANG_ISO = "en" + + +def run_upload_docker(): + """Run the Docker image to upload the translations.""" + print("Running Docker to upload latest translations.") + run = subprocess.run( + [ + "docker", + "run", + "-v", + f"{LOCAL_FILE}:{CONTAINER_FILE}", + "--rm", + f"lokalise/lokalise-cli@sha256:{DOCKER_IMAGE}", + # Lokalise command + "lokalise", + "--token", + get_lokalise_token(), + "import", + PROJECT_ID, + "--file", + CONTAINER_FILE, + "--lang_iso", + LANG_ISO, + "--convert_placeholders", + "0", + "--replace", + "1", + ], + ) + print() + + if run.returncode != 0: + raise ExitApp("Failed to download translations") + + +def run(args): + """Run the script.""" + if get_current_branch() != "dev" and os.environ.get("AZURE_BRANCH") != "dev": + raise ExitApp( + "Please only run the translations upload script from a clean checkout of dev." + ) + + translations = {"component": {}} + + for path in INTEGRATIONS_DIR.glob(f"*{os.sep}strings*.json"): + component = path.parent.name + match = FILENAME_FORMAT.search(path.name) + platform = match.group("suffix") if match else None + + parent = translations["component"].setdefault(component, {}) + + if platform: + platforms = parent.setdefault("platform", {}) + parent = platforms.setdefault(platform, {}) + + parent.update(json.loads(path.read_text())) + + LOCAL_FILE.parent.mkdir(parents=True, exist_ok=True) + LOCAL_FILE.write_text(json.dumps(translations, indent=4, sort_keys=True)) + + # run_upload_docker() diff --git a/script/translations/util.py b/script/translations/util.py index 806a84457a34..d3026f94cb40 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -1,6 +1,7 @@ """Translation utils.""" import os import pathlib +import subprocess from .error import ExitApp @@ -20,3 +21,14 @@ def get_lokalise_token(): ) return token_file.read_text().strip() + + +def get_current_branch(): + """Get current branch.""" + return ( + subprocess.run( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=subprocess.PIPE + ) + .stdout.decode() + .strip() + ) diff --git a/script/translations_upload b/script/translations_upload deleted file mode 100755 index fec8a3387c1d..000000000000 --- a/script/translations_upload +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash - -# Safe bash settings -# -e Exit on command fail -# -u Exit on unset variable -# -o pipefail Exit if piped command has error code -set -eu -o pipefail - -cd "$(dirname "$0")/.." - -if [ -z "${LOKALISE_TOKEN-}" ] && [ ! -f .lokalise_token ] ; then - echo "Lokalise API token is required to download the latest set of" \ - "translations. Please create an account by using the following link:" \ - "https://lokalise.co/signup/130246255a974bd3b5e8a1.51616605/all/" \ - "Place your token in a new file \".lokalise_token\" in the repo" \ - "root directory." - exit 1 -fi - -# Load token from file if not already in the environment -[ -z "${LOKALISE_TOKEN-}" ] && LOKALISE_TOKEN="$(<.lokalise_token)" - -PROJECT_ID="130246255a974bd3b5e8a1.51616605" -LOCAL_FILE="$(pwd)/build/translations-upload.json" -LANG_ISO=en - -CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) - -# Check Travis and Azure environment as well -if [ "${CURRENT_BRANCH-}" != "dev" ] && [ "${AZURE_BRANCH-}" != "dev" ]; then - echo "Please only run the translations upload script from a clean checkout of dev." - exit 1 -fi - -script/translations_upload_merge.py - -docker run \ - -v ${LOCAL_FILE}:/opt/src/${LOCAL_FILE} \ - lokalise/lokalise-cli@sha256:2198814ebddfda56ee041a4b427521757dd57f75415ea9693696a64c550cef21 lokalise \ - --token ${LOKALISE_TOKEN} \ - import ${PROJECT_ID} \ - --file /opt/src/${LOCAL_FILE} \ - --lang_iso ${LANG_ISO} \ - --convert_placeholders 0 \ - --replace 1 diff --git a/script/translations_upload_merge.py b/script/translations_upload_merge.py deleted file mode 100755 index 86de1f1842bf..000000000000 --- a/script/translations_upload_merge.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 -"""Merge all translation sources into a single JSON file.""" -import glob -import itertools -import json -import os -import re -from typing import Dict, List, Union - -FILENAME_FORMAT = re.compile(r"strings\.(?P\w+)\.json") - - -def load_json(filename: str) -> Union[List, Dict]: - """Load JSON data from a file and return as dict or list. - - Defaults to returning empty dict if file is not found. - """ - with open(filename, encoding="utf-8") as fdesc: - return json.loads(fdesc.read()) - return {} - - -def save_json(filename: str, data: Union[List, Dict]): - """Save JSON data to a file. - - Returns True on success. - """ - data = json.dumps(data, sort_keys=True, indent=4) - with open(filename, "w", encoding="utf-8") as fdesc: - fdesc.write(data) - return True - return False - - -def find_strings_files(): - """Return the paths of the strings source files.""" - return itertools.chain( - glob.iglob("strings*.json"), glob.iglob(f"*{os.sep}strings*.json") - ) - - -def get_component_platform(path): - """Get the component and platform name from the path.""" - directory, filename = os.path.split(path) - match = FILENAME_FORMAT.search(filename) - suffix = match.group("suffix") if match else None - if directory: - return directory, suffix - else: - return suffix, None - - -def get_translation_dict(translations, component, platform): - """Return the dict to hold component translations.""" - if not component: - return translations["component"] - - if component not in translations["component"]: - translations["component"][component] = {} - - if not platform: - return translations["component"][component] - - if "platform" not in translations["component"][component]: - translations["component"][component]["platform"] = {} - - if platform not in translations["component"][component]["platform"]: - translations["component"][component]["platform"][platform] = {} - - return translations["component"][component]["platform"][platform] - - -def main(): - """Run the script.""" - if not os.path.isfile("requirements_all.txt"): - print("Run this from HA root dir") - return - - root = os.getcwd() - os.chdir(os.path.join("homeassistant", "components")) - - translations = {"component": {}} - - paths = find_strings_files() - for path in paths: - component, platform = get_component_platform(path) - parent = get_translation_dict(translations, component, platform) - strings = load_json(path) - parent.update(strings) - - os.chdir(root) - - os.makedirs("build", exist_ok=True) - - save_json(os.path.join("build", "translations-upload.json"), translations) - - -if __name__ == "__main__": - main() From e9e1ec5312ea4c97bb0d5fe053fb73c5cd3e37e9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 9 Apr 2020 17:54:56 -0700 Subject: [PATCH 276/653] Migrate translations clean script (#33930) --- script/translations/__main__.py | 6 +- .../clean.py} | 63 +++---------------- script/translations/lokalise.py | 42 +++++++++++++ 3 files changed, 55 insertions(+), 56 deletions(-) rename script/{translations_clean.py => translations/clean.py} (53%) create mode 100644 script/translations/lokalise.py diff --git a/script/translations/__main__.py b/script/translations/__main__.py index c08aefc0bee7..2d153360a2a3 100644 --- a/script/translations/__main__.py +++ b/script/translations/__main__.py @@ -3,13 +3,13 @@ import argparse from pathlib import Path import sys -from . import download, error, upload +from . import clean, download, error, upload def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" parser = argparse.ArgumentParser(description="Home Assistant Scaffolder") - parser.add_argument("action", type=str, choices=["download", "upload"]) + parser.add_argument("action", type=str, choices=["download", "clean", "upload"]) parser.add_argument("--debug", action="store_true", help="Enable log output") arguments = parser.parse_args() @@ -29,6 +29,8 @@ def main(): download.run(args) elif args.action == "upload": upload.run(args) + elif args.action == "clean": + clean.run() return 0 diff --git a/script/translations_clean.py b/script/translations/clean.py similarity index 53% rename from script/translations_clean.py rename to script/translations/clean.py index d801ce0a3085..51afbae1caee 100644 --- a/script/translations_clean.py +++ b/script/translations/clean.py @@ -1,52 +1,9 @@ """Find translation keys that are in Lokalise but no longer defined in source.""" import json -import pathlib -import sys -import requests - -INTEGRATION_DIR = pathlib.Path("homeassistant/components") -PROJECT_ID = "130246255a974bd3b5e8a1.51616605" - - -class Lokalise: - """Lokalise API.""" - - def __init__(self, project_id, token): - """Initialize Lokalise API.""" - self.project_id = project_id - self.token = token - - def request(self, method, path, data): - """Make a request to the Lokalise API.""" - method = method.upper() - kwargs = {"headers": {"x-api-token": self.token}} - if method == "GET": - kwargs["params"] = data - else: - kwargs["json"] = data - - req = requests.request( - method, - f"https://api.lokalise.com/api2/projects/{self.project_id}/{path}", - **kwargs, - ) - req.raise_for_status() - return req.json() - - def keys_list(self, params={}): - """Fetch key ID from a name. - - https://app.lokalise.com/api2docs/curl/#transition-list-all-keys-get - """ - return self.request("GET", "keys", params)["keys"] - - def keys_delete_multiple(self, key_ids): - """Delete multiple keys. - - https://app.lokalise.com/api2docs/curl/#transition-delete-multiple-keys-delete - """ - return self.request("DELETE", "keys", {"keys": key_ids}) +from .const import INTEGRATIONS_DIR, PROJECT_ID +from .lokalise import Lokalise +from .util import get_lokalise_token def find_extra(base, translations, path_prefix, missing_keys): @@ -67,7 +24,7 @@ def find(): """Find all missing keys.""" missing_keys = [] - for int_dir in INTEGRATION_DIR.iterdir(): + for int_dir in INTEGRATIONS_DIR.iterdir(): strings = int_dir / "strings.json" if not strings.is_file(): @@ -91,9 +48,9 @@ def run(): if not missing_keys: print("No missing translations!") - return 0 + return - lokalise = Lokalise(PROJECT_ID, pathlib.Path(".lokalise_token").read_text().strip()) + lokalise = Lokalise(PROJECT_ID, get_lokalise_token()) to_delete = [] @@ -107,10 +64,8 @@ def run(): continue to_delete.append(key_data[0]["key_id"]) + while input("Type YES to delete these keys: ") != "YES": + pass + print("Deleting keys:", ", ".join(map(str, to_delete))) print(lokalise.keys_delete_multiple(to_delete)) - return 0 - - -if __name__ == "__main__": - sys.exit(run()) diff --git a/script/translations/lokalise.py b/script/translations/lokalise.py new file mode 100644 index 000000000000..67bd1bc56000 --- /dev/null +++ b/script/translations/lokalise.py @@ -0,0 +1,42 @@ +"""API for Lokalise.""" +import requests + + +class Lokalise: + """Lokalise API.""" + + def __init__(self, project_id, token): + """Initialize Lokalise API.""" + self.project_id = project_id + self.token = token + + def request(self, method, path, data): + """Make a request to the Lokalise API.""" + method = method.upper() + kwargs = {"headers": {"x-api-token": self.token}} + if method == "GET": + kwargs["params"] = data + else: + kwargs["json"] = data + + req = requests.request( + method, + f"https://api.lokalise.com/api2/projects/{self.project_id}/{path}", + **kwargs, + ) + req.raise_for_status() + return req.json() + + def keys_list(self, params={}): + """Fetch key ID from a name. + + https://app.lokalise.com/api2docs/curl/#transition-list-all-keys-get + """ + return self.request("GET", "keys", params)["keys"] + + def keys_delete_multiple(self, key_ids): + """Delete multiple keys. + + https://app.lokalise.com/api2docs/curl/#transition-delete-multiple-keys-delete + """ + return self.request("DELETE", "keys", {"keys": key_ids}) From 9b7e31eca3e43eae997a7ee486403dca51d5f991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Fri, 10 Apr 2020 10:59:06 +0300 Subject: [PATCH 277/653] Make f-strings without placeholder normal strings (#33938) --- homeassistant/components/homeassistant/scene.py | 2 +- homeassistant/components/homekit/type_lights.py | 2 +- homeassistant/helpers/config_entry_oauth2_flow.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/homeassistant/scene.py b/homeassistant/components/homeassistant/scene.py index 9dad912886d8..5eadc39ebed8 100644 --- a/homeassistant/components/homeassistant/scene.py +++ b/homeassistant/components/homeassistant/scene.py @@ -73,7 +73,7 @@ def _ensure_no_intersection(value): CONF_SCENE_ID = "scene_id" CONF_SNAPSHOT = "snapshot_entities" -DATA_PLATFORM = f"homeassistant_scene" +DATA_PLATFORM = "homeassistant_scene" STATES_SCHEMA = vol.All(dict, _convert_states) diff --git a/homeassistant/components/homekit/type_lights.py b/homeassistant/components/homekit/type_lights.py index e38af1a04eb8..62f374c88884 100644 --- a/homeassistant/components/homekit/type_lights.py +++ b/homeassistant/components/homekit/type_lights.py @@ -115,7 +115,7 @@ class Light(HomeAccessory): if CHAR_BRIGHTNESS in char_values: if char_values[CHAR_BRIGHTNESS] == 0: - events[-1] = f"Set state to 0" + events[-1] = "Set state to 0" service = SERVICE_TURN_OFF else: params[ATTR_BRIGHTNESS_PCT] = char_values[CHAR_BRIGHTNESS] diff --git a/homeassistant/helpers/config_entry_oauth2_flow.py b/homeassistant/helpers/config_entry_oauth2_flow.py index 0ae91ad5591a..0c5a5c3873ec 100644 --- a/homeassistant/helpers/config_entry_oauth2_flow.py +++ b/homeassistant/helpers/config_entry_oauth2_flow.py @@ -369,7 +369,7 @@ class OAuth2AuthorizeCallbackView(HomeAssistantView): state = _decode_jwt(hass, request.query["state"]) if state is None: - return web.Response(text=f"Invalid state") + return web.Response(text="Invalid state") await hass.config_entries.flow.async_configure( flow_id=state["flow_id"], user_input=request.query["code"] From 8e188d7e75dbb0038bd08a7c6d65bdf7ed0f198f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 07:42:34 -0500 Subject: [PATCH 278/653] Make homekit aware of DEVICE_CLASS_GATE (#33936) --- homeassistant/components/homekit/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index c46bd7543195..4fdad670f098 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -6,6 +6,7 @@ from zlib import adler32 import voluptuous as vol from homeassistant.components import cover +from homeassistant.components.cover import DEVICE_CLASS_GARAGE, DEVICE_CLASS_GATE from homeassistant.components.media_player import DEVICE_CLASS_TV from homeassistant.const import ( ATTR_DEVICE_CLASS, @@ -200,7 +201,7 @@ def get_accessory(hass, driver, state, aid, config): device_class = state.attributes.get(ATTR_DEVICE_CLASS) features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) - if device_class == "garage" and features & ( + if device_class in (DEVICE_CLASS_GARAGE, DEVICE_CLASS_GATE) and features & ( cover.SUPPORT_OPEN | cover.SUPPORT_CLOSE ): a_type = "GarageDoorOpener" From bc036351f6f77c04b1ea0eeabe3080a748b094e6 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 10 Apr 2020 15:43:25 +0200 Subject: [PATCH 279/653] UniFi - Roaming clients should be considered connected (#33942) * Roaming clients should be considered connected * Bump dependency --- homeassistant/components/unifi/manifest.json | 10 +++++++--- homeassistant/components/unifi/unifi_client.py | 12 +++++++++--- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index a02a52d15106..a58bcd6fa7aa 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,7 +3,11 @@ "name": "Ubiquiti UniFi", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": ["aiounifi==16"], - "codeowners": ["@kane610"], + "requirements": [ + "aiounifi==17" + ], + "codeowners": [ + "@kane610" + ], "quality_scale": "platinum" -} +} \ No newline at end of file diff --git a/homeassistant/components/unifi/unifi_client.py b/homeassistant/components/unifi/unifi_client.py index 5efb73c2a01f..644b0856bb49 100644 --- a/homeassistant/components/unifi/unifi_client.py +++ b/homeassistant/components/unifi/unifi_client.py @@ -11,6 +11,7 @@ from aiounifi.events import ( WIRELESS_CLIENT_BLOCKED, WIRELESS_CLIENT_CONNECTED, WIRELESS_CLIENT_DISCONNECTED, + WIRELESS_CLIENT_ROAM, WIRELESS_CLIENT_UNBLOCKED, ) @@ -24,7 +25,11 @@ LOGGER = logging.getLogger(__name__) CLIENT_BLOCKED = (WIRED_CLIENT_BLOCKED, WIRELESS_CLIENT_BLOCKED) CLIENT_UNBLOCKED = (WIRED_CLIENT_UNBLOCKED, WIRELESS_CLIENT_UNBLOCKED) WIRED_CLIENT = (WIRED_CLIENT_CONNECTED, WIRED_CLIENT_DISCONNECTED) -WIRELESS_CLIENT = (WIRELESS_CLIENT_CONNECTED, WIRELESS_CLIENT_DISCONNECTED) +WIRELESS_CLIENT = ( + WIRELESS_CLIENT_CONNECTED, + WIRELESS_CLIENT_DISCONNECTED, + WIRELESS_CLIENT_ROAM, +) class UniFiClient(Entity): @@ -66,8 +71,9 @@ class UniFiClient(Entity): if self.client.last_updated == SOURCE_EVENT: if self.client.event.event in WIRELESS_CLIENT: - self.wireless_connection = ( - self.client.event.event == WIRELESS_CLIENT_CONNECTED + self.wireless_connection = self.client.event.event in ( + WIRELESS_CLIENT_CONNECTED, + WIRELESS_CLIENT_ROAM, ) elif self.client.event.event in WIRED_CLIENT: diff --git a/requirements_all.txt b/requirements_all.txt index 255dd1c9538f..35b5c571b706 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -211,7 +211,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==16 +aiounifi==17 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2fcc32d1c223..9d85fa836779 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -94,7 +94,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==16 +aiounifi==17 # homeassistant.components.wwlln aiowwlln==2.0.2 From a0b3a9e50b6b520dba9440222ab57ad33ef845d6 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 Apr 2020 17:19:44 +0200 Subject: [PATCH 280/653] Discover manually added casts (#33922) * Discover manually added casts --- homeassistant/components/cast/media_player.py | 17 +-- tests/components/cast/test_media_player.py | 121 ++++++++++++------ 2 files changed, 85 insertions(+), 53 deletions(-) diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index edac0e6e3ec8..e687dc715df5 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -55,7 +55,7 @@ from .const import ( SIGNAL_CAST_REMOVED, SIGNAL_HASS_CAST_SHOW_VIEW, ) -from .discovery import discover_chromecast, setup_internal_discovery +from .discovery import setup_internal_discovery from .helpers import ( CastStatusListener, ChromecastInfo, @@ -178,20 +178,7 @@ async def _async_setup_platform( for chromecast in list(hass.data[KNOWN_CHROMECAST_INFO_KEY]): async_cast_discovered(chromecast) - if info is None or info.is_audio_group: - # If we were a) explicitly told to enable discovery or - # b) have an audio group cast device, we need internal discovery. - hass.async_add_executor_job(setup_internal_discovery, hass) - else: - info = await hass.async_add_executor_job(info.fill_out_missing_chromecast_info) - if info.friendly_name is None: - _LOGGER.debug( - "Cannot retrieve detail information for chromecast" - " %s, the device may not be online", - info, - ) - - hass.async_add_executor_job(discover_chromecast, hass, info) + hass.async_add_executor_job(setup_internal_discovery, hass) class CastDevice(MediaPlayerDevice): diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index 3a40e9065d34..9809710f372f 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -22,6 +22,7 @@ from tests.common import MockConfigEntry, mock_coro def cast_mock(): """Mock pychromecast.""" pycast_mock = MagicMock() + pycast_mock.start_discovery.return_value = (None, Mock()) dial_mock = MagicMock(name="XXX") dial_mock.get_device_status.return_value.uuid = "fake_uuid" dial_mock.get_device_status.return_value.manufacturer = "fake_manufacturer" @@ -42,6 +43,7 @@ def cast_mock(): # pylint: disable=invalid-name FakeUUID = UUID("57355bce-9364-4aa6-ac1e-eb849dccf9e2") +FakeUUID2 = UUID("57355bce-9364-4aa6-ac1e-eb849dccf9e4") FakeGroupUUID = UUID("57355bce-9364-4aa6-ac1e-eb849dccf9e3") @@ -108,19 +110,42 @@ async def async_setup_cast_internal_discovery(hass, config=None, discovery_info= async def async_setup_media_player_cast(hass: HomeAssistantType, info: ChromecastInfo): """Set up the cast platform with async_setup_component.""" + listener = MagicMock(services={}) + browser = MagicMock(zc={}) chromecast = get_fake_chromecast(info) cast.CastStatusListener = MagicMock() with patch( - "homeassistant.components.cast.discovery.pychromecast._get_chromecast_from_host", + "homeassistant.components.cast.discovery.pychromecast._get_chromecast_from_service", return_value=chromecast, - ) as get_chromecast: + ) as get_chromecast, patch( + "homeassistant.components.cast.discovery.pychromecast.start_discovery", + return_value=(listener, browser), + ) as start_discovery: await async_setup_component( hass, "media_player", {"media_player": {"platform": "cast", "host": info.host}}, ) + + await hass.async_block_till_done() + + discovery_callback = start_discovery.call_args[0][0] + + def discover_chromecast(service_name: str, info: ChromecastInfo) -> None: + """Discover a chromecast device.""" + listener.services[service_name] = ( + info.host, + info.port, + info.uuid, + info.model_name, + info.friendly_name, + ) + discovery_callback(service_name) + + discover_chromecast("the-service", info) + await hass.async_block_till_done() await hass.async_block_till_done() assert get_chromecast.call_count == 1 assert cast.CastStatusListener.call_count == 1 @@ -220,42 +245,6 @@ async def test_create_cast_device_with_uuid(hass): assert cast_device is None -async def test_normal_chromecast_not_starting_discovery(hass): - """Test cast platform not starting discovery when not required.""" - # pylint: disable=no-member - with patch( - "homeassistant.components.cast.media_player.setup_internal_discovery" - ) as setup_discovery: - # normal (non-group) chromecast shouldn't start discovery. - add_entities = await async_setup_cast(hass, {"host": "host1"}) - await hass.async_block_till_done() - assert add_entities.call_count == 1 - assert setup_discovery.call_count == 0 - - # Same entity twice - add_entities = await async_setup_cast(hass, {"host": "host1"}) - await hass.async_block_till_done() - assert add_entities.call_count == 0 - assert setup_discovery.call_count == 0 - - hass.data[cast.ADDED_CAST_DEVICES_KEY] = set() - add_entities = await async_setup_cast( - hass, discovery_info={"host": "host1", "port": 8009} - ) - await hass.async_block_till_done() - assert add_entities.call_count == 1 - assert setup_discovery.call_count == 0 - - # group should start discovery. - hass.data[cast.ADDED_CAST_DEVICES_KEY] = set() - add_entities = await async_setup_cast( - hass, discovery_info={"host": "host1", "port": 42} - ) - await hass.async_block_till_done() - assert add_entities.call_count == 0 - assert setup_discovery.call_count == 1 - - async def test_replay_past_chromecasts(hass): """Test cast platform re-playing past chromecasts when adding new one.""" cast_group1 = get_fake_chromecast_info(host="host1", port=42) @@ -282,6 +271,62 @@ async def test_replay_past_chromecasts(hass): assert add_dev2.call_count == 1 +async def test_manual_cast_chromecasts(hass): + """Test only wanted casts are added for manual configuration.""" + cast_1 = get_fake_chromecast_info(host="configured_host") + cast_2 = get_fake_chromecast_info(host="other_host", uuid=FakeUUID2) + + # Manual configuration of media player with host "configured_host" + discover_cast, add_dev1 = await async_setup_cast_internal_discovery( + hass, config={"host": "configured_host"} + ) + discover_cast("service2", cast_2) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 0 + + discover_cast("service1", cast_1) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 1 + + +async def test_auto_cast_chromecasts(hass): + """Test all discovered casts are added for default configuration.""" + cast_1 = get_fake_chromecast_info(host="some_host") + cast_2 = get_fake_chromecast_info(host="other_host", uuid=FakeUUID2) + + # Manual configuration of media player with host "configured_host" + discover_cast, add_dev1 = await async_setup_cast_internal_discovery(hass) + discover_cast("service2", cast_2) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 1 + + discover_cast("service1", cast_1) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 2 + + +async def test_update_cast_chromecasts(hass): + """Test discovery of same UUID twice only adds one cast.""" + cast_1 = get_fake_chromecast_info(host="old_host") + cast_2 = get_fake_chromecast_info(host="new_host") + + # Manual configuration of media player with host "configured_host" + discover_cast, add_dev1 = await async_setup_cast_internal_discovery(hass) + discover_cast("service1", cast_1) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 1 + + discover_cast("service2", cast_2) + await hass.async_block_till_done() + await hass.async_block_till_done() # having tasks that add jobs + assert add_dev1.call_count == 1 + + async def test_entity_media_states(hass: HomeAssistantType): """Test various entity media states.""" info = get_fake_chromecast_info() From 7b9585cd8e507a0824405bf51a02a8dd84d8a6fc Mon Sep 17 00:00:00 2001 From: Minims Date: Fri, 10 Apr 2020 17:44:56 +0200 Subject: [PATCH 281/653] Fix Onvif Camera that does not have SnapshotUri such as Sricam (#33902) --- homeassistant/components/onvif/camera.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 87c96e38c321..51ea3fab0cc7 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -411,8 +411,11 @@ class ONVIFHassCamera(Camera): req = media_service.create_type("GetSnapshotUri") req.ProfileToken = profiles[self._profile_index].token - snapshot_uri = await media_service.GetSnapshotUri(req) - self._snapshot = snapshot_uri.Uri + try: + snapshot_uri = await media_service.GetSnapshotUri(req) + self._snapshot = snapshot_uri.Uri + except ServerDisconnectedError as err: + _LOGGER.debug("Camera does not support GetSnapshotUri: %s", err) _LOGGER.debug( "ONVIF Camera Using the following URL for %s snapshot: %s", From ca0648afe8eb96a1569b4560b0cdcad9388cc5e5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 11:33:58 -0500 Subject: [PATCH 282/653] Fix powerwall units (kW) (#33954) * Fix powerwall units (kW) * Fix test Co-authored-by: Paulus Schoutsen --- .../components/powerwall/binary_sensor.py | 2 +- homeassistant/components/powerwall/const.py | 6 ++--- homeassistant/components/powerwall/sensor.py | 6 ++--- tests/components/powerwall/test_sensor.py | 23 +++++++++++-------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/powerwall/binary_sensor.py b/homeassistant/components/powerwall/binary_sensor.py index 329b26221b88..3b73caecacd8 100644 --- a/homeassistant/components/powerwall/binary_sensor.py +++ b/homeassistant/components/powerwall/binary_sensor.py @@ -129,7 +129,7 @@ class PowerWallGridStatusSensor(PowerWallEntity, BinarySensorDevice): @property def is_on(self): - """Get the current value in kWh.""" + """Grid is online.""" return ( self._coordinator.data[POWERWALL_API_GRID_STATUS] == POWERWALL_GRID_ONLINE ) diff --git a/homeassistant/components/powerwall/const.py b/homeassistant/components/powerwall/const.py index 2e9c3739c488..d05e42f6bf7a 100644 --- a/homeassistant/components/powerwall/const.py +++ b/homeassistant/components/powerwall/const.py @@ -2,12 +2,10 @@ DOMAIN = "powerwall" -POWERWALL_SITE_NAME = "site_name" - POWERWALL_OBJECT = "powerwall" POWERWALL_COORDINATOR = "coordinator" -UPDATE_INTERVAL = 60 +UPDATE_INTERVAL = 30 ATTR_REGION = "region" ATTR_GRID_CODE = "grid_code" @@ -46,3 +44,5 @@ POWERWALL_RUNNING_KEY = "running" MODEL = "PowerWall 2" MANUFACTURER = "Tesla" + +ENERGY_KILO_WATT = "kW" diff --git a/homeassistant/components/powerwall/sensor.py b/homeassistant/components/powerwall/sensor.py index cf49b36a5703..72dbd38a4188 100644 --- a/homeassistant/components/powerwall/sensor.py +++ b/homeassistant/components/powerwall/sensor.py @@ -4,7 +4,6 @@ import logging from homeassistant.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_POWER, - ENERGY_KILO_WATT_HOUR, UNIT_PERCENTAGE, ) @@ -14,6 +13,7 @@ from .const import ( ATTR_FREQUENCY, ATTR_INSTANT_AVERAGE_VOLTAGE, DOMAIN, + ENERGY_KILO_WATT, POWERWALL_API_CHARGE, POWERWALL_API_DEVICE_TYPE, POWERWALL_API_METERS, @@ -87,7 +87,7 @@ class PowerWallEnergySensor(PowerWallEntity): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return ENERGY_KILO_WATT_HOUR + return ENERGY_KILO_WATT @property def name(self): @@ -106,7 +106,7 @@ class PowerWallEnergySensor(PowerWallEntity): @property def state(self): - """Get the current value in kWh.""" + """Get the current value in kW.""" meter = self._coordinator.data[POWERWALL_API_METERS][self._meter] return round(float(meter.instant_power / 1000), 3) diff --git a/tests/components/powerwall/test_sensor.py b/tests/components/powerwall/test_sensor.py index 7f092683b7c4..5d21a11d4b47 100644 --- a/tests/components/powerwall/test_sensor.py +++ b/tests/components/powerwall/test_sensor.py @@ -39,13 +39,14 @@ async def test_sensors(hass): "energy_exported": 10429451.9916853, "energy_imported": 4824191.60668611, "instant_average_voltage": 120.650001525879, - "unit_of_measurement": "kWh", + "unit_of_measurement": "kW", "friendly_name": "Powerwall Site Now", "device_class": "power", } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears - assert all(item in state.attributes.items() for item in expected_attributes.items()) + for key, value in expected_attributes.items(): + assert state.attributes[key] == value state = hass.states.get("sensor.powerwall_load_now") assert state.state == "1.971" @@ -54,13 +55,14 @@ async def test_sensors(hass): "energy_exported": 1056797.48917483, "energy_imported": 4692987.91889705, "instant_average_voltage": 120.650001525879, - "unit_of_measurement": "kWh", + "unit_of_measurement": "kW", "friendly_name": "Powerwall Load Now", "device_class": "power", } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears - assert all(item in state.attributes.items() for item in expected_attributes.items()) + for key, value in expected_attributes.items(): + assert state.attributes[key] == value state = hass.states.get("sensor.powerwall_battery_now") assert state.state == "-8.55" @@ -69,13 +71,14 @@ async def test_sensors(hass): "energy_exported": 3620010, "energy_imported": 4216170, "instant_average_voltage": 240.56, - "unit_of_measurement": "kWh", + "unit_of_measurement": "kW", "friendly_name": "Powerwall Battery Now", "device_class": "power", } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears - assert all(item in state.attributes.items() for item in expected_attributes.items()) + for key, value in expected_attributes.items(): + assert state.attributes[key] == value state = hass.states.get("sensor.powerwall_solar_now") assert state.state == "10.49" @@ -84,13 +87,14 @@ async def test_sensors(hass): "energy_exported": 9864205.82222448, "energy_imported": 28177.5358355867, "instant_average_voltage": 120.685001373291, - "unit_of_measurement": "kWh", + "unit_of_measurement": "kW", "friendly_name": "Powerwall Solar Now", "device_class": "power", } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears - assert all(item in state.attributes.items() for item in expected_attributes.items()) + for key, value in expected_attributes.items(): + assert state.attributes[key] == value state = hass.states.get("sensor.powerwall_charge") assert state.state == "47.32" @@ -101,4 +105,5 @@ async def test_sensors(hass): } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears - assert all(item in state.attributes.items() for item in expected_attributes.items()) + for key, value in expected_attributes.items(): + assert state.attributes[key] == value From 78d87dc40fd972a9c793ef256d8b192ee976da0b Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Fri, 10 Apr 2020 19:17:46 +0200 Subject: [PATCH 283/653] Use TEMP_CELSIUS constant (#33963) --- homeassistant/components/darksky/sensor.py | 89 ++++++++++--------- .../components/eight_sleep/sensor.py | 6 +- homeassistant/components/homematic/sensor.py | 5 +- homeassistant/components/miflora/sensor.py | 3 +- homeassistant/components/mitemp_bt/sensor.py | 3 +- homeassistant/components/notion/__init__.py | 9 +- .../components/rainmachine/sensor.py | 5 +- homeassistant/components/velbus/climate.py | 2 +- homeassistant/components/zamg/sensor.py | 5 +- tests/components/abode/test_sensor.py | 3 +- tests/components/canary/test_sensor.py | 4 +- .../components/climate/test_device_trigger.py | 5 +- tests/components/dyson/test_sensor.py | 6 +- tests/components/fritzbox/test_climate.py | 3 +- tests/components/hddtemp/test_sensor.py | 9 +- .../homekit/test_type_thermostats.py | 13 +-- tests/components/mhz19/test_sensor.py | 8 +- tests/components/min_max/test_sensor.py | 2 +- tests/components/mqtt/test_init.py | 3 +- tests/components/nexia/test_sensor.py | 6 +- tests/components/rflink/test_sensor.py | 18 ++-- tests/components/spaceapi/test_init.py | 14 +-- tests/components/statistics/test_sensor.py | 2 +- tests/components/zha/test_sensor.py | 2 +- 24 files changed, 129 insertions(+), 96 deletions(-) diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index 1517f47a2d58..5157ab6ed7df 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( SPEED_KILOMETERS_PER_HOUR, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, + TEMP_CELSIUS, TIME_HOURS, UNIT_PERCENTAGE, UNIT_UV_INDEX, @@ -134,31 +135,31 @@ SENSOR_TYPES = { ], "temperature": [ "Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["currently", "hourly"], ], "apparent_temperature": [ "Apparent Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["currently", "hourly"], ], "dew_point": [ "Dew Point", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["currently", "hourly", "daily"], ], @@ -244,81 +245,81 @@ SENSOR_TYPES = { ], "apparent_temperature_max": [ "Daily High Apparent Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "apparent_temperature_high": [ "Daytime High Apparent Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "apparent_temperature_min": [ "Daily Low Apparent Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "apparent_temperature_low": [ "Overnight Low Apparent Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "temperature_max": [ "Daily High Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "temperature_high": [ "Daytime High Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "temperature_min": [ "Daily Low Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], "temperature_low": [ "Overnight Low Temperature", - "°C", + TEMP_CELSIUS, "°F", - "°C", - "°C", - "°C", + TEMP_CELSIUS, + TEMP_CELSIUS, + TEMP_CELSIUS, "mdi:thermometer", ["daily"], ], diff --git a/homeassistant/components/eight_sleep/sensor.py b/homeassistant/components/eight_sleep/sensor.py index dcee52db5929..f5aa2cb1dcaa 100644 --- a/homeassistant/components/eight_sleep/sensor.py +++ b/homeassistant/components/eight_sleep/sensor.py @@ -1,7 +1,7 @@ """Support for Eight Sleep sensors.""" import logging -from homeassistant.const import UNIT_PERCENTAGE +from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE from . import ( CONF_SENSORS, @@ -166,7 +166,7 @@ class EightUserSensor(EightSleepUserEntity): return "Score" if "bed_temp" in self._sensor: if self._units == "si": - return "°C" + return TEMP_CELSIUS return "°F" return None @@ -329,7 +329,7 @@ class EightRoomSensor(EightSleepUserEntity): def unit_of_measurement(self): """Return the unit the value is expressed in.""" if self._units == "si": - return "°C" + return TEMP_CELSIUS return "°F" @property diff --git a/homeassistant/components/homematic/sensor.py b/homeassistant/components/homematic/sensor.py index e8b974775465..c0a269bd5828 100644 --- a/homeassistant/components/homematic/sensor.py +++ b/homeassistant/components/homematic/sensor.py @@ -9,6 +9,7 @@ from homeassistant.const import ( ENERGY_WATT_HOUR, POWER_WATT, SPEED_KILOMETERS_PER_HOUR, + TEMP_CELSIUS, UNIT_PERCENTAGE, VOLUME_CUBIC_METERS, ) @@ -34,8 +35,8 @@ HM_STATE_HA_CAST = { HM_UNIT_HA_CAST = { "HUMIDITY": UNIT_PERCENTAGE, - "TEMPERATURE": "°C", - "ACTUAL_TEMPERATURE": "°C", + "TEMPERATURE": TEMP_CELSIUS, + "ACTUAL_TEMPERATURE": TEMP_CELSIUS, "BRIGHTNESS": "#", "POWER": POWER_WATT, "CURRENT": "mA", diff --git a/homeassistant/components/miflora/sensor.py b/homeassistant/components/miflora/sensor.py index 9d564c6536ac..b8073f16d923 100644 --- a/homeassistant/components/miflora/sensor.py +++ b/homeassistant/components/miflora/sensor.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_NAME, CONF_SCAN_INTERVAL, EVENT_HOMEASSISTANT_START, + TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE, ) @@ -50,7 +51,7 @@ ATTR_LAST_SUCCESSFUL_UPDATE = "last_successful_update" # Sensor types are defined like: Name, units, icon SENSOR_TYPES = { - "temperature": ["Temperature", "°C", "mdi:thermometer"], + "temperature": ["Temperature", TEMP_CELSIUS, "mdi:thermometer"], "light": ["Light intensity", "lx", "mdi:white-balance-sunny"], "moisture": ["Moisture", UNIT_PERCENTAGE, "mdi:water-percent"], "conductivity": ["Conductivity", "µS/cm", "mdi:flash-circle"], diff --git a/homeassistant/components/mitemp_bt/sensor.py b/homeassistant/components/mitemp_bt/sensor.py index febfb93cf1dd..b20337576934 100644 --- a/homeassistant/components/mitemp_bt/sensor.py +++ b/homeassistant/components/mitemp_bt/sensor.py @@ -15,6 +15,7 @@ from homeassistant.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_TEMPERATURE, + TEMP_CELSIUS, UNIT_PERCENTAGE, ) import homeassistant.helpers.config_validation as cv @@ -46,7 +47,7 @@ DEFAULT_TIMEOUT = 10 # Sensor types are defined like: Name, units SENSOR_TYPES = { - "temperature": [DEVICE_CLASS_TEMPERATURE, "Temperature", "°C"], + "temperature": [DEVICE_CLASS_TEMPERATURE, "Temperature", TEMP_CELSIUS], "humidity": [DEVICE_CLASS_HUMIDITY, "Humidity", UNIT_PERCENTAGE], "battery": [DEVICE_CLASS_BATTERY, "Battery", UNIT_PERCENTAGE], } diff --git a/homeassistant/components/notion/__init__.py b/homeassistant/components/notion/__init__.py index a1c54d962999..5e8450ffdea0 100644 --- a/homeassistant/components/notion/__init__.py +++ b/homeassistant/components/notion/__init__.py @@ -7,7 +7,12 @@ from aionotion.errors import InvalidCredentialsError, NotionError import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT -from homeassistant.const import ATTR_ATTRIBUTION, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_PASSWORD, + CONF_USERNAME, + TEMP_CELSIUS, +) from homeassistant.core import callback from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import ( @@ -57,7 +62,7 @@ BINARY_SENSOR_TYPES = { SENSOR_WINDOW_HINGED_HORIZONTAL: ("Hinged Window", "window"), SENSOR_WINDOW_HINGED_VERTICAL: ("Hinged Window", "window"), } -SENSOR_TYPES = {SENSOR_TEMPERATURE: ("Temperature", "temperature", "°C")} +SENSOR_TYPES = {SENSOR_TEMPERATURE: ("Temperature", "temperature", TEMP_CELSIUS)} CONFIG_SCHEMA = vol.Schema( { diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 4d48b0cd0498..6f87c34d6076 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -1,6 +1,7 @@ """This platform provides support for sensor data from RainMachine.""" import logging +from homeassistant.const import TEMP_CELSIUS from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -57,7 +58,7 @@ SENSORS = { TYPE_FREEZE_TEMP: ( "Freeze Protect Temperature", "mdi:thermometer", - "°C", + TEMP_CELSIUS, "temperature", True, DATA_RESTRICTIONS_UNIVERSAL, @@ -84,7 +85,7 @@ async def async_setup_entry(hass, entry, async_add_entities): sensor_type, (name, icon, unit, device_class, enabled_by_default, api_category), ) in SENSORS.items() - ], + ] ) diff --git a/homeassistant/components/velbus/climate.py b/homeassistant/components/velbus/climate.py index 38d893e73434..8810f945ba98 100644 --- a/homeassistant/components/velbus/climate.py +++ b/homeassistant/components/velbus/climate.py @@ -38,7 +38,7 @@ class VelbusClimate(VelbusEntity, ClimateDevice): @property def temperature_unit(self): """Return the unit this state is expressed in.""" - if self._module.get_unit(self._channel) == "°C": + if self._module.get_unit(self._channel) == TEMP_CELSIUS: return TEMP_CELSIUS return TEMP_FAHRENHEIT diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 664ce0a38b62..0ead849b59a4 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, SPEED_KILOMETERS_PER_HOUR, + TEMP_CELSIUS, UNIT_PERCENTAGE, __version__, ) @@ -56,9 +57,9 @@ SENSOR_TYPES = { ), "wind_max_bearing": ("Top Wind Bearing", "°", "WSR °", int), "sun_last_hour": ("Sun Last Hour", UNIT_PERCENTAGE, f"SO {UNIT_PERCENTAGE}", int), - "temperature": ("Temperature", "°C", "T °C", float), + "temperature": ("Temperature", TEMP_CELSIUS, f"T {TEMP_CELSIUS}", float), "precipitation": ("Precipitation", "l/m²", "N l/m²", float), - "dewpoint": ("Dew Point", "°C", "TP °C", float), + "dewpoint": ("Dew Point", TEMP_CELSIUS, f"TP {TEMP_CELSIUS}", float), # The following probably not useful for general consumption, # but we need them to fill in internal attributes "station_name": ("Station Name", None, "Name", str), diff --git a/tests/components/abode/test_sensor.py b/tests/components/abode/test_sensor.py index bfe20be0b8c5..b4ce78faedd2 100644 --- a/tests/components/abode/test_sensor.py +++ b/tests/components/abode/test_sensor.py @@ -6,6 +6,7 @@ from homeassistant.const import ( ATTR_FRIENDLY_NAME, ATTR_UNIT_OF_MEASUREMENT, DEVICE_CLASS_HUMIDITY, + TEMP_CELSIUS, ) from .common import setup_platform @@ -41,4 +42,4 @@ async def test_attributes(hass): state = hass.states.get("sensor.environment_sensor_temperature") # Abodepy device JSON reports 19.5, but Home Assistant shows 19.4 assert state.state == "19.4" - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "°C" + assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == TEMP_CELSIUS diff --git a/tests/components/canary/test_sensor.py b/tests/components/canary/test_sensor.py index 6cc33ddf6109..1d559dbb7ba6 100644 --- a/tests/components/canary/test_sensor.py +++ b/tests/components/canary/test_sensor.py @@ -12,7 +12,7 @@ from homeassistant.components.canary.sensor import ( STATE_AIR_QUALITY_VERY_ABNORMAL, CanarySensor, ) -from homeassistant.const import UNIT_PERCENTAGE +from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE from tests.common import get_test_home_assistant from tests.components.canary.test_init import mock_device, mock_location @@ -69,7 +69,7 @@ class TestCanarySensorSetup(unittest.TestCase): sensor.update() assert sensor.name == "Home Family Room Temperature" - assert sensor.unit_of_measurement == "°C" + assert sensor.unit_of_measurement == TEMP_CELSIUS assert sensor.state == 21.12 assert sensor.icon == "mdi:thermometer" diff --git a/tests/components/climate/test_device_trigger.py b/tests/components/climate/test_device_trigger.py index eda215ebd0fe..58aa3311771c 100644 --- a/tests/components/climate/test_device_trigger.py +++ b/tests/components/climate/test_device_trigger.py @@ -4,6 +4,7 @@ import voluptuous_serialize import homeassistant.components.automation as automation from homeassistant.components.climate import DOMAIN, const, device_trigger +from homeassistant.const import TEMP_CELSIUS from homeassistant.helpers import config_validation as cv, device_registry from homeassistant.setup import async_setup_component @@ -228,13 +229,13 @@ async def test_get_trigger_capabilities_temp_humid(hass, type): capabilities["extra_fields"], custom_serializer=cv.custom_serializer ) == [ { - "description": {"suffix": "°C"}, + "description": {"suffix": TEMP_CELSIUS}, "name": "above", "optional": True, "type": "float", }, { - "description": {"suffix": "°C"}, + "description": {"suffix": TEMP_CELSIUS}, "name": "below", "optional": True, "type": "float", diff --git a/tests/components/dyson/test_sensor.py b/tests/components/dyson/test_sensor.py index b036e3bbbdbf..7625b3c2a975 100644 --- a/tests/components/dyson/test_sensor.py +++ b/tests/components/dyson/test_sensor.py @@ -208,7 +208,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state is None - assert sensor.unit_of_measurement == "°C" + assert sensor.unit_of_measurement == TEMP_CELSIUS assert sensor.name == "Device_name Temperature" assert sensor.entity_id == "sensor.dyson_1" @@ -219,7 +219,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state == 21.9 - assert sensor.unit_of_measurement == "°C" + assert sensor.unit_of_measurement == TEMP_CELSIUS assert sensor.name == "Device_name Temperature" assert sensor.entity_id == "sensor.dyson_1" @@ -241,7 +241,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state == STATE_OFF - assert sensor.unit_of_measurement == "°C" + assert sensor.unit_of_measurement == TEMP_CELSIUS assert sensor.name == "Device_name Temperature" assert sensor.entity_id == "sensor.dyson_1" diff --git a/tests/components/fritzbox/test_climate.py b/tests/components/fritzbox/test_climate.py index b535b35e182c..e2b3ec7ddead 100644 --- a/tests/components/fritzbox/test_climate.py +++ b/tests/components/fritzbox/test_climate.py @@ -5,6 +5,7 @@ from unittest.mock import Mock, patch import requests from homeassistant.components.fritzbox.climate import FritzboxThermostat +from homeassistant.const import TEMP_CELSIUS class TestFritzboxClimate(unittest.TestCase): @@ -51,7 +52,7 @@ class TestFritzboxClimate(unittest.TestCase): def test_temperature_unit(self): """Test temperature_unit property.""" - assert "°C" == self.thermostat.temperature_unit + assert TEMP_CELSIUS == self.thermostat.temperature_unit def test_precision(self): """Test precision property.""" diff --git a/tests/components/hddtemp/test_sensor.py b/tests/components/hddtemp/test_sensor.py index 1b6150fbc3f4..cbaed220f11a 100644 --- a/tests/components/hddtemp/test_sensor.py +++ b/tests/components/hddtemp/test_sensor.py @@ -3,6 +3,7 @@ import socket import unittest from unittest.mock import patch +from homeassistant.const import TEMP_CELSIUS from homeassistant.setup import setup_component from tests.common import get_test_home_assistant @@ -64,25 +65,25 @@ class TestHDDTempSensor(unittest.TestCase): "/dev/sda1": { "device": "/dev/sda1", "temperature": "29", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, "model": "WDC WD30EZRX-12DC0B0", }, "/dev/sdb1": { "device": "/dev/sdb1", "temperature": "32", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, "model": "WDC WD15EADS-11P7B2", }, "/dev/sdc1": { "device": "/dev/sdc1", "temperature": "29", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, "model": "WDC WD20EARX-22MMMB0", }, "/dev/sdd1": { "device": "/dev/sdd1", "temperature": "32", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, "model": "WDC WD15EARS-00Z5B1", }, } diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index 7fe2f41b7366..d463231ba594 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -48,6 +48,7 @@ from homeassistant.const import ( ATTR_TEMPERATURE, CONF_TEMPERATURE_UNIT, EVENT_HOMEASSISTANT_START, + TEMP_CELSIUS, TEMP_FAHRENHEIT, ) from homeassistant.core import CoreState @@ -86,7 +87,7 @@ async def test_thermostat(hass, hk_driver, cls, events): HVAC_MODE_COOL, HVAC_MODE_OFF, HVAC_MODE_AUTO, - ], + ] }, ) await hass.async_block_till_done() @@ -418,14 +419,14 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events): assert acc.char_target_humidity.properties[PROP_MIN_VALUE] == DEFAULT_MIN_HUMIDITY hass.states.async_set( - entity_id, HVAC_MODE_HEAT_COOL, {ATTR_HUMIDITY: 65, ATTR_CURRENT_HUMIDITY: 40}, + entity_id, HVAC_MODE_HEAT_COOL, {ATTR_HUMIDITY: 65, ATTR_CURRENT_HUMIDITY: 40} ) await hass.async_block_till_done() assert acc.char_current_humidity.value == 40 assert acc.char_target_humidity.value == 65 hass.states.async_set( - entity_id, HVAC_MODE_COOL, {ATTR_HUMIDITY: 35, ATTR_CURRENT_HUMIDITY: 70}, + entity_id, HVAC_MODE_COOL, {ATTR_HUMIDITY: 35, ATTR_CURRENT_HUMIDITY: 70} ) await hass.async_block_till_done() assert acc.char_current_humidity.value == 70 @@ -618,7 +619,7 @@ async def test_thermostat_restore(hass, hk_driver, cls, events): registry = await entity_registry.async_get_registry(hass) registry.async_get_or_create( - "climate", "generic", "1234", suggested_object_id="simple", + "climate", "generic", "1234", suggested_object_id="simple" ) registry.async_get_or_create( "climate", @@ -898,7 +899,7 @@ async def test_water_heater(hass, hk_driver, cls, events): assert call_set_temperature[0].data[ATTR_TEMPERATURE] == 52.0 assert acc.char_target_temp.value == 52.0 assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == "52.0°C" + 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() @@ -975,7 +976,7 @@ async def test_water_heater_restore(hass, hk_driver, cls, events): registry = await entity_registry.async_get_registry(hass) registry.async_get_or_create( - "water_heater", "generic", "1234", suggested_object_id="simple", + "water_heater", "generic", "1234", suggested_object_id="simple" ) registry.async_get_or_create( "water_heater", diff --git a/tests/components/mhz19/test_sensor.py b/tests/components/mhz19/test_sensor.py index 0eb86f0198ea..598144f5a250 100644 --- a/tests/components/mhz19/test_sensor.py +++ b/tests/components/mhz19/test_sensor.py @@ -4,7 +4,11 @@ from unittest.mock import DEFAULT, Mock, patch import homeassistant.components.mhz19.sensor as mhz19 from homeassistant.components.sensor import DOMAIN -from homeassistant.const import CONCENTRATION_PARTS_PER_MILLION, TEMP_FAHRENHEIT +from homeassistant.const import ( + CONCENTRATION_PARTS_PER_MILLION, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, +) from homeassistant.setup import setup_component from tests.common import assert_setup_component, get_test_home_assistant @@ -115,7 +119,7 @@ class TestMHZ19Sensor(unittest.TestCase): assert sensor.name == "name: Temperature" assert sensor.state == 24 - assert sensor.unit_of_measurement == "°C" + assert sensor.unit_of_measurement == TEMP_CELSIUS assert sensor.should_poll assert sensor.device_state_attributes == {"co2_concentration": 1000} diff --git a/tests/components/min_max/test_sensor.py b/tests/components/min_max/test_sensor.py index 891f99ac67ff..10860d0fbe44 100644 --- a/tests/components/min_max/test_sensor.py +++ b/tests/components/min_max/test_sensor.py @@ -221,7 +221,7 @@ class TestMinMaxSensor(unittest.TestCase): state = self.hass.states.get("sensor.test") assert str(float(self.values[0])) == state.state - assert state.attributes.get("unit_of_measurement") == "°C" + assert state.attributes.get("unit_of_measurement") == TEMP_CELSIUS self.hass.states.set( entity_ids[1], self.values[1], {ATTR_UNIT_OF_MEASUREMENT: TEMP_FAHRENHEIT} diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index de8444446d58..e70a53caf9d2 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -16,6 +16,7 @@ from homeassistant.const import ( ATTR_SERVICE, EVENT_CALL_SERVICE, EVENT_HOMEASSISTANT_STOP, + TEMP_CELSIUS, ) from homeassistant.core import callback from homeassistant.exceptions import ConfigEntryNotReady @@ -342,7 +343,7 @@ class TestMQTTCallbacks(unittest.TestCase): mqtt.subscribe(self.hass, "test-topic", self.record_calls, encoding="ascii") mqtt.subscribe(self.hass, "test-topic", self.record_calls) - fire_mqtt_message(self.hass, "test-topic", "°C") + fire_mqtt_message(self.hass, "test-topic", TEMP_CELSIUS) self.hass.block_till_done() assert len(self.calls) == 1 diff --git a/tests/components/nexia/test_sensor.py b/tests/components/nexia/test_sensor.py index 6e258d0ad55c..518993cf24a2 100644 --- a/tests/components/nexia/test_sensor.py +++ b/tests/components/nexia/test_sensor.py @@ -1,5 +1,7 @@ """The sensor tests for the nexia platform.""" +from homeassistant.const import TEMP_CELSIUS + from .util import async_init_integration @@ -15,7 +17,7 @@ async def test_create_sensors(hass): "attribution": "Data provided by mynexia.com", "device_class": "temperature", "friendly_name": "Nick Office Temperature", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears @@ -82,7 +84,7 @@ async def test_create_sensors(hass): "attribution": "Data provided by mynexia.com", "device_class": "temperature", "friendly_name": "Master Suite Outdoor Temperature", - "unit_of_measurement": "°C", + "unit_of_measurement": TEMP_CELSIUS, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears diff --git a/tests/components/rflink/test_sensor.py b/tests/components/rflink/test_sensor.py index f60b1c3584ce..77f911f0ed0e 100644 --- a/tests/components/rflink/test_sensor.py +++ b/tests/components/rflink/test_sensor.py @@ -12,7 +12,7 @@ from homeassistant.components.rflink import ( EVENT_KEY_SENSOR, TMP_ENTITY, ) -from homeassistant.const import STATE_UNKNOWN, UNIT_PERCENTAGE +from homeassistant.const import STATE_UNKNOWN, TEMP_CELSIUS, UNIT_PERCENTAGE from tests.components.rflink.test_init import mock_rflink @@ -42,23 +42,27 @@ async def test_default_setup(hass, monkeypatch): config_sensor = hass.states.get("sensor.test") assert config_sensor assert config_sensor.state == "unknown" - assert config_sensor.attributes["unit_of_measurement"] == "°C" + assert config_sensor.attributes["unit_of_measurement"] == TEMP_CELSIUS # test event for config sensor - event_callback({"id": "test", "sensor": "temperature", "value": 1, "unit": "°C"}) + event_callback( + {"id": "test", "sensor": "temperature", "value": 1, "unit": TEMP_CELSIUS} + ) await hass.async_block_till_done() assert hass.states.get("sensor.test").state == "1" # test event for new unconfigured sensor - event_callback({"id": "test2", "sensor": "temperature", "value": 0, "unit": "°C"}) + event_callback( + {"id": "test2", "sensor": "temperature", "value": 0, "unit": TEMP_CELSIUS} + ) await hass.async_block_till_done() # test state of new sensor new_sensor = hass.states.get("sensor.test2") assert new_sensor assert new_sensor.state == "0" - assert new_sensor.attributes["unit_of_measurement"] == "°C" + assert new_sensor.attributes["unit_of_measurement"] == TEMP_CELSIUS assert new_sensor.attributes["icon"] == "mdi:thermometer" @@ -73,7 +77,9 @@ async def test_disable_automatic_add(hass, monkeypatch): event_callback, _, _, _ = await mock_rflink(hass, config, DOMAIN, monkeypatch) # test event for new unconfigured sensor - event_callback({"id": "test2", "sensor": "temperature", "value": 0, "unit": "°C"}) + event_callback( + {"id": "test2", "sensor": "temperature", "value": 0, "unit": TEMP_CELSIUS} + ) await hass.async_block_till_done() # make sure new device is not added diff --git a/tests/components/spaceapi/test_init.py b/tests/components/spaceapi/test_init.py index 78c7991d9b3b..891adac91aec 100644 --- a/tests/components/spaceapi/test_init.py +++ b/tests/components/spaceapi/test_init.py @@ -5,7 +5,7 @@ from unittest.mock import patch import pytest from homeassistant.components.spaceapi import DOMAIN, SPACEAPI_VERSION, URL_API_SPACEAPI -from homeassistant.const import UNIT_PERCENTAGE +from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE from homeassistant.setup import async_setup_component from tests.common import mock_coro @@ -60,8 +60,8 @@ CONFIG = { SENSOR_OUTPUT = { "temperature": [ - {"location": "Home", "name": "temp1", "unit": "°C", "value": "25"}, - {"location": "Home", "name": "temp2", "unit": "°C", "value": "23"}, + {"location": "Home", "name": "temp1", "unit": TEMP_CELSIUS, "value": "25"}, + {"location": "Home", "name": "temp2", "unit": TEMP_CELSIUS, "value": "23"}, ], "humidity": [ {"location": "Home", "name": "hum1", "unit": UNIT_PERCENTAGE, "value": "88"} @@ -75,8 +75,12 @@ def mock_client(hass, hass_client): with patch("homeassistant.components.spaceapi", return_value=mock_coro(True)): hass.loop.run_until_complete(async_setup_component(hass, "spaceapi", CONFIG)) - hass.states.async_set("test.temp1", 25, attributes={"unit_of_measurement": "°C"}) - hass.states.async_set("test.temp2", 23, attributes={"unit_of_measurement": "°C"}) + hass.states.async_set( + "test.temp1", 25, attributes={"unit_of_measurement": TEMP_CELSIUS} + ) + hass.states.async_set( + "test.temp2", 23, attributes={"unit_of_measurement": TEMP_CELSIUS} + ) hass.states.async_set( "test.hum1", 88, attributes={"unit_of_measurement": UNIT_PERCENTAGE} ) diff --git a/tests/components/statistics/test_sensor.py b/tests/components/statistics/test_sensor.py index df79d0750b4e..61a0abb6265b 100644 --- a/tests/components/statistics/test_sensor.py +++ b/tests/components/statistics/test_sensor.py @@ -102,7 +102,7 @@ class TestStatisticsSensor(unittest.TestCase): assert self.mean == state.attributes.get("mean") assert self.count == state.attributes.get("count") assert self.total == state.attributes.get("total") - assert "°C" == state.attributes.get("unit_of_measurement") + assert TEMP_CELSIUS == state.attributes.get("unit_of_measurement") assert self.change == state.attributes.get("change") assert self.average_change == state.attributes.get("average_change") diff --git a/tests/components/zha/test_sensor.py b/tests/components/zha/test_sensor.py index 50b85f5720f1..dbd2e8f7c3a4 100644 --- a/tests/components/zha/test_sensor.py +++ b/tests/components/zha/test_sensor.py @@ -41,7 +41,7 @@ async def async_test_humidity(hass, cluster, entity_id): async def async_test_temperature(hass, cluster, entity_id): """Test temperature sensor.""" await send_attributes_report(hass, cluster, {1: 1, 0: 2900, 2: 100}) - assert_state(hass, entity_id, "29.0", "°C") + assert_state(hass, entity_id, "29.0", TEMP_CELSIUS) async def async_test_pressure(hass, cluster, entity_id): From 496da8823d5a0a90a7fb60fbba9e2ba67d659038 Mon Sep 17 00:00:00 2001 From: Knapoc Date: Fri, 10 Apr 2020 19:34:10 +0200 Subject: [PATCH 284/653] Fix turning off/on light groups in homekit (#33965) --- homeassistant/components/homekit/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index b0c49a58a6a4..d80fd3c53381 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -2,6 +2,6 @@ "domain": "homekit", "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", - "requirements": ["HAP-python==2.8.1"], + "requirements": ["HAP-python==2.8.2"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 35b5c571b706..158976ccd2ae 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -35,7 +35,7 @@ Adafruit-SHT31==1.0.2 # Adafruit_BBIO==1.1.1 # homeassistant.components.homekit -HAP-python==2.8.1 +HAP-python==2.8.2 # homeassistant.components.mastodon Mastodon.py==1.5.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9d85fa836779..f0d86a3e194c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -4,7 +4,7 @@ -r requirements_test.txt # homeassistant.components.homekit -HAP-python==2.8.1 +HAP-python==2.8.2 # homeassistant.components.mobile_app # homeassistant.components.owntracks From 6d3046cb426fe83fdcb002052c64729caf42cf9e Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 Apr 2020 19:36:57 +0200 Subject: [PATCH 285/653] Remove support for cast dynamic speaker groups (#33884) --- homeassistant/components/cast/helpers.py | 68 +------ homeassistant/components/cast/media_player.py | 178 +----------------- tests/components/cast/test_media_player.py | 107 ----------- 3 files changed, 5 insertions(+), 348 deletions(-) diff --git a/homeassistant/components/cast/helpers.py b/homeassistant/components/cast/helpers.py index 0f0dc5f6358d..bd8ce68c5f10 100644 --- a/homeassistant/components/cast/helpers.py +++ b/homeassistant/components/cast/helpers.py @@ -23,7 +23,6 @@ class ChromecastInfo: ) # always convert UUID to string if not None model_name = attr.ib(type=str, default="") friendly_name = attr.ib(type=Optional[str], default=None) - is_dynamic_group = attr.ib(type=Optional[bool], default=None) @property def is_audio_group(self) -> bool: @@ -33,19 +32,7 @@ class ChromecastInfo: @property def is_information_complete(self) -> bool: """Return if all information is filled out.""" - want_dynamic_group = self.is_audio_group - have_dynamic_group = self.is_dynamic_group is not None - have_all_except_dynamic_group = all( - attr.astuple( - self, - filter=attr.filters.exclude( - attr.fields(ChromecastInfo).is_dynamic_group - ), - ) - ) - return have_all_except_dynamic_group and ( - not want_dynamic_group or have_dynamic_group - ) + return all(attr.astuple(self)) @property def host_port(self) -> Tuple[str, int]: @@ -70,8 +57,6 @@ class ChromecastInfo: return self if self.is_audio_group: - is_dynamic_group = False - return ChromecastInfo( service=self.service, host=self.host, @@ -79,7 +64,6 @@ class ChromecastInfo: uuid=self.uuid, friendly_name=self.friendly_name, model_name=self.model_name, - is_dynamic_group=is_dynamic_group, ) # Fill out some missing information (friendly_name, uuid) via HTTP dial. @@ -99,14 +83,6 @@ class ChromecastInfo: model_name=self.model_name, ) - def same_dynamic_group(self, other: "ChromecastInfo") -> bool: - """Test chromecast info is same dynamic group.""" - return ( - self.is_audio_group - and other.is_dynamic_group - and self.friendly_name == other.friendly_name - ) - class ChromeCastZeroconf: """Class to hold a zeroconf instance.""" @@ -190,45 +166,3 @@ class CastStatusListener: else: self._mz_mgr.deregister_listener(self._uuid, self) self._valid = False - - -class DynamicGroupCastStatusListener: - """Helper class to handle pychromecast status callbacks. - - Necessary because a CastDevice entity can create a new socket client - and therefore callbacks from multiple chromecast connections can - potentially arrive. This class allows invalidating past chromecast objects. - """ - - def __init__(self, cast_device, chromecast, mz_mgr): - """Initialize the status listener.""" - self._cast_device = cast_device - self._uuid = chromecast.uuid - self._valid = True - self._mz_mgr = mz_mgr - - chromecast.register_status_listener(self) - chromecast.socket_client.media_controller.register_status_listener(self) - chromecast.register_connection_listener(self) - self._mz_mgr.add_multizone(chromecast) - - def new_cast_status(self, cast_status): - """Handle reception of a new CastStatus.""" - - def new_media_status(self, media_status): - """Handle reception of a new MediaStatus.""" - if self._valid: - self._cast_device.new_dynamic_group_media_status(media_status) - - def new_connection_status(self, connection_status): - """Handle reception of a new ConnectionStatus.""" - if self._valid: - self._cast_device.new_dynamic_group_connection_status(connection_status) - - def invalidate(self): - """Invalidate this status listener. - - All following callbacks won't be forwarded. - """ - self._mz_mgr.remove_multizone(self._uuid) - self._valid = False diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index e687dc715df5..5fcbbaf1caa1 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -56,12 +56,7 @@ from .const import ( SIGNAL_HASS_CAST_SHOW_VIEW, ) from .discovery import setup_internal_discovery -from .helpers import ( - CastStatusListener, - ChromecastInfo, - ChromeCastZeroconf, - DynamicGroupCastStatusListener, -) +from .helpers import CastStatusListener, ChromecastInfo, ChromeCastZeroconf _LOGGER = logging.getLogger(__name__) @@ -101,10 +96,6 @@ def _async_create_cast_device(hass: HomeAssistantType, info: ChromecastInfo): return CastDevice(info) # Found a cast with UUID - if info.is_dynamic_group: - # This is a dynamic group, do not add it. - return None - added_casts = hass.data[ADDED_CAST_DEVICES_KEY] if info.uuid in added_casts: # Already added this one, the entity will take care of moved hosts @@ -201,19 +192,11 @@ class CastDevice(MediaPlayerDevice): self.cast_status = None self.media_status = None self.media_status_received = None - self._dynamic_group_cast_info: ChromecastInfo = None - self._dynamic_group_cast: Optional[pychromecast.Chromecast] = None - self.dynamic_group_media_status = None - self.dynamic_group_media_status_received = None self.mz_media_status = {} self.mz_media_status_received = {} self.mz_mgr = None self._available = False - self._dynamic_group_available = False self._status_listener: Optional[CastStatusListener] = None - self._dynamic_group_status_listener: Optional[ - DynamicGroupCastStatusListener - ] = None self._hass_cast_controller: Optional[HomeAssistantController] = None self._add_remove_handler = None @@ -232,20 +215,6 @@ class CastDevice(MediaPlayerDevice): self.hass.async_create_task( async_create_catching_coro(self.async_set_cast_info(self._cast_info)) ) - for info in self.hass.data[KNOWN_CHROMECAST_INFO_KEY]: - if self._cast_info.same_dynamic_group(info): - _LOGGER.debug( - "[%s %s (%s:%s)] Found dynamic group: %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - info, - ) - self.hass.async_create_task( - async_create_catching_coro(self.async_set_dynamic_group(info)) - ) - break self._cast_view_remove_handler = async_dispatcher_connect( self.hass, SIGNAL_HASS_CAST_SHOW_VIEW, self._handle_signal_show_view @@ -358,69 +327,6 @@ class CastDevice(MediaPlayerDevice): self.services, ) - async def async_set_dynamic_group(self, cast_info): - """Set the cast information and set up the chromecast object.""" - - _LOGGER.debug( - "[%s %s (%s:%s)] Connecting to dynamic group by host %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - cast_info, - ) - - await self.async_del_dynamic_group() - self._dynamic_group_cast_info = cast_info - - # pylint: disable=protected-access - chromecast = await self.hass.async_add_executor_job( - pychromecast._get_chromecast_from_host, - ( - cast_info.host, - cast_info.port, - cast_info.uuid, - cast_info.model_name, - cast_info.friendly_name, - ), - ) - - self._dynamic_group_cast = chromecast - - if CAST_MULTIZONE_MANAGER_KEY not in self.hass.data: - self.hass.data[CAST_MULTIZONE_MANAGER_KEY] = MultizoneManager() - - mz_mgr = self.hass.data[CAST_MULTIZONE_MANAGER_KEY] - - self._dynamic_group_status_listener = DynamicGroupCastStatusListener( - self, chromecast, mz_mgr - ) - self._dynamic_group_available = False - self.dynamic_group_media_status = chromecast.media_controller.status - self._dynamic_group_cast.start() - self.async_write_ha_state() - - async def async_del_dynamic_group(self): - """Remove the dynamic group.""" - cast_info = self._dynamic_group_cast_info - _LOGGER.debug( - "[%s %s (%s:%s)] Remove dynamic group: %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - cast_info.service if cast_info else None, - ) - - self._dynamic_group_available = False - self._dynamic_group_cast_info = None - if self._dynamic_group_cast is not None: - await self.hass.async_add_executor_job(self._dynamic_group_cast.disconnect) - - self._dynamic_group_invalidate() - - self.async_write_ha_state() - async def _async_disconnect(self): """Disconnect Chromecast object if it is set.""" if self._chromecast is None: @@ -437,8 +343,6 @@ class CastDevice(MediaPlayerDevice): self.async_write_ha_state() await self.hass.async_add_executor_job(self._chromecast.disconnect) - if self._dynamic_group_cast is not None: - await self.hass.async_add_executor_job(self._dynamic_group_cast.disconnect) self._invalidate() @@ -458,15 +362,6 @@ class CastDevice(MediaPlayerDevice): self._status_listener.invalidate() self._status_listener = None - def _dynamic_group_invalidate(self): - """Invalidate some attributes.""" - self._dynamic_group_cast = None - self.dynamic_group_media_status = None - self.dynamic_group_media_status_received = None - if self._dynamic_group_status_listener is not None: - self._dynamic_group_status_listener.invalidate() - self._dynamic_group_status_listener = None - # ========== Callbacks ========== def new_cast_status(self, cast_status): """Handle updates of the cast status.""" @@ -515,44 +410,6 @@ class CastDevice(MediaPlayerDevice): self._available = new_available self.schedule_update_ha_state() - def new_dynamic_group_media_status(self, media_status): - """Handle updates of the media status.""" - self.dynamic_group_media_status = media_status - self.dynamic_group_media_status_received = dt_util.utcnow() - self.schedule_update_ha_state() - - def new_dynamic_group_connection_status(self, connection_status): - """Handle updates of connection status.""" - _LOGGER.debug( - "[%s %s (%s:%s)] Received dynamic group connection status: %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - connection_status.status, - ) - if connection_status.status == CONNECTION_STATUS_DISCONNECTED: - self._dynamic_group_available = False - self._dynamic_group_invalidate() - self.schedule_update_ha_state() - return - - new_available = connection_status.status == CONNECTION_STATUS_CONNECTED - if new_available != self._dynamic_group_available: - # Connection status callbacks happen often when disconnected. - # Only update state when availability changed to put less pressure - # on state machine. - _LOGGER.debug( - "[%s %s (%s:%s)] Dynamic group availability changed: %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - connection_status.status, - ) - self._dynamic_group_available = new_available - self.schedule_update_ha_state() - def multizone_new_media_status(self, group_uuid, media_status): """Handle updates of audio group media status.""" _LOGGER.debug( @@ -573,18 +430,11 @@ class CastDevice(MediaPlayerDevice): """ Return media status. - First try from our own cast, then dynamic groups and finally - groups which our cast is a member in. + First try from our own cast, then groups which our cast is a member in. """ media_status = self.media_status media_controller = self._chromecast.media_controller - if ( - media_status is None or media_status.player_state == "UNKNOWN" - ) and self._dynamic_group_cast is not None: - media_status = self.dynamic_group_media_status - media_controller = self._dynamic_group_cast.media_controller - if media_status is None or media_status.player_state == "UNKNOWN": groups = self.mz_media_status for k, val in groups.items(): @@ -652,7 +502,7 @@ class CastDevice(MediaPlayerDevice): def play_media(self, media_type, media_id, **kwargs): """Play media from a URL.""" - # We do not want this to be forwarded to a group / dynamic group + # We do not want this to be forwarded to a group self._chromecast.media_controller.play_media(media_id, media_type) # ========== Properties ========== @@ -685,18 +535,11 @@ class CastDevice(MediaPlayerDevice): """ Return media status. - First try from our own cast, then dynamic groups and finally - groups which our cast is a member in. + First try from our own cast, then groups which our cast is a member in. """ media_status = self.media_status media_status_received = self.media_status_received - if ( - media_status is None or media_status.player_state == "UNKNOWN" - ) and self._dynamic_group_cast is not None: - media_status = self.dynamic_group_media_status - media_status_received = self.dynamic_group_media_status_received - if media_status is None or media_status.player_state == "UNKNOWN": groups = self.mz_media_status for k, val in groups.items(): @@ -887,11 +730,6 @@ class CastDevice(MediaPlayerDevice): # We can't handle empty UUIDs return - if self._cast_info.same_dynamic_group(discover): - _LOGGER.debug("Discovered matching dynamic group: %s", discover) - await self.async_set_dynamic_group(discover) - return - if self._cast_info.uuid != discover.uuid: # Discovered is not our device. return @@ -915,14 +753,6 @@ class CastDevice(MediaPlayerDevice): # We can't handle empty UUIDs return - if ( - self._dynamic_group_cast_info is not None - and self._dynamic_group_cast_info.uuid == discover.uuid - ): - _LOGGER.debug("Removed matching dynamic group: %s", discover) - await self.async_del_dynamic_group() - return - if self._cast_info.uuid != discover.uuid: # Removed is not our device. return diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index 9809710f372f..b05be45e79fd 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -435,58 +435,6 @@ async def test_group_media_states(hass: HomeAssistantType): assert state.state == "playing" -async def test_dynamic_group_media_states(hass: HomeAssistantType): - """Test media states are read from group if entity has no state.""" - info = get_fake_chromecast_info() - full_info = attr.evolve( - info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID - ) - - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - chromecast, entity = await async_setup_media_player_cast(hass, info) - - entity._available = True - entity.schedule_update_ha_state() - await hass.async_block_till_done() - - state = hass.states.get("media_player.speaker") - assert state is not None - assert state.name == "Speaker" - assert state.state == "unknown" - assert entity.unique_id == full_info.uuid - - group_media_status = MagicMock(images=None) - player_media_status = MagicMock(images=None) - - # Player has no state, dynamic group is playing -> Should report 'playing' - entity._dynamic_group_cast = MagicMock() - group_media_status.player_is_playing = True - entity.new_dynamic_group_media_status(group_media_status) - await hass.async_block_till_done() - state = hass.states.get("media_player.speaker") - assert state.state == "playing" - - # Player is paused, dynamic group is playing -> Should report 'paused' - player_media_status.player_is_playing = False - player_media_status.player_is_paused = True - entity.new_media_status(player_media_status) - await hass.async_block_till_done() - await hass.async_block_till_done() - state = hass.states.get("media_player.speaker") - assert state.state == "paused" - - # Player is in unknown state, dynamic group is playing -> Should report - # 'playing' - player_media_status.player_state = "UNKNOWN" - entity.new_media_status(player_media_status) - await hass.async_block_till_done() - state = hass.states.get("media_player.speaker") - assert state.state == "playing" - - async def test_group_media_control(hass: HomeAssistantType): """Test media states are read from group if entity has no state.""" info = get_fake_chromecast_info() @@ -543,61 +491,6 @@ async def test_group_media_control(hass: HomeAssistantType): assert chromecast.media_controller.play_media.called -async def test_dynamic_group_media_control(hass: HomeAssistantType): - """Test media states are read from group if entity has no state.""" - info = get_fake_chromecast_info() - full_info = attr.evolve( - info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID - ) - - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - chromecast, entity = await async_setup_media_player_cast(hass, info) - - entity._available = True - entity.schedule_update_ha_state() - entity._dynamic_group_cast = MagicMock() - await hass.async_block_till_done() - - state = hass.states.get("media_player.speaker") - assert state is not None - assert state.name == "Speaker" - assert state.state == "unknown" - assert entity.unique_id == full_info.uuid - - group_media_status = MagicMock(images=None) - player_media_status = MagicMock(images=None) - - # Player has no state, dynamic group is playing -> Should forward - group_media_status.player_is_playing = True - entity.new_dynamic_group_media_status(group_media_status) - entity.media_previous_track() - assert entity._dynamic_group_cast.media_controller.queue_prev.called - assert not chromecast.media_controller.queue_prev.called - - # Player is paused, dynamic group is playing -> Should not forward - player_media_status.player_is_playing = False - player_media_status.player_is_paused = True - entity.new_media_status(player_media_status) - entity.media_next_track() - assert not entity._dynamic_group_cast.media_controller.queue_next.called - assert chromecast.media_controller.queue_next.called - - # Player is in unknown state, dynamic group is playing -> Should forward - player_media_status.player_state = "UNKNOWN" - entity.new_media_status(player_media_status) - entity.media_seek(None) - assert entity._dynamic_group_cast.media_controller.seek.called - assert not chromecast.media_controller.seek.called - - # Verify play_media is not forwarded - entity.play_media(None, None) - assert not entity._dynamic_group_cast.media_controller.play_media.called - assert chromecast.media_controller.play_media.called - - async def test_disconnect_on_stop(hass: HomeAssistantType): """Test cast device disconnects socket on stop.""" info = get_fake_chromecast_info() From c3c4752fa568c29a9879c6a8cfde3e15b3a06c13 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Fri, 10 Apr 2020 12:49:58 -0500 Subject: [PATCH 286/653] Update pyipp to 0.9.2 (#33967) * Update manifest.json * Update requirements_test_all.txt * Update requirements_all.txt --- homeassistant/components/ipp/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 4be57f13fbbf..0cb7c108b631 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.9.1"], + "requirements": ["pyipp==0.9.2"], "codeowners": ["@ctalkington"], "config_flow": true, "quality_scale": "platinum", diff --git a/requirements_all.txt b/requirements_all.txt index 158976ccd2ae..34e7533f0b28 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1341,7 +1341,7 @@ pyintesishome==1.7.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.1 +pyipp==0.9.2 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f0d86a3e194c..a2a162ab13c5 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -527,7 +527,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.1 +pyipp==0.9.2 # homeassistant.components.iqvia pyiqvia==0.2.1 From 02c9e47db8b8e9033738a66bb97acc2884cc97b8 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Fri, 10 Apr 2020 20:21:29 +0200 Subject: [PATCH 287/653] Use ENERGY_KILO_WATT_HOUR constant (#33962) --- homeassistant/components/co2signal/sensor.py | 3 +- .../components/dsmr_reader/definitions.py | 22 ++++----- homeassistant/components/griddy/sensor.py | 3 +- .../components/growatt_server/sensor.py | 35 ++++++++++++-- homeassistant/components/melcloud/sensor.py | 12 +++-- .../components/pvpc_hourly_pricing/sensor.py | 6 +-- tests/components/dsmr/test_sensor.py | 8 ++-- tests/components/integration/test_sensor.py | 20 ++++---- tests/components/prometheus/test_init.py | 4 +- .../pvpc_hourly_pricing/conftest.py | 4 +- tests/components/utility_meter/test_init.py | 23 ++++++++-- tests/components/utility_meter/test_sensor.py | 46 ++++++++++++++----- tests/components/zwave/test_sensor.py | 6 ++- 13 files changed, 132 insertions(+), 60 deletions(-) diff --git a/homeassistant/components/co2signal/sensor.py b/homeassistant/components/co2signal/sensor.py index 31a06c941207..d7f78f9c362f 100644 --- a/homeassistant/components/co2signal/sensor.py +++ b/homeassistant/components/co2signal/sensor.py @@ -10,6 +10,7 @@ from homeassistant.const import ( CONF_LATITUDE, CONF_LONGITUDE, CONF_TOKEN, + ENERGY_KILO_WATT_HOUR, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -25,7 +26,7 @@ MSG_LOCATION = ( "For the coordinates, " "you need to use both latitude and longitude." ) -CO2_INTENSITY_UNIT = "CO2eq/kWh" +CO2_INTENSITY_UNIT = f"CO2eq/{ENERGY_KILO_WATT_HOUR}" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_TOKEN): cv.string, diff --git a/homeassistant/components/dsmr_reader/definitions.py b/homeassistant/components/dsmr_reader/definitions.py index bd583be37f4e..64eb2d9ea80c 100644 --- a/homeassistant/components/dsmr_reader/definitions.py +++ b/homeassistant/components/dsmr_reader/definitions.py @@ -1,6 +1,6 @@ """Definitions for DSMR Reader sensors added to MQTT.""" -from homeassistant.const import VOLUME_CUBIC_METERS +from homeassistant.const import ENERGY_KILO_WATT_HOUR, VOLUME_CUBIC_METERS def dsmr_transform(value): @@ -21,22 +21,22 @@ DEFINITIONS = { "dsmr/reading/electricity_delivered_1": { "name": "Low tariff usage", "icon": "mdi:flash", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/reading/electricity_returned_1": { "name": "Low tariff returned", "icon": "mdi:flash-outline", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/reading/electricity_delivered_2": { "name": "High tariff usage", "icon": "mdi:flash", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/reading/electricity_returned_2": { "name": "High tariff returned", "icon": "mdi:flash-outline", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/reading/electricity_currently_delivered": { "name": "Current power usage", @@ -116,32 +116,32 @@ DEFINITIONS = { "dsmr/day-consumption/electricity1": { "name": "Low tariff usage", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity2": { "name": "High tariff usage", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity1_returned": { "name": "Low tariff return", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity2_returned": { "name": "High tariff return", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity_merged": { "name": "Power usage total", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity_returned_merged": { "name": "Power return total", "icon": "mdi:counter", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, }, "dsmr/day-consumption/electricity1_cost": { "name": "Low tariff cost", diff --git a/homeassistant/components/griddy/sensor.py b/homeassistant/components/griddy/sensor.py index 31488650dc20..b072c613d41e 100644 --- a/homeassistant/components/griddy/sensor.py +++ b/homeassistant/components/griddy/sensor.py @@ -1,6 +1,7 @@ """Support for August sensors.""" import logging +from homeassistant.const import ENERGY_KILO_WATT_HOUR from homeassistant.helpers.entity import Entity from .const import CONF_LOADZONE, DOMAIN @@ -28,7 +29,7 @@ class GriddyPriceSensor(Entity): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return "¢/kWh" + return f"¢/{ENERGY_KILO_WATT_HOUR}" @property def name(self): diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index 2816b86be843..b7cea620a662 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -8,7 +8,12 @@ import growattServer import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import ( + CONF_NAME, + CONF_PASSWORD, + CONF_USERNAME, + ENERGY_KILO_WATT_HOUR, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -23,15 +28,35 @@ SCAN_INTERVAL = datetime.timedelta(minutes=5) TOTAL_SENSOR_TYPES = { "total_money_today": ("Total money today", "€", "plantMoneyText", None), "total_money_total": ("Money lifetime", "€", "totalMoneyText", None), - "total_energy_today": ("Energy Today", "kWh", "todayEnergy", "power"), + "total_energy_today": ( + "Energy Today", + ENERGY_KILO_WATT_HOUR, + "todayEnergy", + "power", + ), "total_output_power": ("Output Power", "W", "invTodayPpv", "power"), - "total_energy_output": ("Lifetime energy output", "kWh", "totalEnergy", "power"), + "total_energy_output": ( + "Lifetime energy output", + ENERGY_KILO_WATT_HOUR, + "totalEnergy", + "power", + ), "total_maximum_output": ("Maximum power", "W", "nominalPower", "power"), } INVERTER_SENSOR_TYPES = { - "inverter_energy_today": ("Energy today", "kWh", "e_today", "power"), - "inverter_energy_total": ("Lifetime energy output", "kWh", "e_total", "power"), + "inverter_energy_today": ( + "Energy today", + ENERGY_KILO_WATT_HOUR, + "e_today", + "power", + ), + "inverter_energy_total": ( + "Lifetime energy output", + ENERGY_KILO_WATT_HOUR, + "e_total", + "power", + ), "inverter_voltage_input_1": ("Input 1 voltage", "V", "vpv1", None), "inverter_amperage_input_1": ("Input 1 Amperage", "A", "ipv1", None), "inverter_wattage_input_1": ("Input 1 Wattage", "W", "ppv1", "power"), diff --git a/homeassistant/components/melcloud/sensor.py b/homeassistant/components/melcloud/sensor.py index 31bfd005ac15..9dee01c2fbab 100644 --- a/homeassistant/components/melcloud/sensor.py +++ b/homeassistant/components/melcloud/sensor.py @@ -4,7 +4,11 @@ import logging from pymelcloud import DEVICE_TYPE_ATA, DEVICE_TYPE_ATW from pymelcloud.atw_device import Zone -from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS +from homeassistant.const import ( + DEVICE_CLASS_TEMPERATURE, + ENERGY_KILO_WATT_HOUR, + TEMP_CELSIUS, +) from homeassistant.helpers.entity import Entity from . import MelCloudDevice @@ -29,7 +33,7 @@ ATA_SENSORS = { "energy": { ATTR_MEASUREMENT_NAME: "Energy", ATTR_ICON: "mdi:factory", - ATTR_UNIT_FN: lambda x: "kWh", + ATTR_UNIT_FN: lambda x: ENERGY_KILO_WATT_HOUR, ATTR_DEVICE_CLASS: None, ATTR_VALUE_FN: lambda x: x.device.total_energy_consumed, ATTR_ENABLED_FN: lambda x: x.device.has_energy_consumed_meter, @@ -147,9 +151,7 @@ class MelDeviceSensor(Entity): class AtwZoneSensor(MelDeviceSensor): """Air-to-Air device sensor.""" - def __init__( - self, api: MelCloudDevice, zone: Zone, measurement, definition, - ): + def __init__(self, api: MelCloudDevice, zone: Zone, measurement, definition): """Initialize the sensor.""" super().__init__(api, measurement, definition) self._zone = zone diff --git a/homeassistant/components/pvpc_hourly_pricing/sensor.py b/homeassistant/components/pvpc_hourly_pricing/sensor.py index 199e20d3e229..25b4531cee0e 100644 --- a/homeassistant/components/pvpc_hourly_pricing/sensor.py +++ b/homeassistant/components/pvpc_hourly_pricing/sensor.py @@ -6,7 +6,7 @@ from typing import Optional from aiopvpc import PVPCData from homeassistant import config_entries -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, ENERGY_KILO_WATT_HOUR from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.event import async_call_later, async_track_time_change @@ -19,7 +19,7 @@ _LOGGER = logging.getLogger(__name__) ATTR_PRICE = "price" ICON = "mdi:currency-eur" -UNIT = "€/kWh" +UNIT = f"€/{ENERGY_KILO_WATT_HOUR}" _DEFAULT_TIMEOUT = 10 @@ -78,7 +78,7 @@ class ElecPriceSensor(RestoreEntity): random_minute = randint(1, 29) mins_update = [random_minute, random_minute + 30] self._price_tracker = async_track_time_change( - self.hass, self.async_update_prices, second=[0], minute=mins_update, + self.hass, self.async_update_prices, second=[0], minute=mins_update ) _LOGGER.debug( "Setup of price sensor %s (%s) with tariff '%s', " diff --git a/tests/components/dsmr/test_sensor.py b/tests/components/dsmr/test_sensor.py index 9f3b45d40e32..67c6d3bc58d8 100644 --- a/tests/components/dsmr/test_sensor.py +++ b/tests/components/dsmr/test_sensor.py @@ -16,7 +16,7 @@ import pytest from homeassistant.bootstrap import async_setup_component from homeassistant.components.dsmr.sensor import DerivativeDSMREntity -from homeassistant.const import TIME_HOURS, VOLUME_CUBIC_METERS +from homeassistant.const import ENERGY_KILO_WATT_HOUR, TIME_HOURS, VOLUME_CUBIC_METERS from tests.common import assert_setup_component @@ -62,7 +62,7 @@ async def test_default_setup(hass, mock_connection_factory): telegram = { CURRENT_ELECTRICITY_USAGE: CosemObject( - [{"value": Decimal("0.0"), "unit": "kWh"}] + [{"value": Decimal("0.0"), "unit": ENERGY_KILO_WATT_HOUR}] ), ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0001", "unit": ""}]), GAS_METER_READING: MBusObject( @@ -92,7 +92,9 @@ async def test_default_setup(hass, mock_connection_factory): # ensure entities have new state value after incoming telegram power_consumption = hass.states.get("sensor.power_consumption") assert power_consumption.state == "0.0" - assert power_consumption.attributes.get("unit_of_measurement") == "kWh" + assert ( + power_consumption.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR + ) # tariff should be translated in human readable and have no unit power_tariff = hass.states.get("sensor.power_tariff") diff --git a/tests/components/integration/test_sensor.py b/tests/components/integration/test_sensor.py index b598d7ddbc29..ded0ab6bfad4 100644 --- a/tests/components/integration/test_sensor.py +++ b/tests/components/integration/test_sensor.py @@ -2,7 +2,7 @@ from datetime import timedelta from unittest.mock import patch -from homeassistant.const import TIME_SECONDS +from homeassistant.const import ENERGY_KILO_WATT_HOUR, TIME_SECONDS from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -14,7 +14,7 @@ async def test_state(hass): "platform": "integration", "name": "integration", "source": "sensor.power", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, "round": 2, } } @@ -36,7 +36,7 @@ async def test_state(hass): # Testing a power sensor at 1 KiloWatts for 1hour = 1kWh assert round(float(state.state), config["sensor"]["round"]) == 1.0 - assert state.attributes.get("unit_of_measurement") == "kWh" + assert state.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR async def test_trapezoidal(hass): @@ -46,7 +46,7 @@ async def test_trapezoidal(hass): "platform": "integration", "name": "integration", "source": "sensor.power", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, "round": 2, } } @@ -69,7 +69,7 @@ async def test_trapezoidal(hass): assert round(float(state.state), config["sensor"]["round"]) == 8.33 - assert state.attributes.get("unit_of_measurement") == "kWh" + assert state.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR async def test_left(hass): @@ -80,7 +80,7 @@ async def test_left(hass): "name": "integration", "method": "left", "source": "sensor.power", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, "round": 2, } } @@ -103,7 +103,7 @@ async def test_left(hass): assert round(float(state.state), config["sensor"]["round"]) == 7.5 - assert state.attributes.get("unit_of_measurement") == "kWh" + assert state.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR async def test_right(hass): @@ -114,7 +114,7 @@ async def test_right(hass): "name": "integration", "method": "right", "source": "sensor.power", - "unit": "kWh", + "unit": ENERGY_KILO_WATT_HOUR, "round": 2, } } @@ -137,7 +137,7 @@ async def test_right(hass): assert round(float(state.state), config["sensor"]["round"]) == 9.17 - assert state.attributes.get("unit_of_measurement") == "kWh" + assert state.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR async def test_prefix(hass): @@ -170,7 +170,7 @@ async def test_prefix(hass): # Testing a power sensor at 1000 Watts for 1hour = 1kWh assert round(float(state.state), config["sensor"]["round"]) == 1.0 - assert state.attributes.get("unit_of_measurement") == "kWh" + assert state.attributes.get("unit_of_measurement") == ENERGY_KILO_WATT_HOUR async def test_suffix(hass): diff --git a/tests/components/prometheus/test_init.py b/tests/components/prometheus/test_init.py index a8bc9fe98239..66ee4d60bf3c 100644 --- a/tests/components/prometheus/test_init.py +++ b/tests/components/prometheus/test_init.py @@ -40,7 +40,9 @@ async def prometheus_client(loop, hass, hass_client): sensor2.entity_id = "sensor.radio_energy" await sensor2.async_update_ha_state() - sensor3 = DemoSensor(None, "Electricity price", 0.123, None, "SEK/kWh", None) + sensor3 = DemoSensor( + None, "Electricity price", 0.123, None, f"SEK/{ENERGY_KILO_WATT_HOUR}", None + ) sensor3.hass = hass sensor3.entity_id = "sensor.electricity_price" await sensor3.async_update_ha_state() diff --git a/tests/components/pvpc_hourly_pricing/conftest.py b/tests/components/pvpc_hourly_pricing/conftest.py index a2cfefb1200d..681b3675aa60 100644 --- a/tests/components/pvpc_hourly_pricing/conftest.py +++ b/tests/components/pvpc_hourly_pricing/conftest.py @@ -2,7 +2,7 @@ import pytest from homeassistant.components.pvpc_hourly_pricing import ATTR_TARIFF, DOMAIN -from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT +from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, ENERGY_KILO_WATT_HOUR from tests.common import load_fixture from tests.test_util.aiohttp import AiohttpClientMocker @@ -15,7 +15,7 @@ FIXTURE_JSON_DATA_2019_10_29 = "PVPC_CURV_DD_2019_10_29.json" def check_valid_state(state, tariff: str, value=None, key_attr=None): """Ensure that sensor has a valid state and attributes.""" assert state - assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == "€/kWh" + assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == f"€/{ENERGY_KILO_WATT_HOUR}" try: _ = float(state.state) # safety margins for current electricity price (it shouldn't be out of [0, 0.2]) diff --git a/tests/components/utility_meter/test_init.py b/tests/components/utility_meter/test_init.py index 719ea9445cc5..f6c1e6c8ead2 100644 --- a/tests/components/utility_meter/test_init.py +++ b/tests/components/utility_meter/test_init.py @@ -11,7 +11,11 @@ from homeassistant.components.utility_meter.const import ( SERVICE_SELECT_NEXT_TARIFF, SERVICE_SELECT_TARIFF, ) -from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_START +from homeassistant.const import ( + ATTR_ENTITY_ID, + ENERGY_KILO_WATT_HOUR, + EVENT_HOMEASSISTANT_START, +) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -36,13 +40,16 @@ async def test_services(hass): hass.bus.async_fire(EVENT_HOMEASSISTANT_START) entity_id = config[DOMAIN]["energy_bill"]["source"] - hass.states.async_set(entity_id, 1, {"unit_of_measurement": "kWh"}) + hass.states.async_set(entity_id, 1, {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 3, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 3, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -60,7 +67,10 @@ async def test_services(hass): now += timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 4, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 4, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -78,7 +88,10 @@ async def test_services(hass): now += timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 5, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 5, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() diff --git a/tests/components/utility_meter/test_sensor.py b/tests/components/utility_meter/test_sensor.py index 19742d74f213..6118d74d0dd8 100644 --- a/tests/components/utility_meter/test_sensor.py +++ b/tests/components/utility_meter/test_sensor.py @@ -12,7 +12,11 @@ from homeassistant.components.utility_meter.const import ( SERVICE_CALIBRATE_METER, SERVICE_SELECT_TARIFF, ) -from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_START +from homeassistant.const import ( + ATTR_ENTITY_ID, + ENERGY_KILO_WATT_HOUR, + EVENT_HOMEASSISTANT_START, +) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -48,13 +52,16 @@ async def test_state(hass): hass.bus.async_fire(EVENT_HOMEASSISTANT_START) entity_id = config[DOMAIN]["energy_bill"]["source"] - hass.states.async_set(entity_id, 2, {"unit_of_measurement": "kWh"}) + hass.states.async_set(entity_id, 2, {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 3, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 3, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -82,7 +89,10 @@ async def test_state(hass): now = dt_util.utcnow() + timedelta(seconds=20) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 6, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 6, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -124,13 +134,16 @@ async def test_net_consumption(hass): hass.bus.async_fire(EVENT_HOMEASSISTANT_START) entity_id = config[DOMAIN]["energy_bill"]["source"] - hass.states.async_set(entity_id, 2, {"unit_of_measurement": "kWh"}) + hass.states.async_set(entity_id, 2, {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 1, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 1, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -154,13 +167,16 @@ async def test_non_net_consumption(hass): hass.bus.async_fire(EVENT_HOMEASSISTANT_START) entity_id = config[DOMAIN]["energy_bill"]["source"] - hass.states.async_set(entity_id, 2, {"unit_of_measurement": "kWh"}) + hass.states.async_set(entity_id, 2, {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=10) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 1, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 1, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -196,14 +212,19 @@ async def _test_self_reset(hass, config, start_time, expect_reset=True): now = dt_util.parse_datetime(start_time) with alter_time(now): async_fire_time_changed(hass, now) - hass.states.async_set(entity_id, 1, {"unit_of_measurement": "kWh"}) + hass.states.async_set( + entity_id, 1, {"unit_of_measurement": ENERGY_KILO_WATT_HOUR} + ) await hass.async_block_till_done() now += timedelta(seconds=30) with alter_time(now): async_fire_time_changed(hass, now) hass.states.async_set( - entity_id, 3, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 3, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() @@ -212,7 +233,10 @@ async def _test_self_reset(hass, config, start_time, expect_reset=True): async_fire_time_changed(hass, now) await hass.async_block_till_done() hass.states.async_set( - entity_id, 6, {"unit_of_measurement": "kWh"}, force_update=True + entity_id, + 6, + {"unit_of_measurement": ENERGY_KILO_WATT_HOUR}, + force_update=True, ) await hass.async_block_till_done() diff --git a/tests/components/zwave/test_sensor.py b/tests/components/zwave/test_sensor.py index d7503eb10fb8..817a43d4f580 100644 --- a/tests/components/zwave/test_sensor.py +++ b/tests/components/zwave/test_sensor.py @@ -116,12 +116,14 @@ def test_multilevelsensor_value_changed_other_units(mock_openzwave): const.COMMAND_CLASS_METER, ] ) - value = MockValue(data=190.95555, units="kWh", node=node) + value = MockValue( + data=190.95555, units=homeassistant.const.ENERGY_KILO_WATT_HOUR, node=node + ) values = MockEntityValues(primary=value) device = sensor.get_device(node=node, values=values, node_config={}) assert device.state == 190.96 - assert device.unit_of_measurement == "kWh" + assert device.unit_of_measurement == homeassistant.const.ENERGY_KILO_WATT_HOUR value.data = 197.95555 value_changed(value) assert device.state == 197.96 From 25198242c10dc78ba9d19d1c4ba052f6f326c68d Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Fri, 10 Apr 2020 21:10:10 +0200 Subject: [PATCH 288/653] Use TEMP_FAHRENHEIT constant (#33969) --- .../components/ambient_station/__init__.py | 49 ++++++++++--------- homeassistant/components/darksky/sensor.py | 23 ++++----- .../components/eight_sleep/sensor.py | 6 +-- tests/components/dyson/test_sensor.py | 2 +- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/homeassistant/components/ambient_station/__init__.py b/homeassistant/components/ambient_station/__init__.py index 66a22d44366e..12465dfd984f 100644 --- a/homeassistant/components/ambient_station/__init__.py +++ b/homeassistant/components/ambient_station/__init__.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, SPEED_MILES_PER_HOUR, + TEMP_FAHRENHEIT, UNIT_PERCENTAGE, ) from homeassistant.core import callback @@ -150,9 +151,9 @@ SENSOR_TYPES = { TYPE_BATTOUT: ("Battery", None, TYPE_BINARY_SENSOR, "battery"), TYPE_CO2: ("co2", CONCENTRATION_PARTS_PER_MILLION, TYPE_SENSOR, None), TYPE_DAILYRAININ: ("Daily Rain", "in", TYPE_SENSOR, None), - TYPE_DEWPOINT: ("Dew Point", "°F", TYPE_SENSOR, "temperature"), + TYPE_DEWPOINT: ("Dew Point", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_EVENTRAININ: ("Event Rain", "in", TYPE_SENSOR, None), - TYPE_FEELSLIKE: ("Feels Like", "°F", TYPE_SENSOR, "temperature"), + TYPE_FEELSLIKE: ("Feels Like", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_HOURLYRAININ: ("Hourly Rain Rate", "in/hr", TYPE_SENSOR, None), TYPE_HUMIDITY10: ("Humidity 10", UNIT_PERCENTAGE, TYPE_SENSOR, "humidity"), TYPE_HUMIDITY1: ("Humidity 1", UNIT_PERCENTAGE, TYPE_SENSOR, "humidity"), @@ -189,30 +190,30 @@ SENSOR_TYPES = { TYPE_SOILHUM7: ("Soil Humidity 7", UNIT_PERCENTAGE, TYPE_SENSOR, "humidity"), TYPE_SOILHUM8: ("Soil Humidity 8", UNIT_PERCENTAGE, TYPE_SENSOR, "humidity"), TYPE_SOILHUM9: ("Soil Humidity 9", UNIT_PERCENTAGE, TYPE_SENSOR, "humidity"), - TYPE_SOILTEMP10F: ("Soil Temp 10", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP1F: ("Soil Temp 1", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP2F: ("Soil Temp 2", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP3F: ("Soil Temp 3", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP4F: ("Soil Temp 4", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP5F: ("Soil Temp 5", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP6F: ("Soil Temp 6", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP7F: ("Soil Temp 7", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP8F: ("Soil Temp 8", "°F", TYPE_SENSOR, "temperature"), - TYPE_SOILTEMP9F: ("Soil Temp 9", "°F", TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP10F: ("Soil Temp 10", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP1F: ("Soil Temp 1", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP2F: ("Soil Temp 2", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP3F: ("Soil Temp 3", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP4F: ("Soil Temp 4", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP5F: ("Soil Temp 5", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP6F: ("Soil Temp 6", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP7F: ("Soil Temp 7", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP8F: ("Soil Temp 8", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_SOILTEMP9F: ("Soil Temp 9", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_SOLARRADIATION: ("Solar Rad", "W/m^2", TYPE_SENSOR, None), TYPE_SOLARRADIATION_LX: ("Solar Rad (lx)", "lx", TYPE_SENSOR, "illuminance"), - TYPE_TEMP10F: ("Temp 10", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP1F: ("Temp 1", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP2F: ("Temp 2", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP3F: ("Temp 3", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP4F: ("Temp 4", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP5F: ("Temp 5", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP6F: ("Temp 6", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP7F: ("Temp 7", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP8F: ("Temp 8", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMP9F: ("Temp 9", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMPF: ("Temp", "°F", TYPE_SENSOR, "temperature"), - TYPE_TEMPINF: ("Inside Temp", "°F", TYPE_SENSOR, "temperature"), + TYPE_TEMP10F: ("Temp 10", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP1F: ("Temp 1", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP2F: ("Temp 2", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP3F: ("Temp 3", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP4F: ("Temp 4", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP5F: ("Temp 5", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP6F: ("Temp 6", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP7F: ("Temp 7", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP8F: ("Temp 8", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMP9F: ("Temp 9", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMPF: ("Temp", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), + TYPE_TEMPINF: ("Inside Temp", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_TOTALRAININ: ("Lifetime Rain", "in", TYPE_SENSOR, None), TYPE_UV: ("uv", "Index", TYPE_SENSOR, None), TYPE_WEEKLYRAININ: ("Weekly Rain", "in", TYPE_SENSOR, None), diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index 5157ab6ed7df..c2f6ee83396b 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, TEMP_CELSIUS, + TEMP_FAHRENHEIT, TIME_HOURS, UNIT_PERCENTAGE, UNIT_UV_INDEX, @@ -136,7 +137,7 @@ SENSOR_TYPES = { "temperature": [ "Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -146,7 +147,7 @@ SENSOR_TYPES = { "apparent_temperature": [ "Apparent Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -156,7 +157,7 @@ SENSOR_TYPES = { "dew_point": [ "Dew Point", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -246,7 +247,7 @@ SENSOR_TYPES = { "apparent_temperature_max": [ "Daily High Apparent Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -256,7 +257,7 @@ SENSOR_TYPES = { "apparent_temperature_high": [ "Daytime High Apparent Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -266,7 +267,7 @@ SENSOR_TYPES = { "apparent_temperature_min": [ "Daily Low Apparent Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -276,7 +277,7 @@ SENSOR_TYPES = { "apparent_temperature_low": [ "Overnight Low Apparent Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -286,7 +287,7 @@ SENSOR_TYPES = { "temperature_max": [ "Daily High Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -296,7 +297,7 @@ SENSOR_TYPES = { "temperature_high": [ "Daytime High Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -306,7 +307,7 @@ SENSOR_TYPES = { "temperature_min": [ "Daily Low Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, @@ -316,7 +317,7 @@ SENSOR_TYPES = { "temperature_low": [ "Overnight Low Temperature", TEMP_CELSIUS, - "°F", + TEMP_FAHRENHEIT, TEMP_CELSIUS, TEMP_CELSIUS, TEMP_CELSIUS, diff --git a/homeassistant/components/eight_sleep/sensor.py b/homeassistant/components/eight_sleep/sensor.py index f5aa2cb1dcaa..ff6dff85acaa 100644 --- a/homeassistant/components/eight_sleep/sensor.py +++ b/homeassistant/components/eight_sleep/sensor.py @@ -1,7 +1,7 @@ """Support for Eight Sleep sensors.""" import logging -from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE +from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE from . import ( CONF_SENSORS, @@ -167,7 +167,7 @@ class EightUserSensor(EightSleepUserEntity): if "bed_temp" in self._sensor: if self._units == "si": return TEMP_CELSIUS - return "°F" + return TEMP_FAHRENHEIT return None @property @@ -330,7 +330,7 @@ class EightRoomSensor(EightSleepUserEntity): """Return the unit the value is expressed in.""" if self._units == "si": return TEMP_CELSIUS - return "°F" + return TEMP_FAHRENHEIT @property def icon(self): diff --git a/tests/components/dyson/test_sensor.py b/tests/components/dyson/test_sensor.py index 7625b3c2a975..6dd29741153b 100644 --- a/tests/components/dyson/test_sensor.py +++ b/tests/components/dyson/test_sensor.py @@ -228,7 +228,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state == 71.3 - assert sensor.unit_of_measurement == "°F" + assert sensor.unit_of_measurement == TEMP_FAHRENHEIT assert sensor.name == "Device_name Temperature" assert sensor.entity_id == "sensor.dyson_1" From cfef8ee96108762e8ef8b18b267451950e879d09 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 14:11:25 -0500 Subject: [PATCH 289/653] Handle 304 http responses in nexia (#33972) * Bump nexia to 0.8.1 --- homeassistant/components/nexia/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index e69ea352c8ea..a6ea270fb5b7 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,7 +1,7 @@ { "domain": "nexia", "name": "Nexia", - "requirements": ["nexia==0.8.0"], + "requirements": ["nexia==0.8.1"], "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index 34e7533f0b28..a9ad1f13209c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -921,7 +921,7 @@ netdisco==2.6.0 neurio==0.3.1 # homeassistant.components.nexia -nexia==0.8.0 +nexia==0.8.1 # homeassistant.components.nextcloud nextcloudmonitor==1.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a2a162ab13c5..2f0a75d796ac 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -356,7 +356,7 @@ nessclient==0.9.15 netdisco==2.6.0 # homeassistant.components.nexia -nexia==0.8.0 +nexia==0.8.1 # homeassistant.components.nsw_fuel_station nsw-fuel-api-client==1.0.10 From 8198970af99ce0377e7e74c74a288c771e0458d6 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Fri, 10 Apr 2020 22:01:57 +0200 Subject: [PATCH 290/653] Clean up ssl usage (#33960) * Clean up ssl usage * Revert config[CONF_SSL] from sonarr, radarr and mfi --- .../cisco_mobility_express/device_tracker.py | 2 +- homeassistant/components/emby/media_player.py | 2 +- homeassistant/components/enigma2/media_player.py | 2 +- homeassistant/components/epson/media_player.py | 2 +- .../components/hikvision/binary_sensor.py | 5 +---- homeassistant/components/homematic/__init__.py | 2 +- homeassistant/components/influxdb/sensor.py | 4 ++-- homeassistant/components/itunes/media_player.py | 2 +- homeassistant/components/mfi/switch.py | 2 +- homeassistant/components/octoprint/__init__.py | 4 ++-- homeassistant/components/opengarage/cover.py | 4 ++-- homeassistant/components/plex/__init__.py | 4 ++-- homeassistant/components/pyload/sensor.py | 4 ++-- homeassistant/components/qnap/sensor.py | 2 +- homeassistant/components/radarr/sensor.py | 12 ++++++------ homeassistant/components/sabnzbd/__init__.py | 2 +- homeassistant/components/sma/sensor.py | 3 ++- homeassistant/components/sonarr/sensor.py | 16 ++++++++-------- homeassistant/components/splunk/__init__.py | 2 +- homeassistant/components/tautulli/sensor.py | 2 +- homeassistant/components/venstar/climate.py | 7 ++----- homeassistant/components/zabbix/__init__.py | 7 ++----- homeassistant/components/zoneminder/__init__.py | 7 ++----- 23 files changed, 44 insertions(+), 55 deletions(-) diff --git a/homeassistant/components/cisco_mobility_express/device_tracker.py b/homeassistant/components/cisco_mobility_express/device_tracker.py index db504e3d19b6..220228b65704 100644 --- a/homeassistant/components/cisco_mobility_express/device_tracker.py +++ b/homeassistant/components/cisco_mobility_express/device_tracker.py @@ -43,7 +43,7 @@ def get_scanner(hass, config): config[CONF_HOST], config[CONF_USERNAME], config[CONF_PASSWORD], - config.get(CONF_SSL), + config[CONF_SSL], config.get(CONF_VERIFY_SSL), ) if not controller.is_logged_in(): diff --git a/homeassistant/components/emby/media_player.py b/homeassistant/components/emby/media_player.py index 19fad984b27b..0a14799ce24b 100644 --- a/homeassistant/components/emby/media_player.py +++ b/homeassistant/components/emby/media_player.py @@ -71,7 +71,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= host = config.get(CONF_HOST) key = config.get(CONF_API_KEY) port = config.get(CONF_PORT) - ssl = config.get(CONF_SSL) + ssl = config[CONF_SSL] if port is None: port = DEFAULT_SSL_PORT if ssl else DEFAULT_PORT diff --git a/homeassistant/components/enigma2/media_player.py b/homeassistant/components/enigma2/media_player.py index 85dec4abd94f..f8a341481a87 100644 --- a/homeassistant/components/enigma2/media_player.py +++ b/homeassistant/components/enigma2/media_player.py @@ -107,7 +107,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): port=config.get(CONF_PORT), username=config.get(CONF_USERNAME), password=config.get(CONF_PASSWORD), - is_https=config.get(CONF_SSL), + is_https=config[CONF_SSL], prefer_picon=config.get(CONF_USE_CHANNEL_ICON), mac_address=config.get(CONF_MAC_ADDRESS), turn_off_to_deep=config.get(CONF_DEEP_STANDBY), diff --git a/homeassistant/components/epson/media_player.py b/homeassistant/components/epson/media_player.py index b39722c39f34..6a04988bebb1 100644 --- a/homeassistant/components/epson/media_player.py +++ b/homeassistant/components/epson/media_player.py @@ -90,7 +90,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= name = config.get(CONF_NAME) host = config.get(CONF_HOST) port = config.get(CONF_PORT) - ssl = config.get(CONF_SSL) + ssl = config[CONF_SSL] epson_proj = EpsonProjector( async_get_clientsession(hass, verify_ssl=False), name, host, port, ssl diff --git a/homeassistant/components/hikvision/binary_sensor.py b/homeassistant/components/hikvision/binary_sensor.py index 140f6908dceb..4d2a879bc735 100644 --- a/homeassistant/components/hikvision/binary_sensor.py +++ b/homeassistant/components/hikvision/binary_sensor.py @@ -90,10 +90,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): customize = config.get(CONF_CUSTOMIZE) - if config.get(CONF_SSL): - protocol = "https" - else: - protocol = "http" + protocol = "https" if config[CONF_SSL] else "http" url = f"{protocol}://{host}" diff --git a/homeassistant/components/homematic/__init__.py b/homeassistant/components/homematic/__init__.py index 24c9e37a3be1..4dfc27650c89 100644 --- a/homeassistant/components/homematic/__init__.py +++ b/homeassistant/components/homematic/__init__.py @@ -222,7 +222,7 @@ def setup(hass, config): "password": rconfig.get(CONF_PASSWORD), "callbackip": rconfig.get(CONF_CALLBACK_IP), "callbackport": rconfig.get(CONF_CALLBACK_PORT), - "ssl": rconfig.get(CONF_SSL), + "ssl": rconfig[CONF_SSL], "verify_ssl": rconfig.get(CONF_VERIFY_SSL), "connect": True, } diff --git a/homeassistant/components/influxdb/sensor.py b/homeassistant/components/influxdb/sensor.py index 9d0eaa843401..64ab1174b8b6 100644 --- a/homeassistant/components/influxdb/sensor.py +++ b/homeassistant/components/influxdb/sensor.py @@ -75,7 +75,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): "host": config[CONF_HOST], "password": config.get(CONF_PASSWORD), "port": config.get(CONF_PORT), - "ssl": config.get(CONF_SSL), + "ssl": config[CONF_SSL], "username": config.get(CONF_USERNAME), "verify_ssl": config.get(CONF_VERIFY_SSL), } @@ -203,7 +203,7 @@ class InfluxSensorData: points = list(self.influx.query(self.query).get_points()) if not points: _LOGGER.warning( - "Query returned no points, sensor state set to UNKNOWN: %s", self.query, + "Query returned no points, sensor state set to UNKNOWN: %s", self.query ) self.value = None else: diff --git a/homeassistant/components/itunes/media_player.py b/homeassistant/components/itunes/media_player.py index ccefb681d6ea..e96c40b13b6b 100644 --- a/homeassistant/components/itunes/media_player.py +++ b/homeassistant/components/itunes/media_player.py @@ -198,7 +198,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): config.get(CONF_NAME), config.get(CONF_HOST), config.get(CONF_PORT), - config.get(CONF_SSL), + config[CONF_SSL], add_entities, ) ] diff --git a/homeassistant/components/mfi/switch.py b/homeassistant/components/mfi/switch.py index b3d3e0ea285f..08ed841e7e12 100644 --- a/homeassistant/components/mfi/switch.py +++ b/homeassistant/components/mfi/switch.py @@ -40,7 +40,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): host = config.get(CONF_HOST) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) - use_tls = config.get(CONF_SSL) + use_tls = config[CONF_SSL] verify_tls = config.get(CONF_VERIFY_SSL) default_port = 6443 if use_tls else 6080 port = int(config.get(CONF_PORT, default_port)) diff --git a/homeassistant/components/octoprint/__init__.py b/homeassistant/components/octoprint/__init__.py index 9e8f1dff6c65..c345dd6cce71 100644 --- a/homeassistant/components/octoprint/__init__.py +++ b/homeassistant/components/octoprint/__init__.py @@ -144,9 +144,9 @@ def setup(hass, config): for printer in config[DOMAIN]: name = printer[CONF_NAME] - ssl = "s" if printer[CONF_SSL] else "" + protocol = "https" if printer[CONF_SSL] else "http" base_url = ( - f"http{ssl}://{printer[CONF_HOST]}:{printer[CONF_PORT]}" + f"{protocol}://{printer[CONF_HOST]}:{printer[CONF_PORT]}" f"{printer[CONF_PATH]}api/" ) api_key = printer[CONF_API_KEY] diff --git a/homeassistant/components/opengarage/cover.py b/homeassistant/components/opengarage/cover.py index 0bb9d7a7c5b0..e34f98c87d25 100644 --- a/homeassistant/components/opengarage/cover.py +++ b/homeassistant/components/opengarage/cover.py @@ -64,7 +64,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): CONF_NAME: device_config.get(CONF_NAME), CONF_HOST: device_config.get(CONF_HOST), CONF_PORT: device_config.get(CONF_PORT), - CONF_SSL: device_config.get(CONF_SSL), + CONF_SSL: device_config[CONF_SSL], CONF_VERIFY_SSL: device_config.get(CONF_VERIFY_SSL), CONF_DEVICE_KEY: device_config.get(CONF_DEVICE_KEY), } @@ -80,7 +80,7 @@ class OpenGarageCover(CoverDevice): def __init__(self, args): """Initialize the cover.""" self.opengarage_url = ( - f"http{'s' if args[CONF_SSL] else ''}://" + f"{'https' if args[CONF_SSL] else 'http'}://" f"{args[CONF_HOST]}:{args[CONF_PORT]}" ) self._name = args[CONF_NAME] diff --git a/homeassistant/components/plex/__init__.py b/homeassistant/components/plex/__init__.py index ff36f4f5c320..6dabc5ad594d 100644 --- a/homeassistant/components/plex/__init__.py +++ b/homeassistant/components/plex/__init__.py @@ -100,10 +100,10 @@ def _async_setup_plex(hass, config): if MP_DOMAIN in server_config: hass.data.setdefault(PLEX_MEDIA_PLAYER_OPTIONS, server_config.pop(MP_DOMAIN)) if CONF_HOST in server_config: - prefix = "https" if server_config.pop(CONF_SSL) else "http" + protocol = "https" if server_config.pop(CONF_SSL) else "http" server_config[ CONF_URL - ] = f"{prefix}://{server_config.pop(CONF_HOST)}:{server_config.pop(CONF_PORT)}" + ] = f"{protocol}://{server_config.pop(CONF_HOST)}:{server_config.pop(CONF_PORT)}" hass.async_create_task( hass.config_entries.flow.async_init( PLEX_DOMAIN, diff --git a/homeassistant/components/pyload/sensor.py b/homeassistant/components/pyload/sensor.py index 579919821a34..249fb85bacc7 100644 --- a/homeassistant/components/pyload/sensor.py +++ b/homeassistant/components/pyload/sensor.py @@ -51,12 +51,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the pyLoad sensors.""" host = config.get(CONF_HOST) port = config.get(CONF_PORT) - ssl = "s" if config.get(CONF_SSL) else "" + protocol = "https" if config[CONF_SSL] else "http" name = config.get(CONF_NAME) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) monitored_types = config.get(CONF_MONITORED_VARIABLES) - url = f"http{ssl}://{host}:{port}/api/" + url = f"{protocol}://{host}:{port}/api/" try: pyloadapi = PyLoadAPI(api_url=url, username=username, password=password) diff --git a/homeassistant/components/qnap/sensor.py b/homeassistant/components/qnap/sensor.py index 475e02aba868..dc148d4f516e 100644 --- a/homeassistant/components/qnap/sensor.py +++ b/homeassistant/components/qnap/sensor.py @@ -175,7 +175,7 @@ class QNAPStatsAPI: def __init__(self, config): """Initialize the API wrapper.""" - protocol = "https" if config.get(CONF_SSL) else "http" + protocol = "https" if config[CONF_SSL] else "http" self._api = QNAPStats( "{}://{}".format(protocol, config.get(CONF_HOST)), config.get(CONF_PORT), diff --git a/homeassistant/components/radarr/sensor.py b/homeassistant/components/radarr/sensor.py index 30051d929db6..a15f8b4fe4e9 100644 --- a/homeassistant/components/radarr/sensor.py +++ b/homeassistant/components/radarr/sensor.py @@ -53,11 +53,11 @@ SENSOR_TYPES = { } ENDPOINTS = { - "diskspace": "http{0}://{1}:{2}/{3}api/diskspace", - "upcoming": "http{0}://{1}:{2}/{3}api/calendar?start={4}&end={5}", - "movies": "http{0}://{1}:{2}/{3}api/movie", - "commands": "http{0}://{1}:{2}/{3}api/command", - "status": "http{0}://{1}:{2}/{3}api/system/status", + "diskspace": "{0}://{1}:{2}/{3}api/diskspace", + "upcoming": "{0}://{1}:{2}/{3}api/calendar?start={4}&end={5}", + "movies": "{0}://{1}:{2}/{3}api/movie", + "commands": "{0}://{1}:{2}/{3}api/command", + "status": "{0}://{1}:{2}/{3}api/system/status", } # Support to Yottabytes for the future, why not @@ -110,7 +110,7 @@ class RadarrSensor(Entity): self.apikey = conf.get(CONF_API_KEY) self.included = conf.get(CONF_INCLUDED) self.days = int(conf.get(CONF_DAYS)) - self.ssl = "s" if conf.get(CONF_SSL) else "" + self.ssl = "https" if conf.get(CONF_SSL) else "http" self._state = None self.data = [] self._tz = timezone(str(hass.config.time_zone)) diff --git a/homeassistant/components/sabnzbd/__init__.py b/homeassistant/components/sabnzbd/__init__.py index b36abbedb487..64265f71903d 100644 --- a/homeassistant/components/sabnzbd/__init__.py +++ b/homeassistant/components/sabnzbd/__init__.py @@ -134,7 +134,7 @@ async def async_setup(hass, config): conf = config.get(DOMAIN) if conf is not None: - use_ssl = conf.get(CONF_SSL) + use_ssl = conf[CONF_SSL] name = conf.get(CONF_NAME) api_key = conf.get(CONF_API_KEY) await async_configure_sabnzbd(hass, conf, use_ssl, name, api_key) diff --git a/homeassistant/components/sma/sensor.py b/homeassistant/components/sma/sensor.py index e5afa272c40e..ce61d4ff17b0 100644 --- a/homeassistant/components/sma/sensor.py +++ b/homeassistant/components/sma/sensor.py @@ -131,7 +131,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= session = async_get_clientsession(hass, verify_ssl=config[CONF_VERIFY_SSL]) grp = config[CONF_GROUP] - url = "http{}://{}".format("s" if config[CONF_SSL] else "", config[CONF_HOST]) + protocol = "https" if config[CONF_SSL] else "http" + url = f"{protocol}://{config[CONF_HOST]}" sma = pysma.SMA(session, url, config[CONF_PASSWORD], group=grp) diff --git a/homeassistant/components/sonarr/sensor.py b/homeassistant/components/sonarr/sensor.py index ac9b81be7a43..d7298b2abeb9 100644 --- a/homeassistant/components/sonarr/sensor.py +++ b/homeassistant/components/sonarr/sensor.py @@ -52,13 +52,13 @@ SENSOR_TYPES = { } ENDPOINTS = { - "diskspace": "http{0}://{1}:{2}/{3}api/diskspace", - "queue": "http{0}://{1}:{2}/{3}api/queue", - "upcoming": "http{0}://{1}:{2}/{3}api/calendar?start={4}&end={5}", - "wanted": "http{0}://{1}:{2}/{3}api/wanted/missing", - "series": "http{0}://{1}:{2}/{3}api/series", - "commands": "http{0}://{1}:{2}/{3}api/command", - "status": "http{0}://{1}:{2}/{3}api/system/status", + "diskspace": "{0}://{1}:{2}/{3}api/diskspace", + "queue": "{0}://{1}:{2}/{3}api/queue", + "upcoming": "{0}://{1}:{2}/{3}api/calendar?start={4}&end={5}", + "wanted": "{0}://{1}:{2}/{3}api/wanted/missing", + "series": "{0}://{1}:{2}/{3}api/series", + "commands": "{0}://{1}:{2}/{3}api/command", + "status": "{0}://{1}:{2}/{3}api/system/status", } # Support to Yottabytes for the future, why not @@ -111,7 +111,7 @@ class SonarrSensor(Entity): self.apikey = conf.get(CONF_API_KEY) self.included = conf.get(CONF_INCLUDED) self.days = int(conf.get(CONF_DAYS)) - self.ssl = "s" if conf.get(CONF_SSL) else "" + self.ssl = "https" if conf.get(CONF_SSL) else "http" self._state = None self.data = [] self._tz = timezone(str(hass.config.time_zone)) diff --git a/homeassistant/components/splunk/__init__.py b/homeassistant/components/splunk/__init__.py index 5b26d9b1c6f3..bbff510db148 100644 --- a/homeassistant/components/splunk/__init__.py +++ b/homeassistant/components/splunk/__init__.py @@ -70,7 +70,7 @@ def setup(hass, config): host = conf.get(CONF_HOST) port = conf.get(CONF_PORT) token = conf.get(CONF_TOKEN) - use_ssl = conf.get(CONF_SSL) + use_ssl = conf[CONF_SSL] verify_ssl = conf.get(CONF_VERIFY_SSL) name = conf.get(CONF_NAME) entity_filter = conf[CONF_FILTER] diff --git a/homeassistant/components/tautulli/sensor.py b/homeassistant/components/tautulli/sensor.py index b800bf6af1e0..3c61559bcfa0 100644 --- a/homeassistant/components/tautulli/sensor.py +++ b/homeassistant/components/tautulli/sensor.py @@ -59,7 +59,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= api_key = config[CONF_API_KEY] monitored_conditions = config.get(CONF_MONITORED_CONDITIONS) user = config.get(CONF_MONITORED_USERS) - use_ssl = config.get(CONF_SSL) + use_ssl = config[CONF_SSL] verify_ssl = config.get(CONF_VERIFY_SSL) session = async_get_clientsession(hass, verify_ssl) diff --git a/homeassistant/components/venstar/climate.py b/homeassistant/components/venstar/climate.py index effecd7244cb..7de6427b5d85 100644 --- a/homeassistant/components/venstar/climate.py +++ b/homeassistant/components/venstar/climate.py @@ -82,10 +82,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): timeout = config.get(CONF_TIMEOUT) humidifier = config.get(CONF_HUMIDIFIER) - if config.get(CONF_SSL): - proto = "https" - else: - proto = "http" + protocol = "https" if config[CONF_SSL] else "http" client = VenstarColorTouch( addr=host, @@ -93,7 +90,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): user=username, password=password, pin=pin, - proto=proto, + proto=protocol, ) add_entities([VenstarThermostat(client, humidifier)], True) diff --git a/homeassistant/components/zabbix/__init__.py b/homeassistant/components/zabbix/__init__.py index b6576fc6893d..644d35da7289 100644 --- a/homeassistant/components/zabbix/__init__.py +++ b/homeassistant/components/zabbix/__init__.py @@ -40,12 +40,9 @@ def setup(hass, config): """Set up the Zabbix component.""" conf = config[DOMAIN] - if conf[CONF_SSL]: - schema = "https" - else: - schema = "http" + protocol = "https" if config[CONF_SSL] else "http" - url = urljoin("{}://{}".format(schema, conf[CONF_HOST]), conf[CONF_PATH]) + url = urljoin(f"{protocol}://{conf[CONF_HOST]}", conf[CONF_PATH]) username = conf.get(CONF_USERNAME) password = conf.get(CONF_PASSWORD) diff --git a/homeassistant/components/zoneminder/__init__.py b/homeassistant/components/zoneminder/__init__.py index 3007c981480f..cd62cef74eb8 100644 --- a/homeassistant/components/zoneminder/__init__.py +++ b/homeassistant/components/zoneminder/__init__.py @@ -58,13 +58,10 @@ def setup(hass, config): success = True for conf in config[DOMAIN]: - if conf[CONF_SSL]: - schema = "https" - else: - schema = "http" + protocol = "https" if config[CONF_SSL] else "http" host_name = conf[CONF_HOST] - server_origin = f"{schema}://{host_name}" + server_origin = f"{protocol}://{host_name}" zm_client = ZoneMinder( server_origin, conf.get(CONF_USERNAME), From 14c35c92230a4b5b4c805b0e0a2ffc85a8932d23 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 10 Apr 2020 22:04:50 +0200 Subject: [PATCH 291/653] Fix shutdown timeout and make it upstream with Supervisor (#33973) * Fix shutdown timeout and make it upstream with Supervisor * Moved ENV command up * Update finish Co-authored-by: Franck Nijhof --- Dockerfile | 6 +++++- rootfs/etc/services.d/home-assistant/finish | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 647c2b8ac072..4646e9f01f1a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,15 @@ ARG BUILD_FROM FROM ${BUILD_FROM} +ENV \ + S6_SERVICES_GRACETIME=60000 + WORKDIR /usr/src ## Setup Home Assistant COPY . homeassistant/ -RUN pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ +RUN \ + pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ -r homeassistant/requirements_all.txt -c homeassistant/homeassistant/package_constraints.txt \ && pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \ -e ./homeassistant \ diff --git a/rootfs/etc/services.d/home-assistant/finish b/rootfs/etc/services.d/home-assistant/finish index 3afed0ca8d8c..d039fc04c86f 100644 --- a/rootfs/etc/services.d/home-assistant/finish +++ b/rootfs/etc/services.d/home-assistant/finish @@ -1,7 +1,8 @@ -#!/usr/bin/execlineb -S0 +#!/usr/bin/execlineb -S1 # ============================================================================== # Take down the S6 supervision tree when Home Assistant fails # ============================================================================== if { s6-test ${1} -ne 100 } +if { s6-test ${1} -ne 256 } -s6-svscanctl -t /var/run/s6/services \ No newline at end of file +s6-svscanctl -t /var/run/s6/services From 13dda7bd9859835e25412c3596b25dfc9f6fb334 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Fri, 10 Apr 2020 16:17:48 -0400 Subject: [PATCH 292/653] Cleanup ZHA group entity lifecycle (#33977) * Clean up ZHA group entity lifecycle * group entities don't use state restore * add tests --- homeassistant/components/zha/__init__.py | 2 + homeassistant/components/zha/core/const.py | 1 + homeassistant/components/zha/core/device.py | 10 ++- .../components/zha/core/discovery.py | 25 +++++++- homeassistant/components/zha/core/gateway.py | 50 +++++++++++---- homeassistant/components/zha/entity.py | 64 +++++++++---------- tests/components/zha/test_light.py | 18 ++++++ 7 files changed, 125 insertions(+), 45 deletions(-) diff --git a/homeassistant/components/zha/__init__.py b/homeassistant/components/zha/__init__.py index 2af35e8fb92e..9e59b63adb4e 100644 --- a/homeassistant/components/zha/__init__.py +++ b/homeassistant/components/zha/__init__.py @@ -32,6 +32,7 @@ from .core.const import ( SIGNAL_ADD_ENTITIES, RadioType, ) +from .core.discovery import GROUP_PROBE DEVICE_CONFIG_SCHEMA_ENTRY = vol.Schema({vol.Optional(ha_const.CONF_TYPE): cv.string}) @@ -138,6 +139,7 @@ async def async_unload_entry(hass, config_entry): """Unload ZHA config entry.""" await hass.data[DATA_ZHA][DATA_ZHA_GATEWAY].shutdown() + GROUP_PROBE.cleanup() api.async_unload_api(hass) dispatchers = hass.data[DATA_ZHA].get(DATA_ZHA_DISPATCHERS, []) diff --git a/homeassistant/components/zha/core/const.py b/homeassistant/components/zha/core/const.py index 055b5627bb11..b181b848f047 100644 --- a/homeassistant/components/zha/core/const.py +++ b/homeassistant/components/zha/core/const.py @@ -213,6 +213,7 @@ SIGNAL_SET_LEVEL = "set_level" SIGNAL_STATE_ATTR = "update_state_attribute" SIGNAL_UPDATE_DEVICE = "{}_zha_update_device" SIGNAL_REMOVE_GROUP = "remove_group" +SIGNAL_GROUP_ENTITY_REMOVED = "group_entity_removed" SIGNAL_GROUP_MEMBERSHIP_CHANGE = "group_membership_change" UNKNOWN = "unknown" diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 287ad0dd5221..5782ce230837 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -561,7 +561,15 @@ class ZHADevice(LogMixin): async def async_remove_from_group(self, group_id): """Remove this device from the provided zigbee group.""" - await self._zigpy_device.remove_from_group(group_id) + try: + await self._zigpy_device.remove_from_group(group_id) + except (zigpy.exceptions.DeliveryError, asyncio.TimeoutError) as ex: + self.debug( + "Failed to remove device '%s' from group: 0x%04x ex: %s", + self._zigpy_device.ieee, + group_id, + str(ex), + ) async def async_bind_to_group(self, group_id, cluster_bindings): """Directly bind this device to a group for the given clusters.""" diff --git a/homeassistant/components/zha/core/discovery.py b/homeassistant/components/zha/core/discovery.py index 90ec0e6e2502..4540c9158de6 100644 --- a/homeassistant/components/zha/core/discovery.py +++ b/homeassistant/components/zha/core/discovery.py @@ -6,7 +6,10 @@ from typing import Callable, List, Tuple from homeassistant import const as ha_const from homeassistant.core import callback -from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.dispatcher import ( + async_dispatcher_connect, + async_dispatcher_send, +) from homeassistant.helpers.entity_registry import async_entries_for_device from homeassistant.helpers.typing import HomeAssistantType @@ -166,10 +169,30 @@ class GroupProbe: def __init__(self): """Initialize instance.""" self._hass = None + self._unsubs = [] def initialize(self, hass: HomeAssistantType) -> None: """Initialize the group probe.""" self._hass = hass + self._unsubs.append( + async_dispatcher_connect( + hass, zha_const.SIGNAL_GROUP_ENTITY_REMOVED, self._reprobe_group + ) + ) + + def cleanup(self): + """Clean up on when zha shuts down.""" + for unsub in self._unsubs[:]: + unsub() + self._unsubs.remove(unsub) + + def _reprobe_group(self, group_id: int) -> None: + """Reprobe a group for entities after its members change.""" + zha_gateway = self._hass.data[zha_const.DATA_ZHA][zha_const.DATA_ZHA_GATEWAY] + zha_group = zha_gateway.groups.get(group_id) + if zha_group is None: + return + self.discover_group_entities(zha_group) @callback def discover_group_entities(self, group: zha_typing.ZhaGroupType) -> None: diff --git a/homeassistant/components/zha/core/gateway.py b/homeassistant/components/zha/core/gateway.py index e032de4d94c5..e97e2185dc5f 100644 --- a/homeassistant/components/zha/core/gateway.py +++ b/homeassistant/components/zha/core/gateway.py @@ -20,7 +20,10 @@ from homeassistant.helpers.device_registry import ( async_get_registry as get_dev_reg, ) from homeassistant.helpers.dispatcher import async_dispatcher_send -from homeassistant.helpers.entity_registry import async_get_registry as get_ent_reg +from homeassistant.helpers.entity_registry import ( + async_entries_for_device, + async_get_registry as get_ent_reg, +) from . import discovery, typing as zha_typing from .const import ( @@ -77,7 +80,7 @@ from .const import ( from .device import DeviceStatus, ZHADevice from .group import ZHAGroup from .patches import apply_application_controller_patch -from .registries import RADIO_TYPES +from .registries import GROUP_ENTITY_DOMAINS, RADIO_TYPES from .store import async_get_registry from .typing import ZhaDeviceType, ZhaGroupType, ZigpyEndpointType, ZigpyGroupType @@ -273,6 +276,9 @@ class ZHAGateway: async_dispatcher_send( self._hass, f"{SIGNAL_GROUP_MEMBERSHIP_CHANGE}_0x{zigpy_group.group_id:04x}" ) + if len(zha_group.members) == 2: + # we need to do this because there wasn't already a group entity to remove and re-add + discovery.GROUP_PROBE.discover_group_entities(zha_group) def group_added(self, zigpy_group: ZigpyGroupType) -> None: """Handle zigpy group added event.""" @@ -289,6 +295,7 @@ class ZHAGateway: async_dispatcher_send( self._hass, f"{SIGNAL_REMOVE_GROUP}_0x{zigpy_group.group_id:04x}" ) + self._cleanup_group_entity_registry_entries(zigpy_group) def _send_group_gateway_message( self, zigpy_group: ZigpyGroupType, gateway_message_type: str @@ -368,6 +375,35 @@ class ZHAGateway: e for e in entity_refs if e.reference_id != entity.entity_id ] + def _cleanup_group_entity_registry_entries( + self, zigpy_group: ZigpyGroupType + ) -> None: + """Remove entity registry entries for group entities when the groups are removed from HA.""" + # first we collect the potential unique ids for entities that could be created from this group + possible_entity_unique_ids = [ + f"{domain}_zha_group_0x{zigpy_group.group_id:04x}" + for domain in GROUP_ENTITY_DOMAINS + ] + + # then we get all group entity entries tied to the coordinator + all_group_entity_entries = async_entries_for_device( + self.ha_entity_registry, self.coordinator_zha_device.device_id + ) + + # then we get the entity entries for this specific group by getting the entries that match + entries_to_remove = [ + entry + for entry in all_group_entity_entries + if entry.unique_id in possible_entity_unique_ids + ] + + # then we remove the entries from the entity registry + for entry in entries_to_remove: + _LOGGER.debug( + "cleaning up entity registry entry for entity: %s", entry.entity_id + ) + self.ha_entity_registry.async_remove(entry.entity_id) + @property def devices(self): """Return devices.""" @@ -557,15 +593,7 @@ class ZHAGateway: ) tasks.append(self.devices[ieee].async_add_to_group(group_id)) await asyncio.gather(*tasks) - zha_group = self.groups.get(group_id) - _LOGGER.debug( - "Probing group: %s:0x%04x for entity discovery", - zha_group.name, - zha_group.group_id, - ) - discovery.GROUP_PROBE.discover_group_entities(zha_group) - - return zha_group + return self.groups.get(group_id) async def async_remove_zigpy_group(self, group_id: int) -> None: """Remove a Zigbee group from Zigpy.""" diff --git a/homeassistant/components/zha/entity.py b/homeassistant/components/zha/entity.py index dd12924f4b0d..fe213f7920b4 100644 --- a/homeassistant/components/zha/entity.py +++ b/homeassistant/components/zha/entity.py @@ -8,7 +8,10 @@ from typing import Any, Awaitable, Dict, List, Optional from homeassistant.core import CALLBACK_TYPE, State, callback from homeassistant.helpers import entity from homeassistant.helpers.device_registry import CONNECTION_ZIGBEE -from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.dispatcher import ( + async_dispatcher_connect, + async_dispatcher_send, +) from homeassistant.helpers.event import async_track_state_change from homeassistant.helpers.restore_state import RestoreEntity @@ -19,6 +22,7 @@ from .core.const import ( DATA_ZHA, DATA_ZHA_BRIDGE_ID, DOMAIN, + SIGNAL_GROUP_ENTITY_REMOVED, SIGNAL_GROUP_MEMBERSHIP_CHANGE, SIGNAL_REMOVE, SIGNAL_REMOVE_GROUP, @@ -32,7 +36,7 @@ ENTITY_SUFFIX = "entity_suffix" RESTART_GRACE_PERIOD = 7200 # 2 hours -class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): +class BaseZhaEntity(LogMixin, entity.Entity): """A base class for ZHA entities.""" def __init__(self, unique_id: str, zha_device: ZhaDeviceType, **kwargs): @@ -113,28 +117,11 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): def async_set_state(self, attr_id: int, attr_name: str, value: Any) -> None: """Set the entity state.""" - async def async_added_to_hass(self) -> None: - """Run when about to be added to hass.""" - await super().async_added_to_hass() - self.remove_future = asyncio.Future() - await self.async_accept_signal( - None, - f"{SIGNAL_REMOVE}_{self.zha_device.ieee}", - self.async_remove, - signal_override=True, - ) - async def async_will_remove_from_hass(self) -> None: """Disconnect entity object when removed.""" for unsub in self._unsubs[:]: unsub() self._unsubs.remove(unsub) - self.zha_device.gateway.remove_entity_reference(self) - self.remove_future.set_result(True) - - @callback - def async_restore_last_state(self, last_state) -> None: - """Restore previous state.""" async def async_accept_signal( self, channel: ChannelType, signal: str, func: CALLABLE_T, signal_override=False @@ -156,7 +143,7 @@ class BaseZhaEntity(RestoreEntity, LogMixin, entity.Entity): _LOGGER.log(level, msg, *args) -class ZhaEntity(BaseZhaEntity): +class ZhaEntity(BaseZhaEntity, RestoreEntity): """A base class for non group ZHA entities.""" def __init__( @@ -179,6 +166,13 @@ class ZhaEntity(BaseZhaEntity): async def async_added_to_hass(self) -> None: """Run when about to be added to hass.""" await super().async_added_to_hass() + self.remove_future = asyncio.Future() + await self.async_accept_signal( + None, + f"{SIGNAL_REMOVE}_{self.zha_device.ieee}", + self.async_remove, + signal_override=True, + ) await self.async_check_recently_seen() await self.async_accept_signal( None, @@ -195,6 +189,16 @@ class ZhaEntity(BaseZhaEntity): self.remove_future, ) + async def async_will_remove_from_hass(self) -> None: + """Disconnect entity object when removed.""" + await super().async_will_remove_from_hass() + self.zha_device.gateway.remove_entity_reference(self) + self.remove_future.set_result(True) + + @callback + def async_restore_last_state(self, last_state) -> None: + """Restore previous state.""" + async def async_check_recently_seen(self) -> None: """Check if the device was seen within the last 2 hours.""" last_state = await self.async_get_last_state() @@ -244,13 +248,20 @@ class ZhaGroupEntity(BaseZhaEntity): await self.async_accept_signal( None, f"{SIGNAL_GROUP_MEMBERSHIP_CHANGE}_0x{self._group_id:04x}", - self._update_group_entities, + self.async_remove, signal_override=True, ) self._async_unsub_state_changed = async_track_state_change( self.hass, self._entity_ids, self.async_state_changed_listener ) + + def send_removed_signal(): + async_dispatcher_send( + self.hass, SIGNAL_GROUP_ENTITY_REMOVED, self._group_id + ) + + self.async_on_remove(send_removed_signal) await self.async_update() @callback @@ -260,17 +271,6 @@ class ZhaGroupEntity(BaseZhaEntity): """Handle child updates.""" self.async_schedule_update_ha_state(True) - def _update_group_entities(self): - """Update tracked entities when membership changes.""" - group = self.zha_device.gateway.get_group(self._group_id) - self._entity_ids = group.get_domain_entity_ids(self.platform.domain) - if self._async_unsub_state_changed is not None: - self._async_unsub_state_changed() - - self._async_unsub_state_changed = async_track_state_change( - self.hass, self._entity_ids, self.async_state_changed_listener - ) - async def async_will_remove_from_hass(self) -> None: """Handle removal from Home Assistant.""" await super().async_will_remove_from_hass() diff --git a/tests/components/zha/test_light.py b/tests/components/zha/test_light.py index 9bdd4966a4a9..f297bfa5bf0c 100644 --- a/tests/components/zha/test_light.py +++ b/tests/components/zha/test_light.py @@ -539,3 +539,21 @@ async def async_test_zha_group_light_entity( await zha_group.async_add_members([device_light_3.ieee]) await dev3_cluster_on_off.on() assert hass.states.get(entity_id).state == STATE_ON + + # make the group have only 1 member and now there should be no entity + await zha_group.async_remove_members([device_light_2.ieee, device_light_3.ieee]) + assert len(zha_group.members) == 1 + assert hass.states.get(entity_id).state is None + # make sure the entity registry entry is still there + assert zha_gateway.ha_entity_registry.async_get(entity_id) is not None + + # add a member back and ensure that the group entity was created again + await zha_group.async_add_members([device_light_3.ieee]) + await dev3_cluster_on_off.on() + assert hass.states.get(entity_id).state == STATE_ON + + # remove the group and ensure that there is no entity and that the entity registry is cleaned up + assert zha_gateway.ha_entity_registry.async_get(entity_id) is not None + await zha_gateway.async_remove_zigpy_group(zha_group.group_id) + assert hass.states.get(entity_id).state is None + assert zha_gateway.ha_entity_registry.async_get(entity_id) is None From 294a2d2460b94b40ad6946e13e265d410957cf4a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 15:56:40 -0500 Subject: [PATCH 293/653] Exclude non thermostats from being detected by nexia (#33979) * Fix detection of emergency heat * Bump nexia to 0.8.2 --- homeassistant/components/nexia/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index a6ea270fb5b7..2102a2a82255 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,7 +1,7 @@ { "domain": "nexia", "name": "Nexia", - "requirements": ["nexia==0.8.1"], + "requirements": ["nexia==0.8.2"], "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index a9ad1f13209c..c42eea70c7ce 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -921,7 +921,7 @@ netdisco==2.6.0 neurio==0.3.1 # homeassistant.components.nexia -nexia==0.8.1 +nexia==0.8.2 # homeassistant.components.nextcloud nextcloudmonitor==1.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2f0a75d796ac..b4d38b5d5125 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -356,7 +356,7 @@ nessclient==0.9.15 netdisco==2.6.0 # homeassistant.components.nexia -nexia==0.8.1 +nexia==0.8.2 # homeassistant.components.nsw_fuel_station nsw-fuel-api-client==1.0.10 From 8e6e8dfbe06028665d024be5d5ade53e1b699087 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 10 Apr 2020 14:17:09 -0700 Subject: [PATCH 294/653] Migrate translations_develop script (#33933) * Migrate translations_develop script * Fix lint --- script/scaffold/__main__.py | 10 +++- script/translations/__main__.py | 23 +++----- .../develop.py} | 56 +++++++------------ script/translations/download.py | 21 ++++--- script/translations/upload.py | 23 +++++--- script/translations/util.py | 11 ++++ 6 files changed, 76 insertions(+), 68 deletions(-) rename script/{translations_develop => translations/develop.py} (50%) mode change 100755 => 100644 diff --git a/script/scaffold/__main__.py b/script/scaffold/__main__.py index d3b689141044..5a6645109fd6 100644 --- a/script/scaffold/__main__.py +++ b/script/scaffold/__main__.py @@ -84,7 +84,15 @@ def main(): print("Running script/translations_develop to pick up new translation strings.") subprocess.run( - ["script/translations_develop", "--integration", info.domain], **pipe_null + [ + "python", + "-m", + "script.translations", + "develop", + "--integration", + info.domain, + ], + **pipe_null, ) print() diff --git a/script/translations/__main__.py b/script/translations/__main__.py index 2d153360a2a3..3b64b4168c21 100644 --- a/script/translations/__main__.py +++ b/script/translations/__main__.py @@ -1,20 +1,15 @@ """Validate manifests.""" import argparse +import importlib from pathlib import Path import sys -from . import clean, download, error, upload +from . import error, util def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" - parser = argparse.ArgumentParser(description="Home Assistant Scaffolder") - parser.add_argument("action", type=str, choices=["download", "clean", "upload"]) - parser.add_argument("--debug", action="store_true", help="Enable log output") - - arguments = parser.parse_args() - - return arguments + return util.get_base_arg_parser().parse_known_args()[0] def main(): @@ -25,12 +20,8 @@ def main(): args = get_arguments() - if args.action == "download": - download.run(args) - elif args.action == "upload": - upload.run(args) - elif args.action == "clean": - clean.run() + module = importlib.import_module(f".{args.action}", "script.translations") + module.run() return 0 @@ -42,3 +33,7 @@ if __name__ == "__main__": print() print(f"Fatal Error: {err.reason}") sys.exit(err.exit_code) + except (KeyboardInterrupt, EOFError): + print() + print("Aborted!") + sys.exit(2) diff --git a/script/translations_develop b/script/translations/develop.py old mode 100755 new mode 100644 similarity index 50% rename from script/translations_develop rename to script/translations/develop.py index f0976f3d676a..27f3a8843359 --- a/script/translations_develop +++ b/script/translations/develop.py @@ -1,19 +1,18 @@ -#!/usr/bin/env python - -# Compile the current translation strings files for testing - +"""Compile the current translation strings files for testing.""" import argparse import json -import os from pathlib import Path from shutil import rmtree -import subprocess import sys +from . import download, upload +from .const import INTEGRATIONS_DIR +from .util import get_base_arg_parser + def valid_integration(integration): """Test if it's a valid integration.""" - if not Path(f"homeassistant/components/{integration}").exists(): + if not (INTEGRATIONS_DIR / integration).is_dir(): raise argparse.ArgumentTypeError( f"The integration {integration} does not exist." ) @@ -23,22 +22,15 @@ def valid_integration(integration): def get_arguments() -> argparse.Namespace: """Get parsed passed in arguments.""" - parser = argparse.ArgumentParser(description="Develop Translations") + parser = get_base_arg_parser() parser.add_argument( "--integration", type=valid_integration, help="Integration to process." ) - - arguments = parser.parse_args() - - return arguments + return parser.parse_args() -def main(): +def run(): """Run the script.""" - if not os.path.isfile("requirements_all.txt"): - print("Run this from HA root dir") - return - args = get_arguments() if args.integration: integration = args.integration @@ -53,29 +45,19 @@ def main(): print() integration = input("Integration to process: ") - download_dir = Path("build/translations-download") + translations = upload.generate_upload_data() - if download_dir.is_dir(): - rmtree(str(download_dir)) - - download_dir.mkdir(parents=True) - - subprocess.run("script/translations_upload_merge.py") - - raw_data = json.loads(Path("build/translations-upload.json").read_text()) - - if integration not in raw_data["component"]: + if integration not in translations["component"]: print("Integration has no strings.json") sys.exit(1) - Path("build/translations-download/en.json").write_text( - json.dumps({"component": {integration: raw_data["component"][integration]}}) + if download.DOWNLOAD_DIR.is_dir(): + rmtree(str(download.DOWNLOAD_DIR)) + + download.DOWNLOAD_DIR.mkdir(parents=True) + + (download.DOWNLOAD_DIR / "en.json").write_text( + json.dumps({"component": {integration: translations["component"][integration]}}) ) - subprocess.run( - ["script/translations_download_split.py", "--integration", "{integration}"] - ) - - -if __name__ == "__main__": - main() + download.write_integration_translations() diff --git a/script/translations/download.py b/script/translations/download.py index aed94b9266d0..2191a8195a8d 100755 --- a/script/translations/download.py +++ b/script/translations/download.py @@ -13,7 +13,7 @@ from .error import ExitApp from .util import get_lokalise_token FILENAME_FORMAT = re.compile(r"strings\.(?P\w+)\.json") -LOCAL_DIR = pathlib.Path("build/translations-download").absolute() +DOWNLOAD_DIR = pathlib.Path("build/translations-download").absolute() def run_download_docker(): @@ -24,7 +24,7 @@ def run_download_docker(): "docker", "run", "-v", - f"{LOCAL_DIR}:/opt/dest/locale", + f"{DOWNLOAD_DIR}:/opt/dest/locale", "--rm", f"lokalise/lokalise-cli@sha256:{DOCKER_IMAGE}", # Lokalise command @@ -133,14 +133,19 @@ def save_language_translations(lang, translations): save_json(path, platform_translations) -def run(args): - """Run the script.""" - LOCAL_DIR.mkdir(parents=True, exist_ok=True) - - run_download_docker() - +def write_integration_translations(): + """Write integration translations.""" paths = glob.iglob("build/translations-download/*.json") for path in paths: lang = get_language(path) translations = load_json(path) save_language_translations(lang, translations) + + +def run(): + """Run the script.""" + DOWNLOAD_DIR.mkdir(parents=True, exist_ok=True) + + run_download_docker() + + write_integration_translations() diff --git a/script/translations/upload.py b/script/translations/upload.py index 0b5fb237126f..cf14ffa3cf9e 100755 --- a/script/translations/upload.py +++ b/script/translations/upload.py @@ -49,13 +49,8 @@ def run_upload_docker(): raise ExitApp("Failed to download translations") -def run(args): - """Run the script.""" - if get_current_branch() != "dev" and os.environ.get("AZURE_BRANCH") != "dev": - raise ExitApp( - "Please only run the translations upload script from a clean checkout of dev." - ) - +def generate_upload_data(): + """Generate the data for uploading.""" translations = {"component": {}} for path in INTEGRATIONS_DIR.glob(f"*{os.sep}strings*.json"): @@ -71,7 +66,19 @@ def run(args): parent.update(json.loads(path.read_text())) + return translations + + +def run(): + """Run the script.""" + if get_current_branch() != "dev" and os.environ.get("AZURE_BRANCH") != "dev": + raise ExitApp( + "Please only run the translations upload script from a clean checkout of dev." + ) + + translations = generate_upload_data() + LOCAL_FILE.parent.mkdir(parents=True, exist_ok=True) LOCAL_FILE.write_text(json.dumps(translations, indent=4, sort_keys=True)) - # run_upload_docker() + run_upload_docker() diff --git a/script/translations/util.py b/script/translations/util.py index d3026f94cb40..ca747678139d 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -1,4 +1,5 @@ """Translation utils.""" +import argparse import os import pathlib import subprocess @@ -6,6 +7,16 @@ import subprocess from .error import ExitApp +def get_base_arg_parser(): + """Get a base argument parser.""" + parser = argparse.ArgumentParser(description="Home Assistant Translations") + parser.add_argument( + "action", type=str, choices=["download", "clean", "upload", "develop"] + ) + parser.add_argument("--debug", action="store_true", help="Enable log output") + return parser + + def get_lokalise_token(): """Get lokalise token.""" token = os.environ.get("LOKALISE_TOKEN") From 302e631984302d3a8a73ddc998447d724542b882 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sat, 11 Apr 2020 00:57:39 +0300 Subject: [PATCH 295/653] =?UTF-8?q?Ability=20to=20mock=20long=20poll=20req?= =?UTF-8?q?uests=20+=20refactor=20qwikswitch=20unit=E2=80=A6=20(#33804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added the ability to mock a "long poll" get request by setting up the waiting request and feeding responses to it with this, refactored the qwikswitch test so it doesn't use global variables and is more understandable and maintainable * added import asyncio from merge * added assert that first call with long_poll has empty content * passing json instead of the binary string * use json instead of text in mock requests * refactored to use a proxy * return the proxy also for the http methods other than get * refactored so any side_effect can be used and created the long_poll side effect * simplified by using kwargs needed to move the json->text->content logic from mocker to mockrequest * no need to explicitly define method and url --- tests/components/qwikswitch/test_init.py | 119 +++++++++++------------ tests/test_util/aiohttp.py | 74 +++++++++++--- 2 files changed, 118 insertions(+), 75 deletions(-) diff --git a/tests/components/qwikswitch/test_init.py b/tests/components/qwikswitch/test_init.py index d9c2a8d0ba63..93e8e3fe8df7 100644 --- a/tests/components/qwikswitch/test_init.py +++ b/tests/components/qwikswitch/test_init.py @@ -1,92 +1,81 @@ """Test qwikswitch sensors.""" +import asyncio import logging -from aiohttp.client_exceptions import ClientError -import pytest - -from homeassistant.bootstrap import async_setup_component from homeassistant.components.qwikswitch import DOMAIN as QWIKSWITCH from homeassistant.const import EVENT_HOMEASSISTANT_START +from homeassistant.setup import async_setup_component -from tests.test_util.aiohttp import mock_aiohttp_client +from tests.test_util.aiohttp import MockLongPollSideEffect _LOGGER = logging.getLogger(__name__) -class AiohttpClientMockResponseList(list): - """Return multiple values for aiohttp Mocker. - - aoihttp mocker uses decode to fetch the next value. - """ - - def decode(self, _): - """Return next item from list.""" - try: - res = list.pop(self, 0) - _LOGGER.debug("MockResponseList popped %s: %s", res, self) - if isinstance(res, Exception): - raise res - return res - except IndexError: - raise AssertionError("MockResponseList empty") - - async def wait_till_empty(self, hass): - """Wait until empty.""" - while self: - await hass.async_block_till_done() - await hass.async_block_till_done() +DEVICES = [ + { + "id": "@000001", + "name": "Switch 1", + "type": "rel", + "val": "OFF", + "time": "1522777506", + "rssi": "51%", + }, + { + "id": "@000002", + "name": "Light 2", + "type": "rel", + "val": "ON", + "time": "1522777507", + "rssi": "45%", + }, + { + "id": "@000003", + "name": "Dim 3", + "type": "dim", + "val": "280c00", + "time": "1522777544", + "rssi": "62%", + }, +] -LISTEN = AiohttpClientMockResponseList() - - -@pytest.fixture -def aioclient_mock(): - """HTTP client listen and devices.""" - devices = """[ - {"id":"@000001","name":"Switch 1","type":"rel","val":"OFF", - "time":"1522777506","rssi":"51%"}, - {"id":"@000002","name":"Light 2","type":"rel","val":"ON", - "time":"1522777507","rssi":"45%"}, - {"id":"@000003","name":"Dim 3","type":"dim","val":"280c00", - "time":"1522777544","rssi":"62%"}]""" - - with mock_aiohttp_client() as mock_session: - mock_session.get("http://127.0.0.1:2020/&listen", content=LISTEN) - mock_session.get("http://127.0.0.1:2020/&device", text=devices) - yield mock_session - - -async def test_binary_sensor_device(hass, aioclient_mock): # noqa: F811 +async def test_binary_sensor_device(hass, aioclient_mock): """Test a binary sensor device.""" config = { "qwikswitch": { "sensors": {"name": "s1", "id": "@a00001", "channel": 1, "type": "imod"} } } + aioclient_mock.get("http://127.0.0.1:2020/&device", json=DEVICES) + listen_mock = MockLongPollSideEffect() + aioclient_mock.get("http://127.0.0.1:2020/&listen", side_effect=listen_mock) await async_setup_component(hass, QWIKSWITCH, config) + hass.bus.async_fire(EVENT_HOMEASSISTANT_START) await hass.async_block_till_done() state_obj = hass.states.get("binary_sensor.s1") assert state_obj.state == "off" - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - - LISTEN.append('{"id":"@a00001","cmd":"","data":"4e0e1601","rssi":"61%"}') - LISTEN.append(ClientError()) # Will cause a sleep - + listen_mock.queue_response( + json={"id": "@a00001", "cmd": "", "data": "4e0e1601", "rssi": "61%"} + ) + await asyncio.sleep(0.01) await hass.async_block_till_done() state_obj = hass.states.get("binary_sensor.s1") assert state_obj.state == "on" - LISTEN.append('{"id":"@a00001","cmd":"","data":"4e0e1701","rssi":"61%"}') - hass.data[QWIKSWITCH]._sleep_task.cancel() - await LISTEN.wait_till_empty(hass) + listen_mock.queue_response( + json={"id": "@a00001", "cmd": "", "data": "4e0e1701", "rssi": "61%"}, + ) + await asyncio.sleep(0.01) + await hass.async_block_till_done() state_obj = hass.states.get("binary_sensor.s1") assert state_obj.state == "off" + listen_mock.stop() -async def test_sensor_device(hass, aioclient_mock): # noqa: F811 + +async def test_sensor_device(hass, aioclient_mock): """Test a sensor device.""" config = { "qwikswitch": { @@ -98,18 +87,22 @@ async def test_sensor_device(hass, aioclient_mock): # noqa: F811 } } } + aioclient_mock.get("http://127.0.0.1:2020/&device", json=DEVICES) + listen_mock = MockLongPollSideEffect() + aioclient_mock.get("http://127.0.0.1:2020/&listen", side_effect=listen_mock) await async_setup_component(hass, QWIKSWITCH, config) - + hass.bus.async_fire(EVENT_HOMEASSISTANT_START) await hass.async_block_till_done() + state_obj = hass.states.get("sensor.ss1") assert state_obj.state == "None" - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - - LISTEN.append( - '{"id":"@a00001","name":"ss1","type":"rel",' '"val":"4733800001a00000"}' + listen_mock.queue_response( + json={"id": "@a00001", "name": "ss1", "type": "rel", "val": "4733800001a00000"}, ) - + await asyncio.sleep(0.01) await hass.async_block_till_done() state_obj = hass.states.get("sensor.ss1") assert state_obj.state == "416" + + listen_mock.stop() diff --git a/tests/test_util/aiohttp.py b/tests/test_util/aiohttp.py index e23ba5cb9f50..55bfd79143d5 100644 --- a/tests/test_util/aiohttp.py +++ b/tests/test_util/aiohttp.py @@ -1,4 +1,5 @@ """Aiohttp test utils.""" +import asyncio from contextlib import contextmanager import json as _json import re @@ -6,7 +7,7 @@ from unittest import mock from urllib.parse import parse_qs from aiohttp import ClientSession -from aiohttp.client_exceptions import ClientResponseError +from aiohttp.client_exceptions import ClientError, ClientResponseError from aiohttp.streams import StreamReader from yarl import URL @@ -48,15 +49,9 @@ class AiohttpClientMocker: headers={}, exc=None, cookies=None, + side_effect=None, ): """Mock a request.""" - if json is not None: - text = _json.dumps(json) - if text is not None: - content = text.encode("utf-8") - if content is None: - content = b"" - if not isinstance(url, RETYPE): url = URL(url) if params: @@ -64,7 +59,16 @@ class AiohttpClientMocker: self._mocks.append( AiohttpClientMockResponse( - method, url, status, content, cookies, exc, headers + method=method, + url=url, + status=status, + response=content, + json=json, + text=text, + cookies=cookies, + exc=exc, + headers=headers, + side_effect=side_effect, ) ) @@ -134,7 +138,8 @@ class AiohttpClientMocker: for response in self._mocks: if response.match_request(method, url, params): self.mock_calls.append((method, url, data, headers)) - + if response.side_effect: + response = await response.side_effect(method, url, data) if response.exc: raise response.exc return response @@ -148,15 +153,32 @@ class AiohttpClientMockResponse: """Mock Aiohttp client response.""" def __init__( - self, method, url, status, response, cookies=None, exc=None, headers=None + self, + method, + url, + status=200, + response=None, + json=None, + text=None, + cookies=None, + exc=None, + headers=None, + side_effect=None, ): """Initialize a fake response.""" + if json is not None: + text = _json.dumps(json) + if text is not None: + response = text.encode("utf-8") + if response is None: + response = b"" + self.method = method self._url = url self.status = status self.response = response self.exc = exc - + self.side_effect = side_effect self._headers = headers or {} self._cookies = {} @@ -270,3 +292,31 @@ def mock_aiohttp_client(): side_effect=create_session, ): yield mocker + + +class MockLongPollSideEffect: + """Imitate a long_poll request. Once created, actual responses are queued and if queue is empty, will await until done.""" + + def __init__(self): + """Initialize the queue.""" + self.semaphore = asyncio.Semaphore(0) + self.response_list = [] + self.stopping = False + + async def __call__(self, method, url, data): + """Fetch the next response from the queue or wait until the queue has items.""" + if self.stopping: + raise ClientError() + await self.semaphore.acquire() + kwargs = self.response_list.pop(0) + return AiohttpClientMockResponse(method=method, url=url, **kwargs) + + def queue_response(self, **kwargs): + """Add a response to the long_poll queue.""" + self.response_list.append(kwargs) + self.semaphore.release() + + def stop(self): + """Stop the current request and future ones. Avoids exception if there is someone waiting when exiting test.""" + self.stopping = True + self.queue_response(exc=ClientError()) From de3f5e8d6934fa049e0941c5f2894befe666b125 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Fri, 10 Apr 2020 17:23:07 -0500 Subject: [PATCH 296/653] Use zeroconf UUID if not available via IPP properties (#33991) --- homeassistant/components/ipp/config_flow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index fe0808414ad8..b7239c8bf493 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -116,7 +116,8 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): _LOGGER.exception("IPP Parse Error") return self.async_abort(reason="parse_error") - self.discovery_info[CONF_UUID] = info[CONF_UUID] + if info[CONF_UUID] is not None: + self.discovery_info[CONF_UUID] = info[CONF_UUID] await self.async_set_unique_id(self.discovery_info[CONF_UUID]) self._abort_if_unique_id_configured( From dfc66b20186e085a42518b00497071c1294b9eb4 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Sat, 11 Apr 2020 00:24:03 +0200 Subject: [PATCH 297/653] Rewrite parts of upnp component (#33108) * Rewrite parts of upnp component * Linting * Add SCAN_INTERVAL * Get values simultaneously * Move to time related constants, as per #32065 * Linting * Move constant KIBIBYTE to homeassistant.const * Simplify code * Fix tests for #33344 * Changes after review * Update homeassistant/components/upnp/sensor.py * Changes after review * Formatting * Formatting * Use ST from discovery info to avoid swapping device_types if device advertises multiple versions * Linting * Requirements for upnp + dlna_dmr components * Linting * Regen requirements * Changes after review by @MartinHjelmare * Changes after review by @MartinHjelmare * Formatting * Linting * Changes after review by @MartinHjelmare * Changes after review by @MartinHjelmare Co-authored-by: Paulus Schoutsen --- .../components/dlna_dmr/manifest.json | 2 +- homeassistant/components/upnp/__init__.py | 51 +-- homeassistant/components/upnp/const.py | 13 +- homeassistant/components/upnp/device.py | 95 +++-- homeassistant/components/upnp/manifest.json | 13 +- homeassistant/components/upnp/sensor.py | 374 ++++++++---------- homeassistant/generated/ssdp.py | 8 + requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/upnp/test_init.py | 63 +-- 10 files changed, 334 insertions(+), 289 deletions(-) diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 621821fd2116..ac7a4b22e588 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -2,6 +2,6 @@ "domain": "dlna_dmr", "name": "DLNA Digital Media Renderer", "documentation": "https://www.home-assistant.io/integrations/dlna_dmr", - "requirements": ["async-upnp-client==0.14.12"], + "requirements": ["async-upnp-client==0.14.13"], "codeowners": [] } diff --git a/homeassistant/components/upnp/__init__.py b/homeassistant/components/upnp/__init__.py index ce97c7944c6b..4d599be88b1c 100644 --- a/homeassistant/components/upnp/__init__.py +++ b/homeassistant/components/upnp/__init__.py @@ -1,17 +1,15 @@ """Open ports in your router for Home Assistant and provide statistics.""" from ipaddress import ip_address from operator import itemgetter +from typing import Mapping import voluptuous as vol from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry from homeassistant.const import EVENT_HOMEASSISTANT_STOP -from homeassistant.helpers import ( - config_validation as cv, - device_registry as dr, - dispatcher, -) +from homeassistant.exceptions import ConfigEntryNotReady +from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers.typing import ConfigType, HomeAssistantType from homeassistant.util import get_local_ip @@ -23,7 +21,6 @@ from .const import ( CONF_PORTS, DOMAIN, LOGGER as _LOGGER, - SIGNAL_REMOVE_SENSOR, ) from .device import Device @@ -37,7 +34,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_ENABLE_PORT_MAPPING, default=False): cv.boolean, vol.Optional(CONF_ENABLE_SENSORS, default=True): cv.boolean, vol.Optional(CONF_LOCAL_IP): vol.All(ip_address, cv.string), - vol.Optional(CONF_PORTS): vol.Schema( + vol.Optional(CONF_PORTS, default={}): vol.Schema( {vol.Any(CONF_HASS, cv.port): vol.Any(CONF_HASS, cv.port)} ), } @@ -47,7 +44,7 @@ CONFIG_SCHEMA = vol.Schema( ) -def _substitute_hass_ports(ports, hass_port=None): +def _substitute_hass_ports(ports: Mapping, hass_port: int = None) -> Mapping: """ Substitute 'hass' for the hass_port. @@ -86,8 +83,11 @@ def _substitute_hass_ports(ports, hass_port=None): return ports -async def async_discover_and_construct(hass, udn=None) -> Device: +async def async_discover_and_construct( + hass: HomeAssistantType, udn: str = None, st: str = None +) -> Device: """Discovery devices and construct a Device for one.""" + # pylint: disable=invalid-name discovery_infos = await Device.async_discover(hass) if not discovery_infos: _LOGGER.info("No UPnP/IGD devices discovered") @@ -95,7 +95,11 @@ async def async_discover_and_construct(hass, udn=None) -> Device: if udn: # get the discovery info with specified UDN + _LOGGER.debug("Discovery_infos: %s", discovery_infos) filtered = [di for di in discovery_infos if di["udn"] == udn] + if st: + _LOGGER.debug("Filtering on ST: %s", st) + filtered = [di for di in discovery_infos if di["st"] == st] if not filtered: _LOGGER.warning( 'Wanted UPnP/IGD device with UDN "%s" not found, ' "aborting", udn @@ -125,8 +129,8 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType): hass.data[DOMAIN] = { "config": conf, "devices": {}, - "local_ip": config.get(CONF_LOCAL_IP, local_ip), - "ports": conf.get("ports", {}), + "local_ip": conf.get(CONF_LOCAL_IP, local_ip), + "ports": conf.get(CONF_PORTS), } if conf is not None: @@ -139,21 +143,24 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType): return True -async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry): +async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry) -> bool: """Set up UPnP/IGD device from a config entry.""" domain_data = hass.data[DOMAIN] conf = domain_data["config"] # discover and construct - device = await async_discover_and_construct(hass, config_entry.data.get("udn")) + udn = config_entry.data.get("udn") + st = config_entry.data.get("st") # pylint: disable=invalid-name + device = await async_discover_and_construct(hass, udn, st) if not device: _LOGGER.info("Unable to create UPnP/IGD, aborting") - return False + raise ConfigEntryNotReady - # 'register'/save UDN + # 'register'/save UDN + ST hass.data[DOMAIN]["devices"][device.udn] = device hass.config_entries.async_update_entry( - entry=config_entry, data={**config_entry.data, "udn": device.udn} + entry=config_entry, + data={**config_entry.data, "udn": device.udn, "st": device.device_type}, ) # create device registry entry @@ -179,8 +186,8 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry): # set up port mapping if conf.get(CONF_ENABLE_PORT_MAPPING): _LOGGER.debug("Enabling port mapping") - local_ip = domain_data["local_ip"] - ports = conf.get("ports", {}) + local_ip = domain_data[CONF_LOCAL_IP] + ports = conf.get(CONF_PORTS, {}) hass_port = None if hasattr(hass, "http"): @@ -200,7 +207,9 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry): return True -async def async_unload_entry(hass: HomeAssistantType, config_entry: ConfigEntry): +async def async_unload_entry( + hass: HomeAssistantType, config_entry: ConfigEntry +) -> bool: """Unload a UPnP/IGD device from a config entry.""" udn = config_entry.data["udn"] device = hass.data[DOMAIN]["devices"][udn] @@ -211,6 +220,4 @@ async def async_unload_entry(hass: HomeAssistantType, config_entry: ConfigEntry) # remove sensors _LOGGER.debug("Deleting sensors") - dispatcher.async_dispatcher_send(hass, SIGNAL_REMOVE_SENSOR, device) - - return True + return await hass.config_entries.async_forward_entry_unload(config_entry, "sensor") diff --git a/homeassistant/components/upnp/const.py b/homeassistant/components/upnp/const.py index 1b7540ee4994..80b5b718bbb6 100644 --- a/homeassistant/components/upnp/const.py +++ b/homeassistant/components/upnp/const.py @@ -1,6 +1,9 @@ """Constants for the IGD component.""" +from datetime import timedelta import logging +from homeassistant.const import TIME_SECONDS + CONF_ENABLE_PORT_MAPPING = "port_mapping" CONF_ENABLE_SENSORS = "sensors" CONF_HASS = "hass" @@ -8,4 +11,12 @@ CONF_LOCAL_IP = "local_ip" CONF_PORTS = "ports" DOMAIN = "upnp" LOGGER = logging.getLogger(__package__) -SIGNAL_REMOVE_SENSOR = "upnp_remove_sensor" +BYTES_RECEIVED = "bytes_received" +BYTES_SENT = "bytes_sent" +PACKETS_RECEIVED = "packets_received" +PACKETS_SENT = "packets_sent" +TIMESTAMP = "timestamp" +DATA_PACKETS = "packets" +DATA_RATE_PACKETS_PER_SECOND = f"{DATA_PACKETS}/{TIME_SECONDS}" +KIBIBYTE = 1024 +UPDATE_INTERVAL = timedelta(seconds=30) diff --git a/homeassistant/components/upnp/device.py b/homeassistant/components/upnp/device.py index 474170050c38..73ae06d99450 100644 --- a/homeassistant/components/upnp/device.py +++ b/homeassistant/components/upnp/device.py @@ -1,6 +1,7 @@ """Home Assistant representation of an UPnP/IGD.""" import asyncio from ipaddress import IPv4Address +from typing import Mapping import aiohttp from async_upnp_client import UpnpError, UpnpFactory @@ -9,8 +10,18 @@ from async_upnp_client.profiles.igd import IgdDevice from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.typing import HomeAssistantType +import homeassistant.util.dt as dt_util -from .const import CONF_LOCAL_IP, DOMAIN, LOGGER as _LOGGER +from .const import ( + BYTES_RECEIVED, + BYTES_SENT, + CONF_LOCAL_IP, + DOMAIN, + LOGGER as _LOGGER, + PACKETS_RECEIVED, + PACKETS_SENT, + TIMESTAMP, +) class Device: @@ -18,7 +29,7 @@ class Device: def __init__(self, igd_device): """Initialize UPnP/IGD device.""" - self._igd_device = igd_device + self._igd_device: IgdDevice = igd_device self._mapped_ports = [] @classmethod @@ -61,26 +72,37 @@ class Device: return cls(igd_device) @property - def udn(self): + def udn(self) -> str: """Get the UDN.""" return self._igd_device.udn @property - def name(self): + def name(self) -> str: """Get the name.""" return self._igd_device.name @property - def manufacturer(self): + def manufacturer(self) -> str: """Get the manufacturer.""" return self._igd_device.manufacturer @property - def model_name(self): + def model_name(self) -> str: """Get the model name.""" return self._igd_device.model_name - async def async_add_port_mappings(self, ports, local_ip): + @property + def device_type(self) -> str: + """Get the device type.""" + return self._igd_device.device_type + + def __str__(self) -> str: + """Get string representation.""" + return f"IGD Device: {self.name}/{self.udn}" + + async def async_add_port_mappings( + self, ports: Mapping[int, int], local_ip: str + ) -> None: """Add port mappings.""" if local_ip == "127.0.0.1": _LOGGER.error("Could not create port mapping, our IP is 127.0.0.1") @@ -93,7 +115,9 @@ class Device: await self._async_add_port_mapping(external_port, local_ip, internal_port) self._mapped_ports.append(external_port) - async def _async_add_port_mapping(self, external_port, local_ip, internal_port): + async def _async_add_port_mapping( + self, external_port: int, local_ip: str, internal_port: int + ) -> None: """Add a port mapping.""" # create port mapping _LOGGER.info( @@ -123,12 +147,12 @@ class Device: internal_port, ) - async def async_delete_port_mappings(self): - """Remove a port mapping.""" + async def async_delete_port_mappings(self) -> None: + """Remove port mappings.""" for port in self._mapped_ports: await self._async_delete_port_mapping(port) - async def _async_delete_port_mapping(self, external_port): + async def _async_delete_port_mapping(self, external_port: int) -> None: """Remove a port mapping.""" _LOGGER.info("Deleting port mapping %s (TCP)", external_port) try: @@ -140,30 +164,31 @@ class Device: except (asyncio.TimeoutError, aiohttp.ClientError, UpnpError): _LOGGER.error("Could not delete port mapping") - async def async_get_total_bytes_received(self): - """Get total bytes received.""" - try: - return await self._igd_device.async_get_total_bytes_received() - except asyncio.TimeoutError: - _LOGGER.warning("Timeout during get_total_bytes_received") + async def async_get_traffic_data(self) -> Mapping[str, any]: + """ + Get all traffic data in one go. - async def async_get_total_bytes_sent(self): - """Get total bytes sent.""" - try: - return await self._igd_device.async_get_total_bytes_sent() - except asyncio.TimeoutError: - _LOGGER.warning("Timeout during get_total_bytes_sent") + Traffic data consists of: + - total bytes sent + - total bytes received + - total packets sent + - total packats received - async def async_get_total_packets_received(self): - """Get total packets received.""" - try: - return await self._igd_device.async_get_total_packets_received() - except asyncio.TimeoutError: - _LOGGER.warning("Timeout during get_total_packets_received") + Data is timestamped. + """ + _LOGGER.debug("Getting traffic statistics from device: %s", self) - async def async_get_total_packets_sent(self): - """Get total packets sent.""" - try: - return await self._igd_device.async_get_total_packets_sent() - except asyncio.TimeoutError: - _LOGGER.warning("Timeout during get_total_packets_sent") + values = await asyncio.gather( + self._igd_device.async_get_total_bytes_received(), + self._igd_device.async_get_total_bytes_sent(), + self._igd_device.async_get_total_packets_received(), + self._igd_device.async_get_total_packets_sent(), + ) + + return { + TIMESTAMP: dt_util.utcnow(), + BYTES_RECEIVED: values[0], + BYTES_SENT: values[1], + PACKETS_RECEIVED: values[2], + PACKETS_SENT: values[3], + } diff --git a/homeassistant/components/upnp/manifest.json b/homeassistant/components/upnp/manifest.json index 2ca4bc129e8d..e3b30cec9a48 100644 --- a/homeassistant/components/upnp/manifest.json +++ b/homeassistant/components/upnp/manifest.json @@ -3,6 +3,15 @@ "name": "UPnP", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/upnp", - "requirements": ["async-upnp-client==0.14.12"], - "codeowners": ["@StevenLooman"] + "requirements": ["async-upnp-client==0.14.13"], + "dependencies": [], + "codeowners": ["@StevenLooman"], + "ssdp": [ + { + "st": "urn:schemas-upnp-org:device:InternetGatewayDevice:1" + }, + { + "st": "urn:schemas-upnp-org:device:InternetGatewayDevice:2" + } + ] } diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index 88d6681a8049..5c356b53c8a7 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -1,275 +1,247 @@ """Support for UPnP/IGD Sensors.""" from datetime import timedelta -import logging +from typing import Mapping -from homeassistant.const import DATA_BYTES, DATA_KIBIBYTES, TIME_SECONDS -from homeassistant.core import callback +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import DATA_BYTES, DATA_RATE_KIBIBYTES_PER_SECOND from homeassistant.helpers import device_registry as dr -from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity from homeassistant.helpers.typing import HomeAssistantType -from homeassistant.util import Throttle -import homeassistant.util.dt as dt_util +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator -from .const import DOMAIN as DOMAIN_UPNP, SIGNAL_REMOVE_SENSOR - -_LOGGER = logging.getLogger(__name__) - -BYTES_RECEIVED = "bytes_received" -BYTES_SENT = "bytes_sent" -PACKETS_RECEIVED = "packets_received" -PACKETS_SENT = "packets_sent" +from .const import ( + BYTES_RECEIVED, + BYTES_SENT, + DATA_PACKETS, + DATA_RATE_PACKETS_PER_SECOND, + DOMAIN, + KIBIBYTE, + LOGGER as _LOGGER, + PACKETS_RECEIVED, + PACKETS_SENT, + TIMESTAMP, + UPDATE_INTERVAL, +) +from .device import Device SENSOR_TYPES = { - BYTES_RECEIVED: {"name": "bytes received", "unit": DATA_BYTES}, - BYTES_SENT: {"name": "bytes sent", "unit": DATA_BYTES}, - PACKETS_RECEIVED: {"name": "packets received", "unit": "packets"}, - PACKETS_SENT: {"name": "packets sent", "unit": "packets"}, + BYTES_RECEIVED: { + "device_value_key": BYTES_RECEIVED, + "name": f"{DATA_BYTES} received", + "unit": DATA_BYTES, + "unique_id": BYTES_RECEIVED, + "derived_name": f"{DATA_RATE_KIBIBYTES_PER_SECOND} received", + "derived_unit": DATA_RATE_KIBIBYTES_PER_SECOND, + "derived_unique_id": "KiB/sec_received", + }, + BYTES_SENT: { + "device_value_key": BYTES_SENT, + "name": f"{DATA_BYTES} sent", + "unit": DATA_BYTES, + "unique_id": BYTES_SENT, + "derived_name": f"{DATA_RATE_KIBIBYTES_PER_SECOND} sent", + "derived_unit": DATA_RATE_KIBIBYTES_PER_SECOND, + "derived_unique_id": "KiB/sec_sent", + }, + PACKETS_RECEIVED: { + "device_value_key": PACKETS_RECEIVED, + "name": f"{DATA_PACKETS} received", + "unit": DATA_PACKETS, + "unique_id": PACKETS_RECEIVED, + "derived_name": f"{DATA_RATE_PACKETS_PER_SECOND} received", + "derived_unit": DATA_RATE_PACKETS_PER_SECOND, + "derived_unique_id": "packets/sec_received", + }, + PACKETS_SENT: { + "device_value_key": PACKETS_SENT, + "name": f"{DATA_PACKETS} sent", + "unit": DATA_PACKETS, + "unique_id": PACKETS_SENT, + "derived_name": f"{DATA_RATE_PACKETS_PER_SECOND} sent", + "derived_unit": DATA_RATE_PACKETS_PER_SECOND, + "derived_unique_id": "packets/sec_sent", + }, } -IN = "received" -OUT = "sent" -KIBIBYTE = 1024 - -MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=30) - async def async_setup_platform( hass: HomeAssistantType, config, async_add_entities, discovery_info=None -): +) -> None: """Old way of setting up UPnP/IGD sensors.""" _LOGGER.debug( "async_setup_platform: config: %s, discovery: %s", config, discovery_info ) -async def async_setup_entry(hass, config_entry, async_add_entities): - """Set up the UPnP/IGD sensor.""" - - @callback - def async_add_sensor(device): - """Add sensors from UPnP/IGD device.""" - # raw sensors + per-second sensors - sensors = [ - RawUPnPIGDSensor(device, name, sensor_type) - for name, sensor_type in SENSOR_TYPES.items() - ] - sensors += [ - KBytePerSecondUPnPIGDSensor(device, IN), - KBytePerSecondUPnPIGDSensor(device, OUT), - PacketsPerSecondUPnPIGDSensor(device, IN), - PacketsPerSecondUPnPIGDSensor(device, OUT), - ] - async_add_entities(sensors, True) - +async def async_setup_entry( + hass, config_entry: ConfigEntry, async_add_entities +) -> None: + """Set up the UPnP/IGD sensors.""" data = config_entry.data if "udn" in data: udn = data["udn"] else: # any device will do - udn = list(hass.data[DOMAIN_UPNP]["devices"].keys())[0] + udn = list(hass.data[DOMAIN]["devices"].keys())[0] - device = hass.data[DOMAIN_UPNP]["devices"][udn] - async_add_sensor(device) + device: Device = hass.data[DOMAIN]["devices"][udn] + + _LOGGER.debug("Adding sensors") + coordinator = DataUpdateCoordinator( + hass, + _LOGGER, + name=device.name, + update_method=device.async_get_traffic_data, + update_interval=timedelta(seconds=UPDATE_INTERVAL.seconds), + ) + await coordinator.async_refresh() + + sensors = [ + RawUpnpSensor(coordinator, device, SENSOR_TYPES[BYTES_RECEIVED]), + RawUpnpSensor(coordinator, device, SENSOR_TYPES[BYTES_SENT]), + RawUpnpSensor(coordinator, device, SENSOR_TYPES[PACKETS_RECEIVED]), + RawUpnpSensor(coordinator, device, SENSOR_TYPES[PACKETS_SENT]), + DerivedUpnpSensor(coordinator, device, SENSOR_TYPES[BYTES_RECEIVED]), + DerivedUpnpSensor(coordinator, device, SENSOR_TYPES[BYTES_SENT]), + DerivedUpnpSensor(coordinator, device, SENSOR_TYPES[PACKETS_RECEIVED]), + DerivedUpnpSensor(coordinator, device, SENSOR_TYPES[PACKETS_SENT]), + ] + async_add_entities(sensors, True) class UpnpSensor(Entity): """Base class for UPnP/IGD sensors.""" - def __init__(self, device): + def __init__( + self, + coordinator: DataUpdateCoordinator, + device: Device, + sensor_type: Mapping[str, str], + ) -> None: """Initialize the base sensor.""" + self._coordinator = coordinator self._device = device - - async def async_added_to_hass(self): - """Subscribe to sensors events.""" - self.async_on_remove( - async_dispatcher_connect( - self.hass, SIGNAL_REMOVE_SENSOR, self._upnp_remove_sensor - ) - ) - - @callback - def _upnp_remove_sensor(self, device): - """Remove sensor.""" - if self._device != device: - # not for us - return - - self.hass.async_create_task(self.async_remove()) + self._sensor_type = sensor_type @property - def device_info(self): + def should_poll(self) -> bool: + """Inform we should not be polled.""" + return False + + @property + def icon(self) -> str: + """Icon to use in the frontend, if any.""" + return "mdi:server-network" + + @property + def available(self) -> bool: + """Return if entity is available.""" + device_value_key = self._sensor_type["device_value_key"] + return ( + self._coordinator.last_update_success + and device_value_key in self._coordinator.data + ) + + @property + def name(self) -> str: + """Return the name of the sensor.""" + return f"{self._device.name} {self._sensor_type['name']}" + + @property + def unique_id(self) -> str: + """Return an unique ID.""" + return f"{self._device.udn}_{self._sensor_type['unique_id']}" + + @property + def unit_of_measurement(self) -> str: + """Return the unit of measurement of this entity, if any.""" + return self._sensor_type["unit"] + + @property + def device_info(self) -> Mapping[str, any]: """Get device info.""" return { "connections": {(dr.CONNECTION_UPNP, self._device.udn)}, - "identifiers": {(DOMAIN_UPNP, self._device.udn)}, "name": self._device.name, "manufacturer": self._device.manufacturer, "model": self._device.model_name, } + async def async_update(self): + """Request an update.""" + await self._coordinator.async_request_refresh() -class RawUPnPIGDSensor(UpnpSensor): + async def async_added_to_hass(self) -> None: + """Subscribe to sensors events.""" + remove_from_coordinator = self._coordinator.async_add_listener( + self.async_write_ha_state + ) + self.async_on_remove(remove_from_coordinator) + + +class RawUpnpSensor(UpnpSensor): """Representation of a UPnP/IGD sensor.""" - def __init__(self, device, sensor_type_name, sensor_type): - """Initialize the UPnP/IGD sensor.""" - super().__init__(device) - self._type_name = sensor_type_name - self._type = sensor_type - self._name = "{} {}".format(device.name, sensor_type["name"]) - self._state = None - - @property - def name(self) -> str: - """Return the name of the sensor.""" - return self._name - - @property - def unique_id(self) -> str: - """Return an unique ID.""" - return f"{self._device.udn}_{self._type_name}" - @property def state(self) -> str: """Return the state of the device.""" - if self._state is None: - return None - - return format(self._state, "d") - - @property - def icon(self) -> str: - """Icon to use in the frontend, if any.""" - return "mdi:server-network" - - @property - def unit_of_measurement(self) -> str: - """Return the unit of measurement of this entity, if any.""" - return self._type["unit"] - - @Throttle(MIN_TIME_BETWEEN_UPDATES) - async def async_update(self): - """Get the latest information from the IGD.""" - if self._type_name == BYTES_RECEIVED: - self._state = await self._device.async_get_total_bytes_received() - elif self._type_name == BYTES_SENT: - self._state = await self._device.async_get_total_bytes_sent() - elif self._type_name == PACKETS_RECEIVED: - self._state = await self._device.async_get_total_packets_received() - elif self._type_name == PACKETS_SENT: - self._state = await self._device.async_get_total_packets_sent() + device_value_key = self._sensor_type["device_value_key"] + value = self._coordinator.data[device_value_key] + return format(value, "d") -class PerSecondUPnPIGDSensor(UpnpSensor): - """Abstract representation of a X Sent/Received per second sensor.""" +class DerivedUpnpSensor(UpnpSensor): + """Representation of a UNIT Sent/Received per second sensor.""" - def __init__(self, device, direction): + def __init__(self, coordinator, device, sensor_type) -> None: """Initialize sensor.""" - super().__init__(device) - self._direction = direction - - self._state = None + super().__init__(coordinator, device, sensor_type) self._last_value = None - self._last_update_time = None - - @property - def unit(self) -> str: - """Get unit we are measuring in.""" - raise NotImplementedError() - - async def _async_fetch_value(self): - """Fetch a value from the IGD.""" - raise NotImplementedError() - - @property - def unique_id(self) -> str: - """Return an unique ID.""" - return f"{self._device.udn}_{self.unit}/sec_{self._direction}" + self._last_timestamp = None @property def name(self) -> str: """Return the name of the sensor.""" - return f"{self._device.name} {self.unit}/sec {self._direction}" + return f"{self._device.name} {self._sensor_type['derived_name']}" @property - def icon(self) -> str: - """Icon to use in the frontend, if any.""" - return "mdi:server-network" + def unique_id(self) -> str: + """Return an unique ID.""" + return f"{self._device.udn}_{self._sensor_type['derived_unique_id']}" @property def unit_of_measurement(self) -> str: """Return the unit of measurement of this entity, if any.""" - return f"{self.unit}/{TIME_SECONDS}" + return self._sensor_type["derived_unit"] - def _is_overflowed(self, new_value) -> bool: + def _has_overflowed(self, current_value) -> bool: """Check if value has overflowed.""" - return new_value < self._last_value - - async def async_update(self): - """Get the latest information from the UPnP/IGD.""" - new_value = await self._async_fetch_value() - - if self._last_value is None: - self._last_value = new_value - self._last_update_time = dt_util.utcnow() - return - - now = dt_util.utcnow() - if self._is_overflowed(new_value): - self._state = None # temporarily report nothing - else: - delta_time = (now - self._last_update_time).seconds - delta_value = new_value - self._last_value - self._state = delta_value / delta_time - - self._last_value = new_value - self._last_update_time = now - - -class KBytePerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor): - """Representation of a KBytes Sent/Received per second sensor.""" - - @property - def unit(self) -> str: - """Get unit we are measuring in.""" - return DATA_KIBIBYTES - - async def _async_fetch_value(self) -> float: - """Fetch value from device.""" - if self._direction == IN: - return await self._device.async_get_total_bytes_received() - - return await self._device.async_get_total_bytes_sent() + return current_value < self._last_value @property def state(self) -> str: """Return the state of the device.""" - if self._state is None: + # Can't calculate any derivative if we have only one value. + device_value_key = self._sensor_type["device_value_key"] + current_value = self._coordinator.data[device_value_key] + current_timestamp = self._coordinator.data[TIMESTAMP] + if self._last_value is None or self._has_overflowed(current_value): + self._last_value = current_value + self._last_timestamp = current_timestamp return None - return format(float(self._state / KIBIBYTE), ".1f") - - -class PacketsPerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor): - """Representation of a Packets Sent/Received per second sensor.""" - - @property - def unit(self) -> str: - """Get unit we are measuring in.""" - return "packets" - - async def _async_fetch_value(self) -> float: - """Fetch value from device.""" - if self._direction == IN: - return await self._device.async_get_total_packets_received() - - return await self._device.async_get_total_packets_sent() - - @property - def state(self) -> str: - """Return the state of the device.""" - if self._state is None: + # Calculate derivative. + delta_value = current_value - self._last_value + if self._sensor_type["unit"] == DATA_BYTES: + delta_value /= KIBIBYTE + delta_time = current_timestamp - self._last_timestamp + if delta_time.seconds == 0: + # Prevent division by 0. return None + derived = delta_value / delta_time.seconds - return format(float(self._state), ".1f") + # Store current values for future use. + self._last_value = current_value + self._last_timestamp = current_timestamp + + return format(derived, ".1f") diff --git a/homeassistant/generated/ssdp.py b/homeassistant/generated/ssdp.py index 4aa8eabe9d93..c8ab737f66df 100644 --- a/homeassistant/generated/ssdp.py +++ b/homeassistant/generated/ssdp.py @@ -76,6 +76,14 @@ SSDP = { "manufacturer": "Synology" } ], + "upnp": [ + { + "st": "urn:schemas-upnp-org:device:InternetGatewayDevice:1" + }, + { + "st": "urn:schemas-upnp-org:device:InternetGatewayDevice:2" + } + ], "wemo": [ { "manufacturer": "Belkin International Inc." diff --git a/requirements_all.txt b/requirements_all.txt index c42eea70c7ce..d868a86306e4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -269,7 +269,7 @@ asterisk_mbox==0.5.0 # homeassistant.components.dlna_dmr # homeassistant.components.upnp -async-upnp-client==0.14.12 +async-upnp-client==0.14.13 # homeassistant.components.aten_pe atenpdu==0.3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b4d38b5d5125..3a9b42f5635e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -122,7 +122,7 @@ arcam-fmj==0.4.3 # homeassistant.components.dlna_dmr # homeassistant.components.upnp -async-upnp-client==0.14.12 +async-upnp-client==0.14.13 # homeassistant.components.stream av==6.1.2 diff --git a/tests/components/upnp/test_init.py b/tests/components/upnp/test_init.py index 4aa033ee07bc..a2df00aba2d7 100644 --- a/tests/components/upnp/test_init.py +++ b/tests/components/upnp/test_init.py @@ -1,14 +1,14 @@ """Test UPnP/IGD setup process.""" -from ipaddress import ip_address -from unittest.mock import MagicMock, patch +from ipaddress import IPv4Address +from unittest.mock import patch from homeassistant.components import upnp from homeassistant.components.upnp.device import Device from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.setup import async_setup_component -from tests.common import MockConfigEntry, MockDependency, mock_coro +from tests.common import MockConfigEntry, mock_coro class MockDevice(Device): @@ -16,11 +16,8 @@ class MockDevice(Device): def __init__(self, udn): """Initialize mock device.""" - device = MagicMock() - device.manufacturer = "mock-manuf" - device.name = "mock-name" - device.model_name = "mock-model-name" - super().__init__(device) + igd_device = object() + super().__init__(igd_device) self._udn = udn self.added_port_mappings = [] self.removed_port_mappings = [] @@ -31,16 +28,38 @@ class MockDevice(Device): return cls("UDN") @property - def udn(self): + def udn(self) -> str: """Get the UDN.""" return self._udn - async def _async_add_port_mapping(self, external_port, local_ip, internal_port): + @property + def manufacturer(self) -> str: + """Get manufacturer.""" + return "mock-manufacturer" + + @property + def name(self) -> str: + """Get name.""" + return "mock-name" + + @property + def model_name(self) -> str: + """Get the model name.""" + return "mock-model-name" + + @property + def device_type(self) -> str: + """Get the device type.""" + return "urn:schemas-upnp-org:device:InternetGatewayDevice:1" + + async def _async_add_port_mapping( + self, external_port: int, local_ip: str, internal_port: int + ) -> None: """Add a port mapping.""" entry = [external_port, local_ip, internal_port] self.added_port_mappings.append(entry) - async def _async_delete_port_mapping(self, external_port): + async def _async_delete_port_mapping(self, external_port: int) -> None: """Remove a port mapping.""" entry = external_port self.removed_port_mappings.append(entry) @@ -52,18 +71,11 @@ async def test_async_setup_entry_default(hass): entry = MockConfigEntry(domain=upnp.DOMAIN) config = { - "http": {}, - "discovery": {}, # no upnp } - with MockDependency("netdisco.discovery"), patch( - "homeassistant.components.upnp.get_local_ip", return_value="192.168.1.10" - ), patch.object(Device, "async_create_device") as create_device, patch.object( - Device, "async_create_device" - ) as create_device, patch.object( + with patch.object(Device, "async_create_device") as create_device, patch.object( Device, "async_discover", return_value=mock_coro([]) ) as async_discover: - await async_setup_component(hass, "http", config) await async_setup_component(hass, "upnp", config) await hass.async_block_till_done() @@ -97,12 +109,13 @@ async def test_async_setup_entry_port_mapping(hass): config = { "http": {}, - "discovery": {}, - "upnp": {"port_mapping": True, "ports": {"hass": "hass"}}, + "upnp": { + "local_ip": "192.168.1.10", + "port_mapping": True, + "ports": {"hass": "hass"}, + }, } - with MockDependency("netdisco.discovery"), patch( - "homeassistant.components.upnp.get_local_ip", return_value="192.168.1.10" - ), patch.object(Device, "async_create_device") as create_device, patch.object( + with patch.object(Device, "async_create_device") as create_device, patch.object( Device, "async_discover", return_value=mock_coro([]) ) as async_discover: await async_setup_component(hass, "http", config) @@ -124,7 +137,7 @@ async def test_async_setup_entry_port_mapping(hass): # ensure add-port-mapping-methods called assert mock_device.added_port_mappings == [ - [8123, ip_address("192.168.1.10"), 8123] + [8123, IPv4Address("192.168.1.10"), 8123] ] hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) From 5b5a2326952c21a3668d039fffb57228f9392f77 Mon Sep 17 00:00:00 2001 From: Richard Powell Date: Fri, 10 Apr 2020 15:37:43 -0700 Subject: [PATCH 298/653] Add new Econet attributes (#33795) * Add support to the Econet integration for new attributes: lower_temp, upper_temp, ambient_temp & is_enabled * Removing support for ambient temperature --- homeassistant/components/econet/water_heater.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/homeassistant/components/econet/water_heater.py b/homeassistant/components/econet/water_heater.py index 8fede954255c..59afe1351f55 100644 --- a/homeassistant/components/econet/water_heater.py +++ b/homeassistant/components/econet/water_heater.py @@ -40,6 +40,10 @@ ATTR_IN_USE = "in_use" ATTR_START_DATE = "start_date" ATTR_END_DATE = "end_date" +ATTR_LOWER_TEMP = "lower_temp" +ATTR_UPPER_TEMP = "upper_temp" +ATTR_IS_ENABLED = "is_enabled" + SUPPORT_FLAGS_HEATER = SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE ADD_VACATION_SCHEMA = vol.Schema( @@ -164,6 +168,13 @@ class EcoNetWaterHeater(WaterHeaterDevice): data[ATTR_TODAYS_ENERGY_USAGE] = todays_usage data[ATTR_IN_USE] = self.water_heater.in_use + if self.water_heater.lower_temp is not None: + data[ATTR_LOWER_TEMP] = round(self.water_heater.lower_temp, 2) + if self.water_heater.upper_temp is not None: + data[ATTR_UPPER_TEMP] = round(self.water_heater.upper_temp, 2) + if self.water_heater.is_enabled is not None: + data[ATTR_IS_ENABLED] = self.water_heater.is_enabled + return data @property From c8aa55439f28bac2f4cec43396717dea61013181 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 17:55:33 -0500 Subject: [PATCH 299/653] Undo NUT update listener on config reload (#33986) --- homeassistant/components/nut/__init__.py | 9 +++++++-- homeassistant/components/nut/const.py | 1 + homeassistant/components/nut/sensor.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index de1bcca5b31d..82fc30636933 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -29,6 +29,7 @@ from .const import ( PYNUT_MODEL, PYNUT_NAME, PYNUT_UNIQUE_ID, + UNDO_UPDATE_LISTENER, ) _LOGGER = logging.getLogger(__name__) @@ -77,6 +78,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): _LOGGER.debug("NUT Sensors Available: %s", status) + undo_listener = entry.add_update_listener(_async_update_listener) + hass.data[DOMAIN][entry.entry_id] = { COORDINATOR: coordinator, PYNUT_DATA: data, @@ -85,10 +88,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): PYNUT_MODEL: _model_from_status(status), PYNUT_FIRMWARE: _firmware_from_status(status), PYNUT_NAME: data.name, + UNDO_UPDATE_LISTENER: undo_listener, } - entry.add_update_listener(_async_update_listener) - for component in PLATFORMS: hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, component) @@ -171,6 +173,9 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): ] ) ) + + hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENER]() + if unload_ok: hass.data[DOMAIN].pop(entry.entry_id) diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index ae960cc43255..98b6d22a8305 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -10,6 +10,7 @@ DOMAIN = "nut" PLATFORMS = ["sensor"] +UNDO_UPDATE_LISTENER = "undo_update_listener" DEFAULT_NAME = "NUT UPS" DEFAULT_HOST = "localhost" diff --git a/homeassistant/components/nut/sensor.py b/homeassistant/components/nut/sensor.py index 07abe27b4268..32daaaa2582d 100644 --- a/homeassistant/components/nut/sensor.py +++ b/homeassistant/components/nut/sensor.py @@ -57,7 +57,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -def setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Import the platform into a config entry.""" hass.async_create_task( From 1db6e9fcb2606bf377d7d7a63ed762cccbef15c2 Mon Sep 17 00:00:00 2001 From: Brian Rogers Date: Fri, 10 Apr 2020 20:01:22 -0400 Subject: [PATCH 300/653] Fix Rachio binary sensor cold reboot (#33959) --- .../components/rachio/binary_sensor.py | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/rachio/binary_sensor.py b/homeassistant/components/rachio/binary_sensor.py index ab3a0b912765..c3161cae6aba 100644 --- a/homeassistant/components/rachio/binary_sensor.py +++ b/homeassistant/components/rachio/binary_sensor.py @@ -6,6 +6,7 @@ from homeassistant.components.binary_sensor import ( DEVICE_CLASS_CONNECTIVITY, BinarySensorDevice, ) +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from .const import ( @@ -18,7 +19,7 @@ from .const import ( STATUS_ONLINE, ) from .entity import RachioDevice -from .webhooks import SUBTYPE_OFFLINE, SUBTYPE_ONLINE +from .webhooks import SUBTYPE_COLD_REBOOT, SUBTYPE_OFFLINE, SUBTYPE_ONLINE _LOGGER = logging.getLogger(__name__) @@ -43,7 +44,6 @@ class RachioControllerBinarySensor(RachioDevice, BinarySensorDevice): def __init__(self, controller, poll=True): """Set up a new Rachio controller binary sensor.""" super().__init__(controller) - self._undo_dispatcher = None if poll: self._state = self._poll_update() else: @@ -54,34 +54,34 @@ class RachioControllerBinarySensor(RachioDevice, BinarySensorDevice): """Return whether the sensor has a 'true' value.""" return self._state - def _handle_any_update(self, *args, **kwargs) -> None: + @callback + def _async_handle_any_update(self, *args, **kwargs) -> None: """Determine whether an update event applies to this device.""" if args[0][KEY_DEVICE_ID] != self._controller.controller_id: # For another device return # For this device - self._handle_update(args, kwargs) + self._async_handle_update(args, kwargs) @abstractmethod def _poll_update(self, data=None) -> bool: """Request the state from the API.""" @abstractmethod - def _handle_update(self, *args, **kwargs) -> None: + def _async_handle_update(self, *args, **kwargs) -> None: """Handle an update to the state of this sensor.""" async def async_added_to_hass(self): """Subscribe to updates.""" - self._undo_dispatcher = async_dispatcher_connect( - self.hass, SIGNAL_RACHIO_CONTROLLER_UPDATE, self._handle_any_update + self.async_on_remove( + async_dispatcher_connect( + self.hass, + SIGNAL_RACHIO_CONTROLLER_UPDATE, + self._async_handle_any_update, + ) ) - async def async_will_remove_from_hass(self): - """Unsubscribe from updates.""" - if self._undo_dispatcher: - self._undo_dispatcher() - class RachioControllerOnlineBinarySensor(RachioControllerBinarySensor): """Represent a binary sensor that reflects if the controller is online.""" @@ -94,7 +94,7 @@ class RachioControllerOnlineBinarySensor(RachioControllerBinarySensor): @property def name(self) -> str: """Return the name of this sensor including the controller name.""" - return f"{self._controller.name} online" + return self._controller.name @property def unique_id(self) -> str: @@ -124,11 +124,15 @@ class RachioControllerOnlineBinarySensor(RachioControllerBinarySensor): '"%s" reported in unknown state "%s"', self.name, data[KEY_STATUS] ) - def _handle_update(self, *args, **kwargs) -> None: + @callback + def _async_handle_update(self, *args, **kwargs) -> None: """Handle an update to the state of this sensor.""" - if args[0][0][KEY_SUBTYPE] == SUBTYPE_ONLINE: + if ( + args[0][0][KEY_SUBTYPE] == SUBTYPE_ONLINE + or args[0][0][KEY_SUBTYPE] == SUBTYPE_COLD_REBOOT + ): self._state = True elif args[0][0][KEY_SUBTYPE] == SUBTYPE_OFFLINE: self._state = False - self.schedule_update_ha_state() + self.async_write_ha_state() From 32e87fc4c7f89bd1927836d62313487495ab5f84 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 11 Apr 2020 00:03:44 +0000 Subject: [PATCH 301/653] [ci skip] Translation update --- .../components/august/.translations/fr.json | 3 +- .../components/flume/.translations/ca.json | 25 ++++++++++++++ .../components/flume/.translations/es.json | 25 ++++++++++++++ .../components/flume/.translations/fr.json | 19 +++++++++++ .../components/flume/.translations/nl.json | 22 ++++++++++++ .../components/flume/.translations/ru.json | 25 ++++++++++++++ .../flume/.translations/zh-Hant.json | 25 ++++++++++++++ .../flunearyou/.translations/fr.json | 18 ++++++++++ .../components/harmony/.translations/es.json | 2 +- .../components/hue/.translations/nl.json | 10 ++++++ .../components/ipp/.translations/es.json | 3 +- .../components/ipp/.translations/fr.json | 31 +++++++++++++++++ .../components/ipp/.translations/nl.json | 5 +++ .../konnected/.translations/fr.json | 1 + .../konnected/.translations/nl.json | 5 +++ .../components/local_ip/.translations/ca.json | 3 +- .../components/local_ip/.translations/en.json | 1 + .../components/local_ip/.translations/es.json | 3 +- .../components/local_ip/.translations/fr.json | 3 +- .../components/local_ip/.translations/ru.json | 3 +- .../local_ip/.translations/zh-Hant.json | 3 +- .../media_player/.translations/es.json | 2 +- .../components/nut/.translations/es.json | 13 +++++++ .../components/nut/.translations/fr.json | 19 +++++++++++ .../components/nut/.translations/nl.json | 34 +++++++++++++++++++ .../components/nut/.translations/zh-Hant.json | 15 +++++++- .../synology_dsm/.translations/es.json | 12 +++++++ .../synology_dsm/.translations/fr.json | 34 +++++++++++++++++++ .../components/tplink/.translations/es.json | 2 +- .../components/unifi/.translations/nl.json | 5 +++ .../components/vera/.translations/fr.json | 5 +++ 31 files changed, 365 insertions(+), 11 deletions(-) create mode 100644 homeassistant/components/flume/.translations/ca.json create mode 100644 homeassistant/components/flume/.translations/es.json create mode 100644 homeassistant/components/flume/.translations/fr.json create mode 100644 homeassistant/components/flume/.translations/nl.json create mode 100644 homeassistant/components/flume/.translations/ru.json create mode 100644 homeassistant/components/flume/.translations/zh-Hant.json create mode 100644 homeassistant/components/flunearyou/.translations/fr.json create mode 100644 homeassistant/components/ipp/.translations/fr.json create mode 100644 homeassistant/components/ipp/.translations/nl.json create mode 100644 homeassistant/components/nut/.translations/fr.json create mode 100644 homeassistant/components/nut/.translations/nl.json create mode 100644 homeassistant/components/synology_dsm/.translations/fr.json create mode 100644 homeassistant/components/vera/.translations/fr.json diff --git a/homeassistant/components/august/.translations/fr.json b/homeassistant/components/august/.translations/fr.json index 89a35b28f1d1..6b94dbc53ee4 100644 --- a/homeassistant/components/august/.translations/fr.json +++ b/homeassistant/components/august/.translations/fr.json @@ -15,7 +15,8 @@ "password": "Mot de passe", "timeout": "D\u00e9lai d'expiration (secondes)", "username": "Nom d'utilisateur" - } + }, + "title": "Configurer un compte August" }, "validation": { "data": { diff --git a/homeassistant/components/flume/.translations/ca.json b/homeassistant/components/flume/.translations/ca.json new file mode 100644 index 000000000000..9cb58b1adbed --- /dev/null +++ b/homeassistant/components/flume/.translations/ca.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "Aquest compte ja est\u00e0 configurat" + }, + "error": { + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "client_id": "ID de client", + "client_secret": "Secret de client", + "password": "Contrasenya", + "username": "Nom d'usuari" + }, + "description": "Per poder accedir a l'API personal de Flume, has de sol\u00b7licitar un 'ID de client' i un 'secret de client' anant a https://portal.flumetech.com/settings#token", + "title": "Connexi\u00f3 amb Flume" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/es.json b/homeassistant/components/flume/.translations/es.json new file mode 100644 index 000000000000..b5d5c1585078 --- /dev/null +++ b/homeassistant/components/flume/.translations/es.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "Esta cuenta ya est\u00e1 configurada" + }, + "error": { + "cannot_connect": "No se pudo conectar, por favor, int\u00e9ntalo de nuevo", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "client_id": "Client ID", + "client_secret": "Client Secret", + "password": "Contrase\u00f1a", + "username": "Usuario" + }, + "description": "Para acceder a la API Personal de Flume, tendr\u00e1s que solicitar un 'Client ID' y un 'Client Secret' en https://portal.flumetech.com/settings#token", + "title": "Conectar con tu Cuenta de Flume" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/fr.json b/homeassistant/components/flume/.translations/fr.json new file mode 100644 index 000000000000..c0e8750d94b2 --- /dev/null +++ b/homeassistant/components/flume/.translations/fr.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "Ce compte est d\u00e9j\u00e0 configur\u00e9." + }, + "error": { + "cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer", + "invalid_auth": "Authentification non valide", + "unknown": "Erreur inattendue" + }, + "step": { + "user": { + "description": "Pour acc\u00e9der \u00e0 l'API personnel Flume, vous devez demander un \"Client ID\" et un \"Client Secret\" \u00e0 l'adresse https://portal.flumetech.com/settings#token", + "title": "Se connecter \u00e0 votre compte Flume" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/nl.json b/homeassistant/components/flume/.translations/nl.json new file mode 100644 index 000000000000..7f1cd8c35eb7 --- /dev/null +++ b/homeassistant/components/flume/.translations/nl.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Dit account is al geconfigureerd." + }, + "error": { + "cannot_connect": "Verbinding mislukt, probeer het opnieuw", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "user": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + }, + "title": "Verbind met uw Flume account" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/ru.json b/homeassistant/components/flume/.translations/ru.json new file mode 100644 index 000000000000..88b83190806a --- /dev/null +++ b/homeassistant/components/flume/.translations/ru.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", + "invalid_auth": "\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "client_id": "ID \u043a\u043b\u0438\u0435\u043d\u0442\u0430", + "client_secret": "\u0421\u0435\u043a\u0440\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "description": "\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 API Flume, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 'ID \u043a\u043b\u0438\u0435\u043d\u0442\u0430' \u0438 '\u0421\u0435\u043a\u0440\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430' \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 https://portal.flumetech.com/settings#token.", + "title": "Flume" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/zh-Hant.json b/homeassistant/components/flume/.translations/zh-Hant.json new file mode 100644 index 000000000000..fd2882c607b4 --- /dev/null +++ b/homeassistant/components/flume/.translations/zh-Hant.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "\u6b64\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "client_id": "\u5ba2\u6236\u7aef ID", + "client_secret": "\u5ba2\u6236\u7aef\u5bc6\u9470", + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "description": "\u6b32\u5b58\u53d6 Flume \u500b\u4eba API\u3001\u5c07\u9700\u8981\u65bc https://portal.flumetech.com/settings#token \u7372\u5f97\u5ba2\u6236\u7aef ID\uff08Client ID\u300f\u53ca\u5ba2\u6236\u7aef\u5bc6\u9470\uff08Client Secret\uff09", + "title": "\u9023\u7dda\u81f3 Flume \u5e33\u865f" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/fr.json b/homeassistant/components/flunearyou/.translations/fr.json new file mode 100644 index 000000000000..dddcdd64d7bf --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/fr.json @@ -0,0 +1,18 @@ +{ + "config": { + "abort": { + "already_configured": "Coordonn\u00e9es d\u00e9j\u00e0 enregistr\u00e9es" + }, + "error": { + "general_error": "Une erreur inconnue est survenue." + }, + "step": { + "user": { + "data": { + "latitude": "Latitude", + "longitude": "Longitude" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/es.json b/homeassistant/components/harmony/.translations/es.json index 300b2e4cb8db..8d10e63c6092 100644 --- a/homeassistant/components/harmony/.translations/es.json +++ b/homeassistant/components/harmony/.translations/es.json @@ -10,7 +10,7 @@ "flow_title": "Logitech Harmony Hub {name}", "step": { "link": { - "description": "\u00bfQuiere configurar {name} ({host})?", + "description": "\u00bfQuieres configurar {name} ({host})?", "title": "Configurar Logitech Harmony Hub" }, "user": { diff --git a/homeassistant/components/hue/.translations/nl.json b/homeassistant/components/hue/.translations/nl.json index 0c7a1bfb60d5..ba6ee67624cc 100644 --- a/homeassistant/components/hue/.translations/nl.json +++ b/homeassistant/components/hue/.translations/nl.json @@ -27,5 +27,15 @@ } }, "title": "Philips Hue" + }, + "device_automation": { + "trigger_subtype": { + "button_1": "Eerste knop", + "button_2": "Tweede knop", + "button_3": "Derde knop", + "button_4": "Vierde knop", + "turn_off": "Uitschakelen", + "turn_on": "Inschakelen" + } } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/es.json b/homeassistant/components/ipp/.translations/es.json index 6e86f702902a..5f1f2fb60f00 100644 --- a/homeassistant/components/ipp/.translations/es.json +++ b/homeassistant/components/ipp/.translations/es.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "Esta impresora ya est\u00e1 configurada.", "connection_error": "No se pudo conectar con la impresora.", - "connection_upgrade": "No se pudo conectar con la impresora debido a que se requiere una actualizaci\u00f3n de la conexi\u00f3n." + "connection_upgrade": "No se pudo conectar con la impresora debido a que se requiere una actualizaci\u00f3n de la conexi\u00f3n.", + "parse_error": "Error al analizar la respuesta de la impresora." }, "error": { "connection_error": "No se pudo conectar con la impresora.", diff --git a/homeassistant/components/ipp/.translations/fr.json b/homeassistant/components/ipp/.translations/fr.json new file mode 100644 index 000000000000..5d4ce687cf8c --- /dev/null +++ b/homeassistant/components/ipp/.translations/fr.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "Cette imprimante est d\u00e9j\u00e0 configur\u00e9e.", + "connection_error": "Impossible de se connecter \u00e0 l'imprimante.", + "connection_upgrade": "Impossible de se connecter \u00e0 l'imprimante parce qu'une mise \u00e0 niveau de la connexion est n\u00e9cessaire." + }, + "error": { + "connection_error": "Impossible de se connecter \u00e0 l'imprimante.", + "connection_upgrade": "Impossible de se connecter \u00e0 l'imprimante. Veuillez r\u00e9essayer avec l'option SSL / TLS coch\u00e9e." + }, + "flow_title": "Imprimante: {name}", + "step": { + "user": { + "data": { + "base_path": "Chemin d'acc\u00e8s relatif \u00e0 l'imprimante", + "host": "H\u00f4te ou adresse IP", + "port": "Port", + "ssl": "L'imprimante prend en charge la communication via SSL / TLS", + "verify_ssl": "L'imprimante utilise un certificat SSL appropri\u00e9" + }, + "description": "Configurez votre imprimante via IPP (Internet Printing Protocol) pour l'int\u00e9grer \u00e0 Home Assistant", + "title": "Reliez votre imprimante" + }, + "zeroconf_confirm": { + "description": "Voulez-vous ajouter l'imprimante `{name}` \u00e0 Home Assistant ?", + "title": "Imprimante trouv\u00e9e" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/nl.json b/homeassistant/components/ipp/.translations/nl.json new file mode 100644 index 000000000000..ad1788e0bd4d --- /dev/null +++ b/homeassistant/components/ipp/.translations/nl.json @@ -0,0 +1,5 @@ +{ + "config": { + "title": "Internet Printing Protocol (IPP)" + } +} \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/fr.json b/homeassistant/components/konnected/.translations/fr.json index fecdd35b8086..ccbc849ab581 100644 --- a/homeassistant/components/konnected/.translations/fr.json +++ b/homeassistant/components/konnected/.translations/fr.json @@ -68,6 +68,7 @@ }, "options_switch": { "data": { + "more_states": "Configurer des \u00e9tats suppl\u00e9mentaires pour cette zone", "name": "Nom (facultatif)" } } diff --git a/homeassistant/components/konnected/.translations/nl.json b/homeassistant/components/konnected/.translations/nl.json index 1b6242b37f49..ef9c7a40b61c 100644 --- a/homeassistant/components/konnected/.translations/nl.json +++ b/homeassistant/components/konnected/.translations/nl.json @@ -62,6 +62,11 @@ "9": "Zone 9" } }, + "options_misc": { + "data": { + "api_host": "API host-URL overschrijven (optioneel)" + } + }, "options_switch": { "data": { "name": "Naam (optioneel)" diff --git a/homeassistant/components/local_ip/.translations/ca.json b/homeassistant/components/local_ip/.translations/ca.json index b2b7ee89c16c..cc2154ad9d0e 100644 --- a/homeassistant/components/local_ip/.translations/ca.json +++ b/homeassistant/components/local_ip/.translations/ca.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Integraci\u00f3 ja configurada amb un sensor amb aquest nom" + "already_configured": "Integraci\u00f3 ja configurada amb un sensor amb aquest nom", + "single_instance_allowed": "Nom\u00e9s \u00e9s possible configurar una sola IP local." }, "step": { "user": { diff --git a/homeassistant/components/local_ip/.translations/en.json b/homeassistant/components/local_ip/.translations/en.json index 69cbaa457d51..20fcd202ed99 100644 --- a/homeassistant/components/local_ip/.translations/en.json +++ b/homeassistant/components/local_ip/.translations/en.json @@ -1,6 +1,7 @@ { "config": { "abort": { + "already_configured": "Integration is already configured with an existing sensor with that name", "single_instance_allowed": "Only a single configuration of Local IP is allowed." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/es.json b/homeassistant/components/local_ip/.translations/es.json index a18c809de856..a798de0530f2 100644 --- a/homeassistant/components/local_ip/.translations/es.json +++ b/homeassistant/components/local_ip/.translations/es.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "La integraci\u00f3n ya est\u00e1 configurada con un sensor existente con ese nombre" + "already_configured": "La integraci\u00f3n ya est\u00e1 configurada con un sensor existente con ese nombre", + "single_instance_allowed": "Solo se permite una \u00fanica configuraci\u00f3n de IP Local." }, "step": { "user": { diff --git a/homeassistant/components/local_ip/.translations/fr.json b/homeassistant/components/local_ip/.translations/fr.json index 0d3c61c385b8..9d4b84e9ecd9 100644 --- a/homeassistant/components/local_ip/.translations/fr.json +++ b/homeassistant/components/local_ip/.translations/fr.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "L'int\u00e9gration est d\u00e9j\u00e0 configur\u00e9e avec un capteur existant portant ce nom" + "already_configured": "L'int\u00e9gration est d\u00e9j\u00e0 configur\u00e9e avec un capteur existant portant ce nom", + "single_instance_allowed": "Une seule configuration d'IP locale est autoris\u00e9e" }, "step": { "user": { diff --git a/homeassistant/components/local_ip/.translations/ru.json b/homeassistant/components/local_ip/.translations/ru.json index 2cf8791e5057..b013fb3bd8dc 100644 --- a/homeassistant/components/local_ip/.translations/ru.json +++ b/homeassistant/components/local_ip/.translations/ru.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c." + "already_configured": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c.", + "single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." }, "step": { "user": { diff --git a/homeassistant/components/local_ip/.translations/zh-Hant.json b/homeassistant/components/local_ip/.translations/zh-Hant.json index ec50980b6eae..d5ea8d0bc4c3 100644 --- a/homeassistant/components/local_ip/.translations/zh-Hant.json +++ b/homeassistant/components/local_ip/.translations/zh-Hant.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "\u6574\u5408\u5df2\u7d93\u8a2d\u5b9a\u4e26\u6709\u73fe\u6709\u50b3\u611f\u5668\u4f7f\u7528\u76f8\u540c\u540d\u7a31" + "already_configured": "\u6574\u5408\u5df2\u7d93\u8a2d\u5b9a\u4e26\u6709\u73fe\u6709\u50b3\u611f\u5668\u4f7f\u7528\u76f8\u540c\u540d\u7a31", + "single_instance_allowed": "\u50c5\u5141\u8a31\u8a2d\u5b9a\u4e00\u7d44\u672c\u5730 IP\u3002" }, "step": { "user": { diff --git a/homeassistant/components/media_player/.translations/es.json b/homeassistant/components/media_player/.translations/es.json index 16242dadeb68..d4cdcf3d254b 100644 --- a/homeassistant/components/media_player/.translations/es.json +++ b/homeassistant/components/media_player/.translations/es.json @@ -5,7 +5,7 @@ "is_off": "{entity_name} est\u00e1 apagado", "is_on": "{entity_name} est\u00e1 activado", "is_paused": "{entity_name} est\u00e1 en pausa", - "is_playing": "{entity_name} est\u00e1 jugando" + "is_playing": "{entity_name} est\u00e1 reproduciendo" } } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/es.json b/homeassistant/components/nut/.translations/es.json index 34944816c818..ddc02187c539 100644 --- a/homeassistant/components/nut/.translations/es.json +++ b/homeassistant/components/nut/.translations/es.json @@ -8,6 +8,19 @@ "unknown": "Error inesperado" }, "step": { + "resources": { + "data": { + "resources": "Recursos" + }, + "title": "Selecciona los recursos a monitorizar" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Recursos" + }, + "title": "Selecciona el UPS a monitorizar" + }, "user": { "data": { "alias": "Alias", diff --git a/homeassistant/components/nut/.translations/fr.json b/homeassistant/components/nut/.translations/fr.json new file mode 100644 index 000000000000..b83083fd6ed8 --- /dev/null +++ b/homeassistant/components/nut/.translations/fr.json @@ -0,0 +1,19 @@ +{ + "config": { + "step": { + "resources": { + "data": { + "resources": "Ressources" + }, + "title": "Choisissez les ressources \u00e0 surveiller" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Ressources" + }, + "title": "Choisir l'UPS \u00e0 surveiller" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/nl.json b/homeassistant/components/nut/.translations/nl.json new file mode 100644 index 000000000000..131303354e78 --- /dev/null +++ b/homeassistant/components/nut/.translations/nl.json @@ -0,0 +1,34 @@ +{ + "config": { + "error": { + "unknown": "Onverwachte fout" + }, + "step": { + "ups": { + "title": "Kies een UPS om uit te lezen" + }, + "user": { + "data": { + "alias": "Alias", + "host": "Host", + "name": "Naam", + "password": "Wachtwoord", + "port": "Poort", + "resources": "Bronnen", + "username": "Gebruikersnaam" + }, + "title": "Verbind met NUT-server" + } + }, + "title": "Network UPS Tools (NUT)" + }, + "options": { + "step": { + "init": { + "data": { + "resources": "Bronnen" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/zh-Hant.json b/homeassistant/components/nut/.translations/zh-Hant.json index 760a66ba1a5b..2c5717e72f6b 100644 --- a/homeassistant/components/nut/.translations/zh-Hant.json +++ b/homeassistant/components/nut/.translations/zh-Hant.json @@ -8,6 +8,19 @@ "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, "step": { + "resources": { + "data": { + "resources": "\u8cc7\u6e90" + }, + "title": "\u9078\u64c7\u6240\u8981\u76e3\u8996\u7684\u8cc7\u6e90" + }, + "ups": { + "data": { + "alias": "\u5225\u540d", + "resources": "\u8cc7\u6e90" + }, + "title": "\u9078\u64c7\u6240\u8981\u76e3\u8996\u7684 UPS" + }, "user": { "data": { "alias": "\u5225\u540d", @@ -30,7 +43,7 @@ "data": { "resources": "\u8cc7\u6e90" }, - "description": "\u9078\u64c7\u50b3\u611f\u5668\u8cc7\u6e90" + "description": "\u9078\u64c7\u50b3\u611f\u5668\u8cc7\u6e90\u3002" } } } diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json index fafedb50a0e4..9317331daebe 100644 --- a/homeassistant/components/synology_dsm/.translations/es.json +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -7,7 +7,19 @@ "login": "Error de inicio de sesi\u00f3n: comprueba tu direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a", "unknown": "Error desconocido: por favor vuelve a intentarlo m\u00e1s tarde o usa otra configuraci\u00f3n" }, + "flow_title": "Synology DSM {name} ({host})", "step": { + "link": { + "data": { + "api_version": "Versi\u00f3n del DSM", + "password": "Contrase\u00f1a", + "port": "Puerto (opcional)", + "ssl": "Usar SSL/TLS para conectar con tu NAS", + "username": "Usuario" + }, + "description": "\u00bfQuieres configurar {name} ({host})?", + "title": "Synology DSM" + }, "user": { "data": { "api_version": "Versi\u00f3n del DSM", diff --git a/homeassistant/components/synology_dsm/.translations/fr.json b/homeassistant/components/synology_dsm/.translations/fr.json new file mode 100644 index 000000000000..3caf51812bed --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/fr.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "H\u00f4te d\u00e9j\u00e0 configur\u00e9" + }, + "error": { + "login": "Erreur de connexion: veuillez v\u00e9rifier votre nom d'utilisateur et votre mot de passe", + "unknown": "Erreur inconnue: veuillez r\u00e9essayer plus tard ou utilisez une autre configuration" + }, + "flow_title": "Synology DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "Version du DSM", + "password": "Mot de passe", + "port": "Port (facultatif)", + "ssl": "Utilisez SSL/TLS pour vous connecter \u00e0 votre NAS", + "username": "Nom d'utilisateur" + }, + "description": "Voulez-vous configurer {name} ({host})?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "Version du DSM", + "host": "H\u00f4te", + "name": "Nom", + "password": "Mot de passe", + "port": "Port (facultatif)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/es.json b/homeassistant/components/tplink/.translations/es.json index 9b6e34f6c358..1a1199eeac6c 100644 --- a/homeassistant/components/tplink/.translations/es.json +++ b/homeassistant/components/tplink/.translations/es.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "\u00bfDesea configurar dispositivos de TP-Link?", + "description": "\u00bfQuieres configurar dispositivos inteligentes de TP-Link?", "title": "TP-Link Smart Home" } }, diff --git a/homeassistant/components/unifi/.translations/nl.json b/homeassistant/components/unifi/.translations/nl.json index 36e21728f1d5..fe31651173b3 100644 --- a/homeassistant/components/unifi/.translations/nl.json +++ b/homeassistant/components/unifi/.translations/nl.json @@ -25,6 +25,11 @@ }, "options": { "step": { + "client_control": { + "data": { + "poe_clients": "Sta POE-controle van gebruikers toe" + } + }, "device_tracker": { "data": { "detection_time": "Tijd in seconden vanaf laatst gezien tot beschouwd als weg", diff --git a/homeassistant/components/vera/.translations/fr.json b/homeassistant/components/vera/.translations/fr.json new file mode 100644 index 000000000000..d24bf97393ec --- /dev/null +++ b/homeassistant/components/vera/.translations/fr.json @@ -0,0 +1,5 @@ +{ + "config": { + "title": "Vera" + } +} \ No newline at end of file From 04c4501455eac463bea8f54e3f80d42454d6ccb2 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 11 Apr 2020 02:04:58 +0200 Subject: [PATCH 302/653] Add and use UNIT_VOLT constant (#33994) * Add and use UNIT_VOLT constant * Run isort --- homeassistant/components/apcupsd/sensor.py | 23 ++++++------- .../components/dsmr_reader/definitions.py | 8 ++--- homeassistant/components/elkm1/sensor.py | 4 ++- homeassistant/components/envirophat/sensor.py | 10 +++--- .../components/greeneye_monitor/sensor.py | 3 +- .../components/growatt_server/sensor.py | 9 ++--- homeassistant/components/homematic/sensor.py | 3 +- homeassistant/components/isy994/sensor.py | 3 +- homeassistant/components/juicenet/sensor.py | 10 ++++-- homeassistant/components/lcn/const.py | 9 +++-- homeassistant/components/mysensors/sensor.py | 3 +- homeassistant/components/nut/const.py | 33 ++++++++++++------- homeassistant/components/onewire/sensor.py | 14 +++++--- homeassistant/components/smappee/sensor.py | 3 +- .../components/smartthings/sensor.py | 3 +- .../components/solaredge_local/sensor.py | 19 +++++++++-- homeassistant/components/solarlog/const.py | 11 +++++-- homeassistant/components/starline/sensor.py | 4 +-- homeassistant/components/ted5000/sensor.py | 8 ++--- .../components/wirelesstag/__init__.py | 3 +- homeassistant/const.py | 3 ++ tests/components/sma/test_sensor.py | 3 +- 22 files changed, 125 insertions(+), 64 deletions(-) diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index 85bbe5c950e7..6989f58d3bbb 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( TIME_MINUTES, TIME_SECONDS, UNIT_PERCENTAGE, + UNIT_VOLT, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -29,7 +30,7 @@ SENSOR_TYPES = { "badbatts": ["Bad Batteries", "", "mdi:information-outline"], "battdate": ["Battery Replaced", "", "mdi:calendar-clock"], "battstat": ["Battery Status", "", "mdi:information-outline"], - "battv": ["Battery Voltage", "V", "mdi:flash"], + "battv": ["Battery Voltage", UNIT_VOLT, "mdi:flash"], "bcharge": ["Battery", UNIT_PERCENTAGE, "mdi:battery"], "cable": ["Cable Type", "", "mdi:ethernet-cable"], "cumonbatt": ["Total Time on Battery", "", "mdi:timer"], @@ -42,33 +43,33 @@ SENSOR_TYPES = { "endapc": ["Date and Time", "", "mdi:calendar-clock"], "extbatts": ["External Batteries", "", "mdi:information-outline"], "firmware": ["Firmware Version", "", "mdi:information-outline"], - "hitrans": ["Transfer High", "V", "mdi:flash"], + "hitrans": ["Transfer High", UNIT_VOLT, "mdi:flash"], "hostname": ["Hostname", "", "mdi:information-outline"], "humidity": ["Ambient Humidity", UNIT_PERCENTAGE, "mdi:water-percent"], "itemp": ["Internal Temperature", TEMP_CELSIUS, "mdi:thermometer"], "lastxfer": ["Last Transfer", "", "mdi:transfer"], "linefail": ["Input Voltage Status", "", "mdi:information-outline"], "linefreq": ["Line Frequency", "Hz", "mdi:information-outline"], - "linev": ["Input Voltage", "V", "mdi:flash"], + "linev": ["Input Voltage", UNIT_VOLT, "mdi:flash"], "loadpct": ["Load", UNIT_PERCENTAGE, "mdi:gauge"], "loadapnt": ["Load Apparent Power", UNIT_PERCENTAGE, "mdi:gauge"], - "lotrans": ["Transfer Low", "V", "mdi:flash"], + "lotrans": ["Transfer Low", UNIT_VOLT, "mdi:flash"], "mandate": ["Manufacture Date", "", "mdi:calendar"], "masterupd": ["Master Update", "", "mdi:information-outline"], - "maxlinev": ["Input Voltage High", "V", "mdi:flash"], + "maxlinev": ["Input Voltage High", UNIT_VOLT, "mdi:flash"], "maxtime": ["Battery Timeout", "", "mdi:timer-off"], "mbattchg": ["Battery Shutdown", UNIT_PERCENTAGE, "mdi:battery-alert"], - "minlinev": ["Input Voltage Low", "V", "mdi:flash"], + "minlinev": ["Input Voltage Low", UNIT_VOLT, "mdi:flash"], "mintimel": ["Shutdown Time", "", "mdi:timer"], "model": ["Model", "", "mdi:information-outline"], - "nombattv": ["Battery Nominal Voltage", "V", "mdi:flash"], - "nominv": ["Nominal Input Voltage", "V", "mdi:flash"], - "nomoutv": ["Nominal Output Voltage", "V", "mdi:flash"], + "nombattv": ["Battery Nominal Voltage", UNIT_VOLT, "mdi:flash"], + "nominv": ["Nominal Input Voltage", UNIT_VOLT, "mdi:flash"], + "nomoutv": ["Nominal Output Voltage", UNIT_VOLT, "mdi:flash"], "nompower": ["Nominal Output Power", POWER_WATT, "mdi:flash"], "nomapnt": ["Nominal Apparent Power", "VA", "mdi:flash"], "numxfers": ["Transfer Count", "", "mdi:counter"], "outcurnt": ["Output Current", "A", "mdi:flash"], - "outputv": ["Output Voltage", "V", "mdi:flash"], + "outputv": ["Output Voltage", UNIT_VOLT, "mdi:flash"], "reg1": ["Register 1 Fault", "", "mdi:information-outline"], "reg2": ["Register 2 Fault", "", "mdi:information-outline"], "reg3": ["Register 3 Fault", "", "mdi:information-outline"], @@ -95,7 +96,7 @@ INFERRED_UNITS = { " Minutes": TIME_MINUTES, " Seconds": TIME_SECONDS, " Percent": UNIT_PERCENTAGE, - " Volts": "V", + " Volts": UNIT_VOLT, " Ampere": "A", " Volt-Ampere": "VA", " Watts": POWER_WATT, diff --git a/homeassistant/components/dsmr_reader/definitions.py b/homeassistant/components/dsmr_reader/definitions.py index 64eb2d9ea80c..87e6d6ff8729 100644 --- a/homeassistant/components/dsmr_reader/definitions.py +++ b/homeassistant/components/dsmr_reader/definitions.py @@ -1,6 +1,6 @@ """Definitions for DSMR Reader sensors added to MQTT.""" -from homeassistant.const import ENERGY_KILO_WATT_HOUR, VOLUME_CUBIC_METERS +from homeassistant.const import ENERGY_KILO_WATT_HOUR, UNIT_VOLT, VOLUME_CUBIC_METERS def dsmr_transform(value): @@ -86,17 +86,17 @@ DEFINITIONS = { "dsmr/reading/phase_voltage_l1": { "name": "Current voltage L1", "icon": "mdi:flash", - "unit": "V", + "unit": UNIT_VOLT, }, "dsmr/reading/phase_voltage_l2": { "name": "Current voltage L2", "icon": "mdi:flash", - "unit": "V", + "unit": UNIT_VOLT, }, "dsmr/reading/phase_voltage_l3": { "name": "Current voltage L3", "icon": "mdi:flash", - "unit": "V", + "unit": UNIT_VOLT, }, "dsmr/consumption/gas/delivered": { "name": "Gas usage", diff --git a/homeassistant/components/elkm1/sensor.py b/homeassistant/components/elkm1/sensor.py index 79987d806a1f..0c7a454990de 100644 --- a/homeassistant/components/elkm1/sensor.py +++ b/homeassistant/components/elkm1/sensor.py @@ -7,6 +7,8 @@ from elkm1_lib.const import ( ) from elkm1_lib.util import pretty_const, username +from homeassistant.const import UNIT_VOLT + from . import ElkAttachedEntity, create_elk_entities from .const import DOMAIN @@ -195,7 +197,7 @@ class ElkZone(ElkSensor): if self._element.definition == ZoneType.TEMPERATURE.value: return self._temperature_unit if self._element.definition == ZoneType.ANALOG_ZONE.value: - return "V" + return UNIT_VOLT return None def _element_changed(self, element, changeset): diff --git a/homeassistant/components/envirophat/sensor.py b/homeassistant/components/envirophat/sensor.py index ce1f154f911a..81420cf389f0 100644 --- a/homeassistant/components/envirophat/sensor.py +++ b/homeassistant/components/envirophat/sensor.py @@ -6,7 +6,7 @@ import logging import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_DISPLAY_OPTIONS, CONF_NAME, TEMP_CELSIUS +from homeassistant.const import CONF_DISPLAY_OPTIONS, CONF_NAME, TEMP_CELSIUS, UNIT_VOLT import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -31,10 +31,10 @@ SENSOR_TYPES = { "magnetometer_z": ["magnetometer_z", " ", "mdi:magnet"], "temperature": ["temperature", TEMP_CELSIUS, "mdi:thermometer"], "pressure": ["pressure", "hPa", "mdi:gauge"], - "voltage_0": ["voltage_0", "V", "mdi:flash"], - "voltage_1": ["voltage_1", "V", "mdi:flash"], - "voltage_2": ["voltage_2", "V", "mdi:flash"], - "voltage_3": ["voltage_3", "V", "mdi:flash"], + "voltage_0": ["voltage_0", UNIT_VOLT, "mdi:flash"], + "voltage_1": ["voltage_1", UNIT_VOLT, "mdi:flash"], + "voltage_2": ["voltage_2", UNIT_VOLT, "mdi:flash"], + "voltage_3": ["voltage_3", UNIT_VOLT, "mdi:flash"], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( diff --git a/homeassistant/components/greeneye_monitor/sensor.py b/homeassistant/components/greeneye_monitor/sensor.py index ff5aff6fe500..18d564765d1e 100644 --- a/homeassistant/components/greeneye_monitor/sensor.py +++ b/homeassistant/components/greeneye_monitor/sensor.py @@ -8,6 +8,7 @@ from homeassistant.const import ( TIME_HOURS, TIME_MINUTES, TIME_SECONDS, + UNIT_VOLT, ) from homeassistant.helpers.entity import Entity @@ -310,4 +311,4 @@ class VoltageSensor(GEMSensor): @property def unit_of_measurement(self): """Return the unit of measurement for this sensor.""" - return "V" + return UNIT_VOLT diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index b7cea620a662..6742b39e8b01 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, ENERGY_KILO_WATT_HOUR, + UNIT_VOLT, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -57,17 +58,17 @@ INVERTER_SENSOR_TYPES = { "e_total", "power", ), - "inverter_voltage_input_1": ("Input 1 voltage", "V", "vpv1", None), + "inverter_voltage_input_1": ("Input 1 voltage", UNIT_VOLT, "vpv1", None), "inverter_amperage_input_1": ("Input 1 Amperage", "A", "ipv1", None), "inverter_wattage_input_1": ("Input 1 Wattage", "W", "ppv1", "power"), - "inverter_voltage_input_2": ("Input 2 voltage", "V", "vpv2", None), + "inverter_voltage_input_2": ("Input 2 voltage", UNIT_VOLT, "vpv2", None), "inverter_amperage_input_2": ("Input 2 Amperage", "A", "ipv2", None), "inverter_wattage_input_2": ("Input 2 Wattage", "W", "ppv2", "power"), - "inverter_voltage_input_3": ("Input 3 voltage", "V", "vpv3", None), + "inverter_voltage_input_3": ("Input 3 voltage", UNIT_VOLT, "vpv3", None), "inverter_amperage_input_3": ("Input 3 Amperage", "A", "ipv3", None), "inverter_wattage_input_3": ("Input 3 Wattage", "W", "ppv3", "power"), "inverter_internal_wattage": ("Internal wattage", "W", "ppv", "power"), - "inverter_reactive_voltage": ("Reactive voltage", "V", "vacr", None), + "inverter_reactive_voltage": ("Reactive voltage", UNIT_VOLT, "vacr", None), "inverter_inverter_reactive_amperage": ("Reactive amperage", "A", "iacr", None), "inverter_frequency": ("AC frequency", "Hz", "fac", None), "inverter_current_wattage": ("Output power", "W", "pac", "power"), diff --git a/homeassistant/components/homematic/sensor.py b/homeassistant/components/homematic/sensor.py index c0a269bd5828..d36b05fd129e 100644 --- a/homeassistant/components/homematic/sensor.py +++ b/homeassistant/components/homematic/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, UNIT_PERCENTAGE, + UNIT_VOLT, VOLUME_CUBIC_METERS, ) @@ -40,7 +41,7 @@ HM_UNIT_HA_CAST = { "BRIGHTNESS": "#", "POWER": POWER_WATT, "CURRENT": "mA", - "VOLTAGE": "V", + "VOLTAGE": UNIT_VOLT, "ENERGY_COUNTER": ENERGY_WATT_HOUR, "GAS_POWER": VOLUME_CUBIC_METERS, "GAS_ENERGY_COUNTER": VOLUME_CUBIC_METERS, diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index 9e2f3e90957a..a21b484ec9b6 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( TIME_YEARS, UNIT_PERCENTAGE, UNIT_UV_INDEX, + UNIT_VOLT, ) from homeassistant.helpers.typing import ConfigType @@ -91,7 +92,7 @@ UOM_FRIENDLY_NAME = { "65": "SML", "69": "gal", "71": UNIT_UV_INDEX, - "72": "V", + "72": UNIT_VOLT, "73": POWER_WATT, "74": "W/m²", "75": "weekday", diff --git a/homeassistant/components/juicenet/sensor.py b/homeassistant/components/juicenet/sensor.py index 6ddb8279811e..93eec19d41b0 100644 --- a/homeassistant/components/juicenet/sensor.py +++ b/homeassistant/components/juicenet/sensor.py @@ -1,7 +1,13 @@ """Support for monitoring juicenet/juicepoint/juicebox based EVSE sensors.""" import logging -from homeassistant.const import ENERGY_WATT_HOUR, POWER_WATT, TEMP_CELSIUS, TIME_SECONDS +from homeassistant.const import ( + ENERGY_WATT_HOUR, + POWER_WATT, + TEMP_CELSIUS, + TIME_SECONDS, + UNIT_VOLT, +) from homeassistant.helpers.entity import Entity from . import DOMAIN, JuicenetDevice @@ -11,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) SENSOR_TYPES = { "status": ["Charging Status", None], "temperature": ["Temperature", TEMP_CELSIUS], - "voltage": ["Voltage", "V"], + "voltage": ["Voltage", UNIT_VOLT], "amps": ["Amps", "A"], "watts": ["Watts", POWER_WATT], "charge_time": ["Charge time", TIME_SECONDS], diff --git a/homeassistant/components/lcn/const.py b/homeassistant/components/lcn/const.py index 0a46190fbf93..7a881ab9d856 100644 --- a/homeassistant/components/lcn/const.py +++ b/homeassistant/components/lcn/const.py @@ -1,7 +1,12 @@ """Constants for the LCN component.""" from itertools import product -from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE +from homeassistant.const import ( + TEMP_CELSIUS, + TEMP_FAHRENHEIT, + UNIT_PERCENTAGE, + UNIT_VOLT, +) DOMAIN = "lcn" DATA_LCN = "lcn" @@ -157,7 +162,7 @@ VAR_UNITS = [ "PERCENT", "PPM", "VOLT", - "V", + UNIT_VOLT, "AMPERE", "AMP", "A", diff --git a/homeassistant/components/mysensors/sensor.py b/homeassistant/components/mysensors/sensor.py index 997728ed4952..16c8d37f4477 100644 --- a/homeassistant/components/mysensors/sensor.py +++ b/homeassistant/components/mysensors/sensor.py @@ -8,6 +8,7 @@ from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE, + UNIT_VOLT, ) SENSORS = { @@ -35,7 +36,7 @@ SENSORS = { "S_VIBRATION": ["Hz", None], "S_LIGHT_LEVEL": ["lx", "mdi:white-balance-sunny"], }, - "V_VOLTAGE": ["V", "mdi:flash"], + "V_VOLTAGE": [UNIT_VOLT, "mdi:flash"], "V_CURRENT": ["A", "mdi:flash-auto"], "V_PH": ["pH", None], "V_ORP": ["mV", None], diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index 98b6d22a8305..50217e4b5988 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -4,7 +4,13 @@ from homeassistant.components.sensor import ( DEVICE_CLASS_POWER, DEVICE_CLASS_TEMPERATURE, ) -from homeassistant.const import POWER_WATT, TEMP_CELSIUS, TIME_SECONDS, UNIT_PERCENTAGE +from homeassistant.const import ( + POWER_WATT, + TEMP_CELSIUS, + TIME_SECONDS, + UNIT_PERCENTAGE, + UNIT_VOLT, +) DOMAIN = "nut" @@ -94,10 +100,15 @@ SENSOR_TYPES = { None, ], "battery.charger.status": ["Charging Status", "", "mdi:information-outline", None], - "battery.voltage": ["Battery Voltage", "V", "mdi:flash", None], - "battery.voltage.nominal": ["Nominal Battery Voltage", "V", "mdi:flash", None], - "battery.voltage.low": ["Low Battery Voltage", "V", "mdi:flash", None], - "battery.voltage.high": ["High Battery Voltage", "V", "mdi:flash", None], + "battery.voltage": ["Battery Voltage", UNIT_VOLT, "mdi:flash", None], + "battery.voltage.nominal": [ + "Nominal Battery Voltage", + UNIT_VOLT, + "mdi:flash", + None, + ], + "battery.voltage.low": ["Low Battery Voltage", UNIT_VOLT, "mdi:flash", None], + "battery.voltage.high": ["High Battery Voltage", UNIT_VOLT, "mdi:flash", None], "battery.capacity": ["Battery Capacity", "Ah", "mdi:flash", None], "battery.current": ["Battery Current", "A", "mdi:flash", None], "battery.current.total": ["Total Battery Current", "A", "mdi:flash", None], @@ -137,16 +148,16 @@ SENSOR_TYPES = { "mdi:information-outline", None, ], - "input.transfer.low": ["Low Voltage Transfer", "V", "mdi:flash", None], - "input.transfer.high": ["High Voltage Transfer", "V", "mdi:flash", None], + "input.transfer.low": ["Low Voltage Transfer", UNIT_VOLT, "mdi:flash", None], + "input.transfer.high": ["High Voltage Transfer", UNIT_VOLT, "mdi:flash", None], "input.transfer.reason": [ "Voltage Transfer Reason", "", "mdi:information-outline", None, ], - "input.voltage": ["Input Voltage", "V", "mdi:flash", None], - "input.voltage.nominal": ["Nominal Input Voltage", "V", "mdi:flash", None], + "input.voltage": ["Input Voltage", UNIT_VOLT, "mdi:flash", None], + "input.voltage.nominal": ["Nominal Input Voltage", UNIT_VOLT, "mdi:flash", None], "input.frequency": ["Input Line Frequency", "hz", "mdi:flash", None], "input.frequency.nominal": [ "Nominal Input Line Frequency", @@ -162,8 +173,8 @@ SENSOR_TYPES = { ], "output.current": ["Output Current", "A", "mdi:flash", None], "output.current.nominal": ["Nominal Output Current", "A", "mdi:flash", None], - "output.voltage": ["Output Voltage", "V", "mdi:flash", None], - "output.voltage.nominal": ["Nominal Output Voltage", "V", "mdi:flash", None], + "output.voltage": ["Output Voltage", UNIT_VOLT, "mdi:flash", None], + "output.voltage.nominal": ["Nominal Output Voltage", UNIT_VOLT, "mdi:flash", None], "output.frequency": ["Output Frequency", "hz", "mdi:flash", None], "output.frequency.nominal": ["Nominal Output Frequency", "hz", "mdi:flash", None], } diff --git a/homeassistant/components/onewire/sensor.py b/homeassistant/components/onewire/sensor.py index 90d943dd755f..d38c115c9d4c 100644 --- a/homeassistant/components/onewire/sensor.py +++ b/homeassistant/components/onewire/sensor.py @@ -8,7 +8,13 @@ from pyownet import protocol import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_HOST, CONF_PORT, TEMP_CELSIUS, UNIT_PERCENTAGE +from homeassistant.const import ( + CONF_HOST, + CONF_PORT, + TEMP_CELSIUS, + UNIT_PERCENTAGE, + UNIT_VOLT, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -75,9 +81,9 @@ SENSOR_TYPES = { "counter_a": ["counter", "count"], "counter_b": ["counter", "count"], "HobbyBoard": ["none", "none"], - "voltage": ["voltage", "V"], - "voltage_VAD": ["voltage", "V"], - "voltage_VDD": ["voltage", "V"], + "voltage": ["voltage", UNIT_VOLT], + "voltage_VAD": ["voltage", UNIT_VOLT], + "voltage_VDD": ["voltage", UNIT_VOLT], "current": ["current", "A"], } diff --git a/homeassistant/components/smappee/sensor.py b/homeassistant/components/smappee/sensor.py index 8f1e034dcacb..5948f7e42231 100644 --- a/homeassistant/components/smappee/sensor.py +++ b/homeassistant/components/smappee/sensor.py @@ -6,6 +6,7 @@ from homeassistant.const import ( ENERGY_KILO_WATT_HOUR, POWER_WATT, UNIT_PERCENTAGE, + UNIT_VOLT, VOLUME_CUBIC_METERS, ) from homeassistant.helpers.entity import Entity @@ -25,7 +26,7 @@ SENSOR_TYPES = { "active_power", ], "current": ["Current", "mdi:gauge", "local", "A", "current"], - "voltage": ["Voltage", "mdi:gauge", "local", "V", "voltage"], + "voltage": ["Voltage", "mdi:gauge", "local", UNIT_VOLT, "voltage"], "active_cosfi": [ "Power Factor", "mdi:gauge", diff --git a/homeassistant/components/smartthings/sensor.py b/homeassistant/components/smartthings/sensor.py index 630fbaadd3a4..da581bb969ef 100644 --- a/homeassistant/components/smartthings/sensor.py +++ b/homeassistant/components/smartthings/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE, + UNIT_VOLT, ) from . import SmartThingsEntity @@ -233,7 +234,7 @@ CAPABILITY_TO_SENSORS = { Map(Attribute.ultraviolet_index, "Ultraviolet Index", None, None) ], Capability.voltage_measurement: [ - Map(Attribute.voltage, "Voltage Measurement", "V", None) + Map(Attribute.voltage, "Voltage Measurement", UNIT_VOLT, None) ], Capability.washer_mode: [Map(Attribute.washer_mode, "Washer Mode", None, None)], Capability.washer_operating_state: [ diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py index ecf9dfde8b15..8d1b7262fc08 100644 --- a/homeassistant/components/solaredge_local/sensor.py +++ b/homeassistant/components/solaredge_local/sensor.py @@ -16,6 +16,7 @@ from homeassistant.const import ( POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_VOLT, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -40,8 +41,20 @@ INVERTER_MODES = ( # Supported sensor types: # Key: ['json_key', 'name', unit, icon, attribute name] SENSOR_TYPES = { - "current_AC_voltage": ["gridvoltage", "Grid Voltage", "V", "mdi:current-ac", None], - "current_DC_voltage": ["dcvoltage", "DC Voltage", "V", "mdi:current-dc", None], + "current_AC_voltage": [ + "gridvoltage", + "Grid Voltage", + UNIT_VOLT, + "mdi:current-ac", + None, + ], + "current_DC_voltage": [ + "dcvoltage", + "DC Voltage", + UNIT_VOLT, + "mdi:current-dc", + None, + ], "current_frequency": [ "gridfrequency", "Grid Frequency", @@ -122,7 +135,7 @@ SENSOR_TYPES = { "optimizer_voltage": [ "optimizervoltage", "Average Optimizer Voltage", - "V", + UNIT_VOLT, "mdi:solar-panel", None, ], diff --git a/homeassistant/components/solarlog/const.py b/homeassistant/components/solarlog/const.py index 26176e97e46c..b8512531f36a 100644 --- a/homeassistant/components/solarlog/const.py +++ b/homeassistant/components/solarlog/const.py @@ -1,7 +1,12 @@ """Constants for the Solar-Log integration.""" from datetime import timedelta -from homeassistant.const import ENERGY_KILO_WATT_HOUR, POWER_WATT, UNIT_PERCENTAGE +from homeassistant.const import ( + ENERGY_KILO_WATT_HOUR, + POWER_WATT, + UNIT_PERCENTAGE, + UNIT_VOLT, +) DOMAIN = "solarlog" @@ -17,8 +22,8 @@ SENSOR_TYPES = { "time": ["TIME", "last update", None, "mdi:calendar-clock"], "power_ac": ["powerAC", "power AC", POWER_WATT, "mdi:solar-power"], "power_dc": ["powerDC", "power DC", POWER_WATT, "mdi:solar-power"], - "voltage_ac": ["voltageAC", "voltage AC", "V", "mdi:flash"], - "voltage_dc": ["voltageDC", "voltage DC", "V", "mdi:flash"], + "voltage_ac": ["voltageAC", "voltage AC", UNIT_VOLT, "mdi:flash"], + "voltage_dc": ["voltageDC", "voltage DC", UNIT_VOLT, "mdi:flash"], "yield_day": ["yieldDAY", "yield day", ENERGY_KILO_WATT_HOUR, "mdi:solar-power"], "yield_yesterday": [ "yieldYESTERDAY", diff --git a/homeassistant/components/starline/sensor.py b/homeassistant/components/starline/sensor.py index 8e17caad86ce..09642e664794 100644 --- a/homeassistant/components/starline/sensor.py +++ b/homeassistant/components/starline/sensor.py @@ -1,6 +1,6 @@ """Reads vehicle status from StarLine API.""" from homeassistant.components.sensor import DEVICE_CLASS_TEMPERATURE -from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE +from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE, UNIT_VOLT from homeassistant.helpers.entity import Entity from homeassistant.helpers.icon import icon_for_battery_level, icon_for_signal_level @@ -9,7 +9,7 @@ from .const import DOMAIN from .entity import StarlineEntity SENSOR_TYPES = { - "battery": ["Battery", None, "V", None], + "battery": ["Battery", None, UNIT_VOLT, None], "balance": ["Balance", None, None, "mdi:cash-multiple"], "ctemp": ["Interior Temperature", DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None], "etemp": ["Engine Temperature", DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, None], diff --git a/homeassistant/components/ted5000/sensor.py b/homeassistant/components/ted5000/sensor.py index 2e6246d06ddb..3982c7f0d046 100644 --- a/homeassistant/components/ted5000/sensor.py +++ b/homeassistant/components/ted5000/sensor.py @@ -7,7 +7,7 @@ import voluptuous as vol import xmltodict from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, POWER_WATT +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, POWER_WATT, UNIT_VOLT from homeassistant.helpers import config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -43,7 +43,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): dev = [] for mtu in gateway.data: dev.append(Ted5000Sensor(gateway, name, mtu, POWER_WATT)) - dev.append(Ted5000Sensor(gateway, name, mtu, "V")) + dev.append(Ted5000Sensor(gateway, name, mtu, UNIT_VOLT)) add_entities(dev) return True @@ -54,7 +54,7 @@ class Ted5000Sensor(Entity): def __init__(self, gateway, name, mtu, unit): """Initialize the sensor.""" - units = {POWER_WATT: "power", "V": "voltage"} + units = {POWER_WATT: "power", UNIT_VOLT: "voltage"} self._gateway = gateway self._name = "{} mtu{} {}".format(name, mtu, units[unit]) self._mtu = mtu @@ -108,4 +108,4 @@ class Ted5000Gateway: power = int(doc["LiveData"]["Power"]["MTU%d" % mtu]["PowerNow"]) voltage = int(doc["LiveData"]["Voltage"]["MTU%d" % mtu]["VoltageNow"]) - self.data[mtu] = {POWER_WATT: power, "V": voltage / 10} + self.data[mtu] = {POWER_WATT: power, UNIT_VOLT: voltage / 10} diff --git a/homeassistant/components/wirelesstag/__init__.py b/homeassistant/components/wirelesstag/__init__.py index 7296179a126f..335b24b85574 100644 --- a/homeassistant/components/wirelesstag/__init__.py +++ b/homeassistant/components/wirelesstag/__init__.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, UNIT_PERCENTAGE, + UNIT_VOLT, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import dispatcher_send @@ -280,7 +281,7 @@ class WirelessTagBaseSensor(Entity): """Return the state attributes.""" return { ATTR_BATTERY_LEVEL: int(self._tag.battery_remaining * 100), - ATTR_VOLTAGE: f"{self._tag.battery_volts:.2f}V", + ATTR_VOLTAGE: f"{self._tag.battery_volts:.2f}{UNIT_VOLT}", ATTR_TAG_SIGNAL_STRENGTH: f"{self._tag.signal_strength}dBm", ATTR_TAG_OUT_OF_RANGE: not self._tag.is_in_range, ATTR_TAG_POWER_CONSUMPTION: f"{self._tag.power_consumption:.2f}{UNIT_PERCENTAGE}", diff --git a/homeassistant/const.py b/homeassistant/const.py index 42b944e9fb3e..d69f0370720a 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -345,6 +345,9 @@ ATTR_TEMPERATURE = "temperature" # Power units POWER_WATT = "W" +# Voltage units +UNIT_VOLT = "V" + # Energy units ENERGY_KILO_WATT_HOUR = "kWh" ENERGY_WATT_HOUR = "Wh" diff --git a/tests/components/sma/test_sensor.py b/tests/components/sma/test_sensor.py index 3caf889c5222..2556a0d2e768 100644 --- a/tests/components/sma/test_sensor.py +++ b/tests/components/sma/test_sensor.py @@ -2,6 +2,7 @@ import logging from homeassistant.components.sensor import DOMAIN +from homeassistant.const import UNIT_VOLT from homeassistant.setup import async_setup_component from tests.common import assert_setup_component @@ -11,7 +12,7 @@ BASE_CFG = { "platform": "sma", "host": "1.1.1.1", "password": "", - "custom": {"my_sensor": {"key": "1234567890123", "unit": "V"}}, + "custom": {"my_sensor": {"key": "1234567890123", "unit": UNIT_VOLT}}, } From 328cadbaa23fed022ef09c6dbf503a71c84a6046 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 11 Apr 2020 02:12:39 +0200 Subject: [PATCH 303/653] Use LENGTH_KILOMETERS constant (#33976) * Use LENGTH_KILOMETERS constant * Fix tests by importing the constant directly --- homeassistant/components/bom/sensor.py | 3 ++- homeassistant/components/buienradar/sensor.py | 3 ++- homeassistant/components/darksky/sensor.py | 13 +++++++------ homeassistant/components/demo/geo_location.py | 4 ++-- .../components/geo_json_events/geo_location.py | 4 ++-- homeassistant/components/geo_rss_events/sensor.py | 3 ++- .../components/ign_sismologia/geo_location.py | 4 ++-- homeassistant/components/isy994/sensor.py | 3 ++- homeassistant/components/metoffice/sensor.py | 3 ++- .../nsw_rural_fire_service_feed/geo_location.py | 4 ++-- homeassistant/components/proximity/__init__.py | 9 +++++++-- .../components/qld_bushfire/geo_location.py | 4 ++-- .../usgs_earthquakes_feed/geo_location.py | 3 ++- tests/components/demo/test_geo_location.py | 7 ++----- tests/components/gdacs/test_geo_location.py | 7 ++++--- .../components/geo_json_events/test_geo_location.py | 7 ++++--- .../components/geonetnz_quakes/test_geo_location.py | 7 ++++--- .../components/ign_sismologia/test_geo_location.py | 7 ++++--- .../test_geo_location.py | 7 ++++--- tests/components/qld_bushfire/test_geo_location.py | 7 ++++--- .../usgs_earthquakes_feed/test_geo_location.py | 7 ++++--- 21 files changed, 66 insertions(+), 50 deletions(-) diff --git a/homeassistant/components/bom/sensor.py b/homeassistant/components/bom/sensor.py index 5ecd9c1009f1..8386409d3ead 100644 --- a/homeassistant/components/bom/sensor.py +++ b/homeassistant/components/bom/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_MONITORED_CONDITIONS, CONF_NAME, + LENGTH_KILOMETERS, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, UNIT_PERCENTAGE, @@ -74,7 +75,7 @@ SENSOR_TYPES = { "swell_dir_worded": ["Swell Direction", None], "swell_height": ["Swell Height", "m"], "swell_period": ["Swell Period", None], - "vis_km": ["Visability km", "km"], + "vis_km": [f"Visability {LENGTH_KILOMETERS}", LENGTH_KILOMETERS], "weather": ["Weather", None], "wind_dir": ["Wind Direction", None], "wind_spd_kmh": ["Wind Speed kmh", SPEED_KILOMETERS_PER_HOUR], diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index ddaeec94228b..de7dd04a48ef 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -28,6 +28,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, IRRADIATION_WATTS_PER_SQUARE_METER, + LENGTH_KILOMETERS, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, TIME_HOURS, @@ -77,7 +78,7 @@ SENSOR_TYPES = { "winddirection": ["Wind direction", None, "mdi:compass-outline"], "windazimuth": ["Wind direction azimuth", "°", "mdi:compass-outline"], "pressure": ["Pressure", "hPa", "mdi:gauge"], - "visibility": ["Visibility", "km", None], + "visibility": ["Visibility", LENGTH_KILOMETERS, None], "windgust": ["Wind gust", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"], "precipitation": ["Precipitation", f"mm/{TIME_HOURS}", "mdi:weather-pouring"], "irradiance": ["Irradiance", IRRADIATION_WATTS_PER_SQUARE_METER, "mdi:sunglasses"], diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index c2f6ee83396b..d372811edd8d 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -15,6 +15,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_SCAN_INTERVAL, + LENGTH_KILOMETERS, SPEED_KILOMETERS_PER_HOUR, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, @@ -76,10 +77,10 @@ SENSOR_TYPES = { ], "nearest_storm_distance": [ "Nearest Storm Distance", - "km", + LENGTH_KILOMETERS, "mi", - "km", - "km", + LENGTH_KILOMETERS, + LENGTH_KILOMETERS, "mi", "mdi:weather-lightning", ["currently"], @@ -226,10 +227,10 @@ SENSOR_TYPES = { ], "visibility": [ "Visibility", - "km", + LENGTH_KILOMETERS, "mi", - "km", - "km", + LENGTH_KILOMETERS, + LENGTH_KILOMETERS, "mi", "mdi:eye", ["currently", "hourly", "daily"], diff --git a/homeassistant/components/demo/geo_location.py b/homeassistant/components/demo/geo_location.py index 6fc8e9c2e89f..76dea52e8466 100644 --- a/homeassistant/components/demo/geo_location.py +++ b/homeassistant/components/demo/geo_location.py @@ -6,12 +6,12 @@ import random from typing import Optional from homeassistant.components.geo_location import GeolocationEvent +from homeassistant.const import LENGTH_KILOMETERS from homeassistant.helpers.event import track_time_interval _LOGGER = logging.getLogger(__name__) AVG_KM_PER_DEGREE = 111.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" DEFAULT_UPDATE_INTERVAL = timedelta(minutes=1) MAX_RADIUS_IN_KM = 50 NUMBER_OF_DEMO_DEVICES = 5 @@ -71,7 +71,7 @@ class DemoManager: event_name = random.choice(EVENT_NAMES) return DemoGeolocationEvent( - event_name, radius_in_km, latitude, longitude, DEFAULT_UNIT_OF_MEASUREMENT + event_name, radius_in_km, latitude, longitude, LENGTH_KILOMETERS ) def _init_regular_updates(self): diff --git a/homeassistant/components/geo_json_events/geo_location.py b/homeassistant/components/geo_json_events/geo_location.py index 3435fcc50cf4..2fd8466cc198 100644 --- a/homeassistant/components/geo_json_events/geo_location.py +++ b/homeassistant/components/geo_json_events/geo_location.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_SCAN_INTERVAL, CONF_URL, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -25,7 +26,6 @@ _LOGGER = logging.getLogger(__name__) ATTR_EXTERNAL_ID = "external_id" DEFAULT_RADIUS_IN_KM = 20.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" SCAN_INTERVAL = timedelta(minutes=5) @@ -198,7 +198,7 @@ class GeoJsonLocationEvent(GeolocationEvent): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return DEFAULT_UNIT_OF_MEASUREMENT + return LENGTH_KILOMETERS @property def device_state_attributes(self): diff --git a/homeassistant/components/geo_rss_events/sensor.py b/homeassistant/components/geo_rss_events/sensor.py index 22f02a4218c5..5a11136fd431 100644 --- a/homeassistant/components/geo_rss_events/sensor.py +++ b/homeassistant/components/geo_rss_events/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( CONF_RADIUS, CONF_UNIT_OF_MEASUREMENT, CONF_URL, + LENGTH_KILOMETERS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -152,7 +153,7 @@ class GeoRssServiceSensor(Entity): # And now compute the attributes from the filtered events. matrix = {} for entry in feed_entries: - matrix[entry.title] = f"{entry.distance_to_home:.0f}km" + matrix[entry.title] = f"{entry.distance_to_home:.0f}{LENGTH_KILOMETERS}" self._state_attributes = matrix elif status == UPDATE_OK_NO_DATA: _LOGGER.debug("Update successful, but no data received from %s", self._feed) diff --git a/homeassistant/components/ign_sismologia/geo_location.py b/homeassistant/components/ign_sismologia/geo_location.py index 21e8e1c7412f..6ed3af285a32 100644 --- a/homeassistant/components/ign_sismologia/geo_location.py +++ b/homeassistant/components/ign_sismologia/geo_location.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_RADIUS, CONF_SCAN_INTERVAL, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -33,7 +34,6 @@ CONF_MINIMUM_MAGNITUDE = "minimum_magnitude" DEFAULT_MINIMUM_MAGNITUDE = 0.0 DEFAULT_RADIUS_IN_KM = 50.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" SCAN_INTERVAL = timedelta(minutes=5) @@ -235,7 +235,7 @@ class IgnSismologiaLocationEvent(GeolocationEvent): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return DEFAULT_UNIT_OF_MEASUREMENT + return LENGTH_KILOMETERS @property def device_state_attributes(self): diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index a21b484ec9b6..47b9fc1d633a 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -5,6 +5,7 @@ from typing import Callable from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, + LENGTH_KILOMETERS, POWER_WATT, SPEED_KILOMETERS_PER_HOUR, SPEED_METERS_PER_SECOND, @@ -99,7 +100,7 @@ UOM_FRIENDLY_NAME = { "76": "Wind Direction (°)", "77": TIME_YEARS, "82": "mm", - "83": "km", + "83": LENGTH_KILOMETERS, "85": "ohm", "86": "kOhm", "87": "m³/m³", diff --git a/homeassistant/components/metoffice/sensor.py b/homeassistant/components/metoffice/sensor.py index d04f7c5f5822..0682c458792f 100644 --- a/homeassistant/components/metoffice/sensor.py +++ b/homeassistant/components/metoffice/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_MONITORED_CONDITIONS, CONF_NAME, + LENGTH_KILOMETERS, SPEED_MILES_PER_HOUR, TEMP_CELSIUS, UNIT_PERCENTAGE, @@ -70,7 +71,7 @@ SENSOR_TYPES = { "wind_direction": ["Wind Direction", None], "wind_gust": ["Wind Gust", SPEED_MILES_PER_HOUR], "visibility": ["Visibility", None], - "visibility_distance": ["Visibility Distance", "km"], + "visibility_distance": ["Visibility Distance", LENGTH_KILOMETERS], "uv": ["UV", None], "precipitation": ["Probability of Precipitation", UNIT_PERCENTAGE], "humidity": ["Humidity", UNIT_PERCENTAGE], diff --git a/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py b/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py index f0d8c9013875..c8eda3690efb 100644 --- a/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py +++ b/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_SCAN_INTERVAL, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, + LENGTH_KILOMETERS, ) from homeassistant.core import callback from homeassistant.helpers import aiohttp_client, config_validation as cv @@ -41,7 +42,6 @@ ATTR_TYPE = "type" CONF_CATEGORIES = "categories" DEFAULT_RADIUS_IN_KM = 20.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" SCAN_INTERVAL = timedelta(minutes=5) @@ -281,7 +281,7 @@ class NswRuralFireServiceLocationEvent(GeolocationEvent): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return DEFAULT_UNIT_OF_MEASUREMENT + return LENGTH_KILOMETERS @property def device_state_attributes(self): diff --git a/homeassistant/components/proximity/__init__.py b/homeassistant/components/proximity/__init__.py index 0182f6bc0725..3509b1ba8e17 100644 --- a/homeassistant/components/proximity/__init__.py +++ b/homeassistant/components/proximity/__init__.py @@ -3,7 +3,12 @@ import logging import voluptuous as vol -from homeassistant.const import CONF_DEVICES, CONF_UNIT_OF_MEASUREMENT, CONF_ZONE +from homeassistant.const import ( + CONF_DEVICES, + CONF_UNIT_OF_MEASUREMENT, + CONF_ZONE, + LENGTH_KILOMETERS, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_state_change @@ -28,7 +33,7 @@ DEFAULT_PROXIMITY_ZONE = "home" DEFAULT_TOLERANCE = 1 DOMAIN = "proximity" -UNITS = ["km", "m", "mi", "ft"] +UNITS = [LENGTH_KILOMETERS, "m", "mi", "ft"] ZONE_SCHEMA = vol.Schema( { diff --git a/homeassistant/components/qld_bushfire/geo_location.py b/homeassistant/components/qld_bushfire/geo_location.py index 8ae80ca9027a..8efb1a32705e 100644 --- a/homeassistant/components/qld_bushfire/geo_location.py +++ b/homeassistant/components/qld_bushfire/geo_location.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_RADIUS, CONF_SCAN_INTERVAL, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -31,7 +32,6 @@ ATTR_UPDATED_DATE = "updated_date" CONF_CATEGORIES = "categories" DEFAULT_RADIUS_IN_KM = 20.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" SCAN_INTERVAL = timedelta(minutes=5) @@ -231,7 +231,7 @@ class QldBushfireLocationEvent(GeolocationEvent): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return DEFAULT_UNIT_OF_MEASUREMENT + return LENGTH_KILOMETERS @property def device_state_attributes(self): diff --git a/homeassistant/components/usgs_earthquakes_feed/geo_location.py b/homeassistant/components/usgs_earthquakes_feed/geo_location.py index 37934db30525..af9e82adf496 100644 --- a/homeassistant/components/usgs_earthquakes_feed/geo_location.py +++ b/homeassistant/components/usgs_earthquakes_feed/geo_location.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_RADIUS, CONF_SCAN_INTERVAL, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -38,7 +39,7 @@ CONF_MINIMUM_MAGNITUDE = "minimum_magnitude" DEFAULT_MINIMUM_MAGNITUDE = 0.0 DEFAULT_RADIUS_IN_KM = 50.0 -DEFAULT_UNIT_OF_MEASUREMENT = "km" +DEFAULT_UNIT_OF_MEASUREMENT = LENGTH_KILOMETERS SCAN_INTERVAL = timedelta(minutes=5) diff --git a/tests/components/demo/test_geo_location.py b/tests/components/demo/test_geo_location.py index b7b11a7b46d4..5d5f2fc81065 100644 --- a/tests/components/demo/test_geo_location.py +++ b/tests/components/demo/test_geo_location.py @@ -4,10 +4,10 @@ from unittest.mock import patch from homeassistant.components import geo_location from homeassistant.components.demo.geo_location import ( - DEFAULT_UNIT_OF_MEASUREMENT, DEFAULT_UPDATE_INTERVAL, NUMBER_OF_DEMO_DEVICES, ) +from homeassistant.const import LENGTH_KILOMETERS from homeassistant.setup import setup_component import homeassistant.util.dt as dt_util @@ -60,10 +60,7 @@ class TestDemoPlatform(unittest.TestCase): abs(state.attributes["longitude"] - self.hass.config.longitude) < 1.0 ) - assert ( - state.attributes["unit_of_measurement"] - == DEFAULT_UNIT_OF_MEASUREMENT - ) + assert state.attributes["unit_of_measurement"] == LENGTH_KILOMETERS # Update (replaces 1 device). fire_time_changed(self.hass, utcnow + DEFAULT_UPDATE_INTERVAL) diff --git a/tests/components/gdacs/test_geo_location.py b/tests/components/gdacs/test_geo_location.py index 255a2c50946a..3b49fe2af71a 100644 --- a/tests/components/gdacs/test_geo_location.py +++ b/tests/components/gdacs/test_geo_location.py @@ -28,6 +28,7 @@ from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, CONF_RADIUS, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.helpers.entity_registry import async_get_registry from homeassistant.setup import async_setup_component @@ -124,7 +125,7 @@ async def test_setup(hass): ATTR_EVENT_TYPE: "Drought", ATTR_SEVERITY: "Severity 1", ATTR_VULNERABILITY: "Vulnerability 1", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "gdacs", ATTR_ICON: "mdi:water-off", } @@ -140,7 +141,7 @@ async def test_setup(hass): ATTR_FRIENDLY_NAME: "Tropical Cyclone: Name 2", ATTR_DESCRIPTION: "Description 2", ATTR_EVENT_TYPE: "Tropical Cyclone", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "gdacs", ATTR_ICON: "mdi:weather-hurricane", } @@ -157,7 +158,7 @@ async def test_setup(hass): ATTR_DESCRIPTION: "Description 3", ATTR_EVENT_TYPE: "Tropical Cyclone", ATTR_COUNTRY: "Country 2", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "gdacs", ATTR_ICON: "mdi:weather-hurricane", } diff --git a/tests/components/geo_json_events/test_geo_location.py b/tests/components/geo_json_events/test_geo_location.py index 8bfbed52a117..e10125f84ac6 100644 --- a/tests/components/geo_json_events/test_geo_location.py +++ b/tests/components/geo_json_events/test_geo_location.py @@ -17,6 +17,7 @@ from homeassistant.const import ( CONF_RADIUS, CONF_URL, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.helpers.dispatcher import DATA_DISPATCHER from homeassistant.setup import async_setup_component @@ -89,7 +90,7 @@ async def test_setup(hass): ATTR_LATITUDE: -31.0, ATTR_LONGITUDE: 150.0, ATTR_FRIENDLY_NAME: "Title 1", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geo_json_events", } assert round(abs(float(state.state) - 15.5), 7) == 0 @@ -102,7 +103,7 @@ async def test_setup(hass): ATTR_LATITUDE: -31.1, ATTR_LONGITUDE: 150.1, ATTR_FRIENDLY_NAME: "Title 2", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geo_json_events", } assert round(abs(float(state.state) - 20.5), 7) == 0 @@ -115,7 +116,7 @@ async def test_setup(hass): ATTR_LATITUDE: -31.2, ATTR_LONGITUDE: 150.2, ATTR_FRIENDLY_NAME: "Title 3", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geo_json_events", } assert round(abs(float(state.state) - 25.5), 7) == 0 diff --git a/tests/components/geonetnz_quakes/test_geo_location.py b/tests/components/geonetnz_quakes/test_geo_location.py index 062442277260..0264baa8e87e 100644 --- a/tests/components/geonetnz_quakes/test_geo_location.py +++ b/tests/components/geonetnz_quakes/test_geo_location.py @@ -24,6 +24,7 @@ from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, CONF_RADIUS, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.helpers.entity_registry import async_get_registry from homeassistant.setup import async_setup_component @@ -94,7 +95,7 @@ async def test_setup(hass): ATTR_DEPTH: 10.5, ATTR_MMI: 5, ATTR_QUALITY: "best", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geonetnz_quakes", ATTR_ICON: "mdi:pulse", } @@ -109,7 +110,7 @@ async def test_setup(hass): ATTR_LONGITUDE: -3.1, ATTR_FRIENDLY_NAME: "Title 2", ATTR_MAGNITUDE: 4.6, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geonetnz_quakes", ATTR_ICON: "mdi:pulse", } @@ -124,7 +125,7 @@ async def test_setup(hass): ATTR_LONGITUDE: -3.2, ATTR_FRIENDLY_NAME: "Title 3", ATTR_LOCALITY: "Locality 3", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "geonetnz_quakes", ATTR_ICON: "mdi:pulse", } diff --git a/tests/components/ign_sismologia/test_geo_location.py b/tests/components/ign_sismologia/test_geo_location.py index 0f0191f3b828..c2bd357ecc80 100644 --- a/tests/components/ign_sismologia/test_geo_location.py +++ b/tests/components/ign_sismologia/test_geo_location.py @@ -24,6 +24,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_RADIUS, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -126,7 +127,7 @@ async def test_setup(hass): ), ATTR_IMAGE_URL: "http://image.url/map.jpg", ATTR_MAGNITUDE: 5.7, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "ign_sismologia", ATTR_ICON: "mdi:pulse", } @@ -142,7 +143,7 @@ async def test_setup(hass): ATTR_FRIENDLY_NAME: "M 4.6", ATTR_TITLE: "Title 2", ATTR_MAGNITUDE: 4.6, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "ign_sismologia", ATTR_ICON: "mdi:pulse", } @@ -158,7 +159,7 @@ async def test_setup(hass): ATTR_FRIENDLY_NAME: "Region 3", ATTR_TITLE: "Title 3", ATTR_REGION: "Region 3", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "ign_sismologia", ATTR_ICON: "mdi:pulse", } diff --git a/tests/components/nsw_rural_fire_service_feed/test_geo_location.py b/tests/components/nsw_rural_fire_service_feed/test_geo_location.py index 1915706ca1ad..6834c557bd51 100644 --- a/tests/components/nsw_rural_fire_service_feed/test_geo_location.py +++ b/tests/components/nsw_rural_fire_service_feed/test_geo_location.py @@ -32,6 +32,7 @@ from homeassistant.const import ( CONF_RADIUS, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, + LENGTH_KILOMETERS, ) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -154,7 +155,7 @@ async def test_setup(hass): ATTR_TYPE: "Type 1", ATTR_SIZE: "Size 1", ATTR_RESPONSIBLE_AGENCY: "Agency 1", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "nsw_rural_fire_service_feed", ATTR_ICON: "mdi:fire", } @@ -169,7 +170,7 @@ async def test_setup(hass): ATTR_LONGITUDE: 150.1, ATTR_FRIENDLY_NAME: "Title 2", ATTR_FIRE: False, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "nsw_rural_fire_service_feed", ATTR_ICON: "mdi:alarm-light", } @@ -184,7 +185,7 @@ async def test_setup(hass): ATTR_LONGITUDE: 150.2, ATTR_FRIENDLY_NAME: "Title 3", ATTR_FIRE: True, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "nsw_rural_fire_service_feed", ATTR_ICON: "mdi:fire", } diff --git a/tests/components/qld_bushfire/test_geo_location.py b/tests/components/qld_bushfire/test_geo_location.py index ad9bdd7c5363..afcd2f118025 100644 --- a/tests/components/qld_bushfire/test_geo_location.py +++ b/tests/components/qld_bushfire/test_geo_location.py @@ -23,6 +23,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_RADIUS, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -122,7 +123,7 @@ async def test_setup(hass): 2018, 9, 22, 8, 10, tzinfo=datetime.timezone.utc ), ATTR_STATUS: "Status 1", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "qld_bushfire", ATTR_ICON: "mdi:fire", } @@ -136,7 +137,7 @@ async def test_setup(hass): ATTR_LATITUDE: 38.1, ATTR_LONGITUDE: -3.1, ATTR_FRIENDLY_NAME: "Title 2", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "qld_bushfire", ATTR_ICON: "mdi:fire", } @@ -150,7 +151,7 @@ async def test_setup(hass): ATTR_LATITUDE: 38.2, ATTR_LONGITUDE: -3.2, ATTR_FRIENDLY_NAME: "Title 3", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "qld_bushfire", ATTR_ICON: "mdi:fire", } diff --git a/tests/components/usgs_earthquakes_feed/test_geo_location.py b/tests/components/usgs_earthquakes_feed/test_geo_location.py index 646878c97bde..4823d2eb2da7 100644 --- a/tests/components/usgs_earthquakes_feed/test_geo_location.py +++ b/tests/components/usgs_earthquakes_feed/test_geo_location.py @@ -27,6 +27,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_RADIUS, EVENT_HOMEASSISTANT_START, + LENGTH_KILOMETERS, ) from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -148,7 +149,7 @@ async def test_setup(hass): ATTR_TYPE: "Type 1", ATTR_ALERT: "Alert 1", ATTR_MAGNITUDE: 5.7, - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "usgs_earthquakes_feed", ATTR_ICON: "mdi:pulse", } @@ -162,7 +163,7 @@ async def test_setup(hass): ATTR_LATITUDE: -31.1, ATTR_LONGITUDE: 150.1, ATTR_FRIENDLY_NAME: "Title 2", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "usgs_earthquakes_feed", ATTR_ICON: "mdi:pulse", } @@ -176,7 +177,7 @@ async def test_setup(hass): ATTR_LATITUDE: -31.2, ATTR_LONGITUDE: 150.2, ATTR_FRIENDLY_NAME: "Title 3", - ATTR_UNIT_OF_MEASUREMENT: "km", + ATTR_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS, ATTR_SOURCE: "usgs_earthquakes_feed", ATTR_ICON: "mdi:pulse", } From 5ea4a68aae382d3486e76a474e24d0db7f59119a Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Fri, 10 Apr 2020 20:45:38 -0400 Subject: [PATCH 304/653] Cleanup ZHA metering and electrical measurement channels (#33992) * clean up homeautomation and smartenergy channels * fix get attributes on base channel --- .../components/zha/core/channels/base.py | 6 +++- .../zha/core/channels/homeautomation.py | 30 +++++++----------- .../zha/core/channels/smartenergy.py | 31 ++++++++++--------- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/zha/core/channels/base.py b/homeassistant/components/zha/core/channels/base.py index 8478c2b9c491..995d109941d8 100644 --- a/homeassistant/components/zha/core/channels/base.py +++ b/homeassistant/components/zha/core/channels/base.py @@ -263,7 +263,11 @@ class ZigbeeChannel(LogMixin): only_cache=from_cache, manufacturer=manufacturer, ) - results = {attribute: result.get(attribute) for attribute in attributes} + results = { + attribute: result.get(attribute) + for attribute in attributes + if result.get(attribute) is not None + } except (asyncio.TimeoutError, zigpy.exceptions.DeliveryError) as ex: self.debug( "failed to get attributes '%s' on '%s' cluster: %s", diff --git a/homeassistant/components/zha/core/channels/homeautomation.py b/homeassistant/components/zha/core/channels/homeautomation.py index c867fdc621d1..b295a567b3dc 100644 --- a/homeassistant/components/zha/core/channels/homeautomation.py +++ b/homeassistant/components/zha/core/channels/homeautomation.py @@ -81,27 +81,19 @@ class ElectricalMeasurementChannel(ZigbeeChannel): async def fetch_config(self, from_cache): """Fetch config from device and updates format specifier.""" - divisor = await self.get_attribute_value( - "ac_power_divisor", from_cache=from_cache + results = await self.get_attributes( + [ + "ac_power_divisor", + "power_divisor", + "ac_power_multiplier", + "power_multiplier", + ], + from_cache=from_cache, ) - if divisor is None: - divisor = await self.get_attribute_value( - "power_divisor", from_cache=from_cache - ) - if divisor is None: - divisor = 1 - self._divisor = divisor - - mult = await self.get_attribute_value( - "ac_power_multiplier", from_cache=from_cache + self._divisor = results.get("ac_power_divisor", results.get("power_divisor", 1)) + self._multiplier = results.get( + "ac_power_multiplier", results.get("power_multiplier", 1) ) - if mult is None: - mult = await self.get_attribute_value( - "power_multiplier", from_cache=from_cache - ) - if mult is None: - mult = 1 - self._multiplier = mult @property def divisor(self) -> Optional[int]: diff --git a/homeassistant/components/zha/core/channels/smartenergy.py b/homeassistant/components/zha/core/channels/smartenergy.py index 4226aad3f0a5..58a394e7c801 100644 --- a/homeassistant/components/zha/core/channels/smartenergy.py +++ b/homeassistant/components/zha/core/channels/smartenergy.py @@ -98,6 +98,8 @@ class Metering(ZigbeeChannel): @callback def attribute_updated(self, attrid, value): """Handle attribute update from Metering cluster.""" + if None in (self._multiplier, self._divisor, self._format_spec): + return super().attribute_updated(attrid, value * self._multiplier / self._divisor) @property @@ -107,25 +109,24 @@ class Metering(ZigbeeChannel): async def fetch_config(self, from_cache): """Fetch config from device and updates format specifier.""" - self._divisor = await self.get_attribute_value("divisor", from_cache=from_cache) - self._multiplier = await self.get_attribute_value( - "multiplier", from_cache=from_cache - ) - self._unit_enum = await self.get_attribute_value( - "unit_of_measure", from_cache=from_cache - ) - fmting = await self.get_attribute_value( - "demand_formatting", from_cache=from_cache + results = await self.get_attributes( + ["divisor", "multiplier", "unit_of_measure", "demand_formatting"], + from_cache=from_cache, ) - if self._divisor is None or self._divisor == 0: + self._divisor = results.get("divisor", 1) + if self._divisor == 0: self._divisor = 1 - if self._multiplier is None or self._multiplier == 0: + + self._multiplier = results.get("multiplier", 1) + if self._multiplier == 0: self._multiplier = 1 - if self._unit_enum is None: - self._unit_enum = 0x7F # unknown - if fmting is None: - fmting = 0xF9 # 1 digit to the right, 15 digits to the left + + self._unit_enum = results.get("unit_of_measure", 0x7F) # default to unknown + + fmting = results.get( + "demand_formatting", 0xF9 + ) # 1 digit to the right, 15 digits to the left r_digits = fmting & 0x07 # digits to the right of decimal point l_digits = (fmting >> 3) & 0x0F # digits to the left of decimal point From 44f8dab0b06689060e35270bef2dac359c74607e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2020 21:41:59 -0500 Subject: [PATCH 305/653] Add changed_by to elkm1 alarm device_state_attributes (#33982) * Add last_user_name to alarm device_state_attributes changed_by_entity_id was removed in 0.108 and replaced with changed_by_keypad. This didn't provide enough data to discover the last user that changed the alarm. * Switch to changed_by and restore since we loose the attributes on restart * use built-in --- .../components/elkm1/alarm_control_panel.py | 42 +++++++++++++++++-- homeassistant/components/elkm1/const.py | 5 +++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/elkm1/alarm_control_panel.py b/homeassistant/components/elkm1/alarm_control_panel.py index d7cd5cf2ad09..b217988f8d89 100644 --- a/homeassistant/components/elkm1/alarm_control_panel.py +++ b/homeassistant/components/elkm1/alarm_control_panel.py @@ -2,9 +2,11 @@ import logging from elkm1_lib.const import AlarmState, ArmedStatus, ArmLevel, ArmUpState +from elkm1_lib.util import username import voluptuous as vol from homeassistant.components.alarm_control_panel import ( + ATTR_CHANGED_BY, FORMAT_NUMBER, AlarmControlPanel, ) @@ -26,6 +28,7 @@ from homeassistant.const import ( ) from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.restore_state import RestoreEntity from . import ( SERVICE_ALARM_ARM_HOME_INSTANT, @@ -35,7 +38,12 @@ from . import ( ElkAttachedEntity, create_elk_entities, ) -from .const import DOMAIN +from .const import ( + ATTR_CHANGED_BY_ID, + ATTR_CHANGED_BY_KEYPAD, + ATTR_CHANGED_BY_TIME, + DOMAIN, +) ELK_ALARM_SERVICE_SCHEMA = vol.Schema( { @@ -101,13 +109,17 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) -class ElkArea(ElkAttachedEntity, AlarmControlPanel): +class ElkArea(ElkAttachedEntity, AlarmControlPanel, RestoreEntity): """Representation of an Area / Partition within the ElkM1 alarm panel.""" def __init__(self, element, elk, elk_data): """Initialize Area as Alarm Control Panel.""" super().__init__(element, elk, elk_data) + self._elk = elk self._changed_by_keypad = None + self._changed_by_time = None + self._changed_by_id = None + self._changed_by = None self._state = None async def async_added_to_hass(self): @@ -116,11 +128,28 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanel): for keypad in self._elk.keypads: keypad.add_callback(self._watch_keypad) + # We do not get changed_by back from resync. + last_state = await self.async_get_last_state() + if not last_state: + return + + if ATTR_CHANGED_BY_KEYPAD in last_state.attributes: + self._changed_by_keypad = last_state.attributes[ATTR_CHANGED_BY_KEYPAD] + if ATTR_CHANGED_BY_TIME in last_state.attributes: + self._changed_by_time = last_state.attributes[ATTR_CHANGED_BY_TIME] + if ATTR_CHANGED_BY_ID in last_state.attributes: + self._changed_by_id = last_state.attributes[ATTR_CHANGED_BY_ID] + if ATTR_CHANGED_BY in last_state.attributes: + self._changed_by = last_state.attributes[ATTR_CHANGED_BY] + def _watch_keypad(self, keypad, changeset): if keypad.area != self._element.index: return if changeset.get("last_user") is not None: self._changed_by_keypad = keypad.name + self._changed_by_time = keypad.last_user_time.isoformat() + self._changed_by_id = keypad.last_user + 1 + self._changed_by = username(self._elk, keypad.last_user) self.async_write_ha_state() @property @@ -152,9 +181,16 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanel): attrs["arm_up_state"] = ArmUpState(elmt.arm_up_state).name.lower() if elmt.alarm_state is not None: attrs["alarm_state"] = AlarmState(elmt.alarm_state).name.lower() - attrs["changed_by_keypad"] = self._changed_by_keypad + attrs[ATTR_CHANGED_BY_KEYPAD] = self._changed_by_keypad + attrs[ATTR_CHANGED_BY_TIME] = self._changed_by_time + attrs[ATTR_CHANGED_BY_ID] = self._changed_by_id return attrs + @property + def changed_by(self): + """Last change triggered by.""" + return self._changed_by + def _element_changed(self, element, changeset): elk_state_to_hass_state = { ArmedStatus.DISARMED.value: STATE_ALARM_DISARMED, diff --git a/homeassistant/components/elkm1/const.py b/homeassistant/components/elkm1/const.py index bad6d7fbcf1a..21cd6aaa97a3 100644 --- a/homeassistant/components/elkm1/const.py +++ b/homeassistant/components/elkm1/const.py @@ -29,3 +29,8 @@ ELK_ELEMENTS = { CONF_THERMOSTAT: Max.THERMOSTATS.value, CONF_ZONE: Max.ZONES.value, } + + +ATTR_CHANGED_BY_KEYPAD = "changed_by_keypad" +ATTR_CHANGED_BY_ID = "changed_by_id" +ATTR_CHANGED_BY_TIME = "changed_by_time" From c1962a4895d2e3f96d48ffa60e9720b148bebc12 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Fri, 10 Apr 2020 23:19:17 -0400 Subject: [PATCH 306/653] Read min and max mireds from ZHA lights (#33983) * implement min and max mireds * remove unnecessary else * additional light test * add test to appease the codecov god * change defaults --- .../components/zha/core/channels/lighting.py | 24 ++++++++++++++++--- homeassistant/components/zha/light.py | 17 +++++++++++-- tests/components/zha/test_discover.py | 9 +++++++ tests/components/zha/test_light.py | 9 +++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/zha/core/channels/lighting.py b/homeassistant/components/zha/core/channels/lighting.py index 9721bee90146..2b80a1092bb0 100644 --- a/homeassistant/components/zha/core/channels/lighting.py +++ b/homeassistant/components/zha/core/channels/lighting.py @@ -41,6 +41,18 @@ class ColorChannel(ZigbeeChannel): """Initialize ColorChannel.""" super().__init__(cluster, ch_pool) self._color_capabilities = None + self._min_mireds = 153 + self._max_mireds = 500 + + @property + def min_mireds(self): + """Return the coldest color_temp that this channel supports.""" + return self._min_mireds + + @property + def max_mireds(self): + """Return the warmest color_temp that this channel supports.""" + return self._max_mireds def get_color_capabilities(self): """Return the color capabilities.""" @@ -59,9 +71,15 @@ class ColorChannel(ZigbeeChannel): async def fetch_color_capabilities(self, from_cache): """Get the color configuration.""" - capabilities = await self.get_attribute_value( - "color_capabilities", from_cache=from_cache - ) + attributes = [ + "color_temp_physical_min", + "color_temp_physical_max", + "color_capabilities", + ] + results = await self.get_attributes(attributes, from_cache=from_cache) + capabilities = results.get("color_capabilities") + self._min_mireds = results.get("color_temp_physical_min", 153) + self._max_mireds = results.get("color_temp_physical_max", 500) if capabilities is None: # ZCL Version 4 devices don't support the color_capabilities diff --git a/homeassistant/components/zha/light.py b/homeassistant/components/zha/light.py index c6ec5c2ccf9e..b05e4b7bee0a 100644 --- a/homeassistant/components/zha/light.py +++ b/homeassistant/components/zha/light.py @@ -108,7 +108,7 @@ class BaseLight(LogMixin, light.Light): self._off_brightness: Optional[int] = None self._hs_color: Optional[Tuple[float, float]] = None self._color_temp: Optional[int] = None - self._min_mireds: Optional[int] = 154 + self._min_mireds: Optional[int] = 153 self._max_mireds: Optional[int] = 500 self._white_value: Optional[int] = None self._effect_list: Optional[List[str]] = None @@ -138,6 +138,16 @@ class BaseLight(LogMixin, light.Light): """Return the brightness of this light.""" return self._brightness + @property + def min_mireds(self): + """Return the coldest color_temp that this light supports.""" + return self._min_mireds + + @property + def max_mireds(self): + """Return the warmest color_temp that this light supports.""" + return self._max_mireds + def set_level(self, value): """Set the brightness of this light between 0..254. @@ -316,6 +326,9 @@ class Light(BaseLight, ZhaEntity): self._level_channel = self.cluster_channels.get(CHANNEL_LEVEL) self._color_channel = self.cluster_channels.get(CHANNEL_COLOR) self._identify_channel = self.zha_device.channels.identify_ch + if self._color_channel: + self._min_mireds: Optional[int] = self._color_channel.min_mireds + self._max_mireds: Optional[int] = self._color_channel.max_mireds self._cancel_refresh_handle = None effect_list = [] @@ -501,7 +514,7 @@ class LightGroup(BaseLight, ZhaGroupEntity): self._color_temp = helpers.reduce_attribute(on_states, ATTR_COLOR_TEMP) self._min_mireds = helpers.reduce_attribute( - states, ATTR_MIN_MIREDS, default=154, reduce=min + states, ATTR_MIN_MIREDS, default=153, reduce=min ) self._max_mireds = helpers.reduce_attribute( states, ATTR_MAX_MIREDS, default=500, reduce=max diff --git a/tests/components/zha/test_discover.py b/tests/components/zha/test_discover.py index 5996ca467f70..8b1ce502a789 100644 --- a/tests/components/zha/test_discover.py +++ b/tests/components/zha/test_discover.py @@ -392,3 +392,12 @@ async def test_device_override(hass, zigpy_device_mock, setup_zha, override, ent await zha_gateway.async_device_initialized(zigpy_device) await hass.async_block_till_done() assert hass.states.get(entity_id) is not None + + +async def test_group_probe_cleanup_called(hass, setup_zha, config_entry): + """Test cleanup happens when zha is unloaded.""" + await setup_zha() + disc.GROUP_PROBE.cleanup = mock.Mock(wraps=disc.GROUP_PROBE.cleanup) + await config_entry.async_unload(hass) + await hass.async_block_till_done() + disc.GROUP_PROBE.cleanup.assert_called() diff --git a/tests/components/zha/test_light.py b/tests/components/zha/test_light.py index f297bfa5bf0c..03c29283c20a 100644 --- a/tests/components/zha/test_light.py +++ b/tests/components/zha/test_light.py @@ -552,6 +552,15 @@ async def async_test_zha_group_light_entity( await dev3_cluster_on_off.on() assert hass.states.get(entity_id).state == STATE_ON + # add a 3rd member and ensure we still have an entity and we track the new one + await dev1_cluster_on_off.off() + await dev3_cluster_on_off.off() + assert hass.states.get(entity_id).state == STATE_OFF + # this will test that _reprobe_group is used correctly + await zha_group.async_add_members([device_light_2.ieee]) + await dev2_cluster_on_off.on() + assert hass.states.get(entity_id).state == STATE_ON + # remove the group and ensure that there is no entity and that the entity registry is cleaned up assert zha_gateway.ha_entity_registry.async_get(entity_id) is not None await zha_gateway.async_remove_zigpy_group(zha_group.group_id) From 569057c21524476f9eb7ed86eb942124094f8f38 Mon Sep 17 00:00:00 2001 From: Alexei Chetroi Date: Fri, 10 Apr 2020 23:20:05 -0400 Subject: [PATCH 307/653] Bump up zha dependencies. (#33997) --- homeassistant/components/zha/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json index 008e758c96e4..82023eb9e159 100644 --- a/homeassistant/components/zha/manifest.json +++ b/homeassistant/components/zha/manifest.json @@ -8,7 +8,7 @@ "zha-quirks==0.0.38", "zigpy-cc==0.3.1", "zigpy-deconz==0.8.0", - "zigpy-homeassistant==0.18.2", + "zigpy-homeassistant==0.19.0", "zigpy-xbee-homeassistant==0.11.0", "zigpy-zigate==0.5.1" ], diff --git a/requirements_all.txt b/requirements_all.txt index d868a86306e4..0b5cc1c4aba7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2196,7 +2196,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.2 +zigpy-homeassistant==0.19.0 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3a9b42f5635e..cfab765e201e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -821,7 +821,7 @@ zigpy-cc==0.3.1 zigpy-deconz==0.8.0 # homeassistant.components.zha -zigpy-homeassistant==0.18.2 +zigpy-homeassistant==0.19.0 # homeassistant.components.zha zigpy-xbee-homeassistant==0.11.0 From c3542f8bb2cf3acf4f87ba37ab1cf41442a56ba4 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sat, 11 Apr 2020 04:31:44 -0400 Subject: [PATCH 308/653] Vizio dependency version bump (#34002) --- homeassistant/components/vizio/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/vizio/manifest.json b/homeassistant/components/vizio/manifest.json index 02904bedbdeb..9c1f1960d741 100644 --- a/homeassistant/components/vizio/manifest.json +++ b/homeassistant/components/vizio/manifest.json @@ -2,7 +2,7 @@ "domain": "vizio", "name": "VIZIO SmartCast", "documentation": "https://www.home-assistant.io/integrations/vizio", - "requirements": ["pyvizio==0.1.46"], + "requirements": ["pyvizio==0.1.47"], "codeowners": ["@raman325"], "config_flow": true, "zeroconf": ["_viziocast._tcp.local."], diff --git a/requirements_all.txt b/requirements_all.txt index 0b5cc1c4aba7..5dcb3425bc96 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1743,7 +1743,7 @@ pyversasense==0.0.6 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.46 +pyvizio==0.1.47 # homeassistant.components.velux pyvlx==0.2.12 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index cfab765e201e..5238d0efcaef 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -661,7 +661,7 @@ pyvera==0.3.7 pyvesync==1.1.0 # homeassistant.components.vizio -pyvizio==0.1.46 +pyvizio==0.1.47 # homeassistant.components.html5 pywebpush==1.9.2 From 671e324f48ea2ec69f2eb9337f74b7863047cde2 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sat, 11 Apr 2020 04:42:56 -0400 Subject: [PATCH 309/653] update strings.json to match device name in manifest (#34003) --- homeassistant/components/vizio/strings.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/vizio/strings.json b/homeassistant/components/vizio/strings.json index 1ddcadb43900..6f9c844d5cc1 100644 --- a/homeassistant/components/vizio/strings.json +++ b/homeassistant/components/vizio/strings.json @@ -1,9 +1,9 @@ { "config": { - "title": "Vizio SmartCast", + "title": "VIZIO SmartCast", "step": { "user": { - "title": "Setup Vizio SmartCast Device", + "title": "Setup VIZIO SmartCast Device", "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", "data": { "name": "Name", @@ -21,16 +21,16 @@ }, "pairing_complete": { "title": "Pairing Complete", - "description": "Your Vizio SmartCast device is now connected to Home Assistant." + "description": "Your VIZIO SmartCast device is now connected to Home Assistant." }, "pairing_complete_import": { "title": "Pairing Complete", - "description": "Your Vizio SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'." + "description": "Your VIZIO SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'." } }, "error": { - "host_exists": "Vizio device with specified host already configured.", - "name_exists": "Vizio device with specified name already configured.", + "host_exists": "VIZIO device with specified host already configured.", + "name_exists": "VIZIO device with specified name already configured.", "complete_pairing failed": "Unable to complete pairing. Ensure the PIN you provided is correct and the TV is still powered and connected to the network before resubmitting.", "cant_connect": "Could not connect to the device. [Review the docs](https://www.home-assistant.io/integrations/vizio/) and re-verify that:\n- The device is powered on\n- The device is connected to the network\n- The values you filled in are accurate\nbefore attempting to resubmit." }, @@ -40,10 +40,10 @@ } }, "options": { - "title": "Update Vizo SmartCast Options", + "title": "Update VIZIO SmartCast Options", "step": { "init": { - "title": "Update Vizo SmartCast Options", + "title": "Update VIZIO SmartCast Options", "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", "data": { "volume_step": "Volume Step Size", From 19ce367f8856ccf8a66a4b5d831c90896dcca440 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 11:57:02 +0200 Subject: [PATCH 310/653] Upgrade TwitterAPI to 2.5.11 (#34006) --- homeassistant/components/twitter/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/twitter/manifest.json b/homeassistant/components/twitter/manifest.json index 844ed65c5c59..810487588897 100644 --- a/homeassistant/components/twitter/manifest.json +++ b/homeassistant/components/twitter/manifest.json @@ -2,6 +2,6 @@ "domain": "twitter", "name": "Twitter", "documentation": "https://www.home-assistant.io/integrations/twitter", - "requirements": ["TwitterAPI==2.5.10"], + "requirements": ["TwitterAPI==2.5.11"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 5dcb3425bc96..57a230d86672 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -95,7 +95,7 @@ RtmAPI==0.7.2 TravisPy==0.3.5 # homeassistant.components.twitter -TwitterAPI==2.5.10 +TwitterAPI==2.5.11 # homeassistant.components.tof # VL53L1X2==0.1.5 From 2dc6ba0ab4ce1aff3a5c5fa877e83501240cee32 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:47:13 +0200 Subject: [PATCH 311/653] Upgrade getmac to 0.8.2 (#34013) --- homeassistant/components/huawei_lte/manifest.json | 2 +- homeassistant/components/kef/manifest.json | 2 +- homeassistant/components/minecraft_server/manifest.json | 2 +- homeassistant/components/nmap_tracker/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/huawei_lte/manifest.json b/homeassistant/components/huawei_lte/manifest.json index d63387ce9f54..e1e91c08e9ad 100644 --- a/homeassistant/components/huawei_lte/manifest.json +++ b/homeassistant/components/huawei_lte/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/huawei_lte", "requirements": [ - "getmac==0.8.1", + "getmac==0.8.2", "huawei-lte-api==1.4.11", "stringcase==1.2.0", "url-normalize==1.4.1" diff --git a/homeassistant/components/kef/manifest.json b/homeassistant/components/kef/manifest.json index 156b495dcf8a..bb68d37707f2 100644 --- a/homeassistant/components/kef/manifest.json +++ b/homeassistant/components/kef/manifest.json @@ -3,5 +3,5 @@ "name": "KEF", "documentation": "https://www.home-assistant.io/integrations/kef", "codeowners": ["@basnijholt"], - "requirements": ["aiokef==0.2.9", "getmac==0.8.1"] + "requirements": ["aiokef==0.2.9", "getmac==0.8.2"] } diff --git a/homeassistant/components/minecraft_server/manifest.json b/homeassistant/components/minecraft_server/manifest.json index 6f50b0587622..03710520b90c 100644 --- a/homeassistant/components/minecraft_server/manifest.json +++ b/homeassistant/components/minecraft_server/manifest.json @@ -3,7 +3,7 @@ "name": "Minecraft Server", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/minecraft_server", - "requirements": ["aiodns==2.0.0", "getmac==0.8.1", "mcstatus==2.3.0"], + "requirements": ["aiodns==2.0.0", "getmac==0.8.2", "mcstatus==2.3.0"], "codeowners": ["@elmurato"], "quality_scale": "silver" } diff --git a/homeassistant/components/nmap_tracker/manifest.json b/homeassistant/components/nmap_tracker/manifest.json index 4e1d7d9a8fda..1b049b54a07b 100644 --- a/homeassistant/components/nmap_tracker/manifest.json +++ b/homeassistant/components/nmap_tracker/manifest.json @@ -2,6 +2,6 @@ "domain": "nmap_tracker", "name": "Nmap Tracker", "documentation": "https://www.home-assistant.io/integrations/nmap_tracker", - "requirements": ["python-nmap==0.6.1", "getmac==0.8.1"], + "requirements": ["python-nmap==0.6.1", "getmac==0.8.2"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 57a230d86672..3bbccd4671fb 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -607,7 +607,7 @@ georss_qld_bushfire_alert_client==0.3 # homeassistant.components.kef # homeassistant.components.minecraft_server # homeassistant.components.nmap_tracker -getmac==0.8.1 +getmac==0.8.2 # homeassistant.components.gios gios==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5238d0efcaef..e687b3d49452 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -239,7 +239,7 @@ georss_qld_bushfire_alert_client==0.3 # homeassistant.components.kef # homeassistant.components.minecraft_server # homeassistant.components.nmap_tracker -getmac==0.8.1 +getmac==0.8.2 # homeassistant.components.gios gios==0.1.1 From c6a86edd363b7b42154ed96d0f081fc60edd9e7d Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:49:57 +0200 Subject: [PATCH 312/653] Upgrade sendgrid to 6.2.1 (#34014) --- homeassistant/components/sendgrid/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sendgrid/manifest.json b/homeassistant/components/sendgrid/manifest.json index 2309ae6f526f..52717c55124e 100644 --- a/homeassistant/components/sendgrid/manifest.json +++ b/homeassistant/components/sendgrid/manifest.json @@ -2,6 +2,6 @@ "domain": "sendgrid", "name": "SendGrid", "documentation": "https://www.home-assistant.io/integrations/sendgrid", - "requirements": ["sendgrid==6.1.3"], + "requirements": ["sendgrid==6.2.1"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 3bbccd4671fb..8ec27d8425e6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1851,7 +1851,7 @@ schiene==0.23 scsgate==0.1.0 # homeassistant.components.sendgrid -sendgrid==6.1.3 +sendgrid==6.2.1 # homeassistant.components.sensehat sense-hat==2.2.0 From 52e154f881f355a6caf358be9a8f53c262d812a3 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:52:43 +0200 Subject: [PATCH 313/653] Upgrade mutagen to 1.44.0 (#34011) --- homeassistant/components/tts/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/tts/manifest.json b/homeassistant/components/tts/manifest.json index 817ca00a818d..a53357b1a2bf 100644 --- a/homeassistant/components/tts/manifest.json +++ b/homeassistant/components/tts/manifest.json @@ -2,7 +2,7 @@ "domain": "tts", "name": "Text-to-Speech (TTS)", "documentation": "https://www.home-assistant.io/integrations/tts", - "requirements": ["mutagen==1.43.0"], + "requirements": ["mutagen==1.44.0"], "dependencies": ["http"], "after_dependencies": ["media_player"], "codeowners": ["@pvizeli"] diff --git a/requirements_all.txt b/requirements_all.txt index 8ec27d8425e6..8d4234fe1122 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -890,7 +890,7 @@ minio==4.0.9 mitemp_bt==0.0.3 # homeassistant.components.tts -mutagen==1.43.0 +mutagen==1.44.0 # homeassistant.components.mychevy mychevy==1.2.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e687b3d49452..be6de1b7570d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -346,7 +346,7 @@ mficlient==0.3.0 minio==4.0.9 # homeassistant.components.tts -mutagen==1.43.0 +mutagen==1.44.0 # homeassistant.components.ness_alarm nessclient==0.9.15 From 11ee01424dff244cd8bf625e38c62961bca27b7c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:53:48 +0200 Subject: [PATCH 314/653] Upgrade discord.py to 1.3.3 (#34008) --- homeassistant/components/discord/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/discord/manifest.json b/homeassistant/components/discord/manifest.json index c0de99654aca..7f03e52ca626 100644 --- a/homeassistant/components/discord/manifest.json +++ b/homeassistant/components/discord/manifest.json @@ -2,6 +2,6 @@ "domain": "discord", "name": "Discord", "documentation": "https://www.home-assistant.io/integrations/discord", - "requirements": ["discord.py==1.3.2"], + "requirements": ["discord.py==1.3.3"], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index 8d4234fe1122..7a9008f7ba3a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -453,7 +453,7 @@ directv==0.3.0 discogs_client==2.2.2 # homeassistant.components.discord -discord.py==1.3.2 +discord.py==1.3.3 # homeassistant.components.updater distro==1.4.0 From 2af9f4fffe1a21712776a624f9d2f81def12cc45 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:55:02 +0200 Subject: [PATCH 315/653] Upgrade distro to 1.5.0 (#34009) --- homeassistant/components/updater/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/updater/manifest.json b/homeassistant/components/updater/manifest.json index faf3bc2cc0ea..76a6d8f64f46 100644 --- a/homeassistant/components/updater/manifest.json +++ b/homeassistant/components/updater/manifest.json @@ -2,7 +2,7 @@ "domain": "updater", "name": "Updater", "documentation": "https://www.home-assistant.io/integrations/updater", - "requirements": ["distro==1.4.0"], + "requirements": ["distro==1.5.0"], "codeowners": ["@home-assistant/core"], "quality_scale": "internal" } diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index bf5b924bdbd3..af2198a5563e 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -10,7 +10,7 @@ certifi>=2019.11.28 ciso8601==2.1.3 cryptography==2.9 defusedxml==0.6.0 -distro==1.4.0 +distro==1.5.0 hass-nabucasa==0.34.0 home-assistant-frontend==20200407.2 importlib-metadata==1.5.0 diff --git a/requirements_all.txt b/requirements_all.txt index 7a9008f7ba3a..2c57c763452f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -456,7 +456,7 @@ discogs_client==2.2.2 discord.py==1.3.3 # homeassistant.components.updater -distro==1.4.0 +distro==1.5.0 # homeassistant.components.digitalloggers dlipower==0.7.165 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index be6de1b7570d..fa3520bd5c0f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -181,7 +181,7 @@ denonavr==0.8.1 directv==0.3.0 # homeassistant.components.updater -distro==1.4.0 +distro==1.5.0 # homeassistant.components.doorbird doorbirdpy==2.0.8 From 91e7bcbfac41b152d5080b90d13ffc314ba1209e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 12:56:18 +0200 Subject: [PATCH 316/653] Upgrade beautifulsoup4 to 4.9.0 (#34007) --- homeassistant/components/scrape/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/scrape/manifest.json b/homeassistant/components/scrape/manifest.json index c7536459a035..7a76512f01df 100644 --- a/homeassistant/components/scrape/manifest.json +++ b/homeassistant/components/scrape/manifest.json @@ -2,7 +2,7 @@ "domain": "scrape", "name": "Scrape", "documentation": "https://www.home-assistant.io/integrations/scrape", - "requirements": ["beautifulsoup4==4.8.2"], + "requirements": ["beautifulsoup4==4.9.0"], "after_dependencies": ["rest"], "codeowners": ["@fabaff"] } diff --git a/requirements_all.txt b/requirements_all.txt index 2c57c763452f..c8235ce47428 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -311,7 +311,7 @@ batinfo==0.4.2 # beacontools[scan]==1.2.3 # homeassistant.components.scrape -beautifulsoup4==4.8.2 +beautifulsoup4==4.9.0 # homeassistant.components.beewi_smartclim beewi_smartclim==0.0.7 From df121c2e885fff4ee473e0457cca46bfd5fb560d Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 13:04:54 +0200 Subject: [PATCH 317/653] Upgrade numpy to 1.18.2 (#34012) --- homeassistant/components/iqvia/manifest.json | 2 +- homeassistant/components/opencv/manifest.json | 2 +- homeassistant/components/tensorflow/manifest.json | 2 +- homeassistant/components/trend/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/iqvia/manifest.json b/homeassistant/components/iqvia/manifest.json index 48b246e6fc44..154cdd43c657 100644 --- a/homeassistant/components/iqvia/manifest.json +++ b/homeassistant/components/iqvia/manifest.json @@ -3,6 +3,6 @@ "name": "IQVIA", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/iqvia", - "requirements": ["numpy==1.18.1", "pyiqvia==0.2.1"], + "requirements": ["numpy==1.18.2", "pyiqvia==0.2.1"], "codeowners": ["@bachya"] } diff --git a/homeassistant/components/opencv/manifest.json b/homeassistant/components/opencv/manifest.json index 95b0431a32f7..ed54c7d05ee7 100644 --- a/homeassistant/components/opencv/manifest.json +++ b/homeassistant/components/opencv/manifest.json @@ -2,6 +2,6 @@ "domain": "opencv", "name": "OpenCV", "documentation": "https://www.home-assistant.io/integrations/opencv", - "requirements": ["numpy==1.18.1", "opencv-python-headless==4.2.0.32"], + "requirements": ["numpy==1.18.2", "opencv-python-headless==4.2.0.32"], "codeowners": [] } diff --git a/homeassistant/components/tensorflow/manifest.json b/homeassistant/components/tensorflow/manifest.json index 2a5e39c79722..b9ec8e847373 100644 --- a/homeassistant/components/tensorflow/manifest.json +++ b/homeassistant/components/tensorflow/manifest.json @@ -4,7 +4,7 @@ "documentation": "https://www.home-assistant.io/integrations/tensorflow", "requirements": [ "tensorflow==1.13.2", - "numpy==1.18.1", + "numpy==1.18.2", "protobuf==3.6.1", "pillow==7.0.0" ], diff --git a/homeassistant/components/trend/manifest.json b/homeassistant/components/trend/manifest.json index 76b3ae629e48..edd0bea977d5 100644 --- a/homeassistant/components/trend/manifest.json +++ b/homeassistant/components/trend/manifest.json @@ -2,7 +2,7 @@ "domain": "trend", "name": "Trend", "documentation": "https://www.home-assistant.io/integrations/trend", - "requirements": ["numpy==1.18.1"], + "requirements": ["numpy==1.18.2"], "codeowners": [], "quality_scale": "internal" } diff --git a/requirements_all.txt b/requirements_all.txt index c8235ce47428..288008fa075f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -945,7 +945,7 @@ nuheat==0.3.0 # homeassistant.components.opencv # homeassistant.components.tensorflow # homeassistant.components.trend -numpy==1.18.1 +numpy==1.18.2 # homeassistant.components.oasa_telematics oasatelematics==0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index fa3520bd5c0f..f2d0d6a51811 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -368,7 +368,7 @@ nuheat==0.3.0 # homeassistant.components.opencv # homeassistant.components.tensorflow # homeassistant.components.trend -numpy==1.18.1 +numpy==1.18.2 # homeassistant.components.google oauth2client==4.0.0 From e88af54016a54902c440bfd3c40972f2886828d4 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sat, 11 Apr 2020 16:26:54 +0300 Subject: [PATCH 318/653] Fix docstring in test_util/aiohttp.py (#34024) --- tests/test_util/aiohttp.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_util/aiohttp.py b/tests/test_util/aiohttp.py index 55bfd79143d5..23112de55587 100644 --- a/tests/test_util/aiohttp.py +++ b/tests/test_util/aiohttp.py @@ -295,7 +295,12 @@ def mock_aiohttp_client(): class MockLongPollSideEffect: - """Imitate a long_poll request. Once created, actual responses are queued and if queue is empty, will await until done.""" + """Imitate a long_poll request. + + It should be created and used as a side effect for a GET/PUT/etc. request. + Once created, actual responses are queued with queue_response + If queue is empty, will await until done. + """ def __init__(self): """Initialize the queue.""" From 9aa0e76d65293d5b3a3bb3ecdc9801e0f3d2dc1a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 15:27:28 +0200 Subject: [PATCH 319/653] Update codeowners for seven_segments (#34027) --- CODEOWNERS | 1 + homeassistant/components/seven_segments/manifest.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index edc15f00899f..cc1780793264 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -328,6 +328,7 @@ homeassistant/components/sense/* @kbickar homeassistant/components/sensibo/* @andrey-git homeassistant/components/sentry/* @dcramer homeassistant/components/serial/* @fabaff +homeassistant/components/seven_segments/* @fabaff homeassistant/components/seventeentrack/* @bachya homeassistant/components/shell_command/* @home-assistant/core homeassistant/components/shiftr/* @fabaff diff --git a/homeassistant/components/seven_segments/manifest.json b/homeassistant/components/seven_segments/manifest.json index 1eb60e9154ae..32cfcd415c6f 100644 --- a/homeassistant/components/seven_segments/manifest.json +++ b/homeassistant/components/seven_segments/manifest.json @@ -3,5 +3,5 @@ "name": "Seven Segments OCR", "documentation": "https://www.home-assistant.io/integrations/seven_segments", "requirements": ["pillow==7.0.0"], - "codeowners": [] + "codeowners": ["@fabaff"] } From 2ab79115d19668ca7cdd6c810e2edf2f40640a54 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 15:39:09 +0200 Subject: [PATCH 320/653] Upgrade geopy to 1.21.0 (#34026) --- homeassistant/components/aprs/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/aprs/manifest.json b/homeassistant/components/aprs/manifest.json index 2b5c3c87a5df..c2f4fe52fa12 100644 --- a/homeassistant/components/aprs/manifest.json +++ b/homeassistant/components/aprs/manifest.json @@ -3,5 +3,5 @@ "name": "APRS", "documentation": "https://www.home-assistant.io/integrations/aprs", "codeowners": ["@PhilRW"], - "requirements": ["aprslib==0.6.46", "geopy==1.19.0"] + "requirements": ["aprslib==0.6.46", "geopy==1.21.0"] } diff --git a/requirements_all.txt b/requirements_all.txt index 288008fa075f..bc447e3ca0ff 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -592,7 +592,7 @@ geniushub-client==0.6.30 geojson_client==0.4 # homeassistant.components.aprs -geopy==1.19.0 +geopy==1.21.0 # homeassistant.components.geo_rss_events georss_generic_client==0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f2d0d6a51811..427ac0d68fa4 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -224,7 +224,7 @@ garminconnect==0.1.10 geojson_client==0.4 # homeassistant.components.aprs -geopy==1.19.0 +geopy==1.21.0 # homeassistant.components.geo_rss_events georss_generic_client==0.3 From f839ba00eb9c170a96b4e66d9ee1e650db06fb80 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 11 Apr 2020 15:40:59 +0200 Subject: [PATCH 321/653] Use POWER_WATT constant (#33984) --- .../components/ambient_station/__init__.py | 3 ++- homeassistant/components/aqualogic/sensor.py | 3 ++- homeassistant/components/bom/weather.py | 10 +++++++-- .../components/growatt_server/sensor.py | 22 ++++++++++++------- .../components/homematicip_cloud/sensor.py | 2 +- homeassistant/components/isy994/sensor.py | 2 +- homeassistant/components/solarlog/const.py | 7 +++++- homeassistant/components/tibber/sensor.py | 3 ++- .../components/waterfurnace/sensor.py | 12 +++++----- homeassistant/const.py | 4 ++-- tests/components/derivative/test_sensor.py | 6 ++--- .../homematicip_cloud/test_sensor.py | 2 +- tests/components/integration/test_sensor.py | 6 ++--- tests/components/zha/test_sensor.py | 9 ++++---- 14 files changed, 56 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/ambient_station/__init__.py b/homeassistant/components/ambient_station/__init__.py index 12465dfd984f..7343c2d21ed9 100644 --- a/homeassistant/components/ambient_station/__init__.py +++ b/homeassistant/components/ambient_station/__init__.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, + POWER_WATT, SPEED_MILES_PER_HOUR, TEMP_FAHRENHEIT, UNIT_PERCENTAGE, @@ -200,7 +201,7 @@ SENSOR_TYPES = { TYPE_SOILTEMP7F: ("Soil Temp 7", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_SOILTEMP8F: ("Soil Temp 8", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_SOILTEMP9F: ("Soil Temp 9", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), - TYPE_SOLARRADIATION: ("Solar Rad", "W/m^2", TYPE_SENSOR, None), + TYPE_SOLARRADIATION: ("Solar Rad", f"{POWER_WATT}/m^2", TYPE_SENSOR, None), TYPE_SOLARRADIATION_LX: ("Solar Rad (lx)", "lx", TYPE_SENSOR, "illuminance"), TYPE_TEMP10F: ("Temp 10", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), TYPE_TEMP1F: ("Temp 1", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"), diff --git a/homeassistant/components/aqualogic/sensor.py b/homeassistant/components/aqualogic/sensor.py index 74a70f0b11ce..a53a8c1d3488 100644 --- a/homeassistant/components/aqualogic/sensor.py +++ b/homeassistant/components/aqualogic/sensor.py @@ -6,6 +6,7 @@ import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_MONITORED_CONDITIONS, + POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_PERCENTAGE, @@ -21,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) TEMP_UNITS = [TEMP_CELSIUS, TEMP_FAHRENHEIT] PERCENT_UNITS = [UNIT_PERCENTAGE, UNIT_PERCENTAGE] SALT_UNITS = ["g/L", "PPM"] -WATT_UNITS = ["W", "W"] +WATT_UNITS = [POWER_WATT, POWER_WATT] NO_UNITS = [None, None] # sensor_type [ description, unit, icon ] diff --git a/homeassistant/components/bom/weather.py b/homeassistant/components/bom/weather.py index 94b9960c851b..139c61a3b0fe 100644 --- a/homeassistant/components/bom/weather.py +++ b/homeassistant/components/bom/weather.py @@ -4,7 +4,13 @@ import logging import voluptuous as vol from homeassistant.components.weather import PLATFORM_SCHEMA, WeatherEntity -from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS +from homeassistant.const import ( + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, + POWER_WATT, + TEMP_CELSIUS, +) from homeassistant.helpers import config_validation as cv # Reuse data and API logic from the sensor implementation @@ -99,7 +105,7 @@ class BOMWeather(WeatherEntity): "SSW", "SW", "WSW", - "W", + POWER_WATT, "WNW", "NW", "NNW", diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index 6742b39e8b01..f51e38bd9da3 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, ENERGY_KILO_WATT_HOUR, + POWER_WATT, UNIT_VOLT, ) import homeassistant.helpers.config_validation as cv @@ -35,14 +36,14 @@ TOTAL_SENSOR_TYPES = { "todayEnergy", "power", ), - "total_output_power": ("Output Power", "W", "invTodayPpv", "power"), + "total_output_power": ("Output Power", POWER_WATT, "invTodayPpv", "power"), "total_energy_output": ( "Lifetime energy output", ENERGY_KILO_WATT_HOUR, "totalEnergy", "power", ), - "total_maximum_output": ("Maximum power", "W", "nominalPower", "power"), + "total_maximum_output": ("Maximum power", POWER_WATT, "nominalPower", "power"), } INVERTER_SENSOR_TYPES = { @@ -60,19 +61,24 @@ INVERTER_SENSOR_TYPES = { ), "inverter_voltage_input_1": ("Input 1 voltage", UNIT_VOLT, "vpv1", None), "inverter_amperage_input_1": ("Input 1 Amperage", "A", "ipv1", None), - "inverter_wattage_input_1": ("Input 1 Wattage", "W", "ppv1", "power"), + "inverter_wattage_input_1": ("Input 1 Wattage", POWER_WATT, "ppv1", "power"), "inverter_voltage_input_2": ("Input 2 voltage", UNIT_VOLT, "vpv2", None), "inverter_amperage_input_2": ("Input 2 Amperage", "A", "ipv2", None), - "inverter_wattage_input_2": ("Input 2 Wattage", "W", "ppv2", "power"), + "inverter_wattage_input_2": ("Input 2 Wattage", POWER_WATT, "ppv2", "power"), "inverter_voltage_input_3": ("Input 3 voltage", UNIT_VOLT, "vpv3", None), "inverter_amperage_input_3": ("Input 3 Amperage", "A", "ipv3", None), - "inverter_wattage_input_3": ("Input 3 Wattage", "W", "ppv3", "power"), - "inverter_internal_wattage": ("Internal wattage", "W", "ppv", "power"), + "inverter_wattage_input_3": ("Input 3 Wattage", POWER_WATT, "ppv3", "power"), + "inverter_internal_wattage": ("Internal wattage", POWER_WATT, "ppv", "power"), "inverter_reactive_voltage": ("Reactive voltage", UNIT_VOLT, "vacr", None), "inverter_inverter_reactive_amperage": ("Reactive amperage", "A", "iacr", None), "inverter_frequency": ("AC frequency", "Hz", "fac", None), - "inverter_current_wattage": ("Output power", "W", "pac", "power"), - "inverter_current_reactive_wattage": ("Reactive wattage", "W", "pacr", "power"), + "inverter_current_wattage": ("Output power", POWER_WATT, "pac", "power"), + "inverter_current_reactive_wattage": ( + "Reactive wattage", + POWER_WATT, + "pacr", + "power", + ), } SENSOR_TYPES = {**TOTAL_SENSOR_TYPES, **INVERTER_SENSOR_TYPES} diff --git a/homeassistant/components/homematicip_cloud/sensor.py b/homeassistant/components/homematicip_cloud/sensor.py index a45591ecc306..e45e73b8c03b 100644 --- a/homeassistant/components/homematicip_cloud/sensor.py +++ b/homeassistant/components/homematicip_cloud/sensor.py @@ -414,7 +414,7 @@ def _get_wind_direction(wind_direction_degree: float) -> str: if 236.25 <= wind_direction_degree < 258.75: return "WSW" if 258.75 <= wind_direction_degree < 281.25: - return "W" + return POWER_WATT if 281.25 <= wind_direction_degree < 303.75: return "WNW" if 303.75 <= wind_direction_degree < 326.25: diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index 47b9fc1d633a..a52dcdbe09a9 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -95,7 +95,7 @@ UOM_FRIENDLY_NAME = { "71": UNIT_UV_INDEX, "72": UNIT_VOLT, "73": POWER_WATT, - "74": "W/m²", + "74": f"{POWER_WATT}/m²", "75": "weekday", "76": "Wind Direction (°)", "77": TIME_YEARS, diff --git a/homeassistant/components/solarlog/const.py b/homeassistant/components/solarlog/const.py index b8512531f36a..d89b175962e4 100644 --- a/homeassistant/components/solarlog/const.py +++ b/homeassistant/components/solarlog/const.py @@ -83,7 +83,12 @@ SENSOR_TYPES = { "mdi:solar-power", ], "capacity": ["CAPACITY", "capacity", UNIT_PERCENTAGE, "mdi:solar-power"], - "efficiency": ["EFFICIENCY", "efficiency", "% W/Wp", "mdi:solar-power"], + "efficiency": [ + "EFFICIENCY", + "efficiency", + f"% {POWER_WATT}/{POWER_WATT}p", + "mdi:solar-power", + ], "power_available": [ "powerAVAILABLE", "power available", diff --git a/homeassistant/components/tibber/sensor.py b/homeassistant/components/tibber/sensor.py index 054fad3246a6..36f1a65222c6 100644 --- a/homeassistant/components/tibber/sensor.py +++ b/homeassistant/components/tibber/sensor.py @@ -5,6 +5,7 @@ import logging import aiohttp +from homeassistant.const import POWER_WATT from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle, dt as dt_util @@ -194,7 +195,7 @@ class TibberSensorRT(TibberSensor): @property def unit_of_measurement(self): """Return the unit of measurement of this entity.""" - return "W" + return POWER_WATT @property def unique_id(self): diff --git a/homeassistant/components/waterfurnace/sensor.py b/homeassistant/components/waterfurnace/sensor.py index b2b8aaa6f358..9378694f5f36 100644 --- a/homeassistant/components/waterfurnace/sensor.py +++ b/homeassistant/components/waterfurnace/sensor.py @@ -1,7 +1,7 @@ """Support for Waterfurnace.""" from homeassistant.components.sensor import ENTITY_ID_FORMAT -from homeassistant.const import TEMP_FAHRENHEIT, UNIT_PERCENTAGE +from homeassistant.const import POWER_WATT, TEMP_FAHRENHEIT, UNIT_PERCENTAGE from homeassistant.core import callback from homeassistant.helpers.entity import Entity from homeassistant.util import slugify @@ -24,7 +24,7 @@ class WFSensorConfig: SENSORS = [ WFSensorConfig("Furnace Mode", "mode"), - WFSensorConfig("Total Power", "totalunitpower", "mdi:flash", "W"), + WFSensorConfig("Total Power", "totalunitpower", "mdi:flash", POWER_WATT), WFSensorConfig( "Active Setpoint", "tstatactivesetpoint", "mdi:thermometer", TEMP_FAHRENHEIT ), @@ -39,10 +39,10 @@ SENSORS = [ WFSensorConfig( "Humidity", "tstatrelativehumidity", "mdi:water-percent", UNIT_PERCENTAGE ), - WFSensorConfig("Compressor Power", "compressorpower", "mdi:flash", "W"), - WFSensorConfig("Fan Power", "fanpower", "mdi:flash", "W"), - WFSensorConfig("Aux Power", "auxpower", "mdi:flash", "W"), - WFSensorConfig("Loop Pump Power", "looppumppower", "mdi:flash", "W"), + WFSensorConfig("Compressor Power", "compressorpower", "mdi:flash", POWER_WATT), + WFSensorConfig("Fan Power", "fanpower", "mdi:flash", POWER_WATT), + WFSensorConfig("Aux Power", "auxpower", "mdi:flash", POWER_WATT), + WFSensorConfig("Loop Pump Power", "looppumppower", "mdi:flash", POWER_WATT), WFSensorConfig("Compressor Speed", "actualcompressorspeed", "mdi:speedometer"), WFSensorConfig("Fan Speed", "airflowcurrentspeed", "mdi:fan"), ] diff --git a/homeassistant/const.py b/homeassistant/const.py index d69f0370720a..0b8c3303358b 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -349,8 +349,8 @@ POWER_WATT = "W" UNIT_VOLT = "V" # Energy units -ENERGY_KILO_WATT_HOUR = "kWh" -ENERGY_WATT_HOUR = "Wh" +ENERGY_WATT_HOUR = f"{POWER_WATT}h" +ENERGY_KILO_WATT_HOUR = f"k{ENERGY_WATT_HOUR}" # Temperature units TEMP_CELSIUS = "°C" diff --git a/tests/components/derivative/test_sensor.py b/tests/components/derivative/test_sensor.py index dc160b283ad6..466f07a9deba 100644 --- a/tests/components/derivative/test_sensor.py +++ b/tests/components/derivative/test_sensor.py @@ -2,7 +2,7 @@ from datetime import timedelta from unittest.mock import patch -from homeassistant.const import TIME_HOURS, TIME_MINUTES, TIME_SECONDS +from homeassistant.const import POWER_WATT, TIME_HOURS, TIME_MINUTES, TIME_SECONDS from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -192,14 +192,14 @@ async def test_prefix(hass): entity_id = config["sensor"]["source"] hass.states.async_set( - entity_id, 1000, {"unit_of_measurement": "W"}, force_update=True + entity_id, 1000, {"unit_of_measurement": POWER_WATT}, force_update=True ) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=3600) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 1000, {"unit_of_measurement": "W"}, force_update=True + entity_id, 1000, {"unit_of_measurement": POWER_WATT}, force_update=True ) await hass.async_block_till_done() diff --git a/tests/components/homematicip_cloud/test_sensor.py b/tests/components/homematicip_cloud/test_sensor.py index c55a4682216c..61de66d916df 100644 --- a/tests/components/homematicip_cloud/test_sensor.py +++ b/tests/components/homematicip_cloud/test_sensor.py @@ -310,7 +310,7 @@ async def test_hmip_windspeed_sensor(hass, default_mock_hap_factory): 205: "SSW", 227.5: "SW", 250: "WSW", - 272.5: "W", + 272.5: POWER_WATT, 295: "WNW", 317.5: "NW", 340: "NNW", diff --git a/tests/components/integration/test_sensor.py b/tests/components/integration/test_sensor.py index ded0ab6bfad4..3afa5c14c22a 100644 --- a/tests/components/integration/test_sensor.py +++ b/tests/components/integration/test_sensor.py @@ -2,7 +2,7 @@ from datetime import timedelta from unittest.mock import patch -from homeassistant.const import ENERGY_KILO_WATT_HOUR, TIME_SECONDS +from homeassistant.const import ENERGY_KILO_WATT_HOUR, POWER_WATT, TIME_SECONDS from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -155,13 +155,13 @@ async def test_prefix(hass): assert await async_setup_component(hass, "sensor", config) entity_id = config["sensor"]["source"] - hass.states.async_set(entity_id, 1000, {"unit_of_measurement": "W"}) + hass.states.async_set(entity_id, 1000, {"unit_of_measurement": POWER_WATT}) await hass.async_block_till_done() now = dt_util.utcnow() + timedelta(seconds=3600) with patch("homeassistant.util.dt.utcnow", return_value=now): hass.states.async_set( - entity_id, 1000, {"unit_of_measurement": "W"}, force_update=True + entity_id, 1000, {"unit_of_measurement": POWER_WATT}, force_update=True ) await hass.async_block_till_done() diff --git a/tests/components/zha/test_sensor.py b/tests/components/zha/test_sensor.py index dbd2e8f7c3a4..d560fe2cbbad 100644 --- a/tests/components/zha/test_sensor.py +++ b/tests/components/zha/test_sensor.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_UNIT_SYSTEM, CONF_UNIT_SYSTEM_IMPERIAL, CONF_UNIT_SYSTEM_METRIC, + POWER_WATT, STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELSIUS, @@ -76,17 +77,17 @@ async def async_test_electrical_measurement(hass, cluster, entity_id): ) as divisor_mock: divisor_mock.return_value = 1 await send_attributes_report(hass, cluster, {0: 1, 1291: 100, 10: 1000}) - assert_state(hass, entity_id, "100", "W") + assert_state(hass, entity_id, "100", POWER_WATT) await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 1000}) - assert_state(hass, entity_id, "99", "W") + assert_state(hass, entity_id, "99", POWER_WATT) divisor_mock.return_value = 10 await send_attributes_report(hass, cluster, {0: 1, 1291: 1000, 10: 5000}) - assert_state(hass, entity_id, "100", "W") + assert_state(hass, entity_id, "100", POWER_WATT) await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 5000}) - assert_state(hass, entity_id, "9.9", "W") + assert_state(hass, entity_id, "9.9", POWER_WATT) @pytest.mark.parametrize( From c18a6d5ea3ff414b397e92d7cda39be34ea13d1d Mon Sep 17 00:00:00 2001 From: Kevin Eifinger Date: Sat, 11 Apr 2020 16:47:07 +0200 Subject: [PATCH 322/653] Fix #33995 Use "now" if departure is None (#34017) --- homeassistant/components/here_travel_time/sensor.py | 3 +++ tests/components/here_travel_time/test_sensor.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/homeassistant/components/here_travel_time/sensor.py b/homeassistant/components/here_travel_time/sensor.py index c88aeb8e5a0f..f73d3bccaa66 100644 --- a/homeassistant/components/here_travel_time/sensor.py +++ b/homeassistant/components/here_travel_time/sensor.py @@ -424,6 +424,9 @@ class HERETravelTimeData: if departure is not None: departure = convert_time_to_isodate(departure) + if departure is None and arrival is None: + departure = "now" + _LOGGER.debug( "Requesting route for origin: %s, destination: %s, route_mode: %s, mode: %s, traffic_mode: %s, arrival: %s, departure: %s", origin, diff --git a/tests/components/here_travel_time/test_sensor.py b/tests/components/here_travel_time/test_sensor.py index 642b774f1e56..d399f5b67aac 100644 --- a/tests/components/here_travel_time/test_sensor.py +++ b/tests/components/here_travel_time/test_sensor.py @@ -80,6 +80,8 @@ def _build_mock_url(origin, destination, modes, api_key, departure=None, arrival parameters["arrival"] = arrival if departure is not None: parameters["departure"] = departure + if departure is None and arrival is None: + parameters["departure"] = "now" url = base_url + urllib.parse.urlencode(parameters) print(url) return url From b89315015442dbb75d457c40d76fd0edb6edc256 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 11 Apr 2020 16:54:11 +0200 Subject: [PATCH 323/653] Add and use UNIT_DEGREE constant (#33978) * Add and use UNIT_DEGREE constant * Replace more occurrences * Add and use TEMP_KELVIN * Run isort --- .../components/ambient_station/__init__.py | 7 ++++--- homeassistant/components/arwn/sensor.py | 4 ++-- homeassistant/components/buienradar/sensor.py | 13 ++++++------ homeassistant/components/darksky/sensor.py | 21 ++++++++++--------- homeassistant/components/homematic/sensor.py | 5 +++-- homeassistant/components/isy994/sensor.py | 9 ++++---- homeassistant/components/lcn/const.py | 6 ++++-- homeassistant/components/mysensors/sensor.py | 3 ++- .../components/openweathermap/sensor.py | 3 ++- homeassistant/components/smappee/sensor.py | 3 ++- homeassistant/components/torque/sensor.py | 4 ++-- .../trafikverket_weatherstation/sensor.py | 3 ++- homeassistant/components/wink/sensor.py | 4 ++-- .../components/wunderground/sensor.py | 3 ++- homeassistant/components/yr/sensor.py | 3 ++- homeassistant/components/zamg/sensor.py | 5 +++-- homeassistant/const.py | 9 ++++++-- tests/components/prometheus/test_init.py | 3 ++- tests/components/yr/test_sensor.py | 6 +++--- 19 files changed, 67 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/ambient_station/__init__.py b/homeassistant/components/ambient_station/__init__.py index 7343c2d21ed9..0f35cca5f087 100644 --- a/homeassistant/components/ambient_station/__init__.py +++ b/homeassistant/components/ambient_station/__init__.py @@ -16,6 +16,7 @@ from homeassistant.const import ( POWER_WATT, SPEED_MILES_PER_HOUR, TEMP_FAHRENHEIT, + UNIT_DEGREE, UNIT_PERCENTAGE, ) from homeassistant.core import callback @@ -218,10 +219,10 @@ SENSOR_TYPES = { TYPE_TOTALRAININ: ("Lifetime Rain", "in", TYPE_SENSOR, None), TYPE_UV: ("uv", "Index", TYPE_SENSOR, None), TYPE_WEEKLYRAININ: ("Weekly Rain", "in", TYPE_SENSOR, None), - TYPE_WINDDIR: ("Wind Dir", "°", TYPE_SENSOR, None), - TYPE_WINDDIR_AVG10M: ("Wind Dir Avg 10m", "°", TYPE_SENSOR, None), + TYPE_WINDDIR: ("Wind Dir", UNIT_DEGREE, TYPE_SENSOR, None), + TYPE_WINDDIR_AVG10M: ("Wind Dir Avg 10m", UNIT_DEGREE, TYPE_SENSOR, None), TYPE_WINDDIR_AVG2M: ("Wind Dir Avg 2m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None), - TYPE_WINDGUSTDIR: ("Gust Dir", "°", TYPE_SENSOR, None), + TYPE_WINDGUSTDIR: ("Gust Dir", UNIT_DEGREE, TYPE_SENSOR, None), TYPE_WINDGUSTMPH: ("Wind Gust", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None), TYPE_WINDSPDMPH_AVG10M: ("Wind Avg 10m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None), TYPE_WINDSPDMPH_AVG2M: ("Wind Avg 2m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None), diff --git a/homeassistant/components/arwn/sensor.py b/homeassistant/components/arwn/sensor.py index 7be5c4bfb935..334c086f8d60 100644 --- a/homeassistant/components/arwn/sensor.py +++ b/homeassistant/components/arwn/sensor.py @@ -3,7 +3,7 @@ import json import logging from homeassistant.components import mqtt -from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_DEGREE from homeassistant.core import callback from homeassistant.helpers.entity import Entity from homeassistant.util import slugify @@ -45,7 +45,7 @@ def discover_sensors(topic, payload): return ( ArwnSensor("Wind Speed", "speed", unit, "mdi:speedometer"), ArwnSensor("Wind Gust", "gust", unit, "mdi:speedometer"), - ArwnSensor("Wind Direction", "direction", "°", "mdi:compass"), + ArwnSensor("Wind Direction", "direction", UNIT_DEGREE, "mdi:compass"), ) diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index de7dd04a48ef..8ace9070f8c8 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -32,6 +32,7 @@ from homeassistant.const import ( SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, TIME_HOURS, + UNIT_DEGREE, UNIT_PERCENTAGE, ) from homeassistant.core import callback @@ -76,7 +77,7 @@ SENSOR_TYPES = { "windspeed": ["Wind speed", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"], "windforce": ["Wind force", "Bft", "mdi:weather-windy"], "winddirection": ["Wind direction", None, "mdi:compass-outline"], - "windazimuth": ["Wind direction azimuth", "°", "mdi:compass-outline"], + "windazimuth": ["Wind direction azimuth", UNIT_DEGREE, "mdi:compass-outline"], "pressure": ["Pressure", "hPa", "mdi:gauge"], "visibility": ["Visibility", LENGTH_KILOMETERS, None], "windgust": ["Wind gust", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"], @@ -148,11 +149,11 @@ SENSOR_TYPES = { "winddirection_3d": ["Wind direction 3d", None, "mdi:compass-outline"], "winddirection_4d": ["Wind direction 4d", None, "mdi:compass-outline"], "winddirection_5d": ["Wind direction 5d", None, "mdi:compass-outline"], - "windazimuth_1d": ["Wind direction azimuth 1d", "°", "mdi:compass-outline"], - "windazimuth_2d": ["Wind direction azimuth 2d", "°", "mdi:compass-outline"], - "windazimuth_3d": ["Wind direction azimuth 3d", "°", "mdi:compass-outline"], - "windazimuth_4d": ["Wind direction azimuth 4d", "°", "mdi:compass-outline"], - "windazimuth_5d": ["Wind direction azimuth 5d", "°", "mdi:compass-outline"], + "windazimuth_1d": ["Wind direction azimuth 1d", UNIT_DEGREE, "mdi:compass-outline"], + "windazimuth_2d": ["Wind direction azimuth 2d", UNIT_DEGREE, "mdi:compass-outline"], + "windazimuth_3d": ["Wind direction azimuth 3d", UNIT_DEGREE, "mdi:compass-outline"], + "windazimuth_4d": ["Wind direction azimuth 4d", UNIT_DEGREE, "mdi:compass-outline"], + "windazimuth_5d": ["Wind direction azimuth 5d", UNIT_DEGREE, "mdi:compass-outline"], "condition_1d": ["Condition 1d", None, None], "condition_2d": ["Condition 2d", None, None], "condition_3d": ["Condition 3d", None, None], diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index d372811edd8d..e4471b7e55f2 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -22,6 +22,7 @@ from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, TIME_HOURS, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_UV_INDEX, ) @@ -87,11 +88,11 @@ SENSOR_TYPES = { ], "nearest_storm_bearing": [ "Nearest Storm Bearing", - "°", - "°", - "°", - "°", - "°", + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, "mdi:weather-lightning", ["currently"], ], @@ -177,11 +178,11 @@ SENSOR_TYPES = { ], "wind_bearing": [ "Wind Bearing", - "°", - "°", - "°", - "°", - "°", + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, + UNIT_DEGREE, "mdi:compass", ["currently", "hourly", "daily"], ], diff --git a/homeassistant/components/homematic/sensor.py b/homeassistant/components/homematic/sensor.py index d36b05fd129e..13e49bcf5095 100644 --- a/homeassistant/components/homematic/sensor.py +++ b/homeassistant/components/homematic/sensor.py @@ -10,6 +10,7 @@ from homeassistant.const import ( POWER_WATT, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_VOLT, VOLUME_CUBIC_METERS, @@ -53,8 +54,8 @@ HM_UNIT_HA_CAST = { "HIGHEST_ILLUMINATION": "lx", "RAIN_COUNTER": "mm", "WIND_SPEED": SPEED_KILOMETERS_PER_HOUR, - "WIND_DIRECTION": "°", - "WIND_DIRECTION_RANGE": "°", + "WIND_DIRECTION": UNIT_DEGREE, + "WIND_DIRECTION_RANGE": UNIT_DEGREE, "SUNSHINEDURATION": "#", "AIR_PRESSURE": "hPa", "FREQUENCY": "Hz", diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index a52dcdbe09a9..d3a889902f57 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( TIME_MONTHS, TIME_SECONDS, TIME_YEARS, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_UV_INDEX, UNIT_VOLT, @@ -41,7 +42,7 @@ UOM_FRIENDLY_NAME = { "10": TIME_DAYS, "12": "dB", "13": "dB A", - "14": "°", + "14": UNIT_DEGREE, "16": "macroseismic", "17": TEMP_FAHRENHEIT, "18": "ft", @@ -97,7 +98,7 @@ UOM_FRIENDLY_NAME = { "73": POWER_WATT, "74": f"{POWER_WATT}/m²", "75": "weekday", - "76": "Wind Direction (°)", + "76": f"Wind Direction ({UNIT_DEGREE})", "77": TIME_YEARS, "82": "mm", "83": LENGTH_KILOMETERS, @@ -107,8 +108,8 @@ UOM_FRIENDLY_NAME = { "88": "Water activity", "89": "RPM", "90": "Hz", - "91": "° (Relative to North)", - "92": "° (Relative to South)", + "91": f"{UNIT_DEGREE} (Relative to North)", + "92": f"{UNIT_DEGREE} (Relative to South)", } UOM_TO_STATES = { diff --git a/homeassistant/components/lcn/const.py b/homeassistant/components/lcn/const.py index 7a881ab9d856..817b6821db1f 100644 --- a/homeassistant/components/lcn/const.py +++ b/homeassistant/components/lcn/const.py @@ -4,6 +4,8 @@ from itertools import product from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, + TEMP_KELVIN, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_VOLT, ) @@ -149,7 +151,7 @@ VAR_UNITS = [ "LCN", "NATIVE", TEMP_CELSIUS, - "°K", + TEMP_KELVIN, TEMP_FAHRENHEIT, "LUX_T", "LX_T", @@ -167,7 +169,7 @@ VAR_UNITS = [ "AMP", "A", "DEGREE", - "°", + UNIT_DEGREE, ] RELVARREF = ["CURRENT", "PROG"] diff --git a/homeassistant/components/mysensors/sensor.py b/homeassistant/components/mysensors/sensor.py index 16c8d37f4477..ac16198ee697 100644 --- a/homeassistant/components/mysensors/sensor.py +++ b/homeassistant/components/mysensors/sensor.py @@ -7,6 +7,7 @@ from homeassistant.const import ( POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_VOLT, ) @@ -22,7 +23,7 @@ SENSORS = { "V_RAINRATE": [None, "mdi:weather-rainy"], "V_WIND": [None, "mdi:weather-windy"], "V_GUST": [None, "mdi:weather-windy"], - "V_DIRECTION": ["°", "mdi:compass"], + "V_DIRECTION": [UNIT_DEGREE, "mdi:compass"], "V_WEIGHT": [MASS_KILOGRAMS, "mdi:weight-kilogram"], "V_DISTANCE": ["m", "mdi:ruler"], "V_IMPEDANCE": ["ohm", None], diff --git a/homeassistant/components/openweathermap/sensor.py b/homeassistant/components/openweathermap/sensor.py index ac85eff67947..b5b9aa25e475 100644 --- a/homeassistant/components/openweathermap/sensor.py +++ b/homeassistant/components/openweathermap/sensor.py @@ -15,6 +15,7 @@ from homeassistant.const import ( SPEED_METERS_PER_SECOND, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_DEGREE, UNIT_PERCENTAGE, ) import homeassistant.helpers.config_validation as cv @@ -36,7 +37,7 @@ SENSOR_TYPES = { "weather": ["Condition", None], "temperature": ["Temperature", None], "wind_speed": ["Wind speed", SPEED_METERS_PER_SECOND], - "wind_bearing": ["Wind bearing", "°"], + "wind_bearing": ["Wind bearing", UNIT_DEGREE], "humidity": ["Humidity", UNIT_PERCENTAGE], "pressure": ["Pressure", "mbar"], "clouds": ["Cloud coverage", UNIT_PERCENTAGE], diff --git a/homeassistant/components/smappee/sensor.py b/homeassistant/components/smappee/sensor.py index 5948f7e42231..d82e63a26143 100644 --- a/homeassistant/components/smappee/sensor.py +++ b/homeassistant/components/smappee/sensor.py @@ -5,6 +5,7 @@ import logging from homeassistant.const import ( ENERGY_KILO_WATT_HOUR, POWER_WATT, + UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_VOLT, VOLUME_CUBIC_METERS, @@ -73,7 +74,7 @@ SENSOR_TYPES = { "Water Sensor Temperature", "mdi:temperature-celsius", "water", - "°", + UNIT_DEGREE, "temperature", ], "water_sensor_humidity": [ diff --git a/homeassistant/components/torque/sensor.py b/homeassistant/components/torque/sensor.py index fd7eddbb48a0..7b7f7d7ec16a 100644 --- a/homeassistant/components/torque/sensor.py +++ b/homeassistant/components/torque/sensor.py @@ -6,7 +6,7 @@ import voluptuous as vol from homeassistant.components.http import HomeAssistantView from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_EMAIL, CONF_NAME +from homeassistant.const import CONF_EMAIL, CONF_NAME, UNIT_DEGREE from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -91,7 +91,7 @@ class TorqueReceiveDataView(HomeAssistantView): temp_unit = data[key] if "\\xC2\\xB0" in temp_unit: - temp_unit = temp_unit.replace("\\xC2\\xB0", "°") + temp_unit = temp_unit.replace("\\xC2\\xB0", UNIT_DEGREE) units[pid] = temp_unit elif is_value: diff --git a/homeassistant/components/trafikverket_weatherstation/sensor.py b/homeassistant/components/trafikverket_weatherstation/sensor.py index f2e7387aa6bd..6c678ab732c4 100644 --- a/homeassistant/components/trafikverket_weatherstation/sensor.py +++ b/homeassistant/components/trafikverket_weatherstation/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, SPEED_METERS_PER_SECOND, TEMP_CELSIUS, + UNIT_DEGREE, UNIT_PERCENTAGE, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -61,7 +62,7 @@ SENSOR_TYPES = { ], "wind_direction": [ "Wind direction", - "°", + UNIT_DEGREE, "winddirection", "mdi:flag-triangle", None, diff --git a/homeassistant/components/wink/sensor.py b/homeassistant/components/wink/sensor.py index 2d0313ec2110..1d2339702ad9 100644 --- a/homeassistant/components/wink/sensor.py +++ b/homeassistant/components/wink/sensor.py @@ -3,7 +3,7 @@ import logging import pywink -from homeassistant.const import TEMP_CELSIUS +from homeassistant.const import TEMP_CELSIUS, UNIT_DEGREE from . import DOMAIN, WinkDevice @@ -48,7 +48,7 @@ class WinkSensorDevice(WinkDevice): """Initialize the Wink device.""" super().__init__(wink, hass) self.capability = self.wink.capability() - if self.wink.unit() == "°": + if self.wink.unit() == UNIT_DEGREE: self._unit_of_measurement = TEMP_CELSIUS else: self._unit_of_measurement = self.wink.unit() diff --git a/homeassistant/components/wunderground/sensor.py b/homeassistant/components/wunderground/sensor.py index 6d843c222d98..b9532daa995c 100644 --- a/homeassistant/components/wunderground/sensor.py +++ b/homeassistant/components/wunderground/sensor.py @@ -26,6 +26,7 @@ from homeassistant.const import ( SPEED_MILES_PER_HOUR, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_DEGREE, UNIT_PERCENTAGE, ) from homeassistant.exceptions import PlatformNotReady @@ -456,7 +457,7 @@ SENSOR_TYPES = { ), "weather": WUCurrentConditionsSensorConfig("Weather Summary", "weather", None), "wind_degrees": WUCurrentConditionsSensorConfig( - "Wind Degrees", "wind_degrees", "mdi:weather-windy", "°" + "Wind Degrees", "wind_degrees", "mdi:weather-windy", UNIT_DEGREE ), "wind_dir": WUCurrentConditionsSensorConfig( "Wind Direction", "wind_dir", "mdi:weather-windy" diff --git a/homeassistant/components/yr/sensor.py b/homeassistant/components/yr/sensor.py index e477f4a3c891..e648e059fab3 100644 --- a/homeassistant/components/yr/sensor.py +++ b/homeassistant/components/yr/sensor.py @@ -24,6 +24,7 @@ from homeassistant.const import ( PRESSURE_HPA, SPEED_METERS_PER_SECOND, TEMP_CELSIUS, + UNIT_DEGREE, UNIT_PERCENTAGE, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -47,7 +48,7 @@ SENSOR_TYPES = { "windSpeed": ["Wind speed", SPEED_METERS_PER_SECOND, None], "windGust": ["Wind gust", SPEED_METERS_PER_SECOND, None], "pressure": ["Pressure", PRESSURE_HPA, DEVICE_CLASS_PRESSURE], - "windDirection": ["Wind direction", "°", None], + "windDirection": ["Wind direction", UNIT_DEGREE, None], "humidity": ["Humidity", UNIT_PERCENTAGE, DEVICE_CLASS_HUMIDITY], "fog": ["Fog", UNIT_PERCENTAGE, None], "cloudiness": ["Cloudiness", UNIT_PERCENTAGE, None], diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 0ead849b59a4..6580ab0917fc 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( CONF_NAME, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, + UNIT_DEGREE, UNIT_PERCENTAGE, __version__, ) @@ -48,14 +49,14 @@ SENSOR_TYPES = { f"WG {SPEED_KILOMETERS_PER_HOUR}", float, ), - "wind_bearing": ("Wind Bearing", "°", "WR °", int), + "wind_bearing": ("Wind Bearing", UNIT_DEGREE, f"WR {UNIT_DEGREE}", int), "wind_max_speed": ( "Top Wind Speed", SPEED_KILOMETERS_PER_HOUR, f"WSG {SPEED_KILOMETERS_PER_HOUR}", float, ), - "wind_max_bearing": ("Top Wind Bearing", "°", "WSR °", int), + "wind_max_bearing": ("Top Wind Bearing", UNIT_DEGREE, f"WSR {UNIT_DEGREE}", int), "sun_last_hour": ("Sun Last Hour", UNIT_PERCENTAGE, f"SO {UNIT_PERCENTAGE}", int), "temperature": ("Temperature", TEMP_CELSIUS, f"T {TEMP_CELSIUS}", float), "precipitation": ("Precipitation", "l/m²", "N l/m²", float), diff --git a/homeassistant/const.py b/homeassistant/const.py index 0b8c3303358b..99274d59ff72 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -352,9 +352,13 @@ UNIT_VOLT = "V" ENERGY_WATT_HOUR = f"{POWER_WATT}h" ENERGY_KILO_WATT_HOUR = f"k{ENERGY_WATT_HOUR}" +# Degree units +UNIT_DEGREE = "°" + # Temperature units -TEMP_CELSIUS = "°C" -TEMP_FAHRENHEIT = "°F" +TEMP_CELSIUS = f"{UNIT_DEGREE}C" +TEMP_FAHRENHEIT = f"{UNIT_DEGREE}F" +TEMP_KELVIN = f"{UNIT_DEGREE}K" # Time units TIME_MICROSECONDS = "μs" @@ -410,6 +414,7 @@ UNIT_UV_INDEX: str = "UV index" # Percentage units UNIT_PERCENTAGE = "%" + # Irradiation units IRRADIATION_WATTS_PER_SQUARE_METER = f"{POWER_WATT}/{AREA_SQUARE_METERS}" diff --git a/tests/components/prometheus/test_init.py b/tests/components/prometheus/test_init.py index 66ee4d60bf3c..699df2c35053 100644 --- a/tests/components/prometheus/test_init.py +++ b/tests/components/prometheus/test_init.py @@ -9,6 +9,7 @@ from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, DEVICE_CLASS_POWER, ENERGY_KILO_WATT_HOUR, + UNIT_DEGREE, ) from homeassistant.setup import async_setup_component @@ -47,7 +48,7 @@ async def prometheus_client(loop, hass, hass_client): sensor3.entity_id = "sensor.electricity_price" await sensor3.async_update_ha_state() - sensor4 = DemoSensor(None, "Wind Direction", 25, None, "°", None) + sensor4 = DemoSensor(None, "Wind Direction", 25, None, UNIT_DEGREE, None) sensor4.hass = hass sensor4.entity_id = "sensor.wind_direction" await sensor4.async_update_ha_state() diff --git a/tests/components/yr/test_sensor.py b/tests/components/yr/test_sensor.py index 398acd7d5544..b500a03c4222 100644 --- a/tests/components/yr/test_sensor.py +++ b/tests/components/yr/test_sensor.py @@ -3,7 +3,7 @@ from datetime import datetime from unittest.mock import patch from homeassistant.bootstrap import async_setup_component -from homeassistant.const import SPEED_METERS_PER_SECOND, UNIT_PERCENTAGE +from homeassistant.const import SPEED_METERS_PER_SECOND, UNIT_DEGREE, UNIT_PERCENTAGE import homeassistant.util.dt as dt_util from tests.common import assert_setup_component, load_fixture @@ -59,7 +59,7 @@ async def test_custom_setup(hass, aioclient_mock): assert state.state == "1009.3" state = hass.states.get("sensor.yr_wind_direction") - assert state.attributes.get("unit_of_measurement") == "°" + assert state.attributes.get("unit_of_measurement") == UNIT_DEGREE assert state.state == "103.6" state = hass.states.get("sensor.yr_humidity") @@ -105,7 +105,7 @@ async def test_forecast_setup(hass, aioclient_mock): assert state.state == "1008.3" state = hass.states.get("sensor.yr_wind_direction") - assert state.attributes.get("unit_of_measurement") == "°" + assert state.attributes.get("unit_of_measurement") == UNIT_DEGREE assert state.state == "148.9" state = hass.states.get("sensor.yr_humidity") From d5f73378f0aafaf3837107a86dd2138068ed43d3 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Apr 2020 17:00:12 +0200 Subject: [PATCH 324/653] Upgrade pillow to 7.1.1 (#34025) Co-authored-by: Franck Nijhof --- homeassistant/components/doods/manifest.json | 2 +- homeassistant/components/proxy/manifest.json | 2 +- homeassistant/components/qrcode/manifest.json | 2 +- homeassistant/components/seven_segments/manifest.json | 2 +- homeassistant/components/sighthound/manifest.json | 2 +- homeassistant/components/tensorflow/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/doods/manifest.json b/homeassistant/components/doods/manifest.json index 2e7c9efc7c62..3fa20f2eea48 100644 --- a/homeassistant/components/doods/manifest.json +++ b/homeassistant/components/doods/manifest.json @@ -2,6 +2,6 @@ "domain": "doods", "name": "DOODS - Distributed Outside Object Detection Service", "documentation": "https://www.home-assistant.io/integrations/doods", - "requirements": ["pydoods==1.0.2", "pillow==7.0.0"], + "requirements": ["pydoods==1.0.2", "pillow==7.1.1"], "codeowners": [] } diff --git a/homeassistant/components/proxy/manifest.json b/homeassistant/components/proxy/manifest.json index a704e5ffa66d..89d25ca23b15 100644 --- a/homeassistant/components/proxy/manifest.json +++ b/homeassistant/components/proxy/manifest.json @@ -2,6 +2,6 @@ "domain": "proxy", "name": "Camera Proxy", "documentation": "https://www.home-assistant.io/integrations/proxy", - "requirements": ["pillow==7.0.0"], + "requirements": ["pillow==7.1.1"], "codeowners": [] } diff --git a/homeassistant/components/qrcode/manifest.json b/homeassistant/components/qrcode/manifest.json index 615fa1f75527..3b9df1a4e64d 100644 --- a/homeassistant/components/qrcode/manifest.json +++ b/homeassistant/components/qrcode/manifest.json @@ -2,6 +2,6 @@ "domain": "qrcode", "name": "QR Code", "documentation": "https://www.home-assistant.io/integrations/qrcode", - "requirements": ["pillow==7.0.0", "pyzbar==0.1.7"], + "requirements": ["pillow==7.1.1", "pyzbar==0.1.7"], "codeowners": [] } diff --git a/homeassistant/components/seven_segments/manifest.json b/homeassistant/components/seven_segments/manifest.json index 32cfcd415c6f..ef155676d1f5 100644 --- a/homeassistant/components/seven_segments/manifest.json +++ b/homeassistant/components/seven_segments/manifest.json @@ -2,6 +2,6 @@ "domain": "seven_segments", "name": "Seven Segments OCR", "documentation": "https://www.home-assistant.io/integrations/seven_segments", - "requirements": ["pillow==7.0.0"], + "requirements": ["pillow==7.1.1"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/sighthound/manifest.json b/homeassistant/components/sighthound/manifest.json index 3efe31d5a879..78f38f5316f1 100644 --- a/homeassistant/components/sighthound/manifest.json +++ b/homeassistant/components/sighthound/manifest.json @@ -2,6 +2,6 @@ "domain": "sighthound", "name": "Sighthound", "documentation": "https://www.home-assistant.io/integrations/sighthound", - "requirements": ["pillow==7.0.0", "simplehound==0.3"], + "requirements": ["pillow==7.1.1", "simplehound==0.3"], "codeowners": ["@robmarkcole"] } diff --git a/homeassistant/components/tensorflow/manifest.json b/homeassistant/components/tensorflow/manifest.json index b9ec8e847373..2ea292e8ff54 100644 --- a/homeassistant/components/tensorflow/manifest.json +++ b/homeassistant/components/tensorflow/manifest.json @@ -6,7 +6,7 @@ "tensorflow==1.13.2", "numpy==1.18.2", "protobuf==3.6.1", - "pillow==7.0.0" + "pillow==7.1.1" ], "codeowners": [] } diff --git a/requirements_all.txt b/requirements_all.txt index bc447e3ca0ff..608809177e93 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1035,7 +1035,7 @@ pilight==0.1.1 # homeassistant.components.seven_segments # homeassistant.components.sighthound # homeassistant.components.tensorflow -pillow==7.0.0 +pillow==7.1.1 # homeassistant.components.dominos pizzapi==0.0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 427ac0d68fa4..0e7a36f0d773 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -395,7 +395,7 @@ pilight==0.1.1 # homeassistant.components.seven_segments # homeassistant.components.sighthound # homeassistant.components.tensorflow -pillow==7.0.0 +pillow==7.1.1 # homeassistant.components.plex plexapi==3.3.0 From 8c4a139aeb5cdfad3ef354c04dfd2379c3b67596 Mon Sep 17 00:00:00 2001 From: Save me Date: Sat, 11 Apr 2020 17:55:00 +0200 Subject: [PATCH 325/653] Add config_flow for Roomba (#33302) * Add config_flow for roomba * Get options to connect * Fix options in config flow * Fix syntax in config_flow * Remove name (not necessary) * Add bin sensor * Add Battery sensor * Add async_connect * Fix typo * Add Model and Software version * Update Roombapy 1.5.0 * Add validate_input * Add connect and disconnect functions * Remove test config flow * Add variables after loop * Fix translate * Fix typo * Fix state of bin * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Remove invalid auth * Add call function reported_state * Add options reload * Fix tracelog * Set entry_id for config_entry * Fix DOMAIN unsed-import * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Add unique_id for entry * Fix device info * Add config_flow for roomba * Get options to connect * Fix options in config flow * Fix syntax in config_flow * Remove name (not necessary) * Add bin sensor * Add Battery sensor * Add async_connect * Fix typo * Add Model and Software version * Update Roombapy 1.5.0 * Add validate_input * Add connect and disconnect functions * Remove test config flow * Add variables after loop * Fix translate * Fix typo * Fix state of bin * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Remove invalid auth * Add call function reported_state * Add options reload * Fix tracelog * Set entry_id for config_entry * Fix DOMAIN unsed-import * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/config_flow.py Co-Authored-By: J. Nick Koston * Add unique_id for entry * Fix device info * syntax for mac (pyupgrade) * Change single key to BLID * Resolve dict conflict * Update homeassistant/components/roomba/binary_sensor.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/sensor.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/.translations/en.json Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/strings.json Co-Authored-By: J. Nick Koston * Add description * Revert "Remove test config flow" This reverts commit 26a89422e89d7c88dd3c0ec3066e607afdc99f09. * Add tests * Remove check if user none * Replace CONF_USERNAME to CONF_BLID (breaking change) * Update test_config_flow.py * Add code owners * Remove CONF_USERNAME (unused) * Add multiple vacuum * Add multiple vacuum * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Fix syntax name * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Remove CONF_PREFIX (unused) * Update homeassistant/components/roomba/sensor.py Co-Authored-By: J. Nick Koston * Add import UNIT_PERCENTAGE * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston * Update homeassistant/components/roomba/__init__.py Co-Authored-By: J. Nick Koston Co-authored-by: J. Nick Koston --- CODEOWNERS | 2 +- .../components/roomba/.translations/en.json | 33 +++ .../components/roomba/.translations/fr.json | 33 +++ homeassistant/components/roomba/__init__.py | 190 ++++++++++++++++++ .../components/roomba/binary_sensor.py | 74 +++++++ .../components/roomba/config_flow.py | 131 ++++++++++++ homeassistant/components/roomba/const.py | 13 ++ homeassistant/components/roomba/manifest.json | 6 +- homeassistant/components/roomba/sensor.py | 76 +++++++ homeassistant/components/roomba/strings.json | 33 +++ homeassistant/components/roomba/vacuum.py | 99 +++------ homeassistant/generated/config_flows.py | 1 + requirements_all.txt | 2 +- requirements_test_all.txt | 3 + tests/components/roomba/__init__.py | 1 + tests/components/roomba/test_config_flow.py | 159 +++++++++++++++ 16 files changed, 784 insertions(+), 72 deletions(-) create mode 100644 homeassistant/components/roomba/.translations/en.json create mode 100644 homeassistant/components/roomba/.translations/fr.json create mode 100644 homeassistant/components/roomba/binary_sensor.py create mode 100644 homeassistant/components/roomba/config_flow.py create mode 100644 homeassistant/components/roomba/const.py create mode 100644 homeassistant/components/roomba/sensor.py create mode 100644 homeassistant/components/roomba/strings.json create mode 100644 tests/components/roomba/__init__.py create mode 100644 tests/components/roomba/test_config_flow.py diff --git a/CODEOWNERS b/CODEOWNERS index cc1780793264..cdb61c591045 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -314,7 +314,7 @@ homeassistant/components/rfxtrx/* @danielhiversen homeassistant/components/ring/* @balloob homeassistant/components/rmvtransport/* @cgtobi homeassistant/components/roku/* @ctalkington -homeassistant/components/roomba/* @pschmitt +homeassistant/components/roomba/* @pschmitt @cyr-ius homeassistant/components/safe_mode/* @home-assistant/core homeassistant/components/saj/* @fredericvl homeassistant/components/salt/* @bjornorri diff --git a/homeassistant/components/roomba/.translations/en.json b/homeassistant/components/roomba/.translations/en.json new file mode 100644 index 000000000000..69e4c0c57609 --- /dev/null +++ b/homeassistant/components/roomba/.translations/en.json @@ -0,0 +1,33 @@ +{ + "config": { + "title": "iRobot Roomba", + "step": { + "user": { + "title": "Connect to the device", + "description": "Currently retrieving the BLID and password is a manual process. Please follow the steps outlined in the documentation at: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "data": { + "host": "Hostname or IP Address", + "blid": "BLID", + "password": "Password", + "certificate": "Certificate", + "continuous": "Continuous", + "delay": "Delay" + } + } + }, + "error": { + "unknown" : "Unexpected error", + "cannot_connect": "Failed to connect, please try again" + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Continuous", + "delay": "Delay" + } + } + } + } +} diff --git a/homeassistant/components/roomba/.translations/fr.json b/homeassistant/components/roomba/.translations/fr.json new file mode 100644 index 000000000000..5f59144727f5 --- /dev/null +++ b/homeassistant/components/roomba/.translations/fr.json @@ -0,0 +1,33 @@ +{ + "config": { + "title": "iRobot Roomba", + "step": { + "user": { + "title": "Connexion au périphérique", + "description": "Actuellement la récupération du BLID et du mot de passe nécessite une procédure manuelle. Veuillez suivre les étapes décrites dans la documentation sur: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "data": { + "host": "Nom ou Addresse IP", + "blid": "BLID", + "password": "Mot de passe", + "certificate": "Certificat", + "continuous": "Continue", + "delay": "Delais" + } + } + }, + "error": { + "unknown" : "Erreur imprévu", + "cannot_connect": "Impossible de se connecter" + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Continue", + "delay": "Delais" + } + } + } + } +} diff --git a/homeassistant/components/roomba/__init__.py b/homeassistant/components/roomba/__init__.py index c0e5f68483e9..2b4582610e1c 100644 --- a/homeassistant/components/roomba/__init__.py +++ b/homeassistant/components/roomba/__init__.py @@ -1 +1,191 @@ """The roomba component.""" +import asyncio +import logging + +import async_timeout +from roomba import Roomba, RoombaConnectionError +import voluptuous as vol + +from homeassistant import config_entries, exceptions +from homeassistant.const import CONF_HOST, CONF_PASSWORD +from homeassistant.core import callback +from homeassistant.helpers import config_validation as cv + +from .const import ( + BLID, + COMPONENTS, + CONF_BLID, + CONF_CERT, + CONF_CONTINUOUS, + CONF_DELAY, + CONF_NAME, + DEFAULT_CERT, + DEFAULT_CONTINUOUS, + DEFAULT_DELAY, + DOMAIN, + ROOMBA_SESSION, +) + +_LOGGER = logging.getLogger(__name__) + + +def _has_all_unique_bilds(value): + """Validate that each vacuum configured has a unique bild. + + Uniqueness is determined case-independently. + """ + bilds = [device[CONF_BLID] for device in value] + schema = vol.Schema(vol.Unique()) + schema(bilds) + return value + + +DEVICE_SCHEMA = vol.Schema( + { + vol.Required(CONF_HOST): str, + vol.Required(CONF_BLID): str, + vol.Required(CONF_PASSWORD): str, + vol.Optional(CONF_CERT, default=DEFAULT_CERT): str, + vol.Optional(CONF_CONTINUOUS, default=DEFAULT_CONTINUOUS): bool, + vol.Optional(CONF_DELAY, default=DEFAULT_DELAY): int, + }, +) + + +CONFIG_SCHEMA = vol.Schema( + {DOMAIN: vol.All(cv.ensure_list, [DEVICE_SCHEMA], _has_all_unique_bilds)}, + extra=vol.ALLOW_EXTRA, +) + + +async def async_setup(hass, config): + """Set up the roomba environment.""" + hass.data.setdefault(DOMAIN, {}) + + if DOMAIN not in config: + return True + for index, conf in enumerate(config[DOMAIN]): + _LOGGER.debug("Importing Roomba #%d - %s", index, conf[CONF_HOST]) + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=conf, + ) + ) + + return True + + +async def async_setup_entry(hass, config_entry): + """Set the config entry up.""" + # Set up roomba platforms with config entry + + if not config_entry.options: + hass.config_entries.async_update_entry( + config_entry, + options={ + "continuous": config_entry.data[CONF_CONTINUOUS], + "delay": config_entry.data[CONF_DELAY], + }, + ) + + roomba = Roomba( + address=config_entry.data[CONF_HOST], + blid=config_entry.data[CONF_BLID], + password=config_entry.data[CONF_PASSWORD], + cert_name=config_entry.data[CONF_CERT], + continuous=config_entry.options[CONF_CONTINUOUS], + delay=config_entry.options[CONF_DELAY], + ) + + try: + if not await async_connect_or_timeout(hass, roomba): + return False + except CannotConnect: + raise exceptions.ConfigEntryNotReady + + hass.data[DOMAIN][config_entry.entry_id] = { + ROOMBA_SESSION: roomba, + BLID: config_entry.data[CONF_BLID], + } + + for component in COMPONENTS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(config_entry, component) + ) + + if not config_entry.update_listeners: + config_entry.add_update_listener(async_update_options) + + return True + + +async def async_connect_or_timeout(hass, roomba): + """Connect to vacuum.""" + try: + name = None + with async_timeout.timeout(10): + _LOGGER.debug("Initialize connection to vacuum") + await hass.async_add_job(roomba.connect) + while not roomba.roomba_connected or name is None: + # Waiting for connection and check datas ready + name = roomba_reported_state(roomba).get("name", None) + if name: + break + await asyncio.sleep(1) + except RoombaConnectionError: + _LOGGER.error("Error to connect to vacuum") + raise CannotConnect + except asyncio.TimeoutError: + # api looping if user or password incorrect and roomba exist + await async_disconnect_or_timeout(hass, roomba) + _LOGGER.error("Timeout expired") + raise CannotConnect + + return {ROOMBA_SESSION: roomba, CONF_NAME: name} + + +async def async_disconnect_or_timeout(hass, roomba): + """Disconnect to vacuum.""" + _LOGGER.debug("Disconnect vacuum") + with async_timeout.timeout(3): + await hass.async_add_job(roomba.disconnect) + return True + + +async def async_update_options(hass, config_entry): + """Update options.""" + await hass.config_entries.async_reload(config_entry.entry_id) + + +async def async_unload_entry(hass, config_entry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(config_entry, component) + for component in COMPONENTS + ] + ) + ) + if unload_ok: + domain_data = hass.data[DOMAIN][config_entry.entry_id] + await async_disconnect_or_timeout(hass, roomba=domain_data[ROOMBA_SESSION]) + hass.data[DOMAIN].pop(config_entry.entry_id) + + return unload_ok + + +def roomba_reported_state(roomba): + """Roomba report.""" + return roomba.master_state.get("state", {}).get("reported", {}) + + +@callback +def _async_find_matching_config_entry(hass, prefix): + for entry in hass.config_entries.async_entries(DOMAIN): + if entry.unique_id == prefix: + return entry + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" diff --git a/homeassistant/components/roomba/binary_sensor.py b/homeassistant/components/roomba/binary_sensor.py new file mode 100644 index 000000000000..4ed3ab02418a --- /dev/null +++ b/homeassistant/components/roomba/binary_sensor.py @@ -0,0 +1,74 @@ +"""Roomba binary sensor entities.""" +import logging + +from homeassistant.components.binary_sensor import BinarySensorDevice + +from . import roomba_reported_state +from .const import BLID, DOMAIN, ROOMBA_SESSION + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up the iRobot Roomba vacuum cleaner.""" + domain_data = hass.data[DOMAIN][config_entry.entry_id] + roomba = domain_data[ROOMBA_SESSION] + blid = domain_data[BLID] + status = roomba_reported_state(roomba).get("bin", {}) + if "full" in status: + roomba_vac = RoombaBinStatus(roomba, blid) + async_add_entities([roomba_vac], True) + + +class RoombaBinStatus(BinarySensorDevice): + """Class to hold Roomba Sensor basic info.""" + + ICON = "mdi:delete-variant" + + def __init__(self, roomba, blid): + """Initialize the sensor object.""" + self.vacuum = roomba + self.vacuum_state = roomba_reported_state(roomba) + self._blid = blid + self._name = self.vacuum_state.get("name") + self._identifier = f"roomba_{self._blid}" + self._bin_status = None + + @property + def name(self): + """Return the name of the sensor.""" + return f"{self._name} Bin Full" + + @property + def unique_id(self): + """Return the ID of this sensor.""" + return f"bin_{self._blid}" + + @property + def icon(self): + """Return the icon of this sensor.""" + return self.ICON + + @property + def state(self): + """Return the state of the sensor.""" + return self._bin_status + + @property + def device_info(self): + """Return the device info of the vacuum cleaner.""" + return { + "identifiers": {(DOMAIN, self._identifier)}, + "name": str(self._name), + } + + async def async_update(self): + """Return the update info of the vacuum cleaner.""" + # No data, no update + if not self.vacuum.master_state: + _LOGGER.debug("Roomba %s has no data yet. Skip update", self.name) + return + self._bin_status = ( + roomba_reported_state(self.vacuum).get("bin", {}).get("full", False) + ) + _LOGGER.debug("Update Full Bin status from the vacuum: %s", self._bin_status) diff --git a/homeassistant/components/roomba/config_flow.py b/homeassistant/components/roomba/config_flow.py new file mode 100644 index 000000000000..3668984a41f2 --- /dev/null +++ b/homeassistant/components/roomba/config_flow.py @@ -0,0 +1,131 @@ +"""Config flow to configure roomba component.""" +import logging + +from roomba import Roomba +import voluptuous as vol + +from homeassistant import config_entries, core +from homeassistant.const import CONF_HOST, CONF_PASSWORD +from homeassistant.core import callback + +from . import CannotConnect, async_connect_or_timeout, async_disconnect_or_timeout +from .const import ( + CONF_BLID, + CONF_CERT, + CONF_CONTINUOUS, + CONF_DELAY, + CONF_NAME, + DEFAULT_CERT, + DEFAULT_CONTINUOUS, + DEFAULT_DELAY, + ROOMBA_SESSION, +) +from .const import DOMAIN # pylint:disable=unused-import + +DATA_SCHEMA = vol.Schema( + { + vol.Required(CONF_HOST): str, + vol.Required(CONF_BLID): str, + vol.Required(CONF_PASSWORD): str, + vol.Optional(CONF_CERT, default=DEFAULT_CERT): str, + vol.Optional(CONF_CONTINUOUS, default=DEFAULT_CONTINUOUS): bool, + vol.Optional(CONF_DELAY, default=DEFAULT_DELAY): int, + } +) + +_LOGGER = logging.getLogger(__name__) + + +async def validate_input(hass: core.HomeAssistant, data): + """Validate the user input allows us to connect. + + Data has the keys from DATA_SCHEMA with values provided by the user. + """ + roomba = Roomba( + address=data[CONF_HOST], + blid=data[CONF_BLID], + password=data[CONF_PASSWORD], + cert_name=data[CONF_CERT], + continuous=data[CONF_CONTINUOUS], + delay=data[CONF_DELAY], + ) + + info = await async_connect_or_timeout(hass, roomba) + + return { + ROOMBA_SESSION: info[ROOMBA_SESSION], + CONF_NAME: info[CONF_NAME], + CONF_HOST: data[CONF_HOST], + } + + +class RoombaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Roomba configuration flow.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_PUSH + + @staticmethod + @callback + def async_get_options_flow(config_entry): + """Get the options flow for this handler.""" + return OptionsFlowHandler(config_entry) + + async def async_step_import(self, import_info): + """Set the config entry up from yaml.""" + return await self.async_step_user(import_info) + + async def async_step_user(self, user_input=None): + """Handle a flow initialized by the user.""" + errors = {} + + if user_input is not None: + await self.async_set_unique_id(user_input[CONF_BLID]) + self._abort_if_unique_id_configured() + try: + info = await validate_input(self.hass, user_input) + except CannotConnect: + errors = {"base": "cannot_connect"} + except Exception: # pylint: disable=broad-except + errors = {"base": "unknown"} + + if "base" not in errors: + await async_disconnect_or_timeout(self.hass, info[ROOMBA_SESSION]) + return self.async_create_entry(title=info[CONF_NAME], data=user_input) + + return self.async_show_form( + step_id="user", data_schema=DATA_SCHEMA, errors=errors + ) + + +class OptionsFlowHandler(config_entries.OptionsFlow): + """Handle options.""" + + def __init__(self, config_entry): + """Initialize options flow.""" + self.config_entry = config_entry + + async def async_step_init(self, user_input=None): + """Manage the options.""" + if user_input is not None: + return self.async_create_entry(title="", data=user_input) + + return self.async_show_form( + step_id="init", + data_schema=vol.Schema( + { + vol.Optional( + CONF_CONTINUOUS, + default=self.config_entry.options.get( + CONF_CONTINUOUS, DEFAULT_CONTINUOUS + ), + ): bool, + vol.Optional( + CONF_DELAY, + default=self.config_entry.options.get( + CONF_DELAY, DEFAULT_DELAY + ), + ): int, + } + ), + ) diff --git a/homeassistant/components/roomba/const.py b/homeassistant/components/roomba/const.py new file mode 100644 index 000000000000..06684e63bdc2 --- /dev/null +++ b/homeassistant/components/roomba/const.py @@ -0,0 +1,13 @@ +"""The roomba constants.""" +DOMAIN = "roomba" +COMPONENTS = ["sensor", "binary_sensor", "vacuum"] +CONF_CERT = "certificate" +CONF_CONTINUOUS = "continuous" +CONF_DELAY = "delay" +CONF_NAME = "name" +CONF_BLID = "blid" +DEFAULT_CERT = "/etc/ssl/certs/ca-certificates.crt" +DEFAULT_CONTINUOUS = True +DEFAULT_DELAY = 1 +ROOMBA_SESSION = "roomba_session" +BLID = "blid_key" diff --git a/homeassistant/components/roomba/manifest.json b/homeassistant/components/roomba/manifest.json index 942ebd084262..6ef71bb95244 100644 --- a/homeassistant/components/roomba/manifest.json +++ b/homeassistant/components/roomba/manifest.json @@ -1,7 +1,9 @@ { "domain": "roomba", "name": "iRobot Roomba", + "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/roomba", - "requirements": ["roombapy==1.4.3"], - "codeowners": ["@pschmitt"] + "requirements": ["roombapy==1.5.0"], + "dependencies": [], + "codeowners": ["@pschmitt", "@cyr-ius"] } diff --git a/homeassistant/components/roomba/sensor.py b/homeassistant/components/roomba/sensor.py new file mode 100644 index 000000000000..2f3a6c53555b --- /dev/null +++ b/homeassistant/components/roomba/sensor.py @@ -0,0 +1,76 @@ +"""Sensor for checking the battery level of Roomba.""" +import logging + +from homeassistant.const import DEVICE_CLASS_BATTERY, UNIT_PERCENTAGE +from homeassistant.helpers.entity import Entity + +from . import roomba_reported_state +from .const import BLID, DOMAIN, ROOMBA_SESSION + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up the iRobot Roomba vacuum cleaner.""" + domain_data = hass.data[DOMAIN][config_entry.entry_id] + roomba = domain_data[ROOMBA_SESSION] + blid = domain_data[BLID] + roomba_vac = RoombaBattery(roomba, blid) + async_add_entities([roomba_vac], True) + + +class RoombaBattery(Entity): + """Class to hold Roomba Sensor basic info.""" + + def __init__(self, roomba, blid): + """Initialize the sensor object.""" + self.vacuum = roomba + self.vacuum_state = roomba_reported_state(roomba) + self._blid = blid + self._name = self.vacuum_state.get("name") + self._identifier = f"roomba_{self._blid}" + self._battery_level = None + + @property + def name(self): + """Return the name of the sensor.""" + return f"{self._name} Battery Level" + + @property + def unique_id(self): + """Return the ID of this sensor.""" + return f"battery_{self._blid}" + + @property + def device_class(self): + """Return the device class of the sensor.""" + return DEVICE_CLASS_BATTERY + + @property + def unit_of_measurement(self): + """Return the unit_of_measurement of the device.""" + return UNIT_PERCENTAGE + + @property + def state(self): + """Return the state of the sensor.""" + return self._battery_level + + @property + def device_info(self): + """Return the device info of the vacuum cleaner.""" + return { + "identifiers": {(DOMAIN, self._identifier)}, + "name": str(self._name), + } + + async def async_update(self): + """Return the update info of the vacuum cleaner.""" + # No data, no update + if not self.vacuum.master_state: + _LOGGER.debug("Roomba %s has no data yet. Skip update", self.name) + return + self._battery_level = roomba_reported_state(self.vacuum).get("batPct") + _LOGGER.debug( + "Update battery level status from the vacuum: %s", self._battery_level + ) diff --git a/homeassistant/components/roomba/strings.json b/homeassistant/components/roomba/strings.json new file mode 100644 index 000000000000..403d1980b948 --- /dev/null +++ b/homeassistant/components/roomba/strings.json @@ -0,0 +1,33 @@ +{ + "config": { + "title": "iRobot Roomba", + "step": { + "user": { + "title": "Connect to the device", + "description": "Currently retrieving the BLID and password is a manual process. Please follow the steps outlined in the documentation at: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "data": { + "host": "Hostname or IP Address", + "blid": "BLID", + "password": "Password", + "certificate": "Certificate", + "continuous": "Continuous", + "delay": "Delay" + } + } + }, + "error": { + "unknown": "Unexpected error", + "cannot_connect": "Failed to connect, please try again" + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Continuous", + "delay": "Delay" + } + } + } + } +} diff --git a/homeassistant/components/roomba/vacuum.py b/homeassistant/components/roomba/vacuum.py index 172a494b602e..80dbbc312ea1 100644 --- a/homeassistant/components/roomba/vacuum.py +++ b/homeassistant/components/roomba/vacuum.py @@ -1,13 +1,7 @@ """Support for Wi-Fi enabled iRobot Roombas.""" -import asyncio import logging -import async_timeout -from roomba import Roomba -import voluptuous as vol - from homeassistant.components.vacuum import ( - PLATFORM_SCHEMA, SUPPORT_BATTERY, SUPPORT_FAN_SPEED, SUPPORT_LOCATE, @@ -20,9 +14,9 @@ from homeassistant.components.vacuum import ( SUPPORT_TURN_ON, VacuumDevice, ) -from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME -from homeassistant.exceptions import PlatformNotReady -import homeassistant.helpers.config_validation as cv + +from . import roomba_reported_state +from .const import BLID, DOMAIN, ROOMBA_SESSION _LOGGER = logging.getLogger(__name__) @@ -37,34 +31,11 @@ ATTR_SOFTWARE_VERSION = "software_version" CAP_POSITION = "position" CAP_CARPET_BOOST = "carpet_boost" -CONF_CERT = "certificate" -CONF_CONTINUOUS = "continuous" -CONF_DELAY = "delay" - -DEFAULT_CERT = "/etc/ssl/certs/ca-certificates.crt" -DEFAULT_CONTINUOUS = True -DEFAULT_DELAY = 1 -DEFAULT_NAME = "Roomba" - -PLATFORM = "roomba" - FAN_SPEED_AUTOMATIC = "Automatic" FAN_SPEED_ECO = "Eco" FAN_SPEED_PERFORMANCE = "Performance" FAN_SPEEDS = [FAN_SPEED_AUTOMATIC, FAN_SPEED_ECO, FAN_SPEED_PERFORMANCE] -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_CERT, default=DEFAULT_CERT): cv.string, - vol.Optional(CONF_CONTINUOUS, default=DEFAULT_CONTINUOUS): cv.boolean, - vol.Optional(CONF_DELAY, default=DEFAULT_DELAY): cv.positive_int, - }, - extra=vol.ALLOW_EXTRA, -) # Commonly supported features SUPPORT_ROOMBA = ( @@ -83,57 +54,49 @@ SUPPORT_ROOMBA = ( SUPPORT_ROOMBA_CARPET_BOOST = SUPPORT_ROOMBA | SUPPORT_FAN_SPEED -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Set up the iRobot Roomba vacuum cleaner platform.""" - - if PLATFORM not in hass.data: - hass.data[PLATFORM] = {} - - host = config.get(CONF_HOST) - name = config.get(CONF_NAME) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - certificate = config.get(CONF_CERT) - continuous = config.get(CONF_CONTINUOUS) - delay = config.get(CONF_DELAY) - - roomba = Roomba( - address=host, - blid=username, - password=password, - cert_name=certificate, - continuous=continuous, - delay=delay, - ) - _LOGGER.debug("Initializing communication with host %s", host) - - try: - with async_timeout.timeout(9): - await hass.async_add_job(roomba.connect) - except asyncio.TimeoutError: - raise PlatformNotReady - - roomba_vac = RoombaVacuum(name, roomba) - hass.data[PLATFORM][host] = roomba_vac - +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up the iRobot Roomba vacuum cleaner.""" + domain_data = hass.data[DOMAIN][config_entry.entry_id] + roomba = domain_data[ROOMBA_SESSION] + blid = domain_data[BLID] + roomba_vac = RoombaVacuum(roomba, blid) async_add_entities([roomba_vac], True) class RoombaVacuum(VacuumDevice): """Representation of a Roomba Vacuum cleaner robot.""" - def __init__(self, name, roomba): + def __init__(self, roomba, blid): """Initialize the Roomba handler.""" self._available = False self._battery_level = None self._capabilities = {} self._fan_speed = None self._is_on = False - self._name = name self._state_attrs = {} self._status = None self.vacuum = roomba - self.vacuum_state = None + self.vacuum_state = roomba_reported_state(roomba) + self._blid = blid + self._name = self.vacuum_state.get("name") + self._version = self.vacuum_state.get("softwareVer") + self._sku = self.vacuum_state.get("sku") + + @property + def unique_id(self): + """Return the uniqueid of the vacuum cleaner.""" + return f"roomba_{self._blid}" + + @property + def device_info(self): + """Return the device info of the vacuum cleaner.""" + return { + "identifiers": {(DOMAIN, self.unique_id)}, + "manufacturer": "iRobot", + "name": str(self._name), + "sw_version": self._version, + "model": self._sku, + } @property def supported_features(self): diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index bbc6c7d2cfbc..0e78ddecc4b6 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -97,6 +97,7 @@ FLOWS = [ "rainmachine", "ring", "roku", + "roomba", "samsungtv", "sense", "sentry", diff --git a/requirements_all.txt b/requirements_all.txt index 608809177e93..b104ae232a0d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1815,7 +1815,7 @@ rocketchat-API==0.6.1 roku==4.1.0 # homeassistant.components.roomba -roombapy==1.4.3 +roombapy==1.5.0 # homeassistant.components.rova rova==0.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0e7a36f0d773..86e9c9a001b9 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -684,6 +684,9 @@ ring_doorbell==0.6.0 # homeassistant.components.roku roku==4.1.0 +# homeassistant.components.roomba +roombapy==1.5.0 + # homeassistant.components.yamaha rxv==0.6.0 diff --git a/tests/components/roomba/__init__.py b/tests/components/roomba/__init__.py new file mode 100644 index 000000000000..a255e21c709c --- /dev/null +++ b/tests/components/roomba/__init__.py @@ -0,0 +1 @@ +"""Tests for the iRobot Roomba integration.""" diff --git a/tests/components/roomba/test_config_flow.py b/tests/components/roomba/test_config_flow.py new file mode 100644 index 000000000000..c9a0d8fde17c --- /dev/null +++ b/tests/components/roomba/test_config_flow.py @@ -0,0 +1,159 @@ +"""Test the iRobot Roomba config flow.""" +from asynctest import MagicMock, PropertyMock, patch +from roomba import RoombaConnectionError + +from homeassistant import config_entries, data_entry_flow, setup +from homeassistant.components.roomba.const import ( + CONF_BLID, + CONF_CERT, + CONF_CONTINUOUS, + CONF_DELAY, + DOMAIN, +) +from homeassistant.const import CONF_HOST, CONF_PASSWORD + +from tests.common import MockConfigEntry + +VALID_CONFIG = {CONF_HOST: "1.2.3.4", CONF_BLID: "blid", CONF_PASSWORD: "password"} + +VALID_YAML_CONFIG = { + CONF_HOST: "1.2.3.4", + CONF_BLID: "blid", + CONF_PASSWORD: "password", + CONF_CERT: "/etc/ssl/certs/ca-certificates.crt", + CONF_CONTINUOUS: True, + CONF_DELAY: 1, +} + + +def _create_mocked_roomba( + roomba_connected=None, master_state=None, connect=None, disconnect=None +): + mocked_roomba = MagicMock() + type(mocked_roomba).roomba_connected = PropertyMock(return_value=roomba_connected) + type(mocked_roomba).master_state = PropertyMock(return_value=master_state) + type(mocked_roomba).connect = MagicMock(side_effect=connect) + type(mocked_roomba).disconnect = MagicMock(side_effect=disconnect) + return mocked_roomba + + +async def test_form(hass): + """Test we get the form.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + 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["errors"] == {} + + mocked_roomba = _create_mocked_roomba( + roomba_connected=True, + master_state={"state": {"reported": {"name": "myroomba"}}}, + ) + + with patch( + "homeassistant.components.roomba.config_flow.Roomba", + return_value=mocked_roomba, + ), patch( + "homeassistant.components.roomba.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.roomba.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], VALID_CONFIG, + ) + + assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result2["title"] == "myroomba" + + assert result2["result"].unique_id == "blid" + assert result2["data"] == { + CONF_BLID: "blid", + CONF_CERT: "/etc/ssl/certs/ca-certificates.crt", + CONF_CONTINUOUS: True, + CONF_DELAY: 1, + CONF_HOST: "1.2.3.4", + CONF_PASSWORD: "password", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_cannot_connect(hass): + """Test we handle cannot connect error.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + mocked_roomba = _create_mocked_roomba( + connect=RoombaConnectionError, + roomba_connected=True, + master_state={"state": {"reported": {"name": "myroomba"}}}, + ) + + with patch( + "homeassistant.components.roomba.config_flow.Roomba", + return_value=mocked_roomba, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], VALID_CONFIG, + ) + + assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result2["errors"] == {"base": "cannot_connect"} + + +async def test_form_import(hass): + """Test we can import yaml config.""" + + mocked_roomba = _create_mocked_roomba( + roomba_connected=True, + master_state={"state": {"reported": {"name": "imported_roomba"}}}, + ) + + with patch( + "homeassistant.components.roomba.config_flow.Roomba", + return_value=mocked_roomba, + ), patch( + "homeassistant.components.roomba.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.roomba.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data=VALID_YAML_CONFIG.copy(), + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == "blid" + assert result["title"] == "imported_roomba" + assert result["data"] == { + CONF_BLID: "blid", + CONF_CERT: "/etc/ssl/certs/ca-certificates.crt", + CONF_CONTINUOUS: True, + CONF_DELAY: 1, + CONF_HOST: "1.2.3.4", + CONF_PASSWORD: "password", + } + + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_import_dupe(hass): + """Test we get abort on duplicate import.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + entry = MockConfigEntry(domain=DOMAIN, data=VALID_CONFIG, unique_id="blid") + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data=VALID_YAML_CONFIG.copy(), + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" From 946b77e2ecd70d404fe90a98d7145b0052a7a75b Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Sat, 11 Apr 2020 12:01:49 -0400 Subject: [PATCH 326/653] Use ZigbeeException instead of DeliveryError in ZHA (#33993) * Use ZigbeeException instead of DeliveryError * cleanup get_attributes --- .../components/zha/core/channels/base.py | 21 +++++++------------ .../components/zha/core/channels/hvac.py | 4 ++-- .../components/zha/core/channels/security.py | 4 ++-- homeassistant/components/zha/core/device.py | 4 ++-- homeassistant/components/zha/fan.py | 4 ++-- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/zha/core/channels/base.py b/homeassistant/components/zha/core/channels/base.py index 995d109941d8..83accc5b86c6 100644 --- a/homeassistant/components/zha/core/channels/base.py +++ b/homeassistant/components/zha/core/channels/base.py @@ -56,7 +56,7 @@ def decorate_command(channel, command): ) return result - except (zigpy.exceptions.DeliveryError, asyncio.TimeoutError) as ex: + except (zigpy.exceptions.ZigbeeException, asyncio.TimeoutError) as ex: channel.debug("command failed: %s exception: %s", command.__name__, str(ex)) return ex @@ -135,13 +135,13 @@ class ZigbeeChannel(LogMixin): async def bind(self): """Bind a zigbee cluster. - This also swallows DeliveryError exceptions that are thrown when + This also swallows ZigbeeException exceptions that are thrown when devices are unreachable. """ try: res = await self.cluster.bind() self.debug("bound '%s' cluster: %s", self.cluster.ep_attribute, res[0]) - except (zigpy.exceptions.DeliveryError, asyncio.TimeoutError) as ex: + except (zigpy.exceptions.ZigbeeException, asyncio.TimeoutError) as ex: self.debug( "Failed to bind '%s' cluster: %s", self.cluster.ep_attribute, str(ex) ) @@ -149,7 +149,7 @@ class ZigbeeChannel(LogMixin): async def configure_reporting(self) -> None: """Configure attribute reporting for a cluster. - This also swallows DeliveryError exceptions that are thrown when + This also swallows ZigbeeException exceptions that are thrown when devices are unreachable. """ kwargs = {} @@ -173,7 +173,7 @@ class ZigbeeChannel(LogMixin): reportable_change, res, ) - except (zigpy.exceptions.DeliveryError, asyncio.TimeoutError) as ex: + except (zigpy.exceptions.ZigbeeException, asyncio.TimeoutError) as ex: self.debug( "failed to set reporting for '%s' attr on '%s' cluster: %s", attr_name, @@ -263,20 +263,15 @@ class ZigbeeChannel(LogMixin): only_cache=from_cache, manufacturer=manufacturer, ) - results = { - attribute: result.get(attribute) - for attribute in attributes - if result.get(attribute) is not None - } - except (asyncio.TimeoutError, zigpy.exceptions.DeliveryError) as ex: + return result + except (asyncio.TimeoutError, zigpy.exceptions.ZigbeeException) as ex: self.debug( "failed to get attributes '%s' on '%s' cluster: %s", attributes, self.cluster.ep_attribute, str(ex), ) - results = {} - return results + return {} def log(self, level, msg, *args): """Log a message.""" diff --git a/homeassistant/components/zha/core/channels/hvac.py b/homeassistant/components/zha/core/channels/hvac.py index bd90b907d3b6..3c58ff946b91 100644 --- a/homeassistant/components/zha/core/channels/hvac.py +++ b/homeassistant/components/zha/core/channels/hvac.py @@ -1,7 +1,7 @@ """HVAC channels module for Zigbee Home Automation.""" import logging -from zigpy.exceptions import DeliveryError +from zigpy.exceptions import ZigbeeException import zigpy.zcl.clusters.hvac as hvac from homeassistant.core import callback @@ -31,7 +31,7 @@ class FanChannel(ZigbeeChannel): try: await self.cluster.write_attributes({"fan_mode": value}) - except DeliveryError as ex: + except ZigbeeException as ex: self.error("Could not set speed: %s", ex) return diff --git a/homeassistant/components/zha/core/channels/security.py b/homeassistant/components/zha/core/channels/security.py index 914c11331162..b2b6f74c0de3 100644 --- a/homeassistant/components/zha/core/channels/security.py +++ b/homeassistant/components/zha/core/channels/security.py @@ -7,7 +7,7 @@ https://home-assistant.io/integrations/zha/ import asyncio import logging -from zigpy.exceptions import DeliveryError +from zigpy.exceptions import ZigbeeException import zigpy.zcl.clusters.security as security from homeassistant.core import callback @@ -151,7 +151,7 @@ class IASZoneChannel(ZigbeeChannel): self._cluster.ep_attribute, res[0], ) - except DeliveryError as ex: + except ZigbeeException as ex: self.debug( "Failed to write cie_addr: %s to '%s' cluster: %s", str(ieee), diff --git a/homeassistant/components/zha/core/device.py b/homeassistant/components/zha/core/device.py index 5782ce230837..b4947d121e4d 100644 --- a/homeassistant/components/zha/core/device.py +++ b/homeassistant/components/zha/core/device.py @@ -511,7 +511,7 @@ class ZHADevice(LogMixin): response, ) return response - except zigpy.exceptions.DeliveryError as exc: + except zigpy.exceptions.ZigbeeException as exc: self.debug( "failed to set attribute: %s %s %s %s %s", f"{ATTR_VALUE}: {value}", @@ -563,7 +563,7 @@ class ZHADevice(LogMixin): """Remove this device from the provided zigbee group.""" try: await self._zigpy_device.remove_from_group(group_id) - except (zigpy.exceptions.DeliveryError, asyncio.TimeoutError) as ex: + except (zigpy.exceptions.ZigbeeException, asyncio.TimeoutError) as ex: self.debug( "Failed to remove device '%s' from group: 0x%04x ex: %s", self._zigpy_device.ieee, diff --git a/homeassistant/components/zha/fan.py b/homeassistant/components/zha/fan.py index 8a9dc2691fc9..c7a13a4f34fb 100644 --- a/homeassistant/components/zha/fan.py +++ b/homeassistant/components/zha/fan.py @@ -3,7 +3,7 @@ import functools import logging from typing import List -from zigpy.exceptions import DeliveryError +from zigpy.exceptions import ZigbeeException import zigpy.zcl.clusters.hvac as hvac from homeassistant.components.fan import ( @@ -177,7 +177,7 @@ class FanGroup(BaseFan, ZhaGroupEntity): """Set the speed of the fan.""" try: await self._fan_channel.write_attributes({"fan_mode": value}) - except DeliveryError as ex: + except ZigbeeException as ex: self.error("Could not set speed: %s", ex) return From 6e6ebb949528782731000e153ec89486980759cf Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Apr 2020 11:17:57 -0500 Subject: [PATCH 327/653] Add tests for various NUT upses (#34034) --- tests/components/nut/test_config_flow.py | 11 ++-- tests/components/nut/test_sensor.py | 67 ++++++++++++++++++++++++ tests/components/nut/util.py | 47 +++++++++++++++++ tests/fixtures/nut/5E850I.json | 37 +++++++++++++ tests/fixtures/nut/CP1350C.json | 39 ++++++++++++++ tests/fixtures/nut/PR3000RT2U.json | 39 ++++++++++++++ 6 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 tests/components/nut/test_sensor.py create mode 100644 tests/components/nut/util.py create mode 100644 tests/fixtures/nut/5E850I.json create mode 100644 tests/fixtures/nut/CP1350C.json create mode 100644 tests/fixtures/nut/PR3000RT2U.json diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index c110df0576ae..360d97d13c4d 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -1,10 +1,12 @@ """Test the Network UPS Tools (NUT) config flow.""" -from asynctest import MagicMock, patch +from asynctest import patch from homeassistant import config_entries, data_entry_flow, setup from homeassistant.components.nut.const import DOMAIN from homeassistant.const import CONF_RESOURCES +from .util import _get_mock_pynutclient + from tests.common import MockConfigEntry VALID_CONFIG = { @@ -15,13 +17,6 @@ VALID_CONFIG = { } -def _get_mock_pynutclient(list_vars=None, list_ups=None): - pynutclient = MagicMock() - type(pynutclient).list_ups = MagicMock(return_value=list_ups) - type(pynutclient).list_vars = MagicMock(return_value=list_vars) - return pynutclient - - async def test_form_user_one_ups(hass): """Test we get the form.""" await setup.async_setup_component(hass, "persistent_notification", {}) diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py new file mode 100644 index 000000000000..2e4610505075 --- /dev/null +++ b/tests/components/nut/test_sensor.py @@ -0,0 +1,67 @@ +"""The sensor tests for the nut platform.""" + + +from .util import async_init_integration + + +async def test_pr3000rt2u(hass): + """Test creation of PR3000RT2U sensors.""" + + await async_init_integration(hass, "PR3000RT2U", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_cp1350c(hass): + """Test creation of CP1350C sensors.""" + + await async_init_integration(hass, "CP1350C", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_5e850i(hass): + """Test creation of 5E850I sensors.""" + + await async_init_integration(hass, "5E850I", ["battery.charge"]) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) diff --git a/tests/components/nut/util.py b/tests/components/nut/util.py new file mode 100644 index 000000000000..5bd29042ea8a --- /dev/null +++ b/tests/components/nut/util.py @@ -0,0 +1,47 @@ +"""Tests for the nut integration.""" + +import json + +from asynctest import MagicMock, patch + +from homeassistant.components.nut.const import DOMAIN +from homeassistant.const import CONF_HOST, CONF_PORT, CONF_RESOURCES +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry, load_fixture + + +def _get_mock_pynutclient(list_vars=None, list_ups=None): + pynutclient = MagicMock() + type(pynutclient).list_ups = MagicMock(return_value=list_ups) + type(pynutclient).list_vars = MagicMock(return_value=list_vars) + return pynutclient + + +async def async_init_integration( + hass: HomeAssistant, ups_fixture: str, resources: list +) -> MockConfigEntry: + """Set up the nexia integration in Home Assistant.""" + + ups_fixture = f"nut/{ups_fixture}.json" + list_vars = json.loads(load_fixture(ups_fixture)) + + import pprint + + pprint.pprint(list_vars) + + mock_pynut = _get_mock_pynutclient(list_ups={"ups1": "UPS 1"}, list_vars=list_vars) + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ): + entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_HOST: "mock", CONF_PORT: "mock", CONF_RESOURCES: resources}, + ) + entry.add_to_hass(hass) + + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + return entry diff --git a/tests/fixtures/nut/5E850I.json b/tests/fixtures/nut/5E850I.json new file mode 100644 index 000000000000..6488a5498bf9 --- /dev/null +++ b/tests/fixtures/nut/5E850I.json @@ -0,0 +1,37 @@ +{ + "driver.parameter.pollfreq" : "30", + "ups.power.nominal" : "850", + "battery.type" : "PbAc", + "driver.parameter.synchronous" : "no", + "driver.version" : "2.7.4", + "battery.runtime" : "1759", + "driver.version.internal" : "0.41", + "driver.name" : "usbhid-ups", + "outlet.desc" : "Main Outlet", + "ups.productid" : "ffff", + "ups.firmware" : "03.08.0018", + "output.frequency" : "50.0", + "device.model" : "5E 850i", + "output.voltage" : "238.0", + "ups.mfr" : "EATON", + "ups.load" : "21", + "outlet.id" : "1", + "device.type" : "ups", + "ups.timer.shutdown" : "-1", + "output.frequency.nominal" : "50", + "ups.delay.shutdown" : "20", + "input.voltage" : "240.0", + "ups.vendorid" : "0463", + "ups.model" : "5E 850i", + "driver.version.data" : "MGE HID 1.39", + "outlet.switchable" : "no", + "outlet.1.status" : "on", + "output.voltage.nominal" : "230", + "driver.parameter.port" : "auto", + "device.mfr" : "EATON", + "ups.start.battery" : "yes", + "ups.beeper.status" : "enabled", + "ups.status" : "OL", + "driver.parameter.pollinterval" : "2", + "battery.charge" : "100" +} diff --git a/tests/fixtures/nut/CP1350C.json b/tests/fixtures/nut/CP1350C.json new file mode 100644 index 000000000000..5f66883172ce --- /dev/null +++ b/tests/fixtures/nut/CP1350C.json @@ -0,0 +1,39 @@ +{ + "device.model" : " CP 1350C", + "ups.model" : " CP 1350C", + "battery.voltage.nominal" : "12", + "ups.delay.start" : "30", + "ups.realpower.nominal" : "298", + "ups.vendorid" : "0764", + "ups.mfr" : "CPS", + "driver.version" : "2.7.4", + "ups.delay.shutdown" : "20", + "battery.type" : "PbAcid", + "battery.voltage" : "14.0", + "ups.load" : "27", + "battery.charge.low" : "10", + "ups.beeper.status" : "enabled", + "device.mfr" : "CPS", + "battery.runtime" : "1225", + "driver.version.internal" : "0.41", + "input.voltage.nominal" : "230", + "input.transfer.high" : "280", + "driver.version.data" : "CyberPower HID 0.4", + "driver.parameter.port" : "/dev/ttyS1", + "input.voltage" : "236.0", + "battery.runtime.low" : "300", + "driver.parameter.pollinterval" : "2", + "driver.parameter.pollfreq" : "30", + "ups.timer.shutdown" : "-60", + "input.transfer.low" : "180", + "device.type" : "ups", + "battery.mfr.date" : "CPS", + "battery.charge" : "100", + "battery.charge.warning" : "20", + "ups.productid" : "0501", + "driver.name" : "usbhid-ups", + "output.voltage" : "236.0", + "driver.parameter.synchronous" : "no", + "ups.timer.start" : "0", + "ups.status" : "OL" +} diff --git a/tests/fixtures/nut/PR3000RT2U.json b/tests/fixtures/nut/PR3000RT2U.json new file mode 100644 index 000000000000..22742366d181 --- /dev/null +++ b/tests/fixtures/nut/PR3000RT2U.json @@ -0,0 +1,39 @@ +{ + "ups.delay.shutdown" : "20", + "driver.parameter.pollfreq" : "30", + "ups.delay.start" : "30", + "ups.mfr" : "CPS", + "battery.charge.warning" : "35", + "battery.type" : "PbAcid", + "battery.charge" : "100", + "battery.mfr.date" : "CPS", + "output.voltage" : "264.0", + "ups.productid" : "0601", + "input.voltage.nominal" : "120", + "driver.parameter.port" : "auto", + "input.voltage" : "120.0", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.vendorid" : "0764", + "battery.voltage" : "1.2", + "device.model" : "PR3000RT2U", + "driver.parameter.pollinterval" : "5", + "device.type" : "ups", + "battery.charge.low" : "0", + "ups.model" : "PR3000RT2U", + "ups.test.result" : "No test initiated", + "driver.version.data" : "CyberPower HID 0.3", + "ups.serial" : "PYVJO2000034", + "battery.voltage.nominal" : "22", + "ups.beeper.status" : "enabled", + "battery.runtime.low" : "300", + "battery.runtime" : "2644", + "driver.version.internal" : "0.38", + "ups.realpower.nominal" : "3000", + "device.serial" : "PYVJO2000034", + "driver.name" : "usbhid-ups", + "device.mfr" : "CPS", + "ups.load" : "12", + "ups.timer.shutdown" : "0", + "ups.timer.start" : "0", + "ups.status" : "OL" +} From ea9f1376a6450f8c8698d097bc954e2ee1fce24b Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sat, 11 Apr 2020 21:20:19 +0300 Subject: [PATCH 328/653] Fix docstring in test_utils/aiohttp.py (#34040) * fix docstring * fixed empty spaces --- tests/test_util/aiohttp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_util/aiohttp.py b/tests/test_util/aiohttp.py index 23112de55587..9b2a4380caeb 100644 --- a/tests/test_util/aiohttp.py +++ b/tests/test_util/aiohttp.py @@ -322,6 +322,9 @@ class MockLongPollSideEffect: self.semaphore.release() def stop(self): - """Stop the current request and future ones. Avoids exception if there is someone waiting when exiting test.""" + """Stop the current request and future ones. + + This avoids an exception if there is someone waiting when exiting test. + """ self.stopping = True self.queue_response(exc=ClientError()) From 123ae941a97592e493f4e1b05868905a970bd3c0 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 11 Apr 2020 21:10:15 +0200 Subject: [PATCH 329/653] Various camera test improvements (#34022) --- tests/components/camera/common.py | 58 ++---------------- tests/components/camera/test_init.py | 42 ++++++++----- tests/components/demo/test_camera.py | 91 ++++++++++++++++++---------- 3 files changed, 90 insertions(+), 101 deletions(-) diff --git a/tests/components/camera/common.py b/tests/components/camera/common.py index 8c05295b5d1d..93e2596e343a 100644 --- a/tests/components/camera/common.py +++ b/tests/components/camera/common.py @@ -3,63 +3,13 @@ All containing methods are legacy helpers that should not be used by new components. Instead call the service directly. """ -from homeassistant.components.camera import ( - ATTR_FILENAME, - SERVICE_ENABLE_MOTION, - SERVICE_SNAPSHOT, -) -from homeassistant.components.camera.const import ( - DATA_CAMERA_PREFS, - DOMAIN, - PREF_PRELOAD_STREAM, -) -from homeassistant.const import ( - ATTR_ENTITY_ID, - ENTITY_MATCH_ALL, - SERVICE_TURN_OFF, - SERVICE_TURN_ON, -) -from homeassistant.core import callback -from homeassistant.loader import bind_hass +from homeassistant.components.camera.const import DATA_CAMERA_PREFS, PREF_PRELOAD_STREAM -@bind_hass -async def async_turn_off(hass, entity_id=ENTITY_MATCH_ALL): - """Turn off camera.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - await hass.services.async_call(DOMAIN, SERVICE_TURN_OFF, data) - - -@bind_hass -async def async_turn_on(hass, entity_id=ENTITY_MATCH_ALL): - """Turn on camera, and set operation mode.""" - data = {} - if entity_id is not None: - data[ATTR_ENTITY_ID] = entity_id - - await hass.services.async_call(DOMAIN, SERVICE_TURN_ON, data) - - -@bind_hass -def enable_motion_detection(hass, entity_id=ENTITY_MATCH_ALL): - """Enable Motion Detection.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else None - hass.async_add_job(hass.services.async_call(DOMAIN, SERVICE_ENABLE_MOTION, data)) - - -@bind_hass -@callback -def async_snapshot(hass, filename, entity_id=ENTITY_MATCH_ALL): - """Make a snapshot from a camera.""" - data = {ATTR_ENTITY_ID: entity_id} if entity_id else {} - data[ATTR_FILENAME] = filename - - hass.async_add_job(hass.services.async_call(DOMAIN, SERVICE_SNAPSHOT, data)) - - -def mock_camera_prefs(hass, entity_id, prefs={}): +def mock_camera_prefs(hass, entity_id, prefs=None): """Fixture for cloud component.""" prefs_to_set = {PREF_PRELOAD_STREAM: True} - prefs_to_set.update(prefs) + if prefs is not None: + prefs_to_set.update(prefs) hass.data[DATA_CAMERA_PREFS]._prefs[entity_id] = prefs_to_set return prefs_to_set diff --git a/tests/components/camera/test_init.py b/tests/components/camera/test_init.py index 23c04fe347e3..cb4201e29579 100644 --- a/tests/components/camera/test_init.py +++ b/tests/components/camera/test_init.py @@ -102,8 +102,15 @@ async def test_snapshot_service(hass, mock_camera): with patch( "homeassistant.components.camera.open", mopen, create=True ), patch.object(hass.config, "is_allowed_path", return_value=True): - common.async_snapshot(hass, "/test/snapshot.jpg") - await hass.async_block_till_done() + await hass.services.async_call( + camera.DOMAIN, + camera.SERVICE_SNAPSHOT, + { + ATTR_ENTITY_ID: "camera.demo_camera", + camera.ATTR_FILENAME: "/test/snapshot.jpg", + }, + blocking=True, + ) mock_write = mopen().write @@ -237,10 +244,6 @@ async def test_play_stream_service_no_source(hass, mock_camera, mock_stream): async def test_handle_play_stream_service(hass, mock_camera, mock_stream): """Test camera play_stream service.""" await async_setup_component(hass, "media_player", {}) - data = { - ATTR_ENTITY_ID: "camera.demo_camera", - camera.ATTR_MEDIA_PLAYER: "media_player.test", - } with patch( "homeassistant.components.camera.request_stream" ) as mock_request_stream, patch( @@ -249,7 +252,13 @@ async def test_handle_play_stream_service(hass, mock_camera, mock_stream): ): # Call service await hass.services.async_call( - camera.DOMAIN, camera.SERVICE_PLAY_STREAM, data, blocking=True + camera.DOMAIN, + camera.SERVICE_PLAY_STREAM, + { + ATTR_ENTITY_ID: "camera.demo_camera", + camera.ATTR_MEDIA_PLAYER: "media_player.test", + }, + blocking=True, ) # So long as we request the stream, the rest should be covered # by the play_media service tests. @@ -295,23 +304,23 @@ async def test_preload_stream(hass, mock_stream): async def test_record_service_invalid_path(hass, mock_camera): """Test record service with invalid path.""" - data = { - ATTR_ENTITY_ID: "camera.demo_camera", - camera.CONF_FILENAME: "/my/invalid/path", - } with patch.object( hass.config, "is_allowed_path", return_value=False ), pytest.raises(HomeAssistantError): # Call service await hass.services.async_call( - camera.DOMAIN, camera.SERVICE_RECORD, data, blocking=True + camera.DOMAIN, + camera.SERVICE_RECORD, + { + ATTR_ENTITY_ID: "camera.demo_camera", + camera.CONF_FILENAME: "/my/invalid/path", + }, + blocking=True, ) async def test_record_service(hass, mock_camera, mock_stream): """Test record service.""" - data = {ATTR_ENTITY_ID: "camera.demo_camera", camera.CONF_FILENAME: "/my/path"} - with patch( "homeassistant.components.demo.camera.DemoCamera.stream_source", return_value=mock_coro("http://example.com"), @@ -323,7 +332,10 @@ async def test_record_service(hass, mock_camera, mock_stream): ): # Call service await hass.services.async_call( - camera.DOMAIN, camera.SERVICE_RECORD, data, blocking=True + camera.DOMAIN, + camera.SERVICE_RECORD, + {ATTR_ENTITY_ID: "camera.demo_camera", camera.CONF_FILENAME: "/my/path"}, + blocking=True, ) # So long as we call stream.record, the rest should be covered # by those tests. diff --git a/tests/components/demo/test_camera.py b/tests/components/demo/test_camera.py index 286a1c8ca224..530cfef4cb6f 100644 --- a/tests/components/demo/test_camera.py +++ b/tests/components/demo/test_camera.py @@ -3,30 +3,41 @@ from unittest.mock import mock_open, patch import pytest -from homeassistant.components import camera -from homeassistant.components.camera import STATE_IDLE, STATE_STREAMING +from homeassistant.components.camera import ( + DOMAIN as CAMERA_DOMAIN, + SERVICE_ENABLE_MOTION, + SERVICE_TURN_OFF, + SERVICE_TURN_ON, + STATE_IDLE, + STATE_STREAMING, + async_get_image, +) +from homeassistant.components.demo import DOMAIN +from homeassistant.const import ATTR_ENTITY_ID from homeassistant.exceptions import HomeAssistantError from homeassistant.setup import async_setup_component -from tests.components.camera import common +ENTITY_CAMERA = "camera.demo_camera" -@pytest.fixture +@pytest.fixture(autouse=True) def demo_camera(hass): """Initialize a demo camera platform.""" hass.loop.run_until_complete( - async_setup_component(hass, "camera", {camera.DOMAIN: {"platform": "demo"}}) + async_setup_component( + hass, CAMERA_DOMAIN, {CAMERA_DOMAIN: {"platform": DOMAIN}} + ) ) - return hass.data["camera"].get_entity("camera.demo_camera") -async def test_init_state_is_streaming(hass, demo_camera): +async def test_init_state_is_streaming(hass): """Demo camera initialize as streaming.""" - assert demo_camera.state == STATE_STREAMING + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_STREAMING mock_on_img = mock_open(read_data=b"ON") with patch("homeassistant.components.demo.camera.open", mock_on_img, create=True): - image = await camera.async_get_image(hass, demo_camera.entity_id) + image = await async_get_image(hass, ENTITY_CAMERA) assert mock_on_img.called assert mock_on_img.call_args_list[0][0][0][-6:] in [ "_0.jpg", @@ -37,52 +48,68 @@ async def test_init_state_is_streaming(hass, demo_camera): assert image.content == b"ON" -async def test_turn_on_state_back_to_streaming(hass, demo_camera): +async def test_turn_on_state_back_to_streaming(hass): """After turn on state back to streaming.""" - assert demo_camera.state == STATE_STREAMING - await common.async_turn_off(hass, demo_camera.entity_id) - await hass.async_block_till_done() + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_STREAMING - assert demo_camera.state == STATE_IDLE + await hass.services.async_call( + CAMERA_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True + ) - await common.async_turn_on(hass, demo_camera.entity_id) - await hass.async_block_till_done() + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_IDLE - assert demo_camera.state == STATE_STREAMING + await hass.services.async_call( + CAMERA_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True + ) + + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_STREAMING -async def test_turn_off_image(hass, demo_camera): +async def test_turn_off_image(hass): """After turn off, Demo camera raise error.""" - await common.async_turn_off(hass, demo_camera.entity_id) - await hass.async_block_till_done() + await hass.services.async_call( + CAMERA_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True + ) with pytest.raises(HomeAssistantError) as error: - await camera.async_get_image(hass, demo_camera.entity_id) + await async_get_image(hass, ENTITY_CAMERA) assert error.args[0] == "Camera is off" -async def test_turn_off_invalid_camera(hass, demo_camera): +async def test_turn_off_invalid_camera(hass): """Turn off non-exist camera should quietly fail.""" - assert demo_camera.state == STATE_STREAMING - await common.async_turn_off(hass, "camera.invalid_camera") - await hass.async_block_till_done() + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_STREAMING - assert demo_camera.state == STATE_STREAMING + await hass.services.async_call( + CAMERA_DOMAIN, + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: "camera.invalid_camera"}, + blocking=True, + ) + + state = hass.states.get(ENTITY_CAMERA) + assert state.state == STATE_STREAMING async def test_motion_detection(hass): """Test motion detection services.""" - # Setup platform - await async_setup_component(hass, "camera", {"camera": {"platform": "demo"}}) # Fetch state and check motion detection attribute - state = hass.states.get("camera.demo_camera") + state = hass.states.get(ENTITY_CAMERA) assert not state.attributes.get("motion_detection") # Call service to turn on motion detection - common.enable_motion_detection(hass, "camera.demo_camera") - await hass.async_block_till_done() + await hass.services.async_call( + CAMERA_DOMAIN, + SERVICE_ENABLE_MOTION, + {ATTR_ENTITY_ID: ENTITY_CAMERA}, + blocking=True, + ) # Check if state has been updated. - state = hass.states.get("camera.demo_camera") + state = hass.states.get(ENTITY_CAMERA) assert state.attributes.get("motion_detection") From 4f50b858d0c35df99ad21e19a5d98a5922b7c65f Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Sat, 11 Apr 2020 23:00:54 +0300 Subject: [PATCH 330/653] Remove already fixed qwikswitch uncaught exceptions (#34049) --- tests/ignore_uncaught_exceptions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 72da24d38da0..77451fc1f688 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -34,8 +34,6 @@ IGNORE_UNCAUGHT_EXCEPTIONS = [ ("tests.components.ios.test_init", "test_creating_entry_sets_up_sensor"), ("tests.components.ios.test_init", "test_not_configuring_ios_not_creates_entry"), ("tests.components.local_file.test_camera", "test_file_not_readable"), - ("tests.components.qwikswitch.test_init", "test_binary_sensor_device"), - ("tests.components.qwikswitch.test_init", "test_sensor_device"), ] IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [] From 9f713dac7ff4ee382b14856410eb5c93805250c8 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sat, 11 Apr 2020 22:53:48 +0200 Subject: [PATCH 331/653] Use UNIT_PERCENTAGE constant (#34054) --- .../components/garmin_connect/const.py | 4 ++-- tests/components/abode/test_sensor.py | 3 ++- tests/components/august/test_sensor.py | 19 ++++++++++++------- tests/components/nexia/test_sensor.py | 8 ++++---- tests/components/nut/test_sensor.py | 7 ++++--- tests/components/powerwall/test_sensor.py | 5 +++-- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/garmin_connect/const.py b/homeassistant/components/garmin_connect/const.py index ebf56b27a7fd..ae1c2f1caa10 100644 --- a/homeassistant/components/garmin_connect/const.py +++ b/homeassistant/components/garmin_connect/const.py @@ -311,8 +311,8 @@ GARMIN_ENTITY_LIST = { ], "weight": ["Weight", "kg", "mdi:weight-kilogram", None, False], "bmi": ["BMI", "", "mdi:food", None, False], - "bodyFat": ["Body Fat", "%", "mdi:food", None, False], - "bodyWater": ["Body Water", "%", "mdi:water-percent", None, False], + "bodyFat": ["Body Fat", UNIT_PERCENTAGE, "mdi:food", None, False], + "bodyWater": ["Body Water", UNIT_PERCENTAGE, "mdi:water-percent", None, False], "bodyMass": ["Body Mass", "kg", "mdi:food", None, False], "muscleMass": ["Muscle Mass", "kg", "mdi:dumbbell", None, False], "physiqueRating": ["Physique Rating", "", "mdi:numeric", None, False], diff --git a/tests/components/abode/test_sensor.py b/tests/components/abode/test_sensor.py index b4ce78faedd2..944c1bbeb8ce 100644 --- a/tests/components/abode/test_sensor.py +++ b/tests/components/abode/test_sensor.py @@ -7,6 +7,7 @@ from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, DEVICE_CLASS_HUMIDITY, TEMP_CELSIUS, + UNIT_PERCENTAGE, ) from .common import setup_platform @@ -31,7 +32,7 @@ async def test_attributes(hass): assert not state.attributes.get("battery_low") assert not state.attributes.get("no_response") assert state.attributes.get("device_type") == "LM" - assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == "%" + assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UNIT_PERCENTAGE assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Environment Sensor Humidity" assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_HUMIDITY diff --git a/tests/components/august/test_sensor.py b/tests/components/august/test_sensor.py index bf87a2888a54..f7e462975329 100644 --- a/tests/components/august/test_sensor.py +++ b/tests/components/august/test_sensor.py @@ -1,6 +1,6 @@ """The sensor tests for the august platform.""" -from homeassistant.const import STATE_UNAVAILABLE +from homeassistant.const import STATE_UNAVAILABLE, UNIT_PERCENTAGE from tests.components.august.mocks import ( _create_august_with_devices, @@ -20,7 +20,10 @@ async def test_create_doorbell(hass): "sensor.k98gidt45gul_name_battery" ) assert sensor_k98gidt45gul_name_battery.state == "96" - assert sensor_k98gidt45gul_name_battery.attributes["unit_of_measurement"] == "%" + assert ( + sensor_k98gidt45gul_name_battery.attributes["unit_of_measurement"] + == UNIT_PERCENTAGE + ) async def test_create_doorbell_offline(hass): @@ -31,7 +34,9 @@ async def test_create_doorbell_offline(hass): sensor_tmt100_name_battery = hass.states.get("sensor.tmt100_name_battery") assert sensor_tmt100_name_battery.state == "81" - assert sensor_tmt100_name_battery.attributes["unit_of_measurement"] == "%" + assert ( + sensor_tmt100_name_battery.attributes["unit_of_measurement"] == UNIT_PERCENTAGE + ) entry = entity_registry.async_get("sensor.tmt100_name_battery") assert entry @@ -63,7 +68,7 @@ async def test_create_lock_with_linked_keypad(hass): sensor_a6697750d607098bae8d6baa11ef8063_name_battery.attributes[ "unit_of_measurement" ] - == "%" + == UNIT_PERCENTAGE ) entry = entity_registry.async_get( "sensor.a6697750d607098bae8d6baa11ef8063_name_battery" @@ -73,7 +78,7 @@ async def test_create_lock_with_linked_keypad(hass): state = hass.states.get("sensor.front_door_lock_keypad_battery") assert state.state == "60" - assert state.attributes["unit_of_measurement"] == "%" + assert state.attributes["unit_of_measurement"] == UNIT_PERCENTAGE entry = entity_registry.async_get("sensor.front_door_lock_keypad_battery") assert entry assert entry.unique_id == "5bc65c24e6ef2a263e1450a8_linked_keypad_battery" @@ -93,7 +98,7 @@ async def test_create_lock_with_low_battery_linked_keypad(hass): sensor_a6697750d607098bae8d6baa11ef8063_name_battery.attributes[ "unit_of_measurement" ] - == "%" + == UNIT_PERCENTAGE ) entry = entity_registry.async_get( "sensor.a6697750d607098bae8d6baa11ef8063_name_battery" @@ -103,7 +108,7 @@ async def test_create_lock_with_low_battery_linked_keypad(hass): state = hass.states.get("sensor.front_door_lock_keypad_battery") assert state.state == "10" - assert state.attributes["unit_of_measurement"] == "%" + assert state.attributes["unit_of_measurement"] == UNIT_PERCENTAGE entry = entity_registry.async_get("sensor.front_door_lock_keypad_battery") assert entry assert entry.unique_id == "5bc65c24e6ef2a263e1450a8_linked_keypad_battery" diff --git a/tests/components/nexia/test_sensor.py b/tests/components/nexia/test_sensor.py index 518993cf24a2..a0fa387cd431 100644 --- a/tests/components/nexia/test_sensor.py +++ b/tests/components/nexia/test_sensor.py @@ -1,6 +1,6 @@ """The sensor tests for the nexia platform.""" -from homeassistant.const import TEMP_CELSIUS +from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE from .util import async_init_integration @@ -69,7 +69,7 @@ async def test_create_sensors(hass): expected_attributes = { "attribution": "Data provided by mynexia.com", "friendly_name": "Master Suite Current Compressor Speed", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears @@ -99,7 +99,7 @@ async def test_create_sensors(hass): "attribution": "Data provided by mynexia.com", "device_class": "humidity", "friendly_name": "Master Suite Relative Humidity", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears @@ -113,7 +113,7 @@ async def test_create_sensors(hass): expected_attributes = { "attribution": "Data provided by mynexia.com", "friendly_name": "Master Suite Requested Compressor Speed", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py index 2e4610505075..a04f570d367d 100644 --- a/tests/components/nut/test_sensor.py +++ b/tests/components/nut/test_sensor.py @@ -1,5 +1,6 @@ """The sensor tests for the nut platform.""" +from homeassistant.const import UNIT_PERCENTAGE from .util import async_init_integration @@ -16,7 +17,7 @@ async def test_pr3000rt2u(hass): "device_class": "battery", "friendly_name": "Ups1 Battery Charge", "state": "Online", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears @@ -37,7 +38,7 @@ async def test_cp1350c(hass): "device_class": "battery", "friendly_name": "Ups1 Battery Charge", "state": "Online", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears @@ -58,7 +59,7 @@ async def test_5e850i(hass): "device_class": "battery", "friendly_name": "Ups1 Battery Charge", "state": "Online", - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, } # Only test for a subset of attributes in case # HA changes the implementation and a new one appears diff --git a/tests/components/powerwall/test_sensor.py b/tests/components/powerwall/test_sensor.py index 5d21a11d4b47..3ab7e051a19a 100644 --- a/tests/components/powerwall/test_sensor.py +++ b/tests/components/powerwall/test_sensor.py @@ -3,6 +3,7 @@ from asynctest import patch from homeassistant.components.powerwall.const import DOMAIN +from homeassistant.const import UNIT_PERCENTAGE from homeassistant.setup import async_setup_component from .mocks import _mock_get_config, _mock_powerwall_with_fixtures @@ -17,7 +18,7 @@ async def test_sensors(hass): "homeassistant.components.powerwall.config_flow.PowerWall", return_value=mock_powerwall, ), patch( - "homeassistant.components.powerwall.PowerWall", return_value=mock_powerwall, + "homeassistant.components.powerwall.PowerWall", return_value=mock_powerwall ): assert await async_setup_component(hass, DOMAIN, _mock_get_config()) await hass.async_block_till_done() @@ -99,7 +100,7 @@ async def test_sensors(hass): state = hass.states.get("sensor.powerwall_charge") assert state.state == "47.32" expected_attributes = { - "unit_of_measurement": "%", + "unit_of_measurement": UNIT_PERCENTAGE, "friendly_name": "Powerwall Charge", "device_class": "battery", } From 8901508df6b4f6bc44c1709eb8ba084f111c7b82 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 11 Apr 2020 23:33:22 +0200 Subject: [PATCH 332/653] Handle incorrect config for Nederlandse Spoorwegen integration (#31623) * Improved error handling * Removed notification * Simplified error messages * Added custom excpetion support * Fixed custom exception catch * Removed broad exception catch * Raise PlatformNotReady --- homeassistant/components/nederlandse_spoorwegen/sensor.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/nederlandse_spoorwegen/sensor.py b/homeassistant/components/nederlandse_spoorwegen/sensor.py index 45413d4a15aa..2db46b02db40 100644 --- a/homeassistant/components/nederlandse_spoorwegen/sensor.py +++ b/homeassistant/components/nederlandse_spoorwegen/sensor.py @@ -3,11 +3,13 @@ from datetime import datetime, timedelta import logging import ns_api +from ns_api import RequestParametersError import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_NAME +from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -47,13 +49,17 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the departure sensor.""" nsapi = ns_api.NSAPI(config[CONF_API_KEY]) + try: stations = nsapi.get_stations() except ( requests.exceptions.ConnectionError, requests.exceptions.HTTPError, ) as error: - _LOGGER.error("Couldn't fetch stations, API key correct?: %s", error) + _LOGGER.error("Could not connect to the internet: %s", error) + raise PlatformNotReady() + except RequestParametersError as error: + _LOGGER.error("Could not fetch stations, please check configuration: %s", error) return sensors = [] From e3f47beda40e155a27cb99a604413d5ad0181836 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 12 Apr 2020 00:05:58 +0000 Subject: [PATCH 333/653] [ci skip] Translation update --- .../components/flume/.translations/de.json | 22 +++++++ .../components/ipp/.translations/de.json | 3 +- .../components/local_ip/.translations/de.json | 3 +- .../components/nut/.translations/de.json | 14 ++++- .../components/nut/.translations/ru.json | 2 +- .../components/roomba/.translations/de.json | 32 ++++++++++ .../components/roomba/.translations/en.json | 58 +++++++++---------- .../components/roomba/.translations/es.json | 33 +++++++++++ .../components/roomba/.translations/ru.json | 33 +++++++++++ .../synology_dsm/.translations/de.json | 36 ++++++++++++ .../synology_dsm/.translations/ru.json | 2 +- .../components/vizio/.translations/de.json | 16 ++--- .../components/vizio/.translations/en.json | 16 ++--- .../components/vizio/.translations/ru.json | 12 ++-- 14 files changed, 226 insertions(+), 56 deletions(-) create mode 100644 homeassistant/components/flume/.translations/de.json create mode 100644 homeassistant/components/roomba/.translations/de.json create mode 100644 homeassistant/components/roomba/.translations/es.json create mode 100644 homeassistant/components/roomba/.translations/ru.json create mode 100644 homeassistant/components/synology_dsm/.translations/de.json diff --git a/homeassistant/components/flume/.translations/de.json b/homeassistant/components/flume/.translations/de.json new file mode 100644 index 000000000000..bc70e9088295 --- /dev/null +++ b/homeassistant/components/flume/.translations/de.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Dieses Konto ist bereits konfiguriert" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + }, + "title": "Stellen Sie eine Verbindung zu Ihrem Flume-Konto her" + } + }, + "title": "Flume" + } +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/de.json b/homeassistant/components/ipp/.translations/de.json index 7e72fb2403f6..454ad3ac0907 100644 --- a/homeassistant/components/ipp/.translations/de.json +++ b/homeassistant/components/ipp/.translations/de.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "Dieser Drucker ist bereits konfiguriert", "connection_error": "Verbindung zum Drucker fehlgeschlagen.", - "connection_upgrade": "Verbindung zum Drucker fehlgeschlagen, da ein Verbindungsupgrade erforderlich ist." + "connection_upgrade": "Verbindung zum Drucker fehlgeschlagen, da ein Verbindungsupgrade erforderlich ist.", + "parse_error": "Antwort vom Drucker konnte nicht analysiert werden." }, "error": { "connection_error": "Verbindung zum Drucker fehlgeschlagen.", diff --git a/homeassistant/components/local_ip/.translations/de.json b/homeassistant/components/local_ip/.translations/de.json index c7a993bdef9d..7e1df67811ca 100644 --- a/homeassistant/components/local_ip/.translations/de.json +++ b/homeassistant/components/local_ip/.translations/de.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Integration ist bereits mit einem vorhandenen Sensor mit diesem Namen konfiguriert" + "already_configured": "Integration ist bereits mit einem vorhandenen Sensor mit diesem Namen konfiguriert", + "single_instance_allowed": "Es ist nur eine einzige Konfiguration der lokalen IP zul\u00e4ssig." }, "step": { "user": { diff --git a/homeassistant/components/nut/.translations/de.json b/homeassistant/components/nut/.translations/de.json index 611db3acfd65..67b5a23f65f1 100644 --- a/homeassistant/components/nut/.translations/de.json +++ b/homeassistant/components/nut/.translations/de.json @@ -8,6 +8,18 @@ "unknown": "Unerwarteter Fehler" }, "step": { + "resources": { + "data": { + "resources": "Ressourcen" + }, + "title": "W\u00e4hlen Sie die zu \u00fcberwachenden Ressourcen aus" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Ressourcen" + } + }, "user": { "data": { "alias": "Alias", @@ -28,7 +40,7 @@ "data": { "resources": "Ressourcen" }, - "description": "W\u00e4hlen Sie Sensorressourcen" + "description": "W\u00e4hlen Sie Sensorressourcen." } } } diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json index 706a98936f28..807406d0d00a 100644 --- a/homeassistant/components/nut/.translations/ru.json +++ b/homeassistant/components/nut/.translations/ru.json @@ -43,7 +43,7 @@ "data": { "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b" }, - "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432" + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432." } } } diff --git a/homeassistant/components/roomba/.translations/de.json b/homeassistant/components/roomba/.translations/de.json new file mode 100644 index 000000000000..0f6e767f345a --- /dev/null +++ b/homeassistant/components/roomba/.translations/de.json @@ -0,0 +1,32 @@ +{ + "config": { + "error": { + "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Zertifikat", + "continuous": "Kontinuierlich", + "delay": "Verz\u00f6gerung", + "host": "Hostname oder IP-Adresse", + "password": "Passwort" + }, + "title": "Stellen Sie eine Verbindung zum Ger\u00e4t her" + } + }, + "title": "iRobot Roomba" + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Kontinuierlich", + "delay": "Verz\u00f6gerung" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/en.json b/homeassistant/components/roomba/.translations/en.json index 69e4c0c57609..b8828c9c1c2b 100644 --- a/homeassistant/components/roomba/.translations/en.json +++ b/homeassistant/components/roomba/.translations/en.json @@ -1,33 +1,33 @@ { - "config": { - "title": "iRobot Roomba", - "step": { - "user": { - "title": "Connect to the device", - "description": "Currently retrieving the BLID and password is a manual process. Please follow the steps outlined in the documentation at: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", - "data": { - "host": "Hostname or IP Address", - "blid": "BLID", - "password": "Password", - "certificate": "Certificate", - "continuous": "Continuous", - "delay": "Delay" - } - } + "config": { + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Certificate", + "continuous": "Continuous", + "delay": "Delay", + "host": "Hostname or IP Address", + "password": "Password" + }, + "description": "Currently retrieving the BLID and password is a manual process. Please follow the steps outlined in the documentation at: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Connect to the device" + } + }, + "title": "iRobot Roomba" }, - "error": { - "unknown" : "Unexpected error", - "cannot_connect": "Failed to connect, please try again" - } - }, - "options": { - "step": { - "init": { - "data": { - "continuous": "Continuous", - "delay": "Delay" + "options": { + "step": { + "init": { + "data": { + "continuous": "Continuous", + "delay": "Delay" + } + } } - } } - } -} +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/es.json b/homeassistant/components/roomba/.translations/es.json new file mode 100644 index 000000000000..a74d2c04507b --- /dev/null +++ b/homeassistant/components/roomba/.translations/es.json @@ -0,0 +1,33 @@ +{ + "config": { + "error": { + "cannot_connect": "No se pudo conectar, por favor, int\u00e9ntalo de nuevo", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Certificado", + "continuous": "Continuo", + "delay": "Retardo", + "host": "Nombre del host o direcci\u00f3n IP", + "password": "Contrase\u00f1a" + }, + "description": "Actualmente recuperar el BLID y la contrase\u00f1a es un proceso manual. Sigue los pasos descritos en la documentaci\u00f3n en: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Conectarse al dispositivo" + } + }, + "title": "iRobot Roomba" + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Continuo", + "delay": "Retardo" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/ru.json b/homeassistant/components/roomba/.translations/ru.json new file mode 100644 index 000000000000..066de6d54837 --- /dev/null +++ b/homeassistant/components/roomba/.translations/ru.json @@ -0,0 +1,33 @@ +{ + "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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "continuous": "\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439", + "delay": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430", + "host": "\u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c" + }, + "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c BLID \u0438 \u043f\u0430\u0440\u043e\u043b\u044c:\nhttps://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + } + }, + "title": "iRobot Roomba" + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439", + "delay": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/de.json b/homeassistant/components/synology_dsm/.translations/de.json new file mode 100644 index 000000000000..fcf31df3920a --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/de.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Host bereits konfiguriert" + }, + "error": { + "login": "Login-Fehler: Bitte \u00fcberpr\u00fcfen Sie Ihren Benutzernamen & Passwort", + "unknown": "Unbekannter Fehler: Bitte versuchen Sie es sp\u00e4ter noch einmal oder eine andere Konfiguration" + }, + "flow_title": "Synology DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "DSM-Version", + "password": "Passwort", + "port": "Port (optional)", + "username": "Benutzername" + }, + "description": "M\u00f6chten Sie {name} ({host}) einrichten?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "DSM-Version", + "host": "Host", + "name": "Name", + "password": "Passwort", + "port": "Port (optional)", + "username": "Benutzername" + }, + "title": "Synology DSM" + } + }, + "title": "Synology DSM" + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ru.json b/homeassistant/components/synology_dsm/.translations/ru.json index 0f79ca2a0266..5fae9bd32ec7 100644 --- a/homeassistant/components/synology_dsm/.translations/ru.json +++ b/homeassistant/components/synology_dsm/.translations/ru.json @@ -26,7 +26,7 @@ "host": "\u0425\u043e\u0441\u0442", "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", "password": "\u041f\u0430\u0440\u043e\u043b\u044c", - "port": "\u041f\u043e\u0440\u0442", + "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\u043e\u0432\u0430\u0442\u044c SSL / TLS \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", "username": "\u041b\u043e\u0433\u0438\u043d" }, diff --git a/homeassistant/components/vizio/.translations/de.json b/homeassistant/components/vizio/.translations/de.json index 2197d27de715..e2d391da0c29 100644 --- a/homeassistant/components/vizio/.translations/de.json +++ b/homeassistant/components/vizio/.translations/de.json @@ -7,8 +7,8 @@ "error": { "cant_connect": "Es konnte keine Verbindung zum Ger\u00e4t hergestellt werden. [\u00dcberpr\u00fcfen Sie die Dokumentation] (https://www.home-assistant.io/integrations/vizio/) und \u00fcberpr\u00fcfen Sie Folgendes erneut:\n- Das Ger\u00e4t ist eingeschaltet\n- Das Ger\u00e4t ist mit dem Netzwerk verbunden\n- Die von Ihnen eingegebenen Werte sind korrekt\nbevor sie versuchen, erneut zu \u00fcbermitteln.", "complete_pairing failed": "Das Pairing kann nicht abgeschlossen werden. Stellen Sie sicher, dass die von Ihnen angegebene PIN korrekt ist und das Fernsehger\u00e4t weiterhin mit Strom versorgt und mit dem Netzwerk verbunden ist, bevor Sie es erneut versuchen.", - "host_exists": "Vizio-Ger\u00e4t mit angegebenem Host bereits konfiguriert.", - "name_exists": "Vizio-Ger\u00e4t mit angegebenem Namen bereits konfiguriert." + "host_exists": "VIZIO-Ger\u00e4t mit angegebenem Host bereits konfiguriert.", + "name_exists": "VIZIO-Ger\u00e4t mit angegebenem Namen bereits konfiguriert." }, "step": { "pair_tv": { @@ -19,11 +19,11 @@ "title": "Schlie\u00dfen Sie den Pairing-Prozess ab" }, "pairing_complete": { - "description": "Ihr Vizio SmartCast-Ger\u00e4t ist jetzt mit Home Assistant verbunden.", + "description": "Ihr VIZIO SmartCast-Ger\u00e4t ist jetzt mit Home Assistant verbunden.", "title": "Kopplung abgeschlossen" }, "pairing_complete_import": { - "description": "Ihr Vizio SmartCast-Fernseher ist jetzt mit Home Assistant verbunden. \n\n Ihr Zugriffstoken ist '**{access_token}**'.", + "description": "Ihr VIZIO SmartCast-Fernseher ist jetzt mit Home Assistant verbunden. \n\n Ihr Zugriffstoken ist '**{access_token}**'.", "title": "Kopplung abgeschlossen" }, "user": { @@ -34,10 +34,10 @@ "name": "Name" }, "description": "Ein Zugriffstoken wird nur f\u00fcr Fernsehger\u00e4te ben\u00f6tigt. Wenn Sie ein Fernsehger\u00e4t konfigurieren und noch kein Zugriffstoken haben, lassen Sie es leer, um einen Pairing-Vorgang durchzuf\u00fchren.", - "title": "Richten Sie das Vizio SmartCast-Ger\u00e4t ein" + "title": "Richten Sie das VIZIO SmartCast-Ger\u00e4t ein" } }, - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" }, "options": { "step": { @@ -48,9 +48,9 @@ "volume_step": "Lautst\u00e4rken-Schrittgr\u00f6\u00dfe" }, "description": "Wenn Sie \u00fcber ein Smart-TV-Ger\u00e4t verf\u00fcgen, k\u00f6nnen Sie Ihre Quellliste optional filtern, indem Sie ausw\u00e4hlen, welche Apps in Ihre Quellliste aufgenommen oder ausgeschlossen werden sollen.", - "title": "Aktualisieren Sie die Vizo SmartCast-Optionen" + "title": "Aktualisieren Sie die VIZIO SmartCast-Optionen" } }, - "title": "Aktualisieren Sie die Vizo SmartCast-Optionen" + "title": "Aktualisieren Sie die VIZIO SmartCast-Optionen" } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/en.json b/homeassistant/components/vizio/.translations/en.json index f4b03e1eb82c..a4918978ba7a 100644 --- a/homeassistant/components/vizio/.translations/en.json +++ b/homeassistant/components/vizio/.translations/en.json @@ -7,8 +7,8 @@ "error": { "cant_connect": "Could not connect to the device. [Review the docs](https://www.home-assistant.io/integrations/vizio/) and re-verify that:\n- The device is powered on\n- The device is connected to the network\n- The values you filled in are accurate\nbefore attempting to resubmit.", "complete_pairing failed": "Unable to complete pairing. Ensure the PIN you provided is correct and the TV is still powered and connected to the network before resubmitting.", - "host_exists": "Vizio device with specified host already configured.", - "name_exists": "Vizio device with specified name already configured." + "host_exists": "VIZIO device with specified host already configured.", + "name_exists": "VIZIO device with specified name already configured." }, "step": { "pair_tv": { @@ -19,11 +19,11 @@ "title": "Complete Pairing Process" }, "pairing_complete": { - "description": "Your Vizio SmartCast device is now connected to Home Assistant.", + "description": "Your VIZIO SmartCast device is now connected to Home Assistant.", "title": "Pairing Complete" }, "pairing_complete_import": { - "description": "Your Vizio SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'.", + "description": "Your VIZIO SmartCast TV is now connected to Home Assistant.\n\nYour Access Token is '**{access_token}**'.", "title": "Pairing Complete" }, "user": { @@ -34,10 +34,10 @@ "name": "Name" }, "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", - "title": "Setup Vizio SmartCast Device" + "title": "Setup VIZIO SmartCast Device" } }, - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" }, "options": { "step": { @@ -48,9 +48,9 @@ "volume_step": "Volume Step Size" }, "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", - "title": "Update Vizo SmartCast Options" + "title": "Update VIZIO SmartCast Options" } }, - "title": "Update Vizo SmartCast Options" + "title": "Update VIZIO SmartCast Options" } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ru.json b/homeassistant/components/vizio/.translations/ru.json index e1e6ac73b9d4..ff729735d726 100644 --- a/homeassistant/components/vizio/.translations/ru.json +++ b/homeassistant/components/vizio/.translations/ru.json @@ -19,11 +19,11 @@ "title": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f" }, "pairing_complete": { - "description": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Vizio SmartCast \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a Home Assistant.", + "description": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e VIZIO SmartCast \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a Home Assistant.", "title": "\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e" }, "pairing_complete_import": { - "description": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Vizio SmartCast \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a Home Assistant. \n\n\u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - '**{access_token}**'.", + "description": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e VIZIO SmartCast TV \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a Home Assistant. \n\n\u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - '**{access_token}**'.", "title": "\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e" }, "user": { @@ -34,10 +34,10 @@ "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435" }, "description": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0412\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0438 \u0443 \u0412\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f.", - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" } }, - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" }, "options": { "step": { @@ -48,9 +48,9 @@ "volume_step": "\u0428\u0430\u0433 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438" }, "description": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Smart TV, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.", - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Vizio SmartCast" + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 VIZIO SmartCast" } }, - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Vizio SmartCast" + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 VIZIO SmartCast" } } \ No newline at end of file From 24c45bfd847fd492fa50c41422067984f9780a33 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Apr 2020 19:37:34 -0500 Subject: [PATCH 334/653] Restore ability to change the scan interval in the NUT (#33996) * Support changing the scan interval in the NUT options flow * use dict.items() --- .../components/nut/.translations/en.json | 91 +++++++++---------- homeassistant/components/nut/__init__.py | 5 +- homeassistant/components/nut/config_flow.py | 45 ++++++--- homeassistant/components/nut/const.py | 1 + homeassistant/components/nut/strings.json | 3 +- tests/components/nut/test_config_flow.py | 26 +++++- 6 files changed, 106 insertions(+), 65 deletions(-) diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index 939fa7c9cbe3..206a1ec299a0 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -1,50 +1,47 @@ { - "config": { - "abort": { - "already_configured": "Device is already configured" - }, - "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" - }, - "step": { - "resources": { - "data": { - "resources": "Resources" - }, - "title": "Choose the Resources to Monitor" - }, - "ups": { - "data": { - "alias": "Alias", - "resources": "Resources" - }, - "title": "Choose the UPS to Monitor" - }, - "user": { - "data": { - "alias": "Alias", - "host": "Host", - "name": "Name", - "password": "Password", - "port": "Port", - "resources": "Resources", - "username": "Username" - }, - "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", - "title": "Connect to the NUT server" - } - }, - "title": "Network UPS Tools (NUT)" - }, - "options": { - "step": { - "init": { - "data": { - "resources": "Resources" - }, - "description": "Choose Sensor Resources." - } + "config": { + "title": "Network UPS Tools (NUT)", + "step": { + "user": { + "title": "Connect to the NUT server", + "data": { + "host": "Host", + "port": "Port", + "username": "Username", + "password": "Password" } + }, + "ups": { + "title": "Choose the UPS to Monitor", + "data": { + "alias": "Alias", + "resources": "Resources" + } + }, + "resources": { + "title": "Choose the Resources to Monitor", + "data": { + "resources": "Resources" + } + } + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "abort": { + "already_configured": "Device is already configured" } -} \ No newline at end of file + }, + "options": { + "step": { + "init": { + "description": "Choose Sensor Resources.", + "data": { + "resources": "Resources", + "scan_interval": "Scan Interval (seconds)" + } + } + } + } +} diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index 82fc30636933..45c5474f27e0 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_PORT, CONF_RESOURCES, + CONF_SCAN_INTERVAL, CONF_USERNAME, ) from homeassistant.core import HomeAssistant @@ -21,6 +22,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import ( COORDINATOR, + DEFAULT_SCAN_INTERVAL, DOMAIN, PLATFORMS, PYNUT_DATA, @@ -52,6 +54,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): alias = config.get(CONF_ALIAS) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) + scan_interval = entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL) data = PyNUTData(host, port, alias, username, password) @@ -65,7 +68,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): _LOGGER, name="NUT resource status", update_method=async_update_data, - update_interval=timedelta(seconds=60), + update_interval=timedelta(seconds=scan_interval), ) # Fetch initial data so we have data when entities subscribe diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index 505fd2a5e4fb..f1066fe28994 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -10,19 +10,29 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_PORT, CONF_RESOURCES, + CONF_SCAN_INTERVAL, CONF_USERNAME, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from . import PyNUTData, find_resources_in_config_entry -from .const import DEFAULT_HOST, DEFAULT_PORT, SENSOR_TYPES +from .const import ( + DEFAULT_HOST, + DEFAULT_PORT, + DEFAULT_SCAN_INTERVAL, + SENSOR_NAME, + SENSOR_TYPES, +) from .const import DOMAIN # pylint:disable=unused-import _LOGGER = logging.getLogger(__name__) -SENSOR_DICT = {sensor_id: SENSOR_TYPES[sensor_id][0] for sensor_id in SENSOR_TYPES} +SENSOR_DICT = { + sensor_id: sensor_spec[SENSOR_NAME] + for sensor_id, sensor_spec in SENSOR_TYPES.items() +} DATA_SCHEMA = vol.Schema( { @@ -34,22 +44,20 @@ DATA_SCHEMA = vol.Schema( ) -def _resource_schema(available_resources, selected_resources): +def _resource_schema_base(available_resources, selected_resources): """Resource selection schema.""" known_available_resources = { - sensor_id: sensor[0] + sensor_id: sensor[SENSOR_NAME] for sensor_id, sensor in SENSOR_TYPES.items() if sensor_id in available_resources } - return vol.Schema( - { - vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( - known_available_resources - ) - } - ) + return { + vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( + known_available_resources + ) + } def _ups_schema(ups_list): @@ -160,7 +168,9 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if user_input is None: return self.async_show_form( step_id="resources", - data_schema=_resource_schema(self.available_resources, []), + data_schema=vol.Schema( + _resource_schema_base(self.available_resources, []) + ), ) self.nut_config.update(user_input) @@ -207,12 +217,19 @@ class OptionsFlowHandler(config_entries.OptionsFlow): return self.async_create_entry(title="", data=user_input) resources = find_resources_in_config_entry(self.config_entry) + scan_interval = self.config_entry.options.get( + CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL + ) info = await validate_input(self.hass, self.config_entry.data) + base_schema = _resource_schema_base(info["available_resources"], resources) + base_schema[ + vol.Optional(CONF_SCAN_INTERVAL, default=scan_interval) + ] = cv.positive_int + return self.async_show_form( - step_id="init", - data_schema=_resource_schema(info["available_resources"], resources), + step_id="init", data_schema=vol.Schema(base_schema), ) diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index 50217e4b5988..b62a413e82b2 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -26,6 +26,7 @@ KEY_STATUS = "ups.status" KEY_STATUS_DISPLAY = "ups.status.display" COORDINATOR = "coordinator" +DEFAULT_SCAN_INTERVAL = 60 PYNUT_DATA = "data" PYNUT_UNIQUE_ID = "unique_id" diff --git a/homeassistant/components/nut/strings.json b/homeassistant/components/nut/strings.json index 6519d914df23..206a1ec299a0 100644 --- a/homeassistant/components/nut/strings.json +++ b/homeassistant/components/nut/strings.json @@ -38,7 +38,8 @@ "init": { "description": "Choose Sensor Resources.", "data": { - "resources": "Resources" + "resources": "Resources", + "scan_interval": "Scan Interval (seconds)" } } } diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index 360d97d13c4d..5833d06c8a9e 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -3,7 +3,7 @@ from asynctest import patch from homeassistant import config_entries, data_entry_flow, setup from homeassistant.components.nut.const import DOMAIN -from homeassistant.const import CONF_RESOURCES +from homeassistant.const import CONF_RESOURCES, CONF_SCAN_INTERVAL from .util import _get_mock_pynutclient @@ -244,4 +244,26 @@ async def test_options_flow(hass): ) assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert config_entry.options == {CONF_RESOURCES: ["battery.voltage"]} + assert config_entry.options == { + CONF_RESOURCES: ["battery.voltage"], + CONF_SCAN_INTERVAL: 60, + } + + with patch( + "homeassistant.components.nut.PyNUTClient", return_value=mock_pynut, + ), patch("homeassistant.components.nut.async_setup_entry", return_value=True): + result2 = await hass.config_entries.options.async_init(config_entry.entry_id) + + assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result2["step_id"] == "init" + + result2 = await hass.config_entries.options.async_configure( + result2["flow_id"], + user_input={CONF_RESOURCES: ["battery.voltage"], CONF_SCAN_INTERVAL: 12}, + ) + + assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert config_entry.options == { + CONF_RESOURCES: ["battery.voltage"], + CONF_SCAN_INTERVAL: 12, + } From e273ff5e5e78009239153ed2f72b7f1b67837cae Mon Sep 17 00:00:00 2001 From: Quentame Date: Sun, 12 Apr 2020 03:07:43 +0200 Subject: [PATCH 335/653] Do not use POWER_WATT for West wind direction (#34069) --- homeassistant/components/bom/weather.py | 10 ++-------- homeassistant/components/homematicip_cloud/sensor.py | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/bom/weather.py b/homeassistant/components/bom/weather.py index 139c61a3b0fe..94b9960c851b 100644 --- a/homeassistant/components/bom/weather.py +++ b/homeassistant/components/bom/weather.py @@ -4,13 +4,7 @@ import logging import voluptuous as vol from homeassistant.components.weather import PLATFORM_SCHEMA, WeatherEntity -from homeassistant.const import ( - CONF_LATITUDE, - CONF_LONGITUDE, - CONF_NAME, - POWER_WATT, - TEMP_CELSIUS, -) +from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS from homeassistant.helpers import config_validation as cv # Reuse data and API logic from the sensor implementation @@ -105,7 +99,7 @@ class BOMWeather(WeatherEntity): "SSW", "SW", "WSW", - POWER_WATT, + "W", "WNW", "NW", "NNW", diff --git a/homeassistant/components/homematicip_cloud/sensor.py b/homeassistant/components/homematicip_cloud/sensor.py index e45e73b8c03b..a45591ecc306 100644 --- a/homeassistant/components/homematicip_cloud/sensor.py +++ b/homeassistant/components/homematicip_cloud/sensor.py @@ -414,7 +414,7 @@ def _get_wind_direction(wind_direction_degree: float) -> str: if 236.25 <= wind_direction_degree < 258.75: return "WSW" if 258.75 <= wind_direction_degree < 281.25: - return POWER_WATT + return "W" if 281.25 <= wind_direction_degree < 303.75: return "WNW" if 303.75 <= wind_direction_degree < 326.25: From 8407321cfd16f32e5dae13bfd02f52760d363746 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2020 12:52:04 +0200 Subject: [PATCH 336/653] Upgrade certifi to >=2020.4.5.1 (#34080) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index af2198a5563e..399cbaf51870 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -6,7 +6,7 @@ astral==1.10.1 async_timeout==3.0.1 attrs==19.3.0 bcrypt==3.1.7 -certifi>=2019.11.28 +certifi>=2020.4.5.1 ciso8601==2.1.3 cryptography==2.9 defusedxml==0.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index b104ae232a0d..2b314ee48bbb 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -4,7 +4,7 @@ astral==1.10.1 async_timeout==3.0.1 attrs==19.3.0 bcrypt==3.1.7 -certifi>=2019.11.28 +certifi>=2020.4.5.1 ciso8601==2.1.3 importlib-metadata==1.5.0 jinja2>=2.11.1 diff --git a/setup.py b/setup.py index f53af0ee1f3b..bb86f4ed4949 100755 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ REQUIRES = [ "async_timeout==3.0.1", "attrs==19.3.0", "bcrypt==3.1.7", - "certifi>=2019.11.28", + "certifi>=2020.4.5.1", "ciso8601==2.1.3", "importlib-metadata==1.5.0", "jinja2>=2.11.1", From ee47becd0021aec6d58f466cb801e8b35cca0904 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2020 12:53:14 +0200 Subject: [PATCH 337/653] Upgrade importlib-metadata to 1.6.0 (#34081) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 399cbaf51870..b18608587eb3 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -13,7 +13,7 @@ defusedxml==0.6.0 distro==1.5.0 hass-nabucasa==0.34.0 home-assistant-frontend==20200407.2 -importlib-metadata==1.5.0 +importlib-metadata==1.6.0 jinja2>=2.11.1 netdisco==2.6.0 pip>=8.0.3 diff --git a/requirements_all.txt b/requirements_all.txt index 2b314ee48bbb..14e6dea0225d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ attrs==19.3.0 bcrypt==3.1.7 certifi>=2020.4.5.1 ciso8601==2.1.3 -importlib-metadata==1.5.0 +importlib-metadata==1.6.0 jinja2>=2.11.1 PyJWT==1.7.1 cryptography==2.9 diff --git a/setup.py b/setup.py index bb86f4ed4949..0c56e89b67ce 100755 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ REQUIRES = [ "bcrypt==3.1.7", "certifi>=2020.4.5.1", "ciso8601==2.1.3", - "importlib-metadata==1.5.0", + "importlib-metadata==1.6.0", "jinja2>=2.11.1", "PyJWT==1.7.1", # PyJWT has loose dependency. We want the latest one. From 1e8281fb068b557029b67418ffd0322e12e58ee4 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2020 13:36:34 +0200 Subject: [PATCH 338/653] Upgrade keyring to 21.2.0 (#34084) --- homeassistant/scripts/keyring.py | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/scripts/keyring.py b/homeassistant/scripts/keyring.py index 124449d44677..0166d41ce0c0 100644 --- a/homeassistant/scripts/keyring.py +++ b/homeassistant/scripts/keyring.py @@ -6,7 +6,7 @@ import os from homeassistant.util.yaml import _SECRET_NAMESPACE # mypy: allow-untyped-defs -REQUIREMENTS = ["keyring==20.0.0", "keyrings.alt==3.4.0"] +REQUIREMENTS = ["keyring==21.2.0", "keyrings.alt==3.4.0"] def run(args): diff --git a/requirements_all.txt b/requirements_all.txt index 14e6dea0225d..2e74cea5c49e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -779,7 +779,7 @@ kaiterra-async-client==0.0.2 keba-kecontact==1.0.0 # homeassistant.scripts.keyring -keyring==20.0.0 +keyring==21.2.0 # homeassistant.scripts.keyring keyrings.alt==3.4.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 86e9c9a001b9..2de28d73bf23 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -307,7 +307,7 @@ influxdb==5.2.3 jsonpath==0.82 # homeassistant.scripts.keyring -keyring==20.0.0 +keyring==21.2.0 # homeassistant.scripts.keyring keyrings.alt==3.4.0 From 4f519a2fe1f94372cfdddcd612bd61b42fe328a7 Mon Sep 17 00:00:00 2001 From: Dustin Wyatt Date: Sun, 12 Apr 2020 07:40:05 -0500 Subject: [PATCH 339/653] Fix harmony unnecessary whitespace stripping (#34071) --- homeassistant/components/harmony/remote.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/harmony/remote.py b/homeassistant/components/harmony/remote.py index 45a8f879c0f2..11e7af762536 100644 --- a/homeassistant/components/harmony/remote.py +++ b/homeassistant/components/harmony/remote.py @@ -331,7 +331,7 @@ class HarmonyRemote(remote.RemoteDevice): if activity_id is None: _LOGGER.debug("%s: Find activity ID based on name", self.name) - activity_id = self._client.get_activity_id(str(activity).strip()) + activity_id = self._client.get_activity_id(str(activity)) if activity_id is None: _LOGGER.error("%s: Activity %s is invalid", self.name, activity) From 20aa08924315c7cc32d6ab5a9749511b59a2afa6 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sun, 12 Apr 2020 14:56:19 +0200 Subject: [PATCH 340/653] Clean up camera and demo camera (#34058) * Clean up demo camera * Complete test_motion_detection * Clean up image reading * Clean up camera integration async methods * Fix and clean camera integration tests * Fix image processing patch --- homeassistant/components/camera/__init__.py | 16 ++++---- homeassistant/components/demo/camera.py | 30 ++++++-------- tests/components/camera/test_init.py | 40 +++++++++---------- tests/components/demo/test_camera.py | 28 ++++++++----- .../components/image_processing/test_init.py | 12 +++--- 5 files changed, 63 insertions(+), 63 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 0fc3e55a5876..2862805a333e 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -373,7 +373,7 @@ class Camera(Entity): async def async_camera_image(self): """Return bytes of camera image.""" - return await self.hass.async_add_job(self.camera_image) + return await self.hass.async_add_executor_job(self.camera_image) async def handle_async_still_stream(self, request, interval): """Generate an HTTP MJPEG stream from camera images.""" @@ -409,7 +409,7 @@ class Camera(Entity): async def async_turn_off(self): """Turn off camera.""" - await self.hass.async_add_job(self.turn_off) + await self.hass.async_add_executor_job(self.turn_off) def turn_on(self): """Turn off camera.""" @@ -417,25 +417,23 @@ class Camera(Entity): async def async_turn_on(self): """Turn off camera.""" - await self.hass.async_add_job(self.turn_on) + await self.hass.async_add_executor_job(self.turn_on) def enable_motion_detection(self): """Enable motion detection in the camera.""" raise NotImplementedError() - @callback - def async_enable_motion_detection(self): + async def async_enable_motion_detection(self): """Call the job and enable motion detection.""" - return self.hass.async_add_job(self.enable_motion_detection) + await self.hass.async_add_executor_job(self.enable_motion_detection) def disable_motion_detection(self): """Disable motion detection in camera.""" raise NotImplementedError() - @callback - def async_disable_motion_detection(self): + async def async_disable_motion_detection(self): """Call the job and disable motion detection.""" - return self.hass.async_add_job(self.disable_motion_detection) + await self.hass.async_add_executor_job(self.disable_motion_detection) @property def state_attributes(self): diff --git a/homeassistant/components/demo/camera.py b/homeassistant/components/demo/camera.py index f639dae9757c..ce211a47594d 100644 --- a/homeassistant/components/demo/camera.py +++ b/homeassistant/components/demo/camera.py @@ -1,6 +1,6 @@ """Demo camera platform that has a fake camera.""" import logging -import os +from pathlib import Path from homeassistant.components.camera import SUPPORT_ON_OFF, Camera @@ -28,16 +28,12 @@ class DemoCamera(Camera): self.is_streaming = True self._images_index = 0 - def camera_image(self): + async def async_camera_image(self): """Return a faked still image response.""" self._images_index = (self._images_index + 1) % 4 + image_path = Path(__file__).parent / f"demo_{self._images_index}.jpg" - image_path = os.path.join( - os.path.dirname(__file__), f"demo_{self._images_index}.jpg" - ) - _LOGGER.debug("Loading camera_image: %s", image_path) - with open(image_path, "rb") as file: - return file.read() + return await self.hass.async_add_executor_job(image_path.read_bytes) @property def name(self): @@ -48,7 +44,7 @@ class DemoCamera(Camera): def should_poll(self): """Demo camera doesn't need poll. - Need explicitly call schedule_update_ha_state() after state changed. + Need explicitly call async_write_ha_state() after state changed. """ return False @@ -67,22 +63,22 @@ class DemoCamera(Camera): """Camera Motion Detection Status.""" return self._motion_status - def enable_motion_detection(self): + async def async_enable_motion_detection(self): """Enable the Motion detection in base station (Arm).""" self._motion_status = True - self.schedule_update_ha_state() + self.async_write_ha_state() - def disable_motion_detection(self): + async def async_disable_motion_detection(self): """Disable the motion detection in base station (Disarm).""" self._motion_status = False - self.schedule_update_ha_state() + self.async_write_ha_state() - def turn_off(self): + async def async_turn_off(self): """Turn off camera.""" self.is_streaming = False - self.schedule_update_ha_state() + self.async_write_ha_state() - def turn_on(self): + async def async_turn_on(self): """Turn on camera.""" self.is_streaming = True - self.schedule_update_ha_state() + self.async_write_ha_state() diff --git a/tests/components/camera/test_init.py b/tests/components/camera/test_init.py index cb4201e29579..e8ab05abb908 100644 --- a/tests/components/camera/test_init.py +++ b/tests/components/camera/test_init.py @@ -2,8 +2,9 @@ import asyncio import base64 import io -from unittest.mock import PropertyMock, mock_open, patch +from unittest.mock import PropertyMock, mock_open +from asynctest import patch import pytest from homeassistant.components import camera @@ -14,40 +15,38 @@ from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_START from homeassistant.exceptions import HomeAssistantError from homeassistant.setup import async_setup_component -from tests.common import mock_coro from tests.components.camera import common -@pytest.fixture -def mock_camera(hass): +@pytest.fixture(name="mock_camera") +def mock_camera_fixture(hass): """Initialize a demo camera platform.""" assert hass.loop.run_until_complete( async_setup_component(hass, "camera", {camera.DOMAIN: {"platform": "demo"}}) ) with patch( - "homeassistant.components.demo.camera.DemoCamera.camera_image", - return_value=b"Test", + "homeassistant.components.demo.camera.Path.read_bytes", return_value=b"Test", ): yield -@pytest.fixture -def mock_stream(hass): +@pytest.fixture(name="mock_stream") +def mock_stream_fixture(hass): """Initialize a demo camera platform with streaming.""" assert hass.loop.run_until_complete( async_setup_component(hass, "stream", {"stream": {}}) ) -@pytest.fixture -def setup_camera_prefs(hass): +@pytest.fixture(name="setup_camera_prefs") +def setup_camera_prefs_fixture(hass): """Initialize HTTP API.""" return common.mock_camera_prefs(hass, "camera.demo_camera") -@pytest.fixture -async def image_mock_url(hass): +@pytest.fixture(name="image_mock_url") +async def image_mock_url_fixture(hass): """Fixture for get_image tests.""" await async_setup_component( hass, camera.DOMAIN, {camera.DOMAIN: {"platform": "demo"}} @@ -58,7 +57,7 @@ async def test_get_image_from_camera(hass, image_mock_url): """Grab an image from camera entity.""" with patch( - "homeassistant.components.demo.camera.DemoCamera.camera_image", + "homeassistant.components.demo.camera.Path.read_bytes", autospec=True, return_value=b"Test", ) as mock_camera: @@ -80,7 +79,7 @@ async def test_get_image_without_exists_camera(hass, image_mock_url): async def test_get_image_with_timeout(hass, image_mock_url): """Try to get image with timeout.""" with patch( - "homeassistant.components.camera.Camera.async_camera_image", + "homeassistant.components.demo.camera.DemoCamera.async_camera_image", side_effect=asyncio.TimeoutError, ), pytest.raises(HomeAssistantError): await camera.async_get_image(hass, "camera.demo_camera") @@ -89,8 +88,8 @@ async def test_get_image_with_timeout(hass, image_mock_url): async def test_get_image_fails(hass, image_mock_url): """Try to get image with timeout.""" with patch( - "homeassistant.components.camera.Camera.async_camera_image", - return_value=mock_coro(None), + "homeassistant.components.demo.camera.DemoCamera.async_camera_image", + return_value=None, ), pytest.raises(HomeAssistantError): await camera.async_get_image(hass, "camera.demo_camera") @@ -169,7 +168,7 @@ async def test_websocket_camera_stream(hass, hass_ws_client, mock_camera, mock_s return_value="http://home.assistant/playlist.m3u8", ) as mock_request_stream, patch( "homeassistant.components.demo.camera.DemoCamera.stream_source", - return_value=mock_coro("http://example.com"), + return_value="http://example.com", ): # Request playlist through WebSocket client = await hass_ws_client(hass) @@ -248,7 +247,7 @@ async def test_handle_play_stream_service(hass, mock_camera, mock_stream): "homeassistant.components.camera.request_stream" ) as mock_request_stream, patch( "homeassistant.components.demo.camera.DemoCamera.stream_source", - return_value=mock_coro("http://example.com"), + return_value="http://example.com", ): # Call service await hass.services.async_call( @@ -294,7 +293,7 @@ async def test_preload_stream(hass, mock_stream): return_value=demo_prefs, ), patch( "homeassistant.components.demo.camera.DemoCamera.stream_source", - return_value=mock_coro("http://example.com"), + return_value="http://example.com", ): await async_setup_component(hass, "camera", {DOMAIN: {"platform": "demo"}}) hass.bus.async_fire(EVENT_HOMEASSISTANT_START) @@ -323,10 +322,9 @@ async def test_record_service(hass, mock_camera, mock_stream): """Test record service.""" with patch( "homeassistant.components.demo.camera.DemoCamera.stream_source", - return_value=mock_coro("http://example.com"), + return_value="http://example.com", ), patch( "homeassistant.components.stream.async_handle_record_service", - return_value=mock_coro(), ) as mock_record_service, patch.object( hass.config, "is_allowed_path", return_value=True ): diff --git a/tests/components/demo/test_camera.py b/tests/components/demo/test_camera.py index 530cfef4cb6f..d46d1fdc62b5 100644 --- a/tests/components/demo/test_camera.py +++ b/tests/components/demo/test_camera.py @@ -1,10 +1,11 @@ """The tests for local file camera component.""" -from unittest.mock import mock_open, patch +from unittest.mock import patch import pytest from homeassistant.components.camera import ( DOMAIN as CAMERA_DOMAIN, + SERVICE_DISABLE_MOTION, SERVICE_ENABLE_MOTION, SERVICE_TURN_OFF, SERVICE_TURN_ON, @@ -35,16 +36,11 @@ async def test_init_state_is_streaming(hass): state = hass.states.get(ENTITY_CAMERA) assert state.state == STATE_STREAMING - mock_on_img = mock_open(read_data=b"ON") - with patch("homeassistant.components.demo.camera.open", mock_on_img, create=True): + with patch( + "homeassistant.components.demo.camera.Path.read_bytes", return_value=b"ON" + ) as mock_read_bytes: image = await async_get_image(hass, ENTITY_CAMERA) - assert mock_on_img.called - assert mock_on_img.call_args_list[0][0][0][-6:] in [ - "_0.jpg", - "_1.jpg", - "_2.jpg", - "_3.jpg", - ] + assert mock_read_bytes.call_count == 1 assert image.content == b"ON" @@ -113,3 +109,15 @@ async def test_motion_detection(hass): # Check if state has been updated. state = hass.states.get(ENTITY_CAMERA) assert state.attributes.get("motion_detection") + + # Call service to turn off motion detection + await hass.services.async_call( + CAMERA_DOMAIN, + SERVICE_DISABLE_MOTION, + {ATTR_ENTITY_ID: ENTITY_CAMERA}, + blocking=True, + ) + + # Check if state has been updated. + state = hass.states.get(ENTITY_CAMERA) + assert not state.attributes.get("motion_detection") diff --git a/tests/components/image_processing/test_init.py b/tests/components/image_processing/test_init.py index 95a6d65a9fb3..399523dd7799 100644 --- a/tests/components/image_processing/test_init.py +++ b/tests/components/image_processing/test_init.py @@ -1,5 +1,7 @@ """The tests for the image_processing component.""" -from unittest.mock import PropertyMock, patch +from unittest.mock import PropertyMock + +from asynctest import patch import homeassistant.components.http as http import homeassistant.components.image_processing as ip @@ -69,18 +71,16 @@ class TestImageProcessing: self.hass.stop() @patch( - "homeassistant.components.demo.camera.DemoCamera.camera_image", - autospec=True, - return_value=b"Test", + "homeassistant.components.demo.camera.Path.read_bytes", return_value=b"Test", ) - def test_get_image_from_camera(self, mock_camera): + def test_get_image_from_camera(self, mock_camera_read): """Grab an image from camera entity.""" common.scan(self.hass, entity_id="image_processing.test") self.hass.block_till_done() state = self.hass.states.get("image_processing.test") - assert mock_camera.called + assert mock_camera_read.called assert state.state == "1" assert state.attributes["image"] == b"Test" From f965fb63504db1af5c37ede190b21e977cbc3452 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 08:25:57 -0500 Subject: [PATCH 341/653] Fix nexia fan and hold modes for XL824 thermostats (#34042) * Fix nexia fan and hold modes for XL824 thermostats * Update nexia to 0.9.0 * Update tests to reflect the modes that now come directly in --- homeassistant/components/nexia/climate.py | 3 +-- homeassistant/components/nexia/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/nexia/test_climate.py | 8 ++++---- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/nexia/climate.py b/homeassistant/components/nexia/climate.py index a3a747d01231..fafa267c9141 100644 --- a/homeassistant/components/nexia/climate.py +++ b/homeassistant/components/nexia/climate.py @@ -2,7 +2,6 @@ import logging from nexia.const import ( - FAN_MODES, OPERATION_MODE_AUTO, OPERATION_MODE_COOL, OPERATION_MODE_HEAT, @@ -192,7 +191,7 @@ class NexiaZone(NexiaThermostatZoneEntity, ClimateDevice): @property def fan_modes(self): """Return the list of available fan modes.""" - return FAN_MODES + return self._thermostat.get_fan_modes() @property def min_temp(self): diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index 2102a2a82255..a58330ad2279 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,7 +1,7 @@ { "domain": "nexia", "name": "Nexia", - "requirements": ["nexia==0.8.2"], + "requirements": ["nexia==0.9.1"], "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index 2e74cea5c49e..bef5132c78c6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -921,7 +921,7 @@ netdisco==2.6.0 neurio==0.3.1 # homeassistant.components.nexia -nexia==0.8.2 +nexia==0.9.1 # homeassistant.components.nextcloud nextcloudmonitor==1.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2de28d73bf23..8314c6117843 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -356,7 +356,7 @@ nessclient==0.9.15 netdisco==2.6.0 # homeassistant.components.nexia -nexia==0.8.2 +nexia==0.9.1 # homeassistant.components.nsw_fuel_station nsw-fuel-api-client==1.0.10 diff --git a/tests/components/nexia/test_climate.py b/tests/components/nexia/test_climate.py index 7f3ed900d3cc..fe47ceeffe46 100644 --- a/tests/components/nexia/test_climate.py +++ b/tests/components/nexia/test_climate.py @@ -18,8 +18,8 @@ async def test_climate_zones(hass): "current_temperature": 22.8, "dehumidify_setpoint": 45.0, "dehumidify_supported": True, - "fan_mode": "auto", - "fan_modes": ["auto", "on", "circulate"], + "fan_mode": "Auto", + "fan_modes": ["Auto", "On", "Circulate"], "friendly_name": "Nick Office", "humidify_supported": False, "humidity": 45.0, @@ -53,8 +53,8 @@ async def test_climate_zones(hass): "current_temperature": 25.0, "dehumidify_setpoint": 50.0, "dehumidify_supported": True, - "fan_mode": "auto", - "fan_modes": ["auto", "on", "circulate"], + "fan_mode": "Auto", + "fan_modes": ["Auto", "On", "Circulate"], "friendly_name": "Kitchen", "humidify_supported": False, "humidity": 50.0, From fc670e46d93cf807f2342b4dfe92dec22f0e722c Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Sun, 12 Apr 2020 16:18:44 +0200 Subject: [PATCH 342/653] UniFi - Fix unit of measurement from B to MB (#34091) --- homeassistant/components/unifi/sensor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/unifi/sensor.py b/homeassistant/components/unifi/sensor.py index 1b6667f2e806..2e82ecb4f6f8 100644 --- a/homeassistant/components/unifi/sensor.py +++ b/homeassistant/components/unifi/sensor.py @@ -2,7 +2,7 @@ import logging from homeassistant.components.unifi.config_flow import get_controller_from_config_entry -from homeassistant.const import DATA_BYTES +from homeassistant.const import DATA_MEGABYTES from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -116,7 +116,7 @@ class UniFiRxBandwidthSensor(UniFiClient): @property def unit_of_measurement(self): """Return the unit of measurement of this entity.""" - return DATA_BYTES + return DATA_MEGABYTES class UniFiTxBandwidthSensor(UniFiRxBandwidthSensor): From 5aca16ef015c87b26e833a0d1dbcdbe746cf872d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 09:59:50 -0500 Subject: [PATCH 343/653] Add homekit configuration option to bind to default interface (#33999) * Add homekit configuration option to bind to default interface Homekit can fail to be discoverable because the zeroconf default is to bind to all interfaces (InterfaceChoice.All). This does not work on some systems and (InterfaceChoice.Default) which binds to 0.0.0.0 is needed for homekit to zeroconf to function. A new option is available for homekit zeroconf_default_interface: true * Update tests * Update homeassistant/components/homekit/__init__.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/homekit/__init__.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Review items * has a default * Revert "has a default" This reverts commit 24ecf0920f05f2793abe8a4242ca3f101306b93a. Breaks the tests Co-authored-by: springstan <46536646+springstan@users.noreply.github.com> --- homeassistant/components/homekit/__init__.py | 14 ++++++ homeassistant/components/homekit/const.py | 2 + tests/components/homekit/test_homekit.py | 46 +++++++++++++++++--- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index 4fdad670f098..c2ba5a465257 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -4,6 +4,7 @@ import logging from zlib import adler32 import voluptuous as vol +from zeroconf import InterfaceChoice from homeassistant.components import cover from homeassistant.components.cover import DEVICE_CLASS_GARAGE, DEVICE_CLASS_GATE @@ -39,9 +40,11 @@ from .const import ( CONF_FEATURE_LIST, CONF_FILTER, CONF_SAFE_MODE, + CONF_ZEROCONF_DEFAULT_INTERFACE, DEFAULT_AUTO_START, DEFAULT_PORT, DEFAULT_SAFE_MODE, + DEFAULT_ZEROCONF_DEFAULT_INTERFACE, DEVICE_CLASS_CO, DEVICE_CLASS_CO2, DEVICE_CLASS_PM25, @@ -98,6 +101,10 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_SAFE_MODE, default=DEFAULT_SAFE_MODE): cv.boolean, vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, vol.Optional(CONF_ENTITY_CONFIG, default={}): validate_entity_config, + vol.Optional( + CONF_ZEROCONF_DEFAULT_INTERFACE, + default=DEFAULT_ZEROCONF_DEFAULT_INTERFACE, + ): cv.boolean, } ) }, @@ -122,6 +129,9 @@ async def async_setup(hass, config): safe_mode = conf[CONF_SAFE_MODE] entity_filter = conf[CONF_FILTER] entity_config = conf[CONF_ENTITY_CONFIG] + interface_choice = ( + InterfaceChoice.Default if config.get(CONF_ZEROCONF_DEFAULT_INTERFACE) else None + ) homekit = HomeKit( hass, @@ -132,6 +142,7 @@ async def async_setup(hass, config): entity_config, safe_mode, advertise_ip, + interface_choice, ) await hass.async_add_executor_job(homekit.setup) @@ -287,6 +298,7 @@ class HomeKit: entity_config, safe_mode, advertise_ip=None, + interface_choice=None, ): """Initialize a HomeKit object.""" self.hass = hass @@ -297,6 +309,7 @@ class HomeKit: self._config = entity_config self._safe_mode = safe_mode self._advertise_ip = advertise_ip + self._interface_choice = interface_choice self.status = STATUS_READY self.bridge = None @@ -317,6 +330,7 @@ class HomeKit: port=self._port, persist_file=path, advertised_address=self._advertise_ip, + interface_choice=self._interface_choice, ) self.bridge = HomeBridge(self.hass, self.driver, self._name) if self._safe_mode: diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index c0f0abe81776..ccce082044b3 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -21,12 +21,14 @@ CONF_FILTER = "filter" CONF_LINKED_BATTERY_SENSOR = "linked_battery_sensor" CONF_LOW_BATTERY_THRESHOLD = "low_battery_threshold" CONF_SAFE_MODE = "safe_mode" +CONF_ZEROCONF_DEFAULT_INTERFACE = "zeroconf_default_interface" # #### Config Defaults #### DEFAULT_AUTO_START = True DEFAULT_LOW_BATTERY_THRESHOLD = 20 DEFAULT_PORT = 51827 DEFAULT_SAFE_MODE = False +DEFAULT_ZEROCONF_DEFAULT_INTERFACE = False # #### Features #### FEATURE_ON_OFF = "on_off" diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index d984eef5fdce..124366ba2417 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -2,6 +2,7 @@ from unittest.mock import ANY, Mock, patch import pytest +from zeroconf import InterfaceChoice from homeassistant import setup from homeassistant.components.homekit import ( @@ -67,7 +68,7 @@ async def test_setup_min(hass): assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}}) mock_homekit.assert_any_call( - hass, BRIDGE_NAME, DEFAULT_PORT, None, ANY, {}, DEFAULT_SAFE_MODE, None + hass, BRIDGE_NAME, DEFAULT_PORT, None, ANY, {}, DEFAULT_SAFE_MODE, None, None ) assert mock_homekit().setup.called is True @@ -96,7 +97,7 @@ async def test_setup_auto_start_disabled(hass): assert await setup.async_setup_component(hass, DOMAIN, config) mock_homekit.assert_any_call( - hass, "Test Name", 11111, "172.0.0.0", ANY, {}, DEFAULT_SAFE_MODE, None + hass, "Test Name", 11111, "172.0.0.0", ANY, {}, DEFAULT_SAFE_MODE, None, None ) assert mock_homekit().setup.called is True @@ -139,6 +140,7 @@ async def test_homekit_setup(hass, hk_driver): port=DEFAULT_PORT, persist_file=path, advertised_address=None, + interface_choice=None, ) assert homekit.driver.safe_mode is False @@ -160,6 +162,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver): port=DEFAULT_PORT, persist_file=ANY, advertised_address=None, + interface_choice=None, ) @@ -179,12 +182,41 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver): port=DEFAULT_PORT, persist_file=ANY, advertised_address="192.168.1.100", + interface_choice=None, + ) + + +async def test_homekit_setup_interface_choice(hass, hk_driver): + """Test setup with interface choice of Default.""" + homekit = HomeKit( + hass, + BRIDGE_NAME, + DEFAULT_PORT, + "0.0.0.0", + {}, + {}, + None, + None, + InterfaceChoice.Default, + ) + + with patch( + f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver + ) as mock_driver: + await hass.async_add_executor_job(homekit.setup) + mock_driver.assert_called_with( + hass, + address="0.0.0.0", + port=DEFAULT_PORT, + persist_file=ANY, + advertised_address=None, + interface_choice=InterfaceChoice.Default, ) async def test_homekit_setup_safe_mode(hass, hk_driver): """Test if safe_mode flag is set.""" - homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True) + homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True, None) with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver): await hass.async_add_executor_job(homekit.setup) @@ -193,7 +225,7 @@ async def test_homekit_setup_safe_mode(hass, hk_driver): async def test_homekit_add_accessory(): """Add accessory if config exists and get_acc returns an accessory.""" - homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {}, None) + homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {}, None, None) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() @@ -215,7 +247,7 @@ async def test_homekit_add_accessory(): async def test_homekit_remove_accessory(): """Remove accessory from bridge.""" - homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {}, None) + homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {}, None, None) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() mock_bridge.accessories = {"light.demo": "acc"} @@ -228,7 +260,7 @@ async def test_homekit_remove_accessory(): async def test_homekit_entity_filter(hass): """Test the entity filter.""" entity_filter = generate_filter(["cover"], ["demo.test"], [], []) - homekit = HomeKit(hass, None, None, None, entity_filter, {}, None) + homekit = HomeKit(hass, None, None, None, entity_filter, {}, None, None) with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.return_value = None @@ -248,7 +280,7 @@ async def test_homekit_entity_filter(hass): async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b"123-45-678" - homekit = HomeKit(hass, None, None, None, {}, {"cover.demo": {}}, None) + homekit = HomeKit(hass, None, None, None, {}, {"cover.demo": {}}, None, None) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver From b2af1de27338adc6dca49b0e8c5f98957947d0f2 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 17:18:09 +0200 Subject: [PATCH 344/653] Improve string formatting v9 (#34050) * Improve string formatting v9 * Address review comments --- homeassistant/auth/mfa_modules/totp.py | 2 +- .../components/osramlightify/light.py | 7 ++---- .../components/owntracks/messages.py | 4 ++-- homeassistant/components/pi_hole/__init__.py | 17 ++++++-------- homeassistant/components/plaato/__init__.py | 2 +- homeassistant/components/point/__init__.py | 2 +- homeassistant/components/prowl/notify.py | 2 +- .../components/proximity/__init__.py | 2 +- homeassistant/components/proxy/camera.py | 6 ++--- homeassistant/components/ps4/__init__.py | 6 ++--- homeassistant/components/ps4/media_player.py | 2 +- homeassistant/components/pushbullet/sensor.py | 2 +- homeassistant/components/pyload/sensor.py | 8 +++---- homeassistant/components/qnap/sensor.py | 10 +++----- .../components/qrcode/image_processing.py | 2 +- .../components/qwikswitch/__init__.py | 4 +--- homeassistant/components/radarr/sensor.py | 2 +- .../components/raincloud/__init__.py | 6 ++--- .../components/rainmachine/__init__.py | 6 ++--- homeassistant/core.py | 23 ++++++++----------- homeassistant/loader.py | 4 +--- 21 files changed, 47 insertions(+), 72 deletions(-) diff --git a/homeassistant/auth/mfa_modules/totp.py b/homeassistant/auth/mfa_modules/totp.py index 142bf32babab..d35f237f424b 100644 --- a/homeassistant/auth/mfa_modules/totp.py +++ b/homeassistant/auth/mfa_modules/totp.py @@ -41,7 +41,7 @@ def _generate_qr_code(data: str) -> str: with BytesIO() as buffer: qr_code.svg(file=buffer, scale=4) - return "{}".format( + return str( buffer.getvalue() .decode("ascii") .replace("\n", "") diff --git a/homeassistant/components/osramlightify/light.py b/homeassistant/components/osramlightify/light.py index 5cb9c481c3a2..ed79604a3f88 100644 --- a/homeassistant/components/osramlightify/light.py +++ b/homeassistant/components/osramlightify/light.py @@ -74,8 +74,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): try: bridge = Lightify(host, log_level=logging.NOTSET) except OSError as err: - msg = "Error connecting to bridge: {} due to: {}".format(host, str(err)) - _LOGGER.exception(msg) + _LOGGER.exception("Error connecting to bridge: %s due to: %s", host, err) return setup_bridge(bridge, add_entities, config) @@ -380,9 +379,7 @@ class OsramLightifyLight(Luminary): """Update static attributes of the luminary.""" super().update_static_attributes() attrs = { - "device_type": "{} ({})".format( - self._luminary.type_id(), self._luminary.devicename() - ), + "device_type": f"{self._luminary.type_id()} ({self._luminary.devicename()})", "firmware_version": self._luminary.version(), } if self._luminary.devicetype().name == "SENSOR": diff --git a/homeassistant/components/owntracks/messages.py b/homeassistant/components/owntracks/messages.py index 8814c8968a03..4d5995c558be 100644 --- a/homeassistant/components/owntracks/messages.py +++ b/homeassistant/components/owntracks/messages.py @@ -199,7 +199,7 @@ async def async_handle_location_message(hass, context, message): async def _async_transition_message_enter(hass, context, message, location): """Execute enter event.""" - zone = hass.states.get("zone.{}".format(slugify(location))) + zone = hass.states.get(f"zone.{slugify(location)}") dev_id, kwargs = _parse_see_args(message, context.mqtt_topic) if zone is None and message.get("t") == "b": @@ -240,7 +240,7 @@ async def _async_transition_message_leave(hass, context, message, location): new_region = regions[-1] if regions else None if new_region: # Exit to previous region - zone = hass.states.get("zone.{}".format(slugify(new_region))) + zone = hass.states.get(f"zone.{slugify(new_region)}") _set_gps_from_zone(kwargs, new_region, zone) _LOGGER.info("Exit to %s", new_region) context.async_see(**kwargs) diff --git a/homeassistant/components/pi_hole/__init__.py b/homeassistant/components/pi_hole/__init__.py index fb06d06cfb4b..989841d13170 100644 --- a/homeassistant/components/pi_hole/__init__.py +++ b/homeassistant/components/pi_hole/__init__.py @@ -45,12 +45,10 @@ def ensure_unique_names_and_slugs(config): slugs[conf[CONF_SLUG]] = conf[CONF_HOST] else: raise vol.Invalid( - "Duplicate name '{}' (or slug '{}') for '{}' (already in use by '{}'). Each configured Pi-hole must have a unique name.".format( - conf[CONF_NAME], - conf[CONF_SLUG], - conf[CONF_HOST], - names.get(conf[CONF_NAME], slugs[conf[CONF_SLUG]]), - ) + f"Duplicate name '{conf[CONF_NAME]}' (or slug '{conf[CONF_SLUG]}') " + f"for '{conf[CONF_HOST]}' (already in use by " + f"'{names.get(conf[CONF_NAME], slugs[conf[CONF_SLUG]])}'). " + "Each configured Pi-hole must have a unique name." ) return config @@ -108,9 +106,8 @@ async def async_setup(hass, config): if (data[slug]).api.api_token is None: raise vol.Invalid( - "Pi-hole '{}' must have an api_key provided in configuration to be enabled.".format( - pi_hole.name - ) + f"Pi-hole '{pi_hole.name}' must have an api_key " + "provided in configuration to be enabled." ) return call_data @@ -122,7 +119,7 @@ async def async_setup(hass, config): cv.time_period_str, cv.positive_timedelta ), vol.Optional(SERVICE_DISABLE_ATTR_NAME): vol.In( - [conf[CONF_NAME] for conf in config[DOMAIN]], msg="Unknown Pi-Hole", + [conf[CONF_NAME] for conf in config[DOMAIN]], msg="Unknown Pi-Hole" ), }, ensure_api_token, diff --git a/homeassistant/components/plaato/__init__.py b/homeassistant/components/plaato/__init__.py index 0dd57f758122..b365c7e0081b 100644 --- a/homeassistant/components/plaato/__init__.py +++ b/homeassistant/components/plaato/__init__.py @@ -127,4 +127,4 @@ async def handle_webhook(hass, webhook_id, request): def _device_id(data): """Return name of device sensor.""" - return "{}_{}".format(data.get(ATTR_DEVICE_NAME), data.get(ATTR_DEVICE_ID)) + return f"{data.get(ATTR_DEVICE_NAME)}_{data.get(ATTR_DEVICE_ID)}" diff --git a/homeassistant/components/point/__init__.py b/homeassistant/components/point/__init__.py index d2e4826ba2d7..2d6f39feb119 100644 --- a/homeassistant/components/point/__init__.py +++ b/homeassistant/components/point/__init__.py @@ -309,7 +309,7 @@ class MinutPointEntity(Entity): "connections": {("mac", device["device_mac"])}, "identifieres": device["device_id"], "manufacturer": "Minut", - "model": "Point v{}".format(device["hardware_version"]), + "model": f"Point v{device['hardware_version']}", "name": device["description"], "sw_version": device["firmware"]["installed"], "via_device": (DOMAIN, device["home"]), diff --git a/homeassistant/components/prowl/notify.py b/homeassistant/components/prowl/notify.py index ada7fbb5f340..5d2efe766077 100644 --- a/homeassistant/components/prowl/notify.py +++ b/homeassistant/components/prowl/notify.py @@ -39,7 +39,7 @@ class ProwlNotificationService(BaseNotificationService): """Send the message to the user.""" response = None session = None - url = "{}{}".format(_RESOURCE, "add") + url = f"{_RESOURCE}add" data = kwargs.get(ATTR_DATA) payload = { "apikey": self._api_key, diff --git a/homeassistant/components/proximity/__init__.py b/homeassistant/components/proximity/__init__.py index 3509b1ba8e17..c82818bca1a9 100644 --- a/homeassistant/components/proximity/__init__.py +++ b/homeassistant/components/proximity/__init__.py @@ -61,7 +61,7 @@ def setup_proximity_component(hass, name, config): unit_of_measurement = config.get( CONF_UNIT_OF_MEASUREMENT, hass.config.units.length_unit ) - zone_id = "zone.{}".format(config.get(CONF_ZONE)) + zone_id = f"zone.{config.get(CONF_ZONE)}" proximity = Proximity( hass, diff --git a/homeassistant/components/proxy/camera.py b/homeassistant/components/proxy/camera.py index a2912ef0dbea..7aa83d30ae42 100644 --- a/homeassistant/components/proxy/camera.py +++ b/homeassistant/components/proxy/camera.py @@ -188,8 +188,8 @@ class ProxyCamera(Camera): super().__init__() self.hass = hass self._proxied_camera = config.get(CONF_ENTITY_ID) - self._name = config.get(CONF_NAME) or "{} - {}".format( - DEFAULT_BASENAME, self._proxied_camera + self._name = ( + config.get(CONF_NAME) or f"{DEFAULT_BASENAME} - {self._proxied_camera}" ) self._image_opts = ImageOpts( config.get(CONF_MAX_IMAGE_WIDTH), @@ -258,7 +258,7 @@ class ProxyCamera(Camera): ) return await async_get_still_stream( - request, self._async_stream_image, self.content_type, self.frame_interval, + request, self._async_stream_image, self.content_type, self.frame_interval ) @property diff --git a/homeassistant/components/ps4/__init__.py b/homeassistant/components/ps4/__init__.py index 05e3422fe746..d2c6e9859de0 100644 --- a/homeassistant/components/ps4/__init__.py +++ b/homeassistant/components/ps4/__init__.py @@ -139,11 +139,9 @@ async def async_migrate_entry(hass, entry): config_entries.async_update_entry(entry) return True - msg = """{} for the PlayStation 4 Integration. + msg = f"""{reason[version]} for the PlayStation 4 Integration. Please remove the PS4 Integration and re-configure - [here](/config/integrations).""".format( - reason[version] - ) + [here](/config/integrations).""" hass.components.persistent_notification.async_create( title="PlayStation 4 Integration Configuration Requires Update", diff --git a/homeassistant/components/ps4/media_player.py b/homeassistant/components/ps4/media_player.py index 3aa65734d34e..3acaf75d699b 100644 --- a/homeassistant/components/ps4/media_player.py +++ b/homeassistant/components/ps4/media_player.py @@ -352,7 +352,7 @@ class PS4Device(MediaPlayerDevice): else: _sw_version = status["system-version"] _sw_version = _sw_version[1:4] - sw_version = "{}.{}".format(_sw_version[0], _sw_version[1:]) + sw_version = f"{_sw_version[0]}.{_sw_version[1:]}" self._info = { "name": status["host-name"], "model": "PlayStation 4", diff --git a/homeassistant/components/pushbullet/sensor.py b/homeassistant/components/pushbullet/sensor.py index 771ba55586cd..ff18e86aad99 100644 --- a/homeassistant/components/pushbullet/sensor.py +++ b/homeassistant/components/pushbullet/sensor.py @@ -77,7 +77,7 @@ class PushBulletNotificationSensor(Entity): @property def name(self): """Return the name of the sensor.""" - return "{} {}".format("Pushbullet", self._element) + return f"Pushbullet {self._element}" @property def state(self): diff --git a/homeassistant/components/pyload/sensor.py b/homeassistant/components/pyload/sensor.py index 249fb85bacc7..abcf1193ce47 100644 --- a/homeassistant/components/pyload/sensor.py +++ b/homeassistant/components/pyload/sensor.py @@ -83,7 +83,7 @@ class PyLoadSensor(Entity): def __init__(self, api, sensor_type, client_name): """Initialize a new pyLoad sensor.""" - self._name = "{} {}".format(client_name, sensor_type[1]) + self._name = f"{client_name} {sensor_type[1]}" self.type = sensor_type[0] self.api = api self._state = None @@ -141,9 +141,7 @@ class PyLoadAPI: if username is not None and password is not None: self.payload = {"username": username, "password": password} - self.login = requests.post( - "{}{}".format(api_url, "login"), data=self.payload, timeout=5 - ) + self.login = requests.post(f"{api_url}login", data=self.payload, timeout=5) self.update() def post(self, method, params=None): @@ -155,7 +153,7 @@ class PyLoadAPI: try: response = requests.post( - "{}{}".format(self.api_url, "statusServer"), + f"{self.api_url}statusServer", json=payload, cookies=self.login.cookies, headers=self.headers, diff --git a/homeassistant/components/qnap/sensor.py b/homeassistant/components/qnap/sensor.py index dc148d4f516e..aefbe760d6a4 100644 --- a/homeassistant/components/qnap/sensor.py +++ b/homeassistant/components/qnap/sensor.py @@ -177,7 +177,7 @@ class QNAPStatsAPI: protocol = "https" if config[CONF_SSL] else "http" self._api = QNAPStats( - "{}://{}".format(protocol, config.get(CONF_HOST)), + f"{protocol}://{config.get(CONF_HOST)}", config.get(CONF_PORT), config.get(CONF_USERNAME), config.get(CONF_PASSWORD), @@ -357,9 +357,7 @@ class QNAPDriveSensor(QNAPSensor): """Return the name of the sensor, if any.""" server_name = self._api.data["system_stats"]["system"]["name"] - return "{} {} (Drive {})".format( - server_name, self.var_name, self.monitor_device - ) + return f"{server_name} {self.var_name} (Drive {self.monitor_device})" @property def device_state_attributes(self): @@ -402,6 +400,4 @@ class QNAPVolumeSensor(QNAPSensor): data = self._api.data["volumes"][self.monitor_device] total_gb = int(data["total_size"]) / 1024 / 1024 / 1024 - return { - ATTR_VOLUME_SIZE: "{} {}".format(round_nicely(total_gb), DATA_GIBIBYTES) - } + return {ATTR_VOLUME_SIZE: f"{round_nicely(total_gb)} {DATA_GIBIBYTES}"} diff --git a/homeassistant/components/qrcode/image_processing.py b/homeassistant/components/qrcode/image_processing.py index 71bb67f07537..82f6a35ac8fd 100644 --- a/homeassistant/components/qrcode/image_processing.py +++ b/homeassistant/components/qrcode/image_processing.py @@ -34,7 +34,7 @@ class QrEntity(ImageProcessingEntity): if name: self._name = name else: - self._name = "QR {}".format(split_entity_id(camera_entity)[1]) + self._name = f"QR {split_entity_id(camera_entity)[1]}" self._state = None @property diff --git a/homeassistant/components/qwikswitch/__init__.py b/homeassistant/components/qwikswitch/__init__.py index 6ad030078b11..ffe877973589 100644 --- a/homeassistant/components/qwikswitch/__init__.py +++ b/homeassistant/components/qwikswitch/__init__.py @@ -205,9 +205,7 @@ async def async_setup(hass, config): # If button pressed, fire a hass event if QS_ID in qspacket: if qspacket.get(QS_CMD, "") in cmd_buttons: - hass.bus.async_fire( - "qwikswitch.button.{}".format(qspacket[QS_ID]), qspacket - ) + hass.bus.async_fire(f"qwikswitch.button.{qspacket[QS_ID]}", qspacket) return if qspacket[QS_ID] in sensor_ids: diff --git a/homeassistant/components/radarr/sensor.py b/homeassistant/components/radarr/sensor.py index a15f8b4fe4e9..273652710147 100644 --- a/homeassistant/components/radarr/sensor.py +++ b/homeassistant/components/radarr/sensor.py @@ -106,7 +106,7 @@ class RadarrSensor(Entity): self.port = conf.get(CONF_PORT) self.urlbase = conf.get(CONF_URLBASE) if self.urlbase: - self.urlbase = "{}/".format(self.urlbase.strip("/")) + self.urlbase = f"{self.urlbase.strip('/')}/" self.apikey = conf.get(CONF_API_KEY) self.included = conf.get(CONF_INCLUDED) self.days = int(conf.get(CONF_DAYS)) diff --git a/homeassistant/components/raincloud/__init__.py b/homeassistant/components/raincloud/__init__.py index cc42bdc54b88..17faea4495f4 100644 --- a/homeassistant/components/raincloud/__init__.py +++ b/homeassistant/components/raincloud/__init__.py @@ -107,9 +107,7 @@ def setup(hass, config): except (ConnectTimeout, HTTPError) as ex: _LOGGER.error("Unable to connect to Rain Cloud service: %s", str(ex)) hass.components.persistent_notification.create( - "Error: {}
" - "You will need to restart hass after fixing." - "".format(ex), + f"Error: {ex}
" "You will need to restart hass after fixing.", title=NOTIFICATION_TITLE, notification_id=NOTIFICATION_ID, ) @@ -142,7 +140,7 @@ class RainCloudEntity(Entity): """Initialize the RainCloud entity.""" self.data = data self._sensor_type = sensor_type - self._name = "{} {}".format(self.data.name, KEY_MAP.get(self._sensor_type)) + self._name = f"{self.data.name} {KEY_MAP.get(self._sensor_type)}" self._state = None @property diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index e1054f296d0b..2e32d0ed43d7 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -425,9 +425,9 @@ class RainMachineEntity(Entity): "identifiers": {(DOMAIN, self.rainmachine.controller.mac)}, "name": self.rainmachine.controller.name, "manufacturer": "RainMachine", - "model": "Version {} (API: {})".format( - self.rainmachine.controller.hardware_version, - self.rainmachine.controller.api_version, + "model": ( + f"Version {self.rainmachine.controller.hardware_version} " + f"(API: {self.rainmachine.controller.api_version})" ), "sw_version": self.rainmachine.controller.software_version, } diff --git a/homeassistant/core.py b/homeassistant/core.py index 7e85e7616a8d..8ad8c24bd535 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -509,11 +509,9 @@ class Event: """Return the representation.""" # pylint: disable=maybe-no-member if self.data: - return "".format( - self.event_type, str(self.origin)[0], util.repr_helper(self.data) - ) + return f"" - return "".format(self.event_type, str(self.origin)[0]) + return f"" def __eq__(self, other: Any) -> bool: """Return the comparison.""" @@ -826,15 +824,11 @@ class State: def __repr__(self) -> str: """Return the representation of the states.""" - attrs = ( - "; {}".format(util.repr_helper(self.attributes)) if self.attributes else "" - ) + attrs = f"; {util.repr_helper(self.attributes)}" if self.attributes else "" - return "".format( - self.entity_id, - self.state, - attrs, - dt_util.as_local(self.last_changed).isoformat(), + return ( + f"" ) @@ -1045,8 +1039,9 @@ class ServiceCall: def __repr__(self) -> str: """Return the representation of the service.""" if self.data: - return "".format( - self.domain, self.service, self.context.id, util.repr_helper(self.data) + return ( + f"" ) return f"" diff --git a/homeassistant/loader.py b/homeassistant/loader.py index 913262d35c4d..3e82adeb2e26 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -419,9 +419,7 @@ def _load_file( parts = [] for part in path.split("."): parts.append(part) - white_listed_errors.append( - "No module named '{}'".format(".".join(parts)) - ) + white_listed_errors.append(f"No module named '{'.'.join(parts)}'") if str(err) not in white_listed_errors: _LOGGER.exception( From 95e7c98c91ab2cebec9abdcc885eb4cfe9fefdbf Mon Sep 17 00:00:00 2001 From: Gerard Date: Sun, 12 Apr 2020 17:20:51 +0200 Subject: [PATCH 345/653] Add notify function for BMW Connected Drive (#33484) * Add notify function to BMW Connected Drive * Move side effects out of init --- .../bmw_connected_drive/__init__.py | 2 +- .../bmw_connected_drive/manifest.json | 3 +- .../components/bmw_connected_drive/notify.py | 74 +++++++++++++++++++ requirements_all.txt | 2 +- 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 homeassistant/components/bmw_connected_drive/notify.py diff --git a/homeassistant/components/bmw_connected_drive/__init__.py b/homeassistant/components/bmw_connected_drive/__init__.py index 273bac8ef0e9..b8f60dafdbb8 100644 --- a/homeassistant/components/bmw_connected_drive/__init__.py +++ b/homeassistant/components/bmw_connected_drive/__init__.py @@ -32,7 +32,7 @@ CONFIG_SCHEMA = vol.Schema({DOMAIN: {cv.string: ACCOUNT_SCHEMA}}, extra=vol.ALLO SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_VIN): cv.string}) -BMW_COMPONENTS = ["binary_sensor", "device_tracker", "lock", "sensor"] +BMW_COMPONENTS = ["binary_sensor", "device_tracker", "lock", "notify", "sensor"] UPDATE_INTERVAL = 5 # in minutes SERVICE_UPDATE_STATE = "update_state" diff --git a/homeassistant/components/bmw_connected_drive/manifest.json b/homeassistant/components/bmw_connected_drive/manifest.json index 6dcfecefc227..4521af8d36e7 100644 --- a/homeassistant/components/bmw_connected_drive/manifest.json +++ b/homeassistant/components/bmw_connected_drive/manifest.json @@ -2,6 +2,7 @@ "domain": "bmw_connected_drive", "name": "BMW Connected Drive", "documentation": "https://www.home-assistant.io/integrations/bmw_connected_drive", - "requirements": ["bimmer_connected==0.7.1"], + "requirements": ["bimmer_connected==0.7.5"], + "dependencies": [], "codeowners": ["@gerard33"] } diff --git a/homeassistant/components/bmw_connected_drive/notify.py b/homeassistant/components/bmw_connected_drive/notify.py new file mode 100644 index 000000000000..9cf2bca2df57 --- /dev/null +++ b/homeassistant/components/bmw_connected_drive/notify.py @@ -0,0 +1,74 @@ +"""Support for BMW notifications.""" +import logging + +from homeassistant.components.notify import ( + ATTR_DATA, + ATTR_TARGET, + ATTR_TITLE, + ATTR_TITLE_DEFAULT, + BaseNotificationService, +) +from homeassistant.const import ATTR_LATITUDE, ATTR_LOCATION, ATTR_LONGITUDE, ATTR_NAME + +from . import DOMAIN as BMW_DOMAIN + +ATTR_LAT = "lat" +ATTR_LOCATION_ATTRIBUTES = ["street", "city", "postal_code", "country"] +ATTR_LON = "lon" +ATTR_SUBJECT = "subject" +ATTR_TEXT = "text" + +_LOGGER = logging.getLogger(__name__) + + +def get_service(hass, config, discovery_info=None): + """Get the BMW notification service.""" + accounts = hass.data[BMW_DOMAIN] + _LOGGER.debug("Found BMW accounts: %s", ", ".join([a.name for a in accounts])) + svc = BMWNotificationService() + svc.setup(accounts) + return svc + + +class BMWNotificationService(BaseNotificationService): + """Send Notifications to BMW.""" + + def __init__(self): + """Set up the notification service.""" + self.targets = {} + + def setup(self, accounts): + """Get the BMW vehicle(s) for the account(s).""" + for account in accounts: + self.targets.update({v.name: v for v in account.account.vehicles}) + + def send_message(self, message="", **kwargs): + """Send a message or POI to the car.""" + for _vehicle in kwargs[ATTR_TARGET]: + _LOGGER.debug("Sending message to %s", _vehicle.name) + + # Extract params from data dict + title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) + data = kwargs.get(ATTR_DATA) + + # Check if message is a POI + if data is not None and ATTR_LOCATION in data: + location_dict = { + ATTR_LAT: data[ATTR_LOCATION][ATTR_LATITUDE], + ATTR_LON: data[ATTR_LOCATION][ATTR_LONGITUDE], + ATTR_NAME: message, + } + # Update dictionary with additional attributes if available + location_dict.update( + { + k: v + for k, v in data[ATTR_LOCATION].items() + if k in ATTR_LOCATION_ATTRIBUTES + } + ) + + _vehicle.remote_services.trigger_send_poi(location_dict) + else: + _vehicle.remote_services.trigger_send_message( + {ATTR_TEXT: message, ATTR_SUBJECT: title} + ) diff --git a/requirements_all.txt b/requirements_all.txt index bef5132c78c6..9695f6cd7526 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -320,7 +320,7 @@ beewi_smartclim==0.0.7 bellows-homeassistant==0.15.2 # homeassistant.components.bmw_connected_drive -bimmer_connected==0.7.1 +bimmer_connected==0.7.5 # homeassistant.components.bizkaibus bizkaibus==0.1.1 From c25cf82668817996b45d824cff59eed3b37b9686 Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Sun, 12 Apr 2020 10:51:57 -0500 Subject: [PATCH 346/653] Allow QVR Pro port to be optional on config (#33901) * Add default port to config to prevent None being passed to library * Default port constant --- homeassistant/components/qvr_pro/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/qvr_pro/__init__.py b/homeassistant/components/qvr_pro/__init__.py index 3e10191e48b3..ed12cd49c51d 100644 --- a/homeassistant/components/qvr_pro/__init__.py +++ b/homeassistant/components/qvr_pro/__init__.py @@ -19,6 +19,8 @@ from .const import ( SERVICE_STOP_RECORD, ) +DEFAULT_PORT = 8080 + SERVICE_CHANNEL_GUID = "guid" _LOGGER = logging.getLogger(__name__) @@ -30,7 +32,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Required(CONF_HOST): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT): cv.port, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXCLUDE_CHANNELS, default=[]): vol.All( cv.ensure_list_csv, [cv.positive_int] ), @@ -51,7 +53,7 @@ def setup(hass, config): user = conf[CONF_USERNAME] password = conf[CONF_PASSWORD] host = conf[CONF_HOST] - port = conf.get(CONF_PORT) + port = conf[CONF_PORT] excluded_channels = conf[CONF_EXCLUDE_CHANNELS] try: From ab493eba969b9b72b379303c82ae5303ee1a7c41 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Sun, 12 Apr 2020 21:30:57 +0530 Subject: [PATCH 347/653] =?UTF-8?q?Import=20ABC=20from=20collections.abc?= =?UTF-8?q?=20instead=20of=20collections=20for=20Pyt=E2=80=A6=20(#34077)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homeassistant/components/command_line/sensor.py | 4 ++-- homeassistant/components/zha/api.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/command_line/sensor.py b/homeassistant/components/command_line/sensor.py index c1fb5f1d21e9..f7ae21ab7041 100644 --- a/homeassistant/components/command_line/sensor.py +++ b/homeassistant/components/command_line/sensor.py @@ -1,5 +1,5 @@ """Allows to configure custom shell commands to turn a value for a sensor.""" -import collections +from collections.abc import Mapping from datetime import timedelta import json import logging @@ -106,7 +106,7 @@ class CommandSensor(Entity): if value: try: json_dict = json.loads(value) - if isinstance(json_dict, collections.Mapping): + if isinstance(json_dict, Mapping): self._attributes = { k: json_dict[k] for k in self._json_attributes diff --git a/homeassistant/components/zha/api.py b/homeassistant/components/zha/api.py index 433f9dd7ff22..232a56663006 100644 --- a/homeassistant/components/zha/api.py +++ b/homeassistant/components/zha/api.py @@ -2,6 +2,7 @@ import asyncio import collections +from collections.abc import Mapping import logging from typing import Any @@ -677,7 +678,7 @@ async def websocket_unbind_devices(hass, connection, msg): def is_cluster_binding(value: Any) -> ClusterBinding: """Validate and transform a cluster binding.""" - if not isinstance(value, collections.Mapping): + if not isinstance(value, Mapping): raise vol.Invalid("Not a cluster binding") try: cluster_binding = ClusterBinding( From b160f1c8131e1cb75e89034d36c41912d6794828 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2020 18:15:22 +0200 Subject: [PATCH 348/653] Increase scan_interval for currencylayer (#34097) --- homeassistant/components/currencylayer/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/currencylayer/sensor.py b/homeassistant/components/currencylayer/sensor.py index cbad07c0284e..79926cf1fcc1 100644 --- a/homeassistant/components/currencylayer/sensor.py +++ b/homeassistant/components/currencylayer/sensor.py @@ -26,7 +26,7 @@ DEFAULT_NAME = "CurrencyLayer Sensor" ICON = "mdi:currency" -SCAN_INTERVAL = timedelta(hours=2) +SCAN_INTERVAL = timedelta(hours=4) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { From d454c6a43d06e991f24194ecdb939c1cc46b68b9 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 19:45:50 +0200 Subject: [PATCH 349/653] Use MASS_KILOGRAMS constant (#34052) --- homeassistant/components/garmin_connect/const.py | 13 +++++++++---- homeassistant/components/isy994/sensor.py | 3 ++- homeassistant/components/smartthings/sensor.py | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/garmin_connect/const.py b/homeassistant/components/garmin_connect/const.py index ae1c2f1caa10..3b8d99c486a4 100644 --- a/homeassistant/components/garmin_connect/const.py +++ b/homeassistant/components/garmin_connect/const.py @@ -1,5 +1,10 @@ """Constants for the Garmin Connect integration.""" -from homeassistant.const import DEVICE_CLASS_TIMESTAMP, TIME_MINUTES, UNIT_PERCENTAGE +from homeassistant.const import ( + DEVICE_CLASS_TIMESTAMP, + MASS_KILOGRAMS, + TIME_MINUTES, + UNIT_PERCENTAGE, +) DOMAIN = "garmin_connect" ATTRIBUTION = "Data provided by garmin.com" @@ -309,12 +314,12 @@ GARMIN_ENTITY_LIST = { DEVICE_CLASS_TIMESTAMP, False, ], - "weight": ["Weight", "kg", "mdi:weight-kilogram", None, False], + "weight": ["Weight", MASS_KILOGRAMS, "mdi:weight-kilogram", None, False], "bmi": ["BMI", "", "mdi:food", None, False], "bodyFat": ["Body Fat", UNIT_PERCENTAGE, "mdi:food", None, False], "bodyWater": ["Body Water", UNIT_PERCENTAGE, "mdi:water-percent", None, False], - "bodyMass": ["Body Mass", "kg", "mdi:food", None, False], - "muscleMass": ["Muscle Mass", "kg", "mdi:dumbbell", None, False], + "bodyMass": ["Body Mass", MASS_KILOGRAMS, "mdi:food", None, False], + "muscleMass": ["Muscle Mass", MASS_KILOGRAMS, "mdi:dumbbell", None, False], "physiqueRating": ["Physique Rating", "", "mdi:numeric", None, False], "visceralFat": ["Visceral Fat", "", "mdi:food", None, False], "metabolicAge": ["Metabolic Age", "", "mdi:calendar-heart", None, False], diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index d3a889902f57..c8c427a5bf51 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -6,6 +6,7 @@ from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, LENGTH_KILOMETERS, + MASS_KILOGRAMS, POWER_WATT, SPEED_KILOMETERS_PER_HOUR, SPEED_METERS_PER_SECOND, @@ -55,7 +56,7 @@ UOM_FRIENDLY_NAME = { "25": "index", "26": "K", "27": "keyword", - "28": "kg", + "28": MASS_KILOGRAMS, "29": "kV", "30": "kW", "31": "kPa", diff --git a/homeassistant/components/smartthings/sensor.py b/homeassistant/components/smartthings/sensor.py index da581bb969ef..b25b89ac9cf9 100644 --- a/homeassistant/components/smartthings/sensor.py +++ b/homeassistant/components/smartthings/sensor.py @@ -41,7 +41,7 @@ CAPABILITY_TO_SENSORS = { Map(Attribute.battery, "Battery", UNIT_PERCENTAGE, DEVICE_CLASS_BATTERY) ], Capability.body_mass_index_measurement: [ - Map(Attribute.bmi_measurement, "Body Mass Index", "kg/m^2", None) + Map(Attribute.bmi_measurement, "Body Mass Index", f"{MASS_KILOGRAMS}/m^2", None) ], Capability.body_weight_measurement: [ Map(Attribute.body_weight_measurement, "Body Weight", MASS_KILOGRAMS, None) From f8f8dddca79cc7265d5448b249f07423753193bb Mon Sep 17 00:00:00 2001 From: jan iversen Date: Sun, 12 Apr 2020 19:55:03 +0200 Subject: [PATCH 350/653] Fix modbus sync/async issues (#34043) * add pyserial to manifest pymodbus is very developer oriented and assumes every developer adapt the requierements.txt to his/hers needs. Our requirements.txt is different it contains all posibilities allowing user to later change configuration without having to install extra packages. As a consequence manifest.json needs to include the pyserial. * modbus: make truly async client creation Make hass call listen_once async. Integrate content of start_modbus into async_setup. Do not use the boiler plate create tcp client function from pymodbus as it is sync, and also does not work well with asyncio, instead call the init_ directly, since that is async. * both component/modbus and component/serial uses pyserial-async but with slighty different version requirements. Combined the 2. * Review 1 * Review 2 * Review @staticmethod is no good, because the function uses class variables. * Review Pytest is sometimes a bit cryptic, lets hope this does it. --- homeassistant/components/modbus/__init__.py | 99 +++++++++++-------- homeassistant/components/modbus/manifest.json | 3 +- requirements_all.txt | 1 + requirements_test_all.txt | 4 + 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 1e889043fae9..ad0330b56a0a 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -3,13 +3,21 @@ import asyncio import logging from async_timeout import timeout -from pymodbus.client.asynchronous import schedulers -from pymodbus.client.asynchronous.serial import AsyncModbusSerialClient as ClientSerial -from pymodbus.client.asynchronous.tcp import AsyncModbusTCPClient as ClientTCP -from pymodbus.client.asynchronous.udp import AsyncModbusUDPClient as ClientUDP +from pymodbus.client.asynchronous.asyncio import ( + AsyncioModbusSerialClient, + ModbusClientProtocol, + init_tcp_client, + init_udp_client, +) from pymodbus.exceptions import ModbusException +from pymodbus.factory import ClientDecoder from pymodbus.pdu import ExceptionResponse -from pymodbus.transaction import ModbusRtuFramer +from pymodbus.transaction import ( + ModbusAsciiFramer, + ModbusBinaryFramer, + ModbusRtuFramer, + ModbusSocketFramer, +) import voluptuous as vol from homeassistant.const import ( @@ -105,13 +113,6 @@ async def async_setup(hass, config): for client in hub_collect.values(): del client - def start_modbus(): - """Start Modbus service.""" - for client in hub_collect.values(): - client.setup() - - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) - async def write_register(service): """Write Modbus registers.""" unit = int(float(service.data[ATTR_UNIT])) @@ -136,7 +137,11 @@ async def async_setup(hass, config): await hub_collect[client_name].write_coil(unit, address, state) # do not wait for EVENT_HOMEASSISTANT_START, activate pymodbus now - await hass.async_add_executor_job(start_modbus) + for client in hub_collect.values(): + await client.setup(hass) + + # register function to gracefully stop modbus + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) # Register services for modbus hass.services.async_register( @@ -189,47 +194,55 @@ class ModbusHub: await asyncio.sleep(self._config_delay) self._config_delay = 0 - def setup(self): - """Set up pymodbus client.""" - # pylint: disable = E0633 - # Client* do deliver loop, client as result but - # pylint does not accept that fact + @staticmethod + def _framer(method): + if method == "ascii": + framer = ModbusAsciiFramer(ClientDecoder()) + elif method == "rtu": + framer = ModbusRtuFramer(ClientDecoder()) + elif method == "binary": + framer = ModbusBinaryFramer(ClientDecoder()) + elif method == "socket": + framer = ModbusSocketFramer(ClientDecoder()) + else: + framer = None + return framer + async def setup(self, hass): + """Set up pymodbus client.""" if self._config_type == "serial": - _, self._client = ClientSerial( - schedulers.ASYNC_IO, - method=self._config_method, - port=self._config_port, + # reconnect ?? + framer = self._framer(self._config_method) + + # just a class creation no IO or other slow items + self._client = AsyncioModbusSerialClient( + self._config_port, + protocol_class=ModbusClientProtocol, + framer=framer, + loop=self._loop, baudrate=self._config_baudrate, - stopbits=self._config_stopbits, bytesize=self._config_bytesize, parity=self._config_parity, - loop=self._loop, + stopbits=self._config_stopbits, ) + await self._client.connect() elif self._config_type == "rtuovertcp": - _, self._client = ClientTCP( - schedulers.ASYNC_IO, - host=self._config_host, - port=self._config_port, - framer=ModbusRtuFramer, - timeout=self._config_timeout, - loop=self._loop, + # framer ModbusRtuFramer ?? + # timeout ?? + self._client = await init_tcp_client( + None, self._loop, self._config_host, self._config_port ) elif self._config_type == "tcp": - _, self._client = ClientTCP( - schedulers.ASYNC_IO, - host=self._config_host, - port=self._config_port, - timeout=self._config_timeout, - loop=self._loop, + # framer ?? + # timeout ?? + self._client = await init_tcp_client( + None, self._loop, self._config_host, self._config_port ) elif self._config_type == "udp": - _, self._client = ClientUDP( - schedulers.ASYNC_IO, - host=self._config_host, - port=self._config_port, - timeout=self._config_timeout, - loop=self._loop, + # framer ?? + # timeout ?? + self._client = await init_udp_client( + None, self._loop, self._config_host, self._config_port ) else: assert False diff --git a/homeassistant/components/modbus/manifest.json b/homeassistant/components/modbus/manifest.json index a9155c7b628d..2cdc8fe027cf 100644 --- a/homeassistant/components/modbus/manifest.json +++ b/homeassistant/components/modbus/manifest.json @@ -2,6 +2,7 @@ "domain": "modbus", "name": "Modbus", "documentation": "https://www.home-assistant.io/integrations/modbus", - "requirements": ["pymodbus==2.3.0"], + "requirements": ["pymodbus==2.3.0", + "pyserial-asyncio==0.4"], "codeowners": ["@adamchengtkc", "@janiversen"] } diff --git a/requirements_all.txt b/requirements_all.txt index 9695f6cd7526..b025253cf770 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1528,6 +1528,7 @@ pysdcp==1 # homeassistant.components.sensibo pysensibo==1.0.3 +# homeassistant.components.modbus # homeassistant.components.serial pyserial-asyncio==0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8314c6117843..e93f9ea8b4ce 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -597,6 +597,10 @@ pyps4-2ndscreen==1.0.7 # homeassistant.components.qwikswitch pyqwikswitch==0.93 +# homeassistant.components.modbus +# homeassistant.components.serial +pyserial-asyncio==0.4 + # homeassistant.components.signal_messenger pysignalclirestapi==0.2.4 From 4b1626a74874a724b534b4c4aab7518c55f6b18b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 13:42:36 -0500 Subject: [PATCH 351/653] Config flow for tado (#33677) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Config flow for tado * Add homekit models * self review fixes * reduce since the loop is gone * Update homeassistant/components/tado/water_heater.py Co-Authored-By: Michaël Arnauts * Change identifier * Ensure fallback mode is on by default * unique ids much be str Co-authored-by: Michaël Arnauts --- .../components/tado/.translations/en.json | 35 ++++ homeassistant/components/tado/__init__.py | 151 +++++++++++----- homeassistant/components/tado/climate.py | 53 +++--- homeassistant/components/tado/config_flow.py | 148 ++++++++++++++++ homeassistant/components/tado/const.py | 12 ++ homeassistant/components/tado/entity.py | 37 ++++ homeassistant/components/tado/manifest.json | 6 +- homeassistant/components/tado/sensor.py | 99 ++++++----- homeassistant/components/tado/strings.json | 35 ++++ homeassistant/components/tado/water_heater.py | 60 ++++--- homeassistant/generated/config_flows.py | 1 + homeassistant/generated/zeroconf.py | 4 +- tests/components/tado/test_config_flow.py | 167 ++++++++++++++++++ tests/components/tado/util.py | 12 +- 14 files changed, 682 insertions(+), 138 deletions(-) create mode 100644 homeassistant/components/tado/.translations/en.json create mode 100644 homeassistant/components/tado/config_flow.py create mode 100644 homeassistant/components/tado/entity.py create mode 100644 homeassistant/components/tado/strings.json create mode 100644 tests/components/tado/test_config_flow.py diff --git a/homeassistant/components/tado/.translations/en.json b/homeassistant/components/tado/.translations/en.json new file mode 100644 index 000000000000..9336d1409237 --- /dev/null +++ b/homeassistant/components/tado/.translations/en.json @@ -0,0 +1,35 @@ +{ + "config" : { + "abort" : { + "already_configured" : "Device is already configured" + }, + "step" : { + "user" : { + "data" : { + "password" : "Password", + "username" : "Username" + }, + "title" : "Connect to your Tado account" + } + }, + "error" : { + "unknown" : "Unexpected error", + "no_homes" : "There are no homes linked to this tado account.", + "invalid_auth" : "Invalid authentication", + "cannot_connect" : "Failed to connect, please try again" + }, + "title" : "Tado" + }, + "options" : { + "title" : "Tado", + "step" : { + "init" : { + "description" : "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", + "data" : { + "fallback" : "Enable fallback mode." + }, + "title" : "Adjust Tado options." + } + } + } +} diff --git a/homeassistant/components/tado/__init__.py b/homeassistant/components/tado/__init__.py index 1dba5f5f29ed..0f4e7e1c4182 100644 --- a/homeassistant/components/tado/__init__.py +++ b/homeassistant/components/tado/__init__.py @@ -1,25 +1,34 @@ """Support for the (unofficial) Tado API.""" +import asyncio from datetime import timedelta import logging from PyTado.interface import Tado from requests import RequestException +import requests.exceptions import voluptuous as vol from homeassistant.components.climate.const import PRESET_AWAY, PRESET_HOME +from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant, callback +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.discovery import load_platform from homeassistant.helpers.dispatcher import dispatcher_send +from homeassistant.helpers.event import async_track_time_interval from homeassistant.util import Throttle -from .const import CONF_FALLBACK, DATA +from .const import ( + CONF_FALLBACK, + DATA, + DOMAIN, + SIGNAL_TADO_UPDATE_RECEIVED, + UPDATE_LISTENER, + UPDATE_TRACK, +) _LOGGER = logging.getLogger(__name__) -DOMAIN = "tado" - -SIGNAL_TADO_UPDATE_RECEIVED = "tado_update_received_{}_{}" TADO_COMPONENTS = ["sensor", "climate", "water_heater"] @@ -43,45 +52,106 @@ CONFIG_SCHEMA = vol.Schema( ) -def setup(hass, config): - """Set up of the Tado component.""" - acc_list = config[DOMAIN] +async def async_setup(hass: HomeAssistant, config: dict): + """Set up the Tado component.""" - api_data_list = [] + hass.data.setdefault(DOMAIN, {}) - for acc in acc_list: - username = acc[CONF_USERNAME] - password = acc[CONF_PASSWORD] - fallback = acc[CONF_FALLBACK] + if DOMAIN not in config: + return True - tadoconnector = TadoConnector(hass, username, password, fallback) - if not tadoconnector.setup(): - continue - - # Do first update - tadoconnector.update() - - api_data_list.append(tadoconnector) - # Poll for updates in the background - hass.helpers.event.track_time_interval( - # we're using here tadoconnector as a parameter of lambda - # to capture actual value instead of closuring of latest value - lambda now, tc=tadoconnector: tc.update(), - SCAN_INTERVAL, - ) - - hass.data[DOMAIN] = {} - hass.data[DOMAIN][DATA] = api_data_list - - # Load components - for component in TADO_COMPONENTS: - load_platform( - hass, component, DOMAIN, {}, config, + for conf in config[DOMAIN]: + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=conf, + ) ) return True +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): + """Set up Tado from a config entry.""" + + _async_import_options_from_data_if_missing(hass, entry) + + username = entry.data[CONF_USERNAME] + password = entry.data[CONF_PASSWORD] + fallback = entry.options.get(CONF_FALLBACK, True) + + tadoconnector = TadoConnector(hass, username, password, fallback) + + try: + await hass.async_add_executor_job(tadoconnector.setup) + except KeyError: + _LOGGER.error("Failed to login to tado") + return False + except RuntimeError as exc: + _LOGGER.error("Failed to setup tado: %s", exc) + return ConfigEntryNotReady + except requests.exceptions.HTTPError as ex: + if ex.response.status_code > 400 and ex.response.status_code < 500: + _LOGGER.error("Failed to login to tado: %s", ex) + return False + raise ConfigEntryNotReady + + # Do first update + await hass.async_add_executor_job(tadoconnector.update) + + # Poll for updates in the background + update_track = async_track_time_interval( + hass, lambda now: tadoconnector.update(), SCAN_INTERVAL, + ) + + update_listener = entry.add_update_listener(_async_update_listener) + + hass.data[DOMAIN][entry.entry_id] = { + DATA: tadoconnector, + UPDATE_TRACK: update_track, + UPDATE_LISTENER: update_listener, + } + + for component in TADO_COMPONENTS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, component) + ) + + return True + + +@callback +def _async_import_options_from_data_if_missing(hass: HomeAssistant, entry: ConfigEntry): + options = dict(entry.options) + if CONF_FALLBACK not in options: + options[CONF_FALLBACK] = entry.data.get(CONF_FALLBACK, True) + hass.config_entries.async_update_entry(entry, options=options) + + +async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry): + """Handle options update.""" + await hass.config_entries.async_reload(entry.entry_id) + + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(entry, component) + for component in TADO_COMPONENTS + ] + ) + ) + + hass.data[DOMAIN][entry.entry_id][UPDATE_TRACK]() + hass.data[DOMAIN][entry.entry_id][UPDATE_LISTENER]() + + if unload_ok: + hass.data[DOMAIN].pop(entry.entry_id) + + return unload_ok + + class TadoConnector: """An object to store the Tado data.""" @@ -108,19 +178,12 @@ class TadoConnector: def setup(self): """Connect to Tado and fetch the zones.""" - try: - self.tado = Tado(self._username, self._password) - except (RuntimeError, RequestException) as exc: - _LOGGER.error("Unable to connect: %s", exc) - return False - + self.tado = Tado(self._username, self._password) self.tado.setDebugging(True) - # Load zones and devices self.zones = self.tado.getZones() self.devices = self.tado.getMe()["homes"] self.device_id = self.devices[0]["id"] - return True @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): diff --git a/homeassistant/components/tado/climate.py b/homeassistant/components/tado/climate.py index 2c6e49f32738..8b2da9e632dc 100644 --- a/homeassistant/components/tado/climate.py +++ b/homeassistant/components/tado/climate.py @@ -14,11 +14,11 @@ from homeassistant.components.climate.const import ( SUPPORT_SWING_MODE, SUPPORT_TARGET_TEMPERATURE, ) +from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, PRECISION_TENTHS, TEMP_CELSIUS -from homeassistant.core import callback +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect -from . import DOMAIN, SIGNAL_TADO_UPDATE_RECEIVED from .const import ( CONST_FAN_AUTO, CONST_FAN_OFF, @@ -30,9 +30,11 @@ from .const import ( CONST_OVERLAY_MANUAL, CONST_OVERLAY_TADO_MODE, DATA, + DOMAIN, HA_TO_TADO_FAN_MODE_MAP, HA_TO_TADO_HVAC_MODE_MAP, ORDERED_KNOWN_TADO_MODES, + SIGNAL_TADO_UPDATE_RECEIVED, SUPPORT_PRESET, TADO_HVAC_ACTION_TO_HA_HVAC_ACTION, TADO_MODES_WITH_NO_TEMP_SETTING, @@ -42,30 +44,37 @@ from .const import ( TYPE_AIR_CONDITIONING, TYPE_HEATING, ) +from .entity import TadoZoneEntity _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_entry( + hass: HomeAssistant, entry: ConfigEntry, async_add_entities +): """Set up the Tado climate platform.""" - if discovery_info is None: - return - api_list = hass.data[DOMAIN][DATA] - entities = [] - - for tado in api_list: - for zone in tado.zones: - if zone["type"] in [TYPE_HEATING, TYPE_AIR_CONDITIONING]: - entity = create_climate_entity(tado, zone["name"], zone["id"]) - if entity: - entities.append(entity) + tado = hass.data[DOMAIN][entry.entry_id][DATA] + entities = await hass.async_add_executor_job(_generate_entities, tado) if entities: - add_entities(entities, True) + async_add_entities(entities, True) -def create_climate_entity(tado, name: str, zone_id: int): +def _generate_entities(tado): + """Create all climate entities.""" + entities = [] + for zone in tado.zones: + if zone["type"] in [TYPE_HEATING, TYPE_AIR_CONDITIONING]: + entity = create_climate_entity( + tado, zone["name"], zone["id"], zone["devices"][0] + ) + if entity: + entities.append(entity) + return entities + + +def create_climate_entity(tado, name: str, zone_id: int, zone: dict): """Create a Tado climate entity.""" capabilities = tado.get_capabilities(zone_id) _LOGGER.debug("Capabilities for zone %s: %s", zone_id, capabilities) @@ -148,11 +157,12 @@ def create_climate_entity(tado, name: str, zone_id: int): supported_hvac_modes, supported_fan_modes, support_flags, + zone, ) return entity -class TadoClimate(ClimateDevice): +class TadoClimate(TadoZoneEntity, ClimateDevice): """Representation of a Tado climate entity.""" def __init__( @@ -170,11 +180,12 @@ class TadoClimate(ClimateDevice): supported_hvac_modes, supported_fan_modes, support_flags, + device_info, ): """Initialize of Tado climate entity.""" self._tado = tado + super().__init__(zone_name, device_info, tado.device_id, zone_id) - self.zone_name = zone_name self.zone_id = zone_id self.zone_type = zone_type self._unique_id = f"{zone_type} {zone_id} {tado.device_id}" @@ -206,6 +217,7 @@ class TadoClimate(ClimateDevice): self._undo_dispatcher = None self._tado_zone_data = None + self._async_update_zone_data() async def async_will_remove_from_hass(self): @@ -237,11 +249,6 @@ class TadoClimate(ClimateDevice): """Return the unique id.""" return self._unique_id - @property - def should_poll(self) -> bool: - """Do not poll.""" - return False - @property def current_humidity(self): """Return the current humidity.""" diff --git a/homeassistant/components/tado/config_flow.py b/homeassistant/components/tado/config_flow.py new file mode 100644 index 000000000000..c14b4284cf31 --- /dev/null +++ b/homeassistant/components/tado/config_flow.py @@ -0,0 +1,148 @@ +"""Config flow for Tado integration.""" +import logging + +from PyTado.interface import Tado +import requests.exceptions +import voluptuous as vol + +from homeassistant import config_entries, core, exceptions +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import callback + +from .const import CONF_FALLBACK, UNIQUE_ID +from .const import DOMAIN # pylint:disable=unused-import + +_LOGGER = logging.getLogger(__name__) + +DATA_SCHEMA = vol.Schema( + {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +) + + +async def validate_input(hass: core.HomeAssistant, data): + """Validate the user input allows us to connect. + + Data has the keys from DATA_SCHEMA with values provided by the user. + """ + + try: + tado = await hass.async_add_executor_job( + Tado, data[CONF_USERNAME], data[CONF_PASSWORD] + ) + tado_me = await hass.async_add_executor_job(tado.getMe) + except KeyError: + raise InvalidAuth + except RuntimeError: + raise CannotConnect + except requests.exceptions.HTTPError as ex: + if ex.response.status_code > 400 and ex.response.status_code < 500: + raise InvalidAuth + raise CannotConnect + + if "homes" not in tado_me or len(tado_me["homes"]) == 0: + raise NoHomes + + home = tado_me["homes"][0] + unique_id = str(home["id"]) + name = home["name"] + + return {"title": name, UNIQUE_ID: unique_id} + + +class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for Tado.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + + async def async_step_user(self, user_input=None): + """Handle the initial step.""" + errors = {} + if user_input is not None: + try: + validated = await validate_input(self.hass, user_input) + except CannotConnect: + errors["base"] = "cannot_connect" + except InvalidAuth: + errors["base"] = "invalid_auth" + except NoHomes: + errors["base"] = "no_homes" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + + if "base" not in errors: + await self.async_set_unique_id(validated[UNIQUE_ID]) + self._abort_if_unique_id_configured() + return self.async_create_entry( + title=validated["title"], data=user_input + ) + + return self.async_show_form( + step_id="user", data_schema=DATA_SCHEMA, errors=errors + ) + + async def async_step_homekit(self, homekit_info): + """Handle HomeKit discovery.""" + if self._async_current_entries(): + # We can see tado on the network to tell them to configure + # it, but since the device will not give up the account it is + # bound to and there can be multiple tado devices on a single + # account, we avoid showing the device as discovered once + # they already have one configured as they can always + # add a new one via "+" + return self.async_abort(reason="already_configured") + return await self.async_step_user() + + async def async_step_import(self, user_input): + """Handle import.""" + if self._username_already_configured(user_input): + return self.async_abort(reason="already_configured") + return await self.async_step_user(user_input) + + def _username_already_configured(self, user_input): + """See if we already have a username matching user input configured.""" + existing_username = { + entry.data[CONF_USERNAME] for entry in self._async_current_entries() + } + return user_input[CONF_USERNAME] in existing_username + + @staticmethod + @callback + def async_get_options_flow(config_entry): + """Get the options flow for this handler.""" + return OptionsFlowHandler(config_entry) + + +class OptionsFlowHandler(config_entries.OptionsFlow): + """Handle a option flow for tado.""" + + def __init__(self, config_entry: config_entries.ConfigEntry): + """Initialize options flow.""" + self.config_entry = config_entry + + async def async_step_init(self, user_input=None): + """Handle options flow.""" + if user_input is not None: + return self.async_create_entry(title="", data=user_input) + + data_schema = vol.Schema( + { + vol.Required( + CONF_FALLBACK, default=self.config_entry.options.get(CONF_FALLBACK) + ): bool, + } + ) + return self.async_show_form(step_id="init", data_schema=data_schema) + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" + + +class InvalidAuth(exceptions.HomeAssistantError): + """Error to indicate there is invalid auth.""" + + +class NoHomes(exceptions.HomeAssistantError): + """Error to indicate the account has no homes.""" diff --git a/homeassistant/components/tado/const.py b/homeassistant/components/tado/const.py index ab965de035a7..67f71b974307 100644 --- a/homeassistant/components/tado/const.py +++ b/homeassistant/components/tado/const.py @@ -46,6 +46,7 @@ TADO_HVAC_ACTION_TO_HA_HVAC_ACTION = { # Configuration CONF_FALLBACK = "fallback" DATA = "data" +UPDATE_TRACK = "update_track" # Types TYPE_AIR_CONDITIONING = "AIR_CONDITIONING" @@ -135,3 +136,14 @@ SUPPORT_PRESET = [PRESET_AWAY, PRESET_HOME] TADO_SWING_OFF = "OFF" TADO_SWING_ON = "ON" + +DOMAIN = "tado" + +SIGNAL_TADO_UPDATE_RECEIVED = "tado_update_received_{}_{}" +UNIQUE_ID = "unique_id" + +DEFAULT_NAME = "Tado" + +TADO_BRIDGE = "Tado Bridge" + +UPDATE_LISTENER = "update_listener" diff --git a/homeassistant/components/tado/entity.py b/homeassistant/components/tado/entity.py new file mode 100644 index 000000000000..97a3e3bdc39e --- /dev/null +++ b/homeassistant/components/tado/entity.py @@ -0,0 +1,37 @@ +"""Base class for August entity.""" + +import logging + +from homeassistant.helpers.entity import Entity + +from .const import DEFAULT_NAME, DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +class TadoZoneEntity(Entity): + """Base implementation for tado device.""" + + def __init__(self, zone_name, device_info, device_id, zone_id): + """Initialize an August device.""" + super().__init__() + self._device_zone_id = f"{device_id}_{zone_id}" + self._device_info = device_info + self.zone_name = zone_name + + @property + def device_info(self): + """Return the device_info of the device.""" + return { + "identifiers": {(DOMAIN, self._device_zone_id)}, + "name": self.zone_name, + "manufacturer": DEFAULT_NAME, + "sw_version": self._device_info["currentFwVersion"], + "model": self._device_info["deviceType"], + "via_device": (DOMAIN, self._device_info["serialNo"]), + } + + @property + def should_poll(self): + """Do not poll.""" + return False diff --git a/homeassistant/components/tado/manifest.json b/homeassistant/components/tado/manifest.json index 741612b6b4b4..f739459402a4 100644 --- a/homeassistant/components/tado/manifest.json +++ b/homeassistant/components/tado/manifest.json @@ -3,5 +3,9 @@ "name": "Tado", "documentation": "https://www.home-assistant.io/integrations/tado", "requirements": ["python-tado==0.6.0"], - "codeowners": ["@michaelarnauts", "@bdraco"] + "codeowners": ["@michaelarnauts", "@bdraco"], + "config_flow": true, + "homekit": { + "models": ["tado", "AC02"] + } } diff --git a/homeassistant/components/tado/sensor.py b/homeassistant/components/tado/sensor.py index fea81dcb586c..1d409a8a4e97 100644 --- a/homeassistant/components/tado/sensor.py +++ b/homeassistant/components/tado/sensor.py @@ -1,13 +1,23 @@ """Support for Tado sensors for each zone.""" import logging +from homeassistant.config_entries import ConfigEntry from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE -from homeassistant.core import callback +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity -from . import DATA, DOMAIN, SIGNAL_TADO_UPDATE_RECEIVED -from .const import TYPE_AIR_CONDITIONING, TYPE_HEATING, TYPE_HOT_WATER +from .const import ( + DATA, + DEFAULT_NAME, + DOMAIN, + SIGNAL_TADO_UPDATE_RECEIVED, + TADO_BRIDGE, + TYPE_AIR_CONDITIONING, + TYPE_HEATING, + TYPE_HOT_WATER, +) +from .entity import TadoZoneEntity _LOGGER = logging.getLogger(__name__) @@ -39,50 +49,53 @@ ZONE_SENSORS = { DEVICE_SENSORS = ["tado bridge status"] -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the sensor platform.""" - api_list = hass.data[DOMAIN][DATA] +async def async_setup_entry( + hass: HomeAssistant, entry: ConfigEntry, async_add_entities +): + """Set up the Tado sensor platform.""" + tado = hass.data[DOMAIN][entry.entry_id][DATA] + # Create zone sensors + zones = tado.zones + devices = tado.devices entities = [] - for tado in api_list: - # Create zone sensors - zones = tado.zones - devices = tado.devices + for zone in zones: + zone_type = zone["type"] + if zone_type not in ZONE_SENSORS: + _LOGGER.warning("Unknown zone type skipped: %s", zone_type) + continue - for zone in zones: - zone_type = zone["type"] - if zone_type not in ZONE_SENSORS: - _LOGGER.warning("Unknown zone type skipped: %s", zone_type) - continue + entities.extend( + [ + TadoZoneSensor( + tado, zone["name"], zone["id"], variable, zone["devices"][0] + ) + for variable in ZONE_SENSORS[zone_type] + ] + ) - entities.extend( - [ - TadoZoneSensor(tado, zone["name"], zone["id"], variable) - for variable in ZONE_SENSORS[zone_type] - ] - ) + # Create device sensors + for device in devices: + entities.extend( + [ + TadoDeviceSensor(tado, device["name"], device["id"], variable, device) + for variable in DEVICE_SENSORS + ] + ) - # Create device sensors - for device in devices: - entities.extend( - [ - TadoDeviceSensor(tado, device["name"], device["id"], variable) - for variable in DEVICE_SENSORS - ] - ) - - add_entities(entities, True) + if entities: + async_add_entities(entities, True) -class TadoZoneSensor(Entity): +class TadoZoneSensor(TadoZoneEntity, Entity): """Representation of a tado Sensor.""" - def __init__(self, tado, zone_name, zone_id, zone_variable): + def __init__(self, tado, zone_name, zone_id, zone_variable, device_info): """Initialize of the Tado Sensor.""" self._tado = tado + super().__init__(zone_name, device_info, tado.device_id, zone_id) - self.zone_name = zone_name self.zone_id = zone_id self.zone_variable = zone_variable @@ -148,11 +161,6 @@ class TadoZoneSensor(Entity): if self.zone_variable == "humidity": return "mdi:water-percent" - @property - def should_poll(self): - """Do not poll.""" - return False - @callback def _async_update_callback(self): """Update and write state.""" @@ -223,10 +231,11 @@ class TadoZoneSensor(Entity): class TadoDeviceSensor(Entity): """Representation of a tado Sensor.""" - def __init__(self, tado, device_name, device_id, device_variable): + def __init__(self, tado, device_name, device_id, device_variable, device_info): """Initialize of the Tado Sensor.""" self._tado = tado + self._device_info = device_info self.device_name = device_name self.device_id = device_id self.device_variable = device_variable @@ -289,3 +298,13 @@ class TadoDeviceSensor(Entity): if self.device_variable == "tado bridge status": self._state = data.get("connectionState", {}).get("value", False) + + @property + def device_info(self): + """Return the device_info of the device.""" + return { + "identifiers": {(DOMAIN, self.device_id)}, + "name": self.device_name, + "manufacturer": DEFAULT_NAME, + "model": TADO_BRIDGE, + } diff --git a/homeassistant/components/tado/strings.json b/homeassistant/components/tado/strings.json new file mode 100644 index 000000000000..697dadb4c7d6 --- /dev/null +++ b/homeassistant/components/tado/strings.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Username" + }, + "title": "Connect to your Tado account" + } + }, + "error": { + "unknown": "Unexpected error", + "no_homes": "There are no homes linked to this tado account.", + "invalid_auth": "Invalid authentication", + "cannot_connect": "Failed to connect, please try again" + }, + "title": "Tado" + }, + "options": { + "title": "Tado", + "step": { + "init": { + "description": "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", + "data": { + "fallback": "Enable fallback mode." + }, + "title": "Adjust Tado options." + } + } + } +} diff --git a/homeassistant/components/tado/water_heater.py b/homeassistant/components/tado/water_heater.py index 51ff2ede57db..ac9005738c40 100644 --- a/homeassistant/components/tado/water_heater.py +++ b/homeassistant/components/tado/water_heater.py @@ -6,11 +6,11 @@ from homeassistant.components.water_heater import ( SUPPORT_TARGET_TEMPERATURE, WaterHeaterDevice, ) +from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS -from homeassistant.core import callback +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect -from . import DOMAIN, SIGNAL_TADO_UPDATE_RECEIVED from .const import ( CONST_HVAC_HEAT, CONST_MODE_AUTO, @@ -21,8 +21,11 @@ from .const import ( CONST_OVERLAY_TADO_MODE, CONST_OVERLAY_TIMER, DATA, + DOMAIN, + SIGNAL_TADO_UPDATE_RECEIVED, TYPE_HOT_WATER, ) +from .entity import TadoZoneEntity _LOGGER = logging.getLogger(__name__) @@ -44,25 +47,31 @@ WATER_HEATER_MAP_TADO = { SUPPORT_FLAGS_HEATER = SUPPORT_OPERATION_MODE -def setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_entry( + hass: HomeAssistant, entry: ConfigEntry, async_add_entities +): """Set up the Tado water heater platform.""" - if discovery_info is None: - return - api_list = hass.data[DOMAIN][DATA] - entities = [] - - for tado in api_list: - for zone in tado.zones: - if zone["type"] == TYPE_HOT_WATER: - entity = create_water_heater_entity(tado, zone["name"], zone["id"]) - entities.append(entity) + tado = hass.data[DOMAIN][entry.entry_id][DATA] + entities = await hass.async_add_executor_job(_generate_entities, tado) if entities: - add_entities(entities, True) + async_add_entities(entities, True) -def create_water_heater_entity(tado, name: str, zone_id: int): +def _generate_entities(tado): + """Create all water heater entities.""" + entities = [] + + for zone in tado.zones: + if zone["type"] == TYPE_HOT_WATER: + entity = create_water_heater_entity(tado, zone["name"], zone["id"], zone) + entities.append(entity) + + return entities + + +def create_water_heater_entity(tado, name: str, zone_id: int, zone: str): """Create a Tado water heater device.""" capabilities = tado.get_capabilities(zone_id) @@ -77,13 +86,19 @@ def create_water_heater_entity(tado, name: str, zone_id: int): max_temp = None entity = TadoWaterHeater( - tado, name, zone_id, supports_temperature_control, min_temp, max_temp + tado, + name, + zone_id, + supports_temperature_control, + min_temp, + max_temp, + zone["devices"][0], ) return entity -class TadoWaterHeater(WaterHeaterDevice): +class TadoWaterHeater(TadoZoneEntity, WaterHeaterDevice): """Representation of a Tado water heater.""" def __init__( @@ -94,11 +109,13 @@ class TadoWaterHeater(WaterHeaterDevice): supports_temperature_control, min_temp, max_temp, + device_info, ): """Initialize of Tado water heater entity.""" - self._tado = tado - self.zone_name = zone_name + self._tado = tado + super().__init__(zone_name, device_info, tado.device_id, zone_id) + self.zone_id = zone_id self._unique_id = f"{zone_id} {tado.device_id}" @@ -149,11 +166,6 @@ class TadoWaterHeater(WaterHeaterDevice): """Return the unique id.""" return self._unique_id - @property - def should_poll(self) -> bool: - """Do not poll.""" - return False - @property def current_operation(self): """Return current readable operation mode.""" diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 0e78ddecc4b6..a7dbd4860891 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -113,6 +113,7 @@ FLOWS = [ "spotify", "starline", "synology_dsm", + "tado", "tellduslive", "tesla", "toon", diff --git a/homeassistant/generated/zeroconf.py b/homeassistant/generated/zeroconf.py index f5519ea903bf..d6e4965c235d 100644 --- a/homeassistant/generated/zeroconf.py +++ b/homeassistant/generated/zeroconf.py @@ -47,6 +47,7 @@ ZEROCONF = { HOMEKIT = { "819LMB": "myq", + "AC02": "tado", "BSB002": "hue", "Healty Home Coach": "netatmo", "LIFX": "lifx", @@ -55,5 +56,6 @@ HOMEKIT = { "Rachio": "rachio", "TRADFRI": "tradfri", "Welcome": "netatmo", - "Wemo": "wemo" + "Wemo": "wemo", + "tado": "tado" } diff --git a/tests/components/tado/test_config_flow.py b/tests/components/tado/test_config_flow.py new file mode 100644 index 000000000000..fb9156d96d9e --- /dev/null +++ b/tests/components/tado/test_config_flow.py @@ -0,0 +1,167 @@ +"""Test the Tado config flow.""" +from asynctest import MagicMock, patch +import requests + +from homeassistant import config_entries, setup +from homeassistant.components.tado.const import DOMAIN +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME + +from tests.common import MockConfigEntry + + +def _get_mock_tado_api(getMe=None): + mock_tado = MagicMock() + if isinstance(getMe, Exception): + type(mock_tado).getMe = MagicMock(side_effect=getMe) + else: + type(mock_tado).getMe = MagicMock(return_value=getMe) + return mock_tado + + +async def test_form(hass): + """Test we can setup though the user path.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + mock_tado_api = _get_mock_tado_api(getMe={"homes": [{"id": 1, "name": "myhome"}]}) + + with patch( + "homeassistant.components.tado.config_flow.Tado", return_value=mock_tado_api, + ), patch( + "homeassistant.components.tado.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.tado.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-username", "password": "test-password"}, + ) + + assert result2["type"] == "create_entry" + assert result2["title"] == "myhome" + assert result2["data"] == { + "username": "test-username", + "password": "test-password", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_import(hass): + """Test we can import.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + mock_tado_api = _get_mock_tado_api(getMe={"homes": [{"id": 1, "name": "myhome"}]}) + + with patch( + "homeassistant.components.tado.config_flow.Tado", return_value=mock_tado_api, + ), patch( + "homeassistant.components.tado.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.tado.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={"username": "test-username", "password": "test-password"}, + ) + + assert result["type"] == "create_entry" + assert result["title"] == "myhome" + assert result["data"] == { + "username": "test-username", + "password": "test-password", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_invalid_auth(hass): + """Test we handle invalid auth.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + response_mock = MagicMock() + type(response_mock).status_code = 401 + mock_tado_api = _get_mock_tado_api(getMe=requests.HTTPError(response=response_mock)) + + with patch( + "homeassistant.components.tado.config_flow.Tado", return_value=mock_tado_api, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-username", "password": "test-password"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "invalid_auth"} + + +async def test_form_cannot_connect(hass): + """Test we handle cannot connect error.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + response_mock = MagicMock() + type(response_mock).status_code = 500 + mock_tado_api = _get_mock_tado_api(getMe=requests.HTTPError(response=response_mock)) + + with patch( + "homeassistant.components.tado.config_flow.Tado", return_value=mock_tado_api, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-username", "password": "test-password"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "cannot_connect"} + + +async def test_no_homes(hass): + """Test we handle no homes error.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + mock_tado_api = _get_mock_tado_api(getMe={"homes": []}) + + with patch( + "homeassistant.components.tado.config_flow.Tado", return_value=mock_tado_api, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-username", "password": "test-password"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "no_homes"} + + +async def test_form_homekit(hass): + """Test that we abort from homekit if tado is already setup.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": "homekit"} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + entry = MockConfigEntry( + domain=DOMAIN, data={CONF_USERNAME: "mock", CONF_PASSWORD: "mock"} + ) + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": "homekit"} + ) + assert result["type"] == "abort" diff --git a/tests/components/tado/util.py b/tests/components/tado/util.py index 1b7e1ad888e8..5c060e76eec2 100644 --- a/tests/components/tado/util.py +++ b/tests/components/tado/util.py @@ -5,9 +5,8 @@ import requests_mock from homeassistant.components.tado import DOMAIN from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant -from homeassistant.setup import async_setup_component -from tests.common import load_fixture +from tests.common import MockConfigEntry, load_fixture async def async_init_integration( @@ -93,8 +92,11 @@ async def async_init_integration( "https://my.tado.com/api/v2/homes/1/zones/1/state", text=load_fixture(zone_1_state_fixture), ) + entry = MockConfigEntry( + domain=DOMAIN, data={CONF_USERNAME: "mock", CONF_PASSWORD: "mock"} + ) + entry.add_to_hass(hass) + if not skip_setup: - assert await async_setup_component( - hass, DOMAIN, {DOMAIN: {CONF_USERNAME: "mock", CONF_PASSWORD: "mock"}} - ) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() From 138470d86c6b873c52af3d7046255c098d87301a Mon Sep 17 00:00:00 2001 From: bqstony Date: Sun, 12 Apr 2020 20:56:04 +0200 Subject: [PATCH 352/653] deCONZ support for new device trigger for Feller EDIZIOdue Friends of hue Switch (#33478) * deCONZ support for new device trigger for Feller EDIZIOdue Friends of hue Switch * Rename to general name -friends of hue switch * translation for top and bottom buttons --- homeassistant/components/deconz/.translations/de.json | 2 ++ homeassistant/components/deconz/.translations/en.json | 2 ++ homeassistant/components/deconz/.translations/fr.json | 2 ++ homeassistant/components/deconz/device_trigger.py | 6 +++--- homeassistant/components/deconz/strings.json | 2 ++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index 1b2daecbc4ed..d463a64efb64 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -34,6 +34,8 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Beide Tasten", + "top_buttons": "Obere Tasten", + "bottom_buttons" : "Untere Tasten", "button_1": "Erste Taste", "button_2": "Zweite Taste", "button_3": "Dritte Taste", diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index 2c9562359f59..4a93d96fdb5c 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -34,6 +34,8 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Both buttons", + "top_buttons": "Top buttons", + "bottom_buttons" : "Bottom buttons", "button_1": "First button", "button_2": "Second button", "button_3": "Third button", diff --git a/homeassistant/components/deconz/.translations/fr.json b/homeassistant/components/deconz/.translations/fr.json index 0c2ecf9edb88..a6eefbcc54c2 100644 --- a/homeassistant/components/deconz/.translations/fr.json +++ b/homeassistant/components/deconz/.translations/fr.json @@ -34,6 +34,8 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Les deux boutons", + "top_buttons": "sup\u00e9rieurs boutons", + "bottom_buttons" : "inf\u00e9rieurs boutons", "button_1": "Premier bouton", "button_2": "Deuxi\u00e8me bouton", "button_3": "Troisi\u00e8me bouton", diff --git a/homeassistant/components/deconz/device_trigger.py b/homeassistant/components/deconz/device_trigger.py index 654bcfd43dbb..a146552f14ed 100644 --- a/homeassistant/components/deconz/device_trigger.py +++ b/homeassistant/components/deconz/device_trigger.py @@ -99,8 +99,8 @@ HUE_TAP_REMOTE = { (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 18}, } -SENIC_FRIENDS_OF_HUE_MODEL = "FOHSWITCH" -SENIC_FRIENDS_OF_HUE = { +FRIENDS_OF_HUE_SWITCH_MODEL = "FOHSWITCH" +FRIENDS_OF_HUE_SWITCH = { (CONF_SHORT_PRESS, CONF_BUTTON_1): {CONF_EVENT: 1000}, (CONF_SHORT_RELEASE, CONF_BUTTON_1): {CONF_EVENT: 1002}, (CONF_LONG_PRESS, CONF_BUTTON_1): {CONF_EVENT: 1001}, @@ -304,7 +304,7 @@ REMOTES = { HUE_DIMMER_REMOTE_MODEL_GEN1: HUE_DIMMER_REMOTE, HUE_DIMMER_REMOTE_MODEL_GEN2: HUE_DIMMER_REMOTE, HUE_TAP_REMOTE_MODEL: HUE_TAP_REMOTE, - SENIC_FRIENDS_OF_HUE_MODEL: SENIC_FRIENDS_OF_HUE, + FRIENDS_OF_HUE_SWITCH_MODEL: FRIENDS_OF_HUE_SWITCH, SYMFONISK_SOUND_CONTROLLER_MODEL: SYMFONISK_SOUND_CONTROLLER, TRADFRI_ON_OFF_SWITCH_MODEL: TRADFRI_ON_OFF_SWITCH, TRADFRI_OPEN_CLOSE_REMOTE_MODEL: TRADFRI_OPEN_CLOSE_REMOTE, diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index c4ceffd5373a..735a9bf58e5d 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -83,6 +83,8 @@ "open": "Open", "close": "Close", "both_buttons": "Both buttons", + "top_buttons": "Top buttons", + "bottom_buttons" : "Bottom buttons", "button_1": "First button", "button_2": "Second button", "button_3": "Third button", From 44afffcfbf009cafd16729af60dd47429f0382c8 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 21:04:13 +0200 Subject: [PATCH 353/653] Use UNIT_UV_INDEX constant (#34055) --- homeassistant/components/metoffice/sensor.py | 3 ++- homeassistant/components/openuv/sensor.py | 6 +++--- homeassistant/components/rfxtrx/__init__.py | 3 ++- homeassistant/components/tellduslive/sensor.py | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/metoffice/sensor.py b/homeassistant/components/metoffice/sensor.py index 0682c458792f..678d02d9d836 100644 --- a/homeassistant/components/metoffice/sensor.py +++ b/homeassistant/components/metoffice/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( SPEED_MILES_PER_HOUR, TEMP_CELSIUS, UNIT_PERCENTAGE, + UNIT_UV_INDEX, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -72,7 +73,7 @@ SENSOR_TYPES = { "wind_gust": ["Wind Gust", SPEED_MILES_PER_HOUR], "visibility": ["Visibility", None], "visibility_distance": ["Visibility Distance", LENGTH_KILOMETERS], - "uv": ["UV", None], + "uv": ["UV", UNIT_UV_INDEX], "precipitation": ["Probability of Precipitation", UNIT_PERCENTAGE], "humidity": ["Humidity", UNIT_PERCENTAGE], } diff --git a/homeassistant/components/openuv/sensor.py b/homeassistant/components/openuv/sensor.py index 0d4a8b73a087..162fac50c6c4 100644 --- a/homeassistant/components/openuv/sensor.py +++ b/homeassistant/components/openuv/sensor.py @@ -1,7 +1,7 @@ """Support for OpenUV sensors.""" import logging -from homeassistant.const import TIME_MINUTES +from homeassistant.const import TIME_MINUTES, UNIT_UV_INDEX from homeassistant.core import callback from homeassistant.util.dt import as_local, parse_datetime @@ -43,9 +43,9 @@ UV_LEVEL_LOW = "Low" SENSORS = { TYPE_CURRENT_OZONE_LEVEL: ("Current Ozone Level", "mdi:vector-triangle", "du"), - TYPE_CURRENT_UV_INDEX: ("Current UV Index", "mdi:weather-sunny", "index"), + TYPE_CURRENT_UV_INDEX: ("Current UV Index", "mdi:weather-sunny", UNIT_UV_INDEX), TYPE_CURRENT_UV_LEVEL: ("Current UV Level", "mdi:weather-sunny", None), - TYPE_MAX_UV_INDEX: ("Max UV Index", "mdi:weather-sunny", "index"), + TYPE_MAX_UV_INDEX: ("Max UV Index", "mdi:weather-sunny", UNIT_UV_INDEX), TYPE_SAFE_EXPOSURE_TIME_1: ( "Skin Type 1 Safe Exposure Time", "mdi:timer", diff --git a/homeassistant/components/rfxtrx/__init__.py b/homeassistant/components/rfxtrx/__init__.py index 39cbde08c013..b37ad8c15a83 100644 --- a/homeassistant/components/rfxtrx/__init__.py +++ b/homeassistant/components/rfxtrx/__init__.py @@ -19,6 +19,7 @@ from homeassistant.const import ( POWER_WATT, TEMP_CELSIUS, UNIT_PERCENTAGE, + UNIT_UV_INDEX, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -57,7 +58,7 @@ DATA_TYPES = OrderedDict( ("Sound", ""), ("Sensor Status", ""), ("Counter value", ""), - ("UV", "uv"), + ("UV", UNIT_UV_INDEX), ("Humidity status", ""), ("Forecast", ""), ("Forecast numeric", ""), diff --git a/homeassistant/components/tellduslive/sensor.py b/homeassistant/components/tellduslive/sensor.py index 472c430da163..693616ab78ce 100644 --- a/homeassistant/components/tellduslive/sensor.py +++ b/homeassistant/components/tellduslive/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( TEMP_CELSIUS, TIME_HOURS, UNIT_PERCENTAGE, + UNIT_UV_INDEX, ) from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -44,7 +45,7 @@ SENSOR_TYPES = { SENSOR_TYPE_WINDDIRECTION: ["Wind direction", "", "", None], SENSOR_TYPE_WINDAVERAGE: ["Wind average", SPEED_METERS_PER_SECOND, "", None], SENSOR_TYPE_WINDGUST: ["Wind gust", SPEED_METERS_PER_SECOND, "", None], - SENSOR_TYPE_UV: ["UV", "UV", "", None], + SENSOR_TYPE_UV: ["UV", UNIT_UV_INDEX, "", None], SENSOR_TYPE_WATT: ["Power", POWER_WATT, "", None], SENSOR_TYPE_LUMINANCE: ["Luminance", "lx", None, DEVICE_CLASS_ILLUMINANCE], SENSOR_TYPE_DEW_POINT: ["Dew Point", TEMP_CELSIUS, None, DEVICE_CLASS_TEMPERATURE], From 538bb600221e027cad0bdd4806351876da20118c Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 21:26:20 +0200 Subject: [PATCH 354/653] Add and use UNIT_CONDUCTIVITY constant (#34107) --- homeassistant/components/miflora/sensor.py | 3 ++- homeassistant/components/mysensors/sensor.py | 3 ++- homeassistant/components/plant/__init__.py | 3 ++- homeassistant/const.py | 3 +++ tests/components/plant/test_init.py | 21 +++++++++++++++----- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/miflora/sensor.py b/homeassistant/components/miflora/sensor.py index b8073f16d923..61db00fa1484 100644 --- a/homeassistant/components/miflora/sensor.py +++ b/homeassistant/components/miflora/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_START, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_CONDUCTIVITY, UNIT_PERCENTAGE, ) from homeassistant.core import callback @@ -54,7 +55,7 @@ SENSOR_TYPES = { "temperature": ["Temperature", TEMP_CELSIUS, "mdi:thermometer"], "light": ["Light intensity", "lx", "mdi:white-balance-sunny"], "moisture": ["Moisture", UNIT_PERCENTAGE, "mdi:water-percent"], - "conductivity": ["Conductivity", "µS/cm", "mdi:flash-circle"], + "conductivity": ["Conductivity", UNIT_CONDUCTIVITY, "mdi:flash-circle"], "battery": ["Battery", UNIT_PERCENTAGE, "mdi:battery-charging"], } diff --git a/homeassistant/components/mysensors/sensor.py b/homeassistant/components/mysensors/sensor.py index ac16198ee697..e528d7c4baa3 100644 --- a/homeassistant/components/mysensors/sensor.py +++ b/homeassistant/components/mysensors/sensor.py @@ -7,6 +7,7 @@ from homeassistant.const import ( POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, + UNIT_CONDUCTIVITY, UNIT_DEGREE, UNIT_PERCENTAGE, UNIT_VOLT, @@ -41,7 +42,7 @@ SENSORS = { "V_CURRENT": ["A", "mdi:flash-auto"], "V_PH": ["pH", None], "V_ORP": ["mV", None], - "V_EC": ["μS/cm", None], + "V_EC": [UNIT_CONDUCTIVITY, None], "V_VAR": ["var", None], "V_VA": ["VA", None], } diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index 3e35559bb629..f63df3995ec2 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -16,6 +16,7 @@ from homeassistant.const import ( STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELSIUS, + UNIT_CONDUCTIVITY, UNIT_PERCENTAGE, ) from homeassistant.core import callback @@ -147,7 +148,7 @@ class Plant(Entity): "max": CONF_MAX_MOISTURE, }, READING_CONDUCTIVITY: { - ATTR_UNIT_OF_MEASUREMENT: "µS/cm", + ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY, "min": CONF_MIN_CONDUCTIVITY, "max": CONF_MAX_CONDUCTIVITY, }, diff --git a/homeassistant/const.py b/homeassistant/const.py index 99274d59ff72..74647864fab3 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -409,6 +409,9 @@ MASS_MICROGRAMS = "µg" MASS_OUNCES: str = "oz" MASS_POUNDS: str = "lb" +# Conductivity units +UNIT_CONDUCTIVITY: str = f"µS/{LENGTH_CENTIMETERS}" + # UV Index units UNIT_UV_INDEX: str = "UV index" diff --git a/tests/components/plant/test_init.py b/tests/components/plant/test_init.py index 5250fb0fa70e..0f8cac370e82 100644 --- a/tests/components/plant/test_init.py +++ b/tests/components/plant/test_init.py @@ -13,6 +13,7 @@ from homeassistant.const import ( STATE_PROBLEM, STATE_UNAVAILABLE, STATE_UNKNOWN, + UNIT_CONDUCTIVITY, ) from homeassistant.setup import setup_component @@ -93,7 +94,9 @@ class TestPlant(unittest.TestCase): def test_initial_states(self): """Test plant initialises attributes if sensor already exists.""" - self.hass.states.set(MOISTURE_ENTITY, 5, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"}) + self.hass.states.set( + MOISTURE_ENTITY, 5, {ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY} + ) plant_name = "some_plant" assert setup_component( self.hass, plant.DOMAIN, {plant.DOMAIN: {plant_name: GOOD_CONFIG}} @@ -111,7 +114,9 @@ class TestPlant(unittest.TestCase): assert setup_component( self.hass, plant.DOMAIN, {plant.DOMAIN: {plant_name: GOOD_CONFIG}} ) - self.hass.states.set(MOISTURE_ENTITY, 5, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"}) + self.hass.states.set( + MOISTURE_ENTITY, 5, {ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY} + ) self.hass.block_till_done() state = self.hass.states.get(f"plant.{plant_name}") assert STATE_PROBLEM == state.state @@ -127,7 +132,9 @@ class TestPlant(unittest.TestCase): self.hass, plant.DOMAIN, {plant.DOMAIN: {plant_name: GOOD_CONFIG}} ) self.hass.states.set( - MOISTURE_ENTITY, STATE_UNAVAILABLE, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"} + MOISTURE_ENTITY, + STATE_UNAVAILABLE, + {ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY}, ) self.hass.block_till_done() state = self.hass.states.get(f"plant.{plant_name}") @@ -143,13 +150,17 @@ class TestPlant(unittest.TestCase): assert setup_component( self.hass, plant.DOMAIN, {plant.DOMAIN: {plant_name: GOOD_CONFIG}} ) - self.hass.states.set(MOISTURE_ENTITY, 42, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"}) + self.hass.states.set( + MOISTURE_ENTITY, 42, {ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY} + ) self.hass.block_till_done() state = self.hass.states.get(f"plant.{plant_name}") assert state.state == STATE_OK assert state.attributes[plant.READING_MOISTURE] == 42 self.hass.states.set( - MOISTURE_ENTITY, STATE_UNAVAILABLE, {ATTR_UNIT_OF_MEASUREMENT: "us/cm"} + MOISTURE_ENTITY, + STATE_UNAVAILABLE, + {ATTR_UNIT_OF_MEASUREMENT: UNIT_CONDUCTIVITY}, ) self.hass.block_till_done() state = self.hass.states.get(f"plant.{plant_name}") From 00b6409b7666c4d2c5437d3975d8d2235ef41ad1 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 21:44:56 +0200 Subject: [PATCH 355/653] Use LENGTH_METERS constant (#34110) --- homeassistant/components/bom/sensor.py | 3 +- homeassistant/components/darksky/sensor.py | 9 ++--- .../components/garmin_connect/const.py | 33 ++++++++++++++++--- homeassistant/components/isy994/sensor.py | 6 ++-- homeassistant/components/mysensors/sensor.py | 5 +-- .../components/proximity/__init__.py | 5 +-- homeassistant/components/zamg/sensor.py | 8 ++++- homeassistant/core.py | 3 +- homeassistant/helpers/template.py | 3 +- 9 files changed, 57 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/bom/sensor.py b/homeassistant/components/bom/sensor.py index 8386409d3ead..59ee8027180c 100644 --- a/homeassistant/components/bom/sensor.py +++ b/homeassistant/components/bom/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, LENGTH_KILOMETERS, + LENGTH_METERS, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, UNIT_PERCENTAGE, @@ -73,7 +74,7 @@ SENSOR_TYPES = { "rel_hum": ["Relative Humidity", UNIT_PERCENTAGE], "sea_state": ["Sea State", None], "swell_dir_worded": ["Swell Direction", None], - "swell_height": ["Swell Height", "m"], + "swell_height": ["Swell Height", LENGTH_METERS], "swell_period": ["Swell Period", None], "vis_km": [f"Visability {LENGTH_KILOMETERS}", LENGTH_KILOMETERS], "weather": ["Weather", None], diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index e4471b7e55f2..ab639b2e6a2d 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -15,6 +15,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_SCAN_INTERVAL, + LENGTH_CENTIMETERS, LENGTH_KILOMETERS, SPEED_KILOMETERS_PER_HOUR, SPEED_METERS_PER_SECOND, @@ -128,11 +129,11 @@ SENSOR_TYPES = { ], "precip_accumulation": [ "Precip Accumulation", - "cm", + LENGTH_CENTIMETERS, "in", - "cm", - "cm", - "cm", + LENGTH_CENTIMETERS, + LENGTH_CENTIMETERS, + LENGTH_CENTIMETERS, "mdi:weather-snowy", ["hourly", "daily"], ], diff --git a/homeassistant/components/garmin_connect/const.py b/homeassistant/components/garmin_connect/const.py index 3b8d99c486a4..3c30340fc61e 100644 --- a/homeassistant/components/garmin_connect/const.py +++ b/homeassistant/components/garmin_connect/const.py @@ -1,6 +1,7 @@ """Constants for the Garmin Connect integration.""" from homeassistant.const import ( DEVICE_CLASS_TIMESTAMP, + LENGTH_METERS, MASS_KILOGRAMS, TIME_MINUTES, UNIT_PERCENTAGE, @@ -32,7 +33,13 @@ GARMIN_ENTITY_LIST = { False, ], "netCalorieGoal": ["Net Calorie Goal", "cal", "mdi:food", None, False], - "totalDistanceMeters": ["Total Distance Mtr", "m", "mdi:walk", None, True], + "totalDistanceMeters": [ + "Total Distance Mtr", + LENGTH_METERS, + "mdi:walk", + None, + True, + ], "wellnessStartTimeLocal": [ "Wellness Start Time", "", @@ -48,7 +55,13 @@ GARMIN_ENTITY_LIST = { False, ], "wellnessDescription": ["Wellness Description", "", "mdi:clock", None, False], - "wellnessDistanceMeters": ["Wellness Distance Mtr", "m", "mdi:walk", None, False], + "wellnessDistanceMeters": [ + "Wellness Distance Mtr", + LENGTH_METERS, + "mdi:walk", + None, + False, + ], "wellnessActiveKilocalories": [ "Wellness Active KiloCalories", "kcal", @@ -81,8 +94,20 @@ GARMIN_ENTITY_LIST = { None, True, ], - "floorsAscendedInMeters": ["Floors Ascended Mtr", "m", "mdi:stairs", None, False], - "floorsDescendedInMeters": ["Floors Descended Mtr", "m", "mdi:stairs", None, False], + "floorsAscendedInMeters": [ + "Floors Ascended Mtr", + LENGTH_METERS, + "mdi:stairs", + None, + False, + ], + "floorsDescendedInMeters": [ + "Floors Descended Mtr", + LENGTH_METERS, + "mdi:stairs", + None, + False, + ], "floorsAscended": ["Floors Ascended", "floors", "mdi:stairs", None, True], "floorsDescended": ["Floors Descended", "floors", "mdi:stairs", None, True], "userFloorsAscendedGoal": [ diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index c8c427a5bf51..bc213d805ce3 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -5,7 +5,9 @@ from typing import Callable from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, + LENGTH_CENTIMETERS, LENGTH_KILOMETERS, + LENGTH_METERS, MASS_KILOGRAMS, POWER_WATT, SPEED_KILOMETERS_PER_HOUR, @@ -35,7 +37,7 @@ UOM_FRIENDLY_NAME = { "1": "amp", "3": f"btu/{TIME_HOURS}", "4": TEMP_CELSIUS, - "5": "cm", + "5": LENGTH_CENTIMETERS, "6": "ft³", "7": f"ft³/{TIME_MINUTES}", "8": "m³", @@ -66,7 +68,7 @@ UOM_FRIENDLY_NAME = { "35": "l", "36": "lx", "37": "mercalli", - "38": "m", + "38": LENGTH_METERS, "39": "m³/hr", "40": SPEED_METERS_PER_SECOND, "41": "mA", diff --git a/homeassistant/components/mysensors/sensor.py b/homeassistant/components/mysensors/sensor.py index e528d7c4baa3..3e9d39fa64bc 100644 --- a/homeassistant/components/mysensors/sensor.py +++ b/homeassistant/components/mysensors/sensor.py @@ -3,6 +3,7 @@ from homeassistant.components import mysensors from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( ENERGY_KILO_WATT_HOUR, + LENGTH_METERS, MASS_KILOGRAMS, POWER_WATT, TEMP_CELSIUS, @@ -26,12 +27,12 @@ SENSORS = { "V_GUST": [None, "mdi:weather-windy"], "V_DIRECTION": [UNIT_DEGREE, "mdi:compass"], "V_WEIGHT": [MASS_KILOGRAMS, "mdi:weight-kilogram"], - "V_DISTANCE": ["m", "mdi:ruler"], + "V_DISTANCE": [LENGTH_METERS, "mdi:ruler"], "V_IMPEDANCE": ["ohm", None], "V_WATT": [POWER_WATT, None], "V_KWH": [ENERGY_KILO_WATT_HOUR, None], "V_LIGHT_LEVEL": [UNIT_PERCENTAGE, "mdi:white-balance-sunny"], - "V_FLOW": ["m", "mdi:gauge"], + "V_FLOW": [LENGTH_METERS, "mdi:gauge"], "V_VOLUME": ["m³", None], "V_LEVEL": { "S_SOUND": ["dB", "mdi:volume-high"], diff --git a/homeassistant/components/proximity/__init__.py b/homeassistant/components/proximity/__init__.py index c82818bca1a9..4b6ff4770535 100644 --- a/homeassistant/components/proximity/__init__.py +++ b/homeassistant/components/proximity/__init__.py @@ -8,6 +8,7 @@ from homeassistant.const import ( CONF_UNIT_OF_MEASUREMENT, CONF_ZONE, LENGTH_KILOMETERS, + LENGTH_METERS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -33,7 +34,7 @@ DEFAULT_PROXIMITY_ZONE = "home" DEFAULT_TOLERANCE = 1 DOMAIN = "proximity" -UNITS = [LENGTH_KILOMETERS, "m", "mi", "ft"] +UNITS = [LENGTH_KILOMETERS, LENGTH_METERS, "mi", "ft"] ZONE_SCHEMA = vol.Schema( { @@ -210,7 +211,7 @@ class Proximity(Entity): # Add the device and distance to a dictionary. distances_to_zone[device] = round( - convert(dist_to_zone, "m", self.unit_of_measurement), 1 + convert(dist_to_zone, LENGTH_METERS, self.unit_of_measurement), 1 ) # Loop through each of the distances collected and work out the diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 6580ab0917fc..a9f43f0fb21a 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_MONITORED_CONDITIONS, CONF_NAME, + LENGTH_METERS, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, UNIT_DEGREE, @@ -64,7 +65,12 @@ SENSOR_TYPES = { # The following probably not useful for general consumption, # but we need them to fill in internal attributes "station_name": ("Station Name", None, "Name", str), - "station_elevation": ("Station Elevation", "m", "Höhe m", int), + "station_elevation": ( + "Station Elevation", + LENGTH_METERS, + f"Höhe {LENGTH_METERS}", + int, + ), "update_date": ("Update Date", None, "Datum", str), "update_time": ("Update Time", None, "Zeit", str), } diff --git a/homeassistant/core.py b/homeassistant/core.py index 8ad8c24bd535..b3f4a68e37fc 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -56,6 +56,7 @@ from homeassistant.const import ( EVENT_STATE_CHANGED, EVENT_TIME_CHANGED, EVENT_TIMER_OUT_OF_SYNC, + LENGTH_METERS, MATCH_ALL, __version__, ) @@ -1324,7 +1325,7 @@ class Config: Async friendly. """ return self.units.length( - location.distance(self.latitude, self.longitude, lat, lon), "m" + location.distance(self.latitude, self.longitude, lat, lon), LENGTH_METERS ) def path(self, *path: str) -> str: diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 8c7b103f8345..b6c59604b74d 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -19,6 +19,7 @@ from homeassistant.const import ( ATTR_LATITUDE, ATTR_LONGITUDE, ATTR_UNIT_OF_MEASUREMENT, + LENGTH_METERS, MATCH_ALL, STATE_UNKNOWN, ) @@ -638,7 +639,7 @@ def distance(hass, *args): return hass.config.distance(*locations[0]) return hass.config.units.length( - loc_util.distance(*locations[0] + locations[1]), "m" + loc_util.distance(*locations[0] + locations[1]), LENGTH_METERS ) From 19dd797dfe5bb3a6bfe288cbb493e73c84430c2d Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Sun, 12 Apr 2020 22:44:31 +0200 Subject: [PATCH 356/653] Add and use frequency constants (#34113) --- homeassistant/components/apcupsd/sensor.py | 5 +++-- homeassistant/components/cpuspeed/sensor.py | 5 ++--- homeassistant/components/growatt_server/sensor.py | 3 ++- homeassistant/components/homematic/sensor.py | 3 ++- homeassistant/components/isy994/sensor.py | 3 ++- homeassistant/components/mysensors/sensor.py | 3 ++- homeassistant/components/nut/const.py | 14 ++++++++++---- homeassistant/components/solaredge_local/sensor.py | 3 ++- homeassistant/const.py | 4 ++++ 9 files changed, 29 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index 6989f58d3bbb..1e73f0405554 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -7,6 +7,7 @@ import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_RESOURCES, + FREQUENCY_HERTZ, POWER_WATT, TEMP_CELSIUS, TIME_MINUTES, @@ -49,7 +50,7 @@ SENSOR_TYPES = { "itemp": ["Internal Temperature", TEMP_CELSIUS, "mdi:thermometer"], "lastxfer": ["Last Transfer", "", "mdi:transfer"], "linefail": ["Input Voltage Status", "", "mdi:information-outline"], - "linefreq": ["Line Frequency", "Hz", "mdi:information-outline"], + "linefreq": ["Line Frequency", FREQUENCY_HERTZ, "mdi:information-outline"], "linev": ["Input Voltage", UNIT_VOLT, "mdi:flash"], "loadpct": ["Load", UNIT_PERCENTAGE, "mdi:gauge"], "loadapnt": ["Load Apparent Power", UNIT_PERCENTAGE, "mdi:gauge"], @@ -100,7 +101,7 @@ INFERRED_UNITS = { " Ampere": "A", " Volt-Ampere": "VA", " Watts": POWER_WATT, - " Hz": "Hz", + " Hz": FREQUENCY_HERTZ, " C": TEMP_CELSIUS, " Percent Load Capacity": UNIT_PERCENTAGE, } diff --git a/homeassistant/components/cpuspeed/sensor.py b/homeassistant/components/cpuspeed/sensor.py index 53598e24c70d..4d984ed6829f 100644 --- a/homeassistant/components/cpuspeed/sensor.py +++ b/homeassistant/components/cpuspeed/sensor.py @@ -5,7 +5,7 @@ from cpuinfo import cpuinfo import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, FREQUENCY_GIGAHERTZ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -42,7 +42,6 @@ class CpuSpeedSensor(Entity): self._name = name self._state = None self.info = None - self._unit_of_measurement = "GHz" @property def name(self): @@ -57,7 +56,7 @@ class CpuSpeedSensor(Entity): @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" - return self._unit_of_measurement + return FREQUENCY_GIGAHERTZ @property def device_state_attributes(self): diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index f51e38bd9da3..d2b92e8efb3d 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, ENERGY_KILO_WATT_HOUR, + FREQUENCY_HERTZ, POWER_WATT, UNIT_VOLT, ) @@ -71,7 +72,7 @@ INVERTER_SENSOR_TYPES = { "inverter_internal_wattage": ("Internal wattage", POWER_WATT, "ppv", "power"), "inverter_reactive_voltage": ("Reactive voltage", UNIT_VOLT, "vacr", None), "inverter_inverter_reactive_amperage": ("Reactive amperage", "A", "iacr", None), - "inverter_frequency": ("AC frequency", "Hz", "fac", None), + "inverter_frequency": ("AC frequency", FREQUENCY_HERTZ, "fac", None), "inverter_current_wattage": ("Output power", POWER_WATT, "pac", "power"), "inverter_current_reactive_wattage": ( "Reactive wattage", diff --git a/homeassistant/components/homematic/sensor.py b/homeassistant/components/homematic/sensor.py index 13e49bcf5095..d52a4a2a19fc 100644 --- a/homeassistant/components/homematic/sensor.py +++ b/homeassistant/components/homematic/sensor.py @@ -7,6 +7,7 @@ from homeassistant.const import ( DEVICE_CLASS_POWER, DEVICE_CLASS_TEMPERATURE, ENERGY_WATT_HOUR, + FREQUENCY_HERTZ, POWER_WATT, SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, @@ -58,7 +59,7 @@ HM_UNIT_HA_CAST = { "WIND_DIRECTION_RANGE": UNIT_DEGREE, "SUNSHINEDURATION": "#", "AIR_PRESSURE": "hPa", - "FREQUENCY": "Hz", + "FREQUENCY": FREQUENCY_HERTZ, "VALUE": "#", } diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index bc213d805ce3..2e694e5d2343 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -5,6 +5,7 @@ from typing import Callable from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( CONCENTRATION_PARTS_PER_MILLION, + FREQUENCY_HERTZ, LENGTH_CENTIMETERS, LENGTH_KILOMETERS, LENGTH_METERS, @@ -110,7 +111,7 @@ UOM_FRIENDLY_NAME = { "87": "m³/m³", "88": "Water activity", "89": "RPM", - "90": "Hz", + "90": FREQUENCY_HERTZ, "91": f"{UNIT_DEGREE} (Relative to North)", "92": f"{UNIT_DEGREE} (Relative to South)", } diff --git a/homeassistant/components/mysensors/sensor.py b/homeassistant/components/mysensors/sensor.py index 3e9d39fa64bc..ea621228cc40 100644 --- a/homeassistant/components/mysensors/sensor.py +++ b/homeassistant/components/mysensors/sensor.py @@ -3,6 +3,7 @@ from homeassistant.components import mysensors from homeassistant.components.sensor import DOMAIN from homeassistant.const import ( ENERGY_KILO_WATT_HOUR, + FREQUENCY_HERTZ, LENGTH_METERS, MASS_KILOGRAMS, POWER_WATT, @@ -36,7 +37,7 @@ SENSORS = { "V_VOLUME": ["m³", None], "V_LEVEL": { "S_SOUND": ["dB", "mdi:volume-high"], - "S_VIBRATION": ["Hz", None], + "S_VIBRATION": [FREQUENCY_HERTZ, None], "S_LIGHT_LEVEL": ["lx", "mdi:white-balance-sunny"], }, "V_VOLTAGE": [UNIT_VOLT, "mdi:flash"], diff --git a/homeassistant/components/nut/const.py b/homeassistant/components/nut/const.py index b62a413e82b2..13ffa318a4a5 100644 --- a/homeassistant/components/nut/const.py +++ b/homeassistant/components/nut/const.py @@ -5,6 +5,7 @@ from homeassistant.components.sensor import ( DEVICE_CLASS_TEMPERATURE, ) from homeassistant.const import ( + FREQUENCY_HERTZ, POWER_WATT, TEMP_CELSIUS, TIME_SECONDS, @@ -159,10 +160,10 @@ SENSOR_TYPES = { ], "input.voltage": ["Input Voltage", UNIT_VOLT, "mdi:flash", None], "input.voltage.nominal": ["Nominal Input Voltage", UNIT_VOLT, "mdi:flash", None], - "input.frequency": ["Input Line Frequency", "hz", "mdi:flash", None], + "input.frequency": ["Input Line Frequency", FREQUENCY_HERTZ, "mdi:flash", None], "input.frequency.nominal": [ "Nominal Input Line Frequency", - "hz", + FREQUENCY_HERTZ, "mdi:flash", None, ], @@ -176,8 +177,13 @@ SENSOR_TYPES = { "output.current.nominal": ["Nominal Output Current", "A", "mdi:flash", None], "output.voltage": ["Output Voltage", UNIT_VOLT, "mdi:flash", None], "output.voltage.nominal": ["Nominal Output Voltage", UNIT_VOLT, "mdi:flash", None], - "output.frequency": ["Output Frequency", "hz", "mdi:flash", None], - "output.frequency.nominal": ["Nominal Output Frequency", "hz", "mdi:flash", None], + "output.frequency": ["Output Frequency", FREQUENCY_HERTZ, "mdi:flash", None], + "output.frequency.nominal": [ + "Nominal Output Frequency", + FREQUENCY_HERTZ, + "mdi:flash", + None, + ], } STATE_TYPES = { diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py index 8d1b7262fc08..d9e7a45def28 100644 --- a/homeassistant/components/solaredge_local/sensor.py +++ b/homeassistant/components/solaredge_local/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_IP_ADDRESS, CONF_NAME, ENERGY_WATT_HOUR, + FREQUENCY_HERTZ, POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, @@ -58,7 +59,7 @@ SENSOR_TYPES = { "current_frequency": [ "gridfrequency", "Grid Frequency", - "Hz", + FREQUENCY_HERTZ, "mdi:current-ac", None, ], diff --git a/homeassistant/const.py b/homeassistant/const.py index 74647864fab3..e2fc11cf22eb 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -381,6 +381,10 @@ LENGTH_FEET: str = "ft" LENGTH_YARD: str = "yd" LENGTH_MILES: str = "mi" +# Frequency units +FREQUENCY_HERTZ = "Hz" +FREQUENCY_GIGAHERTZ = f"G{FREQUENCY_HERTZ}" + # Pressure units PRESSURE_PA: str = "Pa" PRESSURE_HPA: str = "hPa" From 200e140e8094fb645923c6430c057b3052076100 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Mon, 13 Apr 2020 00:10:05 +0300 Subject: [PATCH 357/653] Fixed uncaught exceptions for demo (#34117) --- tests/components/demo/test_init.py | 1 + tests/ignore_uncaught_exceptions.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/demo/test_init.py b/tests/components/demo/test_init.py index 5644aa891ebc..420707e54d04 100644 --- a/tests/components/demo/test_init.py +++ b/tests/components/demo/test_init.py @@ -29,6 +29,7 @@ def demo_cleanup(hass): async def test_setting_up_demo(hass): """Test if we can set up the demo and dump it to JSON.""" assert await async_setup_component(hass, DOMAIN, {DOMAIN: {}}) + await hass.async_block_till_done() await hass.async_start() # This is done to make sure entity components don't accidentally store diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 77451fc1f688..3b569ebaedd2 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -1,6 +1,5 @@ """List of modules that have uncaught exceptions today. Will be shrunk over time.""" IGNORE_UNCAUGHT_EXCEPTIONS = [ - ("tests.components.demo.test_init", "test_setting_up_demo"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_attributes"), ("tests.components.dyson.test_air_quality", "test_purecool_aiq_update_state"), ( From ec2c7ea932ca686d462f30c0ac09f4f04eca547b Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 13 Apr 2020 00:02:28 +0200 Subject: [PATCH 358/653] Don't do http requests to determine Cast device details (#34082) * Don't do http requests to determine cast device details * Fix tests * Update homeassistant/components/cast/media_player.py Co-authored-by: Paulus Schoutsen --- homeassistant/components/cast/discovery.py | 1 - homeassistant/components/cast/helpers.py | 43 ------------ homeassistant/components/cast/media_player.py | 65 ++++++------------- tests/components/cast/test_media_player.py | 56 ++-------------- 4 files changed, 26 insertions(+), 139 deletions(-) diff --git a/homeassistant/components/cast/discovery.py b/homeassistant/components/cast/discovery.py index 6991c83959d0..9f90b074c3d8 100644 --- a/homeassistant/components/cast/discovery.py +++ b/homeassistant/components/cast/discovery.py @@ -25,7 +25,6 @@ def discover_chromecast(hass: HomeAssistant, info: ChromecastInfo): _LOGGER.debug("Discovered previous chromecast %s", info) # Either discovered completely new chromecast or a "moved" one. - info = info.fill_out_missing_chromecast_info() _LOGGER.debug("Discovered chromecast %s", info) if info.uuid is not None: diff --git a/homeassistant/components/cast/helpers.py b/homeassistant/components/cast/helpers.py index bd8ce68c5f10..5a99d30f0871 100644 --- a/homeassistant/components/cast/helpers.py +++ b/homeassistant/components/cast/helpers.py @@ -2,7 +2,6 @@ from typing import Optional, Tuple import attr -from pychromecast import dial from pychromecast.const import CAST_MANUFACTURERS from .const import DEFAULT_PORT @@ -29,11 +28,6 @@ class ChromecastInfo: """Return if this is an audio group.""" return self.port != DEFAULT_PORT - @property - def is_information_complete(self) -> bool: - """Return if all information is filled out.""" - return all(attr.astuple(self)) - @property def host_port(self) -> Tuple[str, int]: """Return the host+port tuple.""" @@ -46,43 +40,6 @@ class ChromecastInfo: return None return CAST_MANUFACTURERS.get(self.model_name.lower(), "Google Inc.") - def fill_out_missing_chromecast_info(self) -> "ChromecastInfo": - """Return a new ChromecastInfo object with missing attributes filled in. - - Uses blocking HTTP. - """ - if self.is_information_complete: - # We have all information, no need to check HTTP API. Or this is an - # audio group, so checking via HTTP won't give us any new information. - return self - - if self.is_audio_group: - return ChromecastInfo( - service=self.service, - host=self.host, - port=self.port, - uuid=self.uuid, - friendly_name=self.friendly_name, - model_name=self.model_name, - ) - - # Fill out some missing information (friendly_name, uuid) via HTTP dial. - http_device_status = dial.get_device_status( - self.host, services=[self.service], zconf=ChromeCastZeroconf.get_zeroconf() - ) - if http_device_status is None: - # HTTP dial didn't give us any new information. - return self - - return ChromecastInfo( - service=self.service, - host=self.host, - port=self.port, - uuid=(self.uuid or http_device_status.uuid), - friendly_name=(self.friendly_name or http_device_status.friendly_name), - model_name=self.model_name, - ) - class ChromeCastZeroconf: """Class to hold a zeroconf instance.""" diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index 5fcbbaf1caa1..dadd528c6498 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -91,9 +91,8 @@ def _async_create_cast_device(hass: HomeAssistantType, info: ChromecastInfo): """ _LOGGER.debug("_async_create_cast_device: %s", info) if info.uuid is None: - # Found a cast without UUID, we don't store it because we won't be able - # to update it anyway. - return CastDevice(info) + _LOGGER.error("_async_create_cast_device uuid none: %s", info) + return None # Found a cast with UUID added_casts = hass.data[ADDED_CAST_DEVICES_KEY] @@ -156,7 +155,7 @@ async def _async_setup_platform( def async_cast_discovered(discover: ChromecastInfo) -> None: """Handle discovery of a new chromecast.""" if info is not None and info.host_port != discover.host_port: - # Not our requested cast device. + # Waiting for a specific cast device, this is not it. return cast_device = _async_create_cast_device(hass, discover) @@ -262,44 +261,24 @@ class CastDevice(MediaPlayerDevice): return # pylint: disable=protected-access - if self.services is None: - _LOGGER.debug( - "[%s %s (%s:%s)] Connecting to cast device by host %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, - cast_info, - ) - chromecast = await self.hass.async_add_job( - pychromecast._get_chromecast_from_host, - ( - cast_info.host, - cast_info.port, - cast_info.uuid, - cast_info.model_name, - cast_info.friendly_name, - ), - ) - else: - _LOGGER.debug( - "[%s %s (%s:%s)] Connecting to cast device by service %s", - self.entity_id, - self._cast_info.friendly_name, - self._cast_info.host, - self._cast_info.port, + _LOGGER.debug( + "[%s %s (%s:%s)] Connecting to cast device by service %s", + self.entity_id, + self._cast_info.friendly_name, + self._cast_info.host, + self._cast_info.port, + self.services, + ) + chromecast = await self.hass.async_add_executor_job( + pychromecast._get_chromecast_from_service, + ( self.services, - ) - chromecast = await self.hass.async_add_job( - pychromecast._get_chromecast_from_service, - ( - self.services, - ChromeCastZeroconf.get_zeroconf(), - cast_info.uuid, - cast_info.model_name, - cast_info.friendly_name, - ), - ) + ChromeCastZeroconf.get_zeroconf(), + cast_info.uuid, + cast_info.model_name, + cast_info.friendly_name, + ), + ) self._chromecast = chromecast if CAST_MULTIZONE_MANAGER_KEY not in self.hass.data: @@ -403,10 +382,6 @@ class CastDevice(MediaPlayerDevice): self._cast_info.port, connection_status.status, ) - info = self._cast_info - if info.friendly_name is None and not info.is_audio_group: - # We couldn't find friendly_name when the cast was added, retry - self._cast_info = info.fill_out_missing_chromecast_info() self._available = new_available self.schedule_update_ha_state() diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index b05be45e79fd..f241b79f26ec 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -11,7 +11,6 @@ from homeassistant.components.cast import media_player as cast from homeassistant.components.cast.media_player import ChromecastInfo from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.exceptions import PlatformNotReady -from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.typing import HomeAssistantType from homeassistant.setup import async_setup_component @@ -33,8 +32,6 @@ def cast_mock(): "homeassistant.components.cast.media_player.pychromecast", pycast_mock ), patch( "homeassistant.components.cast.discovery.pychromecast", pycast_mock - ), patch( - "homeassistant.components.cast.helpers.dial", dial_mock ), patch( "homeassistant.components.cast.media_player.MultizoneManager", MagicMock() ): @@ -199,36 +196,11 @@ async def test_stop_discovery_called_on_stop(hass): assert start_discovery.call_count == 1 -async def test_internal_discovery_callback_fill_out(hass): - """Test internal discovery automatically filling out information.""" - import pychromecast # imports mock pychromecast - - pychromecast.ChromecastConnectionError = IOError - - discover_cast, _ = await async_setup_cast_internal_discovery(hass) - info = get_fake_chromecast_info(uuid=None) - full_info = attr.evolve(info, model_name="", friendly_name="Speaker", uuid=FakeUUID) - - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - signal = MagicMock() - - async_dispatcher_connect(hass, "cast_discovered", signal) - discover_cast("the-service", info) - await hass.async_block_till_done() - - # when called with incomplete info, it should use HTTP to get missing - discover = signal.mock_calls[0][1][0] - assert discover == full_info - - async def test_create_cast_device_without_uuid(hass): - """Test create a cast device with no UUId should still create an entity.""" + """Test create a cast device with no UUId does not create an entity.""" info = get_fake_chromecast_info(uuid=None) cast_device = cast._async_create_cast_device(hass, info) - assert cast_device is not None + assert cast_device is None async def test_create_cast_device_with_uuid(hass): @@ -334,11 +306,7 @@ async def test_entity_media_states(hass: HomeAssistantType): info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID ) - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - chromecast, entity = await async_setup_media_player_cast(hass, info) + chromecast, entity = await async_setup_media_player_cast(hass, info) entity._available = True entity.schedule_update_ha_state() @@ -392,11 +360,7 @@ async def test_group_media_states(hass: HomeAssistantType): info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID ) - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - chromecast, entity = await async_setup_media_player_cast(hass, info) + chromecast, entity = await async_setup_media_player_cast(hass, info) entity._available = True entity.schedule_update_ha_state() @@ -442,11 +406,7 @@ async def test_group_media_control(hass: HomeAssistantType): info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID ) - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=full_info, - ): - chromecast, entity = await async_setup_media_player_cast(hass, info) + chromecast, entity = await async_setup_media_player_cast(hass, info) entity._available = True entity.async_write_ha_state() @@ -495,11 +455,7 @@ async def test_disconnect_on_stop(hass: HomeAssistantType): """Test cast device disconnects socket on stop.""" info = get_fake_chromecast_info() - with patch( - "homeassistant.components.cast.helpers.dial.get_device_status", - return_value=info, - ): - chromecast, _ = await async_setup_media_player_cast(hass, info) + chromecast, _ = await async_setup_media_player_cast(hass, info) hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) await hass.async_block_till_done() From ad5a396c10bb707544f1ae03976bb988d19a41b0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 17:15:55 -0500 Subject: [PATCH 359/653] Fix reversed door closing/opening states in HomeKit (#34095) * Fix reversed door closing/opening states in HomeKit When we closed the door we would set state 2 which is "Opening" it should have been 3 which is "Closing" When we opened the door we would set state 3 which is "Closing" it should have been 2 which is "Opening" Add constants to make this easier to catch in the future. * Remove debug * Add note about target door state --- homeassistant/components/homekit/const.py | 7 +++ .../components/homekit/type_covers.py | 56 +++++++++++++++---- tests/components/homekit/test_type_covers.py | 44 ++++++++------- 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index ccce082044b3..1c748af8571d 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -182,3 +182,10 @@ THRESHOLD_CO2 = 1000 # #### Default values #### DEFAULT_MIN_TEMP_WATER_HEATER = 40 # °C DEFAULT_MAX_TEMP_WATER_HEATER = 60 # °C + +# #### Door states #### +HK_DOOR_OPEN = 0 +HK_DOOR_CLOSED = 1 +HK_DOOR_OPENING = 2 +HK_DOOR_CLOSING = 3 +HK_DOOR_STOPPED = 4 diff --git a/homeassistant/components/homekit/type_covers.py b/homeassistant/components/homekit/type_covers.py index 97940952171e..624f23d04236 100644 --- a/homeassistant/components/homekit/type_covers.py +++ b/homeassistant/components/homekit/type_covers.py @@ -37,10 +37,35 @@ from .const import ( CHAR_TARGET_POSITION, CHAR_TARGET_TILT_ANGLE, DEVICE_PRECISION_LEEWAY, + HK_DOOR_CLOSED, + HK_DOOR_CLOSING, + HK_DOOR_OPEN, + HK_DOOR_OPENING, SERV_GARAGE_DOOR_OPENER, SERV_WINDOW_COVERING, ) +DOOR_CURRENT_HASS_TO_HK = { + STATE_OPEN: HK_DOOR_OPEN, + STATE_CLOSED: HK_DOOR_CLOSED, + STATE_OPENING: HK_DOOR_OPENING, + STATE_CLOSING: HK_DOOR_CLOSING, +} + +# HomeKit only has two states for +# Target Door State: +# 0: Open +# 1: Closed +# Opening is mapped to 0 since the target is Open +# Closing is mapped to 1 since the target is Closed +DOOR_TARGET_HASS_TO_HK = { + STATE_OPEN: HK_DOOR_OPEN, + STATE_CLOSED: HK_DOOR_CLOSED, + STATE_OPENING: HK_DOOR_OPEN, + STATE_CLOSING: HK_DOOR_CLOSED, +} + + _LOGGER = logging.getLogger(__name__) @@ -55,7 +80,7 @@ class GarageDoorOpener(HomeAccessory): def __init__(self, *args): """Initialize a GarageDoorOpener accessory object.""" super().__init__(*args, category=CATEGORY_GARAGE_DOOR_OPENER) - self._flag_state = False + state = self.hass.states.get(self.entity_id) serv_garage_door = self.add_preload_service(SERV_GARAGE_DOOR_OPENER) self.char_current_state = serv_garage_door.configure_char( @@ -64,31 +89,38 @@ class GarageDoorOpener(HomeAccessory): self.char_target_state = serv_garage_door.configure_char( CHAR_TARGET_DOOR_STATE, value=0, setter_callback=self.set_state ) + self.update_state(state) def set_state(self, value): """Change garage state if call came from HomeKit.""" _LOGGER.debug("%s: Set state to %d", self.entity_id, value) - self._flag_state = True params = {ATTR_ENTITY_ID: self.entity_id} - if value == 0: + if value == HK_DOOR_OPEN: if self.char_current_state.value != value: - self.char_current_state.set_value(3) + self.char_current_state.set_value(HK_DOOR_OPENING) self.call_service(DOMAIN, SERVICE_OPEN_COVER, params) - elif value == 1: + elif value == HK_DOOR_CLOSED: if self.char_current_state.value != value: - self.char_current_state.set_value(2) + self.char_current_state.set_value(HK_DOOR_CLOSING) self.call_service(DOMAIN, SERVICE_CLOSE_COVER, params) def update_state(self, new_state): """Update cover state after state changed.""" hass_state = new_state.state - if hass_state in (STATE_OPEN, STATE_CLOSED): - current_state = 0 if hass_state == STATE_OPEN else 1 - self.char_current_state.set_value(current_state) - if not self._flag_state: - self.char_target_state.set_value(current_state) - self._flag_state = False + target_door_state = DOOR_TARGET_HASS_TO_HK.get(hass_state) + current_door_state = DOOR_CURRENT_HASS_TO_HK.get(hass_state) + + if ( + target_door_state is not None + and self.char_target_state.value != target_door_state + ): + self.char_target_state.set_value(target_door_state) + if ( + current_door_state is not None + and self.char_current_state.value != current_door_state + ): + self.char_current_state.set_value(current_door_state) @TYPES.register("WindowCovering") diff --git a/tests/components/homekit/test_type_covers.py b/tests/components/homekit/test_type_covers.py index 188a4ec99e35..b26379d576d3 100644 --- a/tests/components/homekit/test_type_covers.py +++ b/tests/components/homekit/test_type_covers.py @@ -12,7 +12,13 @@ from homeassistant.components.cover import ( SUPPORT_SET_TILT_POSITION, SUPPORT_STOP, ) -from homeassistant.components.homekit.const import ATTR_VALUE +from homeassistant.components.homekit.const import ( + ATTR_VALUE, + HK_DOOR_CLOSED, + HK_DOOR_CLOSING, + HK_DOOR_OPEN, + HK_DOOR_OPENING, +) from homeassistant.const import ( ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, @@ -62,28 +68,28 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): assert acc.aid == 2 assert acc.category == 4 # GarageDoorOpener - assert acc.char_current_state.value == 0 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPEN + assert acc.char_target_state.value == HK_DOOR_OPEN hass.states.async_set(entity_id, STATE_CLOSED) await hass.async_block_till_done() - assert acc.char_current_state.value == 1 - assert acc.char_target_state.value == 1 + assert acc.char_current_state.value == HK_DOOR_CLOSED + assert acc.char_target_state.value == HK_DOOR_CLOSED hass.states.async_set(entity_id, STATE_OPEN) await hass.async_block_till_done() - assert acc.char_current_state.value == 0 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPEN + assert acc.char_target_state.value == HK_DOOR_OPEN hass.states.async_set(entity_id, STATE_UNAVAILABLE) await hass.async_block_till_done() - assert acc.char_current_state.value == 0 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPEN + assert acc.char_target_state.value == HK_DOOR_OPEN hass.states.async_set(entity_id, STATE_UNKNOWN) await hass.async_block_till_done() - assert acc.char_current_state.value == 0 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPEN + assert acc.char_target_state.value == HK_DOOR_OPEN # Set from HomeKit call_close_cover = async_mock_service(hass, DOMAIN, "close_cover") @@ -93,8 +99,8 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): await hass.async_block_till_done() assert call_close_cover assert call_close_cover[0].data[ATTR_ENTITY_ID] == entity_id - assert acc.char_current_state.value == 2 - assert acc.char_target_state.value == 1 + assert acc.char_current_state.value == HK_DOOR_CLOSING + assert acc.char_target_state.value == HK_DOOR_CLOSED assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None @@ -103,8 +109,8 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): await hass.async_add_executor_job(acc.char_target_state.client_update_value, 1) await hass.async_block_till_done() - assert acc.char_current_state.value == 1 - assert acc.char_target_state.value == 1 + assert acc.char_current_state.value == HK_DOOR_CLOSED + assert acc.char_target_state.value == HK_DOOR_CLOSED assert len(events) == 2 assert events[-1].data[ATTR_VALUE] is None @@ -112,8 +118,8 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): await hass.async_block_till_done() assert call_open_cover assert call_open_cover[0].data[ATTR_ENTITY_ID] == entity_id - assert acc.char_current_state.value == 3 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPENING + assert acc.char_target_state.value == HK_DOOR_OPEN assert len(events) == 3 assert events[-1].data[ATTR_VALUE] is None @@ -122,8 +128,8 @@ async def test_garage_door_open_close(hass, hk_driver, cls, events): await hass.async_add_executor_job(acc.char_target_state.client_update_value, 0) await hass.async_block_till_done() - assert acc.char_current_state.value == 0 - assert acc.char_target_state.value == 0 + assert acc.char_current_state.value == HK_DOOR_OPEN + assert acc.char_target_state.value == HK_DOOR_OPEN assert len(events) == 4 assert events[-1].data[ATTR_VALUE] is None From e6a6c3ceb63c12c0daf60636722e1dd2b8615072 Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Sun, 12 Apr 2020 18:19:22 -0400 Subject: [PATCH 360/653] Fix nws platform setup and data update. (#34106) * add test and fix tests for update logging. * Fix update logging. * Remove assert is True * guard against platform config and use async_write_ha_state * fix discovery info passing to platform * Improve testing for entities in init --- homeassistant/components/nws/__init__.py | 20 +++++++----- homeassistant/components/nws/weather.py | 12 ++++--- tests/components/nws/test_init.py | 41 +++++++++++++++++++----- tests/components/nws/test_weather.py | 39 ++++++++++++---------- 4 files changed, 74 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/nws/__init__.py b/homeassistant/components/nws/__init__.py index 1a046c4a05d6..66e791e627ae 100644 --- a/homeassistant/components/nws/__init__.py +++ b/homeassistant/components/nws/__init__.py @@ -78,7 +78,7 @@ async def async_setup(hass: HomeAssistant, config: dict): for component in PLATFORMS: hass.async_create_task( - discovery.async_load_platform(hass, component, DOMAIN, {}, config) + discovery.async_load_platform(hass, component, DOMAIN, entry, config) ) return True @@ -129,18 +129,21 @@ class NwsData: return self.nws.forecast_hourly @staticmethod - async def _async_update_item(update_call, update_type, station_name, success): + async def _async_update_item( + update_call, update_type, station_name, previous_success + ): + """Update item and handle logging.""" try: _LOGGER.debug("Updating %s for station %s", update_type, station_name) await update_call() - if success: + if not previous_success: _LOGGER.warning( "Success updating %s for station %s", update_type, station_name ) - success = True + success = True except (aiohttp.ClientError, asyncio.TimeoutError) as err: - if success: + if previous_success: _LOGGER.warning( "Error updating %s for station %s: %s", update_type, @@ -148,23 +151,24 @@ class NwsData: err, ) success = False + return success async def async_update(self, now=None): """Update all data.""" - await self._async_update_item( + self.update_observation_success = await self._async_update_item( self.nws.update_observation, "observation", self.station, self.update_observation_success, ) - await self._async_update_item( + self.update_forecast_success = await self._async_update_item( self.nws.update_forecast, "forecast", self.station, self.update_forecast_success, ) - await self._async_update_item( + self.update_forecast_hourly_success = await self._async_update_item( self.nws.update_forecast_hourly, "forecast_hourly", self.station, diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index 0c409bef3ca8..8e4e7e560cb5 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -73,11 +73,13 @@ def convert_condition(time, weather): return cond, max(prec_probs) -async def async_setup_platform(hass, config, async_add_entities, discovery_info): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the NWS weather platform.""" - latitude = config.get(CONF_LATITUDE, hass.config.latitude) - longitude = config.get(CONF_LONGITUDE, hass.config.longitude) - station = config.get(CONF_STATION) + if discovery_info is None: + return + latitude = discovery_info.get(CONF_LATITUDE, hass.config.latitude) + longitude = discovery_info.get(CONF_LONGITUDE, hass.config.longitude) + station = discovery_info.get(CONF_STATION) nws_data = hass.data[DOMAIN][base_unique_id(latitude, longitude)] @@ -134,7 +136,7 @@ class NWSWeather(WeatherEntity): else: self._forecast = self.nws.forecast_hourly - self.async_schedule_update_ha_state() + self.async_write_ha_state() @property def should_poll(self) -> bool: diff --git a/tests/components/nws/test_init.py b/tests/components/nws/test_init.py index 015e4ad81c80..e6fe5707a0d7 100644 --- a/tests/components/nws/test_init.py +++ b/tests/components/nws/test_init.py @@ -31,7 +31,12 @@ DUPLICATE_CONFIG = { async def test_no_config(hass, mock_simple_nws): """Test that nws does not setup with no config.""" with assert_setup_component(0): - assert await async_setup_component(hass, DOMAIN, {}) is True + assert await async_setup_component(hass, DOMAIN, {}) + await hass.async_block_till_done() + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + assert len(entity_registry.entities) == 0 + assert DOMAIN not in hass.data @@ -39,29 +44,49 @@ async def test_successful_minimal_config(hass, mock_simple_nws): """Test that nws setup with minimal config.""" hass.config.latitude = 40.0 hass.config.longitude = -75.0 - with assert_setup_component(1): - assert await async_setup_component(hass, DOMAIN, MINIMAL_CONFIG) is True + with assert_setup_component(1, DOMAIN): + assert await async_setup_component(hass, DOMAIN, MINIMAL_CONFIG) + await hass.async_block_till_done() + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + assert len(entity_registry.entities) == 2 + assert DOMAIN in hass.data assert nws.base_unique_id(40.0, -75.0) in hass.data[DOMAIN] async def test_successful_latlon_config(hass, mock_simple_nws): """Test that nws setup with latlon config.""" - with assert_setup_component(1): - assert await async_setup_component(hass, DOMAIN, LATLON_CONFIG) is True + with assert_setup_component(1, DOMAIN): + assert await async_setup_component(hass, DOMAIN, LATLON_CONFIG) + await hass.async_block_till_done() + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + assert len(entity_registry.entities) == 2 + assert DOMAIN in hass.data assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] async def test_successful_full_config(hass, mock_simple_nws): """Test that nws setup with full config.""" - with assert_setup_component(1): - assert await async_setup_component(hass, DOMAIN, FULL_CONFIG) is True + with assert_setup_component(1, DOMAIN): + assert await async_setup_component(hass, DOMAIN, FULL_CONFIG) + await hass.async_block_till_done() + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + assert len(entity_registry.entities) == 2 + assert DOMAIN in hass.data assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] async def test_unsuccessful_duplicate_config(hass, mock_simple_nws): """Test that nws setup with duplicate config.""" - assert await async_setup_component(hass, DOMAIN, DUPLICATE_CONFIG) is True + assert await async_setup_component(hass, DOMAIN, DUPLICATE_CONFIG) + await hass.async_block_till_done() + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + assert len(entity_registry.entities) == 2 + assert len(hass.data[DOMAIN]) == 1 diff --git a/tests/components/nws/test_weather.py b/tests/components/nws/test_weather.py index d0e097326c72..4ebc4580ff8a 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -21,16 +21,6 @@ from tests.components.nws.const import ( NONE_OBSERVATION, ) -HOURLY_CONFIG = { - "weather": { - "platform": "nws", - "api_key": "x@example.com", - "latitude": 40.0, - "longitude": -85.0, - "mode": "hourly", - } -} - @pytest.mark.parametrize( "units,result_observation,result_forecast", @@ -40,7 +30,7 @@ HOURLY_CONFIG = { ], ) async def test_imperial_metric( - hass, units, result_observation, result_forecast, mock_simple_nws + hass, units, result_observation, result_forecast, mock_simple_nws, caplog ): """Test with imperial and metric units.""" hass.config.units = units @@ -73,6 +63,9 @@ async def test_imperial_metric( for key, value in result_forecast.items(): assert forecast[0].get(key) == value + assert "Error updating observation" not in caplog.text + assert "Success updating observation" not in caplog.text + async def test_none_values(hass, mock_simple_nws): """Test with none values in observation and forecast dicts.""" @@ -136,14 +129,18 @@ async def test_error_observation(hass, mock_simple_nws, caplog): assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) await hass.async_block_till_done() + assert "Error updating observation for station ABC" in caplog.text + assert "Success updating observation for station ABC" not in caplog.text + caplog.clear() + instance.update_observation.side_effect = None future_time = dt_util.utcnow() + timedelta(minutes=15) async_fire_time_changed(hass, future_time) await hass.async_block_till_done() - assert "Error updating observation" in caplog.text - assert "Success updating observation" in caplog.text + assert "Error updating observation for station ABC" not in caplog.text + assert "Success updating observation for station ABC" in caplog.text async def test_error_forecast(hass, caplog, mock_simple_nws): @@ -154,14 +151,18 @@ async def test_error_forecast(hass, caplog, mock_simple_nws): assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) await hass.async_block_till_done() + assert "Error updating forecast for station ABC" in caplog.text + assert "Success updating forecast for station ABC" not in caplog.text + caplog.clear() + instance.update_forecast.side_effect = None future_time = dt_util.utcnow() + timedelta(minutes=15) async_fire_time_changed(hass, future_time) await hass.async_block_till_done() - assert "Error updating forecast" in caplog.text - assert "Success updating forecast" in caplog.text + assert "Error updating forecast for station ABC" not in caplog.text + assert "Success updating forecast for station ABC" in caplog.text async def test_error_forecast_hourly(hass, caplog, mock_simple_nws): @@ -172,11 +173,15 @@ async def test_error_forecast_hourly(hass, caplog, mock_simple_nws): assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) await hass.async_block_till_done() + assert "Error updating forecast_hourly for station ABC" in caplog.text + assert "Success updating forecast_hourly for station ABC" not in caplog.text + caplog.clear() + instance.update_forecast_hourly.side_effect = None future_time = dt_util.utcnow() + timedelta(minutes=15) async_fire_time_changed(hass, future_time) await hass.async_block_till_done() - assert "Error updating forecast_hourly" in caplog.text - assert "Success updating forecast_hourly" in caplog.text + assert "Error updating forecast_hourly for station ABC" not in caplog.text + assert "Success updating forecast_hourly for station ABC" in caplog.text From c75d3ce8c77533d7d4d79d6e3cea88e8a9174eec Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 17:27:17 -0500 Subject: [PATCH 361/653] Add tilt support to basic homekit window covers (#33937) * Add tilt support to basic homekit window covers * Add stop support to all window covers * protect supports_stop --- homeassistant/components/homekit/const.py | 1 + .../components/homekit/type_covers.py | 137 +++++++++++------- tests/components/homekit/test_type_covers.py | 25 ++++ 3 files changed, 109 insertions(+), 54 deletions(-) diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index 1c748af8571d..3d64aaf3bea3 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -148,6 +148,7 @@ CHAR_TARGET_HUMIDITY = "TargetRelativeHumidity" CHAR_TARGET_SECURITY_STATE = "SecuritySystemTargetState" CHAR_TARGET_TEMPERATURE = "TargetTemperature" CHAR_TARGET_TILT_ANGLE = "TargetHorizontalTiltAngle" +CHAR_HOLD_POSITION = "HoldPosition" CHAR_TEMP_DISPLAY_UNITS = "TemperatureDisplayUnits" CHAR_VALVE_TYPE = "ValveType" CHAR_VOLUME = "Volume" diff --git a/homeassistant/components/homekit/type_covers.py b/homeassistant/components/homekit/type_covers.py index 624f23d04236..8e55bc2a4b91 100644 --- a/homeassistant/components/homekit/type_covers.py +++ b/homeassistant/components/homekit/type_covers.py @@ -32,6 +32,7 @@ from .const import ( CHAR_CURRENT_DOOR_STATE, CHAR_CURRENT_POSITION, CHAR_CURRENT_TILT_ANGLE, + CHAR_HOLD_POSITION, CHAR_POSITION_STATE, CHAR_TARGET_DOOR_STATE, CHAR_TARGET_POSITION, @@ -123,47 +124,50 @@ class GarageDoorOpener(HomeAccessory): self.char_current_state.set_value(current_door_state) -@TYPES.register("WindowCovering") -class WindowCovering(HomeAccessory): - """Generate a Window accessory for a cover entity. +class WindowCoveringBase(HomeAccessory): + """Generate a base Window accessory for a cover entity. - The cover entity must support: set_cover_position. + This class is used for WindowCoveringBasic and + WindowCovering """ - def __init__(self, *args): - """Initialize a WindowCovering accessory object.""" + def __init__(self, *args, category): + """Initialize a WindowCoveringBase accessory object.""" super().__init__(*args, category=CATEGORY_WINDOW_COVERING) - self._homekit_target = None - self._homekit_target_tilt = None - - serv_cover = self.add_preload_service( - SERV_WINDOW_COVERING, - chars=[CHAR_TARGET_TILT_ANGLE, CHAR_CURRENT_TILT_ANGLE], - ) - - features = self.hass.states.get(self.entity_id).attributes.get( + self.features = self.hass.states.get(self.entity_id).attributes.get( ATTR_SUPPORTED_FEATURES, 0 ) + self._supports_stop = self.features & SUPPORT_STOP + self._homekit_target_tilt = None + self.chars = [] + if self._supports_stop: + self.chars.append(CHAR_HOLD_POSITION) + self._supports_tilt = self.features & SUPPORT_SET_TILT_POSITION - self._supports_tilt = features & SUPPORT_SET_TILT_POSITION if self._supports_tilt: - self.char_target_tilt = serv_cover.configure_char( + self.chars.extend([CHAR_TARGET_TILT_ANGLE, CHAR_CURRENT_TILT_ANGLE]) + + self.serv_cover = self.add_preload_service(SERV_WINDOW_COVERING, self.chars) + + if self._supports_stop: + self.char_hold_position = self.serv_cover.configure_char( + CHAR_HOLD_POSITION, setter_callback=self.set_stop + ) + + if self._supports_tilt: + self.char_target_tilt = self.serv_cover.configure_char( CHAR_TARGET_TILT_ANGLE, setter_callback=self.set_tilt ) - self.char_current_tilt = serv_cover.configure_char( + self.char_current_tilt = self.serv_cover.configure_char( CHAR_CURRENT_TILT_ANGLE, value=0 ) - self.char_current_position = serv_cover.configure_char( - CHAR_CURRENT_POSITION, value=0 - ) - self.char_target_position = serv_cover.configure_char( - CHAR_TARGET_POSITION, value=0, setter_callback=self.move_cover - ) - self.char_position_state = serv_cover.configure_char( - CHAR_POSITION_STATE, value=2 - ) + def set_stop(self, value): + """Stop the cover motion from HomeKit.""" + if value != 1: + return + self.call_service(DOMAIN, SERVICE_STOP_COVER, {ATTR_ENTITY_ID: self.entity_id}) @debounce def set_tilt(self, value): @@ -179,6 +183,51 @@ class WindowCovering(HomeAccessory): self.call_service(DOMAIN, SERVICE_SET_COVER_TILT_POSITION, params, value) + def update_state(self, new_state): + """Update cover position and tilt after state changed.""" + # update tilt + current_tilt = new_state.attributes.get(ATTR_CURRENT_TILT_POSITION) + if isinstance(current_tilt, (float, int)): + # HomeKit sends values between -90 and 90. + # We'll have to normalize to [0,100] + current_tilt = (current_tilt / 100.0 * 180.0) - 90.0 + current_tilt = int(current_tilt) + self.char_current_tilt.set_value(current_tilt) + + # We have to assume that the device has worse precision than HomeKit. + # If it reports back a state that is only _close_ to HK's requested + # state, we'll "fix" what HomeKit requested so that it won't appear + # out of sync. + if self._homekit_target_tilt is None or abs( + current_tilt - self._homekit_target_tilt < DEVICE_PRECISION_LEEWAY + ): + self.char_target_tilt.set_value(current_tilt) + self._homekit_target_tilt = None + + +@TYPES.register("WindowCovering") +class WindowCovering(WindowCoveringBase, HomeAccessory): + """Generate a Window accessory for a cover entity. + + The cover entity must support: set_cover_position. + """ + + def __init__(self, *args): + """Initialize a WindowCovering accessory object.""" + super().__init__(*args, category=CATEGORY_WINDOW_COVERING) + + self._homekit_target = None + + self.char_current_position = self.serv_cover.configure_char( + CHAR_CURRENT_POSITION, value=0 + ) + self.char_target_position = self.serv_cover.configure_char( + CHAR_TARGET_POSITION, value=0, setter_callback=self.move_cover + ) + self.char_position_state = self.serv_cover.configure_char( + CHAR_POSITION_STATE, value=2 + ) + @debounce def move_cover(self, value): """Move cover to value if call came from HomeKit.""" @@ -213,28 +262,11 @@ class WindowCovering(HomeAccessory): else: self.char_position_state.set_value(2) - # update tilt - current_tilt = new_state.attributes.get(ATTR_CURRENT_TILT_POSITION) - if isinstance(current_tilt, (float, int)): - # HomeKit sends values between -90 and 90. - # We'll have to normalize to [0,100] - current_tilt = (current_tilt / 100.0 * 180.0) - 90.0 - current_tilt = int(current_tilt) - self.char_current_tilt.set_value(current_tilt) - - # We have to assume that the device has worse precision than HomeKit. - # If it reports back a state that is only _close_ to HK's requested - # state, we'll "fix" what HomeKit requested so that it won't appear - # out of sync. - if self._homekit_target_tilt is None or abs( - current_tilt - self._homekit_target_tilt < DEVICE_PRECISION_LEEWAY - ): - self.char_target_tilt.set_value(current_tilt) - self._homekit_target_tilt = None + super().update_state(new_state) @TYPES.register("WindowCoveringBasic") -class WindowCoveringBasic(HomeAccessory): +class WindowCoveringBasic(WindowCoveringBase, HomeAccessory): """Generate a Window accessory for a cover entity. The cover entity must support: open_cover, close_cover, @@ -244,19 +276,14 @@ class WindowCoveringBasic(HomeAccessory): def __init__(self, *args): """Initialize a WindowCovering accessory object.""" super().__init__(*args, category=CATEGORY_WINDOW_COVERING) - features = self.hass.states.get(self.entity_id).attributes.get( - ATTR_SUPPORTED_FEATURES - ) - self._supports_stop = features & SUPPORT_STOP - serv_cover = self.add_preload_service(SERV_WINDOW_COVERING) - self.char_current_position = serv_cover.configure_char( + self.char_current_position = self.serv_cover.configure_char( CHAR_CURRENT_POSITION, value=0 ) - self.char_target_position = serv_cover.configure_char( + self.char_target_position = self.serv_cover.configure_char( CHAR_TARGET_POSITION, value=0, setter_callback=self.move_cover ) - self.char_position_state = serv_cover.configure_char( + self.char_position_state = self.serv_cover.configure_char( CHAR_POSITION_STATE, value=2 ) @@ -298,3 +325,5 @@ class WindowCoveringBasic(HomeAccessory): self.char_position_state.set_value(0) else: self.char_position_state.set_value(2) + + super().update_state(new_state) diff --git a/tests/components/homekit/test_type_covers.py b/tests/components/homekit/test_type_covers.py index b26379d576d3..c97703f3813e 100644 --- a/tests/components/homekit/test_type_covers.py +++ b/tests/components/homekit/test_type_covers.py @@ -9,6 +9,7 @@ from homeassistant.components.cover import ( ATTR_POSITION, ATTR_TILT_POSITION, DOMAIN, + SUPPORT_SET_POSITION, SUPPORT_SET_TILT_POSITION, SUPPORT_STOP, ) @@ -395,6 +396,30 @@ async def test_window_open_close_stop(hass, hk_driver, cls, events): assert events[-1].data[ATTR_VALUE] is None +async def test_window_open_close_with_position_and_stop(hass, hk_driver, cls, events): + """Test if accessory and HA are updated accordingly.""" + entity_id = "cover.stop_window" + + hass.states.async_set( + entity_id, + STATE_UNKNOWN, + {ATTR_SUPPORTED_FEATURES: SUPPORT_STOP | SUPPORT_SET_POSITION}, + ) + acc = cls.window(hass, hk_driver, "Cover", entity_id, 2, None) + await acc.run_handler() + + # Set from HomeKit + call_stop_cover = async_mock_service(hass, DOMAIN, "stop_cover") + + await hass.async_add_executor_job(acc.char_hold_position.client_update_value, 1) + await hass.async_block_till_done() + assert call_stop_cover + assert call_stop_cover[0].data[ATTR_ENTITY_ID] == entity_id + assert acc.char_hold_position.value == 1 + assert len(events) == 1 + assert events[-1].data[ATTR_VALUE] is None + + async def test_window_basic_restore(hass, hk_driver, cls, events): """Test setting up an entity from state in the event registry.""" hass.state = CoreState.not_running From 173d7fa060a7e908feaff9e4dba95d364b8030c9 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 17:29:35 -0500 Subject: [PATCH 362/653] Handle all zero serial numbers in NUT (#34045) * Handle all zero serial numbers in NUT * Add additional nut tests * Update homeassistant/components/nut/__init__.py Co-Authored-By: Paulus Schoutsen * remove re Co-authored-by: Paulus Schoutsen --- homeassistant/components/nut/__init__.py | 2 +- tests/components/nut/test_sensor.py | 66 ++++++++++++++++++++++++ tests/components/nut/util.py | 4 -- tests/fixtures/nut/BACKUPSES600M1.json | 47 +++++++++++++++++ tests/fixtures/nut/CP1500PFCLCD.json | 43 +++++++++++++++ 5 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 tests/fixtures/nut/BACKUPSES600M1.json create mode 100644 tests/fixtures/nut/CP1500PFCLCD.json diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index 45c5474f27e0..b98522feb4e2 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -134,7 +134,7 @@ def _firmware_from_status(status): def _serial_from_status(status): """Find the best serialvalue from the status.""" serial = status.get("device.serial") or status.get("ups.serial") - if serial and serial == "unknown": + if serial and (serial.lower() == "unknown" or serial.count("0") == len(serial)): return None return serial diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py index a04f570d367d..430720785ca1 100644 --- a/tests/components/nut/test_sensor.py +++ b/tests/components/nut/test_sensor.py @@ -9,6 +9,10 @@ async def test_pr3000rt2u(hass): """Test creation of PR3000RT2U sensors.""" await async_init_integration(hass, "PR3000RT2U", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + assert entry + assert entry.unique_id == "CPS_PR3000RT2U_PYVJO2000034_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -30,6 +34,10 @@ async def test_cp1350c(hass): """Test creation of CP1350C sensors.""" await async_init_integration(hass, "CP1350C", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -51,6 +59,64 @@ async def test_5e850i(hass): """Test creation of 5E850I sensors.""" await async_init_integration(hass, "5E850I", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_backupsses600m1(hass): + """Test creation of BACKUPSES600M1 sensors.""" + + await async_init_integration(hass, "BACKUPSES600M1", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert entry + assert ( + entry.unique_id + == "American Power Conversion_Back-UPS ES 600M1_4B1713P32195 _battery.charge" + ) + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_cp1500pfclcd(hass): + """Test creation of CP1500PFCLCD sensors.""" + + await async_init_integration(hass, "CP1500PFCLCD", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" diff --git a/tests/components/nut/util.py b/tests/components/nut/util.py index 5bd29042ea8a..788076a7c9f2 100644 --- a/tests/components/nut/util.py +++ b/tests/components/nut/util.py @@ -26,10 +26,6 @@ async def async_init_integration( ups_fixture = f"nut/{ups_fixture}.json" list_vars = json.loads(load_fixture(ups_fixture)) - import pprint - - pprint.pprint(list_vars) - mock_pynut = _get_mock_pynutclient(list_ups={"ups1": "UPS 1"}, list_vars=list_vars) with patch( diff --git a/tests/fixtures/nut/BACKUPSES600M1.json b/tests/fixtures/nut/BACKUPSES600M1.json new file mode 100644 index 000000000000..1acd0ef0444a --- /dev/null +++ b/tests/fixtures/nut/BACKUPSES600M1.json @@ -0,0 +1,47 @@ +{ + "ups.realpower.nominal" : "330", + "input.voltage" : "123.0", + "ups.mfr" : "American Power Conversion", + "driver.version" : "2.7.4", + "ups.test.result" : "No test initiated", + "input.voltage.nominal" : "120", + "input.transfer.low" : "92", + "driver.parameter.pollinterval" : "15", + "driver.version.data" : "APC HID 0.96", + "driver.parameter.pollfreq" : "30", + "battery.mfr.date" : "2017/04/01", + "ups.beeper.status" : "enabled", + "battery.date" : "2001/09/25", + "driver.name" : "usbhid-ups", + "battery.charge" : "100", + "ups.status" : "OL", + "ups.model" : "Back-UPS ES 600M1", + "battery.runtime.low" : "120", + "ups.firmware" : "928.a5 .D", + "ups.delay.shutdown" : "20", + "device.model" : "Back-UPS ES 600M1", + "device.serial" : "4B1713P32195 ", + "input.sensitivity" : "medium", + "ups.firmware.aux" : "a5 ", + "input.transfer.reason" : "input voltage out of range", + "ups.timer.reboot" : "0", + "battery.voltage.nominal" : "12.0", + "ups.vendorid" : "051d", + "input.transfer.high" : "139", + "battery.voltage" : "13.7", + "battery.charge.low" : "10", + "battery.type" : "PbAc", + "ups.mfr.date" : "2017/04/01", + "ups.timer.shutdown" : "-1", + "device.mfr" : "American Power Conversion", + "driver.parameter.port" : "auto", + "battery.charge.warning" : "50", + "device.type" : "ups", + "driver.parameter.vendorid" : "051d", + "ups.serial" : "4B1713P32195 ", + "ups.load" : "22", + "driver.version.internal" : "0.41", + "battery.runtime" : "1968", + "driver.parameter.synchronous" : "no", + "ups.productid" : "0002" +} diff --git a/tests/fixtures/nut/CP1500PFCLCD.json b/tests/fixtures/nut/CP1500PFCLCD.json new file mode 100644 index 000000000000..8f12ae96df6d --- /dev/null +++ b/tests/fixtures/nut/CP1500PFCLCD.json @@ -0,0 +1,43 @@ +{ + "battery.runtime.low" : "300", + "driver.parameter.port" : "auto", + "ups.delay.shutdown" : "20", + "driver.parameter.pollfreq" : "30", + "ups.beeper.status" : "disabled", + "input.voltage.nominal" : "120", + "device.serial" : "000000000000", + "ups.timer.shutdown" : "-60", + "input.voltage" : "122.0", + "ups.status" : "OL", + "ups.model" : "CP1500PFCLCD", + "device.mfr" : "CPS", + "device.model" : "CP1500PFCLCD", + "input.transfer.low" : "88", + "battery.mfr.date" : "CPS", + "driver.version" : "2.7.4", + "driver.version.data" : "CyberPower HID 0.4", + "driver.parameter.synchronous" : "no", + "ups.realpower.nominal" : "900", + "ups.productid" : "0501", + "ups.mfr" : "CPS", + "ups.vendorid" : "0764", + "driver.version.internal" : "0.41", + "output.voltage" : "138.0", + "battery.runtime" : "10530", + "device.type" : "ups", + "battery.charge.low" : "10", + "ups.timer.start" : "-60", + "driver.parameter.pollinterval" : "15", + "ups.load" : "0", + "ups.serial" : "000000000000", + "input.transfer.high" : "139", + "battery.charge.warning" : "20", + "battery.voltage.nominal" : "24", + "driver.parameter.vendorid" : "0764", + "driver.name" : "usbhid-ups", + "battery.type" : "PbAcid", + "ups.delay.start" : "30", + "battery.voltage" : "24.0", + "battery.charge" : "100", + "ups.test.result" : "No test initiated" +} From 5d649b25416d75c31dda8ec227c17e649a3e86d0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Apr 2020 17:38:33 -0500 Subject: [PATCH 363/653] Convert homekit thermostats to use service callbacks (#34073) * Convert homekit thermostats to use service callbacks Service callbacks allow us to get all the temperature changes in one request so we can avoid all the need to store state and debounce. * remove excess debug * Fix lock and light tests * Ensure all code for Thermostats has coverage * I am answering all the homekit cases anyways so might as well be aware of regressions * Make lock notifications reliable * Update homeassistant/components/homekit/type_lights.py Co-Authored-By: Paulus Schoutsen Co-authored-by: Paulus Schoutsen --- CODEOWNERS | 1 + .../components/homekit/manifest.json | 2 +- .../components/homekit/type_lights.py | 10 +- .../components/homekit/type_locks.py | 20 +- .../components/homekit/type_thermostats.py | 350 ++++++----- tests/components/homekit/test_type_lights.py | 8 +- .../homekit/test_type_thermostats.py | 558 +++++++++++++++--- 7 files changed, 710 insertions(+), 239 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index cdb61c591045..e13573aa7748 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -162,6 +162,7 @@ homeassistant/components/hisense_aehw4a1/* @bannhead homeassistant/components/history/* @home-assistant/core homeassistant/components/hive/* @Rendili @KJonline homeassistant/components/homeassistant/* @home-assistant/core +homeassistant/components/homekit/* @bdraco homeassistant/components/homekit_controller/* @Jc2k homeassistant/components/homematic/* @pvizeli @danielperna84 homeassistant/components/homematicip_cloud/* @SukramJ diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index d80fd3c53381..1e4c39f3ed9f 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -3,5 +3,5 @@ "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", "requirements": ["HAP-python==2.8.2"], - "codeowners": [] + "codeowners": ["@bdraco"] } diff --git a/homeassistant/components/homekit/type_lights.py b/homeassistant/components/homekit/type_lights.py index 62f374c88884..8458c8351da4 100644 --- a/homeassistant/components/homekit/type_lights.py +++ b/homeassistant/components/homekit/type_lights.py @@ -54,9 +54,9 @@ class Light(HomeAccessory): super().__init__(*args, category=CATEGORY_LIGHTBULB) self.chars = [] - self._features = self.hass.states.get(self.entity_id).attributes.get( - ATTR_SUPPORTED_FEATURES - ) + state = self.hass.states.get(self.entity_id) + + self._features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) if self._features & SUPPORT_BRIGHTNESS: self.chars.append(CHAR_BRIGHTNESS) @@ -101,10 +101,12 @@ class Light(HomeAccessory): if CHAR_SATURATION in self.chars: self.char_saturation = serv_light.configure_char(CHAR_SATURATION, value=75) + self.update_state(state) + serv_light.setter_callback = self._set_chars def _set_chars(self, char_values): - _LOGGER.debug("_set_chars: %s", char_values) + _LOGGER.debug("Light _set_chars: %s", char_values) events = [] service = SERVICE_TURN_ON params = {ATTR_ENTITY_ID: self.entity_id} diff --git a/homeassistant/components/homekit/type_locks.py b/homeassistant/components/homekit/type_locks.py index 3a7211ab2add..0d2a19ef0897 100644 --- a/homeassistant/components/homekit/type_locks.py +++ b/homeassistant/components/homekit/type_locks.py @@ -35,7 +35,7 @@ class Lock(HomeAccessory): """Initialize a Lock accessory object.""" super().__init__(*args, category=CATEGORY_DOOR_LOCK) self._code = self.config.get(ATTR_CODE) - self._flag_state = False + state = self.hass.states.get(self.entity_id) serv_lock_mechanism = self.add_preload_service(SERV_LOCK) self.char_current_state = serv_lock_mechanism.configure_char( @@ -46,15 +46,18 @@ class Lock(HomeAccessory): value=HASS_TO_HOMEKIT[STATE_LOCKED], setter_callback=self.set_state, ) + self.update_state(state) def set_state(self, value): """Set lock state to value if call came from HomeKit.""" _LOGGER.debug("%s: Set state to %d", self.entity_id, value) - self._flag_state = True hass_value = HOMEKIT_TO_HASS.get(value) service = STATE_TO_SERVICE[hass_value] + if self.char_current_state.value != value: + self.char_current_state.set_value(value) + params = {ATTR_ENTITY_ID: self.entity_id} if self._code: params[ATTR_CODE] = self._code @@ -65,16 +68,21 @@ class Lock(HomeAccessory): hass_state = new_state.state if hass_state in HASS_TO_HOMEKIT: current_lock_state = HASS_TO_HOMEKIT[hass_state] - self.char_current_state.set_value(current_lock_state) _LOGGER.debug( "%s: Updated current state to %s (%d)", self.entity_id, hass_state, current_lock_state, ) - # LockTargetState only supports locked and unlocked + # Must set lock target state before current state + # or there will be no notification if hass_state in (STATE_LOCKED, STATE_UNLOCKED): - if not self._flag_state: + if self.char_target_state.value != current_lock_state: self.char_target_state.set_value(current_lock_state) - self._flag_state = False + + # Set lock current state ONLY after ensuring that + # target state is correct or there will be no + # notification + if self.char_current_state.value != current_lock_state: + self.char_current_state.set_value(current_lock_state) diff --git a/homeassistant/components/homekit/type_thermostats.py b/homeassistant/components/homekit/type_thermostats.py index d1bcb600d84b..8691dc51c053 100644 --- a/homeassistant/components/homekit/type_thermostats.py +++ b/homeassistant/components/homekit/type_thermostats.py @@ -36,6 +36,7 @@ from homeassistant.components.climate.const import ( SERVICE_SET_HVAC_MODE as SERVICE_SET_HVAC_MODE_THERMOSTAT, SERVICE_SET_TEMPERATURE as SERVICE_SET_TEMPERATURE_THERMOSTAT, SUPPORT_TARGET_HUMIDITY, + SUPPORT_TARGET_TEMPERATURE, SUPPORT_TARGET_TEMPERATURE_RANGE, ) from homeassistant.components.water_heater import ( @@ -52,7 +53,7 @@ from homeassistant.const import ( ) from . import TYPES -from .accessories import HomeAccessory, debounce +from .accessories import HomeAccessory from .const import ( CHAR_COOLING_THRESHOLD_TEMPERATURE, CHAR_CURRENT_HEATING_COOLING, @@ -76,26 +77,37 @@ _LOGGER = logging.getLogger(__name__) HC_HOMEKIT_VALID_MODES_WATER_HEATER = {"Heat": 1} UNIT_HASS_TO_HOMEKIT = {TEMP_CELSIUS: 0, TEMP_FAHRENHEIT: 1} +HC_HEAT_COOL_OFF = 0 +HC_HEAT_COOL_HEAT = 1 +HC_HEAT_COOL_COOL = 2 +HC_HEAT_COOL_AUTO = 3 + +HC_MIN_TEMP = 10 +HC_MAX_TEMP = 38 + UNIT_HOMEKIT_TO_HASS = {c: s for s, c in UNIT_HASS_TO_HOMEKIT.items()} HC_HASS_TO_HOMEKIT = { - HVAC_MODE_OFF: 0, - HVAC_MODE_HEAT: 1, - HVAC_MODE_COOL: 2, - HVAC_MODE_AUTO: 3, - HVAC_MODE_HEAT_COOL: 3, - HVAC_MODE_FAN_ONLY: 2, + HVAC_MODE_OFF: HC_HEAT_COOL_OFF, + HVAC_MODE_HEAT: HC_HEAT_COOL_HEAT, + HVAC_MODE_COOL: HC_HEAT_COOL_COOL, + HVAC_MODE_AUTO: HC_HEAT_COOL_AUTO, + HVAC_MODE_HEAT_COOL: HC_HEAT_COOL_AUTO, + HVAC_MODE_DRY: HC_HEAT_COOL_COOL, + HVAC_MODE_FAN_ONLY: HC_HEAT_COOL_COOL, } HC_HOMEKIT_TO_HASS = {c: s for s, c in HC_HASS_TO_HOMEKIT.items()} HC_HASS_TO_HOMEKIT_ACTION = { - CURRENT_HVAC_OFF: 0, - CURRENT_HVAC_IDLE: 0, - CURRENT_HVAC_HEAT: 1, - CURRENT_HVAC_COOL: 2, - CURRENT_HVAC_DRY: 2, - CURRENT_HVAC_FAN: 2, + CURRENT_HVAC_OFF: HC_HEAT_COOL_OFF, + CURRENT_HVAC_IDLE: HC_HEAT_COOL_OFF, + CURRENT_HVAC_HEAT: HC_HEAT_COOL_HEAT, + CURRENT_HVAC_COOL: HC_HEAT_COOL_COOL, + CURRENT_HVAC_DRY: HC_HEAT_COOL_COOL, + CURRENT_HVAC_FAN: HC_HEAT_COOL_COOL, } +HEAT_COOL_DEADBAND = 5 + @TYPES.register("Thermostat") class Thermostat(HomeAccessory): @@ -105,12 +117,12 @@ class Thermostat(HomeAccessory): """Initialize a Thermostat accessory object.""" super().__init__(*args, category=CATEGORY_THERMOSTAT) self._unit = self.hass.config.units.temperature_unit - self._flag_heat_cool = False - self._flag_temperature = False - self._flag_coolingthresh = False - self._flag_heatingthresh = False min_temp, max_temp = self.get_temperature_range() + # Homekit only supports 10-38 + hc_min_temp = max(min_temp, HC_MIN_TEMP) + hc_max_temp = min(max_temp, HC_MAX_TEMP) + min_humidity = self.hass.states.get(self.entity_id).attributes.get( ATTR_MIN_HUMIDITY, DEFAULT_MIN_HUMIDITY ) @@ -174,24 +186,22 @@ class Thermostat(HomeAccessory): hc_valid_values = {k: v for v, k in self.hc_homekit_to_hass.items()} self.char_target_heat_cool = serv_thermostat.configure_char( - CHAR_TARGET_HEATING_COOLING, - value=list(hc_valid_values.values())[0], - setter_callback=self.set_heat_cool, - valid_values=hc_valid_values, + CHAR_TARGET_HEATING_COOLING, valid_values=hc_valid_values, ) # Current and target temperature characteristics + self.char_current_temp = serv_thermostat.configure_char( CHAR_CURRENT_TEMPERATURE, value=21.0 ) + self.char_target_temp = serv_thermostat.configure_char( CHAR_TARGET_TEMPERATURE, value=21.0, # We do not set PROP_MIN_STEP here and instead use the HomeKit # default of 0.1 in order to have enough precision to convert # temperature units and avoid setting to 73F will result in 74F - properties={PROP_MIN_VALUE: min_temp, PROP_MAX_VALUE: max_temp}, - setter_callback=self.set_target_temperature, + properties={PROP_MIN_VALUE: hc_min_temp, PROP_MAX_VALUE: hc_max_temp}, ) # Display units characteristic @@ -209,8 +219,7 @@ class Thermostat(HomeAccessory): # We do not set PROP_MIN_STEP here and instead use the HomeKit # default of 0.1 in order to have enough precision to convert # temperature units and avoid setting to 73F will result in 74F - properties={PROP_MIN_VALUE: min_temp, PROP_MAX_VALUE: max_temp}, - setter_callback=self.set_cooling_threshold, + properties={PROP_MIN_VALUE: hc_min_temp, PROP_MAX_VALUE: hc_max_temp}, ) if CHAR_HEATING_THRESHOLD_TEMPERATURE in self.chars: self.char_heating_thresh_temp = serv_thermostat.configure_char( @@ -219,8 +228,7 @@ class Thermostat(HomeAccessory): # We do not set PROP_MIN_STEP here and instead use the HomeKit # default of 0.1 in order to have enough precision to convert # temperature units and avoid setting to 73F will result in 74F - properties={PROP_MIN_VALUE: min_temp, PROP_MAX_VALUE: max_temp}, - setter_callback=self.set_heating_threshold, + properties={PROP_MIN_VALUE: hc_min_temp, PROP_MAX_VALUE: hc_max_temp}, ) self.char_target_humidity = None self.char_current_humidity = None @@ -234,43 +242,134 @@ class Thermostat(HomeAccessory): # of 80% homekit will give you the options 20%-100% instead # of 0-80% properties={PROP_MIN_VALUE: min_humidity}, - setter_callback=self.set_target_humidity, ) self.char_current_humidity = serv_thermostat.configure_char( CHAR_CURRENT_HUMIDITY, value=50 ) + self.update_state(state) + + serv_thermostat.setter_callback = self._set_chars + + def _temperature_to_homekit(self, temp): + return temperature_to_homekit(temp, self._unit) + + def _temperature_to_states(self, temp): + return temperature_to_states(temp, self._unit) + + def _set_chars(self, char_values): + _LOGGER.debug("Thermostat _set_chars: %s", char_values) + events = [] + params = {} + service = None + state = self.hass.states.get(self.entity_id) + features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) + + hvac_mode = self.hass.states.get(self.entity_id).state + homekit_hvac_mode = HC_HASS_TO_HOMEKIT[hvac_mode] + + if CHAR_TARGET_HEATING_COOLING in char_values: + # Homekit will reset the mode when VIEWING the temp + # Ignore it if its the same mode + if char_values[CHAR_TARGET_HEATING_COOLING] != homekit_hvac_mode: + service = SERVICE_SET_HVAC_MODE_THERMOSTAT + hass_value = self.hc_homekit_to_hass[ + char_values[CHAR_TARGET_HEATING_COOLING] + ] + params = {ATTR_HVAC_MODE: hass_value} + events.append( + f"{CHAR_TARGET_HEATING_COOLING} to {char_values[CHAR_TARGET_HEATING_COOLING]}" + ) + + if CHAR_TARGET_TEMPERATURE in char_values: + hc_target_temp = char_values[CHAR_TARGET_TEMPERATURE] + if features & SUPPORT_TARGET_TEMPERATURE: + service = SERVICE_SET_TEMPERATURE_THERMOSTAT + temperature = self._temperature_to_states(hc_target_temp) + events.append( + f"{CHAR_TARGET_TEMPERATURE} to {char_values[CHAR_TARGET_TEMPERATURE]}°C" + ) + params[ATTR_TEMPERATURE] = temperature + elif features & SUPPORT_TARGET_TEMPERATURE_RANGE: + # Homekit will send us a target temperature + # even if the device does not support it + _LOGGER.debug( + "Homekit requested target temp: %s and the device does not support", + hc_target_temp, + ) + if ( + homekit_hvac_mode == HC_HEAT_COOL_HEAT + and CHAR_HEATING_THRESHOLD_TEMPERATURE not in char_values + ): + char_values[CHAR_HEATING_THRESHOLD_TEMPERATURE] = hc_target_temp + if ( + homekit_hvac_mode == HC_HEAT_COOL_COOL + and CHAR_COOLING_THRESHOLD_TEMPERATURE not in char_values + ): + char_values[CHAR_COOLING_THRESHOLD_TEMPERATURE] = hc_target_temp + + if ( + CHAR_HEATING_THRESHOLD_TEMPERATURE in char_values + or CHAR_COOLING_THRESHOLD_TEMPERATURE in char_values + ): + service = SERVICE_SET_TEMPERATURE_THERMOSTAT + high = self.char_cooling_thresh_temp.value + low = self.char_heating_thresh_temp.value + min_temp, max_temp = self.get_temperature_range() + if CHAR_COOLING_THRESHOLD_TEMPERATURE in char_values: + events.append( + f"{CHAR_COOLING_THRESHOLD_TEMPERATURE} to {char_values[CHAR_COOLING_THRESHOLD_TEMPERATURE]}°C" + ) + high = char_values[CHAR_COOLING_THRESHOLD_TEMPERATURE] + # If the device doesn't support TARGET_TEMPATURE + # this can happen + if high < low: + low = high - HEAT_COOL_DEADBAND + if CHAR_HEATING_THRESHOLD_TEMPERATURE in char_values: + events.append( + f"{CHAR_HEATING_THRESHOLD_TEMPERATURE} to {char_values[CHAR_HEATING_THRESHOLD_TEMPERATURE]}°C" + ) + low = char_values[CHAR_HEATING_THRESHOLD_TEMPERATURE] + # If the device doesn't support TARGET_TEMPATURE + # this can happen + if low > high: + high = low + HEAT_COOL_DEADBAND + + high = min(high, max_temp) + low = max(low, min_temp) + + params.update( + { + ATTR_TARGET_TEMP_HIGH: self._temperature_to_states(high), + ATTR_TARGET_TEMP_LOW: self._temperature_to_states(low), + } + ) + + if service: + params[ATTR_ENTITY_ID] = self.entity_id + self.call_service( + DOMAIN_CLIMATE, service, params, ", ".join(events), + ) + + if CHAR_TARGET_HUMIDITY in char_values: + self.set_target_humidity(char_values[CHAR_TARGET_HUMIDITY]) + def get_temperature_range(self): """Return min and max temperature range.""" max_temp = self.hass.states.get(self.entity_id).attributes.get(ATTR_MAX_TEMP) max_temp = ( - temperature_to_homekit(max_temp, self._unit) - if max_temp - else DEFAULT_MAX_TEMP + self._temperature_to_homekit(max_temp) if max_temp else DEFAULT_MAX_TEMP ) max_temp = round(max_temp * 2) / 2 min_temp = self.hass.states.get(self.entity_id).attributes.get(ATTR_MIN_TEMP) min_temp = ( - temperature_to_homekit(min_temp, self._unit) - if min_temp - else DEFAULT_MIN_TEMP + self._temperature_to_homekit(min_temp) if min_temp else DEFAULT_MIN_TEMP ) min_temp = round(min_temp * 2) / 2 return min_temp, max_temp - def set_heat_cool(self, value): - """Change operation mode to value if call came from HomeKit.""" - _LOGGER.debug("%s: Set heat-cool to %d", self.entity_id, value) - self._flag_heat_cool = True - hass_value = self.hc_homekit_to_hass[value] - params = {ATTR_ENTITY_ID: self.entity_id, ATTR_HVAC_MODE: hass_value} - self.call_service( - DOMAIN_CLIMATE, SERVICE_SET_HVAC_MODE_THERMOSTAT, params, hass_value - ) - - @debounce def set_target_humidity(self, value): """Set target humidity to value if call came from HomeKit.""" _LOGGER.debug("%s: Set target humidity to %d", self.entity_id, value) @@ -279,126 +378,85 @@ class Thermostat(HomeAccessory): DOMAIN_CLIMATE, SERVICE_SET_HUMIDITY, params, f"{value}{UNIT_PERCENTAGE}" ) - @debounce - def set_cooling_threshold(self, value): - """Set cooling threshold temp to value if call came from HomeKit.""" - _LOGGER.debug( - "%s: Set cooling threshold temperature to %.1f°C", self.entity_id, value - ) - self._flag_coolingthresh = True - low = self.char_heating_thresh_temp.value - temperature = temperature_to_states(value, self._unit) - params = { - ATTR_ENTITY_ID: self.entity_id, - ATTR_TARGET_TEMP_HIGH: temperature, - ATTR_TARGET_TEMP_LOW: temperature_to_states(low, self._unit), - } - self.call_service( - DOMAIN_CLIMATE, - SERVICE_SET_TEMPERATURE_THERMOSTAT, - params, - f"cooling threshold {temperature}{self._unit}", - ) - - @debounce - def set_heating_threshold(self, value): - """Set heating threshold temp to value if call came from HomeKit.""" - _LOGGER.debug( - "%s: Set heating threshold temperature to %.1f°C", self.entity_id, value - ) - self._flag_heatingthresh = True - high = self.char_cooling_thresh_temp.value - temperature = temperature_to_states(value, self._unit) - params = { - ATTR_ENTITY_ID: self.entity_id, - ATTR_TARGET_TEMP_HIGH: temperature_to_states(high, self._unit), - ATTR_TARGET_TEMP_LOW: temperature, - } - self.call_service( - DOMAIN_CLIMATE, - SERVICE_SET_TEMPERATURE_THERMOSTAT, - params, - f"heating threshold {temperature}{self._unit}", - ) - - @debounce - def set_target_temperature(self, value): - """Set target temperature to value if call came from HomeKit.""" - _LOGGER.debug("%s: Set target temperature to %.1f°C", self.entity_id, value) - self._flag_temperature = True - temperature = temperature_to_states(value, self._unit) - params = {ATTR_ENTITY_ID: self.entity_id, ATTR_TEMPERATURE: temperature} - self.call_service( - DOMAIN_CLIMATE, - SERVICE_SET_TEMPERATURE_THERMOSTAT, - params, - f"{temperature}{self._unit}", - ) - def update_state(self, new_state): """Update thermostat state after state changed.""" + features = new_state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) + + # Update target operation mode FIRST + hvac_mode = new_state.state + if hvac_mode and hvac_mode in HC_HASS_TO_HOMEKIT: + homekit_hvac_mode = HC_HASS_TO_HOMEKIT[hvac_mode] + if self.char_target_heat_cool.value != homekit_hvac_mode: + self.char_target_heat_cool.set_value(homekit_hvac_mode) + + # Set current operation mode for supported thermostats + hvac_action = new_state.attributes.get(ATTR_HVAC_ACTION) + if hvac_action: + homekit_hvac_action = HC_HASS_TO_HOMEKIT_ACTION[hvac_action] + if self.char_current_heat_cool.value != homekit_hvac_action: + self.char_current_heat_cool.set_value(homekit_hvac_action) + # Update current temperature current_temp = new_state.attributes.get(ATTR_CURRENT_TEMPERATURE) if isinstance(current_temp, (int, float)): - current_temp = temperature_to_homekit(current_temp, self._unit) - self.char_current_temp.set_value(current_temp) + current_temp = self._temperature_to_homekit(current_temp) + if self.char_current_temp.value != current_temp: + self.char_current_temp.set_value(current_temp) # Update current humidity if CHAR_CURRENT_HUMIDITY in self.chars: current_humdity = new_state.attributes.get(ATTR_CURRENT_HUMIDITY) if isinstance(current_humdity, (int, float)): - self.char_current_humidity.set_value(current_humdity) - - # Update target temperature - target_temp = new_state.attributes.get(ATTR_TEMPERATURE) - if isinstance(target_temp, (int, float)): - target_temp = temperature_to_homekit(target_temp, self._unit) - if not self._flag_temperature: - self.char_target_temp.set_value(target_temp) - self._flag_temperature = False + if self.char_current_humidity.value != current_humdity: + self.char_current_humidity.set_value(current_humdity) # Update target humidity if CHAR_TARGET_HUMIDITY in self.chars: target_humdity = new_state.attributes.get(ATTR_HUMIDITY) if isinstance(target_humdity, (int, float)): - self.char_target_humidity.set_value(target_humdity) + if self.char_target_humidity.value != target_humdity: + self.char_target_humidity.set_value(target_humdity) # Update cooling threshold temperature if characteristic exists if self.char_cooling_thresh_temp: cooling_thresh = new_state.attributes.get(ATTR_TARGET_TEMP_HIGH) if isinstance(cooling_thresh, (int, float)): - cooling_thresh = temperature_to_homekit(cooling_thresh, self._unit) - if not self._flag_coolingthresh: + cooling_thresh = self._temperature_to_homekit(cooling_thresh) + if self.char_heating_thresh_temp.value != cooling_thresh: self.char_cooling_thresh_temp.set_value(cooling_thresh) - self._flag_coolingthresh = False # Update heating threshold temperature if characteristic exists if self.char_heating_thresh_temp: heating_thresh = new_state.attributes.get(ATTR_TARGET_TEMP_LOW) if isinstance(heating_thresh, (int, float)): - heating_thresh = temperature_to_homekit(heating_thresh, self._unit) - if not self._flag_heatingthresh: + heating_thresh = self._temperature_to_homekit(heating_thresh) + if self.char_heating_thresh_temp.value != heating_thresh: self.char_heating_thresh_temp.set_value(heating_thresh) - self._flag_heatingthresh = False + + # Update target temperature + target_temp = new_state.attributes.get(ATTR_TEMPERATURE) + if isinstance(target_temp, (int, float)): + target_temp = self._temperature_to_homekit(target_temp) + elif features & SUPPORT_TARGET_TEMPERATURE_RANGE: + # Homekit expects a target temperature + # even if the device does not support it + hc_hvac_mode = self.char_target_heat_cool.value + if hc_hvac_mode == HC_HEAT_COOL_HEAT: + target_temp = self._temperature_to_homekit( + new_state.attributes.get(ATTR_TARGET_TEMP_LOW) + ) + elif hc_hvac_mode == HC_HEAT_COOL_COOL: + target_temp = self._temperature_to_homekit( + new_state.attributes.get(ATTR_TARGET_TEMP_HIGH) + ) + if target_temp and self.char_target_temp.value != target_temp: + self.char_target_temp.set_value(target_temp) # Update display units if self._unit and self._unit in UNIT_HASS_TO_HOMEKIT: - self.char_display_units.set_value(UNIT_HASS_TO_HOMEKIT[self._unit]) - - # Update target operation mode - hvac_mode = new_state.state - if hvac_mode and hvac_mode in HC_HASS_TO_HOMEKIT: - if not self._flag_heat_cool: - self.char_target_heat_cool.set_value(HC_HASS_TO_HOMEKIT[hvac_mode]) - self._flag_heat_cool = False - - # Set current operation mode for supported thermostats - hvac_action = new_state.attributes.get(ATTR_HVAC_ACTION) - if hvac_action: - - self.char_current_heat_cool.set_value( - HC_HASS_TO_HOMEKIT_ACTION[hvac_action] - ) + unit = UNIT_HASS_TO_HOMEKIT[self._unit] + if self.char_display_units.value != unit: + self.char_display_units.set_value(unit) @TYPES.register("WaterHeater") @@ -409,8 +467,6 @@ class WaterHeater(HomeAccessory): """Initialize a WaterHeater accessory object.""" super().__init__(*args, category=CATEGORY_THERMOSTAT) self._unit = self.hass.config.units.temperature_unit - self._flag_heat_cool = False - self._flag_temperature = False min_temp, max_temp = self.get_temperature_range() serv_thermostat = self.add_preload_service(SERV_THERMOSTAT) @@ -442,6 +498,9 @@ class WaterHeater(HomeAccessory): CHAR_TEMP_DISPLAY_UNITS, value=0 ) + state = self.hass.states.get(self.entity_id) + self.update_state(state) + def get_temperature_range(self): """Return min and max temperature range.""" max_temp = self.hass.states.get(self.entity_id).attributes.get(ATTR_MAX_TEMP) @@ -465,16 +524,14 @@ class WaterHeater(HomeAccessory): def set_heat_cool(self, value): """Change operation mode to value if call came from HomeKit.""" _LOGGER.debug("%s: Set heat-cool to %d", self.entity_id, value) - self._flag_heat_cool = True hass_value = HC_HOMEKIT_TO_HASS[value] if hass_value != HVAC_MODE_HEAT: - self.char_target_heat_cool.set_value(1) # Heat + if self.char_target_heat_cool.value != 1: + self.char_target_heat_cool.set_value(1) # Heat - @debounce def set_target_temperature(self, value): """Set target temperature to value if call came from HomeKit.""" _LOGGER.debug("%s: Set target temperature to %.1f°C", self.entity_id, value) - self._flag_temperature = True temperature = temperature_to_states(value, self._unit) params = {ATTR_ENTITY_ID: self.entity_id, ATTR_TEMPERATURE: temperature} self.call_service( @@ -490,17 +547,16 @@ class WaterHeater(HomeAccessory): temperature = new_state.attributes.get(ATTR_TEMPERATURE) if isinstance(temperature, (int, float)): temperature = temperature_to_homekit(temperature, self._unit) - self.char_current_temp.set_value(temperature) - if not self._flag_temperature: + if temperature != self.char_current_temp.value: self.char_target_temp.set_value(temperature) - self._flag_temperature = False # Update display units if self._unit and self._unit in UNIT_HASS_TO_HOMEKIT: - self.char_display_units.set_value(UNIT_HASS_TO_HOMEKIT[self._unit]) + unit = UNIT_HASS_TO_HOMEKIT[self._unit] + if self.char_display_units.value != unit: + self.char_display_units.set_value(unit) # Update target operation mode operation_mode = new_state.state - if operation_mode and not self._flag_heat_cool: + if operation_mode and self.char_target_heat_cool.value != 1: self.char_target_heat_cool.set_value(1) # Heat - self._flag_heat_cool = False diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index ecfa2edbe544..5b5dcf8f3a27 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -66,7 +66,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): assert acc.aid == 1 assert acc.category == 5 # Lightbulb - assert acc.char_on.value == 0 + assert acc.char_on.value await acc.run_handler() await hass.async_block_till_done() @@ -260,7 +260,7 @@ async def test_light_color_temperature(hass, hk_driver, cls, events, driver): acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) driver.add_accessory(acc) - assert acc.char_color_temperature.value == 153 + assert acc.char_color_temperature.value == 190 await acc.run_handler() await hass.async_block_till_done() @@ -326,8 +326,8 @@ async def test_light_rgb_color(hass, hk_driver, cls, events, driver): acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) driver.add_accessory(acc) - assert acc.char_hue.value == 0 - assert acc.char_saturation.value == 75 + assert acc.char_hue.value == 260 + assert acc.char_saturation.value == 90 await acc.run_handler() 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 d463231ba594..93b781170b40 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -2,6 +2,8 @@ from collections import namedtuple from unittest.mock import patch +from pyhap.accessory_driver import AccessoryDriver +from pyhap.const import HAP_REPR_AID, HAP_REPR_CHARS, HAP_REPR_IID, HAP_REPR_VALUE import pytest from homeassistant.components.climate.const import ( @@ -23,7 +25,6 @@ from homeassistant.components.climate.const import ( CURRENT_HVAC_IDLE, DEFAULT_MAX_TEMP, DEFAULT_MIN_HUMIDITY, - DEFAULT_MIN_TEMP, DOMAIN as DOMAIN_CLIMATE, HVAC_MODE_AUTO, HVAC_MODE_COOL, @@ -32,6 +33,8 @@ from homeassistant.components.climate.const import ( HVAC_MODE_HEAT, HVAC_MODE_HEAT_COOL, HVAC_MODE_OFF, + SUPPORT_TARGET_TEMPERATURE, + SUPPORT_TARGET_TEMPERATURE_RANGE, ) from homeassistant.components.homekit.const import ( ATTR_VALUE, @@ -41,6 +44,7 @@ from homeassistant.components.homekit.const import ( PROP_MIN_STEP, PROP_MIN_VALUE, ) +from homeassistant.components.homekit.type_thermostats import HC_MIN_TEMP from homeassistant.components.water_heater import DOMAIN as DOMAIN_WATER_HEATER from homeassistant.const import ( ATTR_ENTITY_ID, @@ -58,6 +62,15 @@ from tests.common import async_mock_service from tests.components.homekit.common import patch_debounce +@pytest.fixture +def driver(): + """Patch AccessoryDriver without zeroconf or HAPServer.""" + with patch("pyhap.accessory_driver.HAPServer"), patch( + "pyhap.accessory_driver.Zeroconf" + ), patch("pyhap.accessory_driver.AccessoryDriver.persist"): + yield AccessoryDriver() + + @pytest.fixture(scope="module") def cls(): """Patch debounce decorator during import of type_thermostats.""" @@ -65,14 +78,14 @@ def cls(): patcher.start() _import = __import__( "homeassistant.components.homekit.type_thermostats", - fromlist=["Thermostat", "WaterHeater"], + fromlist=["WaterHeater", "Thermostat"], ) - patcher_tuple = namedtuple("Cls", ["thermostat", "water_heater"]) + patcher_tuple = namedtuple("Cls", ["water_heater", "thermostat"]) yield patcher_tuple(thermostat=_import.Thermostat, water_heater=_import.WaterHeater) patcher.stop() -async def test_thermostat(hass, hk_driver, cls, events): +async def test_thermostat(hass, hk_driver, cls, events, driver): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -80,6 +93,7 @@ async def test_thermostat(hass, hk_driver, cls, events): entity_id, HVAC_MODE_OFF, { + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE, ATTR_HVAC_MODES: [ HVAC_MODE_HEAT, HVAC_MODE_HEAT_COOL, @@ -87,15 +101,17 @@ async def test_thermostat(hass, hk_driver, cls, events): HVAC_MODE_COOL, HVAC_MODE_OFF, HVAC_MODE_AUTO, - ] + ], }, ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() - assert acc.aid == 2 + assert acc.aid == 1 assert acc.category == 9 # Thermostat assert acc.get_temperature_range() == (7.0, 35.0) @@ -110,7 +126,7 @@ async def test_thermostat(hass, hk_driver, cls, events): assert acc.char_current_humidity is None assert acc.char_target_temp.properties[PROP_MAX_VALUE] == DEFAULT_MAX_TEMP - assert acc.char_target_temp.properties[PROP_MIN_VALUE] == DEFAULT_MIN_TEMP + assert acc.char_target_temp.properties[PROP_MIN_VALUE] == HC_MIN_TEMP assert acc.char_target_temp.properties[PROP_MIN_STEP] == 0.1 hass.states.async_set( @@ -257,6 +273,7 @@ async def test_thermostat(hass, hk_driver, cls, events): entity_id, HVAC_MODE_DRY, { + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE, ATTR_TEMPERATURE: 22.0, ATTR_CURRENT_TEMPERATURE: 22.0, ATTR_HVAC_ACTION: CURRENT_HVAC_DRY, @@ -273,42 +290,102 @@ async def test_thermostat(hass, hk_driver, cls, events): call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") - await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 19.0) + char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] + char_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_temp_iid, + HAP_REPR_VALUE: 19.0, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_set_temperature assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[0].data[ATTR_TEMPERATURE] == 19.0 assert acc.char_target_temp.value == 19.0 assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == "19.0°C" + assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 19.0°C" - await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 2) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_heat_cool_iid, + HAP_REPR_VALUE: 2, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() + assert not call_set_hvac_mode + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_heat_cool_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id - assert call_set_hvac_mode[0].data[ATTR_HVAC_MODE] == HVAC_MODE_COOL - assert acc.char_target_heat_cool.value == 2 + assert call_set_hvac_mode[0].data[ATTR_HVAC_MODE] == HVAC_MODE_HEAT + assert acc.char_target_heat_cool.value == 1 assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] == HVAC_MODE_COOL + assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 1" - await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 3) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_heat_cool_iid, + HAP_REPR_VALUE: 3, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[1].data[ATTR_ENTITY_ID] == entity_id assert call_set_hvac_mode[1].data[ATTR_HVAC_MODE] == HVAC_MODE_HEAT_COOL assert acc.char_target_heat_cool.value == 3 assert len(events) == 3 - assert events[-1].data[ATTR_VALUE] == HVAC_MODE_HEAT_COOL + assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 3" -async def test_thermostat_auto(hass, hk_driver, cls, events): +async def test_thermostat_auto(hass, hk_driver, cls, events, driver): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" # support_auto = True - hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 6}) + hass.states.async_set( + entity_id, + HVAC_MODE_OFF, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE + | SUPPORT_TARGET_TEMPERATURE_RANGE + }, + ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() @@ -316,10 +393,10 @@ async def test_thermostat_auto(hass, hk_driver, cls, events): assert acc.char_heating_thresh_temp.value == 19.0 assert acc.char_cooling_thresh_temp.properties[PROP_MAX_VALUE] == DEFAULT_MAX_TEMP - assert acc.char_cooling_thresh_temp.properties[PROP_MIN_VALUE] == DEFAULT_MIN_TEMP + assert acc.char_cooling_thresh_temp.properties[PROP_MIN_VALUE] == HC_MIN_TEMP assert acc.char_cooling_thresh_temp.properties[PROP_MIN_STEP] == 0.1 assert acc.char_heating_thresh_temp.properties[PROP_MAX_VALUE] == DEFAULT_MAX_TEMP - assert acc.char_heating_thresh_temp.properties[PROP_MIN_VALUE] == DEFAULT_MIN_TEMP + assert acc.char_heating_thresh_temp.properties[PROP_MIN_VALUE] == HC_MIN_TEMP assert acc.char_heating_thresh_temp.properties[PROP_MIN_STEP] == 0.1 hass.states.async_set( @@ -379,37 +456,51 @@ async def test_thermostat_auto(hass, hk_driver, cls, events): # Set from HomeKit call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") - await hass.async_add_executor_job( - acc.char_heating_thresh_temp.client_update_value, 20.0 + char_heating_thresh_temp_iid = acc.char_heating_thresh_temp.to_HAP()[HAP_REPR_IID] + char_cooling_thresh_temp_iid = acc.char_cooling_thresh_temp.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_heating_thresh_temp_iid, + HAP_REPR_VALUE: 20.0, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_cooling_thresh_temp_iid, + HAP_REPR_VALUE: 25.0, + }, + ] + }, + "mock_addr", ) + await hass.async_block_till_done() assert call_set_temperature[0] assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 20.0 + assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 25.0 assert acc.char_heating_thresh_temp.value == 20.0 - assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == "heating threshold 20.0°C" - - await hass.async_add_executor_job( - acc.char_cooling_thresh_temp.client_update_value, 25.0 - ) - await hass.async_block_till_done() - assert call_set_temperature[1] - assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id - assert call_set_temperature[1].data[ATTR_TARGET_TEMP_HIGH] == 25.0 assert acc.char_cooling_thresh_temp.value == 25.0 - assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] == "cooling threshold 25.0°C" + assert len(events) == 1 + assert ( + events[-1].data[ATTR_VALUE] + == "CoolingThresholdTemperature to 25.0°C, HeatingThresholdTemperature to 20.0°C" + ) -async def test_thermostat_humidity(hass, hk_driver, cls, events): +async def test_thermostat_humidity(hass, hk_driver, cls, events, driver): """Test if accessory and HA are updated accordingly with humidity.""" entity_id = "climate.test" # support_auto = True hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 4}) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() @@ -435,7 +526,21 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events): # Set from HomeKit call_set_humidity = async_mock_service(hass, DOMAIN_CLIMATE, "set_humidity") - await hass.async_add_executor_job(acc.char_target_humidity.client_update_value, 35) + char_target_humidity_iid = acc.char_target_humidity.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_humidity_iid, + HAP_REPR_VALUE: 35, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() assert call_set_humidity[0] assert call_set_humidity[0].data[ATTR_ENTITY_ID] == entity_id @@ -445,7 +550,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events): assert events[-1].data[ATTR_VALUE] == "35%" -async def test_thermostat_power_state(hass, hk_driver, cls, events): +async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -458,10 +563,19 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): ATTR_TEMPERATURE: 23.0, ATTR_CURRENT_TEMPERATURE: 18.0, ATTR_HVAC_ACTION: CURRENT_HVAC_HEAT, + ATTR_HVAC_MODES: [ + HVAC_MODE_HEAT_COOL, + HVAC_MODE_COOL, + HVAC_MODE_AUTO, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + ], }, ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() @@ -475,6 +589,13 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): ATTR_TEMPERATURE: 23.0, ATTR_CURRENT_TEMPERATURE: 18.0, ATTR_HVAC_ACTION: CURRENT_HVAC_IDLE, + ATTR_HVAC_MODES: [ + HVAC_MODE_HEAT_COOL, + HVAC_MODE_COOL, + HVAC_MODE_AUTO, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + ], }, ) await hass.async_block_till_done() @@ -488,6 +609,13 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): ATTR_TEMPERATURE: 23.0, ATTR_CURRENT_TEMPERATURE: 18.0, ATTR_HVAC_ACTION: CURRENT_HVAC_IDLE, + ATTR_HVAC_MODES: [ + HVAC_MODE_HEAT_COOL, + HVAC_MODE_COOL, + HVAC_MODE_AUTO, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + ], }, ) await hass.async_block_till_done() @@ -497,31 +625,68 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events): # Set from HomeKit call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") - await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 1) + char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_heat_cool_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id assert call_set_hvac_mode[0].data[ATTR_HVAC_MODE] == HVAC_MODE_HEAT assert acc.char_target_heat_cool.value == 1 assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == HVAC_MODE_HEAT + assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 1" + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_heat_cool_iid, + HAP_REPR_VALUE: 2, + }, + ] + }, + "mock_addr", + ) - 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 == 0 + assert call_set_hvac_mode + assert call_set_hvac_mode[1].data[ATTR_ENTITY_ID] == entity_id + assert call_set_hvac_mode[1].data[ATTR_HVAC_MODE] == HVAC_MODE_COOL assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] == HVAC_MODE_OFF + assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 2" + assert acc.char_target_heat_cool.value == 2 -async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): +async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" # support_ = True - hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 6}) + hass.states.async_set( + entity_id, + HVAC_MODE_OFF, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE + | SUPPORT_TARGET_TEMPERATURE_RANGE + }, + ) await hass.async_block_till_done() with patch.object(hass.config.units, CONF_TEMPERATURE_UNIT, new=TEMP_FAHRENHEIT): - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -533,6 +698,8 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): ATTR_TARGET_TEMP_LOW: 68.1, ATTR_TEMPERATURE: 71.6, ATTR_CURRENT_TEMPERATURE: 73.4, + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE + | SUPPORT_TARGET_TEMPERATURE_RANGE, }, ) await hass.async_block_till_done() @@ -546,38 +713,73 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): # Set from HomeKit call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") - await hass.async_add_executor_job( - acc.char_cooling_thresh_temp.client_update_value, 23 + char_cooling_thresh_temp_iid = acc.char_cooling_thresh_temp.to_HAP()[HAP_REPR_IID] + char_heating_thresh_temp_iid = acc.char_heating_thresh_temp.to_HAP()[HAP_REPR_IID] + char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_cooling_thresh_temp_iid, + HAP_REPR_VALUE: 23, + }, + ] + }, + "mock_addr", ) + await hass.async_block_till_done() assert call_set_temperature[0] assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 73.5 assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 68 assert len(events) == 1 - assert events[-1].data[ATTR_VALUE] == "cooling threshold 73.5°F" + assert events[-1].data[ATTR_VALUE] == "CoolingThresholdTemperature to 23°C" - await hass.async_add_executor_job( - acc.char_heating_thresh_temp.client_update_value, 22 + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_heating_thresh_temp_iid, + HAP_REPR_VALUE: 22, + }, + ] + }, + "mock_addr", ) + await hass.async_block_till_done() assert call_set_temperature[1] assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[1].data[ATTR_TARGET_TEMP_HIGH] == 73.5 assert call_set_temperature[1].data[ATTR_TARGET_TEMP_LOW] == 71.5 assert len(events) == 2 - assert events[-1].data[ATTR_VALUE] == "heating threshold 71.5°F" + assert events[-1].data[ATTR_VALUE] == "HeatingThresholdTemperature to 22°C" - await hass.async_add_executor_job(acc.char_target_temp.client_update_value, 24.0) + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_temp_iid, + HAP_REPR_VALUE: 24.0, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_set_temperature[2] assert call_set_temperature[2].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[2].data[ATTR_TEMPERATURE] == 75.0 assert len(events) == 3 - assert events[-1].data[ATTR_VALUE] == "75.0°F" + assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 24.0°C" -async def test_thermostat_get_temperature_range(hass, hk_driver, cls): +async def test_thermostat_get_temperature_range(hass, hk_driver, cls, driver): """Test if temperature range is evaluated correctly.""" entity_id = "climate.test" @@ -599,13 +801,15 @@ async def test_thermostat_get_temperature_range(hass, hk_driver, cls): assert acc.get_temperature_range() == (15.5, 21.0) -async def test_thermostat_temperature_step_whole(hass, hk_driver, cls): +async def test_thermostat_temperature_step_whole(hass, hk_driver, cls, driver): """Test climate device with single digit precision.""" entity_id = "climate.test" hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_TARGET_TEMP_STEP: 1}) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() @@ -657,7 +861,7 @@ async def test_thermostat_restore(hass, hk_driver, cls, events): } -async def test_thermostat_hvac_modes(hass, hk_driver, cls): +async def test_thermostat_hvac_modes(hass, hk_driver, cls, driver): """Test if unsupported HVAC modes are deactivated in HomeKit.""" entity_id = "climate.test" @@ -666,7 +870,9 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls): ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() @@ -688,13 +894,13 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 1 -async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): +async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls, driver): """Test we get heat cool over auto.""" entity_id = "climate.test" hass.states.async_set( entity_id, - HVAC_MODE_HEAT_COOL, + HVAC_MODE_OFF, { ATTR_HVAC_MODES: [ HVAC_MODE_HEAT_COOL, @@ -707,12 +913,14 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 1, 3] - assert acc.char_target_heat_cool.value == 3 + assert acc.char_target_heat_cool.value == 0 await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() @@ -727,7 +935,21 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): 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, 3) + char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_heat_cool_iid, + HAP_REPR_VALUE: 3, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -735,24 +957,28 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls): +async def test_thermostat_hvac_modes_with_auto_no_heat_cool( + hass, hk_driver, cls, driver +): """Test we get auto when there is no heat cool.""" entity_id = "climate.test" hass.states.async_set( entity_id, - HVAC_MODE_HEAT_COOL, + HVAC_MODE_HEAT, {ATTR_HVAC_MODES: [HVAC_MODE_AUTO, HVAC_MODE_HEAT, HVAC_MODE_OFF]}, ) call_set_hvac_mode = async_mock_service(hass, DOMAIN_CLIMATE, "set_hvac_mode") await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() assert hap["valid-values"] == [0, 1, 3] - assert acc.char_target_heat_cool.value == 3 + assert acc.char_target_heat_cool.value == 1 await hass.async_add_executor_job(acc.char_target_heat_cool.set_value, 3) await hass.async_block_till_done() @@ -767,7 +993,21 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls 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, 3) + char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_heat_cool_iid, + HAP_REPR_VALUE: 3, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() assert call_set_hvac_mode assert call_set_hvac_mode[0].data[ATTR_ENTITY_ID] == entity_id @@ -775,7 +1015,7 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): +async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls, driver): """Test if unsupported HVAC modes are deactivated in HomeKit.""" entity_id = "climate.test" @@ -784,7 +1024,9 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() @@ -806,7 +1048,7 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls): +async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls, driver): """Test a thermostat that has no off.""" entity_id = "climate.test" @@ -815,7 +1057,9 @@ async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls): ) await hass.async_block_till_done() - acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 2, None) + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + await acc.run_handler() await hass.async_block_till_done() hap = acc.char_target_heat_cool.to_HAP() @@ -841,6 +1085,166 @@ async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls): assert acc.char_target_heat_cool.value == 1 +async def test_thermostat_without_target_temp_only_range( + hass, hk_driver, cls, events, driver +): + """Test a thermostat that only supports a range.""" + entity_id = "climate.test" + + # support_auto = True + hass.states.async_set( + entity_id, + HVAC_MODE_OFF, + {ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE_RANGE}, + ) + await hass.async_block_till_done() + acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) + driver.add_accessory(acc) + + await acc.run_handler() + await hass.async_block_till_done() + + assert acc.char_cooling_thresh_temp.value == 23.0 + assert acc.char_heating_thresh_temp.value == 19.0 + + assert acc.char_cooling_thresh_temp.properties[PROP_MAX_VALUE] == DEFAULT_MAX_TEMP + assert acc.char_cooling_thresh_temp.properties[PROP_MIN_VALUE] == HC_MIN_TEMP + assert acc.char_cooling_thresh_temp.properties[PROP_MIN_STEP] == 0.1 + assert acc.char_heating_thresh_temp.properties[PROP_MAX_VALUE] == DEFAULT_MAX_TEMP + assert acc.char_heating_thresh_temp.properties[PROP_MIN_VALUE] == HC_MIN_TEMP + assert acc.char_heating_thresh_temp.properties[PROP_MIN_STEP] == 0.1 + + hass.states.async_set( + entity_id, + HVAC_MODE_HEAT_COOL, + { + ATTR_TARGET_TEMP_HIGH: 22.0, + ATTR_TARGET_TEMP_LOW: 20.0, + ATTR_CURRENT_TEMPERATURE: 18.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_HEAT, + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE_RANGE, + }, + ) + await hass.async_block_till_done() + assert acc.char_heating_thresh_temp.value == 20.0 + assert acc.char_cooling_thresh_temp.value == 22.0 + assert acc.char_current_heat_cool.value == 1 + assert acc.char_target_heat_cool.value == 3 + assert acc.char_current_temp.value == 18.0 + assert acc.char_display_units.value == 0 + + hass.states.async_set( + entity_id, + HVAC_MODE_COOL, + { + ATTR_TARGET_TEMP_HIGH: 23.0, + ATTR_TARGET_TEMP_LOW: 19.0, + ATTR_CURRENT_TEMPERATURE: 24.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_COOL, + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE_RANGE, + }, + ) + await hass.async_block_till_done() + assert acc.char_heating_thresh_temp.value == 19.0 + assert acc.char_cooling_thresh_temp.value == 23.0 + assert acc.char_current_heat_cool.value == 2 + assert acc.char_target_heat_cool.value == 2 + assert acc.char_current_temp.value == 24.0 + assert acc.char_display_units.value == 0 + + hass.states.async_set( + entity_id, + HVAC_MODE_COOL, + { + ATTR_TARGET_TEMP_HIGH: 23.0, + ATTR_TARGET_TEMP_LOW: 19.0, + ATTR_CURRENT_TEMPERATURE: 21.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_IDLE, + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE_RANGE, + }, + ) + await hass.async_block_till_done() + assert acc.char_heating_thresh_temp.value == 19.0 + assert acc.char_cooling_thresh_temp.value == 23.0 + assert acc.char_current_heat_cool.value == 0 + assert acc.char_target_heat_cool.value == 2 + assert acc.char_current_temp.value == 21.0 + assert acc.char_display_units.value == 0 + + # Set from HomeKit + call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") + + char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_temp_iid, + HAP_REPR_VALUE: 17.0, + } + ] + }, + "mock_addr", + ) + + await hass.async_block_till_done() + assert call_set_temperature[0] + assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 12.0 + assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 17.0 + assert acc.char_target_temp.value == 17.0 + assert len(events) == 1 + assert events[-1].data[ATTR_VALUE] == "CoolingThresholdTemperature to 17.0°C" + + hass.states.async_set( + entity_id, + HVAC_MODE_HEAT, + { + ATTR_TARGET_TEMP_HIGH: 23.0, + ATTR_TARGET_TEMP_LOW: 19.0, + ATTR_CURRENT_TEMPERATURE: 21.0, + ATTR_HVAC_ACTION: CURRENT_HVAC_IDLE, + ATTR_SUPPORTED_FEATURES: SUPPORT_TARGET_TEMPERATURE_RANGE, + }, + ) + await hass.async_block_till_done() + assert acc.char_heating_thresh_temp.value == 19.0 + assert acc.char_cooling_thresh_temp.value == 23.0 + assert acc.char_current_heat_cool.value == 0 + assert acc.char_target_heat_cool.value == 1 + assert acc.char_current_temp.value == 21.0 + assert acc.char_display_units.value == 0 + + # Set from HomeKit + call_set_temperature = async_mock_service(hass, DOMAIN_CLIMATE, "set_temperature") + + char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] + + driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_target_temp_iid, + HAP_REPR_VALUE: 27.0, + } + ] + }, + "mock_addr", + ) + + await hass.async_block_till_done() + assert call_set_temperature[0] + assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 27.0 + assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 32.0 + assert acc.char_target_temp.value == 27.0 + assert len(events) == 2 + assert events[-1].data[ATTR_VALUE] == "HeatingThresholdTemperature to 27.0°C" + + async def test_water_heater(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "water_heater.test" @@ -875,7 +1279,7 @@ async def test_water_heater(hass, hk_driver, cls, events): ) await hass.async_block_till_done() assert acc.char_target_temp.value == 56.0 - assert acc.char_current_temp.value == 56.0 + assert acc.char_current_temp.value == 50.0 assert acc.char_target_heat_cool.value == 1 assert acc.char_current_heat_cool.value == 1 assert acc.char_display_units.value == 0 @@ -929,7 +1333,7 @@ async def test_water_heater_fahrenheit(hass, hk_driver, cls, events): hass.states.async_set(entity_id, HVAC_MODE_HEAT, {ATTR_TEMPERATURE: 131}) await hass.async_block_till_done() assert acc.char_target_temp.value == 55.0 - assert acc.char_current_temp.value == 55.0 + assert acc.char_current_temp.value == 50 assert acc.char_display_units.value == 1 # Set from HomeKit From fffda27385e6eefadf88ceafdc94232ac4bf5d98 Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Mon, 13 Apr 2020 01:53:01 +0200 Subject: [PATCH 364/653] Fix Daikin sensor temperature_unit & cleanup (#34116) --- homeassistant/components/daikin/sensor.py | 31 +++++------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/daikin/sensor.py b/homeassistant/components/daikin/sensor.py index 1bda31fc6b0e..d0d8e4b0fdaf 100644 --- a/homeassistant/components/daikin/sensor.py +++ b/homeassistant/components/daikin/sensor.py @@ -1,17 +1,11 @@ """Support for Daikin AC sensors.""" import logging -from homeassistant.const import CONF_ICON, CONF_NAME, CONF_TYPE +from homeassistant.const import CONF_ICON, CONF_NAME, TEMP_CELSIUS from homeassistant.helpers.entity import Entity -from homeassistant.util.unit_system import UnitSystem from . import DOMAIN as DAIKIN_DOMAIN -from .const import ( - ATTR_INSIDE_TEMPERATURE, - ATTR_OUTSIDE_TEMPERATURE, - SENSOR_TYPE_TEMPERATURE, - SENSOR_TYPES, -) +from .const import ATTR_INSIDE_TEMPERATURE, ATTR_OUTSIDE_TEMPERATURE, SENSOR_TYPES _LOGGER = logging.getLogger(__name__) @@ -30,30 +24,19 @@ async def async_setup_entry(hass, entry, async_add_entities): sensors = [ATTR_INSIDE_TEMPERATURE] if daikin_api.device.support_outside_temperature: sensors.append(ATTR_OUTSIDE_TEMPERATURE) - async_add_entities( - [ - DaikinClimateSensor(daikin_api, sensor, hass.config.units) - for sensor in sensors - ] - ) + async_add_entities([DaikinClimateSensor(daikin_api, sensor) for sensor in sensors]) class DaikinClimateSensor(Entity): """Representation of a Sensor.""" - def __init__(self, api, monitored_state, units: UnitSystem, name=None) -> None: + def __init__(self, api, monitored_state) -> None: """Initialize the sensor.""" self._api = api - self._sensor = SENSOR_TYPES.get(monitored_state) - if name is None: - name = f"{self._sensor[CONF_NAME]} {api.name}" - - self._name = f"{name} {monitored_state.replace('_', ' ')}" + self._sensor = SENSOR_TYPES[monitored_state] + self._name = f"{api.name} {self._sensor[CONF_NAME]}" self._device_attribute = monitored_state - if self._sensor[CONF_TYPE] == SENSOR_TYPE_TEMPERATURE: - self._unit_of_measurement = units.temperature_unit - @property def unique_id(self): """Return a unique ID.""" @@ -81,7 +64,7 @@ class DaikinClimateSensor(Entity): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return self._unit_of_measurement + return TEMP_CELSIUS async def async_update(self): """Retrieve latest state.""" From ab1eda74124a6bd82e5fcd2275c83eb98851a771 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 13 Apr 2020 00:07:30 +0000 Subject: [PATCH 365/653] [ci skip] Translation update --- .../airly/.translations/es-419.json | 3 + .../airvisual/.translations/es-419.json | 33 +++++++ .../.translations/es-419.json | 25 ++++++ .../almond/.translations/es-419.json | 8 ++ .../august/.translations/es-419.json | 26 ++++++ .../binary_sensor/.translations/es-419.json | 1 + .../brother/.translations/es-419.json | 8 ++ .../components/deconz/.translations/de.json | 2 - .../components/deconz/.translations/en.json | 4 +- .../components/deconz/.translations/fr.json | 2 - .../components/nut/.translations/ca.json | 3 +- .../components/nut/.translations/en.json | 90 ++++++++++--------- .../components/nut/.translations/ru.json | 3 +- .../components/nut/.translations/zh-Hant.json | 3 +- .../components/roomba/.translations/ca.json | 33 +++++++ .../roomba/.translations/zh-Hant.json | 33 +++++++ .../components/tado/.translations/en.json | 68 +++++++------- 17 files changed, 259 insertions(+), 86 deletions(-) create mode 100644 homeassistant/components/airvisual/.translations/es-419.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/es-419.json create mode 100644 homeassistant/components/almond/.translations/es-419.json create mode 100644 homeassistant/components/august/.translations/es-419.json create mode 100644 homeassistant/components/roomba/.translations/ca.json create mode 100644 homeassistant/components/roomba/.translations/zh-Hant.json diff --git a/homeassistant/components/airly/.translations/es-419.json b/homeassistant/components/airly/.translations/es-419.json index 41f7e29b4088..b559fe5029ee 100644 --- a/homeassistant/components/airly/.translations/es-419.json +++ b/homeassistant/components/airly/.translations/es-419.json @@ -1,5 +1,8 @@ { "config": { + "abort": { + "already_configured": "La integraci\u00f3n a\u00e9rea para estas coordenadas ya est\u00e1 configurada." + }, "error": { "auth": "La clave API no es correcta.", "wrong_location": "No hay estaciones de medici\u00f3n Airly en esta \u00e1rea." diff --git a/homeassistant/components/airvisual/.translations/es-419.json b/homeassistant/components/airvisual/.translations/es-419.json new file mode 100644 index 000000000000..0a01ec0b2c25 --- /dev/null +++ b/homeassistant/components/airvisual/.translations/es-419.json @@ -0,0 +1,33 @@ +{ + "config": { + "abort": { + "already_configured": "Estas coordenadas ya han sido registradas." + }, + "error": { + "invalid_api_key": "Clave de API inv\u00e1lida" + }, + "step": { + "user": { + "data": { + "api_key": "Clave API", + "latitude": "Latitud", + "longitude": "Longitud" + }, + "description": "Monitoree la calidad del aire en una ubicaci\u00f3n geogr\u00e1fica.", + "title": "Configurar AirVisual" + } + }, + "title": "AirVisual" + }, + "options": { + "step": { + "init": { + "data": { + "show_on_map": "Mostrar geograf\u00eda monitoreada en el mapa" + }, + "description": "Establezca varias opciones para la integraci\u00f3n de AirVisual.", + "title": "Configurar AirVisual" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/es-419.json b/homeassistant/components/alarm_control_panel/.translations/es-419.json new file mode 100644 index 000000000000..861d9c13273c --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/es-419.json @@ -0,0 +1,25 @@ +{ + "device_automation": { + "action_type": { + "arm_away": "Habilitar {entity_name} fuera de casa", + "arm_home": "Habilitar {entity_name} en casa", + "arm_night": "Habilitar {entity_name} de noche", + "disarm": "Deshabilitar {entity_name}", + "trigger": "Activar {entity_name}" + }, + "condition_type": { + "is_armed_away": "{entity_name} est\u00e1 habilitada fuera de casa", + "is_armed_home": "{entity_name} est\u00e1 habilitada en casa", + "is_armed_night": "{entity_name} est\u00e1 habilitada de noche", + "is_disarmed": "{entity_name} est\u00e1 deshabilitada", + "is_triggered": "{entity_name} est\u00e1 activada" + }, + "trigger_type": { + "armed_away": "{entity_name} habilitada fuera de casa", + "armed_home": "{entity_name} habilitada en casa", + "armed_night": "{entity_name} habilitada de noche", + "disarmed": "{entity_name} deshabilitada", + "triggered": "{entity_name} activada" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/es-419.json b/homeassistant/components/almond/.translations/es-419.json new file mode 100644 index 000000000000..7b7f7aea9ca5 --- /dev/null +++ b/homeassistant/components/almond/.translations/es-419.json @@ -0,0 +1,8 @@ +{ + "config": { + "abort": { + "already_setup": "Solo puede configurar una cuenta Almond.", + "cannot_connect": "No se puede conectar con el servidor Almond." + } + } +} \ No newline at end of file diff --git a/homeassistant/components/august/.translations/es-419.json b/homeassistant/components/august/.translations/es-419.json new file mode 100644 index 000000000000..0732c1c5e48b --- /dev/null +++ b/homeassistant/components/august/.translations/es-419.json @@ -0,0 +1,26 @@ +{ + "config": { + "error": { + "invalid_auth": "Autenticaci\u00f3n inv\u00e1lida", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "login_method": "M\u00e9todo de inicio de sesi\u00f3n", + "password": "Contrase\u00f1a", + "timeout": "Tiempo de espera (segundos)", + "username": "Nombre de usuario" + }, + "description": "Si el M\u00e9todo de inicio de sesi\u00f3n es 'correo electr\u00f3nico', Nombre de usuario es la direcci\u00f3n de correo electr\u00f3nico. Si el M\u00e9todo de inicio de sesi\u00f3n es 'tel\u00e9fono', Nombre de usuario es el n\u00famero de tel\u00e9fono en el formato '+NNNNNNNNN'." + }, + "validation": { + "data": { + "code": "C\u00f3digo de verificaci\u00f3n" + }, + "description": "Verifique su {login_method} ( {username} ) e ingrese el c\u00f3digo de verificaci\u00f3n a continuaci\u00f3n", + "title": "Autenticaci\u00f3n de dos factores" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/es-419.json b/homeassistant/components/binary_sensor/.translations/es-419.json index 18b5e060818d..f6f3a378eb01 100644 --- a/homeassistant/components/binary_sensor/.translations/es-419.json +++ b/homeassistant/components/binary_sensor/.translations/es-419.json @@ -28,6 +28,7 @@ "is_not_occupied": "{entity_name} no est\u00e1 ocupado", "is_not_open": "{entity_name} est\u00e1 cerrado", "is_not_plugged_in": "{entity_name} est\u00e1 desconectado", + "is_not_present": "{entity_name} no est\u00e1 presente", "is_not_unsafe": "{entity_name} es seguro", "is_occupied": "{entity_name} est\u00e1 ocupado", "is_off": "{entity_name} est\u00e1 apagado", diff --git a/homeassistant/components/brother/.translations/es-419.json b/homeassistant/components/brother/.translations/es-419.json index 49b77b829b57..ba5b9f294d46 100644 --- a/homeassistant/components/brother/.translations/es-419.json +++ b/homeassistant/components/brother/.translations/es-419.json @@ -1,5 +1,13 @@ { "config": { + "abort": { + "already_configured": "Esta impresora ya est\u00e1 configurada.", + "unsupported_model": "Este modelo de impresora no es compatible." + }, + "error": { + "connection_error": "Error de conexi\u00f3n.", + "snmp_error": "El servidor SNMP est\u00e1 apagado o la impresora no es compatible." + }, "title": "Impresora Brother" } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index d463a64efb64..1b2daecbc4ed 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -34,8 +34,6 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Beide Tasten", - "top_buttons": "Obere Tasten", - "bottom_buttons" : "Untere Tasten", "button_1": "Erste Taste", "button_2": "Zweite Taste", "button_3": "Dritte Taste", diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index 4a93d96fdb5c..b82d99f87e27 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -34,8 +34,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Both buttons", - "top_buttons": "Top buttons", - "bottom_buttons" : "Bottom buttons", + "bottom_buttons": "Bottom buttons", "button_1": "First button", "button_2": "Second button", "button_3": "Third button", @@ -52,6 +51,7 @@ "side_4": "Side 4", "side_5": "Side 5", "side_6": "Side 6", + "top_buttons": "Top buttons", "turn_off": "Turn off", "turn_on": "Turn on" }, diff --git a/homeassistant/components/deconz/.translations/fr.json b/homeassistant/components/deconz/.translations/fr.json index a6eefbcc54c2..0c2ecf9edb88 100644 --- a/homeassistant/components/deconz/.translations/fr.json +++ b/homeassistant/components/deconz/.translations/fr.json @@ -34,8 +34,6 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Les deux boutons", - "top_buttons": "sup\u00e9rieurs boutons", - "bottom_buttons" : "inf\u00e9rieurs boutons", "button_1": "Premier bouton", "button_2": "Deuxi\u00e8me bouton", "button_3": "Troisi\u00e8me bouton", diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index ddca023d728a..f6ef9e703af5 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -41,7 +41,8 @@ "step": { "init": { "data": { - "resources": "Recursos" + "resources": "Recursos", + "scan_interval": "Interval d'escaneig (segons)" }, "description": "Selecciona els recursos del sensor" } diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index 206a1ec299a0..a80fc19406e4 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -1,47 +1,51 @@ { - "config": { - "title": "Network UPS Tools (NUT)", - "step": { - "user": { - "title": "Connect to the NUT server", - "data": { - "host": "Host", - "port": "Port", - "username": "Username", - "password": "Password" - } - }, - "ups": { - "title": "Choose the UPS to Monitor", - "data": { - "alias": "Alias", - "resources": "Resources" - } - }, - "resources": { - "title": "Choose the Resources to Monitor", - "data": { - "resources": "Resources" - } - } + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "step": { + "resources": { + "data": { + "resources": "Resources" + }, + "title": "Choose the Resources to Monitor" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Resources" + }, + "title": "Choose the UPS to Monitor" + }, + "user": { + "data": { + "alias": "Alias", + "host": "Host", + "name": "Name", + "password": "Password", + "port": "Port", + "resources": "Resources", + "username": "Username" + }, + "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", + "title": "Connect to the NUT server" + } + }, + "title": "Network UPS Tools (NUT)" }, - "error": { - "cannot_connect": "Failed to connect, please try again", - "unknown": "Unexpected error" - }, - "abort": { - "already_configured": "Device is already configured" - } - }, - "options": { - "step": { - "init": { - "description": "Choose Sensor Resources.", - "data": { - "resources": "Resources", - "scan_interval": "Scan Interval (seconds)" + "options": { + "step": { + "init": { + "data": { + "resources": "Resources", + "scan_interval": "Scan Interval (seconds)" + }, + "description": "Choose Sensor Resources." + } } - } } - } -} +} \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json index 807406d0d00a..63997b7960ac 100644 --- a/homeassistant/components/nut/.translations/ru.json +++ b/homeassistant/components/nut/.translations/ru.json @@ -41,7 +41,8 @@ "step": { "init": { "data": { - "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b" + "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b", + "scan_interval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" }, "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432." } diff --git a/homeassistant/components/nut/.translations/zh-Hant.json b/homeassistant/components/nut/.translations/zh-Hant.json index 2c5717e72f6b..f23ba9df90da 100644 --- a/homeassistant/components/nut/.translations/zh-Hant.json +++ b/homeassistant/components/nut/.translations/zh-Hant.json @@ -41,7 +41,8 @@ "step": { "init": { "data": { - "resources": "\u8cc7\u6e90" + "resources": "\u8cc7\u6e90", + "scan_interval": "\u6383\u63cf\u9593\u8ddd\uff08\u79d2\uff09" }, "description": "\u9078\u64c7\u50b3\u611f\u5668\u8cc7\u6e90\u3002" } diff --git a/homeassistant/components/roomba/.translations/ca.json b/homeassistant/components/roomba/.translations/ca.json new file mode 100644 index 000000000000..df142bdb31c5 --- /dev/null +++ b/homeassistant/components/roomba/.translations/ca.json @@ -0,0 +1,33 @@ +{ + "config": { + "error": { + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Certificat", + "continuous": "Cont\u00ednua", + "delay": "Retard", + "host": "Nom de l'amfitri\u00f3 o adre\u00e7a IP", + "password": "Contrasenya" + }, + "description": "Actualment la recuperaci\u00f3 de BLID i la contrasenya \u00e9s un proc\u00e9s manual. Segueix els passos de la documentaci\u00f3 a: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Connexi\u00f3 amb el dispositiu" + } + }, + "title": "Roomba iRobot" + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Cont\u00ednua", + "delay": "Retard" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/zh-Hant.json b/homeassistant/components/roomba/.translations/zh-Hant.json new file mode 100644 index 000000000000..a776c8876d1b --- /dev/null +++ b/homeassistant/components/roomba/.translations/zh-Hant.json @@ -0,0 +1,33 @@ +{ + "config": { + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "\u8a8d\u8b49", + "continuous": "\u9023\u7e8c", + "delay": "\u5ef6\u9072", + "host": "\u4e3b\u6a5f\u540d\u6216 IP \u4f4d\u5740", + "password": "\u5bc6\u78bc" + }, + "description": "\u76ee\u524d\u63a5\u6536 BLID \u8207\u5bc6\u78bc\u70ba\u624b\u52d5\u904e\u7a0b\u3002\u8acb\u53c3\u95b1\u4ee5\u4e0b\u6587\u4ef6\u7684\u6b65\u9a5f\u9032\u884c\u8a2d\u5b9a\uff1ahttps://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "\u9023\u7dda\u81f3\u8a2d\u5099" + } + }, + "title": "iRobot Roomba" + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "\u9023\u7e8c", + "delay": "\u5ef6\u9072" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/en.json b/homeassistant/components/tado/.translations/en.json index 9336d1409237..00890a786d1e 100644 --- a/homeassistant/components/tado/.translations/en.json +++ b/homeassistant/components/tado/.translations/en.json @@ -1,35 +1,35 @@ { - "config" : { - "abort" : { - "already_configured" : "Device is already configured" - }, - "step" : { - "user" : { - "data" : { - "password" : "Password", - "username" : "Username" - }, - "title" : "Connect to your Tado account" - } - }, - "error" : { - "unknown" : "Unexpected error", - "no_homes" : "There are no homes linked to this tado account.", - "invalid_auth" : "Invalid authentication", - "cannot_connect" : "Failed to connect, please try again" - }, - "title" : "Tado" - }, - "options" : { - "title" : "Tado", - "step" : { - "init" : { - "description" : "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", - "data" : { - "fallback" : "Enable fallback mode." - }, - "title" : "Adjust Tado options." - } - } - } -} + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "invalid_auth": "Invalid authentication", + "no_homes": "There are no homes linked to this tado account.", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Username" + }, + "title": "Connect to your Tado account" + } + }, + "title": "Tado" + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "Enable fallback mode." + }, + "description": "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", + "title": "Adjust Tado options." + } + }, + "title": "Tado" + } +} \ No newline at end of file From c7ab5de07c60e3bfc19ffb19b1e87ef254f5510c Mon Sep 17 00:00:00 2001 From: Austin Mroczek Date: Sun, 12 Apr 2020 19:29:57 -0700 Subject: [PATCH 366/653] Add Totalconnect config flow (#32126) * Bump skybellpy to 0.4.0 * Bump skybellpy to 0.4.0 in requirements_all.txt * Added extra states for STATE_ALARM_TRIGGERED to allow users to know if it is a burglar or fire or carbon monoxide so automations can take appropriate actions. Updated TotalConnect component to handle these new states. * Fix const import * Fix const import * Fix const imports * Bump total-connect-client to 0.26. * Catch details of alarm trigger in state attributes. Also bumps total_connect_client to 0.27. * Change state_attributes() to device_state_attributes() * Move totalconnect component toward being a multi-platform integration. Bump total_connect_client to 0.28. * add missing total-connect alarm state mappings * Made recommended changes of MartinHjelmare at https://github.com/home-assistant/home-assistant/pull/24427 * Update __init__.py * Updates per MartinHjelmare comments * flake8/pydocstyle fixes * removed . at end of log message * added blank line between logging and voluptuous * more fixes * Adding totalconnect zones as HA binary_sensors * fix manifest.json * flake8/pydocstyle fixes. Added codeowner. * Update formatting per @springstan guidance. * Fixed pylint * Add zone ID to log message for easier troubleshooting * Account for bypassed zones in update() * More status handling fixes. * Fixed flake8 error * Another attempt at black/isort fixes. * Bump total-connect-client to 0.50. Simplify code using new functions in total-connect-client package instead of importing constants. Run black and isort. * Fix manifest file * Another manifest fix * one more manifest fix * more manifest changes. * sync up * fix indent * one more pylint fix * Hopefully the last pylint fix * make variable names understandable * create and fill dict in one step * Fix name and attributes * rename to logical variable in alarm_control_panel * Remove location_name from alarm_control_panel attributes since it is already the name of the alarm. * Multiple fixes to improve code per @springstan suggestions * Update homeassistant/components/totalconnect/binary_sensor.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Multiple changes per @MartinHjelmare review * simplify alarm adding * Fix binary_sensor.py is_on * Move DOMAIN to .const in line with examples. * Move to async_setup * Simplify code using new features of total-connect-client 0.51 * First crack at config flow for totalconnect * bump totalconnect to 0.52 * use client.is_logged_in() to avoid total-connect-client details. * updated generated/config_flow.py * use is_logged_in() * Hopefully final touches for config flow * Add tests for config flow * Updated requirements for test * Fixes to test_config_flow * Removed leftover comments and code * fix const.py flake8 error * Simplify text per @Kane610 https://github.com/home-assistant/home-assistant/pull/32126#pullrequestreview-364652949 * Remove .get() to speed things up since the required items should always be available. * Move CONF_USERNAME and CONF_PASSWORD into .const to eliminate extra I/O to import from homeassistant.const * Fix I/O async issues * Fix flake8 and black errors * Mock the I/O in tests. * Fix isort error * Empty commit to re-start azure pipelines (per discord) * bump total-connect-client to 0.53 * Update homeassistant/components/totalconnect/__init__.py Co-Authored-By: Paulus Schoutsen * Update homeassistant/components/totalconnect/config_flow.py Co-Authored-By: Paulus Schoutsen * Fixes per @balloob comments * Fix imports * fix isort error * Fix async_unload_entry It still referenced CONF_USERNAME instead of entry.entity_id * Added async_setup so not breaking change. Fixed imports. * Update tests/components/totalconnect/test_config_flow.py Co-Authored-By: Martin Hjelmare * Remove TotalConnectSystem() per @MartinHjelmare suggestion * Moved from is_logged_in() to is_valid_credentials() The second is more accurate for what we are checking for, because is_logged_in() could return False due to connection error. * Fix import in test * remove commented code and decorator * Update tests/components/totalconnect/test_config_flow.py Co-Authored-By: Martin Hjelmare * fix test_config_flow.py * bump total-connect-client to 0.54 * remove un-needed import of mock_coro * bump to total-connect-client 0.54.1 * re-add CONFIG_SCHEMA * disable pylint on line 10 to avoid pylint bug Co-authored-by: springstan <46536646+springstan@users.noreply.github.com> Co-authored-by: Paulus Schoutsen Co-authored-by: Martin Hjelmare --- .../totalconnect/.translations/en.json | 20 ++++ .../components/totalconnect/__init__.py | 84 +++++++++----- .../totalconnect/alarm_control_panel.py | 12 +- .../components/totalconnect/binary_sensor.py | 14 +-- .../components/totalconnect/config_flow.py | 60 ++++++++++ .../components/totalconnect/manifest.json | 4 +- .../components/totalconnect/strings.json | 20 ++++ homeassistant/generated/config_flows.py | 1 + requirements_test_all.txt | 3 + tests/components/totalconnect/__init__.py | 1 + .../totalconnect/test_config_flow.py | 104 ++++++++++++++++++ 11 files changed, 278 insertions(+), 45 deletions(-) create mode 100644 homeassistant/components/totalconnect/.translations/en.json create mode 100644 homeassistant/components/totalconnect/config_flow.py create mode 100644 homeassistant/components/totalconnect/strings.json create mode 100644 tests/components/totalconnect/__init__.py create mode 100644 tests/components/totalconnect/test_config_flow.py diff --git a/homeassistant/components/totalconnect/.translations/en.json b/homeassistant/components/totalconnect/.translations/en.json new file mode 100644 index 000000000000..5aca06df513d --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/en.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Account already configured" + }, + "error": { + "login": "Login error: please check your username & password" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Username" + }, + "title": "Total Connect" + } + }, + "title": "Total Connect" + } +} diff --git a/homeassistant/components/totalconnect/__init__.py b/homeassistant/components/totalconnect/__init__.py index e6cfbbc629aa..fce67f71b240 100644 --- a/homeassistant/components/totalconnect/__init__.py +++ b/homeassistant/components/totalconnect/__init__.py @@ -1,16 +1,20 @@ """The totalconnect component.""" +import asyncio import logging from total_connect_client import TotalConnectClient import voluptuous as vol +from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME -from homeassistant.helpers import discovery +from homeassistant.core import HomeAssistant import homeassistant.helpers.config_validation as cv +from .const import DOMAIN + _LOGGER = logging.getLogger(__name__) -DOMAIN = "totalconnect" +PLATFORMS = ["alarm_control_panel", "binary_sensor"] CONFIG_SCHEMA = vol.Schema( { @@ -20,39 +24,61 @@ CONFIG_SCHEMA = vol.Schema( vol.Required(CONF_PASSWORD): cv.string, } ) - }, - extra=vol.ALLOW_EXTRA, + } ) -TOTALCONNECT_PLATFORMS = ["alarm_control_panel", "binary_sensor"] +async def async_setup(hass: HomeAssistant, config: dict): + """Set up by configuration file.""" + if DOMAIN not in config: + return True -def setup(hass, config): - """Set up TotalConnect component.""" - conf = config[DOMAIN] - - username = conf[CONF_USERNAME] - password = conf[CONF_PASSWORD] - - client = TotalConnectClient.TotalConnectClient(username, password) - - if client.token is False: - _LOGGER.error("TotalConnect authentication failed") - return False - - hass.data[DOMAIN] = TotalConnectSystem(username, password, client) - - for platform in TOTALCONNECT_PLATFORMS: - discovery.load_platform(hass, platform, DOMAIN, {}, config) + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=config[DOMAIN], + ) + ) return True -class TotalConnectSystem: - """TotalConnect System class.""" +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): + """Set up upon config entry in user interface.""" + hass.data.setdefault(DOMAIN, {}) - def __init__(self, username, password, client): - """Initialize the TotalConnect system.""" - self._username = username - self._password = password - self.client = client + conf = entry.data + username = conf[CONF_USERNAME] + password = conf[CONF_PASSWORD] + + client = await hass.async_add_executor_job( + TotalConnectClient.TotalConnectClient, username, password + ) + + if not client.is_valid_credentials(): + _LOGGER.error("TotalConnect authentication failed") + return False + + hass.data[DOMAIN][entry.entry_id] = client + + for component in PLATFORMS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, component) + ) + + return True + + +async def async_unload_entry(hass, entry: ConfigEntry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(entry, platform) + for platform in PLATFORMS + ] + ) + ) + if unload_ok: + hass.data[DOMAIN].pop(entry.entry_id) + + return unload_ok diff --git a/homeassistant/components/totalconnect/alarm_control_panel.py b/homeassistant/components/totalconnect/alarm_control_panel.py index 2ab06e2f6bdf..2a32ae89b4a5 100644 --- a/homeassistant/components/totalconnect/alarm_control_panel.py +++ b/homeassistant/components/totalconnect/alarm_control_panel.py @@ -23,19 +23,17 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up an alarm control panel for a TotalConnect device.""" - if discovery_info is None: - return - +async def async_setup_entry(hass, entry, async_add_entities) -> None: + """Set up TotalConnect alarm panels based on a config entry.""" alarms = [] - client = hass.data[DOMAIN].client + client = hass.data[DOMAIN][entry.entry_id] for location_id, location in client.locations.items(): location_name = location.location_name alarms.append(TotalConnectAlarm(location_name, location_id, client)) - add_entities(alarms) + + async_add_entities(alarms, True) class TotalConnectAlarm(alarm.AlarmControlPanel): diff --git a/homeassistant/components/totalconnect/binary_sensor.py b/homeassistant/components/totalconnect/binary_sensor.py index 28bd58cfff88..48d9a96a4838 100644 --- a/homeassistant/components/totalconnect/binary_sensor.py +++ b/homeassistant/components/totalconnect/binary_sensor.py @@ -8,24 +8,22 @@ from homeassistant.components.binary_sensor import ( BinarySensorDevice, ) -from . import DOMAIN as TOTALCONNECT_DOMAIN +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up a sensor for a TotalConnect device.""" - if discovery_info is None: - return - +async def async_setup_entry(hass, entry, async_add_entities) -> None: + """Set up TotalConnect device sensors based on a config entry.""" sensors = [] - client_locations = hass.data[TOTALCONNECT_DOMAIN].client.locations + client_locations = hass.data[DOMAIN][entry.entry_id].locations for location_id, location in client_locations.items(): for zone_id, zone in location.zones.items(): sensors.append(TotalConnectBinarySensor(zone_id, location_id, zone)) - add_entities(sensors, True) + + async_add_entities(sensors, True) class TotalConnectBinarySensor(BinarySensorDevice): diff --git a/homeassistant/components/totalconnect/config_flow.py b/homeassistant/components/totalconnect/config_flow.py new file mode 100644 index 000000000000..03ddd0a432a1 --- /dev/null +++ b/homeassistant/components/totalconnect/config_flow.py @@ -0,0 +1,60 @@ +"""Config flow for the Total Connect component.""" +import logging + +from total_connect_client import TotalConnectClient +import voluptuous as vol + +from homeassistant import config_entries +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME + +from .const import DOMAIN # pylint: disable=unused-import + +_LOGGER = logging.getLogger(__name__) + + +class TotalConnectConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Total Connect config flow.""" + + VERSION = 1 + + async def async_step_user(self, user_input=None): + """Handle a flow initiated by the user.""" + errors = {} + + if user_input is not None: + # Validate user input + username = user_input[CONF_USERNAME] + password = user_input[CONF_PASSWORD] + + await self.async_set_unique_id(username) + self._abort_if_unique_id_configured() + + valid = await self.is_valid(username, password) + + if valid: + # authentication success / valid + return self.async_create_entry( + title="Total Connect", + data={CONF_USERNAME: username, CONF_PASSWORD: password}, + ) + # authentication failed / invalid + errors["base"] = "login" + + data_schema = vol.Schema( + {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} + ) + + return self.async_show_form( + step_id="user", data_schema=data_schema, errors=errors + ) + + async def async_step_import(self, user_input): + """Import a config entry.""" + return await self.async_step_user(user_input) + + async def is_valid(self, username="", password=""): + """Return true if the given username and password are valid.""" + client = await self.hass.async_add_executor_job( + TotalConnectClient.TotalConnectClient, username, password + ) + return client.is_valid_credentials() diff --git a/homeassistant/components/totalconnect/manifest.json b/homeassistant/components/totalconnect/manifest.json index bd60e1331f41..fc19c889d8b7 100644 --- a/homeassistant/components/totalconnect/manifest.json +++ b/homeassistant/components/totalconnect/manifest.json @@ -3,5 +3,7 @@ "name": "Honeywell Total Connect Alarm", "documentation": "https://www.home-assistant.io/integrations/totalconnect", "requirements": ["total_connect_client==0.54.1"], - "codeowners": ["@austinmroczek"] + "dependencies": [], + "codeowners": ["@austinmroczek"], + "config_flow": true } diff --git a/homeassistant/components/totalconnect/strings.json b/homeassistant/components/totalconnect/strings.json new file mode 100644 index 000000000000..893aba77368e --- /dev/null +++ b/homeassistant/components/totalconnect/strings.json @@ -0,0 +1,20 @@ +{ + "config": { + "title": "Total Connect", + "step": { + "user": { + "title": "Total Connect", + "data": { + "username": "Username", + "password": "Password" + } + } + }, + "error": { + "login": "Login error: please check your username & password" + }, + "abort": { + "already_configured": "Account already configured" + } + } +} diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index a7dbd4860891..569457d291cf 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -117,6 +117,7 @@ FLOWS = [ "tellduslive", "tesla", "toon", + "totalconnect", "tplink", "traccar", "tradfri", diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e93f9ea8b4ce..5c9c69c3efbf 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -761,6 +761,9 @@ teslajsonpy==0.6.0 # homeassistant.components.toon toonapilib==3.2.4 +# homeassistant.components.totalconnect +total_connect_client==0.54.1 + # homeassistant.components.transmission transmissionrpc==0.11 diff --git a/tests/components/totalconnect/__init__.py b/tests/components/totalconnect/__init__.py new file mode 100644 index 000000000000..180a00188cdd --- /dev/null +++ b/tests/components/totalconnect/__init__.py @@ -0,0 +1 @@ +"""Tests for the totalconnect component.""" diff --git a/tests/components/totalconnect/test_config_flow.py b/tests/components/totalconnect/test_config_flow.py new file mode 100644 index 000000000000..b77198fa9b20 --- /dev/null +++ b/tests/components/totalconnect/test_config_flow.py @@ -0,0 +1,104 @@ +"""Tests for the iCloud config flow.""" +from unittest.mock import patch + +from homeassistant import data_entry_flow +from homeassistant.components.totalconnect.const import DOMAIN +from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME + +from tests.common import MockConfigEntry + +USERNAME = "username@me.com" +PASSWORD = "password" + + +async def test_user(hass): + """Test user config.""" + # no data provided so show the form + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + # now data is provided, so check if login is correct and create the entry + with patch( + "homeassistant.components.totalconnect.config_flow.TotalConnectClient.TotalConnectClient" + ) as client_mock: + client_mock.return_value.is_valid_credentials.return_value = True + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + + +async def test_import(hass): + """Test import step with good username and password.""" + with patch( + "homeassistant.components.totalconnect.config_flow.TotalConnectClient.TotalConnectClient" + ) as client_mock: + client_mock.return_value.is_valid_credentials.return_value = True + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + + +async def test_abort_if_already_setup(hass): + """Test abort if the account is already setup.""" + MockConfigEntry( + domain=DOMAIN, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + unique_id=USERNAME, + ).add_to_hass(hass) + + # Should fail, same USERNAME (import) + with patch( + "homeassistant.components.totalconnect.config_flow.TotalConnectClient.TotalConnectClient" + ) as client_mock: + client_mock.return_value.is_valid_credentials.return_value = True + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + # Should fail, same USERNAME (flow) + with patch( + "homeassistant.components.totalconnect.config_flow.TotalConnectClient.TotalConnectClient" + ) as client_mock: + client_mock.return_value.is_valid_credentials.return_value = True + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_login_failed(hass): + """Test when we have errors during login.""" + with patch( + "homeassistant.components.totalconnect.config_flow.TotalConnectClient.TotalConnectClient" + ) as client_mock: + client_mock.return_value.is_valid_credentials.return_value = False + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["errors"] == {"base": "login"} From c5adcab195a391b1960fb999c289b0f4cded2d3d Mon Sep 17 00:00:00 2001 From: Colin Robbins Date: Mon, 13 Apr 2020 03:35:47 +0100 Subject: [PATCH 367/653] Add Lightwave TRV (#31665) * Add a shadow for covers that do not support postion * Rename shadow as optimistic * Add TRV support * Revert "Rename shadow as optimistic" This reverts commit e6e1db9cfba082c8e52d7fff57b4d79306f0de49. * Revert "Add a shadow for covers that do not support postion" This reverts commit 4f53e2c6c6ec955d673ab1f66b7107e1f4651374. * fix logic error * Modified configuration * Modified configuration (2) * ATTR_BATTERY_LEVEL * move socket code to library 2 * requirements_all.txt * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/climate.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Style changes requested by @sprintstan * Update homeassistant/components/lightwave/__init__.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/__init__.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/__init__.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Black * Update homeassistant/components/lightwave/climate.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/climate.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/climate.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Update homeassistant/components/lightwave/climate.py Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> * Remove device_attr * remove redundant proxy parameters, left over from previous change * remove device id - not used * add comment on inhibit flag * pylint * fix config logic error * revert suggested change: need different behaviour with None & 0 * touch * backoff error in rebase change * Requesed code changes from @springstan * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/climate.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: Martin Hjelmare * Update homeassistant/components/lightwave/sensor.py Co-Authored-By: Martin Hjelmare * Changes requested by @MartinHjelmare * Clean temp step constant Co-Authored-By: springstan <46536646+springstan@users.noreply.github.com> Co-authored-by: springstan <46536646+springstan@users.noreply.github.com> Co-authored-by: Martin Hjelmare --- .../components/lightwave/__init__.py | 49 +++++- homeassistant/components/lightwave/climate.py | 142 ++++++++++++++++++ .../components/lightwave/manifest.json | 2 +- homeassistant/components/lightwave/sensor.py | 60 ++++++++ requirements_all.txt | 2 +- 5 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 homeassistant/components/lightwave/climate.py create mode 100644 homeassistant/components/lightwave/sensor.py diff --git a/homeassistant/components/lightwave/__init__.py b/homeassistant/components/lightwave/__init__.py index 4a27d4a7f4a2..73002908ff3a 100644 --- a/homeassistant/components/lightwave/__init__.py +++ b/homeassistant/components/lightwave/__init__.py @@ -2,20 +2,30 @@ from lightwave.lightwave import LWLink import voluptuous as vol +from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import CONF_HOST, CONF_LIGHTS, CONF_NAME, CONF_SWITCHES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import async_load_platform -LIGHTWAVE_LINK = "lightwave_link" - +CONF_SERIAL = "serial" +CONF_PROXY_IP = "proxy_ip" +CONF_PROXY_PORT = "proxy_port" +CONF_TRV = "trv" +CONF_TRVS = "trvs" +DEFAULT_PROXY_PORT = 7878 +DEFAULT_PROXY_IP = "127.0.0.1" DOMAIN = "lightwave" +LIGHTWAVE_LINK = f"{DOMAIN}_link" +LIGHTWAVE_TRV_PROXY = f"{DOMAIN}_proxy" +LIGHTWAVE_TRV_PROXY_PORT = f"{DOMAIN}_proxy_port" CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema( vol.All( - cv.has_at_least_one_key(CONF_LIGHTS, CONF_SWITCHES), + cv.has_at_least_one_key(CONF_LIGHTS, CONF_SWITCHES, CONF_TRV), { vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_LIGHTS, default={}): { @@ -24,6 +34,22 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_SWITCHES, default={}): { cv.string: vol.Schema({vol.Required(CONF_NAME): cv.string}) }, + vol.Optional(CONF_TRV, default={}): { + vol.Optional( + CONF_PROXY_PORT, default=DEFAULT_PROXY_PORT + ): cv.port, + vol.Optional( + CONF_PROXY_IP, default=DEFAULT_PROXY_IP + ): cv.string, + vol.Required(CONF_TRVS, default={}): { + cv.string: vol.Schema( + { + vol.Required(CONF_NAME): cv.string, + vol.Required(CONF_SERIAL): cv.string, + } + ) + }, + }, }, ) ) @@ -34,9 +60,9 @@ CONFIG_SCHEMA = vol.Schema( async def async_setup(hass, config): """Try to start embedded Lightwave broker.""" - host = config[DOMAIN][CONF_HOST] - hass.data[LIGHTWAVE_LINK] = LWLink(host) + lwlink = LWLink(host) + hass.data[LIGHTWAVE_LINK] = lwlink lights = config[DOMAIN][CONF_LIGHTS] if lights: @@ -50,4 +76,17 @@ async def async_setup(hass, config): async_load_platform(hass, "switch", DOMAIN, switches, config) ) + trv = config[DOMAIN][CONF_TRV] + if trv: + trvs = trv[CONF_TRVS] + proxy_ip = trv[CONF_PROXY_IP] + proxy_port = trv[CONF_PROXY_PORT] + lwlink.set_trv_proxy(proxy_ip, proxy_port) + + platforms = [CLIMATE_DOMAIN, SENSOR_DOMAIN] + for platform in platforms: + hass.async_create_task( + async_load_platform(hass, platform, DOMAIN, trvs, config) + ) + return True diff --git a/homeassistant/components/lightwave/climate.py b/homeassistant/components/lightwave/climate.py new file mode 100644 index 000000000000..8e842624b16f --- /dev/null +++ b/homeassistant/components/lightwave/climate.py @@ -0,0 +1,142 @@ +"""Support for LightwaveRF TRVs.""" +from homeassistant.components.climate import ( + DEFAULT_MAX_TEMP, + DEFAULT_MIN_TEMP, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + SUPPORT_TARGET_TEMPERATURE, + ClimateDevice, +) +from homeassistant.components.climate.const import CURRENT_HVAC_HEAT, CURRENT_HVAC_OFF +from homeassistant.const import ATTR_TEMPERATURE, CONF_NAME, TEMP_CELSIUS + +from . import CONF_SERIAL, LIGHTWAVE_LINK + + +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): + """Find and return LightWave lights.""" + if discovery_info is None: + return + + entities = [] + lwlink = hass.data[LIGHTWAVE_LINK] + + for device_id, device_config in discovery_info.items(): + name = device_config[CONF_NAME] + serial = device_config[CONF_SERIAL] + entities.append(LightwaveTrv(name, device_id, lwlink, serial)) + + async_add_entities(entities) + + +class LightwaveTrv(ClimateDevice): + """Representation of a LightWaveRF TRV.""" + + def __init__(self, name, device_id, lwlink, serial): + """Initialize LightwaveTrv entity.""" + self._name = name + self._device_id = device_id + self._state = None + self._current_temperature = None + self._target_temperature = None + self._hvac_action = None + self._lwlink = lwlink + self._serial = serial + # inhibit is used to prevent race condition on update. If non zero, skip next update cycle. + self._inhibit = 0 + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_TARGET_TEMPERATURE + + def update(self): + """Communicate with a Lightwave RTF Proxy to get state.""" + (temp, targ, _, trv_output) = self._lwlink.read_trv_status(self._serial) + if temp is not None: + self._current_temperature = temp + if targ is not None: + if self._inhibit == 0: + self._target_temperature = targ + if targ == 0: + # TRV off + self._target_temperature = None + if targ >= 40: + # Call for heat mode, or TRV in a fixed position + self._target_temperature = None + else: + # Done the job - use proxy next iteration + self._inhibit = 0 + if trv_output is not None: + if trv_output > 0: + self._hvac_action = CURRENT_HVAC_HEAT + else: + self._hvac_action = CURRENT_HVAC_OFF + + @property + def name(self): + """Lightwave trv name.""" + return self._name + + @property + def current_temperature(self): + """Property giving the current room temperature.""" + return self._current_temperature + + @property + def target_temperature(self): + """Target room temperature.""" + if self._inhibit > 0: + # If we get an update before the new temp has + # propagated, the target temp is set back to the + # old target on the next poll, showing a false + # reading temporarily. + self._target_temperature = self._inhibit + return self._target_temperature + + @property + def hvac_modes(self): + """HVAC modes.""" + return [HVAC_MODE_HEAT, HVAC_MODE_OFF] + + @property + def hvac_mode(self): + """HVAC mode.""" + return HVAC_MODE_HEAT + + @property + def hvac_action(self): + """HVAC action.""" + return self._hvac_action + + @property + def min_temp(self): + """Min Temp.""" + return DEFAULT_MIN_TEMP + + @property + def max_temp(self): + """Max Temp.""" + return DEFAULT_MAX_TEMP + + @property + def temperature_unit(self): + """Set temperature unit.""" + return TEMP_CELSIUS + + @property + def target_temperature_step(self): + """Set temperature step.""" + return 0.5 + + def set_temperature(self, **kwargs): + """Set TRV target temperature.""" + if ATTR_TEMPERATURE in kwargs: + self._target_temperature = kwargs[ATTR_TEMPERATURE] + self._inhibit = self._target_temperature + self._lwlink.set_temperature( + self._device_id, self._target_temperature, self._name + ) + + async def async_set_hvac_mode(self, hvac_mode): + """Set HVAC Mode for TRV.""" diff --git a/homeassistant/components/lightwave/manifest.json b/homeassistant/components/lightwave/manifest.json index ffda0e96c120..a80136b3fecc 100644 --- a/homeassistant/components/lightwave/manifest.json +++ b/homeassistant/components/lightwave/manifest.json @@ -2,6 +2,6 @@ "domain": "lightwave", "name": "Lightwave", "documentation": "https://www.home-assistant.io/integrations/lightwave", - "requirements": ["lightwave==0.17"], + "requirements": ["lightwave==0.18"], "codeowners": [] } diff --git a/homeassistant/components/lightwave/sensor.py b/homeassistant/components/lightwave/sensor.py new file mode 100644 index 000000000000..f018a0c17c7a --- /dev/null +++ b/homeassistant/components/lightwave/sensor.py @@ -0,0 +1,60 @@ +"""Support for LightwaveRF TRV - Associated Battery.""" +from homeassistant.const import CONF_NAME, DEVICE_CLASS_BATTERY, UNIT_PERCENTAGE +from homeassistant.helpers.entity import Entity + +from . import CONF_SERIAL, LIGHTWAVE_LINK + + +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): + """Find and return battery.""" + if discovery_info is None: + return + + batteries = [] + + lwlink = hass.data[LIGHTWAVE_LINK] + + for device_config in discovery_info.values(): + name = device_config[CONF_NAME] + serial = device_config[CONF_SERIAL] + batteries.append(LightwaveBattery(name, lwlink, serial)) + + async_add_entities(batteries) + + +class LightwaveBattery(Entity): + """Lightwave TRV Battery.""" + + def __init__(self, name, lwlink, serial): + """Initialize the Lightwave Trv battery sensor.""" + self._name = name + self._state = None + self._lwlink = lwlink + self._serial = serial + + @property + def device_class(self): + """Return the device class of the sensor.""" + return DEVICE_CLASS_BATTERY + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the state of the sensor.""" + return UNIT_PERCENTAGE + + def update(self): + """Communicate with a Lightwave RTF Proxy to get state.""" + (dummy_temp, dummy_targ, battery, dummy_output) = self._lwlink.read_trv_status( + self._serial + ) + self._state = battery diff --git a/requirements_all.txt b/requirements_all.txt index b025253cf770..e992c3164f31 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -818,7 +818,7 @@ liffylights==0.9.4 lightify==1.0.7.2 # homeassistant.components.lightwave -lightwave==0.17 +lightwave==0.18 # homeassistant.components.limitlessled limitlessled==1.1.3 From 328cfe86b10721231014219ad507b875c8fed9eb Mon Sep 17 00:00:00 2001 From: James Nimmo Date: Mon, 13 Apr 2020 15:18:27 +1200 Subject: [PATCH 368/653] Bump pyIntesisHome to 1.7.3 (#34125) --- homeassistant/components/intesishome/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/intesishome/manifest.json b/homeassistant/components/intesishome/manifest.json index 36da85d6fb03..ab52f2b23ae3 100644 --- a/homeassistant/components/intesishome/manifest.json +++ b/homeassistant/components/intesishome/manifest.json @@ -3,5 +3,5 @@ "name": "IntesisHome", "documentation": "https://www.home-assistant.io/integrations/intesishome", "codeowners": ["@jnimmo"], - "requirements": ["pyintesishome==1.7.1"] + "requirements": ["pyintesishome==1.7.3"] } diff --git a/requirements_all.txt b/requirements_all.txt index e992c3164f31..39b9d1efc5fd 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1335,7 +1335,7 @@ pyialarm==0.3 pyicloud==0.9.6.1 # homeassistant.components.intesishome -pyintesishome==1.7.1 +pyintesishome==1.7.3 # homeassistant.components.ipma pyipma==2.0.5 From f49831c03b9cbd9828cd12ed9c6b1b06fc52b7c1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 13 Apr 2020 12:37:57 +0200 Subject: [PATCH 369/653] Temporary transition Docker init (#34135) --- rootfs/init | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100755 rootfs/init diff --git a/rootfs/init b/rootfs/init new file mode 100755 index 000000000000..7bea7ed88a91 --- /dev/null +++ b/rootfs/init @@ -0,0 +1,23 @@ +#!/bin/execlineb -S0 + +## +## load default PATH (the same that Docker includes if not provided) if it doesn't exist, +## then go ahead with stage1. +## this was motivated due to this issue: +## - https://github.com/just-containers/s6-overlay/issues/108 +## + +/bin/importas -D /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH PATH +export PATH ${PATH} + +## +## Skip further init if the user has a given CMD. +## This is to prevent Home Assistant from starting twice if the user +## decided to override/start via the CMD. +## + +ifelse { s6-test $# -ne 0 } +{ + $@ +} +/etc/s6/init/init-stage1 $@ \ No newline at end of file From 4bcceb4078633be10c2f144bde450e11d41d77a4 Mon Sep 17 00:00:00 2001 From: Pascal Roeleven Date: Mon, 13 Apr 2020 12:40:57 +0200 Subject: [PATCH 370/653] Use Orange Pi GPIO as integration name (#34137) The actual brand name is "Orange Pi", with a space and capital P. --- homeassistant/components/orangepi_gpio/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/orangepi_gpio/manifest.json b/homeassistant/components/orangepi_gpio/manifest.json index fd0945655d5c..904ff29cb1d0 100644 --- a/homeassistant/components/orangepi_gpio/manifest.json +++ b/homeassistant/components/orangepi_gpio/manifest.json @@ -1,6 +1,6 @@ { "domain": "orangepi_gpio", - "name": "Orangepi GPIO", + "name": "Orange Pi GPIO", "documentation": "https://www.home-assistant.io/integrations/orangepi_gpio", "requirements": ["OPi.GPIO==0.4.0"], "codeowners": ["@pascallj"] From 6d24a65313f0c8413c71feeca79f2f0ff79d2b60 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 13 Apr 2020 15:33:04 +0200 Subject: [PATCH 371/653] Various light test improvements (#34131) --- homeassistant/components/demo/light.py | 13 +- homeassistant/components/light/__init__.py | 10 +- homeassistant/helpers/entity.py | 10 +- tests/components/demo/test_light.py | 111 ++-- .../device_sun_light_trigger/test_init.py | 46 +- tests/components/flux/test_switch.py | 12 +- tests/components/group/test_light.py | 475 +++++++++++------- 7 files changed, 418 insertions(+), 259 deletions(-) diff --git a/homeassistant/components/demo/light.py b/homeassistant/components/demo/light.py index ac7e53826b94..e6747fee2df3 100644 --- a/homeassistant/components/demo/light.py +++ b/homeassistant/components/demo/light.py @@ -84,10 +84,7 @@ class DemoLight(Light): self._effect_list = effect_list self._effect = effect self._available = True - if ct is not None and hs_color is None: - self._color_mode = "ct" - else: - self._color_mode = "hs" + self._color_mode = "ct" if ct is not None and hs_color is None else "hs" @property def device_info(self): @@ -166,7 +163,7 @@ class DemoLight(Light): """Flag supported features.""" return SUPPORT_DEMO - def turn_on(self, **kwargs) -> None: + async def async_turn_on(self, **kwargs) -> None: """Turn the light on.""" self._state = True @@ -189,12 +186,12 @@ class DemoLight(Light): # As we have disabled polling, we need to inform # Home Assistant about updates in our state ourselves. - self.schedule_update_ha_state() + self.async_write_ha_state() - def turn_off(self, **kwargs) -> None: + async def async_turn_off(self, **kwargs) -> None: """Turn the light off.""" self._state = False # As we have disabled polling, we need to inform # Home Assistant about updates in our state ourselves. - self.schedule_update_ha_state() + self.async_write_ha_state() diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index e86de00b59f3..4a960a6c884c 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -191,11 +191,11 @@ async def async_setup(hass, config): def preprocess_data(data): """Preprocess the service data.""" - base = {} - - for entity_field in cv.ENTITY_SERVICE_FIELDS: - if entity_field in data: - base[entity_field] = data.pop(entity_field) + base = { + entity_field: data.pop(entity_field) + for entity_field in cv.ENTITY_SERVICE_FIELDS + if entity_field in data + } preprocess_turn_on_alternatives(data) turn_lights_off, off_params = preprocess_turn_off(data) diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 62d465004517..7a3e1e8d52ad 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -319,11 +319,7 @@ class Entity(ABC): else: state = self.state - if state is None: - state = STATE_UNKNOWN - else: - state = str(state) - + state = STATE_UNKNOWN if state is None else str(state) attr.update(self.state_attributes or {}) attr.update(self.device_state_attributes or {}) @@ -622,7 +618,7 @@ class ToggleEntity(Entity): async def async_turn_on(self, **kwargs): """Turn the entity on.""" - await self.hass.async_add_job(ft.partial(self.turn_on, **kwargs)) + await self.hass.async_add_executor_job(ft.partial(self.turn_on, **kwargs)) def turn_off(self, **kwargs: Any) -> None: """Turn the entity off.""" @@ -630,7 +626,7 @@ class ToggleEntity(Entity): async def async_turn_off(self, **kwargs): """Turn the entity off.""" - await self.hass.async_add_job(ft.partial(self.turn_off, **kwargs)) + await self.hass.async_add_executor_job(ft.partial(self.turn_off, **kwargs)) def toggle(self, **kwargs: Any) -> None: """Toggle the entity.""" diff --git a/tests/components/demo/test_light.py b/tests/components/demo/test_light.py index 5d0fee65aea6..f48bc28c7727 100644 --- a/tests/components/demo/test_light.py +++ b/tests/components/demo/test_light.py @@ -1,11 +1,25 @@ """The tests for the demo light component.""" import pytest -from homeassistant.components import light +from homeassistant.components.demo import DOMAIN +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, + ATTR_BRIGHTNESS_PCT, + ATTR_COLOR_TEMP, + ATTR_EFFECT, + ATTR_KELVIN, + ATTR_MAX_MIREDS, + ATTR_MIN_MIREDS, + ATTR_RGB_COLOR, + ATTR_WHITE_VALUE, + ATTR_XY_COLOR, + DOMAIN as LIGHT_DOMAIN, + SERVICE_TURN_OFF, + SERVICE_TURN_ON, +) +from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON from homeassistant.setup import async_setup_component -from tests.components.light import common - ENTITY_LIGHT = "light.bed_light" @@ -13,63 +27,96 @@ ENTITY_LIGHT = "light.bed_light" def setup_comp(hass): """Set up demo component.""" hass.loop.run_until_complete( - async_setup_component(hass, light.DOMAIN, {"light": {"platform": "demo"}}) + async_setup_component(hass, LIGHT_DOMAIN, {LIGHT_DOMAIN: {"platform": DOMAIN}}) ) async def test_state_attributes(hass): """Test light state attributes.""" - await common.async_turn_on(hass, ENTITY_LIGHT, xy_color=(0.4, 0.4), brightness=25) - state = hass.states.get(ENTITY_LIGHT) - assert light.is_on(hass, ENTITY_LIGHT) - assert (0.4, 0.4) == state.attributes.get(light.ATTR_XY_COLOR) - assert state.attributes.get(light.ATTR_BRIGHTNESS) == 25 - assert state.attributes.get(light.ATTR_RGB_COLOR) == (255, 234, 164) - assert state.attributes.get(light.ATTR_EFFECT) == "rainbow" - await common.async_turn_on( - hass, ENTITY_LIGHT, rgb_color=(251, 253, 255), white_value=254 + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_XY_COLOR: (0.4, 0.4), ATTR_BRIGHTNESS: 25}, + blocking=True, ) + state = hass.states.get(ENTITY_LIGHT) - assert state.attributes.get(light.ATTR_WHITE_VALUE) == 254 - assert state.attributes.get(light.ATTR_RGB_COLOR) == (250, 252, 255) - assert state.attributes.get(light.ATTR_XY_COLOR) == (0.319, 0.326) - await common.async_turn_on(hass, ENTITY_LIGHT, color_temp=400, effect="none") + assert state.state == STATE_ON + assert state.attributes.get(ATTR_XY_COLOR) == (0.4, 0.4) + assert state.attributes.get(ATTR_BRIGHTNESS) == 25 + assert state.attributes.get(ATTR_RGB_COLOR) == (255, 234, 164) + assert state.attributes.get(ATTR_EFFECT) == "rainbow" + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + ATTR_RGB_COLOR: (251, 253, 255), + ATTR_WHITE_VALUE: 254, + }, + blocking=True, + ) + state = hass.states.get(ENTITY_LIGHT) - assert state.attributes.get(light.ATTR_COLOR_TEMP) == 400 - assert state.attributes.get(light.ATTR_MIN_MIREDS) == 153 - assert state.attributes.get(light.ATTR_MAX_MIREDS) == 500 - assert state.attributes.get(light.ATTR_EFFECT) == "none" - await common.async_turn_on(hass, ENTITY_LIGHT, kelvin=3000, brightness_pct=50) + assert state.attributes.get(ATTR_WHITE_VALUE) == 254 + assert state.attributes.get(ATTR_RGB_COLOR) == (250, 252, 255) + assert state.attributes.get(ATTR_XY_COLOR) == (0.319, 0.326) + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_EFFECT: "none", ATTR_COLOR_TEMP: 400}, + blocking=True, + ) + state = hass.states.get(ENTITY_LIGHT) - assert state.attributes.get(light.ATTR_COLOR_TEMP) == 333 - assert state.attributes.get(light.ATTR_BRIGHTNESS) == 127 + assert state.attributes.get(ATTR_COLOR_TEMP) == 400 + assert state.attributes.get(ATTR_MIN_MIREDS) == 153 + assert state.attributes.get(ATTR_MAX_MIREDS) == 500 + assert state.attributes.get(ATTR_EFFECT) == "none" + + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_BRIGHTNESS_PCT: 50, ATTR_KELVIN: 3000}, + blocking=True, + ) + + state = hass.states.get(ENTITY_LIGHT) + assert state.attributes.get(ATTR_COLOR_TEMP) == 333 + assert state.attributes.get(ATTR_BRIGHTNESS) == 127 async def test_turn_off(hass): """Test light turn off method.""" await hass.services.async_call( - "light", "turn_on", {"entity_id": ENTITY_LIGHT}, blocking=True + LIGHT_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_LIGHT}, blocking=True ) - assert light.is_on(hass, ENTITY_LIGHT) + state = hass.states.get(ENTITY_LIGHT) + assert state.state == STATE_ON await hass.services.async_call( - "light", "turn_off", {"entity_id": ENTITY_LIGHT}, blocking=True + LIGHT_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_LIGHT}, blocking=True ) - assert not light.is_on(hass, ENTITY_LIGHT) + state = hass.states.get(ENTITY_LIGHT) + assert state.state == STATE_OFF async def test_turn_off_without_entity_id(hass): """Test light turn off all lights.""" await hass.services.async_call( - "light", "turn_on", {"entity_id": "all"}, blocking=True + LIGHT_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: "all"}, blocking=True ) - assert light.is_on(hass, ENTITY_LIGHT) + state = hass.states.get(ENTITY_LIGHT) + assert state.state == STATE_ON await hass.services.async_call( - "light", "turn_off", {"entity_id": "all"}, blocking=True + LIGHT_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: "all"}, blocking=True ) - assert not light.is_on(hass, ENTITY_LIGHT) + state = hass.states.get(ENTITY_LIGHT) + assert state.state == STATE_OFF diff --git a/tests/components/device_sun_light_trigger/test_init.py b/tests/components/device_sun_light_trigger/test_init.py index 9cc794380f9d..1b51d93ae6c1 100644 --- a/tests/components/device_sun_light_trigger/test_init.py +++ b/tests/components/device_sun_light_trigger/test_init.py @@ -12,12 +12,18 @@ from homeassistant.components import ( light, ) from homeassistant.components.device_tracker.const import DOMAIN -from homeassistant.const import CONF_PLATFORM, STATE_HOME, STATE_NOT_HOME +from homeassistant.const import ( + ATTR_ENTITY_ID, + CONF_PLATFORM, + STATE_HOME, + STATE_NOT_HOME, + STATE_OFF, + STATE_ON, +) from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util from tests.common import async_fire_time_changed -from tests.components.light import common as common_light @pytest.fixture @@ -74,7 +80,12 @@ async def test_lights_on_when_sun_sets(hass, scanner): hass, device_sun_light_trigger.DOMAIN, {device_sun_light_trigger.DOMAIN: {}} ) - await common_light.async_turn_off(hass) + await hass.services.async_call( + light.DOMAIN, + light.SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: "test.light"}, + blocking=True, + ) test_time = test_time.replace(hour=3) with patch("homeassistant.util.dt.utcnow", return_value=test_time): @@ -82,7 +93,8 @@ async def test_lights_on_when_sun_sets(hass, scanner): await hass.async_block_till_done() assert all( - light.is_on(hass, ent_id) for ent_id in hass.states.async_entity_ids("light") + hass.states.get(ent_id).state == STATE_ON + for ent_id in hass.states.async_entity_ids("light") ) @@ -91,7 +103,12 @@ async def test_lights_turn_off_when_everyone_leaves(hass): assert await async_setup_component( hass, "light", {light.DOMAIN: {CONF_PLATFORM: "test"}} ) - await common_light.async_turn_on(hass) + await hass.services.async_call( + light.DOMAIN, + light.SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "test.light"}, + blocking=True, + ) hass.states.async_set("device_tracker.bla", STATE_HOME) assert await async_setup_component( @@ -103,7 +120,7 @@ async def test_lights_turn_off_when_everyone_leaves(hass): await hass.async_block_till_done() assert all( - not light.is_on(hass, ent_id) + hass.states.get(ent_id).state == STATE_OFF for ent_id in hass.states.async_entity_ids("light") ) @@ -112,7 +129,9 @@ async def test_lights_turn_on_when_coming_home_after_sun_set(hass, scanner): """Test lights turn on when coming home after sun set.""" test_time = datetime(2017, 4, 5, 3, 2, 3, tzinfo=dt_util.UTC) with patch("homeassistant.util.dt.utcnow", return_value=test_time): - await common_light.async_turn_off(hass) + await hass.services.async_call( + light.DOMAIN, light.SERVICE_TURN_OFF, {ATTR_ENTITY_ID: "all"}, blocking=True + ) assert await async_setup_component( hass, device_sun_light_trigger.DOMAIN, {device_sun_light_trigger.DOMAIN: {}} @@ -123,7 +142,8 @@ async def test_lights_turn_on_when_coming_home_after_sun_set(hass, scanner): await hass.async_block_till_done() assert all( - light.is_on(hass, ent_id) for ent_id in hass.states.async_entity_ids("light") + hass.states.get(ent_id).state == light.STATE_ON + for ent_id in hass.states.async_entity_ids("light") ) @@ -134,7 +154,9 @@ async def test_lights_turn_on_when_coming_home_after_sun_set_person(hass, scanne test_time = datetime(2017, 4, 5, 3, 2, 3, tzinfo=dt_util.UTC) with patch("homeassistant.util.dt.utcnow", return_value=test_time): - await common_light.async_turn_off(hass) + await hass.services.async_call( + light.DOMAIN, light.SERVICE_TURN_OFF, {ATTR_ENTITY_ID: "all"}, blocking=True + ) hass.states.async_set(device_1, STATE_NOT_HOME) hass.states.async_set(device_2, STATE_NOT_HOME) await hass.async_block_till_done() @@ -161,7 +183,7 @@ async def test_lights_turn_on_when_coming_home_after_sun_set_person(hass, scanne ) assert all( - not light.is_on(hass, ent_id) + hass.states.get(ent_id).state == STATE_OFF for ent_id in hass.states.async_entity_ids("light") ) assert hass.states.get(device_1).state == "not_home" @@ -173,7 +195,7 @@ async def test_lights_turn_on_when_coming_home_after_sun_set_person(hass, scanne await hass.async_block_till_done() assert all( - not light.is_on(hass, ent_id) + hass.states.get(ent_id).state == STATE_OFF for ent_id in hass.states.async_entity_ids("light") ) assert hass.states.get(device_1).state == "not_home" @@ -186,7 +208,7 @@ async def test_lights_turn_on_when_coming_home_after_sun_set_person(hass, scanne await hass.async_block_till_done() assert all( - light.is_on(hass, ent_id) + hass.states.get(ent_id).state == light.STATE_ON for ent_id in hass.states.async_entity_ids("light") ) assert hass.states.get(device_1).state == "home" diff --git a/tests/components/flux/test_switch.py b/tests/components/flux/test_switch.py index 13824dff9c31..c0befe8e69ca 100644 --- a/tests/components/flux/test_switch.py +++ b/tests/components/flux/test_switch.py @@ -4,6 +4,7 @@ import pytest from homeassistant.components import light, switch from homeassistant.const import ( + ATTR_ENTITY_ID, CONF_PLATFORM, SERVICE_TURN_ON, STATE_ON, @@ -19,7 +20,6 @@ from tests.common import ( async_mock_service, mock_restore_cache, ) -from tests.components.light import common as common_light from tests.components.switch import common @@ -897,9 +897,13 @@ async def test_flux_with_multiple_lights(hass): ) ent1, ent2, ent3 = platform.ENTITIES - common_light.turn_on(hass, entity_id=ent2.entity_id) - await hass.async_block_till_done() - common_light.turn_on(hass, entity_id=ent3.entity_id) + + await hass.services.async_call( + light.DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ent2.entity_id}, blocking=True + ) + await hass.services.async_call( + light.DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ent3.entity_id}, blocking=True + ) await hass.async_block_till_done() state = hass.states.get(ent1.entity_id) diff --git a/tests/components/group/test_light.py b/tests/components/group/test_light.py index 1f1466981b6d..94d78d628771 100644 --- a/tests/components/group/test_light.py +++ b/tests/components/group/test_light.py @@ -3,199 +3,248 @@ from unittest.mock import MagicMock import asynctest +from homeassistant.components.group import DOMAIN import homeassistant.components.group.light as group +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, + ATTR_COLOR_TEMP, + ATTR_EFFECT, + ATTR_EFFECT_LIST, + ATTR_FLASH, + ATTR_HS_COLOR, + ATTR_MAX_MIREDS, + ATTR_MIN_MIREDS, + ATTR_RGB_COLOR, + ATTR_TRANSITION, + ATTR_WHITE_VALUE, + ATTR_XY_COLOR, + DOMAIN as LIGHT_DOMAIN, + SERVICE_TOGGLE, + SERVICE_TURN_OFF, + SERVICE_TURN_ON, +) +from homeassistant.const import ( + ATTR_ENTITY_ID, + ATTR_SUPPORTED_FEATURES, + STATE_OFF, + STATE_ON, + STATE_UNAVAILABLE, +) from homeassistant.setup import async_setup_component -from tests.components.light import common - async def test_default_state(hass): """Test light group default state.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": [], "name": "Bedroom Group"}}, + LIGHT_DOMAIN, + {LIGHT_DOMAIN: {"platform": DOMAIN, "entities": [], "name": "Bedroom Group"}}, ) await hass.async_block_till_done() state = hass.states.get("light.bedroom_group") assert state is not None - assert state.state == "unavailable" - assert state.attributes["supported_features"] == 0 - assert state.attributes.get("brightness") is None - assert state.attributes.get("hs_color") is None - assert state.attributes.get("color_temp") is None - assert state.attributes.get("white_value") is None - assert state.attributes.get("effect_list") is None - assert state.attributes.get("effect") is None + assert state.state == STATE_UNAVAILABLE + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0 + assert state.attributes.get(ATTR_BRIGHTNESS) is None + assert state.attributes.get(ATTR_HS_COLOR) is None + assert state.attributes.get(ATTR_COLOR_TEMP) is None + assert state.attributes.get(ATTR_WHITE_VALUE) is None + assert state.attributes.get(ATTR_EFFECT_LIST) is None + assert state.attributes.get(ATTR_EFFECT) is None async def test_state_reporting(hass): """Test the state reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) - hass.states.async_set("light.test1", "on") - hass.states.async_set("light.test2", "unavailable") + hass.states.async_set("light.test1", STATE_ON) + hass.states.async_set("light.test2", STATE_UNAVAILABLE) await hass.async_block_till_done() - assert hass.states.get("light.light_group").state == "on" + assert hass.states.get("light.light_group").state == STATE_ON - hass.states.async_set("light.test1", "on") - hass.states.async_set("light.test2", "off") + hass.states.async_set("light.test1", STATE_ON) + hass.states.async_set("light.test2", STATE_OFF) await hass.async_block_till_done() - assert hass.states.get("light.light_group").state == "on" + assert hass.states.get("light.light_group").state == STATE_ON - hass.states.async_set("light.test1", "off") - hass.states.async_set("light.test2", "off") + hass.states.async_set("light.test1", STATE_OFF) + hass.states.async_set("light.test2", STATE_OFF) await hass.async_block_till_done() - assert hass.states.get("light.light_group").state == "off" + assert hass.states.get("light.light_group").state == STATE_OFF - hass.states.async_set("light.test1", "unavailable") - hass.states.async_set("light.test2", "unavailable") + hass.states.async_set("light.test1", STATE_UNAVAILABLE) + hass.states.async_set("light.test2", STATE_UNAVAILABLE) await hass.async_block_till_done() - assert hass.states.get("light.light_group").state == "unavailable" + assert hass.states.get("light.light_group").state == STATE_UNAVAILABLE async def test_brightness(hass): """Test brightness reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) hass.states.async_set( - "light.test1", "on", {"brightness": 255, "supported_features": 1} + "light.test1", STATE_ON, {ATTR_BRIGHTNESS: 255, ATTR_SUPPORTED_FEATURES: 1} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.state == "on" - assert state.attributes["supported_features"] == 1 - assert state.attributes["brightness"] == 255 + assert state.state == STATE_ON + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 1 + assert state.attributes[ATTR_BRIGHTNESS] == 255 hass.states.async_set( - "light.test2", "on", {"brightness": 100, "supported_features": 1} + "light.test2", STATE_ON, {ATTR_BRIGHTNESS: 100, ATTR_SUPPORTED_FEATURES: 1} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.state == "on" - assert state.attributes["brightness"] == 177 + assert state.state == STATE_ON + assert state.attributes[ATTR_BRIGHTNESS] == 177 hass.states.async_set( - "light.test1", "off", {"brightness": 255, "supported_features": 1} + "light.test1", STATE_OFF, {ATTR_BRIGHTNESS: 255, ATTR_SUPPORTED_FEATURES: 1} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.state == "on" - assert state.attributes["supported_features"] == 1 - assert state.attributes["brightness"] == 100 + assert state.state == STATE_ON + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 1 + assert state.attributes[ATTR_BRIGHTNESS] == 100 async def test_color(hass): """Test RGB reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) hass.states.async_set( - "light.test1", "on", {"hs_color": (0, 100), "supported_features": 16} + "light.test1", STATE_ON, {ATTR_HS_COLOR: (0, 100), ATTR_SUPPORTED_FEATURES: 16} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.state == "on" - assert state.attributes["supported_features"] == 16 - assert state.attributes["hs_color"] == (0, 100) + assert state.state == STATE_ON + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 16 + assert state.attributes[ATTR_HS_COLOR] == (0, 100) hass.states.async_set( - "light.test2", "on", {"hs_color": (0, 50), "supported_features": 16} + "light.test2", STATE_ON, {ATTR_HS_COLOR: (0, 50), ATTR_SUPPORTED_FEATURES: 16} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["hs_color"] == (0, 75) + assert state.attributes[ATTR_HS_COLOR] == (0, 75) hass.states.async_set( - "light.test1", "off", {"hs_color": (0, 0), "supported_features": 16} + "light.test1", STATE_OFF, {ATTR_HS_COLOR: (0, 0), ATTR_SUPPORTED_FEATURES: 16} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["hs_color"] == (0, 50) + assert state.attributes[ATTR_HS_COLOR] == (0, 50) async def test_white_value(hass): """Test white value reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) hass.states.async_set( - "light.test1", "on", {"white_value": 255, "supported_features": 128} + "light.test1", STATE_ON, {ATTR_WHITE_VALUE: 255, ATTR_SUPPORTED_FEATURES: 128} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["white_value"] == 255 + assert state.attributes[ATTR_WHITE_VALUE] == 255 hass.states.async_set( - "light.test2", "on", {"white_value": 100, "supported_features": 128} + "light.test2", STATE_ON, {ATTR_WHITE_VALUE: 100, ATTR_SUPPORTED_FEATURES: 128} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["white_value"] == 177 + assert state.attributes[ATTR_WHITE_VALUE] == 177 hass.states.async_set( - "light.test1", "off", {"white_value": 255, "supported_features": 128} + "light.test1", STATE_OFF, {ATTR_WHITE_VALUE: 255, ATTR_SUPPORTED_FEATURES: 128} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["white_value"] == 100 + assert state.attributes[ATTR_WHITE_VALUE] == 100 async def test_color_temp(hass): """Test color temp reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) hass.states.async_set( - "light.test1", "on", {"color_temp": 2, "supported_features": 2} + "light.test1", STATE_ON, {"color_temp": 2, ATTR_SUPPORTED_FEATURES: 2} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["color_temp"] == 2 + assert state.attributes[ATTR_COLOR_TEMP] == 2 hass.states.async_set( - "light.test2", "on", {"color_temp": 1000, "supported_features": 2} + "light.test2", STATE_ON, {"color_temp": 1000, ATTR_SUPPORTED_FEATURES: 2} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["color_temp"] == 501 + assert state.attributes[ATTR_COLOR_TEMP] == 501 hass.states.async_set( - "light.test1", "off", {"color_temp": 2, "supported_features": 2} + "light.test1", STATE_OFF, {"color_temp": 2, ATTR_SUPPORTED_FEATURES: 2} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["color_temp"] == 1000 + assert state.attributes[ATTR_COLOR_TEMP] == 1000 async def test_emulated_color_temp_group(hass): """Test emulated color temperature in a group.""" await async_setup_component( hass, - "light", + LIGHT_DOMAIN, { - "light": [ + LIGHT_DOMAIN: [ {"platform": "demo"}, { - "platform": "group", + "platform": DOMAIN, "entities": [ "light.bed_light", "light.ceiling_lights", @@ -207,97 +256,111 @@ async def test_emulated_color_temp_group(hass): ) await hass.async_block_till_done() - hass.states.async_set("light.bed_light", "on", {"supported_features": 2}) - await hass.async_block_till_done() - hass.states.async_set("light.ceiling_lights", "on", {"supported_features": 63}) - await hass.async_block_till_done() - hass.states.async_set("light.kitchen_lights", "on", {"supported_features": 61}) + hass.states.async_set("light.bed_light", STATE_ON, {ATTR_SUPPORTED_FEATURES: 2}) + hass.states.async_set( + "light.ceiling_lights", STATE_ON, {ATTR_SUPPORTED_FEATURES: 63} + ) + hass.states.async_set( + "light.kitchen_lights", STATE_ON, {ATTR_SUPPORTED_FEATURES: 61} + ) await hass.async_block_till_done() await hass.services.async_call( - "light", - "turn_on", - {"entity_id": "light.light_group", "color_temp": 200}, + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "light.light_group", ATTR_COLOR_TEMP: 200}, blocking=True, ) await hass.async_block_till_done() state = hass.states.get("light.bed_light") - assert state.state == "on" - assert state.attributes["color_temp"] == 200 - assert "hs_color" not in state.attributes.keys() + assert state.state == STATE_ON + assert state.attributes[ATTR_COLOR_TEMP] == 200 + assert ATTR_HS_COLOR not in state.attributes.keys() state = hass.states.get("light.ceiling_lights") - assert state.state == "on" - assert state.attributes["color_temp"] == 200 - assert "hs_color" not in state.attributes.keys() + assert state.state == STATE_ON + assert state.attributes[ATTR_COLOR_TEMP] == 200 + assert ATTR_HS_COLOR not in state.attributes.keys() state = hass.states.get("light.kitchen_lights") - assert state.state == "on" - assert state.attributes["hs_color"] == (27.001, 19.243) + assert state.state == STATE_ON + assert state.attributes[ATTR_HS_COLOR] == (27.001, 19.243) async def test_min_max_mireds(hass): """Test min/max mireds reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) - hass.states.async_set( - "light.test1", "on", {"min_mireds": 2, "max_mireds": 5, "supported_features": 2} - ) - await hass.async_block_till_done() - state = hass.states.get("light.light_group") - assert state.attributes["min_mireds"] == 2 - assert state.attributes["max_mireds"] == 5 - - hass.states.async_set( - "light.test2", - "on", - {"min_mireds": 7, "max_mireds": 1234567890, "supported_features": 2}, - ) - await hass.async_block_till_done() - state = hass.states.get("light.light_group") - assert state.attributes["min_mireds"] == 2 - assert state.attributes["max_mireds"] == 1234567890 - hass.states.async_set( "light.test1", - "off", - {"min_mireds": 1, "max_mireds": 2, "supported_features": 2}, + STATE_ON, + {ATTR_MIN_MIREDS: 2, ATTR_MAX_MIREDS: 5, ATTR_SUPPORTED_FEATURES: 2}, ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["min_mireds"] == 1 - assert state.attributes["max_mireds"] == 1234567890 + assert state.attributes[ATTR_MIN_MIREDS] == 2 + assert state.attributes[ATTR_MAX_MIREDS] == 5 + + hass.states.async_set( + "light.test2", + STATE_ON, + {ATTR_MIN_MIREDS: 7, ATTR_MAX_MIREDS: 1234567890, ATTR_SUPPORTED_FEATURES: 2}, + ) + await hass.async_block_till_done() + state = hass.states.get("light.light_group") + assert state.attributes[ATTR_MIN_MIREDS] == 2 + assert state.attributes[ATTR_MAX_MIREDS] == 1234567890 + + hass.states.async_set( + "light.test1", + STATE_OFF, + {ATTR_MIN_MIREDS: 1, ATTR_MAX_MIREDS: 2, ATTR_SUPPORTED_FEATURES: 2}, + ) + await hass.async_block_till_done() + state = hass.states.get("light.light_group") + assert state.attributes[ATTR_MIN_MIREDS] == 1 + assert state.attributes[ATTR_MAX_MIREDS] == 1234567890 async def test_effect_list(hass): """Test effect_list reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) hass.states.async_set( "light.test1", - "on", - {"effect_list": ["None", "Random", "Colorloop"], "supported_features": 4}, + STATE_ON, + {ATTR_EFFECT_LIST: ["None", "Random", "Colorloop"], ATTR_SUPPORTED_FEATURES: 4}, ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert set(state.attributes["effect_list"]) == {"None", "Random", "Colorloop"} + assert set(state.attributes[ATTR_EFFECT_LIST]) == {"None", "Random", "Colorloop"} hass.states.async_set( "light.test2", - "on", - {"effect_list": ["None", "Random", "Rainbow"], "supported_features": 4}, + STATE_ON, + {ATTR_EFFECT_LIST: ["None", "Random", "Rainbow"], ATTR_SUPPORTED_FEATURES: 4}, ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert set(state.attributes["effect_list"]) == { + assert set(state.attributes[ATTR_EFFECT_LIST]) == { "None", "Random", "Colorloop", @@ -306,12 +369,12 @@ async def test_effect_list(hass): hass.states.async_set( "light.test1", - "off", - {"effect_list": ["None", "Colorloop", "Seven"], "supported_features": 4}, + STATE_OFF, + {ATTR_EFFECT_LIST: ["None", "Colorloop", "Seven"], ATTR_SUPPORTED_FEATURES: 4}, ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert set(state.attributes["effect_list"]) == { + assert set(state.attributes[ATTR_EFFECT_LIST]) == { "None", "Random", "Colorloop", @@ -324,86 +387,91 @@ async def test_effect(hass): """Test effect reporting.""" await async_setup_component( hass, - "light", + LIGHT_DOMAIN, { - "light": { - "platform": "group", + LIGHT_DOMAIN: { + "platform": DOMAIN, "entities": ["light.test1", "light.test2", "light.test3"], } }, ) hass.states.async_set( - "light.test1", "on", {"effect": "None", "supported_features": 6} + "light.test1", STATE_ON, {ATTR_EFFECT: "None", ATTR_SUPPORTED_FEATURES: 6} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["effect"] == "None" + assert state.attributes[ATTR_EFFECT] == "None" hass.states.async_set( - "light.test2", "on", {"effect": "None", "supported_features": 6} + "light.test2", STATE_ON, {ATTR_EFFECT: "None", ATTR_SUPPORTED_FEATURES: 6} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["effect"] == "None" + assert state.attributes[ATTR_EFFECT] == "None" hass.states.async_set( - "light.test3", "on", {"effect": "Random", "supported_features": 6} + "light.test3", STATE_ON, {ATTR_EFFECT: "Random", ATTR_SUPPORTED_FEATURES: 6} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["effect"] == "None" + assert state.attributes[ATTR_EFFECT] == "None" hass.states.async_set( - "light.test1", "off", {"effect": "None", "supported_features": 6} + "light.test1", STATE_OFF, {ATTR_EFFECT: "None", ATTR_SUPPORTED_FEATURES: 6} ) hass.states.async_set( - "light.test2", "off", {"effect": "None", "supported_features": 6} + "light.test2", STATE_OFF, {ATTR_EFFECT: "None", ATTR_SUPPORTED_FEATURES: 6} ) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["effect"] == "Random" + assert state.attributes[ATTR_EFFECT] == "Random" async def test_supported_features(hass): """Test supported features reporting.""" await async_setup_component( hass, - "light", - {"light": {"platform": "group", "entities": ["light.test1", "light.test2"]}}, + LIGHT_DOMAIN, + { + LIGHT_DOMAIN: { + "platform": DOMAIN, + "entities": ["light.test1", "light.test2"], + } + }, ) - hass.states.async_set("light.test1", "on", {"supported_features": 0}) + hass.states.async_set("light.test1", STATE_ON, {ATTR_SUPPORTED_FEATURES: 0}) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["supported_features"] == 0 + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0 - hass.states.async_set("light.test2", "on", {"supported_features": 2}) + hass.states.async_set("light.test2", STATE_ON, {ATTR_SUPPORTED_FEATURES: 2}) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["supported_features"] == 2 + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 2 - hass.states.async_set("light.test1", "off", {"supported_features": 41}) + hass.states.async_set("light.test1", STATE_OFF, {ATTR_SUPPORTED_FEATURES: 41}) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["supported_features"] == 43 + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 43 - hass.states.async_set("light.test2", "off", {"supported_features": 256}) + hass.states.async_set("light.test2", STATE_OFF, {ATTR_SUPPORTED_FEATURES: 256}) await hass.async_block_till_done() state = hass.states.get("light.light_group") - assert state.attributes["supported_features"] == 41 + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 41 async def test_service_calls(hass): """Test service calls.""" await async_setup_component( hass, - "light", + LIGHT_DOMAIN, { - "light": [ + LIGHT_DOMAIN: [ {"platform": "demo"}, { - "platform": "group", + "platform": DOMAIN, "entities": [ "light.bed_light", "light.ceiling_lights", @@ -415,50 +483,69 @@ async def test_service_calls(hass): ) await hass.async_block_till_done() - assert hass.states.get("light.light_group").state == "on" - await common.async_toggle(hass, "light.light_group") + assert hass.states.get("light.light_group").state == STATE_ON + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TOGGLE, + {ATTR_ENTITY_ID: "light.light_group"}, + blocking=True, + ) - assert hass.states.get("light.bed_light").state == "off" - assert hass.states.get("light.ceiling_lights").state == "off" - assert hass.states.get("light.kitchen_lights").state == "off" + assert hass.states.get("light.bed_light").state == STATE_OFF + assert hass.states.get("light.ceiling_lights").state == STATE_OFF + assert hass.states.get("light.kitchen_lights").state == STATE_OFF - await common.async_turn_on(hass, "light.light_group") + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "light.light_group"}, + blocking=True, + ) - assert hass.states.get("light.bed_light").state == "on" - assert hass.states.get("light.ceiling_lights").state == "on" - assert hass.states.get("light.kitchen_lights").state == "on" + assert hass.states.get("light.bed_light").state == STATE_ON + assert hass.states.get("light.ceiling_lights").state == STATE_ON + assert hass.states.get("light.kitchen_lights").state == STATE_ON - await common.async_turn_off(hass, "light.light_group") + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: "light.light_group"}, + blocking=True, + ) - assert hass.states.get("light.bed_light").state == "off" - assert hass.states.get("light.ceiling_lights").state == "off" - assert hass.states.get("light.kitchen_lights").state == "off" + assert hass.states.get("light.bed_light").state == STATE_OFF + assert hass.states.get("light.ceiling_lights").state == STATE_OFF + assert hass.states.get("light.kitchen_lights").state == STATE_OFF - await common.async_turn_on( - hass, - "light.light_group", - brightness=128, - effect="Random", - rgb_color=(42, 255, 255), + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: "light.light_group", + ATTR_BRIGHTNESS: 128, + ATTR_EFFECT: "Random", + ATTR_RGB_COLOR: (42, 255, 255), + }, + blocking=True, ) state = hass.states.get("light.bed_light") - assert state.state == "on" - assert state.attributes["brightness"] == 128 - assert state.attributes["effect"] == "Random" - assert state.attributes["rgb_color"] == (42, 255, 255) + assert state.state == STATE_ON + assert state.attributes[ATTR_BRIGHTNESS] == 128 + assert state.attributes[ATTR_EFFECT] == "Random" + assert state.attributes[ATTR_RGB_COLOR] == (42, 255, 255) state = hass.states.get("light.ceiling_lights") - assert state.state == "on" - assert state.attributes["brightness"] == 128 - assert state.attributes["effect"] == "Random" - assert state.attributes["rgb_color"] == (42, 255, 255) + assert state.state == STATE_ON + assert state.attributes[ATTR_BRIGHTNESS] == 128 + assert state.attributes[ATTR_EFFECT] == "Random" + assert state.attributes[ATTR_RGB_COLOR] == (42, 255, 255) state = hass.states.get("light.kitchen_lights") - assert state.state == "on" - assert state.attributes["brightness"] == 128 - assert state.attributes["effect"] == "Random" - assert state.attributes["rgb_color"] == (42, 255, 255) + assert state.state == STATE_ON + assert state.attributes[ATTR_BRIGHTNESS] == 128 + assert state.attributes[ATTR_EFFECT] == "Random" + assert state.attributes[ATTR_RGB_COLOR] == (42, 255, 255) async def test_invalid_service_calls(hass): @@ -474,27 +561,33 @@ async def test_invalid_service_calls(hass): with asynctest.patch.object(hass.services, "async_call") as mock_call: await grouped_light.async_turn_on(brightness=150, four_oh_four="404") - data = {"entity_id": ["light.test1", "light.test2"], "brightness": 150} - mock_call.assert_called_once_with("light", "turn_on", data, blocking=True) + data = {ATTR_ENTITY_ID: ["light.test1", "light.test2"], ATTR_BRIGHTNESS: 150} + mock_call.assert_called_once_with( + LIGHT_DOMAIN, SERVICE_TURN_ON, data, blocking=True + ) mock_call.reset_mock() await grouped_light.async_turn_off(transition=4, four_oh_four="404") - data = {"entity_id": ["light.test1", "light.test2"], "transition": 4} - mock_call.assert_called_once_with("light", "turn_off", data, blocking=True) + data = {ATTR_ENTITY_ID: ["light.test1", "light.test2"], ATTR_TRANSITION: 4} + mock_call.assert_called_once_with( + LIGHT_DOMAIN, SERVICE_TURN_OFF, data, blocking=True + ) mock_call.reset_mock() data = { - "brightness": 150, - "xy_color": (0.5, 0.42), - "rgb_color": (80, 120, 50), - "color_temp": 1234, - "white_value": 1, - "effect": "Sunshine", - "transition": 4, - "flash": "long", + ATTR_BRIGHTNESS: 150, + ATTR_XY_COLOR: (0.5, 0.42), + ATTR_RGB_COLOR: (80, 120, 50), + ATTR_COLOR_TEMP: 1234, + ATTR_WHITE_VALUE: 1, + ATTR_EFFECT: "Sunshine", + ATTR_TRANSITION: 4, + ATTR_FLASH: "long", } await grouped_light.async_turn_on(**data) - data["entity_id"] = ["light.test1", "light.test2"] - data.pop("rgb_color") - data.pop("xy_color") - mock_call.assert_called_once_with("light", "turn_on", data, blocking=True) + data[ATTR_ENTITY_ID] = ["light.test1", "light.test2"] + data.pop(ATTR_RGB_COLOR) + data.pop(ATTR_XY_COLOR) + mock_call.assert_called_once_with( + LIGHT_DOMAIN, SERVICE_TURN_ON, data, blocking=True + ) From 2239f2f7323d982b5853bd612d90901aab0ef78a Mon Sep 17 00:00:00 2001 From: Julien Brochet <556303+aerialls@users.noreply.github.com> Date: Mon, 13 Apr 2020 19:11:20 +0200 Subject: [PATCH 372/653] feat(synology-srm): update to latest version and improve errors (#34144) --- homeassistant/components/synology_srm/__init__.py | 2 +- homeassistant/components/synology_srm/device_tracker.py | 6 +++++- homeassistant/components/synology_srm/manifest.json | 2 +- requirements_all.txt | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/synology_srm/__init__.py b/homeassistant/components/synology_srm/__init__.py index cd77bce10145..72fd0c178214 100644 --- a/homeassistant/components/synology_srm/__init__.py +++ b/homeassistant/components/synology_srm/__init__.py @@ -1 +1 @@ -"""The synology_srm component.""" +"""The Synology SRM component.""" diff --git a/homeassistant/components/synology_srm/device_tracker.py b/homeassistant/components/synology_srm/device_tracker.py index af7a3ea5f632..55f455ad7ccf 100644 --- a/homeassistant/components/synology_srm/device_tracker.py +++ b/homeassistant/components/synology_srm/device_tracker.py @@ -132,7 +132,11 @@ class SynologySrmDeviceScanner(DeviceScanner): """Check the router for connected devices.""" _LOGGER.debug("Scanning for connected devices") - self.devices = self.client.core.network_nsm_device({"is_online": True}) + try: + self.devices = self.client.core.get_network_nsm_device({"is_online": True}) + except synology_srm.http.SynologyException as ex: + _LOGGER.error("Error with the Synology SRM: %s", ex) + return False _LOGGER.debug("Found %d device(s) connected to the router", len(self.devices)) diff --git a/homeassistant/components/synology_srm/manifest.json b/homeassistant/components/synology_srm/manifest.json index d92759e5eec3..798d7e7ef82c 100644 --- a/homeassistant/components/synology_srm/manifest.json +++ b/homeassistant/components/synology_srm/manifest.json @@ -2,6 +2,6 @@ "domain": "synology_srm", "name": "Synology SRM", "documentation": "https://www.home-assistant.io/integrations/synology_srm", - "requirements": ["synology-srm==0.0.7"], + "requirements": ["synology-srm==0.2.0"], "codeowners": ["@aerialls"] } diff --git a/requirements_all.txt b/requirements_all.txt index 39b9d1efc5fd..25d76e07c668 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1987,7 +1987,7 @@ surepy==0.2.3 swisshydrodata==0.0.3 # homeassistant.components.synology_srm -synology-srm==0.0.7 +synology-srm==0.2.0 # homeassistant.components.tahoma tahoma-api==0.0.16 From 7bd6f5413d51912780fdc9152500296d99681f49 Mon Sep 17 00:00:00 2001 From: Robert Chmielowiec Date: Mon, 13 Apr 2020 19:30:20 +0200 Subject: [PATCH 373/653] Add flash light device actions (#33689) * Add flash light device actions * Single action with extra fields * Change extra_fields to dictionary --- homeassistant/components/light/__init__.py | 8 +- .../components/light/device_action.py | 52 ++++++--- homeassistant/components/light/strings.json | 3 +- tests/components/light/test_device_action.py | 106 +++++++++++++++++- 4 files changed, 145 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 4a960a6c884c..7005fce63ccb 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -87,6 +87,7 @@ VALID_BRIGHTNESS = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)) VALID_BRIGHTNESS_PCT = vol.All(vol.Coerce(float), vol.Range(min=0, max=100)) VALID_BRIGHTNESS_STEP = vol.All(vol.Coerce(int), vol.Clamp(min=-255, max=255)) VALID_BRIGHTNESS_STEP_PCT = vol.All(vol.Coerce(float), vol.Clamp(min=-100, max=100)) +VALID_FLASH = vol.In([FLASH_SHORT, FLASH_LONG]) LIGHT_TURN_ON_SCHEMA = { vol.Exclusive(ATTR_PROFILE, COLOR_GROUP): cv.string, @@ -116,7 +117,7 @@ LIGHT_TURN_ON_SCHEMA = { ), vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): vol.All(vol.Coerce(int), vol.Range(min=0)), ATTR_WHITE_VALUE: vol.All(vol.Coerce(int), vol.Range(min=0, max=255)), - ATTR_FLASH: vol.In([FLASH_SHORT, FLASH_LONG]), + ATTR_FLASH: VALID_FLASH, ATTR_EFFECT: cv.string, } @@ -252,10 +253,7 @@ async def async_setup(hass, config): component.async_register_entity_service( SERVICE_TURN_OFF, - { - ATTR_TRANSITION: VALID_TRANSITION, - ATTR_FLASH: vol.In([FLASH_SHORT, FLASH_LONG]), - }, + {ATTR_TRANSITION: VALID_TRANSITION, ATTR_FLASH: VALID_FLASH}, "async_turn_off", ) diff --git a/homeassistant/components/light/device_action.py b/homeassistant/components/light/device_action.py index 5c534cc4150d..d499bc0c2a27 100644 --- a/homeassistant/components/light/device_action.py +++ b/homeassistant/components/light/device_action.py @@ -4,6 +4,13 @@ from typing import List import voluptuous as vol from homeassistant.components.device_automation import toggle_entity +from homeassistant.components.light import ( + ATTR_FLASH, + FLASH_SHORT, + SUPPORT_FLASH, + VALID_BRIGHTNESS_PCT, + VALID_FLASH, +) from homeassistant.const import ( ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, @@ -19,6 +26,7 @@ from . import ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS_STEP_PCT, DOMAIN, SUPPORT_BRI TYPE_BRIGHTNESS_INCREASE = "brightness_increase" TYPE_BRIGHTNESS_DECREASE = "brightness_decrease" +TYPE_FLASH = "flash" ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { @@ -26,11 +34,10 @@ ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( vol.Required(CONF_DOMAIN): DOMAIN, vol.Required(CONF_TYPE): vol.In( toggle_entity.DEVICE_ACTION_TYPES - + [TYPE_BRIGHTNESS_INCREASE, TYPE_BRIGHTNESS_DECREASE] - ), - vol.Optional(ATTR_BRIGHTNESS_PCT): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + + [TYPE_BRIGHTNESS_INCREASE, TYPE_BRIGHTNESS_DECREASE, TYPE_FLASH] ), + vol.Optional(ATTR_BRIGHTNESS_PCT): VALID_BRIGHTNESS_PCT, + vol.Optional(ATTR_FLASH): VALID_FLASH, } ) @@ -60,6 +67,12 @@ async def async_call_action_from_config( elif ATTR_BRIGHTNESS_PCT in config: data[ATTR_BRIGHTNESS_PCT] = config[ATTR_BRIGHTNESS_PCT] + if config[CONF_TYPE] == TYPE_FLASH: + if ATTR_FLASH in config: + data[ATTR_FLASH] = config[ATTR_FLASH] + else: + data[ATTR_FLASH] = FLASH_SHORT + await hass.services.async_call( DOMAIN, SERVICE_TURN_ON, data, blocking=True, context=context ) @@ -100,6 +113,18 @@ async def async_get_actions(hass: HomeAssistant, device_id: str) -> List[dict]: ) ) + if supported_features & SUPPORT_FLASH: + actions.extend( + ( + { + CONF_TYPE: TYPE_FLASH, + "device_id": device_id, + "entity_id": entry.entity_id, + "domain": DOMAIN, + }, + ) + ) + return actions @@ -119,15 +144,12 @@ async def async_get_action_capabilities(hass: HomeAssistant, config: dict) -> di elif entry: supported_features = entry.supported_features - if not supported_features & SUPPORT_BRIGHTNESS: - return {} + extra_fields = {} - return { - "extra_fields": vol.Schema( - { - vol.Optional(ATTR_BRIGHTNESS_PCT): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) - ) - } - ) - } + if supported_features & SUPPORT_BRIGHTNESS: + extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT + + if supported_features & SUPPORT_FLASH: + extra_fields[vol.Optional(ATTR_FLASH)] = VALID_FLASH + + return {"extra_fields": vol.Schema(extra_fields)} if extra_fields else {} diff --git a/homeassistant/components/light/strings.json b/homeassistant/components/light/strings.json index 922a4957afd7..fc089e64b36f 100644 --- a/homeassistant/components/light/strings.json +++ b/homeassistant/components/light/strings.json @@ -5,7 +5,8 @@ "brightness_increase": "Increase {entity_name} brightness", "toggle": "Toggle {entity_name}", "turn_on": "Turn on {entity_name}", - "turn_off": "Turn off {entity_name}" + "turn_off": "Turn off {entity_name}", + "flash": "Flash {entity_name}" }, "condition_type": { "is_on": "{entity_name} is on", diff --git a/tests/components/light/test_device_action.py b/tests/components/light/test_device_action.py index 6cddfc157441..116aff4ee78c 100644 --- a/tests/components/light/test_device_action.py +++ b/tests/components/light/test_device_action.py @@ -2,7 +2,13 @@ import pytest import homeassistant.components.automation as automation -from homeassistant.components.light import DOMAIN, SUPPORT_BRIGHTNESS +from homeassistant.components.light import ( + DOMAIN, + FLASH_LONG, + FLASH_SHORT, + SUPPORT_BRIGHTNESS, + SUPPORT_FLASH, +) from homeassistant.const import CONF_PLATFORM, STATE_OFF, STATE_ON from homeassistant.helpers import device_registry from homeassistant.setup import async_setup_component @@ -48,7 +54,7 @@ async def test_get_actions(hass, device_reg, entity_reg): "test", "5678", device_id=device_entry.id, - supported_features=SUPPORT_BRIGHTNESS, + supported_features=SUPPORT_BRIGHTNESS | SUPPORT_FLASH, ) expected_actions = [ { @@ -81,6 +87,12 @@ async def test_get_actions(hass, device_reg, entity_reg): "device_id": device_entry.id, "entity_id": f"{DOMAIN}.test_5678", }, + { + "domain": DOMAIN, + "type": "flash", + "device_id": device_entry.id, + "entity_id": f"{DOMAIN}.test_5678", + }, ] actions = await async_get_device_automations(hass, "action", device_entry.id) assert actions == expected_actions @@ -128,7 +140,7 @@ async def test_get_action_capabilities_brightness(hass, device_reg, entity_reg): { "name": "brightness_pct", "optional": True, - "type": "integer", + "type": "float", "valueMax": 100, "valueMin": 0, } @@ -146,6 +158,45 @@ async def test_get_action_capabilities_brightness(hass, device_reg, entity_reg): assert capabilities == {"extra_fields": []} +async def test_get_action_capabilities_flash(hass, device_reg, entity_reg): + """Test we get the expected capabilities from a light action.""" + config_entry = MockConfigEntry(domain="test", data={}) + config_entry.add_to_hass(hass) + device_entry = device_reg.async_get_or_create( + config_entry_id=config_entry.entry_id, + connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")}, + ) + entity_reg.async_get_or_create( + DOMAIN, + "test", + "5678", + device_id=device_entry.id, + supported_features=SUPPORT_FLASH, + ) + + expected_capabilities = { + "extra_fields": [ + { + "name": "flash", + "optional": True, + "type": "select", + "options": [("short", "short"), ("long", "long")], + } + ] + } + + actions = await async_get_device_automations(hass, "action", device_entry.id) + assert len(actions) == 4 + for action in actions: + capabilities = await async_get_device_automation_capabilities( + hass, "action", action + ) + if action["type"] == "turn_on": + assert capabilities == expected_capabilities + else: + assert capabilities == {"extra_fields": []} + + async def test_action(hass, calls): """Test for turn_on and turn_off actions.""" platform = getattr(hass.components, f"test.{DOMAIN}") @@ -187,6 +238,25 @@ async def test_action(hass, calls): "type": "toggle", }, }, + { + "trigger": {"platform": "event", "event_type": "test_flash_short"}, + "action": { + "domain": DOMAIN, + "device_id": "", + "entity_id": ent1.entity_id, + "type": "flash", + }, + }, + { + "trigger": {"platform": "event", "event_type": "test_flash_long"}, + "action": { + "domain": DOMAIN, + "device_id": "", + "entity_id": ent1.entity_id, + "type": "flash", + "flash": "long", + }, + }, { "trigger": { "platform": "event", @@ -252,6 +322,22 @@ async def test_action(hass, calls): await hass.async_block_till_done() assert hass.states.get(ent1.entity_id).state == STATE_ON + hass.bus.async_fire("test_toggle") + await hass.async_block_till_done() + assert hass.states.get(ent1.entity_id).state == STATE_OFF + + hass.bus.async_fire("test_flash_short") + await hass.async_block_till_done() + assert hass.states.get(ent1.entity_id).state == STATE_ON + + hass.bus.async_fire("test_toggle") + await hass.async_block_till_done() + assert hass.states.get(ent1.entity_id).state == STATE_OFF + + hass.bus.async_fire("test_flash_long") + await hass.async_block_till_done() + assert hass.states.get(ent1.entity_id).state == STATE_ON + turn_on_calls = async_mock_service(hass, DOMAIN, "turn_on") hass.bus.async_fire("test_brightness_increase") @@ -281,3 +367,17 @@ async def test_action(hass, calls): assert len(turn_on_calls) == 4 assert turn_on_calls[3].data["entity_id"] == ent1.entity_id assert "brightness_pct" not in turn_on_calls[3].data + + hass.bus.async_fire("test_flash_short") + await hass.async_block_till_done() + + assert len(turn_on_calls) == 5 + assert turn_on_calls[4].data["entity_id"] == ent1.entity_id + assert turn_on_calls[4].data["flash"] == FLASH_SHORT + + hass.bus.async_fire("test_flash_long") + await hass.async_block_till_done() + + assert len(turn_on_calls) == 6 + assert turn_on_calls[5].data["entity_id"] == ent1.entity_id + assert turn_on_calls[5].data["flash"] == FLASH_LONG From 6924192523fcb02f3f22f17d70eb11fceb0ace85 Mon Sep 17 00:00:00 2001 From: jrester <31157644+jrester@users.noreply.github.com> Date: Mon, 13 Apr 2020 21:59:50 +0200 Subject: [PATCH 374/653] Use updated powerwall client API library (#34139) * Use updated powerwall client API library * Increase instant_power precision to 3 * Add @jrester as code owner for powerwall --- CODEOWNERS | 2 +- .../components/powerwall/__init__.py | 28 ++++----- .../components/powerwall/binary_sensor.py | 24 +++----- .../components/powerwall/config_flow.py | 16 ++---- homeassistant/components/powerwall/entity.py | 30 +++------- .../components/powerwall/manifest.json | 4 +- homeassistant/components/powerwall/sensor.py | 21 ++++--- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/powerwall/mocks.py | 57 +++++++++++++------ .../powerwall/test_binary_sensor.py | 4 +- .../components/powerwall/test_config_flow.py | 23 +++----- tests/components/powerwall/test_sensor.py | 8 +-- 13 files changed, 104 insertions(+), 117 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index e13573aa7748..dd33491e2b4f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -292,7 +292,7 @@ homeassistant/components/plex/* @jjlawren homeassistant/components/plugwise/* @laetificat @CoMPaTech @bouwew homeassistant/components/plum_lightpad/* @ColinHarrington homeassistant/components/point/* @fredrike -homeassistant/components/powerwall/* @bdraco +homeassistant/components/powerwall/* @bdraco @jrester homeassistant/components/proxmoxve/* @k4ds3 homeassistant/components/ps4/* @ktnrg45 homeassistant/components/ptvsd/* @swamp-ig diff --git a/homeassistant/components/powerwall/__init__.py b/homeassistant/components/powerwall/__init__.py index d5c7a534180d..57ae6f0e2608 100644 --- a/homeassistant/components/powerwall/__init__.py +++ b/homeassistant/components/powerwall/__init__.py @@ -4,12 +4,7 @@ from datetime import timedelta import logging import requests -from tesla_powerwall import ( - ApiError, - MetersResponse, - PowerWall, - PowerWallUnreachableError, -) +from tesla_powerwall import ApiError, Powerwall, PowerwallUnreachableError import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry @@ -67,10 +62,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): hass.data[DOMAIN].setdefault(entry_id, {}) http_session = requests.Session() - power_wall = PowerWall(entry.data[CONF_IP_ADDRESS], http_session=http_session) + power_wall = Powerwall(entry.data[CONF_IP_ADDRESS], http_session=http_session) try: powerwall_data = await hass.async_add_executor_job(call_base_info, power_wall) - except (PowerWallUnreachableError, ApiError, ConnectionError): + except (PowerwallUnreachableError, ApiError, ConnectionError): http_session.close() raise ConfigEntryNotReady @@ -108,22 +103,19 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): def call_base_info(power_wall): """Wrap powerwall properties to be a callable.""" return { - POWERWALL_API_SITE_INFO: power_wall.site_info, - POWERWALL_API_STATUS: power_wall.status, - POWERWALL_API_DEVICE_TYPE: power_wall.device_type, + POWERWALL_API_SITE_INFO: power_wall.get_site_info(), + POWERWALL_API_STATUS: power_wall.get_status(), + POWERWALL_API_DEVICE_TYPE: power_wall.get_device_type(), } def _fetch_powerwall_data(power_wall): """Process and update powerwall data.""" - meters = power_wall.meters return { - POWERWALL_API_CHARGE: power_wall.charge, - POWERWALL_API_SITEMASTER: power_wall.sitemaster, - POWERWALL_API_METERS: { - meter: MetersResponse(meters[meter]) for meter in meters - }, - POWERWALL_API_GRID_STATUS: power_wall.grid_status, + POWERWALL_API_CHARGE: power_wall.get_charge(), + POWERWALL_API_SITEMASTER: power_wall.get_sitemaster(), + POWERWALL_API_METERS: power_wall.get_meters(), + POWERWALL_API_GRID_STATUS: power_wall.get_grid_status(), } diff --git a/homeassistant/components/powerwall/binary_sensor.py b/homeassistant/components/powerwall/binary_sensor.py index 3b73caecacd8..f088a257574a 100644 --- a/homeassistant/components/powerwall/binary_sensor.py +++ b/homeassistant/components/powerwall/binary_sensor.py @@ -1,6 +1,8 @@ """Support for August sensors.""" import logging +from tesla_powerwall import GridStatus + from homeassistant.components.binary_sensor import ( DEVICE_CLASS_CONNECTIVITY, BinarySensorDevice, @@ -17,13 +19,7 @@ from .const import ( POWERWALL_API_SITE_INFO, POWERWALL_API_SITEMASTER, POWERWALL_API_STATUS, - POWERWALL_CONNECTED_KEY, POWERWALL_COORDINATOR, - POWERWALL_GRID_ONLINE, - POWERWALL_RUNNING_KEY, - SITE_INFO_GRID_CODE, - SITE_INFO_NOMINAL_SYSTEM_POWER_KW, - SITE_INFO_REGION, ) from .entity import PowerWallEntity @@ -71,17 +67,15 @@ class PowerWallRunningSensor(PowerWallEntity, BinarySensorDevice): @property def is_on(self): """Get the powerwall running state.""" - return self._coordinator.data[POWERWALL_API_SITEMASTER][POWERWALL_RUNNING_KEY] + return self._coordinator.data[POWERWALL_API_SITEMASTER].running @property def device_state_attributes(self): """Return the device specific state attributes.""" return { - ATTR_REGION: self._site_info[SITE_INFO_REGION], - ATTR_GRID_CODE: self._site_info[SITE_INFO_GRID_CODE], - ATTR_NOMINAL_SYSTEM_POWER: self._site_info[ - SITE_INFO_NOMINAL_SYSTEM_POWER_KW - ], + ATTR_REGION: self._site_info.region, + ATTR_GRID_CODE: self._site_info.grid_code, + ATTR_NOMINAL_SYSTEM_POWER: self._site_info.nominal_system_power_kW, } @@ -106,7 +100,7 @@ class PowerWallConnectedSensor(PowerWallEntity, BinarySensorDevice): @property def is_on(self): """Get the powerwall connected to tesla state.""" - return self._coordinator.data[POWERWALL_API_SITEMASTER][POWERWALL_CONNECTED_KEY] + return self._coordinator.data[POWERWALL_API_SITEMASTER].connected_to_tesla class PowerWallGridStatusSensor(PowerWallEntity, BinarySensorDevice): @@ -130,6 +124,4 @@ class PowerWallGridStatusSensor(PowerWallEntity, BinarySensorDevice): @property def is_on(self): """Grid is online.""" - return ( - self._coordinator.data[POWERWALL_API_GRID_STATUS] == POWERWALL_GRID_ONLINE - ) + return self._coordinator.data[POWERWALL_API_GRID_STATUS] == GridStatus.CONNECTED diff --git a/homeassistant/components/powerwall/config_flow.py b/homeassistant/components/powerwall/config_flow.py index 7e1b3eb3fb1c..403075989e9b 100644 --- a/homeassistant/components/powerwall/config_flow.py +++ b/homeassistant/components/powerwall/config_flow.py @@ -1,14 +1,13 @@ """Config flow for Tesla Powerwall integration.""" import logging -from tesla_powerwall import ApiError, PowerWall, PowerWallUnreachableError +from tesla_powerwall import ApiError, Powerwall, PowerwallUnreachableError import voluptuous as vol from homeassistant import config_entries, core, exceptions from homeassistant.const import CONF_IP_ADDRESS from .const import DOMAIN # pylint:disable=unused-import -from .const import POWERWALL_SITE_NAME _LOGGER = logging.getLogger(__name__) @@ -21,20 +20,15 @@ async def validate_input(hass: core.HomeAssistant, data): Data has the keys from DATA_SCHEMA with values provided by the user. """ - power_wall = PowerWall(data[CONF_IP_ADDRESS]) + power_wall = Powerwall(data[CONF_IP_ADDRESS]) try: - site_info = await hass.async_add_executor_job(call_site_info, power_wall) - except (PowerWallUnreachableError, ApiError, ConnectionError): + site_info = await hass.async_add_executor_job(power_wall.get_site_info) + except (PowerwallUnreachableError, ApiError, ConnectionError): raise CannotConnect # Return info that you want to store in the config entry. - return {"title": site_info[POWERWALL_SITE_NAME]} - - -def call_site_info(power_wall): - """Wrap site_info to be a callable.""" - return power_wall.site_info + return {"title": site_info.site_name} class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/powerwall/entity.py b/homeassistant/components/powerwall/entity.py index c09a1aca6120..9e09ed06c4b9 100644 --- a/homeassistant/components/powerwall/entity.py +++ b/homeassistant/components/powerwall/entity.py @@ -2,17 +2,7 @@ from homeassistant.helpers.entity import Entity -from .const import ( - DEVICE_TYPE_DEVICE_TYPE, - DOMAIN, - MANUFACTURER, - MODEL, - POWERWALL_SITE_NAME, - SITE_INFO_GRID_CODE, - SITE_INFO_NOMINAL_SYSTEM_ENERGY_KWH, - SITE_INFO_UTILITY, - STATUS_VERSION, -) +from .const import DOMAIN, MANUFACTURER, MODEL class PowerWallEntity(Entity): @@ -23,13 +13,13 @@ class PowerWallEntity(Entity): super().__init__() self._coordinator = coordinator self._site_info = site_info - self._device_type = device_type.get(DEVICE_TYPE_DEVICE_TYPE) - self._version = status.get(STATUS_VERSION) + self._device_type = device_type + self._version = status.version # This group of properties will be unique to to the site unique_group = ( - site_info[SITE_INFO_UTILITY], - site_info[SITE_INFO_GRID_CODE], - str(site_info[SITE_INFO_NOMINAL_SYSTEM_ENERGY_KWH]), + site_info.utility, + site_info.grid_code, + str(site_info.nominal_system_energy_kWh), ) self.base_unique_id = "_".join(unique_group) @@ -38,15 +28,13 @@ class PowerWallEntity(Entity): """Powerwall device info.""" device_info = { "identifiers": {(DOMAIN, self.base_unique_id)}, - "name": self._site_info[POWERWALL_SITE_NAME], + "name": self._site_info.site_name, "manufacturer": MANUFACTURER, } model = MODEL - if self._device_type: - model += f" ({self._device_type})" + model += f" ({self._device_type.name})" device_info["model"] = model - if self._version: - device_info["sw_version"] = self._version + device_info["sw_version"] = self._version return device_info @property diff --git a/homeassistant/components/powerwall/manifest.json b/homeassistant/components/powerwall/manifest.json index 9a302fbcad17..de9da698c7c0 100644 --- a/homeassistant/components/powerwall/manifest.json +++ b/homeassistant/components/powerwall/manifest.json @@ -3,6 +3,6 @@ "name": "Tesla Powerwall", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/powerwall", - "requirements": ["tesla-powerwall==0.1.3"], - "codeowners": ["@bdraco"] + "requirements": ["tesla-powerwall==0.2.3"], + "codeowners": ["@bdraco", "@jrester"] } diff --git a/homeassistant/components/powerwall/sensor.py b/homeassistant/components/powerwall/sensor.py index 72dbd38a4188..3b3d3b9cd32a 100644 --- a/homeassistant/components/powerwall/sensor.py +++ b/homeassistant/components/powerwall/sensor.py @@ -1,6 +1,8 @@ """Support for August sensors.""" import logging +from tesla_powerwall import MeterType + from homeassistant.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_POWER, @@ -37,7 +39,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): status = powerwall_data[POWERWALL_API_STATUS] entities = [] - for meter in coordinator.data[POWERWALL_API_METERS]: + for meter in MeterType: entities.append( PowerWallEnergySensor(meter, coordinator, site_info, status, device_type) ) @@ -73,13 +75,13 @@ class PowerWallChargeSensor(PowerWallEntity): @property def state(self): """Get the current value in percentage.""" - return round(self._coordinator.data[POWERWALL_API_CHARGE], 3) + return self._coordinator.data[POWERWALL_API_CHARGE] class PowerWallEnergySensor(PowerWallEntity): """Representation of an Powerwall Energy sensor.""" - def __init__(self, meter, coordinator, site_info, status, device_type): + def __init__(self, meter: MeterType, coordinator, site_info, status, device_type): """Initialize the sensor.""" super().__init__(coordinator, site_info, status, device_type) self._meter = meter @@ -92,7 +94,7 @@ class PowerWallEnergySensor(PowerWallEntity): @property def name(self): """Device Name.""" - return f"Powerwall {self._meter.title()} Now" + return f"Powerwall {self._meter.value.title()} Now" @property def device_class(self): @@ -102,18 +104,21 @@ class PowerWallEnergySensor(PowerWallEntity): @property def unique_id(self): """Device Uniqueid.""" - return f"{self.base_unique_id}_{self._meter}_instant_power" + return f"{self.base_unique_id}_{self._meter.value}_instant_power" @property def state(self): """Get the current value in kW.""" - meter = self._coordinator.data[POWERWALL_API_METERS][self._meter] - return round(float(meter.instant_power / 1000), 3) + return ( + self._coordinator.data[POWERWALL_API_METERS] + .get(self._meter) + .get_power(precision=3) + ) @property def device_state_attributes(self): """Return the device specific state attributes.""" - meter = self._coordinator.data[POWERWALL_API_METERS][self._meter] + meter = self._coordinator.data[POWERWALL_API_METERS].get(self._meter) return { ATTR_FREQUENCY: meter.frequency, ATTR_ENERGY_EXPORTED: meter.energy_exported, diff --git a/requirements_all.txt b/requirements_all.txt index 25d76e07c668..c05a5c178ec1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2017,7 +2017,7 @@ temperusb==1.5.3 # tensorflow==1.13.2 # homeassistant.components.powerwall -tesla-powerwall==0.1.3 +tesla-powerwall==0.2.3 # homeassistant.components.tesla teslajsonpy==0.6.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5c9c69c3efbf..bf7ffbc4d97e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -753,7 +753,7 @@ sunwatcher==0.2.1 tellduslive==0.10.10 # homeassistant.components.powerwall -tesla-powerwall==0.1.3 +tesla-powerwall==0.2.3 # homeassistant.components.tesla teslajsonpy==0.6.0 diff --git a/tests/components/powerwall/mocks.py b/tests/components/powerwall/mocks.py index aba6ecfeb234..afe9e1303795 100644 --- a/tests/components/powerwall/mocks.py +++ b/tests/components/powerwall/mocks.py @@ -3,7 +3,16 @@ import json import os -from asynctest import MagicMock, PropertyMock +from asynctest import MagicMock, Mock +from tesla_powerwall import ( + DeviceType, + GridStatus, + MetersAggregateResponse, + Powerwall, + PowerwallStatusResponse, + SiteInfoResponse, + SitemasterResponse, +) from homeassistant.components.powerwall.const import DOMAIN from homeassistant.const import CONF_IP_ADDRESS @@ -20,13 +29,13 @@ async def _mock_powerwall_with_fixtures(hass): device_type = await _async_load_json_fixture(hass, "device_type.json") return _mock_powerwall_return_value( - site_info=site_info, - charge=47.31993232, - sitemaster=sitemaster, - meters=meters, - grid_status="SystemGridConnected", - status=status, - device_type=device_type, + site_info=SiteInfoResponse(site_info), + charge=47, + sitemaster=SitemasterResponse(sitemaster), + meters=MetersAggregateResponse(meters), + grid_status=GridStatus.CONNECTED, + status=PowerwallStatusResponse(status), + device_type=DeviceType(device_type["device_type"]), ) @@ -39,21 +48,33 @@ def _mock_powerwall_return_value( status=None, device_type=None, ): - powerwall_mock = MagicMock() - type(powerwall_mock).site_info = PropertyMock(return_value=site_info) - type(powerwall_mock).charge = PropertyMock(return_value=charge) - type(powerwall_mock).sitemaster = PropertyMock(return_value=sitemaster) - type(powerwall_mock).meters = PropertyMock(return_value=meters) - type(powerwall_mock).grid_status = PropertyMock(return_value=grid_status) - type(powerwall_mock).status = PropertyMock(return_value=status) - type(powerwall_mock).device_type = PropertyMock(return_value=device_type) + powerwall_mock = MagicMock(Powerwall("1.2.3.4")) + powerwall_mock.get_site_info = Mock(return_value=site_info) + powerwall_mock.get_charge = Mock(return_value=charge) + powerwall_mock.get_sitemaster = Mock(return_value=sitemaster) + powerwall_mock.get_meters = Mock(return_value=meters) + powerwall_mock.get_grid_status = Mock(return_value=grid_status) + powerwall_mock.get_status = Mock(return_value=status) + powerwall_mock.get_device_type = Mock(return_value=device_type) + + return powerwall_mock + + +async def _mock_powerwall_site_name(hass, site_name): + powerwall_mock = MagicMock(Powerwall("1.2.3.4")) + + site_info_resp = SiteInfoResponse( + await _async_load_json_fixture(hass, "site_info.json") + ) + site_info_resp.site_name = site_name + powerwall_mock.get_site_info = Mock(return_value=site_info_resp) return powerwall_mock def _mock_powerwall_side_effect(site_info=None): - powerwall_mock = MagicMock() - type(powerwall_mock).site_info = PropertyMock(side_effect=site_info) + powerwall_mock = MagicMock(Powerwall("1.2.3.4")) + powerwall_mock.get_site_info = Mock(side_effect=site_info) return powerwall_mock diff --git a/tests/components/powerwall/test_binary_sensor.py b/tests/components/powerwall/test_binary_sensor.py index 621304793ab4..e2af4cf05e97 100644 --- a/tests/components/powerwall/test_binary_sensor.py +++ b/tests/components/powerwall/test_binary_sensor.py @@ -15,10 +15,10 @@ async def test_sensors(hass): mock_powerwall = await _mock_powerwall_with_fixtures(hass) with patch( - "homeassistant.components.powerwall.config_flow.PowerWall", + "homeassistant.components.powerwall.config_flow.Powerwall", return_value=mock_powerwall, ), patch( - "homeassistant.components.powerwall.PowerWall", return_value=mock_powerwall, + "homeassistant.components.powerwall.Powerwall", return_value=mock_powerwall, ): assert await async_setup_component(hass, DOMAIN, _mock_get_config()) await hass.async_block_till_done() diff --git a/tests/components/powerwall/test_config_flow.py b/tests/components/powerwall/test_config_flow.py index f27d7e1f41b4..a6752d838f34 100644 --- a/tests/components/powerwall/test_config_flow.py +++ b/tests/components/powerwall/test_config_flow.py @@ -1,13 +1,13 @@ """Test the Powerwall config flow.""" from asynctest import patch -from tesla_powerwall import PowerWallUnreachableError +from tesla_powerwall import PowerwallUnreachableError from homeassistant import config_entries, setup -from homeassistant.components.powerwall.const import DOMAIN, POWERWALL_SITE_NAME +from homeassistant.components.powerwall.const import DOMAIN from homeassistant.const import CONF_IP_ADDRESS -from .mocks import _mock_powerwall_return_value, _mock_powerwall_side_effect +from .mocks import _mock_powerwall_side_effect, _mock_powerwall_site_name async def test_form_source_user(hass): @@ -19,12 +19,10 @@ async def test_form_source_user(hass): assert result["type"] == "form" assert result["errors"] == {} - mock_powerwall = _mock_powerwall_return_value( - site_info={POWERWALL_SITE_NAME: "My site"} - ) + mock_powerwall = await _mock_powerwall_site_name(hass, "My site") with patch( - "homeassistant.components.powerwall.config_flow.PowerWall", + "homeassistant.components.powerwall.config_flow.Powerwall", return_value=mock_powerwall, ), patch( "homeassistant.components.powerwall.async_setup", return_value=True @@ -47,12 +45,9 @@ async def test_form_source_import(hass): """Test we setup the config entry via import.""" await setup.async_setup_component(hass, "persistent_notification", {}) - mock_powerwall = _mock_powerwall_return_value( - site_info={POWERWALL_SITE_NAME: "Imported site"} - ) - + mock_powerwall = await _mock_powerwall_site_name(hass, "Imported site") with patch( - "homeassistant.components.powerwall.config_flow.PowerWall", + "homeassistant.components.powerwall.config_flow.Powerwall", return_value=mock_powerwall, ), patch( "homeassistant.components.powerwall.async_setup", return_value=True @@ -79,10 +74,10 @@ async def test_form_cannot_connect(hass): DOMAIN, context={"source": config_entries.SOURCE_USER} ) - mock_powerwall = _mock_powerwall_side_effect(site_info=PowerWallUnreachableError) + mock_powerwall = _mock_powerwall_side_effect(site_info=PowerwallUnreachableError) with patch( - "homeassistant.components.powerwall.config_flow.PowerWall", + "homeassistant.components.powerwall.config_flow.Powerwall", return_value=mock_powerwall, ): result2 = await hass.config_entries.flow.async_configure( diff --git a/tests/components/powerwall/test_sensor.py b/tests/components/powerwall/test_sensor.py index 3ab7e051a19a..ce0c929ab927 100644 --- a/tests/components/powerwall/test_sensor.py +++ b/tests/components/powerwall/test_sensor.py @@ -15,10 +15,10 @@ async def test_sensors(hass): mock_powerwall = await _mock_powerwall_with_fixtures(hass) with patch( - "homeassistant.components.powerwall.config_flow.PowerWall", + "homeassistant.components.powerwall.config_flow.Powerwall", return_value=mock_powerwall, ), patch( - "homeassistant.components.powerwall.PowerWall", return_value=mock_powerwall + "homeassistant.components.powerwall.Powerwall", return_value=mock_powerwall ): assert await async_setup_component(hass, DOMAIN, _mock_get_config()) await hass.async_block_till_done() @@ -28,7 +28,7 @@ async def test_sensors(hass): identifiers={("powerwall", "Wom Energy_60Hz_240V_s_IEEE1547a_2014_13.5")}, connections=set(), ) - assert reg_device.model == "PowerWall 2 (hec)" + assert reg_device.model == "PowerWall 2 (GW1)" assert reg_device.sw_version == "1.45.1" assert reg_device.manufacturer == "Tesla" assert reg_device.name == "MySite" @@ -98,7 +98,7 @@ async def test_sensors(hass): assert state.attributes[key] == value state = hass.states.get("sensor.powerwall_charge") - assert state.state == "47.32" + assert state.state == "47" expected_attributes = { "unit_of_measurement": UNIT_PERCENTAGE, "friendly_name": "Powerwall Charge", From fb33667c5ac84941c4fa8970e1f60f08bbd94d76 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Mon, 13 Apr 2020 13:00:57 -0700 Subject: [PATCH 375/653] Fix example paths for Android TV download/upload services (#34151) --- homeassistant/components/androidtv/services.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/androidtv/services.yaml b/homeassistant/components/androidtv/services.yaml index 9de4f928b38f..f5efe233271a 100644 --- a/homeassistant/components/androidtv/services.yaml +++ b/homeassistant/components/androidtv/services.yaml @@ -20,7 +20,7 @@ download: example: "/storage/emulated/0/Download/example.txt" local_path: description: The filepath on your Home Assistant instance. - example: "/config/example.txt" + example: "/config/www/example.txt" upload: description: Upload a file from your Home Assistant instance to an Android TV / Fire TV device. fields: @@ -32,4 +32,4 @@ upload: example: "/storage/emulated/0/Download/example.txt" local_path: description: The filepath on your Home Assistant instance. - example: "/config/example.txt" + example: "/config/www/example.txt" From 59d707df54d3a4b6293be545c65c15e39e59dffb Mon Sep 17 00:00:00 2001 From: Quinn Hosler Date: Mon, 13 Apr 2020 16:55:02 -0400 Subject: [PATCH 376/653] Add play_media channel support to roku (#34124) --- homeassistant/components/roku/media_player.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 99cda9cb4119..71e3ad868083 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -1,4 +1,6 @@ """Support for the Roku media player.""" +import logging + from requests.exceptions import ( ConnectionError as RequestsConnectionError, ReadTimeout as RequestsReadTimeout, @@ -7,9 +9,11 @@ from roku import RokuException from homeassistant.components.media_player import MediaPlayerDevice from homeassistant.components.media_player.const import ( + MEDIA_TYPE_CHANNEL, MEDIA_TYPE_MOVIE, SUPPORT_NEXT_TRACK, SUPPORT_PLAY, + SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK, SUPPORT_SELECT_SOURCE, SUPPORT_TURN_OFF, @@ -21,6 +25,8 @@ from homeassistant.const import STATE_HOME, STATE_IDLE, STATE_PLAYING, STATE_STA from .const import DATA_CLIENT, DEFAULT_MANUFACTURER, DEFAULT_PORT, DOMAIN +_LOGGER = logging.getLogger(__name__) + SUPPORT_ROKU = ( SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK @@ -28,6 +34,7 @@ SUPPORT_ROKU = ( | SUPPORT_VOLUME_MUTE | SUPPORT_SELECT_SOURCE | SUPPORT_PLAY + | SUPPORT_PLAY_MEDIA | SUPPORT_TURN_ON | SUPPORT_TURN_OFF ) @@ -217,6 +224,18 @@ class RokuDevice(MediaPlayerDevice): if self.current_app is not None: self.roku.volume_down() + def play_media(self, media_type, media_id, **kwargs): + """Tune to channel.""" + if media_type != MEDIA_TYPE_CHANNEL: + _LOGGER.error( + "Invalid media type %s. Only %s is supported", + media_type, + MEDIA_TYPE_CHANNEL, + ) + return + if self.current_app is not None: + self.roku.launch(self.roku["tvinput.dtv"], {"ch": media_id}) + def select_source(self, source): """Select input source.""" if self.current_app is not None: From b0bb1258601502f8da31c13ddd710ef6ee9c3a6f Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 13 Apr 2020 15:32:23 -0600 Subject: [PATCH 377/653] Fix deprecated icon/username logic in Slack (#34156) * Fix deprecated icon/username logic in Slack * hassfest --- homeassistant/components/slack/notify.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/slack/notify.py b/homeassistant/components/slack/notify.py index fe6f7ab0d264..8cfffc1722a5 100644 --- a/homeassistant/components/slack/notify.py +++ b/homeassistant/components/slack/notify.py @@ -74,11 +74,7 @@ class SlackNotificationService(BaseNotificationService): self._default_channel = default_channel self._hass = hass self._icon = icon - - if username or self._icon: - self._as_user = False - else: - self._as_user = True + self._username = username async def _async_send_local_file_message(self, path, targets, message, title): """Upload a local file (with message) to Slack.""" @@ -108,11 +104,11 @@ class SlackNotificationService(BaseNotificationService): target: self._client.chat_postMessage( channel=target, text=message, - as_user=self._as_user, attachments=attachments, blocks=blocks, icon_emoji=self._icon, link_names=True, + username=self._username, ) for target in targets } From 028e08c7f6932fd5277cf37036020a66bba5a0e4 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 13 Apr 2020 18:07:32 -0400 Subject: [PATCH 378/653] Improve rounding the light level conversion in Lutron Caseta (#34167) --- homeassistant/components/lutron_caseta/light.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/lutron_caseta/light.py b/homeassistant/components/lutron_caseta/light.py index ba4342ecfcef..350c35fffa82 100644 --- a/homeassistant/components/lutron_caseta/light.py +++ b/homeassistant/components/lutron_caseta/light.py @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) def to_lutron_level(level): """Convert the given Home Assistant light level (0-255) to Lutron (0-100).""" - return int((level * 100) // 255) + return int(round((level * 100) / 255)) def to_hass_level(level): From 29f50ddc9c8e3f89b8e190eb59a8b0d9790b6efd Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 13 Apr 2020 17:51:35 -0500 Subject: [PATCH 379/653] Fix z-wave brightness off by one (#34170) Z-wave would drop the floating point by calling int() instead of round() which would result in the brightness being off by one in many cases. --- homeassistant/components/zwave/light.py | 2 +- tests/components/zwave/test_light.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zwave/light.py b/homeassistant/components/zwave/light.py index b32daf71f54e..745400e5c442 100644 --- a/homeassistant/components/zwave/light.py +++ b/homeassistant/components/zwave/light.py @@ -104,7 +104,7 @@ def byte_to_zwave_brightness(value): `value` -- (int) Brightness byte value from 0-255. """ if value > 0: - return max(1, int((value / 255) * 99)) + return max(1, round((value / 255) * 99)) return 0 diff --git a/tests/components/zwave/test_light.py b/tests/components/zwave/test_light.py index 10efed24bf2d..fc62ef880f65 100644 --- a/tests/components/zwave/test_light.py +++ b/tests/components/zwave/test_light.py @@ -100,13 +100,23 @@ def test_dimmer_turn_on(mock_openzwave): node.reset_mock() + device.turn_on(**{ATTR_BRIGHTNESS: 224}) + + assert node.set_dimmer.called + value_id, brightness = node.set_dimmer.mock_calls[0][1] + + assert value_id == value.value_id + assert brightness == 87 # round(224 / 255 * 99) + + node.reset_mock() + device.turn_on(**{ATTR_BRIGHTNESS: 120}) assert node.set_dimmer.called value_id, brightness = node.set_dimmer.mock_calls[0][1] assert value_id == value.value_id - assert brightness == 46 # int(120 / 255 * 99) + assert brightness == 47 # round(120 / 255 * 99) with patch.object(light, "_LOGGER", MagicMock()) as mock_logger: device.turn_on(**{ATTR_TRANSITION: 35}) From 983b1e1e9d4a59cda92a09398b5779165c0b46aa Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 13 Apr 2020 18:16:17 -0500 Subject: [PATCH 380/653] =?UTF-8?q?Increase=20timeout=20and=20log=20the=20?= =?UTF-8?q?url=20of=20the=20elkm1=20system=20that=20time=E2=80=A6=20(#3417?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Log the url of the elkm1 system that times out * Bump timeout to 120s --- homeassistant/components/elkm1/__init__.py | 6 ++++-- homeassistant/components/elkm1/config_flow.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py index 183897d306e4..5c6fbf717388 100644 --- a/homeassistant/components/elkm1/__init__.py +++ b/homeassistant/components/elkm1/__init__.py @@ -39,7 +39,7 @@ from .const import ( ELK_ELEMENTS, ) -SYNC_TIMEOUT = 55 +SYNC_TIMEOUT = 120 _LOGGER = logging.getLogger(__name__) @@ -215,7 +215,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): if not await async_wait_for_elk_to_sync(elk, SYNC_TIMEOUT): _LOGGER.error( - "Timed out after %d seconds while trying to sync with ElkM1", SYNC_TIMEOUT, + "Timed out after %d seconds while trying to sync with ElkM1 at %s", + SYNC_TIMEOUT, + conf[CONF_HOST], ) elk.disconnect() raise ConfigEntryNotReady diff --git a/homeassistant/components/elkm1/config_flow.py b/homeassistant/components/elkm1/config_flow.py index cad3ecac42a7..c96e6e549c05 100644 --- a/homeassistant/components/elkm1/config_flow.py +++ b/homeassistant/components/elkm1/config_flow.py @@ -64,8 +64,9 @@ async def validate_input(data): timed_out = False if not await async_wait_for_elk_to_sync(elk, VALIDATE_TIMEOUT): _LOGGER.error( - "Timed out after %d seconds while trying to sync with elkm1", + "Timed out after %d seconds while trying to sync with ElkM1 at %s", VALIDATE_TIMEOUT, + url, ) timed_out = True From e1d66f6fdd5ee026068c8a8bcda7d6f60a893ce3 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 14 Apr 2020 00:07:23 +0000 Subject: [PATCH 381/653] [ci skip] Translation update --- .../components/adguard/.translations/es.json | 2 +- .../components/august/.translations/es.json | 2 +- .../components/axis/.translations/es.json | 2 +- .../components/deconz/.translations/de.json | 2 ++ .../components/deconz/.translations/es.json | 2 ++ .../components/deconz/.translations/ru.json | 2 ++ .../deconz/.translations/zh-Hant.json | 2 ++ .../components/doorbird/.translations/es.json | 2 +- .../components/flume/.translations/es.json | 2 +- .../garmin_connect/.translations/es.json | 2 +- .../components/glances/.translations/es.json | 2 +- .../harmony/.translations/zh-Hant.json | 2 +- .../.translations/zh-Hant.json | 6 ++-- .../components/icloud/.translations/es.json | 2 +- .../konnected/.translations/zh-Hant.json | 2 +- .../components/life360/.translations/es.json | 2 +- .../components/light/.translations/en.json | 1 + .../components/linky/.translations/es.json | 4 +-- .../components/mikrotik/.translations/es.json | 2 +- .../minecraft_server/.translations/es.json | 2 +- .../monoprice/.translations/zh-Hant.json | 2 +- .../components/mqtt/.translations/es.json | 2 +- .../components/notion/.translations/es.json | 2 +- .../components/nuheat/.translations/es.json | 2 +- .../components/nut/.translations/de.json | 3 +- .../components/nut/.translations/es.json | 3 +- .../components/nut/.translations/zh-Hant.json | 2 +- .../opentherm_gw/.translations/zh-Hant.json | 2 +- .../components/ps4/.translations/zh-Hant.json | 2 +- .../rachio/.translations/zh-Hant.json | 2 +- .../ring/.translations/zh-Hant.json | 2 +- .../sense/.translations/zh-Hant.json | 2 +- .../solarlog/.translations/zh-Hant.json | 4 +-- .../synology_dsm/.translations/es.json | 2 +- .../components/tado/.translations/de.json | 30 ++++++++++++++++ .../components/tado/.translations/es.json | 35 +++++++++++++++++++ .../components/tado/.translations/ru.json | 35 +++++++++++++++++++ .../tado/.translations/zh-Hant.json | 35 +++++++++++++++++++ .../components/tesla/.translations/es.json | 2 +- .../components/toon/.translations/es.json | 2 +- .../toon/.translations/zh-Hant.json | 8 ++--- .../totalconnect/.translations/de.json | 17 +++++++++ .../totalconnect/.translations/en.json | 2 +- .../totalconnect/.translations/es.json | 20 +++++++++++ .../totalconnect/.translations/ru.json | 20 +++++++++++ .../totalconnect/.translations/zh-Hant.json | 20 +++++++++++ .../tplink/.translations/zh-Hant.json | 2 +- .../transmission/.translations/es.json | 2 +- .../components/vilfo/.translations/es.json | 4 +-- .../vizio/.translations/zh-Hant.json | 16 ++++----- 50 files changed, 275 insertions(+), 52 deletions(-) create mode 100644 homeassistant/components/tado/.translations/de.json create mode 100644 homeassistant/components/tado/.translations/es.json create mode 100644 homeassistant/components/tado/.translations/ru.json create mode 100644 homeassistant/components/tado/.translations/zh-Hant.json create mode 100644 homeassistant/components/totalconnect/.translations/de.json create mode 100644 homeassistant/components/totalconnect/.translations/es.json create mode 100644 homeassistant/components/totalconnect/.translations/ru.json create mode 100644 homeassistant/components/totalconnect/.translations/zh-Hant.json diff --git a/homeassistant/components/adguard/.translations/es.json b/homeassistant/components/adguard/.translations/es.json index c6946ab61201..710aa43501f0 100644 --- a/homeassistant/components/adguard/.translations/es.json +++ b/homeassistant/components/adguard/.translations/es.json @@ -20,7 +20,7 @@ "password": "Contrase\u00f1a", "port": "Puerto", "ssl": "AdGuard Home utiliza un certificado SSL", - "username": "Nombre de usuario", + "username": "Usuario", "verify_ssl": "AdGuard Home utiliza un certificado apropiado" }, "description": "Configure su instancia de AdGuard Home para permitir la supervisi\u00f3n y el control.", diff --git a/homeassistant/components/august/.translations/es.json b/homeassistant/components/august/.translations/es.json index 58d94bb0cbf4..31d8b986d27d 100644 --- a/homeassistant/components/august/.translations/es.json +++ b/homeassistant/components/august/.translations/es.json @@ -23,7 +23,7 @@ "data": { "code": "C\u00f3digo de verificaci\u00f3n" }, - "description": "Por favor, compruebe tu {login_method} ({username}) e introduce el c\u00f3digo de verificaci\u00f3n a continuaci\u00f3n", + "description": "Por favor, comprueba tu {login_method} ({username}) e introduce el c\u00f3digo de verificaci\u00f3n a continuaci\u00f3n", "title": "Autenticaci\u00f3n de dos factores" } }, diff --git a/homeassistant/components/axis/.translations/es.json b/homeassistant/components/axis/.translations/es.json index 3f7db674fdf4..7894e74b1c3e 100644 --- a/homeassistant/components/axis/.translations/es.json +++ b/homeassistant/components/axis/.translations/es.json @@ -19,7 +19,7 @@ "host": "Host", "password": "Contrase\u00f1a", "port": "Puerto", - "username": "Nombre de usuario" + "username": "Usuario" }, "title": "Configurar dispositivo Axis" } diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index 1b2daecbc4ed..7cd82ed7935f 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -34,6 +34,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Beide Tasten", + "bottom_buttons": "Untere Tasten", "button_1": "Erste Taste", "button_2": "Zweite Taste", "button_3": "Dritte Taste", @@ -50,6 +51,7 @@ "side_4": "Seite 4", "side_5": "Seite 5", "side_6": "Seite 6", + "top_buttons": "Obere Tasten", "turn_off": "Ausschalten", "turn_on": "Einschalten" }, diff --git a/homeassistant/components/deconz/.translations/es.json b/homeassistant/components/deconz/.translations/es.json index 517170fe225a..d2304a7aa64a 100644 --- a/homeassistant/components/deconz/.translations/es.json +++ b/homeassistant/components/deconz/.translations/es.json @@ -34,6 +34,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Ambos botones", + "bottom_buttons": "Botones inferiores", "button_1": "Primer bot\u00f3n", "button_2": "Segundo bot\u00f3n", "button_3": "Tercer bot\u00f3n", @@ -50,6 +51,7 @@ "side_4": "Lado 4", "side_5": "Lado 5", "side_6": "Lado 6", + "top_buttons": "Botones superiores", "turn_off": "Apagar", "turn_on": "Encender" }, diff --git a/homeassistant/components/deconz/.translations/ru.json b/homeassistant/components/deconz/.translations/ru.json index 4d89f5ff8e01..3d2f8358422c 100644 --- a/homeassistant/components/deconz/.translations/ru.json +++ b/homeassistant/components/deconz/.translations/ru.json @@ -34,6 +34,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "\u041e\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438", + "bottom_buttons": "\u041d\u0438\u0436\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438", "button_1": "\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", "button_2": "\u0412\u0442\u043e\u0440\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", "button_3": "\u0422\u0440\u0435\u0442\u044c\u044f \u043a\u043d\u043e\u043f\u043a\u0430", @@ -50,6 +51,7 @@ "side_4": "\u0413\u0440\u0430\u043d\u044c 4", "side_5": "\u0413\u0440\u0430\u043d\u044c 5", "side_6": "\u0413\u0440\u0430\u043d\u044c 6", + "top_buttons": "\u0412\u0435\u0440\u0445\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438", "turn_off": "\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", "turn_on": "\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f" }, diff --git a/homeassistant/components/deconz/.translations/zh-Hant.json b/homeassistant/components/deconz/.translations/zh-Hant.json index 07b7c6e997be..030b54a1a66b 100644 --- a/homeassistant/components/deconz/.translations/zh-Hant.json +++ b/homeassistant/components/deconz/.translations/zh-Hant.json @@ -34,6 +34,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "\u5169\u500b\u6309\u9215", + "bottom_buttons": "\u4e0b\u65b9\u6309\u9215", "button_1": "\u7b2c\u4e00\u500b\u6309\u9215", "button_2": "\u7b2c\u4e8c\u500b\u6309\u9215", "button_3": "\u7b2c\u4e09\u500b\u6309\u9215", @@ -50,6 +51,7 @@ "side_4": "\u7b2c 4 \u9762", "side_5": "\u7b2c 5 \u9762", "side_6": "\u7b2c 6 \u9762", + "top_buttons": "\u4e0a\u65b9\u6309\u9215", "turn_off": "\u95dc\u9589", "turn_on": "\u958b\u555f" }, diff --git a/homeassistant/components/doorbird/.translations/es.json b/homeassistant/components/doorbird/.translations/es.json index 4e2aa0414dce..120daaa8a58d 100644 --- a/homeassistant/components/doorbird/.translations/es.json +++ b/homeassistant/components/doorbird/.translations/es.json @@ -17,7 +17,7 @@ "host": "Host (Direcci\u00f3n IP)", "name": "Nombre del dispositivo", "password": "Contrase\u00f1a", - "username": "Nombre de usuario" + "username": "Usuario" }, "title": "Conectar con DoorBird" } diff --git a/homeassistant/components/flume/.translations/es.json b/homeassistant/components/flume/.translations/es.json index b5d5c1585078..2e63c8663cd9 100644 --- a/homeassistant/components/flume/.translations/es.json +++ b/homeassistant/components/flume/.translations/es.json @@ -17,7 +17,7 @@ "username": "Usuario" }, "description": "Para acceder a la API Personal de Flume, tendr\u00e1s que solicitar un 'Client ID' y un 'Client Secret' en https://portal.flumetech.com/settings#token", - "title": "Conectar con tu Cuenta de Flume" + "title": "Conectar con tu cuenta de Flume" } }, "title": "Flume" diff --git a/homeassistant/components/garmin_connect/.translations/es.json b/homeassistant/components/garmin_connect/.translations/es.json index 989d86dbc35f..53c1d3e0b8fd 100644 --- a/homeassistant/components/garmin_connect/.translations/es.json +++ b/homeassistant/components/garmin_connect/.translations/es.json @@ -13,7 +13,7 @@ "user": { "data": { "password": "Contrase\u00f1a", - "username": "Nombre de usuario" + "username": "Usuario" }, "description": "Introduzca sus credenciales.", "title": "Garmin Connect" diff --git a/homeassistant/components/glances/.translations/es.json b/homeassistant/components/glances/.translations/es.json index 1b6b0335192a..5f69c1236b75 100644 --- a/homeassistant/components/glances/.translations/es.json +++ b/homeassistant/components/glances/.translations/es.json @@ -15,7 +15,7 @@ "password": "Contrase\u00f1a", "port": "Puerto", "ssl": "Utilice SSL/TLS para conectarse al sistema Glances", - "username": "Nombre de usuario", + "username": "Usuario", "verify_ssl": "Verificar la certificaci\u00f3n del sistema", "version": "Versi\u00f3n API Glances (2 o 3)" }, diff --git a/homeassistant/components/harmony/.translations/zh-Hant.json b/homeassistant/components/harmony/.translations/zh-Hant.json index 9e523c672909..70be5180572d 100644 --- a/homeassistant/components/harmony/.translations/zh-Hant.json +++ b/homeassistant/components/harmony/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", diff --git a/homeassistant/components/homekit_controller/.translations/zh-Hant.json b/homeassistant/components/homekit_controller/.translations/zh-Hant.json index c2092c2016b9..25ad45dddaab 100644 --- a/homeassistant/components/homekit_controller/.translations/zh-Hant.json +++ b/homeassistant/components/homekit_controller/.translations/zh-Hant.json @@ -16,7 +16,7 @@ "max_tries_error": "\u8a2d\u5099\u6536\u5230\u8d85\u904e 100 \u6b21\u672a\u6210\u529f\u8a8d\u8b49\u5f8c\uff0c\u62d2\u7d55\u9032\u884c\u914d\u5c0d\u3002", "pairing_failed": "\u7576\u8a66\u5716\u8207\u8a2d\u5099\u914d\u5c0d\u6642\u767c\u751f\u7121\u6cd5\u8655\u7406\u932f\u8aa4\uff0c\u53ef\u80fd\u50c5\u70ba\u66ab\u6642\u5931\u6548\u3001\u6216\u8005\u8a2d\u5099\u76ee\u524d\u4e0d\u652f\u63f4\u3002", "unable_to_pair": "\u7121\u6cd5\u914d\u5c0d\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002", - "unknown_error": "\u88dd\u7f6e\u56de\u5831\u672a\u77e5\u932f\u8aa4\u3002\u914d\u5c0d\u5931\u6557\u3002" + "unknown_error": "\u8a2d\u5099\u56de\u5831\u672a\u77e5\u932f\u8aa4\u3002\u914d\u5c0d\u5931\u6557\u3002" }, "flow_title": "HomeKit \u914d\u4ef6\uff1a{name}", "step": { @@ -29,9 +29,9 @@ }, "user": { "data": { - "device": "\u88dd\u7f6e" + "device": "\u8a2d\u5099" }, - "description": "\u9078\u64c7\u6240\u8981\u65b0\u589e\u7684\u88dd\u7f6e", + "description": "\u9078\u64c7\u6240\u8981\u65b0\u589e\u7684\u8a2d\u5099", "title": "HomeKit \u914d\u4ef6\u914d\u5c0d" } }, diff --git a/homeassistant/components/icloud/.translations/es.json b/homeassistant/components/icloud/.translations/es.json index 02f07e5d492b..d81fdc804ac3 100644 --- a/homeassistant/components/icloud/.translations/es.json +++ b/homeassistant/components/icloud/.translations/es.json @@ -5,7 +5,7 @@ "no_device": "Ninguno de tus dispositivos tiene activado \"Buscar mi iPhone\"" }, "error": { - "login": "Error de inicio de sesi\u00f3n: compruebe su direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a", + "login": "Error de inicio de sesi\u00f3n: comprueba tu direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a", "send_verification_code": "Error al enviar el c\u00f3digo de verificaci\u00f3n", "validate_verification_code": "No se pudo verificar el c\u00f3digo de verificaci\u00f3n, elegir un dispositivo de confianza e iniciar la verificaci\u00f3n de nuevo" }, diff --git a/homeassistant/components/konnected/.translations/zh-Hant.json b/homeassistant/components/konnected/.translations/zh-Hant.json index 9c3e818e692e..e51a099ba2a3 100644 --- a/homeassistant/components/konnected/.translations/zh-Hant.json +++ b/homeassistant/components/konnected/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "already_in_progress": "\u8a2d\u5099\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d\u3002", "not_konn_panel": "\u4e26\u975e\u53ef\u8b58\u5225 Konnected.io \u8a2d\u5099", "unknown": "\u767c\u751f\u672a\u77e5\u932f\u8aa4\u3002" diff --git a/homeassistant/components/life360/.translations/es.json b/homeassistant/components/life360/.translations/es.json index 2b185cb1b6c4..68cf7ff847e1 100644 --- a/homeassistant/components/life360/.translations/es.json +++ b/homeassistant/components/life360/.translations/es.json @@ -17,7 +17,7 @@ "user": { "data": { "password": "Contrase\u00f1a", - "username": "Nombre de usuario" + "username": "Usuario" }, "description": "Para configurar las opciones avanzadas, revisa la [documentaci\u00f3n de Life360]({docs_url}).\nDeber\u00edas hacerlo antes de a\u00f1adir alguna cuenta.", "title": "Informaci\u00f3n de la cuenta de Life360" diff --git a/homeassistant/components/light/.translations/en.json b/homeassistant/components/light/.translations/en.json index 788934a7e01d..6a777265c7cd 100644 --- a/homeassistant/components/light/.translations/en.json +++ b/homeassistant/components/light/.translations/en.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Decrease {entity_name} brightness", "brightness_increase": "Increase {entity_name} brightness", + "flash": "Flash {entity_name}", "toggle": "Toggle {entity_name}", "turn_off": "Turn off {entity_name}", "turn_on": "Turn on {entity_name}" diff --git a/homeassistant/components/linky/.translations/es.json b/homeassistant/components/linky/.translations/es.json index c0052c356b27..532c08a9687b 100644 --- a/homeassistant/components/linky/.translations/es.json +++ b/homeassistant/components/linky/.translations/es.json @@ -4,10 +4,10 @@ "already_configured": "La cuenta ya est\u00e1 configurada" }, "error": { - "access": "No se pudo acceder a Enedis.fr, compruebe su conexi\u00f3n a Internet", + "access": "No se pudo acceder a Enedis.fr, comprueba tu conexi\u00f3n a Internet", "enedis": "Enedis.fr respondi\u00f3 con un error: vuelva a intentarlo m\u00e1s tarde (normalmente no entre las 11:00 y las 2 de la ma\u00f1ana)", "unknown": "Error desconocido: por favor, vuelva a intentarlo m\u00e1s tarde (normalmente no entre las 23:00 y las 02:00 horas).", - "wrong_login": "Error de inicio de sesi\u00f3n: compruebe su direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a" + "wrong_login": "Error de inicio de sesi\u00f3n: comprueba tu direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a" }, "step": { "user": { diff --git a/homeassistant/components/mikrotik/.translations/es.json b/homeassistant/components/mikrotik/.translations/es.json index 61bce851f42b..d149fe9d7794 100644 --- a/homeassistant/components/mikrotik/.translations/es.json +++ b/homeassistant/components/mikrotik/.translations/es.json @@ -15,7 +15,7 @@ "name": "Nombre", "password": "Contrase\u00f1a", "port": "Puerto", - "username": "Nombre de usuario", + "username": "Usuario", "verify_ssl": "Usar ssl" }, "title": "Configurar el router Mikrotik" diff --git a/homeassistant/components/minecraft_server/.translations/es.json b/homeassistant/components/minecraft_server/.translations/es.json index a4509ba68d49..58328d973fcd 100644 --- a/homeassistant/components/minecraft_server/.translations/es.json +++ b/homeassistant/components/minecraft_server/.translations/es.json @@ -4,7 +4,7 @@ "already_configured": "El host ya est\u00e1 configurado." }, "error": { - "cannot_connect": "No se pudo conectar al servidor. Compruebe el host y el puerto e int\u00e9ntelo de nuevo. Tambi\u00e9n aseg\u00farese de que est\u00e1 ejecutando al menos Minecraft versi\u00f3n 1.7 en su servidor.", + "cannot_connect": "No se pudo conectar al servidor. Comprueba el host y el puerto e int\u00e9ntalo de nuevo. Tambi\u00e9n aseg\u00farate de que est\u00e1s ejecutando al menos Minecraft versi\u00f3n 1.7 en tu servidor.", "invalid_ip": "La direcci\u00f3n IP no es valida (no se pudo determinar la direcci\u00f3n MAC). Por favor, corr\u00edgelo e int\u00e9ntalo de nuevo.", "invalid_port": "El puerto debe estar en el rango de 1024 a 65535. Por favor, corr\u00edgelo e int\u00e9ntalo de nuevo." }, diff --git a/homeassistant/components/monoprice/.translations/zh-Hant.json b/homeassistant/components/monoprice/.translations/zh-Hant.json index 81230eee7283..6f084a9d48bd 100644 --- a/homeassistant/components/monoprice/.translations/zh-Hant.json +++ b/homeassistant/components/monoprice/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", diff --git a/homeassistant/components/mqtt/.translations/es.json b/homeassistant/components/mqtt/.translations/es.json index a705a885494d..07de20e7a157 100644 --- a/homeassistant/components/mqtt/.translations/es.json +++ b/homeassistant/components/mqtt/.translations/es.json @@ -13,7 +13,7 @@ "discovery": "Habilitar descubrimiento", "password": "Contrase\u00f1a", "port": "Puerto", - "username": "Nombre de usuario" + "username": "Usuario" }, "description": "Por favor, introduce la informaci\u00f3n de tu agente MQTT", "title": "MQTT" diff --git a/homeassistant/components/notion/.translations/es.json b/homeassistant/components/notion/.translations/es.json index 7293e8f229f8..8d0594629f7a 100644 --- a/homeassistant/components/notion/.translations/es.json +++ b/homeassistant/components/notion/.translations/es.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Esta nombre de usuario ya est\u00e1 en uso." + "already_configured": "Este nombre de usuario ya est\u00e1 en uso." }, "error": { "invalid_credentials": "Usuario o contrase\u00f1a no v\u00e1lido", diff --git a/homeassistant/components/nuheat/.translations/es.json b/homeassistant/components/nuheat/.translations/es.json index 3a37b65b9dd6..f0ce00ca7ecf 100644 --- a/homeassistant/components/nuheat/.translations/es.json +++ b/homeassistant/components/nuheat/.translations/es.json @@ -14,7 +14,7 @@ "data": { "password": "Contrase\u00f1a", "serial_number": "N\u00famero de serie del termostato.", - "username": "Nombre de usuario" + "username": "Usuario" }, "description": "Necesitas obtener el n\u00famero de serie o el ID de tu termostato iniciando sesi\u00f3n en https://MyNuHeat.com y seleccionando tu(s) termostato(s).", "title": "ConectarNuHeat" diff --git a/homeassistant/components/nut/.translations/de.json b/homeassistant/components/nut/.translations/de.json index 67b5a23f65f1..68651936a632 100644 --- a/homeassistant/components/nut/.translations/de.json +++ b/homeassistant/components/nut/.translations/de.json @@ -38,7 +38,8 @@ "step": { "init": { "data": { - "resources": "Ressourcen" + "resources": "Ressourcen", + "scan_interval": "Scan-Intervall (Sekunden)" }, "description": "W\u00e4hlen Sie Sensorressourcen." } diff --git a/homeassistant/components/nut/.translations/es.json b/homeassistant/components/nut/.translations/es.json index ddc02187c539..4024d1d0cef9 100644 --- a/homeassistant/components/nut/.translations/es.json +++ b/homeassistant/components/nut/.translations/es.json @@ -41,7 +41,8 @@ "step": { "init": { "data": { - "resources": "Recursos" + "resources": "Recursos", + "scan_interval": "Intervalo de escaneo (segundos)" }, "description": "Elegir Recursos del Sensor" } diff --git a/homeassistant/components/nut/.translations/zh-Hant.json b/homeassistant/components/nut/.translations/zh-Hant.json index f23ba9df90da..4163b3930864 100644 --- a/homeassistant/components/nut/.translations/zh-Hant.json +++ b/homeassistant/components/nut/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", diff --git a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json index 6c6db9481568..6fa1f260c834 100644 --- a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json +++ b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json @@ -3,7 +3,7 @@ "error": { "already_configured": "\u9598\u9053\u5668\u5df2\u8a2d\u5b9a\u5b8c\u6210", "id_exists": "\u9598\u9053\u5668 ID \u5df2\u5b58\u5728", - "serial_error": "\u9023\u7dda\u81f3\u88dd\u7f6e\u932f\u8aa4", + "serial_error": "\u9023\u7dda\u81f3\u8a2d\u5099\u932f\u8aa4", "timeout": "\u9023\u7dda\u5617\u8a66\u903e\u6642" }, "step": { diff --git a/homeassistant/components/ps4/.translations/zh-Hant.json b/homeassistant/components/ps4/.translations/zh-Hant.json index a786b0c74d3f..56a207064708 100644 --- a/homeassistant/components/ps4/.translations/zh-Hant.json +++ b/homeassistant/components/ps4/.translations/zh-Hant.json @@ -3,7 +3,7 @@ "abort": { "credential_error": "\u53d6\u5f97\u6191\u8b49\u932f\u8aa4\u3002", "devices_configured": "\u6240\u6709\u8a2d\u5099\u90fd\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002", - "no_devices_found": "\u5728\u7db2\u8def\u4e0a\u627e\u4e0d\u5230 PlayStation 4 \u88dd\u7f6e\u3002", + "no_devices_found": "\u5728\u7db2\u8def\u4e0a\u627e\u4e0d\u5230 PlayStation 4 \u8a2d\u5099\u3002", "port_987_bind_error": "\u7121\u6cd5\u7d81\u5b9a\u901a\u8a0a\u57e0 987\u3002\u8acb\u53c3\u8003 [documentation](https://www.home-assistant.io/components/ps4/) \u4ee5\u7372\u5f97\u66f4\u591a\u8cc7\u8a0a\u3002", "port_997_bind_error": "\u7121\u6cd5\u7d81\u5b9a\u901a\u8a0a\u57e0 997\u3002\u8acb\u53c3\u8003 [documentation](https://www.home-assistant.io/components/ps4/) \u4ee5\u7372\u5f97\u66f4\u591a\u8cc7\u8a0a\u3002" }, diff --git a/homeassistant/components/rachio/.translations/zh-Hant.json b/homeassistant/components/rachio/.translations/zh-Hant.json index 0eabf0ed5743..86338633f7a6 100644 --- a/homeassistant/components/rachio/.translations/zh-Hant.json +++ b/homeassistant/components/rachio/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", diff --git a/homeassistant/components/ring/.translations/zh-Hant.json b/homeassistant/components/ring/.translations/zh-Hant.json index 6f5aaf434bb0..8ba71cab4908 100644 --- a/homeassistant/components/ring/.translations/zh-Hant.json +++ b/homeassistant/components/ring/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", diff --git a/homeassistant/components/sense/.translations/zh-Hant.json b/homeassistant/components/sense/.translations/zh-Hant.json index 1d9115764543..af124ca3eaff 100644 --- a/homeassistant/components/sense/.translations/zh-Hant.json +++ b/homeassistant/components/sense/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", diff --git a/homeassistant/components/solarlog/.translations/zh-Hant.json b/homeassistant/components/solarlog/.translations/zh-Hant.json index 19ec431d2cad..e44d7a3f9d37 100644 --- a/homeassistant/components/solarlog/.translations/zh-Hant.json +++ b/homeassistant/components/solarlog/.translations/zh-Hant.json @@ -1,10 +1,10 @@ { "config": { "abort": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" }, "error": { - "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u78ba\u8a8d\u4e3b\u6a5f\u4f4d\u5740" }, "step": { diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json index 9317331daebe..3bf4555641a3 100644 --- a/homeassistant/components/synology_dsm/.translations/es.json +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -4,7 +4,7 @@ "already_configured": "El host ya est\u00e1 configurado." }, "error": { - "login": "Error de inicio de sesi\u00f3n: comprueba tu direcci\u00f3n de correo electr\u00f3nico y contrase\u00f1a", + "login": "Error de inicio de sesi\u00f3n: comprueba tu nombre de usuario y contrase\u00f1a", "unknown": "Error desconocido: por favor vuelve a intentarlo m\u00e1s tarde o usa otra configuraci\u00f3n" }, "flow_title": "Synology DSM {name} ({host})", diff --git a/homeassistant/components/tado/.translations/de.json b/homeassistant/components/tado/.translations/de.json new file mode 100644 index 000000000000..303e2c099ed9 --- /dev/null +++ b/homeassistant/components/tado/.translations/de.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen, versuchen Sie es erneut", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + }, + "title": "Stellen Sie eine Verbindung zu Ihrem Tado-Konto her" + } + }, + "title": "Tado" + }, + "options": { + "step": { + "init": { + "title": "Passen Sie die Tado-Optionen an." + } + }, + "title": "Tado" + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/es.json b/homeassistant/components/tado/.translations/es.json new file mode 100644 index 000000000000..908d0f7b1763 --- /dev/null +++ b/homeassistant/components/tado/.translations/es.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, + "error": { + "cannot_connect": "No se pudo conectar, por favor, int\u00e9ntalo de nuevo", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "no_homes": "No hay casas asociadas a esta cuenta de Tado", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "password": "Contrase\u00f1a", + "username": "Usuario" + }, + "title": "Conectar con tu cuenta de Tado" + } + }, + "title": "Tado" + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "Activar modo de salvaguarda." + }, + "description": "El modo de salvaguarda volver\u00e1 a la Planificaci\u00f3n Inteligente en el siguiente cambio de programaci\u00f3n despu\u00e9s de ajustar manualmente una zona.", + "title": "Ajustar las opciones de Tado" + } + }, + "title": "Tado" + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/ru.json b/homeassistant/components/tado/.translations/ru.json new file mode 100644 index 000000000000..7690efe94f93 --- /dev/null +++ b/homeassistant/components/tado/.translations/ru.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", + "invalid_auth": "\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f.", + "no_homes": "\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0434\u043e\u043c\u043e\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": { + "user": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "title": "Tado" + } + }, + "title": "Tado" + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c Fallback" + }, + "description": "\u0420\u0435\u0436\u0438\u043c Fallback \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043d\u0430 Smart Schedule \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u043e\u043d\u044b.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Tado" + } + }, + "title": "Tado" + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/zh-Hant.json b/homeassistant/components/tado/.translations/zh-Hant.json new file mode 100644 index 000000000000..97e1c1f282c6 --- /dev/null +++ b/homeassistant/components/tado/.translations/zh-Hant.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "no_homes": "\u6b64 Tado \u5e33\u865f\u672a\u7d81\u5b9a\u4efb\u4f55\u5bb6\u5ead\u3002", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "title": "\u9023\u7dda\u81f3 Tado \u5e33\u865f" + } + }, + "title": "Tado" + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "\u958b\u555f\u5f8c\u964d\u6a21\u5f0f" + }, + "description": "\u5f8c\u964d\u6a21\u5f0f\u5c07\u6703\u65bc\u624b\u52d5\u8abf\u6574\u5340\u57df\u5f8c\uff0c\u4e0b\u4e00\u6b21\u898f\u5283\u5207\u63db\u6642\u3001\u5207\u63db\u5230\u667a\u80fd\u884c\u7a0b\u3002", + "title": "\u8abf\u6574 Tado \u9078\u9805\u3002" + } + }, + "title": "Tado" + } +} \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/es.json b/homeassistant/components/tesla/.translations/es.json index ad456dd28b6e..3f9e9c4e9db0 100644 --- a/homeassistant/components/tesla/.translations/es.json +++ b/homeassistant/components/tesla/.translations/es.json @@ -1,7 +1,7 @@ { "config": { "error": { - "connection_error": "Error de conexi\u00f3n; compruebe la red y vuelva a intentarlo", + "connection_error": "Error de conexi\u00f3n; comprueba la red y vuelve a intentarlo", "identifier_exists": "Correo electr\u00f3nico ya registrado", "invalid_credentials": "Credenciales no v\u00e1lidas", "unknown_error": "Error desconocido, por favor reporte la informaci\u00f3n de registro" diff --git a/homeassistant/components/toon/.translations/es.json b/homeassistant/components/toon/.translations/es.json index db5745ca090a..10b0532a53ab 100644 --- a/homeassistant/components/toon/.translations/es.json +++ b/homeassistant/components/toon/.translations/es.json @@ -16,7 +16,7 @@ "data": { "password": "Contrase\u00f1a", "tenant": "Inquilino", - "username": "Nombre de usuario" + "username": "Usuario" }, "description": "Identif\u00edcate con tu cuenta de Eneco Toon (no con la cuenta de desarrollador).", "title": "Vincular tu cuenta Toon" diff --git a/homeassistant/components/toon/.translations/zh-Hant.json b/homeassistant/components/toon/.translations/zh-Hant.json index 0156b58c9ac0..f3c9cf9588a6 100644 --- a/homeassistant/components/toon/.translations/zh-Hant.json +++ b/homeassistant/components/toon/.translations/zh-Hant.json @@ -3,13 +3,13 @@ "abort": { "client_id": "\u8a2d\u5b9a\u5167\u7528\u6236\u7aef ID \u7121\u6548\u3002", "client_secret": "\u8a2d\u5b9a\u5167\u5ba2\u6236\u7aef\u5bc6\u78bc\u7121\u6548\u3002", - "no_agreements": "\u6b64\u5e33\u865f\u4e26\u672a\u64c1\u6709 Toon \u88dd\u7f6e\u3002", + "no_agreements": "\u6b64\u5e33\u865f\u4e26\u672a\u64c1\u6709 Toon \u986f\u793a\u8a2d\u5099\u3002", "no_app": "\u5fc5\u9808\u5148\u8a2d\u5b9a Toon \u65b9\u80fd\u9032\u884c\u8a8d\u8b49\u3002[\u8acb\u53c3\u95b1\u6559\u5b78\u6307\u5f15](https://www.home-assistant.io/components/toon/(\u3002", "unknown_auth_fail": "\u9a57\u8b49\u6642\u767c\u751f\u672a\u77e5\u932f\u8aa4\u3002" }, "error": { "credentials": "\u6240\u63d0\u4f9b\u7684\u6191\u8b49\u7121\u6548\u3002", - "display_exists": "\u6240\u9078\u64c7\u7684\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002" + "display_exists": "\u6240\u9078\u64c7\u7684\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002" }, "step": { "authenticate": { @@ -23,10 +23,10 @@ }, "display": { "data": { - "display": "\u9078\u64c7\u88dd\u7f6e" + "display": "\u9078\u64c7\u8a2d\u5099" }, "description": "\u9078\u64c7\u6240\u8981\u9023\u63a5\u7684 Toon display\u3002", - "title": "\u9078\u64c7\u88dd\u7f6e" + "title": "\u9078\u64c7\u8a2d\u5099" } }, "title": "Toon" diff --git a/homeassistant/components/totalconnect/.translations/de.json b/homeassistant/components/totalconnect/.translations/de.json new file mode 100644 index 000000000000..c8daeda3f4e5 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/de.json @@ -0,0 +1,17 @@ +{ + "config": { + "abort": { + "already_configured": "Konto bereits konfiguriert" + }, + "step": { + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + }, + "title": "Total Connect" + } + }, + "title": "Total Connect" + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/en.json b/homeassistant/components/totalconnect/.translations/en.json index 5aca06df513d..44111d74bebd 100644 --- a/homeassistant/components/totalconnect/.translations/en.json +++ b/homeassistant/components/totalconnect/.translations/en.json @@ -17,4 +17,4 @@ }, "title": "Total Connect" } -} +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/es.json b/homeassistant/components/totalconnect/.translations/es.json new file mode 100644 index 000000000000..a456027be044 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/es.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "La cuenta ya est\u00e1 configurada" + }, + "error": { + "login": "Error de inicio de sesi\u00f3n: comprueba tu nombre de usuario y contrase\u00f1a" + }, + "step": { + "user": { + "data": { + "password": "Contrase\u00f1a", + "username": "Usuario" + }, + "title": "Total Connect" + } + }, + "title": "Total Connect" + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/ru.json b/homeassistant/components/totalconnect/.translations/ru.json new file mode 100644 index 000000000000..cd7f633f3239 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/ru.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430." + }, + "error": { + "login": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0445\u043e\u0434\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c." + }, + "step": { + "user": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u041b\u043e\u0433\u0438\u043d" + }, + "title": "Total Connect" + } + }, + "title": "Total Connect" + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/zh-Hant.json b/homeassistant/components/totalconnect/.translations/zh-Hant.json new file mode 100644 index 000000000000..aa8fb858fead --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/zh-Hant.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "login": "\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u78ba\u8a8d\u96fb\u5b50\u90f5\u4ef6\u8207\u5bc6\u78bc" + }, + "step": { + "user": { + "data": { + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "title": "Total Connect" + } + }, + "title": "Total Connect" + } +} \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/zh-Hant.json b/homeassistant/components/tplink/.translations/zh-Hant.json index 250a5509c4c2..17cdebd3f83b 100644 --- a/homeassistant/components/tplink/.translations/zh-Hant.json +++ b/homeassistant/components/tplink/.translations/zh-Hant.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "no_devices_found": "\u5728\u7db2\u8def\u4e0a\u627e\u4e0d\u5230 TP-Link \u88dd\u7f6e\u3002", + "no_devices_found": "\u5728\u7db2\u8def\u4e0a\u627e\u4e0d\u5230 TP-Link \u8a2d\u5099\u3002", "single_instance_allowed": "\u50c5\u9700\u8a2d\u5b9a\u4e00\u6b21\u5373\u53ef\u3002" }, "step": { diff --git a/homeassistant/components/transmission/.translations/es.json b/homeassistant/components/transmission/.translations/es.json index a1d0f3647694..e64a23873afa 100644 --- a/homeassistant/components/transmission/.translations/es.json +++ b/homeassistant/components/transmission/.translations/es.json @@ -15,7 +15,7 @@ "name": "Nombre", "password": "Contrase\u00f1a", "port": "Puerto", - "username": "Nombre de usuario" + "username": "Usuario" }, "title": "Configuraci\u00f3n del cliente de transmisi\u00f3n" } diff --git a/homeassistant/components/vilfo/.translations/es.json b/homeassistant/components/vilfo/.translations/es.json index 170faa197da9..a9d8b8c8990c 100644 --- a/homeassistant/components/vilfo/.translations/es.json +++ b/homeassistant/components/vilfo/.translations/es.json @@ -4,8 +4,8 @@ "already_configured": "Este router Vilfo ya est\u00e1 configurado." }, "error": { - "cannot_connect": "No se pudo conectar. Compruebe la informaci\u00f3n que proporcion\u00f3 e int\u00e9ntelo de nuevo.", - "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida. Compruebe el token de acceso e int\u00e9ntelo de nuevo.", + "cannot_connect": "No se pudo conectar. Comprueba la informaci\u00f3n que proporcionaste e int\u00e9ntalo de nuevo.", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida. Comprueba el token de acceso e int\u00e9ntalo de nuevo.", "unknown": "Se ha producido un error inesperado al configurar la integraci\u00f3n." }, "step": { diff --git a/homeassistant/components/vizio/.translations/zh-Hant.json b/homeassistant/components/vizio/.translations/zh-Hant.json index eb396428e68d..d5b6986e9dba 100644 --- a/homeassistant/components/vizio/.translations/zh-Hant.json +++ b/homeassistant/components/vizio/.translations/zh-Hant.json @@ -7,8 +7,8 @@ "error": { "cant_connect": "\u7121\u6cd5\u9023\u7dda\u81f3\u8a2d\u5099\u3002[\u8acb\u53c3\u8003\u8aaa\u660e\u6587\u4ef6](https://www.home-assistant.io/integrations/vizio/) \u4e26\u78ba\u8a8d\u4ee5\u4e0b\u9805\u76ee\uff1a\n- \u8a2d\u5099\u5df2\u958b\u6a5f\n- \u8a2d\u5099\u5df2\u9023\u7dda\u81f3\u7db2\u8def\n- \u586b\u5beb\u8cc7\u6599\u6b63\u78ba\n\u7136\u5f8c\u518d\u91cd\u65b0\u50b3\u9001\u3002", "complete_pairing failed": "\u7121\u6cd5\u5b8c\u6210\u914d\u5c0d\uff0c\u50b3\u9001\u524d\u3001\u8acb\u78ba\u5b9a\u6240\u8f38\u5165\u7684 PIN \u78bc\u3001\u540c\u6642\u96fb\u8996\u5df2\u7d93\u958b\u555f\u4e26\u9023\u7dda\u81f3\u7db2\u8def\u3002", - "host_exists": "\u4f9d\u4e3b\u6a5f\u7aef\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002", - "name_exists": "\u4f9d\u540d\u7a31\u4e4b Vizio \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002" + "host_exists": "\u4f9d\u4e3b\u6a5f\u7aef\u4e4b VIZIO \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002", + "name_exists": "\u4f9d\u540d\u7a31\u4e4b VIZIO \u5143\u4ef6\u8a2d\u5b9a\u5df2\u8a2d\u5b9a\u5b8c\u6210\u3002" }, "step": { "pair_tv": { @@ -19,11 +19,11 @@ "title": "\u5b8c\u6210\u914d\u5c0d\u904e\u7a0b" }, "pairing_complete": { - "description": "Vizio SmartCast \u8a2d\u5099\u5df2\u7d93\u9023\u7dda\u81f3 Home Assistant\u3002", + "description": "VIZIO SmartCast \u8a2d\u5099\u5df2\u7d93\u9023\u7dda\u81f3 Home Assistant\u3002", "title": "\u914d\u5c0d\u5b8c\u6210" }, "pairing_complete_import": { - "description": "Vizio SmartCast TV \u8a2d\u5099\u5df2\u9023\u7dda\u81f3 Home Assistant\u3002\n\n\u5b58\u53d6\u5bc6\u9470\u70ba\u300c**{access_token}**\u300d\u3002", + "description": "VIZIO SmartCast TV \u8a2d\u5099\u5df2\u9023\u7dda\u81f3 Home Assistant\u3002\n\n\u5b58\u53d6\u5bc6\u9470\u70ba\u300c**{access_token}**\u300d\u3002", "title": "\u914d\u5c0d\u5b8c\u6210" }, "user": { @@ -34,10 +34,10 @@ "name": "\u540d\u7a31" }, "description": "\u6b64\u96fb\u8996\u50c5\u9700\u5b58\u53d6\u5bc6\u9470\u3002\u5047\u5982\u60a8\u6b63\u5728\u8a2d\u5b9a\u96fb\u8996\u3001\u5c1a\u672a\u53d6\u5f97\u5bc6\u9470\uff0c\u4fdd\u6301\u7a7a\u767d\u4ee5\u9032\u884c\u914d\u5c0d\u904e\u7a0b\u3002", - "title": "\u8a2d\u5b9a Vizio SmartCast \u8a2d\u5099" + "title": "\u8a2d\u5b9a VIZIO SmartCast \u8a2d\u5099" } }, - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" }, "options": { "step": { @@ -48,9 +48,9 @@ "volume_step": "\u97f3\u91cf\u5927\u5c0f" }, "description": "\u5047\u5982\u60a8\u64c1\u6709 Smart TV\u3001\u53ef\u7531\u4f86\u6e90\u5217\u8868\u4e2d\u9078\u64c7\u6240\u8981\u904e\u6ffe\u5305\u542b\u6216\u6392\u9664\u7684 App\u3002\u3002", - "title": "\u66f4\u65b0 Vizo SmartCast \u9078\u9805" + "title": "\u66f4\u65b0 VIZIO SmartCast \u9078\u9805" } }, - "title": "\u66f4\u65b0 Vizo SmartCast \u9078\u9805" + "title": "\u66f4\u65b0 VIZIO SmartCast \u9078\u9805" } } \ No newline at end of file From 5ddcc225832c1da5f41fb16ed1609be02020743d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 13 Apr 2020 19:08:37 -0500 Subject: [PATCH 382/653] Convert sense to use DataUpdateCoordinator for trends data (#34160) * Convert sense to use DataUpdateCoordinator for trends * remove unused * request update right away * clarify * call async refresh later * Update homeassistant/components/sense/__init__.py Co-Authored-By: Paulus Schoutsen * Update homeassistant/components/sense/__init__.py Co-Authored-By: Paulus Schoutsen Co-authored-by: Paulus Schoutsen --- homeassistant/components/sense/__init__.py | 18 +++- .../components/sense/binary_sensor.py | 16 ++-- homeassistant/components/sense/const.py | 1 + homeassistant/components/sense/sensor.py | 91 +++++++++---------- 4 files changed, 68 insertions(+), 58 deletions(-) diff --git a/homeassistant/components/sense/__init__.py b/homeassistant/components/sense/__init__.py index 80e75bce4008..f295b0d926c2 100644 --- a/homeassistant/components/sense/__init__.py +++ b/homeassistant/components/sense/__init__.py @@ -17,6 +17,7 @@ from homeassistant.exceptions import ConfigEntryNotReady import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.event import async_track_time_interval +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import ( ACTIVE_UPDATE_RATE, @@ -27,6 +28,7 @@ from .const import ( SENSE_DEVICES_DATA, SENSE_DISCOVERED_DEVICES_DATA, SENSE_TIMEOUT_EXCEPTIONS, + SENSE_TRENDS_COORDINATOR, ) _LOGGER = logging.getLogger(__name__) @@ -111,9 +113,23 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): except SENSE_TIMEOUT_EXCEPTIONS: raise ConfigEntryNotReady + trends_coordinator = DataUpdateCoordinator( + hass, + _LOGGER, + name=f"Sense Trends {email}", + update_method=gateway.update_trend_data, + update_interval=timedelta(seconds=300), + ) + + # This can take longer than 60s and we already know + # sense is online since get_discovered_device_data was + # successful so we do it later. + hass.loop.create_task(trends_coordinator.async_request_refresh()) + hass.data[DOMAIN][entry.entry_id] = { SENSE_DATA: gateway, SENSE_DEVICES_DATA: sense_devices_data, + SENSE_TRENDS_COORDINATOR: trends_coordinator, SENSE_DISCOVERED_DEVICES_DATA: sense_discovered_devices, } @@ -122,7 +138,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): hass.config_entries.async_forward_entry_setup(entry, component) ) - async def async_sense_update(now): + async def async_sense_update(_): """Retrieve latest state.""" try: await gateway.update_realtime() diff --git a/homeassistant/components/sense/binary_sensor.py b/homeassistant/components/sense/binary_sensor.py index e3e12e4a9f16..384bc3d074ff 100644 --- a/homeassistant/components/sense/binary_sensor.py +++ b/homeassistant/components/sense/binary_sensor.py @@ -72,7 +72,6 @@ class SenseDevice(BinarySensorDevice): self._unique_id = f"{sense_monitor_id}-{self._id}" self._icon = sense_to_mdi(device["icon"]) self._sense_devices_data = sense_devices_data - self._undo_dispatch_subscription = None self._state = None self._available = False @@ -123,17 +122,14 @@ class SenseDevice(BinarySensorDevice): async def async_added_to_hass(self): """Register callbacks.""" - self._undo_dispatch_subscription = async_dispatcher_connect( - self.hass, - f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", - self._async_update_from_data, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", + self._async_update_from_data, + ) ) - async def async_will_remove_from_hass(self): - """Undo subscription.""" - if self._undo_dispatch_subscription: - self._undo_dispatch_subscription() - @callback def _async_update_from_data(self): """Get the latest data, update state. Must not do I/O.""" diff --git a/homeassistant/components/sense/const.py b/homeassistant/components/sense/const.py index 66b21dbcac98..8527a5d553e4 100644 --- a/homeassistant/components/sense/const.py +++ b/homeassistant/components/sense/const.py @@ -12,6 +12,7 @@ SENSE_DATA = "sense_data" SENSE_DEVICE_UPDATE = "sense_devices_update" SENSE_DEVICES_DATA = "sense_devices_data" SENSE_DISCOVERED_DEVICES_DATA = "sense_discovered_devices" +SENSE_TRENDS_COORDINATOR = "sense_trends_coorindator" ACTIVE_NAME = "Energy" ACTIVE_TYPE = "active" diff --git a/homeassistant/components/sense/sensor.py b/homeassistant/components/sense/sensor.py index 7c774ad8f81b..8ccb2ad12ff5 100644 --- a/homeassistant/components/sense/sensor.py +++ b/homeassistant/components/sense/sensor.py @@ -1,5 +1,4 @@ """Support for monitoring a Sense energy sensor.""" -from datetime import timedelta import logging from homeassistant.const import ( @@ -11,7 +10,6 @@ from homeassistant.const import ( from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity -from homeassistant.util import Throttle from .const import ( ACTIVE_NAME, @@ -28,12 +26,9 @@ from .const import ( SENSE_DEVICE_UPDATE, SENSE_DEVICES_DATA, SENSE_DISCOVERED_DEVICES_DATA, - SENSE_TIMEOUT_EXCEPTIONS, + SENSE_TRENDS_COORDINATOR, ) -MIN_TIME_BETWEEN_DAILY_UPDATES = timedelta(seconds=300) - - _LOGGER = logging.getLogger(__name__) @@ -70,17 +65,18 @@ async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the Sense sensor.""" data = hass.data[DOMAIN][config_entry.entry_id][SENSE_DATA] sense_devices_data = hass.data[DOMAIN][config_entry.entry_id][SENSE_DEVICES_DATA] + trends_coordinator = hass.data[DOMAIN][config_entry.entry_id][ + SENSE_TRENDS_COORDINATOR + ] - @Throttle(MIN_TIME_BETWEEN_DAILY_UPDATES) - async def update_trends(): - """Update the daily power usage.""" - await data.update_trend_data() + # Request only in case it takes longer + # than 60s + await trends_coordinator.async_request_refresh() sense_monitor_id = data.sense_monitor_id sense_devices = hass.data[DOMAIN][config_entry.entry_id][ SENSE_DISCOVERED_DEVICES_DATA ] - await data.update_trend_data() devices = [ SenseEnergyDevice(sense_devices_data, device, sense_monitor_id) @@ -114,8 +110,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): name, sensor_type, is_production, - update_trends, - var, + trends_coordinator, unique_id, ) ) @@ -146,7 +141,6 @@ class SenseActiveSensor(Entity): self._sensor_type = sensor_type self._is_production = is_production self._state = None - self._undo_dispatch_subscription = None @property def name(self): @@ -190,17 +184,14 @@ class SenseActiveSensor(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self._undo_dispatch_subscription = async_dispatcher_connect( - self.hass, - f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", - self._async_update_from_data, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", + self._async_update_from_data, + ) ) - async def async_will_remove_from_hass(self): - """Undo subscription.""" - if self._undo_dispatch_subscription: - self._undo_dispatch_subscription() - @callback def _async_update_from_data(self): """Update the sensor from the data. Must not do I/O.""" @@ -217,7 +208,7 @@ class SenseTrendsSensor(Entity): """Implementation of a Sense energy sensor.""" def __init__( - self, data, name, sensor_type, is_production, update_call, sensor_id, unique_id + self, data, name, sensor_type, is_production, trends_coordinator, unique_id, ): """Initialize the Sense sensor.""" name_type = PRODUCTION_NAME if is_production else CONSUMPTION_NAME @@ -226,10 +217,11 @@ class SenseTrendsSensor(Entity): self._available = False self._data = data self._sensor_type = sensor_type - self.update_sensor = update_call + self._coordinator = trends_coordinator self._is_production = is_production self._state = None self._unit_of_measurement = ENERGY_KILO_WATT_HOUR + self._had_any_update = False @property def name(self): @@ -239,12 +231,12 @@ class SenseTrendsSensor(Entity): @property def state(self): """Return the state of the sensor.""" - return self._state + return round(self._data.get_trend(self._sensor_type, self._is_production), 1) @property def available(self): - """Return the availability of the sensor.""" - return self._available + """Return if entity is available.""" + return self._had_any_update and self._coordinator.last_update_success @property def unit_of_measurement(self): @@ -266,18 +258,27 @@ class SenseTrendsSensor(Entity): """Return the unique id.""" return self._unique_id + @property + def should_poll(self): + """No need to poll. Coordinator notifies entity of updates.""" + return False + + @callback + def _async_update(self): + """Track if we had an update so we do not report zero data.""" + self._had_any_update = True + self.async_write_ha_state() + async def async_update(self): - """Get the latest data, update state.""" + """Update the entity. - try: - await self.update_sensor() - except SENSE_TIMEOUT_EXCEPTIONS: - _LOGGER.error("Timeout retrieving data") - return + Only used by the generic entity update service. + """ + await self._coordinator.async_request_refresh() - state = self._data.get_trend(self._sensor_type, self._is_production) - self._state = round(state, 1) - self._available = True + async def async_added_to_hass(self): + """When entity is added to hass.""" + self.async_on_remove(self._coordinator.async_add_listener(self._async_update)) class SenseEnergyDevice(Entity): @@ -292,7 +293,6 @@ class SenseEnergyDevice(Entity): self._unique_id = f"{sense_monitor_id}-{self._id}-{CONSUMPTION_ID}" self._icon = sense_to_mdi(device["icon"]) self._sense_devices_data = sense_devices_data - self._undo_dispatch_subscription = None self._state = None @property @@ -342,17 +342,14 @@ class SenseEnergyDevice(Entity): async def async_added_to_hass(self): """Register callbacks.""" - self._undo_dispatch_subscription = async_dispatcher_connect( - self.hass, - f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", - self._async_update_from_data, + self.async_on_remove( + async_dispatcher_connect( + self.hass, + f"{SENSE_DEVICE_UPDATE}-{self._sense_monitor_id}", + self._async_update_from_data, + ) ) - async def async_will_remove_from_hass(self): - """Undo subscription.""" - if self._undo_dispatch_subscription: - self._undo_dispatch_subscription() - @callback def _async_update_from_data(self): """Get the latest data, update state. Must not do I/O.""" From 89fe488b7ccee0cf368e284ae0afb812edb9772d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Apr 2020 17:38:39 -0700 Subject: [PATCH 383/653] Add websocket API to update config entry title (#34155) --- .../components/config/config_entries.py | 75 +++++++++++++------ .../components/config/test_config_entries.py | 23 ++++++ 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/config/config_entries.py b/homeassistant/components/config/config_entries.py index f80d63d437a1..584255764a34 100644 --- a/homeassistant/components/config/config_entries.py +++ b/homeassistant/components/config/config_entries.py @@ -8,6 +8,7 @@ from homeassistant.auth.permissions.const import CAT_CONFIG_ENTRIES from homeassistant.components import websocket_api from homeassistant.components.http import HomeAssistantView from homeassistant.const import HTTP_NOT_FOUND +from homeassistant.core import callback from homeassistant.exceptions import Unauthorized import homeassistant.helpers.config_validation as cv from homeassistant.helpers.data_entry_flow import ( @@ -28,6 +29,7 @@ async def async_setup(hass): hass.http.register_view(OptionManagerFlowIndexView(hass.config_entries.options)) hass.http.register_view(OptionManagerFlowResourceView(hass.config_entries.options)) + hass.components.websocket_api.async_register_command(config_entry_update) hass.components.websocket_api.async_register_command(config_entries_progress) hass.components.websocket_api.async_register_command(system_options_list) hass.components.websocket_api.async_register_command(system_options_update) @@ -64,30 +66,9 @@ class ConfigManagerEntryIndexView(HomeAssistantView): """List available config entries.""" hass = request.app["hass"] - results = [] - - for entry in hass.config_entries.async_entries(): - handler = config_entries.HANDLERS.get(entry.domain) - supports_options = ( - # Guard in case handler is no longer registered (custom compnoent etc) - handler is not None - # pylint: disable=comparison-with-callable - and handler.async_get_options_flow - != config_entries.ConfigFlow.async_get_options_flow - ) - results.append( - { - "entry_id": entry.entry_id, - "domain": entry.domain, - "title": entry.title, - "source": entry.source, - "state": entry.state, - "connection_class": entry.connection_class, - "supports_options": supports_options, - } - ) - - return self.json(results) + return self.json( + [entry_json(entry) for entry in hass.config_entries.async_entries()] + ) class ConfigManagerEntryResourceView(HomeAssistantView): @@ -287,6 +268,30 @@ async def system_options_update(hass, connection, msg): connection.send_result(msg["id"], entry.system_options.as_dict()) +@websocket_api.require_admin +@websocket_api.async_response +@websocket_api.websocket_command( + {"type": "config_entries/update", "entry_id": str, vol.Optional("title"): str} +) +async def config_entry_update(hass, connection, msg): + """Update config entry system options.""" + changes = dict(msg) + changes.pop("id") + changes.pop("type") + entry_id = changes.pop("entry_id") + + entry = hass.config_entries.async_get_entry(entry_id) + + if entry is None: + connection.send_error( + msg["id"], websocket_api.const.ERR_NOT_FOUND, "Config entry not found" + ) + return + + hass.config_entries.async_update_entry(entry, **changes) + connection.send_result(msg["id"], entry_json(entry)) + + @websocket_api.require_admin @websocket_api.async_response @websocket_api.websocket_command({"type": "config_entries/ignore_flow", "flow_id": str}) @@ -319,3 +324,25 @@ async def ignore_config_flow(hass, connection, msg): data={"unique_id": flow["context"]["unique_id"]}, ) connection.send_result(msg["id"]) + + +@callback +def entry_json(entry: config_entries.ConfigEntry) -> dict: + """Return JSON value of a config entry.""" + handler = config_entries.HANDLERS.get(entry.domain) + supports_options = ( + # Guard in case handler is no longer registered (custom compnoent etc) + handler is not None + # pylint: disable=comparison-with-callable + and handler.async_get_options_flow + != config_entries.ConfigFlow.async_get_options_flow + ) + return { + "entry_id": entry.entry_id, + "domain": entry.domain, + "title": entry.title, + "source": entry.source, + "state": entry.state, + "connection_class": entry.connection_class, + "supports_options": supports_options, + } diff --git a/tests/components/config/test_config_entries.py b/tests/components/config/test_config_entries.py index d944ebb6eb63..e56580bceb0e 100644 --- a/tests/components/config/test_config_entries.py +++ b/tests/components/config/test_config_entries.py @@ -614,6 +614,29 @@ async def test_update_system_options(hass, hass_ws_client): assert entry.system_options.disable_new_entities +async def test_update_entry(hass, hass_ws_client): + """Test that we can update entry.""" + assert await async_setup_component(hass, "config", {}) + ws_client = await hass_ws_client(hass) + + entry = MockConfigEntry(domain="demo", title="Initial Title") + entry.add_to_hass(hass) + + await ws_client.send_json( + { + "id": 5, + "type": "config_entries/update", + "entry_id": entry.entry_id, + "title": "Updated Title", + } + ) + response = await ws_client.receive_json() + + assert response["success"] + assert response["result"]["title"] == "Updated Title" + assert entry.title == "Updated Title" + + async def test_ignore_flow(hass, hass_ws_client): """Test we can ignore a flow.""" assert await async_setup_component(hass, "config", {}) From 5a9970e63ccad5ee84e73593a0edcdc4509833a6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Apr 2020 17:41:01 -0700 Subject: [PATCH 384/653] Dump states in event handler for HA_Stop (#33974) * Dump states in event handler for HA_Stop * Fix type --- homeassistant/core.py | 4 +++- homeassistant/helpers/entity_platform.py | 4 +--- homeassistant/helpers/event.py | 6 ++++-- homeassistant/helpers/restore_state.py | 7 +++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index b3f4a68e37fc..d35e7f48cc73 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -361,7 +361,9 @@ class HomeAssistant: self._track_task = False @callback - def async_run_job(self, target: Callable[..., None], *args: Any) -> None: + def async_run_job( + self, target: Callable[..., Union[None, Awaitable]], *args: Any + ) -> None: """Run a job from within the event loop. This method must be run in the event loop. diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index bf6db55a2da4..e4d52aaa3a17 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -300,9 +300,7 @@ class EntityPlatform: return self._async_unsub_polling = async_track_time_interval( - self.hass, - self._update_entity_states, # type: ignore - self.scan_interval, + self.hass, self._update_entity_states, self.scan_interval, ) async def _async_add_entity( diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 27ab35dbb3c6..266cb150e0ad 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -1,7 +1,7 @@ """Helpers for listening to events.""" from datetime import datetime, timedelta import functools as ft -from typing import Any, Callable, Dict, Iterable, Optional, Union, cast +from typing import Any, Awaitable, Callable, Dict, Iterable, Optional, Union, cast import attr @@ -274,7 +274,9 @@ call_later = threaded_listener_factory(async_call_later) @callback @bind_hass def async_track_time_interval( - hass: HomeAssistant, action: Callable[..., None], interval: timedelta + hass: HomeAssistant, + action: Callable[..., Union[None, Awaitable]], + interval: timedelta, ) -> CALLBACK_TYPE: """Add a listener that fires repetitively at every timedelta interval.""" remove = None diff --git a/homeassistant/helpers/restore_state.py b/homeassistant/helpers/restore_state.py index 57da6960078b..c75d9c840ed7 100644 --- a/homeassistant/helpers/restore_state.py +++ b/homeassistant/helpers/restore_state.py @@ -171,14 +171,13 @@ class RestoreStateData: def async_setup_dump(self, *args: Any) -> None: """Set up the restore state listeners.""" - @callback - def _async_dump_states(*_: Any) -> None: - self.hass.async_create_task(self.async_dump_states()) + async def _async_dump_states(*_: Any) -> None: + await self.async_dump_states() # Dump the initial states now. This helps minimize the risk of having # old states loaded by overwriting the last states once Home Assistant # has started and the old states have been read. - _async_dump_states() + self.hass.async_create_task(_async_dump_states()) # Dump states periodically async_track_time_interval(self.hass, _async_dump_states, STATE_DUMP_INTERVAL) From dbcc294d67e026bd9ee27e650a400b96a44941f5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Apr 2020 17:55:57 -0700 Subject: [PATCH 385/653] Use correct Ecobee fan constants (#34177) --- homeassistant/components/ecobee/climate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/ecobee/climate.py b/homeassistant/components/ecobee/climate.py index 6746192b8403..8c8961a153ff 100644 --- a/homeassistant/components/ecobee/climate.py +++ b/homeassistant/components/ecobee/climate.py @@ -556,7 +556,7 @@ class Thermostat(ClimateDevice): def set_fan_mode(self, fan_mode): """Set the fan mode. Valid values are "on" or "auto".""" - if fan_mode.lower() != STATE_ON and fan_mode.lower() != HVAC_MODE_AUTO: + if fan_mode.lower() not in (FAN_ON, FAN_AUTO): error = "Invalid fan_mode value: Valid values are 'on' or 'auto'" _LOGGER.error(error) return From bea354b82a0b1c7d85d48d764d204cfc6560d009 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Apr 2020 18:50:36 -0700 Subject: [PATCH 386/653] Allow WS queue to temporarily peak (#34175) * Allow WS queue to temporarily peak * Remove unused code --- .../components/websocket_api/const.py | 4 +- .../components/websocket_api/http.py | 44 +++++++++++-- tests/components/websocket_api/conftest.py | 16 ++--- tests/components/websocket_api/test_http.py | 66 +++++++++++++++++++ tests/components/websocket_api/test_init.py | 16 ----- tests/conftest.py | 4 +- 6 files changed, 116 insertions(+), 34 deletions(-) create mode 100644 tests/components/websocket_api/test_http.py diff --git a/homeassistant/components/websocket_api/const.py b/homeassistant/components/websocket_api/const.py index 183e70088531..121ea7496de4 100644 --- a/homeassistant/components/websocket_api/const.py +++ b/homeassistant/components/websocket_api/const.py @@ -16,7 +16,9 @@ WebSocketCommandHandler = Callable[[HomeAssistant, "ActiveConnection", dict], No DOMAIN = "websocket_api" URL = "/api/websocket" -MAX_PENDING_MSG = 512 +PENDING_MSG_PEAK = 512 +PENDING_MSG_PEAK_TIME = 5 +MAX_PENDING_MSG = 2048 ERR_ID_REUSE = "id_reuse" ERR_INVALID_FORMAT = "invalid_format" diff --git a/homeassistant/components/websocket_api/http.py b/homeassistant/components/websocket_api/http.py index 3921413fd28f..80ec35f5f7e0 100644 --- a/homeassistant/components/websocket_api/http.py +++ b/homeassistant/components/websocket_api/http.py @@ -10,6 +10,7 @@ import async_timeout from homeassistant.components.http import HomeAssistantView from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import callback +from homeassistant.helpers.event import async_call_later from .auth import AuthPhase, auth_required_message from .const import ( @@ -18,6 +19,8 @@ from .const import ( ERR_UNKNOWN_ERROR, JSON_DUMP, MAX_PENDING_MSG, + PENDING_MSG_PEAK, + PENDING_MSG_PEAK_TIME, SIGNAL_WEBSOCKET_CONNECTED, SIGNAL_WEBSOCKET_DISCONNECTED, URL, @@ -52,6 +55,7 @@ class WebSocketHandler: self._handle_task = None self._writer_task = None self._logger = logging.getLogger("{}.connection.{}".format(__name__, id(self))) + self._peak_checker_unsub = None async def _writer(self): """Write outgoing messages.""" @@ -83,6 +87,11 @@ class WebSocketHandler: await self.wsock.send_str(dumped) + # Clean up the peaker checker when we shut down the writer + if self._peak_checker_unsub: + self._peak_checker_unsub() + self._peak_checker_unsub = None + @callback def _send_message(self, message): """Send a message to the client. @@ -97,8 +106,35 @@ class WebSocketHandler: self._logger.error( "Client exceeded max pending messages [2]: %s", MAX_PENDING_MSG ) + self._cancel() + if self._to_write.qsize() < PENDING_MSG_PEAK: + if self._peak_checker_unsub: + self._peak_checker_unsub() + self._peak_checker_unsub = None + return + + if self._peak_checker_unsub is None: + self._peak_checker_unsub = async_call_later( + self.hass, PENDING_MSG_PEAK_TIME, self._check_write_peak + ) + + @callback + def _check_write_peak(self, _): + """Check that we are no longer above the write peak.""" + self._peak_checker_unsub = None + + if self._to_write.qsize() < PENDING_MSG_PEAK: + return + + self._logger.error( + "Client unable to keep up with pending messages. Stayed over %s for %s seconds", + PENDING_MSG_PEAK, + PENDING_MSG_PEAK_TIME, + ) + self._cancel() + @callback def _cancel(self): """Cancel the connection.""" @@ -111,13 +147,7 @@ class WebSocketHandler: wsock = self.wsock = web.WebSocketResponse(heartbeat=55) await wsock.prepare(request) self._logger.debug("Connected") - - # Py3.7+ - if hasattr(asyncio, "current_task"): - # pylint: disable=no-member - self._handle_task = asyncio.current_task() - else: - self._handle_task = asyncio.Task.current_task() + self._handle_task = asyncio.current_task() @callback def handle_hass_stop(event): diff --git a/tests/components/websocket_api/conftest.py b/tests/components/websocket_api/conftest.py index 65b9232821f1..93538f2b00bc 100644 --- a/tests/components/websocket_api/conftest.py +++ b/tests/components/websocket_api/conftest.py @@ -7,23 +7,23 @@ from homeassistant.setup import async_setup_component @pytest.fixture -def websocket_client(hass, hass_ws_client, hass_access_token): +async def websocket_client(hass, hass_ws_client): """Create a websocket client.""" - return hass.loop.run_until_complete(hass_ws_client(hass, hass_access_token)) + return await hass_ws_client(hass) @pytest.fixture -def no_auth_websocket_client(hass, loop, aiohttp_client): +async def no_auth_websocket_client(hass, aiohttp_client): """Websocket connection that requires authentication.""" - assert loop.run_until_complete(async_setup_component(hass, "websocket_api", {})) + assert await async_setup_component(hass, "websocket_api", {}) - client = loop.run_until_complete(aiohttp_client(hass.http.app)) - ws = loop.run_until_complete(client.ws_connect(URL)) + client = await aiohttp_client(hass.http.app) + ws = await client.ws_connect(URL) - auth_ok = loop.run_until_complete(ws.receive_json()) + auth_ok = await ws.receive_json() assert auth_ok["type"] == TYPE_AUTH_REQUIRED yield ws if not ws.closed: - loop.run_until_complete(ws.close()) + await ws.close() diff --git a/tests/components/websocket_api/test_http.py b/tests/components/websocket_api/test_http.py new file mode 100644 index 000000000000..33a019b2e70f --- /dev/null +++ b/tests/components/websocket_api/test_http.py @@ -0,0 +1,66 @@ +"""Test Websocket API http module.""" +from datetime import timedelta + +from aiohttp import WSMsgType +from asynctest import patch +import pytest + +from homeassistant.components.websocket_api import const, http +from homeassistant.util.dt import utcnow + +from tests.common import async_fire_time_changed + + +@pytest.fixture +def mock_low_queue(): + """Mock a low queue.""" + with patch("homeassistant.components.websocket_api.http.MAX_PENDING_MSG", 5): + yield + + +@pytest.fixture +def mock_low_peak(): + """Mock a low queue.""" + with patch("homeassistant.components.websocket_api.http.PENDING_MSG_PEAK", 5): + yield + + +async def test_pending_msg_overflow(hass, mock_low_queue, websocket_client): + """Test get_panels command.""" + for idx in range(10): + await websocket_client.send_json({"id": idx + 1, "type": "ping"}) + msg = await websocket_client.receive() + assert msg.type == WSMsgType.close + + +async def test_pending_msg_peak(hass, mock_low_peak, hass_ws_client, caplog): + """Test pending msg overflow command.""" + orig_handler = http.WebSocketHandler + instance = None + + def instantiate_handler(*args): + nonlocal instance + instance = orig_handler(*args) + return instance + + with patch( + "homeassistant.components.websocket_api.http.WebSocketHandler", + instantiate_handler, + ): + websocket_client = await hass_ws_client() + + # Kill writer task and fill queue past peak + for _ in range(5): + instance._to_write.put_nowait(None) + + # Trigger the peak check + instance._send_message({}) + + async_fire_time_changed( + hass, utcnow() + timedelta(seconds=const.PENDING_MSG_PEAK_TIME + 1) + ) + + msg = await websocket_client.receive() + assert msg.type == WSMsgType.close + + assert "Client unable to keep up with pending messages" in caplog.text diff --git a/tests/components/websocket_api/test_init.py b/tests/components/websocket_api/test_init.py index d32f55516aa9..041c0e76533f 100644 --- a/tests/components/websocket_api/test_init.py +++ b/tests/components/websocket_api/test_init.py @@ -2,19 +2,11 @@ from unittest.mock import Mock, patch from aiohttp import WSMsgType -import pytest import voluptuous as vol from homeassistant.components.websocket_api import const, messages -@pytest.fixture -def mock_low_queue(): - """Mock a low queue.""" - with patch("homeassistant.components.websocket_api.http.MAX_PENDING_MSG", 5): - yield - - async def test_invalid_message_format(websocket_client): """Test sending invalid JSON.""" await websocket_client.send_json({"type": 5}) @@ -46,14 +38,6 @@ async def test_quiting_hass(hass, websocket_client): assert msg.type == WSMsgType.CLOSE -async def test_pending_msg_overflow(hass, mock_low_queue, websocket_client): - """Test get_panels command.""" - for idx in range(10): - await websocket_client.send_json({"id": idx + 1, "type": "ping"}) - msg = await websocket_client.receive() - assert msg.type == WSMsgType.close - - async def test_unknown_command(websocket_client): """Test get_panels command.""" await websocket_client.send_json({"id": 5, "type": "unknown_command"}) diff --git a/tests/conftest.py b/tests/conftest.py index f93d51903506..89a3065bcec8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -228,10 +228,10 @@ def hass_client(hass, aiohttp_client, hass_access_token): @pytest.fixture -def hass_ws_client(aiohttp_client, hass_access_token): +def hass_ws_client(aiohttp_client, hass_access_token, hass): """Websocket client fixture connected to websocket server.""" - async def create_client(hass, access_token=hass_access_token): + async def create_client(hass=hass, access_token=hass_access_token): """Create a websocket client.""" assert await async_setup_component(hass, "websocket_api", {}) From 45beb3c6e40ffba8cead50076ed87da5a1669ce1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 14 Apr 2020 00:56:02 -0500 Subject: [PATCH 387/653] Fix typo in sense constant SENSE_TRENDS_COORDINATOR (#34181) --- homeassistant/components/sense/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sense/const.py b/homeassistant/components/sense/const.py index 8527a5d553e4..07dacc288b5f 100644 --- a/homeassistant/components/sense/const.py +++ b/homeassistant/components/sense/const.py @@ -12,7 +12,7 @@ SENSE_DATA = "sense_data" SENSE_DEVICE_UPDATE = "sense_devices_update" SENSE_DEVICES_DATA = "sense_devices_data" SENSE_DISCOVERED_DEVICES_DATA = "sense_discovered_devices" -SENSE_TRENDS_COORDINATOR = "sense_trends_coorindator" +SENSE_TRENDS_COORDINATOR = "sense_trends_coordinator" ACTIVE_NAME = "Energy" ACTIVE_TYPE = "active" From d93c09327abdbaa40e94f782042c4b1d204ac2e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Apr 2020 23:46:41 -0700 Subject: [PATCH 388/653] Report unserializable data in websocket (#34072) * Report unserializable data in websocket * Fix tests * log types too --- .../components/websocket_api/http.py | 15 +++-- homeassistant/util/json.py | 37 ++++++++--- tests/components/websocket_api/test_http.py | 16 +++++ tests/util/test_json.py | 65 ++++++++++++++----- 4 files changed, 105 insertions(+), 28 deletions(-) diff --git a/homeassistant/components/websocket_api/http.py b/homeassistant/components/websocket_api/http.py index 80ec35f5f7e0..b22eff150bac 100644 --- a/homeassistant/components/websocket_api/http.py +++ b/homeassistant/components/websocket_api/http.py @@ -11,6 +11,10 @@ from homeassistant.components.http import HomeAssistantView from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import callback from homeassistant.helpers.event import async_call_later +from homeassistant.util.json import ( + find_paths_unserializable_data, + format_unserializable_data, +) from .auth import AuthPhase, auth_required_message from .const import ( @@ -74,15 +78,18 @@ class WebSocketHandler: try: dumped = JSON_DUMP(message) - except (ValueError, TypeError) as err: - self._logger.error( - "Unable to serialize to JSON: %s\n%s", err, message - ) + except (ValueError, TypeError): await self.wsock.send_json( error_message( message["id"], ERR_UNKNOWN_ERROR, "Invalid JSON in response" ) ) + self._logger.error( + "Unable to serialize to JSON. Bad data found at %s", + format_unserializable_data( + find_paths_unserializable_data(message, dump=JSON_DUMP) + ), + ) continue await self.wsock.send_str(dumped) diff --git a/homeassistant/util/json.py b/homeassistant/util/json.py index 94dc816e03c7..c5da910fae1a 100644 --- a/homeassistant/util/json.py +++ b/homeassistant/util/json.py @@ -4,8 +4,9 @@ import json import logging import os import tempfile -from typing import Any, Dict, List, Optional, Type, Union +from typing import Any, Callable, Dict, List, Optional, Type, Union +from homeassistant.core import Event, State from homeassistant.exceptions import HomeAssistantError _LOGGER = logging.getLogger(__name__) @@ -56,7 +57,7 @@ def save_json( json_data = json.dumps(data, sort_keys=True, indent=4, cls=encoder) except TypeError: # pylint: disable=no-member - msg = f"Failed to serialize to JSON: {filename}. Bad data found at {', '.join(find_paths_unserializable_data(data))}" + msg = f"Failed to serialize to JSON: {filename}. Bad data at {format_unserializable_data(find_paths_unserializable_data(data))}" _LOGGER.error(msg) raise SerializationError(msg) @@ -85,30 +86,48 @@ def save_json( _LOGGER.error("JSON replacement cleanup failed: %s", err) -def find_paths_unserializable_data(bad_data: Any) -> List[str]: +def format_unserializable_data(data: Dict[str, Any]) -> str: + """Format output of find_paths in a friendly way. + + Format is comma separated: =() + """ + return ", ".join(f"{path}={value}({type(value)}" for path, value in data.items()) + + +def find_paths_unserializable_data( + bad_data: Any, *, dump: Callable[[Any], str] = json.dumps +) -> Dict[str, Any]: """Find the paths to unserializable data. This method is slow! Only use for error handling. """ to_process = deque([(bad_data, "$")]) - invalid = [] + invalid = {} while to_process: obj, obj_path = to_process.popleft() try: - json.dumps(obj) + dump(obj) continue - except TypeError: + except (ValueError, TypeError): pass + # We convert states and events to dict so we can find bad data inside it + if isinstance(obj, State): + obj_path += f"(state: {obj.entity_id})" + obj = obj.as_dict() + elif isinstance(obj, Event): + obj_path += f"(event: {obj.event_type})" + obj = obj.as_dict() + if isinstance(obj, dict): for key, value in obj.items(): try: # Is key valid? - json.dumps({key: None}) + dump({key: None}) except TypeError: - invalid.append(f"{obj_path}") + invalid[f"{obj_path}"] = key else: # Process value to_process.append((value, f"{obj_path}.{key}")) @@ -116,6 +135,6 @@ def find_paths_unserializable_data(bad_data: Any) -> List[str]: for idx, value in enumerate(obj): to_process.append((value, f"{obj_path}[{idx}]")) else: - invalid.append(obj_path) + invalid[obj_path] = obj return invalid diff --git a/tests/components/websocket_api/test_http.py b/tests/components/websocket_api/test_http.py index 33a019b2e70f..9082337ccc84 100644 --- a/tests/components/websocket_api/test_http.py +++ b/tests/components/websocket_api/test_http.py @@ -64,3 +64,19 @@ async def test_pending_msg_peak(hass, mock_low_peak, hass_ws_client, caplog): assert msg.type == WSMsgType.close assert "Client unable to keep up with pending messages" in caplog.text + + +async def test_non_json_message(hass, websocket_client, caplog): + """Test trying to serialze non JSON objects.""" + bad_data = object() + hass.states.async_set("test_domain.entity", "testing", {"bad": bad_data}) + await websocket_client.send_json({"id": 5, "type": "get_states"}) + + msg = await websocket_client.receive_json() + assert msg["id"] == 5 + assert msg["type"] == const.TYPE_RESULT + assert not msg["success"] + assert ( + f"Unable to serialize to JSON. Bad data found at $.result[0](state: test_domain.entity).attributes.bad={bad_data}(" + in caplog.text + ) diff --git a/tests/util/test_json.py b/tests/util/test_json.py index ed699c8ededc..258f266ff78c 100644 --- a/tests/util/test_json.py +++ b/tests/util/test_json.py @@ -1,5 +1,8 @@ """Test Home Assistant json utility functions.""" -from json import JSONEncoder +from datetime import datetime +from functools import partial +from json import JSONEncoder, dumps +import math import os import sys from tempfile import mkdtemp @@ -8,6 +11,7 @@ from unittest.mock import Mock import pytest +from homeassistant.core import Event, State from homeassistant.exceptions import HomeAssistantError from homeassistant.util.json import ( SerializationError, @@ -77,8 +81,9 @@ def test_save_bad_data(): with pytest.raises(SerializationError) as excinfo: save_json("test4", {"hello": set()}) - assert "Failed to serialize to JSON: test4. Bad data found at $.hello" in str( - excinfo.value + assert ( + "Failed to serialize to JSON: test4. Bad data at $.hello=set()(" + in str(excinfo.value) ) @@ -109,16 +114,46 @@ def test_custom_encoder(): def test_find_unserializable_data(): """Find unserializeable data.""" - assert find_paths_unserializable_data(1) == [] - assert find_paths_unserializable_data([1, 2]) == [] - assert find_paths_unserializable_data({"something": "yo"}) == [] + assert find_paths_unserializable_data(1) == {} + assert find_paths_unserializable_data([1, 2]) == {} + assert find_paths_unserializable_data({"something": "yo"}) == {} - assert find_paths_unserializable_data({"something": set()}) == ["$.something"] - assert find_paths_unserializable_data({"something": [1, set()]}) == [ - "$.something[1]" - ] - assert find_paths_unserializable_data([1, {"bla": set(), "blub": set()}]) == [ - "$[1].bla", - "$[1].blub", - ] - assert find_paths_unserializable_data({("A",): 1}) == ["$"] + assert find_paths_unserializable_data({"something": set()}) == { + "$.something": set() + } + assert find_paths_unserializable_data({"something": [1, set()]}) == { + "$.something[1]": set() + } + assert find_paths_unserializable_data([1, {"bla": set(), "blub": set()}]) == { + "$[1].bla": set(), + "$[1].blub": set(), + } + assert find_paths_unserializable_data({("A",): 1}) == {"$": ("A",)} + assert math.isnan( + find_paths_unserializable_data( + float("nan"), dump=partial(dumps, allow_nan=False) + )["$"] + ) + + # Test custom encoder + State support. + + class MockJSONEncoder(JSONEncoder): + """Mock JSON encoder.""" + + def default(self, o): + """Mock JSON encode method.""" + if isinstance(o, datetime): + return o.isoformat() + return super().default(o) + + bad_data = object() + + assert find_paths_unserializable_data( + [State("mock_domain.mock_entity", "on", {"bad": bad_data})], + dump=partial(dumps, cls=MockJSONEncoder), + ) == {"$[0](state: mock_domain.mock_entity).attributes.bad": bad_data} + + assert find_paths_unserializable_data( + [Event("bad_event", {"bad_attribute": bad_data})], + dump=partial(dumps, cls=MockJSONEncoder), + ) == {"$[0](event: bad_event).data.bad_attribute": bad_data} From c555ab1a84b9602de67f66f5f5c4118a536d39f6 Mon Sep 17 00:00:00 2001 From: mezz64 <2854333+mezz64@users.noreply.github.com> Date: Tue, 14 Apr 2020 03:16:41 -0400 Subject: [PATCH 389/653] Update pyHik to 0.2.7 (#34183) --- homeassistant/components/hikvision/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/hikvision/manifest.json b/homeassistant/components/hikvision/manifest.json index 8722d97e22a6..e6dec7b8e89e 100644 --- a/homeassistant/components/hikvision/manifest.json +++ b/homeassistant/components/hikvision/manifest.json @@ -2,6 +2,6 @@ "domain": "hikvision", "name": "Hikvision", "documentation": "https://www.home-assistant.io/integrations/hikvision", - "requirements": ["pyhik==0.2.5"], + "requirements": ["pyhik==0.2.7"], "codeowners": ["@mezz64"] } diff --git a/requirements_all.txt b/requirements_all.txt index c05a5c178ec1..2a502a55db45 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1317,7 +1317,7 @@ pyhaversion==3.3.0 pyheos==0.6.0 # homeassistant.components.hikvision -pyhik==0.2.5 +pyhik==0.2.7 # homeassistant.components.hive pyhiveapi==0.2.20.1 From a9908f0a94b3b185cd0bf54702a0f959b5c645c2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Apr 2020 00:56:50 -0700 Subject: [PATCH 390/653] Ecobee to use HVAC mode heat-cool instead of auto (#34193) --- homeassistant/components/ecobee/climate.py | 16 ++++++++-------- tests/components/ecobee/test_climate.py | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/ecobee/climate.py b/homeassistant/components/ecobee/climate.py index 8c8961a153ff..89f464452f85 100644 --- a/homeassistant/components/ecobee/climate.py +++ b/homeassistant/components/ecobee/climate.py @@ -15,9 +15,9 @@ from homeassistant.components.climate.const import ( CURRENT_HVAC_IDLE, FAN_AUTO, FAN_ON, - HVAC_MODE_AUTO, HVAC_MODE_COOL, HVAC_MODE_HEAT, + HVAC_MODE_HEAT_COOL, HVAC_MODE_OFF, PRESET_AWAY, PRESET_NONE, @@ -64,7 +64,7 @@ ECOBEE_HVAC_TO_HASS = collections.OrderedDict( [ ("heat", HVAC_MODE_HEAT), ("cool", HVAC_MODE_COOL), - ("auto", HVAC_MODE_AUTO), + ("auto", HVAC_MODE_HEAT_COOL), ("off", HVAC_MODE_OFF), ("auxHeatOnly", HVAC_MODE_HEAT), ] @@ -259,7 +259,7 @@ class Thermostat(ClimateDevice): self.thermostat = self.data.ecobee.get_thermostat(self.thermostat_index) self._name = self.thermostat["name"] self.vacation = None - self._last_active_hvac_mode = HVAC_MODE_AUTO + self._last_active_hvac_mode = HVAC_MODE_HEAT_COOL self._operation_list = [] if ( @@ -270,7 +270,7 @@ class Thermostat(ClimateDevice): if self.thermostat["settings"]["coolStages"]: self._operation_list.append(HVAC_MODE_COOL) if len(self._operation_list) == 2: - self._operation_list.insert(0, HVAC_MODE_AUTO) + self._operation_list.insert(0, HVAC_MODE_HEAT_COOL) self._operation_list.append(HVAC_MODE_OFF) self._preset_modes = { @@ -347,21 +347,21 @@ class Thermostat(ClimateDevice): @property def target_temperature_low(self): """Return the lower bound temperature we try to reach.""" - if self.hvac_mode == HVAC_MODE_AUTO: + if self.hvac_mode == HVAC_MODE_HEAT_COOL: return self.thermostat["runtime"]["desiredHeat"] / 10.0 return None @property def target_temperature_high(self): """Return the upper bound temperature we try to reach.""" - if self.hvac_mode == HVAC_MODE_AUTO: + if self.hvac_mode == HVAC_MODE_HEAT_COOL: return self.thermostat["runtime"]["desiredCool"] / 10.0 return None @property def target_temperature(self): """Return the temperature we try to reach.""" - if self.hvac_mode == HVAC_MODE_AUTO: + if self.hvac_mode == HVAC_MODE_HEAT_COOL: return None if self.hvac_mode == HVAC_MODE_HEAT: return self.thermostat["runtime"]["desiredHeat"] / 10.0 @@ -599,7 +599,7 @@ class Thermostat(ClimateDevice): high_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH) temp = kwargs.get(ATTR_TEMPERATURE) - if self.hvac_mode == HVAC_MODE_AUTO and ( + if self.hvac_mode == HVAC_MODE_HEAT_COOL and ( low_temp is not None or high_temp is not None ): self.set_auto_temp_hold(low_temp, high_temp) diff --git a/tests/components/ecobee/test_climate.py b/tests/components/ecobee/test_climate.py index 63476a9b7175..4e88d7083c43 100644 --- a/tests/components/ecobee/test_climate.py +++ b/tests/components/ecobee/test_climate.py @@ -107,25 +107,25 @@ class TestEcobee(unittest.TestCase): def test_hvac_mode(self): """Test current operation property.""" - assert "auto" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "heat_cool" self.ecobee["settings"]["hvacMode"] = "heat" - assert "heat" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "heat" self.ecobee["settings"]["hvacMode"] = "cool" - assert "cool" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "cool" self.ecobee["settings"]["hvacMode"] = "auxHeatOnly" - assert "heat" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "heat" self.ecobee["settings"]["hvacMode"] = "off" - assert "off" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "off" def test_hvac_modes(self): """Test operation list property.""" - assert ["auto", "heat", "cool", "off"] == self.thermostat.hvac_modes + assert ["heat_cool", "heat", "cool", "off"] == self.thermostat.hvac_modes def test_hvac_mode2(self): """Test operation mode property.""" - assert "auto" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "heat_cool" self.ecobee["settings"]["hvacMode"] = "heat" - assert "heat" == self.thermostat.hvac_mode + assert self.thermostat.hvac_mode == "heat" def test_device_state_attributes(self): """Test device state attributes property.""" @@ -222,7 +222,7 @@ class TestEcobee(unittest.TestCase): def test_set_hvac_mode(self): """Test operation mode setter.""" self.data.reset_mock() - self.thermostat.set_hvac_mode("auto") + self.thermostat.set_hvac_mode("heat_cool") self.data.ecobee.set_hvac_mode.assert_has_calls([mock.call(1, "auto")]) self.data.reset_mock() self.thermostat.set_hvac_mode("heat") From 600db816a2487cfc46e21d5afde15dc334b044c7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 14 Apr 2020 10:02:35 +0200 Subject: [PATCH 391/653] Upgrade holidays to 0.10.2 (#34189) --- homeassistant/components/workday/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/workday/manifest.json b/homeassistant/components/workday/manifest.json index f6fade69ac45..393a251bb7fd 100644 --- a/homeassistant/components/workday/manifest.json +++ b/homeassistant/components/workday/manifest.json @@ -2,7 +2,7 @@ "domain": "workday", "name": "Workday", "documentation": "https://www.home-assistant.io/integrations/workday", - "requirements": ["holidays==0.10.1"], + "requirements": ["holidays==0.10.2"], "codeowners": ["@fabaff"], "quality_scale": "internal" } diff --git a/requirements_all.txt b/requirements_all.txt index 2a502a55db45..940176538e75 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -700,7 +700,7 @@ hlk-sw16==0.0.8 hole==0.5.1 # homeassistant.components.workday -holidays==0.10.1 +holidays==0.10.2 # homeassistant.components.frontend home-assistant-frontend==20200407.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index bf7ffbc4d97e..4674d5cbf42c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -278,7 +278,7 @@ herepy==2.0.0 hole==0.5.1 # homeassistant.components.workday -holidays==0.10.1 +holidays==0.10.2 # homeassistant.components.frontend home-assistant-frontend==20200407.2 From f87c44e544549a8c1961d97bf3ad047c127c437d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Apr 2020 02:43:22 -0700 Subject: [PATCH 392/653] Test updating non existing config entry (#34191) --- .../components/config/test_config_entries.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/components/config/test_config_entries.py b/tests/components/config/test_config_entries.py index e56580bceb0e..9eb9a741da0e 100644 --- a/tests/components/config/test_config_entries.py +++ b/tests/components/config/test_config_entries.py @@ -637,6 +637,25 @@ async def test_update_entry(hass, hass_ws_client): assert entry.title == "Updated Title" +async def test_update_entry_nonexisting(hass, hass_ws_client): + """Test that we can update entry.""" + assert await async_setup_component(hass, "config", {}) + ws_client = await hass_ws_client(hass) + + await ws_client.send_json( + { + "id": 5, + "type": "config_entries/update", + "entry_id": "non_existing", + "title": "Updated Title", + } + ) + response = await ws_client.receive_json() + + assert not response["success"] + assert response["error"]["code"] == "not_found" + + async def test_ignore_flow(hass, hass_ws_client): """Test we can ignore a flow.""" assert await async_setup_component(hass, "config", {}) From 91d35c7c5ce63616c0eef40206e0b41779524ffc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 14 Apr 2020 12:33:06 +0200 Subject: [PATCH 393/653] Upgrade yamllint to 1.22.0 (#34198) --- .pre-commit-config.yaml | 2 +- requirements_test_pre_commit.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1c153ca82532..4bc8a956f1c0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: - --branch=master - --branch=rc - repo: https://github.com/adrienverge/yamllint.git - rev: v1.21.0 + rev: v1.22.0 hooks: - id: yamllint - repo: https://github.com/prettier/prettier diff --git a/requirements_test_pre_commit.txt b/requirements_test_pre_commit.txt index f6575ac8404d..663d5dd89e37 100644 --- a/requirements_test_pre_commit.txt +++ b/requirements_test_pre_commit.txt @@ -8,4 +8,4 @@ flake8==3.7.9 isort==4.3.21 pydocstyle==5.0.2 pyupgrade==2.1.0 -yamllint==1.21.0 +yamllint==1.22.0 From 6fa29d6e2eee3706092cfda16c29ad0b3e4379e4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Apr 2020 04:31:38 -0700 Subject: [PATCH 394/653] Fix Hue brightness values over 127 off by one (#34190) --- homeassistant/components/hue/light.py | 19 ++++++++++++++++--- tests/components/hue/test_light.py | 12 ++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/hue/light.py b/homeassistant/components/hue/light.py index 4d81108c5eb4..b808dd0594d1 100644 --- a/homeassistant/components/hue/light.py +++ b/homeassistant/components/hue/light.py @@ -184,6 +184,16 @@ def async_update_items(bridge, api, current, async_add_entities, create_item): async_add_entities(new_items) +def hue_brightness_to_hass(value): + """Convert hue brightness 1..254 to hass format 0..255.""" + return min(255, round((value / 254) * 255)) + + +def hass_to_hue_brightness(value): + """Convert hass brightness 0..255 to hue 1..254 scale.""" + return max(1, round((value / 255) * 254)) + + class HueLight(Light): """Representation of a Hue light.""" @@ -245,8 +255,11 @@ class HueLight(Light): def brightness(self): """Return the brightness of this light between 0..255.""" if self.is_group: - return self.light.action.get("bri") - return self.light.state.get("bri") + bri = self.light.action.get("bri") + else: + bri = self.light.state.get("bri") + + return hue_brightness_to_hass(bri) @property def _color_mode(self): @@ -372,7 +385,7 @@ class HueLight(Light): command["ct"] = max(self.min_mireds, min(temp, self.max_mireds)) if ATTR_BRIGHTNESS in kwargs: - command["bri"] = kwargs[ATTR_BRIGHTNESS] + command["bri"] = hass_to_hue_brightness(kwargs[ATTR_BRIGHTNESS]) flash = kwargs.get(ATTR_FLASH) diff --git a/tests/components/hue/test_light.py b/tests/components/hue/test_light.py index fede00cfd7d6..85ef00520294 100644 --- a/tests/components/hue/test_light.py +++ b/tests/components/hue/test_light.py @@ -222,7 +222,7 @@ async def test_lights(hass, mock_bridge): lamp_1 = hass.states.get("light.hue_lamp_1") assert lamp_1 is not None assert lamp_1.state == "on" - assert lamp_1.attributes["brightness"] == 144 + assert lamp_1.attributes["brightness"] == 145 assert lamp_1.attributes["hs_color"] == (36.067, 69.804) lamp_2 = hass.states.get("light.hue_lamp_2") @@ -238,7 +238,7 @@ async def test_lights_color_mode(hass, mock_bridge): lamp_1 = hass.states.get("light.hue_lamp_1") assert lamp_1 is not None assert lamp_1.state == "on" - assert lamp_1.attributes["brightness"] == 144 + assert lamp_1.attributes["brightness"] == 145 assert lamp_1.attributes["hs_color"] == (36.067, 69.804) assert "color_temp" not in lamp_1.attributes @@ -258,7 +258,7 @@ async def test_lights_color_mode(hass, mock_bridge): lamp_1 = hass.states.get("light.hue_lamp_1") assert lamp_1 is not None assert lamp_1.state == "on" - assert lamp_1.attributes["brightness"] == 144 + assert lamp_1.attributes["brightness"] == 145 assert lamp_1.attributes["color_temp"] == 467 assert "hs_color" not in lamp_1.attributes @@ -277,7 +277,7 @@ async def test_groups(hass, mock_bridge): lamp_1 = hass.states.get("light.group_1") assert lamp_1 is not None assert lamp_1.state == "on" - assert lamp_1.attributes["brightness"] == 254 + assert lamp_1.attributes["brightness"] == 255 assert lamp_1.attributes["color_temp"] == 250 lamp_2 = hass.states.get("light.group_2") @@ -328,7 +328,7 @@ async def test_new_group_discovered(hass, mock_bridge): new_group = hass.states.get("light.group_3") assert new_group is not None assert new_group.state == "on" - assert new_group.attributes["brightness"] == 153 + assert new_group.attributes["brightness"] == 154 assert new_group.attributes["color_temp"] == 250 @@ -448,7 +448,7 @@ async def test_other_group_update(hass, mock_bridge): assert group_2 is not None assert group_2.name == "Group 2" assert group_2.state == "on" - assert group_2.attributes["brightness"] == 153 + assert group_2.attributes["brightness"] == 154 assert group_2.attributes["color_temp"] == 250 updated_group_response = dict(GROUP_RESPONSE) From 52fe19ca31c9c0e85a8978ede4bfd4d1c4259edb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 14 Apr 2020 14:28:37 +0200 Subject: [PATCH 395/653] Upgrade spotipy to 2.11.1 (#34201) --- homeassistant/components/spotify/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/spotify/manifest.json b/homeassistant/components/spotify/manifest.json index f246c657708a..bbbfb75a5365 100644 --- a/homeassistant/components/spotify/manifest.json +++ b/homeassistant/components/spotify/manifest.json @@ -2,7 +2,7 @@ "domain": "spotify", "name": "Spotify", "documentation": "https://www.home-assistant.io/integrations/spotify", - "requirements": ["spotipy==2.10.0"], + "requirements": ["spotipy==2.11.1"], "zeroconf": ["_spotify-connect._tcp.local."], "dependencies": ["http"], "codeowners": ["@frenck"], diff --git a/requirements_all.txt b/requirements_all.txt index 940176538e75..5e6e5c8b56e8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1944,7 +1944,7 @@ spiderpy==1.3.1 spotcrime==1.0.4 # homeassistant.components.spotify -spotipy==2.10.0 +spotipy==2.11.1 # homeassistant.components.recorder # homeassistant.components.sql diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4674d5cbf42c..7b9665462a73 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -728,7 +728,7 @@ somecomfort==0.5.2 speak2mary==1.4.0 # homeassistant.components.spotify -spotipy==2.10.0 +spotipy==2.11.1 # homeassistant.components.recorder # homeassistant.components.sql From 994e83811f2443cb7c74258a8a1fbad8ad097d00 Mon Sep 17 00:00:00 2001 From: Kris Bennett <1435262+i00@users.noreply.github.com> Date: Wed, 15 Apr 2020 02:41:19 +1000 Subject: [PATCH 396/653] Add Android TV screen capture option and use library screencap (#34074) --- .../components/androidtv/manifest.json | 4 +-- .../components/androidtv/media_player.py | 23 +++++++------ requirements_all.txt | 4 +-- requirements_test_all.txt | 4 +-- .../components/androidtv/test_media_player.py | 33 +++++++++++++++++++ 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/androidtv/manifest.json b/homeassistant/components/androidtv/manifest.json index 9101e342a232..3ae3c64986fb 100644 --- a/homeassistant/components/androidtv/manifest.json +++ b/homeassistant/components/androidtv/manifest.json @@ -3,8 +3,8 @@ "name": "Android TV", "documentation": "https://www.home-assistant.io/integrations/androidtv", "requirements": [ - "adb-shell==0.1.1", - "androidtv==0.0.39", + "adb-shell==0.1.3", + "androidtv==0.0.40", "pure-python-adb==0.2.2.dev0" ], "codeowners": ["@JeffLIrion"] diff --git a/homeassistant/components/androidtv/media_player.py b/homeassistant/components/androidtv/media_player.py index f78d88ab3ece..a9d7f0ad5bed 100644 --- a/homeassistant/components/androidtv/media_player.py +++ b/homeassistant/components/androidtv/media_player.py @@ -1,5 +1,4 @@ """Support for functionality to interact with Android TV / Fire TV devices.""" -import binascii from datetime import datetime import functools import logging @@ -89,12 +88,14 @@ CONF_GET_SOURCES = "get_sources" CONF_STATE_DETECTION_RULES = "state_detection_rules" CONF_TURN_ON_COMMAND = "turn_on_command" CONF_TURN_OFF_COMMAND = "turn_off_command" +CONF_SCREENCAP = "screencap" DEFAULT_NAME = "Android TV" DEFAULT_PORT = 5555 DEFAULT_ADB_SERVER_PORT = 5037 DEFAULT_GET_SOURCES = True DEFAULT_DEVICE_CLASS = "auto" +DEFAULT_SCREENCAP = True DEVICE_ANDROIDTV = "androidtv" DEVICE_FIRETV = "firetv" @@ -146,6 +147,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {cv.string: ha_state_detection_rules_validator(vol.Invalid)} ), vol.Optional(CONF_EXCLUDE_UNNAMED_APPS, default=False): cv.boolean, + vol.Optional(CONF_SCREENCAP, default=DEFAULT_SCREENCAP): cv.boolean, } ) @@ -239,6 +241,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): config.get(CONF_TURN_ON_COMMAND), config.get(CONF_TURN_OFF_COMMAND), config[CONF_EXCLUDE_UNNAMED_APPS], + config[CONF_SCREENCAP], ] if aftv.DEVICE_CLASS == DEVICE_ANDROIDTV: @@ -382,6 +385,7 @@ class ADBDevice(MediaPlayerDevice): turn_on_command, turn_off_command, exclude_unnamed_apps, + screencap, ): """Initialize the Android TV / Fire TV device.""" self.aftv = aftv @@ -401,6 +405,7 @@ class ADBDevice(MediaPlayerDevice): self.turn_off_command = turn_off_command self._exclude_unnamed_apps = exclude_unnamed_apps + self._screencap = screencap # ADB exceptions to catch if not self.aftv.adb_server_ip: @@ -479,7 +484,7 @@ class ADBDevice(MediaPlayerDevice): async def async_get_media_image(self): """Fetch current playing image.""" - if self.state in [STATE_OFF, None] or not self.available: + if not self._screencap or self.state in [STATE_OFF, None] or not self.available: return None, None media_data = await self.hass.async_add_executor_job(self.get_raw_media_data) @@ -489,16 +494,8 @@ class ADBDevice(MediaPlayerDevice): @adb_decorator() def get_raw_media_data(self): - """Raw base64 image data.""" - try: - response = self.aftv.adb_shell("screencap -p | base64") - except UnicodeDecodeError: - return None - - if isinstance(response, str) and response.strip(): - return binascii.a2b_base64(response.strip().replace("\n", "")) - - return None + """Raw image data.""" + return self.aftv.adb_screencap() @property def media_image_hash(self): @@ -613,6 +610,7 @@ class AndroidTVDevice(ADBDevice): turn_on_command, turn_off_command, exclude_unnamed_apps, + screencap, ): """Initialize the Android TV device.""" super().__init__( @@ -623,6 +621,7 @@ class AndroidTVDevice(ADBDevice): turn_on_command, turn_off_command, exclude_unnamed_apps, + screencap, ) self._is_volume_muted = None diff --git a/requirements_all.txt b/requirements_all.txt index 5e6e5c8b56e8..6b323191e567 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -119,7 +119,7 @@ adafruit-circuitpython-bmp280==3.1.1 adafruit-circuitpython-mcp230xx==2.2.2 # homeassistant.components.androidtv -adb-shell==0.1.1 +adb-shell==0.1.3 # homeassistant.components.adguard adguardhome==0.4.2 @@ -235,7 +235,7 @@ ambiclimate==0.2.1 amcrest==1.7.0 # homeassistant.components.androidtv -androidtv==0.0.39 +androidtv==0.0.40 # homeassistant.components.anel_pwrctrl anel_pwrctrl-homeassistant==0.0.1.dev2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7b9665462a73..96a69be4786e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -29,7 +29,7 @@ YesssSMS==0.4.1 abodepy==0.19.0 # homeassistant.components.androidtv -adb-shell==0.1.1 +adb-shell==0.1.3 # homeassistant.components.adguard adguardhome==0.4.2 @@ -106,7 +106,7 @@ airly==0.0.2 ambiclimate==0.2.1 # homeassistant.components.androidtv -androidtv==0.0.39 +androidtv==0.0.40 # homeassistant.components.apns apns2==0.3.0 diff --git a/tests/components/androidtv/test_media_player.py b/tests/components/androidtv/test_media_player.py index 82287877eaf0..c9f2c271000a 100644 --- a/tests/components/androidtv/test_media_player.py +++ b/tests/components/androidtv/test_media_player.py @@ -1,4 +1,5 @@ """The tests for the androidtv platform.""" +import base64 import logging from unittest.mock import patch @@ -23,6 +24,7 @@ from homeassistant.components.media_player.const import ( DOMAIN, SERVICE_SELECT_SOURCE, ) +from homeassistant.components.websocket_api.const import TYPE_RESULT from homeassistant.const import ( ATTR_ENTITY_ID, CONF_DEVICE_CLASS, @@ -968,3 +970,34 @@ async def test_androidtv_volume_set(hass): ) patch_set_volume_level.assert_called_with(0.5) + + +async def test_get_image(hass, hass_ws_client): + """Test taking a screen capture. + + This is based on `test_get_image` in tests/components/media_player/test_init.py. + """ + patch_key, entity_id = _setup(CONFIG_ANDROIDTV_ADB_SERVER) + + with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[ + patch_key + ], patchers.patch_shell("")[patch_key]: + assert await async_setup_component(hass, DOMAIN, CONFIG_ANDROIDTV_ADB_SERVER) + + with patchers.patch_shell("11")[patch_key]: + await hass.helpers.entity_component.async_update_entity(entity_id) + + client = await hass_ws_client(hass) + + with patch("androidtv.basetv.BaseTV.adb_screencap", return_value=b"image"): + await client.send_json( + {"id": 5, "type": "media_player_thumbnail", "entity_id": entity_id} + ) + + msg = await client.receive_json() + + assert msg["id"] == 5 + assert msg["type"] == TYPE_RESULT + assert msg["success"] + assert msg["result"]["content_type"] == "image/png" + assert msg["result"]["content"] == base64.b64encode(b"image").decode("utf-8") From 5fc0e00eada8f177d4df396c998333e6f809f89b Mon Sep 17 00:00:00 2001 From: Alan Tse Date: Tue, 14 Apr 2020 10:27:07 -0700 Subject: [PATCH 397/653] Add defrost preset mode to Tesla (#34186) * style: update logging details * Add defrost preset mode to Tesla * Bump teslajsonpy to 0.7.0 --- homeassistant/components/tesla/climate.py | 34 ++++++++++++++++++-- homeassistant/components/tesla/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/tesla/climate.py b/homeassistant/components/tesla/climate.py index d438f94f4c33..5ba6f182c0a9 100644 --- a/homeassistant/components/tesla/climate.py +++ b/homeassistant/components/tesla/climate.py @@ -1,10 +1,14 @@ """Support for Tesla HVAC system.""" import logging +from typing import List, Optional + +from teslajsonpy.exceptions import UnknownPresetMode from homeassistant.components.climate import ClimateDevice from homeassistant.components.climate.const import ( HVAC_MODE_HEAT_COOL, HVAC_MODE_OFF, + SUPPORT_PRESET_MODE, SUPPORT_TARGET_TEMPERATURE, ) from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT @@ -45,7 +49,7 @@ class TeslaThermostat(TeslaDevice, ClimateDevice): @property def supported_features(self): """Return the list of supported features.""" - return SUPPORT_TARGET_TEMPERATURE + return SUPPORT_TARGET_TEMPERATURE | SUPPORT_PRESET_MODE @property def hvac_mode(self): @@ -93,15 +97,39 @@ class TeslaThermostat(TeslaDevice, ClimateDevice): async def async_set_temperature(self, **kwargs): """Set new target temperatures.""" - _LOGGER.debug("Setting temperature for: %s", self._name) temperature = kwargs.get(ATTR_TEMPERATURE) if temperature: + _LOGGER.debug("%s: Setting temperature to %s", self._name, temperature) await self.tesla_device.set_temperature(temperature) async def async_set_hvac_mode(self, hvac_mode): """Set new target hvac mode.""" - _LOGGER.debug("Setting mode for: %s", self._name) + _LOGGER.debug("%s: Setting hvac mode to %s", self._name, hvac_mode) if hvac_mode == HVAC_MODE_OFF: await self.tesla_device.set_status(False) elif hvac_mode == HVAC_MODE_HEAT_COOL: await self.tesla_device.set_status(True) + + async def async_set_preset_mode(self, preset_mode: str) -> None: + """Set new preset mode.""" + _LOGGER.debug("%s: Setting preset_mode to: %s", self.name, preset_mode) + try: + await self.tesla_device.set_preset_mode(preset_mode) + except UnknownPresetMode as ex: + _LOGGER.error("%s", ex.message) + + @property + def preset_mode(self) -> Optional[str]: + """Return the current preset mode, e.g., home, away, temp. + + Requires SUPPORT_PRESET_MODE. + """ + return self.tesla_device.preset_mode + + @property + def preset_modes(self) -> Optional[List[str]]: + """Return a list of available preset modes. + + Requires SUPPORT_PRESET_MODE. + """ + return self.tesla_device.preset_modes diff --git a/homeassistant/components/tesla/manifest.json b/homeassistant/components/tesla/manifest.json index d977e24bfec3..ec100733a53a 100644 --- a/homeassistant/components/tesla/manifest.json +++ b/homeassistant/components/tesla/manifest.json @@ -3,6 +3,6 @@ "name": "Tesla", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tesla", - "requirements": ["teslajsonpy==0.6.0"], + "requirements": ["teslajsonpy==0.7.0"], "codeowners": ["@zabuldon", "@alandtse"] } diff --git a/requirements_all.txt b/requirements_all.txt index 6b323191e567..8c1e230759af 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2020,7 +2020,7 @@ temperusb==1.5.3 tesla-powerwall==0.2.3 # homeassistant.components.tesla -teslajsonpy==0.6.0 +teslajsonpy==0.7.0 # homeassistant.components.thermoworks_smoke thermoworks_smoke==0.1.8 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 96a69be4786e..109f387dc7d2 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -756,7 +756,7 @@ tellduslive==0.10.10 tesla-powerwall==0.2.3 # homeassistant.components.tesla -teslajsonpy==0.6.0 +teslajsonpy==0.7.0 # homeassistant.components.toon toonapilib==3.2.4 From 535ce8726df9164619ca07c9c4bcf543311e7964 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Tue, 14 Apr 2020 11:53:53 -0600 Subject: [PATCH 398/653] Bump simplisafe-python to 9.0.7 (#34216) --- homeassistant/components/simplisafe/alarm_control_panel.py | 4 +++- homeassistant/components/simplisafe/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/simplisafe/alarm_control_panel.py b/homeassistant/components/simplisafe/alarm_control_panel.py index a95f77ab3607..867a1044856c 100644 --- a/homeassistant/components/simplisafe/alarm_control_panel.py +++ b/homeassistant/components/simplisafe/alarm_control_panel.py @@ -220,7 +220,9 @@ class SimpliSafeAlarm(SimpliSafeEntity, AlarmControlPanel): # Although system state updates are designed the come via the websocket, the # SimpliSafe cloud can sporadically fail to send those updates as expected; so, # just in case, we synchronize the state via the REST API, too: - if self._system.state == SystemStates.away: + if self._system.state == SystemStates.alarm: + self._state = STATE_ALARM_TRIGGERED + elif self._system.state == SystemStates.away: self._state = STATE_ALARM_ARMED_AWAY elif self._system.state in (SystemStates.away_count, SystemStates.exit_delay): self._state = STATE_ALARM_ARMING diff --git a/homeassistant/components/simplisafe/manifest.json b/homeassistant/components/simplisafe/manifest.json index cd0cda68125c..c03f05fc0c1c 100644 --- a/homeassistant/components/simplisafe/manifest.json +++ b/homeassistant/components/simplisafe/manifest.json @@ -3,6 +3,6 @@ "name": "SimpliSafe", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/simplisafe", - "requirements": ["simplisafe-python==9.0.6"], + "requirements": ["simplisafe-python==9.0.7"], "codeowners": ["@bachya"] } diff --git a/requirements_all.txt b/requirements_all.txt index 8c1e230759af..4465e3b2a617 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1876,7 +1876,7 @@ simplehound==0.3 simplepush==1.1.4 # homeassistant.components.simplisafe -simplisafe-python==9.0.6 +simplisafe-python==9.0.7 # homeassistant.components.sisyphus sisyphus-control==2.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 109f387dc7d2..a982e2b9fc5d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -710,7 +710,7 @@ sentry-sdk==0.13.5 simplehound==0.3 # homeassistant.components.simplisafe -simplisafe-python==9.0.6 +simplisafe-python==9.0.7 # homeassistant.components.sleepiq sleepyq==0.7 From ba394fd2aa69f82527574ecfdf7e1164ac92740a Mon Sep 17 00:00:00 2001 From: BarrettLowe Date: Tue, 14 Apr 2020 13:22:01 -0500 Subject: [PATCH 399/653] Add snapcast latency attribute and service (#34126) * Implemented snapcast latency attributes * Code review changes and Snapcast maintenance Updated how entity services get called - now conforms to most current method * Cleanup tasks Moved constants into separate file Removed unnecessary logger message Remove unnecessary schemas * FIx linting errors * Sort imports * Update with requested change Better - use next() Co-Authored-By: Martin Hjelmare * Add guards for bad service calls * Add back in platform schema * Add check for unjoin service call * Fix lint/format * remove comma inserted by black Co-authored-by: Martin Hjelmare --- .coveragerc | 2 +- homeassistant/components/snapcast/__init__.py | 49 -------- homeassistant/components/snapcast/const.py | 17 +++ .../components/snapcast/media_player.py | 112 +++++++++++------- .../components/snapcast/services.yaml | 9 ++ 5 files changed, 95 insertions(+), 94 deletions(-) create mode 100644 homeassistant/components/snapcast/const.py diff --git a/.coveragerc b/.coveragerc index acf72eb254c3..f1f4aeaf0d18 100644 --- a/.coveragerc +++ b/.coveragerc @@ -648,7 +648,7 @@ omit = homeassistant/components/smarthab/* homeassistant/components/sms/* homeassistant/components/smtp/notify.py - homeassistant/components/snapcast/media_player.py + homeassistant/components/snapcast/* homeassistant/components/snmp/* homeassistant/components/sochain/sensor.py homeassistant/components/socialblade/sensor.py diff --git a/homeassistant/components/snapcast/__init__.py b/homeassistant/components/snapcast/__init__.py index e6c574b7b2bd..b5279fa3ce06 100644 --- a/homeassistant/components/snapcast/__init__.py +++ b/homeassistant/components/snapcast/__init__.py @@ -1,50 +1 @@ """The snapcast component.""" - -import asyncio - -import voluptuous as vol - -from homeassistant.const import ATTR_ENTITY_ID -from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.dispatcher import async_dispatcher_send - -DOMAIN = "snapcast" - -SERVICE_SNAPSHOT = "snapshot" -SERVICE_RESTORE = "restore" -SERVICE_JOIN = "join" -SERVICE_UNJOIN = "unjoin" - -ATTR_MASTER = "master" - -SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_ENTITY_ID): cv.entity_ids}) - -JOIN_SERVICE_SCHEMA = SERVICE_SCHEMA.extend({vol.Required(ATTR_MASTER): cv.entity_id}) - - -async def async_setup(hass, config): - """Handle service configuration.""" - service_event = asyncio.Event() - - async def service_handle(service): - """Dispatch a service call.""" - service_event.clear() - async_dispatcher_send( - hass, DOMAIN, service_event, service.service, service.data - ) - await service_event.wait() - - hass.services.async_register( - DOMAIN, SERVICE_SNAPSHOT, service_handle, schema=SERVICE_SCHEMA - ) - hass.services.async_register( - DOMAIN, SERVICE_RESTORE, service_handle, schema=SERVICE_SCHEMA - ) - hass.services.async_register( - DOMAIN, SERVICE_JOIN, service_handle, schema=JOIN_SERVICE_SCHEMA - ) - hass.services.async_register( - DOMAIN, SERVICE_UNJOIN, service_handle, schema=SERVICE_SCHEMA - ) - - return True diff --git a/homeassistant/components/snapcast/const.py b/homeassistant/components/snapcast/const.py new file mode 100644 index 000000000000..674a22993b91 --- /dev/null +++ b/homeassistant/components/snapcast/const.py @@ -0,0 +1,17 @@ +"""Constants for Snapcast.""" + +DATA_KEY = "snapcast" + +GROUP_PREFIX = "snapcast_group_" +GROUP_SUFFIX = "Snapcast Group" +CLIENT_PREFIX = "snapcast_client_" +CLIENT_SUFFIX = "Snapcast Client" + +SERVICE_SNAPSHOT = "snapshot" +SERVICE_RESTORE = "restore" +SERVICE_JOIN = "join" +SERVICE_UNJOIN = "unjoin" +SERVICE_SET_LATENCY = "set_latency" + +ATTR_MASTER = "master" +ATTR_LATENCY = "latency" diff --git a/homeassistant/components/snapcast/media_player.py b/homeassistant/components/snapcast/media_player.py index 004dd36ed4a9..1bd44959ab1d 100644 --- a/homeassistant/components/snapcast/media_player.py +++ b/homeassistant/components/snapcast/media_player.py @@ -13,7 +13,6 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_SET, ) from homeassistant.const import ( - ATTR_ENTITY_ID, CONF_HOST, CONF_PORT, STATE_IDLE, @@ -22,22 +21,25 @@ from homeassistant.const import ( STATE_PLAYING, STATE_UNKNOWN, ) -import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers import config_validation as cv, entity_platform -from . import ( +from .const import ( + ATTR_LATENCY, ATTR_MASTER, - DOMAIN, + CLIENT_PREFIX, + CLIENT_SUFFIX, + DATA_KEY, + GROUP_PREFIX, + GROUP_SUFFIX, SERVICE_JOIN, SERVICE_RESTORE, + SERVICE_SET_LATENCY, SERVICE_SNAPSHOT, SERVICE_UNJOIN, ) _LOGGER = logging.getLogger(__name__) -DATA_KEY = "snapcast" - SUPPORT_SNAPCAST_CLIENT = ( SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_SET | SUPPORT_SELECT_SOURCE ) @@ -45,11 +47,6 @@ SUPPORT_SNAPCAST_GROUP = ( SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_SET | SUPPORT_SELECT_SOURCE ) -GROUP_PREFIX = "snapcast_group_" -GROUP_SUFFIX = "Snapcast Group" -CLIENT_PREFIX = "snapcast_client_" -CLIENT_SUFFIX = "Snapcast Client" - PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT): cv.port} ) @@ -61,33 +58,18 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= host = config.get(CONF_HOST) port = config.get(CONF_PORT, CONTROL_PORT) - async def async_service_handle(service_event, service, data): - """Handle dispatched services.""" - entity_ids = data.get(ATTR_ENTITY_ID) - devices = [ - device for device in hass.data[DATA_KEY] if device.entity_id in entity_ids - ] - for device in devices: - if service == SERVICE_SNAPSHOT: - device.snapshot() - elif service == SERVICE_RESTORE: - await device.async_restore() - elif service == SERVICE_JOIN: - if isinstance(device, SnapcastClientDevice): - master = [ - e - for e in hass.data[DATA_KEY] - if e.entity_id == data[ATTR_MASTER] - ] - if isinstance(master[0], SnapcastClientDevice): - await device.async_join(master[0]) - elif service == SERVICE_UNJOIN: - if isinstance(device, SnapcastClientDevice): - await device.async_unjoin() - - service_event.set() - - async_dispatcher_connect(hass, DOMAIN, async_service_handle) + platform = entity_platform.current_platform.get() + platform.async_register_entity_service(SERVICE_SNAPSHOT, {}, "snapshot") + platform.async_register_entity_service(SERVICE_RESTORE, {}, "async_restore") + platform.async_register_entity_service( + SERVICE_JOIN, {vol.Required(ATTR_MASTER): cv.entity_id}, handle_async_join + ) + platform.async_register_entity_service(SERVICE_UNJOIN, {}, handle_async_unjoin) + platform.async_register_entity_service( + SERVICE_SET_LATENCY, + {vol.Required(ATTR_LATENCY): cv.positive_int}, + handle_set_latency, + ) try: server = await snapcast.control.create_server( @@ -107,6 +89,27 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= async_add_entities(devices) +async def handle_async_join(entity, service_call): + """Handle the entity service join.""" + if not isinstance(entity, SnapcastClientDevice): + raise ValueError("Entity is not a client. Can only join clients.") + await entity.async_join(service_call.data[ATTR_MASTER]) + + +async def handle_async_unjoin(entity, service_call): + """Handle the entity service unjoin.""" + if not isinstance(entity, SnapcastClientDevice): + raise ValueError("Entity is not a client. Can only unjoin clients.") + await entity.async_unjoin() + + +async def handle_set_latency(entity, service_call): + """Handle the entity service set_latency.""" + if not isinstance(entity, SnapcastClientDevice): + raise ValueError("Latency can only be set for a Snapcast client.") + await entity.async_set_latency(service_call.data[ATTR_LATENCY]) + + class SnapcastGroupDevice(MediaPlayerDevice): """Representation of a Snapcast group device.""" @@ -260,14 +263,23 @@ class SnapcastClientDevice(MediaPlayerDevice): @property def device_state_attributes(self): """Return the state attributes.""" + state_attrs = {} + if self.latency is not None: + state_attrs["latency"] = self.latency name = f"{self._client.friendly_name} {CLIENT_SUFFIX}" - return {"friendly_name": name} + state_attrs["friendly_name"] = name + return state_attrs @property def should_poll(self): """Do not poll for state.""" return False + @property + def latency(self): + """Latency for Client.""" + return self._client.latency + async def async_select_source(self, source): """Set input source.""" streams = self._client.group.streams_by_name() @@ -287,12 +299,19 @@ class SnapcastClientDevice(MediaPlayerDevice): async def async_join(self, master): """Join the group of the master player.""" - master_group = [ + + master_entity = next( + entity for entity in self.hass.data[DATA_KEY] if entity.entity_id == master + ) + if not isinstance(master_entity, SnapcastClientDevice): + raise ValueError("Master is not a client device. Can only join clients.") + + master_group = next( group for group in self._client.groups_available() - if master.identifier in group.clients - ] - await master_group[0].add_client(self._client.identifier) + if master_entity.identifier in group.clients + ) + await master_group.add_client(self._client.identifier) self.async_write_ha_state() async def async_unjoin(self): @@ -307,3 +326,8 @@ class SnapcastClientDevice(MediaPlayerDevice): async def async_restore(self): """Restore the client state.""" await self._client.restore() + + async def async_set_latency(self, latency): + """Set the latency of the client.""" + await self._client.set_latency(latency) + self.async_write_ha_state() diff --git a/homeassistant/components/snapcast/services.yaml b/homeassistant/components/snapcast/services.yaml index 1517f12f52d5..3b83aa3774d4 100644 --- a/homeassistant/components/snapcast/services.yaml +++ b/homeassistant/components/snapcast/services.yaml @@ -28,3 +28,12 @@ restore: entity_id: description: Name(s) of entities that will be restored. Platform dependent. example: "media_player.living_room" + +set_latency: + description: Set client set_latency + fields: + entity_id: + description: Name of entities that will have adjusted latency + latency: + description: Latency in master + example: 14 From 18478ebd05dc1a2fa27c0f7b7a3ae6dbae355c48 Mon Sep 17 00:00:00 2001 From: Aidan Timson Date: Tue, 14 Apr 2020 19:26:13 +0100 Subject: [PATCH 400/653] Improve LG webosTV (#34147) * Move consts to const, general cleanup * Add unique id * Add default icon * Set supported features based on sound output * Update homeassistant/components/webostv/media_player.py Co-Authored-By: Martin Hjelmare * Set device class * Add software_info to client mock Co-authored-by: Martin Hjelmare --- homeassistant/components/webostv/__init__.py | 29 +++++------ homeassistant/components/webostv/const.py | 19 ++++++- .../components/webostv/media_player.py | 49 +++++++++++++------ tests/components/webostv/test_media_player.py | 6 ++- 4 files changed, 69 insertions(+), 34 deletions(-) diff --git a/homeassistant/components/webostv/__init__.py b/homeassistant/components/webostv/__init__.py index 9dec8fe0c71e..0790ece9333d 100644 --- a/homeassistant/components/webostv/__init__.py +++ b/homeassistant/components/webostv/__init__.py @@ -1,4 +1,4 @@ -"""Support for WebOS TV.""" +"""Support for LG webOS Smart TV.""" import asyncio import logging @@ -6,6 +6,18 @@ from aiopylgtv import PyLGTVCmdException, PyLGTVPairException, WebOsClient import voluptuous as vol from websockets.exceptions import ConnectionClosed +from homeassistant.components.webostv.const import ( + ATTR_BUTTON, + ATTR_COMMAND, + CONF_ON_ACTION, + CONF_SOURCES, + DEFAULT_NAME, + DOMAIN, + SERVICE_BUTTON, + SERVICE_COMMAND, + SERVICE_SELECT_SOUND_OUTPUT, + WEBOSTV_CONFIG_FILE, +) from homeassistant.const import ( ATTR_ENTITY_ID, CONF_CUSTOMIZE, @@ -19,21 +31,6 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send from .const import ATTR_SOUND_OUTPUT -DOMAIN = "webostv" - -CONF_SOURCES = "sources" -CONF_ON_ACTION = "turn_on_action" -DEFAULT_NAME = "LG webOS Smart TV" -WEBOSTV_CONFIG_FILE = "webostv.conf" - -SERVICE_BUTTON = "button" -ATTR_BUTTON = "button" - -SERVICE_COMMAND = "command" -ATTR_COMMAND = "command" - -SERVICE_SELECT_SOUND_OUTPUT = "select_sound_output" - CUSTOMIZE_SCHEMA = vol.Schema( {vol.Optional(CONF_SOURCES, default=[]): vol.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/webostv/const.py b/homeassistant/components/webostv/const.py index a81696f6c0ba..3e1e790fc02e 100644 --- a/homeassistant/components/webostv/const.py +++ b/homeassistant/components/webostv/const.py @@ -1,4 +1,19 @@ -"""Constants used for WebOS TV.""" +"""Constants used for LG webOS Smart TV.""" +DOMAIN = "webostv" + +DEFAULT_NAME = "LG webOS Smart TV" + +ATTR_BUTTON = "button" +ATTR_COMMAND = "command" +ATTR_SOUND_OUTPUT = "sound_output" + +CONF_ON_ACTION = "turn_on_action" +CONF_SOURCES = "sources" + +SERVICE_BUTTON = "button" +SERVICE_COMMAND = "command" +SERVICE_SELECT_SOUND_OUTPUT = "select_sound_output" + LIVE_TV_APP_ID = "com.webos.app.livetv" -ATTR_SOUND_OUTPUT = "sound_output" +WEBOSTV_CONFIG_FILE = "webostv.conf" diff --git a/homeassistant/components/webostv/media_player.py b/homeassistant/components/webostv/media_player.py index 87f55fd6b2d6..a19f42d7d560 100644 --- a/homeassistant/components/webostv/media_player.py +++ b/homeassistant/components/webostv/media_player.py @@ -4,11 +4,11 @@ from datetime import timedelta from functools import wraps import logging -from aiopylgtv import PyLGTVCmdException, PyLGTVPairException +from aiopylgtv import PyLGTVCmdException, PyLGTVPairException, WebOsClient from websockets.exceptions import ConnectionClosed from homeassistant import util -from homeassistant.components.media_player import MediaPlayerDevice +from homeassistant.components.media_player import DEVICE_CLASS_TV, MediaPlayerDevice from homeassistant.components.media_player.const import ( MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, @@ -23,6 +23,13 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_SET, SUPPORT_VOLUME_STEP, ) +from homeassistant.components.webostv.const import ( + ATTR_SOUND_OUTPUT, + CONF_ON_ACTION, + CONF_SOURCES, + DOMAIN, + LIVE_TV_APP_ID, +) from homeassistant.const import ( ATTR_ENTITY_ID, CONF_CUSTOMIZE, @@ -36,31 +43,26 @@ from homeassistant.const import ( from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.script import Script -from . import CONF_ON_ACTION, CONF_SOURCES, DOMAIN -from .const import ATTR_SOUND_OUTPUT, LIVE_TV_APP_ID - _LOGGER = logging.getLogger(__name__) - SUPPORT_WEBOSTV = ( SUPPORT_TURN_OFF | SUPPORT_NEXT_TRACK | SUPPORT_PAUSE | SUPPORT_PREVIOUS_TRACK - | SUPPORT_VOLUME_MUTE - | SUPPORT_VOLUME_SET - | SUPPORT_VOLUME_STEP | SUPPORT_SELECT_SOURCE | SUPPORT_PLAY_MEDIA | SUPPORT_PLAY ) +SUPPORT_WEBOSTV_VOLUME = SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_STEP + MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) MIN_TIME_BETWEEN_FORCED_SCANS = timedelta(seconds=1) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): - """Set up the LG WebOS TV platform.""" + """Set up the LG webOS Smart TV platform.""" if discovery_info is None: return @@ -108,12 +110,13 @@ def cmd(func): class LgWebOSMediaPlayerEntity(MediaPlayerDevice): - """Representation of a LG WebOS TV.""" + """Representation of a LG webOS Smart TV.""" - def __init__(self, client, name, customize, on_script=None): + def __init__(self, client: WebOsClient, name: str, customize, on_script=None): """Initialize the webos device.""" self._client = client self._name = name + self._unique_id = client.software_info["device_id"] self._customize = customize self._on_script = on_script @@ -219,11 +222,21 @@ class LgWebOSMediaPlayerEntity(MediaPlayerDevice): ): pass + @property + def unique_id(self): + """Return the unique id of the device.""" + return self._unique_id + @property def name(self): """Return the name of the device.""" return self._name + @property + def device_class(self): + """Return the device class of the device.""" + return DEVICE_CLASS_TV + @property def state(self): """Return the state of the device.""" @@ -285,9 +298,17 @@ class LgWebOSMediaPlayerEntity(MediaPlayerDevice): @property def supported_features(self): """Flag media player features that are supported.""" + supported = SUPPORT_WEBOSTV + + if self._client.sound_output == "external_arc": + supported = supported | SUPPORT_WEBOSTV_VOLUME + elif self._client.sound_output != "lineout": + supported = supported | SUPPORT_WEBOSTV_VOLUME | SUPPORT_VOLUME_SET + if self._on_script: - return SUPPORT_WEBOSTV | SUPPORT_TURN_ON - return SUPPORT_WEBOSTV + supported = supported | SUPPORT_TURN_ON + + return supported @property def device_state_attributes(self): diff --git a/tests/components/webostv/test_media_player.py b/tests/components/webostv/test_media_player.py index e415734bec2f..2685064a9466 100644 --- a/tests/components/webostv/test_media_player.py +++ b/tests/components/webostv/test_media_player.py @@ -9,7 +9,7 @@ from homeassistant.components.media_player.const import ( ATTR_MEDIA_VOLUME_MUTED, SERVICE_SELECT_SOURCE, ) -from homeassistant.components.webostv import ( +from homeassistant.components.webostv.const import ( ATTR_BUTTON, ATTR_COMMAND, DOMAIN, @@ -40,7 +40,9 @@ def client_fixture(): with patch( "homeassistant.components.webostv.WebOsClient", autospec=True ) as mock_client_class: - yield mock_client_class.return_value + client = mock_client_class.return_value + client.software_info = {"device_id": "a1:b1:c1:d1:e1:f1"} + yield client async def setup_webostv(hass): From e0a7ea52fd3ca4e5cf45de3d2ae3b73845edda9a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 14 Apr 2020 13:26:18 -0500 Subject: [PATCH 401/653] Reduce loss of precision when setting light percent brightness (#34208) * Reduce loss of precision when setting light percent brightness This part of an effort to fix all the round trip light brightness percentages that cause errors with homekit , alexa, and other devices that use percentage. * fix demo light test --- homeassistant/components/light/__init__.py | 4 +- tests/components/demo/test_light.py | 2 +- tests/components/light/test_init.py | 54 +++++++++++++++++++++- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 7005fce63ccb..9750e37f32c0 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -157,7 +157,7 @@ def preprocess_turn_on_alternatives(params): brightness_pct = params.pop(ATTR_BRIGHTNESS_PCT, None) if brightness_pct is not None: - params[ATTR_BRIGHTNESS] = int(255 * brightness_pct / 100) + params[ATTR_BRIGHTNESS] = round(255 * brightness_pct / 100) xy_color = params.pop(ATTR_XY_COLOR, None) if xy_color is not None: @@ -233,7 +233,7 @@ async def async_setup(hass, config): brightness += params.pop(ATTR_BRIGHTNESS_STEP) else: - brightness += int(params.pop(ATTR_BRIGHTNESS_STEP_PCT) / 100 * 255) + brightness += round(params.pop(ATTR_BRIGHTNESS_STEP_PCT) / 100 * 255) params[ATTR_BRIGHTNESS] = max(0, min(255, brightness)) turn_light_off, off_params = preprocess_turn_off(params) diff --git a/tests/components/demo/test_light.py b/tests/components/demo/test_light.py index f48bc28c7727..fd17d7bdb0e7 100644 --- a/tests/components/demo/test_light.py +++ b/tests/components/demo/test_light.py @@ -85,7 +85,7 @@ async def test_state_attributes(hass): state = hass.states.get(ENTITY_LIGHT) assert state.attributes.get(ATTR_COLOR_TEMP) == 333 - assert state.attributes.get(ATTR_BRIGHTNESS) == 127 + assert state.attributes.get(ATTR_BRIGHTNESS) == 128 async def test_turn_off(hass): diff --git a/tests/components/light/test_init.py b/tests/components/light/test_init.py index 49bc626a9574..2e2f74828d95 100644 --- a/tests/components/light/test_init.py +++ b/tests/components/light/test_init.py @@ -495,4 +495,56 @@ async def test_light_brightness_step(hass): ) _, data = entity.last_call("turn_on") - assert data["brightness"] == 125, data + assert data["brightness"] == 126, data + + +async def test_light_brightness_pct_conversion(hass): + """Test that light brightness percent conversion.""" + platform = getattr(hass.components, "test.light") + platform.init() + entity = platform.ENTITIES[0] + entity.supported_features = light.SUPPORT_BRIGHTNESS + entity.brightness = 100 + assert await async_setup_component(hass, "light", {"light": {"platform": "test"}}) + + state = hass.states.get(entity.entity_id) + assert state is not None + assert state.attributes["brightness"] == 100 + + await hass.services.async_call( + "light", "turn_on", {"entity_id": entity.entity_id, "brightness_pct": 1}, True, + ) + + _, data = entity.last_call("turn_on") + assert data["brightness"] == 3, data + + await hass.services.async_call( + "light", "turn_on", {"entity_id": entity.entity_id, "brightness_pct": 2}, True, + ) + + _, data = entity.last_call("turn_on") + assert data["brightness"] == 5, data + + await hass.services.async_call( + "light", "turn_on", {"entity_id": entity.entity_id, "brightness_pct": 50}, True, + ) + + _, data = entity.last_call("turn_on") + assert data["brightness"] == 128, data + + await hass.services.async_call( + "light", "turn_on", {"entity_id": entity.entity_id, "brightness_pct": 99}, True, + ) + + _, data = entity.last_call("turn_on") + assert data["brightness"] == 252, data + + await hass.services.async_call( + "light", + "turn_on", + {"entity_id": entity.entity_id, "brightness_pct": 100}, + True, + ) + + _, data = entity.last_call("turn_on") + assert data["brightness"] == 255, data From e268c5b8735307813d1aabbacad0e30546616cf5 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Tue, 14 Apr 2020 13:30:41 -0500 Subject: [PATCH 402/653] Catch IPPVersionNotSupportedError in IPP (#34184) * Update config_flow.py * squash. * Update test_config_flow.py * Update config_flow.py * Update test_config_flow.py * Update test_config_flow.py * Update test_config_flow.py * Update test_config_flow.py * Update test_config_flow.py --- homeassistant/components/ipp/config_flow.py | 18 ++++- homeassistant/components/ipp/manifest.json | 2 +- homeassistant/components/ipp/strings.json | 2 + requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/ipp/test_config_flow.py | 70 +++++++++++++++++- .../get-printer-attributes-error-0x0503.bin | Bin 0 -> 75 bytes 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 tests/fixtures/ipp/get-printer-attributes-error-0x0503.bin diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index b7239c8bf493..32474881a870 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -6,8 +6,10 @@ from pyipp import ( IPP, IPPConnectionError, IPPConnectionUpgradeRequired, + IPPError, IPPParseError, IPPResponseError, + IPPVersionNotSupportedError, ) import voluptuous as vol @@ -70,10 +72,16 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): except IPPConnectionUpgradeRequired: return self._show_setup_form({"base": "connection_upgrade"}) except (IPPConnectionError, IPPResponseError): + _LOGGER.debug("IPP Connection/Response Error", exc_info=True) return self._show_setup_form({"base": "connection_error"}) except IPPParseError: - _LOGGER.exception("IPP Parse Error") + _LOGGER.debug("IPP Parse Error", exc_info=True) return self.async_abort(reason="parse_error") + except IPPVersionNotSupportedError: + return self.async_abort(reason="ipp_version_error") + except IPPError: + _LOGGER.debug("IPP Error", exc_info=True) + return self.async_abort(reason="ipp_error") user_input[CONF_UUID] = info[CONF_UUID] @@ -111,10 +119,16 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): except IPPConnectionUpgradeRequired: return self.async_abort(reason="connection_upgrade") except (IPPConnectionError, IPPResponseError): + _LOGGER.debug("IPP Connection/Response Error", exc_info=True) return self.async_abort(reason="connection_error") except IPPParseError: - _LOGGER.exception("IPP Parse Error") + _LOGGER.debug("IPP Parse Error", exc_info=True) return self.async_abort(reason="parse_error") + except IPPVersionNotSupportedError: + return self.async_abort(reason="ipp_version_error") + except IPPError: + _LOGGER.debug("IPP Error", exc_info=True) + return self.async_abort(reason="ipp_error") if info[CONF_UUID] is not None: self.discovery_info[CONF_UUID] = info[CONF_UUID] diff --git a/homeassistant/components/ipp/manifest.json b/homeassistant/components/ipp/manifest.json index 0cb7c108b631..216ee519a3aa 100644 --- a/homeassistant/components/ipp/manifest.json +++ b/homeassistant/components/ipp/manifest.json @@ -2,7 +2,7 @@ "domain": "ipp", "name": "Internet Printing Protocol (IPP)", "documentation": "https://www.home-assistant.io/integrations/ipp", - "requirements": ["pyipp==0.9.2"], + "requirements": ["pyipp==0.10.1"], "codeowners": ["@ctalkington"], "config_flow": true, "quality_scale": "platinum", diff --git a/homeassistant/components/ipp/strings.json b/homeassistant/components/ipp/strings.json index a80a7f2e0ba6..c77d1eec161f 100644 --- a/homeassistant/components/ipp/strings.json +++ b/homeassistant/components/ipp/strings.json @@ -27,6 +27,8 @@ "already_configured": "This printer is already configured.", "connection_error": "Failed to connect to printer.", "connection_upgrade": "Failed to connect to printer due to connection upgrade being required.", + "ipp_error": "Encountered IPP error.", + "ipp_version_error": "IPP version not supported by printer.", "parse_error": "Failed to parse response from printer." } } diff --git a/requirements_all.txt b/requirements_all.txt index 4465e3b2a617..d8edffe2937e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1341,7 +1341,7 @@ pyintesishome==1.7.3 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.2 +pyipp==0.10.1 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a982e2b9fc5d..f4be0c409603 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -527,7 +527,7 @@ pyicloud==0.9.6.1 pyipma==2.0.5 # homeassistant.components.ipp -pyipp==0.9.2 +pyipp==0.10.1 # homeassistant.components.iqvia pyiqvia==0.2.1 diff --git a/tests/components/ipp/test_config_flow.py b/tests/components/ipp/test_config_flow.py index 7e16a9fc6e09..5229881fbf40 100644 --- a/tests/components/ipp/test_config_flow.py +++ b/tests/components/ipp/test_config_flow.py @@ -1,6 +1,6 @@ """Tests for the IPP config flow.""" import aiohttp -from pyipp import IPPConnectionUpgradeRequired +from pyipp import IPPConnectionUpgradeRequired, IPPError from homeassistant.components.ipp.const import CONF_BASE_PATH, CONF_UUID, DOMAIN from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF @@ -172,6 +172,74 @@ async def test_zeroconf_parse_error( assert result["reason"] == "parse_error" +async def test_user_ipp_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort the user flow on IPP error.""" + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=IPPError) + + user_input = MOCK_USER_INPUT.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=user_input, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "ipp_error" + + +async def test_zeroconf_ipp_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort zeroconf flow on IPP error.""" + aioclient_mock.post("http://192.168.1.31:631/ipp/print", exc=IPPError) + + discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "ipp_error" + + +async def test_user_ipp_version_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort user flow on IPP version not supported error.""" + aioclient_mock.post( + "http://192.168.1.31:631/ipp/print", + content=load_fixture_binary("ipp/get-printer-attributes-error-0x0503.bin"), + headers={"Content-Type": "application/ipp"}, + ) + + user_input = {**MOCK_USER_INPUT} + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=user_input, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "ipp_version_error" + + +async def test_zeroconf_ipp_version_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: + """Test we abort zeroconf flow on IPP version not supported error.""" + aioclient_mock.post( + "http://192.168.1.31:631/ipp/print", + content=load_fixture_binary("ipp/get-printer-attributes-error-0x0503.bin"), + headers={"Content-Type": "application/ipp"}, + ) + + discovery_info = {**MOCK_ZEROCONF_IPP_SERVICE_INFO} + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info, + ) + + assert result["type"] == RESULT_TYPE_ABORT + assert result["reason"] == "ipp_version_error" + + async def test_user_device_exists_abort( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: diff --git a/tests/fixtures/ipp/get-printer-attributes-error-0x0503.bin b/tests/fixtures/ipp/get-printer-attributes-error-0x0503.bin new file mode 100644 index 0000000000000000000000000000000000000000..c92134b9e3bc72859ffd410f8235e36622c2d57f GIT binary patch literal 75 zcmZQ%WMyVxk7is_i literal 0 HcmV?d00001 From 96aaa25aadea329a9289346b029b3b18b134858f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 14 Apr 2020 13:37:54 -0500 Subject: [PATCH 403/653] Add DEVICE_CLASS_BATTERY_CHARGING to binary_sensor (#34203) In order to make this automatically discoverable via the registry there needs to be a DEVICE_CLASS_BATTERY_CHARING in binary sensor so we can tell what is a battery and what is a charge sensor. --- homeassistant/components/binary_sensor/__init__.py | 4 ++++ .../components/binary_sensor/device_condition.py | 9 +++++++++ homeassistant/components/binary_sensor/device_trigger.py | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 73d5e0be4584..7dc5d958537b 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -23,6 +23,9 @@ ENTITY_ID_FORMAT = DOMAIN + ".{}" # On means low, Off means normal DEVICE_CLASS_BATTERY = "battery" +# On means charging, Off means not charging +DEVICE_CLASS_BATTERY_CHARGING = "battery_charging" + # On means cold, Off means normal DEVICE_CLASS_COLD = "cold" @@ -91,6 +94,7 @@ DEVICE_CLASS_WINDOW = "window" DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, + DEVICE_CLASS_BATTERY_CHARGING, DEVICE_CLASS_COLD, DEVICE_CLASS_CONNECTIVITY, DEVICE_CLASS_DOOR, diff --git a/homeassistant/components/binary_sensor/device_condition.py b/homeassistant/components/binary_sensor/device_condition.py index e17869f6cfa6..999a62b3a80e 100644 --- a/homeassistant/components/binary_sensor/device_condition.py +++ b/homeassistant/components/binary_sensor/device_condition.py @@ -15,6 +15,7 @@ from homeassistant.helpers.typing import ConfigType from . import ( DEVICE_CLASS_BATTERY, + DEVICE_CLASS_BATTERY_CHARGING, DEVICE_CLASS_COLD, DEVICE_CLASS_CONNECTIVITY, DEVICE_CLASS_DOOR, @@ -44,6 +45,8 @@ DEVICE_CLASS_NONE = "none" CONF_IS_BAT_LOW = "is_bat_low" CONF_IS_NOT_BAT_LOW = "is_not_bat_low" +CONF_IS_CHARGING = "is_charging" +CONF_IS_NOT_CHARGING = "is_not_charging" CONF_IS_COLD = "is_cold" CONF_IS_NOT_COLD = "is_not_cold" CONF_IS_CONNECTED = "is_connected" @@ -85,6 +88,7 @@ CONF_IS_NOT_OPEN = "is_not_open" IS_ON = [ CONF_IS_BAT_LOW, + CONF_IS_CHARGING, CONF_IS_COLD, CONF_IS_CONNECTED, CONF_IS_GAS, @@ -109,6 +113,7 @@ IS_ON = [ IS_OFF = [ CONF_IS_NOT_BAT_LOW, + CONF_IS_NOT_CHARGING, CONF_IS_NOT_COLD, CONF_IS_NOT_CONNECTED, CONF_IS_NOT_HOT, @@ -136,6 +141,10 @@ ENTITY_CONDITIONS = { {CONF_TYPE: CONF_IS_BAT_LOW}, {CONF_TYPE: CONF_IS_NOT_BAT_LOW}, ], + DEVICE_CLASS_BATTERY_CHARGING: [ + {CONF_TYPE: CONF_IS_CHARGING}, + {CONF_TYPE: CONF_IS_NOT_CHARGING}, + ], DEVICE_CLASS_COLD: [{CONF_TYPE: CONF_IS_COLD}, {CONF_TYPE: CONF_IS_NOT_COLD}], DEVICE_CLASS_CONNECTIVITY: [ {CONF_TYPE: CONF_IS_CONNECTED}, diff --git a/homeassistant/components/binary_sensor/device_trigger.py b/homeassistant/components/binary_sensor/device_trigger.py index e5e1f9061e6a..d50cc20c1aee 100644 --- a/homeassistant/components/binary_sensor/device_trigger.py +++ b/homeassistant/components/binary_sensor/device_trigger.py @@ -13,6 +13,7 @@ from homeassistant.helpers.entity_registry import async_entries_for_device from . import ( DEVICE_CLASS_BATTERY, + DEVICE_CLASS_BATTERY_CHARGING, DEVICE_CLASS_COLD, DEVICE_CLASS_CONNECTIVITY, DEVICE_CLASS_DOOR, @@ -44,6 +45,8 @@ DEVICE_CLASS_NONE = "none" CONF_BAT_LOW = "bat_low" CONF_NOT_BAT_LOW = "not_bat_low" +CONF_CHARGING = "charging" +CONF_NOT_CHARGING = "not_charging" CONF_COLD = "cold" CONF_NOT_COLD = "not_cold" CONF_CONNECTED = "connected" @@ -135,6 +138,10 @@ TURNED_OFF = [ ENTITY_TRIGGERS = { DEVICE_CLASS_BATTERY: [{CONF_TYPE: CONF_BAT_LOW}, {CONF_TYPE: CONF_NOT_BAT_LOW}], + DEVICE_CLASS_BATTERY_CHARGING: [ + {CONF_TYPE: CONF_CHARGING}, + {CONF_TYPE: CONF_NOT_CHARGING}, + ], DEVICE_CLASS_COLD: [{CONF_TYPE: CONF_COLD}, {CONF_TYPE: CONF_NOT_COLD}], DEVICE_CLASS_CONNECTIVITY: [ {CONF_TYPE: CONF_CONNECTED}, From e2af216bcd640b0d8546bb4176dc22c446d67d71 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Tue, 14 Apr 2020 20:38:55 +0200 Subject: [PATCH 404/653] Clean up access to config in various integrations v4 (#34174) * Clean up access to config in various integrations v4 * Address review comments --- homeassistant/components/buienradar/sensor.py | 4 ++-- homeassistant/components/buienradar/weather.py | 2 +- homeassistant/components/canary/__init__.py | 6 +++--- homeassistant/components/canary/camera.py | 2 +- homeassistant/components/channels/media_player.py | 4 +--- homeassistant/components/cisco_ios/device_tracker.py | 2 +- .../cisco_mobility_express/device_tracker.py | 2 +- homeassistant/components/clementine/media_player.py | 4 ++-- homeassistant/components/clickatell/notify.py | 4 ++-- homeassistant/components/clicksend_tts/notify.py | 10 +++++----- homeassistant/components/cmus/media_player.py | 4 ++-- homeassistant/components/coinbase/__init__.py | 6 +++--- homeassistant/components/coinmarketcap/sensor.py | 12 ++++++------ homeassistant/components/comfoconnect/__init__.py | 10 +++++----- .../components/concord232/alarm_control_panel.py | 8 ++++---- homeassistant/components/concord232/binary_sensor.py | 8 ++++---- homeassistant/components/cpuspeed/sensor.py | 2 +- homeassistant/components/crimereports/sensor.py | 4 ++-- homeassistant/components/cups/sensor.py | 8 ++++---- homeassistant/components/currencylayer/sensor.py | 6 +++--- 20 files changed, 53 insertions(+), 55 deletions(-) diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index 8ace9070f8c8..7c5e21191a36 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -194,7 +194,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Inclusive( CONF_LONGITUDE, "coordinates", "Latitude and longitude must exist together" ): cv.longitude, - vol.Optional(CONF_TIMEFRAME, default=60): vol.All( + vol.Optional(CONF_TIMEFRAME, default=DEFAULT_TIMEFRAME): vol.All( vol.Coerce(int), vol.Range(min=5, max=120) ), vol.Optional(CONF_NAME, default="br"): cv.string, @@ -207,7 +207,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) - timeframe = config.get(CONF_TIMEFRAME, DEFAULT_TIMEFRAME) + timeframe = config[CONF_TIMEFRAME] if None in (latitude, longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config") diff --git a/homeassistant/components/buienradar/weather.py b/homeassistant/components/buienradar/weather.py index bd54f42fc211..37dee08313e3 100644 --- a/homeassistant/components/buienradar/weather.py +++ b/homeassistant/components/buienradar/weather.py @@ -102,7 +102,7 @@ class BrWeather(WeatherEntity): def __init__(self, data, config): """Initialise the platform with a data instance and station name.""" self._stationname = config.get(CONF_NAME) - self._forecast = config.get(CONF_FORECAST) + self._forecast = config[CONF_FORECAST] self._data = data @property diff --git a/homeassistant/components/canary/__init__.py b/homeassistant/components/canary/__init__.py index 1c7c8bb4a903..d6effc7eb80b 100644 --- a/homeassistant/components/canary/__init__.py +++ b/homeassistant/components/canary/__init__.py @@ -40,9 +40,9 @@ CANARY_COMPONENTS = ["alarm_control_panel", "camera", "sensor"] def setup(hass, config): """Set up the Canary component.""" conf = config[DOMAIN] - username = conf.get(CONF_USERNAME) - password = conf.get(CONF_PASSWORD) - timeout = conf.get(CONF_TIMEOUT) + username = conf[CONF_USERNAME] + password = conf[CONF_PASSWORD] + timeout = conf[CONF_TIMEOUT] try: hass.data[DATA_CANARY] = CanaryData(username, password, timeout) diff --git a/homeassistant/components/canary/camera.py b/homeassistant/components/canary/camera.py index 7ed1e62ab8a1..1631038f81a5 100644 --- a/homeassistant/components/canary/camera.py +++ b/homeassistant/components/canary/camera.py @@ -42,7 +42,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): location, device, DEFAULT_TIMEOUT, - config.get(CONF_FFMPEG_ARGUMENTS), + config[CONF_FFMPEG_ARGUMENTS], ) ) diff --git a/homeassistant/components/channels/media_player.py b/homeassistant/components/channels/media_player.py index e4acc2f907c8..fb5f8cb6ac0b 100644 --- a/homeassistant/components/channels/media_player.py +++ b/homeassistant/components/channels/media_player.py @@ -70,9 +70,7 @@ CHANNELS_SEEK_BY_SCHEMA = CHANNELS_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Channels platform.""" - device = ChannelsPlayer( - config.get(CONF_NAME), config.get(CONF_HOST), config.get(CONF_PORT) - ) + device = ChannelsPlayer(config[CONF_NAME], config[CONF_HOST], config[CONF_PORT]) if DATA_CHANNELS not in hass.data: hass.data[DATA_CHANNELS] = [] diff --git a/homeassistant/components/cisco_ios/device_tracker.py b/homeassistant/components/cisco_ios/device_tracker.py index 5a42ef1c8b80..8bf2b77fa250 100644 --- a/homeassistant/components/cisco_ios/device_tracker.py +++ b/homeassistant/components/cisco_ios/device_tracker.py @@ -42,7 +42,7 @@ class CiscoDeviceScanner(DeviceScanner): self.host = config[CONF_HOST] self.username = config[CONF_USERNAME] self.port = config.get(CONF_PORT) - self.password = config.get(CONF_PASSWORD) + self.password = config[CONF_PASSWORD] self.last_results = {} diff --git a/homeassistant/components/cisco_mobility_express/device_tracker.py b/homeassistant/components/cisco_mobility_express/device_tracker.py index 220228b65704..b032ca30fc3e 100644 --- a/homeassistant/components/cisco_mobility_express/device_tracker.py +++ b/homeassistant/components/cisco_mobility_express/device_tracker.py @@ -44,7 +44,7 @@ def get_scanner(hass, config): config[CONF_USERNAME], config[CONF_PASSWORD], config[CONF_SSL], - config.get(CONF_VERIFY_SSL), + config[CONF_VERIFY_SSL], ) if not controller.is_logged_in(): return None diff --git a/homeassistant/components/clementine/media_player.py b/homeassistant/components/clementine/media_player.py index 9e05b831359f..db4dfc386647 100644 --- a/homeassistant/components/clementine/media_player.py +++ b/homeassistant/components/clementine/media_player.py @@ -58,8 +58,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Clementine platform.""" - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) + host = config[CONF_HOST] + port = config[CONF_PORT] token = config.get(CONF_ACCESS_TOKEN) client = ClementineRemote(host, port, token, reconnect=True) diff --git a/homeassistant/components/clickatell/notify.py b/homeassistant/components/clickatell/notify.py index f1a27be83b9b..0c1ce2e9585b 100644 --- a/homeassistant/components/clickatell/notify.py +++ b/homeassistant/components/clickatell/notify.py @@ -29,8 +29,8 @@ class ClickatellNotificationService(BaseNotificationService): def __init__(self, config): """Initialize the service.""" - self.api_key = config.get(CONF_API_KEY) - self.recipient = config.get(CONF_RECIPIENT) + self.api_key = config[CONF_API_KEY] + self.recipient = config[CONF_RECIPIENT] def send_message(self, message="", **kwargs): """Send a message to a user.""" diff --git a/homeassistant/components/clicksend_tts/notify.py b/homeassistant/components/clicksend_tts/notify.py index 0847f3fb907e..6648333bb541 100644 --- a/homeassistant/components/clicksend_tts/notify.py +++ b/homeassistant/components/clicksend_tts/notify.py @@ -56,11 +56,11 @@ class ClicksendNotificationService(BaseNotificationService): def __init__(self, config): """Initialize the service.""" - self.username = config.get(CONF_USERNAME) - self.api_key = config.get(CONF_API_KEY) - self.recipient = config.get(CONF_RECIPIENT) - self.language = config.get(CONF_LANGUAGE) - self.voice = config.get(CONF_VOICE) + self.username = config[CONF_USERNAME] + self.api_key = config[CONF_API_KEY] + self.recipient = config[CONF_RECIPIENT] + self.language = config[CONF_LANGUAGE] + self.voice = config[CONF_VOICE] self.caller = config.get(CONF_CALLER) if self.caller is None: self.caller = self.recipient diff --git a/homeassistant/components/cmus/media_player.py b/homeassistant/components/cmus/media_player.py index 3daf0bac828e..e9b9513479f0 100644 --- a/homeassistant/components/cmus/media_player.py +++ b/homeassistant/components/cmus/media_player.py @@ -61,8 +61,8 @@ def setup_platform(hass, config, add_entities, discover_info=None): host = config.get(CONF_HOST) password = config.get(CONF_PASSWORD) - port = config.get(CONF_PORT) - name = config.get(CONF_NAME) + port = config[CONF_PORT] + name = config[CONF_NAME] try: cmus_remote = CmusDevice(host, password, port, name) diff --git a/homeassistant/components/coinbase/__init__.py b/homeassistant/components/coinbase/__init__.py index d52c0867e24c..9fd99e993b60 100644 --- a/homeassistant/components/coinbase/__init__.py +++ b/homeassistant/components/coinbase/__init__.py @@ -48,10 +48,10 @@ def setup(hass, config): Will automatically setup sensors to support wallets discovered on the network. """ - api_key = config[DOMAIN].get(CONF_API_KEY) - api_secret = config[DOMAIN].get(CONF_API_SECRET) + api_key = config[DOMAIN][CONF_API_KEY] + api_secret = config[DOMAIN][CONF_API_SECRET] account_currencies = config[DOMAIN].get(CONF_ACCOUNT_CURRENCIES) - exchange_currencies = config[DOMAIN].get(CONF_EXCHANGE_CURRENCIES) + exchange_currencies = config[DOMAIN][CONF_EXCHANGE_CURRENCIES] hass.data[DATA_COINBASE] = coinbase_data = CoinbaseData(api_key, api_secret) diff --git a/homeassistant/components/coinmarketcap/sensor.py b/homeassistant/components/coinmarketcap/sensor.py index ca166aa793a1..2ae3de49817b 100644 --- a/homeassistant/components/coinmarketcap/sensor.py +++ b/homeassistant/components/coinmarketcap/sensor.py @@ -42,9 +42,9 @@ SCAN_INTERVAL = timedelta(minutes=15) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_CURRENCY_ID, default=DEFAULT_CURRENCY_ID): cv.positive_int, - vol.Optional( - CONF_DISPLAY_CURRENCY, default=DEFAULT_DISPLAY_CURRENCY - ): cv.string, + vol.Optional(CONF_DISPLAY_CURRENCY, default=DEFAULT_DISPLAY_CURRENCY): vol.All( + cv.string, vol.Upper + ), vol.Optional( CONF_DISPLAY_CURRENCY_DECIMALS, default=DEFAULT_DISPLAY_CURRENCY_DECIMALS ): vol.All(vol.Coerce(int), vol.Range(min=1)), @@ -54,9 +54,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the CoinMarketCap sensor.""" - currency_id = config.get(CONF_CURRENCY_ID) - display_currency = config.get(CONF_DISPLAY_CURRENCY).upper() - display_currency_decimals = config.get(CONF_DISPLAY_CURRENCY_DECIMALS) + currency_id = config[CONF_CURRENCY_ID] + display_currency = config[CONF_DISPLAY_CURRENCY] + display_currency_decimals = config[CONF_DISPLAY_CURRENCY_DECIMALS] try: CoinMarketCapData(currency_id, display_currency).update() diff --git a/homeassistant/components/comfoconnect/__init__.py b/homeassistant/components/comfoconnect/__init__.py index f1fd67cc4bbb..2a1328373882 100644 --- a/homeassistant/components/comfoconnect/__init__.py +++ b/homeassistant/components/comfoconnect/__init__.py @@ -52,11 +52,11 @@ def setup(hass, config): """Set up the ComfoConnect bridge.""" conf = config[DOMAIN] - host = conf.get(CONF_HOST) - name = conf.get(CONF_NAME) - token = conf.get(CONF_TOKEN) - user_agent = conf.get(CONF_USER_AGENT) - pin = conf.get(CONF_PIN) + host = conf[CONF_HOST] + name = conf[CONF_NAME] + token = conf[CONF_TOKEN] + user_agent = conf[CONF_USER_AGENT] + pin = conf[CONF_PIN] # Run discovery on the configured ip bridges = Bridge.discover(host) diff --git a/homeassistant/components/concord232/alarm_control_panel.py b/homeassistant/components/concord232/alarm_control_panel.py index 81a54a182d46..afb7e23e8fc1 100644 --- a/homeassistant/components/concord232/alarm_control_panel.py +++ b/homeassistant/components/concord232/alarm_control_panel.py @@ -46,11 +46,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Concord232 alarm control panel platform.""" - name = config.get(CONF_NAME) + name = config[CONF_NAME] code = config.get(CONF_CODE) - mode = config.get(CONF_MODE) - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) + mode = config[CONF_MODE] + host = config[CONF_HOST] + port = config[CONF_PORT] url = f"http://{host}:{port}" diff --git a/homeassistant/components/concord232/binary_sensor.py b/homeassistant/components/concord232/binary_sensor.py index 2d119e2cf860..326ac799f069 100644 --- a/homeassistant/components/concord232/binary_sensor.py +++ b/homeassistant/components/concord232/binary_sensor.py @@ -44,10 +44,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Concord232 binary sensor platform.""" - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) - exclude = config.get(CONF_EXCLUDE_ZONES) - zone_types = config.get(CONF_ZONE_TYPES) + host = config[CONF_HOST] + port = config[CONF_PORT] + exclude = config[CONF_EXCLUDE_ZONES] + zone_types = config[CONF_ZONE_TYPES] sensors = [] try: diff --git a/homeassistant/components/cpuspeed/sensor.py b/homeassistant/components/cpuspeed/sensor.py index 4d984ed6829f..34e9c5fee252 100644 --- a/homeassistant/components/cpuspeed/sensor.py +++ b/homeassistant/components/cpuspeed/sensor.py @@ -29,7 +29,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the CPU speed sensor.""" - name = config.get(CONF_NAME) + name = config[CONF_NAME] add_entities([CpuSpeedSensor(name)], True) diff --git a/homeassistant/components/crimereports/sensor.py b/homeassistant/components/crimereports/sensor.py index cf5b2e374e2c..ff65658073fc 100644 --- a/homeassistant/components/crimereports/sensor.py +++ b/homeassistant/components/crimereports/sensor.py @@ -50,8 +50,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Crime Reports platform.""" latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) - name = config.get(CONF_NAME) - radius = config.get(CONF_RADIUS) + name = config[CONF_NAME] + radius = config[CONF_RADIUS] include = config.get(CONF_INCLUDE) exclude = config.get(CONF_EXCLUDE) diff --git a/homeassistant/components/cups/sensor.py b/homeassistant/components/cups/sensor.py index ac1583882429..bc6cdbe8ba19 100644 --- a/homeassistant/components/cups/sensor.py +++ b/homeassistant/components/cups/sensor.py @@ -53,10 +53,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the CUPS sensor.""" - host = config.get(CONF_HOST) - port = config.get(CONF_PORT) - printers = config.get(CONF_PRINTERS) - is_cups = config.get(CONF_IS_CUPS_SERVER) + host = config[CONF_HOST] + port = config[CONF_PORT] + printers = config[CONF_PRINTERS] + is_cups = config[CONF_IS_CUPS_SERVER] if is_cups: data = CupsData(host, port, None) diff --git a/homeassistant/components/currencylayer/sensor.py b/homeassistant/components/currencylayer/sensor.py index 79926cf1fcc1..f2cb29515b03 100644 --- a/homeassistant/components/currencylayer/sensor.py +++ b/homeassistant/components/currencylayer/sensor.py @@ -40,15 +40,15 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Currencylayer sensor.""" - base = config.get(CONF_BASE) - api_key = config.get(CONF_API_KEY) + base = config[CONF_BASE] + api_key = config[CONF_API_KEY] parameters = {"source": base, "access_key": api_key, "format": 1} rest = CurrencylayerData(_RESOURCE, parameters) response = requests.get(_RESOURCE, params=parameters, timeout=10) sensors = [] - for variable in config["quote"]: + for variable in config[CONF_QUOTE]: sensors.append(CurrencylayerSensor(rest, base, variable)) if "error" in response.json(): return False From f516b24dfb93a0a4f9ab6284de931916ed446419 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 14 Apr 2020 13:48:35 -0500 Subject: [PATCH 405/653] Reduce tplink loss of precision during brightness conversion (#34210) --- homeassistant/components/tplink/light.py | 4 ++-- tests/components/tplink/test_light.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 7e41d5af9e86..9910fe42e03b 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -75,12 +75,12 @@ def add_entity(device: SmartBulb, async_add_entities): def brightness_to_percentage(byt): """Convert brightness from absolute 0..255 to percentage.""" - return int((byt * 100.0) / 255.0) + return round((byt * 100.0) / 255.0) def brightness_from_percentage(percent): """Convert percentage to absolute value 0..255.""" - return (percent * 255.0) / 100.0 + return round((percent * 255.0) / 100.0) class LightState(NamedTuple): diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 27d00024706e..0986362ba28e 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -287,7 +287,7 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" - assert state.attributes["brightness"] == 48.45 + assert state.attributes["brightness"] == 51 assert sys_info["relay_state"] == 1 await hass.services.async_call( @@ -301,8 +301,8 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" - assert state.attributes["brightness"] == 53.55 - assert sys_info["brightness"] == 21 + assert state.attributes["brightness"] == 56 + assert sys_info["brightness"] == 22 sys_info["relay_state"] = 0 sys_info["brightness"] = 66 @@ -327,7 +327,7 @@ async def test_smartswitch( state = hass.states.get("light.dimmer1") assert state.state == "on" - assert state.attributes["brightness"] == 168.3 + assert state.attributes["brightness"] == 168 assert sys_info["brightness"] == 66 @@ -373,7 +373,7 @@ async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> Non state = hass.states.get("light.light1") assert state.state == "on" - assert state.attributes["brightness"] == 48.45 + assert state.attributes["brightness"] == 51 assert state.attributes["hs_color"] == (110, 90) assert state.attributes["color_temp"] == 222 assert light_state["on_off"] == 1 @@ -389,9 +389,9 @@ async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> Non state = hass.states.get("light.light1") assert state.state == "on" - assert state.attributes["brightness"] == 53.55 + assert state.attributes["brightness"] == 56 assert state.attributes["hs_color"] == (23, 27) - assert light_state["brightness"] == 21 + assert light_state["brightness"] == 22 assert light_state["hue"] == 23 assert light_state["saturation"] == 27 @@ -423,7 +423,7 @@ async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> Non state = hass.states.get("light.light1") assert state.state == "on" - assert state.attributes["brightness"] == 168.3 + assert state.attributes["brightness"] == 168 assert state.attributes["hs_color"] == (77, 78) assert state.attributes["color_temp"] == 156 assert light_state["brightness"] == 66 @@ -434,7 +434,7 @@ async def test_light(hass: HomeAssistant, light_mock_data: LightMockData) -> Non await update_entity(hass, "light.light1") state = hass.states.get("light.light1") - assert state.attributes["brightness"] == 232.05 + assert state.attributes["brightness"] == 232 async def test_get_light_state_retry( From f3b702db5abc8c4ebb52a32f88f59d5f613a3cb5 Mon Sep 17 00:00:00 2001 From: Adam Michaleski <38081677+prairieapps@users.noreply.github.com> Date: Tue, 14 Apr 2020 16:10:44 -0500 Subject: [PATCH 406/653] Fix for schluter unit system bug (#34230) --- homeassistant/components/schluter/climate.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/schluter/climate.py b/homeassistant/components/schluter/climate.py index 99dc5b0d495c..d91020c7c2bd 100644 --- a/homeassistant/components/schluter/climate.py +++ b/homeassistant/components/schluter/climate.py @@ -7,6 +7,7 @@ import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA, SCAN_INTERVAL, + TEMP_CELSIUS, ClimateDevice, ) from homeassistant.components.climate.const import ( @@ -32,7 +33,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= return session_id = hass.data[DOMAIN][DATA_SCHLUTER_SESSION] api = hass.data[DOMAIN][DATA_SCHLUTER_API] - temp_unit = hass.config.units.temperature_unit async def async_update_data(): try: @@ -58,7 +58,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= await coordinator.async_refresh() async_add_entities( - SchluterThermostat(coordinator, serial_number, temp_unit, api, session_id) + SchluterThermostat(coordinator, serial_number, api, session_id) for serial_number, thermostat in coordinator.data.items() ) @@ -66,9 +66,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= class SchluterThermostat(ClimateDevice): """Representation of a Schluter thermostat.""" - def __init__(self, coordinator, serial_number, temp_unit, api, session_id): + def __init__(self, coordinator, serial_number, api, session_id): """Initialize the thermostat.""" - self._unit = temp_unit self._coordinator = coordinator self._serial_number = serial_number self._api = api @@ -102,8 +101,8 @@ class SchluterThermostat(ClimateDevice): @property def temperature_unit(self): - """Return the unit of measurement.""" - return self._unit + """Schluter API always uses celsius.""" + return TEMP_CELSIUS @property def current_temperature(self): From c30600a044783463f7f24d29a5e6bc69592614cd Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Tue, 14 Apr 2020 23:15:08 +0200 Subject: [PATCH 407/653] Add unit_of_measurement property for air_quality entity (#33304) --- homeassistant/components/air_quality/__init__.py | 6 ++++++ homeassistant/components/xiaomi_miio/air_quality.py | 13 +------------ tests/components/air_quality/test_air_quality.py | 7 +++++++ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/air_quality/__init__.py b/homeassistant/components/air_quality/__init__.py index 29c6756260c5..48423d08e69f 100644 --- a/homeassistant/components/air_quality/__init__.py +++ b/homeassistant/components/air_quality/__init__.py @@ -2,6 +2,7 @@ from datetime import timedelta import logging +from homeassistant.const import CONCENTRATION_MICROGRAMS_PER_CUBIC_METER from homeassistant.helpers.config_validation import ( # noqa: F401 PLATFORM_SCHEMA, PLATFORM_SCHEMA_BASE, @@ -144,3 +145,8 @@ class AirQualityEntity(Entity): def state(self): """Return the current state.""" return self.particulate_matter_2_5 + + @property + def unit_of_measurement(self): + """Return the unit of measurement of this entity.""" + return CONCENTRATION_MICROGRAMS_PER_CUBIC_METER diff --git a/homeassistant/components/xiaomi_miio/air_quality.py b/homeassistant/components/xiaomi_miio/air_quality.py index 93aeb0d28b70..7da4da9c05d7 100644 --- a/homeassistant/components/xiaomi_miio/air_quality.py +++ b/homeassistant/components/xiaomi_miio/air_quality.py @@ -5,12 +5,7 @@ from miio import AirQualityMonitor, Device, DeviceException import voluptuous as vol from homeassistant.components.air_quality import PLATFORM_SCHEMA, AirQualityEntity -from homeassistant.const import ( - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - CONF_HOST, - CONF_NAME, - CONF_TOKEN, -) +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_TOKEN from homeassistant.exceptions import NoEntitySpecifiedError, PlatformNotReady import homeassistant.helpers.config_validation as cv @@ -93,7 +88,6 @@ class AirMonitorB1(AirQualityEntity): self._device = device self._unique_id = unique_id self._icon = "mdi:cloud" - self._unit_of_measurement = CONCENTRATION_MICROGRAMS_PER_CUBIC_METER self._available = None self._air_quality_index = None self._carbon_dioxide = None @@ -185,11 +179,6 @@ class AirMonitorB1(AirQualityEntity): return data - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return self._unit_of_measurement - class AirMonitorS1(AirMonitorB1): """Air Quality class for Xiaomi cgllc.airmonitor.s1 device.""" diff --git a/tests/components/air_quality/test_air_quality.py b/tests/components/air_quality/test_air_quality.py index c0391f17f132..f457ebb3d2fc 100644 --- a/tests/components/air_quality/test_air_quality.py +++ b/tests/components/air_quality/test_air_quality.py @@ -5,6 +5,10 @@ from homeassistant.components.air_quality import ( ATTR_OZONE, ATTR_PM_10, ) +from homeassistant.const import ( + ATTR_UNIT_OF_MEASUREMENT, + CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, +) from homeassistant.setup import async_setup_component @@ -34,3 +38,6 @@ async def test_attributes(hass): assert data.get(ATTR_N2O) is None assert data.get(ATTR_OZONE) is None assert data.get(ATTR_ATTRIBUTION) == "Powered by Home Assistant" + assert ( + data.get(ATTR_UNIT_OF_MEASUREMENT) == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER + ) From bf331696276d7702499400431733d63377197585 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 15 Apr 2020 00:13:35 +0200 Subject: [PATCH 408/653] Updated frontend to 20200414.0 (#34235) --- 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 3a4919dacaea..c78ec6ad69b3 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,7 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": ["home-assistant-frontend==20200407.2"], + "requirements": ["home-assistant-frontend==20200414.0"], "dependencies": [ "api", "auth", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index b18608587eb3..fa33b0315c7b 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -12,7 +12,7 @@ cryptography==2.9 defusedxml==0.6.0 distro==1.5.0 hass-nabucasa==0.34.0 -home-assistant-frontend==20200407.2 +home-assistant-frontend==20200414.0 importlib-metadata==1.6.0 jinja2>=2.11.1 netdisco==2.6.0 diff --git a/requirements_all.txt b/requirements_all.txt index d8edffe2937e..928fefa510c0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -703,7 +703,7 @@ hole==0.5.1 holidays==0.10.2 # homeassistant.components.frontend -home-assistant-frontend==20200407.2 +home-assistant-frontend==20200414.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f4be0c409603..c8718f38528f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -281,7 +281,7 @@ hole==0.5.1 holidays==0.10.2 # homeassistant.components.frontend -home-assistant-frontend==20200407.2 +home-assistant-frontend==20200414.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From 075030f15a046708ae544e17b3bce7740e0eed9c Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Tue, 14 Apr 2020 17:26:53 -0500 Subject: [PATCH 409/653] Update SmartThings config flow to be entirely UI based (#34163) * bump pysmartthings 0.7.1 * Update config flow to use UI * Code review comments and fix for resetting oauth client * Replace html with markdown --- .../smartthings/.translations/en.json | 63 +-- .../components/smartthings/config_flow.py | 219 +++++---- homeassistant/components/smartthings/const.py | 1 - .../components/smartthings/manifest.json | 2 +- .../components/smartthings/smartapp.py | 88 ++-- .../components/smartthings/strings.json | 27 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../smartthings/test_config_flow.py | 426 +++++++++++------- tests/components/smartthings/test_smartapp.py | 95 ++-- 10 files changed, 543 insertions(+), 382 deletions(-) diff --git a/homeassistant/components/smartthings/.translations/en.json b/homeassistant/components/smartthings/.translations/en.json index e35035b8fa07..94a8f0c8bc49 100644 --- a/homeassistant/components/smartthings/.translations/en.json +++ b/homeassistant/components/smartthings/.translations/en.json @@ -1,28 +1,39 @@ { - "config": { - "error": { - "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", - "app_setup_error": "Unable to setup the SmartApp. Please try again.", - "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", - "token_already_setup": "The token has already been setup.", - "token_forbidden": "The token does not have the required OAuth scopes.", - "token_invalid_format": "The token must be in the UID/GUID format", - "token_unauthorized": "The token is invalid or no longer authorized.", - "webhook_error": "SmartThings could not validate the endpoint configured in `base_url`. Please review the component requirements." - }, - "step": { - "user": { - "data": { - "access_token": "Access Token" - }, - "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}).", - "title": "Enter Personal Access Token" - }, - "wait_install": { - "description": "Please install the Home Assistant SmartApp in at least one location and click submit.", - "title": "Install SmartApp" - } - }, - "title": "SmartThings" + "config": { + "title": "SmartThings", + "step": { + "user": { + "title": "Confirm Callback URL", + "description": "SmartThings will be configured to send push updates to Home Assistant at:\n> {webhook_url}\n\nIf this is not correct, please update your configuration, restart Home Assistant, and try again." + }, + "pat": { + "title": "Enter Personal Access Token", + "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}). This will be used to create the Home Assistant integration within your SmartThings account.", + "data": { + "access_token": "Access Token" + } + }, + "select_location": { + "title": "Select Location", + "description": "Please select the SmartThings Location you wish to add to Home Assistant. We will then open a new window and ask you to login and authorize installation of the Home Assistant integration into the selected location.", + "data": { + "location_id": "Location" + } + }, + "authorize": { + "title": "Authorize Home Assistant" + } + }, + "abort": { + "invalid_webhook_url": "Home Assistant is not configured correctly to receive updates from SmartThings. The webhook URL is invalid:\n> {webhook_url}\n\nPlease update your configuration per the [instructions]({component_url}), restart Home Assistant, and try again.", + "no_available_locations": "There are no available SmartThings Locations to setup in Home Assistant." + }, + "error": { + "token_invalid_format": "The token must be in the UID/GUID format", + "token_unauthorized": "The token is invalid or no longer authorized.", + "token_forbidden": "The token does not have the required OAuth scopes.", + "app_setup_error": "Unable to setup the SmartApp. Please try again.", + "webhook_error": "SmartThings could not validate the webhook URL. Please ensure the webhook URL is reachable from the internet and try again." } -} \ No newline at end of file + } +} diff --git a/homeassistant/components/smartthings/config_flow.py b/homeassistant/components/smartthings/config_flow.py index 249635f9b2a5..cb4623cea1cb 100644 --- a/homeassistant/components/smartthings/config_flow.py +++ b/homeassistant/components/smartthings/config_flow.py @@ -3,26 +3,30 @@ import logging from aiohttp import ClientResponseError from pysmartthings import APIResponseError, AppOAuth, SmartThings +from pysmartthings.installedapp import format_install_url import voluptuous as vol from homeassistant import config_entries from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_FORBIDDEN from homeassistant.helpers.aiohttp_client import async_get_clientsession +# pylint: disable=unused-import from .const import ( APP_OAUTH_CLIENT_NAME, APP_OAUTH_SCOPES, CONF_APP_ID, - CONF_INSTALLED_APPS, + CONF_INSTALLED_APP_ID, CONF_LOCATION_ID, CONF_OAUTH_CLIENT_ID, CONF_OAUTH_CLIENT_SECRET, + CONF_REFRESH_TOKEN, DOMAIN, VAL_UID_MATCHER, ) from .smartapp import ( create_app, find_app, + get_webhook_url, setup_smartapp, setup_smartapp_endpoint, update_app, @@ -32,23 +36,8 @@ from .smartapp import ( _LOGGER = logging.getLogger(__name__) -@config_entries.HANDLERS.register(DOMAIN) -class SmartThingsFlowHandler(config_entries.ConfigFlow): - """ - Handle configuration of SmartThings integrations. - - Any number of integrations are supported. The high level flow follows: - 1) Flow initiated - a) User initiates through the UI - b) Re-configuration of a failed entry setup - 2) Enter access token - a) Check not already setup - b) Validate format - c) Setup SmartApp - 3) Wait for Installation - a) Check user installed into one or more locations - b) Config entries setup for all installations - """ +class SmartThingsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): + """Handle configuration of SmartThings integrations.""" VERSION = 2 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_PUSH @@ -60,55 +49,84 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow): self.api = None self.oauth_client_secret = None self.oauth_client_id = None + self.installed_app_id = None + self.refresh_token = None + self.location_id = None async def async_step_import(self, user_input=None): """Occurs when a previously entry setup fails and is re-initiated.""" return await self.async_step_user(user_input) async def async_step_user(self, user_input=None): - """Get access token and validate it.""" + """Validate and confirm webhook setup.""" + await setup_smartapp_endpoint(self.hass) + webhook_url = get_webhook_url(self.hass) + + # Abort if the webhook is invalid + if not validate_webhook_requirements(self.hass): + return self.async_abort( + reason="invalid_webhook_url", + description_placeholders={ + "webhook_url": webhook_url, + "component_url": "https://www.home-assistant.io/integrations/smartthings/", + }, + ) + + # Show the confirmation + if user_input is None: + return self.async_show_form( + step_id="user", description_placeholders={"webhook_url": webhook_url}, + ) + + # Show the next screen + return await self.async_step_pat() + + async def async_step_pat(self, user_input=None): + """Get the Personal Access Token and validate it.""" errors = {} if user_input is None or CONF_ACCESS_TOKEN not in user_input: - return self._show_step_user(errors) + return self._show_step_pat(errors) - self.access_token = user_input.get(CONF_ACCESS_TOKEN, "") - self.api = SmartThings(async_get_clientsession(self.hass), self.access_token) + self.access_token = user_input[CONF_ACCESS_TOKEN] # Ensure token is a UUID if not VAL_UID_MATCHER.match(self.access_token): errors[CONF_ACCESS_TOKEN] = "token_invalid_format" - return self._show_step_user(errors) - # Check not already setup in another entry - if any( - entry.data.get(CONF_ACCESS_TOKEN) == self.access_token - for entry in self.hass.config_entries.async_entries(DOMAIN) - ): - errors[CONF_ACCESS_TOKEN] = "token_already_setup" - return self._show_step_user(errors) + return self._show_step_pat(errors) # Setup end-point - await setup_smartapp_endpoint(self.hass) - - if not validate_webhook_requirements(self.hass): - errors["base"] = "base_url_not_https" - return self._show_step_user(errors) - + self.api = SmartThings(async_get_clientsession(self.hass), self.access_token) try: app = await find_app(self.hass, self.api) if app: await app.refresh() # load all attributes await update_app(self.hass, app) - # Get oauth client id/secret by regenerating it - app_oauth = AppOAuth(app.app_id) - app_oauth.client_name = APP_OAUTH_CLIENT_NAME - app_oauth.scope.extend(APP_OAUTH_SCOPES) - client = await self.api.generate_app_oauth(app_oauth) + # Find an existing entry to copy the oauth client + existing = next( + ( + entry + for entry in self._async_current_entries() + if entry.data[CONF_APP_ID] == app.app_id + ), + None, + ) + if existing: + self.oauth_client_id = existing.data[CONF_OAUTH_CLIENT_ID] + self.oauth_client_secret = existing.data[CONF_OAUTH_CLIENT_SECRET] + else: + # Get oauth client id/secret by regenerating it + app_oauth = AppOAuth(app.app_id) + app_oauth.client_name = APP_OAUTH_CLIENT_NAME + app_oauth.scope.extend(APP_OAUTH_SCOPES) + client = await self.api.generate_app_oauth(app_oauth) + self.oauth_client_secret = client.client_secret + self.oauth_client_id = client.client_id else: app, client = await create_app(self.hass, self.api) + self.oauth_client_secret = client.client_secret + self.oauth_client_id = client.client_id setup_smartapp(self.hass, app) self.app_id = app.app_id - self.oauth_client_secret = client.client_secret - self.oauth_client_id = client.client_id except APIResponseError as ex: if ex.is_target_error(): @@ -118,58 +136,80 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow): _LOGGER.exception( "API error setting up the SmartApp: %s", ex.raw_error_response ) - return self._show_step_user(errors) + return self._show_step_pat(errors) except ClientResponseError as ex: if ex.status == 401: errors[CONF_ACCESS_TOKEN] = "token_unauthorized" + _LOGGER.debug( + "Unauthorized error received setting up SmartApp", exc_info=True + ) elif ex.status == HTTP_FORBIDDEN: errors[CONF_ACCESS_TOKEN] = "token_forbidden" + _LOGGER.debug( + "Forbidden error received setting up SmartApp", exc_info=True + ) else: errors["base"] = "app_setup_error" _LOGGER.exception("Unexpected error setting up the SmartApp") - return self._show_step_user(errors) + return self._show_step_pat(errors) except Exception: # pylint:disable=broad-except errors["base"] = "app_setup_error" _LOGGER.exception("Unexpected error setting up the SmartApp") - return self._show_step_user(errors) + return self._show_step_pat(errors) - return await self.async_step_wait_install() + return await self.async_step_select_location() - async def async_step_wait_install(self, user_input=None): - """Wait for SmartApp installation.""" - errors = {} - if user_input is None: - return self._show_step_wait_install(errors) + async def async_step_select_location(self, user_input=None): + """Ask user to select the location to setup.""" + if user_input is None or CONF_LOCATION_ID not in user_input: + # Get available locations + existing_locations = [ + entry.data[CONF_LOCATION_ID] for entry in self._async_current_entries() + ] + locations = await self.api.locations() + locations_options = { + location.location_id: location.name + for location in locations + if location.location_id not in existing_locations + } + if not locations_options: + return self.async_abort(reason="no_available_locations") - # Find installed apps that were authorized - installed_apps = self.hass.data[DOMAIN][CONF_INSTALLED_APPS].copy() - if not installed_apps: - errors["base"] = "app_not_installed" - return self._show_step_wait_install(errors) - self.hass.data[DOMAIN][CONF_INSTALLED_APPS].clear() - - # Enrich the data - for installed_app in installed_apps: - installed_app[CONF_APP_ID] = self.app_id - installed_app[CONF_ACCESS_TOKEN] = self.access_token - installed_app[CONF_OAUTH_CLIENT_ID] = self.oauth_client_id - installed_app[CONF_OAUTH_CLIENT_SECRET] = self.oauth_client_secret - - # User may have installed the SmartApp in more than one SmartThings - # location. Config flows are created for the additional installations - for installed_app in installed_apps[1:]: - self.hass.async_create_task( - self.hass.config_entries.flow.async_init( - DOMAIN, context={"source": "install"}, data=installed_app - ) + return self.async_show_form( + step_id="select_location", + data_schema=vol.Schema( + {vol.Required(CONF_LOCATION_ID): vol.In(locations_options)} + ), ) - # Create config entity for the first one. - return await self.async_step_install(installed_apps[0]) + self.location_id = user_input[CONF_LOCATION_ID] + return await self.async_step_authorize() + + async def async_step_authorize(self, user_input=None): + """Wait for the user to authorize the app installation.""" + user_input = {} if user_input is None else user_input + self.installed_app_id = user_input.get(CONF_INSTALLED_APP_ID) + self.refresh_token = user_input.get(CONF_REFRESH_TOKEN) + if self.installed_app_id is None: + # Launch the external setup URL + url = format_install_url(self.app_id, self.location_id) + return self.async_external_step(step_id="authorize", url=url) + + return self.async_external_step_done(next_step_id="install") + + def _show_step_pat(self, errors): + if self.access_token is None: + # Get the token from an existing entry to make it easier to setup multiple locations. + self.access_token = next( + ( + entry.data.get(CONF_ACCESS_TOKEN) + for entry in self._async_current_entries() + ), + None, + ) - def _show_step_user(self, errors): return self.async_show_form( - step_id="user", + step_id="pat", data_schema=vol.Schema( {vol.Required(CONF_ACCESS_TOKEN, default=self.access_token): str} ), @@ -180,21 +220,18 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow): }, ) - def _show_step_wait_install(self, errors): - return self.async_show_form(step_id="wait_install", errors=errors) - async def async_step_install(self, data=None): - """ - Create a config entry at completion of a flow. - - Launched when the user completes the flow or when the SmartApp - is installed into an additional location. - """ - if not self.api: - # Launched from the SmartApp install event handler - self.api = SmartThings( - async_get_clientsession(self.hass), data[CONF_ACCESS_TOKEN] - ) + """Create a config entry at completion of a flow and authorization of the app.""" + data = { + CONF_ACCESS_TOKEN: self.access_token, + CONF_REFRESH_TOKEN: self.refresh_token, + CONF_OAUTH_CLIENT_ID: self.oauth_client_id, + CONF_OAUTH_CLIENT_SECRET: self.oauth_client_secret, + CONF_LOCATION_ID: self.location_id, + CONF_APP_ID: self.app_id, + CONF_INSTALLED_APP_ID: self.installed_app_id, + } location = await self.api.location(data[CONF_LOCATION_ID]) + return self.async_create_entry(title=location.name, data=data) diff --git a/homeassistant/components/smartthings/const.py b/homeassistant/components/smartthings/const.py index c258101da70c..8e323c0a7156 100644 --- a/homeassistant/components/smartthings/const.py +++ b/homeassistant/components/smartthings/const.py @@ -8,7 +8,6 @@ APP_NAME_PREFIX = "homeassistant." CONF_APP_ID = "app_id" CONF_CLOUDHOOK_URL = "cloudhook_url" CONF_INSTALLED_APP_ID = "installed_app_id" -CONF_INSTALLED_APPS = "installed_apps" CONF_INSTANCE_ID = "instance_id" CONF_LOCATION_ID = "location_id" CONF_OAUTH_CLIENT_ID = "client_id" diff --git a/homeassistant/components/smartthings/manifest.json b/homeassistant/components/smartthings/manifest.json index 9fa156e0b281..4c78bbb23dff 100644 --- a/homeassistant/components/smartthings/manifest.json +++ b/homeassistant/components/smartthings/manifest.json @@ -3,7 +3,7 @@ "name": "Smartthings", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/smartthings", - "requirements": ["pysmartapp==0.3.2", "pysmartthings==0.7.0"], + "requirements": ["pysmartapp==0.3.2", "pysmartthings==0.7.1"], "dependencies": ["webhook"], "after_dependencies": ["cloud"], "codeowners": ["@andrewsayre"] diff --git a/homeassistant/components/smartthings/smartapp.py b/homeassistant/components/smartthings/smartapp.py index 402fdbd07159..0b86a430d89e 100644 --- a/homeassistant/components/smartthings/smartapp.py +++ b/homeassistant/components/smartthings/smartapp.py @@ -36,10 +36,8 @@ from .const import ( APP_NAME_PREFIX, APP_OAUTH_CLIENT_NAME, APP_OAUTH_SCOPES, - CONF_APP_ID, CONF_CLOUDHOOK_URL, CONF_INSTALLED_APP_ID, - CONF_INSTALLED_APPS, CONF_INSTANCE_ID, CONF_LOCATION_ID, CONF_REFRESH_TOKEN, @@ -258,7 +256,6 @@ async def setup_smartapp_endpoint(hass: HomeAssistantType): CONF_WEBHOOK_ID: config[CONF_WEBHOOK_ID], # Will not be present if not enabled CONF_CLOUDHOOK_URL: config.get(CONF_CLOUDHOOK_URL), - CONF_INSTALLED_APPS: [], } _LOGGER.debug( "Setup endpoint for %s", @@ -370,40 +367,30 @@ async def smartapp_sync_subscriptions( async def smartapp_install(hass: HomeAssistantType, req, resp, app): - """ - Handle when a SmartApp is installed by the user into a location. - - Create a config entry representing the installation if this is not - the first installation under the account, otherwise store the data - for the config flow. - """ - install_data = { - CONF_INSTALLED_APP_ID: req.installed_app_id, - CONF_LOCATION_ID: req.location_id, - CONF_REFRESH_TOKEN: req.refresh_token, - } - # App attributes (client id/secret, etc...) are copied from another entry - # with the same parent app_id. If one is not found, the install data is - # stored for the config flow to retrieve during the wait step. - entry = next( + """Handle a SmartApp installation and continue the config flow.""" + flow = next( ( - entry - for entry in hass.config_entries.async_entries(DOMAIN) - if entry.data[CONF_APP_ID] == app.app_id + flow + for flow in hass.config_entries.flow.async_progress() + if flow["handler"] == DOMAIN ), None, ) - if entry: - data = entry.data.copy() - data.update(install_data) - # Add as job not needed because the current coroutine was invoked - # from the dispatcher and is not being awaited. - await hass.config_entries.flow.async_init( - DOMAIN, context={"source": "install"}, data=data + if flow is not None: + await hass.config_entries.flow.async_configure( + flow["flow_id"], + { + CONF_INSTALLED_APP_ID: req.installed_app_id, + CONF_LOCATION_ID: req.location_id, + CONF_REFRESH_TOKEN: req.refresh_token, + }, + ) + _LOGGER.debug( + "Continued config flow '%s' for SmartApp '%s' under parent app '%s'", + flow["flow_id"], + req.installed_app_id, + app.app_id, ) - else: - # Store the data where the flow can find it - hass.data[DOMAIN][CONF_INSTALLED_APPS].append(install_data) _LOGGER.debug( "Installed SmartApp '%s' under parent app '%s'", @@ -413,12 +400,7 @@ async def smartapp_install(hass: HomeAssistantType, req, resp, app): async def smartapp_update(hass: HomeAssistantType, req, resp, app): - """ - Handle when a SmartApp is updated (reconfigured) by the user. - - Store the refresh token in the config entry. - """ - # Update refresh token in config entry + """Handle a SmartApp update and either update the entry or continue the flow.""" entry = next( ( entry @@ -431,6 +413,36 @@ async def smartapp_update(hass: HomeAssistantType, req, resp, app): hass.config_entries.async_update_entry( entry, data={**entry.data, CONF_REFRESH_TOKEN: req.refresh_token} ) + _LOGGER.debug( + "Updated config entry '%s' for SmartApp '%s' under parent app '%s'", + entry.entry_id, + req.installed_app_id, + app.app_id, + ) + + flow = next( + ( + flow + for flow in hass.config_entries.flow.async_progress() + if flow["handler"] == DOMAIN + ), + None, + ) + if flow is not None: + await hass.config_entries.flow.async_configure( + flow["flow_id"], + { + CONF_INSTALLED_APP_ID: req.installed_app_id, + CONF_LOCATION_ID: req.location_id, + CONF_REFRESH_TOKEN: req.refresh_token, + }, + ) + _LOGGER.debug( + "Continued config flow '%s' for SmartApp '%s' under parent app '%s'", + flow["flow_id"], + req.installed_app_id, + app.app_id, + ) _LOGGER.debug( "Updated SmartApp '%s' under parent app '%s'", req.installed_app_id, app.app_id diff --git a/homeassistant/components/smartthings/strings.json b/homeassistant/components/smartthings/strings.json index 99173c830a0b..94a8f0c8bc49 100644 --- a/homeassistant/components/smartthings/strings.json +++ b/homeassistant/components/smartthings/strings.json @@ -3,26 +3,37 @@ "title": "SmartThings", "step": { "user": { + "title": "Confirm Callback URL", + "description": "SmartThings will be configured to send push updates to Home Assistant at:\n> {webhook_url}\n\nIf this is not correct, please update your configuration, restart Home Assistant, and try again." + }, + "pat": { "title": "Enter Personal Access Token", - "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}).", + "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}). This will be used to create the Home Assistant integration within your SmartThings account.", "data": { "access_token": "Access Token" } }, - "wait_install": { - "title": "Install SmartApp", - "description": "Please install the Home Assistant SmartApp in at least one location and click submit." + "select_location": { + "title": "Select Location", + "description": "Please select the SmartThings Location you wish to add to Home Assistant. We will then open a new window and ask you to login and authorize installation of the Home Assistant integration into the selected location.", + "data": { + "location_id": "Location" + } + }, + "authorize": { + "title": "Authorize Home Assistant" } }, + "abort": { + "invalid_webhook_url": "Home Assistant is not configured correctly to receive updates from SmartThings. The webhook URL is invalid:\n> {webhook_url}\n\nPlease update your configuration per the [instructions]({component_url}), restart Home Assistant, and try again.", + "no_available_locations": "There are no available SmartThings Locations to setup in Home Assistant." + }, "error": { "token_invalid_format": "The token must be in the UID/GUID format", "token_unauthorized": "The token is invalid or no longer authorized.", "token_forbidden": "The token does not have the required OAuth scopes.", - "token_already_setup": "The token has already been setup.", "app_setup_error": "Unable to setup the SmartApp. Please try again.", - "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", - "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", - "webhook_error": "SmartThings could not validate the endpoint configured in `base_url`. Please review the component requirements." + "webhook_error": "SmartThings could not validate the webhook URL. Please ensure the webhook URL is reachable from the internet and try again." } } } diff --git a/requirements_all.txt b/requirements_all.txt index 928fefa510c0..e6192d55345b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1551,7 +1551,7 @@ pysma==0.3.5 pysmartapp==0.3.2 # homeassistant.components.smartthings -pysmartthings==0.7.0 +pysmartthings==0.7.1 # homeassistant.components.smarty pysmarty==0.8 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c8718f38528f..079cbc896c7a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -611,7 +611,7 @@ pysma==0.3.5 pysmartapp==0.3.2 # homeassistant.components.smartthings -pysmartthings==0.7.0 +pysmartthings==0.7.1 # homeassistant.components.soma pysoma==0.0.10 diff --git a/tests/components/smartthings/test_config_flow.py b/tests/components/smartthings/test_config_flow.py index cd43659fccb4..dc046f718a8d 100644 --- a/tests/components/smartthings/test_config_flow.py +++ b/tests/components/smartthings/test_config_flow.py @@ -4,207 +4,266 @@ from uuid import uuid4 from aiohttp import ClientResponseError from asynctest import Mock, patch from pysmartthings import APIResponseError +from pysmartthings.installedapp import format_install_url from homeassistant import data_entry_flow from homeassistant.components.smartthings import smartapp from homeassistant.components.smartthings.config_flow import SmartThingsFlowHandler from homeassistant.components.smartthings.const import ( + CONF_APP_ID, CONF_INSTALLED_APP_ID, - CONF_INSTALLED_APPS, CONF_LOCATION_ID, + CONF_OAUTH_CLIENT_ID, + CONF_OAUTH_CLIENT_SECRET, CONF_REFRESH_TOKEN, DOMAIN, ) -from homeassistant.const import HTTP_FORBIDDEN, HTTP_NOT_FOUND -from homeassistant.setup import async_setup_component +from homeassistant.const import CONF_ACCESS_TOKEN, HTTP_FORBIDDEN, HTTP_NOT_FOUND from tests.common import MockConfigEntry, mock_coro -async def test_step_user(hass): - """Test the access token form is shown for a user initiated flow.""" +async def test_step_import(hass): + """Test import returns user.""" flow = SmartThingsFlowHandler() flow.hass = hass - result = await flow.async_step_user() - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - - -async def test_step_init(hass): - """Test the access token form is shown for an init flow.""" - flow = SmartThingsFlowHandler() - flow.hass = hass result = await flow.async_step_import() assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + assert result["description_placeholders"][ + "webhook_url" + ] == smartapp.get_webhook_url(hass) -async def test_base_url_not_https(hass): - """Test the base_url parameter starts with https://.""" +async def test_step_user(hass): + """Test the webhook confirmation is shown.""" + flow = SmartThingsFlowHandler() + flow.hass = hass + + result = await flow.async_step_user() + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + assert result["description_placeholders"][ + "webhook_url" + ] == smartapp.get_webhook_url(hass) + + +async def test_step_user_aborts_invalid_webhook(hass): + """Test flow aborts if webhook is invalid.""" hass.config.api.base_url = "http://0.0.0.0" flow = SmartThingsFlowHandler() flow.hass = hass - result = await flow.async_step_user({"access_token": str(uuid4())}) + + result = await flow.async_step_user() + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "invalid_webhook_url" + assert result["description_placeholders"][ + "webhook_url" + ] == smartapp.get_webhook_url(hass) + assert "component_url" in result["description_placeholders"] + + +async def test_step_user_advances_to_pat(hass): + """Test user step advances to the pat step.""" + flow = SmartThingsFlowHandler() + flow.hass = hass + + result = await flow.async_step_user({}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - assert result["errors"] == {"base": "base_url_not_https"} + assert result["step_id"] == "pat" -async def test_invalid_token_format(hass): +async def test_step_pat(hass): + """Test pat step shows the input form.""" + flow = SmartThingsFlowHandler() + flow.hass = hass + + result = await flow.async_step_pat() + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "pat" + assert result["errors"] == {} + assert result["data_schema"]({CONF_ACCESS_TOKEN: ""}) == {CONF_ACCESS_TOKEN: ""} + assert "token_url" in result["description_placeholders"] + assert "component_url" in result["description_placeholders"] + + +async def test_step_pat_defaults_token(hass): + """Test pat form defaults the token from another entry.""" + token = str(uuid4()) + entry = MockConfigEntry(domain=DOMAIN, data={CONF_ACCESS_TOKEN: token}) + entry.add_to_hass(hass) + flow = SmartThingsFlowHandler() + flow.hass = hass + + result = await flow.async_step_pat() + + assert flow.access_token == token + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "pat" + assert result["errors"] == {} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} + assert "token_url" in result["description_placeholders"] + assert "component_url" in result["description_placeholders"] + + +async def test_step_pat_invalid_token(hass): """Test an error is shown for invalid token formats.""" flow = SmartThingsFlowHandler() flow.hass = hass - result = await flow.async_step_user({"access_token": "123456789"}) + token = "123456789" + + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" + assert result["step_id"] == "pat" + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} assert result["errors"] == {"access_token": "token_invalid_format"} + assert "token_url" in result["description_placeholders"] + assert "component_url" in result["description_placeholders"] -async def test_token_already_setup(hass): - """Test an error is shown when the token is already setup.""" - flow = SmartThingsFlowHandler() - flow.hass = hass - token = str(uuid4()) - entry = MockConfigEntry(domain=DOMAIN, data={"access_token": token}) - entry.add_to_hass(hass) - - result = await flow.async_step_user({"access_token": token}) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - assert result["errors"] == {"access_token": "token_already_setup"} - - -async def test_token_unauthorized(hass, smartthings_mock): +async def test_step_pat_unauthorized(hass, smartthings_mock): """Test an error is shown when the token is not authorized.""" flow = SmartThingsFlowHandler() flow.hass = hass - request_info = Mock(real_url="http://example.com") smartthings_mock.apps.side_effect = ClientResponseError( request_info=request_info, history=None, status=401 ) + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - assert result["errors"] == {"access_token": "token_unauthorized"} + assert result["step_id"] == "pat" + assert result["errors"] == {CONF_ACCESS_TOKEN: "token_unauthorized"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_token_forbidden(hass, smartthings_mock): +async def test_step_pat_forbidden(hass, smartthings_mock): """Test an error is shown when the token is forbidden.""" flow = SmartThingsFlowHandler() flow.hass = hass - request_info = Mock(real_url="http://example.com") smartthings_mock.apps.side_effect = ClientResponseError( request_info=request_info, history=None, status=HTTP_FORBIDDEN ) + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - assert result["errors"] == {"access_token": "token_forbidden"} + assert result["step_id"] == "pat" + assert result["errors"] == {CONF_ACCESS_TOKEN: "token_forbidden"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_webhook_error(hass, smartthings_mock): - """Test an error is when there's an error with the webhook endpoint.""" +async def test_step_pat_webhook_error(hass, smartthings_mock): + """Test an error is shown when there's an problem with the webhook endpoint.""" flow = SmartThingsFlowHandler() flow.hass = hass - data = {"error": {}} request_info = Mock(real_url="http://example.com") error = APIResponseError( request_info=request_info, history=None, data=data, status=422 ) error.is_target_error = Mock(return_value=True) - smartthings_mock.apps.side_effect = error + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" + assert result["step_id"] == "pat" assert result["errors"] == {"base": "webhook_error"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_api_error(hass, smartthings_mock): +async def test_step_pat_api_error(hass, smartthings_mock): """Test an error is shown when other API errors occur.""" flow = SmartThingsFlowHandler() flow.hass = hass - data = {"error": {}} request_info = Mock(real_url="http://example.com") error = APIResponseError( request_info=request_info, history=None, data=data, status=400 ) - smartthings_mock.apps.side_effect = error + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" + assert result["step_id"] == "pat" assert result["errors"] == {"base": "app_setup_error"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_unknown_api_error(hass, smartthings_mock): +async def test_step_pat_unknown_api_error(hass, smartthings_mock): """Test an error is shown when there is an unknown API error.""" flow = SmartThingsFlowHandler() flow.hass = hass - request_info = Mock(real_url="http://example.com") smartthings_mock.apps.side_effect = ClientResponseError( request_info=request_info, history=None, status=HTTP_NOT_FOUND ) + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" + assert result["step_id"] == "pat" assert result["errors"] == {"base": "app_setup_error"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_unknown_error(hass, smartthings_mock): +async def test_step_pat_unknown_error(hass, smartthings_mock): """Test an error is shown when there is an unknown API error.""" flow = SmartThingsFlowHandler() flow.hass = hass - smartthings_mock.apps.side_effect = Exception("Unknown error") + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" + assert result["step_id"] == "pat" assert result["errors"] == {"base": "app_setup_error"} + assert result["data_schema"]({}) == {CONF_ACCESS_TOKEN: token} -async def test_app_created_then_show_wait_form( - hass, app, app_oauth_client, smartthings_mock +async def test_step_pat_app_created_webhook( + hass, app, app_oauth_client, location, smartthings_mock ): - """Test SmartApp is created when one does not exist and shows wait form.""" + """Test SmartApp is created when one does not exist and shows location form.""" flow = SmartThingsFlowHandler() flow.hass = hass smartthings_mock.apps.return_value = [] smartthings_mock.create_app.return_value = (app, app_oauth_client) + smartthings_mock.locations.return_value = [location] + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) + assert flow.access_token == token + assert flow.app_id == app.app_id + assert flow.oauth_client_secret == app_oauth_client.client_secret + assert flow.oauth_client_id == app_oauth_client.client_id assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "wait_install" + assert result["step_id"] == "select_location" -async def test_cloudhook_app_created_then_show_wait_form( - hass, app, app_oauth_client, smartthings_mock +async def test_step_pat_app_created_cloudhook( + hass, app, app_oauth_client, location, smartthings_mock ): - """Test SmartApp is created with a cloudhoko and shows wait form.""" + """Test SmartApp is created with a cloudhook and shows location form.""" hass.config.components.add("cloud") # Unload the endpoint so we can reload it under the cloud. @@ -224,128 +283,159 @@ async def test_cloudhook_app_created_then_show_wait_form( flow.hass = hass smartthings_mock.apps.return_value = [] smartthings_mock.create_app.return_value = (app, app_oauth_client) + smartthings_mock.locations.return_value = [location] + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) + assert flow.access_token == token + assert flow.app_id == app.app_id + assert flow.oauth_client_secret == app_oauth_client.client_secret + assert flow.oauth_client_id == app_oauth_client.client_id assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "wait_install" + assert result["step_id"] == "select_location" assert mock_create_cloudhook.call_count == 1 -async def test_app_updated_then_show_wait_form( - hass, app, app_oauth_client, smartthings_mock +async def test_step_pat_app_updated_webhook( + hass, app, app_oauth_client, location, smartthings_mock ): - """Test SmartApp is updated when an existing is already created.""" + """Test SmartApp is updated then show location form.""" flow = SmartThingsFlowHandler() flow.hass = hass smartthings_mock.apps.return_value = [app] smartthings_mock.generate_app_oauth.return_value = app_oauth_client + smartthings_mock.locations.return_value = [location] + token = str(uuid4()) - result = await flow.async_step_user({"access_token": str(uuid4())}) + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) + assert flow.access_token == token + assert flow.app_id == app.app_id + assert flow.oauth_client_secret == app_oauth_client.client_secret + assert flow.oauth_client_id == app_oauth_client.client_id assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "wait_install" + assert result["step_id"] == "select_location" -async def test_wait_form_displayed(hass): - """Test the wait for installation form is displayed.""" - flow = SmartThingsFlowHandler() - flow.hass = hass - - result = await flow.async_step_wait_install(None) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "wait_install" - - -async def test_wait_form_displayed_after_checking(hass, smartthings_mock): - """Test error is shown when the user has not installed the app.""" - flow = SmartThingsFlowHandler() - flow.hass = hass - flow.access_token = str(uuid4()) - - result = await flow.async_step_wait_install({}) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "wait_install" - assert result["errors"] == {"base": "app_not_installed"} - - -async def test_config_entry_created_when_installed( - hass, location, installed_app, smartthings_mock +async def test_step_pat_app_updated_webhook_from_existing_oauth_client( + hass, app, location, smartthings_mock ): + """Test SmartApp is updated from existing then show location form.""" + oauth_client_id = str(uuid4()) + oauth_client_secret = str(uuid4()) + entry = MockConfigEntry( + domain=DOMAIN, + data={ + CONF_APP_ID: app.app_id, + CONF_OAUTH_CLIENT_ID: oauth_client_id, + CONF_OAUTH_CLIENT_SECRET: oauth_client_secret, + CONF_LOCATION_ID: str(uuid4()), + }, + ) + entry.add_to_hass(hass) + flow = SmartThingsFlowHandler() + flow.hass = hass + smartthings_mock.apps.return_value = [app] + smartthings_mock.locations.return_value = [location] + token = str(uuid4()) + + result = await flow.async_step_pat({CONF_ACCESS_TOKEN: token}) + + assert flow.access_token == token + assert flow.app_id == app.app_id + assert flow.oauth_client_secret == oauth_client_secret + assert flow.oauth_client_id == oauth_client_id + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "select_location" + + +async def test_step_select_location(hass, location, smartthings_mock): + """Test select location shows form with available locations.""" + smartthings_mock.locations.return_value = [location] + flow = SmartThingsFlowHandler() + flow.hass = hass + flow.api = smartthings_mock + + result = await flow.async_step_select_location() + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "select_location" + assert result["data_schema"]({CONF_LOCATION_ID: location.location_id}) == { + CONF_LOCATION_ID: location.location_id + } + + +async def test_step_select_location_aborts(hass, location, smartthings_mock): + """Test select location aborts if no available locations.""" + smartthings_mock.locations.return_value = [location] + entry = MockConfigEntry( + domain=DOMAIN, data={CONF_LOCATION_ID: location.location_id} + ) + entry.add_to_hass(hass) + flow = SmartThingsFlowHandler() + flow.hass = hass + flow.api = smartthings_mock + + result = await flow.async_step_select_location() + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "no_available_locations" + + +async def test_step_select_location_advances(hass): + """Test select location aborts if no available locations.""" + location_id = str(uuid4()) + app_id = str(uuid4()) + flow = SmartThingsFlowHandler() + flow.hass = hass + flow.app_id = app_id + + result = await flow.async_step_select_location({CONF_LOCATION_ID: location_id}) + + assert flow.location_id == location_id + assert result["type"] == data_entry_flow.RESULT_TYPE_EXTERNAL_STEP + assert result["step_id"] == "authorize" + assert result["url"] == format_install_url(app_id, location_id) + + +async def test_step_authorize_advances(hass): + """Test authorize step advances when completed.""" + installed_app_id = str(uuid4()) + refresh_token = str(uuid4()) + flow = SmartThingsFlowHandler() + flow.hass = hass + + result = await flow.async_step_authorize( + {CONF_INSTALLED_APP_ID: installed_app_id, CONF_REFRESH_TOKEN: refresh_token} + ) + + assert flow.installed_app_id == installed_app_id + assert flow.refresh_token == refresh_token + assert result["type"] == data_entry_flow.RESULT_TYPE_EXTERNAL_STEP_DONE + assert result["step_id"] == "install" + + +async def test_step_install_creates_entry(hass, location, smartthings_mock): """Test a config entry is created once the app is installed.""" flow = SmartThingsFlowHandler() flow.hass = hass - flow.access_token = str(uuid4()) - flow.app_id = installed_app.app_id flow.api = smartthings_mock + flow.access_token = str(uuid4()) + flow.app_id = str(uuid4()) + flow.installed_app_id = str(uuid4()) + flow.location_id = location.location_id flow.oauth_client_id = str(uuid4()) flow.oauth_client_secret = str(uuid4()) - data = { - CONF_REFRESH_TOKEN: str(uuid4()), - CONF_LOCATION_ID: installed_app.location_id, - CONF_INSTALLED_APP_ID: installed_app.installed_app_id, - } - hass.data[DOMAIN][CONF_INSTALLED_APPS].append(data) + flow.refresh_token = str(uuid4()) - result = await flow.async_step_wait_install({}) + result = await flow.async_step_install() - assert not hass.data[DOMAIN][CONF_INSTALLED_APPS] assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["data"]["app_id"] == installed_app.app_id - assert result["data"]["installed_app_id"] == installed_app.installed_app_id - assert result["data"]["location_id"] == installed_app.location_id + assert result["data"]["app_id"] == flow.app_id + assert result["data"]["installed_app_id"] == flow.installed_app_id + assert result["data"]["location_id"] == flow.location_id assert result["data"]["access_token"] == flow.access_token - assert result["data"]["refresh_token"] == data[CONF_REFRESH_TOKEN] + assert result["data"]["refresh_token"] == flow.refresh_token assert result["data"]["client_secret"] == flow.oauth_client_secret assert result["data"]["client_id"] == flow.oauth_client_id assert result["title"] == location.name - - -async def test_multiple_config_entry_created_when_installed( - hass, app, locations, installed_apps, smartthings_mock -): - """Test a config entries are created for multiple installs.""" - assert await async_setup_component(hass, "persistent_notification", {}) - flow = SmartThingsFlowHandler() - flow.hass = hass - flow.access_token = str(uuid4()) - flow.app_id = app.app_id - flow.api = smartthings_mock - flow.oauth_client_id = str(uuid4()) - flow.oauth_client_secret = str(uuid4()) - for installed_app in installed_apps: - data = { - CONF_REFRESH_TOKEN: str(uuid4()), - CONF_LOCATION_ID: installed_app.location_id, - CONF_INSTALLED_APP_ID: installed_app.installed_app_id, - } - hass.data[DOMAIN][CONF_INSTALLED_APPS].append(data) - install_data = hass.data[DOMAIN][CONF_INSTALLED_APPS].copy() - - result = await flow.async_step_wait_install({}) - - assert not hass.data[DOMAIN][CONF_INSTALLED_APPS] - - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["data"]["app_id"] == installed_apps[0].app_id - assert result["data"]["installed_app_id"] == installed_apps[0].installed_app_id - assert result["data"]["location_id"] == installed_apps[0].location_id - assert result["data"]["access_token"] == flow.access_token - assert result["data"]["refresh_token"] == install_data[0][CONF_REFRESH_TOKEN] - assert result["data"]["client_secret"] == flow.oauth_client_secret - assert result["data"]["client_id"] == flow.oauth_client_id - assert result["title"] == locations[0].name - - await hass.async_block_till_done() - entries = hass.config_entries.async_entries("smartthings") - assert len(entries) == 1 - assert entries[0].data["app_id"] == installed_apps[1].app_id - assert entries[0].data["installed_app_id"] == installed_apps[1].installed_app_id - assert entries[0].data["location_id"] == installed_apps[1].location_id - assert entries[0].data["access_token"] == flow.access_token - assert entries[0].data["client_secret"] == flow.oauth_client_secret - assert entries[0].data["client_id"] == flow.oauth_client_id - assert entries[0].title == locations[1].name diff --git a/tests/components/smartthings/test_smartapp.py b/tests/components/smartthings/test_smartapp.py index aff294beec17..4d7280a6a9ec 100644 --- a/tests/components/smartthings/test_smartapp.py +++ b/tests/components/smartthings/test_smartapp.py @@ -7,7 +7,6 @@ from pysmartthings import AppEntity, Capability from homeassistant.components.smartthings import smartapp from homeassistant.components.smartthings.const import ( CONF_INSTALLED_APP_ID, - CONF_INSTALLED_APPS, CONF_LOCATION_ID, CONF_REFRESH_TOKEN, DATA_MANAGER, @@ -40,11 +39,11 @@ async def test_update_app_updated_needed(hass, app): assert mock_app.classifications == app.classifications -async def test_smartapp_install_store_if_no_other( - hass, smartthings_mock, device_factory -): - """Test aborts if no other app was configured already.""" +async def test_smartapp_install_configures_flow(hass): + """Test install event continues an existing flow.""" # Arrange + flow_id = str(uuid4()) + flows = [{"flow_id": flow_id, "handler": DOMAIN}] app = Mock() app.app_id = uuid4() request = Mock() @@ -52,50 +51,22 @@ async def test_smartapp_install_store_if_no_other( request.auth_token = str(uuid4()) request.location_id = str(uuid4()) request.refresh_token = str(uuid4()) - # Act - await smartapp.smartapp_install(hass, request, None, app) - # Assert - entries = hass.config_entries.async_entries("smartthings") - assert not entries - data = hass.data[DOMAIN][CONF_INSTALLED_APPS][0] - assert data[CONF_REFRESH_TOKEN] == request.refresh_token - assert data[CONF_LOCATION_ID] == request.location_id - assert data[CONF_INSTALLED_APP_ID] == request.installed_app_id - -async def test_smartapp_install_creates_flow( - hass, smartthings_mock, config_entry, location, device_factory -): - """Test installation creates flow.""" - # Arrange - config_entry.add_to_hass(hass) - app = Mock() - app.app_id = config_entry.data["app_id"] - request = Mock() - request.installed_app_id = str(uuid4()) - request.auth_token = str(uuid4()) - request.refresh_token = str(uuid4()) - request.location_id = location.location_id - devices = [ - device_factory("", [Capability.battery, "ping"]), - device_factory("", [Capability.switch, Capability.switch_level]), - device_factory("", [Capability.switch]), - ] - smartthings_mock.devices.return_value = devices # Act - await smartapp.smartapp_install(hass, request, None, app) - # Assert - await hass.async_block_till_done() - entries = hass.config_entries.async_entries("smartthings") - assert len(entries) == 2 - assert entries[1].data["app_id"] == app.app_id - assert entries[1].data["installed_app_id"] == request.installed_app_id - assert entries[1].data["location_id"] == request.location_id - assert entries[1].data["access_token"] == config_entry.data["access_token"] - assert entries[1].data["refresh_token"] == request.refresh_token - assert entries[1].data["client_secret"] == config_entry.data["client_secret"] - assert entries[1].data["client_id"] == config_entry.data["client_id"] - assert entries[1].title == location.name + with patch.object( + hass.config_entries.flow, "async_progress", return_value=flows + ), patch.object(hass.config_entries.flow, "async_configure") as configure_mock: + + await smartapp.smartapp_install(hass, request, None, app) + + configure_mock.assert_called_once_with( + flow_id, + { + CONF_INSTALLED_APP_ID: request.installed_app_id, + CONF_LOCATION_ID: request.location_id, + CONF_REFRESH_TOKEN: request.refresh_token, + }, + ) async def test_smartapp_update_saves_token( @@ -121,6 +92,36 @@ async def test_smartapp_update_saves_token( assert entry.data[CONF_REFRESH_TOKEN] == request.refresh_token +async def test_smartapp_update_configures_flow(hass): + """Test update event continues an existing flow.""" + # Arrange + flow_id = str(uuid4()) + flows = [{"flow_id": flow_id, "handler": DOMAIN}] + app = Mock() + app.app_id = uuid4() + request = Mock() + request.installed_app_id = str(uuid4()) + request.auth_token = str(uuid4()) + request.location_id = str(uuid4()) + request.refresh_token = str(uuid4()) + + # Act + with patch.object( + hass.config_entries.flow, "async_progress", return_value=flows + ), patch.object(hass.config_entries.flow, "async_configure") as configure_mock: + + await smartapp.smartapp_update(hass, request, None, app) + + configure_mock.assert_called_once_with( + flow_id, + { + CONF_INSTALLED_APP_ID: request.installed_app_id, + CONF_LOCATION_ID: request.location_id, + CONF_REFRESH_TOKEN: request.refresh_token, + }, + ) + + async def test_smartapp_uninstall(hass, config_entry): """Test the config entry is unloaded when the app is uninstalled.""" config_entry.add_to_hass(hass) From 6dc6f2d099bf76dcb737cc6768fe1360cf4308bf Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Wed, 15 Apr 2020 01:04:06 +0200 Subject: [PATCH 410/653] Add config flow for braviatv integration (#33774) * Run scripts * Improvement strings * Fix FlowOptions update listener * Update .ceveragerc * Add tests * Better strings * Add test for OptionsFlow * Run gen_requirements_all.py once again * Fix pylint errors * Log error when there is no bravia.conf file during import * Improvement strings * Use braviarc object from hass.data in options flow * Use async_add_executor_job for IO * Fix options flow test * Fix tests * Remove host_reachable method * Remove dependencies * Change setup_platform method to async * Remove calling system_info * Save mac in the config entry * Fix get ignore sources * Fix read config from file * Remove the side effect from init * Fix user_input for user step * Switch OrderedDict to dict * New config_entry instance for each test * Revert change * Patch async_setup_entry in test_import * Change a way to create source list * Consolidate repeated block of code * Update tests * Suggested change Co-Authored-By: Martin Hjelmare * Suggested channge Co-Authored-By: Martin Hjelmare * Suggested change * Patch async_setup_entry * Remove unnecesary if * suggested change * Suggested change * Fix tests * Fix pylint error Co-authored-by: Martin Hjelmare --- .coveragerc | 2 + CODEOWNERS | 2 +- homeassistant/components/braviatv/__init__.py | 57 +++- .../components/braviatv/config_flow.py | 190 +++++++++++++ homeassistant/components/braviatv/const.py | 13 + .../components/braviatv/manifest.json | 4 +- .../components/braviatv/media_player.py | 199 ++++++-------- .../components/braviatv/strings.json | 39 +++ homeassistant/generated/config_flows.py | 1 + requirements_test_all.txt | 3 + tests/components/braviatv/__init__.py | 1 + tests/components/braviatv/test_config_flow.py | 255 ++++++++++++++++++ 12 files changed, 642 insertions(+), 124 deletions(-) create mode 100644 homeassistant/components/braviatv/config_flow.py create mode 100644 homeassistant/components/braviatv/const.py create mode 100644 homeassistant/components/braviatv/strings.json create mode 100644 tests/components/braviatv/__init__.py create mode 100644 tests/components/braviatv/test_config_flow.py diff --git a/.coveragerc b/.coveragerc index f1f4aeaf0d18..3bae7386c3bb 100644 --- a/.coveragerc +++ b/.coveragerc @@ -80,6 +80,8 @@ omit = homeassistant/components/bom/camera.py homeassistant/components/bom/sensor.py homeassistant/components/bom/weather.py + homeassistant/components/braviatv/__init__.py + homeassistant/components/braviatv/const.py homeassistant/components/braviatv/media_player.py homeassistant/components/broadlink/remote.py homeassistant/components/broadlink/sensor.py diff --git a/CODEOWNERS b/CODEOWNERS index dd33491e2b4f..cbba7cbdd5ea 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -55,7 +55,7 @@ homeassistant/components/blink/* @fronzbot homeassistant/components/bmp280/* @belidzs homeassistant/components/bmw_connected_drive/* @gerard33 homeassistant/components/bom/* @maddenp -homeassistant/components/braviatv/* @robbiet480 +homeassistant/components/braviatv/* @robbiet480 @bieniu homeassistant/components/broadlink/* @danielhiversen @felipediel homeassistant/components/brother/* @bieniu homeassistant/components/brunt/* @eavanvalkenburg diff --git a/homeassistant/components/braviatv/__init__.py b/homeassistant/components/braviatv/__init__.py index 47c6f4cf24d0..0f63039be9d9 100644 --- a/homeassistant/components/braviatv/__init__.py +++ b/homeassistant/components/braviatv/__init__.py @@ -1 +1,56 @@ -"""The braviatv component.""" +"""The Bravia TV component.""" +import asyncio + +from bravia_tv import BraviaRC + +from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PIN +from homeassistant.exceptions import ConfigEntryNotReady + +from .const import CLIENTID_PREFIX, DOMAIN, NICKNAME + +PLATFORMS = ["media_player"] + + +async def async_setup(hass, config): + """Set up the Bravia TV component.""" + return True + + +async def async_setup_entry(hass, config_entry): + """Set up a config entry.""" + host = config_entry.data[CONF_HOST] + mac = config_entry.data[CONF_MAC] + pin = config_entry.data[CONF_PIN] + + braviarc = BraviaRC(host, mac) + + await hass.async_add_executor_job(braviarc.connect, pin, CLIENTID_PREFIX, NICKNAME) + + if not braviarc.is_connected(): + raise ConfigEntryNotReady + + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][config_entry.entry_id] = braviarc + + for component in PLATFORMS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(config_entry, component) + ) + + return True + + +async def async_unload_entry(hass, config_entry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(config_entry, component) + for component in PLATFORMS + ] + ) + ) + if unload_ok: + hass.data[DOMAIN].pop(config_entry.entry_id) + + return unload_ok diff --git a/homeassistant/components/braviatv/config_flow.py b/homeassistant/components/braviatv/config_flow.py new file mode 100644 index 000000000000..f02ede2d9483 --- /dev/null +++ b/homeassistant/components/braviatv/config_flow.py @@ -0,0 +1,190 @@ +"""Adds config flow for Bravia TV integration.""" +import ipaddress +import logging +import re + +from bravia_tv import BraviaRC +import voluptuous as vol + +from homeassistant import config_entries, exceptions +from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PIN +from homeassistant.core import callback +import homeassistant.helpers.config_validation as cv + +from .const import ( # pylint:disable=unused-import + ATTR_CID, + ATTR_MAC, + ATTR_MODEL, + CLIENTID_PREFIX, + CONF_IGNORED_SOURCES, + DOMAIN, + NICKNAME, +) + +_LOGGER = logging.getLogger(__name__) + + +def host_valid(host): + """Return True if hostname or IP address is valid.""" + try: + if ipaddress.ip_address(host).version == (4 or 6): + return True + except ValueError: + disallowed = re.compile(r"[^a-zA-Z\d\-]") + return all(x and not disallowed.search(x) for x in host.split(".")) + + +class BraviaTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for BraviaTV integration.""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL + + def __init__(self): + """Initialize.""" + self.braviarc = None + self.host = None + self.title = None + self.mac = None + + async def init_device(self, pin): + """Initialize Bravia TV device.""" + await self.hass.async_add_executor_job( + self.braviarc.connect, pin, CLIENTID_PREFIX, NICKNAME, + ) + + if not self.braviarc.is_connected(): + raise CannotConnect() + + try: + system_info = await self.hass.async_add_executor_job( + self.braviarc.get_system_info + ) + except (KeyError, TypeError): + raise ModelNotSupported() + + await self.async_set_unique_id(system_info[ATTR_CID].lower()) + self._abort_if_unique_id_configured() + + self.title = system_info[ATTR_MODEL] + self.mac = system_info[ATTR_MAC] + + @staticmethod + @callback + def async_get_options_flow(config_entry): + """Bravia TV options callback.""" + return BraviaTVOptionsFlowHandler(config_entry) + + async def async_step_import(self, user_input=None): + """Handle configuration by yaml file.""" + self.host = user_input[CONF_HOST] + self.braviarc = BraviaRC(self.host) + + try: + await self.init_device(user_input[CONF_PIN]) + except CannotConnect: + _LOGGER.error("Import aborted, cannot connect to %s", self.host) + return self.async_abort(reason="cannot_connect") + except ModelNotSupported: + _LOGGER.error("Import aborted, your TV is not supported") + return self.async_abort(reason="unsupported_model") + + user_input[CONF_MAC] = self.mac + + return self.async_create_entry(title=self.title, data=user_input) + + async def async_step_user(self, user_input=None): + """Handle the initial step.""" + errors = {} + + if user_input is not None: + if host_valid(user_input[CONF_HOST]): + self.host = user_input[CONF_HOST] + self.braviarc = BraviaRC(self.host) + + return await self.async_step_authorize() + + errors[CONF_HOST] = "invalid_host" + + return self.async_show_form( + step_id="user", + data_schema=vol.Schema({vol.Required(CONF_HOST, default=""): str}), + errors=errors, + ) + + async def async_step_authorize(self, user_input=None): + """Get PIN from the Bravia TV device.""" + errors = {} + + if user_input is not None: + try: + await self.init_device(user_input[CONF_PIN]) + except CannotConnect: + errors["base"] = "cannot_connect" + except ModelNotSupported: + errors["base"] = "unsupported_model" + else: + user_input[CONF_HOST] = self.host + user_input[CONF_MAC] = self.mac + return self.async_create_entry(title=self.title, data=user_input) + + # Connecting with th PIN "0000" to start the pairing process on the TV. + await self.hass.async_add_executor_job( + self.braviarc.connect, "0000", CLIENTID_PREFIX, NICKNAME, + ) + + return self.async_show_form( + step_id="authorize", + data_schema=vol.Schema({vol.Required(CONF_PIN, default=""): str}), + errors=errors, + ) + + +class BraviaTVOptionsFlowHandler(config_entries.OptionsFlow): + """Config flow options for Bravia TV.""" + + def __init__(self, config_entry): + """Initialize Bravia TV options flow.""" + self.braviarc = None + self.config_entry = config_entry + self.pin = config_entry.data[CONF_PIN] + self.ignored_sources = config_entry.options.get(CONF_IGNORED_SOURCES) + self.source_list = [] + + async def async_step_init(self, user_input=None): + """Manage the options.""" + self.braviarc = self.hass.data[DOMAIN][self.config_entry.entry_id] + if not self.braviarc.is_connected(): + await self.hass.async_add_executor_job( + self.braviarc.connect, self.pin, CLIENTID_PREFIX, NICKNAME, + ) + + content_mapping = await self.hass.async_add_executor_job( + self.braviarc.load_source_list + ) + self.source_list = [*content_mapping] + return await self.async_step_user() + + async def async_step_user(self, user_input=None): + """Handle a flow initialized by the user.""" + if user_input is not None: + return self.async_create_entry(title="", data=user_input) + + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + { + vol.Optional( + CONF_IGNORED_SOURCES, default=self.ignored_sources + ): cv.multi_select(self.source_list) + } + ), + ) + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" + + +class ModelNotSupported(exceptions.HomeAssistantError): + """Error to indicate not supported model.""" diff --git a/homeassistant/components/braviatv/const.py b/homeassistant/components/braviatv/const.py new file mode 100644 index 000000000000..1fa96e6a98d6 --- /dev/null +++ b/homeassistant/components/braviatv/const.py @@ -0,0 +1,13 @@ +"""Constants for Bravia TV integration.""" +ATTR_CID = "cid" +ATTR_MAC = "macAddr" +ATTR_MANUFACTURER = "Sony" +ATTR_MODEL = "model" + +CONF_IGNORED_SOURCES = "ignored_sources" + +BRAVIA_CONFIG_FILE = "bravia.conf" +CLIENTID_PREFIX = "HomeAssistant" +DEFAULT_NAME = f"{ATTR_MANUFACTURER} Bravia TV" +DOMAIN = "braviatv" +NICKNAME = "Home Assistant" diff --git a/homeassistant/components/braviatv/manifest.json b/homeassistant/components/braviatv/manifest.json index 8d432740a4d8..be57b172f4c2 100644 --- a/homeassistant/components/braviatv/manifest.json +++ b/homeassistant/components/braviatv/manifest.json @@ -3,6 +3,6 @@ "name": "Sony Bravia TV", "documentation": "https://www.home-assistant.io/integrations/braviatv", "requirements": ["bravia-tv==1.0.1"], - "dependencies": ["configurator"], - "codeowners": ["@robbiet480"] + "codeowners": ["@robbiet480", "@bieniu"], + "config_flow": true } diff --git a/homeassistant/components/braviatv/media_player.py b/homeassistant/components/braviatv/media_player.py index 5e0c9f040586..f864a4c205cc 100644 --- a/homeassistant/components/braviatv/media_player.py +++ b/homeassistant/components/braviatv/media_player.py @@ -1,10 +1,13 @@ -"""Support for interface with a Sony Bravia TV.""" +"""Support for interface with a Bravia TV.""" import logging -from bravia_tv import BraviaRC import voluptuous as vol -from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerDevice +from homeassistant.components.media_player import ( + DEVICE_CLASS_TV, + PLATFORM_SCHEMA, + MediaPlayerDevice, +) from homeassistant.components.media_player.const import ( SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, @@ -18,22 +21,20 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_SET, SUPPORT_VOLUME_STEP, ) -from homeassistant.const import CONF_HOST, CONF_NAME, STATE_OFF, STATE_ON -from homeassistant.exceptions import PlatformNotReady +from homeassistant.config_entries import SOURCE_IMPORT +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PIN, STATE_OFF, STATE_ON import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.device_registry import format_mac -from homeassistant.util.json import load_json, save_json +from homeassistant.util.json import load_json -BRAVIA_CONFIG_FILE = "bravia.conf" - -CLIENTID_PREFIX = "HomeAssistant" - -DEFAULT_NAME = "Sony Bravia TV" - -NICKNAME = "Home Assistant" - -# Map ip to request id for configuring -_CONFIGURING = {} +from .const import ( + ATTR_MANUFACTURER, + BRAVIA_CONFIG_FILE, + CLIENTID_PREFIX, + CONF_IGNORED_SOURCES, + DEFAULT_NAME, + DOMAIN, + NICKNAME, +) _LOGGER = logging.getLogger(__name__) @@ -59,116 +60,66 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Sony Bravia TV platform.""" +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): + """Set up the Bravia TV platform.""" host = config[CONF_HOST] - if host is None: - return - - pin = None - bravia_config = load_json(hass.config.path(BRAVIA_CONFIG_FILE)) - while bravia_config: - # Set up a configured TV - host_ip, host_config = bravia_config.popitem() - if host_ip == host: - pin = host_config["pin"] - mac = host_config["mac"] - name = config[CONF_NAME] - braviarc = BraviaRC(host, mac) - if not braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME): - raise PlatformNotReady - try: - unique_id = braviarc.get_system_info()["cid"].lower() - except TypeError: - raise PlatformNotReady - - add_entities([BraviaTVDevice(braviarc, name, pin, unique_id)]) - return - - setup_bravia(config, pin, hass, add_entities) - - -def setup_bravia(config, pin, hass, add_entities): - """Set up a Sony Bravia TV based on host parameter.""" - host = config[CONF_HOST] - name = config[CONF_NAME] - - if pin is None: - request_configuration(config, hass, add_entities) - return - - # If we came here and configuring this host, mark as done - if host in _CONFIGURING: - request_id = _CONFIGURING.pop(host) - configurator = hass.components.configurator - configurator.request_done(request_id) - _LOGGER.info("Discovery configuration done") - - braviarc = BraviaRC(host) - if not braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME): - _LOGGER.error("Cannot connect to %s", host) - return - try: - system_info = braviarc.get_system_info() - except TypeError: - _LOGGER.error("Cannot retrieve system info from %s", host) - return - mac = format_mac(system_info["macAddr"]) - unique_id = system_info["cid"].lower() - - # Save config - save_json( - hass.config.path(BRAVIA_CONFIG_FILE), - {host: {"pin": pin, "host": host, "mac": mac}}, + bravia_config_file_path = hass.config.path(BRAVIA_CONFIG_FILE) + bravia_config = await hass.async_add_executor_job( + load_json, bravia_config_file_path ) - - add_entities([BraviaTVDevice(braviarc, name, pin, unique_id)]) - - -def request_configuration(config, hass, add_entities): - """Request configuration steps from the user.""" - host = config[CONF_HOST] - name = config[CONF_NAME] - - configurator = hass.components.configurator - - # We got an error if this method is called while we are configuring - if host in _CONFIGURING: - configurator.notify_errors( - _CONFIGURING[host], "Failed to register, please try again." + if not bravia_config: + _LOGGER.error( + "Configuration import failed, there is no bravia.conf file in the configuration folder" ) return - def bravia_configuration_callback(data): - """Handle the entry of user PIN.""" + while bravia_config: + # Import a configured TV + host_ip, host_config = bravia_config.popitem() + if host_ip == host: + pin = host_config[CONF_PIN] - pin = data.get("pin") - _braviarc = BraviaRC(host) - _braviarc.connect(pin, CLIENTID_PREFIX, NICKNAME) - if _braviarc.is_connected(): - setup_bravia(config, pin, hass, add_entities) - else: - request_configuration(config, hass, add_entities) + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data={CONF_HOST: host, CONF_PIN: pin}, + ) + ) + return - _CONFIGURING[host] = configurator.request_config( - name, - bravia_configuration_callback, - description=( - "Enter the Pin shown on your Sony Bravia TV." - "If no Pin is shown, enter 0000 to let TV show you a Pin." - ), - description_image="/static/images/smart-tv.png", - submit_caption="Confirm", - fields=[{"id": "pin", "name": "Enter the pin", "type": ""}], + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Add BraviaTV entities from a config_entry.""" + ignored_sources = [] + pin = config_entry.data[CONF_PIN] + unique_id = config_entry.unique_id + device_info = { + "identifiers": {(DOMAIN, unique_id)}, + "name": DEFAULT_NAME, + "manufacturer": ATTR_MANUFACTURER, + "model": config_entry.title, + } + + braviarc = hass.data[DOMAIN][config_entry.entry_id] + + ignored_sources = config_entry.options.get(CONF_IGNORED_SOURCES, []) + + async_add_entities( + [ + BraviaTVDevice( + braviarc, DEFAULT_NAME, pin, unique_id, device_info, ignored_sources + ) + ] ) class BraviaTVDevice(MediaPlayerDevice): - """Representation of a Sony Bravia TV.""" + """Representation of a Bravia TV.""" - def __init__(self, client, name, pin, unique_id): - """Initialize the Sony Bravia device.""" + def __init__(self, client, name, pin, unique_id, device_info, ignored_sources): + """Initialize the Bravia TV device.""" self._pin = pin self._braviarc = client @@ -191,11 +142,8 @@ class BraviaTVDevice(MediaPlayerDevice): self._max_volume = None self._volume = None self._unique_id = unique_id - - if self._braviarc.is_connected(): - self.update() - else: - self._state = STATE_OFF + self._device_info = device_info + self._ignored_sources = ignored_sources def update(self): """Update TV info.""" @@ -265,18 +213,29 @@ class BraviaTVDevice(MediaPlayerDevice): self._content_mapping = self._braviarc.load_source_list() self._source_list = [] for key in self._content_mapping: - self._source_list.append(key) + if key not in self._ignored_sources: + self._source_list.append(key) @property def name(self): """Return the name of the device.""" return self._name + @property + def device_class(self): + """Set the device class to TV.""" + return DEVICE_CLASS_TV + @property def unique_id(self): """Return a unique_id for this entity.""" return self._unique_id + @property + def device_info(self): + """Return the device info.""" + return self._device_info + @property def state(self): """Return the state of the device.""" diff --git a/homeassistant/components/braviatv/strings.json b/homeassistant/components/braviatv/strings.json new file mode 100644 index 000000000000..e98bea189d44 --- /dev/null +++ b/homeassistant/components/braviatv/strings.json @@ -0,0 +1,39 @@ +{ + "config": { + "title": "Sony Bravia TV", + "step": { + "user": { + "title": "Sony Bravia TV", + "description": "Set up Sony Bravia TV integration. If you have problems with configuration go to: https://www.home-assistant.io/integrations/braviatv \n\nEnsure that your TV is turned on.", + "data": { + "host": "TV hostname or IP address" + } + }, + "authorize": { + "title": "Authorize Sony Bravia TV", + "description": "Enter the PIN code shown on the Sony Bravia TV. \n\nIf the PIN code is not shown, you have to unregister Home Assistant on your TV, go to: Settings -> Network -> Remote device settings -> Unregister remote device.", + "data": { + "pin": "PIN code" + } + } + }, + "error": { + "invalid_host": "Invalid hostname or IP address.", + "cannot_connect": "Failed to connect, invalid host or PIN code.", + "unsupported_model": "Your TV model is not supported." + }, + "abort": { + "already_configured": "This TV is already configured." + } + }, + "options": { + "step": { + "user": { + "title": "Options for Sony Bravia TV", + "data": { + "ignored_sources": "List of ignored sources" + } + } + } + } +} diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 569457d291cf..521e75ab36d6 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -15,6 +15,7 @@ FLOWS = [ "ambient_station", "august", "axis", + "braviatv", "brother", "cast", "cert_expiry", diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 079cbc896c7a..5c6c0801b651 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -136,6 +136,9 @@ bellows-homeassistant==0.15.2 # homeassistant.components.bom bomradarloop==0.1.4 +# homeassistant.components.braviatv +bravia-tv==1.0.1 + # homeassistant.components.broadlink broadlink==0.13.0 diff --git a/tests/components/braviatv/__init__.py b/tests/components/braviatv/__init__.py new file mode 100644 index 000000000000..c2d6d8ef37ed --- /dev/null +++ b/tests/components/braviatv/__init__.py @@ -0,0 +1 @@ +"""Tests for Bravia TV.""" diff --git a/tests/components/braviatv/test_config_flow.py b/tests/components/braviatv/test_config_flow.py new file mode 100644 index 000000000000..9a99f5c14fcd --- /dev/null +++ b/tests/components/braviatv/test_config_flow.py @@ -0,0 +1,255 @@ +"""Define tests for the Bravia TV config flow.""" +from asynctest import patch + +from homeassistant import data_entry_flow +from homeassistant.components.braviatv.const import CONF_IGNORED_SOURCES, DOMAIN +from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PIN + +from tests.common import MockConfigEntry + +BRAVIA_SYSTEM_INFO = { + "product": "TV", + "region": "XEU", + "language": "pol", + "model": "TV-Model", + "serial": "serial_number", + "macAddr": "AA:BB:CC:DD:EE:FF", + "name": "BRAVIA", + "generation": "5.2.0", + "area": "POL", + "cid": "very_unique_string", +} + +BRAVIA_SOURCE_LIST = { + "HDMI 1": "extInput:hdmi?port=1", + "HDMI 2": "extInput:hdmi?port=2", + "HDMI 3/ARC": "extInput:hdmi?port=3", + "HDMI 4": "extInput:hdmi?port=4", + "AV/Component": "extInput:component?port=1", +} + +IMPORT_CONFIG_HOSTNAME = { + CONF_HOST: "bravia-host", + CONF_PIN: "1234", +} +IMPORT_CONFIG_IP = { + CONF_HOST: "10.10.10.12", + CONF_PIN: "1234", +} + + +async def test_show_form(hass): + """Test that the form is served with no input.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == SOURCE_USER + + +async def test_import(hass): + """Test that the import works.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch( + "bravia_tv.BraviaRC.get_system_info", return_value=BRAVIA_SYSTEM_INFO + ), patch( + "homeassistant.components.braviatv.async_setup_entry", return_value=True + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=IMPORT_CONFIG_HOSTNAME, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == "very_unique_string" + assert result["title"] == "TV-Model" + assert result["data"] == { + CONF_HOST: "bravia-host", + CONF_PIN: "1234", + CONF_MAC: "AA:BB:CC:DD:EE:FF", + } + + +async def test_import_cannot_connect(hass): + """Test that errors are shown when cannot connect to the host during import.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=False + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=IMPORT_CONFIG_HOSTNAME, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "cannot_connect" + + +async def test_import_model_unsupported(hass): + """Test that errors are shown when the TV is not supported during import.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch("bravia_tv.BraviaRC.get_system_info", side_effect=KeyError): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=IMPORT_CONFIG_IP, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "unsupported_model" + + +async def test_import_duplicate_error(hass): + """Test that errors are shown when duplicates are added during import.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id="very_unique_string", + data={ + CONF_HOST: "bravia-host", + CONF_PIN: "1234", + CONF_MAC: "AA:BB:CC:DD:EE:FF", + }, + title="TV-Model", + ) + config_entry.add_to_hass(hass) + + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch("bravia_tv.BraviaRC.get_system_info", return_value=BRAVIA_SYSTEM_INFO): + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_IMPORT}, data=IMPORT_CONFIG_HOSTNAME, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_user_invalid_host(hass): + """Test that errors are shown when the host is invalid.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data={CONF_HOST: "invalid/host"} + ) + + assert result["errors"] == {CONF_HOST: "invalid_host"} + + +async def test_authorize_cannot_connect(hass): + """Test that errors are shown when cannot connect to host at the authorize step.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data={CONF_HOST: "bravia-host"}, + ) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_PIN: "1234"} + ) + + assert result["errors"] == {"base": "cannot_connect"} + + +async def test_authorize_model_unsupported(hass): + """Test that errors are shown when the TV is not supported at the authorize step.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch("bravia_tv.BraviaRC.get_system_info", side_effect=KeyError): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data={CONF_HOST: "10.10.10.12"}, + ) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_PIN: "1234"} + ) + + assert result["errors"] == {"base": "unsupported_model"} + + +async def test_duplicate_error(hass): + """Test that errors are shown when duplicates are added.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id="very_unique_string", + data={ + CONF_HOST: "bravia-host", + CONF_PIN: "1234", + CONF_MAC: "AA:BB:CC:DD:EE:FF", + }, + title="TV-Model", + ) + config_entry.add_to_hass(hass) + + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch("bravia_tv.BraviaRC.get_system_info", return_value=BRAVIA_SYSTEM_INFO): + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data={CONF_HOST: "bravia-host"}, + ) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_PIN: "1234"} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" + + +async def test_create_entry(hass): + """Test that the user step works.""" + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch( + "bravia_tv.BraviaRC.get_system_info", return_value=BRAVIA_SYSTEM_INFO + ), patch( + "homeassistant.components.braviatv.async_setup_entry", return_value=True + ): + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data={CONF_HOST: "bravia-host"} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "authorize" + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_PIN: "1234"} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["result"].unique_id == "very_unique_string" + assert result["title"] == "TV-Model" + assert result["data"] == { + CONF_HOST: "bravia-host", + CONF_PIN: "1234", + CONF_MAC: "AA:BB:CC:DD:EE:FF", + } + + +async def test_options_flow(hass): + """Test config flow options.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id="very_unique_string", + data={ + CONF_HOST: "bravia-host", + CONF_PIN: "1234", + CONF_MAC: "AA:BB:CC:DD:EE:FF", + }, + title="TV-Model", + ) + config_entry.add_to_hass(hass) + + with patch("bravia_tv.BraviaRC.connect", return_value=True), patch( + "bravia_tv.BraviaRC.is_connected", return_value=True + ), patch("bravia_tv.BraviaRC.get_system_info", return_value=BRAVIA_SYSTEM_INFO): + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + with patch("bravia_tv.BraviaRC.load_source_list", return_value=BRAVIA_SOURCE_LIST): + result = await hass.config_entries.options.async_init(config_entry.entry_id) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + result = await hass.config_entries.options.async_configure( + result["flow_id"], user_input={CONF_IGNORED_SOURCES: ["HDMI 1", "HDMI 2"]} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert config_entry.options == {CONF_IGNORED_SOURCES: ["HDMI 1", "HDMI 2"]} From 55bec20b0237af37866ee9624b01d5d4cb16d8a0 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 15 Apr 2020 00:09:19 +0000 Subject: [PATCH 411/653] [ci skip] Translation update --- .../components/braviatv/.translations/en.json | 39 +++++++++ .../components/ipp/.translations/en.json | 2 + .../components/light/.translations/es.json | 1 + .../light/.translations/zh-Hans.json | 20 +++++ .../light/.translations/zh-Hant.json | 1 + .../smartthings/.translations/en.json | 84 +++++++++++-------- 6 files changed, 110 insertions(+), 37 deletions(-) create mode 100644 homeassistant/components/braviatv/.translations/en.json create mode 100644 homeassistant/components/light/.translations/zh-Hans.json diff --git a/homeassistant/components/braviatv/.translations/en.json b/homeassistant/components/braviatv/.translations/en.json new file mode 100644 index 000000000000..837b90ce30cb --- /dev/null +++ b/homeassistant/components/braviatv/.translations/en.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "This TV is already configured." + }, + "error": { + "cannot_connect": "Failed to connect, invalid host or PIN code.", + "invalid_host": "Invalid hostname or IP address.", + "unsupported_model": "Your TV model is not supported." + }, + "step": { + "authorize": { + "data": { + "pin": "PIN code" + }, + "description": "Enter the PIN code shown on the Sony Bravia TV. \n\nIf the PIN code is not shown, you have to unregister Home Assistant on your TV, go to: Settings -> Network -> Remote device settings -> Unregister remote device.", + "title": "Authorize Sony Bravia TV" + }, + "user": { + "data": { + "host": "TV hostname or IP address" + }, + "description": "Set up Sony Bravia TV integration. If you have problems with configuration go to: https://www.home-assistant.io/integrations/braviatv \n\nEnsure that your TV is turned on.", + "title": "Sony Bravia TV" + } + }, + "title": "Sony Bravia TV" + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "List of ignored sources" + }, + "title": "Options for Sony Bravia TV" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/en.json b/homeassistant/components/ipp/.translations/en.json index c3fc9be6d452..5d88ded9db52 100644 --- a/homeassistant/components/ipp/.translations/en.json +++ b/homeassistant/components/ipp/.translations/en.json @@ -4,6 +4,8 @@ "already_configured": "This printer is already configured.", "connection_error": "Failed to connect to printer.", "connection_upgrade": "Failed to connect to printer due to connection upgrade being required.", + "ipp_error": "Encountered IPP error.", + "ipp_version_error": "IPP version not supported by printer.", "parse_error": "Failed to parse response from printer." }, "error": { diff --git a/homeassistant/components/light/.translations/es.json b/homeassistant/components/light/.translations/es.json index f0996f9a523e..f4e999225c48 100644 --- a/homeassistant/components/light/.translations/es.json +++ b/homeassistant/components/light/.translations/es.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Disminuir brillo de {entity_name}", "brightness_increase": "Aumentar brillo de {entity_name}", + "flash": "Destellos {entidad_nombre}", "toggle": "Alternar {entity_name}", "turn_off": "Apagar {entity_name}", "turn_on": "Encender {entity_name}" diff --git a/homeassistant/components/light/.translations/zh-Hans.json b/homeassistant/components/light/.translations/zh-Hans.json new file mode 100644 index 000000000000..872b5b2e2a49 --- /dev/null +++ b/homeassistant/components/light/.translations/zh-Hans.json @@ -0,0 +1,20 @@ +{ + "device_automation": { + "action_type": { + "brightness_decrease": "\u964d\u4f4e {entity_name} \u7684\u4eae\u5ea6", + "brightness_increase": "\u63d0\u9ad8 {entity_name} \u7684\u4eae\u5ea6", + "flash": "\u4f7f {entity_name} \u95ea\u70c1", + "toggle": "\u5207\u6362 {entity_name} \u5f00\u5173", + "turn_off": "\u5173\u95ed {entity_name}", + "turn_on": "\u6253\u5f00 {entity_name}" + }, + "condition_type": { + "is_off": "{entity_name} \u5df2\u5173\u95ed", + "is_on": "{entity_name} \u5df2\u6253\u5f00" + }, + "trigger_type": { + "turned_off": "{entity_name} \u88ab\u5173\u95ed", + "turned_on": "{entity_name} \u88ab\u6253\u5f00" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/zh-Hant.json b/homeassistant/components/light/.translations/zh-Hant.json index 228074abf063..30dcf2793f30 100644 --- a/homeassistant/components/light/.translations/zh-Hant.json +++ b/homeassistant/components/light/.translations/zh-Hant.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "\u964d\u4f4e{entity_name}\u4eae\u5ea6", "brightness_increase": "\u589e\u52a0{entity_name}\u4eae\u5ea6", + "flash": "\u9583\u52d5 {entity_name}", "toggle": "\u5207\u63db{entity_name}", "turn_off": "\u95dc\u9589{entity_name}", "turn_on": "\u958b\u555f{entity_name}" diff --git a/homeassistant/components/smartthings/.translations/en.json b/homeassistant/components/smartthings/.translations/en.json index 94a8f0c8bc49..df28c6936db4 100644 --- a/homeassistant/components/smartthings/.translations/en.json +++ b/homeassistant/components/smartthings/.translations/en.json @@ -1,39 +1,49 @@ { - "config": { - "title": "SmartThings", - "step": { - "user": { - "title": "Confirm Callback URL", - "description": "SmartThings will be configured to send push updates to Home Assistant at:\n> {webhook_url}\n\nIf this is not correct, please update your configuration, restart Home Assistant, and try again." - }, - "pat": { - "title": "Enter Personal Access Token", - "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}). This will be used to create the Home Assistant integration within your SmartThings account.", - "data": { - "access_token": "Access Token" - } - }, - "select_location": { - "title": "Select Location", - "description": "Please select the SmartThings Location you wish to add to Home Assistant. We will then open a new window and ask you to login and authorize installation of the Home Assistant integration into the selected location.", - "data": { - "location_id": "Location" - } - }, - "authorize": { - "title": "Authorize Home Assistant" - } - }, - "abort": { - "invalid_webhook_url": "Home Assistant is not configured correctly to receive updates from SmartThings. The webhook URL is invalid:\n> {webhook_url}\n\nPlease update your configuration per the [instructions]({component_url}), restart Home Assistant, and try again.", - "no_available_locations": "There are no available SmartThings Locations to setup in Home Assistant." - }, - "error": { - "token_invalid_format": "The token must be in the UID/GUID format", - "token_unauthorized": "The token is invalid or no longer authorized.", - "token_forbidden": "The token does not have the required OAuth scopes.", - "app_setup_error": "Unable to setup the SmartApp. Please try again.", - "webhook_error": "SmartThings could not validate the webhook URL. Please ensure the webhook URL is reachable from the internet and try again." + "config": { + "abort": { + "invalid_webhook_url": "Home Assistant is not configured correctly to receive updates from SmartThings. The webhook URL is invalid:\n> {webhook_url}\n\nPlease update your configuration per the [instructions]({component_url}), restart Home Assistant, and try again.", + "no_available_locations": "There are no available SmartThings Locations to setup in Home Assistant." + }, + "error": { + "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", + "app_setup_error": "Unable to setup the SmartApp. Please try again.", + "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", + "token_already_setup": "The token has already been setup.", + "token_forbidden": "The token does not have the required OAuth scopes.", + "token_invalid_format": "The token must be in the UID/GUID format", + "token_unauthorized": "The token is invalid or no longer authorized.", + "webhook_error": "SmartThings could not validate the webhook URL. Please ensure the webhook URL is reachable from the internet and try again." + }, + "step": { + "authorize": { + "title": "Authorize Home Assistant" + }, + "pat": { + "data": { + "access_token": "Access Token" + }, + "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}). This will be used to create the Home Assistant integration within your SmartThings account.", + "title": "Enter Personal Access Token" + }, + "select_location": { + "data": { + "location_id": "Location" + }, + "description": "Please select the SmartThings Location you wish to add to Home Assistant. We will then open a new window and ask you to login and authorize installation of the Home Assistant integration into the selected location.", + "title": "Select Location" + }, + "user": { + "data": { + "access_token": "Access Token" + }, + "description": "SmartThings will be configured to send push updates to Home Assistant at:\n> {webhook_url}\n\nIf this is not correct, please update your configuration, restart Home Assistant, and try again.", + "title": "Confirm Callback URL" + }, + "wait_install": { + "description": "Please install the Home Assistant SmartApp in at least one location and click submit.", + "title": "Install SmartApp" + } + }, + "title": "SmartThings" } - } -} +} \ No newline at end of file From 0db1fcca0fff640cdaee63598821858e3e24f72f Mon Sep 17 00:00:00 2001 From: marecabo <23156476+marecabo@users.noreply.github.com> Date: Wed, 15 Apr 2020 02:25:45 +0200 Subject: [PATCH 412/653] Add attribute for storing one weather warning as a whole (#29005) --- homeassistant/components/dwd_weather_warnings/sensor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/homeassistant/components/dwd_weather_warnings/sensor.py b/homeassistant/components/dwd_weather_warnings/sensor.py index 2b7d2296a016..152c757424ce 100644 --- a/homeassistant/components/dwd_weather_warnings/sensor.py +++ b/homeassistant/components/dwd_weather_warnings/sensor.py @@ -138,6 +138,9 @@ class DwdWeatherWarningsSensor(Entity): for event in self._api.data[f"{prefix}_warnings"]: i = i + 1 + # dictionary for the attribute containing the complete warning as json + event_json = event.copy() + data[f"warning_{i}_name"] = event["event"] data[f"warning_{i}_level"] = event["level"] data[f"warning_{i}_type"] = event["type"] @@ -152,11 +155,15 @@ class DwdWeatherWarningsSensor(Entity): data[f"warning_{i}_start"] = dt_util.as_local( dt_util.utc_from_timestamp(event["start"] / 1000) ) + event_json["start"] = data[f"warning_{i}_start"] if event["end"] is not None: data[f"warning_{i}_end"] = dt_util.as_local( dt_util.utc_from_timestamp(event["end"] / 1000) ) + event_json["end"] = data[f"warning_{i}_end"] + + data[f"warning_{i}"] = event_json return data From 0b90ebf91e4cdb6cf9ced4e9904916dc3f7b26b2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Apr 2020 18:46:41 -0700 Subject: [PATCH 413/653] =?UTF-8?q?Allow=20async=5Fsetup=20changes=20to=20?= =?UTF-8?q?config=20entry=20data=20be=20taken=20into=20a=E2=80=A6=20(#3416?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Allow async_setup changes to config entry data be taken into account * Fix tests * Limit scope try…finally * Update tests/test_config_entries.py Co-Authored-By: Martin Hjelmare * Fix import Co-authored-by: Martin Hjelmare --- .../components/airvisual/__init__.py | 6 +- .../components/airvisual/config_flow.py | 21 +++- homeassistant/components/airvisual/const.py | 1 + homeassistant/data_entry_flow.py | 38 +++++++- homeassistant/setup.py | 9 +- tests/components/axis/test_init.py | 13 --- tests/components/konnected/test_init.py | 2 +- tests/components/luftdaten/test_init.py | 8 +- tests/components/zeroconf/test_init.py | 16 +++- tests/test_config_entries.py | 95 +++++++++++++++++++ 10 files changed, 176 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/airvisual/__init__.py b/homeassistant/components/airvisual/__init__.py index e234c2b1c67b..4352b15b8a55 100644 --- a/homeassistant/components/airvisual/__init__.py +++ b/homeassistant/components/airvisual/__init__.py @@ -22,6 +22,7 @@ from homeassistant.helpers.event import async_track_time_interval from .const import ( CONF_CITY, CONF_COUNTRY, + CONF_GEOGRAPHIES, DATA_CLIENT, DEFAULT_SCAN_INTERVAL, DOMAIN, @@ -34,8 +35,6 @@ DATA_LISTENER = "listener" DEFAULT_OPTIONS = {CONF_SHOW_ON_MAP: True} -CONF_GEOGRAPHIES = "geographies" - GEOGRAPHY_COORDINATES_SCHEMA = vol.Schema( { vol.Required(CONF_LATITUDE): cv.latitude, @@ -158,8 +157,7 @@ async def async_migrate_entry(hass, config_entry): # Update the config entry to only include the first geography (there is always # guaranteed to be at least one): - data = {**config_entry.data} - geographies = data.pop(CONF_GEOGRAPHIES) + geographies = list(config_entry.data[CONF_GEOGRAPHIES]) first_geography = geographies.pop(0) first_id = async_get_geography_id(first_geography) diff --git a/homeassistant/components/airvisual/config_flow.py b/homeassistant/components/airvisual/config_flow.py index 047f585a4ff3..0c9c0e65ff14 100644 --- a/homeassistant/components/airvisual/config_flow.py +++ b/homeassistant/components/airvisual/config_flow.py @@ -16,7 +16,7 @@ from homeassistant.core import callback from homeassistant.helpers import aiohttp_client, config_validation as cv from . import async_get_geography_id -from .const import DOMAIN # pylint: disable=unused-import +from .const import CONF_GEOGRAPHIES, DOMAIN # pylint: disable=unused-import class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): @@ -69,6 +69,18 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): geo_id = async_get_geography_id(user_input) await self._async_set_unique_id(geo_id) + self._abort_if_unique_id_configured() + + # Find older config entries without unique ID + for entry in self._async_current_entries(): + if entry.version != 1: + continue + + if any( + geo_id == async_get_geography_id(geography) + for geography in entry.data[CONF_GEOGRAPHIES] + ): + return self.async_abort(reason="already_configured") websession = aiohttp_client.async_get_clientsession(self.hass) client = Client(websession, api_key=user_input[CONF_API_KEY]) @@ -90,9 +102,10 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): ) checked_keys.add(user_input[CONF_API_KEY]) - return self.async_create_entry( - title=f"Cloud API ({geo_id})", data=user_input - ) + + return self.async_create_entry( + title=f"Cloud API ({geo_id})", data=user_input + ) class AirVisualOptionsFlowHandler(config_entries.OptionsFlow): diff --git a/homeassistant/components/airvisual/const.py b/homeassistant/components/airvisual/const.py index 3bfc224a7359..ab54e191116b 100644 --- a/homeassistant/components/airvisual/const.py +++ b/homeassistant/components/airvisual/const.py @@ -5,6 +5,7 @@ DOMAIN = "airvisual" CONF_CITY = "city" CONF_COUNTRY = "country" +CONF_GEOGRAPHIES = "geographies" DATA_CLIENT = "client" diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index 20763dd39a5f..51f083b7eeb9 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -1,5 +1,6 @@ """Classes to help gather user submissions.""" import abc +import asyncio import logging from typing import Any, Dict, List, Optional, cast import uuid @@ -53,8 +54,18 @@ class FlowManager(abc.ABC): def __init__(self, hass: HomeAssistant,) -> None: """Initialize the flow manager.""" self.hass = hass + self._initializing: Dict[str, List[asyncio.Future]] = {} self._progress: Dict[str, Any] = {} + async def async_wait_init_flow_finish(self, handler: str) -> None: + """Wait till all flows in progress are initialized.""" + current = self._initializing.get(handler) + + if not current: + return + + await asyncio.wait(current) + @abc.abstractmethod async def async_create_flow( self, @@ -94,8 +105,13 @@ class FlowManager(abc.ABC): """Start a configuration flow.""" if context is None: context = {} + + init_done: asyncio.Future = asyncio.Future() + self._initializing.setdefault(handler, []).append(init_done) + flow = await self.async_create_flow(handler, context=context, data=data) if not flow: + self._initializing[handler].remove(init_done) raise UnknownFlow("Flow was not created") flow.hass = self.hass flow.handler = handler @@ -103,7 +119,12 @@ class FlowManager(abc.ABC): flow.context = context self._progress[flow.flow_id] = flow - result = await self._async_handle_step(flow, flow.init_step, data) + try: + result = await self._async_handle_step( + flow, flow.init_step, data, init_done + ) + finally: + self._initializing[handler].remove(init_done) if result["type"] != RESULT_TYPE_ABORT: await self.async_post_init(flow, result) @@ -154,13 +175,19 @@ class FlowManager(abc.ABC): raise UnknownFlow async def _async_handle_step( - self, flow: Any, step_id: str, user_input: Optional[Dict] + self, + flow: Any, + step_id: str, + user_input: Optional[Dict], + step_done: Optional[asyncio.Future] = None, ) -> Dict: """Handle a step of a flow.""" method = f"async_step_{step_id}" if not hasattr(flow, method): self._progress.pop(flow.flow_id) + if step_done: + step_done.set_result(None) raise UnknownStep( f"Handler {flow.__class__.__name__} doesn't support step {step_id}" ) @@ -172,6 +199,13 @@ class FlowManager(abc.ABC): flow.flow_id, flow.handler, err.reason, err.description_placeholders ) + # Mark the step as done. + # We do this before calling async_finish_flow because config entries will hit a + # circular dependency where async_finish_flow sets up new entry, which needs the + # integration to be set up, which is waiting for init to be done. + if step_done: + step_done.set_result(None) + if result["type"] not in ( RESULT_TYPE_FORM, RESULT_TYPE_EXTERNAL_STEP, diff --git a/homeassistant/setup.py b/homeassistant/setup.py index 40d767728d36..82b7e1be039a 100644 --- a/homeassistant/setup.py +++ b/homeassistant/setup.py @@ -197,9 +197,12 @@ async def _async_setup_component( ) return False - if hass.config_entries: - for entry in hass.config_entries.async_entries(domain): - await entry.async_setup(hass, integration=integration) + # Flush out async_setup calling create_task. Fragile but covered by test. + await asyncio.sleep(0) + await hass.config_entries.flow.async_wait_init_flow_finish(domain) + + for entry in hass.config_entries.async_entries(domain): + await entry.async_setup(hass, integration=integration) hass.config.components.add(domain) diff --git a/tests/components/axis/test_init.py b/tests/components/axis/test_init.py index 83e1337b0796..d11f8c91fc31 100644 --- a/tests/components/axis/test_init.py +++ b/tests/components/axis/test_init.py @@ -9,19 +9,6 @@ from .test_device import MAC, setup_axis_integration from tests.common import MockConfigEntry, mock_coro -async def test_setup_device_already_configured(hass): - """Test already configured device does not configure a second.""" - with patch.object(hass, "config_entries") as mock_config_entries: - - assert await async_setup_component( - hass, - axis.DOMAIN, - {axis.DOMAIN: {"device_name": {axis.CONF_HOST: "1.2.3.4"}}}, - ) - - assert not mock_config_entries.flow.mock_calls - - async def test_setup_no_config(hass): """Test setup without configuration.""" assert await async_setup_component(hass, axis.DOMAIN, {}) diff --git a/tests/components/konnected/test_init.py b/tests/components/konnected/test_init.py index 280712912662..1bf239852f86 100644 --- a/tests/components/konnected/test_init.py +++ b/tests/components/konnected/test_init.py @@ -230,7 +230,7 @@ async def test_setup_with_no_config(hass): assert konnected.YAML_CONFIGS not in hass.data[konnected.DOMAIN] -async def test_setup_defined_hosts_known_auth(hass): +async def test_setup_defined_hosts_known_auth(hass, mock_panel): """Test we don't initiate a config entry if configured panel is known.""" MockConfigEntry( domain="konnected", diff --git a/tests/components/luftdaten/test_init.py b/tests/components/luftdaten/test_init.py index fe7bca654c32..ebe5f73669ea 100644 --- a/tests/components/luftdaten/test_init.py +++ b/tests/components/luftdaten/test_init.py @@ -15,7 +15,9 @@ async def test_config_with_sensor_passed_to_config_entry(hass): CONF_SCAN_INTERVAL: 600, } - with patch.object(hass, "config_entries") as mock_config_entries, patch.object( + with patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_entries, patch.object( luftdaten, "configured_sensors", return_value=[] ): assert await async_setup_component(hass, DOMAIN, conf) is True @@ -27,7 +29,9 @@ async def test_config_already_registered_not_passed_to_config_entry(hass): """Test that an already registered sensor does not initiate an import.""" conf = {CONF_SENSOR_ID: "12345abcde"} - with patch.object(hass, "config_entries") as mock_config_entries, patch.object( + with patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_entries, patch.object( luftdaten, "configured_sensors", return_value=["12345abcde"] ): assert await async_setup_component(hass, DOMAIN, conf) is True diff --git a/tests/components/zeroconf/test_init.py b/tests/components/zeroconf/test_init.py index 4e086978be12..6a3dc1f5941c 100644 --- a/tests/components/zeroconf/test_init.py +++ b/tests/components/zeroconf/test_init.py @@ -55,7 +55,9 @@ def get_homekit_info_mock(model): async def test_setup(hass, mock_zeroconf): """Test configured options for a device are loaded via config entry.""" - with patch.object(hass.config_entries, "flow") as mock_config_flow, patch.object( + with patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_flow, patch.object( zeroconf, "ServiceBrowser", side_effect=service_update_mock ) as mock_service_browser: mock_zeroconf.get_service_info.side_effect = get_service_info_mock @@ -72,7 +74,9 @@ async def test_homekit_match_partial_space(hass, mock_zeroconf): """Test configured options for a device are loaded via config entry.""" with patch.dict( zc_gen.ZEROCONF, {zeroconf.HOMEKIT_TYPE: ["homekit_controller"]}, clear=True - ), patch.object(hass.config_entries, "flow") as mock_config_flow, patch.object( + ), patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_flow, patch.object( zeroconf, "ServiceBrowser", side_effect=service_update_mock ) as mock_service_browser: mock_zeroconf.get_service_info.side_effect = get_homekit_info_mock("LIFX bulb") @@ -87,7 +91,9 @@ async def test_homekit_match_partial_dash(hass, mock_zeroconf): """Test configured options for a device are loaded via config entry.""" with patch.dict( zc_gen.ZEROCONF, {zeroconf.HOMEKIT_TYPE: ["homekit_controller"]}, clear=True - ), patch.object(hass.config_entries, "flow") as mock_config_flow, patch.object( + ), patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_flow, patch.object( zeroconf, "ServiceBrowser", side_effect=service_update_mock ) as mock_service_browser: mock_zeroconf.get_service_info.side_effect = get_homekit_info_mock( @@ -104,7 +110,9 @@ async def test_homekit_match_full(hass, mock_zeroconf): """Test configured options for a device are loaded via config entry.""" with patch.dict( zc_gen.ZEROCONF, {zeroconf.HOMEKIT_TYPE: ["homekit_controller"]}, clear=True - ), patch.object(hass.config_entries, "flow") as mock_config_flow, patch.object( + ), patch.object( + hass.config_entries.flow, "async_init" + ) as mock_config_flow, patch.object( zeroconf, "ServiceBrowser", side_effect=service_update_mock ) as mock_service_browser: mock_zeroconf.get_service_info.side_effect = get_homekit_info_mock("BSB002") diff --git a/tests/test_config_entries.py b/tests/test_config_entries.py index 86eb3919f008..28746bbfbe07 100644 --- a/tests/test_config_entries.py +++ b/tests/test_config_entries.py @@ -3,6 +3,7 @@ import asyncio from datetime import timedelta from unittest.mock import MagicMock, patch +from asynctest import CoroutineMock import pytest from homeassistant import config_entries, data_entry_flow, loader @@ -1463,3 +1464,97 @@ async def test_partial_flows_hidden(hass, manager): await hass.async_block_till_done() state = hass.states.get("persistent_notification.config_entry_discovery") assert state is not None + + +async def test_async_setup_init_entry(hass): + """Test a config entry being initialized during integration setup.""" + + async def mock_async_setup(hass, config): + """Mock setup.""" + hass.async_create_task( + hass.config_entries.flow.async_init( + "comp", context={"source": config_entries.SOURCE_IMPORT}, data={}, + ) + ) + return True + + async_setup_entry = CoroutineMock(return_value=True) + mock_integration( + hass, + MockModule( + "comp", async_setup=mock_async_setup, async_setup_entry=async_setup_entry + ), + ) + mock_entity_platform(hass, "config_flow.comp", None) + await async_setup_component(hass, "persistent_notification", {}) + + class TestFlow(config_entries.ConfigFlow): + """Test flow.""" + + VERSION = 1 + + async def async_step_import(self, user_input): + """Test import step creating entry.""" + return self.async_create_entry(title="title", data={}) + + with patch.dict(config_entries.HANDLERS, {"comp": TestFlow}): + assert await async_setup_component(hass, "comp", {}) + + await hass.async_block_till_done() + + assert len(async_setup_entry.mock_calls) == 1 + + entries = hass.config_entries.async_entries("comp") + assert len(entries) == 1 + assert entries[0].state == config_entries.ENTRY_STATE_LOADED + + +async def test_async_setup_update_entry(hass): + """Test a config entry being updated during integration setup.""" + entry = MockConfigEntry(domain="comp", data={"value": "initial"}) + entry.add_to_hass(hass) + + async def mock_async_setup(hass, config): + """Mock setup.""" + hass.async_create_task( + hass.config_entries.flow.async_init( + "comp", context={"source": config_entries.SOURCE_IMPORT}, data={}, + ) + ) + return True + + async def mock_async_setup_entry(hass, entry): + """Mock setting up an entry.""" + assert entry.data["value"] == "updated" + return True + + mock_integration( + hass, + MockModule( + "comp", + async_setup=mock_async_setup, + async_setup_entry=mock_async_setup_entry, + ), + ) + mock_entity_platform(hass, "config_flow.comp", None) + await async_setup_component(hass, "persistent_notification", {}) + + class TestFlow(config_entries.ConfigFlow): + """Test flow.""" + + VERSION = 1 + + async def async_step_import(self, user_input): + """Test import step updating existing entry.""" + self.hass.config_entries.async_update_entry( + entry, data={"value": "updated"} + ) + return self.async_abort(reason="yo") + + with patch.dict(config_entries.HANDLERS, {"comp": TestFlow}): + assert await async_setup_component(hass, "comp", {}) + + entries = hass.config_entries.async_entries("comp") + assert len(entries) == 1 + assert entries[0].state == config_entries.ENTRY_STATE_LOADED + assert entries[0].data == {"value": "updated"} From 5faa9795b0cc7a257207327b02c9b6675ed8b45d Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Tue, 14 Apr 2020 21:30:15 -0600 Subject: [PATCH 414/653] Fix websocket connection bug/errant logic in Ambient PWS (#34217) --- homeassistant/components/ambient_station/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/ambient_station/__init__.py b/homeassistant/components/ambient_station/__init__.py index 0f35cca5f087..6bdb6d0d4f6a 100644 --- a/homeassistant/components/ambient_station/__init__.py +++ b/homeassistant/components/ambient_station/__init__.py @@ -350,12 +350,17 @@ class AmbientStation: async def _attempt_connect(self): """Attempt to connect to the socket (retrying later on fail).""" - try: + + async def connect(timestamp=None): + """Connect.""" await self.client.websocket.connect() + + try: + await connect() except WebsocketError as err: _LOGGER.error("Error with the websocket connection: %s", err) self._ws_reconnect_delay = min(2 * self._ws_reconnect_delay, 480) - async_call_later(self._hass, self._ws_reconnect_delay, self.ws_connect) + async_call_later(self._hass, self._ws_reconnect_delay, connect) async def ws_connect(self): """Register handlers and connect to the websocket.""" From 1ea7229f324a29e3763bf86559f96c0c10eae36b Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Wed, 15 Apr 2020 12:40:47 +0200 Subject: [PATCH 415/653] Add daikin update_before_add (#34248) --- homeassistant/components/daikin/climate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/daikin/climate.py b/homeassistant/components/daikin/climate.py index 8b5724e014d3..5455bd6f670f 100644 --- a/homeassistant/components/daikin/climate.py +++ b/homeassistant/components/daikin/climate.py @@ -83,7 +83,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= async def async_setup_entry(hass, entry, async_add_entities): """Set up Daikin climate based on config_entry.""" daikin_api = hass.data[DAIKIN_DOMAIN].get(entry.entry_id) - async_add_entities([DaikinClimate(daikin_api)]) + async_add_entities([DaikinClimate(daikin_api)], update_before_add=True) class DaikinClimate(ClimateDevice): From d842dacfd6d9da4d34e8bf9ba16c6135deb51c61 Mon Sep 17 00:00:00 2001 From: springstan <46536646+springstan@users.noreply.github.com> Date: Wed, 15 Apr 2020 14:10:07 +0200 Subject: [PATCH 416/653] Clean up access to config in various integrations v5 (#34206) --- homeassistant/components/daikin/__init__.py | 2 +- homeassistant/components/datadog/__init__.py | 8 ++++---- homeassistant/components/decora_wifi/light.py | 4 ++-- homeassistant/components/deluge/sensor.py | 10 +++++----- homeassistant/components/deluge/switch.py | 10 +++++----- homeassistant/components/denon/media_player.py | 2 +- homeassistant/components/denonavr/media_player.py | 4 ++-- homeassistant/components/deutsche_bahn/sensor.py | 6 +++--- .../components/device_sun_light_trigger/__init__.py | 4 ++-- homeassistant/components/dht/sensor.py | 10 +++++----- homeassistant/components/digital_ocean/__init__.py | 2 +- .../components/digital_ocean/binary_sensor.py | 2 +- homeassistant/components/digital_ocean/switch.py | 2 +- homeassistant/components/digitalloggers/switch.py | 12 ++++++------ homeassistant/components/discogs/sensor.py | 2 +- homeassistant/components/discord/notify.py | 2 +- homeassistant/components/dlink/switch.py | 10 +++++----- homeassistant/components/dnsip/sensor.py | 8 ++++---- homeassistant/components/dovado/__init__.py | 4 ++-- homeassistant/components/dte_energy_bridge/sensor.py | 6 +++--- .../components/dublin_bus_transport/sensor.py | 6 +++--- 21 files changed, 58 insertions(+), 58 deletions(-) diff --git a/homeassistant/components/daikin/__init__.py b/homeassistant/components/daikin/__init__.py index 209bf71e594f..144836bc5710 100644 --- a/homeassistant/components/daikin/__init__.py +++ b/homeassistant/components/daikin/__init__.py @@ -42,7 +42,7 @@ async def async_setup(hass, config): if DOMAIN not in config: return True - hosts = config[DOMAIN].get(CONF_HOSTS) + hosts = config[DOMAIN][CONF_HOSTS] if not hosts: hass.async_create_task( hass.config_entries.flow.async_init( diff --git a/homeassistant/components/datadog/__init__.py b/homeassistant/components/datadog/__init__.py index 52cbe9064029..36b4037f70ad 100644 --- a/homeassistant/components/datadog/__init__.py +++ b/homeassistant/components/datadog/__init__.py @@ -45,10 +45,10 @@ def setup(hass, config): """Set up the Datadog component.""" conf = config[DOMAIN] - host = conf.get(CONF_HOST) - port = conf.get(CONF_PORT) - sample_rate = conf.get(CONF_RATE) - prefix = conf.get(CONF_PREFIX) + host = conf[CONF_HOST] + port = conf[CONF_PORT] + sample_rate = conf[CONF_RATE] + prefix = conf[CONF_PREFIX] initialize(statsd_host=host, statsd_port=port) diff --git a/homeassistant/components/decora_wifi/light.py b/homeassistant/components/decora_wifi/light.py index 7d8aa104bb03..9071da9707d8 100644 --- a/homeassistant/components/decora_wifi/light.py +++ b/homeassistant/components/decora_wifi/light.py @@ -34,8 +34,8 @@ NOTIFICATION_TITLE = "myLeviton Decora Setup" def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Decora WiFi platform.""" - email = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) + email = config[CONF_USERNAME] + password = config[CONF_PASSWORD] session = DecoraWiFiSession() try: diff --git a/homeassistant/components/deluge/sensor.py b/homeassistant/components/deluge/sensor.py index 55309ea8b312..4a24e979607b 100644 --- a/homeassistant/components/deluge/sensor.py +++ b/homeassistant/components/deluge/sensor.py @@ -49,11 +49,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Deluge sensors.""" - name = config.get(CONF_NAME) - host = config.get(CONF_HOST) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - port = config.get(CONF_PORT) + name = config[CONF_NAME] + host = config[CONF_HOST] + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + port = config[CONF_PORT] deluge_api = DelugeRPCClient(host, port, username, password) try: diff --git a/homeassistant/components/deluge/switch.py b/homeassistant/components/deluge/switch.py index 7ac98f284c8a..04acf6a9dd90 100644 --- a/homeassistant/components/deluge/switch.py +++ b/homeassistant/components/deluge/switch.py @@ -37,11 +37,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Deluge switch.""" - name = config.get(CONF_NAME) - host = config.get(CONF_HOST) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - port = config.get(CONF_PORT) + name = config[CONF_NAME] + host = config[CONF_HOST] + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + port = config[CONF_PORT] deluge_api = DelugeRPCClient(host, port, username, password) try: diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index 11c31107ef60..1fbd4885f43c 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -80,7 +80,7 @@ MEDIA_MODES = { def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Denon platform.""" - denon = DenonDevice(config.get(CONF_NAME), config.get(CONF_HOST)) + denon = DenonDevice(config[CONF_NAME], config[CONF_HOST]) if denon.update(): add_entities([denon]) diff --git a/homeassistant/components/denonavr/media_player.py b/homeassistant/components/denonavr/media_player.py index 67dc07f68df7..7713354b14a9 100644 --- a/homeassistant/components/denonavr/media_player.py +++ b/homeassistant/components/denonavr/media_player.py @@ -103,8 +103,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None): cache = hass.data[KEY_DENON_CACHE] = set() # Get config option for show_all_sources and timeout - show_all_sources = config.get(CONF_SHOW_ALL_SOURCES) - timeout = config.get(CONF_TIMEOUT) + show_all_sources = config[CONF_SHOW_ALL_SOURCES] + timeout = config[CONF_TIMEOUT] # Get config option for additional zones zones = config.get(CONF_ZONES) diff --git a/homeassistant/components/deutsche_bahn/sensor.py b/homeassistant/components/deutsche_bahn/sensor.py index fd7496b13169..bb5adb943e9a 100644 --- a/homeassistant/components/deutsche_bahn/sensor.py +++ b/homeassistant/components/deutsche_bahn/sensor.py @@ -36,9 +36,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Deutsche Bahn Sensor.""" start = config.get(CONF_START) - destination = config.get(CONF_DESTINATION) - offset = config.get(CONF_OFFSET) - only_direct = config.get(CONF_ONLY_DIRECT) + destination = config[CONF_DESTINATION] + offset = config[CONF_OFFSET] + only_direct = config[CONF_ONLY_DIRECT] add_entities([DeutscheBahnSensor(start, destination, offset, only_direct)], True) diff --git a/homeassistant/components/device_sun_light_trigger/__init__.py b/homeassistant/components/device_sun_light_trigger/__init__.py index d7986fbb5b4b..fcf61dfe0971 100644 --- a/homeassistant/components/device_sun_light_trigger/__init__.py +++ b/homeassistant/components/device_sun_light_trigger/__init__.py @@ -65,9 +65,9 @@ async def async_setup(hass, config): light = hass.components.light person = hass.components.person conf = config[DOMAIN] - disable_turn_off = conf.get(CONF_DISABLE_TURN_OFF) + disable_turn_off = conf[CONF_DISABLE_TURN_OFF] light_group = conf.get(CONF_LIGHT_GROUP) - light_profile = conf.get(CONF_LIGHT_PROFILE) + light_profile = conf[CONF_LIGHT_PROFILE] device_group = conf.get(CONF_DEVICE_GROUP) diff --git a/homeassistant/components/dht/sensor.py b/homeassistant/components/dht/sensor.py index cfd1cf2a1973..6f3e58d4ad48 100644 --- a/homeassistant/components/dht/sensor.py +++ b/homeassistant/components/dht/sensor.py @@ -63,10 +63,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None): "DHT11": Adafruit_DHT.DHT11, "DHT22": Adafruit_DHT.DHT22, } - sensor = available_sensors.get(config.get(CONF_SENSOR)) - pin = config.get(CONF_PIN) - temperature_offset = config.get(CONF_TEMPERATURE_OFFSET) - humidity_offset = config.get(CONF_HUMIDITY_OFFSET) + sensor = available_sensors.get(config[CONF_SENSOR]) + pin = config[CONF_PIN] + temperature_offset = config[CONF_TEMPERATURE_OFFSET] + humidity_offset = config[CONF_HUMIDITY_OFFSET] if not sensor: _LOGGER.error("DHT sensor type is not supported") @@ -74,7 +74,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data = DHTClient(Adafruit_DHT, sensor, pin) dev = [] - name = config.get(CONF_NAME) + name = config[CONF_NAME] try: for variable in config[CONF_MONITORED_CONDITIONS]: diff --git a/homeassistant/components/digital_ocean/__init__.py b/homeassistant/components/digital_ocean/__init__.py index 33663f121d1c..9ae61ed9b849 100644 --- a/homeassistant/components/digital_ocean/__init__.py +++ b/homeassistant/components/digital_ocean/__init__.py @@ -41,7 +41,7 @@ def setup(hass, config): """Set up the Digital Ocean component.""" conf = config[DOMAIN] - access_token = conf.get(CONF_ACCESS_TOKEN) + access_token = conf[CONF_ACCESS_TOKEN] digital = DigitalOcean(access_token) diff --git a/homeassistant/components/digital_ocean/binary_sensor.py b/homeassistant/components/digital_ocean/binary_sensor.py index 50c87907774a..c35151775353 100644 --- a/homeassistant/components/digital_ocean/binary_sensor.py +++ b/homeassistant/components/digital_ocean/binary_sensor.py @@ -37,7 +37,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if not digital: return False - droplets = config.get(CONF_DROPLETS) + droplets = config[CONF_DROPLETS] dev = [] for droplet in droplets: diff --git a/homeassistant/components/digital_ocean/switch.py b/homeassistant/components/digital_ocean/switch.py index 95d2e15a5109..9b9b8157bcee 100644 --- a/homeassistant/components/digital_ocean/switch.py +++ b/homeassistant/components/digital_ocean/switch.py @@ -37,7 +37,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if not digital: return False - droplets = config.get(CONF_DROPLETS) + droplets = config[CONF_DROPLETS] dev = [] for droplet in droplets: diff --git a/homeassistant/components/digitalloggers/switch.py b/homeassistant/components/digitalloggers/switch.py index 824af4416880..268ec581c009 100644 --- a/homeassistant/components/digitalloggers/switch.py +++ b/homeassistant/components/digitalloggers/switch.py @@ -47,12 +47,12 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Find and return DIN III Relay switch.""" - host = config.get(CONF_HOST) - controller_name = config.get(CONF_NAME) - user = config.get(CONF_USERNAME) - pswd = config.get(CONF_PASSWORD) - tout = config.get(CONF_TIMEOUT) - cycl = config.get(CONF_CYCLETIME) + host = config[CONF_HOST] + controller_name = config[CONF_NAME] + user = config[CONF_USERNAME] + pswd = config[CONF_PASSWORD] + tout = config[CONF_TIMEOUT] + cycl = config[CONF_CYCLETIME] power_switch = dlipower.PowerSwitch( hostname=host, userid=user, password=pswd, timeout=tout, cycletime=cycl diff --git a/homeassistant/components/discogs/sensor.py b/homeassistant/components/discogs/sensor.py index b5e488cc19c6..40f27135be13 100644 --- a/homeassistant/components/discogs/sensor.py +++ b/homeassistant/components/discogs/sensor.py @@ -83,7 +83,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): return sensors = [] - for sensor_type in config.get(CONF_MONITORED_CONDITIONS): + for sensor_type in config[CONF_MONITORED_CONDITIONS]: sensors.append(DiscogsSensor(discogs_data, name, sensor_type)) add_entities(sensors, True) diff --git a/homeassistant/components/discord/notify.py b/homeassistant/components/discord/notify.py index e4558b103bd2..fb36a60eeccb 100644 --- a/homeassistant/components/discord/notify.py +++ b/homeassistant/components/discord/notify.py @@ -23,7 +23,7 @@ ATTR_IMAGES = "images" def get_service(hass, config, discovery_info=None): """Get the Discord notification service.""" - token = config.get(CONF_TOKEN) + token = config[CONF_TOKEN] return DiscordNotificationService(hass, token) diff --git a/homeassistant/components/dlink/switch.py b/homeassistant/components/dlink/switch.py index 7fa391e80606..1cc0e16f30f9 100644 --- a/homeassistant/components/dlink/switch.py +++ b/homeassistant/components/dlink/switch.py @@ -44,11 +44,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up a D-Link Smart Plug.""" - host = config.get(CONF_HOST) - username = config.get(CONF_USERNAME) - password = config.get(CONF_PASSWORD) - use_legacy_protocol = config.get(CONF_USE_LEGACY_PROTOCOL) - name = config.get(CONF_NAME) + host = config[CONF_HOST] + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + use_legacy_protocol = config[CONF_USE_LEGACY_PROTOCOL] + name = config[CONF_NAME] smartplug = SmartPlug(host, password, username, use_legacy_protocol) data = SmartPlugData(smartplug) diff --git a/homeassistant/components/dnsip/sensor.py b/homeassistant/components/dnsip/sensor.py index fb57040f2c2e..b202ff8485c7 100644 --- a/homeassistant/components/dnsip/sensor.py +++ b/homeassistant/components/dnsip/sensor.py @@ -39,18 +39,18 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( async def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the DNS IP sensor.""" - hostname = config.get(CONF_HOSTNAME) + hostname = config[CONF_HOSTNAME] name = config.get(CONF_NAME) if not name: if hostname == DEFAULT_HOSTNAME: name = DEFAULT_NAME else: name = hostname - ipv6 = config.get(CONF_IPV6) + ipv6 = config[CONF_IPV6] if ipv6: - resolver = config.get(CONF_RESOLVER_IPV6) + resolver = config[CONF_RESOLVER_IPV6] else: - resolver = config.get(CONF_RESOLVER) + resolver = config[CONF_RESOLVER] async_add_devices([WanIpSensor(hass, name, hostname, resolver, ipv6)], True) diff --git a/homeassistant/components/dovado/__init__.py b/homeassistant/components/dovado/__init__.py index b8d18d908331..8e4c712e8b4b 100644 --- a/homeassistant/components/dovado/__init__.py +++ b/homeassistant/components/dovado/__init__.py @@ -41,8 +41,8 @@ def setup(hass, config): hass.data[DOMAIN] = DovadoData( dovado.Dovado( - config[DOMAIN].get(CONF_USERNAME), - config[DOMAIN].get(CONF_PASSWORD), + config[DOMAIN][CONF_USERNAME], + config[DOMAIN][CONF_PASSWORD], config[DOMAIN].get(CONF_HOST), config[DOMAIN].get(CONF_PORT), ) diff --git a/homeassistant/components/dte_energy_bridge/sensor.py b/homeassistant/components/dte_energy_bridge/sensor.py index c0725219a9a6..efd00b3da1ef 100644 --- a/homeassistant/components/dte_energy_bridge/sensor.py +++ b/homeassistant/components/dte_energy_bridge/sensor.py @@ -32,9 +32,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the DTE energy bridge sensor.""" - name = config.get(CONF_NAME) - ip_address = config.get(CONF_IP_ADDRESS) - version = config.get(CONF_VERSION, 1) + name = config[CONF_NAME] + ip_address = config[CONF_IP_ADDRESS] + version = config[CONF_VERSION] add_entities([DteEnergyBridgeSensor(ip_address, name, version)], True) diff --git a/homeassistant/components/dublin_bus_transport/sensor.py b/homeassistant/components/dublin_bus_transport/sensor.py index 41c7df7889ec..0c0d6c53ed1d 100644 --- a/homeassistant/components/dublin_bus_transport/sensor.py +++ b/homeassistant/components/dublin_bus_transport/sensor.py @@ -59,9 +59,9 @@ def due_in_minutes(timestamp): def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Dublin public transport sensor.""" - name = config.get(CONF_NAME) - stop = config.get(CONF_STOP_ID) - route = config.get(CONF_ROUTE) + name = config[CONF_NAME] + stop = config[CONF_STOP_ID] + route = config[CONF_ROUTE] data = PublicTransportData(stop, route) add_entities([DublinPublicTransportSensor(data, stop, route, name)], True) From 337cc6e79f2e818239af5a0afb3de401ae3ca3d6 Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Wed, 15 Apr 2020 15:12:10 +0200 Subject: [PATCH 417/653] Fix various Daikin issues (#34249) * various Daikin fixes * make timeout a constant --- CODEOWNERS | 2 +- homeassistant/components/daikin/__init__.py | 3 ++- homeassistant/components/daikin/config_flow.py | 4 ++-- homeassistant/components/daikin/const.py | 2 ++ homeassistant/components/daikin/manifest.json | 4 ++-- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index cbba7cbdd5ea..fa7f6745aeec 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -78,7 +78,7 @@ homeassistant/components/counter/* @fabaff homeassistant/components/cover/* @home-assistant/core homeassistant/components/cpuspeed/* @fabaff homeassistant/components/cups/* @fabaff -homeassistant/components/daikin/* @fredrike @rofrantz +homeassistant/components/daikin/* @fredrike homeassistant/components/darksky/* @fabaff homeassistant/components/deconz/* @kane610 homeassistant/components/delijn/* @bollewolle diff --git a/homeassistant/components/daikin/__init__.py b/homeassistant/components/daikin/__init__.py index 144836bc5710..ad4d30358c2f 100644 --- a/homeassistant/components/daikin/__init__.py +++ b/homeassistant/components/daikin/__init__.py @@ -17,6 +17,7 @@ from homeassistant.helpers.typing import HomeAssistantType from homeassistant.util import Throttle from . import config_flow # noqa: F401 +from .const import TIMEOUT _LOGGER = logging.getLogger(__name__) @@ -91,7 +92,7 @@ async def daikin_api_setup(hass, host): session = hass.helpers.aiohttp_client.async_get_clientsession() try: - with timeout(10): + with timeout(TIMEOUT): device = Appliance(host, session) await device.init() except asyncio.TimeoutError: diff --git a/homeassistant/components/daikin/config_flow.py b/homeassistant/components/daikin/config_flow.py index bd90a87db86e..35f21ef3e0d7 100644 --- a/homeassistant/components/daikin/config_flow.py +++ b/homeassistant/components/daikin/config_flow.py @@ -10,7 +10,7 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.const import CONF_HOST -from .const import KEY_IP, KEY_MAC +from .const import KEY_IP, KEY_MAC, TIMEOUT _LOGGER = logging.getLogger(__name__) @@ -38,7 +38,7 @@ class FlowHandler(config_entries.ConfigFlow): device = Appliance( host, self.hass.helpers.aiohttp_client.async_get_clientsession() ) - with timeout(10): + with timeout(TIMEOUT): await device.init() except asyncio.TimeoutError: return self.async_abort(reason="device_timeout") diff --git a/homeassistant/components/daikin/const.py b/homeassistant/components/daikin/const.py index ef24a51be896..15ae5321bf36 100644 --- a/homeassistant/components/daikin/const.py +++ b/homeassistant/components/daikin/const.py @@ -25,3 +25,5 @@ SENSOR_TYPES = { KEY_MAC = "mac" KEY_IP = "ip" + +TIMEOUT = 60 diff --git a/homeassistant/components/daikin/manifest.json b/homeassistant/components/daikin/manifest.json index a289004ffeb6..c501fa7c1202 100644 --- a/homeassistant/components/daikin/manifest.json +++ b/homeassistant/components/daikin/manifest.json @@ -3,7 +3,7 @@ "name": "Daikin AC", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/daikin", - "requirements": ["pydaikin==1.6.2"], - "codeowners": ["@fredrike", "@rofrantz"], + "requirements": ["pydaikin==1.6.3"], + "codeowners": ["@fredrike"], "quality_scale": "platinum" } diff --git a/requirements_all.txt b/requirements_all.txt index e6192d55345b..38133b1a4760 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1223,7 +1223,7 @@ pycsspeechtts==1.0.3 # pycups==1.9.73 # homeassistant.components.daikin -pydaikin==1.6.2 +pydaikin==1.6.3 # homeassistant.components.danfoss_air pydanfossair==0.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5c6c0801b651..6f013a52da05 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -484,7 +484,7 @@ pychromecast==4.2.3 pycoolmasternet==0.0.4 # homeassistant.components.daikin -pydaikin==1.6.2 +pydaikin==1.6.3 # homeassistant.components.deconz pydeconz==70 From e47b548192d12e92f48d4d64aa010a0316e1c434 Mon Sep 17 00:00:00 2001 From: Aidan Timson Date: Wed, 15 Apr 2020 16:42:01 +0100 Subject: [PATCH 418/653] Add AsusWRT Devices Connected Sensor (#34204) * Add Devices Connected * Remove attributes * Add sensors to test * Improve sensor test * Cleanup * Apply suggestions from code review Co-Authored-By: Martin Hjelmare * Import device from aioasuswrt Co-authored-by: Martin Hjelmare --- homeassistant/components/asuswrt/__init__.py | 2 +- homeassistant/components/asuswrt/sensor.py | 20 ++++++- tests/components/asuswrt/test_sensor.py | 63 ++++++++++++++++---- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/asuswrt/__init__.py b/homeassistant/components/asuswrt/__init__.py index 446fe898aaaf..d9c87beea5d9 100644 --- a/homeassistant/components/asuswrt/__init__.py +++ b/homeassistant/components/asuswrt/__init__.py @@ -36,7 +36,7 @@ FIRST_RETRY_TIME = 60 MAX_RETRY_TIME = 900 SECRET_GROUP = "Password or SSH Key" -SENSOR_TYPES = ["upload_speed", "download_speed", "download", "upload"] +SENSOR_TYPES = ["devices", "upload_speed", "download_speed", "download", "upload"] CONFIG_SCHEMA = vol.Schema( { diff --git a/homeassistant/components/asuswrt/sensor.py b/homeassistant/components/asuswrt/sensor.py index 50100d3625d3..631e6e9d70f5 100644 --- a/homeassistant/components/asuswrt/sensor.py +++ b/homeassistant/components/asuswrt/sensor.py @@ -1,6 +1,8 @@ """Asuswrt status sensors.""" import logging +from aioasuswrt.asuswrt import AsusWrt + from homeassistant.const import DATA_GIGABYTES, DATA_RATE_MEGABITS_PER_SECOND from homeassistant.helpers.entity import Entity @@ -18,6 +20,8 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None): devices = [] + if "devices" in discovery_info: + devices.append(AsuswrtDevicesSensor(api)) if "download" in discovery_info: devices.append(AsuswrtTotalRXSensor(api)) if "upload" in discovery_info: @@ -35,10 +39,11 @@ class AsuswrtSensor(Entity): _name = "generic" - def __init__(self, api): + def __init__(self, api: AsusWrt): """Initialize the sensor.""" self._api = api self._state = None + self._devices = None self._rates = None self._speed = None @@ -54,10 +59,23 @@ class AsuswrtSensor(Entity): async def async_update(self): """Fetch status from asuswrt.""" + self._devices = await self._api.async_get_connected_devices() self._rates = await self._api.async_get_bytes_total() self._speed = await self._api.async_get_current_transfer_rates() +class AsuswrtDevicesSensor(AsuswrtSensor): + """Representation of a asuswrt download speed sensor.""" + + _name = "Asuswrt Devices Connected" + + async def async_update(self): + """Fetch new state data for the sensor.""" + await super().async_update() + if self._devices: + self._state = len(self._devices) + + class AsuswrtRXSensor(AsuswrtSensor): """Representation of a asuswrt download speed sensor.""" diff --git a/tests/components/asuswrt/test_sensor.py b/tests/components/asuswrt/test_sensor.py index 39443c3fef85..991be0bac50f 100644 --- a/tests/components/asuswrt/test_sensor.py +++ b/tests/components/asuswrt/test_sensor.py @@ -1,7 +1,10 @@ -"""The tests for the ASUSWRT sensor platform.""" -from unittest.mock import patch +"""The tests for the AsusWrt sensor platform.""" +from datetime import datetime, timedelta -# import homeassistant.components.sensor as sensor +from aioasuswrt.asuswrt import Device +from asynctest import CoroutineMock, patch + +from homeassistant.components import sensor from homeassistant.components.asuswrt import ( CONF_DNSMASQ, CONF_INTERFACE, @@ -9,13 +12,15 @@ from homeassistant.components.asuswrt import ( CONF_PORT, CONF_PROTOCOL, CONF_SENSORS, - DATA_ASUSWRT, DOMAIN, ) from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component +import homeassistant.util.dt as dt_util +from homeassistant.util.dt import utcnow -from tests.common import mock_coro_func +from tests.common import async_fire_time_changed VALID_CONFIG_ROUTER_SSH = { DOMAIN: { @@ -27,16 +32,52 @@ VALID_CONFIG_ROUTER_SSH = { CONF_PROTOCOL: "ssh", CONF_USERNAME: "fake_user", CONF_PASSWORD: "fake_pass", - CONF_SENSORS: "upload", + CONF_SENSORS: [ + "devices", + "download_speed", + "download", + "upload_speed", + "upload", + ], } } +MOCK_DEVICES = { + "a1:b1:c1:d1:e1:f1": Device("a1:b1:c1:d1:e1:f1", "192.168.1.2", "Test"), + "a2:b2:c2:d2:e2:f2": Device("a2:b2:c2:d2:e2:f2", "192.168.1.3", "TestTwo"), + "a3:b3:c3:d3:e3:f3": Device("a3:b3:c3:d3:e3:f3", "192.168.1.4", "TestThree"), +} +MOCK_BYTES_TOTAL = [60000000000, 50000000000] +MOCK_CURRENT_TRANSFER_RATES = [20000000, 10000000] -async def test_default_sensor_setup(hass): + +async def test_sensors(hass: HomeAssistant): """Test creating an AsusWRT sensor.""" with patch("homeassistant.components.asuswrt.AsusWrt") as AsusWrt: - AsusWrt().connection.async_connect = mock_coro_func() + AsusWrt().connection.async_connect = CoroutineMock() + AsusWrt().async_get_connected_devices = CoroutineMock(return_value=MOCK_DEVICES) + AsusWrt().async_get_bytes_total = CoroutineMock(return_value=MOCK_BYTES_TOTAL) + AsusWrt().async_get_current_transfer_rates = CoroutineMock( + return_value=MOCK_CURRENT_TRANSFER_RATES + ) - result = await async_setup_component(hass, DOMAIN, VALID_CONFIG_ROUTER_SSH) - assert result - assert hass.data[DATA_ASUSWRT] is not None + now = datetime(2020, 1, 1, 1, tzinfo=dt_util.UTC) + with patch(("homeassistant.helpers.event.dt_util.utcnow"), return_value=now): + assert await async_setup_component(hass, DOMAIN, VALID_CONFIG_ROUTER_SSH) + await hass.async_block_till_done() + async_fire_time_changed(hass, utcnow() + timedelta(seconds=30)) + await hass.async_block_till_done() + + assert ( + hass.states.get(f"{sensor.DOMAIN}.asuswrt_devices_connected").state + == "3" + ) + assert ( + hass.states.get(f"{sensor.DOMAIN}.asuswrt_download_speed").state + == "160.0" + ) + assert hass.states.get(f"{sensor.DOMAIN}.asuswrt_download").state == "60.0" + assert ( + hass.states.get(f"{sensor.DOMAIN}.asuswrt_upload_speed").state == "80.0" + ) + assert hass.states.get(f"{sensor.DOMAIN}.asuswrt_upload").state == "50.0" From 1ac8442c63cce5222aee4cde287a63921f1d2791 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 08:43:43 -0700 Subject: [PATCH 419/653] Fix Cloud UI bug preventing managing Google 2FA (#34241) * Fix Cloud UI bug preventing managing Google 2FA * Update comment --- homeassistant/components/cloud/http_api.py | 2 +- .../components/google_assistant/helpers.py | 11 ++++++++--- tests/components/cloud/test_http_api.py | 14 ++++++++++++-- tests/components/google_assistant/__init__.py | 5 +++++ tests/components/google_assistant/test_trait.py | 6 ++---- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/cloud/http_api.py b/homeassistant/components/cloud/http_api.py index 03fd8400dfa8..c3809f76b8c6 100644 --- a/homeassistant/components/cloud/http_api.py +++ b/homeassistant/components/cloud/http_api.py @@ -492,7 +492,7 @@ async def google_assistant_list(hass, connection, msg): { "entity_id": entity.entity_id, "traits": [trait.name for trait in entity.traits()], - "might_2fa": entity.might_2fa(), + "might_2fa": entity.might_2fa_traits(), } ) diff --git a/homeassistant/components/google_assistant/helpers.py b/homeassistant/components/google_assistant/helpers.py index 6ba301c01e8b..bbdb8a821835 100644 --- a/homeassistant/components/google_assistant/helpers.py +++ b/homeassistant/components/google_assistant/helpers.py @@ -372,14 +372,19 @@ class GoogleEntity: @callback def might_2fa(self) -> bool: """Return if the entity might encounter 2FA.""" + if not self.config.should_2fa(self.state): + return False + + return self.might_2fa_traits() + + @callback + def might_2fa_traits(self) -> bool: + """Return if the entity might encounter 2FA based on just traits.""" state = self.state domain = state.domain features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) device_class = state.attributes.get(ATTR_DEVICE_CLASS) - if not self.config.should_2fa(state): - return False - return any( trait.might_2fa(domain, features, device_class) for trait in self.traits() ) diff --git a/tests/components/cloud/test_http_api.py b/tests/components/cloud/test_http_api.py index 8cb4a0b96368..2cfca8e6b92c 100644 --- a/tests/components/cloud/test_http_api.py +++ b/tests/components/cloud/test_http_api.py @@ -688,20 +688,30 @@ async def test_list_google_entities(hass, hass_ws_client, setup_api, mock_cloud_ entity = GoogleEntity( hass, MockConfig(should_expose=lambda *_: False), State("light.kitchen", "on") ) + entity2 = GoogleEntity( + hass, + MockConfig(should_expose=lambda *_: True, should_2fa=lambda *_: False), + State("cover.garage", "open", {"device_class": "garage"}), + ) with patch( "homeassistant.components.google_assistant.helpers.async_get_entities", - return_value=[entity], + return_value=[entity, entity2], ): await client.send_json({"id": 5, "type": "cloud/google_assistant/entities"}) response = await client.receive_json() assert response["success"] - assert len(response["result"]) == 1 + assert len(response["result"]) == 2 assert response["result"][0] == { "entity_id": "light.kitchen", "might_2fa": False, "traits": ["action.devices.traits.OnOff"], } + assert response["result"][1] == { + "entity_id": "cover.garage", + "might_2fa": True, + "traits": ["action.devices.traits.OpenClose"], + } async def test_update_google_entity(hass, hass_ws_client, setup_api, mock_cloud_login): diff --git a/tests/components/google_assistant/__init__.py b/tests/components/google_assistant/__init__.py index 802b7968ee65..79684bdeb44e 100644 --- a/tests/components/google_assistant/__init__.py +++ b/tests/components/google_assistant/__init__.py @@ -33,6 +33,7 @@ class MockConfig(helpers.AbstractConfig): """Initialize config.""" super().__init__(hass) self._should_expose = should_expose + self._should_2fa = should_2fa self._secure_devices_pin = secure_devices_pin self._entity_config = entity_config or {} self._local_sdk_webhook_id = local_sdk_webhook_id @@ -73,6 +74,10 @@ class MockConfig(helpers.AbstractConfig): """Expose it all.""" return self._should_expose is None or self._should_expose(state) + def should_2fa(self, state): + """Expose it all.""" + return self._should_2fa is None or self._should_2fa(state) + BASIC_CONFIG = MockConfig() diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index d0ed9a9d33c2..a2b8f2e9ea75 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -845,10 +845,8 @@ async def test_lock_unlock_unlock(hass): assert err.value.code == const.ERR_CHALLENGE_NOT_SETUP # Test with 2FA override - with patch( - "homeassistant.components.google_assistant.helpers" - ".AbstractConfig.should_2fa", - return_value=False, + with patch.object( + BASIC_CONFIG, "should_2fa", return_value=False, ): await trt.execute(trait.COMMAND_LOCKUNLOCK, BASIC_DATA, {"lock": False}, {}) assert len(calls) == 2 From d36204a968003949b51f801a0b633f0939ca2e3d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 09:41:18 -0700 Subject: [PATCH 420/653] Move title translation to root (#33850) --- homeassistant/components/abode/strings.json | 2 +- homeassistant/components/adguard/strings.json | 2 +- homeassistant/components/airly/strings.json | 2 +- .../components/airvisual/strings.json | 2 +- homeassistant/components/almond/strings.json | 4 +- .../components/ambiclimate/strings.json | 2 +- .../components/ambient_station/strings.json | 2 +- .../components/arcam_fmj/strings.json | 4 +- homeassistant/components/august/strings.json | 4 +- homeassistant/components/axis/strings.json | 2 +- .../components/braviatv/strings.json | 2 +- homeassistant/components/brother/strings.json | 2 +- homeassistant/components/cast/strings.json | 2 +- .../components/cert_expiry/strings.json | 2 +- .../components/coolmaster/strings.json | 2 +- .../components/coronavirus/strings.json | 2 +- homeassistant/components/daikin/strings.json | 2 +- homeassistant/components/deconz/strings.json | 2 +- homeassistant/components/demo/strings.json | 4 +- .../components/dialogflow/strings.json | 2 +- homeassistant/components/directv/strings.json | 2 +- .../components/doorbird/strings.json | 2 +- homeassistant/components/ecobee/strings.json | 2 +- homeassistant/components/elgato/strings.json | 2 +- homeassistant/components/elkm1/strings.json | 2 +- .../components/emulated_roku/strings.json | 4 +- homeassistant/components/esphome/strings.json | 2 +- homeassistant/components/flume/strings.json | 46 +++++++++---------- .../components/flunearyou/strings.json | 2 +- homeassistant/components/freebox/strings.json | 2 +- .../components/garmin_connect/strings.json | 4 +- homeassistant/components/gdacs/strings.json | 2 +- .../components/geofency/strings.json | 2 +- .../components/geonetnz_quakes/strings.json | 2 +- .../components/geonetnz_volcano/strings.json | 2 +- homeassistant/components/gios/strings.json | 2 +- homeassistant/components/glances/strings.json | 2 +- .../components/gpslogger/strings.json | 2 +- homeassistant/components/griddy/strings.json | 2 +- .../components/hangouts/strings.json | 4 +- homeassistant/components/harmony/strings.json | 2 +- homeassistant/components/heos/strings.json | 2 +- .../components/hisense_aehw4a1/strings.json | 2 +- .../homekit_controller/strings.json | 2 +- .../components/homematicip_cloud/strings.json | 2 +- .../components/huawei_lte/strings.json | 4 +- homeassistant/components/hue/strings.json | 2 +- .../components/iaqualink/strings.json | 2 +- homeassistant/components/icloud/strings.json | 2 +- homeassistant/components/ifttt/strings.json | 2 +- homeassistant/components/ios/strings.json | 2 +- homeassistant/components/ipma/strings.json | 2 +- homeassistant/components/ipp/strings.json | 2 +- homeassistant/components/iqvia/strings.json | 2 +- homeassistant/components/izone/strings.json | 2 +- .../components/konnected/strings.json | 3 +- homeassistant/components/life360/strings.json | 2 +- homeassistant/components/lifx/strings.json | 2 +- homeassistant/components/linky/strings.json | 2 +- .../components/local_ip/strings.json | 2 +- .../components/locative/strings.json | 2 +- .../components/logi_circle/strings.json | 2 +- .../components/luftdaten/strings.json | 2 +- .../components/lutron_caseta/strings.json | 4 +- homeassistant/components/mailgun/strings.json | 2 +- .../components/melcloud/strings.json | 2 +- homeassistant/components/met/strings.json | 2 +- .../components/meteo_france/strings.json | 2 +- .../components/mikrotik/strings.json | 2 +- .../components/minecraft_server/strings.json | 2 +- .../components/mobile_app/strings.json | 2 +- .../components/monoprice/strings.json | 2 +- homeassistant/components/mqtt/strings.json | 2 +- homeassistant/components/myq/strings.json | 2 +- homeassistant/components/neato/strings.json | 2 +- homeassistant/components/nest/strings.json | 2 +- homeassistant/components/netatmo/strings.json | 2 +- homeassistant/components/nexia/strings.json | 2 +- homeassistant/components/notion/strings.json | 2 +- homeassistant/components/nuheat/strings.json | 2 +- homeassistant/components/nut/strings.json | 2 +- .../components/opentherm_gw/strings.json | 2 +- homeassistant/components/openuv/strings.json | 2 +- .../components/owntracks/strings.json | 2 +- homeassistant/components/plaato/strings.json | 2 +- homeassistant/components/plex/strings.json | 2 +- homeassistant/components/point/strings.json | 2 +- .../components/powerwall/strings.json | 2 +- homeassistant/components/ps4/strings.json | 2 +- .../pvpc_hourly_pricing/strings.json | 2 +- homeassistant/components/rachio/strings.json | 2 +- .../components/rainmachine/strings.json | 2 +- homeassistant/components/ring/strings.json | 2 +- homeassistant/components/roku/strings.json | 2 +- homeassistant/components/roomba/strings.json | 2 +- .../components/samsungtv/strings.json | 2 +- homeassistant/components/sense/strings.json | 2 +- homeassistant/components/sentry/strings.json | 2 +- .../components/shopping_list/strings.json | 2 +- .../components/simplisafe/strings.json | 2 +- .../components/smartthings/strings.json | 2 +- homeassistant/components/smhi/strings.json | 2 +- .../components/solaredge/strings.json | 2 +- .../components/solarlog/strings.json | 2 +- homeassistant/components/soma/strings.json | 4 +- homeassistant/components/somfy/strings.json | 4 +- homeassistant/components/sonos/strings.json | 2 +- homeassistant/components/spotify/strings.json | 4 +- .../components/starline/strings.json | 2 +- .../components/synology_dsm/strings.json | 2 +- homeassistant/components/tado/strings.json | 5 +- .../components/tellduslive/strings.json | 4 +- homeassistant/components/tesla/strings.json | 4 +- homeassistant/components/toon/strings.json | 2 +- .../components/totalconnect/strings.json | 2 +- homeassistant/components/tplink/strings.json | 2 +- homeassistant/components/traccar/strings.json | 2 +- homeassistant/components/tradfri/strings.json | 2 +- .../components/transmission/strings.json | 2 +- .../components/twentemilieu/strings.json | 2 +- homeassistant/components/twilio/strings.json | 2 +- homeassistant/components/unifi/strings.json | 2 +- homeassistant/components/upnp/strings.json | 2 +- homeassistant/components/velbus/strings.json | 2 +- homeassistant/components/vera/strings.json | 2 +- homeassistant/components/vesync/strings.json | 2 +- homeassistant/components/vilfo/strings.json | 2 +- homeassistant/components/vizio/strings.json | 3 +- homeassistant/components/wemo/strings.json | 2 +- .../components/withings/strings.json | 2 +- homeassistant/components/wled/strings.json | 2 +- homeassistant/components/wwlln/strings.json | 2 +- homeassistant/components/zha/strings.json | 2 +- homeassistant/components/zwave/strings.json | 2 +- script/scaffold/generate.py | 12 ++--- 135 files changed, 174 insertions(+), 183 deletions(-) diff --git a/homeassistant/components/abode/strings.json b/homeassistant/components/abode/strings.json index 5c1385c6ecd9..162d6400fb21 100644 --- a/homeassistant/components/abode/strings.json +++ b/homeassistant/components/abode/strings.json @@ -1,6 +1,6 @@ { + "title": "Abode", "config": { - "title": "Abode", "step": { "user": { "title": "Fill in your Abode login information", diff --git a/homeassistant/components/adguard/strings.json b/homeassistant/components/adguard/strings.json index fb17a8ea4711..c0c0c22f560a 100644 --- a/homeassistant/components/adguard/strings.json +++ b/homeassistant/components/adguard/strings.json @@ -1,6 +1,6 @@ { + "title": "AdGuard Home", "config": { - "title": "AdGuard Home", "step": { "user": { "title": "Link your AdGuard Home.", diff --git a/homeassistant/components/airly/strings.json b/homeassistant/components/airly/strings.json index d8047265415b..8e35b091b331 100644 --- a/homeassistant/components/airly/strings.json +++ b/homeassistant/components/airly/strings.json @@ -1,6 +1,6 @@ { + "title": "Airly", "config": { - "title": "Airly", "step": { "user": { "title": "Airly", diff --git a/homeassistant/components/airvisual/strings.json b/homeassistant/components/airvisual/strings.json index 8791e6d864da..86c6a2d2c6e4 100644 --- a/homeassistant/components/airvisual/strings.json +++ b/homeassistant/components/airvisual/strings.json @@ -1,6 +1,6 @@ { + "title": "AirVisual", "config": { - "title": "AirVisual", "step": { "user": { "title": "Configure AirVisual", diff --git a/homeassistant/components/almond/strings.json b/homeassistant/components/almond/strings.json index 2ae4e632d6bc..dd31116212c1 100644 --- a/homeassistant/components/almond/strings.json +++ b/homeassistant/components/almond/strings.json @@ -1,4 +1,5 @@ { + "title": "Almond", "config": { "step": { "pick_implementation": { @@ -13,7 +14,6 @@ "already_setup": "You can only configure one Almond account.", "cannot_connect": "Unable to connect to the Almond server.", "missing_configuration": "Please check the documentation on how to set up Almond." - }, - "title": "Almond" + } } } diff --git a/homeassistant/components/ambiclimate/strings.json b/homeassistant/components/ambiclimate/strings.json index f38836c0414d..02ccf930c0cf 100644 --- a/homeassistant/components/ambiclimate/strings.json +++ b/homeassistant/components/ambiclimate/strings.json @@ -1,6 +1,6 @@ { + "title": "Ambiclimate", "config": { - "title": "Ambiclimate", "step": { "auth": { "title": "Authenticate Ambiclimate", diff --git a/homeassistant/components/ambient_station/strings.json b/homeassistant/components/ambient_station/strings.json index 3cfe36b32209..763c22499aab 100644 --- a/homeassistant/components/ambient_station/strings.json +++ b/homeassistant/components/ambient_station/strings.json @@ -1,6 +1,6 @@ { + "title": "Ambient PWS", "config": { - "title": "Ambient PWS", "step": { "user": { "title": "Fill in your information", diff --git a/homeassistant/components/arcam_fmj/strings.json b/homeassistant/components/arcam_fmj/strings.json index 85413da8f809..57eedd7885c4 100644 --- a/homeassistant/components/arcam_fmj/strings.json +++ b/homeassistant/components/arcam_fmj/strings.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } diff --git a/homeassistant/components/august/strings.json b/homeassistant/components/august/strings.json index da8c49184526..07c77b806f6a 100644 --- a/homeassistant/components/august/strings.json +++ b/homeassistant/components/august/strings.json @@ -1,4 +1,5 @@ { + "title": "August", "config": { "error": { "unknown": "Unexpected error", @@ -26,7 +27,6 @@ }, "title": "Setup an August account" } - }, - "title": "August" + } } } diff --git a/homeassistant/components/axis/strings.json b/homeassistant/components/axis/strings.json index 04a9f9e388a9..4479e269e873 100644 --- a/homeassistant/components/axis/strings.json +++ b/homeassistant/components/axis/strings.json @@ -1,6 +1,6 @@ { + "title": "Axis device", "config": { - "title": "Axis device", "flow_title": "Axis device: {name} ({host})", "step": { "user": { diff --git a/homeassistant/components/braviatv/strings.json b/homeassistant/components/braviatv/strings.json index e98bea189d44..d20619c3df6f 100644 --- a/homeassistant/components/braviatv/strings.json +++ b/homeassistant/components/braviatv/strings.json @@ -1,6 +1,6 @@ { + "title": "Sony Bravia TV", "config": { - "title": "Sony Bravia TV", "step": { "user": { "title": "Sony Bravia TV", diff --git a/homeassistant/components/brother/strings.json b/homeassistant/components/brother/strings.json index c14903df9503..22df2e88d779 100644 --- a/homeassistant/components/brother/strings.json +++ b/homeassistant/components/brother/strings.json @@ -1,6 +1,6 @@ { + "title": "Brother Printer", "config": { - "title": "Brother Printer", "flow_title": "Brother Printer: {model} {serial_number}", "step": { "user": { diff --git a/homeassistant/components/cast/strings.json b/homeassistant/components/cast/strings.json index eecdecbfdf9e..06bbf1b764c6 100644 --- a/homeassistant/components/cast/strings.json +++ b/homeassistant/components/cast/strings.json @@ -1,6 +1,6 @@ { + "title": "Google Cast", "config": { - "title": "Google Cast", "step": { "confirm": { "title": "Google Cast", diff --git a/homeassistant/components/cert_expiry/strings.json b/homeassistant/components/cert_expiry/strings.json index e47613e17ca8..f456809147b7 100644 --- a/homeassistant/components/cert_expiry/strings.json +++ b/homeassistant/components/cert_expiry/strings.json @@ -1,6 +1,6 @@ { + "title": "Certificate Expiry", "config": { - "title": "Certificate Expiry", "step": { "user": { "title": "Define the certificate to test", diff --git a/homeassistant/components/coolmaster/strings.json b/homeassistant/components/coolmaster/strings.json index d309f8c9c933..c16aa9d52ad7 100644 --- a/homeassistant/components/coolmaster/strings.json +++ b/homeassistant/components/coolmaster/strings.json @@ -1,6 +1,6 @@ { + "title": "CoolMasterNet", "config": { - "title": "CoolMasterNet", "step": { "user": { "title": "Setup your CoolMasterNet connection details.", diff --git a/homeassistant/components/coronavirus/strings.json b/homeassistant/components/coronavirus/strings.json index fd4873c808cc..9b21c015f582 100644 --- a/homeassistant/components/coronavirus/strings.json +++ b/homeassistant/components/coronavirus/strings.json @@ -1,6 +1,6 @@ { + "title": "Coronavirus", "config": { - "title": "Coronavirus", "step": { "user": { "title": "Pick a country to monitor", diff --git a/homeassistant/components/daikin/strings.json b/homeassistant/components/daikin/strings.json index 6c48024efc44..e165b66f0026 100644 --- a/homeassistant/components/daikin/strings.json +++ b/homeassistant/components/daikin/strings.json @@ -1,6 +1,6 @@ { + "title": "Daikin AC", "config": { - "title": "Daikin AC", "step": { "user": { "title": "Configure Daikin AC", diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index 735a9bf58e5d..2293be4b247d 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -1,6 +1,6 @@ { + "title": "deCONZ Zigbee gateway", "config": { - "title": "deCONZ Zigbee gateway", "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "init": { diff --git a/homeassistant/components/demo/strings.json b/homeassistant/components/demo/strings.json index 33f3b4229dc4..95497b8bf19e 100644 --- a/homeassistant/components/demo/strings.json +++ b/homeassistant/components/demo/strings.json @@ -1,7 +1,5 @@ { - "config": { - "title": "Demo" - }, + "title": "Demo", "options": { "step": { "init": { diff --git a/homeassistant/components/dialogflow/strings.json b/homeassistant/components/dialogflow/strings.json index 4a3e91a3e501..1a477ca4d57c 100644 --- a/homeassistant/components/dialogflow/strings.json +++ b/homeassistant/components/dialogflow/strings.json @@ -1,6 +1,6 @@ { + "title": "Dialogflow", "config": { - "title": "Dialogflow", "step": { "user": { "title": "Set up the Dialogflow Webhook", diff --git a/homeassistant/components/directv/strings.json b/homeassistant/components/directv/strings.json index e0a5a477ad2a..254229d091fc 100644 --- a/homeassistant/components/directv/strings.json +++ b/homeassistant/components/directv/strings.json @@ -1,6 +1,6 @@ { + "title": "DirecTV", "config": { - "title": "DirecTV", "flow_title": "DirecTV: {name}", "step": { "ssdp_confirm": { diff --git a/homeassistant/components/doorbird/strings.json b/homeassistant/components/doorbird/strings.json index 6bfda8c31dd2..9b56bc9f39da 100644 --- a/homeassistant/components/doorbird/strings.json +++ b/homeassistant/components/doorbird/strings.json @@ -1,4 +1,5 @@ { + "title": "DoorBird", "options": { "step": { "init": { @@ -26,7 +27,6 @@ "link_local_address": "Link local addresses are not supported", "not_doorbird_device": "This device is not a DoorBird" }, - "title": "DoorBird", "flow_title": "DoorBird {name} ({host})", "error": { "invalid_auth": "Invalid authentication", diff --git a/homeassistant/components/ecobee/strings.json b/homeassistant/components/ecobee/strings.json index a6eaa488c60c..535c5add3f39 100644 --- a/homeassistant/components/ecobee/strings.json +++ b/homeassistant/components/ecobee/strings.json @@ -1,6 +1,6 @@ { + "title": "ecobee", "config": { - "title": "ecobee", "step": { "user": { "title": "ecobee API key", diff --git a/homeassistant/components/elgato/strings.json b/homeassistant/components/elgato/strings.json index 03c46f02efca..037084385401 100644 --- a/homeassistant/components/elgato/strings.json +++ b/homeassistant/components/elgato/strings.json @@ -1,6 +1,6 @@ { + "title": "Elgato Key Light", "config": { - "title": "Elgato Key Light", "flow_title": "Elgato Key Light: {serial_number}", "step": { "user": { diff --git a/homeassistant/components/elkm1/strings.json b/homeassistant/components/elkm1/strings.json index 36272a3de883..85d12844593d 100644 --- a/homeassistant/components/elkm1/strings.json +++ b/homeassistant/components/elkm1/strings.json @@ -1,6 +1,6 @@ { + "title": "Elk-M1 Control", "config": { - "title": "Elk-M1 Control", "step": { "user": { "title": "Connect to Elk-M1 Control", diff --git a/homeassistant/components/emulated_roku/strings.json b/homeassistant/components/emulated_roku/strings.json index 987e49079117..960e2f22af31 100644 --- a/homeassistant/components/emulated_roku/strings.json +++ b/homeassistant/components/emulated_roku/strings.json @@ -1,4 +1,5 @@ { + "title": "EmulatedRoku", "config": { "abort": { "name_exists": "Name already exists" @@ -15,7 +16,6 @@ }, "title": "Define server configuration" } - }, - "title": "EmulatedRoku" + } } } diff --git a/homeassistant/components/esphome/strings.json b/homeassistant/components/esphome/strings.json index 00d1ab1828ea..0c1c50e493da 100644 --- a/homeassistant/components/esphome/strings.json +++ b/homeassistant/components/esphome/strings.json @@ -1,4 +1,5 @@ { + "title": "ESPHome", "config": { "abort": { "already_configured": "ESP is already configured" @@ -29,7 +30,6 @@ "title": "Discovered ESPHome node" } }, - "title": "ESPHome", "flow_title": "ESPHome: {name}" } } diff --git a/homeassistant/components/flume/strings.json b/homeassistant/components/flume/strings.json index ed557133a9bb..65ee5b59a41c 100644 --- a/homeassistant/components/flume/strings.json +++ b/homeassistant/components/flume/strings.json @@ -1,25 +1,25 @@ { - "config" : { - "error" : { - "unknown" : "Unexpected error", - "invalid_auth" : "Invalid authentication", - "cannot_connect" : "Failed to connect, please try again" - }, - "step" : { - "user" : { - "description" : "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", - "title" : "Connect to your Flume Account", - "data" : { - "username" : "Username", - "client_secret" : "Client Secret", - "client_id" : "Client ID", - "password" : "Password" - } - } - }, - "abort" : { - "already_configured" : "This account is already configured" - }, - "title" : "Flume" - } + "title": "Flume", + "config": { + "error": { + "unknown": "Unexpected error", + "invalid_auth": "Invalid authentication", + "cannot_connect": "Failed to connect, please try again" + }, + "step": { + "user": { + "description": "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", + "title": "Connect to your Flume Account", + "data": { + "username": "Username", + "client_secret": "Client Secret", + "client_id": "Client ID", + "password": "Password" + } + } + }, + "abort": { + "already_configured": "This account is already configured" + } + } } diff --git a/homeassistant/components/flunearyou/strings.json b/homeassistant/components/flunearyou/strings.json index 5539c6f82df7..14ebb5ecb955 100644 --- a/homeassistant/components/flunearyou/strings.json +++ b/homeassistant/components/flunearyou/strings.json @@ -1,6 +1,6 @@ { + "title": "Flu Near You", "config": { - "title": "Flu Near You", "step": { "user": { "title": "Configure Flu Near You", diff --git a/homeassistant/components/freebox/strings.json b/homeassistant/components/freebox/strings.json index 9f402a7d1e65..bad618321e4e 100644 --- a/homeassistant/components/freebox/strings.json +++ b/homeassistant/components/freebox/strings.json @@ -1,6 +1,6 @@ { + "title": "Freebox", "config": { - "title": "Freebox", "step": { "user": { "title": "Freebox", diff --git a/homeassistant/components/garmin_connect/strings.json b/homeassistant/components/garmin_connect/strings.json index faf463ea8db0..b0571bb7d80c 100644 --- a/homeassistant/components/garmin_connect/strings.json +++ b/homeassistant/components/garmin_connect/strings.json @@ -1,4 +1,5 @@ { + "title": "Garmin Connect", "config": { "abort": { "already_configured": "This account is already configured." @@ -18,7 +19,6 @@ "description": "Enter your credentials.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" + } } } diff --git a/homeassistant/components/gdacs/strings.json b/homeassistant/components/gdacs/strings.json index 353b1b856342..809d87e13cc7 100644 --- a/homeassistant/components/gdacs/strings.json +++ b/homeassistant/components/gdacs/strings.json @@ -1,6 +1,6 @@ { + "title": "Global Disaster Alert and Coordination System (GDACS)", "config": { - "title": "Global Disaster Alert and Coordination System (GDACS)", "step": { "user": { "title": "Fill in your filter details.", diff --git a/homeassistant/components/geofency/strings.json b/homeassistant/components/geofency/strings.json index 7951df50e5ed..784fa3d0056d 100644 --- a/homeassistant/components/geofency/strings.json +++ b/homeassistant/components/geofency/strings.json @@ -1,6 +1,6 @@ { + "title": "Geofency Webhook", "config": { - "title": "Geofency Webhook", "step": { "user": { "title": "Set up the Geofency Webhook", diff --git a/homeassistant/components/geonetnz_quakes/strings.json b/homeassistant/components/geonetnz_quakes/strings.json index 9c5ea2918972..46dd3f25ded9 100644 --- a/homeassistant/components/geonetnz_quakes/strings.json +++ b/homeassistant/components/geonetnz_quakes/strings.json @@ -1,6 +1,6 @@ { + "title": "GeoNet NZ Quakes", "config": { - "title": "GeoNet NZ Quakes", "step": { "user": { "title": "Fill in your filter details.", diff --git a/homeassistant/components/geonetnz_volcano/strings.json b/homeassistant/components/geonetnz_volcano/strings.json index 93ec8603d03b..62537be6024a 100644 --- a/homeassistant/components/geonetnz_volcano/strings.json +++ b/homeassistant/components/geonetnz_volcano/strings.json @@ -1,6 +1,6 @@ { + "title": "GeoNet NZ Volcano", "config": { - "title": "GeoNet NZ Volcano", "step": { "user": { "title": "Fill in your filter details.", diff --git a/homeassistant/components/gios/strings.json b/homeassistant/components/gios/strings.json index 2442fa61a911..0519eec87d3a 100644 --- a/homeassistant/components/gios/strings.json +++ b/homeassistant/components/gios/strings.json @@ -1,6 +1,6 @@ { + "title": "$1", "config": { - "title": "GIOŚ", "step": { "user": { "title": "GIOŚ (Polish Chief Inspectorate Of Environmental Protection)", diff --git a/homeassistant/components/glances/strings.json b/homeassistant/components/glances/strings.json index 3ec324f9cd6d..8c1078fb8349 100644 --- a/homeassistant/components/glances/strings.json +++ b/homeassistant/components/glances/strings.json @@ -1,6 +1,6 @@ { + "title": "Glances", "config": { - "title": "Glances", "step": { "user": { "title": "Setup Glances", diff --git a/homeassistant/components/gpslogger/strings.json b/homeassistant/components/gpslogger/strings.json index add0ad31cbbc..dfa66b5844f0 100644 --- a/homeassistant/components/gpslogger/strings.json +++ b/homeassistant/components/gpslogger/strings.json @@ -1,6 +1,6 @@ { + "title": "GPSLogger Webhook", "config": { - "title": "GPSLogger Webhook", "step": { "user": { "title": "Set up the GPSLogger Webhook", diff --git a/homeassistant/components/griddy/strings.json b/homeassistant/components/griddy/strings.json index ee4df700f790..c7565881a823 100644 --- a/homeassistant/components/griddy/strings.json +++ b/homeassistant/components/griddy/strings.json @@ -1,10 +1,10 @@ { + "title": "Griddy", "config": { "error": { "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "title": "Griddy", "step": { "user": { "description": "Your Load Zone is in your Griddy account under “Account > Meter > Load Zone.”", diff --git a/homeassistant/components/hangouts/strings.json b/homeassistant/components/hangouts/strings.json index 7bd67a7a2c8b..13771825fc00 100644 --- a/homeassistant/components/hangouts/strings.json +++ b/homeassistant/components/hangouts/strings.json @@ -1,4 +1,5 @@ { + "title": "Google Hangouts", "config": { "abort": { "already_configured": "Google Hangouts is already configured", @@ -24,7 +25,6 @@ }, "title": "2-Factor-Authentication" } - }, - "title": "Google Hangouts" + } } } diff --git a/homeassistant/components/harmony/strings.json b/homeassistant/components/harmony/strings.json index 8af5a5ada1a6..a486772139d4 100644 --- a/homeassistant/components/harmony/strings.json +++ b/homeassistant/components/harmony/strings.json @@ -1,6 +1,6 @@ { + "title": "Logitech Harmony Hub", "config": { - "title": "Logitech Harmony Hub", "flow_title": "Logitech Harmony Hub {name}", "step": { "user": { diff --git a/homeassistant/components/heos/strings.json b/homeassistant/components/heos/strings.json index 28b404acdbd0..12bc234fc4d3 100644 --- a/homeassistant/components/heos/strings.json +++ b/homeassistant/components/heos/strings.json @@ -1,6 +1,6 @@ { + "title": "HEOS", "config": { - "title": "HEOS", "step": { "user": { "title": "Connect to Heos", diff --git a/homeassistant/components/hisense_aehw4a1/strings.json b/homeassistant/components/hisense_aehw4a1/strings.json index 67031c41710d..1d92864aa277 100644 --- a/homeassistant/components/hisense_aehw4a1/strings.json +++ b/homeassistant/components/hisense_aehw4a1/strings.json @@ -1,6 +1,6 @@ { + "title": "Hisense AEH-W4A1", "config": { - "title": "Hisense AEH-W4A1", "step": { "confirm": { "title": "Hisense AEH-W4A1", diff --git a/homeassistant/components/homekit_controller/strings.json b/homeassistant/components/homekit_controller/strings.json index 40295c74e0a3..4d55ff328b86 100644 --- a/homeassistant/components/homekit_controller/strings.json +++ b/homeassistant/components/homekit_controller/strings.json @@ -1,6 +1,6 @@ { + "title": "HomeKit Accessory", "config": { - "title": "HomeKit Accessory", "flow_title": "HomeKit Accessory: {name}", "step": { "user": { diff --git a/homeassistant/components/homematicip_cloud/strings.json b/homeassistant/components/homematicip_cloud/strings.json index f2d38a1dc7b8..e269121086cb 100644 --- a/homeassistant/components/homematicip_cloud/strings.json +++ b/homeassistant/components/homematicip_cloud/strings.json @@ -1,6 +1,6 @@ { + "title": "HomematicIP Cloud", "config": { - "title": "HomematicIP Cloud", "step": { "init": { "title": "Pick HomematicIP Access point", diff --git a/homeassistant/components/huawei_lte/strings.json b/homeassistant/components/huawei_lte/strings.json index a23c2a9184f0..4c613a286d64 100644 --- a/homeassistant/components/huawei_lte/strings.json +++ b/homeassistant/components/huawei_lte/strings.json @@ -1,4 +1,5 @@ { + "title": "Huawei LTE", "config": { "abort": { "already_configured": "This device has already been configured", @@ -26,8 +27,7 @@ "description": "Enter device access details. Specifying username and password is optional, but enables support for more integration features. On the other hand, use of an authorized connection may cause problems accessing the device web interface from outside Home Assistant while the integration is active, and the other way around.", "title": "Configure Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { diff --git a/homeassistant/components/hue/strings.json b/homeassistant/components/hue/strings.json index 9f23f0568947..620207c14bf6 100644 --- a/homeassistant/components/hue/strings.json +++ b/homeassistant/components/hue/strings.json @@ -1,6 +1,6 @@ { + "title": "Philips Hue", "config": { - "title": "Philips Hue", "step": { "init": { "title": "Pick Hue bridge", diff --git a/homeassistant/components/iaqualink/strings.json b/homeassistant/components/iaqualink/strings.json index 4c706522198c..185e9ab5498f 100644 --- a/homeassistant/components/iaqualink/strings.json +++ b/homeassistant/components/iaqualink/strings.json @@ -1,6 +1,6 @@ { + "title": "Jandy iAqualink", "config": { - "title": "Jandy iAqualink", "step": { "user": { "title": "Connect to iAqualink", diff --git a/homeassistant/components/icloud/strings.json b/homeassistant/components/icloud/strings.json index abf47e5744f2..d0f343a21f61 100644 --- a/homeassistant/components/icloud/strings.json +++ b/homeassistant/components/icloud/strings.json @@ -1,6 +1,6 @@ { + "title": "Apple iCloud", "config": { - "title": "Apple iCloud", "step": { "user": { "title": "iCloud credentials", diff --git a/homeassistant/components/ifttt/strings.json b/homeassistant/components/ifttt/strings.json index 9fc47504b9bc..2039f3f39ffa 100644 --- a/homeassistant/components/ifttt/strings.json +++ b/homeassistant/components/ifttt/strings.json @@ -1,6 +1,6 @@ { + "title": "IFTTT", "config": { - "title": "IFTTT", "step": { "user": { "title": "Set up the IFTTT Webhook Applet", diff --git a/homeassistant/components/ios/strings.json b/homeassistant/components/ios/strings.json index cbb63cf82299..53ba28972eea 100644 --- a/homeassistant/components/ios/strings.json +++ b/homeassistant/components/ios/strings.json @@ -1,6 +1,6 @@ { + "title": "Home Assistant iOS", "config": { - "title": "Home Assistant iOS", "step": { "confirm": { "title": "Home Assistant iOS", diff --git a/homeassistant/components/ipma/strings.json b/homeassistant/components/ipma/strings.json index 184b7e38946e..78471e703bac 100644 --- a/homeassistant/components/ipma/strings.json +++ b/homeassistant/components/ipma/strings.json @@ -1,6 +1,6 @@ { + "title": "Portuguese weather service (IPMA)", "config": { - "title": "Portuguese weather service (IPMA)", "step": { "user": { "title": "Location", diff --git a/homeassistant/components/ipp/strings.json b/homeassistant/components/ipp/strings.json index c77d1eec161f..0e6a005d3ed7 100644 --- a/homeassistant/components/ipp/strings.json +++ b/homeassistant/components/ipp/strings.json @@ -1,6 +1,6 @@ { + "title": "Internet Printing Protocol (IPP)", "config": { - "title": "Internet Printing Protocol (IPP)", "flow_title": "Printer: {name}", "step": { "user": { diff --git a/homeassistant/components/iqvia/strings.json b/homeassistant/components/iqvia/strings.json index 00f383be502d..62ceae7753bd 100644 --- a/homeassistant/components/iqvia/strings.json +++ b/homeassistant/components/iqvia/strings.json @@ -1,6 +1,6 @@ { + "title": "IQVIA", "config": { - "title": "IQVIA", "step": { "user": { "title": "IQVIA", diff --git a/homeassistant/components/izone/strings.json b/homeassistant/components/izone/strings.json index 7cb14b03c6c5..7af3fffd09a3 100644 --- a/homeassistant/components/izone/strings.json +++ b/homeassistant/components/izone/strings.json @@ -1,6 +1,6 @@ { + "title": "iZone", "config": { - "title": "iZone", "step": { "confirm": { "title": "iZone", diff --git a/homeassistant/components/konnected/strings.json b/homeassistant/components/konnected/strings.json index 0ea8a40bc0a8..cb1cd5df8bf2 100644 --- a/homeassistant/components/konnected/strings.json +++ b/homeassistant/components/konnected/strings.json @@ -1,6 +1,6 @@ { + "title": "Konnected.io", "config": { - "title": "Konnected.io", "step": { "import_confirm": { "title": "Import Konnected Device", @@ -30,7 +30,6 @@ } }, "options": { - "title": "Konnected Alarm Panel Options", "step": { "options_io": { "title": "Configure I/O", diff --git a/homeassistant/components/life360/strings.json b/homeassistant/components/life360/strings.json index 419f3650333c..10735b7f454b 100644 --- a/homeassistant/components/life360/strings.json +++ b/homeassistant/components/life360/strings.json @@ -1,6 +1,6 @@ { + "title": "Life360", "config": { - "title": "Life360", "step": { "user": { "title": "Life360 Account Info", diff --git a/homeassistant/components/lifx/strings.json b/homeassistant/components/lifx/strings.json index 300c9b628f39..d111aa9583eb 100644 --- a/homeassistant/components/lifx/strings.json +++ b/homeassistant/components/lifx/strings.json @@ -1,6 +1,6 @@ { + "title": "LIFX", "config": { - "title": "LIFX", "step": { "confirm": { "title": "LIFX", diff --git a/homeassistant/components/linky/strings.json b/homeassistant/components/linky/strings.json index 6d53e4f12a5c..e50a20aefcda 100644 --- a/homeassistant/components/linky/strings.json +++ b/homeassistant/components/linky/strings.json @@ -1,6 +1,6 @@ { + "title": "Linky", "config": { - "title": "Linky", "step": { "user": { "title": "Linky", diff --git a/homeassistant/components/local_ip/strings.json b/homeassistant/components/local_ip/strings.json index f8e907b46d56..2c571be1a0ae 100644 --- a/homeassistant/components/local_ip/strings.json +++ b/homeassistant/components/local_ip/strings.json @@ -1,6 +1,6 @@ { + "title": "Local IP Address", "config": { - "title": "Local IP Address", "step": { "user": { "title": "Local IP Address", diff --git a/homeassistant/components/locative/strings.json b/homeassistant/components/locative/strings.json index 4e7bd5729f4c..07ca54318690 100644 --- a/homeassistant/components/locative/strings.json +++ b/homeassistant/components/locative/strings.json @@ -1,6 +1,6 @@ { + "title": "Locative Webhook", "config": { - "title": "Locative Webhook", "step": { "user": { "title": "Set up the Locative Webhook", diff --git a/homeassistant/components/logi_circle/strings.json b/homeassistant/components/logi_circle/strings.json index 57dd0b709b71..f580e7bc1ddc 100644 --- a/homeassistant/components/logi_circle/strings.json +++ b/homeassistant/components/logi_circle/strings.json @@ -1,6 +1,6 @@ { + "title": "Logi Circle", "config": { - "title": "Logi Circle", "step": { "user": { "title": "Authentication Provider", diff --git a/homeassistant/components/luftdaten/strings.json b/homeassistant/components/luftdaten/strings.json index 96d24139c250..8e4acd1ad96e 100644 --- a/homeassistant/components/luftdaten/strings.json +++ b/homeassistant/components/luftdaten/strings.json @@ -1,6 +1,6 @@ { + "title": "Luftdaten", "config": { - "title": "Luftdaten", "step": { "user": { "title": "Define Luftdaten", diff --git a/homeassistant/components/lutron_caseta/strings.json b/homeassistant/components/lutron_caseta/strings.json index 5d7ddc8b55b0..354c69cd55ab 100644 --- a/homeassistant/components/lutron_caseta/strings.json +++ b/homeassistant/components/lutron_caseta/strings.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Caséta" - } + "title": "Lutron Caséta" } diff --git a/homeassistant/components/mailgun/strings.json b/homeassistant/components/mailgun/strings.json index c72ec747b30e..8afa6eaed257 100644 --- a/homeassistant/components/mailgun/strings.json +++ b/homeassistant/components/mailgun/strings.json @@ -1,6 +1,6 @@ { + "title": "Mailgun", "config": { - "title": "Mailgun", "step": { "user": { "title": "Set up the Mailgun Webhook", diff --git a/homeassistant/components/melcloud/strings.json b/homeassistant/components/melcloud/strings.json index 477ca7eb5e28..5afa10f3aa52 100644 --- a/homeassistant/components/melcloud/strings.json +++ b/homeassistant/components/melcloud/strings.json @@ -1,6 +1,6 @@ { + "title": "MELCloud", "config": { - "title": "MELCloud", "step": { "user": { "title": "Connect to MELCloud", diff --git a/homeassistant/components/met/strings.json b/homeassistant/components/met/strings.json index cadfd03e9d2a..a5f0c6ce3815 100644 --- a/homeassistant/components/met/strings.json +++ b/homeassistant/components/met/strings.json @@ -1,6 +1,6 @@ { + "title": "Met.no", "config": { - "title": "Met.no", "step": { "user": { "title": "Location", diff --git a/homeassistant/components/meteo_france/strings.json b/homeassistant/components/meteo_france/strings.json index 91950f62369a..0cd5c7d8da2d 100644 --- a/homeassistant/components/meteo_france/strings.json +++ b/homeassistant/components/meteo_france/strings.json @@ -1,6 +1,6 @@ { + "title": "Météo-France", "config": { - "title": "Météo-France", "step": { "user": { "title": "Météo-France", diff --git a/homeassistant/components/mikrotik/strings.json b/homeassistant/components/mikrotik/strings.json index 0d6fc42d1a35..c0c77261e5a8 100644 --- a/homeassistant/components/mikrotik/strings.json +++ b/homeassistant/components/mikrotik/strings.json @@ -1,6 +1,6 @@ { + "title": "Mikrotik", "config": { - "title": "Mikrotik", "step": { "user": { "title": "Set up Mikrotik Router", diff --git a/homeassistant/components/minecraft_server/strings.json b/homeassistant/components/minecraft_server/strings.json index 39dc17e66d58..650f95198d50 100644 --- a/homeassistant/components/minecraft_server/strings.json +++ b/homeassistant/components/minecraft_server/strings.json @@ -1,6 +1,6 @@ { + "title": "Minecraft Server", "config": { - "title": "Minecraft Server", "step": { "user": { "title": "Link your Minecraft Server", diff --git a/homeassistant/components/mobile_app/strings.json b/homeassistant/components/mobile_app/strings.json index 646151a52290..17a390fb575e 100644 --- a/homeassistant/components/mobile_app/strings.json +++ b/homeassistant/components/mobile_app/strings.json @@ -1,6 +1,6 @@ { + "title": "Mobile App", "config": { - "title": "Mobile App", "step": { "confirm": { "title": "Mobile App", diff --git a/homeassistant/components/monoprice/strings.json b/homeassistant/components/monoprice/strings.json index 7842f858fd83..fb7739546c3a 100644 --- a/homeassistant/components/monoprice/strings.json +++ b/homeassistant/components/monoprice/strings.json @@ -1,6 +1,6 @@ { + "title": "Monoprice 6-Zone Amplifier", "config": { - "title": "Monoprice 6-Zone Amplifier", "step": { "user": { "title": "Connect to the device", diff --git a/homeassistant/components/mqtt/strings.json b/homeassistant/components/mqtt/strings.json index f0a38bcbc556..7d55bd448b7b 100644 --- a/homeassistant/components/mqtt/strings.json +++ b/homeassistant/components/mqtt/strings.json @@ -1,6 +1,6 @@ { + "title": "MQTT", "config": { - "title": "MQTT", "step": { "broker": { "title": "MQTT", diff --git a/homeassistant/components/myq/strings.json b/homeassistant/components/myq/strings.json index 2aa0eab328e4..47157e64d960 100644 --- a/homeassistant/components/myq/strings.json +++ b/homeassistant/components/myq/strings.json @@ -1,6 +1,6 @@ { + "title": "MyQ", "config": { - "title": "MyQ", "step": { "user": { "title": "Connect to the MyQ Gateway", diff --git a/homeassistant/components/neato/strings.json b/homeassistant/components/neato/strings.json index 9e6a0cb27096..5346e2da3ac4 100644 --- a/homeassistant/components/neato/strings.json +++ b/homeassistant/components/neato/strings.json @@ -1,6 +1,6 @@ { + "title": "Neato", "config": { - "title": "Neato", "step": { "user": { "title": "Neato Account Info", diff --git a/homeassistant/components/nest/strings.json b/homeassistant/components/nest/strings.json index 1e6700267f84..bacd16f5f298 100644 --- a/homeassistant/components/nest/strings.json +++ b/homeassistant/components/nest/strings.json @@ -1,6 +1,6 @@ { + "title": "Nest", "config": { - "title": "Nest", "step": { "init": { "title": "Authentication Provider", diff --git a/homeassistant/components/netatmo/strings.json b/homeassistant/components/netatmo/strings.json index 5ba3fff7fe20..4261608e2484 100644 --- a/homeassistant/components/netatmo/strings.json +++ b/homeassistant/components/netatmo/strings.json @@ -1,6 +1,6 @@ { + "title": "Netatmo", "config": { - "title": "Netatmo", "step": { "pick_implementation": { "title": "Pick Authentication Method" diff --git a/homeassistant/components/nexia/strings.json b/homeassistant/components/nexia/strings.json index 8bdb3ea90b9b..dc9b4833aab2 100644 --- a/homeassistant/components/nexia/strings.json +++ b/homeassistant/components/nexia/strings.json @@ -1,6 +1,6 @@ { + "title": "Nexia", "config": { - "title": "Nexia", "step": { "user": { "title": "Connect to mynexia.com", diff --git a/homeassistant/components/notion/strings.json b/homeassistant/components/notion/strings.json index fa47c2819ba0..5c70e37ddb0c 100644 --- a/homeassistant/components/notion/strings.json +++ b/homeassistant/components/notion/strings.json @@ -1,6 +1,6 @@ { + "title": "Notion", "config": { - "title": "Notion", "step": { "user": { "title": "Fill in your information", diff --git a/homeassistant/components/nuheat/strings.json b/homeassistant/components/nuheat/strings.json index 3effdbc60d6a..a3b34456b0b9 100644 --- a/homeassistant/components/nuheat/strings.json +++ b/homeassistant/components/nuheat/strings.json @@ -1,4 +1,5 @@ { + "title": "NuHeat", "config": { "error": { "unknown": "Unexpected error", @@ -6,7 +7,6 @@ "invalid_auth": "Invalid authentication", "invalid_thermostat": "The thermostat serial number is invalid." }, - "title": "NuHeat", "abort": { "already_configured": "The thermostat is already configured" }, diff --git a/homeassistant/components/nut/strings.json b/homeassistant/components/nut/strings.json index 206a1ec299a0..ef942394a561 100644 --- a/homeassistant/components/nut/strings.json +++ b/homeassistant/components/nut/strings.json @@ -1,6 +1,6 @@ { + "title": "Network UPS Tools (NUT)", "config": { - "title": "Network UPS Tools (NUT)", "step": { "user": { "title": "Connect to the NUT server", diff --git a/homeassistant/components/opentherm_gw/strings.json b/homeassistant/components/opentherm_gw/strings.json index 7bc25726f273..4b257eca7485 100644 --- a/homeassistant/components/opentherm_gw/strings.json +++ b/homeassistant/components/opentherm_gw/strings.json @@ -1,6 +1,6 @@ { + "title": "OpenTherm Gateway", "config": { - "title": "OpenTherm Gateway", "step": { "init": { "title": "OpenTherm Gateway", diff --git a/homeassistant/components/openuv/strings.json b/homeassistant/components/openuv/strings.json index 9c5af45619ee..8692c42127f0 100644 --- a/homeassistant/components/openuv/strings.json +++ b/homeassistant/components/openuv/strings.json @@ -1,6 +1,6 @@ { + "title": "OpenUV", "config": { - "title": "OpenUV", "step": { "user": { "title": "Fill in your information", diff --git a/homeassistant/components/owntracks/strings.json b/homeassistant/components/owntracks/strings.json index fcf7305d714c..a79bee5ce631 100644 --- a/homeassistant/components/owntracks/strings.json +++ b/homeassistant/components/owntracks/strings.json @@ -1,6 +1,6 @@ { + "title": "OwnTracks", "config": { - "title": "OwnTracks", "step": { "user": { "title": "Set up OwnTracks", diff --git a/homeassistant/components/plaato/strings.json b/homeassistant/components/plaato/strings.json index 2fde2782f466..697b1466ef0e 100644 --- a/homeassistant/components/plaato/strings.json +++ b/homeassistant/components/plaato/strings.json @@ -1,6 +1,6 @@ { + "title": "Plaato Airlock", "config": { - "title": "Plaato Airlock", "step": { "user": { "title": "Set up the Plaato Webhook", diff --git a/homeassistant/components/plex/strings.json b/homeassistant/components/plex/strings.json index 83466327da3b..2952c8436a68 100644 --- a/homeassistant/components/plex/strings.json +++ b/homeassistant/components/plex/strings.json @@ -1,6 +1,6 @@ { + "title": "Plex", "config": { - "title": "Plex", "step": { "select_server": { "title": "Select Plex server", diff --git a/homeassistant/components/point/strings.json b/homeassistant/components/point/strings.json index e5491a8bbee7..fc7f189bd0ee 100644 --- a/homeassistant/components/point/strings.json +++ b/homeassistant/components/point/strings.json @@ -1,6 +1,6 @@ { + "title": "Minut Point", "config": { - "title": "Minut Point", "step": { "user": { "title": "Authentication Provider", diff --git a/homeassistant/components/powerwall/strings.json b/homeassistant/components/powerwall/strings.json index 92f0fd194647..66ed7edff442 100644 --- a/homeassistant/components/powerwall/strings.json +++ b/homeassistant/components/powerwall/strings.json @@ -1,6 +1,6 @@ { + "title": "Tesla Powerwall", "config": { - "title": "Tesla Powerwall", "step": { "user": { "title": "Connect to the powerwall", diff --git a/homeassistant/components/ps4/strings.json b/homeassistant/components/ps4/strings.json index 77443b1ee9a0..ff7d2d82f05b 100644 --- a/homeassistant/components/ps4/strings.json +++ b/homeassistant/components/ps4/strings.json @@ -1,6 +1,6 @@ { + "title": "PlayStation 4", "config": { - "title": "PlayStation 4", "step": { "creds": { "title": "PlayStation 4", diff --git a/homeassistant/components/pvpc_hourly_pricing/strings.json b/homeassistant/components/pvpc_hourly_pricing/strings.json index bff5dc2e68f9..44d3ec5f5250 100644 --- a/homeassistant/components/pvpc_hourly_pricing/strings.json +++ b/homeassistant/components/pvpc_hourly_pricing/strings.json @@ -1,6 +1,6 @@ { + "title": "Hourly price of electricity in Spain (PVPC)", "config": { - "title": "Hourly price of electricity in Spain (PVPC)", "step": { "user": { "title": "Tariff selection", diff --git a/homeassistant/components/rachio/strings.json b/homeassistant/components/rachio/strings.json index 1f05a1c7a5f4..f905f7810d36 100644 --- a/homeassistant/components/rachio/strings.json +++ b/homeassistant/components/rachio/strings.json @@ -1,6 +1,6 @@ { + "title": "Rachio", "config": { - "title": "Rachio", "step": { "user": { "title": "Connect to your Rachio device", diff --git a/homeassistant/components/rainmachine/strings.json b/homeassistant/components/rainmachine/strings.json index 7195cce2e31c..10e7e2e1400f 100644 --- a/homeassistant/components/rainmachine/strings.json +++ b/homeassistant/components/rainmachine/strings.json @@ -1,6 +1,6 @@ { + "title": "RainMachine", "config": { - "title": "RainMachine", "step": { "user": { "title": "Fill in your information", diff --git a/homeassistant/components/ring/strings.json b/homeassistant/components/ring/strings.json index 6dff7c00ba6c..9ba9bbf49c11 100644 --- a/homeassistant/components/ring/strings.json +++ b/homeassistant/components/ring/strings.json @@ -1,6 +1,6 @@ { + "title": "Ring", "config": { - "title": "Ring", "step": { "user": { "title": "Sign-in with Ring account", diff --git a/homeassistant/components/roku/strings.json b/homeassistant/components/roku/strings.json index 170728502596..8494f350b2c6 100644 --- a/homeassistant/components/roku/strings.json +++ b/homeassistant/components/roku/strings.json @@ -1,6 +1,6 @@ { + "title": "Roku", "config": { - "title": "Roku", "flow_title": "Roku: {name}", "step": { "user": { diff --git a/homeassistant/components/roomba/strings.json b/homeassistant/components/roomba/strings.json index 403d1980b948..7d55b1f304e6 100644 --- a/homeassistant/components/roomba/strings.json +++ b/homeassistant/components/roomba/strings.json @@ -1,6 +1,6 @@ { + "title": "iRobot Roomba", "config": { - "title": "iRobot Roomba", "step": { "user": { "title": "Connect to the device", diff --git a/homeassistant/components/samsungtv/strings.json b/homeassistant/components/samsungtv/strings.json index 71de0764789a..8a3d44f62291 100644 --- a/homeassistant/components/samsungtv/strings.json +++ b/homeassistant/components/samsungtv/strings.json @@ -1,7 +1,7 @@ { + "title": "Samsung TV", "config": { "flow_title": "Samsung TV: {model}", - "title": "Samsung TV", "step": { "user": { "title": "Samsung TV", diff --git a/homeassistant/components/sense/strings.json b/homeassistant/components/sense/strings.json index d3af47b53784..0577fc7d24e8 100644 --- a/homeassistant/components/sense/strings.json +++ b/homeassistant/components/sense/strings.json @@ -1,6 +1,6 @@ { + "title": "Sense", "config": { - "title": "Sense", "step": { "user": { "title": "Connect to your Sense Energy Monitor", diff --git a/homeassistant/components/sentry/strings.json b/homeassistant/components/sentry/strings.json index 8d5042731ca4..d6dc5a3af15f 100644 --- a/homeassistant/components/sentry/strings.json +++ b/homeassistant/components/sentry/strings.json @@ -1,6 +1,6 @@ { + "title": "Sentry", "config": { - "title": "Sentry", "step": { "user": { "title": "Sentry", diff --git a/homeassistant/components/shopping_list/strings.json b/homeassistant/components/shopping_list/strings.json index 537bed16a786..8c17d6838866 100644 --- a/homeassistant/components/shopping_list/strings.json +++ b/homeassistant/components/shopping_list/strings.json @@ -1,6 +1,6 @@ { + "title": "Shopping List", "config": { - "title": "Shopping List", "step": { "user": { "title": "Shopping List", diff --git a/homeassistant/components/simplisafe/strings.json b/homeassistant/components/simplisafe/strings.json index 1c8aadc2192d..7ffb6dfbe1a7 100644 --- a/homeassistant/components/simplisafe/strings.json +++ b/homeassistant/components/simplisafe/strings.json @@ -1,6 +1,6 @@ { + "title": "SimpliSafe", "config": { - "title": "SimpliSafe", "step": { "user": { "title": "Fill in your information", diff --git a/homeassistant/components/smartthings/strings.json b/homeassistant/components/smartthings/strings.json index 94a8f0c8bc49..313570506246 100644 --- a/homeassistant/components/smartthings/strings.json +++ b/homeassistant/components/smartthings/strings.json @@ -1,6 +1,6 @@ { + "title": "SmartThings", "config": { - "title": "SmartThings", "step": { "user": { "title": "Confirm Callback URL", diff --git a/homeassistant/components/smhi/strings.json b/homeassistant/components/smhi/strings.json index 2db9e0f94eb0..015b24848afc 100644 --- a/homeassistant/components/smhi/strings.json +++ b/homeassistant/components/smhi/strings.json @@ -1,6 +1,6 @@ { + "title": "Swedish weather service (SMHI)", "config": { - "title": "Swedish weather service (SMHI)", "step": { "user": { "title": "Location in Sweden", diff --git a/homeassistant/components/solaredge/strings.json b/homeassistant/components/solaredge/strings.json index 650ae3edd4fd..ba02a718cbfb 100644 --- a/homeassistant/components/solaredge/strings.json +++ b/homeassistant/components/solaredge/strings.json @@ -1,6 +1,6 @@ { + "title": "SolarEdge", "config": { - "title": "SolarEdge", "step": { "user": { "title": "Define the API parameters for this installation", diff --git a/homeassistant/components/solarlog/strings.json b/homeassistant/components/solarlog/strings.json index 5399d5176c93..fe4b8540f4b0 100644 --- a/homeassistant/components/solarlog/strings.json +++ b/homeassistant/components/solarlog/strings.json @@ -1,6 +1,6 @@ { + "title": "Solar-Log", "config": { - "title": "Solar-Log", "step": { "user": { "title": "Define your Solar-Log connection", diff --git a/homeassistant/components/soma/strings.json b/homeassistant/components/soma/strings.json index 74a72fdd9760..50570f8f396b 100644 --- a/homeassistant/components/soma/strings.json +++ b/homeassistant/components/soma/strings.json @@ -1,4 +1,5 @@ { + "title": "Soma", "config": { "abort": { "already_setup": "You can only configure one Soma account.", @@ -19,7 +20,6 @@ "description": "Please enter connection settings of your SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" + } } } diff --git a/homeassistant/components/somfy/strings.json b/homeassistant/components/somfy/strings.json index 81308ba18afb..2b6dff2c0fa1 100644 --- a/homeassistant/components/somfy/strings.json +++ b/homeassistant/components/somfy/strings.json @@ -1,4 +1,5 @@ { + "title": "Somfy", "config": { "step": { "pick_implementation": { @@ -12,7 +13,6 @@ }, "create_entry": { "default": "Successfully authenticated with Somfy." - }, - "title": "Somfy" + } } } diff --git a/homeassistant/components/sonos/strings.json b/homeassistant/components/sonos/strings.json index 0422919c1aa5..e5b81fe2c9a3 100644 --- a/homeassistant/components/sonos/strings.json +++ b/homeassistant/components/sonos/strings.json @@ -1,6 +1,6 @@ { + "title": "Sonos", "config": { - "title": "Sonos", "step": { "confirm": { "title": "Sonos", diff --git a/homeassistant/components/spotify/strings.json b/homeassistant/components/spotify/strings.json index 316fbd946dbf..fe12c6cedad7 100644 --- a/homeassistant/components/spotify/strings.json +++ b/homeassistant/components/spotify/strings.json @@ -1,4 +1,5 @@ { + "title": "Spotify", "config": { "step": { "pick_implementation": { @@ -12,7 +13,6 @@ }, "create_entry": { "default": "Successfully authenticated with Spotify." - }, - "title": "Spotify" + } } } diff --git a/homeassistant/components/starline/strings.json b/homeassistant/components/starline/strings.json index 673fc6f54bd6..d51199499534 100644 --- a/homeassistant/components/starline/strings.json +++ b/homeassistant/components/starline/strings.json @@ -1,6 +1,6 @@ { + "title": "StarLine", "config": { - "title": "StarLine", "step": { "auth_app": { "title": "Application credentials", diff --git a/homeassistant/components/synology_dsm/strings.json b/homeassistant/components/synology_dsm/strings.json index 77bd1250033b..49d9e2974efd 100644 --- a/homeassistant/components/synology_dsm/strings.json +++ b/homeassistant/components/synology_dsm/strings.json @@ -1,6 +1,6 @@ { + "title": "Synology DSM", "config": { - "title": "Synology DSM", "flow_title": "Synology DSM {name} ({host})", "step": { "user": { diff --git a/homeassistant/components/tado/strings.json b/homeassistant/components/tado/strings.json index 697dadb4c7d6..65d0462486d2 100644 --- a/homeassistant/components/tado/strings.json +++ b/homeassistant/components/tado/strings.json @@ -1,4 +1,5 @@ { + "title": "Tado", "config": { "abort": { "already_configured": "Device is already configured" @@ -17,11 +18,9 @@ "no_homes": "There are no homes linked to this tado account.", "invalid_auth": "Invalid authentication", "cannot_connect": "Failed to connect, please try again" - }, - "title": "Tado" + } }, "options": { - "title": "Tado", "step": { "init": { "description": "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", diff --git a/homeassistant/components/tellduslive/strings.json b/homeassistant/components/tellduslive/strings.json index 53a32812f60d..3668209ac6c0 100644 --- a/homeassistant/components/tellduslive/strings.json +++ b/homeassistant/components/tellduslive/strings.json @@ -1,4 +1,5 @@ { + "title": "Telldus Live", "config": { "abort": { "already_setup": "TelldusLive is already configured", @@ -20,7 +21,6 @@ }, "title": "Pick endpoint." } - }, - "title": "Telldus Live" + } } } diff --git a/homeassistant/components/tesla/strings.json b/homeassistant/components/tesla/strings.json index 61cf5a2fcb2c..5c66562cbbd5 100644 --- a/homeassistant/components/tesla/strings.json +++ b/homeassistant/components/tesla/strings.json @@ -1,4 +1,5 @@ { + "title": "Tesla", "config": { "error": { "connection_error": "Error connecting; check network and retry", @@ -15,8 +16,7 @@ "description": "Please enter your information.", "title": "Tesla - Configuration" } - }, - "title": "Tesla" + } }, "options": { "step": { diff --git a/homeassistant/components/toon/strings.json b/homeassistant/components/toon/strings.json index a12fce67ffdc..11447a72d2a7 100644 --- a/homeassistant/components/toon/strings.json +++ b/homeassistant/components/toon/strings.json @@ -1,6 +1,6 @@ { + "title": "Toon", "config": { - "title": "Toon", "step": { "authenticate": { "title": "Link your Toon account", diff --git a/homeassistant/components/totalconnect/strings.json b/homeassistant/components/totalconnect/strings.json index 893aba77368e..e2883db8d7d8 100644 --- a/homeassistant/components/totalconnect/strings.json +++ b/homeassistant/components/totalconnect/strings.json @@ -1,6 +1,6 @@ { + "title": "Total Connect", "config": { - "title": "Total Connect", "step": { "user": { "title": "Total Connect", diff --git a/homeassistant/components/tplink/strings.json b/homeassistant/components/tplink/strings.json index e353c1363abf..fd9f4c982432 100644 --- a/homeassistant/components/tplink/strings.json +++ b/homeassistant/components/tplink/strings.json @@ -1,6 +1,6 @@ { + "title": "TP-Link Smart Home", "config": { - "title": "TP-Link Smart Home", "step": { "confirm": { "title": "TP-Link Smart Home", diff --git a/homeassistant/components/traccar/strings.json b/homeassistant/components/traccar/strings.json index 19f4eb0da228..f70795f2f636 100644 --- a/homeassistant/components/traccar/strings.json +++ b/homeassistant/components/traccar/strings.json @@ -1,6 +1,6 @@ { + "title": "Traccar", "config": { - "title": "Traccar", "step": { "user": { "title": "Set up Traccar", diff --git a/homeassistant/components/tradfri/strings.json b/homeassistant/components/tradfri/strings.json index 868fbbed550c..a4bf785dd4ae 100644 --- a/homeassistant/components/tradfri/strings.json +++ b/homeassistant/components/tradfri/strings.json @@ -1,6 +1,6 @@ { + "title": "$1", "config": { - "title": "IKEA TRÅDFRI", "step": { "auth": { "title": "Enter security code", diff --git a/homeassistant/components/transmission/strings.json b/homeassistant/components/transmission/strings.json index a239de65b6e5..e5ea812a1321 100644 --- a/homeassistant/components/transmission/strings.json +++ b/homeassistant/components/transmission/strings.json @@ -1,6 +1,6 @@ { + "title": "Transmission", "config": { - "title": "Transmission", "step": { "user": { "title": "Setup Transmission Client", diff --git a/homeassistant/components/twentemilieu/strings.json b/homeassistant/components/twentemilieu/strings.json index 3ef76a5d20b0..f5110e7bf88d 100644 --- a/homeassistant/components/twentemilieu/strings.json +++ b/homeassistant/components/twentemilieu/strings.json @@ -1,6 +1,6 @@ { + "title": "Twente Milieu", "config": { - "title": "Twente Milieu", "step": { "user": { "title": "Twente Milieu", diff --git a/homeassistant/components/twilio/strings.json b/homeassistant/components/twilio/strings.json index ca75fff07370..c766993d4544 100644 --- a/homeassistant/components/twilio/strings.json +++ b/homeassistant/components/twilio/strings.json @@ -1,6 +1,6 @@ { + "title": "Twilio", "config": { - "title": "Twilio", "step": { "user": { "title": "Set up the Twilio Webhook", diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index 881e97bc9cad..cb7767eba129 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -1,6 +1,6 @@ { + "title": "UniFi Controller", "config": { - "title": "UniFi Controller", "step": { "user": { "title": "Set up UniFi Controller", diff --git a/homeassistant/components/upnp/strings.json b/homeassistant/components/upnp/strings.json index 628c0ea5a00c..be5aab88f211 100644 --- a/homeassistant/components/upnp/strings.json +++ b/homeassistant/components/upnp/strings.json @@ -1,6 +1,6 @@ { + "title": "UPnP/IGD", "config": { - "title": "UPnP/IGD", "step": { "init": { "title": "UPnP/IGD" diff --git a/homeassistant/components/velbus/strings.json b/homeassistant/components/velbus/strings.json index b927e6a5636d..700fd26aaff1 100644 --- a/homeassistant/components/velbus/strings.json +++ b/homeassistant/components/velbus/strings.json @@ -1,6 +1,6 @@ { + "title": "Velbus interface", "config": { - "title": "Velbus interface", "step": { "user": { "title": "Define the velbus connection type", diff --git a/homeassistant/components/vera/strings.json b/homeassistant/components/vera/strings.json index d8dec2c40cfa..17cb2ad85c68 100644 --- a/homeassistant/components/vera/strings.json +++ b/homeassistant/components/vera/strings.json @@ -1,6 +1,6 @@ { + "title": "Vera", "config": { - "title": "Vera", "abort": { "already_configured": "A controller is already configured.", "cannot_connect": "Could not connect to controller with url {base_url}" diff --git a/homeassistant/components/vesync/strings.json b/homeassistant/components/vesync/strings.json index 4e656d355636..183892042b36 100644 --- a/homeassistant/components/vesync/strings.json +++ b/homeassistant/components/vesync/strings.json @@ -1,6 +1,6 @@ { + "title": "VeSync", "config": { - "title": "VeSync", "step": { "user": { "title": "Enter Username and Password", diff --git a/homeassistant/components/vilfo/strings.json b/homeassistant/components/vilfo/strings.json index e7a55c55f1f7..ec4f7b41a2e0 100644 --- a/homeassistant/components/vilfo/strings.json +++ b/homeassistant/components/vilfo/strings.json @@ -1,6 +1,6 @@ { + "title": "Vilfo Router", "config": { - "title": "Vilfo Router", "step": { "user": { "title": "Connect to the Vilfo Router", diff --git a/homeassistant/components/vizio/strings.json b/homeassistant/components/vizio/strings.json index 6f9c844d5cc1..a3773d839500 100644 --- a/homeassistant/components/vizio/strings.json +++ b/homeassistant/components/vizio/strings.json @@ -1,6 +1,6 @@ { + "title": "VIZIO SmartCast", "config": { - "title": "VIZIO SmartCast", "step": { "user": { "title": "Setup VIZIO SmartCast Device", @@ -40,7 +40,6 @@ } }, "options": { - "title": "Update VIZIO SmartCast Options", "step": { "init": { "title": "Update VIZIO SmartCast Options", diff --git a/homeassistant/components/wemo/strings.json b/homeassistant/components/wemo/strings.json index d4b40817cb39..84ffc9399377 100644 --- a/homeassistant/components/wemo/strings.json +++ b/homeassistant/components/wemo/strings.json @@ -1,6 +1,6 @@ { + "title": "Wemo", "config": { - "title": "Wemo", "step": { "confirm": { "title": "Wemo", diff --git a/homeassistant/components/withings/strings.json b/homeassistant/components/withings/strings.json index 9f40c4babd9d..908a122daa28 100644 --- a/homeassistant/components/withings/strings.json +++ b/homeassistant/components/withings/strings.json @@ -1,6 +1,6 @@ { + "title": "Withings", "config": { - "title": "Withings", "step": { "profile": { "title": "User Profile.", diff --git a/homeassistant/components/wled/strings.json b/homeassistant/components/wled/strings.json index dde66b8e1225..1f69203992aa 100644 --- a/homeassistant/components/wled/strings.json +++ b/homeassistant/components/wled/strings.json @@ -1,6 +1,6 @@ { + "title": "WLED", "config": { - "title": "WLED", "flow_title": "WLED: {name}", "step": { "user": { diff --git a/homeassistant/components/wwlln/strings.json b/homeassistant/components/wwlln/strings.json index 0ab731eaf502..f02c5cebdcb2 100644 --- a/homeassistant/components/wwlln/strings.json +++ b/homeassistant/components/wwlln/strings.json @@ -1,6 +1,6 @@ { + "title": "World Wide Lightning Location Network (WWLLN)", "config": { - "title": "World Wide Lightning Location Network (WWLLN)", "step": { "user": { "title": "Fill in your location information.", diff --git a/homeassistant/components/zha/strings.json b/homeassistant/components/zha/strings.json index a015ca30770b..99d21c2886a2 100644 --- a/homeassistant/components/zha/strings.json +++ b/homeassistant/components/zha/strings.json @@ -1,6 +1,6 @@ { + "title": "ZHA", "config": { - "title": "ZHA", "step": { "user": { "title": "ZHA", diff --git a/homeassistant/components/zwave/strings.json b/homeassistant/components/zwave/strings.json index ddb03a135b91..393d7f6b7db5 100644 --- a/homeassistant/components/zwave/strings.json +++ b/homeassistant/components/zwave/strings.json @@ -1,6 +1,6 @@ { + "title": "Z-Wave", "config": { - "title": "Z-Wave", "step": { "user": { "title": "Set up Z-Wave", diff --git a/script/scaffold/generate.py b/script/scaffold/generate.py index b2f669006a90..8c3b2e9aeb8f 100644 --- a/script/scaffold/generate.py +++ b/script/scaffold/generate.py @@ -113,8 +113,8 @@ def _custom_tasks(template, info) -> None: elif template == "config_flow": info.update_manifest(config_flow=True) info.update_strings( + title=info.name, config={ - "title": info.name, "step": { "user": {"title": "Connect to the device", "data": {"host": "Host"}} }, @@ -124,14 +124,14 @@ def _custom_tasks(template, info) -> None: "unknown": "Unexpected error", }, "abort": {"already_configured": "Device is already configured"}, - } + }, ) elif template == "config_flow_discovery": info.update_manifest(config_flow=True) info.update_strings( + title=info.name, config={ - "title": info.name, "step": { "confirm": { "title": info.name, @@ -142,14 +142,14 @@ def _custom_tasks(template, info) -> None: "single_instance_allowed": f"Only a single configuration of {info.name} is possible.", "no_devices_found": f"No {info.name} devices found on the network.", }, - } + }, ) elif template == "config_flow_oauth2": info.update_manifest(config_flow=True) info.update_strings( + title=info.name, config={ - "title": info.name, "step": { "pick_implementation": {"title": "Pick Authentication Method"} }, @@ -159,7 +159,7 @@ def _custom_tasks(template, info) -> None: "create_entry": { "default": f"Successfully authenticated with {info.name}." }, - } + }, ) _append( info.integration_dir / "const.py", From f06aeea3852fc605b99a6e6da57fcbfdfb28d281 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 09:51:07 -0700 Subject: [PATCH 421/653] Update translations --- .../components/abode/.translations/bg.json | 6 +-- .../components/abode/.translations/ca.json | 6 +-- .../components/abode/.translations/cs.json | 6 +-- .../components/abode/.translations/da.json | 6 +-- .../components/abode/.translations/de.json | 6 +-- .../components/abode/.translations/en.json | 6 +-- .../abode/.translations/es-419.json | 6 +-- .../components/abode/.translations/es.json | 6 +-- .../components/abode/.translations/fr.json | 6 +-- .../components/abode/.translations/hu.json | 6 +-- .../components/abode/.translations/it.json | 6 +-- .../components/abode/.translations/ko.json | 6 +-- .../components/abode/.translations/lb.json | 6 +-- .../components/abode/.translations/nl.json | 6 +-- .../components/abode/.translations/nn.json | 4 +- .../components/abode/.translations/no.json | 6 +-- .../components/abode/.translations/pl.json | 6 +-- .../components/abode/.translations/pt-BR.json | 6 +-- .../components/abode/.translations/pt.json | 6 +-- .../components/abode/.translations/ru.json | 6 +-- .../components/abode/.translations/sl.json | 6 +-- .../components/abode/.translations/sv.json | 6 +-- .../abode/.translations/zh-Hant.json | 6 +-- .../components/adguard/.translations/bg.json | 6 +-- .../components/adguard/.translations/ca.json | 6 +-- .../components/adguard/.translations/da.json | 6 +-- .../components/adguard/.translations/de.json | 6 +-- .../components/adguard/.translations/en.json | 6 +-- .../adguard/.translations/es-419.json | 6 +-- .../components/adguard/.translations/es.json | 6 +-- .../components/adguard/.translations/fr.json | 6 +-- .../components/adguard/.translations/it.json | 6 +-- .../components/adguard/.translations/ko.json | 6 +-- .../components/adguard/.translations/lb.json | 6 +-- .../components/adguard/.translations/nl.json | 6 +-- .../components/adguard/.translations/nn.json | 6 +-- .../components/adguard/.translations/no.json | 6 +-- .../components/adguard/.translations/pl.json | 6 +-- .../adguard/.translations/pt-BR.json | 6 +-- .../components/adguard/.translations/ru.json | 6 +-- .../components/adguard/.translations/sl.json | 6 +-- .../components/adguard/.translations/sv.json | 6 +-- .../adguard/.translations/zh-Hant.json | 6 +-- .../components/airly/.translations/bg.json | 6 +-- .../components/airly/.translations/ca.json | 6 +-- .../components/airly/.translations/da.json | 6 +-- .../components/airly/.translations/de.json | 6 +-- .../components/airly/.translations/en.json | 6 +-- .../airly/.translations/es-419.json | 6 +-- .../components/airly/.translations/es.json | 6 +-- .../components/airly/.translations/fr.json | 6 +-- .../components/airly/.translations/hu.json | 6 +-- .../components/airly/.translations/it.json | 6 +-- .../components/airly/.translations/ko.json | 6 +-- .../components/airly/.translations/lb.json | 6 +-- .../components/airly/.translations/nl.json | 6 +-- .../components/airly/.translations/nn.json | 6 +-- .../components/airly/.translations/no.json | 6 +-- .../components/airly/.translations/pl.json | 6 +-- .../components/airly/.translations/pt.json | 6 +-- .../components/airly/.translations/ru.json | 6 +-- .../components/airly/.translations/sl.json | 6 +-- .../components/airly/.translations/sv.json | 6 +-- .../airly/.translations/zh-Hant.json | 6 +-- .../airvisual/.translations/ca.json | 6 +-- .../airvisual/.translations/de.json | 6 +-- .../airvisual/.translations/en.json | 6 +-- .../airvisual/.translations/es-419.json | 6 +-- .../airvisual/.translations/es.json | 6 +-- .../airvisual/.translations/fr.json | 6 +-- .../airvisual/.translations/it.json | 6 +-- .../airvisual/.translations/ko.json | 6 +-- .../airvisual/.translations/lb.json | 6 +-- .../airvisual/.translations/no.json | 6 +-- .../airvisual/.translations/pl.json | 6 +-- .../airvisual/.translations/ru.json | 6 +-- .../airvisual/.translations/sl.json | 6 +-- .../airvisual/.translations/zh-Hant.json | 6 +-- .../components/almond/.translations/bg.json | 6 +-- .../components/almond/.translations/ca.json | 6 +-- .../components/almond/.translations/da.json | 6 +-- .../components/almond/.translations/de.json | 6 +-- .../components/almond/.translations/en.json | 6 +-- .../components/almond/.translations/es.json | 6 +-- .../components/almond/.translations/fr.json | 6 +-- .../components/almond/.translations/hu.json | 6 +-- .../components/almond/.translations/it.json | 6 +-- .../components/almond/.translations/ko.json | 6 +-- .../components/almond/.translations/lb.json | 6 +-- .../components/almond/.translations/nl.json | 6 +-- .../components/almond/.translations/nn.json | 4 +- .../components/almond/.translations/no.json | 6 +-- .../components/almond/.translations/pl.json | 6 +-- .../components/almond/.translations/pt.json | 6 +-- .../components/almond/.translations/ru.json | 6 +-- .../components/almond/.translations/sl.json | 6 +-- .../components/almond/.translations/sv.json | 6 +-- .../almond/.translations/zh-Hant.json | 6 +-- .../ambiclimate/.translations/bg.json | 6 +-- .../ambiclimate/.translations/ca.json | 6 +-- .../ambiclimate/.translations/cs.json | 6 +-- .../ambiclimate/.translations/da.json | 6 +-- .../ambiclimate/.translations/de.json | 6 +-- .../ambiclimate/.translations/en.json | 6 +-- .../ambiclimate/.translations/es-419.json | 6 +-- .../ambiclimate/.translations/es.json | 6 +-- .../ambiclimate/.translations/fr.json | 6 +-- .../ambiclimate/.translations/it.json | 6 +-- .../ambiclimate/.translations/ko.json | 6 +-- .../ambiclimate/.translations/lb.json | 6 +-- .../ambiclimate/.translations/nl.json | 6 +-- .../ambiclimate/.translations/nn.json | 4 +- .../ambiclimate/.translations/no.json | 6 +-- .../ambiclimate/.translations/pl.json | 10 ++--- .../ambiclimate/.translations/pt-BR.json | 6 +-- .../ambiclimate/.translations/ru.json | 6 +-- .../ambiclimate/.translations/sl.json | 6 +-- .../ambiclimate/.translations/sv.json | 6 +-- .../ambiclimate/.translations/zh-Hant.json | 6 +-- .../ambient_station/.translations/bg.json | 6 +-- .../ambient_station/.translations/ca.json | 6 +-- .../ambient_station/.translations/da.json | 6 +-- .../ambient_station/.translations/de.json | 6 +-- .../ambient_station/.translations/en.json | 6 +-- .../ambient_station/.translations/es-419.json | 6 +-- .../ambient_station/.translations/es.json | 6 +-- .../ambient_station/.translations/fr.json | 6 +-- .../ambient_station/.translations/hu.json | 6 +-- .../ambient_station/.translations/it.json | 6 +-- .../ambient_station/.translations/ko.json | 6 +-- .../ambient_station/.translations/lb.json | 6 +-- .../ambient_station/.translations/nl.json | 6 +-- .../ambient_station/.translations/nn.json | 4 +- .../ambient_station/.translations/no.json | 6 +-- .../ambient_station/.translations/pl.json | 6 +-- .../ambient_station/.translations/pt-BR.json | 6 +-- .../ambient_station/.translations/pt.json | 6 +-- .../ambient_station/.translations/ru.json | 6 +-- .../ambient_station/.translations/sl.json | 6 +-- .../ambient_station/.translations/sv.json | 6 +-- .../.translations/zh-Hans.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../arcam_fmj/.translations/bg.json | 4 +- .../arcam_fmj/.translations/ca.json | 4 +- .../arcam_fmj/.translations/da.json | 4 +- .../arcam_fmj/.translations/de.json | 4 +- .../arcam_fmj/.translations/en.json | 4 +- .../arcam_fmj/.translations/es-419.json | 4 +- .../arcam_fmj/.translations/es.json | 4 +- .../arcam_fmj/.translations/fr.json | 4 +- .../arcam_fmj/.translations/it.json | 4 +- .../arcam_fmj/.translations/ko.json | 4 +- .../arcam_fmj/.translations/lb.json | 4 +- .../arcam_fmj/.translations/nl.json | 4 +- .../arcam_fmj/.translations/nn.json | 4 +- .../arcam_fmj/.translations/no.json | 4 +- .../arcam_fmj/.translations/pl.json | 4 +- .../arcam_fmj/.translations/pt-BR.json | 4 +- .../arcam_fmj/.translations/ru.json | 4 +- .../arcam_fmj/.translations/sl.json | 4 +- .../arcam_fmj/.translations/sv.json | 4 +- .../arcam_fmj/.translations/zh-Hant.json | 4 +- .../components/august/.translations/ca.json | 6 +-- .../components/august/.translations/da.json | 6 +-- .../components/august/.translations/de.json | 6 +-- .../components/august/.translations/en.json | 6 +-- .../components/august/.translations/es.json | 6 +-- .../components/august/.translations/fr.json | 6 +-- .../components/august/.translations/it.json | 6 +-- .../components/august/.translations/ko.json | 6 +-- .../components/august/.translations/lb.json | 6 +-- .../components/august/.translations/no.json | 6 +-- .../components/august/.translations/ru.json | 6 +-- .../components/august/.translations/sl.json | 6 +-- .../august/.translations/zh-Hant.json | 6 +-- .../components/axis/.translations/bg.json | 6 +-- .../components/axis/.translations/ca.json | 6 +-- .../components/axis/.translations/da.json | 6 +-- .../components/axis/.translations/de.json | 6 +-- .../components/axis/.translations/en.json | 6 +-- .../components/axis/.translations/es-419.json | 6 +-- .../components/axis/.translations/es.json | 6 +-- .../components/axis/.translations/fr.json | 6 +-- .../components/axis/.translations/hu.json | 6 +-- .../components/axis/.translations/it.json | 6 +-- .../components/axis/.translations/ko.json | 6 +-- .../components/axis/.translations/lb.json | 6 +-- .../components/axis/.translations/nl.json | 6 +-- .../components/axis/.translations/no.json | 6 +-- .../components/axis/.translations/pl.json | 6 +-- .../components/axis/.translations/pt-BR.json | 6 +-- .../components/axis/.translations/ru.json | 6 +-- .../components/axis/.translations/sl.json | 6 +-- .../components/axis/.translations/sv.json | 6 +-- .../axis/.translations/zh-Hant.json | 6 +-- .../components/braviatv/.translations/en.json | 6 +-- .../components/braviatv/.translations/no.json | 39 +++++++++++++++++++ .../components/braviatv/.translations/pl.json | 39 +++++++++++++++++++ .../braviatv/.translations/zh-Hant.json | 39 +++++++++++++++++++ .../components/brother/.translations/ca.json | 6 +-- .../components/brother/.translations/da.json | 6 +-- .../components/brother/.translations/de.json | 6 +-- .../components/brother/.translations/en.json | 6 +-- .../brother/.translations/es-419.json | 6 +-- .../components/brother/.translations/es.json | 6 +-- .../components/brother/.translations/fr.json | 6 +-- .../components/brother/.translations/hu.json | 6 +-- .../components/brother/.translations/it.json | 6 +-- .../components/brother/.translations/ko.json | 6 +-- .../components/brother/.translations/lb.json | 6 +-- .../components/brother/.translations/nl.json | 6 +-- .../components/brother/.translations/no.json | 6 +-- .../components/brother/.translations/pl.json | 6 +-- .../brother/.translations/pt-BR.json | 6 +-- .../components/brother/.translations/ru.json | 6 +-- .../components/brother/.translations/sl.json | 6 +-- .../components/brother/.translations/sv.json | 6 +-- .../brother/.translations/zh-Hant.json | 6 +-- .../components/cast/.translations/bg.json | 6 +-- .../components/cast/.translations/ca.json | 6 +-- .../components/cast/.translations/cs.json | 6 +-- .../components/cast/.translations/da.json | 6 +-- .../components/cast/.translations/de.json | 6 +-- .../components/cast/.translations/en.json | 6 +-- .../components/cast/.translations/es-419.json | 6 +-- .../components/cast/.translations/es.json | 6 +-- .../components/cast/.translations/et.json | 6 +-- .../components/cast/.translations/fr.json | 6 +-- .../components/cast/.translations/he.json | 6 +-- .../components/cast/.translations/hr.json | 6 +-- .../components/cast/.translations/hu.json | 6 +-- .../components/cast/.translations/id.json | 6 +-- .../components/cast/.translations/it.json | 6 +-- .../components/cast/.translations/ja.json | 6 +-- .../components/cast/.translations/ko.json | 6 +-- .../components/cast/.translations/lb.json | 6 +-- .../components/cast/.translations/nl.json | 6 +-- .../components/cast/.translations/nn.json | 6 +-- .../components/cast/.translations/no.json | 6 +-- .../components/cast/.translations/pl.json | 6 +-- .../components/cast/.translations/pt-BR.json | 6 +-- .../components/cast/.translations/pt.json | 6 +-- .../components/cast/.translations/ro.json | 6 +-- .../components/cast/.translations/ru.json | 6 +-- .../components/cast/.translations/sl.json | 6 +-- .../components/cast/.translations/sv.json | 6 +-- .../components/cast/.translations/th.json | 6 +-- .../components/cast/.translations/vi.json | 6 +-- .../cast/.translations/zh-Hans.json | 6 +-- .../cast/.translations/zh-Hant.json | 6 +-- .../cert_expiry/.translations/bg.json | 6 +-- .../cert_expiry/.translations/ca.json | 6 +-- .../cert_expiry/.translations/da.json | 6 +-- .../cert_expiry/.translations/de.json | 6 +-- .../cert_expiry/.translations/en.json | 6 +-- .../cert_expiry/.translations/es-419.json | 6 +-- .../cert_expiry/.translations/es.json | 6 +-- .../cert_expiry/.translations/fr.json | 6 +-- .../cert_expiry/.translations/it.json | 6 +-- .../cert_expiry/.translations/ko.json | 6 +-- .../cert_expiry/.translations/lb.json | 6 +-- .../cert_expiry/.translations/nl.json | 6 +-- .../cert_expiry/.translations/no.json | 6 +-- .../cert_expiry/.translations/pl.json | 6 +-- .../cert_expiry/.translations/pt-BR.json | 6 +-- .../cert_expiry/.translations/ru.json | 6 +-- .../cert_expiry/.translations/sl.json | 6 +-- .../cert_expiry/.translations/sv.json | 6 +-- .../cert_expiry/.translations/zh-Hant.json | 6 +-- .../coolmaster/.translations/bg.json | 6 +-- .../coolmaster/.translations/ca.json | 6 +-- .../coolmaster/.translations/cs.json | 6 +-- .../coolmaster/.translations/da.json | 6 +-- .../coolmaster/.translations/de.json | 6 +-- .../coolmaster/.translations/en.json | 6 +-- .../coolmaster/.translations/es-419.json | 6 +-- .../coolmaster/.translations/es.json | 6 +-- .../coolmaster/.translations/fr.json | 6 +-- .../coolmaster/.translations/it.json | 6 +-- .../coolmaster/.translations/ko.json | 6 +-- .../coolmaster/.translations/lb.json | 6 +-- .../coolmaster/.translations/nl.json | 6 +-- .../coolmaster/.translations/no.json | 6 +-- .../coolmaster/.translations/pl.json | 6 +-- .../coolmaster/.translations/ru.json | 6 +-- .../coolmaster/.translations/sl.json | 6 +-- .../coolmaster/.translations/sv.json | 6 +-- .../coolmaster/.translations/zh-Hant.json | 6 +-- .../coronavirus/.translations/ca.json | 6 +-- .../coronavirus/.translations/da.json | 6 +-- .../coronavirus/.translations/de.json | 6 +-- .../coronavirus/.translations/en.json | 6 +-- .../coronavirus/.translations/es.json | 6 +-- .../coronavirus/.translations/fr.json | 6 +-- .../coronavirus/.translations/hu.json | 6 +-- .../coronavirus/.translations/it.json | 6 +-- .../coronavirus/.translations/ko.json | 6 +-- .../coronavirus/.translations/lb.json | 6 +-- .../coronavirus/.translations/no.json | 6 +-- .../coronavirus/.translations/pl.json | 6 +-- .../coronavirus/.translations/ru.json | 6 +-- .../coronavirus/.translations/sl.json | 6 +-- .../coronavirus/.translations/zh-Hans.json | 6 +-- .../coronavirus/.translations/zh-Hant.json | 6 +-- .../components/daikin/.translations/bg.json | 6 +-- .../components/daikin/.translations/ca.json | 6 +-- .../components/daikin/.translations/da.json | 6 +-- .../components/daikin/.translations/de.json | 6 +-- .../components/daikin/.translations/en.json | 6 +-- .../daikin/.translations/es-419.json | 6 +-- .../components/daikin/.translations/es.json | 6 +-- .../components/daikin/.translations/fr.json | 6 +-- .../components/daikin/.translations/hu.json | 6 +-- .../components/daikin/.translations/it.json | 6 +-- .../components/daikin/.translations/ko.json | 6 +-- .../components/daikin/.translations/lb.json | 6 +-- .../components/daikin/.translations/nl.json | 6 +-- .../components/daikin/.translations/nn.json | 4 +- .../components/daikin/.translations/no.json | 6 +-- .../components/daikin/.translations/pl.json | 6 +-- .../daikin/.translations/pt-BR.json | 6 +-- .../components/daikin/.translations/pt.json | 6 +-- .../components/daikin/.translations/ru.json | 6 +-- .../components/daikin/.translations/sl.json | 6 +-- .../components/daikin/.translations/sv.json | 6 +-- .../components/daikin/.translations/th.json | 6 +-- .../daikin/.translations/zh-Hans.json | 6 +-- .../daikin/.translations/zh-Hant.json | 6 +-- .../components/deconz/.translations/bg.json | 6 +-- .../components/deconz/.translations/ca.json | 6 +-- .../components/deconz/.translations/cs.json | 6 +-- .../components/deconz/.translations/cy.json | 6 +-- .../components/deconz/.translations/da.json | 6 +-- .../components/deconz/.translations/de.json | 6 +-- .../components/deconz/.translations/en.json | 6 +-- .../deconz/.translations/es-419.json | 6 +-- .../components/deconz/.translations/es.json | 6 +-- .../components/deconz/.translations/et.json | 6 +-- .../components/deconz/.translations/fr.json | 6 +-- .../components/deconz/.translations/he.json | 6 +-- .../components/deconz/.translations/hu.json | 6 +-- .../components/deconz/.translations/id.json | 6 +-- .../components/deconz/.translations/it.json | 6 +-- .../components/deconz/.translations/ko.json | 6 +-- .../components/deconz/.translations/lb.json | 6 +-- .../components/deconz/.translations/nl.json | 6 +-- .../components/deconz/.translations/nn.json | 6 +-- .../components/deconz/.translations/no.json | 8 ++-- .../components/deconz/.translations/pl.json | 6 +-- .../deconz/.translations/pt-BR.json | 6 +-- .../components/deconz/.translations/pt.json | 6 +-- .../components/deconz/.translations/ru.json | 6 +-- .../components/deconz/.translations/sl.json | 6 +-- .../components/deconz/.translations/sv.json | 6 +-- .../deconz/.translations/zh-Hans.json | 6 +-- .../deconz/.translations/zh-Hant.json | 6 +-- .../components/demo/.translations/bg.json | 4 +- .../components/demo/.translations/ca.json | 6 +-- .../components/demo/.translations/da.json | 6 +-- .../components/demo/.translations/de.json | 6 +-- .../components/demo/.translations/en.json | 6 +-- .../components/demo/.translations/es-419.json | 4 +- .../components/demo/.translations/es.json | 6 +-- .../components/demo/.translations/fr.json | 6 +-- .../components/demo/.translations/hu.json | 4 +- .../components/demo/.translations/it.json | 6 +-- .../components/demo/.translations/ja.json | 4 +- .../components/demo/.translations/ko.json | 6 +-- .../components/demo/.translations/lb.json | 6 +-- .../components/demo/.translations/lv.json | 4 +- .../components/demo/.translations/nl.json | 6 +-- .../components/demo/.translations/no.json | 6 +-- .../components/demo/.translations/pl.json | 6 +-- .../components/demo/.translations/pt-BR.json | 4 +- .../components/demo/.translations/pt.json | 4 +- .../components/demo/.translations/ru.json | 6 +-- .../components/demo/.translations/sl.json | 6 +-- .../components/demo/.translations/sv.json | 6 +-- .../demo/.translations/zh-Hant.json | 6 +-- .../dialogflow/.translations/bg.json | 6 +-- .../dialogflow/.translations/ca.json | 6 +-- .../dialogflow/.translations/cs.json | 6 +-- .../dialogflow/.translations/da.json | 6 +-- .../dialogflow/.translations/de.json | 6 +-- .../dialogflow/.translations/en.json | 6 +-- .../dialogflow/.translations/es-419.json | 6 +-- .../dialogflow/.translations/es.json | 6 +-- .../dialogflow/.translations/fr.json | 6 +-- .../dialogflow/.translations/hu.json | 6 +-- .../dialogflow/.translations/it.json | 6 +-- .../dialogflow/.translations/ko.json | 6 +-- .../dialogflow/.translations/lb.json | 6 +-- .../dialogflow/.translations/nl.json | 6 +-- .../dialogflow/.translations/nn.json | 4 +- .../dialogflow/.translations/no.json | 6 +-- .../dialogflow/.translations/pl.json | 6 +-- .../dialogflow/.translations/pt-BR.json | 6 +-- .../dialogflow/.translations/pt.json | 6 +-- .../dialogflow/.translations/ru.json | 6 +-- .../dialogflow/.translations/sl.json | 6 +-- .../dialogflow/.translations/sv.json | 6 +-- .../dialogflow/.translations/zh-Hans.json | 6 +-- .../dialogflow/.translations/zh-Hant.json | 6 +-- .../components/directv/.translations/ca.json | 6 +-- .../components/directv/.translations/de.json | 6 +-- .../components/directv/.translations/en.json | 6 +-- .../components/directv/.translations/es.json | 6 +-- .../components/directv/.translations/fr.json | 6 +-- .../components/directv/.translations/it.json | 6 +-- .../components/directv/.translations/ko.json | 6 +-- .../components/directv/.translations/lb.json | 6 +-- .../components/directv/.translations/no.json | 6 +-- .../components/directv/.translations/pl.json | 6 +-- .../components/directv/.translations/ru.json | 6 +-- .../components/directv/.translations/sl.json | 6 +-- .../directv/.translations/zh-Hant.json | 6 +-- .../components/doorbird/.translations/ca.json | 6 +-- .../components/doorbird/.translations/de.json | 6 +-- .../components/doorbird/.translations/en.json | 6 +-- .../components/doorbird/.translations/es.json | 6 +-- .../components/doorbird/.translations/fr.json | 6 +-- .../components/doorbird/.translations/it.json | 6 +-- .../components/doorbird/.translations/ko.json | 6 +-- .../components/doorbird/.translations/lb.json | 6 +-- .../components/doorbird/.translations/no.json | 6 +-- .../components/doorbird/.translations/ru.json | 6 +-- .../doorbird/.translations/zh-Hant.json | 6 +-- .../components/ecobee/.translations/bg.json | 6 +-- .../components/ecobee/.translations/ca.json | 6 +-- .../components/ecobee/.translations/da.json | 6 +-- .../components/ecobee/.translations/de.json | 6 +-- .../components/ecobee/.translations/en.json | 6 +-- .../components/ecobee/.translations/es.json | 6 +-- .../components/ecobee/.translations/fr.json | 6 +-- .../components/ecobee/.translations/hu.json | 6 +-- .../components/ecobee/.translations/it.json | 6 +-- .../components/ecobee/.translations/ko.json | 6 +-- .../components/ecobee/.translations/lb.json | 6 +-- .../components/ecobee/.translations/nl.json | 6 +-- .../components/ecobee/.translations/nn.json | 4 +- .../components/ecobee/.translations/no.json | 6 +-- .../components/ecobee/.translations/pl.json | 8 ++-- .../ecobee/.translations/pt-BR.json | 6 +-- .../components/ecobee/.translations/ru.json | 6 +-- .../components/ecobee/.translations/sl.json | 6 +-- .../components/ecobee/.translations/sv.json | 6 +-- .../ecobee/.translations/zh-Hant.json | 6 +-- .../components/elgato/.translations/ca.json | 6 +-- .../components/elgato/.translations/da.json | 6 +-- .../components/elgato/.translations/de.json | 6 +-- .../components/elgato/.translations/en.json | 6 +-- .../elgato/.translations/es-419.json | 6 +-- .../components/elgato/.translations/es.json | 6 +-- .../components/elgato/.translations/fr.json | 6 +-- .../components/elgato/.translations/it.json | 6 +-- .../components/elgato/.translations/ko.json | 6 +-- .../components/elgato/.translations/lb.json | 6 +-- .../components/elgato/.translations/nl.json | 6 +-- .../components/elgato/.translations/no.json | 6 +-- .../components/elgato/.translations/pl.json | 6 +-- .../elgato/.translations/pt-BR.json | 6 +-- .../components/elgato/.translations/ru.json | 6 +-- .../components/elgato/.translations/sl.json | 6 +-- .../components/elgato/.translations/sv.json | 6 +-- .../elgato/.translations/zh-Hant.json | 6 +-- .../components/elkm1/.translations/ca.json | 6 +-- .../components/elkm1/.translations/de.json | 6 +-- .../components/elkm1/.translations/en.json | 6 +-- .../components/elkm1/.translations/es.json | 6 +-- .../components/elkm1/.translations/fr.json | 6 +-- .../components/elkm1/.translations/it.json | 6 +-- .../components/elkm1/.translations/ko.json | 6 +-- .../components/elkm1/.translations/lb.json | 6 +-- .../components/elkm1/.translations/no.json | 6 +-- .../components/elkm1/.translations/ru.json | 6 +-- .../elkm1/.translations/zh-Hant.json | 6 +-- .../emulated_roku/.translations/bg.json | 6 +-- .../emulated_roku/.translations/ca.json | 6 +-- .../emulated_roku/.translations/da.json | 6 +-- .../emulated_roku/.translations/de.json | 6 +-- .../emulated_roku/.translations/en.json | 6 +-- .../emulated_roku/.translations/es-419.json | 6 +-- .../emulated_roku/.translations/es.json | 6 +-- .../emulated_roku/.translations/et.json | 6 +-- .../emulated_roku/.translations/fr.json | 6 +-- .../emulated_roku/.translations/hu.json | 6 +-- .../emulated_roku/.translations/it.json | 6 +-- .../emulated_roku/.translations/ko.json | 6 +-- .../emulated_roku/.translations/lb.json | 6 +-- .../emulated_roku/.translations/nl.json | 6 +-- .../emulated_roku/.translations/nn.json | 4 +- .../emulated_roku/.translations/no.json | 6 +-- .../emulated_roku/.translations/pl.json | 6 +-- .../emulated_roku/.translations/pt-BR.json | 6 +-- .../emulated_roku/.translations/pt.json | 6 +-- .../emulated_roku/.translations/ru.json | 6 +-- .../emulated_roku/.translations/sl.json | 6 +-- .../emulated_roku/.translations/sv.json | 6 +-- .../emulated_roku/.translations/zh-Hans.json | 6 +-- .../emulated_roku/.translations/zh-Hant.json | 6 +-- .../components/esphome/.translations/bg.json | 6 +-- .../components/esphome/.translations/ca.json | 6 +-- .../components/esphome/.translations/da.json | 6 +-- .../components/esphome/.translations/de.json | 6 +-- .../components/esphome/.translations/en.json | 6 +-- .../esphome/.translations/es-419.json | 6 +-- .../components/esphome/.translations/es.json | 6 +-- .../components/esphome/.translations/fr.json | 6 +-- .../components/esphome/.translations/hu.json | 6 +-- .../components/esphome/.translations/it.json | 6 +-- .../components/esphome/.translations/ko.json | 6 +-- .../components/esphome/.translations/lb.json | 6 +-- .../components/esphome/.translations/nl.json | 6 +-- .../components/esphome/.translations/nn.json | 6 +-- .../components/esphome/.translations/no.json | 6 +-- .../components/esphome/.translations/pl.json | 6 +-- .../esphome/.translations/pt-BR.json | 6 +-- .../components/esphome/.translations/pt.json | 6 +-- .../components/esphome/.translations/ru.json | 6 +-- .../components/esphome/.translations/sl.json | 6 +-- .../components/esphome/.translations/sv.json | 6 +-- .../esphome/.translations/zh-Hans.json | 6 +-- .../esphome/.translations/zh-Hant.json | 6 +-- .../components/flume/.translations/ca.json | 6 +-- .../components/flume/.translations/de.json | 6 +-- .../components/flume/.translations/en.json | 6 +-- .../components/flume/.translations/es.json | 6 +-- .../components/flume/.translations/fr.json | 6 +-- .../components/flume/.translations/nl.json | 6 +-- .../components/flume/.translations/no.json | 20 ++++++++++ .../components/flume/.translations/ru.json | 6 +-- .../flume/.translations/zh-Hant.json | 6 +-- .../flunearyou/.translations/ca.json | 6 +-- .../flunearyou/.translations/de.json | 6 +-- .../flunearyou/.translations/en.json | 6 +-- .../flunearyou/.translations/es.json | 6 +-- .../flunearyou/.translations/ko.json | 6 +-- .../flunearyou/.translations/lb.json | 6 +-- .../flunearyou/.translations/ru.json | 6 +-- .../flunearyou/.translations/zh-Hant.json | 6 +-- .../components/freebox/.translations/ca.json | 6 +-- .../components/freebox/.translations/de.json | 6 +-- .../components/freebox/.translations/en.json | 6 +-- .../components/freebox/.translations/es.json | 6 +-- .../components/freebox/.translations/fr.json | 6 +-- .../components/freebox/.translations/it.json | 6 +-- .../components/freebox/.translations/ko.json | 6 +-- .../components/freebox/.translations/lb.json | 6 +-- .../components/freebox/.translations/no.json | 6 +-- .../components/freebox/.translations/pl.json | 8 ++-- .../components/freebox/.translations/ru.json | 6 +-- .../components/freebox/.translations/sl.json | 6 +-- .../freebox/.translations/zh-Hant.json | 6 +-- .../garmin_connect/.translations/ca.json | 6 +-- .../garmin_connect/.translations/cs.json | 6 +-- .../garmin_connect/.translations/da.json | 6 +-- .../garmin_connect/.translations/de.json | 6 +-- .../garmin_connect/.translations/en.json | 6 +-- .../garmin_connect/.translations/es.json | 6 +-- .../garmin_connect/.translations/fr.json | 6 +-- .../garmin_connect/.translations/hu.json | 6 +-- .../garmin_connect/.translations/it.json | 6 +-- .../garmin_connect/.translations/ko.json | 6 +-- .../garmin_connect/.translations/lb.json | 6 +-- .../garmin_connect/.translations/nl.json | 6 +-- .../garmin_connect/.translations/no.json | 6 +-- .../garmin_connect/.translations/pl.json | 6 +-- .../garmin_connect/.translations/ru.json | 6 +-- .../garmin_connect/.translations/sl.json | 6 +-- .../garmin_connect/.translations/sv.json | 6 +-- .../garmin_connect/.translations/zh-Hant.json | 6 +-- .../components/gdacs/.translations/ca.json | 6 +-- .../components/gdacs/.translations/da.json | 6 +-- .../components/gdacs/.translations/de.json | 6 +-- .../components/gdacs/.translations/en.json | 6 +-- .../components/gdacs/.translations/es.json | 6 +-- .../components/gdacs/.translations/fr.json | 6 +-- .../components/gdacs/.translations/hu.json | 6 +-- .../components/gdacs/.translations/it.json | 6 +-- .../components/gdacs/.translations/ko.json | 6 +-- .../components/gdacs/.translations/lb.json | 6 +-- .../components/gdacs/.translations/nl.json | 6 +-- .../components/gdacs/.translations/no.json | 6 +-- .../components/gdacs/.translations/pl.json | 6 +-- .../components/gdacs/.translations/ru.json | 6 +-- .../components/gdacs/.translations/sl.json | 6 +-- .../components/gdacs/.translations/sv.json | 6 +-- .../gdacs/.translations/zh-Hant.json | 6 +-- .../components/geofency/.translations/bg.json | 6 +-- .../components/geofency/.translations/ca.json | 6 +-- .../components/geofency/.translations/cs.json | 6 +-- .../components/geofency/.translations/da.json | 6 +-- .../components/geofency/.translations/de.json | 6 +-- .../components/geofency/.translations/en.json | 6 +-- .../geofency/.translations/es-419.json | 6 +-- .../components/geofency/.translations/es.json | 6 +-- .../components/geofency/.translations/fr.json | 6 +-- .../components/geofency/.translations/hu.json | 6 +-- .../components/geofency/.translations/it.json | 6 +-- .../components/geofency/.translations/ko.json | 6 +-- .../components/geofency/.translations/lb.json | 6 +-- .../components/geofency/.translations/nl.json | 6 +-- .../components/geofency/.translations/no.json | 6 +-- .../components/geofency/.translations/pl.json | 6 +-- .../geofency/.translations/pt-BR.json | 6 +-- .../components/geofency/.translations/pt.json | 6 +-- .../components/geofency/.translations/ru.json | 6 +-- .../components/geofency/.translations/sl.json | 6 +-- .../components/geofency/.translations/sv.json | 6 +-- .../geofency/.translations/zh-Hans.json | 6 +-- .../geofency/.translations/zh-Hant.json | 6 +-- .../geonetnz_quakes/.translations/bg.json | 6 +-- .../geonetnz_quakes/.translations/ca.json | 6 +-- .../geonetnz_quakes/.translations/da.json | 6 +-- .../geonetnz_quakes/.translations/de.json | 6 +-- .../geonetnz_quakes/.translations/en.json | 6 +-- .../geonetnz_quakes/.translations/es.json | 6 +-- .../geonetnz_quakes/.translations/fr.json | 6 +-- .../geonetnz_quakes/.translations/it.json | 6 +-- .../geonetnz_quakes/.translations/ko.json | 6 +-- .../geonetnz_quakes/.translations/lb.json | 6 +-- .../geonetnz_quakes/.translations/nl.json | 6 +-- .../geonetnz_quakes/.translations/no.json | 6 +-- .../geonetnz_quakes/.translations/pl.json | 6 +-- .../geonetnz_quakes/.translations/pt-BR.json | 6 +-- .../geonetnz_quakes/.translations/ru.json | 6 +-- .../geonetnz_quakes/.translations/sl.json | 6 +-- .../geonetnz_quakes/.translations/sv.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../geonetnz_volcano/.translations/bg.json | 6 +-- .../geonetnz_volcano/.translations/ca.json | 6 +-- .../geonetnz_volcano/.translations/da.json | 6 +-- .../geonetnz_volcano/.translations/de.json | 6 +-- .../geonetnz_volcano/.translations/en.json | 6 +-- .../geonetnz_volcano/.translations/es.json | 6 +-- .../geonetnz_volcano/.translations/fr.json | 6 +-- .../geonetnz_volcano/.translations/hu.json | 6 +-- .../geonetnz_volcano/.translations/it.json | 6 +-- .../geonetnz_volcano/.translations/ko.json | 6 +-- .../geonetnz_volcano/.translations/lb.json | 6 +-- .../geonetnz_volcano/.translations/nl.json | 6 +-- .../geonetnz_volcano/.translations/no.json | 6 +-- .../geonetnz_volcano/.translations/pl.json | 6 +-- .../geonetnz_volcano/.translations/ro.json | 6 +-- .../geonetnz_volcano/.translations/ru.json | 6 +-- .../geonetnz_volcano/.translations/sl.json | 6 +-- .../geonetnz_volcano/.translations/sv.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../components/gios/.translations/ca.json | 6 +-- .../components/gios/.translations/da.json | 6 +-- .../components/gios/.translations/de.json | 6 +-- .../components/gios/.translations/en.json | 6 +-- .../components/gios/.translations/es.json | 6 +-- .../components/gios/.translations/fr.json | 6 +-- .../components/gios/.translations/hu.json | 6 +-- .../components/gios/.translations/it.json | 6 +-- .../components/gios/.translations/ko.json | 6 +-- .../components/gios/.translations/lb.json | 6 +-- .../components/gios/.translations/nl.json | 6 +-- .../components/gios/.translations/no.json | 6 +-- .../components/gios/.translations/pl.json | 6 +-- .../components/gios/.translations/ru.json | 6 +-- .../components/gios/.translations/sl.json | 6 +-- .../components/gios/.translations/sv.json | 6 +-- .../gios/.translations/zh-Hant.json | 6 +-- .../components/glances/.translations/bg.json | 6 +-- .../components/glances/.translations/ca.json | 6 +-- .../components/glances/.translations/da.json | 6 +-- .../components/glances/.translations/de.json | 6 +-- .../components/glances/.translations/en.json | 6 +-- .../components/glances/.translations/es.json | 6 +-- .../components/glances/.translations/fr.json | 6 +-- .../components/glances/.translations/hu.json | 6 +-- .../components/glances/.translations/it.json | 6 +-- .../components/glances/.translations/ko.json | 6 +-- .../components/glances/.translations/lb.json | 6 +-- .../components/glances/.translations/nl.json | 6 +-- .../components/glances/.translations/nn.json | 4 +- .../components/glances/.translations/no.json | 6 +-- .../components/glances/.translations/pl.json | 6 +-- .../components/glances/.translations/ru.json | 6 +-- .../components/glances/.translations/sl.json | 6 +-- .../components/glances/.translations/sv.json | 6 +-- .../glances/.translations/zh-Hant.json | 6 +-- .../gpslogger/.translations/bg.json | 6 +-- .../gpslogger/.translations/ca.json | 6 +-- .../gpslogger/.translations/cs.json | 6 +-- .../gpslogger/.translations/da.json | 6 +-- .../gpslogger/.translations/de.json | 6 +-- .../gpslogger/.translations/en.json | 6 +-- .../gpslogger/.translations/es-419.json | 6 +-- .../gpslogger/.translations/es.json | 6 +-- .../gpslogger/.translations/fr.json | 6 +-- .../gpslogger/.translations/hu.json | 6 +-- .../gpslogger/.translations/it.json | 6 +-- .../gpslogger/.translations/ko.json | 6 +-- .../gpslogger/.translations/lb.json | 6 +-- .../gpslogger/.translations/nl.json | 6 +-- .../gpslogger/.translations/no.json | 6 +-- .../gpslogger/.translations/pl.json | 6 +-- .../gpslogger/.translations/pt-BR.json | 6 +-- .../gpslogger/.translations/pt.json | 6 +-- .../gpslogger/.translations/ru.json | 6 +-- .../gpslogger/.translations/sl.json | 6 +-- .../gpslogger/.translations/sv.json | 6 +-- .../gpslogger/.translations/zh-Hans.json | 6 +-- .../gpslogger/.translations/zh-Hant.json | 6 +-- .../components/griddy/.translations/ca.json | 6 +-- .../components/griddy/.translations/da.json | 4 +- .../components/griddy/.translations/de.json | 6 +-- .../components/griddy/.translations/en.json | 6 +-- .../components/griddy/.translations/es.json | 6 +-- .../components/griddy/.translations/fr.json | 6 +-- .../components/griddy/.translations/it.json | 6 +-- .../components/griddy/.translations/ko.json | 6 +-- .../components/griddy/.translations/lb.json | 6 +-- .../components/griddy/.translations/no.json | 6 +-- .../components/griddy/.translations/pl.json | 6 +-- .../components/griddy/.translations/ru.json | 6 +-- .../components/griddy/.translations/sl.json | 6 +-- .../griddy/.translations/zh-Hant.json | 6 +-- .../components/hangouts/.translations/bg.json | 6 +-- .../components/hangouts/.translations/ca.json | 6 +-- .../components/hangouts/.translations/cs.json | 6 +-- .../components/hangouts/.translations/da.json | 6 +-- .../components/hangouts/.translations/de.json | 6 +-- .../components/hangouts/.translations/en.json | 6 +-- .../hangouts/.translations/es-419.json | 6 +-- .../components/hangouts/.translations/es.json | 6 +-- .../components/hangouts/.translations/et.json | 6 +-- .../components/hangouts/.translations/fr.json | 6 +-- .../components/hangouts/.translations/he.json | 6 +-- .../components/hangouts/.translations/hu.json | 6 +-- .../components/hangouts/.translations/id.json | 6 +-- .../components/hangouts/.translations/it.json | 6 +-- .../components/hangouts/.translations/ko.json | 6 +-- .../components/hangouts/.translations/lb.json | 6 +-- .../components/hangouts/.translations/nl.json | 6 +-- .../components/hangouts/.translations/nn.json | 6 +-- .../components/hangouts/.translations/no.json | 6 +-- .../components/hangouts/.translations/pl.json | 6 +-- .../hangouts/.translations/pt-BR.json | 6 +-- .../components/hangouts/.translations/pt.json | 6 +-- .../components/hangouts/.translations/ro.json | 6 +-- .../components/hangouts/.translations/ru.json | 6 +-- .../components/hangouts/.translations/sl.json | 6 +-- .../components/hangouts/.translations/sv.json | 6 +-- .../hangouts/.translations/zh-Hans.json | 6 +-- .../hangouts/.translations/zh-Hant.json | 6 +-- .../components/harmony/.translations/ca.json | 6 +-- .../components/harmony/.translations/de.json | 6 +-- .../components/harmony/.translations/en.json | 6 +-- .../components/harmony/.translations/es.json | 6 +-- .../components/harmony/.translations/fr.json | 6 +-- .../components/harmony/.translations/it.json | 6 +-- .../components/harmony/.translations/ko.json | 6 +-- .../components/harmony/.translations/lb.json | 6 +-- .../components/harmony/.translations/no.json | 6 +-- .../components/harmony/.translations/pl.json | 6 +-- .../components/harmony/.translations/ru.json | 6 +-- .../harmony/.translations/zh-Hant.json | 6 +-- .../components/heos/.translations/bg.json | 6 +-- .../components/heos/.translations/ca.json | 6 +-- .../components/heos/.translations/cs.json | 4 +- .../components/heos/.translations/da.json | 6 +-- .../components/heos/.translations/de.json | 6 +-- .../components/heos/.translations/en.json | 6 +-- .../components/heos/.translations/es-419.json | 6 +-- .../components/heos/.translations/es.json | 6 +-- .../components/heos/.translations/fr.json | 6 +-- .../components/heos/.translations/hu.json | 6 +-- .../components/heos/.translations/it.json | 6 +-- .../components/heos/.translations/ko.json | 6 +-- .../components/heos/.translations/lb.json | 6 +-- .../components/heos/.translations/nl.json | 6 +-- .../components/heos/.translations/nn.json | 6 +-- .../components/heos/.translations/no.json | 6 +-- .../components/heos/.translations/pl.json | 6 +-- .../components/heos/.translations/pt-BR.json | 6 +-- .../components/heos/.translations/pt.json | 6 +-- .../components/heos/.translations/ru.json | 6 +-- .../components/heos/.translations/sl.json | 6 +-- .../components/heos/.translations/sv.json | 6 +-- .../heos/.translations/zh-Hant.json | 6 +-- .../hisense_aehw4a1/.translations/bg.json | 6 +-- .../hisense_aehw4a1/.translations/ca.json | 6 +-- .../hisense_aehw4a1/.translations/da.json | 6 +-- .../hisense_aehw4a1/.translations/de.json | 6 +-- .../hisense_aehw4a1/.translations/en.json | 6 +-- .../hisense_aehw4a1/.translations/es.json | 6 +-- .../hisense_aehw4a1/.translations/fr.json | 6 +-- .../hisense_aehw4a1/.translations/hu.json | 6 +-- .../hisense_aehw4a1/.translations/it.json | 6 +-- .../hisense_aehw4a1/.translations/ko.json | 6 +-- .../hisense_aehw4a1/.translations/lb.json | 6 +-- .../hisense_aehw4a1/.translations/nl.json | 6 +-- .../hisense_aehw4a1/.translations/no.json | 6 +-- .../hisense_aehw4a1/.translations/pl.json | 6 +-- .../hisense_aehw4a1/.translations/ru.json | 6 +-- .../hisense_aehw4a1/.translations/sl.json | 6 +-- .../hisense_aehw4a1/.translations/sv.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../homekit_controller/.translations/bg.json | 6 +-- .../homekit_controller/.translations/ca.json | 6 +-- .../homekit_controller/.translations/cy.json | 6 +-- .../homekit_controller/.translations/da.json | 6 +-- .../homekit_controller/.translations/de.json | 6 +-- .../homekit_controller/.translations/en.json | 6 +-- .../.translations/es-419.json | 6 +-- .../homekit_controller/.translations/es.json | 6 +-- .../homekit_controller/.translations/fr.json | 6 +-- .../homekit_controller/.translations/hu.json | 6 +-- .../homekit_controller/.translations/it.json | 6 +-- .../homekit_controller/.translations/ko.json | 6 +-- .../homekit_controller/.translations/lb.json | 6 +-- .../homekit_controller/.translations/nl.json | 6 +-- .../homekit_controller/.translations/nn.json | 6 +-- .../homekit_controller/.translations/no.json | 6 +-- .../homekit_controller/.translations/pl.json | 6 +-- .../.translations/pt-BR.json | 6 +-- .../homekit_controller/.translations/ru.json | 6 +-- .../homekit_controller/.translations/sl.json | 6 +-- .../homekit_controller/.translations/sv.json | 6 +-- .../homekit_controller/.translations/th.json | 6 +-- .../homekit_controller/.translations/vi.json | 6 +-- .../.translations/zh-Hans.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../homematicip_cloud/.translations/bg.json | 6 +-- .../homematicip_cloud/.translations/ca.json | 6 +-- .../homematicip_cloud/.translations/cs.json | 6 +-- .../homematicip_cloud/.translations/da.json | 6 +-- .../homematicip_cloud/.translations/de.json | 6 +-- .../homematicip_cloud/.translations/en.json | 6 +-- .../.translations/es-419.json | 6 +-- .../homematicip_cloud/.translations/es.json | 6 +-- .../homematicip_cloud/.translations/et.json | 6 +-- .../homematicip_cloud/.translations/fr.json | 6 +-- .../homematicip_cloud/.translations/he.json | 6 +-- .../homematicip_cloud/.translations/hu.json | 6 +-- .../homematicip_cloud/.translations/id.json | 6 +-- .../homematicip_cloud/.translations/it.json | 6 +-- .../homematicip_cloud/.translations/ko.json | 6 +-- .../homematicip_cloud/.translations/lb.json | 6 +-- .../homematicip_cloud/.translations/nl.json | 6 +-- .../homematicip_cloud/.translations/nn.json | 6 +-- .../homematicip_cloud/.translations/no.json | 6 +-- .../homematicip_cloud/.translations/pl.json | 6 +-- .../.translations/pt-BR.json | 6 +-- .../homematicip_cloud/.translations/pt.json | 6 +-- .../homematicip_cloud/.translations/ru.json | 6 +-- .../homematicip_cloud/.translations/sl.json | 6 +-- .../homematicip_cloud/.translations/sv.json | 6 +-- .../.translations/zh-Hans.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../huawei_lte/.translations/bg.json | 6 +-- .../huawei_lte/.translations/ca.json | 6 +-- .../huawei_lte/.translations/cs.json | 6 +-- .../huawei_lte/.translations/da.json | 6 +-- .../huawei_lte/.translations/de.json | 6 +-- .../huawei_lte/.translations/en.json | 6 +-- .../huawei_lte/.translations/es.json | 6 +-- .../huawei_lte/.translations/fr.json | 6 +-- .../huawei_lte/.translations/hu.json | 6 +-- .../huawei_lte/.translations/it.json | 6 +-- .../huawei_lte/.translations/ko.json | 6 +-- .../huawei_lte/.translations/lb.json | 6 +-- .../huawei_lte/.translations/nl.json | 6 +-- .../huawei_lte/.translations/nn.json | 4 +- .../huawei_lte/.translations/no.json | 6 +-- .../huawei_lte/.translations/pl.json | 6 +-- .../huawei_lte/.translations/pt.json | 6 +-- .../huawei_lte/.translations/ru.json | 6 +-- .../huawei_lte/.translations/sl.json | 6 +-- .../huawei_lte/.translations/sv.json | 6 +-- .../huawei_lte/.translations/zh-Hant.json | 6 +-- .../components/hue/.translations/bg.json | 6 +-- .../components/hue/.translations/ca.json | 6 +-- .../components/hue/.translations/cs.json | 6 +-- .../components/hue/.translations/cy.json | 6 +-- .../components/hue/.translations/da.json | 6 +-- .../components/hue/.translations/de.json | 6 +-- .../components/hue/.translations/en.json | 6 +-- .../components/hue/.translations/es-419.json | 6 +-- .../components/hue/.translations/es.json | 6 +-- .../components/hue/.translations/et.json | 6 +-- .../components/hue/.translations/fr.json | 6 +-- .../components/hue/.translations/he.json | 6 +-- .../components/hue/.translations/hr.json | 6 +-- .../components/hue/.translations/hu.json | 6 +-- .../components/hue/.translations/id.json | 6 +-- .../components/hue/.translations/it.json | 6 +-- .../components/hue/.translations/ja.json | 6 +-- .../components/hue/.translations/ko.json | 6 +-- .../components/hue/.translations/lb.json | 6 +-- .../components/hue/.translations/nl.json | 6 +-- .../components/hue/.translations/nn.json | 6 +-- .../components/hue/.translations/no.json | 6 +-- .../components/hue/.translations/pl.json | 6 +-- .../components/hue/.translations/pt-BR.json | 6 +-- .../components/hue/.translations/pt.json | 6 +-- .../components/hue/.translations/ro.json | 6 +-- .../components/hue/.translations/ru.json | 6 +-- .../components/hue/.translations/sl.json | 6 +-- .../components/hue/.translations/sv.json | 6 +-- .../components/hue/.translations/th.json | 6 +-- .../components/hue/.translations/zh-Hans.json | 6 +-- .../components/hue/.translations/zh-Hant.json | 6 +-- .../iaqualink/.translations/bg.json | 6 +-- .../iaqualink/.translations/ca.json | 6 +-- .../iaqualink/.translations/da.json | 6 +-- .../iaqualink/.translations/de.json | 6 +-- .../iaqualink/.translations/en.json | 6 +-- .../iaqualink/.translations/es.json | 6 +-- .../iaqualink/.translations/fr.json | 6 +-- .../iaqualink/.translations/it.json | 6 +-- .../iaqualink/.translations/ko.json | 6 +-- .../iaqualink/.translations/lb.json | 6 +-- .../iaqualink/.translations/nl.json | 6 +-- .../iaqualink/.translations/nn.json | 4 +- .../iaqualink/.translations/no.json | 6 +-- .../iaqualink/.translations/pl.json | 6 +-- .../iaqualink/.translations/ru.json | 6 +-- .../iaqualink/.translations/sl.json | 6 +-- .../iaqualink/.translations/sv.json | 6 +-- .../iaqualink/.translations/zh-Hant.json | 6 +-- .../components/icloud/.translations/ca.json | 6 +-- .../components/icloud/.translations/da.json | 6 +-- .../components/icloud/.translations/de.json | 6 +-- .../components/icloud/.translations/en.json | 6 +-- .../components/icloud/.translations/es.json | 6 +-- .../components/icloud/.translations/fr.json | 6 +-- .../components/icloud/.translations/hu.json | 6 +-- .../components/icloud/.translations/it.json | 6 +-- .../components/icloud/.translations/ko.json | 6 +-- .../components/icloud/.translations/lb.json | 6 +-- .../components/icloud/.translations/lv.json | 6 +-- .../components/icloud/.translations/nl.json | 6 +-- .../components/icloud/.translations/no.json | 6 +-- .../components/icloud/.translations/pl.json | 6 +-- .../icloud/.translations/pt-BR.json | 6 +-- .../components/icloud/.translations/ru.json | 6 +-- .../components/icloud/.translations/sl.json | 6 +-- .../components/icloud/.translations/sv.json | 6 +-- .../icloud/.translations/zh-Hans.json | 6 +-- .../icloud/.translations/zh-Hant.json | 6 +-- .../components/ifttt/.translations/bg.json | 6 +-- .../components/ifttt/.translations/ca.json | 6 +-- .../components/ifttt/.translations/cs.json | 6 +-- .../components/ifttt/.translations/da.json | 6 +-- .../components/ifttt/.translations/de.json | 6 +-- .../components/ifttt/.translations/en.json | 6 +-- .../ifttt/.translations/es-419.json | 6 +-- .../components/ifttt/.translations/es.json | 6 +-- .../components/ifttt/.translations/et.json | 4 +- .../components/ifttt/.translations/fr.json | 6 +-- .../components/ifttt/.translations/hr.json | 4 +- .../components/ifttt/.translations/hu.json | 6 +-- .../components/ifttt/.translations/it.json | 6 +-- .../components/ifttt/.translations/ko.json | 6 +-- .../components/ifttt/.translations/lb.json | 6 +-- .../components/ifttt/.translations/nl.json | 6 +-- .../components/ifttt/.translations/nn.json | 6 +-- .../components/ifttt/.translations/no.json | 6 +-- .../components/ifttt/.translations/pl.json | 6 +-- .../components/ifttt/.translations/pt-BR.json | 6 +-- .../components/ifttt/.translations/pt.json | 6 +-- .../components/ifttt/.translations/ro.json | 6 +-- .../components/ifttt/.translations/ru.json | 6 +-- .../components/ifttt/.translations/sl.json | 6 +-- .../components/ifttt/.translations/sv.json | 6 +-- .../components/ifttt/.translations/th.json | 4 +- .../components/ifttt/.translations/tr.json | 4 +- .../ifttt/.translations/zh-Hans.json | 6 +-- .../ifttt/.translations/zh-Hant.json | 6 +-- .../components/ios/.translations/bg.json | 6 +-- .../components/ios/.translations/ca.json | 6 +-- .../components/ios/.translations/cs.json | 6 +-- .../components/ios/.translations/da.json | 6 +-- .../components/ios/.translations/de.json | 6 +-- .../components/ios/.translations/en.json | 6 +-- .../components/ios/.translations/es-419.json | 6 +-- .../components/ios/.translations/es.json | 6 +-- .../components/ios/.translations/et.json | 6 +-- .../components/ios/.translations/fr.json | 6 +-- .../components/ios/.translations/he.json | 6 +-- .../components/ios/.translations/hu.json | 6 +-- .../components/ios/.translations/id.json | 6 +-- .../components/ios/.translations/it.json | 6 +-- .../components/ios/.translations/ko.json | 6 +-- .../components/ios/.translations/lb.json | 6 +-- .../components/ios/.translations/nl.json | 6 +-- .../components/ios/.translations/nn.json | 6 +-- .../components/ios/.translations/no.json | 6 +-- .../components/ios/.translations/pl.json | 6 +-- .../components/ios/.translations/pt-BR.json | 6 +-- .../components/ios/.translations/pt.json | 6 +-- .../components/ios/.translations/ro.json | 6 +-- .../components/ios/.translations/ru.json | 6 +-- .../components/ios/.translations/sl.json | 6 +-- .../components/ios/.translations/sv.json | 6 +-- .../components/ios/.translations/zh-Hans.json | 6 +-- .../components/ios/.translations/zh-Hant.json | 6 +-- .../components/ipma/.translations/bg.json | 6 +-- .../components/ipma/.translations/ca.json | 6 +-- .../components/ipma/.translations/da.json | 6 +-- .../components/ipma/.translations/de.json | 6 +-- .../components/ipma/.translations/en.json | 6 +-- .../components/ipma/.translations/es-419.json | 6 +-- .../components/ipma/.translations/es.json | 6 +-- .../components/ipma/.translations/fr.json | 6 +-- .../components/ipma/.translations/he.json | 6 +-- .../components/ipma/.translations/hu.json | 6 +-- .../components/ipma/.translations/it.json | 6 +-- .../components/ipma/.translations/ko.json | 6 +-- .../components/ipma/.translations/lb.json | 6 +-- .../components/ipma/.translations/nl.json | 6 +-- .../components/ipma/.translations/no.json | 6 +-- .../components/ipma/.translations/pl.json | 6 +-- .../components/ipma/.translations/pt-BR.json | 6 +-- .../components/ipma/.translations/pt.json | 6 +-- .../components/ipma/.translations/ru.json | 6 +-- .../components/ipma/.translations/sl.json | 6 +-- .../components/ipma/.translations/sv.json | 6 +-- .../ipma/.translations/zh-Hans.json | 6 +-- .../ipma/.translations/zh-Hant.json | 6 +-- .../components/ipp/.translations/ca.json | 6 +-- .../components/ipp/.translations/da.json | 6 +-- .../components/ipp/.translations/de.json | 6 +-- .../components/ipp/.translations/en.json | 6 +-- .../components/ipp/.translations/es.json | 6 +-- .../components/ipp/.translations/ko.json | 6 +-- .../components/ipp/.translations/lb.json | 6 +-- .../components/ipp/.translations/nl.json | 4 +- .../components/ipp/.translations/no.json | 10 +++-- .../components/ipp/.translations/ru.json | 6 +-- .../components/ipp/.translations/zh-Hant.json | 8 ++-- .../components/iqvia/.translations/bg.json | 6 +-- .../components/iqvia/.translations/ca.json | 6 +-- .../components/iqvia/.translations/da.json | 6 +-- .../components/iqvia/.translations/de.json | 6 +-- .../components/iqvia/.translations/en.json | 6 +-- .../components/iqvia/.translations/es.json | 6 +-- .../components/iqvia/.translations/fr.json | 6 +-- .../components/iqvia/.translations/it.json | 6 +-- .../components/iqvia/.translations/ko.json | 6 +-- .../components/iqvia/.translations/lb.json | 6 +-- .../components/iqvia/.translations/nl.json | 6 +-- .../components/iqvia/.translations/nn.json | 6 +-- .../components/iqvia/.translations/no.json | 6 +-- .../components/iqvia/.translations/pl.json | 6 +-- .../components/iqvia/.translations/pt-BR.json | 6 +-- .../components/iqvia/.translations/ru.json | 6 +-- .../components/iqvia/.translations/sl.json | 6 +-- .../components/iqvia/.translations/sv.json | 6 +-- .../iqvia/.translations/zh-Hans.json | 6 +-- .../iqvia/.translations/zh-Hant.json | 6 +-- .../components/izone/.translations/bg.json | 6 +-- .../components/izone/.translations/ca.json | 6 +-- .../components/izone/.translations/da.json | 6 +-- .../components/izone/.translations/de.json | 6 +-- .../components/izone/.translations/en.json | 6 +-- .../components/izone/.translations/es.json | 6 +-- .../components/izone/.translations/fr.json | 6 +-- .../components/izone/.translations/hu.json | 6 +-- .../components/izone/.translations/it.json | 6 +-- .../components/izone/.translations/ko.json | 6 +-- .../components/izone/.translations/lb.json | 6 +-- .../components/izone/.translations/nl.json | 6 +-- .../components/izone/.translations/nn.json | 6 +-- .../components/izone/.translations/no.json | 6 +-- .../components/izone/.translations/pl.json | 6 +-- .../components/izone/.translations/ru.json | 6 +-- .../components/izone/.translations/sl.json | 6 +-- .../components/izone/.translations/sv.json | 6 +-- .../izone/.translations/zh-Hant.json | 6 +-- .../konnected/.translations/ca.json | 6 +-- .../konnected/.translations/da.json | 6 +-- .../konnected/.translations/de.json | 6 +-- .../konnected/.translations/en.json | 6 +-- .../konnected/.translations/es.json | 6 +-- .../konnected/.translations/fr.json | 6 +-- .../konnected/.translations/it.json | 6 +-- .../konnected/.translations/ko.json | 6 +-- .../konnected/.translations/lb.json | 6 +-- .../konnected/.translations/nl.json | 6 +-- .../konnected/.translations/no.json | 6 +-- .../konnected/.translations/pl.json | 6 +-- .../konnected/.translations/ru.json | 6 +-- .../konnected/.translations/sl.json | 6 +-- .../konnected/.translations/sv.json | 6 +-- .../konnected/.translations/zh-Hant.json | 6 +-- .../components/life360/.translations/bg.json | 6 +-- .../components/life360/.translations/ca.json | 6 +-- .../components/life360/.translations/da.json | 6 +-- .../components/life360/.translations/de.json | 6 +-- .../components/life360/.translations/en.json | 6 +-- .../life360/.translations/es-419.json | 6 +-- .../components/life360/.translations/es.json | 6 +-- .../components/life360/.translations/fr.json | 6 +-- .../components/life360/.translations/it.json | 6 +-- .../components/life360/.translations/ko.json | 6 +-- .../components/life360/.translations/lb.json | 6 +-- .../components/life360/.translations/nl.json | 6 +-- .../components/life360/.translations/nn.json | 6 +-- .../components/life360/.translations/no.json | 6 +-- .../components/life360/.translations/pl.json | 6 +-- .../life360/.translations/pt-BR.json | 6 +-- .../components/life360/.translations/ru.json | 6 +-- .../components/life360/.translations/sl.json | 6 +-- .../components/life360/.translations/sv.json | 6 +-- .../life360/.translations/zh-Hant.json | 6 +-- .../components/lifx/.translations/bg.json | 6 +-- .../components/lifx/.translations/ca.json | 6 +-- .../components/lifx/.translations/cs.json | 6 +-- .../components/lifx/.translations/da.json | 6 +-- .../components/lifx/.translations/de.json | 6 +-- .../components/lifx/.translations/en.json | 6 +-- .../components/lifx/.translations/es-419.json | 6 +-- .../components/lifx/.translations/es.json | 6 +-- .../components/lifx/.translations/fr.json | 6 +-- .../components/lifx/.translations/hu.json | 6 +-- .../components/lifx/.translations/it.json | 6 +-- .../components/lifx/.translations/ko.json | 6 +-- .../components/lifx/.translations/lb.json | 6 +-- .../components/lifx/.translations/nl.json | 6 +-- .../components/lifx/.translations/nn.json | 6 +-- .../components/lifx/.translations/no.json | 6 +-- .../components/lifx/.translations/pl.json | 6 +-- .../components/lifx/.translations/pt-BR.json | 6 +-- .../components/lifx/.translations/pt.json | 6 +-- .../components/lifx/.translations/ro.json | 6 +-- .../components/lifx/.translations/ru.json | 6 +-- .../components/lifx/.translations/sl.json | 6 +-- .../components/lifx/.translations/sv.json | 6 +-- .../lifx/.translations/zh-Hans.json | 6 +-- .../lifx/.translations/zh-Hant.json | 6 +-- .../components/light/.translations/no.json | 1 + .../components/linky/.translations/bg.json | 6 +-- .../components/linky/.translations/ca.json | 6 +-- .../components/linky/.translations/da.json | 6 +-- .../components/linky/.translations/de.json | 6 +-- .../components/linky/.translations/en.json | 6 +-- .../linky/.translations/es-419.json | 6 +-- .../components/linky/.translations/es.json | 6 +-- .../components/linky/.translations/fr.json | 6 +-- .../components/linky/.translations/it.json | 6 +-- .../components/linky/.translations/ko.json | 6 +-- .../components/linky/.translations/lb.json | 6 +-- .../components/linky/.translations/nl.json | 6 +-- .../components/linky/.translations/nn.json | 6 +-- .../components/linky/.translations/no.json | 6 +-- .../components/linky/.translations/pl.json | 6 +-- .../components/linky/.translations/pt-BR.json | 6 +-- .../components/linky/.translations/ru.json | 6 +-- .../components/linky/.translations/sl.json | 6 +-- .../components/linky/.translations/sv.json | 6 +-- .../linky/.translations/zh-Hant.json | 6 +-- .../components/local_ip/.translations/ca.json | 6 +-- .../components/local_ip/.translations/da.json | 6 +-- .../components/local_ip/.translations/de.json | 6 +-- .../components/local_ip/.translations/en.json | 6 +-- .../components/local_ip/.translations/es.json | 6 +-- .../components/local_ip/.translations/fr.json | 6 +-- .../components/local_ip/.translations/hu.json | 6 +-- .../components/local_ip/.translations/it.json | 6 +-- .../components/local_ip/.translations/ko.json | 6 +-- .../components/local_ip/.translations/lb.json | 6 +-- .../components/local_ip/.translations/nl.json | 6 +-- .../components/local_ip/.translations/no.json | 9 +++-- .../components/local_ip/.translations/pl.json | 6 +-- .../local_ip/.translations/pt-BR.json | 6 +-- .../components/local_ip/.translations/ru.json | 6 +-- .../components/local_ip/.translations/sl.json | 6 +-- .../components/local_ip/.translations/sv.json | 6 +-- .../local_ip/.translations/zh-Hant.json | 6 +-- .../components/locative/.translations/bg.json | 6 +-- .../components/locative/.translations/ca.json | 6 +-- .../components/locative/.translations/cs.json | 6 +-- .../components/locative/.translations/da.json | 6 +-- .../components/locative/.translations/de.json | 6 +-- .../components/locative/.translations/en.json | 6 +-- .../locative/.translations/es-419.json | 6 +-- .../components/locative/.translations/es.json | 6 +-- .../components/locative/.translations/fr.json | 6 +-- .../components/locative/.translations/hu.json | 6 +-- .../components/locative/.translations/it.json | 6 +-- .../components/locative/.translations/ko.json | 6 +-- .../components/locative/.translations/lb.json | 6 +-- .../components/locative/.translations/nl.json | 6 +-- .../components/locative/.translations/no.json | 6 +-- .../components/locative/.translations/pl.json | 6 +-- .../locative/.translations/pt-BR.json | 6 +-- .../components/locative/.translations/pt.json | 6 +-- .../components/locative/.translations/ru.json | 6 +-- .../components/locative/.translations/sl.json | 6 +-- .../components/locative/.translations/sv.json | 6 +-- .../locative/.translations/zh-Hans.json | 6 +-- .../locative/.translations/zh-Hant.json | 6 +-- .../logi_circle/.translations/bg.json | 6 +-- .../logi_circle/.translations/ca.json | 6 +-- .../logi_circle/.translations/da.json | 6 +-- .../logi_circle/.translations/de.json | 6 +-- .../logi_circle/.translations/en.json | 6 +-- .../logi_circle/.translations/es-419.json | 6 +-- .../logi_circle/.translations/es.json | 6 +-- .../logi_circle/.translations/fr.json | 6 +-- .../logi_circle/.translations/it.json | 6 +-- .../logi_circle/.translations/ko.json | 6 +-- .../logi_circle/.translations/lb.json | 6 +-- .../logi_circle/.translations/nl.json | 6 +-- .../logi_circle/.translations/nn.json | 6 +-- .../logi_circle/.translations/no.json | 6 +-- .../logi_circle/.translations/pl.json | 10 ++--- .../logi_circle/.translations/pt-BR.json | 6 +-- .../logi_circle/.translations/ru.json | 6 +-- .../logi_circle/.translations/sl.json | 6 +-- .../logi_circle/.translations/sv.json | 6 +-- .../logi_circle/.translations/zh-Hant.json | 6 +-- .../luftdaten/.translations/bg.json | 6 +-- .../luftdaten/.translations/ca.json | 6 +-- .../luftdaten/.translations/cs.json | 6 +-- .../luftdaten/.translations/da.json | 6 +-- .../luftdaten/.translations/de.json | 6 +-- .../luftdaten/.translations/en.json | 6 +-- .../luftdaten/.translations/es-419.json | 6 +-- .../luftdaten/.translations/es.json | 6 +-- .../luftdaten/.translations/fr.json | 6 +-- .../luftdaten/.translations/hu.json | 6 +-- .../luftdaten/.translations/it.json | 6 +-- .../luftdaten/.translations/ko.json | 6 +-- .../luftdaten/.translations/lb.json | 6 +-- .../luftdaten/.translations/nl.json | 6 +-- .../luftdaten/.translations/nn.json | 4 +- .../luftdaten/.translations/no.json | 6 +-- .../luftdaten/.translations/pl.json | 6 +-- .../luftdaten/.translations/pt-BR.json | 6 +-- .../luftdaten/.translations/pt.json | 6 +-- .../luftdaten/.translations/ru.json | 6 +-- .../luftdaten/.translations/sl.json | 6 +-- .../luftdaten/.translations/sv.json | 6 +-- .../luftdaten/.translations/zh-Hans.json | 6 +-- .../luftdaten/.translations/zh-Hant.json | 6 +-- .../lutron_caseta/.translations/bg.json | 4 +- .../lutron_caseta/.translations/ca.json | 4 +- .../lutron_caseta/.translations/da.json | 4 +- .../lutron_caseta/.translations/de.json | 4 +- .../lutron_caseta/.translations/en.json | 4 +- .../lutron_caseta/.translations/es.json | 4 +- .../lutron_caseta/.translations/fr.json | 4 +- .../lutron_caseta/.translations/hu.json | 4 +- .../lutron_caseta/.translations/it.json | 4 +- .../lutron_caseta/.translations/ko.json | 4 +- .../lutron_caseta/.translations/lb.json | 4 +- .../lutron_caseta/.translations/nl.json | 4 +- .../lutron_caseta/.translations/no.json | 4 +- .../lutron_caseta/.translations/pl.json | 4 +- .../lutron_caseta/.translations/ru.json | 4 +- .../lutron_caseta/.translations/sl.json | 4 +- .../lutron_caseta/.translations/sv.json | 4 +- .../lutron_caseta/.translations/zh-Hant.json | 4 +- .../components/mailgun/.translations/bg.json | 6 +-- .../components/mailgun/.translations/ca.json | 6 +-- .../components/mailgun/.translations/cs.json | 6 +-- .../components/mailgun/.translations/da.json | 6 +-- .../components/mailgun/.translations/de.json | 6 +-- .../components/mailgun/.translations/en.json | 6 +-- .../mailgun/.translations/es-419.json | 6 +-- .../components/mailgun/.translations/es.json | 6 +-- .../components/mailgun/.translations/fr.json | 6 +-- .../components/mailgun/.translations/hu.json | 6 +-- .../components/mailgun/.translations/it.json | 6 +-- .../components/mailgun/.translations/ko.json | 6 +-- .../components/mailgun/.translations/lb.json | 6 +-- .../components/mailgun/.translations/nl.json | 6 +-- .../components/mailgun/.translations/nn.json | 4 +- .../components/mailgun/.translations/no.json | 6 +-- .../components/mailgun/.translations/pl.json | 6 +-- .../mailgun/.translations/pt-BR.json | 6 +-- .../components/mailgun/.translations/pt.json | 6 +-- .../components/mailgun/.translations/ru.json | 6 +-- .../components/mailgun/.translations/sl.json | 6 +-- .../components/mailgun/.translations/sv.json | 6 +-- .../mailgun/.translations/zh-Hans.json | 6 +-- .../mailgun/.translations/zh-Hant.json | 6 +-- .../components/melcloud/.translations/ca.json | 6 +-- .../components/melcloud/.translations/da.json | 6 +-- .../components/melcloud/.translations/de.json | 6 +-- .../components/melcloud/.translations/en.json | 6 +-- .../components/melcloud/.translations/es.json | 6 +-- .../components/melcloud/.translations/fr.json | 6 +-- .../components/melcloud/.translations/it.json | 6 +-- .../components/melcloud/.translations/ko.json | 6 +-- .../components/melcloud/.translations/lb.json | 6 +-- .../components/melcloud/.translations/nl.json | 6 +-- .../components/melcloud/.translations/no.json | 6 +-- .../components/melcloud/.translations/pl.json | 6 +-- .../components/melcloud/.translations/ru.json | 6 +-- .../components/melcloud/.translations/sl.json | 6 +-- .../components/melcloud/.translations/sv.json | 6 +-- .../melcloud/.translations/zh-Hant.json | 6 +-- .../components/met/.translations/bg.json | 6 +-- .../components/met/.translations/ca.json | 6 +-- .../components/met/.translations/da.json | 6 +-- .../components/met/.translations/de.json | 6 +-- .../components/met/.translations/en.json | 6 +-- .../components/met/.translations/es-419.json | 6 +-- .../components/met/.translations/es.json | 6 +-- .../components/met/.translations/fr.json | 6 +-- .../components/met/.translations/hr.json | 6 +-- .../components/met/.translations/hu.json | 6 +-- .../components/met/.translations/it.json | 6 +-- .../components/met/.translations/ko.json | 6 +-- .../components/met/.translations/lb.json | 6 +-- .../components/met/.translations/nl.json | 6 +-- .../components/met/.translations/nn.json | 6 +-- .../components/met/.translations/no.json | 6 +-- .../components/met/.translations/pl.json | 6 +-- .../components/met/.translations/pt-BR.json | 6 +-- .../components/met/.translations/ru.json | 6 +-- .../components/met/.translations/sl.json | 6 +-- .../components/met/.translations/sv.json | 6 +-- .../components/met/.translations/zh-Hant.json | 6 +-- .../meteo_france/.translations/ca.json | 6 +-- .../meteo_france/.translations/da.json | 6 +-- .../meteo_france/.translations/de.json | 6 +-- .../meteo_france/.translations/en.json | 6 +-- .../meteo_france/.translations/es.json | 6 +-- .../meteo_france/.translations/fr.json | 6 +-- .../meteo_france/.translations/hu.json | 6 +-- .../meteo_france/.translations/it.json | 6 +-- .../meteo_france/.translations/ko.json | 6 +-- .../meteo_france/.translations/lb.json | 6 +-- .../meteo_france/.translations/nl.json | 6 +-- .../meteo_france/.translations/no.json | 6 +-- .../meteo_france/.translations/pl.json | 6 +-- .../meteo_france/.translations/ru.json | 6 +-- .../meteo_france/.translations/sl.json | 6 +-- .../meteo_france/.translations/sv.json | 6 +-- .../meteo_france/.translations/zh-Hant.json | 6 +-- .../components/mikrotik/.translations/ca.json | 6 +-- .../components/mikrotik/.translations/da.json | 6 +-- .../components/mikrotik/.translations/de.json | 6 +-- .../components/mikrotik/.translations/en.json | 6 +-- .../components/mikrotik/.translations/es.json | 6 +-- .../components/mikrotik/.translations/fr.json | 6 +-- .../components/mikrotik/.translations/hu.json | 6 +-- .../components/mikrotik/.translations/it.json | 6 +-- .../components/mikrotik/.translations/ko.json | 6 +-- .../components/mikrotik/.translations/lb.json | 6 +-- .../components/mikrotik/.translations/lv.json | 6 +-- .../components/mikrotik/.translations/nl.json | 6 +-- .../components/mikrotik/.translations/no.json | 6 +-- .../components/mikrotik/.translations/pl.json | 6 +-- .../components/mikrotik/.translations/ru.json | 6 +-- .../components/mikrotik/.translations/sl.json | 6 +-- .../components/mikrotik/.translations/sv.json | 6 +-- .../mikrotik/.translations/zh-Hant.json | 6 +-- .../minecraft_server/.translations/ca.json | 6 +-- .../minecraft_server/.translations/da.json | 6 +-- .../minecraft_server/.translations/de.json | 6 +-- .../minecraft_server/.translations/en.json | 6 +-- .../minecraft_server/.translations/es.json | 6 +-- .../minecraft_server/.translations/fr.json | 6 +-- .../minecraft_server/.translations/hu.json | 6 +-- .../minecraft_server/.translations/it.json | 6 +-- .../minecraft_server/.translations/ko.json | 6 +-- .../minecraft_server/.translations/lb.json | 6 +-- .../minecraft_server/.translations/nl.json | 6 +-- .../minecraft_server/.translations/no.json | 6 +-- .../minecraft_server/.translations/pl.json | 6 +-- .../minecraft_server/.translations/ru.json | 6 +-- .../minecraft_server/.translations/sl.json | 6 +-- .../minecraft_server/.translations/sv.json | 6 +-- .../minecraft_server/.translations/tr.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../mobile_app/.translations/bg.json | 6 +-- .../mobile_app/.translations/ca.json | 6 +-- .../mobile_app/.translations/cs.json | 6 +-- .../mobile_app/.translations/da.json | 6 +-- .../mobile_app/.translations/de.json | 6 +-- .../mobile_app/.translations/en.json | 6 +-- .../mobile_app/.translations/es-419.json | 6 +-- .../mobile_app/.translations/es.json | 6 +-- .../mobile_app/.translations/fr.json | 6 +-- .../mobile_app/.translations/hu.json | 6 +-- .../mobile_app/.translations/it.json | 6 +-- .../mobile_app/.translations/ko.json | 6 +-- .../mobile_app/.translations/lb.json | 6 +-- .../mobile_app/.translations/nl.json | 6 +-- .../mobile_app/.translations/nn.json | 6 +-- .../mobile_app/.translations/no.json | 6 +-- .../mobile_app/.translations/pl.json | 6 +-- .../mobile_app/.translations/pt-BR.json | 6 +-- .../mobile_app/.translations/pt.json | 6 +-- .../mobile_app/.translations/ru.json | 6 +-- .../mobile_app/.translations/sl.json | 6 +-- .../mobile_app/.translations/sv.json | 6 +-- .../mobile_app/.translations/uk.json | 6 +-- .../mobile_app/.translations/vi.json | 6 +-- .../mobile_app/.translations/zh-Hans.json | 6 +-- .../mobile_app/.translations/zh-Hant.json | 6 +-- .../monoprice/.translations/ca.json | 6 +-- .../monoprice/.translations/de.json | 6 +-- .../monoprice/.translations/en.json | 6 +-- .../monoprice/.translations/es.json | 6 +-- .../monoprice/.translations/it.json | 6 +-- .../monoprice/.translations/ko.json | 6 +-- .../monoprice/.translations/lb.json | 6 +-- .../monoprice/.translations/no.json | 6 +-- .../monoprice/.translations/ru.json | 6 +-- .../monoprice/.translations/zh-Hant.json | 6 +-- .../components/mqtt/.translations/bg.json | 6 +-- .../components/mqtt/.translations/ca.json | 6 +-- .../components/mqtt/.translations/cs.json | 6 +-- .../components/mqtt/.translations/da.json | 6 +-- .../components/mqtt/.translations/de.json | 6 +-- .../components/mqtt/.translations/en.json | 6 +-- .../components/mqtt/.translations/es-419.json | 6 +-- .../components/mqtt/.translations/es.json | 6 +-- .../components/mqtt/.translations/et.json | 6 +-- .../components/mqtt/.translations/fr.json | 6 +-- .../components/mqtt/.translations/he.json | 6 +-- .../components/mqtt/.translations/hr.json | 6 +-- .../components/mqtt/.translations/hu.json | 6 +-- .../components/mqtt/.translations/id.json | 6 +-- .../components/mqtt/.translations/it.json | 6 +-- .../components/mqtt/.translations/ko.json | 6 +-- .../components/mqtt/.translations/lb.json | 6 +-- .../components/mqtt/.translations/nl.json | 6 +-- .../components/mqtt/.translations/nn.json | 6 +-- .../components/mqtt/.translations/no.json | 6 +-- .../components/mqtt/.translations/pl.json | 6 +-- .../components/mqtt/.translations/pt-BR.json | 6 +-- .../components/mqtt/.translations/pt.json | 6 +-- .../components/mqtt/.translations/ro.json | 6 +-- .../components/mqtt/.translations/ru.json | 6 +-- .../components/mqtt/.translations/sl.json | 6 +-- .../components/mqtt/.translations/sv.json | 6 +-- .../mqtt/.translations/zh-Hans.json | 6 +-- .../mqtt/.translations/zh-Hant.json | 6 +-- .../components/myq/.translations/ca.json | 6 +-- .../components/myq/.translations/de.json | 6 +-- .../components/myq/.translations/en.json | 6 +-- .../components/myq/.translations/es.json | 6 +-- .../components/myq/.translations/fr.json | 6 +-- .../components/myq/.translations/it.json | 6 +-- .../components/myq/.translations/ko.json | 6 +-- .../components/myq/.translations/lb.json | 6 +-- .../components/myq/.translations/no.json | 6 +-- .../components/myq/.translations/ru.json | 6 +-- .../components/myq/.translations/zh-Hant.json | 6 +-- .../components/neato/.translations/bg.json | 6 +-- .../components/neato/.translations/ca.json | 6 +-- .../components/neato/.translations/da.json | 6 +-- .../components/neato/.translations/de.json | 6 +-- .../components/neato/.translations/en.json | 6 +-- .../components/neato/.translations/es.json | 6 +-- .../components/neato/.translations/fr.json | 6 +-- .../components/neato/.translations/hu.json | 6 +-- .../components/neato/.translations/it.json | 6 +-- .../components/neato/.translations/ko.json | 6 +-- .../components/neato/.translations/lb.json | 6 +-- .../components/neato/.translations/lv.json | 6 +-- .../components/neato/.translations/nl.json | 6 +-- .../components/neato/.translations/nn.json | 6 +-- .../components/neato/.translations/no.json | 6 +-- .../components/neato/.translations/pl.json | 6 +-- .../components/neato/.translations/pt-BR.json | 4 +- .../components/neato/.translations/ru.json | 6 +-- .../components/neato/.translations/sl.json | 6 +-- .../components/neato/.translations/sv.json | 6 +-- .../neato/.translations/zh-Hant.json | 6 +-- .../components/nest/.translations/bg.json | 6 +-- .../components/nest/.translations/ca.json | 6 +-- .../components/nest/.translations/cs.json | 6 +-- .../components/nest/.translations/da.json | 6 +-- .../components/nest/.translations/de.json | 6 +-- .../components/nest/.translations/en.json | 6 +-- .../components/nest/.translations/es-419.json | 6 +-- .../components/nest/.translations/es.json | 6 +-- .../components/nest/.translations/et.json | 6 +-- .../components/nest/.translations/fr.json | 6 +-- .../components/nest/.translations/he.json | 6 +-- .../components/nest/.translations/hr.json | 6 +-- .../components/nest/.translations/hu.json | 6 +-- .../components/nest/.translations/id.json | 6 +-- .../components/nest/.translations/it.json | 6 +-- .../components/nest/.translations/ja.json | 4 +- .../components/nest/.translations/ko.json | 6 +-- .../components/nest/.translations/lb.json | 6 +-- .../components/nest/.translations/nl.json | 6 +-- .../components/nest/.translations/nn.json | 6 +-- .../components/nest/.translations/no.json | 6 +-- .../components/nest/.translations/pl.json | 6 +-- .../components/nest/.translations/pt-BR.json | 6 +-- .../components/nest/.translations/pt.json | 6 +-- .../components/nest/.translations/ro.json | 6 +-- .../components/nest/.translations/ru.json | 6 +-- .../components/nest/.translations/sl.json | 6 +-- .../components/nest/.translations/sv.json | 6 +-- .../components/nest/.translations/th.json | 6 +-- .../components/nest/.translations/vi.json | 6 +-- .../nest/.translations/zh-Hans.json | 6 +-- .../nest/.translations/zh-Hant.json | 6 +-- .../components/netatmo/.translations/ca.json | 6 +-- .../components/netatmo/.translations/da.json | 6 +-- .../components/netatmo/.translations/de.json | 6 +-- .../components/netatmo/.translations/en.json | 6 +-- .../components/netatmo/.translations/es.json | 6 +-- .../components/netatmo/.translations/fr.json | 6 +-- .../components/netatmo/.translations/hu.json | 6 +-- .../components/netatmo/.translations/it.json | 6 +-- .../components/netatmo/.translations/ko.json | 6 +-- .../components/netatmo/.translations/lb.json | 6 +-- .../components/netatmo/.translations/nl.json | 6 +-- .../components/netatmo/.translations/no.json | 6 +-- .../components/netatmo/.translations/pl.json | 6 +-- .../components/netatmo/.translations/ru.json | 6 +-- .../components/netatmo/.translations/sl.json | 6 +-- .../components/netatmo/.translations/sv.json | 6 +-- .../netatmo/.translations/zh-Hant.json | 6 +-- .../components/nexia/.translations/ca.json | 6 +-- .../components/nexia/.translations/de.json | 6 +-- .../components/nexia/.translations/en.json | 6 +-- .../components/nexia/.translations/es.json | 6 +-- .../components/nexia/.translations/fr.json | 6 +-- .../components/nexia/.translations/it.json | 6 +-- .../components/nexia/.translations/ko.json | 6 +-- .../components/nexia/.translations/lb.json | 6 +-- .../components/nexia/.translations/no.json | 6 +-- .../components/nexia/.translations/ru.json | 6 +-- .../nexia/.translations/zh-Hant.json | 6 +-- .../components/notion/.translations/bg.json | 6 +-- .../components/notion/.translations/ca.json | 6 +-- .../components/notion/.translations/cy.json | 6 +-- .../components/notion/.translations/da.json | 6 +-- .../components/notion/.translations/de.json | 6 +-- .../components/notion/.translations/en.json | 6 +-- .../notion/.translations/es-419.json | 6 +-- .../components/notion/.translations/es.json | 6 +-- .../components/notion/.translations/fr.json | 6 +-- .../components/notion/.translations/hr.json | 6 +-- .../components/notion/.translations/it.json | 6 +-- .../components/notion/.translations/ko.json | 6 +-- .../components/notion/.translations/lb.json | 6 +-- .../components/notion/.translations/nl.json | 6 +-- .../components/notion/.translations/no.json | 6 +-- .../components/notion/.translations/pl.json | 6 +-- .../notion/.translations/pt-BR.json | 6 +-- .../components/notion/.translations/ru.json | 6 +-- .../components/notion/.translations/sl.json | 6 +-- .../components/notion/.translations/sv.json | 6 +-- .../notion/.translations/zh-Hans.json | 6 +-- .../notion/.translations/zh-Hant.json | 6 +-- .../components/nuheat/.translations/ca.json | 6 +-- .../components/nuheat/.translations/de.json | 6 +-- .../components/nuheat/.translations/en.json | 6 +-- .../components/nuheat/.translations/es.json | 6 +-- .../components/nuheat/.translations/fr.json | 6 +-- .../components/nuheat/.translations/it.json | 6 +-- .../components/nuheat/.translations/ko.json | 6 +-- .../components/nuheat/.translations/lb.json | 6 +-- .../components/nuheat/.translations/no.json | 6 +-- .../components/nuheat/.translations/ru.json | 6 +-- .../nuheat/.translations/zh-Hant.json | 6 +-- .../components/nut/.translations/ca.json | 6 +-- .../components/nut/.translations/en.json | 6 +-- .../components/nut/.translations/es.json | 6 +-- .../components/nut/.translations/ko.json | 6 +-- .../components/nut/.translations/lb.json | 6 +-- .../components/nut/.translations/nl.json | 6 +-- .../components/nut/.translations/no.json | 11 +++--- .../components/nut/.translations/pl.json | 6 +-- .../components/nut/.translations/ru.json | 6 +-- .../components/nut/.translations/zh-Hant.json | 6 +-- .../opentherm_gw/.translations/bg.json | 6 +-- .../opentherm_gw/.translations/ca.json | 6 +-- .../opentherm_gw/.translations/da.json | 6 +-- .../opentherm_gw/.translations/de.json | 6 +-- .../opentherm_gw/.translations/en.json | 6 +-- .../opentherm_gw/.translations/es.json | 6 +-- .../opentherm_gw/.translations/fr.json | 6 +-- .../opentherm_gw/.translations/hu.json | 6 +-- .../opentherm_gw/.translations/it.json | 6 +-- .../opentherm_gw/.translations/ko.json | 6 +-- .../opentherm_gw/.translations/lb.json | 6 +-- .../opentherm_gw/.translations/nl.json | 6 +-- .../opentherm_gw/.translations/no.json | 6 +-- .../opentherm_gw/.translations/pl.json | 6 +-- .../opentherm_gw/.translations/ru.json | 6 +-- .../opentherm_gw/.translations/sl.json | 6 +-- .../opentherm_gw/.translations/sv.json | 6 +-- .../opentherm_gw/.translations/zh-Hant.json | 6 +-- .../components/openuv/.translations/ar.json | 4 +- .../components/openuv/.translations/bg.json | 6 +-- .../components/openuv/.translations/ca.json | 6 +-- .../components/openuv/.translations/cs.json | 6 +-- .../components/openuv/.translations/da.json | 6 +-- .../components/openuv/.translations/de.json | 6 +-- .../components/openuv/.translations/en.json | 6 +-- .../openuv/.translations/es-419.json | 6 +-- .../components/openuv/.translations/es.json | 6 +-- .../components/openuv/.translations/fa.json | 4 +- .../components/openuv/.translations/fr.json | 6 +-- .../components/openuv/.translations/he.json | 6 +-- .../components/openuv/.translations/hu.json | 6 +-- .../components/openuv/.translations/id.json | 6 +-- .../components/openuv/.translations/it.json | 6 +-- .../components/openuv/.translations/ko.json | 6 +-- .../components/openuv/.translations/lb.json | 6 +-- .../components/openuv/.translations/nl.json | 6 +-- .../components/openuv/.translations/nn.json | 6 +-- .../components/openuv/.translations/no.json | 6 +-- .../components/openuv/.translations/pl.json | 6 +-- .../openuv/.translations/pt-BR.json | 6 +-- .../components/openuv/.translations/pt.json | 6 +-- .../components/openuv/.translations/ro.json | 6 +-- .../components/openuv/.translations/ru.json | 6 +-- .../components/openuv/.translations/sl.json | 6 +-- .../components/openuv/.translations/sv.json | 6 +-- .../openuv/.translations/zh-Hans.json | 6 +-- .../openuv/.translations/zh-Hant.json | 6 +-- .../owntracks/.translations/bg.json | 6 +-- .../owntracks/.translations/ca.json | 6 +-- .../owntracks/.translations/cs.json | 6 +-- .../owntracks/.translations/da.json | 6 +-- .../owntracks/.translations/de.json | 6 +-- .../owntracks/.translations/en.json | 6 +-- .../owntracks/.translations/es-419.json | 6 +-- .../owntracks/.translations/es.json | 6 +-- .../owntracks/.translations/fr.json | 6 +-- .../owntracks/.translations/hu.json | 6 +-- .../owntracks/.translations/it.json | 6 +-- .../owntracks/.translations/ko.json | 6 +-- .../owntracks/.translations/lb.json | 6 +-- .../owntracks/.translations/nl.json | 6 +-- .../owntracks/.translations/nn.json | 4 +- .../owntracks/.translations/no.json | 6 +-- .../owntracks/.translations/pl.json | 6 +-- .../owntracks/.translations/pt-BR.json | 6 +-- .../owntracks/.translations/pt.json | 6 +-- .../owntracks/.translations/ru.json | 6 +-- .../owntracks/.translations/sl.json | 6 +-- .../owntracks/.translations/sv.json | 6 +-- .../owntracks/.translations/zh-Hans.json | 6 +-- .../owntracks/.translations/zh-Hant.json | 6 +-- .../components/plaato/.translations/bg.json | 6 +-- .../components/plaato/.translations/ca.json | 6 +-- .../components/plaato/.translations/da.json | 6 +-- .../components/plaato/.translations/de.json | 6 +-- .../components/plaato/.translations/en.json | 6 +-- .../plaato/.translations/es-419.json | 6 +-- .../components/plaato/.translations/es.json | 6 +-- .../components/plaato/.translations/fr.json | 6 +-- .../components/plaato/.translations/hr.json | 6 +-- .../components/plaato/.translations/it.json | 6 +-- .../components/plaato/.translations/ko.json | 6 +-- .../components/plaato/.translations/lb.json | 6 +-- .../components/plaato/.translations/nl.json | 6 +-- .../components/plaato/.translations/nn.json | 4 +- .../components/plaato/.translations/no.json | 6 +-- .../components/plaato/.translations/pl.json | 6 +-- .../plaato/.translations/pt-BR.json | 6 +-- .../components/plaato/.translations/ru.json | 6 +-- .../components/plaato/.translations/sl.json | 6 +-- .../components/plaato/.translations/sv.json | 6 +-- .../plaato/.translations/zh-Hant.json | 6 +-- .../components/plex/.translations/bg.json | 6 +-- .../components/plex/.translations/ca.json | 6 +-- .../components/plex/.translations/da.json | 6 +-- .../components/plex/.translations/de.json | 6 +-- .../components/plex/.translations/en.json | 6 +-- .../components/plex/.translations/es-419.json | 6 +-- .../components/plex/.translations/es.json | 6 +-- .../components/plex/.translations/fr.json | 6 +-- .../components/plex/.translations/hu.json | 6 +-- .../components/plex/.translations/it.json | 6 +-- .../components/plex/.translations/ko.json | 6 +-- .../components/plex/.translations/lb.json | 6 +-- .../components/plex/.translations/nl.json | 6 +-- .../components/plex/.translations/nn.json | 4 +- .../components/plex/.translations/no.json | 6 +-- .../components/plex/.translations/pl.json | 6 +-- .../components/plex/.translations/ru.json | 6 +-- .../components/plex/.translations/sl.json | 6 +-- .../components/plex/.translations/sv.json | 6 +-- .../plex/.translations/zh-Hant.json | 6 +-- .../components/point/.translations/bg.json | 6 +-- .../components/point/.translations/ca.json | 6 +-- .../components/point/.translations/cs.json | 6 +-- .../components/point/.translations/da.json | 6 +-- .../components/point/.translations/de.json | 6 +-- .../components/point/.translations/en.json | 6 +-- .../point/.translations/es-419.json | 6 +-- .../components/point/.translations/es.json | 6 +-- .../components/point/.translations/fr.json | 6 +-- .../components/point/.translations/hu.json | 6 +-- .../components/point/.translations/it.json | 6 +-- .../components/point/.translations/ko.json | 6 +-- .../components/point/.translations/lb.json | 6 +-- .../components/point/.translations/nl.json | 6 +-- .../components/point/.translations/nn.json | 4 +- .../components/point/.translations/no.json | 6 +-- .../components/point/.translations/pl.json | 10 ++--- .../components/point/.translations/pt-BR.json | 6 +-- .../components/point/.translations/pt.json | 6 +-- .../components/point/.translations/ru.json | 6 +-- .../components/point/.translations/sl.json | 6 +-- .../components/point/.translations/sv.json | 6 +-- .../point/.translations/zh-Hans.json | 6 +-- .../point/.translations/zh-Hant.json | 6 +-- .../powerwall/.translations/ca.json | 6 +-- .../powerwall/.translations/de.json | 6 +-- .../powerwall/.translations/en.json | 6 +-- .../powerwall/.translations/es.json | 6 +-- .../powerwall/.translations/fr.json | 6 +-- .../powerwall/.translations/it.json | 6 +-- .../powerwall/.translations/ko.json | 6 +-- .../powerwall/.translations/lb.json | 6 +-- .../powerwall/.translations/no.json | 6 +-- .../powerwall/.translations/ru.json | 6 +-- .../powerwall/.translations/zh-Hant.json | 6 +-- .../components/ps4/.translations/bg.json | 6 +-- .../components/ps4/.translations/ca.json | 6 +-- .../components/ps4/.translations/cs.json | 6 +-- .../components/ps4/.translations/da.json | 6 +-- .../components/ps4/.translations/de.json | 6 +-- .../components/ps4/.translations/en.json | 6 +-- .../components/ps4/.translations/es-419.json | 6 +-- .../components/ps4/.translations/es.json | 6 +-- .../components/ps4/.translations/fr.json | 6 +-- .../components/ps4/.translations/he.json | 6 +-- .../components/ps4/.translations/it.json | 6 +-- .../components/ps4/.translations/ko.json | 6 +-- .../components/ps4/.translations/lb.json | 6 +-- .../components/ps4/.translations/nl.json | 6 +-- .../components/ps4/.translations/nn.json | 6 +-- .../components/ps4/.translations/no.json | 6 +-- .../components/ps4/.translations/pl.json | 10 ++--- .../components/ps4/.translations/pt-BR.json | 6 +-- .../components/ps4/.translations/pt.json | 6 +-- .../components/ps4/.translations/ru.json | 6 +-- .../components/ps4/.translations/sl.json | 6 +-- .../components/ps4/.translations/sv.json | 6 +-- .../components/ps4/.translations/th.json | 6 +-- .../components/ps4/.translations/zh-Hans.json | 6 +-- .../components/ps4/.translations/zh-Hant.json | 6 +-- .../pvpc_hourly_pricing/.translations/ca.json | 6 +-- .../pvpc_hourly_pricing/.translations/de.json | 6 +-- .../pvpc_hourly_pricing/.translations/en.json | 6 +-- .../pvpc_hourly_pricing/.translations/es.json | 6 +-- .../pvpc_hourly_pricing/.translations/it.json | 6 +-- .../pvpc_hourly_pricing/.translations/ko.json | 6 +-- .../pvpc_hourly_pricing/.translations/lb.json | 6 +-- .../pvpc_hourly_pricing/.translations/no.json | 6 +-- .../pvpc_hourly_pricing/.translations/ru.json | 6 +-- .../.translations/zh-Hant.json | 6 +-- .../components/rachio/.translations/ca.json | 6 +-- .../components/rachio/.translations/de.json | 6 +-- .../components/rachio/.translations/en.json | 6 +-- .../components/rachio/.translations/es.json | 6 +-- .../components/rachio/.translations/fr.json | 6 +-- .../components/rachio/.translations/it.json | 6 +-- .../components/rachio/.translations/ko.json | 6 +-- .../components/rachio/.translations/lb.json | 6 +-- .../components/rachio/.translations/no.json | 6 +-- .../components/rachio/.translations/pl.json | 6 +-- .../components/rachio/.translations/ru.json | 6 +-- .../components/rachio/.translations/sl.json | 6 +-- .../rachio/.translations/zh-Hant.json | 6 +-- .../rainmachine/.translations/bg.json | 6 +-- .../rainmachine/.translations/ca.json | 6 +-- .../rainmachine/.translations/cs.json | 6 +-- .../rainmachine/.translations/da.json | 6 +-- .../rainmachine/.translations/de.json | 6 +-- .../rainmachine/.translations/en.json | 6 +-- .../rainmachine/.translations/es-419.json | 6 +-- .../rainmachine/.translations/es.json | 6 +-- .../rainmachine/.translations/fr.json | 6 +-- .../rainmachine/.translations/hu.json | 6 +-- .../rainmachine/.translations/it.json | 6 +-- .../rainmachine/.translations/ko.json | 6 +-- .../rainmachine/.translations/lb.json | 6 +-- .../rainmachine/.translations/nl.json | 6 +-- .../rainmachine/.translations/nn.json | 4 +- .../rainmachine/.translations/no.json | 6 +-- .../rainmachine/.translations/pl.json | 6 +-- .../rainmachine/.translations/pt-BR.json | 6 +-- .../rainmachine/.translations/pt.json | 6 +-- .../rainmachine/.translations/ru.json | 6 +-- .../rainmachine/.translations/sl.json | 6 +-- .../rainmachine/.translations/sv.json | 6 +-- .../rainmachine/.translations/zh-Hans.json | 6 +-- .../rainmachine/.translations/zh-Hant.json | 6 +-- .../components/ring/.translations/ca.json | 6 +-- .../components/ring/.translations/da.json | 6 +-- .../components/ring/.translations/de.json | 6 +-- .../components/ring/.translations/en.json | 6 +-- .../components/ring/.translations/es.json | 6 +-- .../components/ring/.translations/fr.json | 6 +-- .../components/ring/.translations/hu.json | 6 +-- .../components/ring/.translations/it.json | 6 +-- .../components/ring/.translations/ko.json | 6 +-- .../components/ring/.translations/lb.json | 6 +-- .../components/ring/.translations/nl.json | 6 +-- .../components/ring/.translations/no.json | 6 +-- .../components/ring/.translations/pl.json | 6 +-- .../components/ring/.translations/ru.json | 6 +-- .../components/ring/.translations/sl.json | 6 +-- .../components/ring/.translations/sv.json | 6 +-- .../ring/.translations/zh-Hant.json | 6 +-- .../components/roku/.translations/ca.json | 6 +-- .../components/roku/.translations/de.json | 6 +-- .../components/roku/.translations/en.json | 6 +-- .../components/roku/.translations/es.json | 6 +-- .../components/roku/.translations/fr.json | 6 +-- .../components/roku/.translations/it.json | 6 +-- .../components/roku/.translations/ko.json | 6 +-- .../components/roku/.translations/lb.json | 6 +-- .../components/roku/.translations/no.json | 6 +-- .../components/roku/.translations/pl.json | 6 +-- .../components/roku/.translations/ru.json | 6 +-- .../components/roku/.translations/sl.json | 6 +-- .../roku/.translations/zh-Hant.json | 6 +-- .../components/roomba/.translations/ca.json | 6 +-- .../components/roomba/.translations/de.json | 6 +-- .../components/roomba/.translations/en.json | 6 +-- .../components/roomba/.translations/es.json | 6 +-- .../components/roomba/.translations/no.json | 33 ++++++++++++++++ .../components/roomba/.translations/ru.json | 6 +-- .../roomba/.translations/zh-Hant.json | 6 +-- .../samsungtv/.translations/ca.json | 6 +-- .../samsungtv/.translations/da.json | 6 +-- .../samsungtv/.translations/de.json | 6 +-- .../samsungtv/.translations/en.json | 6 +-- .../samsungtv/.translations/es.json | 6 +-- .../samsungtv/.translations/fr.json | 6 +-- .../samsungtv/.translations/hu.json | 6 +-- .../samsungtv/.translations/it.json | 6 +-- .../samsungtv/.translations/ko.json | 6 +-- .../samsungtv/.translations/lb.json | 6 +-- .../samsungtv/.translations/nl.json | 6 +-- .../samsungtv/.translations/no.json | 6 +-- .../samsungtv/.translations/pl.json | 6 +-- .../samsungtv/.translations/ru.json | 6 +-- .../samsungtv/.translations/sl.json | 6 +-- .../samsungtv/.translations/sv.json | 6 +-- .../samsungtv/.translations/tr.json | 6 +-- .../samsungtv/.translations/zh-Hant.json | 6 +-- .../components/sense/.translations/ca.json | 6 +-- .../components/sense/.translations/de.json | 6 +-- .../components/sense/.translations/en.json | 6 +-- .../components/sense/.translations/es.json | 6 +-- .../components/sense/.translations/fr.json | 6 +-- .../components/sense/.translations/it.json | 6 +-- .../components/sense/.translations/ko.json | 6 +-- .../components/sense/.translations/lb.json | 6 +-- .../components/sense/.translations/no.json | 6 +-- .../components/sense/.translations/ru.json | 6 +-- .../components/sense/.translations/sl.json | 6 +-- .../sense/.translations/zh-Hant.json | 6 +-- .../components/sentry/.translations/af.json | 6 +-- .../components/sentry/.translations/ca.json | 6 +-- .../components/sentry/.translations/da.json | 6 +-- .../components/sentry/.translations/de.json | 6 +-- .../components/sentry/.translations/en.json | 6 +-- .../components/sentry/.translations/es.json | 6 +-- .../components/sentry/.translations/fr.json | 6 +-- .../components/sentry/.translations/hu.json | 6 +-- .../components/sentry/.translations/it.json | 6 +-- .../components/sentry/.translations/ko.json | 6 +-- .../components/sentry/.translations/lb.json | 6 +-- .../components/sentry/.translations/nl.json | 6 +-- .../components/sentry/.translations/no.json | 6 +-- .../components/sentry/.translations/pl.json | 6 +-- .../components/sentry/.translations/ru.json | 6 +-- .../components/sentry/.translations/sl.json | 6 +-- .../components/sentry/.translations/sv.json | 6 +-- .../sentry/.translations/zh-Hant.json | 6 +-- .../shopping_list/.translations/ca.json | 6 +-- .../shopping_list/.translations/de.json | 6 +-- .../shopping_list/.translations/en.json | 6 +-- .../shopping_list/.translations/es.json | 6 +-- .../shopping_list/.translations/fr.json | 6 +-- .../shopping_list/.translations/it.json | 6 +-- .../shopping_list/.translations/ko.json | 6 +-- .../shopping_list/.translations/lb.json | 6 +-- .../shopping_list/.translations/no.json | 6 +-- .../shopping_list/.translations/pl.json | 6 +-- .../shopping_list/.translations/ru.json | 6 +-- .../shopping_list/.translations/sk.json | 6 +-- .../shopping_list/.translations/sl.json | 6 +-- .../shopping_list/.translations/zh-Hant.json | 6 +-- .../simplisafe/.translations/bg.json | 6 +-- .../simplisafe/.translations/ca.json | 6 +-- .../simplisafe/.translations/cs.json | 6 +-- .../simplisafe/.translations/da.json | 6 +-- .../simplisafe/.translations/de.json | 6 +-- .../simplisafe/.translations/en.json | 6 +-- .../simplisafe/.translations/es-419.json | 6 +-- .../simplisafe/.translations/es.json | 6 +-- .../simplisafe/.translations/fr.json | 6 +-- .../simplisafe/.translations/hu.json | 6 +-- .../simplisafe/.translations/it.json | 6 +-- .../simplisafe/.translations/ko.json | 6 +-- .../simplisafe/.translations/lb.json | 6 +-- .../simplisafe/.translations/nl.json | 6 +-- .../simplisafe/.translations/nn.json | 4 +- .../simplisafe/.translations/no.json | 6 +-- .../simplisafe/.translations/pl.json | 6 +-- .../simplisafe/.translations/pt-BR.json | 6 +-- .../simplisafe/.translations/pt.json | 6 +-- .../simplisafe/.translations/ro.json | 6 +-- .../simplisafe/.translations/ru.json | 6 +-- .../simplisafe/.translations/sl.json | 6 +-- .../simplisafe/.translations/sv.json | 6 +-- .../simplisafe/.translations/zh-Hans.json | 6 +-- .../simplisafe/.translations/zh-Hant.json | 6 +-- .../smartthings/.translations/bg.json | 6 +-- .../smartthings/.translations/ca.json | 6 +-- .../smartthings/.translations/da.json | 6 +-- .../smartthings/.translations/de.json | 6 +-- .../smartthings/.translations/en.json | 6 +-- .../smartthings/.translations/es-419.json | 6 +-- .../smartthings/.translations/es.json | 6 +-- .../smartthings/.translations/fr.json | 6 +-- .../smartthings/.translations/he.json | 6 +-- .../smartthings/.translations/hu.json | 6 +-- .../smartthings/.translations/it.json | 6 +-- .../smartthings/.translations/ko.json | 6 +-- .../smartthings/.translations/lb.json | 6 +-- .../smartthings/.translations/nl.json | 6 +-- .../smartthings/.translations/nn.json | 4 +- .../smartthings/.translations/no.json | 33 +++++++++++++--- .../smartthings/.translations/pl.json | 6 +-- .../smartthings/.translations/pt-BR.json | 6 +-- .../smartthings/.translations/pt.json | 6 +-- .../smartthings/.translations/ru.json | 6 +-- .../smartthings/.translations/sl.json | 6 +-- .../smartthings/.translations/sv.json | 6 +-- .../smartthings/.translations/th.json | 6 +-- .../smartthings/.translations/zh-Hans.json | 6 +-- .../smartthings/.translations/zh-Hant.json | 33 +++++++++++++--- .../components/smhi/.translations/bg.json | 6 +-- .../components/smhi/.translations/ca.json | 6 +-- .../components/smhi/.translations/cs.json | 6 +-- .../components/smhi/.translations/da.json | 6 +-- .../components/smhi/.translations/de.json | 6 +-- .../components/smhi/.translations/en.json | 6 +-- .../components/smhi/.translations/es-419.json | 6 +-- .../components/smhi/.translations/es.json | 6 +-- .../components/smhi/.translations/fr.json | 6 +-- .../components/smhi/.translations/hu.json | 6 +-- .../components/smhi/.translations/it.json | 6 +-- .../components/smhi/.translations/ko.json | 6 +-- .../components/smhi/.translations/lb.json | 6 +-- .../components/smhi/.translations/nl.json | 6 +-- .../components/smhi/.translations/no.json | 6 +-- .../components/smhi/.translations/pl.json | 6 +-- .../components/smhi/.translations/pt-BR.json | 6 +-- .../components/smhi/.translations/pt.json | 6 +-- .../components/smhi/.translations/ro.json | 6 +-- .../components/smhi/.translations/ru.json | 6 +-- .../components/smhi/.translations/sl.json | 6 +-- .../components/smhi/.translations/sv.json | 6 +-- .../smhi/.translations/zh-Hans.json | 6 +-- .../smhi/.translations/zh-Hant.json | 6 +-- .../solaredge/.translations/bg.json | 6 +-- .../solaredge/.translations/ca.json | 6 +-- .../solaredge/.translations/da.json | 6 +-- .../solaredge/.translations/de.json | 6 +-- .../solaredge/.translations/en.json | 6 +-- .../solaredge/.translations/es.json | 6 +-- .../solaredge/.translations/fr.json | 6 +-- .../solaredge/.translations/hu.json | 6 +-- .../solaredge/.translations/it.json | 6 +-- .../solaredge/.translations/ko.json | 6 +-- .../solaredge/.translations/lb.json | 6 +-- .../solaredge/.translations/nl.json | 6 +-- .../solaredge/.translations/no.json | 6 +-- .../solaredge/.translations/pl.json | 6 +-- .../solaredge/.translations/ru.json | 6 +-- .../solaredge/.translations/sl.json | 6 +-- .../solaredge/.translations/sv.json | 6 +-- .../solaredge/.translations/zh-Hant.json | 6 +-- .../components/solarlog/.translations/bg.json | 6 +-- .../components/solarlog/.translations/ca.json | 6 +-- .../components/solarlog/.translations/cs.json | 6 +-- .../components/solarlog/.translations/da.json | 6 +-- .../components/solarlog/.translations/de.json | 6 +-- .../components/solarlog/.translations/en.json | 6 +-- .../components/solarlog/.translations/es.json | 6 +-- .../components/solarlog/.translations/fr.json | 6 +-- .../components/solarlog/.translations/it.json | 6 +-- .../components/solarlog/.translations/ko.json | 6 +-- .../components/solarlog/.translations/lb.json | 6 +-- .../components/solarlog/.translations/nl.json | 6 +-- .../components/solarlog/.translations/nn.json | 4 +- .../components/solarlog/.translations/no.json | 6 +-- .../components/solarlog/.translations/pl.json | 6 +-- .../components/solarlog/.translations/ru.json | 6 +-- .../components/solarlog/.translations/sl.json | 6 +-- .../components/solarlog/.translations/sv.json | 6 +-- .../solarlog/.translations/zh-Hant.json | 6 +-- .../components/soma/.translations/bg.json | 6 +-- .../components/soma/.translations/ca.json | 6 +-- .../components/soma/.translations/da.json | 6 +-- .../components/soma/.translations/de.json | 6 +-- .../components/soma/.translations/en.json | 6 +-- .../components/soma/.translations/es.json | 6 +-- .../components/soma/.translations/fr.json | 6 +-- .../components/soma/.translations/hu.json | 6 +-- .../components/soma/.translations/it.json | 6 +-- .../components/soma/.translations/ko.json | 6 +-- .../components/soma/.translations/lb.json | 6 +-- .../components/soma/.translations/nl.json | 6 +-- .../components/soma/.translations/nn.json | 4 +- .../components/soma/.translations/no.json | 6 +-- .../components/soma/.translations/pl.json | 6 +-- .../components/soma/.translations/ru.json | 6 +-- .../components/soma/.translations/sl.json | 6 +-- .../components/soma/.translations/sv.json | 6 +-- .../soma/.translations/zh-Hant.json | 6 +-- .../components/somfy/.translations/bg.json | 6 +-- .../components/somfy/.translations/ca.json | 6 +-- .../components/somfy/.translations/da.json | 6 +-- .../components/somfy/.translations/de.json | 6 +-- .../components/somfy/.translations/en.json | 6 +-- .../somfy/.translations/es-419.json | 4 +- .../components/somfy/.translations/es.json | 6 +-- .../components/somfy/.translations/fr.json | 6 +-- .../components/somfy/.translations/hr.json | 6 +-- .../components/somfy/.translations/it.json | 6 +-- .../components/somfy/.translations/ko.json | 6 +-- .../components/somfy/.translations/lb.json | 6 +-- .../components/somfy/.translations/nl.json | 6 +-- .../components/somfy/.translations/nn.json | 4 +- .../components/somfy/.translations/no.json | 6 +-- .../components/somfy/.translations/pl.json | 6 +-- .../components/somfy/.translations/pt-BR.json | 6 +-- .../components/somfy/.translations/ru.json | 6 +-- .../components/somfy/.translations/sl.json | 6 +-- .../components/somfy/.translations/sv.json | 6 +-- .../somfy/.translations/zh-Hant.json | 6 +-- .../components/sonos/.translations/bg.json | 6 +-- .../components/sonos/.translations/ca.json | 6 +-- .../components/sonos/.translations/cs.json | 6 +-- .../components/sonos/.translations/da.json | 6 +-- .../components/sonos/.translations/de.json | 6 +-- .../components/sonos/.translations/en.json | 6 +-- .../sonos/.translations/es-419.json | 6 +-- .../components/sonos/.translations/es.json | 6 +-- .../components/sonos/.translations/et.json | 6 +-- .../components/sonos/.translations/fr.json | 6 +-- .../components/sonos/.translations/he.json | 6 +-- .../components/sonos/.translations/hr.json | 6 +-- .../components/sonos/.translations/hu.json | 6 +-- .../components/sonos/.translations/id.json | 6 +-- .../components/sonos/.translations/it.json | 6 +-- .../components/sonos/.translations/ko.json | 6 +-- .../components/sonos/.translations/lb.json | 6 +-- .../components/sonos/.translations/nl.json | 6 +-- .../components/sonos/.translations/nn.json | 6 +-- .../components/sonos/.translations/no.json | 6 +-- .../components/sonos/.translations/pl.json | 6 +-- .../components/sonos/.translations/pt-BR.json | 6 +-- .../components/sonos/.translations/pt.json | 6 +-- .../components/sonos/.translations/ro.json | 6 +-- .../components/sonos/.translations/ru.json | 6 +-- .../components/sonos/.translations/sl.json | 6 +-- .../components/sonos/.translations/sv.json | 6 +-- .../components/sonos/.translations/vi.json | 6 +-- .../sonos/.translations/zh-Hans.json | 6 +-- .../sonos/.translations/zh-Hant.json | 6 +-- .../components/spotify/.translations/ca.json | 6 +-- .../components/spotify/.translations/cs.json | 6 +-- .../components/spotify/.translations/da.json | 6 +-- .../components/spotify/.translations/de.json | 6 +-- .../components/spotify/.translations/en.json | 6 +-- .../components/spotify/.translations/es.json | 6 +-- .../components/spotify/.translations/fr.json | 6 +-- .../components/spotify/.translations/hu.json | 6 +-- .../components/spotify/.translations/it.json | 6 +-- .../components/spotify/.translations/ko.json | 6 +-- .../components/spotify/.translations/lb.json | 6 +-- .../components/spotify/.translations/lv.json | 4 +- .../components/spotify/.translations/nl.json | 6 +-- .../components/spotify/.translations/no.json | 6 +-- .../components/spotify/.translations/pl.json | 6 +-- .../components/spotify/.translations/ru.json | 6 +-- .../components/spotify/.translations/sl.json | 6 +-- .../components/spotify/.translations/sv.json | 6 +-- .../components/spotify/.translations/tr.json | 6 +-- .../spotify/.translations/zh-Hant.json | 6 +-- .../components/starline/.translations/bg.json | 6 +-- .../components/starline/.translations/ca.json | 6 +-- .../components/starline/.translations/da.json | 6 +-- .../components/starline/.translations/de.json | 6 +-- .../components/starline/.translations/en.json | 6 +-- .../components/starline/.translations/es.json | 6 +-- .../components/starline/.translations/fr.json | 6 +-- .../components/starline/.translations/hu.json | 6 +-- .../components/starline/.translations/it.json | 6 +-- .../components/starline/.translations/ko.json | 6 +-- .../components/starline/.translations/lb.json | 6 +-- .../components/starline/.translations/nl.json | 6 +-- .../components/starline/.translations/nn.json | 6 +-- .../components/starline/.translations/no.json | 6 +-- .../components/starline/.translations/pl.json | 6 +-- .../components/starline/.translations/ru.json | 6 +-- .../components/starline/.translations/sl.json | 6 +-- .../components/starline/.translations/sv.json | 6 +-- .../starline/.translations/zh-Hant.json | 6 +-- .../synology_dsm/.translations/ca.json | 6 +-- .../synology_dsm/.translations/de.json | 6 +-- .../synology_dsm/.translations/en.json | 6 +-- .../synology_dsm/.translations/es.json | 6 +-- .../synology_dsm/.translations/ko.json | 6 +-- .../synology_dsm/.translations/lb.json | 6 +-- .../synology_dsm/.translations/nl.json | 6 +-- .../synology_dsm/.translations/no.json | 11 ++++++ .../synology_dsm/.translations/ru.json | 6 +-- .../synology_dsm/.translations/zh-Hant.json | 6 +-- .../components/tado/.translations/de.json | 6 +-- .../components/tado/.translations/en.json | 6 +-- .../components/tado/.translations/es.json | 6 +-- .../components/tado/.translations/no.json | 22 +++++++++++ .../components/tado/.translations/ru.json | 6 +-- .../tado/.translations/zh-Hant.json | 6 +-- .../tellduslive/.translations/bg.json | 6 +-- .../tellduslive/.translations/ca.json | 6 +-- .../tellduslive/.translations/da.json | 6 +-- .../tellduslive/.translations/de.json | 6 +-- .../tellduslive/.translations/en.json | 6 +-- .../tellduslive/.translations/es-419.json | 6 +-- .../tellduslive/.translations/es.json | 6 +-- .../tellduslive/.translations/fr.json | 6 +-- .../tellduslive/.translations/hu.json | 6 +-- .../tellduslive/.translations/it.json | 6 +-- .../tellduslive/.translations/ko.json | 6 +-- .../tellduslive/.translations/lb.json | 6 +-- .../tellduslive/.translations/nl.json | 6 +-- .../tellduslive/.translations/nn.json | 4 +- .../tellduslive/.translations/no.json | 6 +-- .../tellduslive/.translations/pl.json | 6 +-- .../tellduslive/.translations/pt-BR.json | 6 +-- .../tellduslive/.translations/pt.json | 6 +-- .../tellduslive/.translations/ru.json | 6 +-- .../tellduslive/.translations/sl.json | 6 +-- .../tellduslive/.translations/sv.json | 6 +-- .../tellduslive/.translations/zh-Hans.json | 6 +-- .../tellduslive/.translations/zh-Hant.json | 6 +-- .../components/tesla/.translations/ca.json | 6 +-- .../components/tesla/.translations/da.json | 6 +-- .../components/tesla/.translations/de.json | 6 +-- .../components/tesla/.translations/en.json | 6 +-- .../components/tesla/.translations/es.json | 6 +-- .../components/tesla/.translations/fr.json | 6 +-- .../components/tesla/.translations/hu.json | 6 +-- .../components/tesla/.translations/it.json | 6 +-- .../components/tesla/.translations/ko.json | 6 +-- .../components/tesla/.translations/lb.json | 6 +-- .../components/tesla/.translations/nl.json | 6 +-- .../components/tesla/.translations/no.json | 6 +-- .../components/tesla/.translations/pl.json | 6 +-- .../components/tesla/.translations/pt-BR.json | 6 +-- .../components/tesla/.translations/ru.json | 6 +-- .../components/tesla/.translations/sl.json | 6 +-- .../components/tesla/.translations/sv.json | 6 +-- .../tesla/.translations/zh-Hant.json | 6 +-- .../components/toon/.translations/bg.json | 6 +-- .../components/toon/.translations/ca.json | 6 +-- .../components/toon/.translations/da.json | 6 +-- .../components/toon/.translations/de.json | 6 +-- .../components/toon/.translations/en.json | 6 +-- .../components/toon/.translations/es-419.json | 6 +-- .../components/toon/.translations/es.json | 6 +-- .../components/toon/.translations/fr.json | 6 +-- .../components/toon/.translations/it.json | 6 +-- .../components/toon/.translations/ko.json | 6 +-- .../components/toon/.translations/lb.json | 6 +-- .../components/toon/.translations/nl.json | 6 +-- .../components/toon/.translations/nn.json | 6 +-- .../components/toon/.translations/no.json | 6 +-- .../components/toon/.translations/pl.json | 6 +-- .../components/toon/.translations/pt-BR.json | 6 +-- .../components/toon/.translations/ru.json | 6 +-- .../components/toon/.translations/sl.json | 6 +-- .../components/toon/.translations/sv.json | 6 +-- .../toon/.translations/zh-Hant.json | 6 +-- .../totalconnect/.translations/de.json | 6 +-- .../totalconnect/.translations/en.json | 6 +-- .../totalconnect/.translations/es.json | 6 +-- .../totalconnect/.translations/no.json | 20 ++++++++++ .../totalconnect/.translations/ru.json | 6 +-- .../totalconnect/.translations/zh-Hant.json | 6 +-- .../components/tplink/.translations/bg.json | 6 +-- .../components/tplink/.translations/ca.json | 6 +-- .../components/tplink/.translations/cs.json | 6 +-- .../components/tplink/.translations/da.json | 6 +-- .../components/tplink/.translations/de.json | 6 +-- .../components/tplink/.translations/en.json | 6 +-- .../tplink/.translations/es-419.json | 6 +-- .../components/tplink/.translations/es.json | 6 +-- .../components/tplink/.translations/fr.json | 6 +-- .../components/tplink/.translations/he.json | 6 +-- .../components/tplink/.translations/it.json | 6 +-- .../components/tplink/.translations/ko.json | 6 +-- .../components/tplink/.translations/lb.json | 6 +-- .../components/tplink/.translations/nl.json | 6 +-- .../components/tplink/.translations/nn.json | 6 +-- .../components/tplink/.translations/no.json | 6 +-- .../components/tplink/.translations/pl.json | 6 +-- .../tplink/.translations/pt-BR.json | 6 +-- .../components/tplink/.translations/pt.json | 6 +-- .../components/tplink/.translations/ru.json | 6 +-- .../components/tplink/.translations/sl.json | 6 +-- .../components/tplink/.translations/sv.json | 6 +-- .../components/tplink/.translations/th.json | 4 +- .../tplink/.translations/zh-Hans.json | 6 +-- .../tplink/.translations/zh-Hant.json | 6 +-- .../components/traccar/.translations/bg.json | 6 +-- .../components/traccar/.translations/ca.json | 6 +-- .../components/traccar/.translations/da.json | 6 +-- .../components/traccar/.translations/de.json | 6 +-- .../components/traccar/.translations/en.json | 6 +-- .../components/traccar/.translations/es.json | 6 +-- .../components/traccar/.translations/fr.json | 6 +-- .../components/traccar/.translations/it.json | 6 +-- .../components/traccar/.translations/ko.json | 6 +-- .../components/traccar/.translations/lb.json | 6 +-- .../components/traccar/.translations/nl.json | 6 +-- .../components/traccar/.translations/nn.json | 4 +- .../components/traccar/.translations/no.json | 6 +-- .../components/traccar/.translations/pl.json | 6 +-- .../traccar/.translations/pt-BR.json | 6 +-- .../components/traccar/.translations/ru.json | 6 +-- .../components/traccar/.translations/sl.json | 6 +-- .../components/traccar/.translations/sv.json | 6 +-- .../components/traccar/.translations/tr.json | 6 +-- .../traccar/.translations/zh-Hant.json | 6 +-- .../components/tradfri/.translations/bg.json | 6 +-- .../components/tradfri/.translations/ca.json | 6 +-- .../components/tradfri/.translations/cs.json | 6 +-- .../components/tradfri/.translations/da.json | 6 +-- .../components/tradfri/.translations/de.json | 6 +-- .../components/tradfri/.translations/en.json | 6 +-- .../tradfri/.translations/es-419.json | 6 +-- .../components/tradfri/.translations/es.json | 6 +-- .../components/tradfri/.translations/fr.json | 6 +-- .../components/tradfri/.translations/he.json | 6 +-- .../components/tradfri/.translations/hr.json | 6 +-- .../components/tradfri/.translations/hu.json | 6 +-- .../components/tradfri/.translations/id.json | 6 +-- .../components/tradfri/.translations/it.json | 6 +-- .../components/tradfri/.translations/ko.json | 6 +-- .../components/tradfri/.translations/lb.json | 6 +-- .../components/tradfri/.translations/nl.json | 6 +-- .../components/tradfri/.translations/nn.json | 6 +-- .../components/tradfri/.translations/no.json | 6 +-- .../components/tradfri/.translations/pl.json | 6 +-- .../tradfri/.translations/pt-BR.json | 6 +-- .../components/tradfri/.translations/pt.json | 6 +-- .../components/tradfri/.translations/ro.json | 6 +-- .../components/tradfri/.translations/ru.json | 6 +-- .../components/tradfri/.translations/sl.json | 6 +-- .../components/tradfri/.translations/sv.json | 6 +-- .../tradfri/.translations/zh-Hans.json | 6 +-- .../tradfri/.translations/zh-Hant.json | 6 +-- .../transmission/.translations/bg.json | 6 +-- .../transmission/.translations/ca.json | 6 +-- .../transmission/.translations/da.json | 6 +-- .../transmission/.translations/de.json | 6 +-- .../transmission/.translations/en.json | 6 +-- .../transmission/.translations/es.json | 6 +-- .../transmission/.translations/fr.json | 6 +-- .../transmission/.translations/it.json | 6 +-- .../transmission/.translations/ko.json | 6 +-- .../transmission/.translations/lb.json | 6 +-- .../transmission/.translations/nl.json | 6 +-- .../transmission/.translations/no.json | 6 +-- .../transmission/.translations/pl.json | 6 +-- .../transmission/.translations/pt-BR.json | 6 +-- .../transmission/.translations/ru.json | 6 +-- .../transmission/.translations/sl.json | 6 +-- .../transmission/.translations/sv.json | 6 +-- .../transmission/.translations/zh-Hant.json | 6 +-- .../twentemilieu/.translations/bg.json | 6 +-- .../twentemilieu/.translations/ca.json | 6 +-- .../twentemilieu/.translations/da.json | 6 +-- .../twentemilieu/.translations/de.json | 6 +-- .../twentemilieu/.translations/en.json | 6 +-- .../twentemilieu/.translations/es-419.json | 6 +-- .../twentemilieu/.translations/es.json | 6 +-- .../twentemilieu/.translations/fr.json | 6 +-- .../twentemilieu/.translations/it.json | 6 +-- .../twentemilieu/.translations/ko.json | 6 +-- .../twentemilieu/.translations/lb.json | 6 +-- .../twentemilieu/.translations/nl.json | 6 +-- .../twentemilieu/.translations/nn.json | 6 +-- .../twentemilieu/.translations/no.json | 6 +-- .../twentemilieu/.translations/pl.json | 6 +-- .../twentemilieu/.translations/pt-BR.json | 6 +-- .../twentemilieu/.translations/ru.json | 6 +-- .../twentemilieu/.translations/sl.json | 6 +-- .../twentemilieu/.translations/sv.json | 6 +-- .../twentemilieu/.translations/zh-Hant.json | 6 +-- .../components/twilio/.translations/bg.json | 6 +-- .../components/twilio/.translations/ca.json | 6 +-- .../components/twilio/.translations/cs.json | 6 +-- .../components/twilio/.translations/da.json | 6 +-- .../components/twilio/.translations/de.json | 6 +-- .../components/twilio/.translations/en.json | 6 +-- .../twilio/.translations/es-419.json | 6 +-- .../components/twilio/.translations/es.json | 6 +-- .../components/twilio/.translations/fr.json | 6 +-- .../components/twilio/.translations/hu.json | 6 +-- .../components/twilio/.translations/it.json | 6 +-- .../components/twilio/.translations/ko.json | 6 +-- .../components/twilio/.translations/lb.json | 6 +-- .../components/twilio/.translations/nl.json | 6 +-- .../components/twilio/.translations/nn.json | 4 +- .../components/twilio/.translations/no.json | 6 +-- .../components/twilio/.translations/pl.json | 6 +-- .../twilio/.translations/pt-BR.json | 6 +-- .../components/twilio/.translations/pt.json | 6 +-- .../components/twilio/.translations/ru.json | 6 +-- .../components/twilio/.translations/sl.json | 6 +-- .../components/twilio/.translations/sv.json | 6 +-- .../twilio/.translations/zh-Hans.json | 6 +-- .../twilio/.translations/zh-Hant.json | 6 +-- .../components/unifi/.translations/bg.json | 6 +-- .../components/unifi/.translations/ca.json | 6 +-- .../components/unifi/.translations/cs.json | 6 +-- .../components/unifi/.translations/da.json | 6 +-- .../components/unifi/.translations/de.json | 6 +-- .../components/unifi/.translations/en.json | 6 +-- .../unifi/.translations/es-419.json | 6 +-- .../components/unifi/.translations/es.json | 6 +-- .../components/unifi/.translations/fr.json | 6 +-- .../components/unifi/.translations/hu.json | 6 +-- .../components/unifi/.translations/it.json | 6 +-- .../components/unifi/.translations/ko.json | 6 +-- .../components/unifi/.translations/lb.json | 6 +-- .../components/unifi/.translations/nl.json | 6 +-- .../components/unifi/.translations/no.json | 6 +-- .../components/unifi/.translations/pl.json | 6 +-- .../components/unifi/.translations/pt-BR.json | 6 +-- .../components/unifi/.translations/pt.json | 6 +-- .../components/unifi/.translations/ro.json | 6 +-- .../components/unifi/.translations/ru.json | 6 +-- .../components/unifi/.translations/sl.json | 6 +-- .../components/unifi/.translations/sv.json | 6 +-- .../unifi/.translations/zh-Hans.json | 6 +-- .../unifi/.translations/zh-Hant.json | 6 +-- .../components/upnp/.translations/bg.json | 6 +-- .../components/upnp/.translations/ca.json | 6 +-- .../components/upnp/.translations/cs.json | 6 +-- .../components/upnp/.translations/da.json | 6 +-- .../components/upnp/.translations/de.json | 6 +-- .../components/upnp/.translations/en.json | 6 +-- .../components/upnp/.translations/es-419.json | 6 +-- .../components/upnp/.translations/es.json | 6 +-- .../components/upnp/.translations/et.json | 6 +-- .../components/upnp/.translations/fr.json | 6 +-- .../components/upnp/.translations/hu.json | 6 +-- .../components/upnp/.translations/it.json | 6 +-- .../components/upnp/.translations/ko.json | 6 +-- .../components/upnp/.translations/lb.json | 6 +-- .../components/upnp/.translations/nl.json | 6 +-- .../components/upnp/.translations/nn.json | 6 +-- .../components/upnp/.translations/no.json | 6 +-- .../components/upnp/.translations/pl.json | 6 +-- .../components/upnp/.translations/pt-BR.json | 6 +-- .../components/upnp/.translations/pt.json | 6 +-- .../components/upnp/.translations/ro.json | 6 +-- .../components/upnp/.translations/ru.json | 6 +-- .../components/upnp/.translations/sl.json | 6 +-- .../components/upnp/.translations/sv.json | 6 +-- .../upnp/.translations/zh-Hans.json | 6 +-- .../upnp/.translations/zh-Hant.json | 6 +-- .../components/velbus/.translations/bg.json | 6 +-- .../components/velbus/.translations/ca.json | 6 +-- .../components/velbus/.translations/da.json | 6 +-- .../components/velbus/.translations/de.json | 6 +-- .../components/velbus/.translations/en.json | 6 +-- .../velbus/.translations/es-419.json | 6 +-- .../components/velbus/.translations/es.json | 6 +-- .../components/velbus/.translations/fr.json | 6 +-- .../components/velbus/.translations/it.json | 6 +-- .../components/velbus/.translations/ko.json | 6 +-- .../components/velbus/.translations/lb.json | 6 +-- .../components/velbus/.translations/nl.json | 6 +-- .../components/velbus/.translations/no.json | 6 +-- .../components/velbus/.translations/pl.json | 6 +-- .../components/velbus/.translations/ru.json | 6 +-- .../components/velbus/.translations/sl.json | 6 +-- .../components/velbus/.translations/sv.json | 6 +-- .../velbus/.translations/zh-Hant.json | 6 +-- .../components/vera/.translations/ca.json | 6 +-- .../components/vera/.translations/de.json | 6 +-- .../components/vera/.translations/en.json | 6 +-- .../components/vera/.translations/es.json | 6 +-- .../components/vera/.translations/fr.json | 4 +- .../components/vera/.translations/ko.json | 6 +-- .../components/vera/.translations/lb.json | 6 +-- .../components/vera/.translations/ru.json | 6 +-- .../vera/.translations/zh-Hant.json | 6 +-- .../components/vesync/.translations/bg.json | 6 +-- .../components/vesync/.translations/ca.json | 6 +-- .../components/vesync/.translations/da.json | 6 +-- .../components/vesync/.translations/de.json | 6 +-- .../components/vesync/.translations/en.json | 6 +-- .../vesync/.translations/es-419.json | 6 +-- .../components/vesync/.translations/es.json | 6 +-- .../components/vesync/.translations/fr.json | 6 +-- .../components/vesync/.translations/it.json | 6 +-- .../components/vesync/.translations/ko.json | 6 +-- .../components/vesync/.translations/lb.json | 6 +-- .../components/vesync/.translations/nl.json | 6 +-- .../components/vesync/.translations/nn.json | 4 +- .../components/vesync/.translations/no.json | 6 +-- .../components/vesync/.translations/pl.json | 6 +-- .../components/vesync/.translations/ru.json | 6 +-- .../components/vesync/.translations/sl.json | 6 +-- .../components/vesync/.translations/sv.json | 6 +-- .../vesync/.translations/zh-Hant.json | 6 +-- .../components/vilfo/.translations/ca.json | 6 +-- .../components/vilfo/.translations/da.json | 6 +-- .../components/vilfo/.translations/de.json | 6 +-- .../components/vilfo/.translations/en.json | 6 +-- .../components/vilfo/.translations/es.json | 6 +-- .../components/vilfo/.translations/fr.json | 6 +-- .../components/vilfo/.translations/hu.json | 6 +-- .../components/vilfo/.translations/it.json | 6 +-- .../components/vilfo/.translations/ko.json | 6 +-- .../components/vilfo/.translations/lb.json | 6 +-- .../components/vilfo/.translations/nl.json | 6 +-- .../components/vilfo/.translations/no.json | 6 +-- .../components/vilfo/.translations/pl.json | 6 +-- .../components/vilfo/.translations/ru.json | 6 +-- .../components/vilfo/.translations/sl.json | 6 +-- .../components/vilfo/.translations/sv.json | 6 +-- .../vilfo/.translations/zh-Hans.json | 6 +-- .../vilfo/.translations/zh-Hant.json | 6 +-- .../components/vizio/.translations/ca.json | 6 +-- .../components/vizio/.translations/da.json | 6 +-- .../components/vizio/.translations/de.json | 6 +-- .../components/vizio/.translations/en.json | 6 +-- .../components/vizio/.translations/es.json | 6 +-- .../components/vizio/.translations/fr.json | 6 +-- .../components/vizio/.translations/hu.json | 6 +-- .../components/vizio/.translations/it.json | 6 +-- .../components/vizio/.translations/ko.json | 6 +-- .../components/vizio/.translations/lb.json | 6 +-- .../components/vizio/.translations/nl.json | 6 +-- .../components/vizio/.translations/no.json | 16 ++++---- .../components/vizio/.translations/pl.json | 6 +-- .../components/vizio/.translations/ru.json | 6 +-- .../components/vizio/.translations/sl.json | 6 +-- .../components/vizio/.translations/sv.json | 6 +-- .../vizio/.translations/zh-Hant.json | 6 +-- .../components/wemo/.translations/bg.json | 6 +-- .../components/wemo/.translations/ca.json | 6 +-- .../components/wemo/.translations/da.json | 6 +-- .../components/wemo/.translations/de.json | 6 +-- .../components/wemo/.translations/en.json | 6 +-- .../components/wemo/.translations/es-419.json | 6 +-- .../components/wemo/.translations/es.json | 6 +-- .../components/wemo/.translations/fr.json | 6 +-- .../components/wemo/.translations/hr.json | 4 +- .../components/wemo/.translations/it.json | 6 +-- .../components/wemo/.translations/ko.json | 6 +-- .../components/wemo/.translations/lb.json | 6 +-- .../components/wemo/.translations/nl.json | 6 +-- .../components/wemo/.translations/nn.json | 6 +-- .../components/wemo/.translations/no.json | 6 +-- .../components/wemo/.translations/pl.json | 6 +-- .../components/wemo/.translations/pt-BR.json | 6 +-- .../components/wemo/.translations/ru.json | 6 +-- .../components/wemo/.translations/sl.json | 6 +-- .../components/wemo/.translations/sv.json | 6 +-- .../wemo/.translations/zh-Hant.json | 6 +-- .../components/withings/.translations/bg.json | 6 +-- .../components/withings/.translations/ca.json | 6 +-- .../components/withings/.translations/da.json | 6 +-- .../components/withings/.translations/de.json | 6 +-- .../components/withings/.translations/en.json | 6 +-- .../withings/.translations/es-419.json | 6 +-- .../components/withings/.translations/es.json | 6 +-- .../components/withings/.translations/fr.json | 6 +-- .../components/withings/.translations/hu.json | 6 +-- .../components/withings/.translations/it.json | 6 +-- .../components/withings/.translations/ko.json | 6 +-- .../components/withings/.translations/lb.json | 6 +-- .../components/withings/.translations/lv.json | 4 +- .../components/withings/.translations/nl.json | 6 +-- .../components/withings/.translations/nn.json | 4 +- .../components/withings/.translations/no.json | 6 +-- .../components/withings/.translations/pl.json | 6 +-- .../components/withings/.translations/ru.json | 6 +-- .../components/withings/.translations/sl.json | 6 +-- .../components/withings/.translations/sv.json | 6 +-- .../withings/.translations/zh-Hant.json | 6 +-- .../components/wled/.translations/af.json | 22 +++++++++++ .../components/wled/.translations/ar.json | 22 +++++++++++ .../components/wled/.translations/bg.json | 22 +++++------ .../components/wled/.translations/bs.json | 22 +++++++++++ .../components/wled/.translations/ca.json | 22 +++++------ .../components/wled/.translations/cs.json | 22 +++++++++++ .../components/wled/.translations/cy.json | 22 +++++++++++ .../components/wled/.translations/da.json | 22 +++++------ .../components/wled/.translations/de.json | 22 +++++------ .../components/wled/.translations/el.json | 22 +++++++++++ .../components/wled/.translations/en.json | 6 +-- .../components/wled/.translations/eo.json | 22 +++++++++++ .../components/wled/.translations/es-419.json | 22 +++++++++++ .../components/wled/.translations/es.json | 22 +++++------ .../components/wled/.translations/et.json | 22 +++++++++++ .../components/wled/.translations/eu.json | 22 +++++++++++ .../components/wled/.translations/fa.json | 22 +++++++++++ .../components/wled/.translations/fi.json | 22 +++++++++++ .../components/wled/.translations/fr.json | 22 +++++------ .../components/wled/.translations/gsw.json | 22 +++++++++++ .../components/wled/.translations/he.json | 22 +++++++++++ .../components/wled/.translations/hi.json | 22 +++++++++++ .../components/wled/.translations/hr.json | 22 +++++++++++ .../components/wled/.translations/hu.json | 22 +++++------ .../components/wled/.translations/iba.json | 22 +++++++++++ .../components/wled/.translations/id.json | 22 +++++++++++ .../components/wled/.translations/is.json | 22 +++++++++++ .../components/wled/.translations/it.json | 22 +++++------ .../components/wled/.translations/ja.json | 22 +++++++++++ .../components/wled/.translations/ko.json | 22 +++++------ .../components/wled/.translations/lb.json | 22 +++++------ .../components/wled/.translations/lt.json | 22 +++++++++++ .../components/wled/.translations/lv.json | 22 +++++++++++ .../components/wled/.translations/nl.json | 22 +++++------ .../components/wled/.translations/nn.json | 23 +++++++++-- .../components/wled/.translations/no.json | 22 +++++------ .../components/wled/.translations/pl.json | 20 +++++----- .../components/wled/.translations/pt-BR.json | 22 +++++++++++ .../components/wled/.translations/pt.json | 18 +++++---- .../components/wled/.translations/ro.json | 22 +++++++++++ .../components/wled/.translations/ru.json | 22 +++++------ .../components/wled/.translations/sk.json | 22 +++++++++++ .../components/wled/.translations/sl.json | 22 +++++------ .../wled/.translations/sr-Latn.json | 22 +++++++++++ .../components/wled/.translations/sr.json | 22 +++++++++++ .../components/wled/.translations/sv.json | 22 +++++------ .../components/wled/.translations/ta.json | 22 +++++++++++ .../components/wled/.translations/te.json | 22 +++++++++++ .../components/wled/.translations/th.json | 22 +++++++++++ .../components/wled/.translations/tr.json | 22 +++++++++++ .../components/wled/.translations/uk.json | 22 +++++++++++ .../components/wled/.translations/ur.json | 22 +++++++++++ .../components/wled/.translations/vi.json | 22 +++++++++++ .../wled/.translations/zh-Hans.json | 22 +++++++++++ .../wled/.translations/zh-Hant.json | 22 +++++------ .../components/wwlln/.translations/bg.json | 6 +-- .../components/wwlln/.translations/ca.json | 6 +-- .../components/wwlln/.translations/cy.json | 6 +-- .../components/wwlln/.translations/da.json | 6 +-- .../components/wwlln/.translations/de.json | 6 +-- .../components/wwlln/.translations/en.json | 6 +-- .../wwlln/.translations/es-419.json | 6 +-- .../components/wwlln/.translations/es.json | 6 +-- .../components/wwlln/.translations/fr.json | 6 +-- .../components/wwlln/.translations/hr.json | 6 +-- .../components/wwlln/.translations/it.json | 6 +-- .../components/wwlln/.translations/ko.json | 6 +-- .../components/wwlln/.translations/lb.json | 6 +-- .../components/wwlln/.translations/nl.json | 6 +-- .../components/wwlln/.translations/no.json | 6 +-- .../components/wwlln/.translations/pl.json | 6 +-- .../components/wwlln/.translations/pt-BR.json | 6 +-- .../components/wwlln/.translations/ru.json | 6 +-- .../components/wwlln/.translations/sl.json | 6 +-- .../components/wwlln/.translations/sv.json | 6 +-- .../wwlln/.translations/zh-Hans.json | 6 +-- .../wwlln/.translations/zh-Hant.json | 6 +-- .../components/zha/.translations/bg.json | 6 +-- .../components/zha/.translations/ca.json | 6 +-- .../components/zha/.translations/da.json | 6 +-- .../components/zha/.translations/de.json | 6 +-- .../components/zha/.translations/en.json | 6 +-- .../components/zha/.translations/es-419.json | 6 +-- .../components/zha/.translations/es.json | 6 +-- .../components/zha/.translations/fr.json | 6 +-- .../components/zha/.translations/hu.json | 6 +-- .../components/zha/.translations/it.json | 6 +-- .../components/zha/.translations/ko.json | 6 +-- .../components/zha/.translations/lb.json | 6 +-- .../components/zha/.translations/nl.json | 6 +-- .../components/zha/.translations/nn.json | 6 +-- .../components/zha/.translations/no.json | 6 +-- .../components/zha/.translations/pl.json | 6 +-- .../components/zha/.translations/pt-BR.json | 6 +-- .../components/zha/.translations/pt.json | 6 +-- .../components/zha/.translations/ru.json | 6 +-- .../components/zha/.translations/sl.json | 6 +-- .../components/zha/.translations/sv.json | 6 +-- .../components/zha/.translations/zh-Hans.json | 6 +-- .../components/zha/.translations/zh-Hant.json | 6 +-- .../components/zwave/.translations/bg.json | 6 +-- .../components/zwave/.translations/ca.json | 6 +-- .../components/zwave/.translations/cs.json | 6 +-- .../components/zwave/.translations/da.json | 6 +-- .../components/zwave/.translations/de.json | 6 +-- .../components/zwave/.translations/en.json | 6 +-- .../zwave/.translations/es-419.json | 6 +-- .../components/zwave/.translations/es.json | 6 +-- .../components/zwave/.translations/et.json | 4 +- .../components/zwave/.translations/fr.json | 6 +-- .../components/zwave/.translations/hu.json | 6 +-- .../components/zwave/.translations/it.json | 6 +-- .../components/zwave/.translations/ko.json | 6 +-- .../components/zwave/.translations/lb.json | 6 +-- .../components/zwave/.translations/nl.json | 6 +-- .../components/zwave/.translations/nn.json | 6 +-- .../components/zwave/.translations/no.json | 6 +-- .../components/zwave/.translations/pl.json | 6 +-- .../components/zwave/.translations/pt-BR.json | 6 +-- .../components/zwave/.translations/pt.json | 6 +-- .../components/zwave/.translations/ro.json | 6 +-- .../components/zwave/.translations/ru.json | 6 +-- .../components/zwave/.translations/sl.json | 6 +-- .../components/zwave/.translations/sv.json | 6 +-- .../zwave/.translations/zh-Hans.json | 6 +-- .../zwave/.translations/zh-Hant.json | 6 +-- 2630 files changed, 8789 insertions(+), 7938 deletions(-) create mode 100644 homeassistant/components/braviatv/.translations/no.json create mode 100644 homeassistant/components/braviatv/.translations/pl.json create mode 100644 homeassistant/components/braviatv/.translations/zh-Hant.json create mode 100644 homeassistant/components/flume/.translations/no.json create mode 100644 homeassistant/components/roomba/.translations/no.json create mode 100644 homeassistant/components/synology_dsm/.translations/no.json create mode 100644 homeassistant/components/tado/.translations/no.json create mode 100644 homeassistant/components/totalconnect/.translations/no.json create mode 100644 homeassistant/components/wled/.translations/af.json create mode 100644 homeassistant/components/wled/.translations/ar.json create mode 100644 homeassistant/components/wled/.translations/bs.json create mode 100644 homeassistant/components/wled/.translations/cs.json create mode 100644 homeassistant/components/wled/.translations/cy.json create mode 100644 homeassistant/components/wled/.translations/el.json create mode 100644 homeassistant/components/wled/.translations/eo.json create mode 100644 homeassistant/components/wled/.translations/es-419.json create mode 100644 homeassistant/components/wled/.translations/et.json create mode 100644 homeassistant/components/wled/.translations/eu.json create mode 100644 homeassistant/components/wled/.translations/fa.json create mode 100644 homeassistant/components/wled/.translations/fi.json create mode 100644 homeassistant/components/wled/.translations/gsw.json create mode 100644 homeassistant/components/wled/.translations/he.json create mode 100644 homeassistant/components/wled/.translations/hi.json create mode 100644 homeassistant/components/wled/.translations/hr.json create mode 100644 homeassistant/components/wled/.translations/iba.json create mode 100644 homeassistant/components/wled/.translations/id.json create mode 100644 homeassistant/components/wled/.translations/is.json create mode 100644 homeassistant/components/wled/.translations/ja.json create mode 100644 homeassistant/components/wled/.translations/lt.json create mode 100644 homeassistant/components/wled/.translations/lv.json create mode 100644 homeassistant/components/wled/.translations/pt-BR.json create mode 100644 homeassistant/components/wled/.translations/ro.json create mode 100644 homeassistant/components/wled/.translations/sk.json create mode 100644 homeassistant/components/wled/.translations/sr-Latn.json create mode 100644 homeassistant/components/wled/.translations/sr.json create mode 100644 homeassistant/components/wled/.translations/ta.json create mode 100644 homeassistant/components/wled/.translations/te.json create mode 100644 homeassistant/components/wled/.translations/th.json create mode 100644 homeassistant/components/wled/.translations/tr.json create mode 100644 homeassistant/components/wled/.translations/uk.json create mode 100644 homeassistant/components/wled/.translations/ur.json create mode 100644 homeassistant/components/wled/.translations/vi.json create mode 100644 homeassistant/components/wled/.translations/zh-Hans.json diff --git a/homeassistant/components/abode/.translations/bg.json b/homeassistant/components/abode/.translations/bg.json index 29e3f342cf4d..681acd610153 100644 --- a/homeassistant/components/abode/.translations/bg.json +++ b/homeassistant/components/abode/.translations/bg.json @@ -16,7 +16,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0412\u0430\u0448\u0430\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0432\u0445\u043e\u0434 \u0432 Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ca.json b/homeassistant/components/abode/.translations/ca.json index 7763ff04a7ab..f7431ee79f17 100644 --- a/homeassistant/components/abode/.translations/ca.json +++ b/homeassistant/components/abode/.translations/ca.json @@ -16,7 +16,7 @@ }, "title": "Introducci\u00f3 de la informaci\u00f3 d'inici de sessi\u00f3 a Abode." } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/cs.json b/homeassistant/components/abode/.translations/cs.json index 75c65f01e113..df5855b0cee5 100644 --- a/homeassistant/components/abode/.translations/cs.json +++ b/homeassistant/components/abode/.translations/cs.json @@ -16,7 +16,7 @@ }, "title": "Vypl\u0148te p\u0159ihla\u0161ovac\u00ed \u00fadaje Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/da.json b/homeassistant/components/abode/.translations/da.json index 4a5fa763ea16..410553fac93f 100644 --- a/homeassistant/components/abode/.translations/da.json +++ b/homeassistant/components/abode/.translations/da.json @@ -16,7 +16,7 @@ }, "title": "Udfyld dine Abode-loginoplysninger" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/de.json b/homeassistant/components/abode/.translations/de.json index ed5ec85a5d7b..acfd480e0681 100644 --- a/homeassistant/components/abode/.translations/de.json +++ b/homeassistant/components/abode/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Gib deine Abode-Anmeldeinformationen ein" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/en.json b/homeassistant/components/abode/.translations/en.json index e8daeb22c0a7..6b83daece1e4 100644 --- a/homeassistant/components/abode/.translations/en.json +++ b/homeassistant/components/abode/.translations/en.json @@ -16,7 +16,7 @@ }, "title": "Fill in your Abode login information" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/es-419.json b/homeassistant/components/abode/.translations/es-419.json index f2def50d0630..053078c20314 100644 --- a/homeassistant/components/abode/.translations/es-419.json +++ b/homeassistant/components/abode/.translations/es-419.json @@ -16,7 +16,7 @@ }, "title": "Complete su informaci\u00f3n de inicio de sesi\u00f3n de Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/es.json b/homeassistant/components/abode/.translations/es.json index 908e8f0fbc3f..d7be7f924809 100644 --- a/homeassistant/components/abode/.translations/es.json +++ b/homeassistant/components/abode/.translations/es.json @@ -16,7 +16,7 @@ }, "title": "Rellene la informaci\u00f3n de acceso Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/fr.json b/homeassistant/components/abode/.translations/fr.json index c0c2a35081b1..1cff6db701e8 100644 --- a/homeassistant/components/abode/.translations/fr.json +++ b/homeassistant/components/abode/.translations/fr.json @@ -16,7 +16,7 @@ }, "title": "Remplissez vos informations de connexion Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/hu.json b/homeassistant/components/abode/.translations/hu.json index 385334c8549b..501ca5f43695 100644 --- a/homeassistant/components/abode/.translations/hu.json +++ b/homeassistant/components/abode/.translations/hu.json @@ -16,7 +16,7 @@ }, "title": "T\u00f6ltse ki az Abode bejelentkez\u00e9si adatait" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/it.json b/homeassistant/components/abode/.translations/it.json index af51aca8af92..e3e80942bb23 100644 --- a/homeassistant/components/abode/.translations/it.json +++ b/homeassistant/components/abode/.translations/it.json @@ -16,7 +16,7 @@ }, "title": "Inserisci le tue informazioni di accesso Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ko.json b/homeassistant/components/abode/.translations/ko.json index 9560dde6b3d9..e27cafce1f94 100644 --- a/homeassistant/components/abode/.translations/ko.json +++ b/homeassistant/components/abode/.translations/ko.json @@ -16,7 +16,7 @@ }, "title": "Abode \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/lb.json b/homeassistant/components/abode/.translations/lb.json index ed65a5df7c57..cb75480e75de 100644 --- a/homeassistant/components/abode/.translations/lb.json +++ b/homeassistant/components/abode/.translations/lb.json @@ -16,7 +16,7 @@ }, "title": "F\u00ebllt \u00e4r Abode Login Informatiounen aus." } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/nl.json b/homeassistant/components/abode/.translations/nl.json index 89b5ae0c4a57..de52e9fe28b8 100644 --- a/homeassistant/components/abode/.translations/nl.json +++ b/homeassistant/components/abode/.translations/nl.json @@ -16,7 +16,7 @@ }, "title": "Vul uw Abode-inloggegevens in" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/nn.json b/homeassistant/components/abode/.translations/nn.json index e0c1b6d6a7d6..f7a32b0983e8 100644 --- a/homeassistant/components/abode/.translations/nn.json +++ b/homeassistant/components/abode/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Abode" - } + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/no.json b/homeassistant/components/abode/.translations/no.json index eefd4526d7f4..f2c19a12a18c 100644 --- a/homeassistant/components/abode/.translations/no.json +++ b/homeassistant/components/abode/.translations/no.json @@ -16,7 +16,7 @@ }, "title": "Fyll ut innloggingsinformasjonen for Abode" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pl.json b/homeassistant/components/abode/.translations/pl.json index d086aaca3951..59b0c47ddb0d 100644 --- a/homeassistant/components/abode/.translations/pl.json +++ b/homeassistant/components/abode/.translations/pl.json @@ -16,7 +16,7 @@ }, "title": "Wprowad\u017a informacje logowania Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pt-BR.json b/homeassistant/components/abode/.translations/pt-BR.json index 30980103b38c..741379997006 100644 --- a/homeassistant/components/abode/.translations/pt-BR.json +++ b/homeassistant/components/abode/.translations/pt-BR.json @@ -15,7 +15,7 @@ "username": "Endere\u00e7o de e-mail" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pt.json b/homeassistant/components/abode/.translations/pt.json index 4a371c706f77..2221106987f4 100644 --- a/homeassistant/components/abode/.translations/pt.json +++ b/homeassistant/components/abode/.translations/pt.json @@ -10,7 +10,7 @@ "username": "Endere\u00e7o de e-mail" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ru.json b/homeassistant/components/abode/.translations/ru.json index 590f76627313..1e9e403b00ff 100644 --- a/homeassistant/components/abode/.translations/ru.json +++ b/homeassistant/components/abode/.translations/ru.json @@ -16,7 +16,7 @@ }, "title": "Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/sl.json b/homeassistant/components/abode/.translations/sl.json index b840913b7bea..b75600bf2e28 100644 --- a/homeassistant/components/abode/.translations/sl.json +++ b/homeassistant/components/abode/.translations/sl.json @@ -16,7 +16,7 @@ }, "title": "Izpolnite svoje podatke za prijavo v Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/sv.json b/homeassistant/components/abode/.translations/sv.json index 9a59e4c2007f..7a40f7b9410d 100644 --- a/homeassistant/components/abode/.translations/sv.json +++ b/homeassistant/components/abode/.translations/sv.json @@ -16,7 +16,7 @@ }, "title": "Fyll i din inloggningsinformation f\u00f6r Abode" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/zh-Hant.json b/homeassistant/components/abode/.translations/zh-Hant.json index 5bc9efc36969..7b40e7ffaba9 100644 --- a/homeassistant/components/abode/.translations/zh-Hant.json +++ b/homeassistant/components/abode/.translations/zh-Hant.json @@ -16,7 +16,7 @@ }, "title": "\u586b\u5beb Abode \u767b\u5165\u8cc7\u8a0a" } - }, - "title": "Abode" - } + } + }, + "title": "Abode" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/bg.json b/homeassistant/components/adguard/.translations/bg.json index 398927d370a1..6d43dd7849cb 100644 --- a/homeassistant/components/adguard/.translations/bg.json +++ b/homeassistant/components/adguard/.translations/bg.json @@ -26,7 +26,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0412\u0430\u0448\u0438\u044f AdGuard Home, \u0437\u0430 \u0434\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b.", "title": "\u0421\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u0412\u0430\u0448\u0438\u044f AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ca.json b/homeassistant/components/adguard/.translations/ca.json index 9b7b3c39b03c..43fa21ce5a2c 100644 --- a/homeassistant/components/adguard/.translations/ca.json +++ b/homeassistant/components/adguard/.translations/ca.json @@ -26,7 +26,7 @@ "description": "Configuraci\u00f3 de la inst\u00e0ncia d'AdGuard Home, permet el control i la monitoritzaci\u00f3.", "title": "Enlla\u00e7ar AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/da.json b/homeassistant/components/adguard/.translations/da.json index e9e6415518d8..d03b6c303217 100644 --- a/homeassistant/components/adguard/.translations/da.json +++ b/homeassistant/components/adguard/.translations/da.json @@ -26,7 +26,7 @@ "description": "Konfigurer din AdGuard Home-instans for at tillade overv\u00e5gning og kontrol.", "title": "Forbind din AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/de.json b/homeassistant/components/adguard/.translations/de.json index c1ef5bb7926b..04c1c0eac6fc 100644 --- a/homeassistant/components/adguard/.translations/de.json +++ b/homeassistant/components/adguard/.translations/de.json @@ -26,7 +26,7 @@ "description": "Richte deine AdGuard Home-Instanz ein um sie zu \u00dcberwachen und zu Steuern.", "title": "Verkn\u00fcpfe AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/en.json b/homeassistant/components/adguard/.translations/en.json index 00d048c3343e..d19eabc26ec5 100644 --- a/homeassistant/components/adguard/.translations/en.json +++ b/homeassistant/components/adguard/.translations/en.json @@ -26,7 +26,7 @@ "description": "Set up your AdGuard Home instance to allow monitoring and control.", "title": "Link your AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/es-419.json b/homeassistant/components/adguard/.translations/es-419.json index eb3274f19b66..109513671735 100644 --- a/homeassistant/components/adguard/.translations/es-419.json +++ b/homeassistant/components/adguard/.translations/es-419.json @@ -25,7 +25,7 @@ "description": "Configure su instancia de AdGuard Home para permitir la supervisi\u00f3n y el control.", "title": "Enlace su AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/es.json b/homeassistant/components/adguard/.translations/es.json index 710aa43501f0..4c625cdaf974 100644 --- a/homeassistant/components/adguard/.translations/es.json +++ b/homeassistant/components/adguard/.translations/es.json @@ -26,7 +26,7 @@ "description": "Configure su instancia de AdGuard Home para permitir la supervisi\u00f3n y el control.", "title": "Enlace su AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/fr.json b/homeassistant/components/adguard/.translations/fr.json index 749ba7d9c03d..9f20561b9a99 100644 --- a/homeassistant/components/adguard/.translations/fr.json +++ b/homeassistant/components/adguard/.translations/fr.json @@ -26,7 +26,7 @@ "description": "Configurez votre instance AdGuard Home pour permettre la surveillance et le contr\u00f4le.", "title": "Liez votre AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/it.json b/homeassistant/components/adguard/.translations/it.json index 6dc6ae18d817..fb818140f8c5 100644 --- a/homeassistant/components/adguard/.translations/it.json +++ b/homeassistant/components/adguard/.translations/it.json @@ -26,7 +26,7 @@ "description": "Configura l'istanza di AdGuard Home per consentire il monitoraggio e il controllo.", "title": "Collega la tua AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ko.json b/homeassistant/components/adguard/.translations/ko.json index 02bbb75cd2b0..981bb3f877f2 100644 --- a/homeassistant/components/adguard/.translations/ko.json +++ b/homeassistant/components/adguard/.translations/ko.json @@ -26,7 +26,7 @@ "description": "\ubaa8\ub2c8\ud130\ub9c1 \ubc0f \uc81c\uc5b4\uac00 \uac00\ub2a5\ud558\ub3c4\ub85d AdGuard Home \uc778\uc2a4\ud134\uc2a4\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694.", "title": "AdGuard Home \uc5f0\uacb0" } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/lb.json b/homeassistant/components/adguard/.translations/lb.json index e449f668fd93..806d986f8507 100644 --- a/homeassistant/components/adguard/.translations/lb.json +++ b/homeassistant/components/adguard/.translations/lb.json @@ -26,7 +26,7 @@ "description": "Konfigur\u00e9iert \u00e4r AdGuard Home Instanz fir d'Iwwerwaachung an d'Kontroll z'erlaben.", "title": "Verbannt \u00e4ren AdGuard Home" } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/nl.json b/homeassistant/components/adguard/.translations/nl.json index bd0dcc5fa432..5686ae42f155 100644 --- a/homeassistant/components/adguard/.translations/nl.json +++ b/homeassistant/components/adguard/.translations/nl.json @@ -26,7 +26,7 @@ "description": "Stel uw AdGuard Home-instantie in om toezicht en controle mogelijk te maken.", "title": "Link uw AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/nn.json b/homeassistant/components/adguard/.translations/nn.json index 0e2e82437e82..8f8a98dc2823 100644 --- a/homeassistant/components/adguard/.translations/nn.json +++ b/homeassistant/components/adguard/.translations/nn.json @@ -6,7 +6,7 @@ "username": "Brukarnamn" } } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/no.json b/homeassistant/components/adguard/.translations/no.json index d91f226a7ebd..f40527697c62 100644 --- a/homeassistant/components/adguard/.translations/no.json +++ b/homeassistant/components/adguard/.translations/no.json @@ -26,7 +26,7 @@ "description": "Sett opp din AdGuard Hjem instans for \u00e5 tillate overv\u00e5king og kontroll.", "title": "Koble til ditt AdGuard Hjem." } - }, - "title": "AdGuard Hjem" - } + } + }, + "title": "AdGuard Hjem" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/pl.json b/homeassistant/components/adguard/.translations/pl.json index 69ba6b024e2d..7504155ed6f7 100644 --- a/homeassistant/components/adguard/.translations/pl.json +++ b/homeassistant/components/adguard/.translations/pl.json @@ -26,7 +26,7 @@ "description": "Skonfiguruj instancj\u0119 AdGuard Home, aby umo\u017cliwi\u0107 monitorowanie i kontrol\u0119.", "title": "Po\u0142\u0105cz AdGuard Home" } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/pt-BR.json b/homeassistant/components/adguard/.translations/pt-BR.json index 690947364e1c..d8c1bd75d3e1 100644 --- a/homeassistant/components/adguard/.translations/pt-BR.json +++ b/homeassistant/components/adguard/.translations/pt-BR.json @@ -24,7 +24,7 @@ "description": "Configure sua inst\u00e2ncia do AdGuard Home para permitir o monitoramento e o controle.", "title": "Vincule o seu AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ru.json b/homeassistant/components/adguard/.translations/ru.json index eca46d7db009..39c073ad5bae 100644 --- a/homeassistant/components/adguard/.translations/ru.json +++ b/homeassistant/components/adguard/.translations/ru.json @@ -26,7 +26,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f AdGuard Home.", "title": "AdGuard Home" } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/sl.json b/homeassistant/components/adguard/.translations/sl.json index 974524c932da..62d7bfac76a9 100644 --- a/homeassistant/components/adguard/.translations/sl.json +++ b/homeassistant/components/adguard/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Nastavite primerek AdGuard Home, da omogo\u010dite spremljanje in nadzor.", "title": "Pove\u017eite svoj AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/sv.json b/homeassistant/components/adguard/.translations/sv.json index 519ecef52dbb..704ef784655c 100644 --- a/homeassistant/components/adguard/.translations/sv.json +++ b/homeassistant/components/adguard/.translations/sv.json @@ -26,7 +26,7 @@ "description": "St\u00e4ll in din AdGuard Home-instans f\u00f6r att till\u00e5ta \u00f6vervakning och kontroll.", "title": "L\u00e4nka din AdGuard Home." } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/zh-Hant.json b/homeassistant/components/adguard/.translations/zh-Hant.json index d08a5715a8e8..1687e3936885 100644 --- a/homeassistant/components/adguard/.translations/zh-Hant.json +++ b/homeassistant/components/adguard/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u8a2d\u5b9a AdGuard Home \u4ee5\u9032\u884c\u76e3\u63a7\u3002", "title": "\u9023\u7d50 AdGuard Home\u3002" } - }, - "title": "AdGuard Home" - } + } + }, + "title": "AdGuard Home" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/bg.json b/homeassistant/components/airly/.translations/bg.json index e09d9c0d62ff..fcec0623ec00 100644 --- a/homeassistant/components/airly/.translations/bg.json +++ b/homeassistant/components/airly/.translations/bg.json @@ -15,7 +15,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u0442\u043e \u043d\u0430 \u0432\u044a\u0437\u0434\u0443\u0445\u0430 Airly \u0417\u0430 \u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0430\u0442\u0435 \u043a\u043b\u044e\u0447 \u0437\u0430 API, \u043e\u0442\u0438\u0434\u0435\u0442\u0435 \u043d\u0430 https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ca.json b/homeassistant/components/airly/.translations/ca.json index 00ef4c7180e7..0fbdf397d960 100644 --- a/homeassistant/components/airly/.translations/ca.json +++ b/homeassistant/components/airly/.translations/ca.json @@ -18,7 +18,7 @@ "description": "Configura una integraci\u00f3 de qualitat d\u2019aire Airly. Per generar la clau API, v\u00e9s a https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/da.json b/homeassistant/components/airly/.translations/da.json index b33e9b18da8e..ab56e8721577 100644 --- a/homeassistant/components/airly/.translations/da.json +++ b/homeassistant/components/airly/.translations/da.json @@ -18,7 +18,7 @@ "description": "Konfigurer Airly luftkvalitetsintegration. For at generere API-n\u00f8gle, g\u00e5 til https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/de.json b/homeassistant/components/airly/.translations/de.json index 727b67e3245c..c3090fdd2c2e 100644 --- a/homeassistant/components/airly/.translations/de.json +++ b/homeassistant/components/airly/.translations/de.json @@ -18,7 +18,7 @@ "description": "Einrichtung der Airly-Luftqualit\u00e4t Integration. Um einen API-Schl\u00fcssel zu generieren, registriere dich auf https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/en.json b/homeassistant/components/airly/.translations/en.json index ef485ec610f9..528f0ca60146 100644 --- a/homeassistant/components/airly/.translations/en.json +++ b/homeassistant/components/airly/.translations/en.json @@ -18,7 +18,7 @@ "description": "Set up Airly air quality integration. To generate API key go to https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/es-419.json b/homeassistant/components/airly/.translations/es-419.json index b559fe5029ee..62507451e1ea 100644 --- a/homeassistant/components/airly/.translations/es-419.json +++ b/homeassistant/components/airly/.translations/es-419.json @@ -18,7 +18,7 @@ "description": "Configure la integraci\u00f3n de la calidad del aire de Airly. Para generar la clave API, vaya a https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/es.json b/homeassistant/components/airly/.translations/es.json index b364a45c344e..697fb332c7b7 100644 --- a/homeassistant/components/airly/.translations/es.json +++ b/homeassistant/components/airly/.translations/es.json @@ -18,7 +18,7 @@ "description": "Establecer la integraci\u00f3n de la calidad del aire de Airly. Para generar la clave de la API vaya a https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/fr.json b/homeassistant/components/airly/.translations/fr.json index b11493e337f8..3fe44b47c19c 100644 --- a/homeassistant/components/airly/.translations/fr.json +++ b/homeassistant/components/airly/.translations/fr.json @@ -18,7 +18,7 @@ "description": "Configurez l'int\u00e9gration de la qualit\u00e9 de l'air Airly. Pour g\u00e9n\u00e9rer une cl\u00e9 API, rendez-vous sur https://developer.airly.eu/register.", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/hu.json b/homeassistant/components/airly/.translations/hu.json index ae3990c31ce0..fa22af87cf8b 100644 --- a/homeassistant/components/airly/.translations/hu.json +++ b/homeassistant/components/airly/.translations/hu.json @@ -18,7 +18,7 @@ "description": "Az Airly leveg\u0151min\u0151s\u00e9gi integr\u00e1ci\u00f3j\u00e1nak be\u00e1ll\u00edt\u00e1sa. Api-kulcs l\u00e9trehoz\u00e1s\u00e1hoz nyissa meg a k\u00f6vetkez\u0151 weboldalt: https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/it.json b/homeassistant/components/airly/.translations/it.json index 0453d397bc45..46079d040078 100644 --- a/homeassistant/components/airly/.translations/it.json +++ b/homeassistant/components/airly/.translations/it.json @@ -18,7 +18,7 @@ "description": "Configurazione dell'integrazione della qualit\u00e0 dell'aria Airly. Per generare la chiave API andare su https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ko.json b/homeassistant/components/airly/.translations/ko.json index 75b9bcfc1c4e..f5eb89f9e463 100644 --- a/homeassistant/components/airly/.translations/ko.json +++ b/homeassistant/components/airly/.translations/ko.json @@ -18,7 +18,7 @@ "description": "Airly \uacf5\uae30 \ud488\uc9c8 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4. API \ud0a4\ub97c \uc0dd\uc131\ud558\ub824\uba74 https://developer.airly.eu/register \ub85c \uc774\ub3d9\ud574\uc8fc\uc138\uc694", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/lb.json b/homeassistant/components/airly/.translations/lb.json index 75c77d9481e4..a9154d11f4c7 100644 --- a/homeassistant/components/airly/.translations/lb.json +++ b/homeassistant/components/airly/.translations/lb.json @@ -18,7 +18,7 @@ "description": "Airly Loft Qualit\u00e9it Integratioun ariichten. Fir een API Schl\u00ebssel z'erstelle gitt op https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/nl.json b/homeassistant/components/airly/.translations/nl.json index 2e9c97c82326..e94b35dfb563 100644 --- a/homeassistant/components/airly/.translations/nl.json +++ b/homeassistant/components/airly/.translations/nl.json @@ -18,7 +18,7 @@ "description": "Airly-integratie van luchtkwaliteit instellen. Ga naar https://developer.airly.eu/register om de API-sleutel te genereren", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/nn.json b/homeassistant/components/airly/.translations/nn.json index 7e2f4f1ff6bc..117bf40d2719 100644 --- a/homeassistant/components/airly/.translations/nn.json +++ b/homeassistant/components/airly/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/no.json b/homeassistant/components/airly/.translations/no.json index 492e14713510..ae3b8cd7858e 100644 --- a/homeassistant/components/airly/.translations/no.json +++ b/homeassistant/components/airly/.translations/no.json @@ -18,7 +18,7 @@ "description": "Sett opp Airly luftkvalitet integrering. For \u00e5 generere API-n\u00f8kkel g\u00e5 til https://developer.airly.eu/register", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/pl.json b/homeassistant/components/airly/.translations/pl.json index 85918d7c711b..f2ab2c7d5d6c 100644 --- a/homeassistant/components/airly/.translations/pl.json +++ b/homeassistant/components/airly/.translations/pl.json @@ -18,7 +18,7 @@ "description": "Konfiguracja integracji Airly. By wygenerowa\u0107 klucz API, przejd\u017a na stron\u0119 https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/pt.json b/homeassistant/components/airly/.translations/pt.json index d99bcb907334..f5bdf90b9f1c 100644 --- a/homeassistant/components/airly/.translations/pt.json +++ b/homeassistant/components/airly/.translations/pt.json @@ -8,7 +8,7 @@ }, "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ru.json b/homeassistant/components/airly/.translations/ru.json index 7846d8173c44..010f8dc827b3 100644 --- a/homeassistant/components/airly/.translations/ru.json +++ b/homeassistant/components/airly/.translations/ru.json @@ -18,7 +18,7 @@ "description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 Airly. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 API, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 https://developer.airly.eu/register.", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/sl.json b/homeassistant/components/airly/.translations/sl.json index d77979979109..e329f1208a02 100644 --- a/homeassistant/components/airly/.translations/sl.json +++ b/homeassistant/components/airly/.translations/sl.json @@ -18,7 +18,7 @@ "description": "Nastavite Airly integracijo za kakovost zraka. \u010ce \u017eelite ustvariti API klju\u010d pojdite na https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/sv.json b/homeassistant/components/airly/.translations/sv.json index 7c7d10f47dc4..c435eedd3cf4 100644 --- a/homeassistant/components/airly/.translations/sv.json +++ b/homeassistant/components/airly/.translations/sv.json @@ -18,7 +18,7 @@ "description": "Konfigurera integration av luftkvalitet. F\u00f6r att skapa API-nyckel, g\u00e5 till https://developer.airly.eu/register", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/zh-Hant.json b/homeassistant/components/airly/.translations/zh-Hant.json index 66934d7a986d..fb22747348b5 100644 --- a/homeassistant/components/airly/.translations/zh-Hant.json +++ b/homeassistant/components/airly/.translations/zh-Hant.json @@ -18,7 +18,7 @@ "description": "\u6b32\u8a2d\u5b9a Airly \u7a7a\u6c23\u54c1\u8cea\u6574\u5408\u3002\u8acb\u81f3 https://developer.airly.eu/register \u7522\u751f API \u5bc6\u9470", "title": "Airly" } - }, - "title": "Airly" - } + } + }, + "title": "Airly" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ca.json b/homeassistant/components/airvisual/.translations/ca.json index 070eeee8b514..5a08b7f07ff6 100644 --- a/homeassistant/components/airvisual/.translations/ca.json +++ b/homeassistant/components/airvisual/.translations/ca.json @@ -16,8 +16,7 @@ "description": "Monitoritzaci\u00f3 de la qualitat de l'aire per ubicaci\u00f3 geogr\u00e0fica.", "title": "Configura AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Configuraci\u00f3 d'AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/de.json b/homeassistant/components/airvisual/.translations/de.json index 02f259004280..0c50069f7de6 100644 --- a/homeassistant/components/airvisual/.translations/de.json +++ b/homeassistant/components/airvisual/.translations/de.json @@ -16,8 +16,7 @@ "description": "\u00dcberwachen Sie die Luftqualit\u00e4t an einem geografischen Ort.", "title": "Konfigurieren Sie AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Konfigurieren Sie AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/en.json b/homeassistant/components/airvisual/.translations/en.json index 30d501f1af6b..2749cd65248d 100644 --- a/homeassistant/components/airvisual/.translations/en.json +++ b/homeassistant/components/airvisual/.translations/en.json @@ -16,8 +16,7 @@ "description": "Monitor air quality in a geographical location.", "title": "Configure AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Configure AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/es-419.json b/homeassistant/components/airvisual/.translations/es-419.json index 0a01ec0b2c25..14a73c551cc3 100644 --- a/homeassistant/components/airvisual/.translations/es-419.json +++ b/homeassistant/components/airvisual/.translations/es-419.json @@ -16,8 +16,7 @@ "description": "Monitoree la calidad del aire en una ubicaci\u00f3n geogr\u00e1fica.", "title": "Configurar AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Configurar AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/es.json b/homeassistant/components/airvisual/.translations/es.json index 752593ce29dc..d325b036ada7 100644 --- a/homeassistant/components/airvisual/.translations/es.json +++ b/homeassistant/components/airvisual/.translations/es.json @@ -16,8 +16,7 @@ "description": "Monitorizar la calidad del aire en una ubicaci\u00f3n geogr\u00e1fica.", "title": "Configurar AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Configurar AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/fr.json b/homeassistant/components/airvisual/.translations/fr.json index 6ee4377db953..90571a9c6d4d 100644 --- a/homeassistant/components/airvisual/.translations/fr.json +++ b/homeassistant/components/airvisual/.translations/fr.json @@ -16,8 +16,7 @@ "description": "Surveiller la qualit\u00e9 de l\u2019air dans un emplacement g\u00e9ographique.", "title": "Configurer AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -26,5 +25,6 @@ "title": "Configurer AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/it.json b/homeassistant/components/airvisual/.translations/it.json index 762c99ec4d76..3ac89b1c9685 100644 --- a/homeassistant/components/airvisual/.translations/it.json +++ b/homeassistant/components/airvisual/.translations/it.json @@ -16,8 +16,7 @@ "description": "Monitorare la qualit\u00e0 dell'aria in una posizione geografica.", "title": "Configura AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Configurare AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ko.json b/homeassistant/components/airvisual/.translations/ko.json index 4e1511b2d2d4..55a12a37f096 100644 --- a/homeassistant/components/airvisual/.translations/ko.json +++ b/homeassistant/components/airvisual/.translations/ko.json @@ -16,8 +16,7 @@ "description": "\uc9c0\ub9ac\uc801 \uc704\uce58\uc5d0\uc11c \ub300\uae30\uc9c8\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud569\ub2c8\ub2e4.", "title": "AirVisual \uad6c\uc131" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "AirVisual \uad6c\uc131" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/lb.json b/homeassistant/components/airvisual/.translations/lb.json index a7f20253ef10..f9426000102e 100644 --- a/homeassistant/components/airvisual/.translations/lb.json +++ b/homeassistant/components/airvisual/.translations/lb.json @@ -16,8 +16,7 @@ "description": "Loft Qualit\u00e9it an enger geografescher Lag iwwerwaachen.", "title": "AirVisual konfigur\u00e9ieren" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Airvisual ariichten" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/no.json b/homeassistant/components/airvisual/.translations/no.json index 2a2a1fcd07cc..2c50b00fc12a 100644 --- a/homeassistant/components/airvisual/.translations/no.json +++ b/homeassistant/components/airvisual/.translations/no.json @@ -16,8 +16,7 @@ "description": "Overv\u00e5k luftkvaliteten p\u00e5 et geografisk sted.", "title": "Konfigurer AirVisual" } - }, - "title": "" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Konfigurer AirVisual" } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/pl.json b/homeassistant/components/airvisual/.translations/pl.json index 99c74c3e5cd6..cc96048b3781 100644 --- a/homeassistant/components/airvisual/.translations/pl.json +++ b/homeassistant/components/airvisual/.translations/pl.json @@ -16,8 +16,7 @@ "description": "Monitoruj jako\u015b\u0107 powietrza w okre\u015blonej lokalizacji geograficznej.", "title": "Konfiguracja AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Konfiguracja AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ru.json b/homeassistant/components/airvisual/.translations/ru.json index e8682a0188a3..1784dd55153e 100644 --- a/homeassistant/components/airvisual/.translations/ru.json +++ b/homeassistant/components/airvisual/.translations/ru.json @@ -16,8 +16,7 @@ "description": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438.", "title": "AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/sl.json b/homeassistant/components/airvisual/.translations/sl.json index 6511c7b6da8a..6b4031efb03f 100644 --- a/homeassistant/components/airvisual/.translations/sl.json +++ b/homeassistant/components/airvisual/.translations/sl.json @@ -16,8 +16,7 @@ "description": "Spremljajte kakovost zraka na zemljepisni lokaciji.", "title": "Nastavite AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "Nastavite AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/zh-Hant.json b/homeassistant/components/airvisual/.translations/zh-Hant.json index e40926d4a082..eb4169afe422 100644 --- a/homeassistant/components/airvisual/.translations/zh-Hant.json +++ b/homeassistant/components/airvisual/.translations/zh-Hant.json @@ -16,8 +16,7 @@ "description": "\u4f9d\u5730\u7406\u4f4d\u7f6e\u76e3\u63a7\u7a7a\u6c23\u54c1\u8cea\u3002", "title": "\u8a2d\u5b9a AirVisual" } - }, - "title": "AirVisual" + } }, "options": { "step": { @@ -29,5 +28,6 @@ "title": "\u8a2d\u5b9a AirVisual" } } - } + }, + "title": "AirVisual" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/bg.json b/homeassistant/components/almond/.translations/bg.json index 3327e34e7658..29539f78eab2 100644 --- a/homeassistant/components/almond/.translations/bg.json +++ b/homeassistant/components/almond/.translations/bg.json @@ -9,7 +9,7 @@ "pick_implementation": { "title": "\u0418\u0437\u0431\u043e\u0440 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ca.json b/homeassistant/components/almond/.translations/ca.json index 5cedcfef481c..e5b9b6f64cb4 100644 --- a/homeassistant/components/almond/.translations/ca.json +++ b/homeassistant/components/almond/.translations/ca.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/da.json b/homeassistant/components/almond/.translations/da.json index a752b791988f..12e125f4f667 100644 --- a/homeassistant/components/almond/.translations/da.json +++ b/homeassistant/components/almond/.translations/da.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "V\u00e6lg godkendelsesmetode" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/de.json b/homeassistant/components/almond/.translations/de.json index 89021793f94e..e0c0c8ba0d1d 100644 --- a/homeassistant/components/almond/.translations/de.json +++ b/homeassistant/components/almond/.translations/de.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "W\u00e4hle die Authentifizierungsmethode" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/en.json b/homeassistant/components/almond/.translations/en.json index 96638ef08fb5..27a4106f3f6b 100644 --- a/homeassistant/components/almond/.translations/en.json +++ b/homeassistant/components/almond/.translations/en.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Pick Authentication Method" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/es.json b/homeassistant/components/almond/.translations/es.json index 41e1fad41266..bdecd6454a3d 100644 --- a/homeassistant/components/almond/.translations/es.json +++ b/homeassistant/components/almond/.translations/es.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/fr.json b/homeassistant/components/almond/.translations/fr.json index 30a4cbec6bd5..53a12848c0e8 100644 --- a/homeassistant/components/almond/.translations/fr.json +++ b/homeassistant/components/almond/.translations/fr.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "S\u00e9lectionner une m\u00e9thode d'authentification" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/hu.json b/homeassistant/components/almond/.translations/hu.json index 2331e57c6eb3..30d5b4b60285 100644 --- a/homeassistant/components/almond/.translations/hu.json +++ b/homeassistant/components/almond/.translations/hu.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/it.json b/homeassistant/components/almond/.translations/it.json index dd722907c6ab..b5eeea46850c 100644 --- a/homeassistant/components/almond/.translations/it.json +++ b/homeassistant/components/almond/.translations/it.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Seleziona metodo di autenticazione" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ko.json b/homeassistant/components/almond/.translations/ko.json index ec484ffc0d42..e02232f02728 100644 --- a/homeassistant/components/almond/.translations/ko.json +++ b/homeassistant/components/almond/.translations/ko.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/lb.json b/homeassistant/components/almond/.translations/lb.json index b47ddca4a261..6f696a7b1fa8 100644 --- a/homeassistant/components/almond/.translations/lb.json +++ b/homeassistant/components/almond/.translations/lb.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Wielt Authentifikatiouns Method aus" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/nl.json b/homeassistant/components/almond/.translations/nl.json index 939a9a904ad2..ea7e20a920f2 100644 --- a/homeassistant/components/almond/.translations/nl.json +++ b/homeassistant/components/almond/.translations/nl.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Kies de authenticatie methode" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/nn.json b/homeassistant/components/almond/.translations/nn.json index a25f5dc15745..adee95149287 100644 --- a/homeassistant/components/almond/.translations/nn.json +++ b/homeassistant/components/almond/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Almond" - } + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/no.json b/homeassistant/components/almond/.translations/no.json index 63e1d99f7a9b..d4527c69ba77 100644 --- a/homeassistant/components/almond/.translations/no.json +++ b/homeassistant/components/almond/.translations/no.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Velg autentiseringsmetode" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/pl.json b/homeassistant/components/almond/.translations/pl.json index dc5717539a63..bc26b8f5ff2e 100644 --- a/homeassistant/components/almond/.translations/pl.json +++ b/homeassistant/components/almond/.translations/pl.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Wybierz metod\u0119 uwierzytelniania" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/pt.json b/homeassistant/components/almond/.translations/pt.json index 720400e72a5f..efb460f0e016 100644 --- a/homeassistant/components/almond/.translations/pt.json +++ b/homeassistant/components/almond/.translations/pt.json @@ -4,7 +4,7 @@ "pick_implementation": { "title": "Escolha o m\u00e9todo de autentica\u00e7\u00e3o" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ru.json b/homeassistant/components/almond/.translations/ru.json index 021629808943..dd9004a6b198 100644 --- a/homeassistant/components/almond/.translations/ru.json +++ b/homeassistant/components/almond/.translations/ru.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/sl.json b/homeassistant/components/almond/.translations/sl.json index 4a593cc56059..b24954bb955e 100644 --- a/homeassistant/components/almond/.translations/sl.json +++ b/homeassistant/components/almond/.translations/sl.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "Izberite na\u010din preverjanja pristnosti" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/sv.json b/homeassistant/components/almond/.translations/sv.json index d2630b95c02b..5ce4086ce155 100644 --- a/homeassistant/components/almond/.translations/sv.json +++ b/homeassistant/components/almond/.translations/sv.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "V\u00e4lj autentiseringsmetod" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/zh-Hant.json b/homeassistant/components/almond/.translations/zh-Hant.json index 9522e350eead..65b6198c9aef 100644 --- a/homeassistant/components/almond/.translations/zh-Hant.json +++ b/homeassistant/components/almond/.translations/zh-Hant.json @@ -13,7 +13,7 @@ "pick_implementation": { "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } - }, - "title": "Almond" - } + } + }, + "title": "Almond" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/bg.json b/homeassistant/components/ambiclimate/.translations/bg.json index 4795267cd5e8..e7c68a67b737 100644 --- a/homeassistant/components/ambiclimate/.translations/bg.json +++ b/homeassistant/components/ambiclimate/.translations/bg.json @@ -17,7 +17,7 @@ "description": "\u041c\u043e\u043b\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u0432\u0430\u0439\u0442\u0435 \u0442\u043e\u0437\u0438 [link]({authorization_url}) \u0438 \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f\u0430 \u0434\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0430 \u0441\u0438 \u0432 Ambiclimate, \u0441\u043b\u0435\u0434 \u0442\u043e\u0432\u0430 \u0441\u0435 \u0432\u044a\u0440\u043d\u0435\u0442\u0435 \u0438 \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0418\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435 \u043f\u043e-\u0434\u043e\u043b\u0443. \n (\u0423\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u043f\u043e\u0441\u043e\u0447\u0435\u043d\u0438\u044f\u0442 url \u0437\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0430 \u043f\u043e\u0432\u0438\u043a\u0432\u0430\u043d\u0435 \u0435 {cb_url})", "title": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0438\u0440\u0430\u043d\u0435 \u0441 Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ca.json b/homeassistant/components/ambiclimate/.translations/ca.json index f446bf7390f9..1e9fe221fbf2 100644 --- a/homeassistant/components/ambiclimate/.translations/ca.json +++ b/homeassistant/components/ambiclimate/.translations/ca.json @@ -17,7 +17,7 @@ "description": "V\u00e9s a l'[enlla\u00e7]({authorization_url}) i Permet l'acc\u00e9s al teu compte de Ambiclimate, despr\u00e9s torna i prem Envia (a sota).\n(Assegura't que l'enlla\u00e7 de retorn \u00e9s el seg\u00fcent {cb_url})", "title": "Autenticaci\u00f3 amb Ambi Climate" } - }, - "title": "Ambi Climate" - } + } + }, + "title": "Ambi Climate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/cs.json b/homeassistant/components/ambiclimate/.translations/cs.json index d34169edfc73..3f71608800a5 100644 --- a/homeassistant/components/ambiclimate/.translations/cs.json +++ b/homeassistant/components/ambiclimate/.translations/cs.json @@ -9,7 +9,7 @@ "description": "N\u00e1sledujte tento [odkaz]({authorization_url}) a Povolit p\u0159\u00edstup k va\u0161emu \u00fa\u010dtu Ambiclimate, pot\u00e9 se vra\u0165te a stiskn\u011bte Odeslat n\u00ed\u017ee. \n (Ujist\u011bte se, \u017ee zadan\u00e1 adresa URL zp\u011btn\u00e9ho vol\u00e1n\u00ed je {cb_url} )", "title": "Ov\u011b\u0159it Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/da.json b/homeassistant/components/ambiclimate/.translations/da.json index b57a0e157973..0039e484a05b 100644 --- a/homeassistant/components/ambiclimate/.translations/da.json +++ b/homeassistant/components/ambiclimate/.translations/da.json @@ -17,7 +17,7 @@ "description": "F\u00f8lg dette [link]({authorization_url}) og Tillad adgang til din Ambiclimate-konto, vend s\u00e5 tilbage og tryk p\u00e5 Indsend nedenfor.\n(Kontroll\u00e9r den angivne callback url er {cb_url})", "title": "Godkend Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/de.json b/homeassistant/components/ambiclimate/.translations/de.json index 68d714cfc1be..2b21e1c0553a 100644 --- a/homeassistant/components/ambiclimate/.translations/de.json +++ b/homeassistant/components/ambiclimate/.translations/de.json @@ -17,7 +17,7 @@ "description": "Bitte folge diesem [link] ({authorization_url}) und Erlaube Zugriff auf dein Ambiclimate-Konto, komme dann zur\u00fcck und dr\u00fccke Senden darunter.\n (Pr\u00fcfe, dass die Callback-URL {cb_url} ist.)", "title": "Ambiclimate authentifizieren" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/en.json b/homeassistant/components/ambiclimate/.translations/en.json index da1e173b4a81..780599c2163e 100644 --- a/homeassistant/components/ambiclimate/.translations/en.json +++ b/homeassistant/components/ambiclimate/.translations/en.json @@ -17,7 +17,7 @@ "description": "Please follow this [link]({authorization_url}) and Allow access to your Ambiclimate account, then come back and press Submit below.\n(Make sure the specified callback url is {cb_url})", "title": "Authenticate Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/es-419.json b/homeassistant/components/ambiclimate/.translations/es-419.json index 607454f4402f..93b9067414ec 100644 --- a/homeassistant/components/ambiclimate/.translations/es-419.json +++ b/homeassistant/components/ambiclimate/.translations/es-419.json @@ -17,7 +17,7 @@ "description": "Por favor, siga este [link]('authorization_url') y Permitir acceso a su cuenta de Ambiclimate, luego vuelva y presione Enviar a continuaci\u00f3n.\n(Aseg\u00farese de que la url de devoluci\u00f3n de llamada especificada es {cb_url})", "title": "Autenticaci\u00f3n de Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/es.json b/homeassistant/components/ambiclimate/.translations/es.json index 6447926f64ec..7ec8e2418a66 100644 --- a/homeassistant/components/ambiclimate/.translations/es.json +++ b/homeassistant/components/ambiclimate/.translations/es.json @@ -17,7 +17,7 @@ "description": "Accede al siguiente [enlace]({authorization_url}) y permite el acceso a tu cuenta de Ambiclimate, despu\u00e9s vuelve y pulsa en enviar a continuaci\u00f3n.\n(Aseg\u00farate que la url de devoluci\u00f3n de llamada es {cb_url})", "title": "Autenticaci\u00f3n de Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/fr.json b/homeassistant/components/ambiclimate/.translations/fr.json index 6d09fd6ee054..f62d3de9252e 100644 --- a/homeassistant/components/ambiclimate/.translations/fr.json +++ b/homeassistant/components/ambiclimate/.translations/fr.json @@ -17,7 +17,7 @@ "description": "Suivez ce [lien] ( {authorization_url} ) et Autorisez l'acc\u00e8s \u00e0 votre compte Ambiclimate, puis revenez et appuyez sur Envoyer ci-dessous. \n (Assurez-vous que l'URL de rappel sp\u00e9cifi\u00e9 est {cb_url} )", "title": "Authentifier Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/it.json b/homeassistant/components/ambiclimate/.translations/it.json index a13874b36764..22de0b870e49 100644 --- a/homeassistant/components/ambiclimate/.translations/it.json +++ b/homeassistant/components/ambiclimate/.translations/it.json @@ -17,7 +17,7 @@ "description": "Segui questo [link]({authorization_url}) e Consenti accesso al tuo account Ambiclimate, quindi torna indietro e premi Invia qui sotto. \n (Assicurati che l'URL di richiamata specificato sia {cb_url})", "title": "Autenticare Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ko.json b/homeassistant/components/ambiclimate/.translations/ko.json index 3b21726bcbeb..6d4aeaf21ce5 100644 --- a/homeassistant/components/ambiclimate/.translations/ko.json +++ b/homeassistant/components/ambiclimate/.translations/ko.json @@ -17,7 +17,7 @@ "description": "[\ub9c1\ud06c]({authorization_url}) \ub97c \ud074\ub9ad\ud558\uc5ec Ambi Climate \uacc4\uc815\uc5d0 \ub300\ud574 \ud5c8\uc6a9 \ud55c \ub2e4\uc74c, \ub2e4\uc2dc \ub3cc\uc544\uc640\uc11c \ud558\ub2e8\uc758 Submit \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694. \n(\ucf5c\ubc31 url \uc744 {cb_url} \ub85c \uad6c\uc131\ud588\ub294\uc9c0 \ud655\uc778\ud574\uc8fc\uc138\uc694)", "title": "Ambi Climate \uc778\uc99d" } - }, - "title": "Ambi Climate" - } + } + }, + "title": "Ambi Climate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/lb.json b/homeassistant/components/ambiclimate/.translations/lb.json index 88be279ae7a2..6ce77e0cd953 100644 --- a/homeassistant/components/ambiclimate/.translations/lb.json +++ b/homeassistant/components/ambiclimate/.translations/lb.json @@ -17,7 +17,7 @@ "description": "Follegt d\u00ebsem [Link]({authorization_url}) an erlaabtt den Acc\u00e8s zu \u00e4rem Ambiclimate Kont , a kommt dann zer\u00e9ck heihin an dr\u00e9ck op ofsch\u00e9cken hei \u00ebnnen.\n(Stellt s\u00e9cher dass den Type vun Callback {cb_url} ass.)", "title": "Ambiclimate authentifiz\u00e9ieren" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/nl.json b/homeassistant/components/ambiclimate/.translations/nl.json index ca4d0b912ab7..2b782dd5c3d0 100644 --- a/homeassistant/components/ambiclimate/.translations/nl.json +++ b/homeassistant/components/ambiclimate/.translations/nl.json @@ -17,7 +17,7 @@ "description": "Volg deze [link] ( {authorization_url} ) en Toestaan toegang tot uw Ambiclimate-account, kom dan terug en druk hieronder op Verzenden . \n (Zorg ervoor dat de opgegeven callback-URL {cb_url} )", "title": "Authenticatie Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/nn.json b/homeassistant/components/ambiclimate/.translations/nn.json index ce8a3ed9db6b..31e478697d70 100644 --- a/homeassistant/components/ambiclimate/.translations/nn.json +++ b/homeassistant/components/ambiclimate/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Ambiclimate" - } + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/no.json b/homeassistant/components/ambiclimate/.translations/no.json index 3f8e8444cf08..ae69e238fff5 100644 --- a/homeassistant/components/ambiclimate/.translations/no.json +++ b/homeassistant/components/ambiclimate/.translations/no.json @@ -17,7 +17,7 @@ "description": "Vennligst f\u00f8lg denne [linken]({authorization_url}) og Tillat tilgang til din Ambiclimate konto, kom deretter tilbake og trykk Send nedenfor.\n(Kontroller at den angitte URL-adressen for tilbakeringing er {cb_url})", "title": "Autensiere Ambiclimate" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/pl.json b/homeassistant/components/ambiclimate/.translations/pl.json index 18f5d043dbce..1696fb3d6b74 100644 --- a/homeassistant/components/ambiclimate/.translations/pl.json +++ b/homeassistant/components/ambiclimate/.translations/pl.json @@ -9,15 +9,15 @@ "default": "Pomy\u015blnie uwierzytelniono z Ambiclimate" }, "error": { - "follow_link": "Prosz\u0119 klikn\u0105\u0107 link i uwierzytelni\u0107 przed naci\u015bni\u0119ciem przycisku Prze\u015blij", + "follow_link": "Prosz\u0119 klikn\u0105\u0107 link i uwierzytelni\u0107 przed naci\u015bni\u0119ciem przycisku \"Zatwierd\u017a\"", "no_token": "Nieuwierzytelniony z Ambiclimate" }, "step": { "auth": { - "description": "Kliknij poni\u017cszy [link]({authorization_url}) i Zezw\u00f3l na dost\u0119p do konta Ambiclimate, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Prze\u015blij poni\u017cej. \n(Upewnij si\u0119, \u017ce podany adres URL to {cb_url})", + "description": "Kliknij poni\u017cszy [link]({authorization_url}) i Zezw\u00f3l na dost\u0119p do konta Ambiclimate, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Zatwierd\u017a poni\u017cej. \n(Upewnij si\u0119, \u017ce podany adres URL to {cb_url})", "title": "Uwierzytelnienie Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/pt-BR.json b/homeassistant/components/ambiclimate/.translations/pt-BR.json index 4de4190d0558..7187dfd0e842 100644 --- a/homeassistant/components/ambiclimate/.translations/pt-BR.json +++ b/homeassistant/components/ambiclimate/.translations/pt-BR.json @@ -17,7 +17,7 @@ "description": "Por favor, siga este [link]({authorization_url}) e Permitir acesso \u00e0 sua conta Ambiclimate, em seguida, volte e pressione Enviar abaixo. \n (Verifique se a URL de retorno de chamada especificada \u00e9 {cb_url})", "title": "Autenticar Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ru.json b/homeassistant/components/ambiclimate/.translations/ru.json index 2a99430e4369..cd3ad4ba29ef 100644 --- a/homeassistant/components/ambiclimate/.translations/ru.json +++ b/homeassistant/components/ambiclimate/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e [\u0441\u0441\u044b\u043b\u043a\u0435]({authorization_url}) \u0438 \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0412\u0430\u0448\u0435\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Ambi Climate, \u0437\u0430\u0442\u0435\u043c \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u041f\u041e\u0414\u0422\u0412\u0415\u0420\u0414\u0418\u0422\u042c. \n(\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URL \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 {cb_url})", "title": "Ambi Climate" } - }, - "title": "Ambi Climate" - } + } + }, + "title": "Ambi Climate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/sl.json b/homeassistant/components/ambiclimate/.translations/sl.json index c5d84f030fa1..06429d200d99 100644 --- a/homeassistant/components/ambiclimate/.translations/sl.json +++ b/homeassistant/components/ambiclimate/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Sledite temu povezavi ( {authorization_url} in Dovoli dostopu do svojega ra\u010duna Ambiclimate, nato se vrnite in pritisnite Po\u0161lji spodaj. \n (Poskrbite, da je dolo\u010den url za povratni klic {cb_url} )", "title": "Overi Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/sv.json b/homeassistant/components/ambiclimate/.translations/sv.json index f52bb6697f9a..f82c899184a3 100644 --- a/homeassistant/components/ambiclimate/.translations/sv.json +++ b/homeassistant/components/ambiclimate/.translations/sv.json @@ -17,7 +17,7 @@ "description": "V\u00e4nligen f\u00f6lj denna [l\u00e4nk] ({authorization_url}) och till\u00e5ta till g\u00e5ng till ditt Ambiclimate konto, kom sedan tillbaka och tryck p\u00e5 Skicka nedan.\n(Kontrollera att den angivna callback url \u00e4r {cb_url})", "title": "Autentisera Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/zh-Hant.json b/homeassistant/components/ambiclimate/.translations/zh-Hant.json index 1539429d0efc..0490f2f7f962 100644 --- a/homeassistant/components/ambiclimate/.translations/zh-Hant.json +++ b/homeassistant/components/ambiclimate/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u8acb\u4f7f\u7528\u6b64[\u9023\u7d50]\uff08{authorization_url}\uff09\u4e26\u9ede\u9078\u5141\u8a31\u4ee5\u5b58\u53d6 Ambiclimate \u5e33\u865f\uff0c\u7136\u5f8c\u8fd4\u56de\u6b64\u9801\u9762\u4e26\u9ede\u9078\u4e0b\u65b9\u7684\u50b3\u9001\u3002\n\uff08\u78ba\u5b9a Callback url \u70ba {cb_url}\uff09", "title": "\u8a8d\u8b49 Ambiclimate" } - }, - "title": "Ambiclimate" - } + } + }, + "title": "Ambiclimate" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/bg.json b/homeassistant/components/ambient_station/.translations/bg.json index df9fe8866ac8..0edb0b06e243 100644 --- a/homeassistant/components/ambient_station/.translations/bg.json +++ b/homeassistant/components/ambient_station/.translations/bg.json @@ -12,7 +12,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } - }, - "title": "\u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u0430 PWS" - } + } + }, + "title": "\u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u0430 PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ca.json b/homeassistant/components/ambient_station/.translations/ca.json index 0991c74b0a5d..75a12da869cf 100644 --- a/homeassistant/components/ambient_station/.translations/ca.json +++ b/homeassistant/components/ambient_station/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Introdueix la teva informaci\u00f3" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/da.json b/homeassistant/components/ambient_station/.translations/da.json index 5028a84eb317..ddceeb5c5dc1 100644 --- a/homeassistant/components/ambient_station/.translations/da.json +++ b/homeassistant/components/ambient_station/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Udfyld dine oplysninger" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/de.json b/homeassistant/components/ambient_station/.translations/de.json index 9213007e935d..434c30071825 100644 --- a/homeassistant/components/ambient_station/.translations/de.json +++ b/homeassistant/components/ambient_station/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Gib deine Informationen ein" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/en.json b/homeassistant/components/ambient_station/.translations/en.json index c3e2a40ab13a..bd9a4a659c84 100644 --- a/homeassistant/components/ambient_station/.translations/en.json +++ b/homeassistant/components/ambient_station/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Fill in your information" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/es-419.json b/homeassistant/components/ambient_station/.translations/es-419.json index 4cca42afbf4e..425cc1bc94f4 100644 --- a/homeassistant/components/ambient_station/.translations/es-419.json +++ b/homeassistant/components/ambient_station/.translations/es-419.json @@ -12,7 +12,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/es.json b/homeassistant/components/ambient_station/.translations/es.json index ae8b829d56e5..0a5e46514c16 100644 --- a/homeassistant/components/ambient_station/.translations/es.json +++ b/homeassistant/components/ambient_station/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "Ambiente PWS" - } + } + }, + "title": "Ambiente PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/fr.json b/homeassistant/components/ambient_station/.translations/fr.json index 34490332c129..4b915da3565f 100644 --- a/homeassistant/components/ambient_station/.translations/fr.json +++ b/homeassistant/components/ambient_station/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "Veuillez saisir vos informations" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/hu.json b/homeassistant/components/ambient_station/.translations/hu.json index 6febc6ec20da..f7ee20987a83 100644 --- a/homeassistant/components/ambient_station/.translations/hu.json +++ b/homeassistant/components/ambient_station/.translations/hu.json @@ -12,7 +12,7 @@ }, "title": "T\u00f6ltsd ki az adataid" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/it.json b/homeassistant/components/ambient_station/.translations/it.json index e5c27bd39397..7b3b4bb9f358 100644 --- a/homeassistant/components/ambient_station/.translations/it.json +++ b/homeassistant/components/ambient_station/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Inserisci i tuoi dati" } - }, - "title": "PWS ambientale" - } + } + }, + "title": "PWS ambientale" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ko.json b/homeassistant/components/ambient_station/.translations/ko.json index 2aa386889570..081370192845 100644 --- a/homeassistant/components/ambient_station/.translations/ko.json +++ b/homeassistant/components/ambient_station/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/lb.json b/homeassistant/components/ambient_station/.translations/lb.json index 1c6f9224c570..e4d6c2c823fd 100644 --- a/homeassistant/components/ambient_station/.translations/lb.json +++ b/homeassistant/components/ambient_station/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/nl.json b/homeassistant/components/ambient_station/.translations/nl.json index bc8f90057e39..1054d22b2e25 100644 --- a/homeassistant/components/ambient_station/.translations/nl.json +++ b/homeassistant/components/ambient_station/.translations/nl.json @@ -12,7 +12,7 @@ }, "title": "Vul uw gegevens in" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/nn.json b/homeassistant/components/ambient_station/.translations/nn.json index 0f878b363c92..1774198088a1 100644 --- a/homeassistant/components/ambient_station/.translations/nn.json +++ b/homeassistant/components/ambient_station/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Ambient PWS" - } + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/no.json b/homeassistant/components/ambient_station/.translations/no.json index b69081286ed0..5ad62a7877e3 100644 --- a/homeassistant/components/ambient_station/.translations/no.json +++ b/homeassistant/components/ambient_station/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pl.json b/homeassistant/components/ambient_station/.translations/pl.json index 45d98e64dbbd..74a24d2f912c 100644 --- a/homeassistant/components/ambient_station/.translations/pl.json +++ b/homeassistant/components/ambient_station/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Wprowad\u017a dane" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pt-BR.json b/homeassistant/components/ambient_station/.translations/pt-BR.json index 533d46ca8b78..a53edc2ab4cb 100644 --- a/homeassistant/components/ambient_station/.translations/pt-BR.json +++ b/homeassistant/components/ambient_station/.translations/pt-BR.json @@ -12,7 +12,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es" } - }, - "title": "Ambiente PWS" - } + } + }, + "title": "Ambiente PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pt.json b/homeassistant/components/ambient_station/.translations/pt.json index 61d8bf3ae1ce..ca258dbc9dc9 100644 --- a/homeassistant/components/ambient_station/.translations/pt.json +++ b/homeassistant/components/ambient_station/.translations/pt.json @@ -12,7 +12,7 @@ }, "title": "Preencha as suas informa\u00e7\u00f5es" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ru.json b/homeassistant/components/ambient_station/.translations/ru.json index e1f01d1567fe..ee6ddcd32c5e 100644 --- a/homeassistant/components/ambient_station/.translations/ru.json +++ b/homeassistant/components/ambient_station/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "Ambient PWS" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/sl.json b/homeassistant/components/ambient_station/.translations/sl.json index 4f9389e7e498..676f6f9dee90 100644 --- a/homeassistant/components/ambient_station/.translations/sl.json +++ b/homeassistant/components/ambient_station/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Izpolnite svoje podatke" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/sv.json b/homeassistant/components/ambient_station/.translations/sv.json index 2f68fe4332d6..5adce28ab088 100644 --- a/homeassistant/components/ambient_station/.translations/sv.json +++ b/homeassistant/components/ambient_station/.translations/sv.json @@ -12,7 +12,7 @@ }, "title": "Fyll i dina uppgifter" } - }, - "title": "Ambient Weather PWS (Personal Weather Station)" - } + } + }, + "title": "Ambient Weather PWS (Personal Weather Station)" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/zh-Hans.json b/homeassistant/components/ambient_station/.translations/zh-Hans.json index dc6f2d51ee9e..5a0255e74d79 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hans.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hans.json @@ -12,7 +12,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } - }, - "title": "Ambient PWS" - } + } + }, + "title": "Ambient PWS" } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/zh-Hant.json b/homeassistant/components/ambient_station/.translations/zh-Hant.json index fdc7b87aa6bc..59f8b132e74c 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hant.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u586b\u5beb\u8cc7\u8a0a" } - }, - "title": "\u74b0\u5883 PWS" - } + } + }, + "title": "\u74b0\u5883 PWS" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/bg.json b/homeassistant/components/arcam_fmj/.translations/bg.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/bg.json +++ b/homeassistant/components/arcam_fmj/.translations/bg.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/ca.json b/homeassistant/components/arcam_fmj/.translations/ca.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/ca.json +++ b/homeassistant/components/arcam_fmj/.translations/ca.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/da.json b/homeassistant/components/arcam_fmj/.translations/da.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/da.json +++ b/homeassistant/components/arcam_fmj/.translations/da.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/de.json b/homeassistant/components/arcam_fmj/.translations/de.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/de.json +++ b/homeassistant/components/arcam_fmj/.translations/de.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/en.json b/homeassistant/components/arcam_fmj/.translations/en.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/en.json +++ b/homeassistant/components/arcam_fmj/.translations/en.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/es-419.json b/homeassistant/components/arcam_fmj/.translations/es-419.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/es-419.json +++ b/homeassistant/components/arcam_fmj/.translations/es-419.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/es.json b/homeassistant/components/arcam_fmj/.translations/es.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/es.json +++ b/homeassistant/components/arcam_fmj/.translations/es.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/fr.json b/homeassistant/components/arcam_fmj/.translations/fr.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/fr.json +++ b/homeassistant/components/arcam_fmj/.translations/fr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/it.json b/homeassistant/components/arcam_fmj/.translations/it.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/it.json +++ b/homeassistant/components/arcam_fmj/.translations/it.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/ko.json b/homeassistant/components/arcam_fmj/.translations/ko.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/ko.json +++ b/homeassistant/components/arcam_fmj/.translations/ko.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/lb.json b/homeassistant/components/arcam_fmj/.translations/lb.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/lb.json +++ b/homeassistant/components/arcam_fmj/.translations/lb.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/nl.json b/homeassistant/components/arcam_fmj/.translations/nl.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/nl.json +++ b/homeassistant/components/arcam_fmj/.translations/nl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/nn.json b/homeassistant/components/arcam_fmj/.translations/nn.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/nn.json +++ b/homeassistant/components/arcam_fmj/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/no.json b/homeassistant/components/arcam_fmj/.translations/no.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/no.json +++ b/homeassistant/components/arcam_fmj/.translations/no.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/pl.json b/homeassistant/components/arcam_fmj/.translations/pl.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/pl.json +++ b/homeassistant/components/arcam_fmj/.translations/pl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/pt-BR.json b/homeassistant/components/arcam_fmj/.translations/pt-BR.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/pt-BR.json +++ b/homeassistant/components/arcam_fmj/.translations/pt-BR.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/ru.json b/homeassistant/components/arcam_fmj/.translations/ru.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/ru.json +++ b/homeassistant/components/arcam_fmj/.translations/ru.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/sl.json b/homeassistant/components/arcam_fmj/.translations/sl.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/sl.json +++ b/homeassistant/components/arcam_fmj/.translations/sl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/sv.json b/homeassistant/components/arcam_fmj/.translations/sv.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/sv.json +++ b/homeassistant/components/arcam_fmj/.translations/sv.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/arcam_fmj/.translations/zh-Hant.json b/homeassistant/components/arcam_fmj/.translations/zh-Hant.json index b0ad4660d0fe..b78b8cbaa7b9 100644 --- a/homeassistant/components/arcam_fmj/.translations/zh-Hant.json +++ b/homeassistant/components/arcam_fmj/.translations/zh-Hant.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Arcam FMJ" - } + "title": "Arcam FMJ" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ca.json b/homeassistant/components/august/.translations/ca.json index 561b91799bea..01cd9146f499 100644 --- a/homeassistant/components/august/.translations/ca.json +++ b/homeassistant/components/august/.translations/ca.json @@ -26,7 +26,7 @@ "description": "Comprova el teu {login_method} ({username}) i introdueix el codi de verificaci\u00f3 a continuaci\u00f3", "title": "Autenticaci\u00f3 de dos factors" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/da.json b/homeassistant/components/august/.translations/da.json index d63bcf9accab..5159d8b9f265 100644 --- a/homeassistant/components/august/.translations/da.json +++ b/homeassistant/components/august/.translations/da.json @@ -26,7 +26,7 @@ "description": "Kontroller dit {login_method} ({username}), og angiv bekr\u00e6ftelseskoden nedenfor", "title": "Tofaktorgodkendelse" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/de.json b/homeassistant/components/august/.translations/de.json index 8d34eaaf5ee9..94e2e76d9198 100644 --- a/homeassistant/components/august/.translations/de.json +++ b/homeassistant/components/august/.translations/de.json @@ -26,7 +26,7 @@ "description": "Bitte \u00fcberpr\u00fcfen Sie Ihre {login_method} ({username}) und geben Sie den Best\u00e4tigungscode ein", "title": "Zwei-Faktor-Authentifizierung" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/en.json b/homeassistant/components/august/.translations/en.json index 32c628f0b0dc..0a86c59934b9 100644 --- a/homeassistant/components/august/.translations/en.json +++ b/homeassistant/components/august/.translations/en.json @@ -26,7 +26,7 @@ "description": "Please check your {login_method} ({username}) and enter the verification code below", "title": "Two factor authentication" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/es.json b/homeassistant/components/august/.translations/es.json index 31d8b986d27d..7f47a67ba219 100644 --- a/homeassistant/components/august/.translations/es.json +++ b/homeassistant/components/august/.translations/es.json @@ -26,7 +26,7 @@ "description": "Por favor, comprueba tu {login_method} ({username}) e introduce el c\u00f3digo de verificaci\u00f3n a continuaci\u00f3n", "title": "Autenticaci\u00f3n de dos factores" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/fr.json b/homeassistant/components/august/.translations/fr.json index 6b94dbc53ee4..d7191e0a317f 100644 --- a/homeassistant/components/august/.translations/fr.json +++ b/homeassistant/components/august/.translations/fr.json @@ -24,7 +24,7 @@ }, "title": "Authentification \u00e0 deux facteurs" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/it.json b/homeassistant/components/august/.translations/it.json index 98445345f96a..1c992f4351bf 100644 --- a/homeassistant/components/august/.translations/it.json +++ b/homeassistant/components/august/.translations/it.json @@ -26,7 +26,7 @@ "description": "Controlla il tuo {login_method} ({username}) e inserisci il codice di verifica seguente", "title": "Autenticazione a due fattori" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ko.json b/homeassistant/components/august/.translations/ko.json index 018bb9d6a56f..bdceb09daef1 100644 --- a/homeassistant/components/august/.translations/ko.json +++ b/homeassistant/components/august/.translations/ko.json @@ -26,7 +26,7 @@ "description": "{login_method} ({username}) \uc744(\ub97c) \ud655\uc778\ud558\uace0 \uc544\ub798\uc5d0 \uc778\uc99d \ucf54\ub4dc\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "2\ub2e8\uacc4 \uc778\uc99d" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/lb.json b/homeassistant/components/august/.translations/lb.json index 514ad6786d4a..bdbe41fbcf58 100644 --- a/homeassistant/components/august/.translations/lb.json +++ b/homeassistant/components/august/.translations/lb.json @@ -26,7 +26,7 @@ "description": "Pr\u00e9ift w.e.g. \u00c4re {login_method} ({username}) a gitt de Verifikatiounscode hei dr\u00ebnner an", "title": "2-Faktor-Authentifikatioun" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/no.json b/homeassistant/components/august/.translations/no.json index 449989bade1e..51b6add6a918 100644 --- a/homeassistant/components/august/.translations/no.json +++ b/homeassistant/components/august/.translations/no.json @@ -26,7 +26,7 @@ "description": "Kontroller {login_method} ({username}) og skriv inn bekreftelseskoden nedenfor", "title": "To-faktor autentisering" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ru.json b/homeassistant/components/august/.translations/ru.json index fc90b3e8bb5b..6a0eae5d05f9 100644 --- a/homeassistant/components/august/.translations/ru.json +++ b/homeassistant/components/august/.translations/ru.json @@ -26,7 +26,7 @@ "description": "\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 {login_method} ({username}) \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434.", "title": "\u0414\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/sl.json b/homeassistant/components/august/.translations/sl.json index d0497278fee6..67b85faf8062 100644 --- a/homeassistant/components/august/.translations/sl.json +++ b/homeassistant/components/august/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Preverite svoj {login_method} ({username}) in spodaj vnesite verifikacijsko kodo", "title": "Dvofaktorska avtentikacija" } - }, - "title": "Avgust" - } + } + }, + "title": "Avgust" } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/zh-Hant.json b/homeassistant/components/august/.translations/zh-Hant.json index 193b9a46e3f6..2ec3e6debaf6 100644 --- a/homeassistant/components/august/.translations/zh-Hant.json +++ b/homeassistant/components/august/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u8acb\u78ba\u8a8d {login_method} ({username}) \u4e26\u65bc\u4e0b\u65b9\u8f38\u5165\u9a57\u8b49\u78bc", "title": "\u5169\u6b65\u9a5f\u9a57\u8b49" } - }, - "title": "August" - } + } + }, + "title": "August" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/bg.json b/homeassistant/components/axis/.translations/bg.json index c56822ba5a47..83fbfa0118c2 100644 --- a/homeassistant/components/axis/.translations/bg.json +++ b/homeassistant/components/axis/.translations/bg.json @@ -23,7 +23,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0442 Axis" } - }, - "title": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Axis" - } + } + }, + "title": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/ca.json b/homeassistant/components/axis/.translations/ca.json index b391af0e609e..5ca4c474bc9c 100644 --- a/homeassistant/components/axis/.translations/ca.json +++ b/homeassistant/components/axis/.translations/ca.json @@ -23,7 +23,7 @@ }, "title": "Configuraci\u00f3 de dispositiu Axis" } - }, - "title": "Dispositiu Axis" - } + } + }, + "title": "Dispositiu Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/da.json b/homeassistant/components/axis/.translations/da.json index 21f33d120f7a..78e4e200082c 100644 --- a/homeassistant/components/axis/.translations/da.json +++ b/homeassistant/components/axis/.translations/da.json @@ -23,7 +23,7 @@ }, "title": "Indstil Axis-enhed" } - }, - "title": "Axis-enhed" - } + } + }, + "title": "Axis-enhed" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/de.json b/homeassistant/components/axis/.translations/de.json index f238b00e847d..7410a79bdc90 100644 --- a/homeassistant/components/axis/.translations/de.json +++ b/homeassistant/components/axis/.translations/de.json @@ -23,7 +23,7 @@ }, "title": "Axis Ger\u00e4t einrichten" } - }, - "title": "Axis Ger\u00e4t" - } + } + }, + "title": "Axis Ger\u00e4t" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/en.json b/homeassistant/components/axis/.translations/en.json index b56cb0c5b742..cc76571b01b0 100644 --- a/homeassistant/components/axis/.translations/en.json +++ b/homeassistant/components/axis/.translations/en.json @@ -23,7 +23,7 @@ }, "title": "Set up Axis device" } - }, - "title": "Axis device" - } + } + }, + "title": "Axis device" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/es-419.json b/homeassistant/components/axis/.translations/es-419.json index c5404a173f65..a86131723e3a 100644 --- a/homeassistant/components/axis/.translations/es-419.json +++ b/homeassistant/components/axis/.translations/es-419.json @@ -21,7 +21,7 @@ }, "title": "Configurar dispositivo Axis" } - }, - "title": "Dispositivo Axis" - } + } + }, + "title": "Dispositivo Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/es.json b/homeassistant/components/axis/.translations/es.json index 7894e74b1c3e..19a774fe1706 100644 --- a/homeassistant/components/axis/.translations/es.json +++ b/homeassistant/components/axis/.translations/es.json @@ -23,7 +23,7 @@ }, "title": "Configurar dispositivo Axis" } - }, - "title": "Dispositivo Axis" - } + } + }, + "title": "Dispositivo Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/fr.json b/homeassistant/components/axis/.translations/fr.json index 608e12d020ac..4fb4f9287686 100644 --- a/homeassistant/components/axis/.translations/fr.json +++ b/homeassistant/components/axis/.translations/fr.json @@ -23,7 +23,7 @@ }, "title": "Configurer l'appareil Axis" } - }, - "title": "Appareil Axis" - } + } + }, + "title": "Appareil Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/hu.json b/homeassistant/components/axis/.translations/hu.json index b6347e21744b..ac8538c69437 100644 --- a/homeassistant/components/axis/.translations/hu.json +++ b/homeassistant/components/axis/.translations/hu.json @@ -15,7 +15,7 @@ "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } } - }, - "title": "Axis eszk\u00f6z" - } + } + }, + "title": "Axis eszk\u00f6z" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/it.json b/homeassistant/components/axis/.translations/it.json index 3f303140c684..e3083687b079 100644 --- a/homeassistant/components/axis/.translations/it.json +++ b/homeassistant/components/axis/.translations/it.json @@ -23,7 +23,7 @@ }, "title": "Impostazione del dispositivo Axis" } - }, - "title": "Dispositivo Axis" - } + } + }, + "title": "Dispositivo Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/ko.json b/homeassistant/components/axis/.translations/ko.json index 648bd3cfd7da..ae2da8858b42 100644 --- a/homeassistant/components/axis/.translations/ko.json +++ b/homeassistant/components/axis/.translations/ko.json @@ -23,7 +23,7 @@ }, "title": "Axis \uae30\uae30 \uc124\uc815" } - }, - "title": "Axis \uae30\uae30" - } + } + }, + "title": "Axis \uae30\uae30" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/lb.json b/homeassistant/components/axis/.translations/lb.json index 24ee0e241254..c19c50381fc1 100644 --- a/homeassistant/components/axis/.translations/lb.json +++ b/homeassistant/components/axis/.translations/lb.json @@ -23,7 +23,7 @@ }, "title": "Axis Apparat ariichten" } - }, - "title": "Axis Apparat" - } + } + }, + "title": "Axis Apparat" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/nl.json b/homeassistant/components/axis/.translations/nl.json index 10fc8c02d66a..852933c6204e 100644 --- a/homeassistant/components/axis/.translations/nl.json +++ b/homeassistant/components/axis/.translations/nl.json @@ -23,7 +23,7 @@ }, "title": "Stel het Axis-apparaat in" } - }, - "title": "Axis-apparaat" - } + } + }, + "title": "Axis-apparaat" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/no.json b/homeassistant/components/axis/.translations/no.json index 1ad7a446cfa5..fb04b498d70f 100644 --- a/homeassistant/components/axis/.translations/no.json +++ b/homeassistant/components/axis/.translations/no.json @@ -23,7 +23,7 @@ }, "title": "Sett opp Axis enhet" } - }, - "title": "Axis enhet" - } + } + }, + "title": "Axis enhet" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/pl.json b/homeassistant/components/axis/.translations/pl.json index dd1a63039e2c..cc53bafb57de 100644 --- a/homeassistant/components/axis/.translations/pl.json +++ b/homeassistant/components/axis/.translations/pl.json @@ -23,7 +23,7 @@ }, "title": "Konfiguracja urz\u0105dzenia Axis" } - }, - "title": "Urz\u0105dzenie Axis" - } + } + }, + "title": "Urz\u0105dzenie Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/pt-BR.json b/homeassistant/components/axis/.translations/pt-BR.json index 453c8fa36430..10e9fb563cea 100644 --- a/homeassistant/components/axis/.translations/pt-BR.json +++ b/homeassistant/components/axis/.translations/pt-BR.json @@ -23,7 +23,7 @@ }, "title": "Configurar o dispositivo Axis" } - }, - "title": "Dispositivo Axis" - } + } + }, + "title": "Dispositivo Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/ru.json b/homeassistant/components/axis/.translations/ru.json index d9e3a40d3043..578e642d4d2f 100644 --- a/homeassistant/components/axis/.translations/ru.json +++ b/homeassistant/components/axis/.translations/ru.json @@ -23,7 +23,7 @@ }, "title": "Axis" } - }, - "title": "Axis" - } + } + }, + "title": "Axis" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/sl.json b/homeassistant/components/axis/.translations/sl.json index 9d66831b91a6..a41e5ddd652f 100644 --- a/homeassistant/components/axis/.translations/sl.json +++ b/homeassistant/components/axis/.translations/sl.json @@ -23,7 +23,7 @@ }, "title": "Nastavite plo\u0161\u010dek" } - }, - "title": "Plo\u0161\u010dek" - } + } + }, + "title": "Plo\u0161\u010dek" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/sv.json b/homeassistant/components/axis/.translations/sv.json index 76ceaf7cbd71..c208838ed1a5 100644 --- a/homeassistant/components/axis/.translations/sv.json +++ b/homeassistant/components/axis/.translations/sv.json @@ -23,7 +23,7 @@ }, "title": "Konfigurera Axis-enhet" } - }, - "title": "Axis enhet" - } + } + }, + "title": "Axis enhet" } \ No newline at end of file diff --git a/homeassistant/components/axis/.translations/zh-Hant.json b/homeassistant/components/axis/.translations/zh-Hant.json index 41ecfdb80b77..e24c29a86bc5 100644 --- a/homeassistant/components/axis/.translations/zh-Hant.json +++ b/homeassistant/components/axis/.translations/zh-Hant.json @@ -23,7 +23,7 @@ }, "title": "\u8a2d\u5b9a Axis \u8a2d\u5099" } - }, - "title": "Axis \u8a2d\u5099" - } + } + }, + "title": "Axis \u8a2d\u5099" } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/en.json b/homeassistant/components/braviatv/.translations/en.json index 837b90ce30cb..9332b67d232c 100644 --- a/homeassistant/components/braviatv/.translations/en.json +++ b/homeassistant/components/braviatv/.translations/en.json @@ -23,8 +23,7 @@ "description": "Set up Sony Bravia TV integration. If you have problems with configuration go to: https://www.home-assistant.io/integrations/braviatv \n\nEnsure that your TV is turned on.", "title": "Sony Bravia TV" } - }, - "title": "Sony Bravia TV" + } }, "options": { "step": { @@ -35,5 +34,6 @@ "title": "Options for Sony Bravia TV" } } - } + }, + "title": "Sony Bravia TV" } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/no.json b/homeassistant/components/braviatv/.translations/no.json new file mode 100644 index 000000000000..7c24e94b552d --- /dev/null +++ b/homeassistant/components/braviatv/.translations/no.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "Denne TV-en er allerede konfigurert." + }, + "error": { + "cannot_connect": "Kunne ikke koble til, ugyldig vert eller PIN-kode.", + "invalid_host": "Ugyldig vertsnavn eller IP-adresse.", + "unsupported_model": "TV-modellen din st\u00f8ttes ikke." + }, + "step": { + "authorize": { + "data": { + "pin": "PIN-kode" + }, + "description": "Tast inn PIN-koden som vises p\u00e5 Sony Bravia TV. \n\n Hvis PIN-koden ikke vises, m\u00e5 du avregistrere Home Assistant p\u00e5 TV-en, g\u00e5 til: Innstillinger - > Nettverk - > Innstillinger for ekstern enhet - > Avregistrere ekstern enhet.", + "title": "Autoriser Sony Bravia TV" + }, + "user": { + "data": { + "host": "TV-vertsnavn eller IP-adresse" + }, + "description": "Konfigurer Sony Bravia TV-integrasjon. Hvis du har problemer med konfigurasjonen, g\u00e5 til: https://www.home-assistant.io/integrations/braviatv \n\n Forsikre deg om at TV-en er sl\u00e5tt p\u00e5.", + "title": "Sony Bravia TV" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Liste over ignorerte kilder" + }, + "title": "Alternativer for Sony Bravia TV" + } + } + }, + "title": "Sony Bravia TV" +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/pl.json b/homeassistant/components/braviatv/.translations/pl.json new file mode 100644 index 000000000000..0468cb57f954 --- /dev/null +++ b/homeassistant/components/braviatv/.translations/pl.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "Ten telewizor jest ju\u017c skonfigurowany." + }, + "error": { + "cannot_connect": "Po\u0142\u0105czenie nieudane, nieprawid\u0142owy host lub kod PIN.", + "invalid_host": "Nieprawid\u0142owa nazwa hosta lub adres IP.", + "unsupported_model": "Ten model telewizora nie jest obs\u0142ugiwany." + }, + "step": { + "authorize": { + "data": { + "pin": "Kod PIN" + }, + "description": "Wprowad\u017a kod PIN wy\u015bwietlany na telewizorze Sony Bravia. \n\nJe\u015bli kod PIN nie jest wy\u015bwietlany, musisz wyrejestrowa\u0107 Home Assistant'a na swoim telewizorze, przejd\u017a do Ustawienia -> Sie\u0107 -> Ustawienia urz\u0105dzenia zdalnego -> Wyrejestruj urz\u0105dzenie zdalne.", + "title": "Autoryzacja Sony Bravia TV" + }, + "user": { + "data": { + "host": "Nazwa hosta lub adres IP telewizora" + }, + "description": "Konfiguracja integracji telewizora Sony Bravia. Je\u015bli masz problemy z konfiguracj\u0105, przejd\u017a do strony: https://www.home-assistant.io/integrations/braviatv\n\nUpewnij si\u0119, \u017ce telewizor jest w\u0142\u0105czony.", + "title": "Sony Bravia TV" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Lista ignorowanych \u017ar\u00f3de\u0142" + }, + "title": "Opcje dla Sony Bravia TV" + } + } + }, + "title": "Sony Bravia TV" +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/zh-Hant.json b/homeassistant/components/braviatv/.translations/zh-Hant.json new file mode 100644 index 000000000000..8f8c84b952bf --- /dev/null +++ b/homeassistant/components/braviatv/.translations/zh-Hant.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "\u6b64\u96fb\u8996\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210\u3002" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u7121\u6548\u7684\u4e3b\u6a5f\u540d\u7a31\u6216 PIN \u78bc\u3002", + "invalid_host": "\u7121\u6548\u4e3b\u6a5f\u540d\u6216 IP \u4f4d\u5740", + "unsupported_model": "\u4e0d\u652f\u63f4\u6b64\u6b3e\u96fb\u8996\u578b\u865f\u3002" + }, + "step": { + "authorize": { + "data": { + "pin": "PIN \u78bc" + }, + "description": "\u8f38\u5165 Sony Bravia \u96fb\u8996\u6240\u986f\u793a\u4e4b PIN \u78bc\u3002\n\n\u5047\u5982 PIN \u78bc\u672a\u986f\u793a\uff0c\u5fc5\u9808\u5148\u65bc\u96fb\u8996\u89e3\u9664 Home Assistant \u8a3b\u518a\uff0c\u6b65\u9a5f\u70ba\uff1a\u8a2d\u5b9a -> \u7db2\u8def -> \u9060\u7aef\u88dd\u7f6e\u8a2d\u5b9a -> \u89e3\u9664\u9060\u7aef\u88dd\u7f6e\u8a3b\u518a\u3002", + "title": "\u8a8d\u8b49 Sony Bravia \u96fb\u8996" + }, + "user": { + "data": { + "host": "\u96fb\u8996\u4e3b\u6a5f\u540d\u6216 IP \u4f4d\u5740" + }, + "description": "\u8a2d\u5b9a Sony Bravia \u96fb\u8996\u6574\u5408\u3002\u5047\u5982\u65bc\u8a2d\u5b9a\u904e\u7a0b\u4e2d\u906d\u9047\u56f0\u7136\uff0c\u8acb\u53c3\u95b1\uff1ahttps://www.home-assistant.io/integrations/braviatv \n\n\u78ba\u5b9a\u96fb\u8996\u5df2\u7d93\u958b\u555f\u3002", + "title": "Sony Bravia \u96fb\u8996" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "\u5ffd\u7565\u7684\u4f86\u6e90\u5217\u8868" + }, + "title": "Sony Bravia \u96fb\u8996\u9078\u9805" + } + } + }, + "title": "Sony Bravia \u96fb\u8996" +} \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ca.json b/homeassistant/components/brother/.translations/ca.json index bf5923960949..6c5e66765b9e 100644 --- a/homeassistant/components/brother/.translations/ca.json +++ b/homeassistant/components/brother/.translations/ca.json @@ -26,7 +26,7 @@ "description": "Vols afegir la impressora Brother {model} amb n\u00famero de s\u00e8rie `{serial_number}` a Home Assistant?", "title": "Impressora Brother descoberta" } - }, - "title": "Impressora Brother" - } + } + }, + "title": "Impressora Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/da.json b/homeassistant/components/brother/.translations/da.json index 7a8f754bd9fd..c89e9e5964bb 100644 --- a/homeassistant/components/brother/.translations/da.json +++ b/homeassistant/components/brother/.translations/da.json @@ -26,7 +26,7 @@ "description": "Vil du tilf\u00f8je Brother-printeren {model} med serienummeret `{serial_number}` til Home Assistant?", "title": "Fandt Brother-printer" } - }, - "title": "Brother-printer" - } + } + }, + "title": "Brother-printer" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/de.json b/homeassistant/components/brother/.translations/de.json index f99681d6d7b5..1067e85f1f61 100644 --- a/homeassistant/components/brother/.translations/de.json +++ b/homeassistant/components/brother/.translations/de.json @@ -26,7 +26,7 @@ "description": "M\u00f6chten Sie den Brother Drucker {model} mit der Seriennummer `{serial_number}` zum Home Assistant hinzuf\u00fcgen?", "title": "Brother-Drucker entdeckt" } - }, - "title": "Brother Drucker" - } + } + }, + "title": "Brother Drucker" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/en.json b/homeassistant/components/brother/.translations/en.json index 928b6bf35306..8a01f48e7ff3 100644 --- a/homeassistant/components/brother/.translations/en.json +++ b/homeassistant/components/brother/.translations/en.json @@ -26,7 +26,7 @@ "description": "Do you want to add the Brother Printer {model} with serial number `{serial_number}` to Home Assistant?", "title": "Discovered Brother Printer" } - }, - "title": "Brother Printer" - } + } + }, + "title": "Brother Printer" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/es-419.json b/homeassistant/components/brother/.translations/es-419.json index ba5b9f294d46..5ee8c5eb77f6 100644 --- a/homeassistant/components/brother/.translations/es-419.json +++ b/homeassistant/components/brother/.translations/es-419.json @@ -7,7 +7,7 @@ "error": { "connection_error": "Error de conexi\u00f3n.", "snmp_error": "El servidor SNMP est\u00e1 apagado o la impresora no es compatible." - }, - "title": "Impresora Brother" - } + } + }, + "title": "Impresora Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/es.json b/homeassistant/components/brother/.translations/es.json index d41d09634d86..8c805c6cac48 100644 --- a/homeassistant/components/brother/.translations/es.json +++ b/homeassistant/components/brother/.translations/es.json @@ -26,7 +26,7 @@ "description": "\u00bfQuiere a\u00f1adir la Impresora Brother {model} con el n\u00famero de serie `{serial_number}` a Home Assistant?", "title": "Impresora Brother encontrada" } - }, - "title": "Impresora Brother" - } + } + }, + "title": "Impresora Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/fr.json b/homeassistant/components/brother/.translations/fr.json index 788d0c740037..6e5b1668ae37 100644 --- a/homeassistant/components/brother/.translations/fr.json +++ b/homeassistant/components/brother/.translations/fr.json @@ -26,7 +26,7 @@ "description": "Voulez-vous ajouter l'imprimante Brother {model} avec le num\u00e9ro de s\u00e9rie `{serial_number}` \u00e0 Home Assistant ?", "title": "Imprimante Brother d\u00e9couverte" } - }, - "title": "Imprimante Brother" - } + } + }, + "title": "Imprimante Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/hu.json b/homeassistant/components/brother/.translations/hu.json index 1907d65f2892..88c6677f1ec4 100644 --- a/homeassistant/components/brother/.translations/hu.json +++ b/homeassistant/components/brother/.translations/hu.json @@ -26,7 +26,7 @@ "description": "Hozz\u00e1 akarja adni a {model} Brother nyomtat\u00f3t, amelynek sorsz\u00e1ma: {serial_number} `, a Home Assistant-hoz?", "title": "Felfedezett Brother nyomtat\u00f3" } - }, - "title": "Brother nyomtat\u00f3" - } + } + }, + "title": "Brother nyomtat\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/it.json b/homeassistant/components/brother/.translations/it.json index 838598f24f77..768d76deb8f7 100644 --- a/homeassistant/components/brother/.translations/it.json +++ b/homeassistant/components/brother/.translations/it.json @@ -26,7 +26,7 @@ "description": "Vuoi aggiungere la stampante Brother {model} con il numero seriale `{serial_number}` a Home Assistant?", "title": "Trovata stampante Brother" } - }, - "title": "Stampante Brother" - } + } + }, + "title": "Stampante Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ko.json b/homeassistant/components/brother/.translations/ko.json index ec0f0d2453f3..9b3c75bffb4b 100644 --- a/homeassistant/components/brother/.translations/ko.json +++ b/homeassistant/components/brother/.translations/ko.json @@ -26,7 +26,7 @@ "description": "\uc2dc\ub9ac\uc5bc \ubc88\ud638 `{serial_number}` \ub85c \ube0c\ub77c\ub354 \ud504\ub9b0\ud130 {model} \uc744(\ub97c) Home Assistant \uc5d0 \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "\ubc1c\uacac\ub41c \ube0c\ub77c\ub354 \ud504\ub9b0\ud130" } - }, - "title": "\ube0c\ub77c\ub354 \ud504\ub9b0\ud130" - } + } + }, + "title": "\ube0c\ub77c\ub354 \ud504\ub9b0\ud130" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/lb.json b/homeassistant/components/brother/.translations/lb.json index 7553933b66e8..6ebb11f72906 100644 --- a/homeassistant/components/brother/.translations/lb.json +++ b/homeassistant/components/brother/.translations/lb.json @@ -26,7 +26,7 @@ "description": "W\u00ebllt dir den Brother Printer {model} mat der Seriennummer `{serial_number}` am Home Assistant dob\u00e4isetzen?", "title": "Entdeckten Brother Printer" } - }, - "title": "Brother Printer" - } + } + }, + "title": "Brother Printer" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/nl.json b/homeassistant/components/brother/.translations/nl.json index c72aab468019..4563adfb0d7b 100644 --- a/homeassistant/components/brother/.translations/nl.json +++ b/homeassistant/components/brother/.translations/nl.json @@ -26,7 +26,7 @@ "description": "Wilt u het Brother Printer {model} met serienummer {serial_number}' toevoegen aan Home Assistant?", "title": "Ontdekte Brother Printer" } - }, - "title": "Brother Printer" - } + } + }, + "title": "Brother Printer" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/no.json b/homeassistant/components/brother/.translations/no.json index 46bfe618176a..b2cd8953d691 100644 --- a/homeassistant/components/brother/.translations/no.json +++ b/homeassistant/components/brother/.translations/no.json @@ -26,7 +26,7 @@ "description": "Vil du legge til Brother-skriveren {Model} med serienummeret {serial_number} til Home Assistant?", "title": "Oppdaget Brother-Skriveren" } - }, - "title": "Brother skriver" - } + } + }, + "title": "Brother skriver" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/pl.json b/homeassistant/components/brother/.translations/pl.json index 1417720714ea..4d888941fc17 100644 --- a/homeassistant/components/brother/.translations/pl.json +++ b/homeassistant/components/brother/.translations/pl.json @@ -26,7 +26,7 @@ "description": "Czy chcesz doda\u0107 drukark\u0119 Brother {model} o numerze seryjnym `{serial_number}` do Home Assistant'a?", "title": "Wykryto drukark\u0119 Brother" } - }, - "title": "Drukarka Brother" - } + } + }, + "title": "Drukarka Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/pt-BR.json b/homeassistant/components/brother/.translations/pt-BR.json index 454cde320d73..3616626b123b 100644 --- a/homeassistant/components/brother/.translations/pt-BR.json +++ b/homeassistant/components/brother/.translations/pt-BR.json @@ -17,7 +17,7 @@ "description": "Configure a integra\u00e7\u00e3o da impressora Brother. Se voc\u00ea tiver problemas com a configura\u00e7\u00e3o, acesse: https://www.home-assistant.io/integrations/brother", "title": "Impressora Brother" } - }, - "title": "Impressora Brother" - } + } + }, + "title": "Impressora Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ru.json b/homeassistant/components/brother/.translations/ru.json index 0faf059c8b9e..b921f2914c61 100644 --- a/homeassistant/components/brother/.translations/ru.json +++ b/homeassistant/components/brother/.translations/ru.json @@ -26,7 +26,7 @@ "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 \u043f\u0440\u0438\u043d\u0442\u0435\u0440 Brother {model} \u0441 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c `{serial_number}`?", "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0442\u0435\u0440 Brother" } - }, - "title": "\u041f\u0440\u0438\u043d\u0442\u0435\u0440 Brother" - } + } + }, + "title": "\u041f\u0440\u0438\u043d\u0442\u0435\u0440 Brother" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/sl.json b/homeassistant/components/brother/.translations/sl.json index d22f128ffbe6..e1b7cc0aece5 100644 --- a/homeassistant/components/brother/.translations/sl.json +++ b/homeassistant/components/brother/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Ali \u017eelite dodati Brother tiskalnik {model} s serijsko \u0161tevilko ' {serial_number} ' v Home Assistant?", "title": "Odkriti Brother tiskalniki" } - }, - "title": "Brother Tiskalnik" - } + } + }, + "title": "Brother Tiskalnik" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/sv.json b/homeassistant/components/brother/.translations/sv.json index 774863d4f081..8843d7387a2b 100644 --- a/homeassistant/components/brother/.translations/sv.json +++ b/homeassistant/components/brother/.translations/sv.json @@ -26,7 +26,7 @@ "description": "Vill du l\u00e4gga till Brother-skrivaren {model} med serienumret {serial_number} i Home Assistant?", "title": "Uppt\u00e4ckte Brother-skrivare" } - }, - "title": "Brother-skrivare" - } + } + }, + "title": "Brother-skrivare" } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/zh-Hant.json b/homeassistant/components/brother/.translations/zh-Hant.json index 987a15f8a2f0..025fe7674b3c 100644 --- a/homeassistant/components/brother/.translations/zh-Hant.json +++ b/homeassistant/components/brother/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u662f\u5426\u8981\u5c07\u5e8f\u865f {serial_number} \u4e4bBrother \u5370\u8868\u6a5f {model} \u65b0\u589e\u81f3 Home Assistant\uff1f", "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Brother \u5370\u8868\u6a5f" } - }, - "title": "Brother \u5370\u8868\u6a5f" - } + } + }, + "title": "Brother \u5370\u8868\u6a5f" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/bg.json b/homeassistant/components/cast/.translations/bg.json index c56bf118dc10..1a882fd23bd0 100644 --- a/homeassistant/components/cast/.translations/bg.json +++ b/homeassistant/components/cast/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ca.json b/homeassistant/components/cast/.translations/ca.json index 26236397dec7..bf99c857f73e 100644 --- a/homeassistant/components/cast/.translations/ca.json +++ b/homeassistant/components/cast/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/cs.json b/homeassistant/components/cast/.translations/cs.json index 82f063b365f1..99138d836520 100644 --- a/homeassistant/components/cast/.translations/cs.json +++ b/homeassistant/components/cast/.translations/cs.json @@ -9,7 +9,7 @@ "description": "Chcete nastavit Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/da.json b/homeassistant/components/cast/.translations/da.json index 5d8ab2362377..45dcec602311 100644 --- a/homeassistant/components/cast/.translations/da.json +++ b/homeassistant/components/cast/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du ops\u00e6tte Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/de.json b/homeassistant/components/cast/.translations/de.json index ac1ebbeb2365..d2f01f33bfec 100644 --- a/homeassistant/components/cast/.translations/de.json +++ b/homeassistant/components/cast/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du Google Cast einrichten?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/en.json b/homeassistant/components/cast/.translations/en.json index f908f41e3289..2a386a2c08c1 100644 --- a/homeassistant/components/cast/.translations/en.json +++ b/homeassistant/components/cast/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/es-419.json b/homeassistant/components/cast/.translations/es-419.json index 2f8d4982afdd..f23bc80877c5 100644 --- a/homeassistant/components/cast/.translations/es-419.json +++ b/homeassistant/components/cast/.translations/es-419.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/es.json b/homeassistant/components/cast/.translations/es.json index 6dc41196af56..dd52c6360d19 100644 --- a/homeassistant/components/cast/.translations/es.json +++ b/homeassistant/components/cast/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/et.json b/homeassistant/components/cast/.translations/et.json index 987c54955f20..a98a23c7f0bd 100644 --- a/homeassistant/components/cast/.translations/et.json +++ b/homeassistant/components/cast/.translations/et.json @@ -4,7 +4,7 @@ "confirm": { "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/fr.json b/homeassistant/components/cast/.translations/fr.json index 99feeb3c8983..b004a2113c75 100644 --- a/homeassistant/components/cast/.translations/fr.json +++ b/homeassistant/components/cast/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/he.json b/homeassistant/components/cast/.translations/he.json index 40d2514b59ce..95646e7c7fc5 100644 --- a/homeassistant/components/cast/.translations/he.json +++ b/homeassistant/components/cast/.translations/he.json @@ -9,7 +9,7 @@ "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/hr.json b/homeassistant/components/cast/.translations/hr.json index 91dafab02016..6d11110f1e2c 100644 --- a/homeassistant/components/cast/.translations/hr.json +++ b/homeassistant/components/cast/.translations/hr.json @@ -4,7 +4,7 @@ "confirm": { "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/hu.json b/homeassistant/components/cast/.translations/hu.json index 66dc4ea8dd84..28421b72e1ff 100644 --- a/homeassistant/components/cast/.translations/hu.json +++ b/homeassistant/components/cast/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a Google Cast szolg\u00e1ltat\u00e1st?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/id.json b/homeassistant/components/cast/.translations/id.json index 86fb32c0844f..80d59ed8f533 100644 --- a/homeassistant/components/cast/.translations/id.json +++ b/homeassistant/components/cast/.translations/id.json @@ -9,7 +9,7 @@ "description": "Apakah Anda ingin menyiapkan Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/it.json b/homeassistant/components/cast/.translations/it.json index 21c8e60518e2..e7180c39a996 100644 --- a/homeassistant/components/cast/.translations/it.json +++ b/homeassistant/components/cast/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ja.json b/homeassistant/components/cast/.translations/ja.json index 25b9c10b2e74..07660869dbe9 100644 --- a/homeassistant/components/cast/.translations/ja.json +++ b/homeassistant/components/cast/.translations/ja.json @@ -8,7 +8,7 @@ "description": "Google Cast\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u307e\u3059\u304b\uff1f", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ko.json b/homeassistant/components/cast/.translations/ko.json index f0eebf4b7b9e..a5ebfa778dad 100644 --- a/homeassistant/components/cast/.translations/ko.json +++ b/homeassistant/components/cast/.translations/ko.json @@ -9,7 +9,7 @@ "description": "Google \uce90\uc2a4\ud2b8\ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Google \uce90\uc2a4\ud2b8" } - }, - "title": "Google \uce90\uc2a4\ud2b8" - } + } + }, + "title": "Google \uce90\uc2a4\ud2b8" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/lb.json b/homeassistant/components/cast/.translations/lb.json index f1daff830695..0149962a5e04 100644 --- a/homeassistant/components/cast/.translations/lb.json +++ b/homeassistant/components/cast/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll Google Cast konfigur\u00e9iert ginn?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/nl.json b/homeassistant/components/cast/.translations/nl.json index 91c428770f5f..dddcb7869099 100644 --- a/homeassistant/components/cast/.translations/nl.json +++ b/homeassistant/components/cast/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u Google Cast instellen?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/nn.json b/homeassistant/components/cast/.translations/nn.json index 7f5501556589..f51d51301e38 100644 --- a/homeassistant/components/cast/.translations/nn.json +++ b/homeassistant/components/cast/.translations/nn.json @@ -9,7 +9,7 @@ "description": "Vil du sette opp Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/no.json b/homeassistant/components/cast/.translations/no.json index 6c733896d277..ee5fddaff760 100644 --- a/homeassistant/components/cast/.translations/no.json +++ b/homeassistant/components/cast/.translations/no.json @@ -9,7 +9,7 @@ "description": "\u00d8nsker du \u00e5 sette opp Google Cast?", "title": "" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pl.json b/homeassistant/components/cast/.translations/pl.json index c4399f95defe..2dff5973a2cf 100644 --- a/homeassistant/components/cast/.translations/pl.json +++ b/homeassistant/components/cast/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Czy chcesz skonfigurowa\u0107 Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pt-BR.json b/homeassistant/components/cast/.translations/pt-BR.json index e26a829480c6..76a9f0d2b001 100644 --- a/homeassistant/components/cast/.translations/pt-BR.json +++ b/homeassistant/components/cast/.translations/pt-BR.json @@ -9,7 +9,7 @@ "description": "Deseja configurar o Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pt.json b/homeassistant/components/cast/.translations/pt.json index 85d1b14484d1..2eb62fd0a187 100644 --- a/homeassistant/components/cast/.translations/pt.json +++ b/homeassistant/components/cast/.translations/pt.json @@ -9,7 +9,7 @@ "description": "Deseja configurar o Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ro.json b/homeassistant/components/cast/.translations/ro.json index 8a1d19c0ecf5..1595f47e55dd 100644 --- a/homeassistant/components/cast/.translations/ro.json +++ b/homeassistant/components/cast/.translations/ro.json @@ -9,7 +9,7 @@ "description": "Dori\u021bi s\u0103 configura\u021bi Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ru.json b/homeassistant/components/cast/.translations/ru.json index da03eae701dd..a44b3d91ed7b 100644 --- a/homeassistant/components/cast/.translations/ru.json +++ b/homeassistant/components/cast/.translations/ru.json @@ -9,7 +9,7 @@ "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 Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/sl.json b/homeassistant/components/cast/.translations/sl.json index 24a7215574db..9fde52f421d7 100644 --- a/homeassistant/components/cast/.translations/sl.json +++ b/homeassistant/components/cast/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/sv.json b/homeassistant/components/cast/.translations/sv.json index aea55058d108..c712eef68866 100644 --- a/homeassistant/components/cast/.translations/sv.json +++ b/homeassistant/components/cast/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera Google Cast?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/th.json b/homeassistant/components/cast/.translations/th.json index 372a9cf0760d..e430e4135c43 100644 --- a/homeassistant/components/cast/.translations/th.json +++ b/homeassistant/components/cast/.translations/th.json @@ -8,7 +8,7 @@ "description": "\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Google Cast \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/vi.json b/homeassistant/components/cast/.translations/vi.json index 2f2982293cfd..9d0e96167a98 100644 --- a/homeassistant/components/cast/.translations/vi.json +++ b/homeassistant/components/cast/.translations/vi.json @@ -9,7 +9,7 @@ "description": "B\u1ea1n c\u00f3 mu\u1ed1n thi\u1ebft l\u1eadp Google Cast kh\u00f4ng?", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/zh-Hans.json b/homeassistant/components/cast/.translations/zh-Hans.json index d4f1cf4c1a59..906f939166bd 100644 --- a/homeassistant/components/cast/.translations/zh-Hans.json +++ b/homeassistant/components/cast/.translations/zh-Hans.json @@ -9,7 +9,7 @@ "description": "\u60a8\u60f3\u8981\u914d\u7f6e Google Cast \u5417\uff1f", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/zh-Hant.json b/homeassistant/components/cast/.translations/zh-Hant.json index 711ac3203978..b95cab0f447f 100644 --- a/homeassistant/components/cast/.translations/zh-Hant.json +++ b/homeassistant/components/cast/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Google Cast\uff1f", "title": "Google Cast" } - }, - "title": "Google Cast" - } + } + }, + "title": "Google Cast" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/bg.json b/homeassistant/components/cert_expiry/.translations/bg.json index cf89911071b0..7ff68cd7fae3 100644 --- a/homeassistant/components/cert_expiry/.translations/bg.json +++ b/homeassistant/components/cert_expiry/.translations/bg.json @@ -13,7 +13,7 @@ }, "title": "\u0414\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0437\u0430 \u0442\u0435\u0441\u0442\u0432\u0430\u043d\u0435" } - }, - "title": "\u0421\u0440\u043e\u043a \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430" - } + } + }, + "title": "\u0421\u0440\u043e\u043a \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/ca.json b/homeassistant/components/cert_expiry/.translations/ca.json index dce3519f09f0..5b9b095acbc1 100644 --- a/homeassistant/components/cert_expiry/.translations/ca.json +++ b/homeassistant/components/cert_expiry/.translations/ca.json @@ -18,7 +18,7 @@ }, "title": "Configuraci\u00f3 del certificat a provar" } - }, - "title": "Caducitat del certificat" - } + } + }, + "title": "Caducitat del certificat" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/da.json b/homeassistant/components/cert_expiry/.translations/da.json index cf5f42338c34..6c94fe09806a 100644 --- a/homeassistant/components/cert_expiry/.translations/da.json +++ b/homeassistant/components/cert_expiry/.translations/da.json @@ -13,7 +13,7 @@ }, "title": "Definer certifikatet, der skal testes" } - }, - "title": "Certifikatets udl\u00f8bsdato" - } + } + }, + "title": "Certifikatets udl\u00f8bsdato" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/de.json b/homeassistant/components/cert_expiry/.translations/de.json index 119d172690a8..e3733a4fcf18 100644 --- a/homeassistant/components/cert_expiry/.translations/de.json +++ b/homeassistant/components/cert_expiry/.translations/de.json @@ -18,7 +18,7 @@ }, "title": "Definiere das zu testende Zertifikat" } - }, - "title": "Zertifikatsablauf" - } + } + }, + "title": "Zertifikatsablauf" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/en.json b/homeassistant/components/cert_expiry/.translations/en.json index 5aca41f7f78a..5844868a6e4b 100644 --- a/homeassistant/components/cert_expiry/.translations/en.json +++ b/homeassistant/components/cert_expiry/.translations/en.json @@ -18,7 +18,7 @@ }, "title": "Define the certificate to test" } - }, - "title": "Certificate Expiry" - } + } + }, + "title": "Certificate Expiry" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/es-419.json b/homeassistant/components/cert_expiry/.translations/es-419.json index 4e0b1ffca5d2..ee5fc92391ff 100644 --- a/homeassistant/components/cert_expiry/.translations/es-419.json +++ b/homeassistant/components/cert_expiry/.translations/es-419.json @@ -13,7 +13,7 @@ }, "title": "Definir el certificado para probar" } - }, - "title": "Expiraci\u00f3n del certificado" - } + } + }, + "title": "Expiraci\u00f3n del certificado" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/es.json b/homeassistant/components/cert_expiry/.translations/es.json index 7cc44d7038ab..d616634fdeaf 100644 --- a/homeassistant/components/cert_expiry/.translations/es.json +++ b/homeassistant/components/cert_expiry/.translations/es.json @@ -18,7 +18,7 @@ }, "title": "Defina el certificado para probar" } - }, - "title": "Caducidad del certificado" - } + } + }, + "title": "Caducidad del certificado" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/fr.json b/homeassistant/components/cert_expiry/.translations/fr.json index 18398a2b0481..8c3d92edf929 100644 --- a/homeassistant/components/cert_expiry/.translations/fr.json +++ b/homeassistant/components/cert_expiry/.translations/fr.json @@ -18,7 +18,7 @@ }, "title": "D\u00e9finir le certificat \u00e0 tester" } - }, - "title": "Expiration du certificat" - } + } + }, + "title": "Expiration du certificat" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/it.json b/homeassistant/components/cert_expiry/.translations/it.json index e88afa7caefc..c5e56bc95a27 100644 --- a/homeassistant/components/cert_expiry/.translations/it.json +++ b/homeassistant/components/cert_expiry/.translations/it.json @@ -18,7 +18,7 @@ }, "title": "Definire il certificato da testare" } - }, - "title": "Scadenza certificato" - } + } + }, + "title": "Scadenza certificato" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/ko.json b/homeassistant/components/cert_expiry/.translations/ko.json index 962f9ebe42cd..699ca413604f 100644 --- a/homeassistant/components/cert_expiry/.translations/ko.json +++ b/homeassistant/components/cert_expiry/.translations/ko.json @@ -18,7 +18,7 @@ }, "title": "\uc778\uc99d\uc11c \uc815\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc0c1" } - }, - "title": "\uc778\uc99d\uc11c \ub9cc\ub8cc" - } + } + }, + "title": "\uc778\uc99d\uc11c \ub9cc\ub8cc" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/lb.json b/homeassistant/components/cert_expiry/.translations/lb.json index 55ac013f96a6..db6d5c7ccb0f 100644 --- a/homeassistant/components/cert_expiry/.translations/lb.json +++ b/homeassistant/components/cert_expiry/.translations/lb.json @@ -18,7 +18,7 @@ }, "title": "W\u00e9ieen Zertifikat soll getest ginn" } - }, - "title": "Zertifikat Verfallsdatum" - } + } + }, + "title": "Zertifikat Verfallsdatum" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/nl.json b/homeassistant/components/cert_expiry/.translations/nl.json index 7c9fbe675657..c33d4c06e6fc 100644 --- a/homeassistant/components/cert_expiry/.translations/nl.json +++ b/homeassistant/components/cert_expiry/.translations/nl.json @@ -13,7 +13,7 @@ }, "title": "Het certificaat defini\u00ebren dat moet worden getest" } - }, - "title": "Vervaldatum certificaat" - } + } + }, + "title": "Vervaldatum certificaat" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/no.json b/homeassistant/components/cert_expiry/.translations/no.json index a798ead27b6b..341efe2d9321 100644 --- a/homeassistant/components/cert_expiry/.translations/no.json +++ b/homeassistant/components/cert_expiry/.translations/no.json @@ -18,7 +18,7 @@ }, "title": "Definer sertifikatet som skal testes" } - }, - "title": "Sertifikat utl\u00f8p" - } + } + }, + "title": "Sertifikat utl\u00f8p" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/pl.json b/homeassistant/components/cert_expiry/.translations/pl.json index 510b75658a2a..f213befed4f7 100644 --- a/homeassistant/components/cert_expiry/.translations/pl.json +++ b/homeassistant/components/cert_expiry/.translations/pl.json @@ -18,7 +18,7 @@ }, "title": "Zdefiniuj certyfikat do przetestowania" } - }, - "title": "Wa\u017cno\u015b\u0107 certyfikatu" - } + } + }, + "title": "Wa\u017cno\u015b\u0107 certyfikatu" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/pt-BR.json b/homeassistant/components/cert_expiry/.translations/pt-BR.json index 0c0e272e23bf..6a395059625c 100644 --- a/homeassistant/components/cert_expiry/.translations/pt-BR.json +++ b/homeassistant/components/cert_expiry/.translations/pt-BR.json @@ -13,7 +13,7 @@ }, "title": "Defina o certificado para testar" } - }, - "title": "Expira\u00e7\u00e3o do certificado" - } + } + }, + "title": "Expira\u00e7\u00e3o do certificado" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/ru.json b/homeassistant/components/cert_expiry/.translations/ru.json index 39c78acc4c0e..5219caa057dd 100644 --- a/homeassistant/components/cert_expiry/.translations/ru.json +++ b/homeassistant/components/cert_expiry/.translations/ru.json @@ -18,7 +18,7 @@ }, "title": "\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430" } - }, - "title": "\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430" - } + } + }, + "title": "\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/sl.json b/homeassistant/components/cert_expiry/.translations/sl.json index 605eb0b8182b..1da2a7921f3e 100644 --- a/homeassistant/components/cert_expiry/.translations/sl.json +++ b/homeassistant/components/cert_expiry/.translations/sl.json @@ -18,7 +18,7 @@ }, "title": "Dolo\u010dite potrdilo za testiranje" } - }, - "title": "Veljavnost certifikata" - } + } + }, + "title": "Veljavnost certifikata" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/sv.json b/homeassistant/components/cert_expiry/.translations/sv.json index 2655bb40f08d..8449db1ec7a2 100644 --- a/homeassistant/components/cert_expiry/.translations/sv.json +++ b/homeassistant/components/cert_expiry/.translations/sv.json @@ -13,7 +13,7 @@ }, "title": "Definiera certifikatet som ska testas" } - }, - "title": "Certifikatets utg\u00e5ng" - } + } + }, + "title": "Certifikatets utg\u00e5ng" } \ No newline at end of file diff --git a/homeassistant/components/cert_expiry/.translations/zh-Hant.json b/homeassistant/components/cert_expiry/.translations/zh-Hant.json index f08e3e277e96..1968f3d866c2 100644 --- a/homeassistant/components/cert_expiry/.translations/zh-Hant.json +++ b/homeassistant/components/cert_expiry/.translations/zh-Hant.json @@ -18,7 +18,7 @@ }, "title": "\u5b9a\u7fa9\u8a8d\u8b49\u9032\u884c\u6e2c\u8a66" } - }, - "title": "\u6191\u8b49\u671f\u9650" - } + } + }, + "title": "\u6191\u8b49\u671f\u9650" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/bg.json b/homeassistant/components/coolmaster/.translations/bg.json index 9e484f5d38c0..8c8cbf8f36ff 100644 --- a/homeassistant/components/coolmaster/.translations/bg.json +++ b/homeassistant/components/coolmaster/.translations/bg.json @@ -17,7 +17,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0441\u0432\u043e\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0438 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430 \u0441 CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ca.json b/homeassistant/components/coolmaster/.translations/ca.json index 65816e696fe1..75b269eee97d 100644 --- a/homeassistant/components/coolmaster/.translations/ca.json +++ b/homeassistant/components/coolmaster/.translations/ca.json @@ -17,7 +17,7 @@ }, "title": "Configuraci\u00f3 de la connexi\u00f3 amb CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/cs.json b/homeassistant/components/coolmaster/.translations/cs.json index f1e18f8fcb4b..99adbab2da44 100644 --- a/homeassistant/components/coolmaster/.translations/cs.json +++ b/homeassistant/components/coolmaster/.translations/cs.json @@ -17,7 +17,7 @@ }, "title": "Nastavte podrobnosti p\u0159ipojen\u00ed CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/da.json b/homeassistant/components/coolmaster/.translations/da.json index 882bc5de3595..25dd40704530 100644 --- a/homeassistant/components/coolmaster/.translations/da.json +++ b/homeassistant/components/coolmaster/.translations/da.json @@ -17,7 +17,7 @@ }, "title": "Ops\u00e6t dine CoolMasterNet-forbindelsesdetaljer." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/de.json b/homeassistant/components/coolmaster/.translations/de.json index 5359f92b1381..f853e2d5a0e3 100644 --- a/homeassistant/components/coolmaster/.translations/de.json +++ b/homeassistant/components/coolmaster/.translations/de.json @@ -17,7 +17,7 @@ }, "title": "Richte deine CoolMasterNet-Verbindungsdaten ein." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/en.json b/homeassistant/components/coolmaster/.translations/en.json index 6c30efc594a2..587bae0d5e78 100644 --- a/homeassistant/components/coolmaster/.translations/en.json +++ b/homeassistant/components/coolmaster/.translations/en.json @@ -17,7 +17,7 @@ }, "title": "Setup your CoolMasterNet connection details." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/es-419.json b/homeassistant/components/coolmaster/.translations/es-419.json index 2bcdecb2aeca..03911b41cc21 100644 --- a/homeassistant/components/coolmaster/.translations/es-419.json +++ b/homeassistant/components/coolmaster/.translations/es-419.json @@ -7,7 +7,7 @@ }, "title": "Configure los detalles de su conexi\u00f3n CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/es.json b/homeassistant/components/coolmaster/.translations/es.json index aedd81baccca..a3ed82dddf1a 100644 --- a/homeassistant/components/coolmaster/.translations/es.json +++ b/homeassistant/components/coolmaster/.translations/es.json @@ -17,7 +17,7 @@ }, "title": "Configure los detalles de su conexi\u00f3n a CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/fr.json b/homeassistant/components/coolmaster/.translations/fr.json index 97b1753ddded..5007a0e42d11 100644 --- a/homeassistant/components/coolmaster/.translations/fr.json +++ b/homeassistant/components/coolmaster/.translations/fr.json @@ -17,7 +17,7 @@ }, "title": "Configurez les d\u00e9tails de votre connexion CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/it.json b/homeassistant/components/coolmaster/.translations/it.json index b543a10d32d1..552e90dd42d2 100644 --- a/homeassistant/components/coolmaster/.translations/it.json +++ b/homeassistant/components/coolmaster/.translations/it.json @@ -17,7 +17,7 @@ }, "title": "Impostare i dettagli della connessione CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ko.json b/homeassistant/components/coolmaster/.translations/ko.json index 4d96e606c7b5..9deb850b0208 100644 --- a/homeassistant/components/coolmaster/.translations/ko.json +++ b/homeassistant/components/coolmaster/.translations/ko.json @@ -17,7 +17,7 @@ }, "title": "CoolMasterNet \uc5f0\uacb0 \uc0c1\uc138\uc815\ubcf4\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/lb.json b/homeassistant/components/coolmaster/.translations/lb.json index ed54abac03e6..dea49b78e7ea 100644 --- a/homeassistant/components/coolmaster/.translations/lb.json +++ b/homeassistant/components/coolmaster/.translations/lb.json @@ -17,7 +17,7 @@ }, "title": "CoolMasterNet Verbindungs Detailer ariichten" } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/nl.json b/homeassistant/components/coolmaster/.translations/nl.json index e5b1683790f2..feee2547932c 100644 --- a/homeassistant/components/coolmaster/.translations/nl.json +++ b/homeassistant/components/coolmaster/.translations/nl.json @@ -17,7 +17,7 @@ }, "title": "Stel uw CoolMasterNet-verbindingsgegevens in." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/no.json b/homeassistant/components/coolmaster/.translations/no.json index e9859d239895..2d053c6b44e3 100644 --- a/homeassistant/components/coolmaster/.translations/no.json +++ b/homeassistant/components/coolmaster/.translations/no.json @@ -17,7 +17,7 @@ }, "title": "Konfigurer informasjonen om CoolMasterNet-tilkoblingen." } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/pl.json b/homeassistant/components/coolmaster/.translations/pl.json index 118c4bc424b5..7daaef692f04 100644 --- a/homeassistant/components/coolmaster/.translations/pl.json +++ b/homeassistant/components/coolmaster/.translations/pl.json @@ -17,7 +17,7 @@ }, "title": "Skonfiguruj szczeg\u00f3\u0142y po\u0142\u0105czenia CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ru.json b/homeassistant/components/coolmaster/.translations/ru.json index 4c2f74440cd7..25518b5efea3 100644 --- a/homeassistant/components/coolmaster/.translations/ru.json +++ b/homeassistant/components/coolmaster/.translations/ru.json @@ -17,7 +17,7 @@ }, "title": "CoolMasterNet" } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/sl.json b/homeassistant/components/coolmaster/.translations/sl.json index a59b5215e7fb..3c7790917219 100644 --- a/homeassistant/components/coolmaster/.translations/sl.json +++ b/homeassistant/components/coolmaster/.translations/sl.json @@ -17,7 +17,7 @@ }, "title": "Nastavite svoje podatke CoolMasterNet." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/sv.json b/homeassistant/components/coolmaster/.translations/sv.json index 89e2ab32863d..8ba74734a799 100644 --- a/homeassistant/components/coolmaster/.translations/sv.json +++ b/homeassistant/components/coolmaster/.translations/sv.json @@ -17,7 +17,7 @@ }, "title": "St\u00e4ll in dina CoolMasterNet-anslutningsdetaljer." } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/zh-Hant.json b/homeassistant/components/coolmaster/.translations/zh-Hant.json index bc61e82b98ac..56c4fdb377c7 100644 --- a/homeassistant/components/coolmaster/.translations/zh-Hant.json +++ b/homeassistant/components/coolmaster/.translations/zh-Hant.json @@ -17,7 +17,7 @@ }, "title": "\u8a2d\u5b9a CoolMasterNet \u9023\u7dda\u8cc7\u8a0a\u3002" } - }, - "title": "CoolMasterNet" - } + } + }, + "title": "CoolMasterNet" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ca.json b/homeassistant/components/coronavirus/.translations/ca.json index 43bd868d0c47..d91499dd0d89 100644 --- a/homeassistant/components/coronavirus/.translations/ca.json +++ b/homeassistant/components/coronavirus/.translations/ca.json @@ -10,7 +10,7 @@ }, "title": "Tria un pa\u00eds a monitoritzar" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/da.json b/homeassistant/components/coronavirus/.translations/da.json index 5f3dc09cf208..c9b42c49112f 100644 --- a/homeassistant/components/coronavirus/.translations/da.json +++ b/homeassistant/components/coronavirus/.translations/da.json @@ -10,7 +10,7 @@ }, "title": "V\u00e6lg et land at overv\u00e5ge" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/de.json b/homeassistant/components/coronavirus/.translations/de.json index d3602540349c..3d00dd1f6c1f 100644 --- a/homeassistant/components/coronavirus/.translations/de.json +++ b/homeassistant/components/coronavirus/.translations/de.json @@ -10,7 +10,7 @@ }, "title": "W\u00e4hlen Sie ein Land aus, das \u00fcberwacht werden soll" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/en.json b/homeassistant/components/coronavirus/.translations/en.json index b19e42cdf273..d75a5ef4704d 100644 --- a/homeassistant/components/coronavirus/.translations/en.json +++ b/homeassistant/components/coronavirus/.translations/en.json @@ -10,7 +10,7 @@ }, "title": "Pick a country to monitor" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/es.json b/homeassistant/components/coronavirus/.translations/es.json index edc31f48761f..a96f48c970ce 100644 --- a/homeassistant/components/coronavirus/.translations/es.json +++ b/homeassistant/components/coronavirus/.translations/es.json @@ -10,7 +10,7 @@ }, "title": "Elige un pa\u00eds para monitorizar" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/fr.json b/homeassistant/components/coronavirus/.translations/fr.json index 923a4cdc819e..c2288786661e 100644 --- a/homeassistant/components/coronavirus/.translations/fr.json +++ b/homeassistant/components/coronavirus/.translations/fr.json @@ -10,7 +10,7 @@ }, "title": "Choisissez un pays \u00e0 surveiller" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/hu.json b/homeassistant/components/coronavirus/.translations/hu.json index 171aedc801d9..211c97cd68ef 100644 --- a/homeassistant/components/coronavirus/.translations/hu.json +++ b/homeassistant/components/coronavirus/.translations/hu.json @@ -10,7 +10,7 @@ }, "title": "V\u00e1lassz egy orsz\u00e1got a megfigyel\u00e9shez" } - }, - "title": "Koronav\u00edrus" - } + } + }, + "title": "Koronav\u00edrus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/it.json b/homeassistant/components/coronavirus/.translations/it.json index 6fc6bd8f8110..129d96ee1839 100644 --- a/homeassistant/components/coronavirus/.translations/it.json +++ b/homeassistant/components/coronavirus/.translations/it.json @@ -10,7 +10,7 @@ }, "title": "Scegliere una Nazione da monitorare" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ko.json b/homeassistant/components/coronavirus/.translations/ko.json index 8c03db185276..13f65dbe4136 100644 --- a/homeassistant/components/coronavirus/.translations/ko.json +++ b/homeassistant/components/coronavirus/.translations/ko.json @@ -10,7 +10,7 @@ }, "title": "\ubaa8\ub2c8\ud130\ub9c1 \ud560 \uad6d\uac00\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694" } - }, - "title": "\ucf54\ub85c\ub098 \ubc14\uc774\ub7ec\uc2a4" - } + } + }, + "title": "\ucf54\ub85c\ub098 \ubc14\uc774\ub7ec\uc2a4" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/lb.json b/homeassistant/components/coronavirus/.translations/lb.json index dbd56e461bba..b0aabd40c0d9 100644 --- a/homeassistant/components/coronavirus/.translations/lb.json +++ b/homeassistant/components/coronavirus/.translations/lb.json @@ -10,7 +10,7 @@ }, "title": "Wiel ee Land aus fir z'iwwerwaachen" } - }, - "title": "Coronavirus" - } + } + }, + "title": "Coronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/no.json b/homeassistant/components/coronavirus/.translations/no.json index 03a3ff49916c..dff3b965586e 100644 --- a/homeassistant/components/coronavirus/.translations/no.json +++ b/homeassistant/components/coronavirus/.translations/no.json @@ -10,7 +10,7 @@ }, "title": "Velg et land du vil overv\u00e5ke" } - }, - "title": "Koronavirus" - } + } + }, + "title": "Koronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/pl.json b/homeassistant/components/coronavirus/.translations/pl.json index 9862d924ca4f..85183b917cea 100644 --- a/homeassistant/components/coronavirus/.translations/pl.json +++ b/homeassistant/components/coronavirus/.translations/pl.json @@ -10,7 +10,7 @@ }, "title": "Wybierz kraj do monitorowania" } - }, - "title": "Koronawirus" - } + } + }, + "title": "Koronawirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ru.json b/homeassistant/components/coronavirus/.translations/ru.json index b8e5a069e4ab..75e271a297bc 100644 --- a/homeassistant/components/coronavirus/.translations/ru.json +++ b/homeassistant/components/coronavirus/.translations/ru.json @@ -10,7 +10,7 @@ }, "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0443 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430" } - }, - "title": "\u041a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441" - } + } + }, + "title": "\u041a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/sl.json b/homeassistant/components/coronavirus/.translations/sl.json index 180de6d8c180..80d1f452c3a8 100644 --- a/homeassistant/components/coronavirus/.translations/sl.json +++ b/homeassistant/components/coronavirus/.translations/sl.json @@ -10,7 +10,7 @@ }, "title": "Izberite dr\u017eavo za spremljanje" } - }, - "title": "Koronavirus" - } + } + }, + "title": "Koronavirus" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/zh-Hans.json b/homeassistant/components/coronavirus/.translations/zh-Hans.json index f122e794424f..36ab96cb8efd 100644 --- a/homeassistant/components/coronavirus/.translations/zh-Hans.json +++ b/homeassistant/components/coronavirus/.translations/zh-Hans.json @@ -10,7 +10,7 @@ }, "title": "\u8bf7\u9009\u62e9\u8981\u76d1\u63a7\u7684\u56fd\u5bb6/\u5730\u533a" } - }, - "title": "\u65b0\u578b\u51a0\u72b6\u75c5\u6bd2" - } + } + }, + "title": "\u65b0\u578b\u51a0\u72b6\u75c5\u6bd2" } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/zh-Hant.json b/homeassistant/components/coronavirus/.translations/zh-Hant.json index 7286694fd9ba..5de83e5fb0fd 100644 --- a/homeassistant/components/coronavirus/.translations/zh-Hant.json +++ b/homeassistant/components/coronavirus/.translations/zh-Hant.json @@ -10,7 +10,7 @@ }, "title": "\u9078\u64c7\u6240\u8981\u76e3\u8996\u7684\u570b\u5bb6" } - }, - "title": "\u65b0\u51a0\u72c0\u75c5\u6bd2" - } + } + }, + "title": "\u65b0\u51a0\u72c0\u75c5\u6bd2" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/bg.json b/homeassistant/components/daikin/.translations/bg.json index b0ddcbf49037..c3f714bf77d2 100644 --- a/homeassistant/components/daikin/.translations/bg.json +++ b/homeassistant/components/daikin/.translations/bg.json @@ -13,7 +13,7 @@ "description": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 IP \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0432\u0430\u0448\u0438\u044f \u043a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin.", "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin" } - }, - "title": "\u041a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin" - } + } + }, + "title": "\u041a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ca.json b/homeassistant/components/daikin/.translations/ca.json index 2fa60015ca33..f5338e85d3fd 100644 --- a/homeassistant/components/daikin/.translations/ca.json +++ b/homeassistant/components/daikin/.translations/ca.json @@ -13,7 +13,7 @@ "description": "Introdueix l'adre\u00e7a IP del teu Daikin AC.", "title": "Configuraci\u00f3 de Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/da.json b/homeassistant/components/daikin/.translations/da.json index 856bb1445c71..f8e21aa44bd0 100644 --- a/homeassistant/components/daikin/.translations/da.json +++ b/homeassistant/components/daikin/.translations/da.json @@ -13,7 +13,7 @@ "description": "Indtast IP-adresse p\u00e5 dit Daikin AC.", "title": "Konfigurer Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/de.json b/homeassistant/components/daikin/.translations/de.json index b3e775fadf4c..ad5fe4dc52e4 100644 --- a/homeassistant/components/daikin/.translations/de.json +++ b/homeassistant/components/daikin/.translations/de.json @@ -13,7 +13,7 @@ "description": "Gib die IP-Adresse deiner Daikin AC ein.", "title": "Daikin AC konfigurieren" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/en.json b/homeassistant/components/daikin/.translations/en.json index 1605e1dc8f69..4540db5f2575 100644 --- a/homeassistant/components/daikin/.translations/en.json +++ b/homeassistant/components/daikin/.translations/en.json @@ -13,7 +13,7 @@ "description": "Enter IP address of your Daikin AC.", "title": "Configure Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/es-419.json b/homeassistant/components/daikin/.translations/es-419.json index 6fa2b664a301..5069457a4e69 100644 --- a/homeassistant/components/daikin/.translations/es-419.json +++ b/homeassistant/components/daikin/.translations/es-419.json @@ -13,7 +13,7 @@ "description": "Introduzca la direcci\u00f3n IP de su Daikin AC.", "title": "Configurar Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/es.json b/homeassistant/components/daikin/.translations/es.json index d3a733a3f9be..375a4b44fd49 100644 --- a/homeassistant/components/daikin/.translations/es.json +++ b/homeassistant/components/daikin/.translations/es.json @@ -13,7 +13,7 @@ "description": "Introduce la IP de tu aire acondicionado Daikin", "title": "Configurar aire acondicionado Daikin" } - }, - "title": "Aire acondicionado Daikin" - } + } + }, + "title": "Aire acondicionado Daikin" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/fr.json b/homeassistant/components/daikin/.translations/fr.json index cfd4b7442d6c..5a143252469b 100644 --- a/homeassistant/components/daikin/.translations/fr.json +++ b/homeassistant/components/daikin/.translations/fr.json @@ -13,7 +13,7 @@ "description": "Entrez l'adresse IP de votre Daikin AC.", "title": "Configurer Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/hu.json b/homeassistant/components/daikin/.translations/hu.json index f433a6215b85..cb2118c3a0ba 100644 --- a/homeassistant/components/daikin/.translations/hu.json +++ b/homeassistant/components/daikin/.translations/hu.json @@ -13,7 +13,7 @@ "description": "Add meg a Daikin l\u00e9gkond\u00edcion\u00e1l\u00f3 IP-c\u00edm\u00e9t.", "title": "A Daikin l\u00e9gkond\u00edcion\u00e1l\u00f3 konfigur\u00e1l\u00e1sa" } - }, - "title": "Daikin L\u00e9gkond\u00edci\u00f3n\u00e1l\u00f3" - } + } + }, + "title": "Daikin L\u00e9gkond\u00edci\u00f3n\u00e1l\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/it.json b/homeassistant/components/daikin/.translations/it.json index 0b8151d23f65..78cd905a4178 100644 --- a/homeassistant/components/daikin/.translations/it.json +++ b/homeassistant/components/daikin/.translations/it.json @@ -13,7 +13,7 @@ "description": "Inserisci l'indirizzo IP del tuo Daikin AC.", "title": "Configura Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ko.json b/homeassistant/components/daikin/.translations/ko.json index 4b1d1bd86e5b..90d9c0b0ead4 100644 --- a/homeassistant/components/daikin/.translations/ko.json +++ b/homeassistant/components/daikin/.translations/ko.json @@ -13,7 +13,7 @@ "description": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8\uc758 IP \uc8fc\uc18c\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8 \uad6c\uc131" } - }, - "title": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8" - } + } + }, + "title": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/lb.json b/homeassistant/components/daikin/.translations/lb.json index cdf98f5e597e..ccd4903bbabc 100644 --- a/homeassistant/components/daikin/.translations/lb.json +++ b/homeassistant/components/daikin/.translations/lb.json @@ -13,7 +13,7 @@ "description": "Gitt d'IP Adresse vum Daikin AC an:", "title": "Daikin AC konfigur\u00e9ieren" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/nl.json b/homeassistant/components/daikin/.translations/nl.json index 683bb61dd44a..c01c8a734bb8 100644 --- a/homeassistant/components/daikin/.translations/nl.json +++ b/homeassistant/components/daikin/.translations/nl.json @@ -13,7 +13,7 @@ "description": "Voer het IP-adres van uw Daikin AC in.", "title": "Daikin AC instellen" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/nn.json b/homeassistant/components/daikin/.translations/nn.json index 67d4f8526257..fb8f82824c24 100644 --- a/homeassistant/components/daikin/.translations/nn.json +++ b/homeassistant/components/daikin/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Daikin AC" - } + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/no.json b/homeassistant/components/daikin/.translations/no.json index 30feb3b5acca..c8dbbcbbba37 100644 --- a/homeassistant/components/daikin/.translations/no.json +++ b/homeassistant/components/daikin/.translations/no.json @@ -13,7 +13,7 @@ "description": "Angi IP-adressen til din Daikin AC.", "title": "Konfigurer Daikin AC" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pl.json b/homeassistant/components/daikin/.translations/pl.json index 3caea70c4de8..fc77fdc9d313 100644 --- a/homeassistant/components/daikin/.translations/pl.json +++ b/homeassistant/components/daikin/.translations/pl.json @@ -13,7 +13,7 @@ "description": "Wprowad\u017a adres IP Daikin AC.", "title": "Konfiguracja Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pt-BR.json b/homeassistant/components/daikin/.translations/pt-BR.json index bbdf68ed7948..6e8a55d56fbf 100644 --- a/homeassistant/components/daikin/.translations/pt-BR.json +++ b/homeassistant/components/daikin/.translations/pt-BR.json @@ -13,7 +13,7 @@ "description": "Digite o endere\u00e7o IP do seu AC Daikin.", "title": "Configurar o AC Daikin" } - }, - "title": "AC Daikin" - } + } + }, + "title": "AC Daikin" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pt.json b/homeassistant/components/daikin/.translations/pt.json index 34b4c86e77d3..b8ba5afe94c0 100644 --- a/homeassistant/components/daikin/.translations/pt.json +++ b/homeassistant/components/daikin/.translations/pt.json @@ -13,7 +13,7 @@ "description": "Introduza o endere\u00e7o IP do seu Daikin AC.", "title": "Configurar o Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ru.json b/homeassistant/components/daikin/.translations/ru.json index c9ab31597d7e..a5ca34285d1f 100644 --- a/homeassistant/components/daikin/.translations/ru.json +++ b/homeassistant/components/daikin/.translations/ru.json @@ -13,7 +13,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 IP-\u0430\u0434\u0440\u0435\u0441 \u0412\u0430\u0448\u0435\u0433\u043e Daikin AC.", "title": "Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/sl.json b/homeassistant/components/daikin/.translations/sl.json index 088b354fbb1b..005ce5910eab 100644 --- a/homeassistant/components/daikin/.translations/sl.json +++ b/homeassistant/components/daikin/.translations/sl.json @@ -13,7 +13,7 @@ "description": "Vnesite naslov IP va\u0161e Daikin klime.", "title": "Nastavite Daikin klimo" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/sv.json b/homeassistant/components/daikin/.translations/sv.json index 0f1247197aa9..2058992de2c7 100644 --- a/homeassistant/components/daikin/.translations/sv.json +++ b/homeassistant/components/daikin/.translations/sv.json @@ -13,7 +13,7 @@ "description": "Ange IP-adressen f\u00f6r din Daikin AC.", "title": "Konfigurera Daikin AC" } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/th.json b/homeassistant/components/daikin/.translations/th.json index 8f0fdda37116..d8f55ea6058d 100644 --- a/homeassistant/components/daikin/.translations/th.json +++ b/homeassistant/components/daikin/.translations/th.json @@ -6,7 +6,7 @@ "host": "\u0e42\u0e2e\u0e2a\u0e15\u0e4c" } } - }, - "title": "Daikin AC" - } + } + }, + "title": "Daikin AC" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/zh-Hans.json b/homeassistant/components/daikin/.translations/zh-Hans.json index 5123dc2366b9..92898ab0f9b7 100644 --- a/homeassistant/components/daikin/.translations/zh-Hans.json +++ b/homeassistant/components/daikin/.translations/zh-Hans.json @@ -13,7 +13,7 @@ "description": "\u8f93\u5165\u60a8\u7684 Daikin \u7a7a\u8c03\u7684 IP \u5730\u5740\u3002", "title": "\u914d\u7f6e Daikin \u7a7a\u8c03" } - }, - "title": "Daikin \u7a7a\u8c03" - } + } + }, + "title": "Daikin \u7a7a\u8c03" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/zh-Hant.json b/homeassistant/components/daikin/.translations/zh-Hant.json index 457b7d1b89c5..6bf389bcb42f 100644 --- a/homeassistant/components/daikin/.translations/zh-Hant.json +++ b/homeassistant/components/daikin/.translations/zh-Hant.json @@ -13,7 +13,7 @@ "description": "\u8f38\u5165\u60a8\u7684\u5927\u91d1\u7a7a\u8abf IP \u4f4d\u5740\u3002", "title": "\u8a2d\u5b9a\u5927\u91d1\u7a7a\u8abf" } - }, - "title": "\u5927\u91d1\u7a7a\u8abf\uff08Daikin AC\uff09" - } + } + }, + "title": "\u5927\u91d1\u7a7a\u8abf\uff08Daikin AC\uff09" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/bg.json b/homeassistant/components/deconz/.translations/bg.json index 3bcbb5923019..84fbb1803979 100644 --- a/homeassistant/components/deconz/.translations/bg.json +++ b/homeassistant/components/deconz/.translations/bg.json @@ -28,8 +28,7 @@ "description": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438 deCONZ \u0448\u043b\u044e\u0437\u0430 \u0437\u0430 \u0434\u0430 \u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430 \u0441 Home Assistant.\n\n1. \u041e\u0442\u0438\u0434\u0435\u0442\u0435 \u043d\u0430 deCONZ Settings -> Gateway -> Advanced\n2. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 \"Authenticate app\"", "title": "\u0412\u0440\u044a\u0437\u043a\u0430 \u0441 deCONZ" } - }, - "title": "deCONZ Zigbee \u0448\u043b\u044e\u0437" + } }, "device_automation": { "trigger_subtype": { @@ -87,5 +86,6 @@ "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0442\u0430 \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 deCONZ" } } - } + }, + "title": "deCONZ Zigbee \u0448\u043b\u044e\u0437" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ca.json b/homeassistant/components/deconz/.translations/ca.json index ee386bece554..a626e78047aa 100644 --- a/homeassistant/components/deconz/.translations/ca.json +++ b/homeassistant/components/deconz/.translations/ca.json @@ -28,8 +28,7 @@ "description": "Desbloqueja la teva passarel\u00b7la d'enlla\u00e7 deCONZ per a registrar-te amb Home Assistant.\n\n1. V\u00e9s a la configuraci\u00f3 del sistema deCONZ -> Passarel\u00b7la -> Avan\u00e7at\n2. Prem el bot\u00f3 \"Autenticar applicaci\u00f3\"", "title": "Vincular amb deCONZ" } - }, - "title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "Opcions de deCONZ" } } - } + }, + "title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/cs.json b/homeassistant/components/deconz/.translations/cs.json index 544ab0ff2ed3..6be08699b825 100644 --- a/homeassistant/components/deconz/.translations/cs.json +++ b/homeassistant/components/deconz/.translations/cs.json @@ -25,7 +25,7 @@ "description": "Odemkn\u011bte br\u00e1nu deCONZ, pro registraci v Home Assistant. \n\n 1. P\u0159ejd\u011bte do nastaven\u00ed syst\u00e9mu deCONZ \n 2. Stiskn\u011bte tla\u010d\u00edtko \"Unlock Gateway\"", "title": "Propojit s deCONZ" } - }, - "title": "Br\u00e1na deCONZ Zigbee" - } + } + }, + "title": "Br\u00e1na deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/cy.json b/homeassistant/components/deconz/.translations/cy.json index fff54bb3f6cf..eb511dedf8fe 100644 --- a/homeassistant/components/deconz/.translations/cy.json +++ b/homeassistant/components/deconz/.translations/cy.json @@ -20,7 +20,7 @@ "description": "Datgloi eich porth deCONZ i gofrestru gyda Cynorthwydd Cartref.\n\n1. Ewch i osodiadau system deCONZ \n2. Bwyso botwm \"Datgloi porth\"", "title": "Cysylltu \u00e2 deCONZ" } - }, - "title": "deCONZ" - } + } + }, + "title": "deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/da.json b/homeassistant/components/deconz/.translations/da.json index 91dd0ea9a54a..01c1097673d5 100644 --- a/homeassistant/components/deconz/.translations/da.json +++ b/homeassistant/components/deconz/.translations/da.json @@ -28,8 +28,7 @@ "description": "L\u00e5s din deCONZ-gateway op for at registrere dig med Home Assistant. \n\n 1. G\u00e5 til deCONZ settings -> Gateway -> Advanced\n 2. Tryk p\u00e5 knappen \"Authenticate app\"", "title": "Forbind med deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "deCONZ-indstillinger" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index 7cd82ed7935f..2732c6e94eff 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -28,8 +28,7 @@ "description": "Entsperre dein deCONZ-Gateway, um es bei Home Assistant zu registrieren. \n\n 1. Gehe in die deCONZ-Systemeinstellungen \n 2. Dr\u00fccke die Taste \"Gateway entsperren\"", "title": "Mit deCONZ verbinden" } - }, - "title": "deCONZ Zigbee Gateway" + } }, "device_automation": { "trigger_subtype": { @@ -96,5 +95,6 @@ "title": "deCONZ-Optionen" } } - } + }, + "title": "deCONZ Zigbee Gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index b82d99f87e27..117fc3e3398f 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -28,8 +28,7 @@ "description": "Unlock your deCONZ gateway to register with Home Assistant.\n\n1. Go to deCONZ Settings -> Gateway -> Advanced\n2. Press \"Authenticate app\" button", "title": "Link with deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -96,5 +95,6 @@ "title": "deCONZ options" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/es-419.json b/homeassistant/components/deconz/.translations/es-419.json index ea65ffbab334..96c85cb48243 100644 --- a/homeassistant/components/deconz/.translations/es-419.json +++ b/homeassistant/components/deconz/.translations/es-419.json @@ -27,8 +27,7 @@ "description": "Desbloquee su puerta de enlace deCONZ para registrarse con Home Assistant. \n\n 1. Vaya a Configuraci\u00f3n deCONZ - > Gateway - > Avanzado \n 2. Presione el bot\u00f3n \"Autenticar aplicaci\u00f3n\"", "title": "Enlazar con deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -48,5 +47,6 @@ "remote_button_rotated": "Bot\u00f3n girado \"{subtype}\"", "remote_gyro_activated": "Dispositivo agitado" } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/es.json b/homeassistant/components/deconz/.translations/es.json index d2304a7aa64a..e64ddeeaa007 100644 --- a/homeassistant/components/deconz/.translations/es.json +++ b/homeassistant/components/deconz/.translations/es.json @@ -28,8 +28,7 @@ "description": "Desbloquea tu gateway de deCONZ para registrarte con Home Assistant.\n\n1. Dir\u00edgete a deCONZ Settings -> Gateway -> Advanced\n2. Pulsa el bot\u00f3n \"Authenticate app\"", "title": "Enlazar con deCONZ" } - }, - "title": "Pasarela Zigbee deCONZ" + } }, "device_automation": { "trigger_subtype": { @@ -96,5 +95,6 @@ "title": "Opciones deCONZ" } } - } + }, + "title": "Pasarela Zigbee deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/et.json b/homeassistant/components/deconz/.translations/et.json index 93c54b3915cb..dd415341f5b6 100644 --- a/homeassistant/components/deconz/.translations/et.json +++ b/homeassistant/components/deconz/.translations/et.json @@ -7,7 +7,7 @@ "port": "" } } - }, - "title": "deCONZ Zigbee l\u00fc\u00fcs" - } + } + }, + "title": "deCONZ Zigbee l\u00fc\u00fcs" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/fr.json b/homeassistant/components/deconz/.translations/fr.json index 0c2ecf9edb88..85463ad1fb43 100644 --- a/homeassistant/components/deconz/.translations/fr.json +++ b/homeassistant/components/deconz/.translations/fr.json @@ -28,8 +28,7 @@ "description": "D\u00e9verrouillez votre passerelle deCONZ pour vous enregistrer avec Home Assistant. \n\n 1. Acc\u00e9dez aux param\u00e8tres avanc\u00e9s du syst\u00e8me deCONZ \n 2. Cliquez sur \"D\u00e9verrouiller la passerelle\"", "title": "Lien vers deCONZ" } - }, - "title": "Passerelle deCONZ Zigbee" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "Options deCONZ" } } - } + }, + "title": "Passerelle deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/he.json b/homeassistant/components/deconz/.translations/he.json index da7878e94afc..e7c09897d481 100644 --- a/homeassistant/components/deconz/.translations/he.json +++ b/homeassistant/components/deconz/.translations/he.json @@ -20,7 +20,7 @@ "description": "\u05d1\u05d8\u05dc \u05d0\u05ea \u05e0\u05e2\u05d9\u05dc\u05ea \u05d4\u05de\u05e9\u05e8 deCONZ \u05e9\u05dc\u05da \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd Home Assistant.\n\n 1. \u05e2\u05d1\u05d5\u05e8 \u05d0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05e2\u05e8\u05db\u05ea deCONZ \n .2 \u05dc\u05d7\u05e5 \u05e2\u05dc \"Unlock Gateway\"", "title": "\u05e7\u05e9\u05e8 \u05e2\u05dd deCONZ" } - }, - "title": "\u05de\u05d2\u05e9\u05e8 deCONZ Zigbee" - } + } + }, + "title": "\u05de\u05d2\u05e9\u05e8 deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/hu.json b/homeassistant/components/deconz/.translations/hu.json index 31148c80e30d..ced8249c85e5 100644 --- a/homeassistant/components/deconz/.translations/hu.json +++ b/homeassistant/components/deconz/.translations/hu.json @@ -27,8 +27,7 @@ "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", "title": "Kapcsol\u00f3d\u00e1s a deCONZ-hoz" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -92,5 +91,6 @@ "description": "A deCONZ eszk\u00f6zt\u00edpusok l\u00e1that\u00f3s\u00e1g\u00e1nak konfigur\u00e1l\u00e1sa" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/id.json b/homeassistant/components/deconz/.translations/id.json index 72aaa84e70da..5bb9a4997de3 100644 --- a/homeassistant/components/deconz/.translations/id.json +++ b/homeassistant/components/deconz/.translations/id.json @@ -20,7 +20,7 @@ "description": "Buka gerbang deCONZ Anda untuk mendaftar dengan Home Assistant. \n\n 1. Pergi ke pengaturan sistem deCONZ \n 2. Tekan tombol \"Buka Kunci Gateway\"", "title": "Tautan dengan deCONZ" } - }, - "title": "deCONZ Zigbee gateway" - } + } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/it.json b/homeassistant/components/deconz/.translations/it.json index e12668f082cd..7973749aebbc 100644 --- a/homeassistant/components/deconz/.translations/it.json +++ b/homeassistant/components/deconz/.translations/it.json @@ -28,8 +28,7 @@ "description": "Sblocca il tuo gateway deCONZ per registrarti con Home Assistant.\n\n1. Vai a Impostazioni deCONZ -> Gateway -> Avanzate\n2. Premere il pulsante \"Autentica app\"", "title": "Collega con deCONZ" } - }, - "title": "Gateway Zigbee deCONZ" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "Opzioni deCONZ" } } - } + }, + "title": "Gateway Zigbee deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ko.json b/homeassistant/components/deconz/.translations/ko.json index 00b9c1f437a2..54487db6c86e 100644 --- a/homeassistant/components/deconz/.translations/ko.json +++ b/homeassistant/components/deconz/.translations/ko.json @@ -28,8 +28,7 @@ "description": "deCONZ \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc5b8\ub77d\ud558\uc5ec Home Assistant \uc5d0 \uc5f0\uacb0\ud558\uae30.\n\n1. deCONZ \uc2dc\uc2a4\ud15c \uc124\uc815\uc73c\ub85c \uc774\ub3d9\ud558\uc138\uc694\n2. \"Authenticate app\" \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694", "title": "deCONZ\uc640 \uc5f0\uacb0" } - }, - "title": "deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "deCONZ \uc635\uc158" } } - } + }, + "title": "deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/lb.json b/homeassistant/components/deconz/.translations/lb.json index 61479cb78e2f..a7675305ec37 100644 --- a/homeassistant/components/deconz/.translations/lb.json +++ b/homeassistant/components/deconz/.translations/lb.json @@ -28,8 +28,7 @@ "description": "Entsperrt \u00e4r deCONZ gateway fir se mat Home Assistant ze registr\u00e9ieren.\n\n1. Gidd op deCONZ System Astellungen\n2. Dr\u00e9ckt \"Unlock\" Gateway Kn\u00e4ppchen", "title": "Link mat deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "deCONZ Optiounen" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/nl.json b/homeassistant/components/deconz/.translations/nl.json index 611d38ba9500..bf52e00b9f91 100644 --- a/homeassistant/components/deconz/.translations/nl.json +++ b/homeassistant/components/deconz/.translations/nl.json @@ -28,8 +28,7 @@ "description": "Ontgrendel je deCONZ gateway om te registreren met Home Assistant.\n\n1. Ga naar deCONZ systeeminstellingen (Instellingen -> Gateway -> Geavanceerd)\n2. Druk op de knop \"Gateway ontgrendelen\"", "title": "Koppel met deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { @@ -93,5 +92,6 @@ "description": "Configureer de zichtbaarheid van deCONZ-apparaattypen" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/nn.json b/homeassistant/components/deconz/.translations/nn.json index 986795e11c97..30264b9c820a 100644 --- a/homeassistant/components/deconz/.translations/nn.json +++ b/homeassistant/components/deconz/.translations/nn.json @@ -20,7 +20,7 @@ "description": "L\u00e5s opp deCONZ-gatewayen din for \u00e5 registrere den med Home Assistant.\n\n1. G\u00e5 til systeminnstillingane til deCONZ\n2. Trykk p\u00e5 \"L\u00e5s opp gateway\"-knappen", "title": "Link med deCONZ" } - }, - "title": "deCONZ Zigbee gateway" - } + } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/no.json b/homeassistant/components/deconz/.translations/no.json index a10ae01e25f3..b08157ecbc21 100644 --- a/homeassistant/components/deconz/.translations/no.json +++ b/homeassistant/components/deconz/.translations/no.json @@ -28,12 +28,12 @@ "description": "L\u00e5s opp deCONZ-gatewayen din for \u00e5 registrere deg med Home Assistant. \n\n 1. G\u00e5 til deCONZ-systeminnstillinger -> Gateway -> Avansert \n 2. Trykk p\u00e5 \"L\u00e5s opp gateway\" knappen", "title": "Koble til deCONZ" } - }, - "title": "deCONZ Zigbee gateway" + } }, "device_automation": { "trigger_subtype": { "both_buttons": "Begge knappene", + "bottom_buttons": "Nederste knappene", "button_1": "F\u00f8rste knapp", "button_2": "Andre knapp", "button_3": "Tredje knapp", @@ -50,6 +50,7 @@ "side_4": "Side 4", "side_5": "Side 5", "side_6": "Side 6", + "top_buttons": "\u00d8verste knappene", "turn_off": "Skru av", "turn_on": "Sl\u00e5 p\u00e5" }, @@ -94,5 +95,6 @@ "title": "deCONZ alternativer" } } - } + }, + "title": "deCONZ Zigbee gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pl.json b/homeassistant/components/deconz/.translations/pl.json index ace1f4182a45..18418b375a20 100644 --- a/homeassistant/components/deconz/.translations/pl.json +++ b/homeassistant/components/deconz/.translations/pl.json @@ -28,8 +28,7 @@ "description": "Odblokuj bramk\u0119 deCONZ, aby zarejestrowa\u0107 j\u0105 w Home Assistant. \n\n 1. Przejd\u017a do ustawienia deCONZ > bramka > Zaawansowane\n 2. Naci\u015bnij przycisk \"Uwierzytelnij aplikacj\u0119\"", "title": "Po\u0142\u0105cz z deCONZ" } - }, - "title": "Brama deCONZ Zigbee" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "Opcje deCONZ" } } - } + }, + "title": "Brama deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pt-BR.json b/homeassistant/components/deconz/.translations/pt-BR.json index 6d800bb02699..5345db7b04e6 100644 --- a/homeassistant/components/deconz/.translations/pt-BR.json +++ b/homeassistant/components/deconz/.translations/pt-BR.json @@ -27,7 +27,7 @@ "description": "Desbloqueie o seu gateway deCONZ para se registar no Home Assistant. \n\n 1. V\u00e1 para as configura\u00e7\u00f5es do sistema deCONZ \n 2. Pressione o bot\u00e3o \"Desbloquear Gateway\"", "title": "Linkar com deCONZ" } - }, - "title": "Gateway deCONZ Zigbee" - } + } + }, + "title": "Gateway deCONZ Zigbee" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pt.json b/homeassistant/components/deconz/.translations/pt.json index f0ea9e57ca05..1d73892e2b3c 100644 --- a/homeassistant/components/deconz/.translations/pt.json +++ b/homeassistant/components/deconz/.translations/pt.json @@ -20,8 +20,7 @@ "description": "Desbloqueie o seu gateway deCONZ para se registar no Home Assistant. \n\n 1. V\u00e1 para as configura\u00e7\u00f5es do sistema deCONZ \n 2. Pressione o bot\u00e3o \"Desbloquear Gateway\"", "title": "Liga\u00e7\u00e3o com deCONZ" } - }, - "title": "Gateway Zigbee deCONZ" + } }, "device_automation": { "trigger_subtype": { @@ -33,5 +32,6 @@ "side_5": "Lado 5", "side_6": "Lado 6" } - } + }, + "title": "Gateway Zigbee deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ru.json b/homeassistant/components/deconz/.translations/ru.json index 3d2f8358422c..0798e8ae73c1 100644 --- a/homeassistant/components/deconz/.translations/ru.json +++ b/homeassistant/components/deconz/.translations/ru.json @@ -28,8 +28,7 @@ "description": "\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0439\u0442\u0435 \u0448\u043b\u044e\u0437 deCONZ \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 Home Assistant:\n\n1. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b deCONZ -> Gateway -> Advanced.\n2. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00abAuthenticate app\u00bb.", "title": "\u0421\u0432\u044f\u0437\u044c \u0441 deCONZ" } - }, - "title": "deCONZ" + } }, "device_automation": { "trigger_subtype": { @@ -96,5 +95,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 deCONZ" } } - } + }, + "title": "deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/sl.json b/homeassistant/components/deconz/.translations/sl.json index 15927059d32e..6cd97221fde9 100644 --- a/homeassistant/components/deconz/.translations/sl.json +++ b/homeassistant/components/deconz/.translations/sl.json @@ -28,8 +28,7 @@ "description": "Odklenite va\u0161 deCONZ gateway za registracijo s Home Assistant-om. \n1. Pojdite v deCONZ sistemske nastavitve\n2. Pritisnite tipko \"odkleni prehod\"", "title": "Povezava z deCONZ" } - }, - "title": "deCONZ Zigbee prehod" + } }, "device_automation": { "trigger_subtype": { @@ -94,5 +93,6 @@ "title": "mo\u017enosti deCONZ" } } - } + }, + "title": "deCONZ Zigbee prehod" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/sv.json b/homeassistant/components/deconz/.translations/sv.json index 11a8aac485a0..f9c2683ff53f 100644 --- a/homeassistant/components/deconz/.translations/sv.json +++ b/homeassistant/components/deconz/.translations/sv.json @@ -28,8 +28,7 @@ "description": "L\u00e5s upp din deCONZ-gateway f\u00f6r att registrera dig med Home Assistant. \n\n 1. G\u00e5 till deCONZ-systeminst\u00e4llningarna \n 2. Tryck p\u00e5 \"L\u00e5s upp gateway\"-knappen", "title": "L\u00e4nka med deCONZ" } - }, - "title": "deCONZ Zigbee Gateway" + } }, "device_automation": { "trigger_subtype": { @@ -93,5 +92,6 @@ "description": "Konfigurera synlighet f\u00f6r deCONZ-enhetstyper" } } - } + }, + "title": "deCONZ Zigbee Gateway" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/zh-Hans.json b/homeassistant/components/deconz/.translations/zh-Hans.json index ada31494619d..40c51f99d0aa 100644 --- a/homeassistant/components/deconz/.translations/zh-Hans.json +++ b/homeassistant/components/deconz/.translations/zh-Hans.json @@ -20,8 +20,7 @@ "description": "\u89e3\u9501\u60a8\u7684 deCONZ \u7f51\u5173\u4ee5\u6ce8\u518c\u5230 Home Assistant\u3002 \n\n 1. \u524d\u5f80 deCONZ \u7cfb\u7edf\u8bbe\u7f6e\n 2. \u70b9\u51fb\u201c\u89e3\u9501\u7f51\u5173\u201d\u6309\u94ae", "title": "\u8fde\u63a5 deCONZ" } - }, - "title": "deCONZ" + } }, "device_automation": { "trigger_subtype": { @@ -52,5 +51,6 @@ "title": "deCONZ \u9009\u9879" } } - } + }, + "title": "deCONZ" } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/zh-Hant.json b/homeassistant/components/deconz/.translations/zh-Hant.json index 030b54a1a66b..a74782396828 100644 --- a/homeassistant/components/deconz/.translations/zh-Hant.json +++ b/homeassistant/components/deconz/.translations/zh-Hant.json @@ -28,8 +28,7 @@ "description": "\u89e3\u9664 deCONZ \u9598\u9053\u5668\u9396\u5b9a\uff0c\u4ee5\u65bc Home Assistant \u9032\u884c\u8a3b\u518a\u3002\n\n1. \u9032\u5165 deCONZ \u7cfb\u7d71\u8a2d\u5b9a -> \u9598\u9053\u5668 -> \u9032\u968e\u8a2d\u5b9a\n2. \u6309\u4e0b\u300c\u8a8d\u8b49\u7a0b\u5f0f\uff08Authenticate app\uff09\u300d\u6309\u9215", "title": "\u9023\u7d50\u81f3 deCONZ" } - }, - "title": "deCONZ Zigbee \u9598\u9053\u5668" + } }, "device_automation": { "trigger_subtype": { @@ -96,5 +95,6 @@ "title": "deCONZ \u9078\u9805" } } - } + }, + "title": "deCONZ Zigbee \u9598\u9053\u5668" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/bg.json b/homeassistant/components/demo/.translations/bg.json index 3b1f5f8a8d23..9609b0e64d94 100644 --- a/homeassistant/components/demo/.translations/bg.json +++ b/homeassistant/components/demo/.translations/bg.json @@ -1,5 +1,3 @@ { - "config": { - "title": "\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f" - } + "title": "\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/ca.json b/homeassistant/components/demo/.translations/ca.json index a29718fea7aa..a4176a430853 100644 --- a/homeassistant/components/demo/.translations/ca.json +++ b/homeassistant/components/demo/.translations/ca.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demostraci\u00f3" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "Demostraci\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/da.json b/homeassistant/components/demo/.translations/da.json index fd2764e5ec93..7017d075a8eb 100644 --- a/homeassistant/components/demo/.translations/da.json +++ b/homeassistant/components/demo/.translations/da.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/de.json b/homeassistant/components/demo/.translations/de.json index 658a39246d9f..30778b4490b5 100644 --- a/homeassistant/components/demo/.translations/de.json +++ b/homeassistant/components/demo/.translations/de.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/en.json b/homeassistant/components/demo/.translations/en.json index e49671c88c82..6c1d1c1b3e68 100644 --- a/homeassistant/components/demo/.translations/en.json +++ b/homeassistant/components/demo/.translations/en.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/es-419.json b/homeassistant/components/demo/.translations/es-419.json index ef01fcb4f3c3..a9abb4aacd9c 100644 --- a/homeassistant/components/demo/.translations/es-419.json +++ b/homeassistant/components/demo/.translations/es-419.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Demo" - } + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/es.json b/homeassistant/components/demo/.translations/es.json index 9fd9b61dda19..a60aee6a42be 100644 --- a/homeassistant/components/demo/.translations/es.json +++ b/homeassistant/components/demo/.translations/es.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/fr.json b/homeassistant/components/demo/.translations/fr.json index 3621cd1c404a..941f04f5c9e4 100644 --- a/homeassistant/components/demo/.translations/fr.json +++ b/homeassistant/components/demo/.translations/fr.json @@ -1,7 +1,4 @@ { - "config": { - "title": "D\u00e9mo" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "D\u00e9mo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/hu.json b/homeassistant/components/demo/.translations/hu.json index 51f0cd006425..996b9c138ef9 100644 --- a/homeassistant/components/demo/.translations/hu.json +++ b/homeassistant/components/demo/.translations/hu.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Dem\u00f3" - } + "title": "Dem\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/it.json b/homeassistant/components/demo/.translations/it.json index 1173cc48e04a..16477633de2a 100644 --- a/homeassistant/components/demo/.translations/it.json +++ b/homeassistant/components/demo/.translations/it.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/ja.json b/homeassistant/components/demo/.translations/ja.json index 529170b111d4..713cdd6ae350 100644 --- a/homeassistant/components/demo/.translations/ja.json +++ b/homeassistant/components/demo/.translations/ja.json @@ -1,5 +1,3 @@ { - "config": { - "title": "\u30c7\u30e2" - } + "title": "\u30c7\u30e2" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/ko.json b/homeassistant/components/demo/.translations/ko.json index efe69b575fb0..e9e02a6e1b9f 100644 --- a/homeassistant/components/demo/.translations/ko.json +++ b/homeassistant/components/demo/.translations/ko.json @@ -1,7 +1,4 @@ { - "config": { - "title": "\ub370\ubaa8" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "\ub370\ubaa8" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/lb.json b/homeassistant/components/demo/.translations/lb.json index 05b4ba934276..3787d37750cd 100644 --- a/homeassistant/components/demo/.translations/lb.json +++ b/homeassistant/components/demo/.translations/lb.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/lv.json b/homeassistant/components/demo/.translations/lv.json index b7bbb906508f..a13903a0f66b 100644 --- a/homeassistant/components/demo/.translations/lv.json +++ b/homeassistant/components/demo/.translations/lv.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Demonstr\u0101cija" - } + "title": "Demonstr\u0101cija" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/nl.json b/homeassistant/components/demo/.translations/nl.json index cb932a0d9d62..ac10172933f1 100644 --- a/homeassistant/components/demo/.translations/nl.json +++ b/homeassistant/components/demo/.translations/nl.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/no.json b/homeassistant/components/demo/.translations/no.json index a46606621b95..ed813c9e5050 100644 --- a/homeassistant/components/demo/.translations/no.json +++ b/homeassistant/components/demo/.translations/no.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/pl.json b/homeassistant/components/demo/.translations/pl.json index f224d100929d..ea46ae807c6c 100644 --- a/homeassistant/components/demo/.translations/pl.json +++ b/homeassistant/components/demo/.translations/pl.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -26,5 +23,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/pt-BR.json b/homeassistant/components/demo/.translations/pt-BR.json index 8183f28aed3f..9a07b5ebc502 100644 --- a/homeassistant/components/demo/.translations/pt-BR.json +++ b/homeassistant/components/demo/.translations/pt-BR.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Demonstra\u00e7\u00e3o" - } + "title": "Demonstra\u00e7\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/pt.json b/homeassistant/components/demo/.translations/pt.json index 8183f28aed3f..9a07b5ebc502 100644 --- a/homeassistant/components/demo/.translations/pt.json +++ b/homeassistant/components/demo/.translations/pt.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Demonstra\u00e7\u00e3o" - } + "title": "Demonstra\u00e7\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/ru.json b/homeassistant/components/demo/.translations/ru.json index 22ea3d2e1962..a793985702f9 100644 --- a/homeassistant/components/demo/.translations/ru.json +++ b/homeassistant/components/demo/.translations/ru.json @@ -1,7 +1,4 @@ { - "config": { - "title": "\u0414\u0435\u043c\u043e" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "\u0414\u0435\u043c\u043e" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/sl.json b/homeassistant/components/demo/.translations/sl.json index b67d4d56fb1d..33e4ece832cc 100644 --- a/homeassistant/components/demo/.translations/sl.json +++ b/homeassistant/components/demo/.translations/sl.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -26,5 +23,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/sv.json b/homeassistant/components/demo/.translations/sv.json index 4c5f477cc1c5..b577b02e25ba 100644 --- a/homeassistant/components/demo/.translations/sv.json +++ b/homeassistant/components/demo/.translations/sv.json @@ -1,7 +1,4 @@ { - "config": { - "title": "Demo" - }, "options": { "step": { "init": { @@ -24,5 +21,6 @@ } } } - } + }, + "title": "Demo" } \ No newline at end of file diff --git a/homeassistant/components/demo/.translations/zh-Hant.json b/homeassistant/components/demo/.translations/zh-Hant.json index 7f6ac42d6099..084db6adfa2d 100644 --- a/homeassistant/components/demo/.translations/zh-Hant.json +++ b/homeassistant/components/demo/.translations/zh-Hant.json @@ -1,7 +1,4 @@ { - "config": { - "title": "\u5c55\u793a" - }, "options": { "step": { "options_1": { @@ -18,5 +15,6 @@ } } } - } + }, + "title": "\u5c55\u793a" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/bg.json b/homeassistant/components/dialogflow/.translations/bg.json index af1237ce2110..e7b2842e0dc7 100644 --- a/homeassistant/components/dialogflow/.translations/bg.json +++ b/homeassistant/components/dialogflow/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Dialogflow?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ca.json b/homeassistant/components/dialogflow/.translations/ca.json index f6dfc9399c28..3d06f8cb9abf 100644 --- a/homeassistant/components/dialogflow/.translations/ca.json +++ b/homeassistant/components/dialogflow/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar Dialogflow?", "title": "Configuraci\u00f3 del Webhook de Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/cs.json b/homeassistant/components/dialogflow/.translations/cs.json index db41ee98e017..69db954c6f22 100644 --- a/homeassistant/components/dialogflow/.translations/cs.json +++ b/homeassistant/components/dialogflow/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit Dialogflow?", "title": "Nastavit Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/da.json b/homeassistant/components/dialogflow/.translations/da.json index c682c07a8b9f..2d06efc2fa60 100644 --- a/homeassistant/components/dialogflow/.translations/da.json +++ b/homeassistant/components/dialogflow/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Dialogflow?", "title": "Konfigurer Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/de.json b/homeassistant/components/dialogflow/.translations/de.json index 1dbf1fa0c8a6..199a1a83d7f3 100644 --- a/homeassistant/components/dialogflow/.translations/de.json +++ b/homeassistant/components/dialogflow/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du Dialogflow wirklich einrichten?", "title": "Dialogflow Webhook einrichten" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/en.json b/homeassistant/components/dialogflow/.translations/en.json index 9e1cbbb636ef..f5f1633dfd47 100644 --- a/homeassistant/components/dialogflow/.translations/en.json +++ b/homeassistant/components/dialogflow/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up Dialogflow?", "title": "Set up the Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/es-419.json b/homeassistant/components/dialogflow/.translations/es-419.json index 41a66b038f5a..b3e07c6fb263 100644 --- a/homeassistant/components/dialogflow/.translations/es-419.json +++ b/homeassistant/components/dialogflow/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1 seguro de que desea configurar Dialogflow?", "title": "Configurar el Webhook de Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/es.json b/homeassistant/components/dialogflow/.translations/es.json index c106543e158b..ff8394ee0e8a 100644 --- a/homeassistant/components/dialogflow/.translations/es.json +++ b/homeassistant/components/dialogflow/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar Dialogflow?", "title": "Configurar el Webhook de Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/fr.json b/homeassistant/components/dialogflow/.translations/fr.json index 0be75b94be94..e4aef551359e 100644 --- a/homeassistant/components/dialogflow/.translations/fr.json +++ b/homeassistant/components/dialogflow/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer Dialogflow?", "title": "Configurer le Webhook Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/hu.json b/homeassistant/components/dialogflow/.translations/hu.json index 89889fd60481..c042737ff671 100644 --- a/homeassistant/components/dialogflow/.translations/hu.json +++ b/homeassistant/components/dialogflow/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az Dialogflowt?", "title": "Dialogflow Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/it.json b/homeassistant/components/dialogflow/.translations/it.json index cc1a7ac85107..717f037a836b 100644 --- a/homeassistant/components/dialogflow/.translations/it.json +++ b/homeassistant/components/dialogflow/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare Dialogflow?", "title": "Configura il webhook di Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ko.json b/homeassistant/components/dialogflow/.translations/ko.json index 2010495d959e..2ca23b9c4206 100644 --- a/homeassistant/components/dialogflow/.translations/ko.json +++ b/homeassistant/components/dialogflow/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Dialogflow \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Dialogflow Webhook \uc124\uc815" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/lb.json b/homeassistant/components/dialogflow/.translations/lb.json index 752acbdecd3a..d3a4fdc1862f 100644 --- a/homeassistant/components/dialogflow/.translations/lb.json +++ b/homeassistant/components/dialogflow/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Dialogflowanzeriichten?", "title": "Dialogflow Webhook ariichten" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/nl.json b/homeassistant/components/dialogflow/.translations/nl.json index 9871df0d2625..5590df8dab20 100644 --- a/homeassistant/components/dialogflow/.translations/nl.json +++ b/homeassistant/components/dialogflow/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u Dialogflow wilt instellen?", "title": "Stel de Twilio Dialogflow in" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/nn.json b/homeassistant/components/dialogflow/.translations/nn.json index 5a96b853eb09..81b7a05690d6 100644 --- a/homeassistant/components/dialogflow/.translations/nn.json +++ b/homeassistant/components/dialogflow/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Dialogflow" - } + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/no.json b/homeassistant/components/dialogflow/.translations/no.json index 4d23ac8aaba7..7b97ce66a182 100644 --- a/homeassistant/components/dialogflow/.translations/no.json +++ b/homeassistant/components/dialogflow/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 sette opp Dialogflow?", "title": "Sett opp Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pl.json b/homeassistant/components/dialogflow/.translations/pl.json index c555a3e09b36..a1d35e134d9e 100644 --- a/homeassistant/components/dialogflow/.translations/pl.json +++ b/homeassistant/components/dialogflow/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Dialogflow?", "title": "Konfiguracja Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pt-BR.json b/homeassistant/components/dialogflow/.translations/pt-BR.json index 6d709875771c..d8bac88ebf19 100644 --- a/homeassistant/components/dialogflow/.translations/pt-BR.json +++ b/homeassistant/components/dialogflow/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Dialogflow?", "title": "Configurar o Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pt.json b/homeassistant/components/dialogflow/.translations/pt.json index de754080f174..18144097b48b 100644 --- a/homeassistant/components/dialogflow/.translations/pt.json +++ b/homeassistant/components/dialogflow/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Dialogflow?", "title": "Configurar o Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ru.json b/homeassistant/components/dialogflow/.translations/ru.json index 884053288962..c8e5424ee916 100644 --- a/homeassistant/components/dialogflow/.translations/ru.json +++ b/homeassistant/components/dialogflow/.translations/ru.json @@ -12,7 +12,7 @@ "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 Dialogflow?", "title": "Dialogflow" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/sl.json b/homeassistant/components/dialogflow/.translations/sl.json index b6bd30f7997a..28ee1a39dbcf 100644 --- a/homeassistant/components/dialogflow/.translations/sl.json +++ b/homeassistant/components/dialogflow/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti dialogflow?", "title": "Nastavite Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/sv.json b/homeassistant/components/dialogflow/.translations/sv.json index 07fe5e112172..5ebf8da8f7b2 100644 --- a/homeassistant/components/dialogflow/.translations/sv.json +++ b/homeassistant/components/dialogflow/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Dialogflow?", "title": "Konfigurera Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/zh-Hans.json b/homeassistant/components/dialogflow/.translations/zh-Hans.json index 8a542dd0d629..7fd74e1d0084 100644 --- a/homeassistant/components/dialogflow/.translations/zh-Hans.json +++ b/homeassistant/components/dialogflow/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e Dialogflow \u5417?", "title": "\u8bbe\u7f6e Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/zh-Hant.json b/homeassistant/components/dialogflow/.translations/zh-Hant.json index 3cb54145ad85..3943e5f07ef8 100644 --- a/homeassistant/components/dialogflow/.translations/zh-Hant.json +++ b/homeassistant/components/dialogflow/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Dialogflow\uff1f", "title": "\u8a2d\u5b9a Dialogflow Webhook" } - }, - "title": "Dialogflow" - } + } + }, + "title": "Dialogflow" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ca.json b/homeassistant/components/directv/.translations/ca.json index 4bdc104e7dea..e9c3621c9560 100644 --- a/homeassistant/components/directv/.translations/ca.json +++ b/homeassistant/components/directv/.translations/ca.json @@ -19,7 +19,7 @@ }, "title": "Connexi\u00f3 amb el receptor DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/de.json b/homeassistant/components/directv/.translations/de.json index 98a9e81f6613..bd18159b134a 100644 --- a/homeassistant/components/directv/.translations/de.json +++ b/homeassistant/components/directv/.translations/de.json @@ -23,7 +23,7 @@ }, "title": "Schlie\u00dfen Sie den DirecTV-Empf\u00e4nger an" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/en.json b/homeassistant/components/directv/.translations/en.json index 774ce1f2035e..e7b9c7db6b69 100644 --- a/homeassistant/components/directv/.translations/en.json +++ b/homeassistant/components/directv/.translations/en.json @@ -19,7 +19,7 @@ }, "title": "Connect to the DirecTV receiver" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/es.json b/homeassistant/components/directv/.translations/es.json index f23f83481e5f..6e69dfe82531 100644 --- a/homeassistant/components/directv/.translations/es.json +++ b/homeassistant/components/directv/.translations/es.json @@ -19,7 +19,7 @@ }, "title": "Conectar con el receptor DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/fr.json b/homeassistant/components/directv/.translations/fr.json index d7262f50eaff..0847d858f60d 100644 --- a/homeassistant/components/directv/.translations/fr.json +++ b/homeassistant/components/directv/.translations/fr.json @@ -19,7 +19,7 @@ }, "title": "Connectez-vous au r\u00e9cepteur DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/it.json b/homeassistant/components/directv/.translations/it.json index 777b66d5c910..cafebc6426fc 100644 --- a/homeassistant/components/directv/.translations/it.json +++ b/homeassistant/components/directv/.translations/it.json @@ -23,7 +23,7 @@ }, "title": "Collegamento al ricevitore DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ko.json b/homeassistant/components/directv/.translations/ko.json index 5099b264085a..49b5bb311bb5 100644 --- a/homeassistant/components/directv/.translations/ko.json +++ b/homeassistant/components/directv/.translations/ko.json @@ -19,7 +19,7 @@ }, "title": "DirecTV \ub9ac\uc2dc\ubc84\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/lb.json b/homeassistant/components/directv/.translations/lb.json index 4e2a09c6befa..4b7bdafb9ed3 100644 --- a/homeassistant/components/directv/.translations/lb.json +++ b/homeassistant/components/directv/.translations/lb.json @@ -23,7 +23,7 @@ }, "title": "Mam DirecTV Receiver verbannen" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/no.json b/homeassistant/components/directv/.translations/no.json index be2500b38b32..62cefda80a1c 100644 --- a/homeassistant/components/directv/.translations/no.json +++ b/homeassistant/components/directv/.translations/no.json @@ -19,7 +19,7 @@ }, "title": "Koble til DirecTV-mottakeren" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/pl.json b/homeassistant/components/directv/.translations/pl.json index d9de1368ec51..a12229a12dbc 100644 --- a/homeassistant/components/directv/.translations/pl.json +++ b/homeassistant/components/directv/.translations/pl.json @@ -25,7 +25,7 @@ }, "title": "Po\u0142\u0105czenie z odbiornikiem DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ru.json b/homeassistant/components/directv/.translations/ru.json index 08e18b89bf13..e83fb1547ecd 100644 --- a/homeassistant/components/directv/.translations/ru.json +++ b/homeassistant/components/directv/.translations/ru.json @@ -19,7 +19,7 @@ }, "title": "DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/sl.json b/homeassistant/components/directv/.translations/sl.json index ab20a6ec4245..a0919a772995 100644 --- a/homeassistant/components/directv/.translations/sl.json +++ b/homeassistant/components/directv/.translations/sl.json @@ -25,7 +25,7 @@ }, "title": "Pove\u017eite se s sprejemnikom DirecTV" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/zh-Hant.json b/homeassistant/components/directv/.translations/zh-Hant.json index b7a1bb41f53d..98fb3f6519fb 100644 --- a/homeassistant/components/directv/.translations/zh-Hant.json +++ b/homeassistant/components/directv/.translations/zh-Hant.json @@ -19,7 +19,7 @@ }, "title": "\u9023\u7dda\u81f3 DirecTV \u63a5\u6536\u5668" } - }, - "title": "DirecTV" - } + } + }, + "title": "DirecTV" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ca.json b/homeassistant/components/doorbird/.translations/ca.json index d26da82ad1e9..dce019b8e334 100644 --- a/homeassistant/components/doorbird/.translations/ca.json +++ b/homeassistant/components/doorbird/.translations/ca.json @@ -21,8 +21,7 @@ }, "title": "Connexi\u00f3 amb DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Afegeix el/s noms del/s esdeveniment/s que vulguis seguir separats per comes. Despr\u00e9s d\u2019introduir-los, utilitzeu l\u2019aplicaci\u00f3 de DoorBird per assignar-los a un esdeveniment espec\u00edfic. Consulta la documentaci\u00f3 a https://www.home-assistant.io/integrations/doorbird/#events.\nExemple: algu_ha_premut_el_boto, moviment_detectat" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/de.json b/homeassistant/components/doorbird/.translations/de.json index 2992d066d4a0..fc31a6e1af27 100644 --- a/homeassistant/components/doorbird/.translations/de.json +++ b/homeassistant/components/doorbird/.translations/de.json @@ -21,8 +21,7 @@ }, "title": "Stellen Sie eine Verbindung zu DoorBird her" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "F\u00fcgen Sie f\u00fcr jedes Ereignis, das Sie verfolgen m\u00f6chten, einen durch Kommas getrennten Ereignisnamen hinzu. Nachdem Sie sie hier eingegeben haben, verwenden Sie die DoorBird-App, um sie einem bestimmten Ereignis zuzuweisen. Weitere Informationen finden Sie in der Dokumentation unter https://www.home-assistant.io/integrations/doorbird/#events. Beispiel: jemand_hat_den_knopf_gedr\u00fcckt, bewegung" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/en.json b/homeassistant/components/doorbird/.translations/en.json index 87524cd7dd6b..8776359503fd 100644 --- a/homeassistant/components/doorbird/.translations/en.json +++ b/homeassistant/components/doorbird/.translations/en.json @@ -21,8 +21,7 @@ }, "title": "Connect to the DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Add an comma separated event name for each event you wish to track. After entering them here, use the DoorBird app to assign them to a specific event. See the documentation at https://www.home-assistant.io/integrations/doorbird/#events. Example: somebody_pressed_the_button, motion" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/es.json b/homeassistant/components/doorbird/.translations/es.json index 120daaa8a58d..d87d5004a857 100644 --- a/homeassistant/components/doorbird/.translations/es.json +++ b/homeassistant/components/doorbird/.translations/es.json @@ -21,8 +21,7 @@ }, "title": "Conectar con DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "A\u00f1ade un nombre de evento separado por comas para cada evento del que deseas realizar un seguimiento. Despu\u00e9s de introducirlos aqu\u00ed, utiliza la aplicaci\u00f3n DoorBird para asignarlos a un evento espec\u00edfico. Consulta la documentaci\u00f3n en https://www.home-assistant.io/integrations/doorbird/#events. Ejemplo: somebody_pressed_the_button, motion" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/fr.json b/homeassistant/components/doorbird/.translations/fr.json index 21f67a9471eb..be74bc781d00 100644 --- a/homeassistant/components/doorbird/.translations/fr.json +++ b/homeassistant/components/doorbird/.translations/fr.json @@ -18,8 +18,7 @@ }, "title": "Connectez-vous au DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/it.json b/homeassistant/components/doorbird/.translations/it.json index 6d1a80424bfe..25a2257dc894 100644 --- a/homeassistant/components/doorbird/.translations/it.json +++ b/homeassistant/components/doorbird/.translations/it.json @@ -18,8 +18,7 @@ }, "title": "Connetti a DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -30,5 +29,6 @@ "description": "Aggiungere un nome di evento separato da virgola per ogni evento che si desidera monitorare. Dopo averli inseriti qui, usa l'applicazione DoorBird per assegnarli a un evento specifico. Consultare la documentazione su https://www.home-assistant.io/integrations/doorbird/#events. Esempio: qualcuno_premuto_il_pulsante, movimento" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ko.json b/homeassistant/components/doorbird/.translations/ko.json index fff92c32188f..d721ba4671a3 100644 --- a/homeassistant/components/doorbird/.translations/ko.json +++ b/homeassistant/components/doorbird/.translations/ko.json @@ -21,8 +21,7 @@ }, "title": "DoorBird \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\ucd94\uc801\ud558\ub824\ub294 \uac01 \uc774\ubca4\ud2b8\uc5d0 \ub300\ud574 \uc27c\ud45c\ub85c \uad6c\ubd84\ub41c \uc774\ubca4\ud2b8 \uc774\ub984\uc744 \ucd94\uac00\ud574\uc8fc\uc138\uc694. \uc5ec\uae30\uc5d0 \uc785\ub825\ud55c \ud6c4 DoorBird \uc571\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b9\uc815 \uc774\ubca4\ud2b8\uc5d0 \ud560\ub2f9\ud574\uc8fc\uc138\uc694. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 https://www.home-assistant.io/integrations/doorbird/#event \uc124\uba85\uc11c\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694. \uc608: someone_pressed_the_button, motion" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/lb.json b/homeassistant/components/doorbird/.translations/lb.json index bbe77a36aff1..1c2d53870f7d 100644 --- a/homeassistant/components/doorbird/.translations/lb.json +++ b/homeassistant/components/doorbird/.translations/lb.json @@ -21,8 +21,7 @@ }, "title": "Mat DoorBird verbannen" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Setzt ee mat Komma getrennten Evenement Numm fir all Evenement dob\u00e4i d\u00e9i sollt suiv\u00e9iert ginn. Wann's du se hei aginn hues, benotz d'DoorBird App fir se zu engem spezifeschen Evenement dob\u00e4i ze setzen. Kuckt d'Dokumentatioun op https://www.home-assistant.io/integrations/doorbird/#events. Beispill: somebody_pressed_the_button, motion" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/no.json b/homeassistant/components/doorbird/.translations/no.json index 29fb34672c86..04462798fc72 100644 --- a/homeassistant/components/doorbird/.translations/no.json +++ b/homeassistant/components/doorbird/.translations/no.json @@ -20,8 +20,7 @@ }, "title": "Koble til DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -32,5 +31,6 @@ "description": "Legg til et kommaseparert hendelsesnavn for hvert arrangement du \u00f8nsker \u00e5 spore. Etter \u00e5 ha skrevet dem inn her, bruker du DoorBird-appen til \u00e5 tilordne dem til en bestemt hendelse. Se dokumentasjonen p\u00e5 https://www.home-assistant.io/integrations/doorbird/#events. Eksempel: noen_trykket_knappen, bevegelse" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ru.json b/homeassistant/components/doorbird/.translations/ru.json index 589de2b6838d..8baf1e12ccb0 100644 --- a/homeassistant/components/doorbird/.translations/ru.json +++ b/homeassistant/components/doorbird/.translations/ru.json @@ -21,8 +21,7 @@ }, "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 DoorBird, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e. \u041f\u0440\u0438\u043c\u0435\u0440: somebody_pressed_the_button, motion. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438: https://www.home-assistant.io/integrations/doorbird/#events." } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/zh-Hant.json b/homeassistant/components/doorbird/.translations/zh-Hant.json index bb8b291f86bd..d751f51edc39 100644 --- a/homeassistant/components/doorbird/.translations/zh-Hant.json +++ b/homeassistant/components/doorbird/.translations/zh-Hant.json @@ -21,8 +21,7 @@ }, "title": "\u9023\u7dda\u81f3 DoorBird" } - }, - "title": "DoorBird" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u4ee5\u9017\u865f\u5206\u5225\u6240\u8981\u8ffd\u8e64\u7684\u4e8b\u4ef6\u540d\u7a31\u3002\u65bc\u6b64\u8f38\u5165\u5f8c\uff0c\u4f7f\u7528 DoorBird App \u6307\u5b9a\u81f3\u7279\u5b9a\u4e8b\u4ef6\u3002\u8acb\u53c3\u95b1\u6587\u4ef6\uff1ahttps://www.home-assistant.io/integrations/doorbird/#events\u3002\u4f8b\u5982\uff1asomebody_pressed_the_button, motion" } } - } + }, + "title": "DoorBird" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/bg.json b/homeassistant/components/ecobee/.translations/bg.json index bd8503fabd8b..6fb6ef757bea 100644 --- a/homeassistant/components/ecobee/.translations/bg.json +++ b/homeassistant/components/ecobee/.translations/bg.json @@ -19,7 +19,7 @@ "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 API \u043a\u043b\u044e\u0447\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043e\u0442 ecobee.com.", "title": "ecobee API \u043a\u043b\u044e\u0447" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ca.json b/homeassistant/components/ecobee/.translations/ca.json index 2c4d16b5787c..db6c064331c3 100644 --- a/homeassistant/components/ecobee/.translations/ca.json +++ b/homeassistant/components/ecobee/.translations/ca.json @@ -19,7 +19,7 @@ "description": "Introdueix la clau API obteinguda a trav\u00e9s del lloc web ecobee.com.", "title": "Clau API d'ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/da.json b/homeassistant/components/ecobee/.translations/da.json index 614811db45ae..c7db0e1cc0a7 100644 --- a/homeassistant/components/ecobee/.translations/da.json +++ b/homeassistant/components/ecobee/.translations/da.json @@ -19,7 +19,7 @@ "description": "Indtast API-n\u00f8glen, du har f\u00e5et fra ecobee.com.", "title": "ecobee API-n\u00f8gle" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/de.json b/homeassistant/components/ecobee/.translations/de.json index 818783813fec..f9567c9a7892 100644 --- a/homeassistant/components/ecobee/.translations/de.json +++ b/homeassistant/components/ecobee/.translations/de.json @@ -19,7 +19,7 @@ "description": "Bitte gib den von ecobee.com erhaltenen API-Schl\u00fcssel ein.", "title": "ecobee API-Schl\u00fcssel" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/en.json b/homeassistant/components/ecobee/.translations/en.json index 39072f70d820..58c9624857c6 100644 --- a/homeassistant/components/ecobee/.translations/en.json +++ b/homeassistant/components/ecobee/.translations/en.json @@ -19,7 +19,7 @@ "description": "Please enter the API key obtained from ecobee.com.", "title": "ecobee API key" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/es.json b/homeassistant/components/ecobee/.translations/es.json index 5544d2e7f7bf..988d789d3d4d 100644 --- a/homeassistant/components/ecobee/.translations/es.json +++ b/homeassistant/components/ecobee/.translations/es.json @@ -19,7 +19,7 @@ "description": "Introduzca la clave de API obtenida de ecobee.com.", "title": "Clave API de ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/fr.json b/homeassistant/components/ecobee/.translations/fr.json index 7f308fdf3a3e..6e783913f67f 100644 --- a/homeassistant/components/ecobee/.translations/fr.json +++ b/homeassistant/components/ecobee/.translations/fr.json @@ -19,7 +19,7 @@ "description": "Veuillez entrer la cl\u00e9 API obtenue aupr\u00e8s d'ecobee.com.", "title": "Cl\u00e9 API ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/hu.json b/homeassistant/components/ecobee/.translations/hu.json index 0950d52bd0e8..c37646fa6e84 100644 --- a/homeassistant/components/ecobee/.translations/hu.json +++ b/homeassistant/components/ecobee/.translations/hu.json @@ -19,7 +19,7 @@ "description": "Adja meg az ecobee.com webhelyr\u0151l beszerzett API-kulcsot.", "title": "ecobee API kulcs" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/it.json b/homeassistant/components/ecobee/.translations/it.json index 2ecb587f19e1..10591facd04b 100644 --- a/homeassistant/components/ecobee/.translations/it.json +++ b/homeassistant/components/ecobee/.translations/it.json @@ -19,7 +19,7 @@ "description": "Inserisci la chiave API ottenuta da ecobee.com.", "title": "chiave API ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ko.json b/homeassistant/components/ecobee/.translations/ko.json index 2fea66a9d385..c946ef74a90b 100644 --- a/homeassistant/components/ecobee/.translations/ko.json +++ b/homeassistant/components/ecobee/.translations/ko.json @@ -19,7 +19,7 @@ "description": "ecobee.com \uc5d0\uc11c \uc5bb\uc740 API \ud0a4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "ecobee API \ud0a4" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/lb.json b/homeassistant/components/ecobee/.translations/lb.json index ee1fd5246c07..ab9bb411b5e4 100644 --- a/homeassistant/components/ecobee/.translations/lb.json +++ b/homeassistant/components/ecobee/.translations/lb.json @@ -19,7 +19,7 @@ "description": "Gitt den API Schl\u00ebssel vun ecobee.com an:", "title": "ecobee API Schl\u00ebssel" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/nl.json b/homeassistant/components/ecobee/.translations/nl.json index 56bb3ace26f5..94c9e1f35b0b 100644 --- a/homeassistant/components/ecobee/.translations/nl.json +++ b/homeassistant/components/ecobee/.translations/nl.json @@ -19,7 +19,7 @@ "description": "Voer de API-sleutel in die u van ecobee.com hebt gekregen.", "title": "ecobee API-sleutel" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/nn.json b/homeassistant/components/ecobee/.translations/nn.json index 301239cf31a6..b23da4e97d16 100644 --- a/homeassistant/components/ecobee/.translations/nn.json +++ b/homeassistant/components/ecobee/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "ecobee" - } + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/no.json b/homeassistant/components/ecobee/.translations/no.json index 6658c3ac2e9a..b925aeaf26a7 100644 --- a/homeassistant/components/ecobee/.translations/no.json +++ b/homeassistant/components/ecobee/.translations/no.json @@ -19,7 +19,7 @@ "description": "Vennligst skriv inn API-n\u00f8kkel som er innhentet fra ecobee.com.", "title": "ecobee API-n\u00f8kkel" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/pl.json b/homeassistant/components/ecobee/.translations/pl.json index bd4e7aa1ddc1..48d36c53fd84 100644 --- a/homeassistant/components/ecobee/.translations/pl.json +++ b/homeassistant/components/ecobee/.translations/pl.json @@ -9,7 +9,7 @@ }, "step": { "authorize": { - "description": "Autoryzuj t\u0119 aplikacj\u0119 na https://www.ecobee.com/consumerportal/index.html za pomoc\u0105 kodu PIN: \n\n {pin} \n \n Nast\u0119pnie naci\u015bnij przycisk Prze\u015blij.", + "description": "Autoryzuj t\u0119 aplikacj\u0119 na https://www.ecobee.com/consumerportal/index.html za pomoc\u0105 kodu PIN: \n\n {pin} \n \n Nast\u0119pnie naci\u015bnij przycisk \"Zatwierd\u017a\".", "title": "Autoryzuj aplikacj\u0119 na ecobee.com" }, "user": { @@ -19,7 +19,7 @@ "description": "Prosz\u0119 wprowadzi\u0107 klucz API uzyskany na ecobee.com.", "title": "Klucz API" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/pt-BR.json b/homeassistant/components/ecobee/.translations/pt-BR.json index 65394faba177..34650c72e1a0 100644 --- a/homeassistant/components/ecobee/.translations/pt-BR.json +++ b/homeassistant/components/ecobee/.translations/pt-BR.json @@ -18,7 +18,7 @@ "description": "Por favor, insira a chave de API obtida em ecobee.com.", "title": "chave da API ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ru.json b/homeassistant/components/ecobee/.translations/ru.json index 660e0064bb6a..fe382a390599 100644 --- a/homeassistant/components/ecobee/.translations/ru.json +++ b/homeassistant/components/ecobee/.translations/ru.json @@ -19,7 +19,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 API, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 ecobee.com.", "title": "ecobee" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/sl.json b/homeassistant/components/ecobee/.translations/sl.json index d70be59afb5d..b674dc122603 100644 --- a/homeassistant/components/ecobee/.translations/sl.json +++ b/homeassistant/components/ecobee/.translations/sl.json @@ -19,7 +19,7 @@ "description": "Prosimo vnesite API klju\u010d, pridobljen iz ecobee.com.", "title": "ecobee API klju\u010d" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/sv.json b/homeassistant/components/ecobee/.translations/sv.json index da62172dc10f..2004d82aebad 100644 --- a/homeassistant/components/ecobee/.translations/sv.json +++ b/homeassistant/components/ecobee/.translations/sv.json @@ -19,7 +19,7 @@ "description": "V\u00e4nligen ange API-nyckeln som erh\u00e5llits fr\u00e5n ecobee.com.", "title": "ecobee API-nyckel" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/zh-Hant.json b/homeassistant/components/ecobee/.translations/zh-Hant.json index e1eb6ebd3570..983ae0351efa 100644 --- a/homeassistant/components/ecobee/.translations/zh-Hant.json +++ b/homeassistant/components/ecobee/.translations/zh-Hant.json @@ -19,7 +19,7 @@ "description": "\u8acb\u8f38\u5165\u7531 ecobee.com \u6240\u7372\u5f97\u7684 API \u5bc6\u9470\u3002", "title": "ecobee API \u5bc6\u9470" } - }, - "title": "ecobee" - } + } + }, + "title": "ecobee" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ca.json b/homeassistant/components/elgato/.translations/ca.json index 3ba9029eb003..13bd7eb03fe6 100644 --- a/homeassistant/components/elgato/.translations/ca.json +++ b/homeassistant/components/elgato/.translations/ca.json @@ -21,7 +21,7 @@ "description": "Vols afegir l'Elgato Key Light amb n\u00famero de s\u00e8rie `{serial_number}` a Home Assistant?", "title": "S'ha descobert un dispositiu Elgato Key Light" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/da.json b/homeassistant/components/elgato/.translations/da.json index a10e4d9e89f4..afcb56068d9c 100644 --- a/homeassistant/components/elgato/.translations/da.json +++ b/homeassistant/components/elgato/.translations/da.json @@ -21,7 +21,7 @@ "description": "Vil du tilf\u00f8je Elgato Key Light med serienummer `{serial_number}` til Home Assistant?", "title": "Fandt Elgato Key Light-enhed" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/de.json b/homeassistant/components/elgato/.translations/de.json index f5bca5e8416c..e56b1e0bade1 100644 --- a/homeassistant/components/elgato/.translations/de.json +++ b/homeassistant/components/elgato/.translations/de.json @@ -21,7 +21,7 @@ "description": "M\u00f6chtest du das Elgato Key Light mit der Seriennummer \"{serial_number} \" zu Home Assistant hinzuf\u00fcgen?", "title": "Elgato Key Light Ger\u00e4t entdeckt" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/en.json b/homeassistant/components/elgato/.translations/en.json index d52003d10e16..7815379f662d 100644 --- a/homeassistant/components/elgato/.translations/en.json +++ b/homeassistant/components/elgato/.translations/en.json @@ -21,7 +21,7 @@ "description": "Do you want to add the Elgato Key Light with serial number `{serial_number}` to Home Assistant?", "title": "Discovered Elgato Key Light device" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/es-419.json b/homeassistant/components/elgato/.translations/es-419.json index 2653060030a3..2e882321f34d 100644 --- a/homeassistant/components/elgato/.translations/es-419.json +++ b/homeassistant/components/elgato/.translations/es-419.json @@ -11,7 +11,7 @@ "zeroconf_confirm": { "title": "Dispositivo Elgato Key Light descubierto" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/es.json b/homeassistant/components/elgato/.translations/es.json index 2e689b5e064a..c18424d54213 100644 --- a/homeassistant/components/elgato/.translations/es.json +++ b/homeassistant/components/elgato/.translations/es.json @@ -21,7 +21,7 @@ "description": "\u00bfDesea agregar Elgato Key Light con el n\u00famero de serie `{serial_number}` a Home Assistant?", "title": "Descubierto dispositivo Elgato Key Light" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/fr.json b/homeassistant/components/elgato/.translations/fr.json index e8465a56728d..2c121e622de2 100644 --- a/homeassistant/components/elgato/.translations/fr.json +++ b/homeassistant/components/elgato/.translations/fr.json @@ -21,7 +21,7 @@ "description": "Voulez-vous ajouter l'Elgato Key Light avec le num\u00e9ro de s\u00e9rie `{serial_number}` \u00e0 Home Assistant?", "title": "Appareil Elgato Key Light d\u00e9couvert" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/it.json b/homeassistant/components/elgato/.translations/it.json index 81e363aa01b0..4179fa962f04 100644 --- a/homeassistant/components/elgato/.translations/it.json +++ b/homeassistant/components/elgato/.translations/it.json @@ -21,7 +21,7 @@ "description": "Vuoi aggiungere il dispositivo Elgato Key Light con il numero di serie {serial_number} a Home Assistant?", "title": "Dispositivo Elgato Key Light rilevato" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ko.json b/homeassistant/components/elgato/.translations/ko.json index 9d7ab4ef2b0e..62eb49896a93 100644 --- a/homeassistant/components/elgato/.translations/ko.json +++ b/homeassistant/components/elgato/.translations/ko.json @@ -21,7 +21,7 @@ "description": "Elgato Key Light \uc2dc\ub9ac\uc5bc \ubc88\ud638 `{serial_number}` \uc744(\ub97c) Home Assistant \uc5d0 \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "\ubc1c\uacac\ub41c Elgato Key Light \uae30\uae30" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/lb.json b/homeassistant/components/elgato/.translations/lb.json index e46fc4364d23..8d01a111a6dc 100644 --- a/homeassistant/components/elgato/.translations/lb.json +++ b/homeassistant/components/elgato/.translations/lb.json @@ -21,7 +21,7 @@ "description": "W\u00ebllt dir den Elgato Key Light mat der Seriennummer `{serial_number}` am Home Assistant dob\u00e4isetzen?", "title": "Entdeckten Elgato Key Light Apparat" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/nl.json b/homeassistant/components/elgato/.translations/nl.json index ca05983eeb57..0bf3a87222ad 100644 --- a/homeassistant/components/elgato/.translations/nl.json +++ b/homeassistant/components/elgato/.translations/nl.json @@ -21,7 +21,7 @@ "description": "Wilt u de Elgato Key Light met serienummer ` {serial_number} ` toevoegen aan Home Assistant?", "title": "Elgato Key Light apparaat ontdekt" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/no.json b/homeassistant/components/elgato/.translations/no.json index 8642ae750257..a23c9a442f79 100644 --- a/homeassistant/components/elgato/.translations/no.json +++ b/homeassistant/components/elgato/.translations/no.json @@ -21,7 +21,7 @@ "description": "Vil du legge Elgato Key Light med serienummer ` {serial_number} til Home Assistant?", "title": "Oppdaget Elgato Key Light-enheten" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/pl.json b/homeassistant/components/elgato/.translations/pl.json index 97e10b451f04..e35b89348ead 100644 --- a/homeassistant/components/elgato/.translations/pl.json +++ b/homeassistant/components/elgato/.translations/pl.json @@ -21,7 +21,7 @@ "description": "Czy chcesz doda\u0107 urz\u0105dzenie Elgato Key Light o numerze seryjnym `{serial_number}` do Home Assistant'a?", "title": "Wykryto urz\u0105dzenie Elgato Key Light" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/pt-BR.json b/homeassistant/components/elgato/.translations/pt-BR.json index d809647c99f9..c8b723b7379b 100644 --- a/homeassistant/components/elgato/.translations/pt-BR.json +++ b/homeassistant/components/elgato/.translations/pt-BR.json @@ -5,7 +5,7 @@ "description": "Deseja adicionar o Elgato Key Light n\u00famero de s\u00e9rie ` {serial_number} ` ao Home Assistant?", "title": "Dispositivo Elgato Key Light descoberto" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ru.json b/homeassistant/components/elgato/.translations/ru.json index 1663ea4d23aa..768ef1318470 100644 --- a/homeassistant/components/elgato/.translations/ru.json +++ b/homeassistant/components/elgato/.translations/ru.json @@ -21,7 +21,7 @@ "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 Elgato Key Light \u0441 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c `{serial_number}`?", "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Elgato Key Light" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/sl.json b/homeassistant/components/elgato/.translations/sl.json index f05b0bcbd8ff..7b637ee370f1 100644 --- a/homeassistant/components/elgato/.translations/sl.json +++ b/homeassistant/components/elgato/.translations/sl.json @@ -21,7 +21,7 @@ "description": "Ali \u017eelite dodati Elgato Key Light s serijsko \u0161tevilko ' {serial_number} ' v Home Assistant-a?", "title": "Odkrita naprava Elgato Key Light" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/sv.json b/homeassistant/components/elgato/.translations/sv.json index 83850c186c73..575ab28df49e 100644 --- a/homeassistant/components/elgato/.translations/sv.json +++ b/homeassistant/components/elgato/.translations/sv.json @@ -21,7 +21,7 @@ "description": "Vill du l\u00e4gga till Elgato Key Light med serienummer `{serial_number}` till Home Assistant?", "title": "Uppt\u00e4ckte Elgato Key Light-enhet" } - }, - "title": "Elgato Key Light" - } + } + }, + "title": "Elgato Key Light" } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/zh-Hant.json b/homeassistant/components/elgato/.translations/zh-Hant.json index c0c638851a10..597381bcd69c 100644 --- a/homeassistant/components/elgato/.translations/zh-Hant.json +++ b/homeassistant/components/elgato/.translations/zh-Hant.json @@ -21,7 +21,7 @@ "description": "\u662f\u5426\u8981\u5c07 Elgato Key \u7167\u660e\u5e8f\u865f `{serial_number}` \u65b0\u589e\u81f3 Home Assistant\uff1f", "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Elgato Key \u7167\u660e\u8a2d\u5099" } - }, - "title": "Elgato Key \u7167\u660e" - } + } + }, + "title": "Elgato Key \u7167\u660e" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ca.json b/homeassistant/components/elkm1/.translations/ca.json index a426b7a34336..6952472fe997 100644 --- a/homeassistant/components/elkm1/.translations/ca.json +++ b/homeassistant/components/elkm1/.translations/ca.json @@ -22,7 +22,7 @@ "description": "La cadena de car\u00e0cters (string) de l'adre\u00e7a ha de tenir el format: 'adre\u00e7a[:port]' tant per al mode 'segur' com el 'no segur'. Exemple: '192.168.1.1'. El port \u00e9s opcional, per defecte \u00e9s el 2101 pel mode 'no segur' i el 2601 pel 'segur'. Per al protocol s\u00e8rie, l'adre\u00e7a ha de tenir el format 'tty[:baud]'. Exemple: '/dev/ttyS1'. La velocitat en bauds \u00e9s opcional (115200 per defecte).", "title": "Connexi\u00f3 amb el controlador Elk-M1" } - }, - "title": "Controlador Elk-M1" - } + } + }, + "title": "Controlador Elk-M1" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/de.json b/homeassistant/components/elkm1/.translations/de.json index 40e6cff44609..7910b39368a9 100644 --- a/homeassistant/components/elkm1/.translations/de.json +++ b/homeassistant/components/elkm1/.translations/de.json @@ -22,7 +22,7 @@ "description": "Die Adresszeichenfolge muss in der Form 'adresse[:port]' f\u00fcr 'sicher' und 'nicht sicher' vorliegen. Beispiel: '192.168.1.1'. Der Port ist optional und standardm\u00e4\u00dfig 2101 f\u00fcr \"nicht sicher\" und 2601 f\u00fcr \"sicher\". F\u00fcr das serielle Protokoll muss die Adresse die Form 'tty[:baud]' haben. Beispiel: '/dev/ttyS1'. Der Baudrate ist optional und standardm\u00e4\u00dfig 115200.", "title": "Stellen Sie eine Verbindung zur Elk-M1-Steuerung her" } - }, - "title": "Elk-M1-Steuerung" - } + } + }, + "title": "Elk-M1-Steuerung" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/en.json b/homeassistant/components/elkm1/.translations/en.json index 7671e250bf30..0efc9044be30 100644 --- a/homeassistant/components/elkm1/.translations/en.json +++ b/homeassistant/components/elkm1/.translations/en.json @@ -22,7 +22,7 @@ "description": "The address string must be in the form 'address[:port]' for 'secure' and 'non-secure'. Example: '192.168.1.1'. The port is optional and defaults to 2101 for 'non-secure' and 2601 for 'secure'. For the serial protocol, the address must be in the form 'tty[:baud]'. Example: '/dev/ttyS1'. The baud is optional and defaults to 115200.", "title": "Connect to Elk-M1 Control" } - }, - "title": "Elk-M1 Control" - } + } + }, + "title": "Elk-M1 Control" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/es.json b/homeassistant/components/elkm1/.translations/es.json index 8fdce004c41a..3cf4d12adc33 100644 --- a/homeassistant/components/elkm1/.translations/es.json +++ b/homeassistant/components/elkm1/.translations/es.json @@ -22,7 +22,7 @@ "description": "La cadena de direcci\u00f3n debe estar en el formato 'direcci\u00f3n[:puerto]' para 'seguro' y 'no-seguro'. Ejemplo: '192.168.1.1'. El puerto es opcional y el valor predeterminado es 2101 para 'no-seguro' y 2601 para 'seguro'. Para el protocolo serie, la direcci\u00f3n debe tener la forma 'tty[:baudios]'. Ejemplo: '/dev/ttyS1'. Los baudios son opcionales y el valor predeterminado es 115200.", "title": "Conectar con Control Elk-M1" } - }, - "title": "Control Elk-M1" - } + } + }, + "title": "Control Elk-M1" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/fr.json b/homeassistant/components/elkm1/.translations/fr.json index 20ad7b8b0078..14a3681410dd 100644 --- a/homeassistant/components/elkm1/.translations/fr.json +++ b/homeassistant/components/elkm1/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "Se connecter a Elk-M1 Control" } - }, - "title": "Elk-M1 Control" - } + } + }, + "title": "Elk-M1 Control" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/it.json b/homeassistant/components/elkm1/.translations/it.json index c3f1941d8b5b..abb3d9845022 100644 --- a/homeassistant/components/elkm1/.translations/it.json +++ b/homeassistant/components/elkm1/.translations/it.json @@ -22,7 +22,7 @@ "description": "La stringa di indirizzi deve essere nella forma \"address[:port]\" per \"secure\" e \"non secure\". Esempio: '192.168.1.1.1'. La porta \u00e8 facoltativa e il valore predefinito \u00e8 2101 per 'non sicuro' e 2601 per 'sicuro'. Per il protocollo seriale, l'indirizzo deve essere nella forma 'tty[:baud]'. Esempio: '/dev/ttyS1'. Il baud \u00e8 opzionale e il valore predefinito \u00e8 115200.", "title": "Collegamento al controllo Elk-M1" } - }, - "title": "Controllo Elk-M1" - } + } + }, + "title": "Controllo Elk-M1" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ko.json b/homeassistant/components/elkm1/.translations/ko.json index 4ef1e528c227..30e3922f0b8f 100644 --- a/homeassistant/components/elkm1/.translations/ko.json +++ b/homeassistant/components/elkm1/.translations/ko.json @@ -22,7 +22,7 @@ "description": "\uc8fc\uc18c \ubb38\uc790\uc5f4\uc740 '\ubcf4\uc548' \ubc0f '\ube44\ubcf4\uc548' \uc758 \uacbd\uc6b0 'address[:port]' \ud615\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc608: '192.168.1.1'. \ud3ec\ud2b8\ub294 \uc120\ud0dd \uc0ac\ud56d\uc774\uba70 \uae30\ubcf8\uac12\uc740 '\ube44\ubcf4\uc548' \uc758 \uacbd\uc6b0 2101 \uc774\uace0 '\ubcf4\uc548' \uc758 \uacbd\uc6b0 2601 \uc785\ub2c8\ub2e4. \uc2dc\ub9ac\uc5bc \ud504\ub85c\ud1a0\ucf5c\uc758 \uacbd\uc6b0 \uc8fc\uc18c\ub294 'tty[:baud]' \ud615\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc608: '/dev/ttyS1'. \ud1b5\uc2e0\uc18d\ub3c4 \ubc14\uc6b0\ub4dc\ub294 \uc120\ud0dd \uc0ac\ud56d\uc774\uba70 \uae30\ubcf8\uac12\uc740 115200 \uc785\ub2c8\ub2e4.", "title": "Elk-M1 \uc81c\uc5b4\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Elk-M1 \uc81c\uc5b4" - } + } + }, + "title": "Elk-M1 \uc81c\uc5b4" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/lb.json b/homeassistant/components/elkm1/.translations/lb.json index bb56b4c8154f..78350fab91fc 100644 --- a/homeassistant/components/elkm1/.translations/lb.json +++ b/homeassistant/components/elkm1/.translations/lb.json @@ -22,7 +22,7 @@ "description": "D'Adress muss an der Form 'adress[:port]' fir 'ges\u00e9chert' an 'onges\u00e9chert' sinn. Beispill: '192.168.1.1'. De Port os optionell an ass standardm\u00e9isseg op 2101 fir 'onges\u00e9chert' an op 2601 fir 'ges\u00e9chert' d\u00e9fin\u00e9iert. Fir de serielle Protokoll, muss d'Adress an der Form 'tty[:baud]' sinn. Beispill: '/dev/ttyS1'. Baud Rate ass optionell an ass standardmlisseg op 115200 d\u00e9fin\u00e9iert.", "title": "Mat Elk-M1 Control verbannen" } - }, - "title": "Elk-M1 Control" - } + } + }, + "title": "Elk-M1 Control" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/no.json b/homeassistant/components/elkm1/.translations/no.json index 86a4e67801b1..7da8538134e6 100644 --- a/homeassistant/components/elkm1/.translations/no.json +++ b/homeassistant/components/elkm1/.translations/no.json @@ -22,7 +22,7 @@ "description": "Adressestrengen m\u00e5 v\u00e6re i formen 'adresse [: port]' for 'sikker' og 'ikke-sikker'. Eksempel: '192.168.1.1'. Porten er valgfri og er standard til 2101 for 'ikke-sikker' og 2601 for 'sikker'. For den serielle protokollen m\u00e5 adressen v\u00e6re i formen 'tty [: baud]'. Eksempel: '/ dev / ttyS1'. Baud er valgfri og er standard til 115200.", "title": "Koble til Elk-M1-kontroll" } - }, - "title": "Elk-M1 kontroll" - } + } + }, + "title": "Elk-M1 kontroll" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ru.json b/homeassistant/components/elkm1/.translations/ru.json index d33fb66f122f..eb0248625b11 100644 --- a/homeassistant/components/elkm1/.translations/ru.json +++ b/homeassistant/components/elkm1/.translations/ru.json @@ -22,7 +22,7 @@ "description": "\u0421\u0442\u0440\u043e\u043a\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'addres[:port]' (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: '192.168.1.1'). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 'port' \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 2101 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'non-secure' \u0438 2601 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'secure'. \u0414\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 'serial' \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'tty[:baud]' (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: '/dev/ttyS1'). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 'baud' \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u0435\u043d 115200.", "title": "Elk-M1 Control" } - }, - "title": "Elk-M1 Control" - } + } + }, + "title": "Elk-M1 Control" } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/zh-Hant.json b/homeassistant/components/elkm1/.translations/zh-Hant.json index d40d927ae8fb..7df7404d73be 100644 --- a/homeassistant/components/elkm1/.translations/zh-Hant.json +++ b/homeassistant/components/elkm1/.translations/zh-Hant.json @@ -22,7 +22,7 @@ "description": "\u52a0\u5bc6\u8207\u975e\u52a0\u5bc6\u4e4b\u4f4d\u5740\u5b57\u4e32\u683c\u5f0f\u5fc5\u9808\u70ba 'address[:port]'\u3002\u4f8b\u5982\uff1a'192.168.1.1'\u3002\u901a\u8a0a\u57e0\u70ba\u9078\u9805\u8f38\u5165\uff0c\u975e\u52a0\u5bc6\u9810\u8a2d\u503c\u70ba 2101\u3001\u52a0\u5bc6\u5247\u70ba 2601\u3002\u5e8f\u5217\u901a\u8a0a\u5354\u5b9a\u3001\u4f4d\u5740\u683c\u5f0f\u5fc5\u9808\u70ba 'tty[:baud]'\u3002\u4f8b\u5982\uff1a'/dev/ttyS1'\u3002\u50b3\u8f38\u7387\u70ba\u9078\u9805\u8f38\u5165\uff0c\u9810\u8a2d\u503c\u70ba 115200\u3002", "title": "\u9023\u7dda\u81f3 Elk-M1 Control" } - }, - "title": "Elk-M1 Control" - } + } + }, + "title": "Elk-M1 Control" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/bg.json b/homeassistant/components/emulated_roku/.translations/bg.json index ddb3c3a36a9f..6c1725a16b18 100644 --- a/homeassistant/components/emulated_roku/.translations/bg.json +++ b/homeassistant/components/emulated_roku/.translations/bg.json @@ -15,7 +15,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/ca.json b/homeassistant/components/emulated_roku/.translations/ca.json index bdd38b8538c5..cccea2cb77b5 100644 --- a/homeassistant/components/emulated_roku/.translations/ca.json +++ b/homeassistant/components/emulated_roku/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Configuraci\u00f3 del servidor" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/da.json b/homeassistant/components/emulated_roku/.translations/da.json index 0da64fac623a..fbaf0d676c18 100644 --- a/homeassistant/components/emulated_roku/.translations/da.json +++ b/homeassistant/components/emulated_roku/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Angiv server-konfiguration" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/de.json b/homeassistant/components/emulated_roku/.translations/de.json index f9c8a21240a5..8192bf9267f1 100644 --- a/homeassistant/components/emulated_roku/.translations/de.json +++ b/homeassistant/components/emulated_roku/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Serverkonfiguration definieren" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/en.json b/homeassistant/components/emulated_roku/.translations/en.json index 376252966a37..b2d8f845cee7 100644 --- a/homeassistant/components/emulated_roku/.translations/en.json +++ b/homeassistant/components/emulated_roku/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Define server configuration" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/es-419.json b/homeassistant/components/emulated_roku/.translations/es-419.json index 51c18c764db4..85d75c81ff36 100644 --- a/homeassistant/components/emulated_roku/.translations/es-419.json +++ b/homeassistant/components/emulated_roku/.translations/es-419.json @@ -11,7 +11,7 @@ }, "title": "Definir la configuraci\u00f3n del servidor." } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/es.json b/homeassistant/components/emulated_roku/.translations/es.json index f727c8bf522f..8cba52b95914 100644 --- a/homeassistant/components/emulated_roku/.translations/es.json +++ b/homeassistant/components/emulated_roku/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Definir la configuraci\u00f3n del servidor" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/et.json b/homeassistant/components/emulated_roku/.translations/et.json index e284f6c37321..b94548b44af4 100644 --- a/homeassistant/components/emulated_roku/.translations/et.json +++ b/homeassistant/components/emulated_roku/.translations/et.json @@ -7,7 +7,7 @@ "name": "Nimi" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/fr.json b/homeassistant/components/emulated_roku/.translations/fr.json index 629e006564be..dd115897e4ab 100644 --- a/homeassistant/components/emulated_roku/.translations/fr.json +++ b/homeassistant/components/emulated_roku/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9finir la configuration du serveur" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/hu.json b/homeassistant/components/emulated_roku/.translations/hu.json index 9b6f77062537..ce182a3f00d3 100644 --- a/homeassistant/components/emulated_roku/.translations/hu.json +++ b/homeassistant/components/emulated_roku/.translations/hu.json @@ -12,7 +12,7 @@ }, "title": "A kiszolg\u00e1l\u00f3 szerver konfigur\u00e1l\u00e1sa" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/it.json b/homeassistant/components/emulated_roku/.translations/it.json index 8f39309264a6..638c1615a168 100644 --- a/homeassistant/components/emulated_roku/.translations/it.json +++ b/homeassistant/components/emulated_roku/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Definisci la configurazione del server" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/ko.json b/homeassistant/components/emulated_roku/.translations/ko.json index ddee892039f4..3e1062e42010 100644 --- a/homeassistant/components/emulated_roku/.translations/ko.json +++ b/homeassistant/components/emulated_roku/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "\uc11c\ubc84 \uad6c\uc131 \uc815\uc758" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/lb.json b/homeassistant/components/emulated_roku/.translations/lb.json index 11d1aa3ff7a7..e797c38781e2 100644 --- a/homeassistant/components/emulated_roku/.translations/lb.json +++ b/homeassistant/components/emulated_roku/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "Server Konfiguratioun d\u00e9fin\u00e9ieren" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/nl.json b/homeassistant/components/emulated_roku/.translations/nl.json index fe26cda31e26..16c6ad1e512a 100644 --- a/homeassistant/components/emulated_roku/.translations/nl.json +++ b/homeassistant/components/emulated_roku/.translations/nl.json @@ -15,7 +15,7 @@ }, "title": "Serverconfiguratie defini\u00ebren" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/nn.json b/homeassistant/components/emulated_roku/.translations/nn.json index fc349a0d9de9..ccc9f5ac21e0 100644 --- a/homeassistant/components/emulated_roku/.translations/nn.json +++ b/homeassistant/components/emulated_roku/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "EmulatedRoku" - } + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/no.json b/homeassistant/components/emulated_roku/.translations/no.json index a0b8efcacd6e..ba4f87415a6f 100644 --- a/homeassistant/components/emulated_roku/.translations/no.json +++ b/homeassistant/components/emulated_roku/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Definer serverkonfigurasjon" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/pl.json b/homeassistant/components/emulated_roku/.translations/pl.json index 0dd32f66c9fc..fcc37de1d2cc 100644 --- a/homeassistant/components/emulated_roku/.translations/pl.json +++ b/homeassistant/components/emulated_roku/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Zdefiniuj konfiguracj\u0119 serwera" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/pt-BR.json b/homeassistant/components/emulated_roku/.translations/pt-BR.json index 0f82f93b3836..b4111a184e9d 100644 --- a/homeassistant/components/emulated_roku/.translations/pt-BR.json +++ b/homeassistant/components/emulated_roku/.translations/pt-BR.json @@ -15,7 +15,7 @@ }, "title": "Definir configura\u00e7\u00e3o do servidor" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/pt.json b/homeassistant/components/emulated_roku/.translations/pt.json index 138e077d4a46..80a08aa09b85 100644 --- a/homeassistant/components/emulated_roku/.translations/pt.json +++ b/homeassistant/components/emulated_roku/.translations/pt.json @@ -15,7 +15,7 @@ }, "title": "Definir configura\u00e7\u00e3o do servidor" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/ru.json b/homeassistant/components/emulated_roku/.translations/ru.json index 32bf473ac385..3ff4a0c13513 100644 --- a/homeassistant/components/emulated_roku/.translations/ru.json +++ b/homeassistant/components/emulated_roku/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "EmulatedRoku" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/sl.json b/homeassistant/components/emulated_roku/.translations/sl.json index 768feb83747e..467d1139ea3f 100644 --- a/homeassistant/components/emulated_roku/.translations/sl.json +++ b/homeassistant/components/emulated_roku/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Dolo\u010dite konfiguracijo stre\u017enika" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/sv.json b/homeassistant/components/emulated_roku/.translations/sv.json index 4ae7a356c4c0..ec12f514293f 100644 --- a/homeassistant/components/emulated_roku/.translations/sv.json +++ b/homeassistant/components/emulated_roku/.translations/sv.json @@ -15,7 +15,7 @@ }, "title": "Definiera serverkonfiguration" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/zh-Hans.json b/homeassistant/components/emulated_roku/.translations/zh-Hans.json index 88d8a822696f..cf413a3ef1fd 100644 --- a/homeassistant/components/emulated_roku/.translations/zh-Hans.json +++ b/homeassistant/components/emulated_roku/.translations/zh-Hans.json @@ -15,7 +15,7 @@ }, "title": "\u5b9a\u4e49\u670d\u52a1\u5668\u914d\u7f6e" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/zh-Hant.json b/homeassistant/components/emulated_roku/.translations/zh-Hant.json index 40b4307ae02d..0cb50c4e4473 100644 --- a/homeassistant/components/emulated_roku/.translations/zh-Hant.json +++ b/homeassistant/components/emulated_roku/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u5b9a\u7fa9\u4f3a\u670d\u5668\u8a2d\u5b9a" } - }, - "title": "EmulatedRoku" - } + } + }, + "title": "EmulatedRoku" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/bg.json b/homeassistant/components/esphome/.translations/bg.json index 44a183968739..85b59110a901 100644 --- a/homeassistant/components/esphome/.translations/bg.json +++ b/homeassistant/components/esphome/.translations/bg.json @@ -29,7 +29,7 @@ "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430 \u0441 [ESPHome](https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ca.json b/homeassistant/components/esphome/.translations/ca.json index 2e6f8dc62ad9..edc8fcd19a30 100644 --- a/homeassistant/components/esphome/.translations/ca.json +++ b/homeassistant/components/esphome/.translations/ca.json @@ -29,7 +29,7 @@ "description": "Introdueix la informaci\u00f3 de connexi\u00f3 del teu node [ESPHome](https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/da.json b/homeassistant/components/esphome/.translations/da.json index db4b4362a5e0..62475b88a6c9 100644 --- a/homeassistant/components/esphome/.translations/da.json +++ b/homeassistant/components/esphome/.translations/da.json @@ -29,7 +29,7 @@ "description": "Angiv forbindelsesindstillinger for din [ESPHome](https://esphomelib.com/) node.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/de.json b/homeassistant/components/esphome/.translations/de.json index c9852632cdd4..75d34e925c15 100644 --- a/homeassistant/components/esphome/.translations/de.json +++ b/homeassistant/components/esphome/.translations/de.json @@ -29,7 +29,7 @@ "description": "Bitte gib die Verbindungseinstellungen deines [ESPHome](https://esphomelib.com/)-Knotens ein.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/en.json b/homeassistant/components/esphome/.translations/en.json index f5236d1735dc..3f58bf520489 100644 --- a/homeassistant/components/esphome/.translations/en.json +++ b/homeassistant/components/esphome/.translations/en.json @@ -29,7 +29,7 @@ "description": "Please enter connection settings of your [ESPHome](https://esphomelib.com/) node.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/es-419.json b/homeassistant/components/esphome/.translations/es-419.json index a0a2d77d48c8..962a417d09cd 100644 --- a/homeassistant/components/esphome/.translations/es-419.json +++ b/homeassistant/components/esphome/.translations/es-419.json @@ -29,7 +29,7 @@ "description": "Por favor Ingrese la configuraci\u00f3n de conexi\u00f3n de su nodo [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/es.json b/homeassistant/components/esphome/.translations/es.json index be8033f316a2..003926d6d589 100644 --- a/homeassistant/components/esphome/.translations/es.json +++ b/homeassistant/components/esphome/.translations/es.json @@ -29,7 +29,7 @@ "description": "Introduce la configuraci\u00f3n de la conexi\u00f3n de tu nodo [ESPHome](https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/fr.json b/homeassistant/components/esphome/.translations/fr.json index 26fa4ec0bd46..7459f7a1ce42 100644 --- a/homeassistant/components/esphome/.translations/fr.json +++ b/homeassistant/components/esphome/.translations/fr.json @@ -29,7 +29,7 @@ "description": "Veuillez saisir les param\u00e8tres de connexion de votre n\u0153ud [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/hu.json b/homeassistant/components/esphome/.translations/hu.json index 628983fec037..f6aed1a1be93 100644 --- a/homeassistant/components/esphome/.translations/hu.json +++ b/homeassistant/components/esphome/.translations/hu.json @@ -29,7 +29,7 @@ "description": "K\u00e9rlek, add meg az [ESPHome](https://esphomelib.com/) csom\u00f3pontod kapcsol\u00f3d\u00e1si be\u00e1ll\u00edt\u00e1sait.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/it.json b/homeassistant/components/esphome/.translations/it.json index bb77e87f6a1c..8f50a6720fcb 100644 --- a/homeassistant/components/esphome/.translations/it.json +++ b/homeassistant/components/esphome/.translations/it.json @@ -29,7 +29,7 @@ "description": "Inserisci le impostazioni di connessione del tuo nodo [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ko.json b/homeassistant/components/esphome/.translations/ko.json index 4d8068c801b3..5eaac8bad65a 100644 --- a/homeassistant/components/esphome/.translations/ko.json +++ b/homeassistant/components/esphome/.translations/ko.json @@ -29,7 +29,7 @@ "description": "[ESPHome](https://esphomelib.com/) \ub178\ub4dc\uc758 \uc5f0\uacb0 \uad6c\uc131\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/lb.json b/homeassistant/components/esphome/.translations/lb.json index 8302d8b38c23..914560f4a05b 100644 --- a/homeassistant/components/esphome/.translations/lb.json +++ b/homeassistant/components/esphome/.translations/lb.json @@ -29,7 +29,7 @@ "description": "Gitt Verbindungs Informatioune vun \u00e4rem [ESPHome](https://esphomelib.com/) an.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/nl.json b/homeassistant/components/esphome/.translations/nl.json index a56130b22639..6e727e973a66 100644 --- a/homeassistant/components/esphome/.translations/nl.json +++ b/homeassistant/components/esphome/.translations/nl.json @@ -29,7 +29,7 @@ "description": "Voer de verbindingsinstellingen in van uw [ESPHome](https://esphomelib.com/) node.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/nn.json b/homeassistant/components/esphome/.translations/nn.json index 5e40c8ec5e56..7cc1215f820d 100644 --- a/homeassistant/components/esphome/.translations/nn.json +++ b/homeassistant/components/esphome/.translations/nn.json @@ -8,7 +8,7 @@ "user": { "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/no.json b/homeassistant/components/esphome/.translations/no.json index b4fa669fbff3..900f255e74d8 100644 --- a/homeassistant/components/esphome/.translations/no.json +++ b/homeassistant/components/esphome/.translations/no.json @@ -29,7 +29,7 @@ "description": "Vennligst skriv inn tilkoblingsinnstillinger for din [ESPHome](https://esphomelib.com/) node.", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pl.json b/homeassistant/components/esphome/.translations/pl.json index ebd201b55503..10e6278ac048 100644 --- a/homeassistant/components/esphome/.translations/pl.json +++ b/homeassistant/components/esphome/.translations/pl.json @@ -29,7 +29,7 @@ "description": "Wprowad\u017a ustawienia po\u0142\u0105czenia [ESPHome](https://esphomelib.com/) w\u0119z\u0142a.", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pt-BR.json b/homeassistant/components/esphome/.translations/pt-BR.json index 1c2baa9e028c..aca9bdb80e32 100644 --- a/homeassistant/components/esphome/.translations/pt-BR.json +++ b/homeassistant/components/esphome/.translations/pt-BR.json @@ -29,7 +29,7 @@ "description": "Por favor insira as configura\u00e7\u00f5es de conex\u00e3o de seu n\u00f3 de [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pt.json b/homeassistant/components/esphome/.translations/pt.json index 7e4a85f35148..a14be0aed6b8 100644 --- a/homeassistant/components/esphome/.translations/pt.json +++ b/homeassistant/components/esphome/.translations/pt.json @@ -24,7 +24,7 @@ "description": "Por favor, insira as configura\u00e7\u00f5es de liga\u00e7\u00e3o ao seu n\u00f3 [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ru.json b/homeassistant/components/esphome/.translations/ru.json index 27d223012c09..cd168681c7a6 100644 --- a/homeassistant/components/esphome/.translations/ru.json +++ b/homeassistant/components/esphome/.translations/ru.json @@ -29,7 +29,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0412\u0430\u0448\u0435\u043c\u0443 [ESPHome](https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sl.json b/homeassistant/components/esphome/.translations/sl.json index 5f4e9d3e4c43..afcabd00eba7 100644 --- a/homeassistant/components/esphome/.translations/sl.json +++ b/homeassistant/components/esphome/.translations/sl.json @@ -29,7 +29,7 @@ "description": "Prosimo, vnesite nastavitve povezave va\u0161ega vozli\u0161\u010da [ESPHome] (https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sv.json b/homeassistant/components/esphome/.translations/sv.json index 37788522e4f6..0f46cdce543e 100644 --- a/homeassistant/components/esphome/.translations/sv.json +++ b/homeassistant/components/esphome/.translations/sv.json @@ -29,7 +29,7 @@ "description": "Ange anslutningsinst\u00e4llningarna f\u00f6r noden [ESPHome](https://esphomelib.com/).", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ 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 4839167785d0..128f1ebf9df0 100644 --- a/homeassistant/components/esphome/.translations/zh-Hans.json +++ b/homeassistant/components/esphome/.translations/zh-Hans.json @@ -29,7 +29,7 @@ "description": "\u8bf7\u8f93\u5165\u60a8\u7684 [ESPHome](https://esphomelib.com/) \u8282\u70b9\u7684\u8fde\u63a5\u8bbe\u7f6e\u3002", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/zh-Hant.json b/homeassistant/components/esphome/.translations/zh-Hant.json index bc229d190a71..489857342734 100644 --- a/homeassistant/components/esphome/.translations/zh-Hant.json +++ b/homeassistant/components/esphome/.translations/zh-Hant.json @@ -29,7 +29,7 @@ "description": "\u8acb\u8f38\u5165 [ESPHome](https://esphomelib.com/) \u7bc0\u9ede\u9023\u7dda\u8cc7\u8a0a\u3002", "title": "ESPHome" } - }, - "title": "ESPHome" - } + } + }, + "title": "ESPHome" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/ca.json b/homeassistant/components/flume/.translations/ca.json index 9cb58b1adbed..02061267cd45 100644 --- a/homeassistant/components/flume/.translations/ca.json +++ b/homeassistant/components/flume/.translations/ca.json @@ -19,7 +19,7 @@ "description": "Per poder accedir a l'API personal de Flume, has de sol\u00b7licitar un 'ID de client' i un 'secret de client' anant a https://portal.flumetech.com/settings#token", "title": "Connexi\u00f3 amb Flume" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/de.json b/homeassistant/components/flume/.translations/de.json index bc70e9088295..a07665dc9ede 100644 --- a/homeassistant/components/flume/.translations/de.json +++ b/homeassistant/components/flume/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zu Ihrem Flume-Konto her" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/en.json b/homeassistant/components/flume/.translations/en.json index e9fa25b30fbd..33c17cd3021b 100644 --- a/homeassistant/components/flume/.translations/en.json +++ b/homeassistant/components/flume/.translations/en.json @@ -19,7 +19,7 @@ "description": "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token", "title": "Connect to your Flume Account" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/es.json b/homeassistant/components/flume/.translations/es.json index 2e63c8663cd9..354f50b2a772 100644 --- a/homeassistant/components/flume/.translations/es.json +++ b/homeassistant/components/flume/.translations/es.json @@ -19,7 +19,7 @@ "description": "Para acceder a la API Personal de Flume, tendr\u00e1s que solicitar un 'Client ID' y un 'Client Secret' en https://portal.flumetech.com/settings#token", "title": "Conectar con tu cuenta de Flume" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/fr.json b/homeassistant/components/flume/.translations/fr.json index c0e8750d94b2..84052396d976 100644 --- a/homeassistant/components/flume/.translations/fr.json +++ b/homeassistant/components/flume/.translations/fr.json @@ -13,7 +13,7 @@ "description": "Pour acc\u00e9der \u00e0 l'API personnel Flume, vous devez demander un \"Client ID\" et un \"Client Secret\" \u00e0 l'adresse https://portal.flumetech.com/settings#token", "title": "Se connecter \u00e0 votre compte Flume" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/nl.json b/homeassistant/components/flume/.translations/nl.json index 7f1cd8c35eb7..5cc83d418dcf 100644 --- a/homeassistant/components/flume/.translations/nl.json +++ b/homeassistant/components/flume/.translations/nl.json @@ -16,7 +16,7 @@ }, "title": "Verbind met uw Flume account" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/no.json b/homeassistant/components/flume/.translations/no.json new file mode 100644 index 000000000000..dd95b221da5d --- /dev/null +++ b/homeassistant/components/flume/.translations/no.json @@ -0,0 +1,20 @@ +{ + "config": { + "error": { + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "client_id": "klient-ID", + "client_secret": "Klienthemmelighet", + "password": "Passord", + "username": "Brukernavn" + }, + "description": "For \u00e5 f\u00e5 tilgang til Flume Personal API, m\u00e5 du be om en \"Klient-ID\" og \"Client Secret\" p\u00e5 https://portal.flumetech.com/settings#token", + "title": "Koble til Flume-kontoen din" + } + } + }, + "title": "Flume" +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/ru.json b/homeassistant/components/flume/.translations/ru.json index 88b83190806a..fb36e267f947 100644 --- a/homeassistant/components/flume/.translations/ru.json +++ b/homeassistant/components/flume/.translations/ru.json @@ -19,7 +19,7 @@ "description": "\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 API Flume, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 'ID \u043a\u043b\u0438\u0435\u043d\u0442\u0430' \u0438 '\u0421\u0435\u043a\u0440\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430' \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 https://portal.flumetech.com/settings#token.", "title": "Flume" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/zh-Hant.json b/homeassistant/components/flume/.translations/zh-Hant.json index fd2882c607b4..416fe27add30 100644 --- a/homeassistant/components/flume/.translations/zh-Hant.json +++ b/homeassistant/components/flume/.translations/zh-Hant.json @@ -19,7 +19,7 @@ "description": "\u6b32\u5b58\u53d6 Flume \u500b\u4eba API\u3001\u5c07\u9700\u8981\u65bc https://portal.flumetech.com/settings#token \u7372\u5f97\u5ba2\u6236\u7aef ID\uff08Client ID\u300f\u53ca\u5ba2\u6236\u7aef\u5bc6\u9470\uff08Client Secret\uff09", "title": "\u9023\u7dda\u81f3 Flume \u5e33\u865f" } - }, - "title": "Flume" - } + } + }, + "title": "Flume" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ca.json b/homeassistant/components/flunearyou/.translations/ca.json index dddf7dc2c882..dc29217e3b57 100644 --- a/homeassistant/components/flunearyou/.translations/ca.json +++ b/homeassistant/components/flunearyou/.translations/ca.json @@ -15,7 +15,7 @@ "description": "Monitoritza informes basats en usuari i CDC per a parells de coordenades.", "title": "Configuraci\u00f3 Flu Near You" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/de.json b/homeassistant/components/flunearyou/.translations/de.json index 0ac830238968..4df27df0f6c2 100644 --- a/homeassistant/components/flunearyou/.translations/de.json +++ b/homeassistant/components/flunearyou/.translations/de.json @@ -14,7 +14,7 @@ }, "title": "Konfigurieren Sie die Grippe in Ihrer N\u00e4he" } - }, - "title": "Grippe in Ihrer N\u00e4he" - } + } + }, + "title": "Grippe in Ihrer N\u00e4he" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/en.json b/homeassistant/components/flunearyou/.translations/en.json index ca868b8ebd91..5b20c4efca41 100644 --- a/homeassistant/components/flunearyou/.translations/en.json +++ b/homeassistant/components/flunearyou/.translations/en.json @@ -15,7 +15,7 @@ "description": "Monitor user-based and CDC repots for a pair of coordinates.", "title": "Configure Flu Near You" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/es.json b/homeassistant/components/flunearyou/.translations/es.json index df104c5405ee..f98770a7b24a 100644 --- a/homeassistant/components/flunearyou/.translations/es.json +++ b/homeassistant/components/flunearyou/.translations/es.json @@ -15,7 +15,7 @@ "description": "Monitorizar reportes de usuarios y del CDC para un par de coordenadas", "title": "Configurar Flu Near You" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ko.json b/homeassistant/components/flunearyou/.translations/ko.json index c155a7f6111a..27001b0d9aa3 100644 --- a/homeassistant/components/flunearyou/.translations/ko.json +++ b/homeassistant/components/flunearyou/.translations/ko.json @@ -15,7 +15,7 @@ "description": "\uc0ac\uc6a9\uc790 \uae30\ubc18 \ub370\uc774\ud130 \ubc0f CDC \ubcf4\uace0\uc11c\uc5d0\uc11c \uc88c\ud45c\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud569\ub2c8\ub2e4.", "title": "Flu Near You \uad6c\uc131" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/lb.json b/homeassistant/components/flunearyou/.translations/lb.json index 03c8d0bce098..f6a1b7e4b31c 100644 --- a/homeassistant/components/flunearyou/.translations/lb.json +++ b/homeassistant/components/flunearyou/.translations/lb.json @@ -15,7 +15,7 @@ "description": "Iwwerwach Benotzer-bas\u00e9iert an CDC Berichter fir Koordinaten.", "title": "Flu Near You konfigur\u00e9ieren" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ru.json b/homeassistant/components/flunearyou/.translations/ru.json index 8e8b050ba7af..ba2831ad6c17 100644 --- a/homeassistant/components/flunearyou/.translations/ru.json +++ b/homeassistant/components/flunearyou/.translations/ru.json @@ -15,7 +15,7 @@ "description": "\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 CDC \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.", "title": "Flu Near You" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/zh-Hant.json b/homeassistant/components/flunearyou/.translations/zh-Hant.json index 50f31707a61c..6299bc039800 100644 --- a/homeassistant/components/flunearyou/.translations/zh-Hant.json +++ b/homeassistant/components/flunearyou/.translations/zh-Hant.json @@ -15,7 +15,7 @@ "description": "\u76e3\u6e2c\u4f7f\u7528\u8005\u8207 CDC \u56de\u5831\u5ea7\u6a19\u3002", "title": "\u8a2d\u5b9a Flu Near You" } - }, - "title": "Flu Near You" - } + } + }, + "title": "Flu Near You" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ca.json b/homeassistant/components/freebox/.translations/ca.json index 0abfc0ef52b4..c49e8cd5ec81 100644 --- a/homeassistant/components/freebox/.translations/ca.json +++ b/homeassistant/components/freebox/.translations/ca.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/de.json b/homeassistant/components/freebox/.translations/de.json index 72caccf49dc2..a85f8e687447 100644 --- a/homeassistant/components/freebox/.translations/de.json +++ b/homeassistant/components/freebox/.translations/de.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/en.json b/homeassistant/components/freebox/.translations/en.json index 75d925e2f7ac..1d309944557b 100644 --- a/homeassistant/components/freebox/.translations/en.json +++ b/homeassistant/components/freebox/.translations/en.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/es.json b/homeassistant/components/freebox/.translations/es.json index 2c073e1d0448..20e7c6f60e5e 100644 --- a/homeassistant/components/freebox/.translations/es.json +++ b/homeassistant/components/freebox/.translations/es.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/fr.json b/homeassistant/components/freebox/.translations/fr.json index 6a91abc7076a..af732d70df4d 100644 --- a/homeassistant/components/freebox/.translations/fr.json +++ b/homeassistant/components/freebox/.translations/fr.json @@ -19,7 +19,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/it.json b/homeassistant/components/freebox/.translations/it.json index 6624167722b7..8fd4287866ec 100644 --- a/homeassistant/components/freebox/.translations/it.json +++ b/homeassistant/components/freebox/.translations/it.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ko.json b/homeassistant/components/freebox/.translations/ko.json index 56c91ad824cc..b0e270572eeb 100644 --- a/homeassistant/components/freebox/.translations/ko.json +++ b/homeassistant/components/freebox/.translations/ko.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/lb.json b/homeassistant/components/freebox/.translations/lb.json index 21567b8f0961..cbf680ffd966 100644 --- a/homeassistant/components/freebox/.translations/lb.json +++ b/homeassistant/components/freebox/.translations/lb.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/no.json b/homeassistant/components/freebox/.translations/no.json index cf8b3e554022..c7757eb8ac1f 100644 --- a/homeassistant/components/freebox/.translations/no.json +++ b/homeassistant/components/freebox/.translations/no.json @@ -20,7 +20,7 @@ }, "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/pl.json b/homeassistant/components/freebox/.translations/pl.json index 40fe7f097f11..d917ba507edf 100644 --- a/homeassistant/components/freebox/.translations/pl.json +++ b/homeassistant/components/freebox/.translations/pl.json @@ -10,7 +10,7 @@ }, "step": { "link": { - "description": "Kliknij \"Prze\u015blij\", a nast\u0119pnie naci\u015bnij przycisk strza\u0142ki w prawo na routerze, aby zarejestrowa\u0107 Freebox w Home Assistan'cie. \n\n ![Lokalizacja przycisku na routerze] (/static/images/config_freebox.png)", + "description": "Kliknij \"Zatwierd\u017a\", a nast\u0119pnie naci\u015bnij przycisk strza\u0142ki w prawo na routerze, aby zarejestrowa\u0107 Freebox w Home Assistan'cie. \n\n ![Lokalizacja przycisku na routerze] (/static/images/config_freebox.png)", "title": "Po\u0142\u0105cz z routerem Freebox" }, "user": { @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ru.json b/homeassistant/components/freebox/.translations/ru.json index 4d4fdcc650d6..f874e519f6ae 100644 --- a/homeassistant/components/freebox/.translations/ru.json +++ b/homeassistant/components/freebox/.translations/ru.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/sl.json b/homeassistant/components/freebox/.translations/sl.json index e9865b9bf1e0..4503700bbbff 100644 --- a/homeassistant/components/freebox/.translations/sl.json +++ b/homeassistant/components/freebox/.translations/sl.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/zh-Hant.json b/homeassistant/components/freebox/.translations/zh-Hant.json index 38da7b96e034..8f82f6a623d3 100644 --- a/homeassistant/components/freebox/.translations/zh-Hant.json +++ b/homeassistant/components/freebox/.translations/zh-Hant.json @@ -20,7 +20,7 @@ }, "title": "Freebox" } - }, - "title": "Freebox" - } + } + }, + "title": "Freebox" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ca.json b/homeassistant/components/garmin_connect/.translations/ca.json index 95e59cf350d8..f1cdefd721f1 100644 --- a/homeassistant/components/garmin_connect/.translations/ca.json +++ b/homeassistant/components/garmin_connect/.translations/ca.json @@ -18,7 +18,7 @@ "description": "Introdueix les teves credencials.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/cs.json b/homeassistant/components/garmin_connect/.translations/cs.json index ed8d33cc65cc..01aed49ac2aa 100644 --- a/homeassistant/components/garmin_connect/.translations/cs.json +++ b/homeassistant/components/garmin_connect/.translations/cs.json @@ -18,7 +18,7 @@ "description": "Zadejte sv\u00e9 p\u0159ihla\u0161ovac\u00ed \u00fadaje.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/da.json b/homeassistant/components/garmin_connect/.translations/da.json index 1bbc5e7edba3..31e8c09be562 100644 --- a/homeassistant/components/garmin_connect/.translations/da.json +++ b/homeassistant/components/garmin_connect/.translations/da.json @@ -18,7 +18,7 @@ "description": "Indtast dine legitimationsoplysninger.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/de.json b/homeassistant/components/garmin_connect/.translations/de.json index dc1dfe5e9bd4..f9517b8c00a5 100644 --- a/homeassistant/components/garmin_connect/.translations/de.json +++ b/homeassistant/components/garmin_connect/.translations/de.json @@ -18,7 +18,7 @@ "description": "Geben Sie Ihre Zugangsdaten ein.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/en.json b/homeassistant/components/garmin_connect/.translations/en.json index 5dac9131fb0b..d60c1bf91e93 100644 --- a/homeassistant/components/garmin_connect/.translations/en.json +++ b/homeassistant/components/garmin_connect/.translations/en.json @@ -18,7 +18,7 @@ "description": "Enter your credentials.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/es.json b/homeassistant/components/garmin_connect/.translations/es.json index 53c1d3e0b8fd..4fb7efbf52c3 100644 --- a/homeassistant/components/garmin_connect/.translations/es.json +++ b/homeassistant/components/garmin_connect/.translations/es.json @@ -18,7 +18,7 @@ "description": "Introduzca sus credenciales.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/fr.json b/homeassistant/components/garmin_connect/.translations/fr.json index f0dd8a79e5bc..3fa5fb59dd02 100644 --- a/homeassistant/components/garmin_connect/.translations/fr.json +++ b/homeassistant/components/garmin_connect/.translations/fr.json @@ -18,7 +18,7 @@ "description": "Entrez vos informations d'identification.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/hu.json b/homeassistant/components/garmin_connect/.translations/hu.json index 931fa2959622..cf26729c63bc 100644 --- a/homeassistant/components/garmin_connect/.translations/hu.json +++ b/homeassistant/components/garmin_connect/.translations/hu.json @@ -18,7 +18,7 @@ "description": "Adja meg a hiteles\u00edt\u0151 adatait.", "title": "Garmin Csatlakoz\u00e1s" } - }, - "title": "Garmin Csatlakoz\u00e1s" - } + } + }, + "title": "Garmin Csatlakoz\u00e1s" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/it.json b/homeassistant/components/garmin_connect/.translations/it.json index 2d942bbc6a2f..aaf67ffe8cae 100644 --- a/homeassistant/components/garmin_connect/.translations/it.json +++ b/homeassistant/components/garmin_connect/.translations/it.json @@ -18,7 +18,7 @@ "description": "Inserisci le tue credenziali", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ko.json b/homeassistant/components/garmin_connect/.translations/ko.json index eb354821d3da..507b7c164b91 100644 --- a/homeassistant/components/garmin_connect/.translations/ko.json +++ b/homeassistant/components/garmin_connect/.translations/ko.json @@ -18,7 +18,7 @@ "description": "\uc790\uaca9 \uc99d\uba85\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/lb.json b/homeassistant/components/garmin_connect/.translations/lb.json index 8289be66d593..d7e64cdbf8b1 100644 --- a/homeassistant/components/garmin_connect/.translations/lb.json +++ b/homeassistant/components/garmin_connect/.translations/lb.json @@ -18,7 +18,7 @@ "description": "F\u00ebllt \u00e4r Umeldungs Informatiounen aus.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/nl.json b/homeassistant/components/garmin_connect/.translations/nl.json index c7a690de6e2c..086f2032d85e 100644 --- a/homeassistant/components/garmin_connect/.translations/nl.json +++ b/homeassistant/components/garmin_connect/.translations/nl.json @@ -18,7 +18,7 @@ "description": "Voer uw gegevens in", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/no.json b/homeassistant/components/garmin_connect/.translations/no.json index bc8669086b16..28206deade74 100644 --- a/homeassistant/components/garmin_connect/.translations/no.json +++ b/homeassistant/components/garmin_connect/.translations/no.json @@ -18,7 +18,7 @@ "description": "Angi brukeropplysninger.", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/pl.json b/homeassistant/components/garmin_connect/.translations/pl.json index 45d0296b668c..932dcf80a0f8 100644 --- a/homeassistant/components/garmin_connect/.translations/pl.json +++ b/homeassistant/components/garmin_connect/.translations/pl.json @@ -18,7 +18,7 @@ "description": "Wprowad\u017a dane uwierzytelniaj\u0105ce", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ru.json b/homeassistant/components/garmin_connect/.translations/ru.json index f8d018e1b1e9..1bd753fcbdc7 100644 --- a/homeassistant/components/garmin_connect/.translations/ru.json +++ b/homeassistant/components/garmin_connect/.translations/ru.json @@ -18,7 +18,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/sl.json b/homeassistant/components/garmin_connect/.translations/sl.json index 5b85611d5b7a..ebc980860de2 100644 --- a/homeassistant/components/garmin_connect/.translations/sl.json +++ b/homeassistant/components/garmin_connect/.translations/sl.json @@ -18,7 +18,7 @@ "description": "Vnesite svoje poverilnice.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/sv.json b/homeassistant/components/garmin_connect/.translations/sv.json index 12715a97ebed..f77b7c18a09e 100644 --- a/homeassistant/components/garmin_connect/.translations/sv.json +++ b/homeassistant/components/garmin_connect/.translations/sv.json @@ -18,7 +18,7 @@ "description": "Ange dina anv\u00e4ndaruppgifter.", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/zh-Hant.json b/homeassistant/components/garmin_connect/.translations/zh-Hant.json index 8ddb5e61295d..aa1835d13fa3 100644 --- a/homeassistant/components/garmin_connect/.translations/zh-Hant.json +++ b/homeassistant/components/garmin_connect/.translations/zh-Hant.json @@ -18,7 +18,7 @@ "description": "\u8f38\u5165\u6191\u8b49\u3002", "title": "Garmin Connect" } - }, - "title": "Garmin Connect" - } + } + }, + "title": "Garmin Connect" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ca.json b/homeassistant/components/gdacs/.translations/ca.json index 5f5acfe7ccf3..4dd50811ab0f 100644 --- a/homeassistant/components/gdacs/.translations/ca.json +++ b/homeassistant/components/gdacs/.translations/ca.json @@ -10,7 +10,7 @@ }, "title": "Introducci\u00f3 dels detalls del filtre." } - }, - "title": "Sistema Global de Coordinaci\u00f3 i Alerta per Desastres (GDACS)" - } + } + }, + "title": "Sistema Global de Coordinaci\u00f3 i Alerta per Desastres (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/da.json b/homeassistant/components/gdacs/.translations/da.json index 64f3dd000c4c..dd97a1e48580 100644 --- a/homeassistant/components/gdacs/.translations/da.json +++ b/homeassistant/components/gdacs/.translations/da.json @@ -10,7 +10,7 @@ }, "title": "Udfyld dine filteroplysninger." } - }, - "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" - } + } + }, + "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/de.json b/homeassistant/components/gdacs/.translations/de.json index 12f94250402a..aa66e0b2aa8b 100644 --- a/homeassistant/components/gdacs/.translations/de.json +++ b/homeassistant/components/gdacs/.translations/de.json @@ -10,7 +10,7 @@ }, "title": "F\u00fclle deine Filterangaben aus." } - }, - "title": "Globales Katastrophenalarm- und Koordinierungssystem (GDACS)" - } + } + }, + "title": "Globales Katastrophenalarm- und Koordinierungssystem (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/en.json b/homeassistant/components/gdacs/.translations/en.json index 4e7ceb3846cc..ccb2f2054ce3 100644 --- a/homeassistant/components/gdacs/.translations/en.json +++ b/homeassistant/components/gdacs/.translations/en.json @@ -10,7 +10,7 @@ }, "title": "Fill in your filter details." } - }, - "title": "Global Disaster Alert and Coordination System (GDACS)" - } + } + }, + "title": "Global Disaster Alert and Coordination System (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/es.json b/homeassistant/components/gdacs/.translations/es.json index 6c02b3395416..6a87ebe5167e 100644 --- a/homeassistant/components/gdacs/.translations/es.json +++ b/homeassistant/components/gdacs/.translations/es.json @@ -10,7 +10,7 @@ }, "title": "Rellena los datos de tu filtro." } - }, - "title": "Sistema Mundial de Alerta y Coordinaci\u00f3n de Desastres (GDACS)" - } + } + }, + "title": "Sistema Mundial de Alerta y Coordinaci\u00f3n de Desastres (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/fr.json b/homeassistant/components/gdacs/.translations/fr.json index a4366cb5dc7f..d1bb6e48b50e 100644 --- a/homeassistant/components/gdacs/.translations/fr.json +++ b/homeassistant/components/gdacs/.translations/fr.json @@ -10,7 +10,7 @@ }, "title": "Remplissez les d\u00e9tails de votre filtre." } - }, - "title": "Syst\u00e8me mondial d'alerte et de coordination en cas de catastrophe (GDACS)" - } + } + }, + "title": "Syst\u00e8me mondial d'alerte et de coordination en cas de catastrophe (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/hu.json b/homeassistant/components/gdacs/.translations/hu.json index 79bcba3388f8..172c6b26ad0b 100644 --- a/homeassistant/components/gdacs/.translations/hu.json +++ b/homeassistant/components/gdacs/.translations/hu.json @@ -10,7 +10,7 @@ }, "title": "T\u00f6ltse ki a sz\u0171r\u0151 adatait." } - }, - "title": "Glob\u00e1lis katasztr\u00f3fariaszt\u00e1si \u00e9s koordin\u00e1ci\u00f3s rendszer (GDACS)" - } + } + }, + "title": "Glob\u00e1lis katasztr\u00f3fariaszt\u00e1si \u00e9s koordin\u00e1ci\u00f3s rendszer (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/it.json b/homeassistant/components/gdacs/.translations/it.json index 249b47f9f59c..1a281a0161df 100644 --- a/homeassistant/components/gdacs/.translations/it.json +++ b/homeassistant/components/gdacs/.translations/it.json @@ -10,7 +10,7 @@ }, "title": "Inserisci i tuoi dettagli del filtro." } - }, - "title": "Sistema globale di allerta e coordinamento delle catastrofi (GDACS)" - } + } + }, + "title": "Sistema globale di allerta e coordinamento delle catastrofi (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ko.json b/homeassistant/components/gdacs/.translations/ko.json index 10d6f73e56f2..8daac5abd50c 100644 --- a/homeassistant/components/gdacs/.translations/ko.json +++ b/homeassistant/components/gdacs/.translations/ko.json @@ -10,7 +10,7 @@ }, "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } - }, - "title": "\uad6d\uc81c \uc7ac\ub09c \uacbd\ubcf4 \ubc0f \uc870\uc815 \uae30\uad6c (GDACS)" - } + } + }, + "title": "\uad6d\uc81c \uc7ac\ub09c \uacbd\ubcf4 \ubc0f \uc870\uc815 \uae30\uad6c (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/lb.json b/homeassistant/components/gdacs/.translations/lb.json index a4077ed630e4..bbd5d6f6a820 100644 --- a/homeassistant/components/gdacs/.translations/lb.json +++ b/homeassistant/components/gdacs/.translations/lb.json @@ -10,7 +10,7 @@ }, "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } - }, - "title": "Globale D\u00e9saster Alerte a Koordinatioun System (GDACS)" - } + } + }, + "title": "Globale D\u00e9saster Alerte a Koordinatioun System (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/nl.json b/homeassistant/components/gdacs/.translations/nl.json index 62383e43e362..9a543d205583 100644 --- a/homeassistant/components/gdacs/.translations/nl.json +++ b/homeassistant/components/gdacs/.translations/nl.json @@ -10,7 +10,7 @@ }, "title": "Vul uw filtergegevens in." } - }, - "title": "Wereldwijd rampenwaarschuwings- en co\u00f6rdinatiesysteem (GDACS)" - } + } + }, + "title": "Wereldwijd rampenwaarschuwings- en co\u00f6rdinatiesysteem (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/no.json b/homeassistant/components/gdacs/.translations/no.json index f344c47365da..68b8ea06867b 100644 --- a/homeassistant/components/gdacs/.translations/no.json +++ b/homeassistant/components/gdacs/.translations/no.json @@ -10,7 +10,7 @@ }, "title": "Fyll ut filterdetaljene." } - }, - "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" - } + } + }, + "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/pl.json b/homeassistant/components/gdacs/.translations/pl.json index f4b90cc35c70..59b9a9448a73 100644 --- a/homeassistant/components/gdacs/.translations/pl.json +++ b/homeassistant/components/gdacs/.translations/pl.json @@ -10,7 +10,7 @@ }, "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } - }, - "title": "Globalny system ostrzegania i koordynacji w przypadku katastrof (GDACS)" - } + } + }, + "title": "Globalny system ostrzegania i koordynacji w przypadku katastrof (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ru.json b/homeassistant/components/gdacs/.translations/ru.json index f006832b5be5..9a4aa3e80b02 100644 --- a/homeassistant/components/gdacs/.translations/ru.json +++ b/homeassistant/components/gdacs/.translations/ru.json @@ -10,7 +10,7 @@ }, "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0438\u0445\u0438\u0439\u043d\u044b\u0445 \u0431\u0435\u0434\u0441\u0442\u0432\u0438\u0439 (GDACS)" - } + } + }, + "title": "\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0438\u0445\u0438\u0439\u043d\u044b\u0445 \u0431\u0435\u0434\u0441\u0442\u0432\u0438\u0439 (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/sl.json b/homeassistant/components/gdacs/.translations/sl.json index fc522a1a2630..f567173702f1 100644 --- a/homeassistant/components/gdacs/.translations/sl.json +++ b/homeassistant/components/gdacs/.translations/sl.json @@ -10,7 +10,7 @@ }, "title": "Izpolnite podrobnosti filtra." } - }, - "title": "Globalni sistem opozarjanja in koordinacije nesre\u010d (GDACS)" - } + } + }, + "title": "Globalni sistem opozarjanja in koordinacije nesre\u010d (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/sv.json b/homeassistant/components/gdacs/.translations/sv.json index 3c7fb00056e0..581b98863292 100644 --- a/homeassistant/components/gdacs/.translations/sv.json +++ b/homeassistant/components/gdacs/.translations/sv.json @@ -10,7 +10,7 @@ }, "title": "Fyll i filterinformation." } - }, - "title": "Globalt katastrofvarnings- och samordningssystem (GDACS)" - } + } + }, + "title": "Globalt katastrofvarnings- och samordningssystem (GDACS)" } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/zh-Hant.json b/homeassistant/components/gdacs/.translations/zh-Hant.json index 59f9b7be0317..63bfc613d111 100644 --- a/homeassistant/components/gdacs/.translations/zh-Hant.json +++ b/homeassistant/components/gdacs/.translations/zh-Hant.json @@ -10,7 +10,7 @@ }, "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } - }, - "title": "\u5168\u7403\u707d\u96e3\u9810\u8b66\u548c\u5354\u8abf\u7cfb\u7d71\uff08GDACS\uff09" - } + } + }, + "title": "\u5168\u7403\u707d\u96e3\u9810\u8b66\u548c\u5354\u8abf\u7cfb\u7d71\uff08GDACS\uff09" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/bg.json b/homeassistant/components/geofency/.translations/bg.json index b9bfa2a3b41b..35fbd15598c3 100644 --- a/homeassistant/components/geofency/.translations/bg.json +++ b/homeassistant/components/geofency/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Geofency Webhook?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ca.json b/homeassistant/components/geofency/.translations/ca.json index 44377ce30214..06f5c6f4c8e9 100644 --- a/homeassistant/components/geofency/.translations/ca.json +++ b/homeassistant/components/geofency/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar el Webhook de Geofency?", "title": "Configuraci\u00f3 del Webhook de Geofency" } - }, - "title": "Webhook de Geofency" - } + } + }, + "title": "Webhook de Geofency" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/cs.json b/homeassistant/components/geofency/.translations/cs.json index 2fa1dfc9f4b3..bec6897ed349 100644 --- a/homeassistant/components/geofency/.translations/cs.json +++ b/homeassistant/components/geofency/.translations/cs.json @@ -8,7 +8,7 @@ "description": "Opravdu chcete nastavit Geofency Webhook?", "title": "Nastavit Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/da.json b/homeassistant/components/geofency/.translations/da.json index 6e9443af5e89..8f9b5a16516c 100644 --- a/homeassistant/components/geofency/.translations/da.json +++ b/homeassistant/components/geofency/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Geofency Webhook?", "title": "Ops\u00e6tning af Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/de.json b/homeassistant/components/geofency/.translations/de.json index f7773f13db87..0ac6edee190f 100644 --- a/homeassistant/components/geofency/.translations/de.json +++ b/homeassistant/components/geofency/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du den Geofency Webhook wirklich einrichten?", "title": "Richte den Geofency Webhook ein" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/en.json b/homeassistant/components/geofency/.translations/en.json index 27b6335c6f9b..eed200f12cb1 100644 --- a/homeassistant/components/geofency/.translations/en.json +++ b/homeassistant/components/geofency/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up the Geofency Webhook?", "title": "Set up the Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/es-419.json b/homeassistant/components/geofency/.translations/es-419.json index 637a430a1f8a..e87ce684ac66 100644 --- a/homeassistant/components/geofency/.translations/es-419.json +++ b/homeassistant/components/geofency/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres montar el Webhook de Geofency?", "title": "Configurar el Webhook de Geofency" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/es.json b/homeassistant/components/geofency/.translations/es.json index 04d5c01e03e9..a43b2dd19e91 100644 --- a/homeassistant/components/geofency/.translations/es.json +++ b/homeassistant/components/geofency/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar el webhook de Geofency?", "title": "Configurar el Webhook de Geofency" } - }, - "title": "Webhook de Geofency" - } + } + }, + "title": "Webhook de Geofency" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/fr.json b/homeassistant/components/geofency/.translations/fr.json index b390f2dab44b..cdab9ab2b31e 100644 --- a/homeassistant/components/geofency/.translations/fr.json +++ b/homeassistant/components/geofency/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer le Webhook Geofency ?", "title": "Configurer le Webhook Geofency" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/hu.json b/homeassistant/components/geofency/.translations/hu.json index 85f71d74434c..488692028bfd 100644 --- a/homeassistant/components/geofency/.translations/hu.json +++ b/homeassistant/components/geofency/.translations/hu.json @@ -12,7 +12,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Geofency Webhookot?", "title": "A Geofency Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/it.json b/homeassistant/components/geofency/.translations/it.json index 1adad3825a30..74912d710f93 100644 --- a/homeassistant/components/geofency/.translations/it.json +++ b/homeassistant/components/geofency/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare il webhook di Geofency?", "title": "Configura il webhook di Geofency" } - }, - "title": "Webhook di Geofency" - } + } + }, + "title": "Webhook di Geofency" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ko.json b/homeassistant/components/geofency/.translations/ko.json index 37f5ef0e76a6..50e8242c2641 100644 --- a/homeassistant/components/geofency/.translations/ko.json +++ b/homeassistant/components/geofency/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Geofency Webhook \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Geofency Webhook \uc124\uc815" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/lb.json b/homeassistant/components/geofency/.translations/lb.json index 490026b366dd..1ed4b842b07b 100644 --- a/homeassistant/components/geofency/.translations/lb.json +++ b/homeassistant/components/geofency/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Geofency Webhook anzeriichten?", "title": "Geofency Webhook ariichten" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/nl.json b/homeassistant/components/geofency/.translations/nl.json index 04aec33b5d68..b4378620b14f 100644 --- a/homeassistant/components/geofency/.translations/nl.json +++ b/homeassistant/components/geofency/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u de Geofency Webhook wilt instellen?", "title": "Geofency Webhook instellen" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/no.json b/homeassistant/components/geofency/.translations/no.json index 431c0e16e7d5..e041048a0433 100644 --- a/homeassistant/components/geofency/.translations/no.json +++ b/homeassistant/components/geofency/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Geofency Webhook?", "title": "Sett opp Geofency Webhook" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pl.json b/homeassistant/components/geofency/.translations/pl.json index e72e99242c1c..23205426c872 100644 --- a/homeassistant/components/geofency/.translations/pl.json +++ b/homeassistant/components/geofency/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Geofency?", "title": "Konfiguracja Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pt-BR.json b/homeassistant/components/geofency/.translations/pt-BR.json index 20f21df5ac89..5c55feb0efd1 100644 --- a/homeassistant/components/geofency/.translations/pt-BR.json +++ b/homeassistant/components/geofency/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Geofency Webhook?", "title": "Configurar o Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pt.json b/homeassistant/components/geofency/.translations/pt.json index bc68c3ec8223..a8a162e55df9 100644 --- a/homeassistant/components/geofency/.translations/pt.json +++ b/homeassistant/components/geofency/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Geofency Webhook?", "title": "Configurar o Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ru.json b/homeassistant/components/geofency/.translations/ru.json index 3663ff0114ce..434a86a634a1 100644 --- a/homeassistant/components/geofency/.translations/ru.json +++ b/homeassistant/components/geofency/.translations/ru.json @@ -12,7 +12,7 @@ "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 Geofency?", "title": "Geofency" } - }, - "title": "Geofency" - } + } + }, + "title": "Geofency" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/sl.json b/homeassistant/components/geofency/.translations/sl.json index e56d41d4f1aa..77067ab1c920 100644 --- a/homeassistant/components/geofency/.translations/sl.json +++ b/homeassistant/components/geofency/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti geofency webhook?", "title": "Nastavite Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/sv.json b/homeassistant/components/geofency/.translations/sv.json index 88c9709147fc..30384a1a3720 100644 --- a/homeassistant/components/geofency/.translations/sv.json +++ b/homeassistant/components/geofency/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Geofency Webhook?", "title": "Konfigurera Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/zh-Hans.json b/homeassistant/components/geofency/.translations/zh-Hans.json index d18d8bc82807..d86d0eb35e24 100644 --- a/homeassistant/components/geofency/.translations/zh-Hans.json +++ b/homeassistant/components/geofency/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e Geofency Webhook \u5417?", "title": "\u8bbe\u7f6e Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/zh-Hant.json b/homeassistant/components/geofency/.translations/zh-Hant.json index 003a3db8bf18..d6a474f70f33 100644 --- a/homeassistant/components/geofency/.translations/zh-Hant.json +++ b/homeassistant/components/geofency/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Geofency Webhook\uff1f", "title": "\u8a2d\u5b9a Geofency Webhook" } - }, - "title": "Geofency Webhook" - } + } + }, + "title": "Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/bg.json b/homeassistant/components/geonetnz_quakes/.translations/bg.json index c907a6bafd98..79d0b591ef1e 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/bg.json +++ b/homeassistant/components/geonetnz_quakes/.translations/bg.json @@ -8,7 +8,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0437\u0430 \u0444\u0438\u043b\u0442\u044a\u0440\u0430 \u0441\u0438." } - }, - "title": "GeoNet NZ \u0417\u0435\u043c\u0435\u0442\u0440\u0435\u0441\u0435\u043d\u0438\u044f" - } + } + }, + "title": "GeoNet NZ \u0417\u0435\u043c\u0435\u0442\u0440\u0435\u0441\u0435\u043d\u0438\u044f" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ca.json b/homeassistant/components/geonetnz_quakes/.translations/ca.json index c422c1768a7b..213a1c19ba8d 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ca.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ca.json @@ -11,7 +11,7 @@ }, "title": "Introdueix els detalls del filtre." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/da.json b/homeassistant/components/geonetnz_quakes/.translations/da.json index 15847cdadc92..0cd170cfd7de 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/da.json +++ b/homeassistant/components/geonetnz_quakes/.translations/da.json @@ -8,7 +8,7 @@ }, "title": "Udfyld dine filteroplysninger." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/de.json b/homeassistant/components/geonetnz_quakes/.translations/de.json index a9d3c8dca79b..3ed0fbc85046 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/de.json +++ b/homeassistant/components/geonetnz_quakes/.translations/de.json @@ -11,7 +11,7 @@ }, "title": "F\u00fclle deine Filterdaten aus." } - }, - "title": "GeoNet NZ Erdbeben" - } + } + }, + "title": "GeoNet NZ Erdbeben" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/en.json b/homeassistant/components/geonetnz_quakes/.translations/en.json index 41fafa5763bb..1a253b18f1bb 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/en.json +++ b/homeassistant/components/geonetnz_quakes/.translations/en.json @@ -11,7 +11,7 @@ }, "title": "Fill in your filter details." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/es.json b/homeassistant/components/geonetnz_quakes/.translations/es.json index daab68f1111b..efb3f5deda8c 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/es.json +++ b/homeassistant/components/geonetnz_quakes/.translations/es.json @@ -11,7 +11,7 @@ }, "title": "Complete todos los campos requeridos" } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/fr.json b/homeassistant/components/geonetnz_quakes/.translations/fr.json index 0a6fb7936285..8c5791b0ed12 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/fr.json +++ b/homeassistant/components/geonetnz_quakes/.translations/fr.json @@ -11,7 +11,7 @@ }, "title": "Remplissez les d\u00e9tails de votre filtre." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/it.json b/homeassistant/components/geonetnz_quakes/.translations/it.json index 2b2cac02737d..31fbeb84f66e 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/it.json +++ b/homeassistant/components/geonetnz_quakes/.translations/it.json @@ -11,7 +11,7 @@ }, "title": "Inserisci i tuoi dettagli del filtro." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ko.json b/homeassistant/components/geonetnz_quakes/.translations/ko.json index 30c534b18e01..8d5cec07df73 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ko.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ko.json @@ -11,7 +11,7 @@ }, "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/lb.json b/homeassistant/components/geonetnz_quakes/.translations/lb.json index a4cbecc58185..f850c61bc992 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/lb.json +++ b/homeassistant/components/geonetnz_quakes/.translations/lb.json @@ -11,7 +11,7 @@ }, "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/nl.json b/homeassistant/components/geonetnz_quakes/.translations/nl.json index 4495dee078df..adfccab84c38 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/nl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/nl.json @@ -8,7 +8,7 @@ }, "title": "Vul uw filtergegevens in." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/no.json b/homeassistant/components/geonetnz_quakes/.translations/no.json index 82160a4295f3..e6381bc43762 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/no.json +++ b/homeassistant/components/geonetnz_quakes/.translations/no.json @@ -11,7 +11,7 @@ }, "title": "Fyll ut filterdetaljene." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/pl.json b/homeassistant/components/geonetnz_quakes/.translations/pl.json index b9763b61fccb..976c744e96bc 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pl.json @@ -11,7 +11,7 @@ }, "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json index 1dcf264b3f6d..10d5a7023f4c 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json @@ -8,7 +8,7 @@ }, "title": "Preencha os detalhes do filtro." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ru.json b/homeassistant/components/geonetnz_quakes/.translations/ru.json index 0b3d23bfa3b4..f516da66d62e 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ru.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ru.json @@ -11,7 +11,7 @@ }, "title": "GeoNet NZ Quakes" } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/sl.json b/homeassistant/components/geonetnz_quakes/.translations/sl.json index 03f265f2719d..3464e03e56c2 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sl.json @@ -11,7 +11,7 @@ }, "title": "Izpolnite podrobnosti filtra." } - }, - "title": "GeoNet NZ Potresi" - } + } + }, + "title": "GeoNet NZ Potresi" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/sv.json b/homeassistant/components/geonetnz_quakes/.translations/sv.json index 3e27c3408087..d32e17ce6a94 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sv.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sv.json @@ -8,7 +8,7 @@ }, "title": "Fyll i dina filterdetaljer." } - }, - "title": "GeoNet NZ Quakes" - } + } + }, + "title": "GeoNet NZ Quakes" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json index f46e74a35bce..900b97c3222f 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json +++ b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json @@ -11,7 +11,7 @@ }, "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } - }, - "title": "\u7d10\u897f\u862d GeoNet \u5730\u9707\u9810\u8b66" - } + } + }, + "title": "\u7d10\u897f\u862d GeoNet \u5730\u9707\u9810\u8b66" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/bg.json b/homeassistant/components/geonetnz_volcano/.translations/bg.json index f895d2829025..fcec44ea3a38 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/bg.json +++ b/homeassistant/components/geonetnz_volcano/.translations/bg.json @@ -10,7 +10,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0437\u0430 \u0444\u0438\u043b\u0442\u044a\u0440\u0430 \u0441\u0438." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ca.json b/homeassistant/components/geonetnz_volcano/.translations/ca.json index 6874256e5fe7..279248735974 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ca.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ca.json @@ -10,7 +10,7 @@ }, "title": "Introducci\u00f3 dels detalls del filtre." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/da.json b/homeassistant/components/geonetnz_volcano/.translations/da.json index a8c238a60b01..a779d8fbe050 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/da.json +++ b/homeassistant/components/geonetnz_volcano/.translations/da.json @@ -10,7 +10,7 @@ }, "title": "Udfyld dine filteroplysninger." } - }, - "title": "GeoNet NZ vulkan" - } + } + }, + "title": "GeoNet NZ vulkan" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/de.json b/homeassistant/components/geonetnz_volcano/.translations/de.json index 59396e3a440c..525bc38bd034 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/de.json +++ b/homeassistant/components/geonetnz_volcano/.translations/de.json @@ -10,7 +10,7 @@ }, "title": "F\u00fclle deine Filterangaben aus." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/en.json b/homeassistant/components/geonetnz_volcano/.translations/en.json index 1175597908e9..3afe70f570b3 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/en.json +++ b/homeassistant/components/geonetnz_volcano/.translations/en.json @@ -10,7 +10,7 @@ }, "title": "Fill in your filter details." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/es.json b/homeassistant/components/geonetnz_volcano/.translations/es.json index c6b92e830898..5af610a48a4c 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/es.json +++ b/homeassistant/components/geonetnz_volcano/.translations/es.json @@ -10,7 +10,7 @@ }, "title": "Complete los detalles de su filtro." } - }, - "title": "GeoNet NZ Volc\u00e1n" - } + } + }, + "title": "GeoNet NZ Volc\u00e1n" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/fr.json b/homeassistant/components/geonetnz_volcano/.translations/fr.json index c93ae906a466..1f984054311f 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/fr.json +++ b/homeassistant/components/geonetnz_volcano/.translations/fr.json @@ -10,7 +10,7 @@ }, "title": "Remplissez les d\u00e9tails de votre filtre." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/hu.json b/homeassistant/components/geonetnz_volcano/.translations/hu.json index e53a91bcb039..41a27d722044 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/hu.json +++ b/homeassistant/components/geonetnz_volcano/.translations/hu.json @@ -10,7 +10,7 @@ }, "title": "T\u00f6ltse ki a sz\u0171r\u0151 adatait." } - }, - "title": "GeoNet NZ vulk\u00e1n" - } + } + }, + "title": "GeoNet NZ vulk\u00e1n" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/it.json b/homeassistant/components/geonetnz_volcano/.translations/it.json index 85bfc7297ee2..1200bb174dff 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/it.json +++ b/homeassistant/components/geonetnz_volcano/.translations/it.json @@ -10,7 +10,7 @@ }, "title": "Inserisci i tuoi dettagli del filtro." } - }, - "title": "GeoNet NZ Vulcano" - } + } + }, + "title": "GeoNet NZ Vulcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ko.json b/homeassistant/components/geonetnz_volcano/.translations/ko.json index d19091e75e85..256b21f56c3d 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ko.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ko.json @@ -10,7 +10,7 @@ }, "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/lb.json b/homeassistant/components/geonetnz_volcano/.translations/lb.json index a7ad17e6bd57..dd420fc08f20 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/lb.json +++ b/homeassistant/components/geonetnz_volcano/.translations/lb.json @@ -10,7 +10,7 @@ }, "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } - }, - "title": "GeoNet NZ Vulkan" - } + } + }, + "title": "GeoNet NZ Vulkan" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/nl.json b/homeassistant/components/geonetnz_volcano/.translations/nl.json index 44d814b9db20..f2835c180362 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/nl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/nl.json @@ -10,7 +10,7 @@ }, "title": "Vul uw filtergegevens in." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/no.json b/homeassistant/components/geonetnz_volcano/.translations/no.json index d66e0eb6d7d8..64179ade0e16 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/no.json +++ b/homeassistant/components/geonetnz_volcano/.translations/no.json @@ -10,7 +10,7 @@ }, "title": "Fyll ut filterdetaljene." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/pl.json b/homeassistant/components/geonetnz_volcano/.translations/pl.json index c51a69356a10..e124e632cfc4 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/pl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/pl.json @@ -10,7 +10,7 @@ }, "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ro.json b/homeassistant/components/geonetnz_volcano/.translations/ro.json index 4c0cd317d48b..72de59dafdb4 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ro.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ro.json @@ -7,7 +7,7 @@ }, "title": "Completa\u021bi detaliile filtrului." } - }, - "title": "Vulcanul GeoNet NZ" - } + } + }, + "title": "Vulcanul GeoNet NZ" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ru.json b/homeassistant/components/geonetnz_volcano/.translations/ru.json index 6e7411f28b97..49fdfa21cbd1 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ru.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ru.json @@ -10,7 +10,7 @@ }, "title": "GeoNet NZ Volcano" } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/sl.json b/homeassistant/components/geonetnz_volcano/.translations/sl.json index e31f473c26f2..e143dd3302f1 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/sl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/sl.json @@ -10,7 +10,7 @@ }, "title": "Izpolnite podrobnosti filtra." } - }, - "title": "GeoNet NZ vulkan" - } + } + }, + "title": "GeoNet NZ vulkan" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/sv.json b/homeassistant/components/geonetnz_volcano/.translations/sv.json index 35e7e24c926a..8846d85233b4 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/sv.json +++ b/homeassistant/components/geonetnz_volcano/.translations/sv.json @@ -10,7 +10,7 @@ }, "title": "Fyll i dina filterdetaljer." } - }, - "title": "GeoNet NZ Volcano" - } + } + }, + "title": "GeoNet NZ Volcano" } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json b/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json index 0f74841fd7b1..2ecc8c3a7954 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json +++ b/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json @@ -10,7 +10,7 @@ }, "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } - }, - "title": "\u7d10\u897f\u862d GeoNet \u706b\u5c71\u9810\u8b66" - } + } + }, + "title": "\u7d10\u897f\u862d GeoNet \u706b\u5c71\u9810\u8b66" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ca.json b/homeassistant/components/gios/.translations/ca.json index dadd38c24ae0..3896bca38575 100644 --- a/homeassistant/components/gios/.translations/ca.json +++ b/homeassistant/components/gios/.translations/ca.json @@ -17,7 +17,7 @@ "description": "Integraci\u00f3 de mesura de qualitat de l\u2019aire GIO\u015a (Polish Chief Inspectorate Of Environmental Protection). Si necessites ajuda amb la configuraci\u00f3, fes un cop d'ull a: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/da.json b/homeassistant/components/gios/.translations/da.json index bd0e947f1dc1..ffdd320ed169 100644 --- a/homeassistant/components/gios/.translations/da.json +++ b/homeassistant/components/gios/.translations/da.json @@ -17,7 +17,7 @@ "description": "Ops\u00e6t GIO\u015a (polsk inspektorat for milj\u00f8beskyttelse) luftkvalitet-integration. Hvis du har brug for hj\u00e6lp med konfigurationen, kig her: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/de.json b/homeassistant/components/gios/.translations/de.json index 5fd36f7a9fb3..1caf8c0d41f7 100644 --- a/homeassistant/components/gios/.translations/de.json +++ b/homeassistant/components/gios/.translations/de.json @@ -17,7 +17,7 @@ "description": "Einrichtung von GIO\u015a (Polnische Hauptinspektion f\u00fcr Umweltschutz) Integration der Luftqualit\u00e4t. Wenn du Hilfe bei der Konfiguration ben\u00f6tigst, schaue hier: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polnische Hauptinspektion f\u00fcr Umweltschutz)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/en.json b/homeassistant/components/gios/.translations/en.json index 0a85aaa9d154..2a61daf25c27 100644 --- a/homeassistant/components/gios/.translations/en.json +++ b/homeassistant/components/gios/.translations/en.json @@ -17,7 +17,7 @@ "description": "Set up GIO\u015a (Polish Chief Inspectorate Of Environmental Protection) air quality integration. If you need help with the configuration have a look here: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "$1" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/es.json b/homeassistant/components/gios/.translations/es.json index fb9eead7d2cb..433f31856427 100644 --- a/homeassistant/components/gios/.translations/es.json +++ b/homeassistant/components/gios/.translations/es.json @@ -17,7 +17,7 @@ "description": "Configurar la integraci\u00f3n de la calidad del aire GIO\u015a (Inspecci\u00f3n Jefe de Protecci\u00f3n Ambiental de Polonia). Si necesita ayuda con la configuraci\u00f3n, eche un vistazo aqu\u00ed: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Inspecci\u00f3n Jefe de Protecci\u00f3n del Medio Ambiente de Polonia)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/fr.json b/homeassistant/components/gios/.translations/fr.json index 3e8704486591..6c9242872b11 100644 --- a/homeassistant/components/gios/.translations/fr.json +++ b/homeassistant/components/gios/.translations/fr.json @@ -17,7 +17,7 @@ "description": "Mettre en place l'int\u00e9gration de la qualit\u00e9 de l'air GIO\u015a (Inspection g\u00e9n\u00e9rale polonaise de la protection de l'environnement). Si vous avez besoin d'aide pour la configuration, regardez ici: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Inspection g\u00e9n\u00e9rale polonaise de la protection de l'environnement)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/hu.json b/homeassistant/components/gios/.translations/hu.json index 75fcb2088a5b..1ed039228213 100644 --- a/homeassistant/components/gios/.translations/hu.json +++ b/homeassistant/components/gios/.translations/hu.json @@ -17,7 +17,7 @@ "description": "A GIO\u015a (lengyel k\u00f6rnyezetv\u00e9delmi f\u0151fel\u00fcgyel\u0151) leveg\u0151min\u0151s\u00e9gi integr\u00e1ci\u00f3j\u00e1nak be\u00e1ll\u00edt\u00e1sa. Ha seg\u00edts\u00e9gre van sz\u00fcks\u00e9ged a konfigur\u00e1ci\u00f3val kapcsolatban, l\u00e1togass ide: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Lengyel K\u00f6rnyezetv\u00e9delmi F\u0151fel\u00fcgyel\u0151s\u00e9g)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/it.json b/homeassistant/components/gios/.translations/it.json index b3d1b9a71cf5..8780c8160f63 100644 --- a/homeassistant/components/gios/.translations/it.json +++ b/homeassistant/components/gios/.translations/it.json @@ -17,7 +17,7 @@ "description": "Impostare l'integrazione della qualit\u00e0 dell'aria GIO\u015a (Ispettorato capo polacco di protezione ambientale). Se hai bisogno di aiuto con la configurazione dai un'occhiata qui: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Ispettorato capo polacco di protezione ambientale)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ko.json b/homeassistant/components/gios/.translations/ko.json index cc338a82e161..f749fb21d8fa 100644 --- a/homeassistant/components/gios/.translations/ko.json +++ b/homeassistant/components/gios/.translations/ko.json @@ -17,7 +17,7 @@ "description": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a) \ub300\uae30\uc9c8 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4. \uad6c\uc131\uc5d0 \ub3c4\uc6c0\uc774 \ud544\uc694\ud55c \uacbd\uc6b0 https://www.home-assistant.io/integrations/gios \ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694", "title": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a)" } - }, - "title": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a)" - } + } + }, + "title": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a)" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/lb.json b/homeassistant/components/gios/.translations/lb.json index 3b23ba5eee5b..95043a6e9b42 100644 --- a/homeassistant/components/gios/.translations/lb.json +++ b/homeassistant/components/gios/.translations/lb.json @@ -17,7 +17,7 @@ "description": "GIO\u015a (Polnesch Chefinspektorat vum \u00cbmweltschutz) Loft Qualit\u00e9it Integratioun ariichten. Fir w\u00e9ider H\u00ebllef mat der Konfiuratioun kuckt hei: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polnesch Chefinspektorat vum \u00cbmweltschutz)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/nl.json b/homeassistant/components/gios/.translations/nl.json index eb4876818385..39ed17bcef90 100644 --- a/homeassistant/components/gios/.translations/nl.json +++ b/homeassistant/components/gios/.translations/nl.json @@ -17,7 +17,7 @@ "description": "GIO\u015a (Poolse hoofdinspectie van milieubescherming) luchtkwaliteitintegratie instellen. Als u hulp nodig hebt bij de configuratie, kijk dan hier: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Poolse hoofdinspectie van milieubescherming)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/no.json b/homeassistant/components/gios/.translations/no.json index 9842ae67a4bc..a633e68e798e 100644 --- a/homeassistant/components/gios/.translations/no.json +++ b/homeassistant/components/gios/.translations/no.json @@ -17,7 +17,7 @@ "description": "Sett opp GIO\u015a (Polish Chief Inspectorate Of Environmental Protection) luftkvalitet integrering. Hvis du trenger hjelp med konfigurasjonen ta en titt her: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/pl.json b/homeassistant/components/gios/.translations/pl.json index 677762c29306..eb8969254c91 100644 --- a/homeassistant/components/gios/.translations/pl.json +++ b/homeassistant/components/gios/.translations/pl.json @@ -17,7 +17,7 @@ "description": "Konfiguracja integracji jako\u015bci powietrza GIO\u015a (G\u0142\u00f3wny Inspektorat Ochrony \u015arodowiska). Je\u015bli potrzebujesz pomocy z konfiguracj\u0105, przejd\u017a na stron\u0119: https://www.home-assistant.io/integrations/gios", "title": "G\u0142\u00f3wny Inspektorat Ochrony \u015arodowiska (GIO\u015a)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ru.json b/homeassistant/components/gios/.translations/ru.json index 0045b08cec8b..936cb10ce2a9 100644 --- a/homeassistant/components/gios/.translations/ru.json +++ b/homeassistant/components/gios/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043e\u0442 \u041f\u043e\u043b\u044c\u0441\u043a\u043e\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u043f\u043e \u043e\u0445\u0440\u0430\u043d\u0435 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044b (GIO\u015a). \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438: https://www.home-assistant.io/integrations/gios.", "title": "GIO\u015a (\u041f\u043e\u043b\u044c\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u043e\u0445\u0440\u0430\u043d\u0435 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044b)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/sl.json b/homeassistant/components/gios/.translations/sl.json index 089435dee3ff..71e09774f09c 100644 --- a/homeassistant/components/gios/.translations/sl.json +++ b/homeassistant/components/gios/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Nastavite GIO\u015a (poljski glavni in\u0161pektorat za varstvo okolja) integracijo kakovosti zraka. \u010ce potrebujete pomo\u010d pri konfiguraciji si oglejte tukaj: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (glavni poljski in\u0161pektorat za varstvo okolja)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/sv.json b/homeassistant/components/gios/.translations/sv.json index b5a865b5ccd1..3adc8dc3b301 100644 --- a/homeassistant/components/gios/.translations/sv.json +++ b/homeassistant/components/gios/.translations/sv.json @@ -17,7 +17,7 @@ "description": "St\u00e4ll in luftkvalitetintegration f\u00f6r GIO\u015a (polsk chefinspektorat f\u00f6r milj\u00f6skydd). Om du beh\u00f6ver hj\u00e4lp med konfigurationen titta h\u00e4r: https://www.home-assistant.io/integrations/gios", "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/zh-Hant.json b/homeassistant/components/gios/.translations/zh-Hant.json index 3f10f2eb37bd..c3bb9b1b7b3c 100644 --- a/homeassistant/components/gios/.translations/zh-Hant.json +++ b/homeassistant/components/gios/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u8a2d\u5b9a GIO\u015a\uff08\u6ce2\u862d\u7e3d\u74b0\u5883\u4fdd\u8b77\u7763\u5bdf\u8655\uff09\u7a7a\u6c23\u54c1\u8cea\u6574\u5408\u3002\u5047\u5982\u9700\u8981\u5354\u52a9\uff0c\u8acb\u53c3\u8003\uff1ahttps://www.home-assistant.io/integrations/gios", "title": "GIO\u015a\uff08\u6ce2\u862d\u7e3d\u74b0\u5883\u4fdd\u8b77\u7763\u5bdf\u8655\uff09" } - }, - "title": "GIO\u015a" - } + } + }, + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/bg.json b/homeassistant/components/glances/.translations/bg.json index 8604dda565a3..c60247a6e5bd 100644 --- a/homeassistant/components/glances/.translations/bg.json +++ b/homeassistant/components/glances/.translations/bg.json @@ -21,8 +21,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438 \u0437\u0430 Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ca.json b/homeassistant/components/glances/.translations/ca.json index 2610fe156aab..3c8a87902cf2 100644 --- a/homeassistant/components/glances/.translations/ca.json +++ b/homeassistant/components/glances/.translations/ca.json @@ -21,8 +21,7 @@ }, "title": "Configuraci\u00f3 de Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Opcions de configuraci\u00f3 de Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/da.json b/homeassistant/components/glances/.translations/da.json index 7779c6e40a04..9bffbed2d917 100644 --- a/homeassistant/components/glances/.translations/da.json +++ b/homeassistant/components/glances/.translations/da.json @@ -21,8 +21,7 @@ }, "title": "Ops\u00e6tning af Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfigurationsindstillinger for Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/de.json b/homeassistant/components/glances/.translations/de.json index e652ccc966b9..efa2e69124a8 100644 --- a/homeassistant/components/glances/.translations/de.json +++ b/homeassistant/components/glances/.translations/de.json @@ -21,8 +21,7 @@ }, "title": "Glances einrichten" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfiguriere die Optionen f\u00fcr Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/en.json b/homeassistant/components/glances/.translations/en.json index ef1a8fb5e317..1b1099f509ad 100644 --- a/homeassistant/components/glances/.translations/en.json +++ b/homeassistant/components/glances/.translations/en.json @@ -21,8 +21,7 @@ }, "title": "Setup Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Configure options for Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/es.json b/homeassistant/components/glances/.translations/es.json index 5f69c1236b75..3eb56a46021d 100644 --- a/homeassistant/components/glances/.translations/es.json +++ b/homeassistant/components/glances/.translations/es.json @@ -21,8 +21,7 @@ }, "title": "Configurar Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Configurar opciones para Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/fr.json b/homeassistant/components/glances/.translations/fr.json index b65df092b32a..1fd25f69efc7 100644 --- a/homeassistant/components/glances/.translations/fr.json +++ b/homeassistant/components/glances/.translations/fr.json @@ -21,8 +21,7 @@ }, "title": "Installation de Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Configurer les options pour Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/hu.json b/homeassistant/components/glances/.translations/hu.json index 1d7c2ea40230..df493fca339b 100644 --- a/homeassistant/components/glances/.translations/hu.json +++ b/homeassistant/components/glances/.translations/hu.json @@ -21,8 +21,7 @@ }, "title": "Glances Be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "A Glances be\u00e1ll\u00edt\u00e1sainak konfigur\u00e1l\u00e1sa" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/it.json b/homeassistant/components/glances/.translations/it.json index 5fbfba547d9b..9c2197ba443c 100644 --- a/homeassistant/components/glances/.translations/it.json +++ b/homeassistant/components/glances/.translations/it.json @@ -21,8 +21,7 @@ }, "title": "Impostare Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Configura le opzioni per Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ko.json b/homeassistant/components/glances/.translations/ko.json index ad19b589d5de..37b580369da8 100644 --- a/homeassistant/components/glances/.translations/ko.json +++ b/homeassistant/components/glances/.translations/ko.json @@ -21,8 +21,7 @@ }, "title": "Glances \uc124\uce58" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Glances \uc635\uc158 \uad6c\uc131" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/lb.json b/homeassistant/components/glances/.translations/lb.json index 06723a4bd128..965a21b892e3 100644 --- a/homeassistant/components/glances/.translations/lb.json +++ b/homeassistant/components/glances/.translations/lb.json @@ -21,8 +21,7 @@ }, "title": "Usiichten konfigur\u00e9ieren" } - }, - "title": "Usiichten" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Optioune konfigur\u00e9ieren fir d'Usiichten" } } - } + }, + "title": "Usiichten" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/nl.json b/homeassistant/components/glances/.translations/nl.json index 7de81bfee98f..0ede723702b5 100644 --- a/homeassistant/components/glances/.translations/nl.json +++ b/homeassistant/components/glances/.translations/nl.json @@ -21,8 +21,7 @@ }, "title": "Glances instellen" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Configureer opties voor Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/nn.json b/homeassistant/components/glances/.translations/nn.json index 2c9acc227bd9..c392b228e895 100644 --- a/homeassistant/components/glances/.translations/nn.json +++ b/homeassistant/components/glances/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Glances" - } + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/no.json b/homeassistant/components/glances/.translations/no.json index b25241e34db3..5ba05b639e87 100644 --- a/homeassistant/components/glances/.translations/no.json +++ b/homeassistant/components/glances/.translations/no.json @@ -21,8 +21,7 @@ }, "title": "Oppsett av Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfigurasjonsalternativer for Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/pl.json b/homeassistant/components/glances/.translations/pl.json index f53d4d413e0a..41634ec4d23c 100644 --- a/homeassistant/components/glances/.translations/pl.json +++ b/homeassistant/components/glances/.translations/pl.json @@ -21,8 +21,7 @@ }, "title": "Konfiguracja Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfiguracja opcji dla Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ru.json b/homeassistant/components/glances/.translations/ru.json index 8effcc6ab163..648ab7824e9e 100644 --- a/homeassistant/components/glances/.translations/ru.json +++ b/homeassistant/components/glances/.translations/ru.json @@ -21,8 +21,7 @@ }, "title": "Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/sl.json b/homeassistant/components/glances/.translations/sl.json index b1d0fda94b5d..1dd99a1572d7 100644 --- a/homeassistant/components/glances/.translations/sl.json +++ b/homeassistant/components/glances/.translations/sl.json @@ -21,8 +21,7 @@ }, "title": "Nastavite Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfiguracija mo\u017enosti za Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/sv.json b/homeassistant/components/glances/.translations/sv.json index f4b95081a10b..6e77b8822115 100644 --- a/homeassistant/components/glances/.translations/sv.json +++ b/homeassistant/components/glances/.translations/sv.json @@ -21,8 +21,7 @@ }, "title": "St\u00e4ll in Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Konfigurera alternativ f\u00f6r Glances" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/zh-Hant.json b/homeassistant/components/glances/.translations/zh-Hant.json index 12ba7670355d..88286d428155 100644 --- a/homeassistant/components/glances/.translations/zh-Hant.json +++ b/homeassistant/components/glances/.translations/zh-Hant.json @@ -21,8 +21,7 @@ }, "title": "\u8a2d\u5b9a Glances" } - }, - "title": "Glances" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Glances \u8a2d\u5b9a\u9078\u9805" } } - } + }, + "title": "Glances" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/bg.json b/homeassistant/components/gpslogger/.translations/bg.json index f7ce9a67f548..5b714dcd6a4a 100644 --- a/homeassistant/components/gpslogger/.translations/bg.json +++ b/homeassistant/components/gpslogger/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 GPSLogger Webhook?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ca.json b/homeassistant/components/gpslogger/.translations/ca.json index 296159f2e5ae..9679e19fabf9 100644 --- a/homeassistant/components/gpslogger/.translations/ca.json +++ b/homeassistant/components/gpslogger/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar el Webhook de GPSLogger?", "title": "Configuraci\u00f3 del Webhook de GPSLogger" } - }, - "title": "Webhook de GPSLogger" - } + } + }, + "title": "Webhook de GPSLogger" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/cs.json b/homeassistant/components/gpslogger/.translations/cs.json index f79a9f5d739d..11a0eb5ce2e0 100644 --- a/homeassistant/components/gpslogger/.translations/cs.json +++ b/homeassistant/components/gpslogger/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit GPSLogger Webhook?", "title": "Nastavit GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/da.json b/homeassistant/components/gpslogger/.translations/da.json index b118783cd3c1..53d7bc89e898 100644 --- a/homeassistant/components/gpslogger/.translations/da.json +++ b/homeassistant/components/gpslogger/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere GPSLogger Webhook?", "title": "Konfigurer GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/de.json b/homeassistant/components/gpslogger/.translations/de.json index 840cbdf234fc..cebd8ffcd2c9 100644 --- a/homeassistant/components/gpslogger/.translations/de.json +++ b/homeassistant/components/gpslogger/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du den GPSLogger Webhook wirklich einrichten?", "title": "GPSLogger Webhook einrichten" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/en.json b/homeassistant/components/gpslogger/.translations/en.json index ad8f978bc592..ee7b32d70309 100644 --- a/homeassistant/components/gpslogger/.translations/en.json +++ b/homeassistant/components/gpslogger/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up the GPSLogger Webhook?", "title": "Set up the GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/es-419.json b/homeassistant/components/gpslogger/.translations/es-419.json index 960198eb04ef..fecd6608d4b6 100644 --- a/homeassistant/components/gpslogger/.translations/es-419.json +++ b/homeassistant/components/gpslogger/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1 seguro de que desea configurar el Webhook de GPSLogger?", "title": "Configurar el Webhook de GPSLogger" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/es.json b/homeassistant/components/gpslogger/.translations/es.json index 7b90a5c5caa2..e46aec179028 100644 --- a/homeassistant/components/gpslogger/.translations/es.json +++ b/homeassistant/components/gpslogger/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar el webhook de GPSLogger?", "title": "Configurar el webhook de GPSLogger" } - }, - "title": "Webhook de GPSLogger" - } + } + }, + "title": "Webhook de GPSLogger" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/fr.json b/homeassistant/components/gpslogger/.translations/fr.json index ae2b21777121..34cf0a4f9513 100644 --- a/homeassistant/components/gpslogger/.translations/fr.json +++ b/homeassistant/components/gpslogger/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer le Webhook GPSLogger ?", "title": "Configurer le Webhook GPSLogger" } - }, - "title": "Webhook GPSLogger" - } + } + }, + "title": "Webhook GPSLogger" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/hu.json b/homeassistant/components/gpslogger/.translations/hu.json index 2d1dcad21741..eb87d9de8a70 100644 --- a/homeassistant/components/gpslogger/.translations/hu.json +++ b/homeassistant/components/gpslogger/.translations/hu.json @@ -12,7 +12,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a GPSLogger Webhookot?", "title": "GPSLogger Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/it.json b/homeassistant/components/gpslogger/.translations/it.json index aab8edbe44a0..a293b4297fd1 100644 --- a/homeassistant/components/gpslogger/.translations/it.json +++ b/homeassistant/components/gpslogger/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare il webhook di GPSLogger?", "title": "Configura il webhook di GPSLogger" } - }, - "title": "Webhook di GPSLogger" - } + } + }, + "title": "Webhook di GPSLogger" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ko.json b/homeassistant/components/gpslogger/.translations/ko.json index 19bfc36e4242..72b2aaf868a0 100644 --- a/homeassistant/components/gpslogger/.translations/ko.json +++ b/homeassistant/components/gpslogger/.translations/ko.json @@ -12,7 +12,7 @@ "description": "GPSLogger Webhook \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "GPSLogger Webhook \uc124\uc815" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/lb.json b/homeassistant/components/gpslogger/.translations/lb.json index 78df911c8689..d0bcc4f61f4e 100644 --- a/homeassistant/components/gpslogger/.translations/lb.json +++ b/homeassistant/components/gpslogger/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir GPSLogger Webhook anzeriichten?", "title": "GPSLogger Webhook ariichten" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/nl.json b/homeassistant/components/gpslogger/.translations/nl.json index f34a21b78979..d47cedda6a60 100644 --- a/homeassistant/components/gpslogger/.translations/nl.json +++ b/homeassistant/components/gpslogger/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet je zeker dat je de GPSLogger Webhook wilt instellen?", "title": "Configureer de GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/no.json b/homeassistant/components/gpslogger/.translations/no.json index 488a09c37686..7e0d87fa3e18 100644 --- a/homeassistant/components/gpslogger/.translations/no.json +++ b/homeassistant/components/gpslogger/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp GPSLogger Webhook?", "title": "Sett opp GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pl.json b/homeassistant/components/gpslogger/.translations/pl.json index 434fdd2220a4..9ec47e600a02 100644 --- a/homeassistant/components/gpslogger/.translations/pl.json +++ b/homeassistant/components/gpslogger/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Geofency?", "title": "Konfiguracja Geofency Webhook" } - }, - "title": "Konfiguracja Geofency Webhook" - } + } + }, + "title": "Konfiguracja Geofency Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pt-BR.json b/homeassistant/components/gpslogger/.translations/pt-BR.json index 86c68a4cfb95..8bae8adaeebc 100644 --- a/homeassistant/components/gpslogger/.translations/pt-BR.json +++ b/homeassistant/components/gpslogger/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem a certeza que deseja configurar o GPSLogger Webhook?", "title": "Configurar o GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pt.json b/homeassistant/components/gpslogger/.translations/pt.json index 4dcfda527534..216ba66d20b7 100644 --- a/homeassistant/components/gpslogger/.translations/pt.json +++ b/homeassistant/components/gpslogger/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o GPSLogger Webhook?", "title": "Configurar o Geofency Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ru.json b/homeassistant/components/gpslogger/.translations/ru.json index b33bde95aec7..abf5f100fd70 100644 --- a/homeassistant/components/gpslogger/.translations/ru.json +++ b/homeassistant/components/gpslogger/.translations/ru.json @@ -12,7 +12,7 @@ "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 GPSLogger?", "title": "GPSLogger" } - }, - "title": "GPSLogger" - } + } + }, + "title": "GPSLogger" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/sl.json b/homeassistant/components/gpslogger/.translations/sl.json index 8e205bef437a..ad1a304dcfc0 100644 --- a/homeassistant/components/gpslogger/.translations/sl.json +++ b/homeassistant/components/gpslogger/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti GPSloggerWebhook?", "title": "Nastavite GPSlogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/sv.json b/homeassistant/components/gpslogger/.translations/sv.json index 3a927a70e61e..23b0e19c2aaf 100644 --- a/homeassistant/components/gpslogger/.translations/sv.json +++ b/homeassistant/components/gpslogger/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera GPSLogger Webhook?", "title": "Konfigurera GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/zh-Hans.json b/homeassistant/components/gpslogger/.translations/zh-Hans.json index f99efa91c619..147075c19f3b 100644 --- a/homeassistant/components/gpslogger/.translations/zh-Hans.json +++ b/homeassistant/components/gpslogger/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e GPSLogger Webhook \u5417\uff1f", "title": "\u8bbe\u7f6e GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/zh-Hant.json b/homeassistant/components/gpslogger/.translations/zh-Hant.json index c21e76a6eee2..80955fa9e324 100644 --- a/homeassistant/components/gpslogger/.translations/zh-Hant.json +++ b/homeassistant/components/gpslogger/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a GPSLogger Webhook\uff1f", "title": "\u8a2d\u5b9a GPSLogger Webhook" } - }, - "title": "GPSLogger Webhook" - } + } + }, + "title": "GPSLogger Webhook" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ca.json b/homeassistant/components/griddy/.translations/ca.json index 17c550636e12..929fcf408874 100644 --- a/homeassistant/components/griddy/.translations/ca.json +++ b/homeassistant/components/griddy/.translations/ca.json @@ -15,7 +15,7 @@ "description": "La teva zona de c\u00e0rrega (Load Zone) est\u00e0 al teu compte de Griddy v\u00e9s a \"Account > Meter > Load Zone\".", "title": "Configuraci\u00f3 de la zona de c\u00e0rrega (Load Zone) de Griddy" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/da.json b/homeassistant/components/griddy/.translations/da.json index 9bb36f00ba66..639633dc14c1 100644 --- a/homeassistant/components/griddy/.translations/da.json +++ b/homeassistant/components/griddy/.translations/da.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Griddy" - } + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/de.json b/homeassistant/components/griddy/.translations/de.json index f20126152671..1f77f9e77435 100644 --- a/homeassistant/components/griddy/.translations/de.json +++ b/homeassistant/components/griddy/.translations/de.json @@ -15,7 +15,7 @@ "description": "Ihre Ladezone befindet sich in Ihrem Griddy-Konto unter \"Konto > Messger\u00e4t > Ladezone\".", "title": "Richten Sie Ihre Griddy Ladezone ein" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/en.json b/homeassistant/components/griddy/.translations/en.json index 20b3fbe21eba..c5df2742338d 100644 --- a/homeassistant/components/griddy/.translations/en.json +++ b/homeassistant/components/griddy/.translations/en.json @@ -15,7 +15,7 @@ "description": "Your Load Zone is in your Griddy account under \u201cAccount > Meter > Load Zone.\u201d", "title": "Setup your Griddy Load Zone" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/es.json b/homeassistant/components/griddy/.translations/es.json index 891564ea4ece..ac6a232db3fe 100644 --- a/homeassistant/components/griddy/.translations/es.json +++ b/homeassistant/components/griddy/.translations/es.json @@ -15,7 +15,7 @@ "description": "Tu Zona de Carga est\u00e1 en tu cuenta de Griddy en \"Account > Meter > Load Zone\"", "title": "Configurar tu Zona de Carga de Griddy" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/fr.json b/homeassistant/components/griddy/.translations/fr.json index 1e0c8c3e9aed..5fa28a09e7c4 100644 --- a/homeassistant/components/griddy/.translations/fr.json +++ b/homeassistant/components/griddy/.translations/fr.json @@ -13,7 +13,7 @@ "loadzone": "Zone de charge (point d'\u00e9tablissement)" } } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/it.json b/homeassistant/components/griddy/.translations/it.json index 2aacd9a4bab8..a43e5f7ced54 100644 --- a/homeassistant/components/griddy/.translations/it.json +++ b/homeassistant/components/griddy/.translations/it.json @@ -15,7 +15,7 @@ "description": "La tua Zona di Carico si trova nel tuo account Griddy in \"Account > Meter > Load zone\".", "title": "Configurazione della Zona di Carico Griddy" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ko.json b/homeassistant/components/griddy/.translations/ko.json index cc86f0a1b457..0f00578a96e3 100644 --- a/homeassistant/components/griddy/.translations/ko.json +++ b/homeassistant/components/griddy/.translations/ko.json @@ -15,7 +15,7 @@ "description": "\uc804\ub825 \uacf5\uae09 \uc9c0\uc5ed\uc740 Griddy \uacc4\uc815\uc758 \"Account > Meter > Load Zone\"\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", "title": "Griddy \uc804\ub825 \uacf5\uae09 \uc9c0\uc5ed \uc124\uc815" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/lb.json b/homeassistant/components/griddy/.translations/lb.json index c0ee3bc7d5ad..67024c066351 100644 --- a/homeassistant/components/griddy/.translations/lb.json +++ b/homeassistant/components/griddy/.translations/lb.json @@ -15,7 +15,7 @@ "description": "Deng Lued Zon ass an dengem Griddy Kont enner \"Account > Meter > Load Zone.\"", "title": "Griddy Lued Zon ariichten" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/no.json b/homeassistant/components/griddy/.translations/no.json index b47fd213ae00..af4ae8a29003 100644 --- a/homeassistant/components/griddy/.translations/no.json +++ b/homeassistant/components/griddy/.translations/no.json @@ -15,7 +15,7 @@ "description": "Din Load Zone er p\u00e5 din Griddy-konto under \"Konto > M\u00e5ler > Lastesone.\"", "title": "Sett opp din Griddy Load Zone" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/pl.json b/homeassistant/components/griddy/.translations/pl.json index 57484e84d9fc..75f58fef9bb4 100644 --- a/homeassistant/components/griddy/.translations/pl.json +++ b/homeassistant/components/griddy/.translations/pl.json @@ -15,7 +15,7 @@ "description": "Twoja strefa obci\u0105\u017cenia znajduje si\u0119 na twoim koncie Griddy w sekcji \"Konto > Licznik > Strefa obci\u0105\u017cenia\".", "title": "Konfigurowanie strefy obci\u0105\u017cenia Griddy" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ru.json b/homeassistant/components/griddy/.translations/ru.json index 6f03fecd58af..2337638a89af 100644 --- a/homeassistant/components/griddy/.translations/ru.json +++ b/homeassistant/components/griddy/.translations/ru.json @@ -15,7 +15,7 @@ "description": "\u0417\u043e\u043d\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0412\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Griddy \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Account > Meter > Load Zone.", "title": "Griddy" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/sl.json b/homeassistant/components/griddy/.translations/sl.json index 1adbbe39f382..53b138535a13 100644 --- a/homeassistant/components/griddy/.translations/sl.json +++ b/homeassistant/components/griddy/.translations/sl.json @@ -15,7 +15,7 @@ "description": "Va\u0161a obremenitvena cona je v va\u0161em ra\u010dunu Griddy pod \"Ra\u010dun > Merilnik > Nalo\u017ei cono.\"", "title": "Nastavite svojo Griddy Load Cono" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/zh-Hant.json b/homeassistant/components/griddy/.translations/zh-Hant.json index d3918269d13d..06f55e3dcfcc 100644 --- a/homeassistant/components/griddy/.translations/zh-Hant.json +++ b/homeassistant/components/griddy/.translations/zh-Hant.json @@ -15,7 +15,7 @@ "description": "\u8ca0\u8f09\u5340\u57df\u986f\u793a\u65bc Griddy \u5e33\u865f\uff0c\u4f4d\u65bc \u201cAccount > Meter > Load Zone\u201d\u3002", "title": "\u8a2d\u5b9a Griddy \u8ca0\u8f09\u5340\u57df" } - }, - "title": "Griddy" - } + } + }, + "title": "Griddy" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/bg.json b/homeassistant/components/hangouts/.translations/bg.json index 10c1666074c0..c425e515f55c 100644 --- a/homeassistant/components/hangouts/.translations/bg.json +++ b/homeassistant/components/hangouts/.translations/bg.json @@ -24,7 +24,7 @@ }, "title": "\u0412\u0445\u043e\u0434 \u0432 Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ca.json b/homeassistant/components/hangouts/.translations/ca.json index 0dcc0f029c29..291e78095dc9 100644 --- a/homeassistant/components/hangouts/.translations/ca.json +++ b/homeassistant/components/hangouts/.translations/ca.json @@ -26,7 +26,7 @@ "description": "buit", "title": "Inici de sessi\u00f3 de Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/cs.json b/homeassistant/components/hangouts/.translations/cs.json index badd381f2bee..40972b3b93f7 100644 --- a/homeassistant/components/hangouts/.translations/cs.json +++ b/homeassistant/components/hangouts/.translations/cs.json @@ -23,7 +23,7 @@ }, "title": "P\u0159ihl\u00e1\u0161en\u00ed do slu\u017eby Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/da.json b/homeassistant/components/hangouts/.translations/da.json index 2ceb78ddde8c..928e9899dbcf 100644 --- a/homeassistant/components/hangouts/.translations/da.json +++ b/homeassistant/components/hangouts/.translations/da.json @@ -24,7 +24,7 @@ }, "title": "Google Hangouts login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/de.json b/homeassistant/components/hangouts/.translations/de.json index 4f48187b49b0..1688e3cb2622 100644 --- a/homeassistant/components/hangouts/.translations/de.json +++ b/homeassistant/components/hangouts/.translations/de.json @@ -26,7 +26,7 @@ "description": "Leer", "title": "Google Hangouts Login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/en.json b/homeassistant/components/hangouts/.translations/en.json index 31e5f9894f96..63d52f53b9c9 100644 --- a/homeassistant/components/hangouts/.translations/en.json +++ b/homeassistant/components/hangouts/.translations/en.json @@ -24,7 +24,7 @@ }, "title": "Google Hangouts Login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/es-419.json b/homeassistant/components/hangouts/.translations/es-419.json index 011060694a76..728a0d7ee62d 100644 --- a/homeassistant/components/hangouts/.translations/es-419.json +++ b/homeassistant/components/hangouts/.translations/es-419.json @@ -23,7 +23,7 @@ }, "title": "Inicio de sesi\u00f3n de Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/es.json b/homeassistant/components/hangouts/.translations/es.json index dfa463fb148a..dff492981669 100644 --- a/homeassistant/components/hangouts/.translations/es.json +++ b/homeassistant/components/hangouts/.translations/es.json @@ -26,7 +26,7 @@ "description": "Vac\u00edo", "title": "Iniciar sesi\u00f3n en Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/et.json b/homeassistant/components/hangouts/.translations/et.json index 4bd26876ac6a..87779947d9ea 100644 --- a/homeassistant/components/hangouts/.translations/et.json +++ b/homeassistant/components/hangouts/.translations/et.json @@ -16,7 +16,7 @@ "password": "Salas\u00f5na" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/fr.json b/homeassistant/components/hangouts/.translations/fr.json index 13142fee5137..11bf61616469 100644 --- a/homeassistant/components/hangouts/.translations/fr.json +++ b/homeassistant/components/hangouts/.translations/fr.json @@ -26,7 +26,7 @@ "description": "Vide", "title": "Connexion \u00e0 Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/he.json b/homeassistant/components/hangouts/.translations/he.json index 28326d97142b..485c453777a4 100644 --- a/homeassistant/components/hangouts/.translations/he.json +++ b/homeassistant/components/hangouts/.translations/he.json @@ -23,7 +23,7 @@ }, "title": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc- Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/hu.json b/homeassistant/components/hangouts/.translations/hu.json index f6e46e259852..55a48f1df1a0 100644 --- a/homeassistant/components/hangouts/.translations/hu.json +++ b/homeassistant/components/hangouts/.translations/hu.json @@ -25,7 +25,7 @@ "description": "\u00dcres", "title": "Google Hangouts Bejelentkez\u00e9s" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/id.json b/homeassistant/components/hangouts/.translations/id.json index 46a574bdf8a7..4f35153669e5 100644 --- a/homeassistant/components/hangouts/.translations/id.json +++ b/homeassistant/components/hangouts/.translations/id.json @@ -25,7 +25,7 @@ "description": "Kosong", "title": "Google Hangouts Login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/it.json b/homeassistant/components/hangouts/.translations/it.json index ff0a8238d49c..03bcb57aae5a 100644 --- a/homeassistant/components/hangouts/.translations/it.json +++ b/homeassistant/components/hangouts/.translations/it.json @@ -26,7 +26,7 @@ "description": "Vuoto", "title": "Accesso a Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ko.json b/homeassistant/components/hangouts/.translations/ko.json index 385fc128b3b7..73fb9b3722aa 100644 --- a/homeassistant/components/hangouts/.translations/ko.json +++ b/homeassistant/components/hangouts/.translations/ko.json @@ -26,7 +26,7 @@ "description": "\uc8c4\uc1a1\ud569\ub2c8\ub2e4. \uad00\ub828 \ub0b4\uc6a9\uc774 \uc544\uc9c1 \uc5c5\ub370\uc774\ud2b8 \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ucd94\ud6c4\uc5d0 \ubc18\uc601\ub420 \uc608\uc815\uc774\ub2c8 \uc870\uae08\ub9cc \uae30\ub2e4\ub824\uc8fc\uc138\uc694.", "title": "Google \ud589\uc544\uc6c3 \ub85c\uadf8\uc778" } - }, - "title": "Google \ud589\uc544\uc6c3" - } + } + }, + "title": "Google \ud589\uc544\uc6c3" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/lb.json b/homeassistant/components/hangouts/.translations/lb.json index c22b02fd7ed3..6a28fe831c18 100644 --- a/homeassistant/components/hangouts/.translations/lb.json +++ b/homeassistant/components/hangouts/.translations/lb.json @@ -26,7 +26,7 @@ "description": "Eidel", "title": "Google Hangouts Login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/nl.json b/homeassistant/components/hangouts/.translations/nl.json index 9f9b121a7c2a..5133b66cd1ad 100644 --- a/homeassistant/components/hangouts/.translations/nl.json +++ b/homeassistant/components/hangouts/.translations/nl.json @@ -26,7 +26,7 @@ "description": "Leeg", "title": "Google Hangouts inlog" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/nn.json b/homeassistant/components/hangouts/.translations/nn.json index c8a5fb4481b8..2103b6c38a09 100644 --- a/homeassistant/components/hangouts/.translations/nn.json +++ b/homeassistant/components/hangouts/.translations/nn.json @@ -23,7 +23,7 @@ }, "title": "Google Hangouts Login" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/no.json b/homeassistant/components/hangouts/.translations/no.json index ab061ee1a807..f0350e810168 100644 --- a/homeassistant/components/hangouts/.translations/no.json +++ b/homeassistant/components/hangouts/.translations/no.json @@ -26,7 +26,7 @@ "description": "Tom", "title": "Google Hangouts p\u00e5logging" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pl.json b/homeassistant/components/hangouts/.translations/pl.json index 1d08296007ab..0c685c3020e7 100644 --- a/homeassistant/components/hangouts/.translations/pl.json +++ b/homeassistant/components/hangouts/.translations/pl.json @@ -26,7 +26,7 @@ "description": "Pusty", "title": "Logowanie do Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pt-BR.json b/homeassistant/components/hangouts/.translations/pt-BR.json index 553360d8da67..bc4e518b1f38 100644 --- a/homeassistant/components/hangouts/.translations/pt-BR.json +++ b/homeassistant/components/hangouts/.translations/pt-BR.json @@ -26,7 +26,7 @@ "description": "Vazio", "title": "Login do Hangouts do Google" } - }, - "title": "Hangouts do Google" - } + } + }, + "title": "Hangouts do Google" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pt.json b/homeassistant/components/hangouts/.translations/pt.json index a16c60128c1b..442c5736c16a 100644 --- a/homeassistant/components/hangouts/.translations/pt.json +++ b/homeassistant/components/hangouts/.translations/pt.json @@ -25,7 +25,7 @@ "description": "Vazio", "title": "Login Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ro.json b/homeassistant/components/hangouts/.translations/ro.json index d1c3ed767cef..715937b678e3 100644 --- a/homeassistant/components/hangouts/.translations/ro.json +++ b/homeassistant/components/hangouts/.translations/ro.json @@ -22,7 +22,7 @@ "description": "Gol", "title": "Conectare Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ru.json b/homeassistant/components/hangouts/.translations/ru.json index 5bb98effb9f7..c247654c7eec 100644 --- a/homeassistant/components/hangouts/.translations/ru.json +++ b/homeassistant/components/hangouts/.translations/ru.json @@ -26,7 +26,7 @@ "description": "\u043f\u0443\u0441\u0442\u043e", "title": "Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/sl.json b/homeassistant/components/hangouts/.translations/sl.json index 64ca6da10acd..7161f3b5d445 100644 --- a/homeassistant/components/hangouts/.translations/sl.json +++ b/homeassistant/components/hangouts/.translations/sl.json @@ -26,7 +26,7 @@ "description": "prazno", "title": "Prijava za Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/sv.json b/homeassistant/components/hangouts/.translations/sv.json index 993a191ef89a..be4faf69a43a 100644 --- a/homeassistant/components/hangouts/.translations/sv.json +++ b/homeassistant/components/hangouts/.translations/sv.json @@ -26,7 +26,7 @@ "description": "Missing english translation", "title": "Google Hangouts-inloggning" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/zh-Hans.json b/homeassistant/components/hangouts/.translations/zh-Hans.json index d4e6e360c23b..ffb8ae30d3d3 100644 --- a/homeassistant/components/hangouts/.translations/zh-Hans.json +++ b/homeassistant/components/hangouts/.translations/zh-Hans.json @@ -25,7 +25,7 @@ "description": "\u65e0", "title": "\u767b\u5f55 Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/zh-Hant.json b/homeassistant/components/hangouts/.translations/zh-Hant.json index 5c2fd47068d5..1cac51a8393d 100644 --- a/homeassistant/components/hangouts/.translations/zh-Hant.json +++ b/homeassistant/components/hangouts/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u7a7a\u767d", "title": "\u767b\u5165 Google Hangouts" } - }, - "title": "Google Hangouts" - } + } + }, + "title": "Google Hangouts" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ca.json b/homeassistant/components/harmony/.translations/ca.json index f4e77752936d..3a00a7b36adb 100644 --- a/homeassistant/components/harmony/.translations/ca.json +++ b/homeassistant/components/harmony/.translations/ca.json @@ -20,8 +20,7 @@ }, "title": "Configuraci\u00f3 de Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Ajusta les opcions de Harmony Hub" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/de.json b/homeassistant/components/harmony/.translations/de.json index 70a5c8707ce5..a879b74fd801 100644 --- a/homeassistant/components/harmony/.translations/de.json +++ b/homeassistant/components/harmony/.translations/de.json @@ -20,8 +20,7 @@ }, "title": "Richten Sie den Logitech Harmony Hub ein" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Passen Sie die Harmony Hub-Optionen an" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/en.json b/homeassistant/components/harmony/.translations/en.json index 00054dbc51e7..b35ebcd587b0 100644 --- a/homeassistant/components/harmony/.translations/en.json +++ b/homeassistant/components/harmony/.translations/en.json @@ -20,8 +20,7 @@ }, "title": "Setup Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Adjust Harmony Hub Options" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/es.json b/homeassistant/components/harmony/.translations/es.json index 8d10e63c6092..7d0691169c54 100644 --- a/homeassistant/components/harmony/.translations/es.json +++ b/homeassistant/components/harmony/.translations/es.json @@ -20,8 +20,7 @@ }, "title": "Configurar Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Ajustar las opciones de Harmony Hub" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/fr.json b/homeassistant/components/harmony/.translations/fr.json index 60848bea459f..3021d70024a8 100644 --- a/homeassistant/components/harmony/.translations/fr.json +++ b/homeassistant/components/harmony/.translations/fr.json @@ -20,8 +20,7 @@ }, "title": "Configuration de Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Ajuster les options du hub Harmony" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/it.json b/homeassistant/components/harmony/.translations/it.json index 4b88151f3d6f..ff079e03122a 100644 --- a/homeassistant/components/harmony/.translations/it.json +++ b/homeassistant/components/harmony/.translations/it.json @@ -20,8 +20,7 @@ }, "title": "Configurare Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Regolare le opzioni di Harmony Hub" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ko.json b/homeassistant/components/harmony/.translations/ko.json index 392c06390aa7..ac628f7b012f 100644 --- a/homeassistant/components/harmony/.translations/ko.json +++ b/homeassistant/components/harmony/.translations/ko.json @@ -20,8 +20,7 @@ }, "title": "Logitech Harmony Hub \uc124\uc815" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Harmony Hub \uc635\uc158 \uc870\uc815" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/lb.json b/homeassistant/components/harmony/.translations/lb.json index 6cd2ab7d7bf1..25ce58b97f56 100644 --- a/homeassistant/components/harmony/.translations/lb.json +++ b/homeassistant/components/harmony/.translations/lb.json @@ -20,8 +20,7 @@ }, "title": "Logitech Harmony Hub ariichten" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Harmony Hub Optioune ajust\u00e9ieren" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/no.json b/homeassistant/components/harmony/.translations/no.json index 4dd86965bfd8..7db4f98d7b33 100644 --- a/homeassistant/components/harmony/.translations/no.json +++ b/homeassistant/components/harmony/.translations/no.json @@ -20,8 +20,7 @@ }, "title": "Oppsett Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Juster alternativene for harmonihub" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/pl.json b/homeassistant/components/harmony/.translations/pl.json index e5ace2e0d1d7..7d7d3688e6fd 100644 --- a/homeassistant/components/harmony/.translations/pl.json +++ b/homeassistant/components/harmony/.translations/pl.json @@ -20,8 +20,7 @@ }, "title": "Konfiguracja Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Dostosuj opcje huba Harmony" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ru.json b/homeassistant/components/harmony/.translations/ru.json index b89296616b33..a7009c5ebc62 100644 --- a/homeassistant/components/harmony/.translations/ru.json +++ b/homeassistant/components/harmony/.translations/ru.json @@ -20,8 +20,7 @@ }, "title": "Logitech Harmony Hub" } - }, - "title": "Logitech Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Harmony Hub" } } - } + }, + "title": "Logitech Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/zh-Hant.json b/homeassistant/components/harmony/.translations/zh-Hant.json index 70be5180572d..826e7288badc 100644 --- a/homeassistant/components/harmony/.translations/zh-Hant.json +++ b/homeassistant/components/harmony/.translations/zh-Hant.json @@ -20,8 +20,7 @@ }, "title": "\u8a2d\u5b9a\u7f85\u6280 Harmony Hub" } - }, - "title": "\u7f85\u6280 Harmony Hub" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\u8abf\u6574 Harmony Hub \u9078\u9805" } } - } + }, + "title": "\u7f85\u6280 Harmony Hub" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/bg.json b/homeassistant/components/heos/.translations/bg.json index dea7dd9bb24c..48efffbb7ee9 100644 --- a/homeassistant/components/heos/.translations/bg.json +++ b/homeassistant/components/heos/.translations/bg.json @@ -15,7 +15,7 @@ "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0430 \u0438\u043b\u0438 IP \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430 Heos \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u0437\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u043d\u0435 \u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u0442\u043e \u0434\u0430 \u0435 \u0441\u0432\u044a\u0440\u0437\u0430\u043d\u043e \u0441 \u043a\u0430\u0431\u0435\u043b \u043a\u044a\u043c \u043c\u0440\u0435\u0436\u0430\u0442\u0430).", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ca.json b/homeassistant/components/heos/.translations/ca.json index 0987e11430b6..eb90c5ea04c9 100644 --- a/homeassistant/components/heos/.translations/ca.json +++ b/homeassistant/components/heos/.translations/ca.json @@ -15,7 +15,7 @@ "description": "Introdueix el nom de l'amfitri\u00f3 o l'adre\u00e7a IP d'un dispositiu Heos (preferiblement un connectat a la xarxa per cable).", "title": "Connexi\u00f3 amb Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/cs.json b/homeassistant/components/heos/.translations/cs.json index fac6458c5b8a..f77038cb8b6c 100644 --- a/homeassistant/components/heos/.translations/cs.json +++ b/homeassistant/components/heos/.translations/cs.json @@ -1,5 +1,3 @@ { - "config": { - "title": "HEOS" - } + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/da.json b/homeassistant/components/heos/.translations/da.json index f2d9441e48a9..5d742100cfc8 100644 --- a/homeassistant/components/heos/.translations/da.json +++ b/homeassistant/components/heos/.translations/da.json @@ -15,7 +15,7 @@ "description": "Indtast v\u00e6rtsnavnet eller IP-adressen p\u00e5 en Heos-enhed (helst en tilsluttet via ledning til netv\u00e6rket).", "title": "Opret forbindelse til HEOS" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/de.json b/homeassistant/components/heos/.translations/de.json index e98df7466ff6..5358c3565238 100644 --- a/homeassistant/components/heos/.translations/de.json +++ b/homeassistant/components/heos/.translations/de.json @@ -15,7 +15,7 @@ "description": "Bitte gib den Hostnamen oder die IP-Adresse eines Heos-Ger\u00e4ts ein (vorzugsweise eines, das per Kabel mit dem Netzwerk verbunden ist).", "title": "Mit Heos verbinden" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/en.json b/homeassistant/components/heos/.translations/en.json index 6d4d83192c75..c5b98770d620 100644 --- a/homeassistant/components/heos/.translations/en.json +++ b/homeassistant/components/heos/.translations/en.json @@ -15,7 +15,7 @@ "description": "Please enter the host name or IP address of a Heos device (preferably one connected via wire to the network).", "title": "Connect to Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/es-419.json b/homeassistant/components/heos/.translations/es-419.json index b0d1d7dc3fb9..1c48ceea5ff3 100644 --- a/homeassistant/components/heos/.translations/es-419.json +++ b/homeassistant/components/heos/.translations/es-419.json @@ -11,7 +11,7 @@ "description": "Ingrese el nombre de host o la direcci\u00f3n IP de un dispositivo Heos (preferiblemente uno conectado por cable a la red).", "title": "Con\u00e9ctate a Heos" } - }, - "title": "Heos" - } + } + }, + "title": "Heos" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/es.json b/homeassistant/components/heos/.translations/es.json index da5d5e0ab89e..6523d44639fd 100644 --- a/homeassistant/components/heos/.translations/es.json +++ b/homeassistant/components/heos/.translations/es.json @@ -15,7 +15,7 @@ "description": "Introduce el nombre de host o direcci\u00f3n IP de un dispositivo Heos (preferiblemente conectado por cable a la red).", "title": "Conectar a Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/fr.json b/homeassistant/components/heos/.translations/fr.json index 549cd00e8e0c..29afed9c438c 100644 --- a/homeassistant/components/heos/.translations/fr.json +++ b/homeassistant/components/heos/.translations/fr.json @@ -15,7 +15,7 @@ "description": "Veuillez saisir le nom d\u2019h\u00f4te ou l\u2019adresse IP d\u2019un p\u00e9riph\u00e9rique Heos (de pr\u00e9f\u00e9rence connect\u00e9 au r\u00e9seau filaire).", "title": "Se connecter \u00e0 Heos" } - }, - "title": "Heos" - } + } + }, + "title": "Heos" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/hu.json b/homeassistant/components/heos/.translations/hu.json index 20ae78ae3161..645c09105b8e 100644 --- a/homeassistant/components/heos/.translations/hu.json +++ b/homeassistant/components/heos/.translations/hu.json @@ -7,7 +7,7 @@ "host": "Kiszolg\u00e1l\u00f3" } } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/it.json b/homeassistant/components/heos/.translations/it.json index 824f7c3fb50d..7f6b8b976662 100644 --- a/homeassistant/components/heos/.translations/it.json +++ b/homeassistant/components/heos/.translations/it.json @@ -15,7 +15,7 @@ "description": "Inserire il nome host o l'indirizzo IP di un dispositivo Heos (preferibilmente uno connesso alla rete tramite cavo).", "title": "Connetti a Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ko.json b/homeassistant/components/heos/.translations/ko.json index e1cecbe35d93..c8c356e4a910 100644 --- a/homeassistant/components/heos/.translations/ko.json +++ b/homeassistant/components/heos/.translations/ko.json @@ -15,7 +15,7 @@ "description": "Heos \uae30\uae30\uc758 \ud638\uc2a4\ud2b8 \uc774\ub984 \ub610\ub294 IP \uc8fc\uc18c\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694. (\uc720\uc120 \ub124\ud2b8\uc6cc\ud06c\ub85c \uc5f0\uacb0\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4)", "title": "Heos \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/lb.json b/homeassistant/components/heos/.translations/lb.json index cfe1d347b0cc..7b1040ba5d88 100644 --- a/homeassistant/components/heos/.translations/lb.json +++ b/homeassistant/components/heos/.translations/lb.json @@ -15,7 +15,7 @@ "description": "Gitt den Numm oder IP-Adress vun engem Heos-Apparat an (am beschten iwwer Kabel mam Reseau verbonnen).", "title": "Mat Heos verbannen" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/nl.json b/homeassistant/components/heos/.translations/nl.json index 3e7105e8cb35..c7a55288057a 100644 --- a/homeassistant/components/heos/.translations/nl.json +++ b/homeassistant/components/heos/.translations/nl.json @@ -15,7 +15,7 @@ "description": "Voer de hostnaam of het IP-adres van een Heos-apparaat in (bij voorkeur een die via een kabel is verbonden met het netwerk).", "title": "Verbinding maken met Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/nn.json b/homeassistant/components/heos/.translations/nn.json index ec2dc2945001..24ea5ce4f588 100644 --- a/homeassistant/components/heos/.translations/nn.json +++ b/homeassistant/components/heos/.translations/nn.json @@ -6,7 +6,7 @@ "access_token": "Vert" } } - }, - "title": "Heos" - } + } + }, + "title": "Heos" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/no.json b/homeassistant/components/heos/.translations/no.json index b54b55209436..0c070f322a3d 100644 --- a/homeassistant/components/heos/.translations/no.json +++ b/homeassistant/components/heos/.translations/no.json @@ -15,7 +15,7 @@ "description": "Vennligst skriv inn vertsnavnet eller IP-adressen til en Heos-enhet (helst en tilkoblet via kabel til nettverket).", "title": "Koble til Heos" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pl.json b/homeassistant/components/heos/.translations/pl.json index e494a6b34df9..4a51f5537264 100644 --- a/homeassistant/components/heos/.translations/pl.json +++ b/homeassistant/components/heos/.translations/pl.json @@ -15,7 +15,7 @@ "description": "Wprowad\u017a nazw\u0119 hosta lub adres IP urz\u0105dzenia Heos (najlepiej pod\u0142\u0105czonego przewodowo do sieci).", "title": "Po\u0142\u0105czenie z Heos" } - }, - "title": "Heos" - } + } + }, + "title": "Heos" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pt-BR.json b/homeassistant/components/heos/.translations/pt-BR.json index 5bcd39efd20a..1140ad1ed8f0 100644 --- a/homeassistant/components/heos/.translations/pt-BR.json +++ b/homeassistant/components/heos/.translations/pt-BR.json @@ -15,7 +15,7 @@ "description": "Por favor, digite o nome do host ou o endere\u00e7o IP de um dispositivo Heos (de prefer\u00eancia para conex\u00f5es conectadas por cabo \u00e0 sua rede).", "title": "Conecte-se a Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pt.json b/homeassistant/components/heos/.translations/pt.json index 099d1978436a..19dde27a164d 100644 --- a/homeassistant/components/heos/.translations/pt.json +++ b/homeassistant/components/heos/.translations/pt.json @@ -7,7 +7,7 @@ "host": "Servidor" } } - }, - "title": "Heos" - } + } + }, + "title": "Heos" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ru.json b/homeassistant/components/heos/.translations/ru.json index 8aacc8e165dd..c5f01b155474 100644 --- a/homeassistant/components/heos/.translations/ru.json +++ b/homeassistant/components/heos/.translations/ru.json @@ -15,7 +15,7 @@ "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 HEOS (\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0431\u0435\u043b\u044c).", "title": "HEOS" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/sl.json b/homeassistant/components/heos/.translations/sl.json index 2978d2bbbe6f..574c9f767e8d 100644 --- a/homeassistant/components/heos/.translations/sl.json +++ b/homeassistant/components/heos/.translations/sl.json @@ -15,7 +15,7 @@ "description": "Vnesite ime gostitelja ali naslov IP naprave Heos (po mo\u017enosti eno, ki je z omre\u017ejem povezana \u017ei\u010dno).", "title": "Pove\u017eite se z Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/sv.json b/homeassistant/components/heos/.translations/sv.json index 96d4991a5b85..c0cae40420e7 100644 --- a/homeassistant/components/heos/.translations/sv.json +++ b/homeassistant/components/heos/.translations/sv.json @@ -15,7 +15,7 @@ "description": "Ange v\u00e4rdnamnet eller IP-adressen f\u00f6r en Heos-enhet (helst en ansluten via kabel till n\u00e4tverket).", "title": "Anslut till Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/zh-Hant.json b/homeassistant/components/heos/.translations/zh-Hant.json index 9efacaf163f9..4eec6bc14818 100644 --- a/homeassistant/components/heos/.translations/zh-Hant.json +++ b/homeassistant/components/heos/.translations/zh-Hant.json @@ -15,7 +15,7 @@ "description": "\u8acb\u8f38\u5165\u4e3b\u6a5f\u6bb5\u540d\u7a31\u6216 Heos \u8a2d\u5099 IP \u4f4d\u5740\uff08\u5df2\u900f\u904e\u6709\u7dda\u7db2\u8def\u9023\u7dda\uff09\u3002", "title": "\u9023\u7dda\u81f3 Heos" } - }, - "title": "HEOS" - } + } + }, + "title": "HEOS" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/bg.json b/homeassistant/components/hisense_aehw4a1/.translations/bg.json index c758e9cc20d7..c3c273c777d8 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/bg.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ca.json b/homeassistant/components/hisense_aehw4a1/.translations/ca.json index 7b237aecdab4..c452b53bef9f 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ca.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar AEH-W4A1 de Hisense?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/da.json b/homeassistant/components/hisense_aehw4a1/.translations/da.json index 3d479543231e..94aebf87021d 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/da.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/de.json b/homeassistant/components/hisense_aehw4a1/.translations/de.json index 322c7e2f4c6a..70d07ba36fcd 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/de.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du Hisense AEH-W4A1 einrichten?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/en.json b/homeassistant/components/hisense_aehw4a1/.translations/en.json index b70fc8f05ecd..71b5505ebd2a 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/en.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/es.json b/homeassistant/components/hisense_aehw4a1/.translations/es.json index 69f071bf5d89..ed7dca2f487e 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/es.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/fr.json b/homeassistant/components/hisense_aehw4a1/.translations/fr.json index 50c753538c78..1683d00b4309 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/fr.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/hu.json b/homeassistant/components/hisense_aehw4a1/.translations/hu.json index 02716a96a739..963c23e40626 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/hu.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Hisense AEH-W4A1-et?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/it.json b/homeassistant/components/hisense_aehw4a1/.translations/it.json index b584d18e8bf1..2470fc975dac 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/it.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/it.json @@ -9,7 +9,7 @@ "description": "Voui configurare Hisense AEH-W4A1", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ko.json b/homeassistant/components/hisense_aehw4a1/.translations/ko.json index 6d8b6b4b44ce..c734a9ccfe0e 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ko.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ko.json @@ -9,7 +9,7 @@ "description": "Hisense AEH-W4A1 \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/lb.json b/homeassistant/components/hisense_aehw4a1/.translations/lb.json index 33b933483001..49f910154c41 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/lb.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll Hisense AEH-W4A1 konfigur\u00e9iert ginn?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/nl.json b/homeassistant/components/hisense_aehw4a1/.translations/nl.json index 7360908a11d4..7e320fbe9f8f 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/nl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u Hisense AEH-W4A1 instellen?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/no.json b/homeassistant/components/hisense_aehw4a1/.translations/no.json index e44e818ea607..d672f73d77a7 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/no.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/no.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/pl.json b/homeassistant/components/hisense_aehw4a1/.translations/pl.json index e0ab5cddbda9..45dfbbf8bfd1 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/pl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Chcesz skonfigurowa\u0107 AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ru.json b/homeassistant/components/hisense_aehw4a1/.translations/ru.json index c65a5277f62c..6fb23ac800c1 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ru.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ru.json @@ -9,7 +9,7 @@ "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 Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/sl.json b/homeassistant/components/hisense_aehw4a1/.translations/sl.json index 3c15eecf6e18..4254aa260be1 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/sl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/sv.json b/homeassistant/components/hisense_aehw4a1/.translations/sv.json index 6ec35452e8b3..c650796f23ff 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/sv.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera Hisense AEH-W4A1?", "title": "Hisense AEH-W4A1" } - }, - "title": "Hisense AEH-W4A1" - } + } + }, + "title": "Hisense AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json b/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json index d4f87905da94..912d3e4b7b4b 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a\u6d77\u4fe1 AEH-W4A1\uff1f", "title": "\u6d77\u4fe1 AEH-W4A1" } - }, - "title": "\u6d77\u4fe1 AEH-W4A1" - } + } + }, + "title": "\u6d77\u4fe1 AEH-W4A1" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/bg.json b/homeassistant/components/homekit_controller/.translations/bg.json index b1909ca2ec00..bca0eeec380e 100644 --- a/homeassistant/components/homekit_controller/.translations/bg.json +++ b/homeassistant/components/homekit_controller/.translations/bg.json @@ -34,7 +34,7 @@ "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u0442\u043e, \u0441 \u043a\u043e\u0435\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0436\u0435\u0442\u0435", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 HomeKit \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e" } - }, - "title": "HomeKit \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e" - } + } + }, + "title": "HomeKit \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/ca.json b/homeassistant/components/homekit_controller/.translations/ca.json index 1d2331870e1b..db174f049b89 100644 --- a/homeassistant/components/homekit_controller/.translations/ca.json +++ b/homeassistant/components/homekit_controller/.translations/ca.json @@ -34,7 +34,7 @@ "description": "Selecciona el dispositiu amb el qual et vols vincular", "title": "Vinculaci\u00f3 amb un accessori HomeKit" } - }, - "title": "Accessori HomeKit" - } + } + }, + "title": "Accessori HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/cy.json b/homeassistant/components/homekit_controller/.translations/cy.json index 59e402080f3f..eb4a68c902af 100644 --- a/homeassistant/components/homekit_controller/.translations/cy.json +++ b/homeassistant/components/homekit_controller/.translations/cy.json @@ -25,7 +25,7 @@ "description": "Dewiswch y ddyfais rydych eisiau paru efo", "title": "Paru gyda ategolyn HomeKit" } - }, - "title": "Ategolyn HomeKit" - } + } + }, + "title": "Ategolyn HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/da.json b/homeassistant/components/homekit_controller/.translations/da.json index 20b209752eb8..4794b5acc448 100644 --- a/homeassistant/components/homekit_controller/.translations/da.json +++ b/homeassistant/components/homekit_controller/.translations/da.json @@ -34,7 +34,7 @@ "description": "V\u00e6lg den enhed du vil parre med", "title": "Par med HomeKit-tilbeh\u00f8r" } - }, - "title": "HomeKit-tilbeh\u00f8r" - } + } + }, + "title": "HomeKit-tilbeh\u00f8r" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/de.json b/homeassistant/components/homekit_controller/.translations/de.json index 8223616f11e2..9d69030da7b6 100644 --- a/homeassistant/components/homekit_controller/.translations/de.json +++ b/homeassistant/components/homekit_controller/.translations/de.json @@ -34,7 +34,7 @@ "description": "W\u00e4hle das Ger\u00e4t aus, mit dem du die Kopplung herstellen m\u00f6chtest", "title": "Mit HomeKit Zubeh\u00f6r koppeln" } - }, - "title": "HomeKit Zubeh\u00f6r" - } + } + }, + "title": "HomeKit Zubeh\u00f6r" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/en.json b/homeassistant/components/homekit_controller/.translations/en.json index eb994289a628..8cfd35b6c609 100644 --- a/homeassistant/components/homekit_controller/.translations/en.json +++ b/homeassistant/components/homekit_controller/.translations/en.json @@ -34,7 +34,7 @@ "description": "Select the device you want to pair with", "title": "Pair with HomeKit Accessory" } - }, - "title": "HomeKit Accessory" - } + } + }, + "title": "HomeKit Accessory" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/es-419.json b/homeassistant/components/homekit_controller/.translations/es-419.json index a99011cf8b11..f3a084e7545e 100644 --- a/homeassistant/components/homekit_controller/.translations/es-419.json +++ b/homeassistant/components/homekit_controller/.translations/es-419.json @@ -25,7 +25,7 @@ "description": "Seleccione el dispositivo con el que desea vincular", "title": "Vincular con el accesorio HomeKit" } - }, - "title": "Accesorio HomeKit" - } + } + }, + "title": "Accesorio HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/es.json b/homeassistant/components/homekit_controller/.translations/es.json index 67f6daa8469d..b7639223f51a 100644 --- a/homeassistant/components/homekit_controller/.translations/es.json +++ b/homeassistant/components/homekit_controller/.translations/es.json @@ -34,7 +34,7 @@ "description": "Selecciona el dispositivo que quieres vincular", "title": "Vincular con accesorio HomeKit" } - }, - "title": "Accesorio HomeKit" - } + } + }, + "title": "Accesorio HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/fr.json b/homeassistant/components/homekit_controller/.translations/fr.json index 7f0566ddd423..a21ee3a53b30 100644 --- a/homeassistant/components/homekit_controller/.translations/fr.json +++ b/homeassistant/components/homekit_controller/.translations/fr.json @@ -34,7 +34,7 @@ "description": "S\u00e9lectionnez l'appareil avec lequel vous voulez appairer", "title": "Appairer avec l'accessoire HomeKit" } - }, - "title": "Accessoire HomeKit" - } + } + }, + "title": "Accessoire HomeKit" } \ 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 53ca9a390157..536451963884 100644 --- a/homeassistant/components/homekit_controller/.translations/hu.json +++ b/homeassistant/components/homekit_controller/.translations/hu.json @@ -34,7 +34,7 @@ "description": "V\u00e1lassza ki azt az eszk\u00f6zt, amelyet p\u00e1ros\u00edtani szeretne", "title": "HomeKit tartoz\u00e9k p\u00e1ros\u00edt\u00e1sa" } - }, - "title": "HomeKit tartoz\u00e9k" - } + } + }, + "title": "HomeKit tartoz\u00e9k" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/it.json b/homeassistant/components/homekit_controller/.translations/it.json index 69bb1f13c84c..0f19738748cf 100644 --- a/homeassistant/components/homekit_controller/.translations/it.json +++ b/homeassistant/components/homekit_controller/.translations/it.json @@ -34,7 +34,7 @@ "description": "Selezionare il dispositivo che si desidera abbinare", "title": "Abbina con accessorio HomeKit" } - }, - "title": "Accessorio HomeKit" - } + } + }, + "title": "Accessorio HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/ko.json b/homeassistant/components/homekit_controller/.translations/ko.json index 8837e501a8aa..d42001f629ae 100644 --- a/homeassistant/components/homekit_controller/.translations/ko.json +++ b/homeassistant/components/homekit_controller/.translations/ko.json @@ -34,7 +34,7 @@ "description": "\ud398\uc5b4\ub9c1 \ud560 \uae30\uae30\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694", "title": "HomeKit \uc561\uc138\uc11c\ub9ac \ud398\uc5b4\ub9c1" } - }, - "title": "HomeKit \uc561\uc138\uc11c\ub9ac" - } + } + }, + "title": "HomeKit \uc561\uc138\uc11c\ub9ac" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/lb.json b/homeassistant/components/homekit_controller/.translations/lb.json index e12789dcb409..148d344eaea4 100644 --- a/homeassistant/components/homekit_controller/.translations/lb.json +++ b/homeassistant/components/homekit_controller/.translations/lb.json @@ -34,7 +34,7 @@ "description": "Wielt den Apparat aus dee soll verbonne ginn", "title": "Mam HomeKit Accessoire verbannen" } - }, - "title": "HomeKit Accessoire" - } + } + }, + "title": "HomeKit Accessoire" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/nl.json b/homeassistant/components/homekit_controller/.translations/nl.json index 30494295f0ea..20013168c815 100644 --- a/homeassistant/components/homekit_controller/.translations/nl.json +++ b/homeassistant/components/homekit_controller/.translations/nl.json @@ -34,7 +34,7 @@ "description": "Selecteer het apparaat waarmee u wilt koppelen", "title": "Koppel met HomeKit accessoire" } - }, - "title": "HomeKit Accessoires" - } + } + }, + "title": "HomeKit Accessoires" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/nn.json b/homeassistant/components/homekit_controller/.translations/nn.json index 995d67792389..a00780eb54f8 100644 --- a/homeassistant/components/homekit_controller/.translations/nn.json +++ b/homeassistant/components/homekit_controller/.translations/nn.json @@ -6,7 +6,7 @@ "pairing_code": "Paringskode" } } - }, - "title": "HomeKit tilbeh\u00f8r" - } + } + }, + "title": "HomeKit tilbeh\u00f8r" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/no.json b/homeassistant/components/homekit_controller/.translations/no.json index a2816fa92f06..e70a463dcd6c 100644 --- a/homeassistant/components/homekit_controller/.translations/no.json +++ b/homeassistant/components/homekit_controller/.translations/no.json @@ -34,7 +34,7 @@ "description": "Velg enheten du vil koble til", "title": "Koble til HomeKit tilbeh\u00f8r" } - }, - "title": "HomeKit tilbeh\u00f8r" - } + } + }, + "title": "HomeKit tilbeh\u00f8r" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/pl.json b/homeassistant/components/homekit_controller/.translations/pl.json index 33cd20dc9c95..498d927ffb87 100644 --- a/homeassistant/components/homekit_controller/.translations/pl.json +++ b/homeassistant/components/homekit_controller/.translations/pl.json @@ -34,7 +34,7 @@ "description": "Wybierz urz\u0105dzenie, kt\u00f3re chcesz sparowa\u0107", "title": "Sparuj z akcesorium HomeKit" } - }, - "title": "Akcesorium HomeKit" - } + } + }, + "title": "Akcesorium HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/pt-BR.json b/homeassistant/components/homekit_controller/.translations/pt-BR.json index 479f6c6a97cf..ff0dadf8c572 100644 --- a/homeassistant/components/homekit_controller/.translations/pt-BR.json +++ b/homeassistant/components/homekit_controller/.translations/pt-BR.json @@ -34,7 +34,7 @@ "description": "Selecione o dispositivo com o qual voc\u00ea deseja parear", "title": "Parear com o acess\u00f3rio HomeKit" } - }, - "title": "Acess\u00f3rio HomeKit" - } + } + }, + "title": "Acess\u00f3rio HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/ru.json b/homeassistant/components/homekit_controller/.translations/ru.json index 41393acb26ba..d37ef1b014c2 100644 --- a/homeassistant/components/homekit_controller/.translations/ru.json +++ b/homeassistant/components/homekit_controller/.translations/ru.json @@ -34,7 +34,7 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435.", "title": "\u0421\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0441 \u0430\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440\u043e\u043c HomeKit" } - }, - "title": "\u0410\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440 HomeKit" - } + } + }, + "title": "\u0410\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440 HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/sl.json b/homeassistant/components/homekit_controller/.translations/sl.json index aa7977f5bfe8..4dcd1d485c33 100644 --- a/homeassistant/components/homekit_controller/.translations/sl.json +++ b/homeassistant/components/homekit_controller/.translations/sl.json @@ -34,7 +34,7 @@ "description": "Izberite napravo, s katero se \u017eelite seznaniti", "title": "Seznanite s HomeKit Opremo" } - }, - "title": "HomeKit oprema" - } + } + }, + "title": "HomeKit oprema" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/sv.json b/homeassistant/components/homekit_controller/.translations/sv.json index b4b721b7ff91..0c57e09b09b7 100644 --- a/homeassistant/components/homekit_controller/.translations/sv.json +++ b/homeassistant/components/homekit_controller/.translations/sv.json @@ -34,7 +34,7 @@ "description": "V\u00e4lj den enhet du vill para med", "title": "Para HomeKit-tillbeh\u00f6r" } - }, - "title": "HomeKit-tillbeh\u00f6r" - } + } + }, + "title": "HomeKit-tillbeh\u00f6r" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/th.json b/homeassistant/components/homekit_controller/.translations/th.json index c0311b0f1989..938d6f2aad83 100644 --- a/homeassistant/components/homekit_controller/.translations/th.json +++ b/homeassistant/components/homekit_controller/.translations/th.json @@ -27,7 +27,7 @@ "description": "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e08\u0e30\u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48", "title": "\u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48\u0e01\u0e31\u0e1a\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2a\u0e23\u0e34\u0e21 HomeKit" } - }, - "title": "\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2a\u0e23\u0e34\u0e21 HomeKit" - } + } + }, + "title": "\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2a\u0e23\u0e34\u0e21 HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/vi.json b/homeassistant/components/homekit_controller/.translations/vi.json index cc16ebc70c45..39283a733e8c 100644 --- a/homeassistant/components/homekit_controller/.translations/vi.json +++ b/homeassistant/components/homekit_controller/.translations/vi.json @@ -14,7 +14,7 @@ "description": "Ch\u1ecdn thi\u1ebft b\u1ecb b\u1ea1n mu\u1ed1n k\u1ebft n\u1ed1i", "title": "K\u1ebft n\u1ed1i v\u1edbi Ph\u1ee5 ki\u1ec7n HomeKit" } - }, - "title": "Ph\u1ee5 ki\u1ec7n HomeKit" - } + } + }, + "title": "Ph\u1ee5 ki\u1ec7n HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/zh-Hans.json b/homeassistant/components/homekit_controller/.translations/zh-Hans.json index d9fdc8f91c2e..4b58e4f9fb6f 100644 --- a/homeassistant/components/homekit_controller/.translations/zh-Hans.json +++ b/homeassistant/components/homekit_controller/.translations/zh-Hans.json @@ -33,7 +33,7 @@ "description": "\u9009\u62e9\u60a8\u8981\u914d\u5bf9\u7684\u8bbe\u5907", "title": "\u4e0e HomeKit \u914d\u4ef6\u914d\u5bf9" } - }, - "title": "HomeKit \u914d\u4ef6" - } + } + }, + "title": "HomeKit \u914d\u4ef6" } \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/zh-Hant.json b/homeassistant/components/homekit_controller/.translations/zh-Hant.json index 25ad45dddaab..569d4581c107 100644 --- a/homeassistant/components/homekit_controller/.translations/zh-Hant.json +++ b/homeassistant/components/homekit_controller/.translations/zh-Hant.json @@ -34,7 +34,7 @@ "description": "\u9078\u64c7\u6240\u8981\u65b0\u589e\u7684\u8a2d\u5099", "title": "HomeKit \u914d\u4ef6\u914d\u5c0d" } - }, - "title": "HomeKit \u914d\u4ef6" - } + } + }, + "title": "HomeKit \u914d\u4ef6" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/bg.json b/homeassistant/components/homematicip_cloud/.translations/bg.json index d2b9a1b1761c..eeeee01bcff0 100644 --- a/homeassistant/components/homematicip_cloud/.translations/bg.json +++ b/homeassistant/components/homematicip_cloud/.translations/bg.json @@ -24,7 +24,7 @@ "description": "\u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0441\u0438\u043d\u0438\u044f \u0431\u0443\u0442\u043e\u043d \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430\u0442\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0438 \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 \"\u0418\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435\", \u0437\u0430 \u0434\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u0442\u0435 HomematicIP \u0441 Home Assistant. \n\n![\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u0443\u0442\u043e\u043d\u0430 \u043d\u0430 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430\u0442\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f](/static/images/config_flows/config_homematicip_cloud.png)", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f" } - }, - "title": "HomematicIP \u041e\u0431\u043b\u0430\u043a" - } + } + }, + "title": "HomematicIP \u041e\u0431\u043b\u0430\u043a" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ca.json b/homeassistant/components/homematicip_cloud/.translations/ca.json index f7c149709827..02df0946bef7 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ca.json +++ b/homeassistant/components/homematicip_cloud/.translations/ca.json @@ -24,7 +24,7 @@ "description": "Prem el bot\u00f3 blau del punt d'acc\u00e9s i el bot\u00f3 Envia per registrar HomematicIP amb Home Assistent. \n\n![Ubicaci\u00f3 del bot\u00f3 al pont](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Enlla\u00e7 amb punt d'acc\u00e9s" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/cs.json b/homeassistant/components/homematicip_cloud/.translations/cs.json index fa98029f6b0c..3b4f99c6a9f4 100644 --- a/homeassistant/components/homematicip_cloud/.translations/cs.json +++ b/homeassistant/components/homematicip_cloud/.translations/cs.json @@ -24,7 +24,7 @@ "description": "Stiskn\u011bte modr\u00e9 tla\u010d\u00edtko na p\u0159\u00edstupov\u00e9m bodu a tla\u010d\u00edtko pro registraci HomematicIP s dom\u00e1c\u00edm asistentem. \n\n ! [Um\u00edst\u011bn\u00ed tla\u010d\u00edtka na za\u0159\u00edzen\u00ed] (/static/images/config_flows/config_homematicip_cloud.png)", "title": "P\u0159ipojit se k p\u0159\u00edstupov\u00e9mu bodu" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/da.json b/homeassistant/components/homematicip_cloud/.translations/da.json index 4b8371fc748a..8056e4ad5c3d 100644 --- a/homeassistant/components/homematicip_cloud/.translations/da.json +++ b/homeassistant/components/homematicip_cloud/.translations/da.json @@ -24,7 +24,7 @@ "description": "Tryk p\u00e5 den bl\u00e5 knap p\u00e5 adgangspunktet og send knappen for at registrere HomematicIP med Home Assistant.\n\n ![Placering af knap p\u00e5 bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Link adgangspunkt" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/de.json b/homeassistant/components/homematicip_cloud/.translations/de.json index c2a7579e4fcf..894bdb6dab21 100644 --- a/homeassistant/components/homematicip_cloud/.translations/de.json +++ b/homeassistant/components/homematicip_cloud/.translations/de.json @@ -24,7 +24,7 @@ "description": "Dr\u00fccke den blauen Taster auf dem Accesspoint, sowie den Senden Button um HomematicIP mit Home Assistant zu verbinden.\n\n![Position des Tasters auf dem AP](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Verkn\u00fcpfe den Accesspoint" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/en.json b/homeassistant/components/homematicip_cloud/.translations/en.json index 605bb0d250bb..2b7d7c172690 100644 --- a/homeassistant/components/homematicip_cloud/.translations/en.json +++ b/homeassistant/components/homematicip_cloud/.translations/en.json @@ -24,7 +24,7 @@ "description": "Press the blue button on the access point and the submit button to register HomematicIP with Home Assistant.\n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Link Access point" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/es-419.json b/homeassistant/components/homematicip_cloud/.translations/es-419.json index 0919e211617c..d9d9a90386ea 100644 --- a/homeassistant/components/homematicip_cloud/.translations/es-419.json +++ b/homeassistant/components/homematicip_cloud/.translations/es-419.json @@ -22,7 +22,7 @@ "link": { "description": "Presione el bot\u00f3n azul en el punto de acceso y el bot\u00f3n enviar para registrar HomematicIP con Home Assistant. \n\n ! [Ubicaci\u00f3n del bot\u00f3n en el puente] (/static/images/config_flows/config_homematicip_cloud.png)" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/es.json b/homeassistant/components/homematicip_cloud/.translations/es.json index 206bd05a3459..f7d36fc4aa9f 100644 --- a/homeassistant/components/homematicip_cloud/.translations/es.json +++ b/homeassistant/components/homematicip_cloud/.translations/es.json @@ -24,7 +24,7 @@ "description": "Pulsa el bot\u00f3n azul en el punto de acceso y el bot\u00f3n de env\u00edo para registrar HomematicIP en Home Assistant.\n\n![Ubicaci\u00f3n del bot\u00f3n en el puente](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Enlazar punto de acceso" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/et.json b/homeassistant/components/homematicip_cloud/.translations/et.json index 7aedd80b5d0b..fd3e8189af17 100644 --- a/homeassistant/components/homematicip_cloud/.translations/et.json +++ b/homeassistant/components/homematicip_cloud/.translations/et.json @@ -10,7 +10,7 @@ "pin": "PIN-kood (valikuline)" } } - }, - "title": "HomematicIP Pilv" - } + } + }, + "title": "HomematicIP Pilv" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/fr.json b/homeassistant/components/homematicip_cloud/.translations/fr.json index 0e724d62bbe2..07aee5dd6254 100644 --- a/homeassistant/components/homematicip_cloud/.translations/fr.json +++ b/homeassistant/components/homematicip_cloud/.translations/fr.json @@ -24,7 +24,7 @@ "description": "Appuyez sur le bouton bleu du point d'acc\u00e8s et sur le bouton Envoyer pour enregistrer HomematicIP avec Home Assistant. \n\n ![Emplacement du bouton sur le pont](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Lier le point d'acc\u00e8s" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/he.json b/homeassistant/components/homematicip_cloud/.translations/he.json index c60294e21d5b..d404c85a90d4 100644 --- a/homeassistant/components/homematicip_cloud/.translations/he.json +++ b/homeassistant/components/homematicip_cloud/.translations/he.json @@ -24,7 +24,7 @@ "description": "\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05db\u05d7\u05d5\u05dc \u05d1\u05e0\u05e7\u05d5\u05d3\u05ea \u05d2\u05d9\u05e9\u05d4 \u05d5\u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05e9\u05dc\u05d9\u05d7\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d7\u05d1\u05e8 \u05d0\u05ea HomematicIP \u05e2\u05ddHome Assistant.\n\n![\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05db\u05e4\u05ea\u05d5\u05e8 \u05d1\u05de\u05d2\u05e9\u05e8](/static/images/config_flows/config_homematicip_cloud.png)", "title": "\u05d7\u05d1\u05e8 \u05e0\u05e7\u05d5\u05d3\u05ea \u05d2\u05d9\u05e9\u05d4" } - }, - "title": "\u05e2\u05e0\u05df HomematicIP" - } + } + }, + "title": "\u05e2\u05e0\u05df HomematicIP" } \ 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 61ff5ac5fe25..3817766103c6 100644 --- a/homeassistant/components/homematicip_cloud/.translations/hu.json +++ b/homeassistant/components/homematicip_cloud/.translations/hu.json @@ -23,7 +23,7 @@ "link": { "title": "Link Hozz\u00e1f\u00e9r\u00e9si pont" } - }, - "title": "HomematicIP Felh\u0151" - } + } + }, + "title": "HomematicIP Felh\u0151" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/id.json b/homeassistant/components/homematicip_cloud/.translations/id.json index 0487434274c5..c7b7857a86bd 100644 --- a/homeassistant/components/homematicip_cloud/.translations/id.json +++ b/homeassistant/components/homematicip_cloud/.translations/id.json @@ -24,7 +24,7 @@ "description": "Tekan tombol biru pada access point dan tombol submit untuk mendaftarkan HomematicIP dengan rumah asisten.\n\n! [Lokasi tombol di bridge] (/ static/images/config_flows/config_homematicip_cloud.png)", "title": "Tautkan jalur akses" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/it.json b/homeassistant/components/homematicip_cloud/.translations/it.json index c7f1af21f227..e35e02de4796 100644 --- a/homeassistant/components/homematicip_cloud/.translations/it.json +++ b/homeassistant/components/homematicip_cloud/.translations/it.json @@ -24,7 +24,7 @@ "description": "Premi il pulsante blu sull'access point ed il pulsante di invio per registrare HomematicIP con Home Assistant. \n\n ![Posizione del pulsante sul bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Collegamento access point" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ko.json b/homeassistant/components/homematicip_cloud/.translations/ko.json index 2f47fcddf28f..a3437c0100f2 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ko.json +++ b/homeassistant/components/homematicip_cloud/.translations/ko.json @@ -24,7 +24,7 @@ "description": "Home Assistant \uc5d0 HomematicIP \ub97c \ub4f1\ub85d\ud558\ub824\uba74 \uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8\uc758 \ud30c\ub780\uc0c9 \ubc84\ud2bc\uacfc Submit \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694.\n\n![\ube0c\ub9bf\uc9c0\uc758 \ubc84\ud2bc \uc704\uce58 \ubcf4\uae30](/static/images/config_flows/config_homematicip_cloud.png)", "title": "\uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8 \uc5f0\uacb0" } - }, - "title": "HomematicIP \ud074\ub77c\uc6b0\ub4dc" - } + } + }, + "title": "HomematicIP \ud074\ub77c\uc6b0\ub4dc" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/lb.json b/homeassistant/components/homematicip_cloud/.translations/lb.json index f8ae990d3644..6c7acc9889fc 100644 --- a/homeassistant/components/homematicip_cloud/.translations/lb.json +++ b/homeassistant/components/homematicip_cloud/.translations/lb.json @@ -24,7 +24,7 @@ "description": "Dr\u00e9ckt de bloen Kn\u00e4ppchen um Accesspoint an den Submit Kn\u00e4ppchen fir d'HomematicIP mam Home Assistant ze registr\u00e9ieren.\n\n![Standuert vum Kn\u00e4ppchen op der Bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Accesspoint verbannen" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/nl.json b/homeassistant/components/homematicip_cloud/.translations/nl.json index ff3e2dea2cde..aafc2bf1a9b5 100644 --- a/homeassistant/components/homematicip_cloud/.translations/nl.json +++ b/homeassistant/components/homematicip_cloud/.translations/nl.json @@ -24,7 +24,7 @@ "description": "Druk op de blauwe knop op het accesspoint en de verzendknop om HomematicIP bij Home Assistant te registreren. \n\n![Locatie van knop op bridge](/static/images/config_flows/\nconfig_homematicip_cloud.png)", "title": "Link accesspoint" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/nn.json b/homeassistant/components/homematicip_cloud/.translations/nn.json index da375563d917..6884739e818c 100644 --- a/homeassistant/components/homematicip_cloud/.translations/nn.json +++ b/homeassistant/components/homematicip_cloud/.translations/nn.json @@ -24,7 +24,7 @@ "description": "Trykk p\u00e5 den bl\u00e5 knappen p\u00e5 tilgangspunktet og sendknappen for \u00e5 registrere HomematicIP med Home Assistant.\n\n ! [Plassering av knapp p\u00e5 bro] (/ static / images / config_flows / config_homematicip_cloud.png)", "title": "Link tilgangspunk" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/no.json b/homeassistant/components/homematicip_cloud/.translations/no.json index 9a4dd424beef..4465c4f88a8a 100644 --- a/homeassistant/components/homematicip_cloud/.translations/no.json +++ b/homeassistant/components/homematicip_cloud/.translations/no.json @@ -24,7 +24,7 @@ "description": "Trykk p\u00e5 den bl\u00e5 knappen p\u00e5 tilgangspunktet og p\u00e5 send knappen for \u00e5 registrere HomematicIP med Home Assistant. \n\n![Plassering av knapp p\u00e5 bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Link tilgangspunkt" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pl.json b/homeassistant/components/homematicip_cloud/.translations/pl.json index 78905da208ee..e7154eab4b55 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pl.json +++ b/homeassistant/components/homematicip_cloud/.translations/pl.json @@ -24,7 +24,7 @@ "description": "Naci\u015bnij niebieski przycisk na punkcie dost\u0119pu i przycisk przesy\u0142ania, aby zarejestrowa\u0107 HomematicIP w Home Assistant. \n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Po\u0142\u0105cz z punktem dost\u0119pu" } - }, - "title": "Chmura HomematicIP" - } + } + }, + "title": "Chmura HomematicIP" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt-BR.json b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json index 82166a1aaaf5..3bb9119a0362 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pt-BR.json +++ b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json @@ -24,7 +24,7 @@ "description": "Pressione o bot\u00e3o azul no ponto de acesso e o bot\u00e3o enviar para registrar o HomematicIP com o Home Assistant.\n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Accesspoint link" } - }, - "title": "Nuvem do HomematicIP" - } + } + }, + "title": "Nuvem do HomematicIP" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt.json b/homeassistant/components/homematicip_cloud/.translations/pt.json index 0954f3ff4f9a..787aade5de74 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pt.json +++ b/homeassistant/components/homematicip_cloud/.translations/pt.json @@ -24,7 +24,7 @@ "description": "Pressione o bot\u00e3o azul no ponto de acesso e o bot\u00e3o enviar para registrar HomematicIP com o Home Assistant.\n\n![Localiza\u00e7\u00e3o do bot\u00e3o na bridge](/ static/images/config_flows/config_homematicip_cloud.png)", "title": "Associar ponto de acesso" } - }, - "title": "Nuvem do HomematicIP" - } + } + }, + "title": "Nuvem do HomematicIP" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ru.json b/homeassistant/components/homematicip_cloud/.translations/ru.json index 1ba33b0e6ee3..cd75b53bce2c 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ru.json +++ b/homeassistant/components/homematicip_cloud/.translations/ru.json @@ -24,7 +24,7 @@ "description": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0441\u0438\u043d\u044e\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 **\u041f\u041e\u0414\u0422\u0412\u0415\u0420\u0414\u0418\u0422\u042c**, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c HomematicIP \u0432 Home Assistant. \n\n ![\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438](/static/images/config_flows/config_homematicip_cloud.png)", "title": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sl.json b/homeassistant/components/homematicip_cloud/.translations/sl.json index cdde0f12d785..96ac18a3c02a 100644 --- a/homeassistant/components/homematicip_cloud/.translations/sl.json +++ b/homeassistant/components/homematicip_cloud/.translations/sl.json @@ -24,7 +24,7 @@ "description": "Pritisnite modro tipko na dostopni to\u010dko in gumb po\u0161lji, da registrirate homematicIP s Home Assistantom. \n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", "title": "Pove\u017eite dostopno to\u010dko" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sv.json b/homeassistant/components/homematicip_cloud/.translations/sv.json index f155e8fd1c15..c21a0f65789f 100644 --- a/homeassistant/components/homematicip_cloud/.translations/sv.json +++ b/homeassistant/components/homematicip_cloud/.translations/sv.json @@ -24,7 +24,7 @@ "description": "Tryck p\u00e5 den bl\u00e5 knappen p\u00e5 accesspunkten och p\u00e5 skicka-knappen f\u00f6r att registrera HomematicIP med Home Assistant. \n\n ![Placering av knappen p\u00e5 bryggan](/static/images/config_flows/config_homematicip_cloud.png)", "title": "L\u00e4nka Accesspunkt" } - }, - "title": "HomematicIP Moln" - } + } + }, + "title": "HomematicIP Moln" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json index 4c2b6268eec3..4165e254658d 100644 --- a/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json @@ -24,7 +24,7 @@ "description": "\u6309\u4e0b\u63a5\u5165\u70b9\u4e0a\u7684\u84dd\u8272\u6309\u94ae\u7136\u540e\u70b9\u51fb\u63d0\u4ea4\u6309\u94ae\uff0c\u4ee5\u5c06 HomematicIP \u6ce8\u518c\u5230 Home Assistant\u3002\n\n![\u63a5\u5165\u70b9\u7684\u6309\u94ae\u4f4d\u7f6e]\n(/static/images/config_flows/config_homematicip_cloud.png)", "title": "\u8fde\u63a5\u63a5\u5165\u70b9" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json index c6a960f1a683..6925307e258b 100644 --- a/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json @@ -24,7 +24,7 @@ "description": "\u6309\u4e0b AP \u4e0a\u7684\u85cd\u8272\u6309\u9215\u8207\u50b3\u9001\u6309\u9215\uff0c\u4ee5\u65bc Home Assistant \u4e0a\u9032\u884c HomematicIP \u8a3b\u518a\u3002\n\n![\u6a4b\u63a5\u5668\u4e0a\u7684\u6309\u9215\u4f4d\u7f6e](/static/images/config_flows/config_homematicip_cloud.png)", "title": "\u9023\u7d50 Access point" } - }, - "title": "HomematicIP Cloud" - } + } + }, + "title": "HomematicIP Cloud" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/bg.json b/homeassistant/components/huawei_lte/.translations/bg.json index 44746468b351..195cc641405c 100644 --- a/homeassistant/components/huawei_lte/.translations/bg.json +++ b/homeassistant/components/huawei_lte/.translations/bg.json @@ -26,8 +26,7 @@ "description": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u0438 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u0442\u043e. \u041f\u043e\u0441\u043e\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u0430 \u043d\u0435 \u0435 \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u043e, \u043d\u043e \u0434\u0430\u0432\u0430 \u0432\u044a\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442 \u0437\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430\u043d\u0435. \u041e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0441\u0442\u0440\u0430\u043d\u0430, \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043e\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0430\u043d\u0430 \u0432\u0440\u044a\u0437\u043a\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0434\u043e\u0432\u0435\u0434\u0435 \u0434\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441 \u0434\u043e\u0441\u0442\u044a\u043f\u0430 \u0434\u043e \u0443\u0435\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u0442\u043e \u043e\u0442\u0432\u044a\u043d Home Assistant, \u0434\u043e\u043a\u0430\u0442\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u0442\u0430 \u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0442\u043e.", "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -38,5 +37,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ca.json b/homeassistant/components/huawei_lte/.translations/ca.json index a52d101a486b..a02b97ea0474 100644 --- a/homeassistant/components/huawei_lte/.translations/ca.json +++ b/homeassistant/components/huawei_lte/.translations/ca.json @@ -26,8 +26,7 @@ "description": "Introdueix les dades d\u2019acc\u00e9s del dispositiu. El nom d\u2019usuari i contrasenya s\u00f3n opcionals, per\u00f2 habiliten m\u00e9s funcions de la integraci\u00f3. D'altra banda, (mentre la integraci\u00f3 estigui activa) l'\u00fas d'una connexi\u00f3 autoritzada pot causar problemes per accedir a la interf\u00edcie web del dispositiu des de fora de Home Assistant i viceversa.", "title": "Configuraci\u00f3 de Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/cs.json b/homeassistant/components/huawei_lte/.translations/cs.json index 8d7ac01c55ac..f75445e66d10 100644 --- a/homeassistant/components/huawei_lte/.translations/cs.json +++ b/homeassistant/components/huawei_lte/.translations/cs.json @@ -22,8 +22,7 @@ }, "title": "Konfigurovat Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -34,5 +33,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/da.json b/homeassistant/components/huawei_lte/.translations/da.json index 19bc69b77fd7..0d047af61acb 100644 --- a/homeassistant/components/huawei_lte/.translations/da.json +++ b/homeassistant/components/huawei_lte/.translations/da.json @@ -26,8 +26,7 @@ "description": "Indtast oplysninger om enhedsadgang. Det er valgfrit at specificere brugernavn og adgangskode, men muligg\u00f8r underst\u00f8ttelse af flere integrationsfunktioner. P\u00e5 den anden side kan brug af en autoriseret forbindelse for\u00e5rsage problemer med at f\u00e5 adgang til enhedens webgr\u00e6nseflade uden for Home Assistant, mens integrationen er aktiv, og omvendt.", "title": "Konfigurer Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/de.json b/homeassistant/components/huawei_lte/.translations/de.json index a346753aeb3e..cd54a593399c 100644 --- a/homeassistant/components/huawei_lte/.translations/de.json +++ b/homeassistant/components/huawei_lte/.translations/de.json @@ -26,8 +26,7 @@ "description": "Gib die Zugangsdaten zum Ger\u00e4t ein. Die Angabe von Benutzername und Passwort ist optional, erm\u00f6glicht aber die Unterst\u00fctzung weiterer Integrationsfunktionen. Andererseits kann die Verwendung einer autorisierten Verbindung zu Problemen beim Zugriff auf die Web-Schnittstelle des Ger\u00e4ts von au\u00dferhalb des Home Assistant f\u00fchren, w\u00e4hrend die Integration aktiv ist, und umgekehrt.", "title": "Konfiguriere Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/en.json b/homeassistant/components/huawei_lte/.translations/en.json index c5f2b4a2a02e..faa0284891ba 100644 --- a/homeassistant/components/huawei_lte/.translations/en.json +++ b/homeassistant/components/huawei_lte/.translations/en.json @@ -26,8 +26,7 @@ "description": "Enter device access details. Specifying username and password is optional, but enables support for more integration features. On the other hand, use of an authorized connection may cause problems accessing the device web interface from outside Home Assistant while the integration is active, and the other way around.", "title": "Configure Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/es.json b/homeassistant/components/huawei_lte/.translations/es.json index c35d1eacf233..14fcfcd8f1ed 100644 --- a/homeassistant/components/huawei_lte/.translations/es.json +++ b/homeassistant/components/huawei_lte/.translations/es.json @@ -26,8 +26,7 @@ "description": "Introduzca los detalles de acceso al dispositivo. La especificaci\u00f3n del nombre de usuario y la contrase\u00f1a es opcional, pero permite admitir m\u00e1s funciones de integraci\u00f3n. Por otro lado, el uso de una conexi\u00f3n autorizada puede causar problemas para acceder a la interfaz web del dispositivo desde fuera de Home Assistant mientras la integraci\u00f3n est\u00e1 activa, y viceversa.", "title": "Configurar Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/fr.json b/homeassistant/components/huawei_lte/.translations/fr.json index 9f6ae9a09bf5..1921dbdf1dcb 100644 --- a/homeassistant/components/huawei_lte/.translations/fr.json +++ b/homeassistant/components/huawei_lte/.translations/fr.json @@ -26,8 +26,7 @@ "description": "Entrez les d\u00e9tails d'acc\u00e8s au p\u00e9riph\u00e9rique. La sp\u00e9cification du nom d'utilisateur et du mot de passe est facultative, mais permet de prendre en charge davantage de fonctionnalit\u00e9s d'int\u00e9gration. En revanche, l\u2019utilisation d\u2019une connexion autoris\u00e9e peut entra\u00eener des probl\u00e8mes d\u2019acc\u00e8s \u00e0 l\u2019interface Web du p\u00e9riph\u00e9rique depuis l\u2019assistant externe lorsque l\u2019int\u00e9gration est active et inversement.", "title": "Configurer Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ 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 9f012c1c4050..30c4dfa4a389 100644 --- a/homeassistant/components/huawei_lte/.translations/hu.json +++ b/homeassistant/components/huawei_lte/.translations/hu.json @@ -22,8 +22,7 @@ }, "title": "Huawei LTE konfigur\u00e1l\u00e1sa" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -35,5 +34,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/it.json b/homeassistant/components/huawei_lte/.translations/it.json index 4ad17ecaa36c..7f08dbcaee40 100644 --- a/homeassistant/components/huawei_lte/.translations/it.json +++ b/homeassistant/components/huawei_lte/.translations/it.json @@ -26,8 +26,7 @@ "description": "Immettere i dettagli di accesso al dispositivo. La specifica di nome utente e password \u00e8 facoltativa, ma abilita il supporto per altre funzionalit\u00e0 di integrazione. D'altra parte, l'uso di una connessione autorizzata pu\u00f2 causare problemi di accesso all'interfaccia Web del dispositivo dall'esterno di Home Assistant mentre l'integrazione \u00e8 attiva e viceversa.", "title": "Configura Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ko.json b/homeassistant/components/huawei_lte/.translations/ko.json index f6b3d8556793..732c8bbc98ef 100644 --- a/homeassistant/components/huawei_lte/.translations/ko.json +++ b/homeassistant/components/huawei_lte/.translations/ko.json @@ -26,8 +26,7 @@ "description": "\uae30\uae30 \uc561\uc138\uc2a4 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694. \uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638\ub97c \uc124\uc815\ud558\ub294 \uac83\uc740 \uc120\ud0dd \uc0ac\ud56d\uc774\uc9c0\ub9cc \ub354 \ub9ce\uc740 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc18\uba74, \uc778\uc99d \ub41c \uc5f0\uacb0\uc744 \uc0ac\uc6a9\ud558\uba74, \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\uac00 \ud65c\uc131\ud654 \ub41c \uc0c1\ud0dc\uc5d0\uc11c \ub2e4\ub978 \ubc29\ubc95\uc73c\ub85c Home Assistant \uc758 \uc678\ubd80\uc5d0\uc11c \uae30\uae30\uc758 \uc6f9 \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \uc561\uc138\uc2a4\ud558\ub294 \ub370 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", "title": "Huawei LTE \uc124\uc815" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/lb.json b/homeassistant/components/huawei_lte/.translations/lb.json index d99c31d2d634..3d894048d017 100644 --- a/homeassistant/components/huawei_lte/.translations/lb.json +++ b/homeassistant/components/huawei_lte/.translations/lb.json @@ -26,8 +26,7 @@ "description": "Gitt Detailer fir den Acc\u00e8s op den Apparat an. Benotzernumm a Passwuert si fakultativ, erm\u00e9iglecht awer d'\u00cbnnerst\u00ebtzung fir m\u00e9i Integratiouns Optiounen. Op der anerer S\u00e4it kann d'Benotzung vun enger autoris\u00e9ierter Verbindung Problemer mam Acc\u00e8s zum Web Interface vum Apparat ausserhalb vum Home Assistant verursaachen, w\u00e4rend d'Integratioun aktiv ass.", "title": "Huawei LTE ariichten" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/nl.json b/homeassistant/components/huawei_lte/.translations/nl.json index 297ec922abf1..151214011f85 100644 --- a/homeassistant/components/huawei_lte/.translations/nl.json +++ b/homeassistant/components/huawei_lte/.translations/nl.json @@ -26,8 +26,7 @@ "description": "Voer de toegangsgegevens van het apparaat in. Opgeven van gebruikersnaam en wachtwoord is optioneel, maar biedt ondersteuning voor meer integratiefuncties. Aan de andere kant kan het gebruik van een geautoriseerde verbinding problemen veroorzaken bij het openen van het webinterface van het apparaat buiten de Home Assitant, terwijl de integratie actief is en andersom.", "title": "Configureer Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/nn.json b/homeassistant/components/huawei_lte/.translations/nn.json index 1a5c63f10f86..ea06e4158e9c 100644 --- a/homeassistant/components/huawei_lte/.translations/nn.json +++ b/homeassistant/components/huawei_lte/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Huawei LTE" - } + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/no.json b/homeassistant/components/huawei_lte/.translations/no.json index 606f6f96375f..1d16002e2943 100644 --- a/homeassistant/components/huawei_lte/.translations/no.json +++ b/homeassistant/components/huawei_lte/.translations/no.json @@ -26,8 +26,7 @@ "description": "Angi detaljer for enhetstilgang. Angivelse av brukernavn og passord er valgfritt, men gir st\u00f8tte for flere integreringsfunksjoner. P\u00e5 den annen side kan bruk av en autorisert tilkobling f\u00f8re til problemer med tilgang til enhetens webgrensesnitt utenfor Home Assistant mens integreringen er aktiv, og omvendt.", "title": "Konfigurer Huawei LTE" } - }, - "title": "" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/pl.json b/homeassistant/components/huawei_lte/.translations/pl.json index 17e4f7b8ef2e..2613b66eea29 100644 --- a/homeassistant/components/huawei_lte/.translations/pl.json +++ b/homeassistant/components/huawei_lte/.translations/pl.json @@ -26,8 +26,7 @@ "description": "Wprowad\u017a szczeg\u00f3\u0142y dost\u0119pu do urz\u0105dzenia. Okre\u015blenie nazwy u\u017cytkownika i has\u0142a jest opcjonalne, ale umo\u017cliwia obs\u0142ug\u0119 wi\u0119kszej liczby funkcji integracji. Z drugiej strony u\u017cycie autoryzowanego po\u0142\u0105czenia mo\u017ce powodowa\u0107 problemy z dost\u0119pem do interfejsu internetowego urz\u0105dzenia z zewn\u0105trz Home Assistant'a gdy integracja jest aktywna.", "title": "Konfiguracja Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/pt.json b/homeassistant/components/huawei_lte/.translations/pt.json index 6e3a06ac662c..db95d808fe48 100644 --- a/homeassistant/components/huawei_lte/.translations/pt.json +++ b/homeassistant/components/huawei_lte/.translations/pt.json @@ -18,8 +18,7 @@ }, "title": "Configurar o Huawei LTE" } - }, - "title": "" + } }, "options": { "step": { @@ -30,5 +29,6 @@ } } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ru.json b/homeassistant/components/huawei_lte/.translations/ru.json index c7c9e2033ef1..fab87f065f3c 100644 --- a/homeassistant/components/huawei_lte/.translations/ru.json +++ b/homeassistant/components/huawei_lte/.translations/ru.json @@ -26,8 +26,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u0438\u0437 Home Assistant, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.", "title": "Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/sl.json b/homeassistant/components/huawei_lte/.translations/sl.json index c2d7e0bd9835..13b70516cc4c 100644 --- a/homeassistant/components/huawei_lte/.translations/sl.json +++ b/homeassistant/components/huawei_lte/.translations/sl.json @@ -26,8 +26,7 @@ "description": "Vnesite podatke za dostop do naprave. Dolo\u010danje uporabni\u0161kega imena in gesla je izbirno, vendar omogo\u010da podporo za ve\u010d funkcij integracije. Po drugi strani pa lahko uporaba poobla\u0161\u010dene povezave povzro\u010di te\u017eave pri dostopu do spletnega vmesnika naprave zunaj Home Assistant-a, medtem ko je integracija aktivna, in obratno.", "title": "Konfigurirajte Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/sv.json b/homeassistant/components/huawei_lte/.translations/sv.json index 16b192d16a19..88aebcdffd17 100644 --- a/homeassistant/components/huawei_lte/.translations/sv.json +++ b/homeassistant/components/huawei_lte/.translations/sv.json @@ -26,8 +26,7 @@ "description": "Ange information om enhets\u00e5tkomst. Det \u00e4r valfritt att ange anv\u00e4ndarnamn och l\u00f6senord, men st\u00f6djer d\u00e5 fler integrationsfunktioner. \u00c5 andra sidan kan anv\u00e4ndning av en auktoriserad anslutning orsaka problem med att komma \u00e5t enhetens webbgr\u00e4nssnitt utanf\u00f6r Home Assistant medan integrationen \u00e4r aktiv och tv\u00e4rtom.", "title": "Konfigurera Huawei LTE" } - }, - "title": "Huawei LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "Huawei LTE" } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/zh-Hant.json b/homeassistant/components/huawei_lte/.translations/zh-Hant.json index 201e9afec4bb..be95e0e73ad4 100644 --- a/homeassistant/components/huawei_lte/.translations/zh-Hant.json +++ b/homeassistant/components/huawei_lte/.translations/zh-Hant.json @@ -26,8 +26,7 @@ "description": "\u8f38\u5165\u8a2d\u5099\u5b58\u53d6\u8a73\u7d30\u8cc7\u6599\u3002\u6307\u5b9a\u4f7f\u7528\u8005\u540d\u7a31\u8207\u5bc6\u78bc\u70ba\u9078\u9805\u8f38\u5165\uff0c\u4f46\u958b\u555f\u5c07\u652f\u63f4\u66f4\u591a\u6574\u5408\u529f\u80fd\u3002\u6b64\u5916\uff0c\u4f7f\u7528\u6388\u6b0a\u9023\u7dda\uff0c\u53ef\u80fd\u5c0e\u81f4\u6574\u5408\u555f\u7528\u5f8c\uff0c\u7531\u5916\u90e8\u9023\u7dda\u81f3 Home Assistant \u8a2d\u5099 Web \u4ecb\u9762\u51fa\u73fe\u67d0\u4e9b\u554f\u984c\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002", "title": "\u8a2d\u5b9a\u83ef\u70ba LTE" } - }, - "title": "\u83ef\u70ba LTE" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "\u83ef\u70ba LTE" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/bg.json b/homeassistant/components/hue/.translations/bg.json index 5f28f4bde40a..f73ca791153e 100644 --- a/homeassistant/components/hue/.translations/bg.json +++ b/homeassistant/components/hue/.translations/bg.json @@ -25,7 +25,7 @@ "description": "\u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430\u0442\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f, \u0437\u0430 \u0434\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u0442\u0435 Philips Hue \u0441 Home Assistant. \n\n![\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u0443\u0442\u043e\u043d\u0430 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430\u0442\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f](/static/images/config_philips_hue.jpg)", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0445\u044a\u0431" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ca.json b/homeassistant/components/hue/.translations/ca.json index 53c248fe1791..1e1312b096b5 100644 --- a/homeassistant/components/hue/.translations/ca.json +++ b/homeassistant/components/hue/.translations/ca.json @@ -25,8 +25,7 @@ "description": "Prem el bot\u00f3 de l'enlla\u00e7 per registrar Philips Hue amb Home Assistant. \n\n ![Ubicaci\u00f3 del bot\u00f3 al pont](/static/images/config_philips_hue.jpg)", "title": "Vincular concentrador" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "Bot\u00f3 \"{subtype}\" premut", "remote_button_short_release": "Bot\u00f3 \"{subtype}\" alliberat" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/cs.json b/homeassistant/components/hue/.translations/cs.json index 260dbc4021a9..76afc8c33733 100644 --- a/homeassistant/components/hue/.translations/cs.json +++ b/homeassistant/components/hue/.translations/cs.json @@ -23,7 +23,7 @@ "description": "Stiskn\u011bte tla\u010d\u00edtko na p\u0159emost\u011bn\u00ed k registraci Philips Hue v Home Assistant.\n\n! [Um\u00edst\u011bn\u00ed tla\u010d\u00edtka na p\u0159emost\u011bn\u00ed](/ static/images/config_philips_hue.jpg)", "title": "P\u0159ipojit Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/cy.json b/homeassistant/components/hue/.translations/cy.json index f5476f73edbb..7e1f32135d76 100644 --- a/homeassistant/components/hue/.translations/cy.json +++ b/homeassistant/components/hue/.translations/cy.json @@ -23,7 +23,7 @@ "description": "Pwyswch y botwm ar y bont i gofrestru Philips Hue gyda Cynorthwydd Cartref.\n\n![Lleoliad botwm ar bont](/static/images/config_philips_hue.jpg)", "title": "Hwb cyswllt" } - }, - "title": "Pont Phillips Hue" - } + } + }, + "title": "Pont Phillips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/da.json b/homeassistant/components/hue/.translations/da.json index c00c19be42a6..41340856a6b4 100644 --- a/homeassistant/components/hue/.translations/da.json +++ b/homeassistant/components/hue/.translations/da.json @@ -25,8 +25,7 @@ "description": "Tryk p\u00e5 knappen p\u00e5 broen for at registrere Philips Hue med Home Assistant. \n\n ![Placering af knap p\u00e5 bro](/static/images/config_philips_hue.jpg)", "title": "Forbind Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\"-knappen trykket p\u00e5", "remote_button_short_release": "\"{subtype}\"-knappen frigivet" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/de.json b/homeassistant/components/hue/.translations/de.json index a4ab9123b48a..494a7217de2d 100644 --- a/homeassistant/components/hue/.translations/de.json +++ b/homeassistant/components/hue/.translations/de.json @@ -25,8 +25,7 @@ "description": "Dr\u00fccke den Knopf auf der Bridge, um Philips Hue mit Home Assistant zu registrieren.\n\n![Position des Buttons auf der Bridge](/static/images/config_philips_hue.jpg)", "title": "Hub verbinden" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" Taste gedr\u00fcckt", "remote_button_short_release": "\"{subtype}\" Taste losgelassen" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/en.json b/homeassistant/components/hue/.translations/en.json index b16213bfbf82..02360d9a7d62 100644 --- a/homeassistant/components/hue/.translations/en.json +++ b/homeassistant/components/hue/.translations/en.json @@ -25,8 +25,7 @@ "description": "Press the button on the bridge to register Philips Hue with Home Assistant.\n\n![Location of button on bridge](/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" button pressed", "remote_button_short_release": "\"{subtype}\" button released" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es-419.json b/homeassistant/components/hue/.translations/es-419.json index 48a2ff233da8..299f50a6780c 100644 --- a/homeassistant/components/hue/.translations/es-419.json +++ b/homeassistant/components/hue/.translations/es-419.json @@ -19,7 +19,7 @@ "host": "Host" } } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es.json b/homeassistant/components/hue/.translations/es.json index 6a5074c6e4a2..eb04cdcf9fba 100644 --- a/homeassistant/components/hue/.translations/es.json +++ b/homeassistant/components/hue/.translations/es.json @@ -25,8 +25,7 @@ "description": "Presione el bot\u00f3n en el puente para registrar Philips Hue con Home Assistant. \n\n![Ubicaci\u00f3n del bot\u00f3n en el puente](/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "Bot\u00f3n \"{subtype}\" pulsado", "remote_button_short_release": "Bot\u00f3n \"{subtype}\" soltado" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/et.json b/homeassistant/components/hue/.translations/et.json index 6bad10ed0678..5362594e4ebe 100644 --- a/homeassistant/components/hue/.translations/et.json +++ b/homeassistant/components/hue/.translations/et.json @@ -9,7 +9,7 @@ "host": "" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/fr.json b/homeassistant/components/hue/.translations/fr.json index de54ddb3bf30..5d4bd86cc6bc 100644 --- a/homeassistant/components/hue/.translations/fr.json +++ b/homeassistant/components/hue/.translations/fr.json @@ -25,7 +25,7 @@ "description": "Appuyez sur le bouton du pont pour lier Philips Hue avec Home Assistant. \n\n ![Emplacement du bouton sur le pont](/static/images/config_philips_hue.jpg)", "title": "Hub de liaison" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/he.json b/homeassistant/components/hue/.translations/he.json index ddc91ae22666..125ea33a0e66 100644 --- a/homeassistant/components/hue/.translations/he.json +++ b/homeassistant/components/hue/.translations/he.json @@ -23,7 +23,7 @@ "description": "\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05db\u05e4\u05ea\u05d5\u05e8 \u05e2\u05dc \u05d4\u05de\u05d2\u05e9\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d7\u05d1\u05e8 \u05d1\u05d9\u05df \u05d0\u05ea Philips Hue \u05e2\u05dd Home Assistant. \n\n![\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05db\u05e4\u05ea\u05d5\u05e8 \u05d1\u05e8\u05db\u05d6\u05ea](/static/images/config_philips_hue.jpg)", "title": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e8\u05db\u05d6\u05ea" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/hr.json b/homeassistant/components/hue/.translations/hr.json index 16a1b19ff8e0..05be972a510b 100644 --- a/homeassistant/components/hue/.translations/hr.json +++ b/homeassistant/components/hue/.translations/hr.json @@ -10,7 +10,7 @@ "host": "Host" } } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/hu.json b/homeassistant/components/hue/.translations/hu.json index e65286b5c646..52f89dc460bf 100644 --- a/homeassistant/components/hue/.translations/hu.json +++ b/homeassistant/components/hue/.translations/hu.json @@ -23,7 +23,7 @@ "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)", "title": "Kapcsol\u00f3d\u00e1s a hubhoz" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/id.json b/homeassistant/components/hue/.translations/id.json index 253dedb7c4d5..0e2cac536b5b 100644 --- a/homeassistant/components/hue/.translations/id.json +++ b/homeassistant/components/hue/.translations/id.json @@ -23,7 +23,7 @@ "description": "Tekan tombol di bridge untuk mendaftar Philips Hue dengan Home Assistant.\n\n![Lokasi tombol di bridge](/static/images/config_philips_hue.jpg)", "title": "Tautan Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/it.json b/homeassistant/components/hue/.translations/it.json index 5dd64364c108..33a49773c1d4 100644 --- a/homeassistant/components/hue/.translations/it.json +++ b/homeassistant/components/hue/.translations/it.json @@ -25,7 +25,7 @@ "description": "Premi il pulsante sul bridge per registrare Philips Hue con Home Assistant\n\n![Posizione del pulsante sul bridge](/static/images/config_philips_hue.jpg)", "title": "Collega Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ja.json b/homeassistant/components/hue/.translations/ja.json index ccd260cb1cf2..ef2d27ccb80b 100644 --- a/homeassistant/components/hue/.translations/ja.json +++ b/homeassistant/components/hue/.translations/ja.json @@ -9,7 +9,7 @@ "host": "\u30db\u30b9\u30c8" } } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ko.json b/homeassistant/components/hue/.translations/ko.json index 8b1c413b2053..09fd044a1fa8 100644 --- a/homeassistant/components/hue/.translations/ko.json +++ b/homeassistant/components/hue/.translations/ko.json @@ -25,8 +25,7 @@ "description": "\ube0c\ub9bf\uc9c0\uc758 \ubc84\ud2bc\uc744 \ub20c\ub7ec \ud544\ub9bd\uc2a4 Hue\ub97c Home Assistant\uc5d0 \ub4f1\ub85d\ud558\uc138\uc694.\n\n![\ube0c\ub9bf\uc9c0 \ubc84\ud2bc \uc704\uce58](/static/images/config_philips_hue.jpg)", "title": "\ud5c8\ube0c \uc5f0\uacb0" } - }, - "title": "\ud544\ub9bd\uc2a4 Hue \ube0c\ub9bf\uc9c0" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \ub20c\ub9b4 \ub54c", "remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c" } - } + }, + "title": "\ud544\ub9bd\uc2a4 Hue \ube0c\ub9bf\uc9c0" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/lb.json b/homeassistant/components/hue/.translations/lb.json index 2b5b168817f1..a0f03689a21f 100644 --- a/homeassistant/components/hue/.translations/lb.json +++ b/homeassistant/components/hue/.translations/lb.json @@ -25,8 +25,7 @@ "description": "Dr\u00e9ckt de Kn\u00e4ppchen un der Bridge fir den Philips Hue mam Home Assistant ze registr\u00e9ieren.\n\n![Kn\u00e4ppchen un der Bridge](/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" Kn\u00e4ppche gedr\u00e9ckt", "remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/nl.json b/homeassistant/components/hue/.translations/nl.json index ba6ee67624cc..5c717391c745 100644 --- a/homeassistant/components/hue/.translations/nl.json +++ b/homeassistant/components/hue/.translations/nl.json @@ -25,8 +25,7 @@ "description": "Druk op de knop van de bridge om Philips Hue te registreren met Home Assistant. \n\n![Locatie van de knop op bridge](/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -37,5 +36,6 @@ "turn_off": "Uitschakelen", "turn_on": "Inschakelen" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/nn.json b/homeassistant/components/hue/.translations/nn.json index 744a8e10c222..14e5b5cbb9df 100644 --- a/homeassistant/components/hue/.translations/nn.json +++ b/homeassistant/components/hue/.translations/nn.json @@ -23,7 +23,7 @@ "description": "Trykk p\u00e5 knappen p\u00e5 brua, for \u00e5 registrere Philips Hue med Home Assistant.\n\n![Lokasjon til knappen p\u00e5 brua](/statisk/bilete/konfiguer_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/no.json b/homeassistant/components/hue/.translations/no.json index 961311d7304a..2ddeb89d6b82 100644 --- a/homeassistant/components/hue/.translations/no.json +++ b/homeassistant/components/hue/.translations/no.json @@ -25,7 +25,7 @@ "description": "Trykk p\u00e5 knappen p\u00e5 Bridgen for \u00e5 registrere Philips Hue med Home Assistant. \n\n ![Knappens plassering p\u00e5 Bridgen](/static/images/config_philips_hue.jpg)", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pl.json b/homeassistant/components/hue/.translations/pl.json index 00b9374459c3..aec784bca4a7 100644 --- a/homeassistant/components/hue/.translations/pl.json +++ b/homeassistant/components/hue/.translations/pl.json @@ -25,7 +25,7 @@ "description": "Naci\u015bnij przycisk na mostku, aby zarejestrowa\u0107 Philips Hue w Home Assistant.\n\n![Location of button on bridge](/static/images/config_philips_hue.jpg)", "title": "Hub Link" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pt-BR.json b/homeassistant/components/hue/.translations/pt-BR.json index 3f69f9803a4c..c37f8ac9dc95 100644 --- a/homeassistant/components/hue/.translations/pt-BR.json +++ b/homeassistant/components/hue/.translations/pt-BR.json @@ -25,7 +25,7 @@ "description": "Pressione o bot\u00e3o na ponte para registrar o Philips Hue com o Home Assistant. \n\n ![Localiza\u00e7\u00e3o do bot\u00e3o na ponte](/static/images/config_philips_hue.jpg)", "title": "Hub de links" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pt.json b/homeassistant/components/hue/.translations/pt.json index a3e755fa7900..422dbc94aa13 100644 --- a/homeassistant/components/hue/.translations/pt.json +++ b/homeassistant/components/hue/.translations/pt.json @@ -23,7 +23,7 @@ "description": "Pressione o bot\u00e3o no Philips Hue para registrar com o Home Assistant. \n\n![Localiza\u00e7\u00e3o do bot\u00e3o] (/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ro.json b/homeassistant/components/hue/.translations/ro.json index 4866ace08d60..7850a0cb0b25 100644 --- a/homeassistant/components/hue/.translations/ro.json +++ b/homeassistant/components/hue/.translations/ro.json @@ -19,7 +19,7 @@ "link": { "description": "Ap\u0103sa\u021bi butonul de pe pod pentru a \u00eenregistra Philips Hue cu Home Assistant. \n\n![Loca\u021bia butonului pe pod](/static/images/config_philips_hue.jpg)" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ru.json b/homeassistant/components/hue/.translations/ru.json index fa2f2e557442..1de7280fe547 100644 --- a/homeassistant/components/hue/.translations/ru.json +++ b/homeassistant/components/hue/.translations/ru.json @@ -25,8 +25,7 @@ "description": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0448\u043b\u044e\u0437\u0435 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 Philips Hue \u0432 Home Assistant.\n\n![\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0448\u043b\u044e\u0437\u0435](/static/images/config_philips_hue.jpg)", "title": "Philips Hue" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430", "remote_button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/sl.json b/homeassistant/components/hue/.translations/sl.json index 090837423100..53a59c63d92a 100644 --- a/homeassistant/components/hue/.translations/sl.json +++ b/homeassistant/components/hue/.translations/sl.json @@ -25,7 +25,7 @@ "description": "Pritisnite gumb na mostu, da registrirate Philips Hue s Home Assistantom. \n\n![Polo\u017eaj gumba na mostu](/static/images/config_philips_hue.jpg)", "title": "Link Hub" } - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/sv.json b/homeassistant/components/hue/.translations/sv.json index aedfc0c0f400..3b96ff44c286 100644 --- a/homeassistant/components/hue/.translations/sv.json +++ b/homeassistant/components/hue/.translations/sv.json @@ -25,7 +25,7 @@ "description": "Tryck p\u00e5 knappen p\u00e5 bryggan f\u00f6r att registrera Philips Hue med Home Assistant. \n\n![Placering av knapp p\u00e5 brygga](/static/images/config_philips_hue.jpg)", "title": "L\u00e4nka hub" } - }, - "title": "Philips Hue Bridge" - } + } + }, + "title": "Philips Hue Bridge" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/th.json b/homeassistant/components/hue/.translations/th.json index c76064c0ab60..65b36418d2f2 100644 --- a/homeassistant/components/hue/.translations/th.json +++ b/homeassistant/components/hue/.translations/th.json @@ -5,7 +5,7 @@ }, "error": { "register_failed": "\u0e01\u0e32\u0e23\u0e25\u0e07\u0e17\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27\u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07" - }, - "title": "Philips Hue" - } + } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/zh-Hans.json b/homeassistant/components/hue/.translations/zh-Hans.json index 5e2f35bfea85..c7ecdd85e20f 100644 --- a/homeassistant/components/hue/.translations/zh-Hans.json +++ b/homeassistant/components/hue/.translations/zh-Hans.json @@ -24,7 +24,7 @@ "description": "\u8bf7\u6309\u4e0b\u6865\u63a5\u5668\u4e0a\u7684\u6309\u94ae\uff0c\u4ee5\u5728 Home Assistant \u4e0a\u6ce8\u518c\u98de\u5229\u6d66 Hue\u3002\n\n![\u6865\u63a5\u5668\u6309\u94ae\u4f4d\u7f6e](/static/images/config_philips_hue.jpg)", "title": "\u8fde\u63a5\u4e2d\u67a2" } - }, - "title": "\u98de\u5229\u6d66 Hue Bridge" - } + } + }, + "title": "\u98de\u5229\u6d66 Hue Bridge" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/zh-Hant.json b/homeassistant/components/hue/.translations/zh-Hant.json index 0aa75438f7bb..dc48222b5f9f 100644 --- a/homeassistant/components/hue/.translations/zh-Hant.json +++ b/homeassistant/components/hue/.translations/zh-Hant.json @@ -25,8 +25,7 @@ "description": "\u6309\u4e0b Bridge \u4e0a\u7684\u6309\u9215\uff0c\u4ee5\u5c07 Philips Hue \u8a3b\u518a\u81f3 Home Assistant\u3002\n\n![Location of button on bridge](/static/images/config_philips_hue.jpg)", "title": "\u9023\u7d50 Hub" } - }, - "title": "Philips Hue" + } }, "device_automation": { "trigger_subtype": { @@ -44,5 +43,6 @@ "remote_button_short_press": "\"{subtype}\" \u6309\u9215\u5df2\u6309\u4e0b", "remote_button_short_release": "\"{subtype}\" \u6309\u9215\u5df2\u91cb\u653e" } - } + }, + "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/bg.json b/homeassistant/components/iaqualink/.translations/bg.json index 5b37bde3ee3a..70d4247f40dd 100644 --- a/homeassistant/components/iaqualink/.translations/bg.json +++ b/homeassistant/components/iaqualink/.translations/bg.json @@ -15,7 +15,7 @@ "description": "\u041c\u043e\u043b\u044f \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e\u0442\u043e \u0438\u043c\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u0430\u0442\u0430 \u043d\u0430 \u0432\u0430\u0448\u0438\u044f iAqualink \u0430\u043a\u0430\u0443\u043d\u0442.", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ca.json b/homeassistant/components/iaqualink/.translations/ca.json index a5456c7b0cd0..ef90886054fe 100644 --- a/homeassistant/components/iaqualink/.translations/ca.json +++ b/homeassistant/components/iaqualink/.translations/ca.json @@ -15,7 +15,7 @@ "description": "Introdueix el nom d'usuari i la contrasenya del teu compte d'iAqualink.", "title": "Connexi\u00f3 amb iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/da.json b/homeassistant/components/iaqualink/.translations/da.json index a1e1c20cbc5e..ae5c6ecb1d3b 100644 --- a/homeassistant/components/iaqualink/.translations/da.json +++ b/homeassistant/components/iaqualink/.translations/da.json @@ -15,7 +15,7 @@ "description": "Indtast brugernavn og adgangskode til din iAqualink-konto.", "title": "Opret forbindelse til iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/de.json b/homeassistant/components/iaqualink/.translations/de.json index 26ff4b9dcf59..d3e6fabb2de8 100644 --- a/homeassistant/components/iaqualink/.translations/de.json +++ b/homeassistant/components/iaqualink/.translations/de.json @@ -15,7 +15,7 @@ "description": "Bitte gib den Benutzernamen und das Passwort f\u00fcr dein iAqualink-Konto ein.", "title": "Mit iAqualink verbinden" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/en.json b/homeassistant/components/iaqualink/.translations/en.json index 4972c3d3ff7d..8cc1c6ed450b 100644 --- a/homeassistant/components/iaqualink/.translations/en.json +++ b/homeassistant/components/iaqualink/.translations/en.json @@ -15,7 +15,7 @@ "description": "Please enter the username and password for your iAqualink account.", "title": "Connect to iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/es.json b/homeassistant/components/iaqualink/.translations/es.json index 698be68bd78e..593f41e0e157 100644 --- a/homeassistant/components/iaqualink/.translations/es.json +++ b/homeassistant/components/iaqualink/.translations/es.json @@ -15,7 +15,7 @@ "description": "Por favor, introduzca el nombre de usuario y la contrase\u00f1a de su cuenta de iAqualink.", "title": "Con\u00e9ctese a iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/fr.json b/homeassistant/components/iaqualink/.translations/fr.json index 97971b99e9f7..7a36a49f498a 100644 --- a/homeassistant/components/iaqualink/.translations/fr.json +++ b/homeassistant/components/iaqualink/.translations/fr.json @@ -15,7 +15,7 @@ "description": "Veuillez saisir le nom d'utilisateur et le mot de passe de votre compte iAqualink.", "title": "Se connecter \u00e0 iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/it.json b/homeassistant/components/iaqualink/.translations/it.json index 73d840bdbd37..0ce1fd2eead6 100644 --- a/homeassistant/components/iaqualink/.translations/it.json +++ b/homeassistant/components/iaqualink/.translations/it.json @@ -15,7 +15,7 @@ "description": "Inserisci il nome utente e la password del tuo account iAqualink.", "title": "Collegati a iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ko.json b/homeassistant/components/iaqualink/.translations/ko.json index 26bfa37d6be2..8fe750b661d9 100644 --- a/homeassistant/components/iaqualink/.translations/ko.json +++ b/homeassistant/components/iaqualink/.translations/ko.json @@ -15,7 +15,7 @@ "description": "iAqualink \uacc4\uc815\uc758 \uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "iAqualink \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/lb.json b/homeassistant/components/iaqualink/.translations/lb.json index db8d67eea755..5effa2b96274 100644 --- a/homeassistant/components/iaqualink/.translations/lb.json +++ b/homeassistant/components/iaqualink/.translations/lb.json @@ -15,7 +15,7 @@ "description": "Gitt den Benotzernumm an d'Passwuert fir \u00e4ren iAqualink Kont un.", "title": "Mat iAqualink verbannen" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/nl.json b/homeassistant/components/iaqualink/.translations/nl.json index c0a515bb741e..80ce76009af8 100644 --- a/homeassistant/components/iaqualink/.translations/nl.json +++ b/homeassistant/components/iaqualink/.translations/nl.json @@ -15,7 +15,7 @@ "description": "Voer de gebruikersnaam en het wachtwoord voor uw iAqualink-account in.", "title": "Verbinding maken met iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/nn.json b/homeassistant/components/iaqualink/.translations/nn.json index ea78f0d0d5dd..57b177c05727 100644 --- a/homeassistant/components/iaqualink/.translations/nn.json +++ b/homeassistant/components/iaqualink/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Jandy iAqualink" - } + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/no.json b/homeassistant/components/iaqualink/.translations/no.json index 0647f2ecfb87..d607343fe201 100644 --- a/homeassistant/components/iaqualink/.translations/no.json +++ b/homeassistant/components/iaqualink/.translations/no.json @@ -15,7 +15,7 @@ "description": "Vennligst skriv inn brukernavn og passord for iAqualink-kontoen din.", "title": "Koble til iAqualink" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/pl.json b/homeassistant/components/iaqualink/.translations/pl.json index d14a2775c157..22a0d6364150 100644 --- a/homeassistant/components/iaqualink/.translations/pl.json +++ b/homeassistant/components/iaqualink/.translations/pl.json @@ -15,7 +15,7 @@ "description": "Wprowad\u017a nazw\u0119 u\u017cytkownika i has\u0142o do konta iAqualink.", "title": "Po\u0142\u0105cz z iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ru.json b/homeassistant/components/iaqualink/.translations/ru.json index 8c8e30fe067d..853b3527c9da 100644 --- a/homeassistant/components/iaqualink/.translations/ru.json +++ b/homeassistant/components/iaqualink/.translations/ru.json @@ -15,7 +15,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 iAqualink.", "title": "Jandy iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/sl.json b/homeassistant/components/iaqualink/.translations/sl.json index e2a7f94b3d8a..d54bce408d52 100644 --- a/homeassistant/components/iaqualink/.translations/sl.json +++ b/homeassistant/components/iaqualink/.translations/sl.json @@ -15,7 +15,7 @@ "description": "Prosimo, vnesite uporabni\u0161ko ime in geslo za iAqualink ra\u010dun.", "title": "Pove\u017eite se z iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/sv.json b/homeassistant/components/iaqualink/.translations/sv.json index aa2b41426165..aa4c31d0ae11 100644 --- a/homeassistant/components/iaqualink/.translations/sv.json +++ b/homeassistant/components/iaqualink/.translations/sv.json @@ -15,7 +15,7 @@ "description": "V\u00e4nligen ange anv\u00e4ndarnamn och l\u00f6senord f\u00f6r ditt iAqualink-konto.", "title": "Anslut till iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/zh-Hant.json b/homeassistant/components/iaqualink/.translations/zh-Hant.json index 146088b4eff9..abe05d9c37db 100644 --- a/homeassistant/components/iaqualink/.translations/zh-Hant.json +++ b/homeassistant/components/iaqualink/.translations/zh-Hant.json @@ -15,7 +15,7 @@ "description": "\u8acb\u8f38\u5165 iAqualink \u5e33\u865f\u4f7f\u7528\u8005\u540d\u7a31\u8207\u5bc6\u78bc\u3002", "title": "\u9023\u7dda\u81f3 iAqualink" } - }, - "title": "Jandy iAqualink" - } + } + }, + "title": "Jandy iAqualink" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ca.json b/homeassistant/components/icloud/.translations/ca.json index c9e6f046d8a1..81d907c4824c 100644 --- a/homeassistant/components/icloud/.translations/ca.json +++ b/homeassistant/components/icloud/.translations/ca.json @@ -33,7 +33,7 @@ "description": "Introdueix el codi de verificaci\u00f3 que rebis d'iCloud", "title": "Codi de verificaci\u00f3 iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/da.json b/homeassistant/components/icloud/.translations/da.json index 49d1a82a753e..44419d333cef 100644 --- a/homeassistant/components/icloud/.translations/da.json +++ b/homeassistant/components/icloud/.translations/da.json @@ -33,7 +33,7 @@ "description": "Indtast venligst den bekr\u00e6ftelseskode, du lige har modtaget fra iCloud", "title": "iCloud-bekr\u00e6ftelseskode" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/de.json b/homeassistant/components/icloud/.translations/de.json index e317741a0a24..80f2612bfdca 100644 --- a/homeassistant/components/icloud/.translations/de.json +++ b/homeassistant/components/icloud/.translations/de.json @@ -33,7 +33,7 @@ "description": "Bitte gib den Best\u00e4tigungscode ein, den du gerade von iCloud erhalten hast", "title": "iCloud-Best\u00e4tigungscode" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/en.json b/homeassistant/components/icloud/.translations/en.json index 19a07a19c684..2425a37207d0 100644 --- a/homeassistant/components/icloud/.translations/en.json +++ b/homeassistant/components/icloud/.translations/en.json @@ -33,7 +33,7 @@ "description": "Please enter the verification code you just received from iCloud", "title": "iCloud verification code" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/es.json b/homeassistant/components/icloud/.translations/es.json index d81fdc804ac3..8b6ceb83f582 100644 --- a/homeassistant/components/icloud/.translations/es.json +++ b/homeassistant/components/icloud/.translations/es.json @@ -33,7 +33,7 @@ "description": "Por favor, introduzca el c\u00f3digo de verificaci\u00f3n que acaba de recibir de iCloud", "title": "C\u00f3digo de verificaci\u00f3n de iCloud" } - }, - "title": "iCloud de Apple" - } + } + }, + "title": "iCloud de Apple" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/fr.json b/homeassistant/components/icloud/.translations/fr.json index e1a2517e4d77..c017f0a93d70 100644 --- a/homeassistant/components/icloud/.translations/fr.json +++ b/homeassistant/components/icloud/.translations/fr.json @@ -32,7 +32,7 @@ "description": "Veuillez entrer le code de v\u00e9rification que vous venez de recevoir d'iCloud", "title": "Code de v\u00e9rification iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/hu.json b/homeassistant/components/icloud/.translations/hu.json index 14c8c8e4e2fb..9dc7b767e215 100644 --- a/homeassistant/components/icloud/.translations/hu.json +++ b/homeassistant/components/icloud/.translations/hu.json @@ -28,7 +28,7 @@ "description": "K\u00e9rj\u00fck, \u00edrja be az iCloud-t\u00f3l \u00e9ppen kapott ellen\u0151rz\u0151 k\u00f3dot", "title": "iCloud ellen\u0151rz\u0151 k\u00f3d" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/it.json b/homeassistant/components/icloud/.translations/it.json index 61cd4690179e..60c389473363 100644 --- a/homeassistant/components/icloud/.translations/it.json +++ b/homeassistant/components/icloud/.translations/it.json @@ -33,7 +33,7 @@ "description": "Inserisci il codice di verifica che hai appena ricevuto da iCloud", "title": "Codice di verifica iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ko.json b/homeassistant/components/icloud/.translations/ko.json index 8bc26c300e0a..0469853fd705 100644 --- a/homeassistant/components/icloud/.translations/ko.json +++ b/homeassistant/components/icloud/.translations/ko.json @@ -33,7 +33,7 @@ "description": "iCloud \uc5d0\uc11c \ubc1b\uc740 \uc778\uc99d \ucf54\ub4dc\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "iCloud \uc778\uc99d \ucf54\ub4dc" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/lb.json b/homeassistant/components/icloud/.translations/lb.json index 0aa3c90eff0d..3ee3f7a24f34 100644 --- a/homeassistant/components/icloud/.translations/lb.json +++ b/homeassistant/components/icloud/.translations/lb.json @@ -33,7 +33,7 @@ "description": "Gitt de Verifikatiouns Code an deen dir elo grad vun iCloud kritt hutt", "title": "iCloud Verifikatiouns Code" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/lv.json b/homeassistant/components/icloud/.translations/lv.json index 6e642b85933d..5db8cf1fe6b0 100644 --- a/homeassistant/components/icloud/.translations/lv.json +++ b/homeassistant/components/icloud/.translations/lv.json @@ -12,7 +12,7 @@ "username": "E-pasts" } } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/nl.json b/homeassistant/components/icloud/.translations/nl.json index fe0e7d075725..c111234ed376 100644 --- a/homeassistant/components/icloud/.translations/nl.json +++ b/homeassistant/components/icloud/.translations/nl.json @@ -31,7 +31,7 @@ "description": "Voer de verificatiecode in die u zojuist van iCloud hebt ontvangen", "title": "iCloud verificatiecode" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/no.json b/homeassistant/components/icloud/.translations/no.json index 3ba3207cc24b..ef1dd82f3428 100644 --- a/homeassistant/components/icloud/.translations/no.json +++ b/homeassistant/components/icloud/.translations/no.json @@ -33,7 +33,7 @@ "description": "Vennligst skriv inn bekreftelseskoden du nettopp har f\u00e5tt fra iCloud", "title": "iCloud-bekreftelseskode" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/pl.json b/homeassistant/components/icloud/.translations/pl.json index 9c65891d2610..636a2dd86942 100644 --- a/homeassistant/components/icloud/.translations/pl.json +++ b/homeassistant/components/icloud/.translations/pl.json @@ -33,7 +33,7 @@ "description": "Wprowad\u017a kod weryfikacyjny, kt\u00f3ry w\u0142a\u015bnie otrzyma\u0142e\u015b z iCloud", "title": "Kod weryfikacyjny iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/pt-BR.json b/homeassistant/components/icloud/.translations/pt-BR.json index 4e45568ae680..f9e45c8af8c9 100644 --- a/homeassistant/components/icloud/.translations/pt-BR.json +++ b/homeassistant/components/icloud/.translations/pt-BR.json @@ -31,7 +31,7 @@ "description": "Digite o c\u00f3digo de verifica\u00e7\u00e3o que voc\u00ea acabou de receber do iCloud", "title": "c\u00f3digo de verifica\u00e7\u00e3o do iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ru.json b/homeassistant/components/icloud/.translations/ru.json index b0869df14b16..f55a5d4ffa44 100644 --- a/homeassistant/components/icloud/.translations/ru.json +++ b/homeassistant/components/icloud/.translations/ru.json @@ -33,7 +33,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 iCloud", "title": "\u041a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f iCloud" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/sl.json b/homeassistant/components/icloud/.translations/sl.json index 6887eddde667..6ee3355dfed5 100644 --- a/homeassistant/components/icloud/.translations/sl.json +++ b/homeassistant/components/icloud/.translations/sl.json @@ -33,7 +33,7 @@ "description": "Prosimo, vnesite kodo za preverjanje, ki ste jo pravkar prejeli od iCloud", "title": "iCloud koda za preverjanje" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/sv.json b/homeassistant/components/icloud/.translations/sv.json index fc5b81b6591c..72c0717d85b5 100644 --- a/homeassistant/components/icloud/.translations/sv.json +++ b/homeassistant/components/icloud/.translations/sv.json @@ -31,7 +31,7 @@ "description": "V\u00e4nligen ange verifieringskoden som du just f\u00e5tt fr\u00e5n iCloud", "title": "iCloud-verifieringskod" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/zh-Hans.json b/homeassistant/components/icloud/.translations/zh-Hans.json index dd5592884bec..851599524764 100644 --- a/homeassistant/components/icloud/.translations/zh-Hans.json +++ b/homeassistant/components/icloud/.translations/zh-Hans.json @@ -30,7 +30,7 @@ "description": "\u8bf7\u8f93\u5165\u60a8\u521a\u521a\u4ece iCloud \u6536\u5230\u7684\u9a8c\u8bc1\u7801", "title": "iCloud \u9a8c\u8bc1\u7801" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/zh-Hant.json b/homeassistant/components/icloud/.translations/zh-Hant.json index 935693f87c15..c2a8ac510db0 100644 --- a/homeassistant/components/icloud/.translations/zh-Hant.json +++ b/homeassistant/components/icloud/.translations/zh-Hant.json @@ -33,7 +33,7 @@ "description": "\u8acb\u8f38\u5165\u6240\u6536\u5230\u7684 iCloud \u9a57\u8b49\u78bc", "title": "iCloud \u9a57\u8b49\u78bc" } - }, - "title": "Apple iCloud" - } + } + }, + "title": "Apple iCloud" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/bg.json b/homeassistant/components/ifttt/.translations/bg.json index 683105db8687..90b0574cb2da 100644 --- a/homeassistant/components/ifttt/.translations/bg.json +++ b/homeassistant/components/ifttt/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 IFTTT?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 IFTTT Webhook \u0430\u043f\u043b\u0435\u0442" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ca.json b/homeassistant/components/ifttt/.translations/ca.json index 979ed3cd71f6..d4aa6099d0af 100644 --- a/homeassistant/components/ifttt/.translations/ca.json +++ b/homeassistant/components/ifttt/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar IFTTT?", "title": "Configuraci\u00f3 de la miniaplicaci\u00f3 Webhook de IFTTT" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/cs.json b/homeassistant/components/ifttt/.translations/cs.json index 091ea9bc3523..107657e9cfee 100644 --- a/homeassistant/components/ifttt/.translations/cs.json +++ b/homeassistant/components/ifttt/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit IFTTT?", "title": "Nastavte applet IFTTT Webhook" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/da.json b/homeassistant/components/ifttt/.translations/da.json index 0e0c735eb897..3b0e2d4b9ef4 100644 --- a/homeassistant/components/ifttt/.translations/da.json +++ b/homeassistant/components/ifttt/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5, at du vil konfigurere IFTTT?", "title": "Konfigurer IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/de.json b/homeassistant/components/ifttt/.translations/de.json index a5b661563890..e5e5c2439ada 100644 --- a/homeassistant/components/ifttt/.translations/de.json +++ b/homeassistant/components/ifttt/.translations/de.json @@ -12,7 +12,7 @@ "description": "Bist du sicher, dass du IFTTT einrichten m\u00f6chtest?", "title": "Einrichten des IFTTT Webhook Applets" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/en.json b/homeassistant/components/ifttt/.translations/en.json index dae4b24de47b..a5fdd0a5b1d5 100644 --- a/homeassistant/components/ifttt/.translations/en.json +++ b/homeassistant/components/ifttt/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up IFTTT?", "title": "Set up the IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/es-419.json b/homeassistant/components/ifttt/.translations/es-419.json index 46096bbe6313..3d88caa84f50 100644 --- a/homeassistant/components/ifttt/.translations/es-419.json +++ b/homeassistant/components/ifttt/.translations/es-419.json @@ -11,7 +11,7 @@ "user": { "description": "\u00bfEst\u00e1s seguro de que quieres configurar IFTTT?" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/es.json b/homeassistant/components/ifttt/.translations/es.json index 4d09e6971507..4f2c6fb52d48 100644 --- a/homeassistant/components/ifttt/.translations/es.json +++ b/homeassistant/components/ifttt/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar IFTTT?", "title": "Configurar el applet de webhook IFTTT" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/et.json b/homeassistant/components/ifttt/.translations/et.json index 8c4c45f9c897..d8a4c4530151 100644 --- a/homeassistant/components/ifttt/.translations/et.json +++ b/homeassistant/components/ifttt/.translations/et.json @@ -1,5 +1,3 @@ { - "config": { - "title": "" - } + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/fr.json b/homeassistant/components/ifttt/.translations/fr.json index 659b11ae98ab..132d4f116cc7 100644 --- a/homeassistant/components/ifttt/.translations/fr.json +++ b/homeassistant/components/ifttt/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer IFTTT?", "title": "Configurer l'applet IFTTT Webhook" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/hr.json b/homeassistant/components/ifttt/.translations/hr.json index 077956287b3e..8e00d0bfe2d6 100644 --- a/homeassistant/components/ifttt/.translations/hr.json +++ b/homeassistant/components/ifttt/.translations/hr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "IFTTT" - } + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/hu.json b/homeassistant/components/ifttt/.translations/hu.json index 3c4ec66e9a3e..41ee9b504790 100644 --- a/homeassistant/components/ifttt/.translations/hu.json +++ b/homeassistant/components/ifttt/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az IFTTT-t?", "title": "IFTTT Webhook Applet be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/it.json b/homeassistant/components/ifttt/.translations/it.json index d6faf60d618e..c93c6823e468 100644 --- a/homeassistant/components/ifttt/.translations/it.json +++ b/homeassistant/components/ifttt/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare IFTTT?", "title": "Configura l'applet WebHook IFTTT" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ko.json b/homeassistant/components/ifttt/.translations/ko.json index 9c8083a1d945..7bf288932523 100644 --- a/homeassistant/components/ifttt/.translations/ko.json +++ b/homeassistant/components/ifttt/.translations/ko.json @@ -12,7 +12,7 @@ "description": "IFTTT \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "IFTTT Webhook \uc560\ud50c\ub9bf \uc124\uc815" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/lb.json b/homeassistant/components/ifttt/.translations/lb.json index 74e6b4926ef8..1560b7c8996c 100644 --- a/homeassistant/components/ifttt/.translations/lb.json +++ b/homeassistant/components/ifttt/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir IFTTT anzeriichten?", "title": "IFTTT Webhook Applet ariichten" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/nl.json b/homeassistant/components/ifttt/.translations/nl.json index 9188b1f6b081..2e913abf64cd 100644 --- a/homeassistant/components/ifttt/.translations/nl.json +++ b/homeassistant/components/ifttt/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet je zeker dat u IFTTT wilt instellen?", "title": "Stel de IFTTT Webhook-applet in" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/nn.json b/homeassistant/components/ifttt/.translations/nn.json index e3bef7270e52..d0218da5b2bc 100644 --- a/homeassistant/components/ifttt/.translations/nn.json +++ b/homeassistant/components/ifttt/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "description": "Er du sikker p\u00e5 at du \u00f8nskjer \u00e5 setta opp IFTTT?" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/no.json b/homeassistant/components/ifttt/.translations/no.json index 2fe38659fadb..ad11a9b72dfe 100644 --- a/homeassistant/components/ifttt/.translations/no.json +++ b/homeassistant/components/ifttt/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp IFTTT?", "title": "Sett opp IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pl.json b/homeassistant/components/ifttt/.translations/pl.json index 206702eb593c..e9aa35f5d248 100644 --- a/homeassistant/components/ifttt/.translations/pl.json +++ b/homeassistant/components/ifttt/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 IFTTT?", "title": "Konfiguracja apletu Webhook IFTTT" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pt-BR.json b/homeassistant/components/ifttt/.translations/pt-BR.json index 9e91de083074..d96a34454db5 100644 --- a/homeassistant/components/ifttt/.translations/pt-BR.json +++ b/homeassistant/components/ifttt/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o IFTTT?", "title": "Configurar o IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pt.json b/homeassistant/components/ifttt/.translations/pt.json index e18541fcab96..e29c103de9e5 100644 --- a/homeassistant/components/ifttt/.translations/pt.json +++ b/homeassistant/components/ifttt/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o IFTTT?", "title": "Configurar o IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ro.json b/homeassistant/components/ifttt/.translations/ro.json index dd7ae5f72cbe..1025bedcf7d4 100644 --- a/homeassistant/components/ifttt/.translations/ro.json +++ b/homeassistant/components/ifttt/.translations/ro.json @@ -8,7 +8,7 @@ "user": { "description": "Sigur dori\u021bi s\u0103 configura\u021bi IFTTT?" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ru.json b/homeassistant/components/ifttt/.translations/ru.json index 128db247150e..d2b7e6cd7927 100644 --- a/homeassistant/components/ifttt/.translations/ru.json +++ b/homeassistant/components/ifttt/.translations/ru.json @@ -12,7 +12,7 @@ "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 IFTTT?", "title": "IFTTT" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/sl.json b/homeassistant/components/ifttt/.translations/sl.json index efb966880ebe..62b767524a54 100644 --- a/homeassistant/components/ifttt/.translations/sl.json +++ b/homeassistant/components/ifttt/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti IFTTT?", "title": "Nastavite IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/sv.json b/homeassistant/components/ifttt/.translations/sv.json index 883bb0428227..57c1d1a8d910 100644 --- a/homeassistant/components/ifttt/.translations/sv.json +++ b/homeassistant/components/ifttt/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill st\u00e4lla in IFTTT?", "title": "St\u00e4lla in IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/th.json b/homeassistant/components/ifttt/.translations/th.json index 077956287b3e..8e00d0bfe2d6 100644 --- a/homeassistant/components/ifttt/.translations/th.json +++ b/homeassistant/components/ifttt/.translations/th.json @@ -1,5 +1,3 @@ { - "config": { - "title": "IFTTT" - } + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/tr.json b/homeassistant/components/ifttt/.translations/tr.json index 80188b637f97..0061b9f61662 100644 --- a/homeassistant/components/ifttt/.translations/tr.json +++ b/homeassistant/components/ifttt/.translations/tr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "IFTT" - } + "title": "IFTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/zh-Hans.json b/homeassistant/components/ifttt/.translations/zh-Hans.json index e9f7aeb36d41..bf8c63c571bb 100644 --- a/homeassistant/components/ifttt/.translations/zh-Hans.json +++ b/homeassistant/components/ifttt/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e IFTTT \u5417\uff1f", "title": "\u8bbe\u7f6e IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/zh-Hant.json b/homeassistant/components/ifttt/.translations/zh-Hant.json index 8610351f43b9..f51ab3954a58 100644 --- a/homeassistant/components/ifttt/.translations/zh-Hant.json +++ b/homeassistant/components/ifttt/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a IFTTT\uff1f", "title": "\u8a2d\u5b9a IFTTT Webhook Applet" } - }, - "title": "IFTTT" - } + } + }, + "title": "IFTTT" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/bg.json b/homeassistant/components/ios/.translations/bg.json index 58028d1caaea..c3cf8fd8df6f 100644 --- a/homeassistant/components/ios/.translations/bg.json +++ b/homeassistant/components/ios/.translations/bg.json @@ -8,7 +8,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Home Assistant iOS \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ca.json b/homeassistant/components/ios/.translations/ca.json index dcbffdcebd0f..01ab34b1e22f 100644 --- a/homeassistant/components/ios/.translations/ca.json +++ b/homeassistant/components/ios/.translations/ca.json @@ -8,7 +8,7 @@ "description": "Vols configurar el component Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/cs.json b/homeassistant/components/ios/.translations/cs.json index 3f6c634f38f0..6be48c3a2e20 100644 --- a/homeassistant/components/ios/.translations/cs.json +++ b/homeassistant/components/ios/.translations/cs.json @@ -8,7 +8,7 @@ "description": "Chcete nastavit komponenty Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/da.json b/homeassistant/components/ios/.translations/da.json index 4a900097b148..07f90ed2d0ad 100644 --- a/homeassistant/components/ios/.translations/da.json +++ b/homeassistant/components/ios/.translations/da.json @@ -8,7 +8,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/de.json b/homeassistant/components/ios/.translations/de.json index 18ffda135eec..bf6331c72b71 100644 --- a/homeassistant/components/ios/.translations/de.json +++ b/homeassistant/components/ios/.translations/de.json @@ -8,7 +8,7 @@ "description": "M\u00f6chtest du die Home Assistant iOS-Komponente einrichten?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/en.json b/homeassistant/components/ios/.translations/en.json index ae2e4e03f74a..bad6552e178e 100644 --- a/homeassistant/components/ios/.translations/en.json +++ b/homeassistant/components/ios/.translations/en.json @@ -8,7 +8,7 @@ "description": "Do you want to set up the Home Assistant iOS component?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/es-419.json b/homeassistant/components/ios/.translations/es-419.json index 38a12e7411ae..5cae304942a8 100644 --- a/homeassistant/components/ios/.translations/es-419.json +++ b/homeassistant/components/ios/.translations/es-419.json @@ -8,7 +8,7 @@ "description": "\u00bfDesea configurar el componente iOS de Home Assistant?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/es.json b/homeassistant/components/ios/.translations/es.json index afd4fedc97eb..9bc3db4e6f5c 100644 --- a/homeassistant/components/ios/.translations/es.json +++ b/homeassistant/components/ios/.translations/es.json @@ -8,7 +8,7 @@ "description": "\u00bfDesea configurar el componente iOS de Home Assistant?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/et.json b/homeassistant/components/ios/.translations/et.json index 987c54955f20..a98a23c7f0bd 100644 --- a/homeassistant/components/ios/.translations/et.json +++ b/homeassistant/components/ios/.translations/et.json @@ -4,7 +4,7 @@ "confirm": { "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/fr.json b/homeassistant/components/ios/.translations/fr.json index 934849549e7d..da52ef752b38 100644 --- a/homeassistant/components/ios/.translations/fr.json +++ b/homeassistant/components/ios/.translations/fr.json @@ -8,7 +8,7 @@ "description": "Voulez-vous configurer le composant Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/he.json b/homeassistant/components/ios/.translations/he.json index e786e5ae8431..bda9013f6540 100644 --- a/homeassistant/components/ios/.translations/he.json +++ b/homeassistant/components/ios/.translations/he.json @@ -8,7 +8,7 @@ "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/hu.json b/homeassistant/components/ios/.translations/hu.json index 5ee001db3c59..3cd84f50b706 100644 --- a/homeassistant/components/ios/.translations/hu.json +++ b/homeassistant/components/ios/.translations/hu.json @@ -8,7 +8,7 @@ "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a Home Assistant iOS komponenst?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/id.json b/homeassistant/components/ios/.translations/id.json index 5813d9488f0d..88d01439dc49 100644 --- a/homeassistant/components/ios/.translations/id.json +++ b/homeassistant/components/ios/.translations/id.json @@ -8,7 +8,7 @@ "description": "Apakah Anda ingin mengatur komponen iOS Home Assistant?", "title": "Home Asisten iOS" } - }, - "title": "Home Asisten iOS" - } + } + }, + "title": "Home Asisten iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/it.json b/homeassistant/components/ios/.translations/it.json index c2c5042e2952..a1905d3d87a1 100644 --- a/homeassistant/components/ios/.translations/it.json +++ b/homeassistant/components/ios/.translations/it.json @@ -8,7 +8,7 @@ "description": "Vuoi configurare il componente Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant per iOS" - } + } + }, + "title": "Home Assistant per iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ko.json b/homeassistant/components/ios/.translations/ko.json index 283594a45b51..4ae14e28add9 100644 --- a/homeassistant/components/ios/.translations/ko.json +++ b/homeassistant/components/ios/.translations/ko.json @@ -8,7 +8,7 @@ "description": "Home Assistant iOS \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/lb.json b/homeassistant/components/ios/.translations/lb.json index 731371cada9e..09303c4d9526 100644 --- a/homeassistant/components/ios/.translations/lb.json +++ b/homeassistant/components/ios/.translations/lb.json @@ -8,7 +8,7 @@ "description": "W\u00ebllt dir d'Home Assistant iOS Komponent ariichten?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/nl.json b/homeassistant/components/ios/.translations/nl.json index 8e5c46692a03..dc7036f8e26a 100644 --- a/homeassistant/components/ios/.translations/nl.json +++ b/homeassistant/components/ios/.translations/nl.json @@ -8,7 +8,7 @@ "description": "Wilt u het Home Assistant iOS component instellen?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/nn.json b/homeassistant/components/ios/.translations/nn.json index 9d2cf6920064..264b3be1679d 100644 --- a/homeassistant/components/ios/.translations/nn.json +++ b/homeassistant/components/ios/.translations/nn.json @@ -8,7 +8,7 @@ "description": "Vil du sette opp Home Assistant iOS-komponenten?", "title": "Home Assistant Ios" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/no.json b/homeassistant/components/ios/.translations/no.json index 798ae93d33b2..5184c27d59bc 100644 --- a/homeassistant/components/ios/.translations/no.json +++ b/homeassistant/components/ios/.translations/no.json @@ -8,7 +8,7 @@ "description": "\u00d8nsker du \u00e5 konfigurere Home Assistant iOS-komponenten?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pl.json b/homeassistant/components/ios/.translations/pl.json index 6240f074cfc3..25c8bc48dc59 100644 --- a/homeassistant/components/ios/.translations/pl.json +++ b/homeassistant/components/ios/.translations/pl.json @@ -8,7 +8,7 @@ "description": "Czy chcesz skonfigurowa\u0107 Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pt-BR.json b/homeassistant/components/ios/.translations/pt-BR.json index 77efc04b817f..5a8f41fce6e7 100644 --- a/homeassistant/components/ios/.translations/pt-BR.json +++ b/homeassistant/components/ios/.translations/pt-BR.json @@ -8,7 +8,7 @@ "description": "Deseja configurar o componente iOS do Home Assistant?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pt.json b/homeassistant/components/ios/.translations/pt.json index d38b9abb70bb..a9e779c8aad0 100644 --- a/homeassistant/components/ios/.translations/pt.json +++ b/homeassistant/components/ios/.translations/pt.json @@ -8,7 +8,7 @@ "description": "Deseja configurar o componente iOS do Home Assistant?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ro.json b/homeassistant/components/ios/.translations/ro.json index 5a83b5cd7327..4de52c75d2f2 100644 --- a/homeassistant/components/ios/.translations/ro.json +++ b/homeassistant/components/ios/.translations/ro.json @@ -8,7 +8,7 @@ "description": "Dori\u021bi s\u0103 configura\u021bi componenta Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ru.json b/homeassistant/components/ios/.translations/ru.json index 282715ebb3b3..455fcf2d4a31 100644 --- a/homeassistant/components/ios/.translations/ru.json +++ b/homeassistant/components/ios/.translations/ru.json @@ -8,7 +8,7 @@ "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 Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/sl.json b/homeassistant/components/ios/.translations/sl.json index 28e9102aafd9..46409ea5c961 100644 --- a/homeassistant/components/ios/.translations/sl.json +++ b/homeassistant/components/ios/.translations/sl.json @@ -8,7 +8,7 @@ "description": "Ali \u017eelite nastaviti komponento za Home Assistant iOS?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/sv.json b/homeassistant/components/ios/.translations/sv.json index 5a605ed89879..ec982acc0716 100644 --- a/homeassistant/components/ios/.translations/sv.json +++ b/homeassistant/components/ios/.translations/sv.json @@ -8,7 +8,7 @@ "description": "Vill du konfigurera Home Assistants iOS komponent?", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/zh-Hans.json b/homeassistant/components/ios/.translations/zh-Hans.json index 0de30f0f3da0..a02d1d713e20 100644 --- a/homeassistant/components/ios/.translations/zh-Hans.json +++ b/homeassistant/components/ios/.translations/zh-Hans.json @@ -8,7 +8,7 @@ "description": "\u662f\u5426\u8981\u8bbe\u7f6e Home Assistant iOS \u7ec4\u4ef6\uff1f", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/zh-Hant.json b/homeassistant/components/ios/.translations/zh-Hant.json index 8cfedf31673d..ba64432f93a0 100644 --- a/homeassistant/components/ios/.translations/zh-Hant.json +++ b/homeassistant/components/ios/.translations/zh-Hant.json @@ -8,7 +8,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Home Assistant iOS \u5143\u4ef6\uff1f", "title": "Home Assistant iOS" } - }, - "title": "Home Assistant iOS" - } + } + }, + "title": "Home Assistant iOS" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/bg.json b/homeassistant/components/ipma/.translations/bg.json index 70d2c6ef6bc1..99849ee93260 100644 --- a/homeassistant/components/ipma/.translations/bg.json +++ b/homeassistant/components/ipma/.translations/bg.json @@ -13,7 +13,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (IPMA)" - } + } + }, + "title": "\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ca.json b/homeassistant/components/ipma/.translations/ca.json index ad2d37524c51..9f36352003f6 100644 --- a/homeassistant/components/ipma/.translations/ca.json +++ b/homeassistant/components/ipma/.translations/ca.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Ubicaci\u00f3" } - }, - "title": "Servei meteorol\u00f2gic portugu\u00e8s (IPMA)" - } + } + }, + "title": "Servei meteorol\u00f2gic portugu\u00e8s (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/da.json b/homeassistant/components/ipma/.translations/da.json index e2f72db7c4da..acaef8e38849 100644 --- a/homeassistant/components/ipma/.translations/da.json +++ b/homeassistant/components/ipma/.translations/da.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Lokalitet" } - }, - "title": "Portugisisk vejrservice (IPMA)" - } + } + }, + "title": "Portugisisk vejrservice (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/de.json b/homeassistant/components/ipma/.translations/de.json index 977b69576dee..d9d485abb109 100644 --- a/homeassistant/components/ipma/.translations/de.json +++ b/homeassistant/components/ipma/.translations/de.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Standort" } - }, - "title": "Portugiesischer Wetterdienst (IPMA)" - } + } + }, + "title": "Portugiesischer Wetterdienst (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/en.json b/homeassistant/components/ipma/.translations/en.json index d47f0dfb5015..a527f2efaeb0 100644 --- a/homeassistant/components/ipma/.translations/en.json +++ b/homeassistant/components/ipma/.translations/en.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Location" } - }, - "title": "Portuguese weather service (IPMA)" - } + } + }, + "title": "Portuguese weather service (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/es-419.json b/homeassistant/components/ipma/.translations/es-419.json index acb8b51a44c8..ae4158bbc3a8 100644 --- a/homeassistant/components/ipma/.translations/es-419.json +++ b/homeassistant/components/ipma/.translations/es-419.json @@ -13,7 +13,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Ubicaci\u00f3n" } - }, - "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" - } + } + }, + "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/es.json b/homeassistant/components/ipma/.translations/es.json index d6a43fc790bf..805a3eccd2c8 100644 --- a/homeassistant/components/ipma/.translations/es.json +++ b/homeassistant/components/ipma/.translations/es.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Ubicaci\u00f3n" } - }, - "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" - } + } + }, + "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/fr.json b/homeassistant/components/ipma/.translations/fr.json index 46b99e6651a2..5ade982afb51 100644 --- a/homeassistant/components/ipma/.translations/fr.json +++ b/homeassistant/components/ipma/.translations/fr.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Emplacement" } - }, - "title": "Service m\u00e9t\u00e9orologique portugais (IPMA)" - } + } + }, + "title": "Service m\u00e9t\u00e9orologique portugais (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/he.json b/homeassistant/components/ipma/.translations/he.json index 4931fcaf94c7..301a83c5e21e 100644 --- a/homeassistant/components/ipma/.translations/he.json +++ b/homeassistant/components/ipma/.translations/he.json @@ -12,7 +12,7 @@ }, "title": "\u05de\u05d9\u05e7\u05d5\u05dd" } - }, - "title": "\u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05d6\u05d2 \u05d0\u05d5\u05d5\u05d9\u05e8 \u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05d6\u05d9\u05ea (IPMA)" - } + } + }, + "title": "\u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05d6\u05d2 \u05d0\u05d5\u05d5\u05d9\u05e8 \u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05d6\u05d9\u05ea (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/hu.json b/homeassistant/components/ipma/.translations/hu.json index 5165fec9d902..ef01256607e7 100644 --- a/homeassistant/components/ipma/.translations/hu.json +++ b/homeassistant/components/ipma/.translations/hu.json @@ -14,7 +14,7 @@ "description": "Portug\u00e1l Atmoszf\u00e9ra Int\u00e9zet", "title": "Hely" } - }, - "title": "Portug\u00e1l Meteorol\u00f3giai Szolg\u00e1lat (IPMA)" - } + } + }, + "title": "Portug\u00e1l Meteorol\u00f3giai Szolg\u00e1lat (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/it.json b/homeassistant/components/ipma/.translations/it.json index 6e89d4259344..04600d8dd8e7 100644 --- a/homeassistant/components/ipma/.translations/it.json +++ b/homeassistant/components/ipma/.translations/it.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Localit\u00e0" } - }, - "title": "Servizio meteo portoghese (IPMA)" - } + } + }, + "title": "Servizio meteo portoghese (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ko.json b/homeassistant/components/ipma/.translations/ko.json index c5614e170341..009048775fe4 100644 --- a/homeassistant/components/ipma/.translations/ko.json +++ b/homeassistant/components/ipma/.translations/ko.json @@ -14,7 +14,7 @@ "description": "\ud3ec\ub974\ud22c\uac08 \ud574\uc591 \ubc0f \ub300\uae30 \uc5f0\uad6c\uc18c (Instituto Portugu\u00eas do Mar e Atmosfera)", "title": "\uc704\uce58" } - }, - "title": "\ud3ec\ub974\ud22c\uac08 \uae30\uc0c1 \uc11c\ube44\uc2a4 (IPMA)" - } + } + }, + "title": "\ud3ec\ub974\ud22c\uac08 \uae30\uc0c1 \uc11c\ube44\uc2a4 (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/lb.json b/homeassistant/components/ipma/.translations/lb.json index 7d8280998fe1..a45b07808565 100644 --- a/homeassistant/components/ipma/.translations/lb.json +++ b/homeassistant/components/ipma/.translations/lb.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Uertschaft" } - }, - "title": "Portugisesche Wieder D\u00e9ngscht (IPMA)" - } + } + }, + "title": "Portugisesche Wieder D\u00e9ngscht (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/nl.json b/homeassistant/components/ipma/.translations/nl.json index 00b9881fd979..9b2bebe4d0d3 100644 --- a/homeassistant/components/ipma/.translations/nl.json +++ b/homeassistant/components/ipma/.translations/nl.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Locatie" } - }, - "title": "Portugese weerservice (IPMA)" - } + } + }, + "title": "Portugese weerservice (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/no.json b/homeassistant/components/ipma/.translations/no.json index d72617324316..5c1e3fbf820a 100644 --- a/homeassistant/components/ipma/.translations/no.json +++ b/homeassistant/components/ipma/.translations/no.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Plassering" } - }, - "title": "Portugisisk v\u00e6rtjeneste (IPMA)" - } + } + }, + "title": "Portugisisk v\u00e6rtjeneste (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pl.json b/homeassistant/components/ipma/.translations/pl.json index 267b4e79137b..410585d02dc7 100644 --- a/homeassistant/components/ipma/.translations/pl.json +++ b/homeassistant/components/ipma/.translations/pl.json @@ -14,7 +14,7 @@ "description": "Portugalski Instytut Morza i Atmosfery", "title": "Lokalizacja" } - }, - "title": "Portugalski serwis pogodowy (IPMA)" - } + } + }, + "title": "Portugalski serwis pogodowy (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pt-BR.json b/homeassistant/components/ipma/.translations/pt-BR.json index 1f9aa1a324e3..c780f92dcdf2 100644 --- a/homeassistant/components/ipma/.translations/pt-BR.json +++ b/homeassistant/components/ipma/.translations/pt-BR.json @@ -13,7 +13,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Localiza\u00e7\u00e3o" } - }, - "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" - } + } + }, + "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pt.json b/homeassistant/components/ipma/.translations/pt.json index 2ddeb9a4b334..fead941a76d2 100644 --- a/homeassistant/components/ipma/.translations/pt.json +++ b/homeassistant/components/ipma/.translations/pt.json @@ -13,7 +13,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Localiza\u00e7\u00e3o" } - }, - "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" - } + } + }, + "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ru.json b/homeassistant/components/ipma/.translations/ru.json index 96d4ee904076..84b1c6f383a9 100644 --- a/homeassistant/components/ipma/.translations/ru.json +++ b/homeassistant/components/ipma/.translations/ru.json @@ -14,7 +14,7 @@ "description": "\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u043c\u043e\u0440\u044f \u0438 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b.", "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u0438 (IPMA)" - } + } + }, + "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u0438 (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/sl.json b/homeassistant/components/ipma/.translations/sl.json index 2dcfcde74047..14b67fda8a29 100644 --- a/homeassistant/components/ipma/.translations/sl.json +++ b/homeassistant/components/ipma/.translations/sl.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "Lokacija" } - }, - "title": "Portugalska vremenska storitev (IPMA)" - } + } + }, + "title": "Portugalska vremenska storitev (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/sv.json b/homeassistant/components/ipma/.translations/sv.json index e8cba56a0a03..51b5cefd7f1f 100644 --- a/homeassistant/components/ipma/.translations/sv.json +++ b/homeassistant/components/ipma/.translations/sv.json @@ -14,7 +14,7 @@ "description": "Portugisiska institutet f\u00f6r hav och atmosf\u00e4ren", "title": "Location" } - }, - "title": "Portugisiska weather service (IPMA)" - } + } + }, + "title": "Portugisiska weather service (IPMA)" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/zh-Hans.json b/homeassistant/components/ipma/.translations/zh-Hans.json index 10d518329644..e65c05ab90fe 100644 --- a/homeassistant/components/ipma/.translations/zh-Hans.json +++ b/homeassistant/components/ipma/.translations/zh-Hans.json @@ -14,7 +14,7 @@ "description": "\u8461\u8404\u7259\u56fd\u5bb6\u5927\u6c14\u7814\u7a76\u6240", "title": "\u4f4d\u7f6e" } - }, - "title": "\u8461\u8404\u7259\u6c14\u8c61\u670d\u52a1\uff08IPMA\uff09" - } + } + }, + "title": "\u8461\u8404\u7259\u6c14\u8c61\u670d\u52a1\uff08IPMA\uff09" } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/zh-Hant.json b/homeassistant/components/ipma/.translations/zh-Hant.json index de36336f2c44..ec51c7bcaa0d 100644 --- a/homeassistant/components/ipma/.translations/zh-Hant.json +++ b/homeassistant/components/ipma/.translations/zh-Hant.json @@ -14,7 +14,7 @@ "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "title": "\u5ea7\u6a19" } - }, - "title": "\u8461\u8404\u7259\u6c23\u8c61\u670d\u52d9\uff08IPMA\uff09" - } + } + }, + "title": "\u8461\u8404\u7259\u6c23\u8c61\u670d\u52d9\uff08IPMA\uff09" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index 284907b27560..e517f81ce5d9 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -27,7 +27,7 @@ "description": "Vols afegir la impressora {name} a Home Assistant?", "title": "Impressora descoberta" } - }, - "title": "Protocol d'impressi\u00f3 per Internet (IPP)" - } + } + }, + "title": "Protocol d'impressi\u00f3 per Internet (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/da.json b/homeassistant/components/ipp/.translations/da.json index ede4601928e9..f3447565c0a6 100644 --- a/homeassistant/components/ipp/.translations/da.json +++ b/homeassistant/components/ipp/.translations/da.json @@ -26,7 +26,7 @@ "description": "Vil du tilf\u00f8je printeren med navnet '{name}' til Home Assistant?", "title": "Fandt printer" } - }, - "title": "Internet Printing Protocol (IPP)" - } + } + }, + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/de.json b/homeassistant/components/ipp/.translations/de.json index 454ad3ac0907..dabbca15fdd7 100644 --- a/homeassistant/components/ipp/.translations/de.json +++ b/homeassistant/components/ipp/.translations/de.json @@ -27,7 +27,7 @@ "description": "M\u00f6chten Sie den Drucker mit dem Namen \"{name}\" zu Home Assistant hinzuf\u00fcgen?", "title": "Entdeckter Drucker" } - }, - "title": "Internet-Druckprotokoll (IPP)" - } + } + }, + "title": "Internet-Druckprotokoll (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/en.json b/homeassistant/components/ipp/.translations/en.json index 5d88ded9db52..6742038830c6 100644 --- a/homeassistant/components/ipp/.translations/en.json +++ b/homeassistant/components/ipp/.translations/en.json @@ -29,7 +29,7 @@ "description": "Do you want to add the printer named `{name}` to Home Assistant?", "title": "Discovered printer" } - }, - "title": "Internet Printing Protocol (IPP)" - } + } + }, + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/es.json b/homeassistant/components/ipp/.translations/es.json index 5f1f2fb60f00..c4f01461d6e1 100644 --- a/homeassistant/components/ipp/.translations/es.json +++ b/homeassistant/components/ipp/.translations/es.json @@ -27,7 +27,7 @@ "description": "\u00bfQuieres a\u00f1adir la impresora llamada `{name}` a Home Assistant?", "title": "Impresora encontrada" } - }, - "title": "Protocolo de Impresi\u00f3n de Internet (IPP)" - } + } + }, + "title": "Protocolo de Impresi\u00f3n de Internet (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ko.json b/homeassistant/components/ipp/.translations/ko.json index ab556519e078..7cdb01eef90b 100644 --- a/homeassistant/components/ipp/.translations/ko.json +++ b/homeassistant/components/ipp/.translations/ko.json @@ -26,7 +26,7 @@ "description": "Home Assistant \uc5d0 `{name}` \ud504\ub9b0\ud130\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "\ubc1c\uacac\ub41c \ud504\ub9b0\ud130" } - }, - "title": "\uc778\ud130\ub137 \uc778\uc1c4 \ud504\ub85c\ud1a0\ucf5c (IPP)" - } + } + }, + "title": "\uc778\ud130\ub137 \uc778\uc1c4 \ud504\ub85c\ud1a0\ucf5c (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/lb.json b/homeassistant/components/ipp/.translations/lb.json index 459eaacac4de..b7ce182dea14 100644 --- a/homeassistant/components/ipp/.translations/lb.json +++ b/homeassistant/components/ipp/.translations/lb.json @@ -27,7 +27,7 @@ "description": "W\u00ebllt dir de Printer mam Numm `{name}` am Home Assistant dob\u00e4isetzen?", "title": "Entdeckte Printer" } - }, - "title": "Internet Printing Protocol (IPP)" - } + } + }, + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/nl.json b/homeassistant/components/ipp/.translations/nl.json index ad1788e0bd4d..d6fbeb4cbbd8 100644 --- a/homeassistant/components/ipp/.translations/nl.json +++ b/homeassistant/components/ipp/.translations/nl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Internet Printing Protocol (IPP)" - } + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/no.json b/homeassistant/components/ipp/.translations/no.json index 2357aaaa86df..ea43c2eca2fb 100644 --- a/homeassistant/components/ipp/.translations/no.json +++ b/homeassistant/components/ipp/.translations/no.json @@ -3,7 +3,9 @@ "abort": { "already_configured": "Denne skriveren er allerede konfigurert.", "connection_error": "Klarte ikke \u00e5 koble til skriveren.", - "connection_upgrade": "Kunne ikke koble til skriveren fordi tilkoblingsoppgradering var n\u00f8dvendig." + "connection_upgrade": "Kunne ikke koble til skriveren fordi tilkoblingsoppgradering var n\u00f8dvendig.", + "ipp_error": "Oppdaget IPP-feil.", + "ipp_version_error": "IPP-versjon st\u00f8ttes ikke av skriveren." }, "error": { "connection_error": "Klarte ikke \u00e5 koble til skriveren.", @@ -26,7 +28,7 @@ "description": "\u00d8nsker du \u00e5 legge skriveren med navnet {name} til Home Assistant?", "title": "Oppdaget skriver" } - }, - "title": "Internet Printing Protocol (IPP)" - } + } + }, + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ru.json b/homeassistant/components/ipp/.translations/ru.json index b6bdbc8b2c05..7fb1e4753c92 100644 --- a/homeassistant/components/ipp/.translations/ru.json +++ b/homeassistant/components/ipp/.translations/ru.json @@ -27,7 +27,7 @@ "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 \u043f\u0440\u0438\u043d\u0442\u0435\u0440 `{name}`?", "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0442\u0435\u0440" } - }, - "title": "Internet Printing Protocol (IPP)" - } + } + }, + "title": "Internet Printing Protocol (IPP)" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/zh-Hant.json b/homeassistant/components/ipp/.translations/zh-Hant.json index 97d3056f60ca..b484370a1607 100644 --- a/homeassistant/components/ipp/.translations/zh-Hant.json +++ b/homeassistant/components/ipp/.translations/zh-Hant.json @@ -4,6 +4,8 @@ "already_configured": "\u6b64\u5370\u8868\u6a5f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "connection_error": "\u5370\u8868\u6a5f\u9023\u7dda\u5931\u6557\u3002", "connection_upgrade": "\u7531\u65bc\u9700\u8981\u5148\u5347\u7d1a\u9023\u7dda\u3001\u9023\u7dda\u81f3\u5370\u8868\u6a5f\u5931\u6557\u3002", + "ipp_error": "\u767c\u751f IPP \u932f\u8aa4\u3002", + "ipp_version_error": "\u4e0d\u652f\u63f4\u5370\u8868\u6a5f\u7684 IPP \u7248\u672c\u3002", "parse_error": "\u7372\u5f97\u5370\u8868\u6a5f\u56de\u61c9\u5931\u6557\u3002" }, "error": { @@ -27,7 +29,7 @@ "description": "\u662f\u5426\u8981\u65b0\u589e\u540d\u7a31 `{name}` \u5370\u8868\u6a5f\u81f3 Home Assistant\uff1f", "title": "\u81ea\u52d5\u641c\u7d22\u5230\u7684\u5370\u8868\u6a5f" } - }, - "title": "\u7db2\u969b\u7db2\u8def\u5217\u5370\u5354\u5b9a\uff08IPP\uff09" - } + } + }, + "title": "\u7db2\u969b\u7db2\u8def\u5217\u5370\u5354\u5b9a\uff08IPP\uff09" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/bg.json b/homeassistant/components/iqvia/.translations/bg.json index 1ac04024932b..72224eead481 100644 --- a/homeassistant/components/iqvia/.translations/bg.json +++ b/homeassistant/components/iqvia/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0432\u0430\u0448\u0438\u044f \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0438\u043b\u0438 \u043a\u0430\u043d\u0430\u0434\u0441\u043a\u0438 \u043f\u043e\u0449\u0435\u043d\u0441\u043a\u0438 \u043a\u043e\u0434.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ca.json b/homeassistant/components/iqvia/.translations/ca.json index 249fd6d0ae29..5cb035dc6223 100644 --- a/homeassistant/components/iqvia/.translations/ca.json +++ b/homeassistant/components/iqvia/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Introdueix el teu codi postal d'Estats Units o Canad\u00e0.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/da.json b/homeassistant/components/iqvia/.translations/da.json index f7bd64bc4101..25104165f571 100644 --- a/homeassistant/components/iqvia/.translations/da.json +++ b/homeassistant/components/iqvia/.translations/da.json @@ -12,7 +12,7 @@ "description": "Udfyld dit amerikanske eller canadiske postnummer.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/de.json b/homeassistant/components/iqvia/.translations/de.json index 3a66a1e11a01..893cf5408129 100644 --- a/homeassistant/components/iqvia/.translations/de.json +++ b/homeassistant/components/iqvia/.translations/de.json @@ -12,7 +12,7 @@ "description": "Trage eine US-amerikanische oder kanadische Postleitzahl ein.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/en.json b/homeassistant/components/iqvia/.translations/en.json index c3cc412d792e..f85226ef50ed 100644 --- a/homeassistant/components/iqvia/.translations/en.json +++ b/homeassistant/components/iqvia/.translations/en.json @@ -12,7 +12,7 @@ "description": "Fill out your U.S. or Canadian ZIP code.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/es.json b/homeassistant/components/iqvia/.translations/es.json index 91e34e829033..1ba0877993d9 100644 --- a/homeassistant/components/iqvia/.translations/es.json +++ b/homeassistant/components/iqvia/.translations/es.json @@ -12,7 +12,7 @@ "description": "Indica tu c\u00f3digo postal de Estados Unidos o Canad\u00e1.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/fr.json b/homeassistant/components/iqvia/.translations/fr.json index f5e5907f2c4f..45493bd79a05 100644 --- a/homeassistant/components/iqvia/.translations/fr.json +++ b/homeassistant/components/iqvia/.translations/fr.json @@ -12,7 +12,7 @@ "description": "Entrez votre code postal am\u00e9ricain ou canadien.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/it.json b/homeassistant/components/iqvia/.translations/it.json index 492654c660c5..c5640be83a91 100644 --- a/homeassistant/components/iqvia/.translations/it.json +++ b/homeassistant/components/iqvia/.translations/it.json @@ -12,7 +12,7 @@ "description": "Compila il tuo CAP americano o canadese.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ko.json b/homeassistant/components/iqvia/.translations/ko.json index a163891c0422..c6020fa1d800 100644 --- a/homeassistant/components/iqvia/.translations/ko.json +++ b/homeassistant/components/iqvia/.translations/ko.json @@ -12,7 +12,7 @@ "description": "\ubbf8\uad6d \ub610\ub294 \uce90\ub098\ub2e4\uc758 \uc6b0\ud3b8\ubc88\ud638\ub97c \uae30\uc785\ud574\uc8fc\uc138\uc694.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/lb.json b/homeassistant/components/iqvia/.translations/lb.json index 8dc7c3bc20e3..7caf8d483ca7 100644 --- a/homeassistant/components/iqvia/.translations/lb.json +++ b/homeassistant/components/iqvia/.translations/lb.json @@ -12,7 +12,7 @@ "description": "Gitt \u00e4r U.S. oder Kanadesch Postleitzuel un.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/nl.json b/homeassistant/components/iqvia/.translations/nl.json index e0b3b667de39..3319539b7664 100644 --- a/homeassistant/components/iqvia/.translations/nl.json +++ b/homeassistant/components/iqvia/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Vul uw Amerikaanse of Canadese postcode in.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/nn.json b/homeassistant/components/iqvia/.translations/nn.json index 89922b66f03d..b1d656dc4d29 100644 --- a/homeassistant/components/iqvia/.translations/nn.json +++ b/homeassistant/components/iqvia/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/no.json b/homeassistant/components/iqvia/.translations/no.json index 9ccca663fe52..3c30d0f35210 100644 --- a/homeassistant/components/iqvia/.translations/no.json +++ b/homeassistant/components/iqvia/.translations/no.json @@ -12,7 +12,7 @@ "description": "Fyll ut ditt amerikanske eller kanadiske postnummer.", "title": "" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/pl.json b/homeassistant/components/iqvia/.translations/pl.json index b8c014c3dc9a..8d19882bb709 100644 --- a/homeassistant/components/iqvia/.translations/pl.json +++ b/homeassistant/components/iqvia/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Wprowad\u017a ameryka\u0144ski lub kanadyjski kod pocztowy.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/pt-BR.json b/homeassistant/components/iqvia/.translations/pt-BR.json index b9f716e8d3ea..0abdd92f841d 100644 --- a/homeassistant/components/iqvia/.translations/pt-BR.json +++ b/homeassistant/components/iqvia/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Preencha o seu CEP dos EUA ou Canad\u00e1.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ru.json b/homeassistant/components/iqvia/.translations/ru.json index 336877fda130..db42824b4555 100644 --- a/homeassistant/components/iqvia/.translations/ru.json +++ b/homeassistant/components/iqvia/.translations/ru.json @@ -12,7 +12,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 (\u0434\u043b\u044f \u0421\u0428\u0410 \u0438\u043b\u0438 \u041a\u0430\u043d\u0430\u0434\u044b).", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/sl.json b/homeassistant/components/iqvia/.translations/sl.json index fa04c00c7a2c..bde3e2099af7 100644 --- a/homeassistant/components/iqvia/.translations/sl.json +++ b/homeassistant/components/iqvia/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Izpolnite svojo ameri\u0161ko ali kanadsko po\u0161tno \u0161tevilko.", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/sv.json b/homeassistant/components/iqvia/.translations/sv.json index 5bb4029dfcc8..940fb127c542 100644 --- a/homeassistant/components/iqvia/.translations/sv.json +++ b/homeassistant/components/iqvia/.translations/sv.json @@ -12,7 +12,7 @@ "description": "Fyll i ditt Amerikanska eller Kanadensiska postnummer", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/zh-Hans.json b/homeassistant/components/iqvia/.translations/zh-Hans.json index 4d92fbfd77ce..7cef08a0e507 100644 --- a/homeassistant/components/iqvia/.translations/zh-Hans.json +++ b/homeassistant/components/iqvia/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u586b\u5199\u60a8\u7684\u7f8e\u56fd\u6216\u52a0\u62ff\u5927\u90ae\u653f\u7f16\u7801\u3002", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/zh-Hant.json b/homeassistant/components/iqvia/.translations/zh-Hant.json index a09db3b02c37..b1551bf364ec 100644 --- a/homeassistant/components/iqvia/.translations/zh-Hant.json +++ b/homeassistant/components/iqvia/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u586b\u5beb\u7f8e\u570b\u6216\u52a0\u62ff\u5927\u90f5\u905e\u5340\u865f\u3002", "title": "IQVIA" } - }, - "title": "IQVIA" - } + } + }, + "title": "IQVIA" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/bg.json b/homeassistant/components/izone/.translations/bg.json index 26a55aa4ed8e..cb0dedc6d20c 100644 --- a/homeassistant/components/izone/.translations/bg.json +++ b/homeassistant/components/izone/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ca.json b/homeassistant/components/izone/.translations/ca.json index b80d9bee4e27..ffe751bd02c3 100644 --- a/homeassistant/components/izone/.translations/ca.json +++ b/homeassistant/components/izone/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/da.json b/homeassistant/components/izone/.translations/da.json index 9dc3d88322c2..9b0e0a819953 100644 --- a/homeassistant/components/izone/.translations/da.json +++ b/homeassistant/components/izone/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/de.json b/homeassistant/components/izone/.translations/de.json index 4a5bace59287..82de0a6bfea1 100644 --- a/homeassistant/components/izone/.translations/de.json +++ b/homeassistant/components/izone/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du iZone einrichten?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/en.json b/homeassistant/components/izone/.translations/en.json index 5293ad2a1fec..2643e53db4cc 100644 --- a/homeassistant/components/izone/.translations/en.json +++ b/homeassistant/components/izone/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/es.json b/homeassistant/components/izone/.translations/es.json index 9f82b1a7b1fd..0bf1271e3945 100644 --- a/homeassistant/components/izone/.translations/es.json +++ b/homeassistant/components/izone/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/fr.json b/homeassistant/components/izone/.translations/fr.json index c90416b06197..db4b9649e3cc 100644 --- a/homeassistant/components/izone/.translations/fr.json +++ b/homeassistant/components/izone/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/hu.json b/homeassistant/components/izone/.translations/hu.json index 79c621ce125a..2f2efcd6bae1 100644 --- a/homeassistant/components/izone/.translations/hu.json +++ b/homeassistant/components/izone/.translations/hu.json @@ -5,7 +5,7 @@ "description": "Szeretn\u00e9 be\u00e1ll\u00edtani az iZone-t?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/it.json b/homeassistant/components/izone/.translations/it.json index 5498624a061e..559d95e05a59 100644 --- a/homeassistant/components/izone/.translations/it.json +++ b/homeassistant/components/izone/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ko.json b/homeassistant/components/izone/.translations/ko.json index 91593b265112..b491faec9ae1 100644 --- a/homeassistant/components/izone/.translations/ko.json +++ b/homeassistant/components/izone/.translations/ko.json @@ -9,7 +9,7 @@ "description": "iZone \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/lb.json b/homeassistant/components/izone/.translations/lb.json index c6e075683ad1..cffa27defc62 100644 --- a/homeassistant/components/izone/.translations/lb.json +++ b/homeassistant/components/izone/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll iZone konfigur\u00e9iert ginn?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/nl.json b/homeassistant/components/izone/.translations/nl.json index 979441f72881..b51e0bf55f6d 100644 --- a/homeassistant/components/izone/.translations/nl.json +++ b/homeassistant/components/izone/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u iZone instellen?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/nn.json b/homeassistant/components/izone/.translations/nn.json index eaf7601be9c3..a45936716c83 100644 --- a/homeassistant/components/izone/.translations/nn.json +++ b/homeassistant/components/izone/.translations/nn.json @@ -4,7 +4,7 @@ "confirm": { "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/no.json b/homeassistant/components/izone/.translations/no.json index 6af3c9b063b0..86ee2099b32a 100644 --- a/homeassistant/components/izone/.translations/no.json +++ b/homeassistant/components/izone/.translations/no.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere iZone?", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/pl.json b/homeassistant/components/izone/.translations/pl.json index 4f90cf71cbcb..d4543a2ad65f 100644 --- a/homeassistant/components/izone/.translations/pl.json +++ b/homeassistant/components/izone/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Chcesz skonfigurowa\u0107 iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ru.json b/homeassistant/components/izone/.translations/ru.json index 7e632c8dd621..d06c9b64baa2 100644 --- a/homeassistant/components/izone/.translations/ru.json +++ b/homeassistant/components/izone/.translations/ru.json @@ -9,7 +9,7 @@ "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 iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/sl.json b/homeassistant/components/izone/.translations/sl.json index cb2fe8212974..705d907f5926 100644 --- a/homeassistant/components/izone/.translations/sl.json +++ b/homeassistant/components/izone/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/sv.json b/homeassistant/components/izone/.translations/sv.json index c2c952d69fe8..5d52e28104aa 100644 --- a/homeassistant/components/izone/.translations/sv.json +++ b/homeassistant/components/izone/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera iZone?", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/zh-Hant.json b/homeassistant/components/izone/.translations/zh-Hant.json index 7448100158e8..21f0c84e1b8c 100644 --- a/homeassistant/components/izone/.translations/zh-Hant.json +++ b/homeassistant/components/izone/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a iZone\uff1f", "title": "iZone" } - }, - "title": "iZone" - } + } + }, + "title": "iZone" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ca.json b/homeassistant/components/konnected/.translations/ca.json index 1c7b4e69ec64..cfb0880f6b95 100644 --- a/homeassistant/components/konnected/.translations/ca.json +++ b/homeassistant/components/konnected/.translations/ca.json @@ -26,8 +26,7 @@ "description": "Introdueix la informaci\u00f3 d'amfitri\u00f3 del panell Konnected.", "title": "Descoberta de dispositiu Konnected" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Opcions del panell d'alarma Konnected" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/da.json b/homeassistant/components/konnected/.translations/da.json index a1545bd65757..16fbdd8099a7 100644 --- a/homeassistant/components/konnected/.translations/da.json +++ b/homeassistant/components/konnected/.translations/da.json @@ -26,8 +26,7 @@ "description": "Indtast v\u00e6rtsinformationen for dit Konnected-panel.", "title": "Find Konnected-enhed" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -104,5 +103,6 @@ } }, "title": "Indstillinger for Konnected-alarmpanel" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/de.json b/homeassistant/components/konnected/.translations/de.json index a0da84fd0989..9266e1347152 100644 --- a/homeassistant/components/konnected/.translations/de.json +++ b/homeassistant/components/konnected/.translations/de.json @@ -26,8 +26,7 @@ "description": "Bitte geben Sie die Hostinformationen f\u00fcr Ihr Konnected Panel ein.", "title": "Entdecken Sie Konnected Ger\u00e4t" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -105,5 +104,6 @@ } }, "title": "Konnected Alarm Panel-Optionen" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/en.json b/homeassistant/components/konnected/.translations/en.json index 3ace7783f8b3..04cd775f0aa1 100644 --- a/homeassistant/components/konnected/.translations/en.json +++ b/homeassistant/components/konnected/.translations/en.json @@ -26,8 +26,7 @@ "description": "Please enter the host information for your Konnected Panel.", "title": "Discover Konnected Device" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Konnected Alarm Panel Options" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/es.json b/homeassistant/components/konnected/.translations/es.json index 64069d4e756b..11517e2cdc91 100644 --- a/homeassistant/components/konnected/.translations/es.json +++ b/homeassistant/components/konnected/.translations/es.json @@ -26,8 +26,7 @@ "description": "Introduzca la informaci\u00f3n del host de su panel Konnected.", "title": "Descubrir el dispositivo Konnected" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -108,5 +107,6 @@ } }, "title": "Opciones del panel de alarma Konnected" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/fr.json b/homeassistant/components/konnected/.translations/fr.json index ccbc849ab581..ef37d2106620 100644 --- a/homeassistant/components/konnected/.translations/fr.json +++ b/homeassistant/components/konnected/.translations/fr.json @@ -18,8 +18,7 @@ "host": "Adresse IP de l\u2019appareil Konnected" } } - }, - "title": "Konnected.io" + } }, "options": { "error": { @@ -73,5 +72,6 @@ } } } - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/it.json b/homeassistant/components/konnected/.translations/it.json index a79c2e0caf27..2d381f81f4bc 100644 --- a/homeassistant/components/konnected/.translations/it.json +++ b/homeassistant/components/konnected/.translations/it.json @@ -26,8 +26,7 @@ "description": "Si prega di inserire le informazioni dell'host per il tuo Pannello Konnected.", "title": "Rileva il dispositivo Konnected" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -104,5 +103,6 @@ } }, "title": "Opzioni del pannello di allarme Konnected" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ko.json b/homeassistant/components/konnected/.translations/ko.json index 34dd01d06b62..d9db35c07cc4 100644 --- a/homeassistant/components/konnected/.translations/ko.json +++ b/homeassistant/components/konnected/.translations/ko.json @@ -26,8 +26,7 @@ "description": "Konnected \ud328\ub110\uc758 \ud638\uc2a4\ud2b8 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "Konnected \uae30\uae30 \ucc3e\uae30" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Konnected \uc54c\ub78c \ud328\ub110 \uc635\uc158" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/lb.json b/homeassistant/components/konnected/.translations/lb.json index f411c06a3e18..6447af84ce1d 100644 --- a/homeassistant/components/konnected/.translations/lb.json +++ b/homeassistant/components/konnected/.translations/lb.json @@ -26,8 +26,7 @@ "description": "Informatioune vum Konnected Panel aginn.", "title": "Konnected Apparat entdecken" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -108,5 +107,6 @@ } }, "title": "Konnected Alarm Panneau Optiounen" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/nl.json b/homeassistant/components/konnected/.translations/nl.json index ef9c7a40b61c..49d7e1e23e74 100644 --- a/homeassistant/components/konnected/.translations/nl.json +++ b/homeassistant/components/konnected/.translations/nl.json @@ -16,8 +16,7 @@ "description": "Voer de host-informatie in voor uw Konnected-paneel.", "title": "Ontdek Konnected Device" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -75,5 +74,6 @@ } }, "title": "Konnected Alarm Paneel Opties" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/no.json b/homeassistant/components/konnected/.translations/no.json index 86d9fe877af1..0d7cfecfb863 100644 --- a/homeassistant/components/konnected/.translations/no.json +++ b/homeassistant/components/konnected/.translations/no.json @@ -26,8 +26,7 @@ "description": "Vennligst skriv inn verten informasjon for din Konnected Panel.", "title": "Oppdag Konnected Enheten" } - }, - "title": "" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Alternativer for Konnected Alarm Panel" - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/pl.json b/homeassistant/components/konnected/.translations/pl.json index b0d721891c0f..d5864315d823 100644 --- a/homeassistant/components/konnected/.translations/pl.json +++ b/homeassistant/components/konnected/.translations/pl.json @@ -22,8 +22,7 @@ "description": "Wprowad\u017a informacje o ho\u015bcie panelu Konnected.", "title": "Wykryj urz\u0105dzenie Konnected" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -102,5 +101,6 @@ } }, "title": "Opcje panelu alarmu Konnected" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ru.json b/homeassistant/components/konnected/.translations/ru.json index f3b7f4d6d24b..139dc8bf3a07 100644 --- a/homeassistant/components/konnected/.translations/ru.json +++ b/homeassistant/components/konnected/.translations/ru.json @@ -26,8 +26,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u043f\u0430\u043d\u0435\u043b\u0438 Konnected.", "title": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Konnected" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Konnected" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/sl.json b/homeassistant/components/konnected/.translations/sl.json index 2b2269bee5f6..8438caf251fd 100644 --- a/homeassistant/components/konnected/.translations/sl.json +++ b/homeassistant/components/konnected/.translations/sl.json @@ -26,8 +26,7 @@ "description": "Vnesite podatke o gostitelju v svoj Konnected Panel.", "title": "Odkrijte Konnected napravo" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Mo\u017enosti Konnected alarm-a" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/sv.json b/homeassistant/components/konnected/.translations/sv.json index 7e0352642157..588700dd3063 100644 --- a/homeassistant/components/konnected/.translations/sv.json +++ b/homeassistant/components/konnected/.translations/sv.json @@ -22,8 +22,7 @@ "description": "Ange v\u00e4rdinformationen f\u00f6r din Konnected Panel.", "title": "Uppt\u00e4ck Konnected-enhet" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -100,5 +99,6 @@ } }, "title": "Alternativ f\u00f6r Konnected alarmpanel" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/zh-Hant.json b/homeassistant/components/konnected/.translations/zh-Hant.json index e51a099ba2a3..ac8476824af8 100644 --- a/homeassistant/components/konnected/.translations/zh-Hant.json +++ b/homeassistant/components/konnected/.translations/zh-Hant.json @@ -26,8 +26,7 @@ "description": "\u8acb\u8f38\u5165 Konnected \u9762\u677f\u4e3b\u6a5f\u7aef\u8cc7\u8a0a\u3002", "title": "\u641c\u7d22 Konnected \u8a2d\u5099" } - }, - "title": "Konnected.io" + } }, "options": { "abort": { @@ -106,5 +105,6 @@ } }, "title": "Konnected \u8b66\u5831\u9762\u677f\u9078\u9805" - } + }, + "title": "Konnected.io" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/bg.json b/homeassistant/components/life360/.translations/bg.json index 02354204f240..d56b7a333af4 100644 --- a/homeassistant/components/life360/.translations/bg.json +++ b/homeassistant/components/life360/.translations/bg.json @@ -22,7 +22,7 @@ "description": "\u0417\u0430 \u0434\u0430 \u0437\u0430\u0434\u0430\u0434\u0435\u0442\u0435 \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438 \u043e\u043f\u0446\u0438\u0438, \u0432\u0438\u0436\u0442\u0435 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 Life360]({docs_url}). \u041f\u0440\u0435\u043f\u043e\u0440\u044a\u0447\u0438\u0442\u0435\u043b\u043d\u043e \u0435 \u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u0442\u043e\u0432\u0430 \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438.", "title": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 Life360 \u043f\u0440\u043e\u0444\u0438\u043b" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ca.json b/homeassistant/components/life360/.translations/ca.json index 58401a33d146..5498ea9745d3 100644 --- a/homeassistant/components/life360/.translations/ca.json +++ b/homeassistant/components/life360/.translations/ca.json @@ -22,7 +22,7 @@ "description": "Per configurar les opcions avan\u00e7ades mira la [documentaci\u00f3 de Life360]({docs_url}). Pot ser que ho hagis de fer abans d\u2019afegir cap compte.", "title": "Informaci\u00f3 del compte Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/da.json b/homeassistant/components/life360/.translations/da.json index 32acc488dc69..d4ab3aba4719 100644 --- a/homeassistant/components/life360/.translations/da.json +++ b/homeassistant/components/life360/.translations/da.json @@ -22,7 +22,7 @@ "description": "Hvis du vil angive avancerede indstillinger skal du se [Life360 dokumentation]({docs_url}).\nDu \u00f8nsker m\u00e5ske at g\u00f8re dette f\u00f8r du tilf\u00f8jer konti.", "title": "Life360-kontooplysninger" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/de.json b/homeassistant/components/life360/.translations/de.json index 08a55d26caec..2c02b2aa2ce5 100644 --- a/homeassistant/components/life360/.translations/de.json +++ b/homeassistant/components/life360/.translations/de.json @@ -22,7 +22,7 @@ "description": "Erweiterte Optionen sind in der [Life360-Dokumentation]({docs_url}) zu finden.\nDies sollte vor dem Hinzuf\u00fcgen von Kontoinformationen getan werden.", "title": "Life360-Kontoinformationen" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/en.json b/homeassistant/components/life360/.translations/en.json index e6017339b732..61711b5d3c48 100644 --- a/homeassistant/components/life360/.translations/en.json +++ b/homeassistant/components/life360/.translations/en.json @@ -22,7 +22,7 @@ "description": "To set advanced options, see [Life360 documentation]({docs_url}).\nYou may want to do that before adding accounts.", "title": "Life360 Account Info" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/es-419.json b/homeassistant/components/life360/.translations/es-419.json index 512d0285ac5e..25245dbb44fd 100644 --- a/homeassistant/components/life360/.translations/es-419.json +++ b/homeassistant/components/life360/.translations/es-419.json @@ -17,7 +17,7 @@ }, "title": "Informaci\u00f3n de la cuenta Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/es.json b/homeassistant/components/life360/.translations/es.json index 68cf7ff847e1..145c2fb440fd 100644 --- a/homeassistant/components/life360/.translations/es.json +++ b/homeassistant/components/life360/.translations/es.json @@ -22,7 +22,7 @@ "description": "Para configurar las opciones avanzadas, revisa la [documentaci\u00f3n de Life360]({docs_url}).\nDeber\u00edas hacerlo antes de a\u00f1adir alguna cuenta.", "title": "Informaci\u00f3n de la cuenta de Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/fr.json b/homeassistant/components/life360/.translations/fr.json index 947425e4807f..b76d96cc4638 100644 --- a/homeassistant/components/life360/.translations/fr.json +++ b/homeassistant/components/life360/.translations/fr.json @@ -22,7 +22,7 @@ "description": "Pour d\u00e9finir des options avanc\u00e9es, voir [Documentation Life360]({docs_url}).\nVous pouvez le faire avant d'ajouter des comptes.", "title": "Informations sur le compte Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/it.json b/homeassistant/components/life360/.translations/it.json index b7d2d6c8f1b2..3233430d8ade 100644 --- a/homeassistant/components/life360/.translations/it.json +++ b/homeassistant/components/life360/.translations/it.json @@ -22,7 +22,7 @@ "description": "Per impostare le opzioni avanzate, vedere [Documentazione di Life360]({docs_url}).\n\u00c8 consigliabile eseguire questa operazione prima di aggiungere gli account.", "title": "Informazioni sull'account Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ko.json b/homeassistant/components/life360/.translations/ko.json index 067b305b80c4..cae763b42c28 100644 --- a/homeassistant/components/life360/.translations/ko.json +++ b/homeassistant/components/life360/.translations/ko.json @@ -22,7 +22,7 @@ "description": "\uace0\uae09 \uc635\uc158\uc744 \uc124\uc815\ud558\ub824\uba74 [Life360 \uc124\uba85\uc11c]({docs_url}) \ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694. \uacc4\uc815\uc744 \ucd94\uac00\ud558\uc2dc\uae30 \uc804\uc5d0 \uc77d\uc5b4\ubcf4\uc2dc\ub294\uac83\uc744 \ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4.", "title": "Life360 \uacc4\uc815 \uc815\ubcf4" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/lb.json b/homeassistant/components/life360/.translations/lb.json index 3af9ab00728e..be9de9cc9433 100644 --- a/homeassistant/components/life360/.translations/lb.json +++ b/homeassistant/components/life360/.translations/lb.json @@ -22,7 +22,7 @@ "description": "Fir erweidert Optiounen anzestellen, kuckt [Life360 Dokumentatioun]({docs_url}).\nMaacht dat am beschten ier dir Konte b\u00e4isetzt.", "title": "Life360 Kont Informatiounen" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/nl.json b/homeassistant/components/life360/.translations/nl.json index 08be66a89639..5f018605d5af 100644 --- a/homeassistant/components/life360/.translations/nl.json +++ b/homeassistant/components/life360/.translations/nl.json @@ -22,7 +22,7 @@ "description": "Om geavanceerde opties in te stellen, zie [Life360 documentatie]({docs_url}).\nMisschien wilt u dat doen voordat u accounts toevoegt.", "title": "Life360-accountgegevens" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/nn.json b/homeassistant/components/life360/.translations/nn.json index 98345b022f2e..09102bbb4abb 100644 --- a/homeassistant/components/life360/.translations/nn.json +++ b/homeassistant/components/life360/.translations/nn.json @@ -6,7 +6,7 @@ "username": "Brukarnamn" } } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/no.json b/homeassistant/components/life360/.translations/no.json index 032dd606cbd8..0e5920c384ee 100644 --- a/homeassistant/components/life360/.translations/no.json +++ b/homeassistant/components/life360/.translations/no.json @@ -22,7 +22,7 @@ "description": "For \u00e5 angi avanserte alternativer, se [Life360 dokumentasjon]({docs_url}). \nDet kan hende du vil gj\u00f8re det f\u00f8r du legger til kontoer.", "title": "Life360 Kontoinformasjon" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/pl.json b/homeassistant/components/life360/.translations/pl.json index f82c83258281..edba5dc17a39 100644 --- a/homeassistant/components/life360/.translations/pl.json +++ b/homeassistant/components/life360/.translations/pl.json @@ -22,7 +22,7 @@ "description": "Aby skonfigurowa\u0107 zaawansowane ustawienia, zapoznaj si\u0119 z [dokumentacj\u0105 Life360]({docs_url}). Mo\u017cesz to zrobi\u0107 przed dodaniem kont.", "title": "Informacje o koncie Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/pt-BR.json b/homeassistant/components/life360/.translations/pt-BR.json index 5181c37969a5..c69ffec899a8 100644 --- a/homeassistant/components/life360/.translations/pt-BR.json +++ b/homeassistant/components/life360/.translations/pt-BR.json @@ -22,7 +22,7 @@ "description": "Para definir op\u00e7\u00f5es avan\u00e7adas, consulte [Documenta\u00e7\u00e3o da Life360] ({docs_url}). \n Voc\u00ea pode querer fazer isso antes de adicionar contas.", "title": "Informa\u00e7\u00f5es da conta Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ru.json b/homeassistant/components/life360/.translations/ru.json index c3f2601eb992..87eb9762765a 100644 --- a/homeassistant/components/life360/.translations/ru.json +++ b/homeassistant/components/life360/.translations/ru.json @@ -22,7 +22,7 @@ "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438]({docs_url}) \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.", "title": "Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/sl.json b/homeassistant/components/life360/.translations/sl.json index 2bb3bb4833e8..7ecdd132bb96 100644 --- a/homeassistant/components/life360/.translations/sl.json +++ b/homeassistant/components/life360/.translations/sl.json @@ -22,7 +22,7 @@ "description": "\u010ce \u017eelite nastaviti napredne mo\u017enosti, glejte [Life360 dokumentacija]({docs_url}). \n To lahko storite pred dodajanjem ra\u010dunov.", "title": "Podatki ra\u010duna Life360" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/sv.json b/homeassistant/components/life360/.translations/sv.json index ba28d973ec38..561d7418aff2 100644 --- a/homeassistant/components/life360/.translations/sv.json +++ b/homeassistant/components/life360/.translations/sv.json @@ -22,7 +22,7 @@ "description": "F\u00f6r att st\u00e4lla in avancerade alternativ, se [Life360 documentation]({docs_url}).\nDu kanske vill g\u00f6ra det innan du l\u00e4gger till konton.", "title": "Life360 kontoinformation" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/zh-Hant.json b/homeassistant/components/life360/.translations/zh-Hant.json index 75081c62d410..71150762e614 100644 --- a/homeassistant/components/life360/.translations/zh-Hant.json +++ b/homeassistant/components/life360/.translations/zh-Hant.json @@ -22,7 +22,7 @@ "description": "\u6b32\u8a2d\u5b9a\u9032\u968e\u9078\u9805\uff0c\u8acb\u53c3\u95b1 [Life360 \u6587\u4ef6]({docs_url})\u3002\n\u5efa\u8b70\u65bc\u65b0\u589e\u5e33\u865f\u524d\uff0c\u5148\u9032\u884c\u4e86\u89e3\u3002", "title": "Life360 \u5e33\u865f\u8cc7\u8a0a" } - }, - "title": "Life360" - } + } + }, + "title": "Life360" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/bg.json b/homeassistant/components/lifx/.translations/bg.json index 61b4953c17c2..f3331e450b41 100644 --- a/homeassistant/components/lifx/.translations/bg.json +++ b/homeassistant/components/lifx/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ca.json b/homeassistant/components/lifx/.translations/ca.json index e8ef5bd31bc5..2c0f9c185d09 100644 --- a/homeassistant/components/lifx/.translations/ca.json +++ b/homeassistant/components/lifx/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/cs.json b/homeassistant/components/lifx/.translations/cs.json index d83ee5767685..621aee364ad7 100644 --- a/homeassistant/components/lifx/.translations/cs.json +++ b/homeassistant/components/lifx/.translations/cs.json @@ -9,7 +9,7 @@ "description": "Chcete nastavit LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/da.json b/homeassistant/components/lifx/.translations/da.json index 99143f38c98a..e364be3b021c 100644 --- a/homeassistant/components/lifx/.translations/da.json +++ b/homeassistant/components/lifx/.translations/da.json @@ -9,7 +9,7 @@ "description": "Konfigurer LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/de.json b/homeassistant/components/lifx/.translations/de.json index 2553e2d5e860..b7798bda7f45 100644 --- a/homeassistant/components/lifx/.translations/de.json +++ b/homeassistant/components/lifx/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du LIFX einrichten?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/en.json b/homeassistant/components/lifx/.translations/en.json index 64fdc7516ea2..e918bb28cb2c 100644 --- a/homeassistant/components/lifx/.translations/en.json +++ b/homeassistant/components/lifx/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/es-419.json b/homeassistant/components/lifx/.translations/es-419.json index 905ec3ce2bfb..96c9b6ef6811 100644 --- a/homeassistant/components/lifx/.translations/es-419.json +++ b/homeassistant/components/lifx/.translations/es-419.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/es.json b/homeassistant/components/lifx/.translations/es.json index f897c673432d..e1508bb06ae9 100644 --- a/homeassistant/components/lifx/.translations/es.json +++ b/homeassistant/components/lifx/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/fr.json b/homeassistant/components/lifx/.translations/fr.json index 96a264fa6b29..f6b52394eee4 100644 --- a/homeassistant/components/lifx/.translations/fr.json +++ b/homeassistant/components/lifx/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/hu.json b/homeassistant/components/lifx/.translations/hu.json index 255b2efc91a0..cbadc37a6c15 100644 --- a/homeassistant/components/lifx/.translations/hu.json +++ b/homeassistant/components/lifx/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a LIFX-t?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/it.json b/homeassistant/components/lifx/.translations/it.json index b4f940bc66b8..2768a7ed85ab 100644 --- a/homeassistant/components/lifx/.translations/it.json +++ b/homeassistant/components/lifx/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ko.json b/homeassistant/components/lifx/.translations/ko.json index 2f3ec6db13d0..a6992289200b 100644 --- a/homeassistant/components/lifx/.translations/ko.json +++ b/homeassistant/components/lifx/.translations/ko.json @@ -9,7 +9,7 @@ "description": "LIFX \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/lb.json b/homeassistant/components/lifx/.translations/lb.json index 2e033280e46c..6936dc7f56f5 100644 --- a/homeassistant/components/lifx/.translations/lb.json +++ b/homeassistant/components/lifx/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll LIFX konfigur\u00e9iert ginn?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/nl.json b/homeassistant/components/lifx/.translations/nl.json index a23502729d64..8624bfc7639f 100644 --- a/homeassistant/components/lifx/.translations/nl.json +++ b/homeassistant/components/lifx/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u LIFX instellen?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/nn.json b/homeassistant/components/lifx/.translations/nn.json index c78905b09c8f..a0ca32c0d88b 100644 --- a/homeassistant/components/lifx/.translations/nn.json +++ b/homeassistant/components/lifx/.translations/nn.json @@ -4,7 +4,7 @@ "confirm": { "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/no.json b/homeassistant/components/lifx/.translations/no.json index ae32d43f1b6a..403ea8f0c4b2 100644 --- a/homeassistant/components/lifx/.translations/no.json +++ b/homeassistant/components/lifx/.translations/no.json @@ -9,7 +9,7 @@ "description": "\u00d8nsker du \u00e5 sette opp LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pl.json b/homeassistant/components/lifx/.translations/pl.json index d6a06ea9fac5..16a843202abd 100644 --- a/homeassistant/components/lifx/.translations/pl.json +++ b/homeassistant/components/lifx/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Czy chcesz skonfigurowa\u0107 LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pt-BR.json b/homeassistant/components/lifx/.translations/pt-BR.json index e5f88b5384e5..f12ff5bd94c7 100644 --- a/homeassistant/components/lifx/.translations/pt-BR.json +++ b/homeassistant/components/lifx/.translations/pt-BR.json @@ -9,7 +9,7 @@ "description": "Voc\u00ea quer configurar o LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pt.json b/homeassistant/components/lifx/.translations/pt.json index d5c93c339933..e0716dd707c4 100644 --- a/homeassistant/components/lifx/.translations/pt.json +++ b/homeassistant/components/lifx/.translations/pt.json @@ -9,7 +9,7 @@ "description": "Deseja configurar o LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ro.json b/homeassistant/components/lifx/.translations/ro.json index 12827082104c..5b62cd462350 100644 --- a/homeassistant/components/lifx/.translations/ro.json +++ b/homeassistant/components/lifx/.translations/ro.json @@ -9,7 +9,7 @@ "description": "Dori\u021bi s\u0103 configura\u021bi LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ru.json b/homeassistant/components/lifx/.translations/ru.json index 34f1d850a63b..d2e0a2418a4f 100644 --- a/homeassistant/components/lifx/.translations/ru.json +++ b/homeassistant/components/lifx/.translations/ru.json @@ -9,7 +9,7 @@ "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 LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/sl.json b/homeassistant/components/lifx/.translations/sl.json index 492bf9010dd5..7bd4c366c76a 100644 --- a/homeassistant/components/lifx/.translations/sl.json +++ b/homeassistant/components/lifx/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/sv.json b/homeassistant/components/lifx/.translations/sv.json index a935e209bb4b..591c4677fbd5 100644 --- a/homeassistant/components/lifx/.translations/sv.json +++ b/homeassistant/components/lifx/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du st\u00e4lla in LIFX?", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/zh-Hans.json b/homeassistant/components/lifx/.translations/zh-Hans.json index bc9375d807d3..2eec5575ce0c 100644 --- a/homeassistant/components/lifx/.translations/zh-Hans.json +++ b/homeassistant/components/lifx/.translations/zh-Hans.json @@ -9,7 +9,7 @@ "description": "\u60a8\u60f3\u8981\u914d\u7f6e LIFX \u5417\uff1f", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/zh-Hant.json b/homeassistant/components/lifx/.translations/zh-Hant.json index 908394bcfd81..a5f9fba3cf28 100644 --- a/homeassistant/components/lifx/.translations/zh-Hant.json +++ b/homeassistant/components/lifx/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a LIFX\uff1f", "title": "LIFX" } - }, - "title": "LIFX" - } + } + }, + "title": "LIFX" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/no.json b/homeassistant/components/light/.translations/no.json index e7901ba51bcf..65a50f70e72a 100644 --- a/homeassistant/components/light/.translations/no.json +++ b/homeassistant/components/light/.translations/no.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Reduser lysstyrken p\u00e5 {entity_name}", "brightness_increase": "\u00d8k lysstyrken p\u00e5 {entity_name}", + "flash": "Flash {entity_name}", "toggle": "Veksle {entity_name}", "turn_off": "Sl\u00e5 av {entity_name}", "turn_on": "Sl\u00e5 p\u00e5 {entity_name}" diff --git a/homeassistant/components/linky/.translations/bg.json b/homeassistant/components/linky/.translations/bg.json index cc5239eaf3c5..68da33e30478 100644 --- a/homeassistant/components/linky/.translations/bg.json +++ b/homeassistant/components/linky/.translations/bg.json @@ -15,7 +15,7 @@ "description": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u0438\u043d\u0434\u0435\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0438\u0442\u0435 \u0441\u0438 \u0434\u0430\u043d\u043d\u0438", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ca.json b/homeassistant/components/linky/.translations/ca.json index 9c4a3a190678..75385aa8a6e9 100644 --- a/homeassistant/components/linky/.translations/ca.json +++ b/homeassistant/components/linky/.translations/ca.json @@ -18,7 +18,7 @@ "description": "Introdueix les teves credencials", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/da.json b/homeassistant/components/linky/.translations/da.json index 2097d094a3a3..e157b8fec566 100644 --- a/homeassistant/components/linky/.translations/da.json +++ b/homeassistant/components/linky/.translations/da.json @@ -18,7 +18,7 @@ "description": "Indtast dine legitimationsoplysninger", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/de.json b/homeassistant/components/linky/.translations/de.json index 83e56a52c6c2..72a60759aeb0 100644 --- a/homeassistant/components/linky/.translations/de.json +++ b/homeassistant/components/linky/.translations/de.json @@ -18,7 +18,7 @@ "description": "Gib deine Zugangsdaten ein", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/en.json b/homeassistant/components/linky/.translations/en.json index 13d2553b0c7f..142a87c9071c 100644 --- a/homeassistant/components/linky/.translations/en.json +++ b/homeassistant/components/linky/.translations/en.json @@ -18,7 +18,7 @@ "description": "Enter your credentials", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/es-419.json b/homeassistant/components/linky/.translations/es-419.json index 5bddb534146d..c1efff6fa349 100644 --- a/homeassistant/components/linky/.translations/es-419.json +++ b/homeassistant/components/linky/.translations/es-419.json @@ -15,7 +15,7 @@ "description": "Ingrese sus credenciales", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/es.json b/homeassistant/components/linky/.translations/es.json index 532c08a9687b..b33163d99ede 100644 --- a/homeassistant/components/linky/.translations/es.json +++ b/homeassistant/components/linky/.translations/es.json @@ -18,7 +18,7 @@ "description": "Introduzca sus credenciales", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/fr.json b/homeassistant/components/linky/.translations/fr.json index 6dba7e9af893..723261e164c6 100644 --- a/homeassistant/components/linky/.translations/fr.json +++ b/homeassistant/components/linky/.translations/fr.json @@ -18,7 +18,7 @@ "description": "Entrez vos identifiants", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/it.json b/homeassistant/components/linky/.translations/it.json index 67418f616ad4..ee362f9aa721 100644 --- a/homeassistant/components/linky/.translations/it.json +++ b/homeassistant/components/linky/.translations/it.json @@ -18,7 +18,7 @@ "description": "Inserisci le tue credenziali", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ko.json b/homeassistant/components/linky/.translations/ko.json index 78c825398d6c..7f7534192cf4 100644 --- a/homeassistant/components/linky/.translations/ko.json +++ b/homeassistant/components/linky/.translations/ko.json @@ -18,7 +18,7 @@ "description": "\uc790\uaca9 \uc99d\uba85\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/lb.json b/homeassistant/components/linky/.translations/lb.json index b4c10bec367e..6a1b10593807 100644 --- a/homeassistant/components/linky/.translations/lb.json +++ b/homeassistant/components/linky/.translations/lb.json @@ -18,7 +18,7 @@ "description": "F\u00ebllt \u00e4r Login Informatiounen aus", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/nl.json b/homeassistant/components/linky/.translations/nl.json index 5654edb08f49..e9f6476f0724 100644 --- a/homeassistant/components/linky/.translations/nl.json +++ b/homeassistant/components/linky/.translations/nl.json @@ -18,7 +18,7 @@ "description": "Voer uw gegevens in", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/nn.json b/homeassistant/components/linky/.translations/nn.json index 6e084d1a9d28..b9f4c41692e4 100644 --- a/homeassistant/components/linky/.translations/nn.json +++ b/homeassistant/components/linky/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/no.json b/homeassistant/components/linky/.translations/no.json index 77b3bac80328..0a71a623b290 100644 --- a/homeassistant/components/linky/.translations/no.json +++ b/homeassistant/components/linky/.translations/no.json @@ -18,7 +18,7 @@ "description": "Skriv inn legitimasjonen din", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/pl.json b/homeassistant/components/linky/.translations/pl.json index 62da10e1c96a..ebeb37c991f2 100644 --- a/homeassistant/components/linky/.translations/pl.json +++ b/homeassistant/components/linky/.translations/pl.json @@ -18,7 +18,7 @@ "description": "Wprowad\u017a dane uwierzytelniaj\u0105ce", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/pt-BR.json b/homeassistant/components/linky/.translations/pt-BR.json index 9a4a710e5220..0681172165c7 100644 --- a/homeassistant/components/linky/.translations/pt-BR.json +++ b/homeassistant/components/linky/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Insira suas credenciais", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ru.json b/homeassistant/components/linky/.translations/ru.json index a868f9666c5c..69dd4717ec28 100644 --- a/homeassistant/components/linky/.translations/ru.json +++ b/homeassistant/components/linky/.translations/ru.json @@ -18,7 +18,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/sl.json b/homeassistant/components/linky/.translations/sl.json index 6ebe598e882d..8c49004aefee 100644 --- a/homeassistant/components/linky/.translations/sl.json +++ b/homeassistant/components/linky/.translations/sl.json @@ -18,7 +18,7 @@ "description": "Vnesite svoje poverilnice", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/sv.json b/homeassistant/components/linky/.translations/sv.json index 4880e065fa2f..d4b784046f82 100644 --- a/homeassistant/components/linky/.translations/sv.json +++ b/homeassistant/components/linky/.translations/sv.json @@ -18,7 +18,7 @@ "description": "Ange dina autentiseringsuppgifter", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/zh-Hant.json b/homeassistant/components/linky/.translations/zh-Hant.json index 611428432ee4..c5f291289eee 100644 --- a/homeassistant/components/linky/.translations/zh-Hant.json +++ b/homeassistant/components/linky/.translations/zh-Hant.json @@ -18,7 +18,7 @@ "description": "\u8f38\u5165\u6191\u8b49", "title": "Linky" } - }, - "title": "Linky" - } + } + }, + "title": "Linky" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/ca.json b/homeassistant/components/local_ip/.translations/ca.json index cc2154ad9d0e..b21164458aac 100644 --- a/homeassistant/components/local_ip/.translations/ca.json +++ b/homeassistant/components/local_ip/.translations/ca.json @@ -11,7 +11,7 @@ }, "title": "Adre\u00e7a IP local" } - }, - "title": "Adre\u00e7a IP local" - } + } + }, + "title": "Adre\u00e7a IP local" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/da.json b/homeassistant/components/local_ip/.translations/da.json index c0396ccb182f..6c3e379c1e91 100644 --- a/homeassistant/components/local_ip/.translations/da.json +++ b/homeassistant/components/local_ip/.translations/da.json @@ -10,7 +10,7 @@ }, "title": "Lokal IP-adresse" } - }, - "title": "Lokal IP-adresse" - } + } + }, + "title": "Lokal IP-adresse" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/de.json b/homeassistant/components/local_ip/.translations/de.json index 7e1df67811ca..d687518ad30a 100644 --- a/homeassistant/components/local_ip/.translations/de.json +++ b/homeassistant/components/local_ip/.translations/de.json @@ -11,7 +11,7 @@ }, "title": "Lokale IP-Adresse" } - }, - "title": "Lokale IP-Adresse" - } + } + }, + "title": "Lokale IP-Adresse" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/en.json b/homeassistant/components/local_ip/.translations/en.json index 20fcd202ed99..c81c03bd710c 100644 --- a/homeassistant/components/local_ip/.translations/en.json +++ b/homeassistant/components/local_ip/.translations/en.json @@ -11,7 +11,7 @@ }, "title": "Local IP Address" } - }, - "title": "Local IP Address" - } + } + }, + "title": "Local IP Address" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/es.json b/homeassistant/components/local_ip/.translations/es.json index a798de0530f2..5d29b267fa2a 100644 --- a/homeassistant/components/local_ip/.translations/es.json +++ b/homeassistant/components/local_ip/.translations/es.json @@ -11,7 +11,7 @@ }, "title": "Direcci\u00f3n IP local" } - }, - "title": "Direcci\u00f3n IP local" - } + } + }, + "title": "Direcci\u00f3n IP local" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/fr.json b/homeassistant/components/local_ip/.translations/fr.json index 9d4b84e9ecd9..383a7d4263c0 100644 --- a/homeassistant/components/local_ip/.translations/fr.json +++ b/homeassistant/components/local_ip/.translations/fr.json @@ -11,7 +11,7 @@ }, "title": "Adresse IP locale" } - }, - "title": "Adresse IP locale" - } + } + }, + "title": "Adresse IP locale" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/hu.json b/homeassistant/components/local_ip/.translations/hu.json index 7a78029c3790..c57ad99bf0fa 100644 --- a/homeassistant/components/local_ip/.translations/hu.json +++ b/homeassistant/components/local_ip/.translations/hu.json @@ -10,7 +10,7 @@ }, "title": "Helyi IP c\u00edm" } - }, - "title": "Helyi IP c\u00edm" - } + } + }, + "title": "Helyi IP c\u00edm" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/it.json b/homeassistant/components/local_ip/.translations/it.json index a33e892c6ec2..3edda00dc1c5 100644 --- a/homeassistant/components/local_ip/.translations/it.json +++ b/homeassistant/components/local_ip/.translations/it.json @@ -10,7 +10,7 @@ }, "title": "Indirizzo IP locale" } - }, - "title": "Indirizzo IP locale" - } + } + }, + "title": "Indirizzo IP locale" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/ko.json b/homeassistant/components/local_ip/.translations/ko.json index a00a130bfcaf..9feb39506600 100644 --- a/homeassistant/components/local_ip/.translations/ko.json +++ b/homeassistant/components/local_ip/.translations/ko.json @@ -10,7 +10,7 @@ }, "title": "\ub85c\uceec IP \uc8fc\uc18c" } - }, - "title": "\ub85c\uceec IP \uc8fc\uc18c" - } + } + }, + "title": "\ub85c\uceec IP \uc8fc\uc18c" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/lb.json b/homeassistant/components/local_ip/.translations/lb.json index aa249f184ced..2b2f92ebdbad 100644 --- a/homeassistant/components/local_ip/.translations/lb.json +++ b/homeassistant/components/local_ip/.translations/lb.json @@ -10,7 +10,7 @@ }, "title": "Lokal IP Adresse" } - }, - "title": "Lokal IP Adresse" - } + } + }, + "title": "Lokal IP Adresse" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/nl.json b/homeassistant/components/local_ip/.translations/nl.json index 6f22d2c585a7..5306d17ea2b0 100644 --- a/homeassistant/components/local_ip/.translations/nl.json +++ b/homeassistant/components/local_ip/.translations/nl.json @@ -10,7 +10,7 @@ }, "title": "Lokaal IP-adres" } - }, - "title": "Lokaal IP-adres" - } + } + }, + "title": "Lokaal IP-adres" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/no.json b/homeassistant/components/local_ip/.translations/no.json index 2427a7ae50d5..2a2a194c166a 100644 --- a/homeassistant/components/local_ip/.translations/no.json +++ b/homeassistant/components/local_ip/.translations/no.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Integrasjonen er allerede konfigurert med en eksisterende sensor med det navnet" + "already_configured": "Integrasjonen er allerede konfigurert med en eksisterende sensor med det navnet", + "single_instance_allowed": "Bare en enkelt konfigurasjon av lokal IP er tillatt." }, "step": { "user": { @@ -10,7 +11,7 @@ }, "title": "Lokal IP-adresse" } - }, - "title": "Lokal IP-adresse" - } + } + }, + "title": "Lokal IP-adresse" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/pl.json b/homeassistant/components/local_ip/.translations/pl.json index 82b614a8e179..26cce0fe770d 100644 --- a/homeassistant/components/local_ip/.translations/pl.json +++ b/homeassistant/components/local_ip/.translations/pl.json @@ -10,7 +10,7 @@ }, "title": "Lokalny adres IP" } - }, - "title": "Lokalny adres IP" - } + } + }, + "title": "Lokalny adres IP" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/pt-BR.json b/homeassistant/components/local_ip/.translations/pt-BR.json index 3aea40754568..69d250ad6f17 100644 --- a/homeassistant/components/local_ip/.translations/pt-BR.json +++ b/homeassistant/components/local_ip/.translations/pt-BR.json @@ -10,7 +10,7 @@ }, "title": "Endere\u00e7o IP local" } - }, - "title": "Endere\u00e7o IP local" - } + } + }, + "title": "Endere\u00e7o IP local" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/ru.json b/homeassistant/components/local_ip/.translations/ru.json index b013fb3bd8dc..80a11e4f16d0 100644 --- a/homeassistant/components/local_ip/.translations/ru.json +++ b/homeassistant/components/local_ip/.translations/ru.json @@ -11,7 +11,7 @@ }, "title": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441" } - }, - "title": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441" - } + } + }, + "title": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/sl.json b/homeassistant/components/local_ip/.translations/sl.json index 23894b20c9c0..aa71441b8cdf 100644 --- a/homeassistant/components/local_ip/.translations/sl.json +++ b/homeassistant/components/local_ip/.translations/sl.json @@ -10,7 +10,7 @@ }, "title": "Lokalni IP naslov" } - }, - "title": "Lokalni IP naslov" - } + } + }, + "title": "Lokalni IP naslov" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/sv.json b/homeassistant/components/local_ip/.translations/sv.json index d9f9b474f9c4..3ef9309c9637 100644 --- a/homeassistant/components/local_ip/.translations/sv.json +++ b/homeassistant/components/local_ip/.translations/sv.json @@ -10,7 +10,7 @@ }, "title": "Lokal IP-adress" } - }, - "title": "Lokal IP-adress" - } + } + }, + "title": "Lokal IP-adress" } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/zh-Hant.json b/homeassistant/components/local_ip/.translations/zh-Hant.json index d5ea8d0bc4c3..7ad755226a50 100644 --- a/homeassistant/components/local_ip/.translations/zh-Hant.json +++ b/homeassistant/components/local_ip/.translations/zh-Hant.json @@ -11,7 +11,7 @@ }, "title": "\u672c\u5730 IP \u4f4d\u5740" } - }, - "title": "\u672c\u5730 IP \u4f4d\u5740" - } + } + }, + "title": "\u672c\u5730 IP \u4f4d\u5740" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/bg.json b/homeassistant/components/locative/.translations/bg.json index 1e80c86e8626..a69c443c8889 100644 --- a/homeassistant/components/locative/.translations/bg.json +++ b/homeassistant/components/locative/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Locative Webhook?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ca.json b/homeassistant/components/locative/.translations/ca.json index ff3c150886de..3aef44f12028 100644 --- a/homeassistant/components/locative/.translations/ca.json +++ b/homeassistant/components/locative/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar el Webhook de Locative?", "title": "Configuraci\u00f3 del Webhook de Locative" } - }, - "title": "Webhook de Locative" - } + } + }, + "title": "Webhook de Locative" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/cs.json b/homeassistant/components/locative/.translations/cs.json index d48b6ff13d9b..1e9eab323d42 100644 --- a/homeassistant/components/locative/.translations/cs.json +++ b/homeassistant/components/locative/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit Locative Webhook?", "title": "Nastavit Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/da.json b/homeassistant/components/locative/.translations/da.json index 3752b23bbe38..6df2a846c8cf 100644 --- a/homeassistant/components/locative/.translations/da.json +++ b/homeassistant/components/locative/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Locative Webhook?", "title": "Konfigurer Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/de.json b/homeassistant/components/locative/.translations/de.json index ff8cfd97b24d..63420c805ba9 100644 --- a/homeassistant/components/locative/.translations/de.json +++ b/homeassistant/components/locative/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du den Locative Webhook wirklich einrichten?", "title": "Locative Webhook einrichten" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/en.json b/homeassistant/components/locative/.translations/en.json index 052557408d81..fc12bb2d1bcd 100644 --- a/homeassistant/components/locative/.translations/en.json +++ b/homeassistant/components/locative/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up the Locative Webhook?", "title": "Set up the Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/es-419.json b/homeassistant/components/locative/.translations/es-419.json index 8fb63ff18c7a..1068dead9c88 100644 --- a/homeassistant/components/locative/.translations/es-419.json +++ b/homeassistant/components/locative/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1 seguro de que desea configurar el Webhook Locative?", "title": "Configurar el Webhook Locative" } - }, - "title": "Webhook Locative" - } + } + }, + "title": "Webhook Locative" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/es.json b/homeassistant/components/locative/.translations/es.json index c89a251b670e..86116ef68458 100644 --- a/homeassistant/components/locative/.translations/es.json +++ b/homeassistant/components/locative/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar el webhook de Locative?", "title": "Configurar el webhook de Locative" } - }, - "title": "Webhook de Locative" - } + } + }, + "title": "Webhook de Locative" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/fr.json b/homeassistant/components/locative/.translations/fr.json index a90f7ff989c8..0221c2f02a84 100644 --- a/homeassistant/components/locative/.translations/fr.json +++ b/homeassistant/components/locative/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer le Webhook Locative ?", "title": "Configurer le Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/hu.json b/homeassistant/components/locative/.translations/hu.json index 3528f1c1e45b..fba9ff9e13dc 100644 --- a/homeassistant/components/locative/.translations/hu.json +++ b/homeassistant/components/locative/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Locative Webhook-ot?", "title": "Locative Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/it.json b/homeassistant/components/locative/.translations/it.json index 4fdef0a987e0..6e691c840311 100644 --- a/homeassistant/components/locative/.translations/it.json +++ b/homeassistant/components/locative/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare il webhook di Locative?", "title": "Configura il webhook di Locative" } - }, - "title": "Webhook di Locative" - } + } + }, + "title": "Webhook di Locative" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ko.json b/homeassistant/components/locative/.translations/ko.json index c53f538799fe..a91681736fb7 100644 --- a/homeassistant/components/locative/.translations/ko.json +++ b/homeassistant/components/locative/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Locative Webhook \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Locative Webhook \uc124\uc815" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/lb.json b/homeassistant/components/locative/.translations/lb.json index 25db0ecef815..ebbae39b07b0 100644 --- a/homeassistant/components/locative/.translations/lb.json +++ b/homeassistant/components/locative/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Locative Webhook anzeriichten?", "title": "Locative Webhook ariichten" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/nl.json b/homeassistant/components/locative/.translations/nl.json index 26ec0951d884..b348b03f2ac4 100644 --- a/homeassistant/components/locative/.translations/nl.json +++ b/homeassistant/components/locative/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u de Locative Webhook wilt instellen?", "title": "Stel de Locative Webhook in" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/no.json b/homeassistant/components/locative/.translations/no.json index 123b03d95a87..1363c39d8b83 100644 --- a/homeassistant/components/locative/.translations/no.json +++ b/homeassistant/components/locative/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp Locative Webhook?", "title": "Sett opp Locative Webhook" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pl.json b/homeassistant/components/locative/.translations/pl.json index 23a4c98a54cf..5d254874c512 100644 --- a/homeassistant/components/locative/.translations/pl.json +++ b/homeassistant/components/locative/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Locative Webhook?", "title": "Konfiguracja Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pt-BR.json b/homeassistant/components/locative/.translations/pt-BR.json index 2ca31ca1895e..b6fa617b8086 100644 --- a/homeassistant/components/locative/.translations/pt-BR.json +++ b/homeassistant/components/locative/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Locative Webhook?", "title": "Configurar o Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pt.json b/homeassistant/components/locative/.translations/pt.json index 2104ad906079..b1571ae7516f 100644 --- a/homeassistant/components/locative/.translations/pt.json +++ b/homeassistant/components/locative/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Locative Webhook?", "title": "Configurar o Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ru.json b/homeassistant/components/locative/.translations/ru.json index 90fa5253a61f..2bb0cccc2817 100644 --- a/homeassistant/components/locative/.translations/ru.json +++ b/homeassistant/components/locative/.translations/ru.json @@ -12,7 +12,7 @@ "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 Locative?", "title": "Locative" } - }, - "title": "Locative" - } + } + }, + "title": "Locative" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/sl.json b/homeassistant/components/locative/.translations/sl.json index 0b0bd45b7d6f..77eb3f8a4374 100644 --- a/homeassistant/components/locative/.translations/sl.json +++ b/homeassistant/components/locative/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Locative Webhook?", "title": "Nastavite Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/sv.json b/homeassistant/components/locative/.translations/sv.json index 0296d0799387..1f3ae163c76d 100644 --- a/homeassistant/components/locative/.translations/sv.json +++ b/homeassistant/components/locative/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Locative Webhook?", "title": "Konfigurera Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/zh-Hans.json b/homeassistant/components/locative/.translations/zh-Hans.json index d6c831d5a0e1..807314ad06c1 100644 --- a/homeassistant/components/locative/.translations/zh-Hans.json +++ b/homeassistant/components/locative/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e\u5b9a\u4f4d Webhook\u5417\uff1f", "title": "\u8bbe\u7f6e\u5b9a\u4f4d Webhook" } - }, - "title": "\u5b9a\u4f4d Webhook" - } + } + }, + "title": "\u5b9a\u4f4d Webhook" } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/zh-Hant.json b/homeassistant/components/locative/.translations/zh-Hant.json index 5135eb33c9f2..e4590d8f9e6c 100644 --- a/homeassistant/components/locative/.translations/zh-Hant.json +++ b/homeassistant/components/locative/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Locative Webhook\uff1f", "title": "\u8a2d\u5b9a Locative Webhook" } - }, - "title": "Locative Webhook" - } + } + }, + "title": "Locative Webhook" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/bg.json b/homeassistant/components/logi_circle/.translations/bg.json index 406250cd77c0..4b825f1dfd3e 100644 --- a/homeassistant/components/logi_circle/.translations/bg.json +++ b/homeassistant/components/logi_circle/.translations/bg.json @@ -26,7 +26,7 @@ "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0438\u0440\u0430\u043d\u0435, \u0447\u0440\u0435\u0437 \u043a\u043e\u0439\u0442\u043e \u0434\u0430 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0441 Logi Circle.", "title": "\u0414\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ca.json b/homeassistant/components/logi_circle/.translations/ca.json index 8e455023f2a8..4be8656a3b1d 100644 --- a/homeassistant/components/logi_circle/.translations/ca.json +++ b/homeassistant/components/logi_circle/.translations/ca.json @@ -26,7 +26,7 @@ "description": "Tria quin prove\u00efdor d'autenticaci\u00f3 vols utilitzar per autenticar-te amb Logi Circle.", "title": "Prove\u00efdor d'autenticaci\u00f3" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/da.json b/homeassistant/components/logi_circle/.translations/da.json index 1f2a96fe5b44..bda554b39cc3 100644 --- a/homeassistant/components/logi_circle/.translations/da.json +++ b/homeassistant/components/logi_circle/.translations/da.json @@ -26,7 +26,7 @@ "description": "V\u00e6lg via hvilken godkendelsesudbyder du vil godkende med Logi Circle.", "title": "Godkendelsesudbyder" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/de.json b/homeassistant/components/logi_circle/.translations/de.json index 4d7ef918ddcc..34c49f13b9e0 100644 --- a/homeassistant/components/logi_circle/.translations/de.json +++ b/homeassistant/components/logi_circle/.translations/de.json @@ -26,7 +26,7 @@ "description": "W\u00e4hle aus, \u00fcber welchen Anbieter du dich bei Logi Circle authentifizieren m\u00f6chtest.", "title": "Authentifizierungsanbieter" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/en.json b/homeassistant/components/logi_circle/.translations/en.json index bf3c059f81ab..cd829c3f1292 100644 --- a/homeassistant/components/logi_circle/.translations/en.json +++ b/homeassistant/components/logi_circle/.translations/en.json @@ -26,7 +26,7 @@ "description": "Pick via which authentication provider you want to authenticate with Logi Circle.", "title": "Authentication Provider" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/es-419.json b/homeassistant/components/logi_circle/.translations/es-419.json index 2393908e2811..cb6285e479e0 100644 --- a/homeassistant/components/logi_circle/.translations/es-419.json +++ b/homeassistant/components/logi_circle/.translations/es-419.json @@ -21,7 +21,7 @@ }, "title": "Proveedor de autenticaci\u00f3n" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/es.json b/homeassistant/components/logi_circle/.translations/es.json index 7209bdfefd5a..17be05d9ff8d 100644 --- a/homeassistant/components/logi_circle/.translations/es.json +++ b/homeassistant/components/logi_circle/.translations/es.json @@ -26,7 +26,7 @@ "description": "Elige a trav\u00e9s de qu\u00e9 proveedor de autenticaci\u00f3n quieres autenticarte con Logi Circle.", "title": "Proveedor de autenticaci\u00f3n" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/fr.json b/homeassistant/components/logi_circle/.translations/fr.json index 7f8a2f2a098a..909116d8faf8 100644 --- a/homeassistant/components/logi_circle/.translations/fr.json +++ b/homeassistant/components/logi_circle/.translations/fr.json @@ -26,7 +26,7 @@ "description": "Choisissez via quel fournisseur d'authentification vous souhaitez vous authentifier avec Logi Circle.", "title": "Fournisseur d'authentification" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/it.json b/homeassistant/components/logi_circle/.translations/it.json index d7c1d9ba9de7..f5c066ae4c86 100644 --- a/homeassistant/components/logi_circle/.translations/it.json +++ b/homeassistant/components/logi_circle/.translations/it.json @@ -26,7 +26,7 @@ "description": "Scegli tramite quale provider di autenticazione vuoi autenticarti con Logi Circle.", "title": "Provider di autenticazione" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ko.json b/homeassistant/components/logi_circle/.translations/ko.json index 577f3475b58f..afb9258cddc7 100644 --- a/homeassistant/components/logi_circle/.translations/ko.json +++ b/homeassistant/components/logi_circle/.translations/ko.json @@ -26,7 +26,7 @@ "description": "Logi Circle \uc744 \uc778\uc99d\ud558\uae30 \uc704\ud55c \uc778\uc99d \uacf5\uae09\uc790\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694.", "title": "\uc778\uc99d \uacf5\uae09\uc790" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/lb.json b/homeassistant/components/logi_circle/.translations/lb.json index b0befa80fd4f..955507c447e4 100644 --- a/homeassistant/components/logi_circle/.translations/lb.json +++ b/homeassistant/components/logi_circle/.translations/lb.json @@ -26,7 +26,7 @@ "description": "Wielt den Authentifikatioun Ubidder deen sech mat Logi Circle verbanne soll.", "title": "Authentifikatioun Ubidder" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/nl.json b/homeassistant/components/logi_circle/.translations/nl.json index 822447f353db..f1cb6881a95a 100644 --- a/homeassistant/components/logi_circle/.translations/nl.json +++ b/homeassistant/components/logi_circle/.translations/nl.json @@ -26,7 +26,7 @@ "description": "Kies met welke authenticatieprovider u wilt authenticeren met Logi Circle.", "title": "Authenticatieprovider" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/nn.json b/homeassistant/components/logi_circle/.translations/nn.json index 0ea648256d3f..42396486277e 100644 --- a/homeassistant/components/logi_circle/.translations/nn.json +++ b/homeassistant/components/logi_circle/.translations/nn.json @@ -13,7 +13,7 @@ "user": { "description": "Vel kva for ein autentiseringsleverand\u00f8r du vil godkjenne med Logi Circle" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/no.json b/homeassistant/components/logi_circle/.translations/no.json index 9f676e2acc70..58e86a3d2287 100644 --- a/homeassistant/components/logi_circle/.translations/no.json +++ b/homeassistant/components/logi_circle/.translations/no.json @@ -26,7 +26,7 @@ "description": "Velg med hvilken autentiseringsleverand\u00f8r du vil godkjenne Logi Circle.", "title": "Autentiseringsleverand\u00f8r" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/pl.json b/homeassistant/components/logi_circle/.translations/pl.json index 333a295ad06d..826a6c4bd0df 100644 --- a/homeassistant/components/logi_circle/.translations/pl.json +++ b/homeassistant/components/logi_circle/.translations/pl.json @@ -12,11 +12,11 @@ "error": { "auth_error": "Autoryzacja API nie powiod\u0142a si\u0119.", "auth_timeout": "Przekroczono limit czasu \u017c\u0105dania tokena dost\u0119pu.", - "follow_link": "Post\u0119puj zgodnie z linkiem i uwierzytelnij si\u0119 przed naci\u015bni\u0119ciem przycisku Prze\u015blij." + "follow_link": "Post\u0119puj zgodnie z linkiem i uwierzytelnij si\u0119 przed naci\u015bni\u0119ciem przycisku \"Zatwierd\u017a\"." }, "step": { "auth": { - "description": "Kliknij poni\u017cszy link i Zaakceptuj dost\u0119p do konta Logi Circle, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Prze\u015blij poni\u017cej. \n\n [Link]({authorization_url})", + "description": "Kliknij poni\u017cszy link i Zaakceptuj dost\u0119p do konta Logi Circle, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Zatwierd\u017a poni\u017cej. \n\n [Link]({authorization_url})", "title": "Uwierzytelnij za pomoc\u0105 Logi Circle" }, "user": { @@ -26,7 +26,7 @@ "description": "Wybierz, kt\u00f3rego dostawc\u0119 uwierzytelnienia chcesz u\u017cywa\u0107 z Logi Circle.", "title": "Dostawca uwierzytelnienia" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/pt-BR.json b/homeassistant/components/logi_circle/.translations/pt-BR.json index 2912b7d73000..0ab768ae7b88 100644 --- a/homeassistant/components/logi_circle/.translations/pt-BR.json +++ b/homeassistant/components/logi_circle/.translations/pt-BR.json @@ -26,7 +26,7 @@ "description": "Escolha atrav\u00e9s de qual provedor de autentica\u00e7\u00e3o voc\u00ea deseja autenticar com o Logi Circle.", "title": "Provedor de Autentica\u00e7\u00e3o" } - }, - "title": "C\u00edrculo Logi" - } + } + }, + "title": "C\u00edrculo Logi" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ru.json b/homeassistant/components/logi_circle/.translations/ru.json index 9cecf3081b68..b60748ad84c6 100644 --- a/homeassistant/components/logi_circle/.translations/ru.json +++ b/homeassistant/components/logi_circle/.translations/ru.json @@ -26,7 +26,7 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432\u0445\u043e\u0434.", "title": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/sl.json b/homeassistant/components/logi_circle/.translations/sl.json index 3906f96a39f1..04db56d126a1 100644 --- a/homeassistant/components/logi_circle/.translations/sl.json +++ b/homeassistant/components/logi_circle/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Izberite prek katerega ponudnika overjanja \u017eelite overiti Logi Circle.", "title": "Ponudnik overjanja" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/sv.json b/homeassistant/components/logi_circle/.translations/sv.json index 221d2a7a86b3..59875cbe61e4 100644 --- a/homeassistant/components/logi_circle/.translations/sv.json +++ b/homeassistant/components/logi_circle/.translations/sv.json @@ -26,7 +26,7 @@ "description": "V\u00e4lj vilken autentiseringsleverant\u00f6r du vill autentisera med Logi Circle.", "title": "Verifieringsleverant\u00f6r" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/zh-Hant.json b/homeassistant/components/logi_circle/.translations/zh-Hant.json index 1eb3b71c942d..96e037ce72fc 100644 --- a/homeassistant/components/logi_circle/.translations/zh-Hant.json +++ b/homeassistant/components/logi_circle/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u65bc\u8a8d\u8b49\u63d0\u4f9b\u8005\u4e2d\u6311\u9078\u6240\u8981\u9032\u884c Logi Circle \u8a8d\u8b49\u63d0\u4f9b\u8005\u3002", "title": "\u8a8d\u8b49\u63d0\u4f9b\u8005" } - }, - "title": "Logi Circle" - } + } + }, + "title": "Logi Circle" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/bg.json b/homeassistant/components/luftdaten/.translations/bg.json index ecd7f17c84be..ced6f0344005 100644 --- a/homeassistant/components/luftdaten/.translations/bg.json +++ b/homeassistant/components/luftdaten/.translations/bg.json @@ -13,7 +13,7 @@ }, "title": "\u0414\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ca.json b/homeassistant/components/luftdaten/.translations/ca.json index b00c1b2e3e3b..6b97a4c94bcb 100644 --- a/homeassistant/components/luftdaten/.translations/ca.json +++ b/homeassistant/components/luftdaten/.translations/ca.json @@ -13,7 +13,7 @@ }, "title": "Configuraci\u00f3 de Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/cs.json b/homeassistant/components/luftdaten/.translations/cs.json index 701ccf2612ce..244284995ed4 100644 --- a/homeassistant/components/luftdaten/.translations/cs.json +++ b/homeassistant/components/luftdaten/.translations/cs.json @@ -13,7 +13,7 @@ }, "title": "Definujte Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/da.json b/homeassistant/components/luftdaten/.translations/da.json index 3a5f5e7b4099..617ee8bf51c6 100644 --- a/homeassistant/components/luftdaten/.translations/da.json +++ b/homeassistant/components/luftdaten/.translations/da.json @@ -13,7 +13,7 @@ }, "title": "Definer Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/de.json b/homeassistant/components/luftdaten/.translations/de.json index 46d75a6b73b7..50c1bd8b430e 100644 --- a/homeassistant/components/luftdaten/.translations/de.json +++ b/homeassistant/components/luftdaten/.translations/de.json @@ -13,7 +13,7 @@ }, "title": "Luftdaten einrichten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/en.json b/homeassistant/components/luftdaten/.translations/en.json index d6c86e9ac1fc..435497933ddd 100644 --- a/homeassistant/components/luftdaten/.translations/en.json +++ b/homeassistant/components/luftdaten/.translations/en.json @@ -13,7 +13,7 @@ }, "title": "Define Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/es-419.json b/homeassistant/components/luftdaten/.translations/es-419.json index 8e81e9e52a14..a53a04a3cc48 100644 --- a/homeassistant/components/luftdaten/.translations/es-419.json +++ b/homeassistant/components/luftdaten/.translations/es-419.json @@ -13,7 +13,7 @@ }, "title": "Definir Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/es.json b/homeassistant/components/luftdaten/.translations/es.json index e93da557ae82..4f392558d23a 100644 --- a/homeassistant/components/luftdaten/.translations/es.json +++ b/homeassistant/components/luftdaten/.translations/es.json @@ -13,7 +13,7 @@ }, "title": "Definir Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/fr.json b/homeassistant/components/luftdaten/.translations/fr.json index 3e1d41be3497..ed73bcf0618d 100644 --- a/homeassistant/components/luftdaten/.translations/fr.json +++ b/homeassistant/components/luftdaten/.translations/fr.json @@ -13,7 +13,7 @@ }, "title": "D\u00e9finir Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/hu.json b/homeassistant/components/luftdaten/.translations/hu.json index b8b2b1fc0d89..4677c69a7ba9 100644 --- a/homeassistant/components/luftdaten/.translations/hu.json +++ b/homeassistant/components/luftdaten/.translations/hu.json @@ -13,7 +13,7 @@ }, "title": "Luftdaten be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/it.json b/homeassistant/components/luftdaten/.translations/it.json index 279513782958..45fb05b01085 100644 --- a/homeassistant/components/luftdaten/.translations/it.json +++ b/homeassistant/components/luftdaten/.translations/it.json @@ -13,7 +13,7 @@ }, "title": "Definisci Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ko.json b/homeassistant/components/luftdaten/.translations/ko.json index 97af0e8ed9be..ae77202ec822 100644 --- a/homeassistant/components/luftdaten/.translations/ko.json +++ b/homeassistant/components/luftdaten/.translations/ko.json @@ -13,7 +13,7 @@ }, "title": "Luftdaten \uc124\uc815" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/lb.json b/homeassistant/components/luftdaten/.translations/lb.json index 931d2a5557c3..00b5ec5d08ce 100644 --- a/homeassistant/components/luftdaten/.translations/lb.json +++ b/homeassistant/components/luftdaten/.translations/lb.json @@ -13,7 +13,7 @@ }, "title": "Luftdaten d\u00e9fin\u00e9ieren" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/nl.json b/homeassistant/components/luftdaten/.translations/nl.json index 3284b581f5fe..bc53a164a5bc 100644 --- a/homeassistant/components/luftdaten/.translations/nl.json +++ b/homeassistant/components/luftdaten/.translations/nl.json @@ -13,7 +13,7 @@ }, "title": "Definieer Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/nn.json b/homeassistant/components/luftdaten/.translations/nn.json index 52b1ec331662..2639d90be2d7 100644 --- a/homeassistant/components/luftdaten/.translations/nn.json +++ b/homeassistant/components/luftdaten/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Luftdaten" - } + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/no.json b/homeassistant/components/luftdaten/.translations/no.json index ac15a68bc4b8..10f635d8d4da 100644 --- a/homeassistant/components/luftdaten/.translations/no.json +++ b/homeassistant/components/luftdaten/.translations/no.json @@ -13,7 +13,7 @@ }, "title": "Definer Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pl.json b/homeassistant/components/luftdaten/.translations/pl.json index 19e71b5156fd..c7a20a8abadf 100644 --- a/homeassistant/components/luftdaten/.translations/pl.json +++ b/homeassistant/components/luftdaten/.translations/pl.json @@ -13,7 +13,7 @@ }, "title": "Konfiguracja Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pt-BR.json b/homeassistant/components/luftdaten/.translations/pt-BR.json index c5e104694d7d..004fbc36c50e 100644 --- a/homeassistant/components/luftdaten/.translations/pt-BR.json +++ b/homeassistant/components/luftdaten/.translations/pt-BR.json @@ -13,7 +13,7 @@ }, "title": "Definir Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pt.json b/homeassistant/components/luftdaten/.translations/pt.json index 9ed3611da27f..5522e08226a2 100644 --- a/homeassistant/components/luftdaten/.translations/pt.json +++ b/homeassistant/components/luftdaten/.translations/pt.json @@ -13,7 +13,7 @@ }, "title": "Definir Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ru.json b/homeassistant/components/luftdaten/.translations/ru.json index 759fd926bdc4..3d0530c54ea2 100644 --- a/homeassistant/components/luftdaten/.translations/ru.json +++ b/homeassistant/components/luftdaten/.translations/ru.json @@ -13,7 +13,7 @@ }, "title": "Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/sl.json b/homeassistant/components/luftdaten/.translations/sl.json index c1dd0462f94b..73e1b48b342f 100644 --- a/homeassistant/components/luftdaten/.translations/sl.json +++ b/homeassistant/components/luftdaten/.translations/sl.json @@ -13,7 +13,7 @@ }, "title": "Dolo\u010dite Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/sv.json b/homeassistant/components/luftdaten/.translations/sv.json index 01fd9ec721b3..96172796a599 100644 --- a/homeassistant/components/luftdaten/.translations/sv.json +++ b/homeassistant/components/luftdaten/.translations/sv.json @@ -13,7 +13,7 @@ }, "title": "Definiera Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/zh-Hans.json b/homeassistant/components/luftdaten/.translations/zh-Hans.json index 375a08d8a457..693079bcd9c5 100644 --- a/homeassistant/components/luftdaten/.translations/zh-Hans.json +++ b/homeassistant/components/luftdaten/.translations/zh-Hans.json @@ -13,7 +13,7 @@ }, "title": "\u5b9a\u4e49 Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/zh-Hant.json b/homeassistant/components/luftdaten/.translations/zh-Hant.json index 5ea3f6826316..310cf325f01d 100644 --- a/homeassistant/components/luftdaten/.translations/zh-Hant.json +++ b/homeassistant/components/luftdaten/.translations/zh-Hant.json @@ -13,7 +13,7 @@ }, "title": "\u5b9a\u7fa9 Luftdaten" } - }, - "title": "Luftdaten" - } + } + }, + "title": "Luftdaten" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/bg.json b/homeassistant/components/lutron_caseta/.translations/bg.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/bg.json +++ b/homeassistant/components/lutron_caseta/.translations/bg.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/ca.json b/homeassistant/components/lutron_caseta/.translations/ca.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/ca.json +++ b/homeassistant/components/lutron_caseta/.translations/ca.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/da.json b/homeassistant/components/lutron_caseta/.translations/da.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/da.json +++ b/homeassistant/components/lutron_caseta/.translations/da.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/de.json b/homeassistant/components/lutron_caseta/.translations/de.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/de.json +++ b/homeassistant/components/lutron_caseta/.translations/de.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/en.json b/homeassistant/components/lutron_caseta/.translations/en.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/en.json +++ b/homeassistant/components/lutron_caseta/.translations/en.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/es.json b/homeassistant/components/lutron_caseta/.translations/es.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/es.json +++ b/homeassistant/components/lutron_caseta/.translations/es.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/fr.json b/homeassistant/components/lutron_caseta/.translations/fr.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/fr.json +++ b/homeassistant/components/lutron_caseta/.translations/fr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ 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 cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/hu.json +++ b/homeassistant/components/lutron_caseta/.translations/hu.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/it.json b/homeassistant/components/lutron_caseta/.translations/it.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/it.json +++ b/homeassistant/components/lutron_caseta/.translations/it.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/ko.json b/homeassistant/components/lutron_caseta/.translations/ko.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/ko.json +++ b/homeassistant/components/lutron_caseta/.translations/ko.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/lb.json b/homeassistant/components/lutron_caseta/.translations/lb.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/lb.json +++ b/homeassistant/components/lutron_caseta/.translations/lb.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/nl.json b/homeassistant/components/lutron_caseta/.translations/nl.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/nl.json +++ b/homeassistant/components/lutron_caseta/.translations/nl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/no.json b/homeassistant/components/lutron_caseta/.translations/no.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/no.json +++ b/homeassistant/components/lutron_caseta/.translations/no.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/pl.json b/homeassistant/components/lutron_caseta/.translations/pl.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/pl.json +++ b/homeassistant/components/lutron_caseta/.translations/pl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/ru.json b/homeassistant/components/lutron_caseta/.translations/ru.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/ru.json +++ b/homeassistant/components/lutron_caseta/.translations/ru.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/sl.json b/homeassistant/components/lutron_caseta/.translations/sl.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/sl.json +++ b/homeassistant/components/lutron_caseta/.translations/sl.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/sv.json b/homeassistant/components/lutron_caseta/.translations/sv.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/sv.json +++ b/homeassistant/components/lutron_caseta/.translations/sv.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/.translations/zh-Hant.json b/homeassistant/components/lutron_caseta/.translations/zh-Hant.json index cfc3c290afee..970d722fe4cc 100644 --- a/homeassistant/components/lutron_caseta/.translations/zh-Hant.json +++ b/homeassistant/components/lutron_caseta/.translations/zh-Hant.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Lutron Cas\u00e9ta" - } + "title": "Lutron Cas\u00e9ta" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/bg.json b/homeassistant/components/mailgun/.translations/bg.json index 3ae97ab164a2..02c4b631fff8 100644 --- a/homeassistant/components/mailgun/.translations/bg.json +++ b/homeassistant/components/mailgun/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Mailgun?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ca.json b/homeassistant/components/mailgun/.translations/ca.json index 6bcb737588a4..fe50470f59d0 100644 --- a/homeassistant/components/mailgun/.translations/ca.json +++ b/homeassistant/components/mailgun/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar Mailgun?", "title": "Configuraci\u00f3 del Webhook de Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/cs.json b/homeassistant/components/mailgun/.translations/cs.json index 2f7c4e5a9020..6dc7f9f05175 100644 --- a/homeassistant/components/mailgun/.translations/cs.json +++ b/homeassistant/components/mailgun/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit slu\u017ebu Mailgun?", "title": "Nastavit Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/da.json b/homeassistant/components/mailgun/.translations/da.json index f91526337066..1b0b909e5db4 100644 --- a/homeassistant/components/mailgun/.translations/da.json +++ b/homeassistant/components/mailgun/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Mailgun?", "title": "Konfigurer Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/de.json b/homeassistant/components/mailgun/.translations/de.json index 93412ca75f31..c73eafdc2648 100644 --- a/homeassistant/components/mailgun/.translations/de.json +++ b/homeassistant/components/mailgun/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du Mailgun wirklich einrichten?", "title": "Mailgun-Webhook einrichten" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/en.json b/homeassistant/components/mailgun/.translations/en.json index 98529a338157..dc2cd72d3ac7 100644 --- a/homeassistant/components/mailgun/.translations/en.json +++ b/homeassistant/components/mailgun/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up Mailgun?", "title": "Set up the Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/es-419.json b/homeassistant/components/mailgun/.translations/es-419.json index fd0c543241b1..89a3c8751b4a 100644 --- a/homeassistant/components/mailgun/.translations/es-419.json +++ b/homeassistant/components/mailgun/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar Mailgun?", "title": "Configurar el Webhook de Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/es.json b/homeassistant/components/mailgun/.translations/es.json index 4428d7e1868f..1f0614147276 100644 --- a/homeassistant/components/mailgun/.translations/es.json +++ b/homeassistant/components/mailgun/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar Mailgun?", "title": "Configurar el Webhook de Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/fr.json b/homeassistant/components/mailgun/.translations/fr.json index 5d86a36b9476..e9a5835e2d34 100644 --- a/homeassistant/components/mailgun/.translations/fr.json +++ b/homeassistant/components/mailgun/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer Mailgun?", "title": "Configurer le Webhook Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/hu.json b/homeassistant/components/mailgun/.translations/hu.json index 975c106a26fc..ca2468ced7fb 100644 --- a/homeassistant/components/mailgun/.translations/hu.json +++ b/homeassistant/components/mailgun/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Mailgunt?", "title": "Mailgun Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/it.json b/homeassistant/components/mailgun/.translations/it.json index 4dea652aa3f8..8230edd5ca68 100644 --- a/homeassistant/components/mailgun/.translations/it.json +++ b/homeassistant/components/mailgun/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare Mailgun?", "title": "Configura il webhook di Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ko.json b/homeassistant/components/mailgun/.translations/ko.json index 8f1f021caf61..7d4fbb76be77 100644 --- a/homeassistant/components/mailgun/.translations/ko.json +++ b/homeassistant/components/mailgun/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Mailgun \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Mailgun Webhook \uc124\uc815" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/lb.json b/homeassistant/components/mailgun/.translations/lb.json index f84225444d94..ef622bb6b379 100644 --- a/homeassistant/components/mailgun/.translations/lb.json +++ b/homeassistant/components/mailgun/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Mailgun anzeriichten?", "title": "Mailgun Webhook ariichten" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/nl.json b/homeassistant/components/mailgun/.translations/nl.json index 6a1ff24ef2c2..c9fcc2d150d2 100644 --- a/homeassistant/components/mailgun/.translations/nl.json +++ b/homeassistant/components/mailgun/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u Mailgun wilt instellen?", "title": "Stel de Mailgun Webhook in" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/nn.json b/homeassistant/components/mailgun/.translations/nn.json index 2bab2e430016..9e8d91a8874c 100644 --- a/homeassistant/components/mailgun/.translations/nn.json +++ b/homeassistant/components/mailgun/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Mailgun" - } + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/no.json b/homeassistant/components/mailgun/.translations/no.json index 3d1cbd41a341..2a6aaa2984a8 100644 --- a/homeassistant/components/mailgun/.translations/no.json +++ b/homeassistant/components/mailgun/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 sette opp Mailgun?", "title": "Sett opp Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pl.json b/homeassistant/components/mailgun/.translations/pl.json index ddca4c432fa1..725ade01ae1c 100644 --- a/homeassistant/components/mailgun/.translations/pl.json +++ b/homeassistant/components/mailgun/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Mailgun?", "title": "Konfiguracja Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pt-BR.json b/homeassistant/components/mailgun/.translations/pt-BR.json index 8d9cb92e315a..4b5471bc08e9 100644 --- a/homeassistant/components/mailgun/.translations/pt-BR.json +++ b/homeassistant/components/mailgun/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Mailgun?", "title": "Configurar o Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pt.json b/homeassistant/components/mailgun/.translations/pt.json index 72255c695ac7..102d1420d6d1 100644 --- a/homeassistant/components/mailgun/.translations/pt.json +++ b/homeassistant/components/mailgun/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Mailgun?", "title": "Configurar o Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ru.json b/homeassistant/components/mailgun/.translations/ru.json index 9e8a293b4bf9..e21eb422a64c 100644 --- a/homeassistant/components/mailgun/.translations/ru.json +++ b/homeassistant/components/mailgun/.translations/ru.json @@ -12,7 +12,7 @@ "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 Mailgun?", "title": "Mailgun" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/sl.json b/homeassistant/components/mailgun/.translations/sl.json index 2f526826d318..b9594f9ec864 100644 --- a/homeassistant/components/mailgun/.translations/sl.json +++ b/homeassistant/components/mailgun/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Mailgun?", "title": "Nastavite Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/sv.json b/homeassistant/components/mailgun/.translations/sv.json index f26234e84cf0..6bbd3cee3ef4 100644 --- a/homeassistant/components/mailgun/.translations/sv.json +++ b/homeassistant/components/mailgun/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Mailgun?", "title": "Konfigurera Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/zh-Hans.json b/homeassistant/components/mailgun/.translations/zh-Hans.json index 5dd0a7aeabf3..3569cc21659b 100644 --- a/homeassistant/components/mailgun/.translations/zh-Hans.json +++ b/homeassistant/components/mailgun/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e Mailgun \u5417\uff1f", "title": "\u8bbe\u7f6e Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/zh-Hant.json b/homeassistant/components/mailgun/.translations/zh-Hant.json index f16533312fa2..8d437f90dcbf 100644 --- a/homeassistant/components/mailgun/.translations/zh-Hant.json +++ b/homeassistant/components/mailgun/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Mailgun\uff1f", "title": "\u8a2d\u5b9a Mailgun Webhook" } - }, - "title": "Mailgun" - } + } + }, + "title": "Mailgun" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ca.json b/homeassistant/components/melcloud/.translations/ca.json index 1dc5156f7e73..df7ce9050740 100644 --- a/homeassistant/components/melcloud/.translations/ca.json +++ b/homeassistant/components/melcloud/.translations/ca.json @@ -17,7 +17,7 @@ "description": "Connecta\u2019t amb el teu compte de MELCloud.", "title": "Connexi\u00f3 amb MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/da.json b/homeassistant/components/melcloud/.translations/da.json index 6901ed229345..c3c6adcc2187 100644 --- a/homeassistant/components/melcloud/.translations/da.json +++ b/homeassistant/components/melcloud/.translations/da.json @@ -17,7 +17,7 @@ "description": "Opret forbindelse ved hj\u00e6lp af din MELCloud-konto.", "title": "Opret forbindelse til MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/de.json b/homeassistant/components/melcloud/.translations/de.json index f4e2a3b1ebc7..5154a9c2762f 100644 --- a/homeassistant/components/melcloud/.translations/de.json +++ b/homeassistant/components/melcloud/.translations/de.json @@ -17,7 +17,7 @@ "description": "Verbinden Sie sich mit Ihrem MELCloud-Konto.", "title": "Stellen Sie eine Verbindung zu MELCloud her" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/en.json b/homeassistant/components/melcloud/.translations/en.json index 48682f617a3b..f482761309be 100644 --- a/homeassistant/components/melcloud/.translations/en.json +++ b/homeassistant/components/melcloud/.translations/en.json @@ -17,7 +17,7 @@ "description": "Connect using your MELCloud account.", "title": "Connect to MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/es.json b/homeassistant/components/melcloud/.translations/es.json index 182f06c33c39..e9144a14e34c 100644 --- a/homeassistant/components/melcloud/.translations/es.json +++ b/homeassistant/components/melcloud/.translations/es.json @@ -17,7 +17,7 @@ "description": "Con\u00e9ctate usando tu cuenta de MELCloud.", "title": "Con\u00e9ctese a MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/fr.json b/homeassistant/components/melcloud/.translations/fr.json index 00661d3f0afa..e75a1667ad57 100644 --- a/homeassistant/components/melcloud/.translations/fr.json +++ b/homeassistant/components/melcloud/.translations/fr.json @@ -14,7 +14,7 @@ "description": "Se connecter en utilisant votre MELCloud compte.", "title": "Se connecter \u00e0 MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/it.json b/homeassistant/components/melcloud/.translations/it.json index 029fc2526b28..eb691d13417f 100644 --- a/homeassistant/components/melcloud/.translations/it.json +++ b/homeassistant/components/melcloud/.translations/it.json @@ -17,7 +17,7 @@ "description": "Connettiti utilizzando il tuo account MELCloud.", "title": "Connettersi a MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ko.json b/homeassistant/components/melcloud/.translations/ko.json index 428e2b1f994c..6067a6e62d94 100644 --- a/homeassistant/components/melcloud/.translations/ko.json +++ b/homeassistant/components/melcloud/.translations/ko.json @@ -17,7 +17,7 @@ "description": "MELCloud \uacc4\uc815\uc73c\ub85c \uc5f0\uacb0\ud558\uc138\uc694.", "title": "MELCloud \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/lb.json b/homeassistant/components/melcloud/.translations/lb.json index b082ef789653..6dfebbd9b435 100644 --- a/homeassistant/components/melcloud/.translations/lb.json +++ b/homeassistant/components/melcloud/.translations/lb.json @@ -17,7 +17,7 @@ "description": "Verbann dech mat dengem MElCloud Kont.", "title": "Mat MELCloud verbannen" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/nl.json b/homeassistant/components/melcloud/.translations/nl.json index b60495e7f474..ffdd4bce7967 100644 --- a/homeassistant/components/melcloud/.translations/nl.json +++ b/homeassistant/components/melcloud/.translations/nl.json @@ -17,7 +17,7 @@ "description": "Maak verbinding via uw MELCloud account.", "title": "Maak verbinding met MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/no.json b/homeassistant/components/melcloud/.translations/no.json index cdcc7087d066..0394dd99ba7d 100644 --- a/homeassistant/components/melcloud/.translations/no.json +++ b/homeassistant/components/melcloud/.translations/no.json @@ -17,7 +17,7 @@ "description": "Koble til ved hjelp av MELCloud-kontoen din.", "title": "Koble til MELCloud" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/pl.json b/homeassistant/components/melcloud/.translations/pl.json index 60cc9843607f..881b7d57c8e4 100644 --- a/homeassistant/components/melcloud/.translations/pl.json +++ b/homeassistant/components/melcloud/.translations/pl.json @@ -17,7 +17,7 @@ "description": "Po\u0142\u0105cz u\u017cywaj\u0105c swojego konta MELCloud.", "title": "Po\u0142\u0105czenie z MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ru.json b/homeassistant/components/melcloud/.translations/ru.json index d4bab0e417e1..e9306d959181 100644 --- a/homeassistant/components/melcloud/.translations/ru.json +++ b/homeassistant/components/melcloud/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u0441\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0432\u043e\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c MELCloud.", "title": "MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/sl.json b/homeassistant/components/melcloud/.translations/sl.json index 04dbb953d0dd..a997675accb3 100644 --- a/homeassistant/components/melcloud/.translations/sl.json +++ b/homeassistant/components/melcloud/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Pove\u017eite se s svojim ra\u010dunom MELCloud.", "title": "Pove\u017eite se z MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/sv.json b/homeassistant/components/melcloud/.translations/sv.json index 72a251ef9d07..514ae2bc020e 100644 --- a/homeassistant/components/melcloud/.translations/sv.json +++ b/homeassistant/components/melcloud/.translations/sv.json @@ -17,7 +17,7 @@ "description": "Anslut med ditt MELCloud-konto.", "title": "Anslut till MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/zh-Hant.json b/homeassistant/components/melcloud/.translations/zh-Hant.json index c098d0415983..c89058465e84 100644 --- a/homeassistant/components/melcloud/.translations/zh-Hant.json +++ b/homeassistant/components/melcloud/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u4f7f\u7528 MELCloud \u5e33\u865f\u9032\u884c\u9023\u7dda\u3002", "title": "\u9023\u7dda\u81f3 MELCloud" } - }, - "title": "MELCloud" - } + } + }, + "title": "MELCloud" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/bg.json b/homeassistant/components/met/.translations/bg.json index aa85bed1d130..e5620f25c880 100644 --- a/homeassistant/components/met/.translations/bg.json +++ b/homeassistant/components/met/.translations/bg.json @@ -14,7 +14,7 @@ "description": "\u041d\u043e\u0440\u0432\u0435\u0436\u043a\u0438 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442", "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ca.json b/homeassistant/components/met/.translations/ca.json index 5335bfd48ea9..0d0ca2413975 100644 --- a/homeassistant/components/met/.translations/ca.json +++ b/homeassistant/components/met/.translations/ca.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Ubicaci\u00f3" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/da.json b/homeassistant/components/met/.translations/da.json index e36a6511aa31..603d4426ca3a 100644 --- a/homeassistant/components/met/.translations/da.json +++ b/homeassistant/components/met/.translations/da.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Lokalitet" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/de.json b/homeassistant/components/met/.translations/de.json index 2fd772c8619b..6114f89afb1a 100644 --- a/homeassistant/components/met/.translations/de.json +++ b/homeassistant/components/met/.translations/de.json @@ -14,7 +14,7 @@ "description": "Meteorologisches Institut", "title": "Standort" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/en.json b/homeassistant/components/met/.translations/en.json index 93d028b06261..ed51d481487c 100644 --- a/homeassistant/components/met/.translations/en.json +++ b/homeassistant/components/met/.translations/en.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Location" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/es-419.json b/homeassistant/components/met/.translations/es-419.json index d744de150d28..67038a0a5910 100644 --- a/homeassistant/components/met/.translations/es-419.json +++ b/homeassistant/components/met/.translations/es-419.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Ubicaci\u00f3n" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/es.json b/homeassistant/components/met/.translations/es.json index a475518bd851..b6ec410584cd 100644 --- a/homeassistant/components/met/.translations/es.json +++ b/homeassistant/components/met/.translations/es.json @@ -14,7 +14,7 @@ "description": "Instituto de meteorolog\u00eda", "title": "Ubicaci\u00f3n" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/fr.json b/homeassistant/components/met/.translations/fr.json index 164cb13967b7..44025b847557 100644 --- a/homeassistant/components/met/.translations/fr.json +++ b/homeassistant/components/met/.translations/fr.json @@ -14,7 +14,7 @@ "description": "Institut m\u00e9t\u00e9orologique", "title": "Emplacement" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/hr.json b/homeassistant/components/met/.translations/hr.json index 6505229355cf..c8fa12df5e0a 100644 --- a/homeassistant/components/met/.translations/hr.json +++ b/homeassistant/components/met/.translations/hr.json @@ -14,7 +14,7 @@ "description": "Meteorolo\u0161ki institutt", "title": "Lokacija" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/hu.json b/homeassistant/components/met/.translations/hu.json index dcbc40b4c717..338593ec0c65 100644 --- a/homeassistant/components/met/.translations/hu.json +++ b/homeassistant/components/met/.translations/hu.json @@ -14,7 +14,7 @@ "description": "Meteorol\u00f3giai int\u00e9zet", "title": "Elhelyezked\u00e9s" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/it.json b/homeassistant/components/met/.translations/it.json index a1cfd12e8cda..0514010ce523 100644 --- a/homeassistant/components/met/.translations/it.json +++ b/homeassistant/components/met/.translations/it.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Posizione" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ko.json b/homeassistant/components/met/.translations/ko.json index 81a98b9754fe..f66fc97a4fcc 100644 --- a/homeassistant/components/met/.translations/ko.json +++ b/homeassistant/components/met/.translations/ko.json @@ -14,7 +14,7 @@ "description": "\ub178\ub974\uc6e8\uc774 \uae30\uc0c1 \uc5f0\uad6c\uc18c (Meteorologisk institutt)", "title": "\uc704\uce58" } - }, - "title": "\ub178\ub974\uc6e8\uc774 \uae30\uc0c1 \uc5f0\uad6c\uc18c (Met.no)" - } + } + }, + "title": "\ub178\ub974\uc6e8\uc774 \uae30\uc0c1 \uc5f0\uad6c\uc18c (Met.no)" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/lb.json b/homeassistant/components/met/.translations/lb.json index 9f91d37c2336..cc499625cf84 100644 --- a/homeassistant/components/met/.translations/lb.json +++ b/homeassistant/components/met/.translations/lb.json @@ -14,7 +14,7 @@ "description": "Meterologeschen Institut", "title": "Uertschaft" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/nl.json b/homeassistant/components/met/.translations/nl.json index c8b120b855a2..ca0d1626b9ba 100644 --- a/homeassistant/components/met/.translations/nl.json +++ b/homeassistant/components/met/.translations/nl.json @@ -14,7 +14,7 @@ "description": "Meteorologisch institutt", "title": "Locatie" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/nn.json b/homeassistant/components/met/.translations/nn.json index 6daa5b2657ad..cced4f6314da 100644 --- a/homeassistant/components/met/.translations/nn.json +++ b/homeassistant/components/met/.translations/nn.json @@ -6,7 +6,7 @@ "name": "Namn" } } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/no.json b/homeassistant/components/met/.translations/no.json index 9a3ef350ab10..0d83b874a6bc 100644 --- a/homeassistant/components/met/.translations/no.json +++ b/homeassistant/components/met/.translations/no.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Lokasjon" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/pl.json b/homeassistant/components/met/.translations/pl.json index e22ac763d568..52ddf089cf89 100644 --- a/homeassistant/components/met/.translations/pl.json +++ b/homeassistant/components/met/.translations/pl.json @@ -14,7 +14,7 @@ "description": "Instytut Meteorologiczny", "title": "Lokalizacja" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/pt-BR.json b/homeassistant/components/met/.translations/pt-BR.json index ab93d0bbef7b..a240fe50d7f5 100644 --- a/homeassistant/components/met/.translations/pt-BR.json +++ b/homeassistant/components/met/.translations/pt-BR.json @@ -14,7 +14,7 @@ "description": "Instituto de Meteorologia", "title": "Localiza\u00e7\u00e3o" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ru.json b/homeassistant/components/met/.translations/ru.json index 768152084aa4..a92b9016b3d2 100644 --- a/homeassistant/components/met/.translations/ru.json +++ b/homeassistant/components/met/.translations/ru.json @@ -14,7 +14,7 @@ "description": "\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442.", "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041d\u043e\u0440\u0432\u0435\u0433\u0438\u0438 (Met.no)" - } + } + }, + "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041d\u043e\u0440\u0432\u0435\u0433\u0438\u0438 (Met.no)" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/sl.json b/homeassistant/components/met/.translations/sl.json index 71ffdaf85095..cee47da47147 100644 --- a/homeassistant/components/met/.translations/sl.json +++ b/homeassistant/components/met/.translations/sl.json @@ -14,7 +14,7 @@ "description": "Meteorolo\u0161ki institut", "title": "Lokacija" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/sv.json b/homeassistant/components/met/.translations/sv.json index d8b461913da8..23b5c7a70cb5 100644 --- a/homeassistant/components/met/.translations/sv.json +++ b/homeassistant/components/met/.translations/sv.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "Position" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/zh-Hant.json b/homeassistant/components/met/.translations/zh-Hant.json index de7c34ffc879..393c60bc807c 100644 --- a/homeassistant/components/met/.translations/zh-Hant.json +++ b/homeassistant/components/met/.translations/zh-Hant.json @@ -14,7 +14,7 @@ "description": "Meteorologisk institutt", "title": "\u5ea7\u6a19" } - }, - "title": "Met.no" - } + } + }, + "title": "Met.no" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ca.json b/homeassistant/components/meteo_france/.translations/ca.json index aeceb80a0631..397edebc9ce8 100644 --- a/homeassistant/components/meteo_france/.translations/ca.json +++ b/homeassistant/components/meteo_france/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Introdueix el codi postal (nom\u00e9s recomanat per Fran\u00e7a) o nom de la ciutat", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/da.json b/homeassistant/components/meteo_france/.translations/da.json index 7c49d6f15ee7..4b303e4a5b92 100644 --- a/homeassistant/components/meteo_france/.translations/da.json +++ b/homeassistant/components/meteo_france/.translations/da.json @@ -12,7 +12,7 @@ "description": "Indtast postnummer (kun for Frankrig, anbefalet) eller bynavn", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/de.json b/homeassistant/components/meteo_france/.translations/de.json index 8f05ad18df37..a6b9b147ee5e 100644 --- a/homeassistant/components/meteo_france/.translations/de.json +++ b/homeassistant/components/meteo_france/.translations/de.json @@ -12,7 +12,7 @@ "description": "Geben Sie die Postleitzahl (nur f\u00fcr Frankreich empfohlen) oder den St\u00e4dtenamen ein", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/en.json b/homeassistant/components/meteo_france/.translations/en.json index 804ad9d67b1b..64b9b97b2ebc 100644 --- a/homeassistant/components/meteo_france/.translations/en.json +++ b/homeassistant/components/meteo_france/.translations/en.json @@ -12,7 +12,7 @@ "description": "Enter the postal code (only for France, recommended) or city name", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/es.json b/homeassistant/components/meteo_france/.translations/es.json index 3cd7ee56252f..a489b21033b6 100644 --- a/homeassistant/components/meteo_france/.translations/es.json +++ b/homeassistant/components/meteo_france/.translations/es.json @@ -12,7 +12,7 @@ "description": "Introduzca el c\u00f3digo postal (solo para Francia, recomendado) o el nombre de la ciudad", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/fr.json b/homeassistant/components/meteo_france/.translations/fr.json index 7dff0d237fde..da640cfb94fb 100644 --- a/homeassistant/components/meteo_france/.translations/fr.json +++ b/homeassistant/components/meteo_france/.translations/fr.json @@ -12,7 +12,7 @@ "description": "Entrez le code postal (uniquement pour la France, recommand\u00e9) ou le nom de la ville", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/hu.json b/homeassistant/components/meteo_france/.translations/hu.json index f1719f4bf303..d243dd162ac4 100644 --- a/homeassistant/components/meteo_france/.translations/hu.json +++ b/homeassistant/components/meteo_france/.translations/hu.json @@ -12,7 +12,7 @@ "description": "\u00cdrja be az ir\u00e1ny\u00edt\u00f3sz\u00e1mot (csak Franciaorsz\u00e1g eset\u00e9ben aj\u00e1nlott) vagy a v\u00e1ros nev\u00e9t", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/it.json b/homeassistant/components/meteo_france/.translations/it.json index 5a0674309067..a55e799fc252 100644 --- a/homeassistant/components/meteo_france/.translations/it.json +++ b/homeassistant/components/meteo_france/.translations/it.json @@ -12,7 +12,7 @@ "description": "Inserisci il codice postale (solo per la Francia, consigliato) o il nome della citt\u00e0", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ko.json b/homeassistant/components/meteo_france/.translations/ko.json index 8b2c7f497353..9f39e513c69c 100644 --- a/homeassistant/components/meteo_france/.translations/ko.json +++ b/homeassistant/components/meteo_france/.translations/ko.json @@ -12,7 +12,7 @@ "description": "\uc6b0\ud3b8\ubc88\ud638 (\ud504\ub791\uc2a4) \ub610\ub294 \ub3c4\uc2dc \uc774\ub984\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "\ud504\ub791\uc2a4 \uae30\uc0c1\uccad (M\u00e9t\u00e9o-France)" } - }, - "title": "\ud504\ub791\uc2a4 \uae30\uc0c1\uccad (M\u00e9t\u00e9o-France)" - } + } + }, + "title": "\ud504\ub791\uc2a4 \uae30\uc0c1\uccad (M\u00e9t\u00e9o-France)" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/lb.json b/homeassistant/components/meteo_france/.translations/lb.json index e2ee25882be8..b439b0892251 100644 --- a/homeassistant/components/meteo_france/.translations/lb.json +++ b/homeassistant/components/meteo_france/.translations/lb.json @@ -12,7 +12,7 @@ "description": "Gitt de Postcode an (n\u00ebmme fir Frankr\u00e4ich, recommand\u00e9iert) oder den Numm vun der Stad", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/nl.json b/homeassistant/components/meteo_france/.translations/nl.json index 648ef0c5fbd5..fdbb9a4ea88d 100644 --- a/homeassistant/components/meteo_france/.translations/nl.json +++ b/homeassistant/components/meteo_france/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Vul de postcode (alleen voor Frankrijk, aanbevolen) of de plaatsnaam in", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/no.json b/homeassistant/components/meteo_france/.translations/no.json index dc10ffd6a0fb..d902ec35efaa 100644 --- a/homeassistant/components/meteo_france/.translations/no.json +++ b/homeassistant/components/meteo_france/.translations/no.json @@ -12,7 +12,7 @@ "description": "Skriv inn postnummeret (bare for Frankrike, anbefalt) eller bynavn", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/pl.json b/homeassistant/components/meteo_france/.translations/pl.json index 38aa1944fac3..8d886f249fa0 100644 --- a/homeassistant/components/meteo_france/.translations/pl.json +++ b/homeassistant/components/meteo_france/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Wprowad\u017a kod pocztowy (tylko dla Francji, zalecane) lub nazw\u0119 miasta", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ru.json b/homeassistant/components/meteo_france/.translations/ru.json index 6aaff5f723f5..b281d43794ff 100644 --- a/homeassistant/components/meteo_france/.translations/ru.json +++ b/homeassistant/components/meteo_france/.translations/ru.json @@ -12,7 +12,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0424\u0440\u0430\u043d\u0446\u0438\u0438) \u0438\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u043e\u0434\u0430", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/sl.json b/homeassistant/components/meteo_france/.translations/sl.json index 845a89c47755..2f1468413113 100644 --- a/homeassistant/components/meteo_france/.translations/sl.json +++ b/homeassistant/components/meteo_france/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Vnesite po\u0161tno \u0161tevilko (samo za Francijo) ali ime mesta", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/sv.json b/homeassistant/components/meteo_france/.translations/sv.json index a7d021066d57..a25637790237 100644 --- a/homeassistant/components/meteo_france/.translations/sv.json +++ b/homeassistant/components/meteo_france/.translations/sv.json @@ -12,7 +12,7 @@ "description": "Ange postnumret (endast f\u00f6r Frankrike, rekommenderat) eller ortsnamn", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/zh-Hant.json b/homeassistant/components/meteo_france/.translations/zh-Hant.json index d3a35a6c7132..ac17b44d37b1 100644 --- a/homeassistant/components/meteo_france/.translations/zh-Hant.json +++ b/homeassistant/components/meteo_france/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u8f38\u5165\u90f5\u905e\u5340\u865f\uff08\u50c5\u652f\u63f4\u6cd5\u570b\uff09\u6216\u57ce\u5e02\u540d\u7a31", "title": "M\u00e9t\u00e9o-France" } - }, - "title": "M\u00e9t\u00e9o-France" - } + } + }, + "title": "M\u00e9t\u00e9o-France" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ca.json b/homeassistant/components/mikrotik/.translations/ca.json index 75a116a3f9f8..365be074a16c 100644 --- a/homeassistant/components/mikrotik/.translations/ca.json +++ b/homeassistant/components/mikrotik/.translations/ca.json @@ -20,8 +20,7 @@ }, "title": "Configuraci\u00f3 de Mikrotik Router" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/da.json b/homeassistant/components/mikrotik/.translations/da.json index 35e3cd5a08a7..f2233607e6e5 100644 --- a/homeassistant/components/mikrotik/.translations/da.json +++ b/homeassistant/components/mikrotik/.translations/da.json @@ -20,8 +20,7 @@ }, "title": "Konfigurer Mikrotik-router" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/de.json b/homeassistant/components/mikrotik/.translations/de.json index 97d28db4cfbc..84cf754b04bf 100644 --- a/homeassistant/components/mikrotik/.translations/de.json +++ b/homeassistant/components/mikrotik/.translations/de.json @@ -20,8 +20,7 @@ }, "title": "Richten Sie den Mikrotik Router ein" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -32,5 +31,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/en.json b/homeassistant/components/mikrotik/.translations/en.json index 0423401bf83c..aa9be5037336 100644 --- a/homeassistant/components/mikrotik/.translations/en.json +++ b/homeassistant/components/mikrotik/.translations/en.json @@ -20,8 +20,7 @@ }, "title": "Set up Mikrotik Router" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/es.json b/homeassistant/components/mikrotik/.translations/es.json index d149fe9d7794..461eda1a6324 100644 --- a/homeassistant/components/mikrotik/.translations/es.json +++ b/homeassistant/components/mikrotik/.translations/es.json @@ -20,8 +20,7 @@ }, "title": "Configurar el router Mikrotik" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/fr.json b/homeassistant/components/mikrotik/.translations/fr.json index 220da6fcbafa..8ed4adbe04d3 100644 --- a/homeassistant/components/mikrotik/.translations/fr.json +++ b/homeassistant/components/mikrotik/.translations/fr.json @@ -20,8 +20,7 @@ }, "title": "Configurer le routeur Mikrotik" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -32,5 +31,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/hu.json b/homeassistant/components/mikrotik/.translations/hu.json index 8afbeb699256..1fbd0216cc49 100644 --- a/homeassistant/components/mikrotik/.translations/hu.json +++ b/homeassistant/components/mikrotik/.translations/hu.json @@ -20,8 +20,7 @@ }, "title": "Mikrotik \u00fatv\u00e1laszt\u00f3 be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/it.json b/homeassistant/components/mikrotik/.translations/it.json index 9bc10220a9b0..8c97176e0ea6 100644 --- a/homeassistant/components/mikrotik/.translations/it.json +++ b/homeassistant/components/mikrotik/.translations/it.json @@ -20,8 +20,7 @@ }, "title": "Configurare il router Mikrotik" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ko.json b/homeassistant/components/mikrotik/.translations/ko.json index c91fd798d64f..985c02493b05 100644 --- a/homeassistant/components/mikrotik/.translations/ko.json +++ b/homeassistant/components/mikrotik/.translations/ko.json @@ -20,8 +20,7 @@ }, "title": "Mikrotik \ub77c\uc6b0\ud130 \uc124\uc815" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/lb.json b/homeassistant/components/mikrotik/.translations/lb.json index 2f11bad696b6..89e102d844aa 100644 --- a/homeassistant/components/mikrotik/.translations/lb.json +++ b/homeassistant/components/mikrotik/.translations/lb.json @@ -20,8 +20,7 @@ }, "title": "Mikrotik Router ariichten" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/lv.json b/homeassistant/components/mikrotik/.translations/lv.json index 232c7d161737..0ac2ea209556 100644 --- a/homeassistant/components/mikrotik/.translations/lv.json +++ b/homeassistant/components/mikrotik/.translations/lv.json @@ -10,7 +10,7 @@ }, "title": "Iestat\u012bt Mikrotik mar\u0161rut\u0113t\u0101ju" } - }, - "title": "Mikrotik" - } + } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/nl.json b/homeassistant/components/mikrotik/.translations/nl.json index d4996d492a5f..d05eda995249 100644 --- a/homeassistant/components/mikrotik/.translations/nl.json +++ b/homeassistant/components/mikrotik/.translations/nl.json @@ -20,8 +20,7 @@ }, "title": "Mikrotik Router instellen" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/no.json b/homeassistant/components/mikrotik/.translations/no.json index 8e18b27f0dee..4fcd68942467 100644 --- a/homeassistant/components/mikrotik/.translations/no.json +++ b/homeassistant/components/mikrotik/.translations/no.json @@ -20,8 +20,7 @@ }, "title": "Konfigurere Mikrotik-ruter" } - }, - "title": "" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/pl.json b/homeassistant/components/mikrotik/.translations/pl.json index 6d807672398a..53367773da9b 100644 --- a/homeassistant/components/mikrotik/.translations/pl.json +++ b/homeassistant/components/mikrotik/.translations/pl.json @@ -20,8 +20,7 @@ }, "title": "Konfiguracja routera Mikrotik" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ru.json b/homeassistant/components/mikrotik/.translations/ru.json index 844181b5b64c..32a4ec76caf5 100644 --- a/homeassistant/components/mikrotik/.translations/ru.json +++ b/homeassistant/components/mikrotik/.translations/ru.json @@ -20,8 +20,7 @@ }, "title": "MikroTik" } - }, - "title": "MikroTik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "MikroTik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/sl.json b/homeassistant/components/mikrotik/.translations/sl.json index a10508f8bbef..df4e97ab970a 100644 --- a/homeassistant/components/mikrotik/.translations/sl.json +++ b/homeassistant/components/mikrotik/.translations/sl.json @@ -20,8 +20,7 @@ }, "title": "Nastavite Mikrotik usmerjevalnik" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/sv.json b/homeassistant/components/mikrotik/.translations/sv.json index 7be080d96a2b..7944a8135d98 100644 --- a/homeassistant/components/mikrotik/.translations/sv.json +++ b/homeassistant/components/mikrotik/.translations/sv.json @@ -20,8 +20,7 @@ }, "title": "Konfigurera Mikrotik-router" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/zh-Hant.json b/homeassistant/components/mikrotik/.translations/zh-Hant.json index 6913f2c91f17..55764fb1dc4b 100644 --- a/homeassistant/components/mikrotik/.translations/zh-Hant.json +++ b/homeassistant/components/mikrotik/.translations/zh-Hant.json @@ -20,8 +20,7 @@ }, "title": "\u8a2d\u5b9a Mikrotik \u8def\u7531\u5668" } - }, - "title": "Mikrotik" + } }, "options": { "step": { @@ -33,5 +32,6 @@ } } } - } + }, + "title": "Mikrotik" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ca.json b/homeassistant/components/minecraft_server/.translations/ca.json index e205090d0cd7..5adeaf2f0bb0 100644 --- a/homeassistant/components/minecraft_server/.translations/ca.json +++ b/homeassistant/components/minecraft_server/.translations/ca.json @@ -17,7 +17,7 @@ "description": "Configuraci\u00f3 d'una inst\u00e0ncia de servidor de Minecraft per poder monitoritzar-lo.", "title": "Enlla\u00e7 del servidor de Minecraft" } - }, - "title": "Servidor de Minecraft" - } + } + }, + "title": "Servidor de Minecraft" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/da.json b/homeassistant/components/minecraft_server/.translations/da.json index e536234ffdb3..fde79efe8358 100644 --- a/homeassistant/components/minecraft_server/.translations/da.json +++ b/homeassistant/components/minecraft_server/.translations/da.json @@ -17,7 +17,7 @@ "description": "Konfigurer din Minecraft-server-instans for at tillade overv\u00e5gning.", "title": "Forbind din Minecraft-server" } - }, - "title": "Minecraft-server" - } + } + }, + "title": "Minecraft-server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/de.json b/homeassistant/components/minecraft_server/.translations/de.json index 31f0fe2c0f09..6341001621b8 100644 --- a/homeassistant/components/minecraft_server/.translations/de.json +++ b/homeassistant/components/minecraft_server/.translations/de.json @@ -17,7 +17,7 @@ "description": "Richte deine Minecraft Server-Instanz ein, um es \u00fcberwachen zu k\u00f6nnen.", "title": "Verkn\u00fcpfe deinen Minecraft Server" } - }, - "title": "Minecraft Server" - } + } + }, + "title": "Minecraft Server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/en.json b/homeassistant/components/minecraft_server/.translations/en.json index fa04208cac9a..16771d944703 100644 --- a/homeassistant/components/minecraft_server/.translations/en.json +++ b/homeassistant/components/minecraft_server/.translations/en.json @@ -17,7 +17,7 @@ "description": "Set up your Minecraft Server instance to allow monitoring.", "title": "Link your Minecraft Server" } - }, - "title": "Minecraft Server" - } + } + }, + "title": "Minecraft Server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/es.json b/homeassistant/components/minecraft_server/.translations/es.json index 58328d973fcd..9c4042720f6f 100644 --- a/homeassistant/components/minecraft_server/.translations/es.json +++ b/homeassistant/components/minecraft_server/.translations/es.json @@ -17,7 +17,7 @@ "description": "Configura tu instancia de Minecraft Server para permitir la supervisi\u00f3n.", "title": "Enlace su servidor Minecraft" } - }, - "title": "Servidor Minecraft" - } + } + }, + "title": "Servidor Minecraft" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/fr.json b/homeassistant/components/minecraft_server/.translations/fr.json index c52021806d8e..529d497e62f0 100644 --- a/homeassistant/components/minecraft_server/.translations/fr.json +++ b/homeassistant/components/minecraft_server/.translations/fr.json @@ -11,7 +11,7 @@ }, "title": "Reliez votre serveur Minecraft" } - }, - "title": "Serveur Minecraft" - } + } + }, + "title": "Serveur Minecraft" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/hu.json b/homeassistant/components/minecraft_server/.translations/hu.json index 4cf4a7a72fba..dffbe942b158 100644 --- a/homeassistant/components/minecraft_server/.translations/hu.json +++ b/homeassistant/components/minecraft_server/.translations/hu.json @@ -11,7 +11,7 @@ }, "title": "Kapcsold \u00f6ssze a Minecraft szervered" } - }, - "title": "Minecraft szerver" - } + } + }, + "title": "Minecraft szerver" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/it.json b/homeassistant/components/minecraft_server/.translations/it.json index a17ed15a5464..c8cd52a169aa 100644 --- a/homeassistant/components/minecraft_server/.translations/it.json +++ b/homeassistant/components/minecraft_server/.translations/it.json @@ -17,7 +17,7 @@ "description": "Configurare l'istanza del Server Minecraft per consentire il monitoraggio.", "title": "Collega il tuo Server Minecraft" } - }, - "title": "Server Minecraft" - } + } + }, + "title": "Server Minecraft" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ko.json b/homeassistant/components/minecraft_server/.translations/ko.json index ee3ee24db705..6fd774482535 100644 --- a/homeassistant/components/minecraft_server/.translations/ko.json +++ b/homeassistant/components/minecraft_server/.translations/ko.json @@ -17,7 +17,7 @@ "description": "\ubaa8\ub2c8\ud130\ub9c1\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d Minecraft \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694.", "title": "Minecraft \uc11c\ubc84 \uc5f0\uacb0" } - }, - "title": "Minecraft \uc11c\ubc84" - } + } + }, + "title": "Minecraft \uc11c\ubc84" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/lb.json b/homeassistant/components/minecraft_server/.translations/lb.json index 231572024694..302c4b9cbd04 100644 --- a/homeassistant/components/minecraft_server/.translations/lb.json +++ b/homeassistant/components/minecraft_server/.translations/lb.json @@ -17,7 +17,7 @@ "description": "Riicht deng Minecraft Server Instanz a fir d'Iwwerwaachung z'erlaben", "title": "Verbann d\u00e4in Minecraft Server" } - }, - "title": "Minecraft Server" - } + } + }, + "title": "Minecraft Server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/nl.json b/homeassistant/components/minecraft_server/.translations/nl.json index 4f42a16362b0..907327ea26fa 100644 --- a/homeassistant/components/minecraft_server/.translations/nl.json +++ b/homeassistant/components/minecraft_server/.translations/nl.json @@ -17,7 +17,7 @@ "description": "Stel uw Minecraft server in om monitoring toe te staan.", "title": "Koppel uw Minecraft server" } - }, - "title": "Minecraft server" - } + } + }, + "title": "Minecraft server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/no.json b/homeassistant/components/minecraft_server/.translations/no.json index cd627cbe4ba1..fada51c6ecee 100644 --- a/homeassistant/components/minecraft_server/.translations/no.json +++ b/homeassistant/components/minecraft_server/.translations/no.json @@ -17,7 +17,7 @@ "description": "Konfigurer Minecraft Server-forekomsten slik at den kan overv\u00e5kes.", "title": "Link din Minecraft Server" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/pl.json b/homeassistant/components/minecraft_server/.translations/pl.json index e277579ea23d..b0458e22bcef 100644 --- a/homeassistant/components/minecraft_server/.translations/pl.json +++ b/homeassistant/components/minecraft_server/.translations/pl.json @@ -17,7 +17,7 @@ "description": "Skonfiguruj instancj\u0119 serwera Minecraft, aby umo\u017cliwi\u0107 monitorowanie.", "title": "Po\u0142\u0105cz sw\u00f3j serwer Minecraft" } - }, - "title": "Serwer Minecraft" - } + } + }, + "title": "Serwer Minecraft" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ru.json b/homeassistant/components/minecraft_server/.translations/ru.json index a07b84077a90..e0feb85f1744 100644 --- a/homeassistant/components/minecraft_server/.translations/ru.json +++ b/homeassistant/components/minecraft_server/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0412\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Minecraft.", "title": "Minecraft Server" } - }, - "title": "Minecraft Server" - } + } + }, + "title": "Minecraft Server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/sl.json b/homeassistant/components/minecraft_server/.translations/sl.json index d1ed6a36c35e..0f8c0a86f84a 100644 --- a/homeassistant/components/minecraft_server/.translations/sl.json +++ b/homeassistant/components/minecraft_server/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Nastavite svoj Minecraft stre\u017enik, da omogo\u010dite spremljanje.", "title": "Pove\u017eite svoj Minecraft stre\u017enik" } - }, - "title": "Minecraft stre\u017enik" - } + } + }, + "title": "Minecraft stre\u017enik" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/sv.json b/homeassistant/components/minecraft_server/.translations/sv.json index e95938f1590e..857958c0319e 100644 --- a/homeassistant/components/minecraft_server/.translations/sv.json +++ b/homeassistant/components/minecraft_server/.translations/sv.json @@ -17,7 +17,7 @@ "description": "St\u00e4ll in din Minecraft Server-instans f\u00f6r att till\u00e5ta \u00f6vervakning.", "title": "L\u00e4nka din Minecraft-server" } - }, - "title": "Minecraft-server" - } + } + }, + "title": "Minecraft-server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/tr.json b/homeassistant/components/minecraft_server/.translations/tr.json index fb76f697cd54..be37c8c8244e 100644 --- a/homeassistant/components/minecraft_server/.translations/tr.json +++ b/homeassistant/components/minecraft_server/.translations/tr.json @@ -17,7 +17,7 @@ "description": "G\u00f6zetmeye izin vermek i\u00e7in Minecraft server nesnesini ayarla.", "title": "Minecraft Servern\u0131 ba\u011fla" } - }, - "title": "Minecraft Server" - } + } + }, + "title": "Minecraft Server" } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/zh-Hant.json b/homeassistant/components/minecraft_server/.translations/zh-Hant.json index fbcde2a6be15..bbca18fcfc0f 100644 --- a/homeassistant/components/minecraft_server/.translations/zh-Hant.json +++ b/homeassistant/components/minecraft_server/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u8a2d\u5b9a Minecraft \u4f3a\u670d\u5668\u4ee5\u9032\u884c\u76e3\u63a7\u3002", "title": "\u9023\u7d50 Minecraft \u4f3a\u670d\u5668" } - }, - "title": "Minecraft \u4f3a\u670d\u5668" - } + } + }, + "title": "Minecraft \u4f3a\u670d\u5668" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/bg.json b/homeassistant/components/mobile_app/.translations/bg.json index c89f66fec1ad..c55904286ece 100644 --- a/homeassistant/components/mobile_app/.translations/bg.json +++ b/homeassistant/components/mobile_app/.translations/bg.json @@ -8,7 +8,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \"\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\"?", "title": "\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" - } + } + }, + "title": "\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ca.json b/homeassistant/components/mobile_app/.translations/ca.json index 25af1d5e18d8..2c2bfb7abab1 100644 --- a/homeassistant/components/mobile_app/.translations/ca.json +++ b/homeassistant/components/mobile_app/.translations/ca.json @@ -8,7 +8,7 @@ "description": "Vols configurar el component d'aplicaci\u00f3 m\u00f2bil?", "title": "Aplicaci\u00f3 m\u00f2bil" } - }, - "title": "Aplicaci\u00f3 m\u00f2bil" - } + } + }, + "title": "Aplicaci\u00f3 m\u00f2bil" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/cs.json b/homeassistant/components/mobile_app/.translations/cs.json index b240e1224852..fc299883cf3f 100644 --- a/homeassistant/components/mobile_app/.translations/cs.json +++ b/homeassistant/components/mobile_app/.translations/cs.json @@ -8,7 +8,7 @@ "description": "Chcete nastavit komponentu Mobiln\u00ed aplikace?", "title": "Mobiln\u00ed aplikace" } - }, - "title": "Mobiln\u00ed aplikace" - } + } + }, + "title": "Mobiln\u00ed aplikace" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/da.json b/homeassistant/components/mobile_app/.translations/da.json index 54dc85e7255e..ee06d4802f7f 100644 --- a/homeassistant/components/mobile_app/.translations/da.json +++ b/homeassistant/components/mobile_app/.translations/da.json @@ -8,7 +8,7 @@ "description": "Vil du konfigurere mobilapp-komponenten?", "title": "Mobilapp" } - }, - "title": "Mobilapp" - } + } + }, + "title": "Mobilapp" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/de.json b/homeassistant/components/mobile_app/.translations/de.json index 816d281752db..c6e67d666c55 100644 --- a/homeassistant/components/mobile_app/.translations/de.json +++ b/homeassistant/components/mobile_app/.translations/de.json @@ -8,7 +8,7 @@ "description": "M\u00f6chtest du die Mobile App-Komponente einrichten?", "title": "Mobile App" } - }, - "title": "Mobile App" - } + } + }, + "title": "Mobile App" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/en.json b/homeassistant/components/mobile_app/.translations/en.json index 79a5fe1fba8e..a9af04df80c3 100644 --- a/homeassistant/components/mobile_app/.translations/en.json +++ b/homeassistant/components/mobile_app/.translations/en.json @@ -8,7 +8,7 @@ "description": "Do you want to set up the Mobile App component?", "title": "Mobile App" } - }, - "title": "Mobile App" - } + } + }, + "title": "Mobile App" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/es-419.json b/homeassistant/components/mobile_app/.translations/es-419.json index 271e38147c33..ac45fd59633d 100644 --- a/homeassistant/components/mobile_app/.translations/es-419.json +++ b/homeassistant/components/mobile_app/.translations/es-419.json @@ -7,7 +7,7 @@ "confirm": { "title": "Aplicaci\u00f3n movil" } - }, - "title": "Aplicaci\u00f3n movil" - } + } + }, + "title": "Aplicaci\u00f3n movil" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/es.json b/homeassistant/components/mobile_app/.translations/es.json index e88012b8613a..28f081204981 100644 --- a/homeassistant/components/mobile_app/.translations/es.json +++ b/homeassistant/components/mobile_app/.translations/es.json @@ -8,7 +8,7 @@ "description": "\u00bfQuieres configurar el componente de la aplicaci\u00f3n para el m\u00f3vil?", "title": "Aplicaci\u00f3n para el m\u00f3vil" } - }, - "title": "Aplicaci\u00f3n para el m\u00f3vil" - } + } + }, + "title": "Aplicaci\u00f3n para el m\u00f3vil" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/fr.json b/homeassistant/components/mobile_app/.translations/fr.json index 54c945a7a4be..c02c0abf8f20 100644 --- a/homeassistant/components/mobile_app/.translations/fr.json +++ b/homeassistant/components/mobile_app/.translations/fr.json @@ -8,7 +8,7 @@ "description": "Voulez-vous configurer le composant Application mobile?", "title": "Application mobile" } - }, - "title": "Application mobile" - } + } + }, + "title": "Application mobile" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/hu.json b/homeassistant/components/mobile_app/.translations/hu.json index e95f4743ae3d..de3450c581a0 100644 --- a/homeassistant/components/mobile_app/.translations/hu.json +++ b/homeassistant/components/mobile_app/.translations/hu.json @@ -8,7 +8,7 @@ "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a mobil alkalmaz\u00e1s komponenst?", "title": "Mobil alkalmaz\u00e1s" } - }, - "title": "Mobil alkalmaz\u00e1s" - } + } + }, + "title": "Mobil alkalmaz\u00e1s" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/it.json b/homeassistant/components/mobile_app/.translations/it.json index 37c0deb9c2d8..652f16c67c87 100644 --- a/homeassistant/components/mobile_app/.translations/it.json +++ b/homeassistant/components/mobile_app/.translations/it.json @@ -8,7 +8,7 @@ "description": "Si desidera configurare il componente App per dispositivi mobili?", "title": "App per dispositivi mobili" } - }, - "title": "App per dispositivi mobili" - } + } + }, + "title": "App per dispositivi mobili" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ko.json b/homeassistant/components/mobile_app/.translations/ko.json index 899845fcc2ef..616ee6d8593f 100644 --- a/homeassistant/components/mobile_app/.translations/ko.json +++ b/homeassistant/components/mobile_app/.translations/ko.json @@ -8,7 +8,7 @@ "description": "\ubaa8\ubc14\uc77c \uc571 \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc124\uc815\uc744 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "\ubaa8\ubc14\uc77c \uc571" } - }, - "title": "\ubaa8\ubc14\uc77c \uc571" - } + } + }, + "title": "\ubaa8\ubc14\uc77c \uc571" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/lb.json b/homeassistant/components/mobile_app/.translations/lb.json index a66ae603291a..618743d07f1f 100644 --- a/homeassistant/components/mobile_app/.translations/lb.json +++ b/homeassistant/components/mobile_app/.translations/lb.json @@ -8,7 +8,7 @@ "description": "Soll d'Mobil App konfigur\u00e9iert ginn?", "title": "Mobil App" } - }, - "title": "Mobil App" - } + } + }, + "title": "Mobil App" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/nl.json b/homeassistant/components/mobile_app/.translations/nl.json index 8140e7df7dc2..ce2f97e06a04 100644 --- a/homeassistant/components/mobile_app/.translations/nl.json +++ b/homeassistant/components/mobile_app/.translations/nl.json @@ -8,7 +8,7 @@ "description": "Wilt u de Mobile App component instellen?", "title": "Mobiele app" } - }, - "title": "Mobiele app" - } + } + }, + "title": "Mobiele app" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/nn.json b/homeassistant/components/mobile_app/.translations/nn.json index b4494a45ad25..0ccb9a8b9573 100644 --- a/homeassistant/components/mobile_app/.translations/nn.json +++ b/homeassistant/components/mobile_app/.translations/nn.json @@ -4,7 +4,7 @@ "confirm": { "title": "Mobilapp" } - }, - "title": "Mobilapp" - } + } + }, + "title": "Mobilapp" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/no.json b/homeassistant/components/mobile_app/.translations/no.json index 7189bc53c169..143b2155ac18 100644 --- a/homeassistant/components/mobile_app/.translations/no.json +++ b/homeassistant/components/mobile_app/.translations/no.json @@ -8,7 +8,7 @@ "description": "Vil du sette opp mobilapp-komponenten?", "title": "Mobilapp" } - }, - "title": "Mobilapp" - } + } + }, + "title": "Mobilapp" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pl.json b/homeassistant/components/mobile_app/.translations/pl.json index 5fa53384ff08..b8e0636b950a 100644 --- a/homeassistant/components/mobile_app/.translations/pl.json +++ b/homeassistant/components/mobile_app/.translations/pl.json @@ -8,7 +8,7 @@ "description": "Czy chcesz skonfigurowa\u0107 komponent aplikacji mobilnej?", "title": "Aplikacja mobilna" } - }, - "title": "Aplikacja mobilna" - } + } + }, + "title": "Aplikacja mobilna" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pt-BR.json b/homeassistant/components/mobile_app/.translations/pt-BR.json index d276b0511b30..132914b74fec 100644 --- a/homeassistant/components/mobile_app/.translations/pt-BR.json +++ b/homeassistant/components/mobile_app/.translations/pt-BR.json @@ -8,7 +8,7 @@ "description": "Deseja configurar o componente do aplicativo m\u00f3vel?", "title": "Aplicativo m\u00f3vel" } - }, - "title": "Aplicativo m\u00f3vel" - } + } + }, + "title": "Aplicativo m\u00f3vel" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pt.json b/homeassistant/components/mobile_app/.translations/pt.json index 1c61180726ca..fd1b4f2dad41 100644 --- a/homeassistant/components/mobile_app/.translations/pt.json +++ b/homeassistant/components/mobile_app/.translations/pt.json @@ -4,7 +4,7 @@ "confirm": { "title": "Aplica\u00e7\u00e3o m\u00f3vel" } - }, - "title": "Aplica\u00e7\u00e3o m\u00f3vel" - } + } + }, + "title": "Aplica\u00e7\u00e3o m\u00f3vel" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ru.json b/homeassistant/components/mobile_app/.translations/ru.json index 28a497ef2195..994cb8da5fe1 100644 --- a/homeassistant/components/mobile_app/.translations/ru.json +++ b/homeassistant/components/mobile_app/.translations/ru.json @@ -8,7 +8,7 @@ "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 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?", "title": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" - } + } + }, + "title": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/sl.json b/homeassistant/components/mobile_app/.translations/sl.json index 6236421ffce3..318ab6220d35 100644 --- a/homeassistant/components/mobile_app/.translations/sl.json +++ b/homeassistant/components/mobile_app/.translations/sl.json @@ -8,7 +8,7 @@ "description": "Ali \u017eelite nastaviti komponento aplikacije Mobile App?", "title": "Mobilna Aplikacija" } - }, - "title": "Mobilna Aplikacija" - } + } + }, + "title": "Mobilna Aplikacija" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/sv.json b/homeassistant/components/mobile_app/.translations/sv.json index 4f9570146f22..03a52485c233 100644 --- a/homeassistant/components/mobile_app/.translations/sv.json +++ b/homeassistant/components/mobile_app/.translations/sv.json @@ -8,7 +8,7 @@ "description": "Vill du konfigurera komponenten Mobile App?", "title": "Mobilapp" } - }, - "title": "Mobilapp" - } + } + }, + "title": "Mobilapp" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/uk.json b/homeassistant/components/mobile_app/.translations/uk.json index 654eb7675a87..90dd206046c6 100644 --- a/homeassistant/components/mobile_app/.translations/uk.json +++ b/homeassistant/components/mobile_app/.translations/uk.json @@ -5,7 +5,7 @@ "description": "\u0412\u0438 \u0445\u043e\u0447\u0435\u0442\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0431\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0434\u0430\u0442\u043a\u0430?", "title": "\u041c\u043e\u0431\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0434\u0430\u0442\u043e\u043a" } - }, - "title": "\u041c\u043e\u0431\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0434\u0430\u0442\u043e\u043a" - } + } + }, + "title": "\u041c\u043e\u0431\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0434\u0430\u0442\u043e\u043a" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/vi.json b/homeassistant/components/mobile_app/.translations/vi.json index 5b234c514a0d..7202144aaa96 100644 --- a/homeassistant/components/mobile_app/.translations/vi.json +++ b/homeassistant/components/mobile_app/.translations/vi.json @@ -8,7 +8,7 @@ "description": "B\u1ea1n c\u00f3 mu\u1ed1n thi\u1ebft l\u1eadp th\u00e0nh ph\u1ea7n \u1ee8ng d\u1ee5ng di \u0111\u1ed9ng kh\u00f4ng?", "title": "\u1ee8ng d\u1ee5ng di \u0111\u1ed9ng" } - }, - "title": "\u1ee8ng d\u1ee5ng di \u0111\u1ed9ng" - } + } + }, + "title": "\u1ee8ng d\u1ee5ng di \u0111\u1ed9ng" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/zh-Hans.json b/homeassistant/components/mobile_app/.translations/zh-Hans.json index 4a5e14196b00..808637328d08 100644 --- a/homeassistant/components/mobile_app/.translations/zh-Hans.json +++ b/homeassistant/components/mobile_app/.translations/zh-Hans.json @@ -8,7 +8,7 @@ "description": "\u60a8\u60f3\u8981\u914d\u7f6e\u79fb\u52a8\u5e94\u7528\u7a0b\u5e8f\u7ec4\u4ef6\u5417\uff1f", "title": "\u79fb\u52a8\u5e94\u7528" } - }, - "title": "\u79fb\u52a8\u5e94\u7528" - } + } + }, + "title": "\u79fb\u52a8\u5e94\u7528" } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/zh-Hant.json b/homeassistant/components/mobile_app/.translations/zh-Hant.json index 3b1ab72f7d31..a7e989f1abf0 100644 --- a/homeassistant/components/mobile_app/.translations/zh-Hant.json +++ b/homeassistant/components/mobile_app/.translations/zh-Hant.json @@ -8,7 +8,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a\u624b\u6a5f App \u5143\u4ef6\uff1f", "title": "\u624b\u6a5f App" } - }, - "title": "\u624b\u6a5f App" - } + } + }, + "title": "\u624b\u6a5f App" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ca.json b/homeassistant/components/monoprice/.translations/ca.json index ce7666717630..d4afcb7a1c61 100644 --- a/homeassistant/components/monoprice/.translations/ca.json +++ b/homeassistant/components/monoprice/.translations/ca.json @@ -20,8 +20,7 @@ }, "title": "Connexi\u00f3 amb el dispositiu" } - }, - "title": "Amplificador Monoprice de 6 zones" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Configuraci\u00f3 de les fonts" } } - } + }, + "title": "Amplificador Monoprice de 6 zones" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/de.json b/homeassistant/components/monoprice/.translations/de.json index ea2b8cdc6c4b..167f24d3794c 100644 --- a/homeassistant/components/monoprice/.translations/de.json +++ b/homeassistant/components/monoprice/.translations/de.json @@ -20,8 +20,7 @@ }, "title": "Stellen Sie eine Verbindung zum Ger\u00e4t her" } - }, - "title": "Monoprice 6-Zonen-Verst\u00e4rker" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Quellen konfigurieren" } } - } + }, + "title": "Monoprice 6-Zonen-Verst\u00e4rker" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/en.json b/homeassistant/components/monoprice/.translations/en.json index 4ff655856f94..8f56813cbb6c 100644 --- a/homeassistant/components/monoprice/.translations/en.json +++ b/homeassistant/components/monoprice/.translations/en.json @@ -20,8 +20,7 @@ }, "title": "Connect to the device" } - }, - "title": "Monoprice 6-Zone Amplifier" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Configure sources" } } - } + }, + "title": "Monoprice 6-Zone Amplifier" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/es.json b/homeassistant/components/monoprice/.translations/es.json index 31a72fc0b9f5..4e2e3eb72c06 100644 --- a/homeassistant/components/monoprice/.translations/es.json +++ b/homeassistant/components/monoprice/.translations/es.json @@ -20,8 +20,7 @@ }, "title": "Conectarse al dispositivo" } - }, - "title": "Amplificador Monoprice de 6 zonas" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Configurar fuentes" } } - } + }, + "title": "Amplificador Monoprice de 6 zonas" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/it.json b/homeassistant/components/monoprice/.translations/it.json index c3c8770d2ad4..e78930a9d3e3 100644 --- a/homeassistant/components/monoprice/.translations/it.json +++ b/homeassistant/components/monoprice/.translations/it.json @@ -20,8 +20,7 @@ }, "title": "Connettersi al dispositivo" } - }, - "title": "Amplificatore a 6 zone Monoprice" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Configurare le sorgenti" } } - } + }, + "title": "Amplificatore a 6 zone Monoprice" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ko.json b/homeassistant/components/monoprice/.translations/ko.json index dd5b44bf0352..50502ce40e81 100644 --- a/homeassistant/components/monoprice/.translations/ko.json +++ b/homeassistant/components/monoprice/.translations/ko.json @@ -20,8 +20,7 @@ }, "title": "\uae30\uae30\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Monoprice 6-Zone \uc570\ud504" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "\uc785\ub825 \uc18c\uc2a4 \uad6c\uc131" } } - } + }, + "title": "Monoprice 6-Zone \uc570\ud504" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/lb.json b/homeassistant/components/monoprice/.translations/lb.json index abb7caf41838..a174aba2a1f3 100644 --- a/homeassistant/components/monoprice/.translations/lb.json +++ b/homeassistant/components/monoprice/.translations/lb.json @@ -20,8 +20,7 @@ }, "title": "Mam Apparat verbannen" } - }, - "title": "Monoprice 6-Zone Verst\u00e4rker" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Quelle konfigur\u00e9ieren" } } - } + }, + "title": "Monoprice 6-Zone Verst\u00e4rker" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/no.json b/homeassistant/components/monoprice/.translations/no.json index f17e48c2a788..f7d53f1449cb 100644 --- a/homeassistant/components/monoprice/.translations/no.json +++ b/homeassistant/components/monoprice/.translations/no.json @@ -20,8 +20,7 @@ }, "title": "Koble til enheten" } - }, - "title": "Monoprice 6-Zone Forsterker" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "Konfigurer kilder" } } - } + }, + "title": "Monoprice 6-Zone Forsterker" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ru.json b/homeassistant/components/monoprice/.translations/ru.json index 25fa4ef7e642..0bb393e33899 100644 --- a/homeassistant/components/monoprice/.translations/ru.json +++ b/homeassistant/components/monoprice/.translations/ru.json @@ -20,8 +20,7 @@ }, "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" } - }, - "title": "Monoprice 6-Zone Amplifier" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432" } } - } + }, + "title": "Monoprice 6-Zone Amplifier" } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/zh-Hant.json b/homeassistant/components/monoprice/.translations/zh-Hant.json index 6f084a9d48bd..bf8c7dfc0c66 100644 --- a/homeassistant/components/monoprice/.translations/zh-Hant.json +++ b/homeassistant/components/monoprice/.translations/zh-Hant.json @@ -20,8 +20,7 @@ }, "title": "\u9023\u7dda\u81f3\u8a2d\u5099" } - }, - "title": "Monoprice 6-Zone \u653e\u5927\u5668" + } }, "options": { "step": { @@ -37,5 +36,6 @@ "title": "\u8a2d\u5b9a\u4f86\u6e90" } } - } + }, + "title": "Monoprice 6-Zone \u653e\u5927\u5668" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/bg.json b/homeassistant/components/mqtt/.translations/bg.json index 4312bdba6ecb..50f54a177066 100644 --- a/homeassistant/components/mqtt/.translations/bg.json +++ b/homeassistant/components/mqtt/.translations/bg.json @@ -25,7 +25,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 Home Assistant \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0436\u0435 \u0441 MQTT \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430\u0442\u0430 {addon}?", "title": "MQTT \u0431\u0440\u043e\u043a\u0435\u0440 \u0447\u0440\u0435\u0437 Hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ca.json b/homeassistant/components/mqtt/.translations/ca.json index b8cce4bd808d..a667f2224f0a 100644 --- a/homeassistant/components/mqtt/.translations/ca.json +++ b/homeassistant/components/mqtt/.translations/ca.json @@ -25,8 +25,7 @@ "description": "Vols configurar Home Assistant perqu\u00e8 es connecti amb el broker MQTT proporcionat pel complement de Hass.io: {addon}?", "title": "Broker MQTT a trav\u00e9s del complement de Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" alliberat", "button_triple_press": "\"{subtype}\" clicat tres vegades" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/cs.json b/homeassistant/components/mqtt/.translations/cs.json index dbda456587eb..e023916c4201 100644 --- a/homeassistant/components/mqtt/.translations/cs.json +++ b/homeassistant/components/mqtt/.translations/cs.json @@ -25,7 +25,7 @@ "description": "Chcete nakonfigurovat slu\u017ebu Home Assistant pro p\u0159ipojen\u00ed k zprost\u0159edkovateli MQTT poskytovan\u00e9mu dopl\u0148kem hass.io {addon}?", "title": "MQTT Broker prost\u0159ednictv\u00edm dopl\u0148ku Hass.io" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/da.json b/homeassistant/components/mqtt/.translations/da.json index e018ab7aa148..8acd3966bcdc 100644 --- a/homeassistant/components/mqtt/.translations/da.json +++ b/homeassistant/components/mqtt/.translations/da.json @@ -25,8 +25,7 @@ "description": "Vil du konfigurere Home Assistant til at oprette forbindelse til MQTT-brokeren, der leveres af hass.io-tilf\u00f8jelsen {addon}?", "title": "MQTT-broker via Hass.io-tilf\u00f8jelse" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" sluppet", "button_triple_press": "\"{subtype}\" tredobbeltklikket" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/de.json b/homeassistant/components/mqtt/.translations/de.json index 87c6a989f521..be7f53ec6373 100644 --- a/homeassistant/components/mqtt/.translations/de.json +++ b/homeassistant/components/mqtt/.translations/de.json @@ -25,8 +25,7 @@ "description": "M\u00f6chtest du Home Assistant so konfigurieren, dass er eine Verbindung mit dem MQTT-Broker herstellt, der vom Hass.io Add-on {addon} bereitgestellt wird?", "title": "MQTT Broker per Hass.io add-on" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" freigegeben", "button_triple_press": "\"{subtype}\" dreifach geklickt" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/en.json b/homeassistant/components/mqtt/.translations/en.json index 55baf3b7f0ee..2eb4e7f90142 100644 --- a/homeassistant/components/mqtt/.translations/en.json +++ b/homeassistant/components/mqtt/.translations/en.json @@ -25,8 +25,7 @@ "description": "Do you want to configure Home Assistant to connect to the MQTT broker provided by the Hass.io add-on {addon}?", "title": "MQTT Broker via Hass.io add-on" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" released", "button_triple_press": "\"{subtype}\" triple clicked" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/es-419.json b/homeassistant/components/mqtt/.translations/es-419.json index 4f54e11a1126..413af8497b25 100644 --- a/homeassistant/components/mqtt/.translations/es-419.json +++ b/homeassistant/components/mqtt/.translations/es-419.json @@ -25,7 +25,7 @@ "description": "\u00bfDesea configurar el Asistente del Hogar para que se conecte al broker MQTT proporcionado por el complemento hass.io {addon}?", "title": "MQTT Broker a trav\u00e9s del complemento Hass.io" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/es.json b/homeassistant/components/mqtt/.translations/es.json index 07de20e7a157..0cb2a37698b4 100644 --- a/homeassistant/components/mqtt/.translations/es.json +++ b/homeassistant/components/mqtt/.translations/es.json @@ -25,8 +25,7 @@ "description": "\u00bfDesea configurar Home Assistant para conectarse al agente MQTT provisto por el complemento hass.io {addon} ?", "title": "MQTT Broker a trav\u00e9s del complemento Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" soltado", "button_triple_press": "\"{subtype}\" triple pulsaci\u00f3n" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/et.json b/homeassistant/components/mqtt/.translations/et.json index 4ba36fd33612..71735d70d9df 100644 --- a/homeassistant/components/mqtt/.translations/et.json +++ b/homeassistant/components/mqtt/.translations/et.json @@ -4,7 +4,7 @@ "broker": { "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/fr.json b/homeassistant/components/mqtt/.translations/fr.json index eaf930b9a2d3..fc8c3aeaafbe 100644 --- a/homeassistant/components/mqtt/.translations/fr.json +++ b/homeassistant/components/mqtt/.translations/fr.json @@ -25,8 +25,7 @@ "description": "Vous voulez configurer Home Assistant pour vous connecter au broker MQTT fourni par l\u2019Add-on hass.io {addon} ?", "title": "MQTT Broker via le module compl\u00e9mentaire Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -42,5 +41,6 @@ "trigger_type": { "button_short_press": "\" {subtype} \" press\u00e9" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/he.json b/homeassistant/components/mqtt/.translations/he.json index e1e2ed497487..1f0b1b4754b8 100644 --- a/homeassistant/components/mqtt/.translations/he.json +++ b/homeassistant/components/mqtt/.translations/he.json @@ -18,7 +18,7 @@ "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.", "title": "MQTT" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/hr.json b/homeassistant/components/mqtt/.translations/hr.json index b3c82fdd8db9..f8e2f981a44f 100644 --- a/homeassistant/components/mqtt/.translations/hr.json +++ b/homeassistant/components/mqtt/.translations/hr.json @@ -9,7 +9,7 @@ }, "title": "MQTT" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/hu.json b/homeassistant/components/mqtt/.translations/hu.json index e45c287f44f5..e4a906e713d9 100644 --- a/homeassistant/components/mqtt/.translations/hu.json +++ b/homeassistant/components/mqtt/.translations/hu.json @@ -25,8 +25,7 @@ "description": "Be szeretn\u00e9d konfigru\u00e1lni, hogy a Home Assistant a(z) {addon} Hass.io add-on \u00e1ltal biztos\u00edtott MQTT br\u00f3kerhez csatlakozzon?", "title": "MQTT Broker a Hass.io b\u0151v\u00edtm\u00e9nyen kereszt\u00fcl" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -39,5 +38,6 @@ "turn_off": "Kikapcsol\u00e1s", "turn_on": "Bekapcsol\u00e1s" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/id.json b/homeassistant/components/mqtt/.translations/id.json index 7a9bf8639e24..d106a400bdce 100644 --- a/homeassistant/components/mqtt/.translations/id.json +++ b/homeassistant/components/mqtt/.translations/id.json @@ -17,7 +17,7 @@ "description": "Harap masukkan informasi koneksi dari broker MQTT Anda.", "title": "MQTT" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/it.json b/homeassistant/components/mqtt/.translations/it.json index 45f7f8dcdb58..a2789f6c1a59 100644 --- a/homeassistant/components/mqtt/.translations/it.json +++ b/homeassistant/components/mqtt/.translations/it.json @@ -25,8 +25,7 @@ "description": "Vuoi configurare Home Assistant per connettersi al broker MQTT fornito dal componente aggiuntivo di Hass.io: {addon}?", "title": "Broker MQTT tramite il componente aggiuntivo di Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" rilasciato", "button_triple_press": "\"{subtype}\" cliccato tre volte" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ko.json b/homeassistant/components/mqtt/.translations/ko.json index 8a0243013d91..7bb24458f7de 100644 --- a/homeassistant/components/mqtt/.translations/ko.json +++ b/homeassistant/components/mqtt/.translations/ko.json @@ -25,8 +25,7 @@ "description": "Hass.io {addon} \uc560\ub4dc\uc628\uc5d0\uc11c \uc81c\uacf5\ub41c MQTT \ube0c\ub85c\ucee4\uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant \ub97c \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Hass.io \uc560\ub4dc\uc628\uc758 MQTT \ube0c\ub85c\ucee4" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" \uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c", "button_triple_press": "\"{subtype}\" \uc774 \uc138 \ubc88 \ub20c\ub9b4 \ub54c" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/lb.json b/homeassistant/components/mqtt/.translations/lb.json index 25814e1359b7..dce5ea993e43 100644 --- a/homeassistant/components/mqtt/.translations/lb.json +++ b/homeassistant/components/mqtt/.translations/lb.json @@ -25,8 +25,7 @@ "description": "W\u00ebllt dir Home Assistant konfigur\u00e9iere fir sech mam MQTT broker ze verbannen dee vum hass.io add-on {addon} bereet gestallt g\u00ebtt?", "title": "MQTT Broker via Hass.io add-on" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" lassgelooss", "button_triple_press": "\"{subtype}\" dr\u00e4imol gedr\u00e9ckt" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/nl.json b/homeassistant/components/mqtt/.translations/nl.json index 247755d8e892..228d30b2c601 100644 --- a/homeassistant/components/mqtt/.translations/nl.json +++ b/homeassistant/components/mqtt/.translations/nl.json @@ -25,7 +25,7 @@ "description": "Wilt u Home Assistant configureren om verbinding te maken met de MQTT-broker die wordt aangeboden door de hass.io add-on {addon} ?", "title": "MQTTT Broker via Hass.io add-on" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/nn.json b/homeassistant/components/mqtt/.translations/nn.json index fb650bc76767..aedbdb99809a 100644 --- a/homeassistant/components/mqtt/.translations/nn.json +++ b/homeassistant/components/mqtt/.translations/nn.json @@ -17,7 +17,7 @@ "description": "Ver vennleg \u00e5 skriv inn tilkoplingsinformasjonen for MQTT-meglaren din", "title": "MQTT" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/no.json b/homeassistant/components/mqtt/.translations/no.json index 8416f74e0867..365a5ec232f1 100644 --- a/homeassistant/components/mqtt/.translations/no.json +++ b/homeassistant/components/mqtt/.translations/no.json @@ -25,8 +25,7 @@ "description": "Vil du konfigurere Home Assistant til \u00e5 koble til en MQTT megler som er levert av Hass.io-tillegget {addon}?", "title": "MQTT megler via Hass.io tillegg" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" utgitt", "button_triple_press": "\"{subtype}\" trippel klikket" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pl.json b/homeassistant/components/mqtt/.translations/pl.json index 86561f89d2b8..5d49f0f43c1f 100644 --- a/homeassistant/components/mqtt/.translations/pl.json +++ b/homeassistant/components/mqtt/.translations/pl.json @@ -25,8 +25,7 @@ "description": "Czy chcesz skonfigurowa\u0107 Home Assistant'a, aby po\u0142\u0105czy\u0142 si\u0119 z po\u015brednikiem MQTT dostarczonym przez dodatek Hass.io {addon}?", "title": "Po\u015brednik MQTT za po\u015brednictwem dodatku Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" zostanie zwolniony", "button_triple_press": "\"{subtype}\" zostanie trzykrotnie naci\u015bni\u0119ty" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pt-BR.json b/homeassistant/components/mqtt/.translations/pt-BR.json index 989526c8e09a..c1011c290422 100644 --- a/homeassistant/components/mqtt/.translations/pt-BR.json +++ b/homeassistant/components/mqtt/.translations/pt-BR.json @@ -25,7 +25,7 @@ "description": "Deseja configurar o Home Assistant para se conectar ao broker MQTT fornecido pelo complemento hass.io {addon}?", "title": "MQTT Broker via add-on Hass.io" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pt.json b/homeassistant/components/mqtt/.translations/pt.json index 21b9cbdf7553..ce1a92a89573 100644 --- a/homeassistant/components/mqtt/.translations/pt.json +++ b/homeassistant/components/mqtt/.translations/pt.json @@ -25,7 +25,7 @@ "description": "Deseja configurar o Home Assistant para se ligar ao broker MQTT fornecido pelo add-on hass.io {addon}?", "title": "MQTT Broker atrav\u00e9s do add-on Hass.io" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ro.json b/homeassistant/components/mqtt/.translations/ro.json index 0bbf39315d9c..f25c034e9825 100644 --- a/homeassistant/components/mqtt/.translations/ro.json +++ b/homeassistant/components/mqtt/.translations/ro.json @@ -25,7 +25,7 @@ "description": "Dori\u021bi s\u0103 configura\u021bi Home Assistant pentru a se conecta la brokerul MQTT furnizat de addon-ul {addon} ?", "title": "MQTT Broker, prin intermediul Hass.io add-on" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ru.json b/homeassistant/components/mqtt/.translations/ru.json index 3559fcc6b2b4..3583df79401b 100644 --- a/homeassistant/components/mqtt/.translations/ru.json +++ b/homeassistant/components/mqtt/.translations/ru.json @@ -25,8 +25,7 @@ "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 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443 MQTT (\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Hass.io \"{addon}\")?", "title": "\u0411\u0440\u043e\u043a\u0435\u0440 MQTT (\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Hass.io)" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430", "button_triple_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/sl.json b/homeassistant/components/mqtt/.translations/sl.json index 86b72665b717..dece8693da93 100644 --- a/homeassistant/components/mqtt/.translations/sl.json +++ b/homeassistant/components/mqtt/.translations/sl.json @@ -25,8 +25,7 @@ "description": "Ali \u017eelite konfigurirati Home Assistant za povezavo s posrednikom MQTT, ki ga ponuja dodatek Hass.io {addon} ?", "title": "MQTT Broker prek dodatka Hass.io" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "Gumb \"{subtype}\" spro\u0161\u010den", "button_triple_press": "Gumb \"{subtype}\" trikrat kliknjen" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/sv.json b/homeassistant/components/mqtt/.translations/sv.json index c54ae6e3e16e..c9c67d1f0fed 100644 --- a/homeassistant/components/mqtt/.translations/sv.json +++ b/homeassistant/components/mqtt/.translations/sv.json @@ -25,7 +25,7 @@ "description": "Vill du konfigurera Home Assistant att ansluta till den MQTT-broker som tillhandah\u00e5lls av Hass.io-till\u00e4gget \"{addon}\"?", "title": "MQTT Broker via Hass.io till\u00e4gg" } - }, - "title": "MQTT" - } + } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/zh-Hans.json b/homeassistant/components/mqtt/.translations/zh-Hans.json index c12004236bdd..581e63a15ef4 100644 --- a/homeassistant/components/mqtt/.translations/zh-Hans.json +++ b/homeassistant/components/mqtt/.translations/zh-Hans.json @@ -25,8 +25,7 @@ "description": "\u662f\u5426\u8981\u914d\u7f6e Home Assistant \u8fde\u63a5\u5230 Hass.io \u52a0\u8f7d\u9879 {addon} \u63d0\u4f9b\u7684 MQTT \u670d\u52a1\u5668\uff1f", "title": "\u6765\u81ea Hass.io \u52a0\u8f7d\u9879\u7684 MQTT \u670d\u52a1\u5668" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" \u91ca\u653e", "button_triple_press": "\"{subtype}\" \u4e09\u8fde\u51fb" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/zh-Hant.json b/homeassistant/components/mqtt/.translations/zh-Hant.json index 3c57e7b6bb04..23b299a93901 100644 --- a/homeassistant/components/mqtt/.translations/zh-Hant.json +++ b/homeassistant/components/mqtt/.translations/zh-Hant.json @@ -25,8 +25,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Home Assistant \u4ee5\u9023\u7dda\u81f3 Hass.io \u9644\u52a0\u6574\u5408 {addon} \u4e4b MQTT broker\uff1f", "title": "\u4f7f\u7528 Hass.io \u9644\u52a0\u7d44\u4ef6 MQTT Broker" } - }, - "title": "MQTT" + } }, "device_automation": { "trigger_subtype": { @@ -49,5 +48,6 @@ "button_short_release": "\"{subtype}\" \u91cb\u653e", "button_triple_press": "\"{subtype}\" \u4e09\u9023\u64ca" } - } + }, + "title": "MQTT" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ca.json b/homeassistant/components/myq/.translations/ca.json index ea8fd9c10de7..db2f7336f197 100644 --- a/homeassistant/components/myq/.translations/ca.json +++ b/homeassistant/components/myq/.translations/ca.json @@ -16,7 +16,7 @@ }, "title": "Connexi\u00f3 amb la passarel\u00b7la de MyQ" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/de.json b/homeassistant/components/myq/.translations/de.json index a345c05311cc..5ebc1747f311 100644 --- a/homeassistant/components/myq/.translations/de.json +++ b/homeassistant/components/myq/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zum MyQ Gateway her" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/en.json b/homeassistant/components/myq/.translations/en.json index c367873cbc97..133c92f78d9c 100644 --- a/homeassistant/components/myq/.translations/en.json +++ b/homeassistant/components/myq/.translations/en.json @@ -16,7 +16,7 @@ }, "title": "Connect to the MyQ Gateway" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/es.json b/homeassistant/components/myq/.translations/es.json index 41db9de34a6d..955b7081c6bd 100644 --- a/homeassistant/components/myq/.translations/es.json +++ b/homeassistant/components/myq/.translations/es.json @@ -16,7 +16,7 @@ }, "title": "Conectar con el Gateway " } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/fr.json b/homeassistant/components/myq/.translations/fr.json index eacf5fc445ad..98e2af15c897 100644 --- a/homeassistant/components/myq/.translations/fr.json +++ b/homeassistant/components/myq/.translations/fr.json @@ -16,7 +16,7 @@ }, "title": "Connectez-vous \u00e0 la passerelle MyQ" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/it.json b/homeassistant/components/myq/.translations/it.json index 4f495e670f14..eb052f4b9c5e 100644 --- a/homeassistant/components/myq/.translations/it.json +++ b/homeassistant/components/myq/.translations/it.json @@ -16,7 +16,7 @@ }, "title": "Connettersi al gateway MyQ" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ko.json b/homeassistant/components/myq/.translations/ko.json index db4ecc9ee4f1..a054daab118d 100644 --- a/homeassistant/components/myq/.translations/ko.json +++ b/homeassistant/components/myq/.translations/ko.json @@ -16,7 +16,7 @@ }, "title": "MyQ \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/lb.json b/homeassistant/components/myq/.translations/lb.json index 8556f60016fd..12d9edeb42a0 100644 --- a/homeassistant/components/myq/.translations/lb.json +++ b/homeassistant/components/myq/.translations/lb.json @@ -16,7 +16,7 @@ }, "title": "Mat NuHeat Router verbannen" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/no.json b/homeassistant/components/myq/.translations/no.json index 4d3ed384d758..90be81c68bc1 100644 --- a/homeassistant/components/myq/.translations/no.json +++ b/homeassistant/components/myq/.translations/no.json @@ -16,7 +16,7 @@ }, "title": "Koble til MyQ Gateway" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ru.json b/homeassistant/components/myq/.translations/ru.json index ec89856496cd..8e5f5cca27d5 100644 --- a/homeassistant/components/myq/.translations/ru.json +++ b/homeassistant/components/myq/.translations/ru.json @@ -16,7 +16,7 @@ }, "title": "MyQ" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/zh-Hant.json b/homeassistant/components/myq/.translations/zh-Hant.json index b7560ed40cec..68a77191b9c3 100644 --- a/homeassistant/components/myq/.translations/zh-Hant.json +++ b/homeassistant/components/myq/.translations/zh-Hant.json @@ -16,7 +16,7 @@ }, "title": "\u9023\u7dda\u81f3 MyQ \u8def\u7531\u5668" } - }, - "title": "MyQ" - } + } + }, + "title": "MyQ" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/bg.json b/homeassistant/components/neato/.translations/bg.json index 14bc601214e0..d4d0f0fba838 100644 --- a/homeassistant/components/neato/.translations/bg.json +++ b/homeassistant/components/neato/.translations/bg.json @@ -21,7 +21,7 @@ "description": "\u0412\u0438\u0436\u0442\u0435 [Neato \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f]({docs_url}).", "title": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 Neato \u0430\u043a\u0430\u0443\u043d\u0442" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ca.json b/homeassistant/components/neato/.translations/ca.json index d30f9e5ad4bd..87a6da7b09e3 100644 --- a/homeassistant/components/neato/.translations/ca.json +++ b/homeassistant/components/neato/.translations/ca.json @@ -21,7 +21,7 @@ "description": "Consulta la [documentaci\u00f3 de Neato]({docs_url}).", "title": "Informaci\u00f3 del compte Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/da.json b/homeassistant/components/neato/.translations/da.json index 736234e92da9..d08f9617975e 100644 --- a/homeassistant/components/neato/.translations/da.json +++ b/homeassistant/components/neato/.translations/da.json @@ -21,7 +21,7 @@ "description": "Se [Neato-dokumentation]({docs_url}).", "title": "Neato-kontooplysninger" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/de.json b/homeassistant/components/neato/.translations/de.json index 2a75d11a9ec0..2177c2814687 100644 --- a/homeassistant/components/neato/.translations/de.json +++ b/homeassistant/components/neato/.translations/de.json @@ -21,7 +21,7 @@ "description": "Siehe [Neato-Dokumentation]({docs_url}).", "title": "Neato-Kontoinformationen" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/en.json b/homeassistant/components/neato/.translations/en.json index 73628c8646e8..27f8eb25795e 100644 --- a/homeassistant/components/neato/.translations/en.json +++ b/homeassistant/components/neato/.translations/en.json @@ -21,7 +21,7 @@ "description": "See [Neato documentation]({docs_url}).", "title": "Neato Account Info" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/es.json b/homeassistant/components/neato/.translations/es.json index 99e7574e4b27..571c9f59d668 100644 --- a/homeassistant/components/neato/.translations/es.json +++ b/homeassistant/components/neato/.translations/es.json @@ -21,7 +21,7 @@ "description": "Ver [documentaci\u00f3n Neato]({docs_url}).", "title": "Informaci\u00f3n de la cuenta de Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/fr.json b/homeassistant/components/neato/.translations/fr.json index 941ed18660ef..5ea3fadf4305 100644 --- a/homeassistant/components/neato/.translations/fr.json +++ b/homeassistant/components/neato/.translations/fr.json @@ -21,7 +21,7 @@ "description": "Voir [Documentation Neato] ( {docs_url} ).", "title": "Informations compte Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/hu.json b/homeassistant/components/neato/.translations/hu.json index 50fa4b5866f2..5130b3f9f648 100644 --- a/homeassistant/components/neato/.translations/hu.json +++ b/homeassistant/components/neato/.translations/hu.json @@ -21,7 +21,7 @@ "description": "L\u00e1sd: [Neato dokument\u00e1ci\u00f3] ( {docs_url} ).", "title": "Neato Fi\u00f3kinform\u00e1ci\u00f3" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/it.json b/homeassistant/components/neato/.translations/it.json index d5615815dc76..140f3dd9e4e2 100644 --- a/homeassistant/components/neato/.translations/it.json +++ b/homeassistant/components/neato/.translations/it.json @@ -21,7 +21,7 @@ "description": "Vedere la [Documentazione di Neato]({docs_url}).", "title": "Informazioni sull'account Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ko.json b/homeassistant/components/neato/.translations/ko.json index 391d0aee1918..559aecbcd845 100644 --- a/homeassistant/components/neato/.translations/ko.json +++ b/homeassistant/components/neato/.translations/ko.json @@ -21,7 +21,7 @@ "description": "[Neato \uc124\uba85\uc11c]({docs_url}) \ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694.", "title": "Neato \uacc4\uc815 \uc815\ubcf4" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/lb.json b/homeassistant/components/neato/.translations/lb.json index 3043ec6ec375..ef6b051dec0a 100644 --- a/homeassistant/components/neato/.translations/lb.json +++ b/homeassistant/components/neato/.translations/lb.json @@ -21,7 +21,7 @@ "description": "Kuckt [Neato Dokumentatioun]({docs_url}).", "title": "Neato Kont Informatiounen" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/lv.json b/homeassistant/components/neato/.translations/lv.json index 26b0bcb7fd2c..37788b1e0563 100644 --- a/homeassistant/components/neato/.translations/lv.json +++ b/homeassistant/components/neato/.translations/lv.json @@ -8,7 +8,7 @@ }, "title": "Neato konta inform\u0101cija" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/nl.json b/homeassistant/components/neato/.translations/nl.json index 4846f0180f1c..0d0188128c31 100644 --- a/homeassistant/components/neato/.translations/nl.json +++ b/homeassistant/components/neato/.translations/nl.json @@ -21,7 +21,7 @@ "description": "Zie [Neato-documentatie] ({docs_url}).", "title": "Neato-account info" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/nn.json b/homeassistant/components/neato/.translations/nn.json index e04e73aef24e..05da161730c6 100644 --- a/homeassistant/components/neato/.translations/nn.json +++ b/homeassistant/components/neato/.translations/nn.json @@ -6,7 +6,7 @@ "username": "Brukarnamn" } } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/no.json b/homeassistant/components/neato/.translations/no.json index dc17289c0e35..f8d743630760 100644 --- a/homeassistant/components/neato/.translations/no.json +++ b/homeassistant/components/neato/.translations/no.json @@ -21,7 +21,7 @@ "description": "Se [Neato dokumentasjon]({docs_url}).", "title": "Neato kontoinformasjon" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/pl.json b/homeassistant/components/neato/.translations/pl.json index e6b55b12c536..199fdcd0c804 100644 --- a/homeassistant/components/neato/.translations/pl.json +++ b/homeassistant/components/neato/.translations/pl.json @@ -21,7 +21,7 @@ "description": "Zapoznaj si\u0119 z [dokumentacj\u0105 Neato]({docs_url}).", "title": "Informacje o koncie Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/pt-BR.json b/homeassistant/components/neato/.translations/pt-BR.json index 8c4c45f9c897..d8a4c4530151 100644 --- a/homeassistant/components/neato/.translations/pt-BR.json +++ b/homeassistant/components/neato/.translations/pt-BR.json @@ -1,5 +1,3 @@ { - "config": { - "title": "" - } + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ru.json b/homeassistant/components/neato/.translations/ru.json index 57989a346fa3..ebc6f80f70da 100644 --- a/homeassistant/components/neato/.translations/ru.json +++ b/homeassistant/components/neato/.translations/ru.json @@ -21,7 +21,7 @@ "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438]({docs_url}) \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.", "title": "Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/sl.json b/homeassistant/components/neato/.translations/sl.json index 7acbb718d176..9eab7eff5ac5 100644 --- a/homeassistant/components/neato/.translations/sl.json +++ b/homeassistant/components/neato/.translations/sl.json @@ -21,7 +21,7 @@ "description": "Glejte [neato dokumentacija] ({docs_url}).", "title": "Podatki o ra\u010dunu Neato" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/sv.json b/homeassistant/components/neato/.translations/sv.json index 64edf9e93cee..9334b5723040 100644 --- a/homeassistant/components/neato/.translations/sv.json +++ b/homeassistant/components/neato/.translations/sv.json @@ -21,7 +21,7 @@ "description": "Se [Neato-dokumentation] ({docs_url}).", "title": "Neato-kontoinfo" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/zh-Hant.json b/homeassistant/components/neato/.translations/zh-Hant.json index 61f49cd5da00..44faede84440 100644 --- a/homeassistant/components/neato/.translations/zh-Hant.json +++ b/homeassistant/components/neato/.translations/zh-Hant.json @@ -21,7 +21,7 @@ "description": "\u8acb\u53c3\u95b1 [Neato \u6587\u4ef6]({docs_url})\u3002", "title": "Neato \u5e33\u865f\u8cc7\u8a0a" } - }, - "title": "Neato" - } + } + }, + "title": "Neato" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/bg.json b/homeassistant/components/nest/.translations/bg.json index 3a4b705e7c98..553662de6104 100644 --- a/homeassistant/components/nest/.translations/bg.json +++ b/homeassistant/components/nest/.translations/bg.json @@ -27,7 +27,7 @@ "description": "\u0417\u0430 \u0434\u0430 \u0441\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0430 \u0441\u0438 \u0432 Nest, [\u043e\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0430 \u0441\u0438]({url}). \n\n \u0421\u043b\u0435\u0434 \u043a\u0430\u0442\u043e \u0441\u0442\u0435 \u043e\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0430\u043d\u0435, \u043a\u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e-\u0434\u043e\u043b\u0443 PIN \u043a\u043e\u0434.", "title": "\u0421\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u0412\u0430\u0448\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b \u0432 Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ca.json b/homeassistant/components/nest/.translations/ca.json index 636568b96d35..4c9a9830bb69 100644 --- a/homeassistant/components/nest/.translations/ca.json +++ b/homeassistant/components/nest/.translations/ca.json @@ -27,7 +27,7 @@ "description": "Per enlla\u00e7ar el teu compte de Nest, [autoritza el vostre compte]({url}). \n\nDespr\u00e9s de l'autoritzaci\u00f3, copia i enganxa el codi pin que es mostra a sota.", "title": "Enlla\u00e7 amb el compte de Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/cs.json b/homeassistant/components/nest/.translations/cs.json index c884226174b0..dc1e3617709a 100644 --- a/homeassistant/components/nest/.translations/cs.json +++ b/homeassistant/components/nest/.translations/cs.json @@ -27,7 +27,7 @@ "description": "Chcete-li propojit \u00fa\u010det Nest, [autorizujte sv\u016fj \u00fa\u010det]({url}). \n\n Po autorizaci zkop\u00edrujte n\u00ed\u017ee uveden\u00fd k\u00f3d PIN.", "title": "Propojit s Nest \u00fa\u010dtem" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/da.json b/homeassistant/components/nest/.translations/da.json index 39b85754c183..9df04019e6cc 100644 --- a/homeassistant/components/nest/.translations/da.json +++ b/homeassistant/components/nest/.translations/da.json @@ -27,7 +27,7 @@ "description": "For at forbinde din Nest-konto, [godkend din konto]({url}). \n\nEfter godkendelse skal du kopiere pin koden nedenfor.", "title": "Forbind Nest-konto" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/de.json b/homeassistant/components/nest/.translations/de.json index 500862039a28..daec97603e63 100644 --- a/homeassistant/components/nest/.translations/de.json +++ b/homeassistant/components/nest/.translations/de.json @@ -27,7 +27,7 @@ "description": "[Autorisiere dein Konto] ( {url} ), um deinen Nest-Account zu verkn\u00fcpfen.\n\n F\u00fcge anschlie\u00dfend den erhaltenen PIN Code hier ein.", "title": "Nest-Konto verkn\u00fcpfen" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/en.json b/homeassistant/components/nest/.translations/en.json index cf448bb35e72..8d0304e883e2 100644 --- a/homeassistant/components/nest/.translations/en.json +++ b/homeassistant/components/nest/.translations/en.json @@ -27,7 +27,7 @@ "description": "To link your Nest account, [authorize your account]({url}).\n\nAfter authorization, copy-paste the provided pin code below.", "title": "Link Nest Account" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/es-419.json b/homeassistant/components/nest/.translations/es-419.json index 60a3eb65ca97..d75bf7e05334 100644 --- a/homeassistant/components/nest/.translations/es-419.json +++ b/homeassistant/components/nest/.translations/es-419.json @@ -24,7 +24,7 @@ "description": "Para vincular su cuenta Nest, [autorice su cuenta] ( {url} ). \n\n Despu\u00e9s de la autorizaci\u00f3n, copie y pegue el c\u00f3digo pin proporcionado a continuaci\u00f3n.", "title": "Enlazar cuenta Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/es.json b/homeassistant/components/nest/.translations/es.json index 8a154101b65f..4f94c67d12b9 100644 --- a/homeassistant/components/nest/.translations/es.json +++ b/homeassistant/components/nest/.translations/es.json @@ -27,7 +27,7 @@ "description": "Para vincular tu cuenta de Nest, [autoriza tu cuenta]({url}).\n\nDespu\u00e9s de la autorizaci\u00f3n, copia y pega el c\u00f3digo pin a continuaci\u00f3n.", "title": "Vincular cuenta de Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/et.json b/homeassistant/components/nest/.translations/et.json index 4e8c0b23bdc4..5297ac3263b0 100644 --- a/homeassistant/components/nest/.translations/et.json +++ b/homeassistant/components/nest/.translations/et.json @@ -9,7 +9,7 @@ "code": "PIN-kood" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/fr.json b/homeassistant/components/nest/.translations/fr.json index 3cd7b003f665..f75e55b102d6 100644 --- a/homeassistant/components/nest/.translations/fr.json +++ b/homeassistant/components/nest/.translations/fr.json @@ -27,7 +27,7 @@ "description": "Pour associer votre compte Nest, [autorisez votre compte]({url}). \n\n Apr\u00e8s autorisation, copiez-collez le code PIN fourni ci-dessous.", "title": "Lier un compte Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/he.json b/homeassistant/components/nest/.translations/he.json index 7f777f42b6da..8d472c811c77 100644 --- a/homeassistant/components/nest/.translations/he.json +++ b/homeassistant/components/nest/.translations/he.json @@ -27,7 +27,7 @@ "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.", "title": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05e9\u05d1\u05d5\u05df Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/hr.json b/homeassistant/components/nest/.translations/hr.json index b96a358f2f03..5ab9a2b060a5 100644 --- a/homeassistant/components/nest/.translations/hr.json +++ b/homeassistant/components/nest/.translations/hr.json @@ -15,7 +15,7 @@ "code": "PIN kod" } } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/hu.json b/homeassistant/components/nest/.translations/hu.json index dc26862f5ea3..fffe08d20ced 100644 --- a/homeassistant/components/nest/.translations/hu.json +++ b/homeassistant/components/nest/.translations/hu.json @@ -26,7 +26,7 @@ "description": "A Nest-fi\u00f3k \u00f6sszekapcsol\u00e1s\u00e1hoz [enged\u00e9lyezze fi\u00f3kj\u00e1t] ( {url} ). \n\n Az enged\u00e9lyez\u00e9s ut\u00e1n m\u00e1solja be az al\u00e1bbi PIN k\u00f3dot.", "title": "Nest fi\u00f3k \u00f6sszekapcsol\u00e1sa" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/id.json b/homeassistant/components/nest/.translations/id.json index 58f86f5474ee..7b244a681ea3 100644 --- a/homeassistant/components/nest/.translations/id.json +++ b/homeassistant/components/nest/.translations/id.json @@ -27,7 +27,7 @@ "description": "Untuk menautkan akun Nest Anda, [beri kuasa akun Anda] ( {url} ). \n\n Setelah otorisasi, salin-tempel kode pin yang disediakan di bawah ini.", "title": "Hubungkan Akun Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/it.json b/homeassistant/components/nest/.translations/it.json index b55c6d00683c..a1ac11c17fcd 100644 --- a/homeassistant/components/nest/.translations/it.json +++ b/homeassistant/components/nest/.translations/it.json @@ -27,7 +27,7 @@ "description": "Per collegare l'account Nido, [autorizzare l'account]({url}).\n\nDopo l'autorizzazione, copia-incolla il codice PIN fornito di seguito.", "title": "Collega un account Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ja.json b/homeassistant/components/nest/.translations/ja.json index 4335b7d16747..2efbf3766488 100644 --- a/homeassistant/components/nest/.translations/ja.json +++ b/homeassistant/components/nest/.translations/ja.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Nest" - } + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ko.json b/homeassistant/components/nest/.translations/ko.json index 42170910d14a..33336623be33 100644 --- a/homeassistant/components/nest/.translations/ko.json +++ b/homeassistant/components/nest/.translations/ko.json @@ -27,7 +27,7 @@ "description": "Nest \uacc4\uc815\uc744 \uc5f0\uacb0\ud558\ub824\uba74, [\uacc4\uc815 \uc5f0\uacb0 \uc2b9\uc778]({url}) \uc744 \ud574\uc8fc\uc138\uc694.\n\n\uc2b9\uc778 \ud6c4, \uc544\ub798\uc758 \ud540 \ucf54\ub4dc\ub97c \ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694.", "title": "Nest \uacc4\uc815 \uc5f0\uacb0" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/lb.json b/homeassistant/components/nest/.translations/lb.json index 9fdf442c5ff2..b8a8fc3e3481 100644 --- a/homeassistant/components/nest/.translations/lb.json +++ b/homeassistant/components/nest/.translations/lb.json @@ -27,7 +27,7 @@ "description": "Fir den Nest Kont ze verbannen, [autoris\u00e9iert \u00e4ren Kont]({url}).\nKop\u00e9iert no der Autorisatioun den Pin hei \u00ebnnendr\u00ebnner", "title": "Nest Kont verbannen" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/nl.json b/homeassistant/components/nest/.translations/nl.json index 756eb07189a2..9cdea36d2082 100644 --- a/homeassistant/components/nest/.translations/nl.json +++ b/homeassistant/components/nest/.translations/nl.json @@ -27,7 +27,7 @@ "description": "Als je je Nest-account wilt koppelen, [autoriseer je account] ( {url} ). \n\nNa autorisatie, kopieer en plak de voorziene pincode hieronder.", "title": "Koppel Nest-account" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/nn.json b/homeassistant/components/nest/.translations/nn.json index be3915c464f3..4af3f8dcc700 100644 --- a/homeassistant/components/nest/.translations/nn.json +++ b/homeassistant/components/nest/.translations/nn.json @@ -27,7 +27,7 @@ "description": "For \u00e5 linke Nestkontoen din, [autoriser kontoen din]{url}.\nEtter autentiseringa, kopier-lim inn koda du fekk under her.", "title": "Link Nestkonto" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/no.json b/homeassistant/components/nest/.translations/no.json index 9f19d22d939a..b60e3c4e9553 100644 --- a/homeassistant/components/nest/.translations/no.json +++ b/homeassistant/components/nest/.translations/no.json @@ -27,7 +27,7 @@ "description": "For \u00e5 koble din Nest-konto, [autoriser kontoen din]({url}). \n\n Etter godkjenning, kopier og lim inn den oppgitte PIN koden nedenfor.", "title": "Koble til Nest konto" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pl.json b/homeassistant/components/nest/.translations/pl.json index d40c872e3006..19382fadb47f 100644 --- a/homeassistant/components/nest/.translations/pl.json +++ b/homeassistant/components/nest/.translations/pl.json @@ -27,7 +27,7 @@ "description": "Aby po\u0142\u0105czy\u0107 z kontem Nest, [wykonaj autoryzacj\u0119]({url}). \n\n Po autoryzacji skopiuj i wklej podany kod PIN poni\u017cej.", "title": "Po\u0142\u0105cz z kontem Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt-BR.json b/homeassistant/components/nest/.translations/pt-BR.json index 3f33dd6c67a5..c1d04ccebe57 100644 --- a/homeassistant/components/nest/.translations/pt-BR.json +++ b/homeassistant/components/nest/.translations/pt-BR.json @@ -27,7 +27,7 @@ "description": "Para vincular sua conta do Nest, [autorize sua conta] ( {url} ). \n\n Ap\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo PIN fornecido abaixo.", "title": "Link da conta Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt.json b/homeassistant/components/nest/.translations/pt.json index 5ea970d9fb3d..ea811dac9985 100644 --- a/homeassistant/components/nest/.translations/pt.json +++ b/homeassistant/components/nest/.translations/pt.json @@ -27,7 +27,7 @@ "description": "Para associar \u00e0 sua conta Nest, [autorizar sua conta]({url}).\n\nAp\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo pin fornecido abaixo.", "title": "Associar conta Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ro.json b/homeassistant/components/nest/.translations/ro.json index f315cf549fb5..2ec7dfa76708 100644 --- a/homeassistant/components/nest/.translations/ro.json +++ b/homeassistant/components/nest/.translations/ro.json @@ -7,7 +7,7 @@ }, "title": "Leg\u0103tur\u0103 cont Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ru.json b/homeassistant/components/nest/.translations/ru.json index 9abdafafa936..41072b296604 100644 --- a/homeassistant/components/nest/.translations/ru.json +++ b/homeassistant/components/nest/.translations/ru.json @@ -27,7 +27,7 @@ "description": "[\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0439\u0442\u0435\u0441\u044c]({url}), \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Nest. \n\n \u041f\u043e\u0441\u043b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u043f\u0438\u043d-\u043a\u043e\u0434.", "title": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/sl.json b/homeassistant/components/nest/.translations/sl.json index d038ed4157fa..bbe9a31a7cca 100644 --- a/homeassistant/components/nest/.translations/sl.json +++ b/homeassistant/components/nest/.translations/sl.json @@ -27,7 +27,7 @@ "description": "\u010ce \u017eelite povezati svoj ra\u010dun Nest, [pooblastite svoj ra\u010dun]({url}). \n\n Po odobritvi kopirajte in prilepite podano kodo PIN.", "title": "Pove\u017eite Nest ra\u010dun" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/sv.json b/homeassistant/components/nest/.translations/sv.json index 721f891219da..ba5d2fbf0074 100644 --- a/homeassistant/components/nest/.translations/sv.json +++ b/homeassistant/components/nest/.translations/sv.json @@ -27,7 +27,7 @@ "description": "F\u00f6r att l\u00e4nka ditt Nest-konto, [autentisiera ditt konto]({url}). \n\nEfter autentisiering, klipp och klistra in den angivna pin-koden nedan.", "title": "L\u00e4nka Nest-konto" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/th.json b/homeassistant/components/nest/.translations/th.json index 82ec7f168faf..8dc744fad09c 100644 --- a/homeassistant/components/nest/.translations/th.json +++ b/homeassistant/components/nest/.translations/th.json @@ -9,7 +9,7 @@ "code": "Pin code" } } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/vi.json b/homeassistant/components/nest/.translations/vi.json index 996c6c68eae9..c317e5bb464c 100644 --- a/homeassistant/components/nest/.translations/vi.json +++ b/homeassistant/components/nest/.translations/vi.json @@ -16,7 +16,7 @@ "link": { "title": "Li\u00ean k\u1ebft t\u00e0i kho\u1ea3n Nest" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/zh-Hans.json b/homeassistant/components/nest/.translations/zh-Hans.json index 0825fdfdc799..389a306a5384 100644 --- a/homeassistant/components/nest/.translations/zh-Hans.json +++ b/homeassistant/components/nest/.translations/zh-Hans.json @@ -27,7 +27,7 @@ "description": "\u8981\u5173\u8054 Nest \u8d26\u6237\uff0c\u8bf7[\u6388\u6743\u8d26\u6237]({url})\u3002\n\n\u5b8c\u6210\u6388\u6743\u540e\uff0c\u5728\u4e0b\u9762\u7c98\u8d34\u83b7\u5f97\u7684 PIN \u7801\u3002", "title": "\u5173\u8054 Nest \u8d26\u6237" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/zh-Hant.json b/homeassistant/components/nest/.translations/zh-Hant.json index c477557e7ba0..ec8790d26f4d 100644 --- a/homeassistant/components/nest/.translations/zh-Hant.json +++ b/homeassistant/components/nest/.translations/zh-Hant.json @@ -27,7 +27,7 @@ "description": "\u6b32\u9023\u7d50 Nest \u5e33\u865f\uff0c[\u8a8d\u8b49\u5e33\u865f]({url}).\n\n\u65bc\u8a8d\u8b49\u5f8c\uff0c\u8907\u88fd\u4e26\u8cbc\u4e0a\u4e0b\u65b9\u7684\u8a8d\u8b49\u78bc\u3002", "title": "\u9023\u7d50 Nest \u5e33\u865f" } - }, - "title": "Nest" - } + } + }, + "title": "Nest" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ca.json b/homeassistant/components/netatmo/.translations/ca.json index 63de8699f356..eb361bcdb29e 100644 --- a/homeassistant/components/netatmo/.translations/ca.json +++ b/homeassistant/components/netatmo/.translations/ca.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/da.json b/homeassistant/components/netatmo/.translations/da.json index 8fec28908818..82400e48f8b8 100644 --- a/homeassistant/components/netatmo/.translations/da.json +++ b/homeassistant/components/netatmo/.translations/da.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e6lg godkendelsesmetode" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/de.json b/homeassistant/components/netatmo/.translations/de.json index 57e717429c48..d962d259a1c0 100644 --- a/homeassistant/components/netatmo/.translations/de.json +++ b/homeassistant/components/netatmo/.translations/de.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "W\u00e4hle die Authentifizierungsmethode" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/en.json b/homeassistant/components/netatmo/.translations/en.json index 9d69a3ece50f..62f2e05e1580 100644 --- a/homeassistant/components/netatmo/.translations/en.json +++ b/homeassistant/components/netatmo/.translations/en.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Pick Authentication Method" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/es.json b/homeassistant/components/netatmo/.translations/es.json index 7e39574d4923..0804fb59dfb2 100644 --- a/homeassistant/components/netatmo/.translations/es.json +++ b/homeassistant/components/netatmo/.translations/es.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/fr.json b/homeassistant/components/netatmo/.translations/fr.json index 23f0bca1087c..d7c7da341e27 100644 --- a/homeassistant/components/netatmo/.translations/fr.json +++ b/homeassistant/components/netatmo/.translations/fr.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "S\u00e9lectionner une m\u00e9thode d'authentification" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/hu.json b/homeassistant/components/netatmo/.translations/hu.json index 9994e527f012..b621bedfd176 100644 --- a/homeassistant/components/netatmo/.translations/hu.json +++ b/homeassistant/components/netatmo/.translations/hu.json @@ -11,7 +11,7 @@ "pick_implementation": { "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/it.json b/homeassistant/components/netatmo/.translations/it.json index f3e3dafcba42..cde5e827b164 100644 --- a/homeassistant/components/netatmo/.translations/it.json +++ b/homeassistant/components/netatmo/.translations/it.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Scegli il metodo di autenticazione" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ko.json b/homeassistant/components/netatmo/.translations/ko.json index e360c16d69c7..39b350e0e208 100644 --- a/homeassistant/components/netatmo/.translations/ko.json +++ b/homeassistant/components/netatmo/.translations/ko.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/lb.json b/homeassistant/components/netatmo/.translations/lb.json index b7e3a18bdaed..ecec03f6ed49 100644 --- a/homeassistant/components/netatmo/.translations/lb.json +++ b/homeassistant/components/netatmo/.translations/lb.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wielt Authentifikatiouns Method aus" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/nl.json b/homeassistant/components/netatmo/.translations/nl.json index 5f5fe3751175..b3218f473d95 100644 --- a/homeassistant/components/netatmo/.translations/nl.json +++ b/homeassistant/components/netatmo/.translations/nl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Kies een authenticatie methode" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/no.json b/homeassistant/components/netatmo/.translations/no.json index 98e5a7eb352a..17686771cd55 100644 --- a/homeassistant/components/netatmo/.translations/no.json +++ b/homeassistant/components/netatmo/.translations/no.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Velg autentiseringsmetode" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/pl.json b/homeassistant/components/netatmo/.translations/pl.json index 35da44a96804..80f287cabbf1 100644 --- a/homeassistant/components/netatmo/.translations/pl.json +++ b/homeassistant/components/netatmo/.translations/pl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wybierz metod\u0119 uwierzytelniania" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ru.json b/homeassistant/components/netatmo/.translations/ru.json index c34fb331ceb2..20860d104ed1 100644 --- a/homeassistant/components/netatmo/.translations/ru.json +++ b/homeassistant/components/netatmo/.translations/ru.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/sl.json b/homeassistant/components/netatmo/.translations/sl.json index 5288c84e44bf..9bef8c10e384 100644 --- a/homeassistant/components/netatmo/.translations/sl.json +++ b/homeassistant/components/netatmo/.translations/sl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Izberite na\u010din preverjanja pristnosti" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/sv.json b/homeassistant/components/netatmo/.translations/sv.json index 2047bce5b172..a0199c3819de 100644 --- a/homeassistant/components/netatmo/.translations/sv.json +++ b/homeassistant/components/netatmo/.translations/sv.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e4lj autentiseringsmetod" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/zh-Hant.json b/homeassistant/components/netatmo/.translations/zh-Hant.json index 24124e6fb353..d2fbb03c9199 100644 --- a/homeassistant/components/netatmo/.translations/zh-Hant.json +++ b/homeassistant/components/netatmo/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } - }, - "title": "Netatmo" - } + } + }, + "title": "Netatmo" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ca.json b/homeassistant/components/nexia/.translations/ca.json index 005edb82b599..66eebbf7c796 100644 --- a/homeassistant/components/nexia/.translations/ca.json +++ b/homeassistant/components/nexia/.translations/ca.json @@ -16,7 +16,7 @@ }, "title": "Connexi\u00f3 amb mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/de.json b/homeassistant/components/nexia/.translations/de.json index bda92cc7fe35..0aeca50a0ab1 100644 --- a/homeassistant/components/nexia/.translations/de.json +++ b/homeassistant/components/nexia/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zu mynexia.com her" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/en.json b/homeassistant/components/nexia/.translations/en.json index c6dcaed91f80..c2871984d976 100644 --- a/homeassistant/components/nexia/.translations/en.json +++ b/homeassistant/components/nexia/.translations/en.json @@ -16,7 +16,7 @@ }, "title": "Connect to mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/es.json b/homeassistant/components/nexia/.translations/es.json index 836c6b514c25..1aea820987ce 100644 --- a/homeassistant/components/nexia/.translations/es.json +++ b/homeassistant/components/nexia/.translations/es.json @@ -16,7 +16,7 @@ }, "title": "Conectar con mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/fr.json b/homeassistant/components/nexia/.translations/fr.json index 653cc0b3f049..20acbb6ab7c7 100644 --- a/homeassistant/components/nexia/.translations/fr.json +++ b/homeassistant/components/nexia/.translations/fr.json @@ -16,7 +16,7 @@ }, "title": "Se connecter \u00e0 mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/it.json b/homeassistant/components/nexia/.translations/it.json index 5fdd9a6095ef..767e73d3ed7a 100644 --- a/homeassistant/components/nexia/.translations/it.json +++ b/homeassistant/components/nexia/.translations/it.json @@ -16,7 +16,7 @@ }, "title": "Connettersi a mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ko.json b/homeassistant/components/nexia/.translations/ko.json index daabbe77ea7d..90f01a0d8215 100644 --- a/homeassistant/components/nexia/.translations/ko.json +++ b/homeassistant/components/nexia/.translations/ko.json @@ -16,7 +16,7 @@ }, "title": "mynexia.com \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/lb.json b/homeassistant/components/nexia/.translations/lb.json index ae80d218786e..c6f600ef5da3 100644 --- a/homeassistant/components/nexia/.translations/lb.json +++ b/homeassistant/components/nexia/.translations/lb.json @@ -16,7 +16,7 @@ }, "title": "Mat mynexia.com verbannen" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/no.json b/homeassistant/components/nexia/.translations/no.json index 84dbcf5b5034..8860d0d0904f 100644 --- a/homeassistant/components/nexia/.translations/no.json +++ b/homeassistant/components/nexia/.translations/no.json @@ -16,7 +16,7 @@ }, "title": "Koble til mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ru.json b/homeassistant/components/nexia/.translations/ru.json index a294518a777c..918a3b849d9b 100644 --- a/homeassistant/components/nexia/.translations/ru.json +++ b/homeassistant/components/nexia/.translations/ru.json @@ -16,7 +16,7 @@ }, "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/zh-Hant.json b/homeassistant/components/nexia/.translations/zh-Hant.json index 7a768c1ed216..3b83ce40836b 100644 --- a/homeassistant/components/nexia/.translations/zh-Hant.json +++ b/homeassistant/components/nexia/.translations/zh-Hant.json @@ -16,7 +16,7 @@ }, "title": "\u9023\u7dda\u81f3 mynexia.com" } - }, - "title": "Nexia" - } + } + }, + "title": "Nexia" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/bg.json b/homeassistant/components/notion/.translations/bg.json index 1c78180e2a85..4df9b3ef11cb 100644 --- a/homeassistant/components/notion/.translations/bg.json +++ b/homeassistant/components/notion/.translations/bg.json @@ -12,7 +12,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ca.json b/homeassistant/components/notion/.translations/ca.json index b6e73a5e209c..04b3a1ed0835 100644 --- a/homeassistant/components/notion/.translations/ca.json +++ b/homeassistant/components/notion/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Introdueix la teva informaci\u00f3" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/cy.json b/homeassistant/components/notion/.translations/cy.json index 63b1c613505a..755ce131b2d5 100644 --- a/homeassistant/components/notion/.translations/cy.json +++ b/homeassistant/components/notion/.translations/cy.json @@ -8,7 +8,7 @@ }, "title": "Llenwch eich gwybodaeth" } - }, - "title": "Syniad" - } + } + }, + "title": "Syniad" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/da.json b/homeassistant/components/notion/.translations/da.json index 6b139fa6e668..ed75e5b1f042 100644 --- a/homeassistant/components/notion/.translations/da.json +++ b/homeassistant/components/notion/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Udfyld dine oplysninger" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/de.json b/homeassistant/components/notion/.translations/de.json index 1ccd8c86bdc7..359f3250f603 100644 --- a/homeassistant/components/notion/.translations/de.json +++ b/homeassistant/components/notion/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Informationen eingeben" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/en.json b/homeassistant/components/notion/.translations/en.json index b729b368c37e..96dddf9ba316 100644 --- a/homeassistant/components/notion/.translations/en.json +++ b/homeassistant/components/notion/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Fill in your information" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/es-419.json b/homeassistant/components/notion/.translations/es-419.json index ad2f19b0668c..36fee5bb3665 100644 --- a/homeassistant/components/notion/.translations/es-419.json +++ b/homeassistant/components/notion/.translations/es-419.json @@ -12,7 +12,7 @@ }, "title": "Complete su informaci\u00f3n" } - }, - "title": "Noci\u00f3n" - } + } + }, + "title": "Noci\u00f3n" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/es.json b/homeassistant/components/notion/.translations/es.json index 8d0594629f7a..7c5eab0fa5f2 100644 --- a/homeassistant/components/notion/.translations/es.json +++ b/homeassistant/components/notion/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "Noci\u00f3n" - } + } + }, + "title": "Noci\u00f3n" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/fr.json b/homeassistant/components/notion/.translations/fr.json index ae24ba704196..8a841ce0575d 100644 --- a/homeassistant/components/notion/.translations/fr.json +++ b/homeassistant/components/notion/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "Veuillez saisir vos informations" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/hr.json b/homeassistant/components/notion/.translations/hr.json index 93ab9a4bf512..8b502fd37eed 100644 --- a/homeassistant/components/notion/.translations/hr.json +++ b/homeassistant/components/notion/.translations/hr.json @@ -12,7 +12,7 @@ }, "title": "Ispunite svoje podatke" } - }, - "title": "Pojam" - } + } + }, + "title": "Pojam" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/it.json b/homeassistant/components/notion/.translations/it.json index e33b50f19389..dbd1c8fd7dbf 100644 --- a/homeassistant/components/notion/.translations/it.json +++ b/homeassistant/components/notion/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Inserisci le tue informazioni" } - }, - "title": "Nozione" - } + } + }, + "title": "Nozione" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ko.json b/homeassistant/components/notion/.translations/ko.json index c848684ab597..da4daa0fa579 100644 --- a/homeassistant/components/notion/.translations/ko.json +++ b/homeassistant/components/notion/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/lb.json b/homeassistant/components/notion/.translations/lb.json index b5d2eabd5071..bfa3ad3834ae 100644 --- a/homeassistant/components/notion/.translations/lb.json +++ b/homeassistant/components/notion/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/nl.json b/homeassistant/components/notion/.translations/nl.json index f45ea87f972b..70f155cebf3c 100644 --- a/homeassistant/components/notion/.translations/nl.json +++ b/homeassistant/components/notion/.translations/nl.json @@ -12,7 +12,7 @@ }, "title": "Vul uw gegevens informatie" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/no.json b/homeassistant/components/notion/.translations/no.json index 302ef3f2b395..d9f369a6406b 100644 --- a/homeassistant/components/notion/.translations/no.json +++ b/homeassistant/components/notion/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/pl.json b/homeassistant/components/notion/.translations/pl.json index fb9ffaad9c02..3a946a222999 100644 --- a/homeassistant/components/notion/.translations/pl.json +++ b/homeassistant/components/notion/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Wprowad\u017a dane" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/pt-BR.json b/homeassistant/components/notion/.translations/pt-BR.json index 5f790c02a40b..ee74ca275014 100644 --- a/homeassistant/components/notion/.translations/pt-BR.json +++ b/homeassistant/components/notion/.translations/pt-BR.json @@ -12,7 +12,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es" } - }, - "title": "No\u00e7\u00e3o" - } + } + }, + "title": "No\u00e7\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ru.json b/homeassistant/components/notion/.translations/ru.json index 41627cc6ab04..04941b762709 100644 --- a/homeassistant/components/notion/.translations/ru.json +++ b/homeassistant/components/notion/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "Notion" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/sl.json b/homeassistant/components/notion/.translations/sl.json index 5abe6164038e..13d8dc69fd5c 100644 --- a/homeassistant/components/notion/.translations/sl.json +++ b/homeassistant/components/notion/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Izpolnite svoje podatke" } - }, - "title": "Pojem" - } + } + }, + "title": "Pojem" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/sv.json b/homeassistant/components/notion/.translations/sv.json index 896481802466..705bea205c60 100644 --- a/homeassistant/components/notion/.translations/sv.json +++ b/homeassistant/components/notion/.translations/sv.json @@ -12,7 +12,7 @@ }, "title": "Fyll i dina uppgifter" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/zh-Hans.json b/homeassistant/components/notion/.translations/zh-Hans.json index 0e61657f6154..6d73fbba8dd9 100644 --- a/homeassistant/components/notion/.translations/zh-Hans.json +++ b/homeassistant/components/notion/.translations/zh-Hans.json @@ -12,7 +12,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } - }, - "title": "\u6982\u5ff5" - } + } + }, + "title": "\u6982\u5ff5" } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/zh-Hant.json b/homeassistant/components/notion/.translations/zh-Hant.json index 2767c504b78e..b346e92c2170 100644 --- a/homeassistant/components/notion/.translations/zh-Hant.json +++ b/homeassistant/components/notion/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u586b\u5beb\u8cc7\u8a0a" } - }, - "title": "Notion" - } + } + }, + "title": "Notion" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ca.json b/homeassistant/components/nuheat/.translations/ca.json index 6c2f739b94c2..75cf013e696b 100644 --- a/homeassistant/components/nuheat/.translations/ca.json +++ b/homeassistant/components/nuheat/.translations/ca.json @@ -19,7 +19,7 @@ "description": "Has d\u2019obtenir el n\u00famero de s\u00e8rie o identificador del teu term\u00f2stat entrant a https://MyNuHeat.com i seleccionant el teu term\u00f2stat.", "title": "Connexi\u00f3 amb NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/de.json b/homeassistant/components/nuheat/.translations/de.json index adbc63b81579..8b56d89b74d6 100644 --- a/homeassistant/components/nuheat/.translations/de.json +++ b/homeassistant/components/nuheat/.translations/de.json @@ -19,7 +19,7 @@ "description": "Sie m\u00fcssen die numerische Seriennummer oder ID Ihres Thermostats erhalten, indem Sie sich bei https://MyNuHeat.com anmelden und Ihre Thermostate ausw\u00e4hlen.", "title": "Stellen Sie eine Verbindung zu NuHeat her" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/en.json b/homeassistant/components/nuheat/.translations/en.json index 4b82319be629..c89411168dd6 100644 --- a/homeassistant/components/nuheat/.translations/en.json +++ b/homeassistant/components/nuheat/.translations/en.json @@ -19,7 +19,7 @@ "description": "You will need to obtain your thermostat\u2019s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", "title": "Connect to the NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/es.json b/homeassistant/components/nuheat/.translations/es.json index f0ce00ca7ecf..d3ec784e3f9f 100644 --- a/homeassistant/components/nuheat/.translations/es.json +++ b/homeassistant/components/nuheat/.translations/es.json @@ -19,7 +19,7 @@ "description": "Necesitas obtener el n\u00famero de serie o el ID de tu termostato iniciando sesi\u00f3n en https://MyNuHeat.com y seleccionando tu(s) termostato(s).", "title": "ConectarNuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/fr.json b/homeassistant/components/nuheat/.translations/fr.json index 21012de756b0..6ec527da6c6f 100644 --- a/homeassistant/components/nuheat/.translations/fr.json +++ b/homeassistant/components/nuheat/.translations/fr.json @@ -18,7 +18,7 @@ }, "title": "Connectez-vous au NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/it.json b/homeassistant/components/nuheat/.translations/it.json index a98f24a9651b..f7cfce0fd61a 100644 --- a/homeassistant/components/nuheat/.translations/it.json +++ b/homeassistant/components/nuheat/.translations/it.json @@ -19,7 +19,7 @@ "description": "\u00c8 necessario ottenere il numero di serie o l'ID numerico del termostato accedendo a https://MyNuHeat.com e selezionando il termostato.", "title": "Connettersi al NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ko.json b/homeassistant/components/nuheat/.translations/ko.json index 01db58359078..6b02df2045ad 100644 --- a/homeassistant/components/nuheat/.translations/ko.json +++ b/homeassistant/components/nuheat/.translations/ko.json @@ -19,7 +19,7 @@ "description": "https://MyNuHeat.com \uc5d0 \ub85c\uadf8\uc778\ud558\uace0 \uc628\ub3c4 \uc870\uc808\uae30\ub97c \uc120\ud0dd\ud558\uc5ec \uc628\ub3c4 \uc870\uc808\uae30\uc758 \uc2dc\ub9ac\uc5bc \ubc88\ud638 \ub610\ub294 \ub610\ub294 ID \ub97c \uc5bb\uc5b4\uc57c \ud569\ub2c8\ub2e4.", "title": "NuHeat \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/lb.json b/homeassistant/components/nuheat/.translations/lb.json index fd2b3114d4d5..93194bdcab30 100644 --- a/homeassistant/components/nuheat/.translations/lb.json +++ b/homeassistant/components/nuheat/.translations/lb.json @@ -19,7 +19,7 @@ "description": "Du brauchs d'Seriennummer oder ID vum Thermostat, andeems Du dech op https://MyNuHeat.com umells an den Thermostat auswielt.", "title": "Mat NuHeat verbannen" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/no.json b/homeassistant/components/nuheat/.translations/no.json index 74c0b8a8f542..a3f4861ea892 100644 --- a/homeassistant/components/nuheat/.translations/no.json +++ b/homeassistant/components/nuheat/.translations/no.json @@ -19,7 +19,7 @@ "description": "Du m\u00e5 skaffe termostats numeriske serienummer eller ID ved \u00e5 logge inn p\u00e5 https://MyNuHeat.com og velge termostaten (e).", "title": "Koble til NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ru.json b/homeassistant/components/nuheat/.translations/ru.json index e7ba18d393a6..d2e8c68d85fe 100644 --- a/homeassistant/components/nuheat/.translations/ru.json +++ b/homeassistant/components/nuheat/.translations/ru.json @@ -19,7 +19,7 @@ "description": "\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0438\u043b\u0438 ID \u0412\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430, \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 https://MyNuHeat.com.", "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/zh-Hant.json b/homeassistant/components/nuheat/.translations/zh-Hant.json index e228abeecd94..700a062b8c3d 100644 --- a/homeassistant/components/nuheat/.translations/zh-Hant.json +++ b/homeassistant/components/nuheat/.translations/zh-Hant.json @@ -19,7 +19,7 @@ "description": "\u9700\u8981\u67e5\u770b\u60a8\u7684\u6eab\u63a7\u5668\u5e8f\u865f\u6216\u767b\u5165 https://MyNuHeat.com \u4e4b ID \u4e26\u9078\u64c7\u60a8\u7684\u6eab\u63a7\u5668\u3002", "title": "\u9023\u7dda\u81f3 NuHeat" } - }, - "title": "NuHeat" - } + } + }, + "title": "NuHeat" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index f6ef9e703af5..0830995a6a83 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -34,8 +34,7 @@ "description": "Si m\u00faltiples SAI (UPS) connectats al servidor NUT, introdueix el nom UPS per consultar al camp 'Alies'.", "title": "No s'ha pogut connectar amb el servidor NUT" } - }, - "title": "Eines de xarxa UPS (NUT)" + } }, "options": { "step": { @@ -47,5 +46,6 @@ "description": "Selecciona els recursos del sensor" } } - } + }, + "title": "Eines de xarxa UPS (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index a80fc19406e4..7e73d5873fcb 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -34,8 +34,7 @@ "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", "title": "Connect to the NUT server" } - }, - "title": "Network UPS Tools (NUT)" + } }, "options": { "step": { @@ -47,5 +46,6 @@ "description": "Choose Sensor Resources." } } - } + }, + "title": "Network UPS Tools (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/es.json b/homeassistant/components/nut/.translations/es.json index 4024d1d0cef9..536a3a137c6d 100644 --- a/homeassistant/components/nut/.translations/es.json +++ b/homeassistant/components/nut/.translations/es.json @@ -34,8 +34,7 @@ "description": "Si hay varios UPS conectados al servidor NUT, introduzca el nombre UPS a buscar en el campo 'Alias'.", "title": "Conectar con el servidor NUT" } - }, - "title": "Herramientas de UPS de red (NUT)" + } }, "options": { "step": { @@ -47,5 +46,6 @@ "description": "Elegir Recursos del Sensor" } } - } + }, + "title": "Herramientas de UPS de red (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ko.json b/homeassistant/components/nut/.translations/ko.json index f9fa46b6667b..60a6a2695754 100644 --- a/homeassistant/components/nut/.translations/ko.json +++ b/homeassistant/components/nut/.translations/ko.json @@ -21,8 +21,7 @@ "description": "NUT \uc11c\ubc84\uc5d0 UPS \uac00 \uc5ec\ub7ec \uac1c \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 '\ubcc4\uba85' \uc785\ub825\ub780\uc5d0 \uc870\ud68c\ud560 UPS \uc774\ub984\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "NUT \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "\ub124\ud2b8\uc6cc\ud06c UPS \ub3c4\uad6c (NUT)" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "\uc13c\uc11c \ub9ac\uc18c\uc2a4 \uc120\ud0dd" } } - } + }, + "title": "\ub124\ud2b8\uc6cc\ud06c UPS \ub3c4\uad6c (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/lb.json b/homeassistant/components/nut/.translations/lb.json index 7e9ec8ddd97f..a84b260dbf3c 100644 --- a/homeassistant/components/nut/.translations/lb.json +++ b/homeassistant/components/nut/.translations/lb.json @@ -21,8 +21,7 @@ "description": "Falls m\u00e9i w\u00e9i een UPS mat deem NUT Server verbonnen ass, g\u00e8eff den UPS Numm am 'Alias' Feld un fir ze sichen.", "title": "Mam NUT Server verbannen" } - }, - "title": "Network UPS Tools (NUT)" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Sensor Ressourcen auswielen" } } - } + }, + "title": "Network UPS Tools (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/nl.json b/homeassistant/components/nut/.translations/nl.json index 131303354e78..2f8562da23f2 100644 --- a/homeassistant/components/nut/.translations/nl.json +++ b/homeassistant/components/nut/.translations/nl.json @@ -19,8 +19,7 @@ }, "title": "Verbind met NUT-server" } - }, - "title": "Network UPS Tools (NUT)" + } }, "options": { "step": { @@ -30,5 +29,6 @@ } } } - } + }, + "title": "Network UPS Tools (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/no.json b/homeassistant/components/nut/.translations/no.json index 31fc3e513c12..d018a59ebae6 100644 --- a/homeassistant/components/nut/.translations/no.json +++ b/homeassistant/components/nut/.translations/no.json @@ -21,17 +21,18 @@ "description": "Hvis det er flere UPS-er knyttet til NUT-serveren, angir du navnet UPS for \u00e5 sp\u00f8rre i 'Alias' -feltet.", "title": "Koble til NUT-serveren" } - }, - "title": "Nettverk UPS-verkt\u00f8y (NUT)" + } }, "options": { "step": { "init": { "data": { - "resources": "Ressurser" + "resources": "Ressurser", + "scan_interval": "Skanneintervall (sekunder)" }, - "description": "Velg Sensorressurser" + "description": "Velg Sensor Ressurser." } } - } + }, + "title": "Nettverk UPS-verkt\u00f8y (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/pl.json b/homeassistant/components/nut/.translations/pl.json index ee9a67b243b8..94b0b467c838 100644 --- a/homeassistant/components/nut/.translations/pl.json +++ b/homeassistant/components/nut/.translations/pl.json @@ -21,8 +21,7 @@ "description": "Je\u015bli do serwera NUT pod\u0142\u0105czonych jest wiele zasilaczy UPS, wprowad\u017a w polu Alias nazw\u0119 zasilacza UPS, kt\u00f3rego dotyczy zapytanie.", "title": "Po\u0142\u0105cz z serwerem NUT" } - }, - "title": "Sieciowe narz\u0119dzia UPS (NUT)" + } }, "options": { "step": { @@ -33,5 +32,6 @@ "description": "Wybierz zasoby sensor\u00f3w" } } - } + }, + "title": "Sieciowe narz\u0119dzia UPS (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json index 63997b7960ac..f31cff7d7473 100644 --- a/homeassistant/components/nut/.translations/ru.json +++ b/homeassistant/components/nut/.translations/ru.json @@ -34,8 +34,7 @@ "description": "\u0415\u0441\u043b\u0438 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0418\u0411\u041f, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0418\u0411\u041f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043f\u043e\u043b\u0435 '\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c'.", "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT" } - }, - "title": "Network UPS Tools (NUT)" + } }, "options": { "step": { @@ -47,5 +46,6 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432." } } - } + }, + "title": "Network UPS Tools (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/zh-Hant.json b/homeassistant/components/nut/.translations/zh-Hant.json index 4163b3930864..5b72d9a2019a 100644 --- a/homeassistant/components/nut/.translations/zh-Hant.json +++ b/homeassistant/components/nut/.translations/zh-Hant.json @@ -34,8 +34,7 @@ "description": "\u5047\u5982 NUT \u4f3a\u670d\u5668\u4e0b\u64c1\u6709\u591a\u7d44 UPS\uff0c\u65bc\u300c\u5225\u540d\u300d\u6b04\u4f4d\u8f38\u5165 UPS \u540d\u7a31\u3002", "title": "\u9023\u7dda\u81f3 NUT \u4f3a\u670d\u5668" } - }, - "title": "Network UPS Tools (NUT)" + } }, "options": { "step": { @@ -47,5 +46,6 @@ "description": "\u9078\u64c7\u50b3\u611f\u5668\u8cc7\u6e90\u3002" } } - } + }, + "title": "Network UPS Tools (NUT)" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/bg.json b/homeassistant/components/opentherm_gw/.translations/bg.json index fe9a611f1151..d524e1a770c3 100644 --- a/homeassistant/components/opentherm_gw/.translations/bg.json +++ b/homeassistant/components/opentherm_gw/.translations/bg.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ca.json b/homeassistant/components/opentherm_gw/.translations/ca.json index 4d39dec36624..def09ea4b69f 100644 --- a/homeassistant/components/opentherm_gw/.translations/ca.json +++ b/homeassistant/components/opentherm_gw/.translations/ca.json @@ -15,8 +15,7 @@ }, "title": "Passarel\u00b7la d'OpenTherm" } - }, - "title": "Passarel\u00b7la d'OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Opcions del la passarel\u00b7la d'enlla\u00e7 d\u2019OpenTherm" } } - } + }, + "title": "Passarel\u00b7la d'OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/da.json b/homeassistant/components/opentherm_gw/.translations/da.json index bbdec393ab06..525b5b00fa8d 100644 --- a/homeassistant/components/opentherm_gw/.translations/da.json +++ b/homeassistant/components/opentherm_gw/.translations/da.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Indstillinger for OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/de.json b/homeassistant/components/opentherm_gw/.translations/de.json index 92217c51c044..3b835faa2b55 100644 --- a/homeassistant/components/opentherm_gw/.translations/de.json +++ b/homeassistant/components/opentherm_gw/.translations/de.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Optionen f\u00fcr das OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/en.json b/homeassistant/components/opentherm_gw/.translations/en.json index 5ba5d232bfcc..baec16255eed 100644 --- a/homeassistant/components/opentherm_gw/.translations/en.json +++ b/homeassistant/components/opentherm_gw/.translations/en.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Options for the OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/es.json b/homeassistant/components/opentherm_gw/.translations/es.json index 9acfbb4bf677..959621e364c7 100644 --- a/homeassistant/components/opentherm_gw/.translations/es.json +++ b/homeassistant/components/opentherm_gw/.translations/es.json @@ -15,8 +15,7 @@ }, "title": "Gateway OpenTherm" } - }, - "title": "Gateway OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Opciones para OpenTherm Gateway" } } - } + }, + "title": "Gateway OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/fr.json b/homeassistant/components/opentherm_gw/.translations/fr.json index 7508612580d7..c208eb3295c0 100644 --- a/homeassistant/components/opentherm_gw/.translations/fr.json +++ b/homeassistant/components/opentherm_gw/.translations/fr.json @@ -15,8 +15,7 @@ }, "title": "Passerelle OpenTherm" } - }, - "title": "Passerelle OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Options pour la passerelle OpenTherm" } } - } + }, + "title": "Passerelle OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/hu.json b/homeassistant/components/opentherm_gw/.translations/hu.json index 1a00570d324c..8b1beebdc7d5 100644 --- a/homeassistant/components/opentherm_gw/.translations/hu.json +++ b/homeassistant/components/opentherm_gw/.translations/hu.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm \u00e1tj\u00e1r\u00f3" } - }, - "title": "OpenTherm \u00e1tj\u00e1r\u00f3" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "OpenTherm \u00e1tj\u00e1r\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/it.json b/homeassistant/components/opentherm_gw/.translations/it.json index c1392fdd077d..6128361f85f9 100644 --- a/homeassistant/components/opentherm_gw/.translations/it.json +++ b/homeassistant/components/opentherm_gw/.translations/it.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "Gateway OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Opzioni per OpenTherm Gateway" } } - } + }, + "title": "Gateway OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ko.json b/homeassistant/components/opentherm_gw/.translations/ko.json index a51efdb197b9..266315f66061 100644 --- a/homeassistant/components/opentherm_gw/.translations/ko.json +++ b/homeassistant/components/opentherm_gw/.translations/ko.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "OpenTherm Gateway \uc635\uc158" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/lb.json b/homeassistant/components/opentherm_gw/.translations/lb.json index 3a057ec4e3b0..703a675f287e 100644 --- a/homeassistant/components/opentherm_gw/.translations/lb.json +++ b/homeassistant/components/opentherm_gw/.translations/lb.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Optioune fir OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/nl.json b/homeassistant/components/opentherm_gw/.translations/nl.json index 331307d3bca9..b0b21e3c2d2d 100644 --- a/homeassistant/components/opentherm_gw/.translations/nl.json +++ b/homeassistant/components/opentherm_gw/.translations/nl.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Opties voor de OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/no.json b/homeassistant/components/opentherm_gw/.translations/no.json index 6b30b85931d6..3d73199cbffe 100644 --- a/homeassistant/components/opentherm_gw/.translations/no.json +++ b/homeassistant/components/opentherm_gw/.translations/no.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Alternativer for OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/pl.json b/homeassistant/components/opentherm_gw/.translations/pl.json index 9d945eac27e9..aaaee5d1ad79 100644 --- a/homeassistant/components/opentherm_gw/.translations/pl.json +++ b/homeassistant/components/opentherm_gw/.translations/pl.json @@ -15,8 +15,7 @@ }, "title": "Bramka OpenTherm" } - }, - "title": "Bramka OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Opcje dla bramki OpenTherm" } } - } + }, + "title": "Bramka OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ru.json b/homeassistant/components/opentherm_gw/.translations/ru.json index 6ad69e23c236..c2190ceba578 100644 --- a/homeassistant/components/opentherm_gw/.translations/ru.json +++ b/homeassistant/components/opentherm_gw/.translations/ru.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm" } - }, - "title": "OpenTherm" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0448\u043b\u044e\u0437\u0430 Opentherm" } } - } + }, + "title": "OpenTherm" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/sl.json b/homeassistant/components/opentherm_gw/.translations/sl.json index 8eabe6839bbc..c554b062417c 100644 --- a/homeassistant/components/opentherm_gw/.translations/sl.json +++ b/homeassistant/components/opentherm_gw/.translations/sl.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Prehod" } - }, - "title": "OpenTherm Prehod" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Mo\u017enosti za prehod OpenTherm" } } - } + }, + "title": "OpenTherm Prehod" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/sv.json b/homeassistant/components/opentherm_gw/.translations/sv.json index 61562b9562fb..2360e81a4ac7 100644 --- a/homeassistant/components/opentherm_gw/.translations/sv.json +++ b/homeassistant/components/opentherm_gw/.translations/sv.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm Gateway" } - }, - "title": "OpenTherm Gateway" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "Alternativ f\u00f6r OpenTherm Gateway" } } - } + }, + "title": "OpenTherm Gateway" } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json index 6fa1f260c834..55bd70077ce1 100644 --- a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json +++ b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json @@ -15,8 +15,7 @@ }, "title": "OpenTherm \u9598\u9053\u5668" } - }, - "title": "OpenTherm \u9598\u9053\u5668" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "description": "OpenTherm \u9598\u9053\u5668\u9078\u9805" } } - } + }, + "title": "OpenTherm \u9598\u9053\u5668" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ar.json b/homeassistant/components/openuv/.translations/ar.json index 288fae919dc2..968addd26bf9 100644 --- a/homeassistant/components/openuv/.translations/ar.json +++ b/homeassistant/components/openuv/.translations/ar.json @@ -1,5 +1,3 @@ { - "config": { - "title": "OpenUV" - } + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/bg.json b/homeassistant/components/openuv/.translations/bg.json index 6e1e2db5ca87..0ae08cf66b4e 100644 --- a/homeassistant/components/openuv/.translations/bg.json +++ b/homeassistant/components/openuv/.translations/bg.json @@ -14,7 +14,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ca.json b/homeassistant/components/openuv/.translations/ca.json index ad2f391886a2..929ded46fbbf 100644 --- a/homeassistant/components/openuv/.translations/ca.json +++ b/homeassistant/components/openuv/.translations/ca.json @@ -14,7 +14,7 @@ }, "title": "Introdueix la teva informaci\u00f3" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/cs.json b/homeassistant/components/openuv/.translations/cs.json index 9f6ad4f8d47f..b6e3120f3656 100644 --- a/homeassistant/components/openuv/.translations/cs.json +++ b/homeassistant/components/openuv/.translations/cs.json @@ -14,7 +14,7 @@ }, "title": "Vypl\u0148te va\u0161e \u00fadaje" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/da.json b/homeassistant/components/openuv/.translations/da.json index eaf2e1270269..1c1f80cc6e74 100644 --- a/homeassistant/components/openuv/.translations/da.json +++ b/homeassistant/components/openuv/.translations/da.json @@ -14,7 +14,7 @@ }, "title": "Udfyld dine oplysninger" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/de.json b/homeassistant/components/openuv/.translations/de.json index cc8ee92df4b7..134771d6c960 100644 --- a/homeassistant/components/openuv/.translations/de.json +++ b/homeassistant/components/openuv/.translations/de.json @@ -14,7 +14,7 @@ }, "title": "Gib deine Informationen ein" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/en.json b/homeassistant/components/openuv/.translations/en.json index df0232d01fc2..5cd75240de95 100644 --- a/homeassistant/components/openuv/.translations/en.json +++ b/homeassistant/components/openuv/.translations/en.json @@ -14,7 +14,7 @@ }, "title": "Fill in your information" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/es-419.json b/homeassistant/components/openuv/.translations/es-419.json index 332a21f99f54..2d28462243e5 100644 --- a/homeassistant/components/openuv/.translations/es-419.json +++ b/homeassistant/components/openuv/.translations/es-419.json @@ -14,7 +14,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/es.json b/homeassistant/components/openuv/.translations/es.json index 03118f00ea68..0dedcaa8b037 100644 --- a/homeassistant/components/openuv/.translations/es.json +++ b/homeassistant/components/openuv/.translations/es.json @@ -14,7 +14,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/fa.json b/homeassistant/components/openuv/.translations/fa.json index 288fae919dc2..968addd26bf9 100644 --- a/homeassistant/components/openuv/.translations/fa.json +++ b/homeassistant/components/openuv/.translations/fa.json @@ -1,5 +1,3 @@ { - "config": { - "title": "OpenUV" - } + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/fr.json b/homeassistant/components/openuv/.translations/fr.json index 2f83fa300857..6b6b32675601 100644 --- a/homeassistant/components/openuv/.translations/fr.json +++ b/homeassistant/components/openuv/.translations/fr.json @@ -14,7 +14,7 @@ }, "title": "Veuillez saisir vos informations" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/he.json b/homeassistant/components/openuv/.translations/he.json index 262a3d732a29..7a9716f76cbb 100644 --- a/homeassistant/components/openuv/.translations/he.json +++ b/homeassistant/components/openuv/.translations/he.json @@ -14,7 +14,7 @@ }, "title": "\u05de\u05dc\u05d0 \u05d0\u05ea \u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05dc\u05da" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/hu.json b/homeassistant/components/openuv/.translations/hu.json index fd30f83c5f8d..a6188bb18c30 100644 --- a/homeassistant/components/openuv/.translations/hu.json +++ b/homeassistant/components/openuv/.translations/hu.json @@ -14,7 +14,7 @@ }, "title": "T\u00f6ltsd ki az adataid" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/id.json b/homeassistant/components/openuv/.translations/id.json index beb7c839eb90..53b6fcd6b3ea 100644 --- a/homeassistant/components/openuv/.translations/id.json +++ b/homeassistant/components/openuv/.translations/id.json @@ -14,7 +14,7 @@ }, "title": "Isi informasi Anda" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/it.json b/homeassistant/components/openuv/.translations/it.json index 1a231d680e69..b7550430aa09 100644 --- a/homeassistant/components/openuv/.translations/it.json +++ b/homeassistant/components/openuv/.translations/it.json @@ -14,7 +14,7 @@ }, "title": "Inserisci i tuoi dati" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ko.json b/homeassistant/components/openuv/.translations/ko.json index c16481993efc..6abc49e8aa3a 100644 --- a/homeassistant/components/openuv/.translations/ko.json +++ b/homeassistant/components/openuv/.translations/ko.json @@ -14,7 +14,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/lb.json b/homeassistant/components/openuv/.translations/lb.json index 86e558cc8075..4d941d736195 100644 --- a/homeassistant/components/openuv/.translations/lb.json +++ b/homeassistant/components/openuv/.translations/lb.json @@ -14,7 +14,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/nl.json b/homeassistant/components/openuv/.translations/nl.json index e2b264182d07..4d408ef525c9 100644 --- a/homeassistant/components/openuv/.translations/nl.json +++ b/homeassistant/components/openuv/.translations/nl.json @@ -14,7 +14,7 @@ }, "title": "Vul uw gegevens in" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/nn.json b/homeassistant/components/openuv/.translations/nn.json index 135e26cede3e..dd7fef44ef7b 100644 --- a/homeassistant/components/openuv/.translations/nn.json +++ b/homeassistant/components/openuv/.translations/nn.json @@ -14,7 +14,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/no.json b/homeassistant/components/openuv/.translations/no.json index 2ffd5e7fb41c..790819bbe3c6 100644 --- a/homeassistant/components/openuv/.translations/no.json +++ b/homeassistant/components/openuv/.translations/no.json @@ -14,7 +14,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pl.json b/homeassistant/components/openuv/.translations/pl.json index ff6d1b210557..859b9e72f9eb 100644 --- a/homeassistant/components/openuv/.translations/pl.json +++ b/homeassistant/components/openuv/.translations/pl.json @@ -14,7 +14,7 @@ }, "title": "Wprowad\u017a dane" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pt-BR.json b/homeassistant/components/openuv/.translations/pt-BR.json index 905fdbacab8b..5181c87f3b04 100644 --- a/homeassistant/components/openuv/.translations/pt-BR.json +++ b/homeassistant/components/openuv/.translations/pt-BR.json @@ -14,7 +14,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pt.json b/homeassistant/components/openuv/.translations/pt.json index 48283a741068..2a2e2ec65124 100644 --- a/homeassistant/components/openuv/.translations/pt.json +++ b/homeassistant/components/openuv/.translations/pt.json @@ -14,7 +14,7 @@ }, "title": "Preencha com as suas informa\u00e7\u00f5es" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ro.json b/homeassistant/components/openuv/.translations/ro.json index 976221188d3d..d52cd1906a6f 100644 --- a/homeassistant/components/openuv/.translations/ro.json +++ b/homeassistant/components/openuv/.translations/ro.json @@ -14,7 +14,7 @@ }, "title": "Completa\u021bi informa\u021biile dvs." } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ru.json b/homeassistant/components/openuv/.translations/ru.json index 27d2921a7d42..846425ec4210 100644 --- a/homeassistant/components/openuv/.translations/ru.json +++ b/homeassistant/components/openuv/.translations/ru.json @@ -14,7 +14,7 @@ }, "title": "OpenUV" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/sl.json b/homeassistant/components/openuv/.translations/sl.json index 6d8c537d6aa2..fe95bee06163 100644 --- a/homeassistant/components/openuv/.translations/sl.json +++ b/homeassistant/components/openuv/.translations/sl.json @@ -14,7 +14,7 @@ }, "title": "Izpolnite svoje podatke" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/sv.json b/homeassistant/components/openuv/.translations/sv.json index d9de0f7c0a62..399ecfc0459c 100644 --- a/homeassistant/components/openuv/.translations/sv.json +++ b/homeassistant/components/openuv/.translations/sv.json @@ -14,7 +14,7 @@ }, "title": "Fyll i dina uppgifter" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/zh-Hans.json b/homeassistant/components/openuv/.translations/zh-Hans.json index d8f46d6afe4e..3e6a5820ed86 100644 --- a/homeassistant/components/openuv/.translations/zh-Hans.json +++ b/homeassistant/components/openuv/.translations/zh-Hans.json @@ -14,7 +14,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/zh-Hant.json b/homeassistant/components/openuv/.translations/zh-Hant.json index 2310af22fa23..552ec1b7da1a 100644 --- a/homeassistant/components/openuv/.translations/zh-Hant.json +++ b/homeassistant/components/openuv/.translations/zh-Hant.json @@ -14,7 +14,7 @@ }, "title": "\u586b\u5beb\u8cc7\u8a0a" } - }, - "title": "OpenUV" - } + } + }, + "title": "OpenUV" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/bg.json b/homeassistant/components/owntracks/.translations/bg.json index 1989e1a07032..d3abe40bf939 100644 --- a/homeassistant/components/owntracks/.translations/bg.json +++ b/homeassistant/components/owntracks/.translations/bg.json @@ -11,7 +11,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 OwnTracks?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ca.json b/homeassistant/components/owntracks/.translations/ca.json index c733f0f12cca..4a828e919e55 100644 --- a/homeassistant/components/owntracks/.translations/ca.json +++ b/homeassistant/components/owntracks/.translations/ca.json @@ -11,7 +11,7 @@ "description": "Est\u00e0s segur que vols configurar l'OwnTracks?", "title": "Configuraci\u00f3 d'OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/cs.json b/homeassistant/components/owntracks/.translations/cs.json index 25738b7618ea..274cd02bf750 100644 --- a/homeassistant/components/owntracks/.translations/cs.json +++ b/homeassistant/components/owntracks/.translations/cs.json @@ -11,7 +11,7 @@ "description": "Opravdu chcete nastavit slu\u017ebu OwnTracks?", "title": "Nastavit OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/da.json b/homeassistant/components/owntracks/.translations/da.json index 110f60193e6d..a52c2e030023 100644 --- a/homeassistant/components/owntracks/.translations/da.json +++ b/homeassistant/components/owntracks/.translations/da.json @@ -11,7 +11,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere OwnTracks?", "title": "Konfigurer OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/de.json b/homeassistant/components/owntracks/.translations/de.json index ba7721ac0a4d..d83a34ba9d05 100644 --- a/homeassistant/components/owntracks/.translations/de.json +++ b/homeassistant/components/owntracks/.translations/de.json @@ -11,7 +11,7 @@ "description": "M\u00f6chtest du OwnTracks wirklich einrichten?", "title": "OwnTracks einrichten" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/en.json b/homeassistant/components/owntracks/.translations/en.json index a34077a0a832..77a9bbf2c01e 100644 --- a/homeassistant/components/owntracks/.translations/en.json +++ b/homeassistant/components/owntracks/.translations/en.json @@ -11,7 +11,7 @@ "description": "Are you sure you want to set up OwnTracks?", "title": "Set up OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/es-419.json b/homeassistant/components/owntracks/.translations/es-419.json index f56cff977d02..c7036e93162e 100644 --- a/homeassistant/components/owntracks/.translations/es-419.json +++ b/homeassistant/components/owntracks/.translations/es-419.json @@ -11,7 +11,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar OwnTracks?", "title": "Configurar OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/es.json b/homeassistant/components/owntracks/.translations/es.json index f5398c1c3991..8da0aad2733b 100644 --- a/homeassistant/components/owntracks/.translations/es.json +++ b/homeassistant/components/owntracks/.translations/es.json @@ -11,7 +11,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar OwnTracks?", "title": "Configurar OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/fr.json b/homeassistant/components/owntracks/.translations/fr.json index 5975c34e78d0..ffe8501b584c 100644 --- a/homeassistant/components/owntracks/.translations/fr.json +++ b/homeassistant/components/owntracks/.translations/fr.json @@ -11,7 +11,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer OwnTracks?", "title": "Configurer OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/hu.json b/homeassistant/components/owntracks/.translations/hu.json index a82843bef53f..2bf02b8cdf49 100644 --- a/homeassistant/components/owntracks/.translations/hu.json +++ b/homeassistant/components/owntracks/.translations/hu.json @@ -11,7 +11,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az Owntracks-t?", "title": "Owntracks be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/it.json b/homeassistant/components/owntracks/.translations/it.json index 03b0c84744f7..0e86684c610e 100644 --- a/homeassistant/components/owntracks/.translations/it.json +++ b/homeassistant/components/owntracks/.translations/it.json @@ -11,7 +11,7 @@ "description": "Sei sicuro di voler configurare OwnTracks?", "title": "Configura OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ko.json b/homeassistant/components/owntracks/.translations/ko.json index ee1507d9e0ae..4161597a7e71 100644 --- a/homeassistant/components/owntracks/.translations/ko.json +++ b/homeassistant/components/owntracks/.translations/ko.json @@ -11,7 +11,7 @@ "description": "OwnTracks \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "OwnTracks \uc124\uc815" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/lb.json b/homeassistant/components/owntracks/.translations/lb.json index 146fda64b1ef..f62821fbf085 100644 --- a/homeassistant/components/owntracks/.translations/lb.json +++ b/homeassistant/components/owntracks/.translations/lb.json @@ -11,7 +11,7 @@ "description": "S\u00e9cher fir OwnTracks anzeriichten?", "title": "OwnTracks ariichten" } - }, - "title": "Owntracks" - } + } + }, + "title": "Owntracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/nl.json b/homeassistant/components/owntracks/.translations/nl.json index 21ee65a775a7..c3400352263f 100644 --- a/homeassistant/components/owntracks/.translations/nl.json +++ b/homeassistant/components/owntracks/.translations/nl.json @@ -11,7 +11,7 @@ "description": "Weet je zeker dat je OwnTracks wilt instellen?", "title": "Stel OwnTracks in" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/nn.json b/homeassistant/components/owntracks/.translations/nn.json index cdfd651beecf..0e0a71c89689 100644 --- a/homeassistant/components/owntracks/.translations/nn.json +++ b/homeassistant/components/owntracks/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "OwnTracks" - } + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/no.json b/homeassistant/components/owntracks/.translations/no.json index aba620541eca..08154069b3f4 100644 --- a/homeassistant/components/owntracks/.translations/no.json +++ b/homeassistant/components/owntracks/.translations/no.json @@ -11,7 +11,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp OwnTracks?", "title": "Sett opp OwnTracks" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pl.json b/homeassistant/components/owntracks/.translations/pl.json index 91afa020fc0e..882cd328f864 100644 --- a/homeassistant/components/owntracks/.translations/pl.json +++ b/homeassistant/components/owntracks/.translations/pl.json @@ -11,7 +11,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 OwnTracks?", "title": "Konfiguracja OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pt-BR.json b/homeassistant/components/owntracks/.translations/pt-BR.json index 3851b1cc4418..3a6be91a9943 100644 --- a/homeassistant/components/owntracks/.translations/pt-BR.json +++ b/homeassistant/components/owntracks/.translations/pt-BR.json @@ -11,7 +11,7 @@ "description": "Tem certeza de que deseja configurar o OwnTracks?", "title": "Configurar OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pt.json b/homeassistant/components/owntracks/.translations/pt.json index 91df7f5a8ea8..317c4932e1c2 100644 --- a/homeassistant/components/owntracks/.translations/pt.json +++ b/homeassistant/components/owntracks/.translations/pt.json @@ -11,7 +11,7 @@ "description": "Tem certeza de que deseja configurar o OwnTracks?", "title": "Configurar OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ru.json b/homeassistant/components/owntracks/.translations/ru.json index 0e9479c1ed4d..8e4944772c4f 100644 --- a/homeassistant/components/owntracks/.translations/ru.json +++ b/homeassistant/components/owntracks/.translations/ru.json @@ -11,7 +11,7 @@ "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 OwnTracks?", "title": "OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/sl.json b/homeassistant/components/owntracks/.translations/sl.json index e7ae55936375..0f35269d006c 100644 --- a/homeassistant/components/owntracks/.translations/sl.json +++ b/homeassistant/components/owntracks/.translations/sl.json @@ -11,7 +11,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Owntracks?", "title": "Nastavite OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/sv.json b/homeassistant/components/owntracks/.translations/sv.json index 2077cceeb4d4..7f765d5a931a 100644 --- a/homeassistant/components/owntracks/.translations/sv.json +++ b/homeassistant/components/owntracks/.translations/sv.json @@ -11,7 +11,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera OwnTracks?", "title": "Konfigurera OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/zh-Hans.json b/homeassistant/components/owntracks/.translations/zh-Hans.json index 64a6935a9b24..a5066e0ca3fe 100644 --- a/homeassistant/components/owntracks/.translations/zh-Hans.json +++ b/homeassistant/components/owntracks/.translations/zh-Hans.json @@ -11,7 +11,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e OwnTracks \u5417\uff1f", "title": "\u8bbe\u7f6e OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/zh-Hant.json b/homeassistant/components/owntracks/.translations/zh-Hant.json index 923f452450b0..98ff43014f74 100644 --- a/homeassistant/components/owntracks/.translations/zh-Hant.json +++ b/homeassistant/components/owntracks/.translations/zh-Hant.json @@ -11,7 +11,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a OwnTracks\uff1f", "title": "\u8a2d\u5b9a OwnTracks" } - }, - "title": "OwnTracks" - } + } + }, + "title": "OwnTracks" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/bg.json b/homeassistant/components/plaato/.translations/bg.json index 1fcf58e3086b..8a217c57a6d8 100644 --- a/homeassistant/components/plaato/.translations/bg.json +++ b/homeassistant/components/plaato/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Plaato Airlock?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ca.json b/homeassistant/components/plaato/.translations/ca.json index 481450cbc5fc..005175c5bf92 100644 --- a/homeassistant/components/plaato/.translations/ca.json +++ b/homeassistant/components/plaato/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar Plaato Airlock?", "title": "Configuraci\u00f3 del Webhook de Plaato" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/da.json b/homeassistant/components/plaato/.translations/da.json index c4dc5ae178d0..5114b578c3f1 100644 --- a/homeassistant/components/plaato/.translations/da.json +++ b/homeassistant/components/plaato/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Plaato Airlock?", "title": "Konfigurer Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/de.json b/homeassistant/components/plaato/.translations/de.json index 92dafa1c3232..5c104c9399ec 100644 --- a/homeassistant/components/plaato/.translations/de.json +++ b/homeassistant/components/plaato/.translations/de.json @@ -12,7 +12,7 @@ "description": "Soll Plaato Airlock wirklich eingerichtet werden?", "title": "Plaato Webhook einrichten" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/en.json b/homeassistant/components/plaato/.translations/en.json index 6d3aa2c59c43..5a41facb5056 100644 --- a/homeassistant/components/plaato/.translations/en.json +++ b/homeassistant/components/plaato/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up the Plaato Airlock?", "title": "Set up the Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/es-419.json b/homeassistant/components/plaato/.translations/es-419.json index d63802984efb..40cca942a8bc 100644 --- a/homeassistant/components/plaato/.translations/es-419.json +++ b/homeassistant/components/plaato/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1 seguro de que deseas configurar Plaato Airlock?", "title": "Configurar el Webhook de Plaato" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/es.json b/homeassistant/components/plaato/.translations/es.json index ecb061e91c9c..af1305b00e82 100644 --- a/homeassistant/components/plaato/.translations/es.json +++ b/homeassistant/components/plaato/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar el Airlock de Plaato?", "title": "Configurar el webhook de Plaato" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/fr.json b/homeassistant/components/plaato/.translations/fr.json index d710886b84b3..849913b40bf0 100644 --- a/homeassistant/components/plaato/.translations/fr.json +++ b/homeassistant/components/plaato/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir installer le Plaato Airlock ?", "title": "Configurer le Webhook Plaato" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/hr.json b/homeassistant/components/plaato/.translations/hr.json index 680571040b1e..03963cb15a95 100644 --- a/homeassistant/components/plaato/.translations/hr.json +++ b/homeassistant/components/plaato/.translations/hr.json @@ -12,7 +12,7 @@ "description": "Jeste li sigurni da \u017eelite postaviti Plaato Airlock?", "title": "Postavljanje Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/it.json b/homeassistant/components/plaato/.translations/it.json index 7e7697a339bc..5d769289d2cd 100644 --- a/homeassistant/components/plaato/.translations/it.json +++ b/homeassistant/components/plaato/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare Plaato Airlock?", "title": "Configura il webhook di Plaato" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ko.json b/homeassistant/components/plaato/.translations/ko.json index 619fdcf736f9..1591d0f31139 100644 --- a/homeassistant/components/plaato/.translations/ko.json +++ b/homeassistant/components/plaato/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Plaato Airlock \uc744 \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Plaato Webhook \uc124\uc815" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/lb.json b/homeassistant/components/plaato/.translations/lb.json index 62caa58fe266..441fbef41d84 100644 --- a/homeassistant/components/plaato/.translations/lb.json +++ b/homeassistant/components/plaato/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Plaato Airlock anzeriichten?", "title": "Plaato Webhook ariichten" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/nl.json b/homeassistant/components/plaato/.translations/nl.json index 7711fe98a18a..0ae305c76ec3 100644 --- a/homeassistant/components/plaato/.translations/nl.json +++ b/homeassistant/components/plaato/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u de Plaato-airlock wilt instellen?", "title": "Stel de Plaato Webhook in" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/nn.json b/homeassistant/components/plaato/.translations/nn.json index 750e14b1daee..5492aabed837 100644 --- a/homeassistant/components/plaato/.translations/nn.json +++ b/homeassistant/components/plaato/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Plaato Airlock" - } + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/no.json b/homeassistant/components/plaato/.translations/no.json index 0de31a35eb29..c0abea57bcd6 100644 --- a/homeassistant/components/plaato/.translations/no.json +++ b/homeassistant/components/plaato/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp Plato Airlock?", "title": "Sett opp Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/pl.json b/homeassistant/components/plaato/.translations/pl.json index dc931b6bd8c4..a902c3d4d044 100644 --- a/homeassistant/components/plaato/.translations/pl.json +++ b/homeassistant/components/plaato/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Airlock Plaato?", "title": "Konfiguracja Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/pt-BR.json b/homeassistant/components/plaato/.translations/pt-BR.json index a1903fa1075f..1d6ebea298de 100644 --- a/homeassistant/components/plaato/.translations/pt-BR.json +++ b/homeassistant/components/plaato/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tens a certeza que queres montar a Plaato Airlock?", "title": "Configurar o Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ru.json b/homeassistant/components/plaato/.translations/ru.json index fc1255ed9ce9..b74ad363658e 100644 --- a/homeassistant/components/plaato/.translations/ru.json +++ b/homeassistant/components/plaato/.translations/ru.json @@ -12,7 +12,7 @@ "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 Plaato Airlock?", "title": "Plaato Airlock" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/sl.json b/homeassistant/components/plaato/.translations/sl.json index b30bcb66d2ea..85d744b252c3 100644 --- a/homeassistant/components/plaato/.translations/sl.json +++ b/homeassistant/components/plaato/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Plaato Webhook?", "title": "Nastavite Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/sv.json b/homeassistant/components/plaato/.translations/sv.json index 9b76bc744e68..8c2fc19bdbce 100644 --- a/homeassistant/components/plaato/.translations/sv.json +++ b/homeassistant/components/plaato/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Plaato Webhook?", "title": "Konfigurera Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/zh-Hant.json b/homeassistant/components/plaato/.translations/zh-Hant.json index 1bf211476d88..f07766c88de0 100644 --- a/homeassistant/components/plaato/.translations/zh-Hant.json +++ b/homeassistant/components/plaato/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Plaato Airlock\uff1f", "title": "\u8a2d\u5b9a Plaato Webhook" } - }, - "title": "Plaato Airlock" - } + } + }, + "title": "Plaato Airlock" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/bg.json b/homeassistant/components/plex/.translations/bg.json index 53d15e1205e5..ee2534fa7766 100644 --- a/homeassistant/components/plex/.translations/bg.json +++ b/homeassistant/components/plex/.translations/bg.json @@ -26,8 +26,7 @@ "description": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0435\u0442\u0435 \u0441 \u043e\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 plex.tv.", "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 Plex \u0441\u044a\u0440\u0432\u044a\u0440" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -38,5 +37,6 @@ "description": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Plex Media Players" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ca.json b/homeassistant/components/plex/.translations/ca.json index 46b7759a04db..e11634c2d8e1 100644 --- a/homeassistant/components/plex/.translations/ca.json +++ b/homeassistant/components/plex/.translations/ca.json @@ -26,8 +26,7 @@ "description": "Continua l'autoritzaci\u00f3 a plex.tv.", "title": "Connexi\u00f3 amb el servidor Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Opcions dels reproductors multim\u00e8dia Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/da.json b/homeassistant/components/plex/.translations/da.json index 7bfdda60b377..5558a73aa7ce 100644 --- a/homeassistant/components/plex/.translations/da.json +++ b/homeassistant/components/plex/.translations/da.json @@ -26,8 +26,7 @@ "description": "Forts\u00e6t for at godkende p\u00e5 plex.tv.", "title": "Forbind Plex-server" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Indstillinger for Plex-medieafspillere" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/de.json b/homeassistant/components/plex/.translations/de.json index c86ffb97d3a9..15b7a823a91b 100644 --- a/homeassistant/components/plex/.translations/de.json +++ b/homeassistant/components/plex/.translations/de.json @@ -26,8 +26,7 @@ "description": "Weiter zur Autorisierung unter plex.tv.", "title": "Plex Server verbinden" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Optionen f\u00fcr Plex-Media-Player" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/en.json b/homeassistant/components/plex/.translations/en.json index b9ca9b355eef..8383a6a3491c 100644 --- a/homeassistant/components/plex/.translations/en.json +++ b/homeassistant/components/plex/.translations/en.json @@ -26,8 +26,7 @@ "description": "Continue to authorize at plex.tv.", "title": "Connect Plex server" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Options for Plex Media Players" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/es-419.json b/homeassistant/components/plex/.translations/es-419.json index 0546fcd7adff..dfddaf027420 100644 --- a/homeassistant/components/plex/.translations/es-419.json +++ b/homeassistant/components/plex/.translations/es-419.json @@ -21,8 +21,7 @@ "description": "M\u00faltiples servidores disponibles, seleccione uno:", "title": "Seleccionar servidor Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -30,5 +29,6 @@ "description": "Opciones para reproductores multimedia Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/es.json b/homeassistant/components/plex/.translations/es.json index 3de562db21d8..6190c0a52ac3 100644 --- a/homeassistant/components/plex/.translations/es.json +++ b/homeassistant/components/plex/.translations/es.json @@ -26,8 +26,7 @@ "description": "Contin\u00fae en plex.tv para autorizar", "title": "Conectar servidor Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Opciones para reproductores multimedia Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/fr.json b/homeassistant/components/plex/.translations/fr.json index 354a5eaecf97..edbbe2d4d943 100644 --- a/homeassistant/components/plex/.translations/fr.json +++ b/homeassistant/components/plex/.translations/fr.json @@ -26,8 +26,7 @@ "description": "Continuer d'autoriser sur plex.tv.", "title": "Connecter un serveur Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Options pour lecteurs multim\u00e9dia Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/hu.json b/homeassistant/components/plex/.translations/hu.json index c59e31a3b957..cdf95c701734 100644 --- a/homeassistant/components/plex/.translations/hu.json +++ b/homeassistant/components/plex/.translations/hu.json @@ -26,8 +26,7 @@ "description": "Folytassa az enged\u00e9lyez\u00e9st a plex.tv webhelyen.", "title": "Plex-kiszolg\u00e1l\u00f3 csatlakoztat\u00e1sa" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -38,5 +37,6 @@ "description": "Plex media lej\u00e1tsz\u00f3k be\u00e1ll\u00edt\u00e1sai" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/it.json b/homeassistant/components/plex/.translations/it.json index bb48d95bc515..5db92410f146 100644 --- a/homeassistant/components/plex/.translations/it.json +++ b/homeassistant/components/plex/.translations/it.json @@ -26,8 +26,7 @@ "description": "Continuare ad autorizzare su plex.tv.", "title": "Collegare il server Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Opzioni per i lettori multimediali Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ko.json b/homeassistant/components/plex/.translations/ko.json index 5cb49836f4d9..47d5bfcf9cec 100644 --- a/homeassistant/components/plex/.translations/ko.json +++ b/homeassistant/components/plex/.translations/ko.json @@ -26,8 +26,7 @@ "description": "plex.tv \uc5d0\uc11c \uc778\uc99d\uc744 \uc9c4\ud589\ud574\uc8fc\uc138\uc694.", "title": "Plex \uc11c\ubc84 \uc5f0\uacb0" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Plex \ubbf8\ub514\uc5b4 \ud50c\ub808\uc774\uc5b4 \uc635\uc158" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/lb.json b/homeassistant/components/plex/.translations/lb.json index c8b910b6dc58..94b0d55afb1e 100644 --- a/homeassistant/components/plex/.translations/lb.json +++ b/homeassistant/components/plex/.translations/lb.json @@ -26,8 +26,7 @@ "description": "Weiderfueren op plex.tv fir d'Autorisatioun.", "title": "Plex Server verbannen" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Optioune fir Plex Medie Spiller" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/nl.json b/homeassistant/components/plex/.translations/nl.json index 79ae6506d86c..21235032c3c8 100644 --- a/homeassistant/components/plex/.translations/nl.json +++ b/homeassistant/components/plex/.translations/nl.json @@ -26,8 +26,7 @@ "description": "Ga verder met autoriseren bij plex.tv.", "title": "Verbind de Plex server" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -38,5 +37,6 @@ "description": "Opties voor Plex-mediaspelers" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/nn.json b/homeassistant/components/plex/.translations/nn.json index a16deb2fca28..9158b0c83e9a 100644 --- a/homeassistant/components/plex/.translations/nn.json +++ b/homeassistant/components/plex/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Plex" - } + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/no.json b/homeassistant/components/plex/.translations/no.json index be76411d8ac6..1e3285a628fb 100644 --- a/homeassistant/components/plex/.translations/no.json +++ b/homeassistant/components/plex/.translations/no.json @@ -26,8 +26,7 @@ "description": "Fortsett \u00e5 autorisere p\u00e5 plex.tv.", "title": "Koble til Plex-server" } - }, - "title": "" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Alternativer for Plex Media Players" } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/pl.json b/homeassistant/components/plex/.translations/pl.json index 8b21562a87e5..f3a9bbbc7dbd 100644 --- a/homeassistant/components/plex/.translations/pl.json +++ b/homeassistant/components/plex/.translations/pl.json @@ -26,8 +26,7 @@ "description": "Kontynuuj, by dokona\u0107 autoryzacji w plex.tv.", "title": "Po\u0142\u0105cz z serwerem Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Opcje dla odtwarzaczy multimedialnych Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ru.json b/homeassistant/components/plex/.translations/ru.json index 851a2f16ae1f..d28ee5a2e458 100644 --- a/homeassistant/components/plex/.translations/ru.json +++ b/homeassistant/components/plex/.translations/ru.json @@ -26,8 +26,7 @@ "description": "\u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 plex.tv.", "title": "Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/sl.json b/homeassistant/components/plex/.translations/sl.json index 20ad2ca0a02c..a208aa3fda93 100644 --- a/homeassistant/components/plex/.translations/sl.json +++ b/homeassistant/components/plex/.translations/sl.json @@ -26,8 +26,7 @@ "description": "Nadaljujte z avtorizacijo na plex.tv.", "title": "Pove\u017eite stre\u017enik Plex" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Mo\u017enosti za predvajalnike Plex" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/sv.json b/homeassistant/components/plex/.translations/sv.json index 42afc3eeaa9d..d8f5e4be158e 100644 --- a/homeassistant/components/plex/.translations/sv.json +++ b/homeassistant/components/plex/.translations/sv.json @@ -26,8 +26,7 @@ "description": "Forts\u00e4tt att auktorisera p\u00e5 plex.tv.", "title": "Anslut Plex-servern" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -38,5 +37,6 @@ "description": "Alternativ f\u00f6r Plex-mediaspelare" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/zh-Hant.json b/homeassistant/components/plex/.translations/zh-Hant.json index 6d46b8bc1541..27e7cd47e091 100644 --- a/homeassistant/components/plex/.translations/zh-Hant.json +++ b/homeassistant/components/plex/.translations/zh-Hant.json @@ -26,8 +26,7 @@ "description": "\u7e7c\u7e8c\u65bc Plex.tv \u9032\u884c\u8a8d\u8b49\u3002", "title": "\u9023\u7dda\u81f3 Plex \u4f3a\u670d\u5668" } - }, - "title": "Plex" + } }, "options": { "step": { @@ -40,5 +39,6 @@ "description": "Plex \u64ad\u653e\u5668\u9078\u9805" } } - } + }, + "title": "Plex" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/bg.json b/homeassistant/components/point/.translations/bg.json index 3ddb9f998a23..a67d24239805 100644 --- a/homeassistant/components/point/.translations/bg.json +++ b/homeassistant/components/point/.translations/bg.json @@ -26,7 +26,7 @@ "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0438\u0440\u0430\u043d\u0435, \u0447\u0440\u0435\u0437 \u043a\u043e\u0439\u0442\u043e \u0434\u0430 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0441 Point.", "title": "\u0414\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ca.json b/homeassistant/components/point/.translations/ca.json index c4d9228532d4..e834de8ae0b5 100644 --- a/homeassistant/components/point/.translations/ca.json +++ b/homeassistant/components/point/.translations/ca.json @@ -26,7 +26,7 @@ "description": "Tria quin prove\u00efdor d'autenticaci\u00f3 vols utilitzar per autenticar-te amb Point.", "title": "Prove\u00efdor d'autenticaci\u00f3" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/cs.json b/homeassistant/components/point/.translations/cs.json index 71f13959b412..c39cec0c7376 100644 --- a/homeassistant/components/point/.translations/cs.json +++ b/homeassistant/components/point/.translations/cs.json @@ -25,7 +25,7 @@ "description": "Zvolte pomoc\u00ed kter\u00e9ho poskytovatele ov\u011b\u0159ov\u00e1n\u00ed chcete ov\u011b\u0159it Point.", "title": "Poskytovatel ov\u011b\u0159en\u00ed" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/da.json b/homeassistant/components/point/.translations/da.json index 4b6017ddd010..8692c4c02cbf 100644 --- a/homeassistant/components/point/.translations/da.json +++ b/homeassistant/components/point/.translations/da.json @@ -26,7 +26,7 @@ "description": "V\u00e6lg hvilken godkendelsesudbyder du vil godkende med Point.", "title": "Godkendelsesudbyder" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/de.json b/homeassistant/components/point/.translations/de.json index 1072234a744a..53b2f2f664d3 100644 --- a/homeassistant/components/point/.translations/de.json +++ b/homeassistant/components/point/.translations/de.json @@ -26,7 +26,7 @@ "description": "W\u00e4hle \u00fcber welchen Authentifizierungsanbieter du sich mit Point authentifizieren m\u00f6chtest.", "title": "Authentifizierungsanbieter" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/en.json b/homeassistant/components/point/.translations/en.json index 705ac59b98d0..c53605865ffe 100644 --- a/homeassistant/components/point/.translations/en.json +++ b/homeassistant/components/point/.translations/en.json @@ -26,7 +26,7 @@ "description": "Pick via which authentication provider you want to authenticate with Point.", "title": "Authentication Provider" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/es-419.json b/homeassistant/components/point/.translations/es-419.json index 7436513ba6f8..fec1cb0b40df 100644 --- a/homeassistant/components/point/.translations/es-419.json +++ b/homeassistant/components/point/.translations/es-419.json @@ -20,7 +20,7 @@ "description": "Elija a trav\u00e9s de qu\u00e9 proveedor de autenticaci\u00f3n desea autenticarse con Point.", "title": "Proveedor de autenticaci\u00f3n" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/es.json b/homeassistant/components/point/.translations/es.json index 9a94e54dd5fa..7488d527ecff 100644 --- a/homeassistant/components/point/.translations/es.json +++ b/homeassistant/components/point/.translations/es.json @@ -26,7 +26,7 @@ "description": "Elige a trav\u00e9s de qu\u00e9 proveedor de autenticaci\u00f3n quieres autenticarte con Point.", "title": "Proveedor de autenticaci\u00f3n" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/fr.json b/homeassistant/components/point/.translations/fr.json index c20b62ef3b6a..eda0c666b62f 100644 --- a/homeassistant/components/point/.translations/fr.json +++ b/homeassistant/components/point/.translations/fr.json @@ -26,7 +26,7 @@ "description": "Choisissez via quel fournisseur d'authentification vous souhaitez vous authentifier avec Point.", "title": "Fournisseur d'authentification" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/hu.json b/homeassistant/components/point/.translations/hu.json index 3192454550dc..e6a90325e0f0 100644 --- a/homeassistant/components/point/.translations/hu.json +++ b/homeassistant/components/point/.translations/hu.json @@ -20,7 +20,7 @@ "description": "V\u00e1laszd ki, hogy melyik hiteles\u00edt\u00e9si szolg\u00e1ltat\u00f3n\u00e1l szeretn\u00e9d hiteles\u00edteni a Pointot.", "title": "Hiteles\u00edt\u00e9si Szolg\u00e1ltat\u00f3" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/it.json b/homeassistant/components/point/.translations/it.json index 3c0ef8306e0c..507b42331445 100644 --- a/homeassistant/components/point/.translations/it.json +++ b/homeassistant/components/point/.translations/it.json @@ -26,7 +26,7 @@ "description": "Scegli tramite quale provider di autenticazione vuoi autenticarti con Point.", "title": "Provider di autenticazione" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ko.json b/homeassistant/components/point/.translations/ko.json index 0dd9cd43adad..1b54d0ca3b6a 100644 --- a/homeassistant/components/point/.translations/ko.json +++ b/homeassistant/components/point/.translations/ko.json @@ -26,7 +26,7 @@ "description": "Point \ub97c \uc778\uc99d\ud558\uae30 \uc704\ud55c \uc778\uc99d \uacf5\uae09\uc790\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694.", "title": "\uc778\uc99d \uacf5\uae09\uc790" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/lb.json b/homeassistant/components/point/.translations/lb.json index ea589a2c3d35..3090a8cb164b 100644 --- a/homeassistant/components/point/.translations/lb.json +++ b/homeassistant/components/point/.translations/lb.json @@ -26,7 +26,7 @@ "description": "Wielt den Authentifikatioun Ubidder deen sech mat Point verbanne soll.", "title": "Authentifikatioun Ubidder" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/nl.json b/homeassistant/components/point/.translations/nl.json index 1ca54237fd55..bc107a24a994 100644 --- a/homeassistant/components/point/.translations/nl.json +++ b/homeassistant/components/point/.translations/nl.json @@ -26,7 +26,7 @@ "description": "Kies met welke authenticatieprovider u wilt authenticeren met Point.", "title": "Authenticatieleverancier" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/nn.json b/homeassistant/components/point/.translations/nn.json index 865155c04949..e5a6ea182ff0 100644 --- a/homeassistant/components/point/.translations/nn.json +++ b/homeassistant/components/point/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Minut Point" - } + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/no.json b/homeassistant/components/point/.translations/no.json index 1448b56d8487..85e383be7129 100644 --- a/homeassistant/components/point/.translations/no.json +++ b/homeassistant/components/point/.translations/no.json @@ -26,7 +26,7 @@ "description": "Velg fra hvilken godkjenningsleverand\u00f8r du vil godkjenne med Point.", "title": "Godkjenningsleverand\u00f8r" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pl.json b/homeassistant/components/point/.translations/pl.json index 4de46c841379..0aad75fc4ff9 100644 --- a/homeassistant/components/point/.translations/pl.json +++ b/homeassistant/components/point/.translations/pl.json @@ -11,12 +11,12 @@ "default": "Pomy\u015blnie uwierzytelniono przy u\u017cyciu Minut dla urz\u0105dze\u0144 Point" }, "error": { - "follow_link": "Prosz\u0119 klikn\u0105\u0107 link i uwierzytelni\u0107 przed naci\u015bni\u0119ciem przycisku Prze\u015blij", + "follow_link": "Prosz\u0119 klikn\u0105\u0107 link i uwierzytelni\u0107 przed naci\u015bni\u0119ciem przycisku \"Zatwierd\u017a\"", "no_token": "Brak uwierzytelnienia za pomoc\u0105 Minut" }, "step": { "auth": { - "description": "Kliknij poni\u017cszy link i Zaakceptuj dost\u0119p do konta Minut, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Prze\u015blij poni\u017cej. \n\n [Link]({authorization_url})", + "description": "Kliknij poni\u017cszy link i Zaakceptuj dost\u0119p do konta Minut, a nast\u0119pnie wr\u00f3\u0107 i naci\u015bnij Zatwierd\u017a poni\u017cej. \n\n [Link]({authorization_url})", "title": "Uwierzytelnienie Point" }, "user": { @@ -26,7 +26,7 @@ "description": "Wybierz, kt\u00f3rego dostawc\u0119 uwierzytelnienia chcesz u\u017cywa\u0107 z Point.", "title": "Dostawca uwierzytelnienia" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pt-BR.json b/homeassistant/components/point/.translations/pt-BR.json index 8a7bff38db3b..99d65227b2b9 100644 --- a/homeassistant/components/point/.translations/pt-BR.json +++ b/homeassistant/components/point/.translations/pt-BR.json @@ -26,7 +26,7 @@ "description": "Escolha atrav\u00e9s de qual provedor de autentica\u00e7\u00e3o voc\u00ea deseja autenticar com Point.", "title": "Provedor de Autentica\u00e7\u00e3o" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pt.json b/homeassistant/components/point/.translations/pt.json index 874f0832b6c3..ea087c1af755 100644 --- a/homeassistant/components/point/.translations/pt.json +++ b/homeassistant/components/point/.translations/pt.json @@ -26,7 +26,7 @@ "description": "Escolha com qual fornecedor de autentica\u00e7\u00e3o deseja autenticar o Point.", "title": "Fornecedor de Autentica\u00e7\u00e3o" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ru.json b/homeassistant/components/point/.translations/ru.json index b0fc5a61f724..fb49b3e7fbeb 100644 --- a/homeassistant/components/point/.translations/ru.json +++ b/homeassistant/components/point/.translations/ru.json @@ -26,7 +26,7 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432\u0445\u043e\u0434.", "title": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/sl.json b/homeassistant/components/point/.translations/sl.json index bd0ac2f1218a..7f97ee23f982 100644 --- a/homeassistant/components/point/.translations/sl.json +++ b/homeassistant/components/point/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Izberite prek katerega ponudnika overjanja, ki ga \u017eelite overiti z Point-om.", "title": "Ponudnik za preverjanje pristnosti" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/sv.json b/homeassistant/components/point/.translations/sv.json index c68fd29f7fcb..26c208ef9aa2 100644 --- a/homeassistant/components/point/.translations/sv.json +++ b/homeassistant/components/point/.translations/sv.json @@ -26,7 +26,7 @@ "description": "V\u00e4lj via vilken autentiseringsleverant\u00f6r du vill autentisera med Point.", "title": "Autentiseringsleverant\u00f6r" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/zh-Hans.json b/homeassistant/components/point/.translations/zh-Hans.json index e171aedf1cee..9ce14cc2ffaa 100644 --- a/homeassistant/components/point/.translations/zh-Hans.json +++ b/homeassistant/components/point/.translations/zh-Hans.json @@ -26,7 +26,7 @@ "description": "\u9009\u62e9\u60a8\u60f3\u901a\u8fc7\u54ea\u4e2a\u6388\u6743\u63d0\u4f9b\u8005\u4e0e Point \u8fdb\u884c\u6388\u6743\u3002", "title": "\u6388\u6743\u63d0\u4f9b\u8005" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/zh-Hant.json b/homeassistant/components/point/.translations/zh-Hant.json index f1bbb1c872c3..5de597897971 100644 --- a/homeassistant/components/point/.translations/zh-Hant.json +++ b/homeassistant/components/point/.translations/zh-Hant.json @@ -26,7 +26,7 @@ "description": "\u65bc\u8a8d\u8b49\u63d0\u4f9b\u8005\u4e2d\u6311\u9078\u6240\u8981\u9032\u884c Point \u8a8d\u8b49\u63d0\u4f9b\u8005\u3002", "title": "\u8a8d\u8b49\u63d0\u4f9b\u8005" } - }, - "title": "Minut Point" - } + } + }, + "title": "Minut Point" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ca.json b/homeassistant/components/powerwall/.translations/ca.json index 6b375c93ad8e..490938462611 100644 --- a/homeassistant/components/powerwall/.translations/ca.json +++ b/homeassistant/components/powerwall/.translations/ca.json @@ -14,7 +14,7 @@ }, "title": "Connexi\u00f3 amb el Powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/de.json b/homeassistant/components/powerwall/.translations/de.json index 1a442e7fbb68..4e032a709572 100644 --- a/homeassistant/components/powerwall/.translations/de.json +++ b/homeassistant/components/powerwall/.translations/de.json @@ -14,7 +14,7 @@ }, "title": "Stellen Sie eine Verbindung zur Powerwall her" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/en.json b/homeassistant/components/powerwall/.translations/en.json index 583a88e5623d..ec46be861bf2 100644 --- a/homeassistant/components/powerwall/.translations/en.json +++ b/homeassistant/components/powerwall/.translations/en.json @@ -14,7 +14,7 @@ }, "title": "Connect to the powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/es.json b/homeassistant/components/powerwall/.translations/es.json index f0d0c6dab6cc..9e98e4a94962 100644 --- a/homeassistant/components/powerwall/.translations/es.json +++ b/homeassistant/components/powerwall/.translations/es.json @@ -14,7 +14,7 @@ }, "title": "Conectarse al powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/fr.json b/homeassistant/components/powerwall/.translations/fr.json index b907b5d429c5..376e8751505e 100644 --- a/homeassistant/components/powerwall/.translations/fr.json +++ b/homeassistant/components/powerwall/.translations/fr.json @@ -14,7 +14,7 @@ }, "title": "Connectez-vous au Powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/it.json b/homeassistant/components/powerwall/.translations/it.json index 0031ea5a9e2e..dbbaf1c372f7 100644 --- a/homeassistant/components/powerwall/.translations/it.json +++ b/homeassistant/components/powerwall/.translations/it.json @@ -14,7 +14,7 @@ }, "title": "Connessione al Powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ko.json b/homeassistant/components/powerwall/.translations/ko.json index d7fcd8bfe769..43c3560df99c 100644 --- a/homeassistant/components/powerwall/.translations/ko.json +++ b/homeassistant/components/powerwall/.translations/ko.json @@ -14,7 +14,7 @@ }, "title": "powerwall \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/lb.json b/homeassistant/components/powerwall/.translations/lb.json index c86cf73ba182..8be90459f713 100644 --- a/homeassistant/components/powerwall/.translations/lb.json +++ b/homeassistant/components/powerwall/.translations/lb.json @@ -14,7 +14,7 @@ }, "title": "Mat der Powerwall verbannen" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/no.json b/homeassistant/components/powerwall/.translations/no.json index 63ce7b0da303..7f5b3e382001 100644 --- a/homeassistant/components/powerwall/.translations/no.json +++ b/homeassistant/components/powerwall/.translations/no.json @@ -14,7 +14,7 @@ }, "title": "Koble til powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ru.json b/homeassistant/components/powerwall/.translations/ru.json index 4b162ed8c554..cfe47b199fdd 100644 --- a/homeassistant/components/powerwall/.translations/ru.json +++ b/homeassistant/components/powerwall/.translations/ru.json @@ -14,7 +14,7 @@ }, "title": "Tesla Powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/zh-Hant.json b/homeassistant/components/powerwall/.translations/zh-Hant.json index b85ce09eff13..8e80584957b7 100644 --- a/homeassistant/components/powerwall/.translations/zh-Hant.json +++ b/homeassistant/components/powerwall/.translations/zh-Hant.json @@ -14,7 +14,7 @@ }, "title": "\u9023\u7dda\u81f3 Powerwall" } - }, - "title": "Tesla Powerwall" - } + } + }, + "title": "Tesla Powerwall" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/bg.json b/homeassistant/components/ps4/.translations/bg.json index fabd9032dc0c..78a52d908727 100644 --- a/homeassistant/components/ps4/.translations/bg.json +++ b/homeassistant/components/ps4/.translations/bg.json @@ -36,7 +36,7 @@ "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u0435\u0436\u0438\u043c \u0437\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435. \u041f\u043e\u043b\u0435\u0442\u043e IP \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0438 \u043f\u0440\u0430\u0437\u043d\u043e, \u0430\u043a\u043e \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043e\u0442\u043a\u0440\u0438\u0432\u0430\u043d\u0435, \u0442\u044a\u0439 \u043a\u0430\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0442\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u043e\u0442\u043a\u0440\u0438\u0442\u0438.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ca.json b/homeassistant/components/ps4/.translations/ca.json index 166d26749341..a00f8930d5d2 100644 --- a/homeassistant/components/ps4/.translations/ca.json +++ b/homeassistant/components/ps4/.translations/ca.json @@ -36,7 +36,7 @@ "description": "Selecciona el mode de configuraci\u00f3. El camp de l'adre\u00e7a IP es pot deixar en blanc si selecciones descobriment autom\u00e0tic (els dispositius es descobriran autom\u00e0ticament).", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/cs.json b/homeassistant/components/ps4/.translations/cs.json index 5c4e67a324cf..31c94851158f 100644 --- a/homeassistant/components/ps4/.translations/cs.json +++ b/homeassistant/components/ps4/.translations/cs.json @@ -7,7 +7,7 @@ }, "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/da.json b/homeassistant/components/ps4/.translations/da.json index cef13db31508..2b97431b1a4b 100644 --- a/homeassistant/components/ps4/.translations/da.json +++ b/homeassistant/components/ps4/.translations/da.json @@ -36,7 +36,7 @@ "description": "V\u00e6lg tilstand for konfiguration. IP-adressefeltet kan v\u00e6re tomt, hvis du v\u00e6lger automatisk registrering, da enheder automatisk bliver fundet.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/de.json b/homeassistant/components/ps4/.translations/de.json index 66eaecbb548e..53c357fa8f52 100644 --- a/homeassistant/components/ps4/.translations/de.json +++ b/homeassistant/components/ps4/.translations/de.json @@ -36,7 +36,7 @@ "description": "W\u00e4hle den Modus f\u00fcr die Konfiguration aus. Das Feld IP-Adresse kann leer bleiben, wenn die automatische Erkennung ausgew\u00e4hlt wird, da Ger\u00e4te automatisch erkannt werden.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/en.json b/homeassistant/components/ps4/.translations/en.json index 756eb65d4f7c..242fbfe890fd 100644 --- a/homeassistant/components/ps4/.translations/en.json +++ b/homeassistant/components/ps4/.translations/en.json @@ -36,7 +36,7 @@ "description": "Select mode for configuration. The IP Address field can be left blank if selecting Auto Discovery, as devices will be automatically discovered.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/es-419.json b/homeassistant/components/ps4/.translations/es-419.json index 0f7066df007b..340d4742baa4 100644 --- a/homeassistant/components/ps4/.translations/es-419.json +++ b/homeassistant/components/ps4/.translations/es-419.json @@ -32,7 +32,7 @@ }, "title": "Playstation 4" } - }, - "title": "Playstation 4" - } + } + }, + "title": "Playstation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/es.json b/homeassistant/components/ps4/.translations/es.json index d2d749e4debe..45af82bfb841 100644 --- a/homeassistant/components/ps4/.translations/es.json +++ b/homeassistant/components/ps4/.translations/es.json @@ -36,7 +36,7 @@ "description": "Selecciona el modo de configuraci\u00f3n. El campo de direcci\u00f3n IP puede dejarse en blanco si se selecciona la detecci\u00f3n autom\u00e1tica, ya que los dispositivos se detectar\u00e1n autom\u00e1ticamente.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/fr.json b/homeassistant/components/ps4/.translations/fr.json index 5c49723657c3..0ce8b77e7e12 100644 --- a/homeassistant/components/ps4/.translations/fr.json +++ b/homeassistant/components/ps4/.translations/fr.json @@ -36,7 +36,7 @@ "description": "S\u00e9lectionnez le mode de configuration. Le champ Adresse IP peut rester vide si vous s\u00e9lectionnez D\u00e9couverte automatique, car les p\u00e9riph\u00e9riques seront automatiquement d\u00e9couverts.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/he.json b/homeassistant/components/ps4/.translations/he.json index d9fa42b9e470..4b25ffa00501 100644 --- a/homeassistant/components/ps4/.translations/he.json +++ b/homeassistant/components/ps4/.translations/he.json @@ -19,7 +19,7 @@ }, "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" } - }, - "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" - } + } + }, + "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/it.json b/homeassistant/components/ps4/.translations/it.json index de5eb4e5e6f3..a9afe10984bf 100644 --- a/homeassistant/components/ps4/.translations/it.json +++ b/homeassistant/components/ps4/.translations/it.json @@ -36,7 +36,7 @@ "description": "Seleziona la modalit\u00e0 per la configurazione. L'indirizzo IP pu\u00f2 essere lasciato vuoto se si seleziona Auto Discovery, poich\u00e9 i dispositivi verranno rilevati automaticamente.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ko.json b/homeassistant/components/ps4/.translations/ko.json index 46bbd6b309cd..23f58ad5bdb2 100644 --- a/homeassistant/components/ps4/.translations/ko.json +++ b/homeassistant/components/ps4/.translations/ko.json @@ -36,7 +36,7 @@ "description": "\uad6c\uc131 \ubaa8\ub4dc\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694. \uc790\ub3d9 \uac80\uc0c9\uc744 \uc120\ud0dd\ud558\uba74 \uae30\uae30\uac00 \uc790\ub3d9\uc73c\ub85c \uac80\uc0c9\ub418\ubbc0\ub85c IP \uc8fc\uc18c \ud544\ub4dc\ub294 \ube44\uc6cc\ub450\uc154\ub3c4 \ub429\ub2c8\ub2e4.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/lb.json b/homeassistant/components/ps4/.translations/lb.json index 0986b0e0240a..9cb8c51d98f9 100644 --- a/homeassistant/components/ps4/.translations/lb.json +++ b/homeassistant/components/ps4/.translations/lb.json @@ -36,7 +36,7 @@ "description": "Konfiguratioun's Modus auswielen. D'Feld IP Adress kann eidel bl\u00e9iwen wann Auto Discovery benotzt g\u00ebtt, well d'Apparaten automatesch entdeckt ginn.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/nl.json b/homeassistant/components/ps4/.translations/nl.json index 8eaa20d76cf8..3f239306ec37 100644 --- a/homeassistant/components/ps4/.translations/nl.json +++ b/homeassistant/components/ps4/.translations/nl.json @@ -36,7 +36,7 @@ "description": "Selecteer modus voor configuratie. Het veld IP-adres kan leeg blijven als Auto Discovery wordt geselecteerd, omdat apparaten automatisch worden gedetecteerd.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/nn.json b/homeassistant/components/ps4/.translations/nn.json index 86920906003e..d8a7fb302200 100644 --- a/homeassistant/components/ps4/.translations/nn.json +++ b/homeassistant/components/ps4/.translations/nn.json @@ -18,7 +18,7 @@ "mode": { "title": "Playstation 4" } - }, - "title": "Playstation 4" - } + } + }, + "title": "Playstation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/no.json b/homeassistant/components/ps4/.translations/no.json index b5db81356d03..b56efa60ac47 100644 --- a/homeassistant/components/ps4/.translations/no.json +++ b/homeassistant/components/ps4/.translations/no.json @@ -36,7 +36,7 @@ "description": "Velg modus for konfigurasjon. Feltet IP-adresse kan st\u00e5 tomt dersom du velger Auto Discovery, da enheter vil bli oppdaget automatisk.", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pl.json b/homeassistant/components/ps4/.translations/pl.json index 0770116f1c83..e9d7481bb6c0 100644 --- a/homeassistant/components/ps4/.translations/pl.json +++ b/homeassistant/components/ps4/.translations/pl.json @@ -8,14 +8,14 @@ "port_997_bind_error": "Nie mo\u017cna powi\u0105za\u0107 z portem 997." }, "error": { - "credential_timeout": "Przekroczono limit czasu us\u0142ugi po\u015bwiadcze\u0144. Naci\u015bnij przycisk Prze\u015blij, aby ponowi\u0107.", + "credential_timeout": "Przekroczono limit czasu us\u0142ugi po\u015bwiadcze\u0144. Naci\u015bnij przycisk \"Zatwierd\u017a\", aby ponowi\u0107.", "login_failed": "Nie uda\u0142o si\u0119 sparowa\u0107 z PlayStation 4. Sprawd\u017a, czy PIN jest poprawny.", "no_ipaddress": "Wprowad\u017a adres IP PlayStation 4, kt\u00f3ry chcesz skonfigurowa\u0107.", "not_ready": "PlayStation 4 nie jest w\u0142\u0105czona lub po\u0142\u0105czona z sieci\u0105." }, "step": { "creds": { - "description": "Wymagane s\u0105 po\u015bwiadczenia. Naci\u015bnij przycisk 'Prze\u015blij', a nast\u0119pnie w aplikacji PS4 Second Screen, od\u015bwie\u017c urz\u0105dzenia i wybierz urz\u0105dzenie 'Home-Assistant', aby kontynuowa\u0107.", + "description": "Wymagane s\u0105 po\u015bwiadczenia. Naci\u015bnij przycisk \"Zatwierd\u017a\", a nast\u0119pnie w aplikacji PS4 Second Screen, od\u015bwie\u017c urz\u0105dzenia i wybierz urz\u0105dzenie 'Home-Assistant', aby kontynuowa\u0107.", "title": "PlayStation 4" }, "link": { @@ -36,7 +36,7 @@ "description": "Wybierz tryb konfiguracji. Pole adresu IP mo\u017cna pozostawi\u0107 puste, je\u015bli wybierzesz opcj\u0119 Auto Discovery, poniewa\u017c urz\u0105dzenia zostan\u0105 automatycznie wykryte.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pt-BR.json b/homeassistant/components/ps4/.translations/pt-BR.json index f6a86be00916..ceab0e65a32f 100644 --- a/homeassistant/components/ps4/.translations/pt-BR.json +++ b/homeassistant/components/ps4/.translations/pt-BR.json @@ -36,7 +36,7 @@ "description": "Selecione o modo para configura\u00e7\u00e3o. O campo Endere\u00e7o IP pode ser deixado em branco se selecionar Detec\u00e7\u00e3o Autom\u00e1tica, pois os dispositivos ser\u00e3o descobertos automaticamente.", "title": "Playstation 4" } - }, - "title": "Playstation 4" - } + } + }, + "title": "Playstation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pt.json b/homeassistant/components/ps4/.translations/pt.json index 5d4c8e122830..774e6a269530 100644 --- a/homeassistant/components/ps4/.translations/pt.json +++ b/homeassistant/components/ps4/.translations/pt.json @@ -16,7 +16,7 @@ "mode": { "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ru.json b/homeassistant/components/ps4/.translations/ru.json index c7ac8d76cf16..3d0fbad5b5f9 100644 --- a/homeassistant/components/ps4/.translations/ru.json +++ b/homeassistant/components/ps4/.translations/ru.json @@ -36,7 +36,7 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041f\u043e\u043b\u0435 'IP-\u0430\u0434\u0440\u0435\u0441' \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043e 'Auto Discovery', \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/sl.json b/homeassistant/components/ps4/.translations/sl.json index f51bc45e0e80..f28083fd726f 100644 --- a/homeassistant/components/ps4/.translations/sl.json +++ b/homeassistant/components/ps4/.translations/sl.json @@ -36,7 +36,7 @@ "description": "Izberite na\u010din za konfiguracijo. IP-Naslov, polje lahko pustite prazno, \u010de izberete samodejno odkrivanje, saj bodo naprave samodejno odkrite.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/sv.json b/homeassistant/components/ps4/.translations/sv.json index a36c8e28d9e9..da010884620c 100644 --- a/homeassistant/components/ps4/.translations/sv.json +++ b/homeassistant/components/ps4/.translations/sv.json @@ -36,7 +36,7 @@ "description": "V\u00e4lj l\u00e4ge f\u00f6r konfigurering. F\u00e4ltet IP-adress kan l\u00e4mnas tomt om du v\u00e4ljer Automatisk uppt\u00e4ckt, eftersom enheter d\u00e5 kommer att identifieras automatiskt.", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/th.json b/homeassistant/components/ps4/.translations/th.json index b33002bcda85..beba04478d56 100644 --- a/homeassistant/components/ps4/.translations/th.json +++ b/homeassistant/components/ps4/.translations/th.json @@ -16,7 +16,7 @@ "mode": { "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/zh-Hans.json b/homeassistant/components/ps4/.translations/zh-Hans.json index 118226354af9..53660148d65d 100644 --- a/homeassistant/components/ps4/.translations/zh-Hans.json +++ b/homeassistant/components/ps4/.translations/zh-Hans.json @@ -26,7 +26,7 @@ "description": "\u8f93\u5165\u60a8\u7684 PlayStation 4 \u4fe1\u606f\u3002\u5bf9\u4e8e \"PIN\", \u8bf7\u5bfc\u822a\u5230 PlayStation 4 \u63a7\u5236\u53f0\u4e0a\u7684 \"\u8bbe\u7f6e\"\u3002\u7136\u540e\u5bfc\u822a\u5230 \"\u79fb\u52a8\u5e94\u7528\u8fde\u63a5\u8bbe\u7f6e\", \u7136\u540e\u9009\u62e9 \"\u6dfb\u52a0\u8bbe\u5907\"\u3002\u8f93\u5165\u663e\u793a\u7684 PIN\u3002", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/zh-Hant.json b/homeassistant/components/ps4/.translations/zh-Hant.json index 56a207064708..5d98c8370870 100644 --- a/homeassistant/components/ps4/.translations/zh-Hant.json +++ b/homeassistant/components/ps4/.translations/zh-Hant.json @@ -36,7 +36,7 @@ "description": "\u9078\u64c7\u6a21\u5f0f\u4ee5\u9032\u884c\u8a2d\u5b9a\u3002\u5047\u5982\u9078\u64c7\u81ea\u52d5\u63a2\u7d22\u6a21\u5f0f\u7684\u8a71\uff0c\u7531\u65bc\u6703\u81ea\u52d5\u9032\u884c\u8a2d\u5099\u641c\u5c0b\uff0cIP \u4f4d\u5740\u53ef\u4fdd\u7559\u70ba\u7a7a\u767d\u3002", "title": "PlayStation 4" } - }, - "title": "PlayStation 4" - } + } + }, + "title": "PlayStation 4" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json index db996c75c39b..9e3e80533928 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Aquest sensor utilitza l'API oficial de la xarxa el\u00e8ctrica espanyola (REE) per obtenir els [preus per hora de l\u2019electricitat (PVPC)](https://www.esios.ree.es/es/pvpc) a Espanya.\nPer a m\u00e9s informaci\u00f3, consulta la [documentaci\u00f3 de la integraci\u00f3](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/). \n\nSelecciona la tarifa contractada, cadascuna t\u00e9 un nombre determinat de per\u00edodes: \n - 1 per\u00edode: normal (sense discriminaci\u00f3)\n - 2 per\u00edodes: discriminaci\u00f3 (tarifa nocturna) \n - 3 per\u00edodes: cotxe el\u00e8ctric (tarifa nocturna de 3 per\u00edodes)", "title": "Selecci\u00f3 de tarifa" } - }, - "title": "Preu per hora de l'electricitat a Espanya (PVPC)" - } + } + }, + "title": "Preu per hora de l'electricitat a Espanya (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/de.json b/homeassistant/components/pvpc_hourly_pricing/.translations/de.json index 2e80e3da6e6c..341fb1afcaa5 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/de.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/de.json @@ -12,7 +12,7 @@ "description": "Dieser Sensor verwendet die offizielle API, um [st\u00fcndliche Strompreise (PVPC)] (https://www.esios.ree.es/es/pvpc) in Spanien zu erhalten. \nWeitere Informationen finden Sie in den [Integrations-Dokumentation] (https://www.home-assistant.io/integrations/pvpc_hourly_pricing/). \n\nW\u00e4hlen Sie den vertraglich vereinbarten Tarif basierend auf der Anzahl der Abrechnungsperioden pro Tag aus: \n - 1 Periode: Normal \n - 2 Perioden: Diskriminierung (Nachttarif) \n - 3 Perioden: Elektroauto (Nachttarif von 3 Perioden)", "title": "Tarifauswahl" } - }, - "title": "St\u00fcndlicher Strompreis in Spanien (PVPC)" - } + } + }, + "title": "St\u00fcndlicher Strompreis in Spanien (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/en.json b/homeassistant/components/pvpc_hourly_pricing/.translations/en.json index 86aaf15c0f12..0dac2ae5dc2e 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/en.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/en.json @@ -12,7 +12,7 @@ "description": "This sensor uses official API to get [hourly pricing of electricity (PVPC)](https://www.esios.ree.es/es/pvpc) in Spain.\nFor more precise explanation visit the [integration docs](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nSelect the contracted rate based on the number of billing periods per day:\n- 1 period: normal\n- 2 periods: discrimination (nightly rate)\n- 3 periods: electric car (nightly rate of 3 periods)", "title": "Tariff selection" } - }, - "title": "Hourly price of electricity in Spain (PVPC)" - } + } + }, + "title": "Hourly price of electricity in Spain (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/es.json b/homeassistant/components/pvpc_hourly_pricing/.translations/es.json index 8951c46b75d8..396082c057ec 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/es.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/es.json @@ -12,7 +12,7 @@ "description": "Este sensor utiliza la API oficial para obtener [el precio horario de la electricidad (PVPC)](https://www.esios.ree.es/es/pvpc) en Espa\u00f1a.\nPara obtener una explicaci\u00f3n m\u00e1s precisa, visita los [documentos de la integraci\u00f3n](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nSelecciona la tarifa contratada en funci\u00f3n del n\u00famero de per\u00edodos de facturaci\u00f3n por d\u00eda:\n- 1 per\u00edodo: normal\n- 2 per\u00edodos: discriminaci\u00f3n (tarifa nocturna)\n- 3 per\u00edodos: coche el\u00e9ctrico (tarifa nocturna de 3 per\u00edodos)", "title": "Selecci\u00f3n de tarifa" } - }, - "title": "Precio por hora de la electricidad en Espa\u00f1a (PVPC)" - } + } + }, + "title": "Precio por hora de la electricidad en Espa\u00f1a (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/it.json b/homeassistant/components/pvpc_hourly_pricing/.translations/it.json index 5e0c6acef503..cd97e4aaa3ee 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/it.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/it.json @@ -12,7 +12,7 @@ "description": "Questo sensore utilizza l'API ufficiale per ottenere [prezzi orari dell'elettricit\u00e0 (PVPC)](https://www.esios.ree.es/es/pvpc) in Spagna.\nPer una spiegazione pi\u00f9 precisa, visitare la [documentazione di integrazione](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nSelezionare la tariffa contrattuale in base al numero di periodi di fatturazione al giorno:\n- 1 periodo: normale\n- 2 periodi: discriminazione (tariffa notturna)\n- 3 periodi: auto elettrica (tariffa notturna di 3 periodi)", "title": "Selezione della tariffa" } - }, - "title": "Prezzo orario dell'elettricit\u00e0 in Spagna (PVPC)" - } + } + }, + "title": "Prezzo orario dell'elettricit\u00e0 in Spagna (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json index e2bd6caaa8d6..d9b547e8fe71 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json @@ -12,7 +12,7 @@ "description": "\uc774 \uc13c\uc11c\ub294 \uacf5\uc2dd API \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2a4\ud398\uc778\uc758 [\uc2dc\uac04\ub2f9 \uc804\uae30 \uc694\uae08 (PVPC)](https://www.esios.ree.es/es/pvpc) \uc744 \uac00\uc838\uc635\ub2c8\ub2e4.\n\ubcf4\ub2e4 \uc790\uc138\ud55c \uc124\uba85\uc740 [\uc548\ub0b4](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/)\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694.\n\n1\uc77c\ub2f9 \uccad\uad6c \uad6c\uac04\uc5d0 \ub530\ub77c \uacc4\uc57d \uc694\uae08\uc81c\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694.\n - 1 \uad6c\uac04: \uc77c\ubc18 \uc694\uae08\uc81c\n - 2 \uad6c\uac04: \ucc28\ub4f1 \uc694\uae08\uc81c (\uc57c\uac04 \uc694\uae08) \n - 3 \uad6c\uac04: \uc804\uae30\uc790\ub3d9\ucc28 (3 \uad6c\uac04 \uc57c\uac04 \uc694\uae08)", "title": "\uc694\uae08\uc81c \uc120\ud0dd" } - }, - "title": "\uc2a4\ud398\uc778 \uc2dc\uac04\ub2f9 \uc804\uae30\uc694\uae08 (PVPC)" - } + } + }, + "title": "\uc2a4\ud398\uc778 \uc2dc\uac04\ub2f9 \uc804\uae30\uc694\uae08 (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json b/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json index bed6af70e137..32871a64c306 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json @@ -12,7 +12,7 @@ "description": "D\u00ebse Sensor benotzt d\u00e9i offiziell API fir de [Stonne Pr\u00e4is fir Elektrizit\u00e9it a Spuenien (PVPC)](https://www.esios.ree.es/es/pvpc) ze kr\u00e9ien. Fir m\u00e9i pr\u00e4zise Erkl\u00e4runge kuck [Dokumentatioun vun der Integratioun](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nWiel den Taux bas\u00e9ierend op der Unzuel vun de Rechnungsz\u00e4ite pro Dag aus:\n- 1 Period: Normal\n- 2 perioden: Nuets Tarif\n- 3 Perioden: Elektreschen Auto (Nuets Tarif fir 3 Perioden)", "title": "Auswiel vum Tarif" } - }, - "title": "Stonne Pr\u00e4is fir Elektrizit\u00e9it a Spuenien (PVPC)" - } + } + }, + "title": "Stonne Pr\u00e4is fir Elektrizit\u00e9it a Spuenien (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/no.json b/homeassistant/components/pvpc_hourly_pricing/.translations/no.json index 0a7f93dda8aa..04cb6dc6ee61 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/no.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/no.json @@ -12,7 +12,7 @@ "description": "Denne sensoren bruker offisiell API for \u00e5 f\u00e5 [timeprising av elektrisitet (PVPC)](https://www.esios.ree.es/es/pvpc) i Spania.\nFor mer presis forklaring, bes\u00f8k [integrasjonsdokumenter](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nVelg den avtalte satsen basert p\u00e5 antall faktureringsperioder per dag:\n- 1 periode: normal\n- 2 perioder: diskriminering (nattlig rate)\n- 3 perioder: elbil (per natt rate p\u00e5 3 perioder)", "title": "Tariffvalg" } - }, - "title": "Timepris p\u00e5 elektrisitet i Spania (PVPC)" - } + } + }, + "title": "Timepris p\u00e5 elektrisitet i Spania (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json index aaa10fa21b75..e8911d78e930 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json @@ -12,7 +12,7 @@ "description": "\u042d\u0442\u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f [\u043f\u043e\u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0446\u0435\u043d\u044b \u0437\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u044d\u043d\u0435\u0440\u0433\u0438\u044e (PVPC)](https://www.esios.ree.es/es/pvpc) \u0432 \u0418\u0441\u043f\u0430\u043d\u0438\u0438.\n\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\n\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0430\u0440\u0438\u0444, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u0432 \u0432 \u0434\u0435\u043d\u044c:\n- 1 \u043f\u0435\u0440\u0438\u043e\u0434: normal\n- 2 \u043f\u0435\u0440\u0438\u043e\u0434\u0430: discrimination (nightly rate)\n- 3 \u043f\u0435\u0440\u0438\u043e\u0434\u0430: electric car (nightly rate of 3 periods)", "title": "\u0412\u044b\u0431\u043e\u0440 \u0442\u0430\u0440\u0438\u0444\u0430" } - }, - "title": "\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0432 \u0418\u0441\u043f\u0430\u043d\u0438\u0438 (PVPC)" - } + } + }, + "title": "\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0432 \u0418\u0441\u043f\u0430\u043d\u0438\u0438 (PVPC)" } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json b/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json index a10c499dd596..e31ee2373a4d 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u6b64\u50b3\u611f\u5668\u4f7f\u7528\u4e86\u975e\u5b98\u65b9 API \u4ee5\u53d6\u5f97\u897f\u73ed\u7259 [\u8a08\u6642\u96fb\u50f9\uff08PVPC\uff09](https://www.esios.ree.es/es/pvpc)\u3002\n\u95dc\u65bc\u66f4\u8a73\u7d30\u7684\u8aaa\u660e\uff0c\u8acb\u53c3\u95b1 [\u6574\u5408\u6587\u4ef6](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/)\u3002\n\n\u57fa\u65bc\u6bcf\u5929\u7684\u5e33\u55ae\u9031\u671f\u9078\u64c7\u5408\u7d04\u8cbb\u7387\uff1a\n- 1 \u9031\u671f\uff1a\u4e00\u822c\n- 2 \u9031\u671f\uff1a\u5dee\u5225\u8cbb\u7387\uff08\u591c\u9593\u8cbb\u7387\uff09\n- 3 \u9031\u671f\uff1a\u96fb\u52d5\u8eca\uff08\u591c\u9593\u8cbb\u7387 3 \u9031\u671f\uff09", "title": "\u8cbb\u7387\u9078\u64c7" } - }, - "title": "\u897f\u73ed\u7259\u6642\u8a08\u96fb\u50f9\uff08PVPC\uff09" - } + } + }, + "title": "\u897f\u73ed\u7259\u6642\u8a08\u96fb\u50f9\uff08PVPC\uff09" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ca.json b/homeassistant/components/rachio/.translations/ca.json index 468ab0b3f5c2..d638cf5e54a9 100644 --- a/homeassistant/components/rachio/.translations/ca.json +++ b/homeassistant/components/rachio/.translations/ca.json @@ -16,8 +16,7 @@ "description": "Necessitar\u00e0s la clau API de https://app.rach.io/. Selecciona 'Configuraci\u00f3 del compte' (Account Settings) i, a continuaci\u00f3, clica 'Obtenir clau API' (GET API KEY).", "title": "Connexi\u00f3 amb dispositiu Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/de.json b/homeassistant/components/rachio/.translations/de.json index 05bf5fbe4dd3..523e2fc025fd 100644 --- a/homeassistant/components/rachio/.translations/de.json +++ b/homeassistant/components/rachio/.translations/de.json @@ -16,8 +16,7 @@ "description": "Sie ben\u00f6tigen den API-Schl\u00fcssel von https://app.rach.io/. W\u00e4hlen Sie \"Kontoeinstellungen\" und klicken Sie dann auf \"API-SCHL\u00dcSSEL ERHALTEN\".", "title": "Stellen Sie eine Verbindung zu Ihrem Rachio-Ger\u00e4t her" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/en.json b/homeassistant/components/rachio/.translations/en.json index bc87c3700686..d02d1a45d184 100644 --- a/homeassistant/components/rachio/.translations/en.json +++ b/homeassistant/components/rachio/.translations/en.json @@ -16,8 +16,7 @@ "description": "You will need the API Key from https://app.rach.io/. Select 'Account Settings, and then click on 'GET API KEY'.", "title": "Connect to your Rachio device" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/es.json b/homeassistant/components/rachio/.translations/es.json index e938c78677ec..05c291e9d13d 100644 --- a/homeassistant/components/rachio/.translations/es.json +++ b/homeassistant/components/rachio/.translations/es.json @@ -16,8 +16,7 @@ "description": "Necesitar\u00e1s la clave API de https://app.rach.io/. Selecciona 'Account Settings' y luego haz clic en 'GET API KEY'.", "title": "Conectar a tu dispositivo Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/fr.json b/homeassistant/components/rachio/.translations/fr.json index a7fd606b3106..ea2b760cb9ce 100644 --- a/homeassistant/components/rachio/.translations/fr.json +++ b/homeassistant/components/rachio/.translations/fr.json @@ -16,8 +16,7 @@ "description": "Vous aurez besoin de la cl\u00e9 API de https://app.rach.io/. S\u00e9lectionnez \"Param\u00e8tres du compte, puis cliquez sur \"GET API KEY \".", "title": "Connectez-vous \u00e0 votre appareil Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/it.json b/homeassistant/components/rachio/.translations/it.json index fe05d236e8a8..96d6cec104f1 100644 --- a/homeassistant/components/rachio/.translations/it.json +++ b/homeassistant/components/rachio/.translations/it.json @@ -16,8 +16,7 @@ "description": "\u00c8 necessaria la chiave API di https://app.rach.io/. Selezionare 'Impostazioni Account', quindi fare clic su 'GET API KEY'.", "title": "Connettiti al tuo dispositivo Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ko.json b/homeassistant/components/rachio/.translations/ko.json index d52aac4bf4a3..373a30c435a2 100644 --- a/homeassistant/components/rachio/.translations/ko.json +++ b/homeassistant/components/rachio/.translations/ko.json @@ -16,8 +16,7 @@ "description": "https://app.rach.io/ \uc758 API \ud0a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uacc4\uc815 \uc124\uc815\uc744 \uc120\ud0dd\ud55c \ub2e4\uc74c 'GET API KEY ' \ub97c \ud074\ub9ad\ud574\uc8fc\uc138\uc694.", "title": "Rachio \uae30\uae30\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/lb.json b/homeassistant/components/rachio/.translations/lb.json index d43d4d9a044e..b2abd3fb201e 100644 --- a/homeassistant/components/rachio/.translations/lb.json +++ b/homeassistant/components/rachio/.translations/lb.json @@ -16,8 +16,7 @@ "description": "Du brauchs een API Schl\u00ebssel vun https://app.rach.io/. Wiel 'Account Settings', a klick dann op 'GET API KEY'.", "title": "Mam Rachio Apparat verbannen" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/no.json b/homeassistant/components/rachio/.translations/no.json index 8b0630188793..06fe7d4117ed 100644 --- a/homeassistant/components/rachio/.translations/no.json +++ b/homeassistant/components/rachio/.translations/no.json @@ -16,8 +16,7 @@ "description": "Du trenger API-n\u00f8kkelen fra https://app.rach.io/. Velg \"Kontoinnstillinger\", og klikk deretter p\u00e5 \"GET API KEY\".", "title": "Koble til Rachio-enheten din" } - }, - "title": "" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/pl.json b/homeassistant/components/rachio/.translations/pl.json index 3c07ea850c0f..789893b5974d 100644 --- a/homeassistant/components/rachio/.translations/pl.json +++ b/homeassistant/components/rachio/.translations/pl.json @@ -16,8 +16,7 @@ "description": "B\u0119dziesz potrzebowa\u0142 klucza API ze strony https://app.rach.io/. Wybierz 'Account Settings', a nast\u0119pnie kliknij 'GET API KEY'.", "title": "Po\u0142\u0105czenie z urz\u0105dzeniem Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ru.json b/homeassistant/components/rachio/.translations/ru.json index cb97cdac9dca..6d51f68a4d31 100644 --- a/homeassistant/components/rachio/.translations/ru.json +++ b/homeassistant/components/rachio/.translations/ru.json @@ -16,8 +16,7 @@ "description": "\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u044e\u0447 API \u043e\u0442 https://app.rach.io/. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 'Account Settings', \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 'GET API KEY'.", "title": "Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/sl.json b/homeassistant/components/rachio/.translations/sl.json index 80e5f3ff99c2..f7a6b7ea6269 100644 --- a/homeassistant/components/rachio/.translations/sl.json +++ b/homeassistant/components/rachio/.translations/sl.json @@ -16,8 +16,7 @@ "description": "Potrebovali boste API klju\u010d iz https://app.rach.io/. Izberite ' nastavitve ra\u010duna in kliknite 'get API KEY'.", "title": "Pove\u017eite se z napravo Rachio" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/zh-Hant.json b/homeassistant/components/rachio/.translations/zh-Hant.json index 86338633f7a6..ac162b546f4c 100644 --- a/homeassistant/components/rachio/.translations/zh-Hant.json +++ b/homeassistant/components/rachio/.translations/zh-Hant.json @@ -16,8 +16,7 @@ "description": "\u5c07\u6703\u9700\u8981\u7531 https://app.rach.io/ \u53d6\u5f97 App \u5bc6\u9470\u3002\u9078\u64c7\u5e33\u865f\u8a2d\u5b9a\uff08Account Settings\uff09\u3001\u4e26\u9078\u64c7\u7372\u5f97\u5bc6\u9470\uff08GET API KEY\uff09\u3002", "title": "\u9023\u7dda\u81f3 Rachio \u8a2d\u5099" } - }, - "title": "Rachio" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Rachio" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/bg.json b/homeassistant/components/rainmachine/.translations/bg.json index 03f0fe0e2098..6aecb4703dca 100644 --- a/homeassistant/components/rainmachine/.translations/bg.json +++ b/homeassistant/components/rainmachine/.translations/bg.json @@ -13,7 +13,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ca.json b/homeassistant/components/rainmachine/.translations/ca.json index 494b1ecc69cd..f21909d21cb8 100644 --- a/homeassistant/components/rainmachine/.translations/ca.json +++ b/homeassistant/components/rainmachine/.translations/ca.json @@ -16,7 +16,7 @@ }, "title": "Introdueix la teva informaci\u00f3" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/cs.json b/homeassistant/components/rainmachine/.translations/cs.json index 919956b8c34c..010dc5ca95ad 100644 --- a/homeassistant/components/rainmachine/.translations/cs.json +++ b/homeassistant/components/rainmachine/.translations/cs.json @@ -13,7 +13,7 @@ }, "title": "Vypl\u0148te va\u0161e \u00fadaje" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/da.json b/homeassistant/components/rainmachine/.translations/da.json index fe53a86993d3..3fd8027fabad 100644 --- a/homeassistant/components/rainmachine/.translations/da.json +++ b/homeassistant/components/rainmachine/.translations/da.json @@ -16,7 +16,7 @@ }, "title": "Udfyld dine oplysninger" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/de.json b/homeassistant/components/rainmachine/.translations/de.json index 257a0908c6a2..385fae5edd5c 100644 --- a/homeassistant/components/rainmachine/.translations/de.json +++ b/homeassistant/components/rainmachine/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Informationen eingeben" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/en.json b/homeassistant/components/rainmachine/.translations/en.json index 4ad5bfd7c0db..a753548a77e1 100644 --- a/homeassistant/components/rainmachine/.translations/en.json +++ b/homeassistant/components/rainmachine/.translations/en.json @@ -16,7 +16,7 @@ }, "title": "Fill in your information" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/es-419.json b/homeassistant/components/rainmachine/.translations/es-419.json index 2cb49dc0ac10..793069852005 100644 --- a/homeassistant/components/rainmachine/.translations/es-419.json +++ b/homeassistant/components/rainmachine/.translations/es-419.json @@ -13,7 +13,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/es.json b/homeassistant/components/rainmachine/.translations/es.json index 518ff39f8bf3..8375483af063 100644 --- a/homeassistant/components/rainmachine/.translations/es.json +++ b/homeassistant/components/rainmachine/.translations/es.json @@ -16,7 +16,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/fr.json b/homeassistant/components/rainmachine/.translations/fr.json index 48ae0c049c2f..b5918917e330 100644 --- a/homeassistant/components/rainmachine/.translations/fr.json +++ b/homeassistant/components/rainmachine/.translations/fr.json @@ -16,7 +16,7 @@ }, "title": "Veuillez saisir vos informations" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/hu.json b/homeassistant/components/rainmachine/.translations/hu.json index d95ec9eaa1b5..fda712f0ba91 100644 --- a/homeassistant/components/rainmachine/.translations/hu.json +++ b/homeassistant/components/rainmachine/.translations/hu.json @@ -13,7 +13,7 @@ }, "title": "T\u00f6ltsd ki az adataid" } - }, - "title": "Rainmachine" - } + } + }, + "title": "Rainmachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/it.json b/homeassistant/components/rainmachine/.translations/it.json index e0bdd7a2e1d4..a8f1a65a3661 100644 --- a/homeassistant/components/rainmachine/.translations/it.json +++ b/homeassistant/components/rainmachine/.translations/it.json @@ -16,7 +16,7 @@ }, "title": "Inserisci i tuoi dati" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ko.json b/homeassistant/components/rainmachine/.translations/ko.json index 66d6cb0b7407..121d885c9fa3 100644 --- a/homeassistant/components/rainmachine/.translations/ko.json +++ b/homeassistant/components/rainmachine/.translations/ko.json @@ -16,7 +16,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/lb.json b/homeassistant/components/rainmachine/.translations/lb.json index be25e92080ac..6debf4ffb847 100644 --- a/homeassistant/components/rainmachine/.translations/lb.json +++ b/homeassistant/components/rainmachine/.translations/lb.json @@ -16,7 +16,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/nl.json b/homeassistant/components/rainmachine/.translations/nl.json index 2e1e62c683c0..2f6e4e14bf80 100644 --- a/homeassistant/components/rainmachine/.translations/nl.json +++ b/homeassistant/components/rainmachine/.translations/nl.json @@ -13,7 +13,7 @@ }, "title": "Vul uw gegevens in" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/nn.json b/homeassistant/components/rainmachine/.translations/nn.json index 14b3c7e4dc48..3aabaabc3d66 100644 --- a/homeassistant/components/rainmachine/.translations/nn.json +++ b/homeassistant/components/rainmachine/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "RainMachine" - } + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/no.json b/homeassistant/components/rainmachine/.translations/no.json index 34b74f56c493..7e36e6dd4f1b 100644 --- a/homeassistant/components/rainmachine/.translations/no.json +++ b/homeassistant/components/rainmachine/.translations/no.json @@ -16,7 +16,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pl.json b/homeassistant/components/rainmachine/.translations/pl.json index 5e813243f134..01e43f011cda 100644 --- a/homeassistant/components/rainmachine/.translations/pl.json +++ b/homeassistant/components/rainmachine/.translations/pl.json @@ -16,7 +16,7 @@ }, "title": "Wprowad\u017a dane" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pt-BR.json b/homeassistant/components/rainmachine/.translations/pt-BR.json index 8fdf05bd3c6c..1654b40f9b93 100644 --- a/homeassistant/components/rainmachine/.translations/pt-BR.json +++ b/homeassistant/components/rainmachine/.translations/pt-BR.json @@ -13,7 +13,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pt.json b/homeassistant/components/rainmachine/.translations/pt.json index 12e77ed8e462..6dc636f9af59 100644 --- a/homeassistant/components/rainmachine/.translations/pt.json +++ b/homeassistant/components/rainmachine/.translations/pt.json @@ -13,7 +13,7 @@ }, "title": "Preencha as suas informa\u00e7\u00f5es" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ru.json b/homeassistant/components/rainmachine/.translations/ru.json index e1bce5874e37..229db9e6b1ee 100644 --- a/homeassistant/components/rainmachine/.translations/ru.json +++ b/homeassistant/components/rainmachine/.translations/ru.json @@ -16,7 +16,7 @@ }, "title": "RainMachine" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/sl.json b/homeassistant/components/rainmachine/.translations/sl.json index 68c466150f11..ae13a03b08b8 100644 --- a/homeassistant/components/rainmachine/.translations/sl.json +++ b/homeassistant/components/rainmachine/.translations/sl.json @@ -16,7 +16,7 @@ }, "title": "Izpolnite svoje podatke" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/sv.json b/homeassistant/components/rainmachine/.translations/sv.json index 864c11054462..985f2cbfce1d 100644 --- a/homeassistant/components/rainmachine/.translations/sv.json +++ b/homeassistant/components/rainmachine/.translations/sv.json @@ -16,7 +16,7 @@ }, "title": "Fyll i dina uppgifter" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/zh-Hans.json b/homeassistant/components/rainmachine/.translations/zh-Hans.json index f3d8308fabf1..ac2a895f7b42 100644 --- a/homeassistant/components/rainmachine/.translations/zh-Hans.json +++ b/homeassistant/components/rainmachine/.translations/zh-Hans.json @@ -13,7 +13,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/zh-Hant.json b/homeassistant/components/rainmachine/.translations/zh-Hant.json index 3d9663a9a792..9c27fa443a4f 100644 --- a/homeassistant/components/rainmachine/.translations/zh-Hant.json +++ b/homeassistant/components/rainmachine/.translations/zh-Hant.json @@ -16,7 +16,7 @@ }, "title": "\u586b\u5beb\u8cc7\u8a0a" } - }, - "title": "RainMachine" - } + } + }, + "title": "RainMachine" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ca.json b/homeassistant/components/ring/.translations/ca.json index c25bdb22eee0..77e8a7db602b 100644 --- a/homeassistant/components/ring/.translations/ca.json +++ b/homeassistant/components/ring/.translations/ca.json @@ -21,7 +21,7 @@ }, "title": "Inici de sessi\u00f3 amb un compte de Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/da.json b/homeassistant/components/ring/.translations/da.json index 45aebd1ebd5d..983bdf0a802d 100644 --- a/homeassistant/components/ring/.translations/da.json +++ b/homeassistant/components/ring/.translations/da.json @@ -21,7 +21,7 @@ }, "title": "Log ind med Ring-konto" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/de.json b/homeassistant/components/ring/.translations/de.json index ca49bcef95f0..ce7938ac7051 100644 --- a/homeassistant/components/ring/.translations/de.json +++ b/homeassistant/components/ring/.translations/de.json @@ -21,7 +21,7 @@ }, "title": "Anmeldung mit Ring-Konto" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/en.json b/homeassistant/components/ring/.translations/en.json index 54caa8f96e77..b30711c49c59 100644 --- a/homeassistant/components/ring/.translations/en.json +++ b/homeassistant/components/ring/.translations/en.json @@ -21,7 +21,7 @@ }, "title": "Sign-in with Ring account" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/es.json b/homeassistant/components/ring/.translations/es.json index f5598c56d70f..e9133de022fe 100644 --- a/homeassistant/components/ring/.translations/es.json +++ b/homeassistant/components/ring/.translations/es.json @@ -21,7 +21,7 @@ }, "title": "Iniciar sesi\u00f3n con cuenta de Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/fr.json b/homeassistant/components/ring/.translations/fr.json index c0397692bda6..bd53ba0d4802 100644 --- a/homeassistant/components/ring/.translations/fr.json +++ b/homeassistant/components/ring/.translations/fr.json @@ -21,7 +21,7 @@ }, "title": "Connectez-vous avec votre compte Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/hu.json b/homeassistant/components/ring/.translations/hu.json index 578399c8152f..08d8ed78d2cc 100644 --- a/homeassistant/components/ring/.translations/hu.json +++ b/homeassistant/components/ring/.translations/hu.json @@ -21,7 +21,7 @@ }, "title": "Bejelentkez\u00e9s a Ring fi\u00f3kkal" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/it.json b/homeassistant/components/ring/.translations/it.json index 2e50ee0d5833..8ea41520343f 100644 --- a/homeassistant/components/ring/.translations/it.json +++ b/homeassistant/components/ring/.translations/it.json @@ -21,7 +21,7 @@ }, "title": "Accedi con l'account Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ko.json b/homeassistant/components/ring/.translations/ko.json index f566fb592d2a..c894277abd0d 100644 --- a/homeassistant/components/ring/.translations/ko.json +++ b/homeassistant/components/ring/.translations/ko.json @@ -21,7 +21,7 @@ }, "title": "Ring \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/lb.json b/homeassistant/components/ring/.translations/lb.json index d004655eebc0..42267f3b8fc1 100644 --- a/homeassistant/components/ring/.translations/lb.json +++ b/homeassistant/components/ring/.translations/lb.json @@ -21,7 +21,7 @@ }, "title": "Mam Ring Kont verbannen" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/nl.json b/homeassistant/components/ring/.translations/nl.json index 70736b15a9cc..2091ed0b96a9 100644 --- a/homeassistant/components/ring/.translations/nl.json +++ b/homeassistant/components/ring/.translations/nl.json @@ -21,7 +21,7 @@ }, "title": "Aanmelden met Ring-account" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/no.json b/homeassistant/components/ring/.translations/no.json index bd8699a3617f..8bf764ef2240 100644 --- a/homeassistant/components/ring/.translations/no.json +++ b/homeassistant/components/ring/.translations/no.json @@ -21,7 +21,7 @@ }, "title": "Logg p\u00e5 med din Ring-konto" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/pl.json b/homeassistant/components/ring/.translations/pl.json index e592522c43b3..b44d707b476c 100644 --- a/homeassistant/components/ring/.translations/pl.json +++ b/homeassistant/components/ring/.translations/pl.json @@ -21,7 +21,7 @@ }, "title": "Zaloguj si\u0119 do konta Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ru.json b/homeassistant/components/ring/.translations/ru.json index 905f23845a9a..82d6644c449b 100644 --- a/homeassistant/components/ring/.translations/ru.json +++ b/homeassistant/components/ring/.translations/ru.json @@ -21,7 +21,7 @@ }, "title": "Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/sl.json b/homeassistant/components/ring/.translations/sl.json index 58e86634312b..d69f926bb014 100644 --- a/homeassistant/components/ring/.translations/sl.json +++ b/homeassistant/components/ring/.translations/sl.json @@ -21,7 +21,7 @@ }, "title": "Prijava s ra\u010dunom Ring" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/sv.json b/homeassistant/components/ring/.translations/sv.json index e92790740fbd..a31cbc42b7ec 100644 --- a/homeassistant/components/ring/.translations/sv.json +++ b/homeassistant/components/ring/.translations/sv.json @@ -21,7 +21,7 @@ }, "title": "Logga in med Ring-konto" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/zh-Hant.json b/homeassistant/components/ring/.translations/zh-Hant.json index 8ba71cab4908..05b83631a916 100644 --- a/homeassistant/components/ring/.translations/zh-Hant.json +++ b/homeassistant/components/ring/.translations/zh-Hant.json @@ -21,7 +21,7 @@ }, "title": "\u4ee5 Ring \u5e33\u865f\u767b\u5165" } - }, - "title": "Ring" - } + } + }, + "title": "Ring" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ca.json b/homeassistant/components/roku/.translations/ca.json index 3f9897784f98..4ea988465bf2 100644 --- a/homeassistant/components/roku/.translations/ca.json +++ b/homeassistant/components/roku/.translations/ca.json @@ -20,7 +20,7 @@ "description": "Introdueix la teva informaci\u00f3 de Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/de.json b/homeassistant/components/roku/.translations/de.json index 3954d9d549dc..7f30d92a63ff 100644 --- a/homeassistant/components/roku/.translations/de.json +++ b/homeassistant/components/roku/.translations/de.json @@ -24,7 +24,7 @@ "description": "Geben Sie Ihre Roku-Informationen ein.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/en.json b/homeassistant/components/roku/.translations/en.json index 30c53e1d89e0..c3b79973c7b0 100644 --- a/homeassistant/components/roku/.translations/en.json +++ b/homeassistant/components/roku/.translations/en.json @@ -20,7 +20,7 @@ "description": "Enter your Roku information.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/es.json b/homeassistant/components/roku/.translations/es.json index ffa850f6ebe0..f6bc4cbd438d 100644 --- a/homeassistant/components/roku/.translations/es.json +++ b/homeassistant/components/roku/.translations/es.json @@ -20,7 +20,7 @@ "description": "Introduce tu informaci\u00f3n de Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/fr.json b/homeassistant/components/roku/.translations/fr.json index a76f68f2f616..073efa65f46f 100644 --- a/homeassistant/components/roku/.translations/fr.json +++ b/homeassistant/components/roku/.translations/fr.json @@ -20,7 +20,7 @@ "description": "Entrez vos informations Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/it.json b/homeassistant/components/roku/.translations/it.json index c530504c6eca..710f8a003d75 100644 --- a/homeassistant/components/roku/.translations/it.json +++ b/homeassistant/components/roku/.translations/it.json @@ -24,7 +24,7 @@ "description": "Inserisci le tue informazioni Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ko.json b/homeassistant/components/roku/.translations/ko.json index d7cad509da13..b41e1a3d8b72 100644 --- a/homeassistant/components/roku/.translations/ko.json +++ b/homeassistant/components/roku/.translations/ko.json @@ -20,7 +20,7 @@ "description": "Roku \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/lb.json b/homeassistant/components/roku/.translations/lb.json index da6136334ce5..2130d13031fa 100644 --- a/homeassistant/components/roku/.translations/lb.json +++ b/homeassistant/components/roku/.translations/lb.json @@ -24,7 +24,7 @@ "description": "F\u00ebll d\u00e9ng Roku Informatiounen aus.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/no.json b/homeassistant/components/roku/.translations/no.json index df56aa5d35d6..e9254635a3f8 100644 --- a/homeassistant/components/roku/.translations/no.json +++ b/homeassistant/components/roku/.translations/no.json @@ -20,7 +20,7 @@ "description": "Skriv inn Roku-informasjonen din.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/pl.json b/homeassistant/components/roku/.translations/pl.json index b92aab58df61..92e7bbd796b9 100644 --- a/homeassistant/components/roku/.translations/pl.json +++ b/homeassistant/components/roku/.translations/pl.json @@ -25,7 +25,7 @@ "description": "Wprowad\u017a dane Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ru.json b/homeassistant/components/roku/.translations/ru.json index 0db5f9718aa1..991882ac875a 100644 --- a/homeassistant/components/roku/.translations/ru.json +++ b/homeassistant/components/roku/.translations/ru.json @@ -20,7 +20,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e Roku.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/sl.json b/homeassistant/components/roku/.translations/sl.json index 0745151cb0aa..ce43bbbcd208 100644 --- a/homeassistant/components/roku/.translations/sl.json +++ b/homeassistant/components/roku/.translations/sl.json @@ -26,7 +26,7 @@ "description": "Vnesite va\u0161e Roku podatke.", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/zh-Hant.json b/homeassistant/components/roku/.translations/zh-Hant.json index 529fcb604c7b..1dd9688b332c 100644 --- a/homeassistant/components/roku/.translations/zh-Hant.json +++ b/homeassistant/components/roku/.translations/zh-Hant.json @@ -20,7 +20,7 @@ "description": "\u8f38\u5165 Roku \u8cc7\u8a0a\u3002", "title": "Roku" } - }, - "title": "Roku" - } + } + }, + "title": "Roku" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/ca.json b/homeassistant/components/roomba/.translations/ca.json index df142bdb31c5..da9de46dc935 100644 --- a/homeassistant/components/roomba/.translations/ca.json +++ b/homeassistant/components/roomba/.translations/ca.json @@ -17,8 +17,7 @@ "description": "Actualment la recuperaci\u00f3 de BLID i la contrasenya \u00e9s un proc\u00e9s manual. Segueix els passos de la documentaci\u00f3 a: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", "title": "Connexi\u00f3 amb el dispositiu" } - }, - "title": "Roomba iRobot" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "Roomba iRobot" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/de.json b/homeassistant/components/roomba/.translations/de.json index 0f6e767f345a..1c85587acc82 100644 --- a/homeassistant/components/roomba/.translations/de.json +++ b/homeassistant/components/roomba/.translations/de.json @@ -16,8 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zum Ger\u00e4t her" } - }, - "title": "iRobot Roomba" + } }, "options": { "step": { @@ -28,5 +27,6 @@ } } } - } + }, + "title": "iRobot Roomba" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/en.json b/homeassistant/components/roomba/.translations/en.json index b8828c9c1c2b..5d6d5200569a 100644 --- a/homeassistant/components/roomba/.translations/en.json +++ b/homeassistant/components/roomba/.translations/en.json @@ -17,8 +17,7 @@ "description": "Currently retrieving the BLID and password is a manual process. Please follow the steps outlined in the documentation at: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", "title": "Connect to the device" } - }, - "title": "iRobot Roomba" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "iRobot Roomba" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/es.json b/homeassistant/components/roomba/.translations/es.json index a74d2c04507b..2c51f1d15c15 100644 --- a/homeassistant/components/roomba/.translations/es.json +++ b/homeassistant/components/roomba/.translations/es.json @@ -17,8 +17,7 @@ "description": "Actualmente recuperar el BLID y la contrase\u00f1a es un proceso manual. Sigue los pasos descritos en la documentaci\u00f3n en: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", "title": "Conectarse al dispositivo" } - }, - "title": "iRobot Roomba" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "iRobot Roomba" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/no.json b/homeassistant/components/roomba/.translations/no.json new file mode 100644 index 000000000000..5217518cdf0c --- /dev/null +++ b/homeassistant/components/roomba/.translations/no.json @@ -0,0 +1,33 @@ +{ + "config": { + "error": { + "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "blid": "Blid", + "certificate": "Sertifikat", + "continuous": "Kontinuerlige", + "delay": "Forsinkelse", + "host": "Vertsnavn eller IP-adresse", + "password": "Passord" + }, + "description": "Henting av BLID og passord er en manuell prosess. F\u00f8lg trinnene som er beskrevet i dokumentasjonen p\u00e5: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Koble til enheten" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Kontinuerlige", + "delay": "Forsinkelse" + } + } + } + }, + "title": "iRobot Roomba" +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/ru.json b/homeassistant/components/roomba/.translations/ru.json index 066de6d54837..1ac6ad5996ec 100644 --- a/homeassistant/components/roomba/.translations/ru.json +++ b/homeassistant/components/roomba/.translations/ru.json @@ -17,8 +17,7 @@ "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c BLID \u0438 \u043f\u0430\u0440\u043e\u043b\u044c:\nhttps://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" } - }, - "title": "iRobot Roomba" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "iRobot Roomba" } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/zh-Hant.json b/homeassistant/components/roomba/.translations/zh-Hant.json index a776c8876d1b..2caa4455a91a 100644 --- a/homeassistant/components/roomba/.translations/zh-Hant.json +++ b/homeassistant/components/roomba/.translations/zh-Hant.json @@ -17,8 +17,7 @@ "description": "\u76ee\u524d\u63a5\u6536 BLID \u8207\u5bc6\u78bc\u70ba\u624b\u52d5\u904e\u7a0b\u3002\u8acb\u53c3\u95b1\u4ee5\u4e0b\u6587\u4ef6\u7684\u6b65\u9a5f\u9032\u884c\u8a2d\u5b9a\uff1ahttps://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", "title": "\u9023\u7dda\u81f3\u8a2d\u5099" } - }, - "title": "iRobot Roomba" + } }, "options": { "step": { @@ -29,5 +28,6 @@ } } } - } + }, + "title": "iRobot Roomba" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ca.json b/homeassistant/components/samsungtv/.translations/ca.json index a742cc546b88..0506560e61cc 100644 --- a/homeassistant/components/samsungtv/.translations/ca.json +++ b/homeassistant/components/samsungtv/.translations/ca.json @@ -21,7 +21,7 @@ "description": "Introdeix les dades de la Samsung TV. Si mai abans l'has connectat a Home Assistant haur\u00edes de veure una finestra emergent demanant autenticaci\u00f3.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/da.json b/homeassistant/components/samsungtv/.translations/da.json index 7a6b5540c59f..9b20b711554f 100644 --- a/homeassistant/components/samsungtv/.translations/da.json +++ b/homeassistant/components/samsungtv/.translations/da.json @@ -21,7 +21,7 @@ "description": "Indtast dine Samsung-tv-oplysninger. Hvis du aldrig har oprettet forbindelse til Home Assistant f\u00f8r, b\u00f8r du se en popup p\u00e5 dit tv, der beder om godkendelse.", "title": "Samsung-tv" } - }, - "title": "Samsung-tv" - } + } + }, + "title": "Samsung-tv" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/de.json b/homeassistant/components/samsungtv/.translations/de.json index 24afa67038dd..5c8a491f6a75 100644 --- a/homeassistant/components/samsungtv/.translations/de.json +++ b/homeassistant/components/samsungtv/.translations/de.json @@ -21,7 +21,7 @@ "description": "Gib deine Samsung TV-Informationen ein. Wenn du noch nie eine Verbindung zum Home Assistant hergestellt hast, solltest du ein Popup-Fenster auf deinem Fernseher sehen, das nach einer Authentifizierung fragt.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/en.json b/homeassistant/components/samsungtv/.translations/en.json index 37dc84d3e305..55fc24154f04 100644 --- a/homeassistant/components/samsungtv/.translations/en.json +++ b/homeassistant/components/samsungtv/.translations/en.json @@ -21,7 +21,7 @@ "description": "Enter your Samsung TV information. If you never connected Home Assistant before you should see a popup on your TV asking for authorization.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/es.json b/homeassistant/components/samsungtv/.translations/es.json index 91581de59a15..e23c5cdbbab2 100644 --- a/homeassistant/components/samsungtv/.translations/es.json +++ b/homeassistant/components/samsungtv/.translations/es.json @@ -21,7 +21,7 @@ "description": "Introduce la informaci\u00f3n de tu televisor Samsung. Si nunca conect\u00f3 Home Assistant antes de ver una ventana emergente en su televisor pidiendo autenticaci\u00f3n.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/fr.json b/homeassistant/components/samsungtv/.translations/fr.json index 8e722a7add0d..344110ed1a91 100644 --- a/homeassistant/components/samsungtv/.translations/fr.json +++ b/homeassistant/components/samsungtv/.translations/fr.json @@ -21,7 +21,7 @@ "description": "Entrez les informations relatives \u00e0 votre t\u00e9l\u00e9viseur Samsung. Si vous n'avez jamais connect\u00e9 Home Assistant avant, vous devriez voir une fen\u00eatre contextuelle sur votre t\u00e9l\u00e9viseur demandant une authentification.", "title": "TV Samsung" } - }, - "title": "TV Samsung" - } + } + }, + "title": "TV Samsung" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/hu.json b/homeassistant/components/samsungtv/.translations/hu.json index 6ed1d8067391..5fd2f8b768b2 100644 --- a/homeassistant/components/samsungtv/.translations/hu.json +++ b/homeassistant/components/samsungtv/.translations/hu.json @@ -21,7 +21,7 @@ "description": "\u00cdrja be a Samsung TV adatait. Ha soha nem csatlakoztatta a Home Assistant alkalmaz\u00e1st ezel\u0151tt, l\u00e1tnia kell a t\u00e9v\u00e9ben egy felugr\u00f3 ablakot, amely enged\u00e9lyt k\u00e9r.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/it.json b/homeassistant/components/samsungtv/.translations/it.json index 692f91efea90..6b4548ba4fcb 100644 --- a/homeassistant/components/samsungtv/.translations/it.json +++ b/homeassistant/components/samsungtv/.translations/it.json @@ -21,7 +21,7 @@ "description": "Inserisci le informazioni del tuo Samsung TV. Se non hai mai connesso Home Assistant in precedenza, dovresti vedere un messaggio sul TV in cui \u00e8 richiesta l'autorizzazione.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ko.json b/homeassistant/components/samsungtv/.translations/ko.json index 20b4496b4288..3ab32508ce3d 100644 --- a/homeassistant/components/samsungtv/.translations/ko.json +++ b/homeassistant/components/samsungtv/.translations/ko.json @@ -21,7 +21,7 @@ "description": "\uc0bc\uc131 TV \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694. Home Assistant \ub97c \uc5f0\uacb0 \ud55c \uc801\uc774 \uc5c6\ub2e4\uba74 TV \uc5d0\uc11c \uc778\uc99d\uc744 \uc694\uccad\ud558\ub294 \ud31d\uc5c5\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.", "title": "\uc0bc\uc131 TV" } - }, - "title": "\uc0bc\uc131 TV" - } + } + }, + "title": "\uc0bc\uc131 TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/lb.json b/homeassistant/components/samsungtv/.translations/lb.json index 6fc78c96fdd1..dfce3978ad6f 100644 --- a/homeassistant/components/samsungtv/.translations/lb.json +++ b/homeassistant/components/samsungtv/.translations/lb.json @@ -21,7 +21,7 @@ "description": "Gitt \u00e4r Samsung TV Informatiounen un. Falls dir Home Assistant nach ni domat verbonnen hutt misst den TV eng Meldung mat enger Authentifiz\u00e9ierung uweisen.", "title": "Samsnung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/nl.json b/homeassistant/components/samsungtv/.translations/nl.json index 3dcb9e59d74c..4b2049023896 100644 --- a/homeassistant/components/samsungtv/.translations/nl.json +++ b/homeassistant/components/samsungtv/.translations/nl.json @@ -21,7 +21,7 @@ "description": "Voer uw Samsung TV informatie in. Als u nooit eerder Home Assistant hebt verbonden dan zou u een popup op uw TV moeten zien waarin u om toestemming wordt vraagt.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/no.json b/homeassistant/components/samsungtv/.translations/no.json index 6e02251f271b..5218982315ed 100644 --- a/homeassistant/components/samsungtv/.translations/no.json +++ b/homeassistant/components/samsungtv/.translations/no.json @@ -21,7 +21,7 @@ "description": "Skriv inn Samsung TV-informasjonen din. Hvis du aldri har koblet til Home Assistant f\u00f8r, vil en popup p\u00e5 TVen be om godkjenning.", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/pl.json b/homeassistant/components/samsungtv/.translations/pl.json index 02231169b65f..d0e2e0f6171e 100644 --- a/homeassistant/components/samsungtv/.translations/pl.json +++ b/homeassistant/components/samsungtv/.translations/pl.json @@ -21,7 +21,7 @@ "description": "Wprowad\u017a informacje o telewizorze Samsung. Je\u015bli nigdy wcze\u015bniej ten telewizor nie by\u0142 \u0142\u0105czony z Home Assistant'em na jego ekranie powinna pojawi\u0107 si\u0119 pro\u015bba o uwierzytelnienie.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ru.json b/homeassistant/components/samsungtv/.translations/ru.json index 016979eb330c..15e05bd376ea 100644 --- a/homeassistant/components/samsungtv/.translations/ru.json +++ b/homeassistant/components/samsungtv/.translations/ru.json @@ -21,7 +21,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435 Samsung. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a Home Assistant, \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.", "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Samsung" } - }, - "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Samsung" - } + } + }, + "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Samsung" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/sl.json b/homeassistant/components/samsungtv/.translations/sl.json index bbf39de3409d..0de30aa5ffd7 100644 --- a/homeassistant/components/samsungtv/.translations/sl.json +++ b/homeassistant/components/samsungtv/.translations/sl.json @@ -21,7 +21,7 @@ "description": "Vnesite podatke o televizorju Samsung. \u010ce \u0161e nikoli niste povezali Home Assistant, bi morali na televizorju videli pojavno okno, ki zahteva va\u0161e dovoljenje.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/sv.json b/homeassistant/components/samsungtv/.translations/sv.json index 423bf61a7509..619dbf8dc801 100644 --- a/homeassistant/components/samsungtv/.translations/sv.json +++ b/homeassistant/components/samsungtv/.translations/sv.json @@ -21,7 +21,7 @@ "description": "Ange informationen f\u00f6r din Samsung TV. Om du aldrig har anslutit denna till Home Assistant tidigare borde du se en popup om autentisering p\u00e5 din TV.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/tr.json b/homeassistant/components/samsungtv/.translations/tr.json index e23969be8a2d..fb9a6399c6ff 100644 --- a/homeassistant/components/samsungtv/.translations/tr.json +++ b/homeassistant/components/samsungtv/.translations/tr.json @@ -17,7 +17,7 @@ "description": "Samsung TV bilgilerini gir. Daha \u00f6nce hi\u00e7 Home Assistant'a ba\u011flamad\u0131ysan, TV'nde izin isteyen bir pencere g\u00f6receksindir.", "title": "Samsung TV" } - }, - "title": "Samsung TV" - } + } + }, + "title": "Samsung TV" } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/zh-Hant.json b/homeassistant/components/samsungtv/.translations/zh-Hant.json index d12d47551c8f..a44be6c5d7e9 100644 --- a/homeassistant/components/samsungtv/.translations/zh-Hant.json +++ b/homeassistant/components/samsungtv/.translations/zh-Hant.json @@ -21,7 +21,7 @@ "description": "\u8f38\u5165\u4e09\u661f\u96fb\u8996\u8cc7\u8a0a\u3002\u5047\u5982\u60a8\u4e4b\u524d\u672a\u66fe\u9023\u7dda\u81f3 Home Assistant\uff0c\u61c9\u8a72\u6703\u65bc\u96fb\u8996\u4e0a\u6536\u5230\u9a57\u8b49\u8a0a\u606f\u3002", "title": "\u4e09\u661f\u96fb\u8996" } - }, - "title": "\u4e09\u661f\u96fb\u8996" - } + } + }, + "title": "\u4e09\u661f\u96fb\u8996" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ca.json b/homeassistant/components/sense/.translations/ca.json index b1a49974cbdd..c9e0b2fd48ba 100644 --- a/homeassistant/components/sense/.translations/ca.json +++ b/homeassistant/components/sense/.translations/ca.json @@ -16,7 +16,7 @@ }, "title": "Connexi\u00f3 amb Sense Energy Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/de.json b/homeassistant/components/sense/.translations/de.json index 229b26e56bd9..c448010e5b5d 100644 --- a/homeassistant/components/sense/.translations/de.json +++ b/homeassistant/components/sense/.translations/de.json @@ -16,7 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zu Ihrem Sense Energy Monitor her" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/en.json b/homeassistant/components/sense/.translations/en.json index 32e6f48e153b..fd4b1f4af3bc 100644 --- a/homeassistant/components/sense/.translations/en.json +++ b/homeassistant/components/sense/.translations/en.json @@ -16,7 +16,7 @@ }, "title": "Connect to your Sense Energy Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/es.json b/homeassistant/components/sense/.translations/es.json index 07078670acee..057596e5cb0b 100644 --- a/homeassistant/components/sense/.translations/es.json +++ b/homeassistant/components/sense/.translations/es.json @@ -16,7 +16,7 @@ }, "title": "Conectar a tu Sense Energy Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/fr.json b/homeassistant/components/sense/.translations/fr.json index 999ac2a0ac77..73cf00b355fd 100644 --- a/homeassistant/components/sense/.translations/fr.json +++ b/homeassistant/components/sense/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "Connectez-vous \u00e0 votre moniteur d'\u00e9nergie Sense" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/it.json b/homeassistant/components/sense/.translations/it.json index 8bcbbb835a1d..c0760337f062 100644 --- a/homeassistant/components/sense/.translations/it.json +++ b/homeassistant/components/sense/.translations/it.json @@ -16,7 +16,7 @@ }, "title": "Connettiti al tuo Sense Energy Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ko.json b/homeassistant/components/sense/.translations/ko.json index 6041992e56d9..d97d32c89672 100644 --- a/homeassistant/components/sense/.translations/ko.json +++ b/homeassistant/components/sense/.translations/ko.json @@ -16,7 +16,7 @@ }, "title": "Sense Energy Monitor \uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/lb.json b/homeassistant/components/sense/.translations/lb.json index 74e7615cf5cb..fd4c93730105 100644 --- a/homeassistant/components/sense/.translations/lb.json +++ b/homeassistant/components/sense/.translations/lb.json @@ -16,7 +16,7 @@ }, "title": "Verbann d\u00e4in Sense Energie Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/no.json b/homeassistant/components/sense/.translations/no.json index d3fe4028e0f5..798048479cda 100644 --- a/homeassistant/components/sense/.translations/no.json +++ b/homeassistant/components/sense/.translations/no.json @@ -16,7 +16,7 @@ }, "title": "Koble til din Sense Energi Monitor" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ru.json b/homeassistant/components/sense/.translations/ru.json index 6a609a05f6da..d1d527c030f3 100644 --- a/homeassistant/components/sense/.translations/ru.json +++ b/homeassistant/components/sense/.translations/ru.json @@ -16,7 +16,7 @@ }, "title": "Sense Energy Monitor" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/sl.json b/homeassistant/components/sense/.translations/sl.json index 9f7568ef2499..5fcf42caab09 100644 --- a/homeassistant/components/sense/.translations/sl.json +++ b/homeassistant/components/sense/.translations/sl.json @@ -16,7 +16,7 @@ }, "title": "Pove\u017eite se s svojim Sense Energy monitor-jem" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/zh-Hant.json b/homeassistant/components/sense/.translations/zh-Hant.json index af124ca3eaff..5b3b13f9b685 100644 --- a/homeassistant/components/sense/.translations/zh-Hant.json +++ b/homeassistant/components/sense/.translations/zh-Hant.json @@ -16,7 +16,7 @@ }, "title": "\u9023\u7dda\u81f3 Sense \u80fd\u6e90\u76e3\u63a7" } - }, - "title": "Sense" - } + } + }, + "title": "Sense" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/af.json b/homeassistant/components/sentry/.translations/af.json index 61ef8f8d3899..ec498ebe3b47 100644 --- a/homeassistant/components/sentry/.translations/af.json +++ b/homeassistant/components/sentry/.translations/af.json @@ -4,7 +4,7 @@ "user": { "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ca.json b/homeassistant/components/sentry/.translations/ca.json index cf0ca26fdd3b..2121153a600a 100644 --- a/homeassistant/components/sentry/.translations/ca.json +++ b/homeassistant/components/sentry/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Introdueix el DSN de Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/da.json b/homeassistant/components/sentry/.translations/da.json index 7377dfd8aeaa..ecd3d4d25253 100644 --- a/homeassistant/components/sentry/.translations/da.json +++ b/homeassistant/components/sentry/.translations/da.json @@ -12,7 +12,7 @@ "description": "Indtast dit Sentry-DSN", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/de.json b/homeassistant/components/sentry/.translations/de.json index db71d8818bcf..956c640379af 100644 --- a/homeassistant/components/sentry/.translations/de.json +++ b/homeassistant/components/sentry/.translations/de.json @@ -12,7 +12,7 @@ "description": "Gib deine Sentry-DSN ein", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/en.json b/homeassistant/components/sentry/.translations/en.json index 4d37438ff3f7..74ec441a2480 100644 --- a/homeassistant/components/sentry/.translations/en.json +++ b/homeassistant/components/sentry/.translations/en.json @@ -12,7 +12,7 @@ "description": "Enter your Sentry DSN", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/es.json b/homeassistant/components/sentry/.translations/es.json index 7951076a95e2..965453fe405a 100644 --- a/homeassistant/components/sentry/.translations/es.json +++ b/homeassistant/components/sentry/.translations/es.json @@ -12,7 +12,7 @@ "description": "Introduzca su DSN Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/fr.json b/homeassistant/components/sentry/.translations/fr.json index 7702874866a6..9d58589d7f4a 100644 --- a/homeassistant/components/sentry/.translations/fr.json +++ b/homeassistant/components/sentry/.translations/fr.json @@ -12,7 +12,7 @@ "description": "Entrez votre DSN Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/hu.json b/homeassistant/components/sentry/.translations/hu.json index 64318828e6d8..c472cc5806e4 100644 --- a/homeassistant/components/sentry/.translations/hu.json +++ b/homeassistant/components/sentry/.translations/hu.json @@ -12,7 +12,7 @@ "description": "Add meg a Sentry DSN-t", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/it.json b/homeassistant/components/sentry/.translations/it.json index 4d0cd3178e73..03cecbfb349a 100644 --- a/homeassistant/components/sentry/.translations/it.json +++ b/homeassistant/components/sentry/.translations/it.json @@ -12,7 +12,7 @@ "description": "Inserisci il tuo DSN Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ko.json b/homeassistant/components/sentry/.translations/ko.json index b0dde032b73b..48b3ddb0488b 100644 --- a/homeassistant/components/sentry/.translations/ko.json +++ b/homeassistant/components/sentry/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Sentry DSN \uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/lb.json b/homeassistant/components/sentry/.translations/lb.json index e91f57a1585e..1c0988cee332 100644 --- a/homeassistant/components/sentry/.translations/lb.json +++ b/homeassistant/components/sentry/.translations/lb.json @@ -12,7 +12,7 @@ "description": "Gitt \u00e4r Sentry DSN un", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/nl.json b/homeassistant/components/sentry/.translations/nl.json index 67bd1ea54e28..3eb2582b6152 100644 --- a/homeassistant/components/sentry/.translations/nl.json +++ b/homeassistant/components/sentry/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Voer uw Sentry DSN in", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/no.json b/homeassistant/components/sentry/.translations/no.json index 36ce52f74eab..83f2a11a8b06 100644 --- a/homeassistant/components/sentry/.translations/no.json +++ b/homeassistant/components/sentry/.translations/no.json @@ -12,7 +12,7 @@ "description": "Fyll inn din Sentry DNS", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/pl.json b/homeassistant/components/sentry/.translations/pl.json index d97fa159a87f..1115cc97ab20 100644 --- a/homeassistant/components/sentry/.translations/pl.json +++ b/homeassistant/components/sentry/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Wprowad\u017a DSN Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ru.json b/homeassistant/components/sentry/.translations/ru.json index ada10db6c820..7b7a840b94a4 100644 --- a/homeassistant/components/sentry/.translations/ru.json +++ b/homeassistant/components/sentry/.translations/ru.json @@ -12,7 +12,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0412\u0430\u0448 DSN Sentry", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/sl.json b/homeassistant/components/sentry/.translations/sl.json index b99381722ad0..6306e1ab2ffd 100644 --- a/homeassistant/components/sentry/.translations/sl.json +++ b/homeassistant/components/sentry/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Vpi\u0161ite va\u0161 Sentry DSN", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/sv.json b/homeassistant/components/sentry/.translations/sv.json index 7f0968e7dbee..135779d6901a 100644 --- a/homeassistant/components/sentry/.translations/sv.json +++ b/homeassistant/components/sentry/.translations/sv.json @@ -12,7 +12,7 @@ "description": "Ange din Sentry DSN", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/zh-Hant.json b/homeassistant/components/sentry/.translations/zh-Hant.json index f1599b58be6b..4a2c446f3d7a 100644 --- a/homeassistant/components/sentry/.translations/zh-Hant.json +++ b/homeassistant/components/sentry/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u8f38\u5165 Sentry DSN", "title": "Sentry" } - }, - "title": "Sentry" - } + } + }, + "title": "Sentry" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/ca.json b/homeassistant/components/shopping_list/.translations/ca.json index 541ee0c0e9cb..d384e46641d6 100644 --- a/homeassistant/components/shopping_list/.translations/ca.json +++ b/homeassistant/components/shopping_list/.translations/ca.json @@ -8,7 +8,7 @@ "description": "Vols configurar la llista de compres?", "title": "Llista de compres" } - }, - "title": "Llista de compres" - } + } + }, + "title": "Llista de compres" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/de.json b/homeassistant/components/shopping_list/.translations/de.json index 13638985ee20..d2d6a42fe249 100644 --- a/homeassistant/components/shopping_list/.translations/de.json +++ b/homeassistant/components/shopping_list/.translations/de.json @@ -8,7 +8,7 @@ "description": "M\u00f6chten Sie die Einkaufsliste konfigurieren?", "title": "Einkaufsliste" } - }, - "title": "Einkaufsliste" - } + } + }, + "title": "Einkaufsliste" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/en.json b/homeassistant/components/shopping_list/.translations/en.json index 6a22409e8c64..e28b5076dcba 100644 --- a/homeassistant/components/shopping_list/.translations/en.json +++ b/homeassistant/components/shopping_list/.translations/en.json @@ -8,7 +8,7 @@ "description": "Do you want to configure the shopping list?", "title": "Shopping List" } - }, - "title": "Shopping List" - } + } + }, + "title": "Shopping List" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/es.json b/homeassistant/components/shopping_list/.translations/es.json index a2c89f0032f8..b7baefbaa80d 100644 --- a/homeassistant/components/shopping_list/.translations/es.json +++ b/homeassistant/components/shopping_list/.translations/es.json @@ -8,7 +8,7 @@ "description": "\u00bfQuieres configurar la lista de la compra?", "title": "Lista de la compra" } - }, - "title": "Lista de la compra" - } + } + }, + "title": "Lista de la compra" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/fr.json b/homeassistant/components/shopping_list/.translations/fr.json index 05034e3e58ef..b5265a707849 100644 --- a/homeassistant/components/shopping_list/.translations/fr.json +++ b/homeassistant/components/shopping_list/.translations/fr.json @@ -8,7 +8,7 @@ "description": "Voulez-vous configurer la liste d'achats ?", "title": "Liste d'achats" } - }, - "title": "Liste d\u2019achats" - } + } + }, + "title": "Liste d\u2019achats" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/it.json b/homeassistant/components/shopping_list/.translations/it.json index ffd1c1d7f674..c1b10bc84b69 100644 --- a/homeassistant/components/shopping_list/.translations/it.json +++ b/homeassistant/components/shopping_list/.translations/it.json @@ -8,7 +8,7 @@ "description": "Vuoi configurare la lista della spesa?", "title": "Lista della Spesa" } - }, - "title": "Lista della Spesa" - } + } + }, + "title": "Lista della Spesa" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/ko.json b/homeassistant/components/shopping_list/.translations/ko.json index 7885890d8b47..247fa8d9f4d4 100644 --- a/homeassistant/components/shopping_list/.translations/ko.json +++ b/homeassistant/components/shopping_list/.translations/ko.json @@ -8,7 +8,7 @@ "description": "\uc7a5\ubcf4\uae30\ubaa9\ub85d\uc744 \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "\uc7a5\ubcf4\uae30\ubaa9\ub85d" } - }, - "title": "\uc7a5\ubcf4\uae30\ubaa9\ub85d" - } + } + }, + "title": "\uc7a5\ubcf4\uae30\ubaa9\ub85d" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/lb.json b/homeassistant/components/shopping_list/.translations/lb.json index 46f26637689a..129d1b0e8e78 100644 --- a/homeassistant/components/shopping_list/.translations/lb.json +++ b/homeassistant/components/shopping_list/.translations/lb.json @@ -8,7 +8,7 @@ "description": "Soll Akafsl\u00ebscht konfigur\u00e9iert ginn?", "title": "Akafsl\u00ebscht" } - }, - "title": "Akafsl\u00ebscht" - } + } + }, + "title": "Akafsl\u00ebscht" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/no.json b/homeassistant/components/shopping_list/.translations/no.json index 7945f3b0d3f8..56a92234c70a 100644 --- a/homeassistant/components/shopping_list/.translations/no.json +++ b/homeassistant/components/shopping_list/.translations/no.json @@ -8,7 +8,7 @@ "description": "\u00d8nsker du \u00e5 konfigurere handleliste?", "title": "Handleliste" } - }, - "title": "Handleliste" - } + } + }, + "title": "Handleliste" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/pl.json b/homeassistant/components/shopping_list/.translations/pl.json index d16122d0df9c..75f09a944ef6 100644 --- a/homeassistant/components/shopping_list/.translations/pl.json +++ b/homeassistant/components/shopping_list/.translations/pl.json @@ -8,7 +8,7 @@ "description": "Czy chcesz skonfigurowa\u0107 list\u0119 zakup\u00f3w?", "title": "Lista zakup\u00f3w" } - }, - "title": "Lista zakup\u00f3w" - } + } + }, + "title": "Lista zakup\u00f3w" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/ru.json b/homeassistant/components/shopping_list/.translations/ru.json index e230421909db..84c6e2762f7a 100644 --- a/homeassistant/components/shopping_list/.translations/ru.json +++ b/homeassistant/components/shopping_list/.translations/ru.json @@ -8,7 +8,7 @@ "description": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043a\u0443\u043f\u043e\u043a?", "title": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043a\u0443\u043f\u043e\u043a" } - }, - "title": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043a\u0443\u043f\u043e\u043a" - } + } + }, + "title": "\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043a\u0443\u043f\u043e\u043a" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/sk.json b/homeassistant/components/shopping_list/.translations/sk.json index 857ef6488e5f..5875ad808886 100644 --- a/homeassistant/components/shopping_list/.translations/sk.json +++ b/homeassistant/components/shopping_list/.translations/sk.json @@ -8,7 +8,7 @@ "description": "Chcete nakonfigurova\u0165 n\u00e1kupn\u00fd zoznam?", "title": "N\u00e1kupn\u00fd zoznam" } - }, - "title": "N\u00e1kupn\u00fd zoznam" - } + } + }, + "title": "N\u00e1kupn\u00fd zoznam" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/sl.json b/homeassistant/components/shopping_list/.translations/sl.json index f5d594ed6f52..6d90e9485cb2 100644 --- a/homeassistant/components/shopping_list/.translations/sl.json +++ b/homeassistant/components/shopping_list/.translations/sl.json @@ -8,7 +8,7 @@ "description": "Ali \u017eelite konfigurirati nakupovalni seznam?", "title": "Nakupovalni seznam" } - }, - "title": "Nakupovalni seznam" - } + } + }, + "title": "Nakupovalni seznam" } \ No newline at end of file diff --git a/homeassistant/components/shopping_list/.translations/zh-Hant.json b/homeassistant/components/shopping_list/.translations/zh-Hant.json index aea7a9b64097..dbb7d941b2d6 100644 --- a/homeassistant/components/shopping_list/.translations/zh-Hant.json +++ b/homeassistant/components/shopping_list/.translations/zh-Hant.json @@ -8,7 +8,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a\u8cfc\u7269\u6e05\u55ae\uff1f", "title": "\u8cfc\u7269\u6e05\u55ae" } - }, - "title": "\u8cfc\u7269\u6e05\u55ae" - } + } + }, + "title": "\u8cfc\u7269\u6e05\u55ae" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/bg.json b/homeassistant/components/simplisafe/.translations/bg.json index 0ec8fd3c6b1e..7b1e2a3f350f 100644 --- a/homeassistant/components/simplisafe/.translations/bg.json +++ b/homeassistant/components/simplisafe/.translations/bg.json @@ -12,7 +12,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ca.json b/homeassistant/components/simplisafe/.translations/ca.json index f2d9db5797d3..34d86a4b46e4 100644 --- a/homeassistant/components/simplisafe/.translations/ca.json +++ b/homeassistant/components/simplisafe/.translations/ca.json @@ -15,8 +15,7 @@ }, "title": "Introdueix la teva informaci\u00f3" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Configuraci\u00f3 de SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/cs.json b/homeassistant/components/simplisafe/.translations/cs.json index 2160dc226d97..793de99a32a4 100644 --- a/homeassistant/components/simplisafe/.translations/cs.json +++ b/homeassistant/components/simplisafe/.translations/cs.json @@ -12,7 +12,7 @@ }, "title": "Vypl\u0148te va\u0161e \u00fadaje" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/da.json b/homeassistant/components/simplisafe/.translations/da.json index 39324fe5f512..862ca6f28e4b 100644 --- a/homeassistant/components/simplisafe/.translations/da.json +++ b/homeassistant/components/simplisafe/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Udfyld dine oplysninger" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/de.json b/homeassistant/components/simplisafe/.translations/de.json index 08d5b31d202e..c48ca23d27de 100644 --- a/homeassistant/components/simplisafe/.translations/de.json +++ b/homeassistant/components/simplisafe/.translations/de.json @@ -15,8 +15,7 @@ }, "title": "Gib deine Informationen ein" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Konfigurieren Sie SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/en.json b/homeassistant/components/simplisafe/.translations/en.json index 60c3784ee9d2..d753a54b6935 100644 --- a/homeassistant/components/simplisafe/.translations/en.json +++ b/homeassistant/components/simplisafe/.translations/en.json @@ -15,8 +15,7 @@ }, "title": "Fill in your information" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Configure SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/es-419.json b/homeassistant/components/simplisafe/.translations/es-419.json index bf4127fbd843..34b0f198b507 100644 --- a/homeassistant/components/simplisafe/.translations/es-419.json +++ b/homeassistant/components/simplisafe/.translations/es-419.json @@ -12,7 +12,7 @@ }, "title": "Completa tu informaci\u00f3n" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/es.json b/homeassistant/components/simplisafe/.translations/es.json index fe159cf9fa8d..84d0bf9e84ee 100644 --- a/homeassistant/components/simplisafe/.translations/es.json +++ b/homeassistant/components/simplisafe/.translations/es.json @@ -15,8 +15,7 @@ }, "title": "Completa tus datos" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Configurar SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/fr.json b/homeassistant/components/simplisafe/.translations/fr.json index e204fa96f1b2..471a6a0cf686 100644 --- a/homeassistant/components/simplisafe/.translations/fr.json +++ b/homeassistant/components/simplisafe/.translations/fr.json @@ -15,8 +15,7 @@ }, "title": "Veuillez saisir vos informations" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Configurer SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/hu.json b/homeassistant/components/simplisafe/.translations/hu.json index 613b5565470b..3345d7882c07 100644 --- a/homeassistant/components/simplisafe/.translations/hu.json +++ b/homeassistant/components/simplisafe/.translations/hu.json @@ -12,7 +12,7 @@ }, "title": "T\u00f6ltsd ki az adataid" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/it.json b/homeassistant/components/simplisafe/.translations/it.json index 71581e845f46..1ab01c14b4a4 100644 --- a/homeassistant/components/simplisafe/.translations/it.json +++ b/homeassistant/components/simplisafe/.translations/it.json @@ -15,8 +15,7 @@ }, "title": "Inserisci i tuoi dati" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Configurare SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ko.json b/homeassistant/components/simplisafe/.translations/ko.json index 53e67cd5506e..9db028011dca 100644 --- a/homeassistant/components/simplisafe/.translations/ko.json +++ b/homeassistant/components/simplisafe/.translations/ko.json @@ -15,8 +15,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "SimpliSafe \uad6c\uc131" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/lb.json b/homeassistant/components/simplisafe/.translations/lb.json index a7e56f817d50..3c0c165aa538 100644 --- a/homeassistant/components/simplisafe/.translations/lb.json +++ b/homeassistant/components/simplisafe/.translations/lb.json @@ -15,8 +15,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Simplisafe konfigur\u00e9ieren" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/nl.json b/homeassistant/components/simplisafe/.translations/nl.json index bad1c4081440..8c9da14a6037 100644 --- a/homeassistant/components/simplisafe/.translations/nl.json +++ b/homeassistant/components/simplisafe/.translations/nl.json @@ -12,7 +12,7 @@ }, "title": "Vul uw gegevens in" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/nn.json b/homeassistant/components/simplisafe/.translations/nn.json index 0568cad3f6dc..1bcfd463ce83 100644 --- a/homeassistant/components/simplisafe/.translations/nn.json +++ b/homeassistant/components/simplisafe/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "SimpliSafe" - } + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/no.json b/homeassistant/components/simplisafe/.translations/no.json index 436fba8fd066..7ba23b7b0c63 100644 --- a/homeassistant/components/simplisafe/.translations/no.json +++ b/homeassistant/components/simplisafe/.translations/no.json @@ -15,8 +15,7 @@ }, "title": "Fyll ut informasjonen din" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Konfigurer SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pl.json b/homeassistant/components/simplisafe/.translations/pl.json index b673d28a7cac..d278c5d6f19b 100644 --- a/homeassistant/components/simplisafe/.translations/pl.json +++ b/homeassistant/components/simplisafe/.translations/pl.json @@ -15,8 +15,7 @@ }, "title": "Wprowad\u017a dane" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Konfiguracja SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pt-BR.json b/homeassistant/components/simplisafe/.translations/pt-BR.json index 2f1fe9ca10ac..a732debc0436 100644 --- a/homeassistant/components/simplisafe/.translations/pt-BR.json +++ b/homeassistant/components/simplisafe/.translations/pt-BR.json @@ -12,7 +12,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pt.json b/homeassistant/components/simplisafe/.translations/pt.json index 809c8fc29a4a..097c6fe3b71e 100644 --- a/homeassistant/components/simplisafe/.translations/pt.json +++ b/homeassistant/components/simplisafe/.translations/pt.json @@ -12,7 +12,7 @@ }, "title": "Preencha as suas informa\u00e7\u00f5es" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ro.json b/homeassistant/components/simplisafe/.translations/ro.json index 33f284e93c27..a84e80f9d04f 100644 --- a/homeassistant/components/simplisafe/.translations/ro.json +++ b/homeassistant/components/simplisafe/.translations/ro.json @@ -12,7 +12,7 @@ }, "title": "Completa\u021bi informa\u021biile dvs." } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ru.json b/homeassistant/components/simplisafe/.translations/ru.json index 1e06319672ac..7e116f62923d 100644 --- a/homeassistant/components/simplisafe/.translations/ru.json +++ b/homeassistant/components/simplisafe/.translations/ru.json @@ -15,8 +15,7 @@ }, "title": "SimpliSafe" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/sl.json b/homeassistant/components/simplisafe/.translations/sl.json index 15131fb1198c..81be13f879a2 100644 --- a/homeassistant/components/simplisafe/.translations/sl.json +++ b/homeassistant/components/simplisafe/.translations/sl.json @@ -15,8 +15,7 @@ }, "title": "Izpolnite svoje podatke" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Konfigurirajte SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/sv.json b/homeassistant/components/simplisafe/.translations/sv.json index 28ae99c1dc41..81c7db754c24 100644 --- a/homeassistant/components/simplisafe/.translations/sv.json +++ b/homeassistant/components/simplisafe/.translations/sv.json @@ -12,7 +12,7 @@ }, "title": "Fyll i din information" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/zh-Hans.json b/homeassistant/components/simplisafe/.translations/zh-Hans.json index 2981ee716347..5014ee44be7c 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hans.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hans.json @@ -12,7 +12,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } - }, - "title": "SimpliSafe" - } + } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/zh-Hant.json b/homeassistant/components/simplisafe/.translations/zh-Hant.json index bbe44a4fdea4..dcb235d247ae 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hant.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hant.json @@ -15,8 +15,7 @@ }, "title": "\u586b\u5beb\u8cc7\u8a0a" } - }, - "title": "SimpliSafe" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "\u8a2d\u5b9a SimpliSafe" } } - } + }, + "title": "SimpliSafe" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/bg.json b/homeassistant/components/smartthings/.translations/bg.json index 8a13a76a2a93..bdbea8983e50 100644 --- a/homeassistant/components/smartthings/.translations/bg.json +++ b/homeassistant/components/smartthings/.translations/bg.json @@ -22,7 +22,7 @@ "description": "\u041c\u043e\u043b\u044f, \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0439\u0442\u0435 Home Assistant SmartApp \u043f\u043e\u043d\u0435 \u043d\u0430 \u0435\u0434\u043d\u043e \u043c\u044f\u0441\u0442\u043e \u0438 \u043a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443 \u0417\u0430\u043f\u0430\u0437\u0432\u0430\u043d\u0435.", "title": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0439\u0442\u0435 SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ca.json b/homeassistant/components/smartthings/.translations/ca.json index e1fca79c24e4..9b1d0cc00b62 100644 --- a/homeassistant/components/smartthings/.translations/ca.json +++ b/homeassistant/components/smartthings/.translations/ca.json @@ -22,7 +22,7 @@ "description": "Instal\u00b7la l'SmartApp de Home Assistant en almenys una ubicaci\u00f3 i prem a Envia.", "title": "Instal\u00b7laci\u00f3 de SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/da.json b/homeassistant/components/smartthings/.translations/da.json index 04fe2171f39e..636943d119e4 100644 --- a/homeassistant/components/smartthings/.translations/da.json +++ b/homeassistant/components/smartthings/.translations/da.json @@ -22,7 +22,7 @@ "description": "Installer Home Assistant SmartApp mindst et sted og klik p\u00e5 send.", "title": "Installer SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/de.json b/homeassistant/components/smartthings/.translations/de.json index c6baac678982..4096720d02bf 100644 --- a/homeassistant/components/smartthings/.translations/de.json +++ b/homeassistant/components/smartthings/.translations/de.json @@ -22,7 +22,7 @@ "description": "Installiere die Home-Assistent SmartApp an mindestens einer Stelle, und klicke auf Absenden.", "title": "SmartApp installieren" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/en.json b/homeassistant/components/smartthings/.translations/en.json index df28c6936db4..9c1b9ae6248d 100644 --- a/homeassistant/components/smartthings/.translations/en.json +++ b/homeassistant/components/smartthings/.translations/en.json @@ -43,7 +43,7 @@ "description": "Please install the Home Assistant SmartApp in at least one location and click submit.", "title": "Install SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/es-419.json b/homeassistant/components/smartthings/.translations/es-419.json index 4dc943246951..1ff1554fa2fb 100644 --- a/homeassistant/components/smartthings/.translations/es-419.json +++ b/homeassistant/components/smartthings/.translations/es-419.json @@ -19,7 +19,7 @@ "description": "Instale la SmartApp de Home Assistant en al menos una ubicaci\u00f3n y haga clic en enviar.", "title": "Instalar SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/es.json b/homeassistant/components/smartthings/.translations/es.json index 513b8ba3ffe1..59c2f79d8584 100644 --- a/homeassistant/components/smartthings/.translations/es.json +++ b/homeassistant/components/smartthings/.translations/es.json @@ -22,7 +22,7 @@ "description": "Por favor, instala Home Assistant SmartApp en al menos una ubicaci\u00f3n y pulsa en enviar.", "title": "Instalar SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/fr.json b/homeassistant/components/smartthings/.translations/fr.json index 56c30acbf1b0..1fd32fd1be5a 100644 --- a/homeassistant/components/smartthings/.translations/fr.json +++ b/homeassistant/components/smartthings/.translations/fr.json @@ -22,7 +22,7 @@ "description": "Veuillez installer la SmartApp de Home Assistant dans au moins un emplacement et cliquez sur Soumettre.", "title": "Installer SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/he.json b/homeassistant/components/smartthings/.translations/he.json index 7f80900d8282..adebe4b8a735 100644 --- a/homeassistant/components/smartthings/.translations/he.json +++ b/homeassistant/components/smartthings/.translations/he.json @@ -22,7 +22,7 @@ "description": "\u05d4\u05ea\u05e7\u05df \u05d0\u05ea \u05d4- Home Assistant SmartApp \u05dc\u05e4\u05d7\u05d5\u05ea \u05d1\u05de\u05d9\u05e7\u05d5\u05dd \u05d0\u05d7\u05d3 \u05d5\u05dc\u05d7\u05e5 \u05e2\u05dc \u05e9\u05dc\u05d7.", "title": "\u05d4\u05ea\u05e7\u05df \u05d0\u05ea SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/hu.json b/homeassistant/components/smartthings/.translations/hu.json index e4970780bc0d..56c29638be04 100644 --- a/homeassistant/components/smartthings/.translations/hu.json +++ b/homeassistant/components/smartthings/.translations/hu.json @@ -22,7 +22,7 @@ "description": "K\u00e9rj\u00fck, telep\u00edtse a Home Assistant SmartAppot legal\u00e1bb egy helyre, \u00e9s kattintson a K\u00fcld\u00e9s gombra.", "title": "A SmartApp telep\u00edt\u00e9se" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/it.json b/homeassistant/components/smartthings/.translations/it.json index c2b17eed04d3..0b96963199ea 100644 --- a/homeassistant/components/smartthings/.translations/it.json +++ b/homeassistant/components/smartthings/.translations/it.json @@ -22,7 +22,7 @@ "description": "Si prega di installare l'Home Assistant SmartApp in almeno una posizione e fare clic su Invia.", "title": "Installa SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ko.json b/homeassistant/components/smartthings/.translations/ko.json index f7d86af83948..804cce848622 100644 --- a/homeassistant/components/smartthings/.translations/ko.json +++ b/homeassistant/components/smartthings/.translations/ko.json @@ -22,7 +22,7 @@ "description": "\ud558\ub098 \uc774\uc0c1\uc758 \uc704\uce58\uc5d0 Home Assistant SmartApp \uc744 \uc124\uce58\ud558\uace0 submit \uc744 \ud074\ub9ad\ud574\uc8fc\uc138\uc694.", "title": "SmartApp \uc124\uce58" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/lb.json b/homeassistant/components/smartthings/.translations/lb.json index fc80ba9f722e..2fb6b10a7704 100644 --- a/homeassistant/components/smartthings/.translations/lb.json +++ b/homeassistant/components/smartthings/.translations/lb.json @@ -22,7 +22,7 @@ "description": "Install\u00e9iert d'Home Assistant SmartApp op mannst ee mol a klickt op Ofsch\u00e9cken.", "title": "SmartApp install\u00e9ieren" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/nl.json b/homeassistant/components/smartthings/.translations/nl.json index 2b5b646c458a..2ba0e1f3467a 100644 --- a/homeassistant/components/smartthings/.translations/nl.json +++ b/homeassistant/components/smartthings/.translations/nl.json @@ -22,7 +22,7 @@ "description": "Installeer de Home Assistant SmartApp in tenminste \u00e9\u00e9n locatie en klik Verzenden.", "title": "Installeer SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/nn.json b/homeassistant/components/smartthings/.translations/nn.json index 929e95dc2ffe..68782329facd 100644 --- a/homeassistant/components/smartthings/.translations/nn.json +++ b/homeassistant/components/smartthings/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "SmartThings" - } + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/no.json b/homeassistant/components/smartthings/.translations/no.json index a25de0e2feb8..051fcb5e6d79 100644 --- a/homeassistant/components/smartthings/.translations/no.json +++ b/homeassistant/components/smartthings/.translations/no.json @@ -1,5 +1,9 @@ { "config": { + "abort": { + "invalid_webhook_url": "Home Assistant er ikke konfigurert riktig for \u00e5 motta oppdateringer fra SmartThings. URLen til nettkroken er ugyldig: \n > {webhook_url} \n\n Oppdater konfigurasjonen i henhold til [instruksjonene] ( {component_url} ), start Home Assistant p\u00e5 nytt, og pr\u00f8v igjen.", + "no_available_locations": "Det er ingen tilgjengelige SmartThings-lokasjoner \u00e5 konfigurere i Home Assistant." + }, "error": { "app_not_installed": "V\u00e6r sikker p\u00e5 at du har installert og autorisert Home Assistant SmartApp og pr\u00f8v igjen.", "app_setup_error": "Kan ikke konfigurere SmartApp. Vennligst pr\u00f8v p\u00e5 nytt.", @@ -8,21 +12,38 @@ "token_forbidden": "Tokenet har ikke de n\u00f8dvendige OAuth-omfangene.", "token_invalid_format": "Token m\u00e5 v\u00e6re i UID/GUID format", "token_unauthorized": "Tollet er ugyldig eller ikke lenger autorisert.", - "webhook_error": "SmartThings kunne ikke validere endepunktet konfigurert i `base_url`. Vennligst se komponent krav." + "webhook_error": "SmartThings kan ikke validere URL-adressen for webhook. Kontroller at URL-adressen for webhook kan n\u00e5s fra Internett, og pr\u00f8v p\u00e5 nytt." }, "step": { + "authorize": { + "title": "Autoriser Home Assistant" + }, + "pat": { + "data": { + "access_token": "Tilgangstoken" + }, + "description": "Skriv inn et SmartThings [Personal Access Token] ( {token_url} ) som er opprettet i henhold til [instruksjonene] ( {component_url} ). Dette vil bli brukt til \u00e5 opprette Home Assistant-integrasjonen i SmartThings-kontoen din.", + "title": "Oppgi Personlig Tilgangstoken" + }, + "select_location": { + "data": { + "location_id": "Lokasjon" + }, + "description": "Velg SmartThings Lokasjon du vil legge til Home Assistant. Vi \u00e5pner deretter et nytt vindu og ber deg om \u00e5 logge inn og autorisere installasjon av Home Assistant-integrasjonen p\u00e5 det valgte stedet.", + "title": "Velg Posisjon" + }, "user": { "data": { "access_token": "Tilgangstoken" }, - "description": "Vennligst skriv inn en SmartThings [Personlig tilgangstoken]({token_url}) som er opprettet etter [instruksjonene]({component_url}).", - "title": "Oppgi Personlig Tilgangstoken" + "description": "SmartThings konfigureres til \u00e5 sende push-oppdateringer til Home Assistant p\u00e5:\n\" {webhook_url}\n\nHvis dette ikke er riktig, m\u00e5 du oppdatere konfigurasjonen, starte Home Assistant p\u00e5 nytt og pr\u00f8ve p\u00e5 nytt.", + "title": "Bekreft URL-adresse for tilbakeringing" }, "wait_install": { "description": "Vennligst installer Home Assistant SmartApp p\u00e5 minst ett sted og klikk p\u00e5 send.", "title": "Installer SmartApp" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pl.json b/homeassistant/components/smartthings/.translations/pl.json index 849ad1741345..7bbce699274f 100644 --- a/homeassistant/components/smartthings/.translations/pl.json +++ b/homeassistant/components/smartthings/.translations/pl.json @@ -22,7 +22,7 @@ "description": "Prosz\u0119 zainstalowa\u0107 Home Assistant SmartApp w co najmniej jednej lokalizacji i klikn\u0105\u0107 przycisk Wy\u015blij.", "title": "Zainstaluj SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pt-BR.json b/homeassistant/components/smartthings/.translations/pt-BR.json index 84194fee482b..dba578def936 100644 --- a/homeassistant/components/smartthings/.translations/pt-BR.json +++ b/homeassistant/components/smartthings/.translations/pt-BR.json @@ -22,7 +22,7 @@ "description": "Por favor, instale o Home Assistant SmartApp em pelo menos um local e clique em enviar.", "title": "Instalar o SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pt.json b/homeassistant/components/smartthings/.translations/pt.json index f49fe04ae8e9..0b8a9f88e819 100644 --- a/homeassistant/components/smartthings/.translations/pt.json +++ b/homeassistant/components/smartthings/.translations/pt.json @@ -21,7 +21,7 @@ "description": "Por favor, instale o Home Assistant SmartApp em pelo menos um local e clique em enviar.", "title": "Instalar SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ru.json b/homeassistant/components/smartthings/.translations/ru.json index f07586c16e30..0ad425bc930c 100644 --- a/homeassistant/components/smartthings/.translations/ru.json +++ b/homeassistant/components/smartthings/.translations/ru.json @@ -22,7 +22,7 @@ "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 SmartApp 'Home Assistant' \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 **\u041f\u041e\u0414\u0422\u0412\u0415\u0420\u0414\u0418\u0422\u042c**.", "title": "SmartThings" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/sl.json b/homeassistant/components/smartthings/.translations/sl.json index 506eb98cc95e..ea7c3b801210 100644 --- a/homeassistant/components/smartthings/.translations/sl.json +++ b/homeassistant/components/smartthings/.translations/sl.json @@ -22,7 +22,7 @@ "description": "Prosimo, namestite Home Assistant SmartApp v vsaj eni lokaciji in kliknite po\u0161lji.", "title": "Namesti SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/sv.json b/homeassistant/components/smartthings/.translations/sv.json index 725957682ad8..5cf7b43851e3 100644 --- a/homeassistant/components/smartthings/.translations/sv.json +++ b/homeassistant/components/smartthings/.translations/sv.json @@ -22,7 +22,7 @@ "description": "Installera Home Assistant SmartApp p\u00e5 minst en plats och klicka p\u00e5 Skicka.", "title": "Installera SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/th.json b/homeassistant/components/smartthings/.translations/th.json index c871679860e6..47b04ed2c6a4 100644 --- a/homeassistant/components/smartthings/.translations/th.json +++ b/homeassistant/components/smartthings/.translations/th.json @@ -5,7 +5,7 @@ "description": "\u0e42\u0e1b\u0e23\u0e14\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 Home Assistant SmartApp \u0e43\u0e19\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e41\u0e2b\u0e48\u0e07\u0e41\u0e25\u0e49\u0e27\u0e04\u0e25\u0e34\u0e01\u0e2a\u0e48\u0e07", "title": "\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/zh-Hans.json b/homeassistant/components/smartthings/.translations/zh-Hans.json index 2326c394cc01..7acf1e34318b 100644 --- a/homeassistant/components/smartthings/.translations/zh-Hans.json +++ b/homeassistant/components/smartthings/.translations/zh-Hans.json @@ -22,7 +22,7 @@ "description": "\u8bf7\u81f3\u5c11\u5728\u4e00\u4e2a\u4f4d\u7f6e\u5b89\u88c5 Home Assistant SmartApp\uff0c\u7136\u540e\u70b9\u51fb\u201c\u63d0\u4ea4\u201d\u3002", "title": "\u5b89\u88c5 SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/zh-Hant.json b/homeassistant/components/smartthings/.translations/zh-Hant.json index 10d73f8be359..b6164bcd3b43 100644 --- a/homeassistant/components/smartthings/.translations/zh-Hant.json +++ b/homeassistant/components/smartthings/.translations/zh-Hant.json @@ -1,5 +1,9 @@ { "config": { + "abort": { + "invalid_webhook_url": "Home Assistant \u672a\u8a2d\u5b9a\u6b63\u78ba\u4ee5\u63a5\u6536 SmartThings \u66f4\u65b0\u3002Webhook URL \u7121\u6548\uff1a\n> {webhook_url}\n\n\u8acb\u8ddf\u96a8\u6b64[\u6559\u5b78]({component_url}) \u66f4\u65b0\u8a2d\u5b9a\u3002\u91cd\u65b0\u555f\u52d5 Home Assistant \u5f8c\u3001\u518d\n\u8a66\u4e00\u6b21\u3002", + "no_available_locations": "\u6c92\u6709\u53ef\u7528 SmartThings \u4f4d\u7f6e\u4ee5\u8a2d\u5b9a Home Assistant\u3002" + }, "error": { "app_not_installed": "\u8acb\u78ba\u8a8d\u5df2\u7d93\u5b89\u88dd\u4e26\u6388\u6b0a Home Assistant Smartapp \u5f8c\u518d\u8a66\u4e00\u6b21\u3002", "app_setup_error": "\u7121\u6cd5\u8a2d\u5b9a SmartApp\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002", @@ -8,21 +12,38 @@ "token_forbidden": "\u5bc6\u9470\u4e0d\u5177\u6240\u9700\u7684 OAuth \u7bc4\u570d\u3002", "token_invalid_format": "\u5bc6\u9470\u5fc5\u9808\u70ba UID/GUID \u683c\u5f0f", "token_unauthorized": "\u5bc6\u9470\u7121\u6548\u6216\u4e0d\u518d\u5177\u6709\u6388\u6b0a\u3002", - "webhook_error": "SmartThings \u7121\u6cd5\u8a8d\u8b49\u300cbase_url\u300d\u4e2d\u8a2d\u5b9a\u4e4b\u7aef\u9ede\u3002\u8acb\u518d\u6b21\u78ba\u8a8d\u5143\u4ef6\u9700\u6c42\u3002" + "webhook_error": "SmartThings \u7121\u6cd5\u8a8d\u8b49 Webhook URL\u3002\u8acb\u78ba\u8a8d Webhook URL \u53ef\u7531\u7db2\u8def\u5b58\u53d6\u5f8c\u518d\u8a66\u4e00\u6b21\u3002" }, "step": { + "authorize": { + "title": "\u8a8d\u8b49 Home Assistant" + }, + "pat": { + "data": { + "access_token": "\u5b58\u53d6\u5bc6\u9470" + }, + "description": "\u8acb\u8f38\u5165\u8ddf\u96a8\u6b64[\u6559\u5b78]({component_url}) \u6240\u5efa\u7acb\u7684 SmartThings [\u500b\u4eba\u5b58\u53d6\u5bc6\u9470]({token_url})\u3002\u5c07\u4f7f\u7528 SmartThings \u5e33\u865f\u65b0\u589e Home Assistant \u6574\u5408\u3002", + "title": "\u8f38\u5165\u500b\u4eba\u5b58\u53d6\u5bc6\u9470" + }, + "select_location": { + "data": { + "location_id": "\u4f4d\u7f6e" + }, + "description": "\u8acb\u9078\u64c7\u6240\u8981\u52a0\u5165\u81f3 Home Assistant \u7684 SmartThings \u4f4d\u7f6e\u3002\u5c07\u6703\u958b\u555f\u65b0\u8996\u7a97\u4e26\u8a62\u554f\u767b\u5165\u8207\u8a8d\u8b49\u5b89\u88dd Home Assistant \u6574\u5408\u81f3\u6240\u9078\u4f4d\u7f6e\u3002", + "title": "\u9078\u64c7\u4f4d\u7f6e" + }, "user": { "data": { "access_token": "\u5b58\u53d6\u5bc6\u9470" }, - "description": "\u8acb\u8f38\u5165\u8ddf\u8457[ \u6307\u5f15]({component_url})\u6240\u7522\u751f\u7684 SmartThings [\u500b\u4eba\u5b58\u53d6\u5bc6\u9470]({token_url})\u3002", - "title": "\u8f38\u5165\u500b\u4eba\u5b58\u53d6\u5bc6\u9470" + "description": "SmartThings \u9700\u8981\u9032\u884c\u8a2d\u5b9a\u4ee5\u50b3\u9001\u63a8\u64a5\u66f4\u65b0\u81f3 Home Assistant\uff0c\u8a2d\u5b9a\u4f4d\u5740\uff1a\n> {webhook_url}\n\n\u5047\u5982\u8cc7\u8a0a\u4e0d\u6b63\u78ba\uff0c\u8acb\u66f4\u65b0\u8a2d\u5b9a\u3001\u91cd\u65b0\u555f\u52d5 Home Assistant \u5f8c\u3001\u518d\u8a66\u4e00\u6b21\u3002", + "title": "\u78ba\u8a8d Callback URL" }, "wait_install": { "description": "\u8acb\u81f3\u5c11\u65bc\u4e00\u500b\u4f4d\u7f6e\u4e2d\u5b89\u88dd Home Assistant Smartapp\uff0c\u4e26\u9ede\u9078\u50b3\u9001\u3002", "title": "\u5b89\u88dd SmartApp" } - }, - "title": "SmartThings" - } + } + }, + "title": "SmartThings" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/bg.json b/homeassistant/components/smhi/.translations/bg.json index 9a8767fa7c7e..2167553ce66e 100644 --- a/homeassistant/components/smhi/.translations/bg.json +++ b/homeassistant/components/smhi/.translations/bg.json @@ -13,7 +13,7 @@ }, "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0428\u0432\u0435\u0446\u0438\u044f" } - }, - "title": "\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (SMHI)" - } + } + }, + "title": "\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ca.json b/homeassistant/components/smhi/.translations/ca.json index e265df40217d..0ee1284a341a 100644 --- a/homeassistant/components/smhi/.translations/ca.json +++ b/homeassistant/components/smhi/.translations/ca.json @@ -13,7 +13,7 @@ }, "title": "Ubicaci\u00f3 a Su\u00e8cia" } - }, - "title": "Servei meteorol\u00f2gic suec (SMHI)" - } + } + }, + "title": "Servei meteorol\u00f2gic suec (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/cs.json b/homeassistant/components/smhi/.translations/cs.json index 356603c9cf8e..1e4ccb679426 100644 --- a/homeassistant/components/smhi/.translations/cs.json +++ b/homeassistant/components/smhi/.translations/cs.json @@ -13,7 +13,7 @@ }, "title": "Lokalita ve \u0160v\u00e9dsku" } - }, - "title": "\u0160v\u00e9dsk\u00e1 meteorologick\u00e1 slu\u017eba (SMHI)" - } + } + }, + "title": "\u0160v\u00e9dsk\u00e1 meteorologick\u00e1 slu\u017eba (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/da.json b/homeassistant/components/smhi/.translations/da.json index 52c4f54ebd7f..66e56e73bf98 100644 --- a/homeassistant/components/smhi/.translations/da.json +++ b/homeassistant/components/smhi/.translations/da.json @@ -13,7 +13,7 @@ }, "title": "Lokalitet i Sverige" } - }, - "title": "Svensk vejr service (SMHI)" - } + } + }, + "title": "Svensk vejr service (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/de.json b/homeassistant/components/smhi/.translations/de.json index 7c41731988c3..dc12b0b2aec2 100644 --- a/homeassistant/components/smhi/.translations/de.json +++ b/homeassistant/components/smhi/.translations/de.json @@ -13,7 +13,7 @@ }, "title": "Standort in Schweden" } - }, - "title": "Schwedischer Wetterdienst (SMHI)" - } + } + }, + "title": "Schwedischer Wetterdienst (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/en.json b/homeassistant/components/smhi/.translations/en.json index 6aa256d87d49..725e95cee0c9 100644 --- a/homeassistant/components/smhi/.translations/en.json +++ b/homeassistant/components/smhi/.translations/en.json @@ -13,7 +13,7 @@ }, "title": "Location in Sweden" } - }, - "title": "Swedish weather service (SMHI)" - } + } + }, + "title": "Swedish weather service (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/es-419.json b/homeassistant/components/smhi/.translations/es-419.json index a3fb9ee5e27e..e4524f4dcc38 100644 --- a/homeassistant/components/smhi/.translations/es-419.json +++ b/homeassistant/components/smhi/.translations/es-419.json @@ -13,7 +13,7 @@ }, "title": "Ubicaci\u00f3n en Suecia" } - }, - "title": "Servicio meteorol\u00f3gico sueco (SMHI)" - } + } + }, + "title": "Servicio meteorol\u00f3gico sueco (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/es.json b/homeassistant/components/smhi/.translations/es.json index 627c534f6ddf..5cfefc80793b 100644 --- a/homeassistant/components/smhi/.translations/es.json +++ b/homeassistant/components/smhi/.translations/es.json @@ -13,7 +13,7 @@ }, "title": "Ubicaci\u00f3n en Suecia" } - }, - "title": "Servicio meteorol\u00f3gico sueco (SMHI)" - } + } + }, + "title": "Servicio meteorol\u00f3gico sueco (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/fr.json b/homeassistant/components/smhi/.translations/fr.json index aa4589e558d6..bd0ad0266152 100644 --- a/homeassistant/components/smhi/.translations/fr.json +++ b/homeassistant/components/smhi/.translations/fr.json @@ -13,7 +13,7 @@ }, "title": "Localisation en Su\u00e8de" } - }, - "title": "Service m\u00e9t\u00e9orologique su\u00e9dois (SMHI)" - } + } + }, + "title": "Service m\u00e9t\u00e9orologique su\u00e9dois (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/hu.json b/homeassistant/components/smhi/.translations/hu.json index 8c79ff3bfaf7..bd39f4cff725 100644 --- a/homeassistant/components/smhi/.translations/hu.json +++ b/homeassistant/components/smhi/.translations/hu.json @@ -13,7 +13,7 @@ }, "title": "Helysz\u00edn Sv\u00e9dorsz\u00e1gban" } - }, - "title": "Sv\u00e9d Meteorol\u00f3giai Szolg\u00e1lat (SMHI)" - } + } + }, + "title": "Sv\u00e9d Meteorol\u00f3giai Szolg\u00e1lat (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/it.json b/homeassistant/components/smhi/.translations/it.json index 1c886e4f20eb..b3b4155a556b 100644 --- a/homeassistant/components/smhi/.translations/it.json +++ b/homeassistant/components/smhi/.translations/it.json @@ -13,7 +13,7 @@ }, "title": "Localit\u00e0 in Svezia" } - }, - "title": "Servizio meteo svedese (SMHI)" - } + } + }, + "title": "Servizio meteo svedese (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ko.json b/homeassistant/components/smhi/.translations/ko.json index f307fa1ad232..3e3ab1e2ac71 100644 --- a/homeassistant/components/smhi/.translations/ko.json +++ b/homeassistant/components/smhi/.translations/ko.json @@ -13,7 +13,7 @@ }, "title": "\uc2a4\uc6e8\ub374 \uc9c0\uc5ed \uc704\uce58" } - }, - "title": "\uc2a4\uc6e8\ub374 \uae30\uc0c1 \uc11c\ube44\uc2a4 (SMHI)" - } + } + }, + "title": "\uc2a4\uc6e8\ub374 \uae30\uc0c1 \uc11c\ube44\uc2a4 (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/lb.json b/homeassistant/components/smhi/.translations/lb.json index 46abfd2677f7..b70a3059be06 100644 --- a/homeassistant/components/smhi/.translations/lb.json +++ b/homeassistant/components/smhi/.translations/lb.json @@ -13,7 +13,7 @@ }, "title": "Uertschaft an Schweden" } - }, - "title": "Schwedeschen Wieder D\u00e9ngscht (SMHI)" - } + } + }, + "title": "Schwedeschen Wieder D\u00e9ngscht (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/nl.json b/homeassistant/components/smhi/.translations/nl.json index 88edc116e746..7227ff139b07 100644 --- a/homeassistant/components/smhi/.translations/nl.json +++ b/homeassistant/components/smhi/.translations/nl.json @@ -13,7 +13,7 @@ }, "title": "Locatie in Zweden" } - }, - "title": "Zweedse weerdienst (SMHI)" - } + } + }, + "title": "Zweedse weerdienst (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/no.json b/homeassistant/components/smhi/.translations/no.json index 19c90f8ec5cb..223150f2cd55 100644 --- a/homeassistant/components/smhi/.translations/no.json +++ b/homeassistant/components/smhi/.translations/no.json @@ -13,7 +13,7 @@ }, "title": "Plassering i Sverige" } - }, - "title": "Sveriges Meteorologiske og Hydrologiske Institut (SMHI)" - } + } + }, + "title": "Sveriges Meteorologiske og Hydrologiske Institut (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pl.json b/homeassistant/components/smhi/.translations/pl.json index 818f27853fff..5bfd1d487f17 100644 --- a/homeassistant/components/smhi/.translations/pl.json +++ b/homeassistant/components/smhi/.translations/pl.json @@ -13,7 +13,7 @@ }, "title": "Lokalizacja w Szwecji" } - }, - "title": "Szwedzka us\u0142uga pogodowa (SMHI)" - } + } + }, + "title": "Szwedzka us\u0142uga pogodowa (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pt-BR.json b/homeassistant/components/smhi/.translations/pt-BR.json index 848f85ed1331..6e888f6d5c80 100644 --- a/homeassistant/components/smhi/.translations/pt-BR.json +++ b/homeassistant/components/smhi/.translations/pt-BR.json @@ -13,7 +13,7 @@ }, "title": "Localiza\u00e7\u00e3o na Su\u00e9cia" } - }, - "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" - } + } + }, + "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pt.json b/homeassistant/components/smhi/.translations/pt.json index e814ffd5046b..3272cd00908d 100644 --- a/homeassistant/components/smhi/.translations/pt.json +++ b/homeassistant/components/smhi/.translations/pt.json @@ -13,7 +13,7 @@ }, "title": "Localiza\u00e7\u00e3o na Su\u00e9cia" } - }, - "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" - } + } + }, + "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ro.json b/homeassistant/components/smhi/.translations/ro.json index 6249e49d2d78..0ed6fd4d1402 100644 --- a/homeassistant/components/smhi/.translations/ro.json +++ b/homeassistant/components/smhi/.translations/ro.json @@ -13,7 +13,7 @@ }, "title": "Loca\u021bie \u00een Suedia" } - }, - "title": "Serviciul meteorologic suedez (SMHI)" - } + } + }, + "title": "Serviciul meteorologic suedez (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ru.json b/homeassistant/components/smhi/.translations/ru.json index f3ba34adac38..6096d9b7f932 100644 --- a/homeassistant/components/smhi/.translations/ru.json +++ b/homeassistant/components/smhi/.translations/ru.json @@ -13,7 +13,7 @@ }, "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0428\u0432\u0435\u0446\u0438\u0438" } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u0428\u0432\u0435\u0446\u0438\u0438 (SMHI)" - } + } + }, + "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u0428\u0432\u0435\u0446\u0438\u0438 (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/sl.json b/homeassistant/components/smhi/.translations/sl.json index 94c3750f06f6..3dc7f769cd25 100644 --- a/homeassistant/components/smhi/.translations/sl.json +++ b/homeassistant/components/smhi/.translations/sl.json @@ -13,7 +13,7 @@ }, "title": "Lokacija na \u0160vedskem" } - }, - "title": "\u0160vedska vremenska slu\u017eba (SMHI)" - } + } + }, + "title": "\u0160vedska vremenska slu\u017eba (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/sv.json b/homeassistant/components/smhi/.translations/sv.json index 69073a0eb73d..f79a28314389 100644 --- a/homeassistant/components/smhi/.translations/sv.json +++ b/homeassistant/components/smhi/.translations/sv.json @@ -13,7 +13,7 @@ }, "title": "Plats i Sverige" } - }, - "title": "Svensk v\u00e4derservice (SMHI)" - } + } + }, + "title": "Svensk v\u00e4derservice (SMHI)" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/zh-Hans.json b/homeassistant/components/smhi/.translations/zh-Hans.json index a70bb7a67221..964bb4942ec4 100644 --- a/homeassistant/components/smhi/.translations/zh-Hans.json +++ b/homeassistant/components/smhi/.translations/zh-Hans.json @@ -13,7 +13,7 @@ }, "title": "\u5728\u745e\u5178\u7684\u4f4d\u7f6e" } - }, - "title": "\u745e\u5178\u6c14\u8c61\u670d\u52a1\uff08SMHI\uff09" - } + } + }, + "title": "\u745e\u5178\u6c14\u8c61\u670d\u52a1\uff08SMHI\uff09" } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/zh-Hant.json b/homeassistant/components/smhi/.translations/zh-Hant.json index b982baac2f8e..281726861a87 100644 --- a/homeassistant/components/smhi/.translations/zh-Hant.json +++ b/homeassistant/components/smhi/.translations/zh-Hant.json @@ -13,7 +13,7 @@ }, "title": "\u745e\u5178\u5ea7\u6a19" } - }, - "title": "\u745e\u5178\u6c23\u8c61\u670d\u52d9\uff08SMHI\uff09" - } + } + }, + "title": "\u745e\u5178\u6c23\u8c61\u670d\u52d9\uff08SMHI\uff09" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/bg.json b/homeassistant/components/solaredge/.translations/bg.json index e4223e373fd5..41154732530c 100644 --- a/homeassistant/components/solaredge/.translations/bg.json +++ b/homeassistant/components/solaredge/.translations/bg.json @@ -15,7 +15,7 @@ }, "title": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (API) \u0437\u0430 \u0442\u0430\u0437\u0438 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u044f" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ca.json b/homeassistant/components/solaredge/.translations/ca.json index fd3707af3ddd..84b05f3a26ac 100644 --- a/homeassistant/components/solaredge/.translations/ca.json +++ b/homeassistant/components/solaredge/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Configuraci\u00f3 dels par\u00e0metres de l'API per aquesta instal\u00b7laci\u00f3" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/da.json b/homeassistant/components/solaredge/.translations/da.json index 7ed64f51083d..978bacfbec45 100644 --- a/homeassistant/components/solaredge/.translations/da.json +++ b/homeassistant/components/solaredge/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Definer API-parametre til denne installation" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/de.json b/homeassistant/components/solaredge/.translations/de.json index cbe913e131c4..f75a9af1b668 100644 --- a/homeassistant/components/solaredge/.translations/de.json +++ b/homeassistant/components/solaredge/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Definiere die API-Parameter f\u00fcr diese Installation" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/en.json b/homeassistant/components/solaredge/.translations/en.json index 7b06c110397f..d9345e42fdca 100644 --- a/homeassistant/components/solaredge/.translations/en.json +++ b/homeassistant/components/solaredge/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Define the API parameters for this installation" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/es.json b/homeassistant/components/solaredge/.translations/es.json index 8708729bf4ae..458ba0436a22 100644 --- a/homeassistant/components/solaredge/.translations/es.json +++ b/homeassistant/components/solaredge/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Definir los par\u00e1metros de la API para esta instalaci\u00f3n" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/fr.json b/homeassistant/components/solaredge/.translations/fr.json index 201e3ff49c61..f2d4e623fcfd 100644 --- a/homeassistant/components/solaredge/.translations/fr.json +++ b/homeassistant/components/solaredge/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9finir les param\u00e8tres de l'API pour cette installation" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/hu.json b/homeassistant/components/solaredge/.translations/hu.json index ae8f51983ea2..22d7727637aa 100644 --- a/homeassistant/components/solaredge/.translations/hu.json +++ b/homeassistant/components/solaredge/.translations/hu.json @@ -7,7 +7,7 @@ }, "title": "Az API param\u00e9terek megad\u00e1sa ehhez a telep\u00edt\u00e9shez" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/it.json b/homeassistant/components/solaredge/.translations/it.json index 6523f393628f..483edab97b4b 100644 --- a/homeassistant/components/solaredge/.translations/it.json +++ b/homeassistant/components/solaredge/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Definire i parametri API per questa installazione" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ko.json b/homeassistant/components/solaredge/.translations/ko.json index 3d4b34482528..ff2e4b1e97a6 100644 --- a/homeassistant/components/solaredge/.translations/ko.json +++ b/homeassistant/components/solaredge/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "\uc774 \uc124\uce58\uc5d0 \ub300\ud55c API \ub9e4\uac1c\ubcc0\uc218\ub97c \uc815\uc758\ud574\uc8fc\uc138\uc694" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/lb.json b/homeassistant/components/solaredge/.translations/lb.json index afc558ca80cd..76d928833a6c 100644 --- a/homeassistant/components/solaredge/.translations/lb.json +++ b/homeassistant/components/solaredge/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "API Parameter fir d\u00ebs Installatioun d\u00e9fin\u00e9ieren" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/nl.json b/homeassistant/components/solaredge/.translations/nl.json index 3cc52b43a631..15cf27984b77 100644 --- a/homeassistant/components/solaredge/.translations/nl.json +++ b/homeassistant/components/solaredge/.translations/nl.json @@ -15,7 +15,7 @@ }, "title": "Definieer de API-parameters voor deze installatie" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/no.json b/homeassistant/components/solaredge/.translations/no.json index 4dd4177dd152..6f41bfe0a2b4 100644 --- a/homeassistant/components/solaredge/.translations/no.json +++ b/homeassistant/components/solaredge/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Definer API-parametrene for denne installasjonen" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/pl.json b/homeassistant/components/solaredge/.translations/pl.json index 5e80c1563f48..53370bac086f 100644 --- a/homeassistant/components/solaredge/.translations/pl.json +++ b/homeassistant/components/solaredge/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Zdefiniuj parametry API dla tej instalacji" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ru.json b/homeassistant/components/solaredge/.translations/ru.json index e6e7094648d8..491072a841bb 100644 --- a/homeassistant/components/solaredge/.translations/ru.json +++ b/homeassistant/components/solaredge/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "SolarEdge" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/sl.json b/homeassistant/components/solaredge/.translations/sl.json index ebfefe40b0e5..4ac26d670b88 100644 --- a/homeassistant/components/solaredge/.translations/sl.json +++ b/homeassistant/components/solaredge/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Dolo\u010dite parametre API za to namestitev" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/sv.json b/homeassistant/components/solaredge/.translations/sv.json index 25bb0f325a15..42a2c217051b 100644 --- a/homeassistant/components/solaredge/.translations/sv.json +++ b/homeassistant/components/solaredge/.translations/sv.json @@ -15,7 +15,7 @@ }, "title": "Definiera API-parametrarna f\u00f6r den h\u00e4r installationen" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/zh-Hant.json b/homeassistant/components/solaredge/.translations/zh-Hant.json index 698c28d99bf7..f3802963243f 100644 --- a/homeassistant/components/solaredge/.translations/zh-Hant.json +++ b/homeassistant/components/solaredge/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u8a2d\u5b9a API \u53c3\u6578" } - }, - "title": "SolarEdge" - } + } + }, + "title": "SolarEdge" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/bg.json b/homeassistant/components/solarlog/.translations/bg.json index 6dabc169f12e..7c730cbba473 100644 --- a/homeassistant/components/solarlog/.translations/bg.json +++ b/homeassistant/components/solarlog/.translations/bg.json @@ -15,7 +15,7 @@ }, "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0441\u0438 \u0441\u044a\u0441 Solar-log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ca.json b/homeassistant/components/solarlog/.translations/ca.json index 6a041c7ea4f7..699eebac65c9 100644 --- a/homeassistant/components/solarlog/.translations/ca.json +++ b/homeassistant/components/solarlog/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Configuraci\u00f3 de la connexi\u00f3 amb Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/cs.json b/homeassistant/components/solarlog/.translations/cs.json index f2294823ebb6..2930048d59d4 100644 --- a/homeassistant/components/solarlog/.translations/cs.json +++ b/homeassistant/components/solarlog/.translations/cs.json @@ -15,7 +15,7 @@ }, "title": "Definujte sv\u00e9 p\u0159ipojen\u00ed Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/da.json b/homeassistant/components/solarlog/.translations/da.json index a344832c61cb..1ce3bc44de50 100644 --- a/homeassistant/components/solarlog/.translations/da.json +++ b/homeassistant/components/solarlog/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Angiv dit Solar-Log forbindelse" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/de.json b/homeassistant/components/solarlog/.translations/de.json index 3e71154b3837..621bd13ee1bd 100644 --- a/homeassistant/components/solarlog/.translations/de.json +++ b/homeassistant/components/solarlog/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Definiere deine Solar-Log-Verbindung" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/en.json b/homeassistant/components/solarlog/.translations/en.json index f1396045819c..136ef6fe14e6 100644 --- a/homeassistant/components/solarlog/.translations/en.json +++ b/homeassistant/components/solarlog/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Define your Solar-Log connection" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/es.json b/homeassistant/components/solarlog/.translations/es.json index 2e6778ffbf38..4e171b99df6f 100644 --- a/homeassistant/components/solarlog/.translations/es.json +++ b/homeassistant/components/solarlog/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Defina su conexi\u00f3n Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/fr.json b/homeassistant/components/solarlog/.translations/fr.json index 0f1b4944ed9b..d9a6a482e885 100644 --- a/homeassistant/components/solarlog/.translations/fr.json +++ b/homeassistant/components/solarlog/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9finissez votre connexion Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/it.json b/homeassistant/components/solarlog/.translations/it.json index 65c13f052d34..81ac10aad54b 100644 --- a/homeassistant/components/solarlog/.translations/it.json +++ b/homeassistant/components/solarlog/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Definire la connessione Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ko.json b/homeassistant/components/solarlog/.translations/ko.json index ea337d1e6754..64c56cb37d32 100644 --- a/homeassistant/components/solarlog/.translations/ko.json +++ b/homeassistant/components/solarlog/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "Solar-Log \uc5f0\uacb0 \uc815\uc758" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/lb.json b/homeassistant/components/solarlog/.translations/lb.json index 8bfaca69d94d..5d835341b6cc 100644 --- a/homeassistant/components/solarlog/.translations/lb.json +++ b/homeassistant/components/solarlog/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9fin\u00e9iert \u00e4r Solar-Log Verbindung" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/nl.json b/homeassistant/components/solarlog/.translations/nl.json index 3965f71e992d..36ccf94c22d1 100644 --- a/homeassistant/components/solarlog/.translations/nl.json +++ b/homeassistant/components/solarlog/.translations/nl.json @@ -15,7 +15,7 @@ }, "title": "Definieer uw Solar-Log verbinding" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/nn.json b/homeassistant/components/solarlog/.translations/nn.json index 3ce86b4e10a9..7ea0915a1247 100644 --- a/homeassistant/components/solarlog/.translations/nn.json +++ b/homeassistant/components/solarlog/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Solar-Log" - } + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/no.json b/homeassistant/components/solarlog/.translations/no.json index 9fddb46cdcfa..5963c62bd487 100644 --- a/homeassistant/components/solarlog/.translations/no.json +++ b/homeassistant/components/solarlog/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Definer din Solar-Log tilkobling" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/pl.json b/homeassistant/components/solarlog/.translations/pl.json index fdbf21feb920..00d2f264b293 100644 --- a/homeassistant/components/solarlog/.translations/pl.json +++ b/homeassistant/components/solarlog/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Zdefiniuj po\u0142\u0105czenie z Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ru.json b/homeassistant/components/solarlog/.translations/ru.json index 3333d5c0d5f2..5f9497d48f81 100644 --- a/homeassistant/components/solarlog/.translations/ru.json +++ b/homeassistant/components/solarlog/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/sl.json b/homeassistant/components/solarlog/.translations/sl.json index 152152eacf7f..8024236963c1 100644 --- a/homeassistant/components/solarlog/.translations/sl.json +++ b/homeassistant/components/solarlog/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Dolo\u010dite povezavo Solar-Log" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/sv.json b/homeassistant/components/solarlog/.translations/sv.json index 981bd9fb167b..9942533798bd 100644 --- a/homeassistant/components/solarlog/.translations/sv.json +++ b/homeassistant/components/solarlog/.translations/sv.json @@ -15,7 +15,7 @@ }, "title": "Definiera din Solar-Log-anslutning" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/zh-Hant.json b/homeassistant/components/solarlog/.translations/zh-Hant.json index e44d7a3f9d37..580418df94b5 100644 --- a/homeassistant/components/solarlog/.translations/zh-Hant.json +++ b/homeassistant/components/solarlog/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u5b9a\u7fa9 Solar-Log \u9023\u7dda" } - }, - "title": "Solar-Log" - } + } + }, + "title": "Solar-Log" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/bg.json b/homeassistant/components/soma/.translations/bg.json index 0b7dd3b689f2..064da5cedf3f 100644 --- a/homeassistant/components/soma/.translations/bg.json +++ b/homeassistant/components/soma/.translations/bg.json @@ -17,7 +17,7 @@ "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0437\u0430 \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 \u0412\u0430\u0448\u0438\u044f SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ca.json b/homeassistant/components/soma/.translations/ca.json index 00bc3eef39c1..b08beffb16c3 100644 --- a/homeassistant/components/soma/.translations/ca.json +++ b/homeassistant/components/soma/.translations/ca.json @@ -19,7 +19,7 @@ "description": "Introdueix la informaci\u00f3 de connexi\u00f3 de SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/da.json b/homeassistant/components/soma/.translations/da.json index 49bf83148a23..b13fb51aa50b 100644 --- a/homeassistant/components/soma/.translations/da.json +++ b/homeassistant/components/soma/.translations/da.json @@ -19,7 +19,7 @@ "description": "Indtast forbindelsesindstillinger for din SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/de.json b/homeassistant/components/soma/.translations/de.json index 384e7ec4207f..75a19c6a208b 100644 --- a/homeassistant/components/soma/.translations/de.json +++ b/homeassistant/components/soma/.translations/de.json @@ -19,7 +19,7 @@ "description": "Bitte gib die Verbindungsinformationen f\u00fcr SOMA Connect ein.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/en.json b/homeassistant/components/soma/.translations/en.json index 46bfd441fc49..46b2f34b7a26 100644 --- a/homeassistant/components/soma/.translations/en.json +++ b/homeassistant/components/soma/.translations/en.json @@ -19,7 +19,7 @@ "description": "Please enter connection settings of your SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/es.json b/homeassistant/components/soma/.translations/es.json index 6df113b82c93..420cf8fbb493 100644 --- a/homeassistant/components/soma/.translations/es.json +++ b/homeassistant/components/soma/.translations/es.json @@ -19,7 +19,7 @@ "description": "Por favor, introduzca los ajustes de conexi\u00f3n de SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/fr.json b/homeassistant/components/soma/.translations/fr.json index 0889cdea2ec8..69f98c185043 100644 --- a/homeassistant/components/soma/.translations/fr.json +++ b/homeassistant/components/soma/.translations/fr.json @@ -19,7 +19,7 @@ "description": "Veuillez entrer les param\u00e8tres de connexion de votre SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/hu.json b/homeassistant/components/soma/.translations/hu.json index 797cfa1b2d86..9c63ecc36650 100644 --- a/homeassistant/components/soma/.translations/hu.json +++ b/homeassistant/components/soma/.translations/hu.json @@ -17,7 +17,7 @@ "description": "K\u00e9rj\u00fck, adja meg a SOMA Connect csatlakoz\u00e1si be\u00e1ll\u00edt\u00e1sait.", "title": "SOMA csatlakoz\u00e1s" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/it.json b/homeassistant/components/soma/.translations/it.json index 6c7d0129708f..6bd93ee7bfdc 100644 --- a/homeassistant/components/soma/.translations/it.json +++ b/homeassistant/components/soma/.translations/it.json @@ -19,7 +19,7 @@ "description": "Inserisci le impostazioni di connessione del tuo SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ko.json b/homeassistant/components/soma/.translations/ko.json index ea79a4559243..4a1cca9e5399 100644 --- a/homeassistant/components/soma/.translations/ko.json +++ b/homeassistant/components/soma/.translations/ko.json @@ -19,7 +19,7 @@ "description": "SOMA Connect \uc5f0\uacb0 \uc124\uc815\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/lb.json b/homeassistant/components/soma/.translations/lb.json index fdf180a1a611..b484d5925a5a 100644 --- a/homeassistant/components/soma/.translations/lb.json +++ b/homeassistant/components/soma/.translations/lb.json @@ -19,7 +19,7 @@ "description": "Gitt Verbindungs Informatioune vun \u00e4rem SOMA Connect an.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/nl.json b/homeassistant/components/soma/.translations/nl.json index 058f7222666f..823ee6c75314 100644 --- a/homeassistant/components/soma/.translations/nl.json +++ b/homeassistant/components/soma/.translations/nl.json @@ -19,7 +19,7 @@ "description": "Voer de verbindingsinstellingen van uw SOMA Connect in.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/nn.json b/homeassistant/components/soma/.translations/nn.json index 6eeb4f75a3c5..961b47595e7d 100644 --- a/homeassistant/components/soma/.translations/nn.json +++ b/homeassistant/components/soma/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Soma" - } + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/no.json b/homeassistant/components/soma/.translations/no.json index c8cfa1473fee..43109352dff6 100644 --- a/homeassistant/components/soma/.translations/no.json +++ b/homeassistant/components/soma/.translations/no.json @@ -19,7 +19,7 @@ "description": "Vennligst skriv tilkoblingsinnstillingene for din SOMA Connect.", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/pl.json b/homeassistant/components/soma/.translations/pl.json index 102413bf4463..c77ebb5369f3 100644 --- a/homeassistant/components/soma/.translations/pl.json +++ b/homeassistant/components/soma/.translations/pl.json @@ -19,7 +19,7 @@ "description": "Wprowad\u017a ustawienia po\u0142\u0105czenia SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ru.json b/homeassistant/components/soma/.translations/ru.json index fa581eb0821d..cb9786da233b 100644 --- a/homeassistant/components/soma/.translations/ru.json +++ b/homeassistant/components/soma/.translations/ru.json @@ -19,7 +19,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/sl.json b/homeassistant/components/soma/.translations/sl.json index 01f7e50eb96d..c8ea22517588 100644 --- a/homeassistant/components/soma/.translations/sl.json +++ b/homeassistant/components/soma/.translations/sl.json @@ -19,7 +19,7 @@ "description": "Prosimo, vnesite nastavitve povezave za va\u0161 SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/sv.json b/homeassistant/components/soma/.translations/sv.json index bb3ce895fd57..ece81ba345b2 100644 --- a/homeassistant/components/soma/.translations/sv.json +++ b/homeassistant/components/soma/.translations/sv.json @@ -19,7 +19,7 @@ "description": "Ange anslutningsinst\u00e4llningar f\u00f6r din SOMA Connect.", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/zh-Hant.json b/homeassistant/components/soma/.translations/zh-Hant.json index 73b26cb91f1a..e3882a4fc2dc 100644 --- a/homeassistant/components/soma/.translations/zh-Hant.json +++ b/homeassistant/components/soma/.translations/zh-Hant.json @@ -19,7 +19,7 @@ "description": "\u8acb\u8f38\u5165 SOMA Connect \u9023\u7dda\u8a2d\u5b9a\u3002", "title": "SOMA Connect" } - }, - "title": "Soma" - } + } + }, + "title": "Soma" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/bg.json b/homeassistant/components/somfy/.translations/bg.json index 4741ccdba6d2..043f37e52f83 100644 --- a/homeassistant/components/somfy/.translations/bg.json +++ b/homeassistant/components/somfy/.translations/bg.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u0418\u0437\u0431\u043e\u0440 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ca.json b/homeassistant/components/somfy/.translations/ca.json index 58b8853cd513..4c917794ca96 100644 --- a/homeassistant/components/somfy/.translations/ca.json +++ b/homeassistant/components/somfy/.translations/ca.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/da.json b/homeassistant/components/somfy/.translations/da.json index b50c030c6365..0cd23e6a11b5 100644 --- a/homeassistant/components/somfy/.translations/da.json +++ b/homeassistant/components/somfy/.translations/da.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e6lg godkendelsesmetode" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/de.json b/homeassistant/components/somfy/.translations/de.json index b950a439ef39..9db0ccb35057 100644 --- a/homeassistant/components/somfy/.translations/de.json +++ b/homeassistant/components/somfy/.translations/de.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "W\u00e4hle die Authentifizierungsmethode" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/en.json b/homeassistant/components/somfy/.translations/en.json index 3b2f2e6beafe..54c6e3b8336e 100644 --- a/homeassistant/components/somfy/.translations/en.json +++ b/homeassistant/components/somfy/.translations/en.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Pick Authentication Method" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/es-419.json b/homeassistant/components/somfy/.translations/es-419.json index ff0383c7f015..ea066156c713 100644 --- a/homeassistant/components/somfy/.translations/es-419.json +++ b/homeassistant/components/somfy/.translations/es-419.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Somfy" - } + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/es.json b/homeassistant/components/somfy/.translations/es.json index d20eb71cc556..ce2614b9989d 100644 --- a/homeassistant/components/somfy/.translations/es.json +++ b/homeassistant/components/somfy/.translations/es.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/fr.json b/homeassistant/components/somfy/.translations/fr.json index 29a3eb778532..70cf906841a3 100644 --- a/homeassistant/components/somfy/.translations/fr.json +++ b/homeassistant/components/somfy/.translations/fr.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Choisir la m\u00e9thode d'authentification" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/hr.json b/homeassistant/components/somfy/.translations/hr.json index 3a9041020764..b9dad43c44e0 100644 --- a/homeassistant/components/somfy/.translations/hr.json +++ b/homeassistant/components/somfy/.translations/hr.json @@ -2,7 +2,7 @@ "config": { "create_entry": { "default": "Uspje\u0161no autentificirano sa Somfy." - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/it.json b/homeassistant/components/somfy/.translations/it.json index c91536abc773..0c0ccf25a124 100644 --- a/homeassistant/components/somfy/.translations/it.json +++ b/homeassistant/components/somfy/.translations/it.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Seleziona il metodo di autenticazione" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ko.json b/homeassistant/components/somfy/.translations/ko.json index c7fa0e4d293a..1ce59e3dbc5d 100644 --- a/homeassistant/components/somfy/.translations/ko.json +++ b/homeassistant/components/somfy/.translations/ko.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/lb.json b/homeassistant/components/somfy/.translations/lb.json index 0a1cfa83250c..8ed84338a1e0 100644 --- a/homeassistant/components/somfy/.translations/lb.json +++ b/homeassistant/components/somfy/.translations/lb.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wielt Authentifikatiouns Method aus" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/nl.json b/homeassistant/components/somfy/.translations/nl.json index b08bc3431cd1..4d764b0dab64 100644 --- a/homeassistant/components/somfy/.translations/nl.json +++ b/homeassistant/components/somfy/.translations/nl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Kies de authenticatie methode" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/nn.json b/homeassistant/components/somfy/.translations/nn.json index ff0383c7f015..ea066156c713 100644 --- a/homeassistant/components/somfy/.translations/nn.json +++ b/homeassistant/components/somfy/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Somfy" - } + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/no.json b/homeassistant/components/somfy/.translations/no.json index f5944cbf9c7c..3a28194f6e00 100644 --- a/homeassistant/components/somfy/.translations/no.json +++ b/homeassistant/components/somfy/.translations/no.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Velg autentiseringsmetode" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/pl.json b/homeassistant/components/somfy/.translations/pl.json index e08e921cf1ab..d9a7fd5307ea 100644 --- a/homeassistant/components/somfy/.translations/pl.json +++ b/homeassistant/components/somfy/.translations/pl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wybierz metod\u0119 uwierzytelniania" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/pt-BR.json b/homeassistant/components/somfy/.translations/pt-BR.json index 302ac53bb623..2f3a55fc9112 100644 --- a/homeassistant/components/somfy/.translations/pt-BR.json +++ b/homeassistant/components/somfy/.translations/pt-BR.json @@ -7,7 +7,7 @@ }, "create_entry": { "default": "Autenticado com sucesso pela Somfy." - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ru.json b/homeassistant/components/somfy/.translations/ru.json index 0cdb43e4241a..8b9244c5d9f4 100644 --- a/homeassistant/components/somfy/.translations/ru.json +++ b/homeassistant/components/somfy/.translations/ru.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/sl.json b/homeassistant/components/somfy/.translations/sl.json index bdfbade2bbe8..cc8be9303412 100644 --- a/homeassistant/components/somfy/.translations/sl.json +++ b/homeassistant/components/somfy/.translations/sl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Izberite na\u010din preverjanja pristnosti" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/sv.json b/homeassistant/components/somfy/.translations/sv.json index 982b32a90a10..4fa8975523ec 100644 --- a/homeassistant/components/somfy/.translations/sv.json +++ b/homeassistant/components/somfy/.translations/sv.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e4lj autentiseringsmetod" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/zh-Hant.json b/homeassistant/components/somfy/.translations/zh-Hant.json index 3b11e6ef6e0d..1fbff59337be 100644 --- a/homeassistant/components/somfy/.translations/zh-Hant.json +++ b/homeassistant/components/somfy/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } - }, - "title": "Somfy" - } + } + }, + "title": "Somfy" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/bg.json b/homeassistant/components/sonos/.translations/bg.json index 392a30d01fcb..c1f87cd9a702 100644 --- a/homeassistant/components/sonos/.translations/bg.json +++ b/homeassistant/components/sonos/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ca.json b/homeassistant/components/sonos/.translations/ca.json index 67fd26f1b5ab..ef651375e51e 100644 --- a/homeassistant/components/sonos/.translations/ca.json +++ b/homeassistant/components/sonos/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/cs.json b/homeassistant/components/sonos/.translations/cs.json index c0b26284cdff..945519c859e5 100644 --- a/homeassistant/components/sonos/.translations/cs.json +++ b/homeassistant/components/sonos/.translations/cs.json @@ -9,7 +9,7 @@ "description": "Chcete nastavit Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/da.json b/homeassistant/components/sonos/.translations/da.json index c4b1a555245f..20cb32c9c0b7 100644 --- a/homeassistant/components/sonos/.translations/da.json +++ b/homeassistant/components/sonos/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du ops\u00e6tte Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/de.json b/homeassistant/components/sonos/.translations/de.json index 920d25a3bfa3..423684442e5a 100644 --- a/homeassistant/components/sonos/.translations/de.json +++ b/homeassistant/components/sonos/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du Sonos einrichten?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/en.json b/homeassistant/components/sonos/.translations/en.json index df9e9d2239de..14f85bae3204 100644 --- a/homeassistant/components/sonos/.translations/en.json +++ b/homeassistant/components/sonos/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/es-419.json b/homeassistant/components/sonos/.translations/es-419.json index ff6924389d61..b260aa210808 100644 --- a/homeassistant/components/sonos/.translations/es-419.json +++ b/homeassistant/components/sonos/.translations/es-419.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/es.json b/homeassistant/components/sonos/.translations/es.json index d2372a7d9b7f..4a1321bfda14 100644 --- a/homeassistant/components/sonos/.translations/es.json +++ b/homeassistant/components/sonos/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/et.json b/homeassistant/components/sonos/.translations/et.json index 987c54955f20..a98a23c7f0bd 100644 --- a/homeassistant/components/sonos/.translations/et.json +++ b/homeassistant/components/sonos/.translations/et.json @@ -4,7 +4,7 @@ "confirm": { "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/fr.json b/homeassistant/components/sonos/.translations/fr.json index fd2a77bd1296..5891a80dfcd3 100644 --- a/homeassistant/components/sonos/.translations/fr.json +++ b/homeassistant/components/sonos/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/he.json b/homeassistant/components/sonos/.translations/he.json index 54aa43c6151b..51e4c1139467 100644 --- a/homeassistant/components/sonos/.translations/he.json +++ b/homeassistant/components/sonos/.translations/he.json @@ -9,7 +9,7 @@ "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/hr.json b/homeassistant/components/sonos/.translations/hr.json index c91f9a78c292..835f113ba2f1 100644 --- a/homeassistant/components/sonos/.translations/hr.json +++ b/homeassistant/components/sonos/.translations/hr.json @@ -4,7 +4,7 @@ "confirm": { "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/hu.json b/homeassistant/components/sonos/.translations/hu.json index 7811a31ebdb0..5c85ca259480 100644 --- a/homeassistant/components/sonos/.translations/hu.json +++ b/homeassistant/components/sonos/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a Sonos-t?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/id.json b/homeassistant/components/sonos/.translations/id.json index dc810d9773c5..f9ba72d2013c 100644 --- a/homeassistant/components/sonos/.translations/id.json +++ b/homeassistant/components/sonos/.translations/id.json @@ -9,7 +9,7 @@ "description": "Apakah Anda ingin mengatur Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/it.json b/homeassistant/components/sonos/.translations/it.json index 06c873b436e3..60c93f7b4291 100644 --- a/homeassistant/components/sonos/.translations/it.json +++ b/homeassistant/components/sonos/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ko.json b/homeassistant/components/sonos/.translations/ko.json index 931a0beadfc9..8bf0b347b9de 100644 --- a/homeassistant/components/sonos/.translations/ko.json +++ b/homeassistant/components/sonos/.translations/ko.json @@ -9,7 +9,7 @@ "description": "Sonos \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/lb.json b/homeassistant/components/sonos/.translations/lb.json index 26eaec4584d4..d39a4d544f5d 100644 --- a/homeassistant/components/sonos/.translations/lb.json +++ b/homeassistant/components/sonos/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll Sonos konfigur\u00e9iert ginn?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/nl.json b/homeassistant/components/sonos/.translations/nl.json index de84482cc63c..d47b5648538e 100644 --- a/homeassistant/components/sonos/.translations/nl.json +++ b/homeassistant/components/sonos/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u Sonos instellen?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/nn.json b/homeassistant/components/sonos/.translations/nn.json index e7df1f23f208..a3540b0e294b 100644 --- a/homeassistant/components/sonos/.translations/nn.json +++ b/homeassistant/components/sonos/.translations/nn.json @@ -9,7 +9,7 @@ "description": "Vil du sette opp Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/no.json b/homeassistant/components/sonos/.translations/no.json index ae47916ac85a..32780cecfbdc 100644 --- a/homeassistant/components/sonos/.translations/no.json +++ b/homeassistant/components/sonos/.translations/no.json @@ -9,7 +9,7 @@ "description": "\u00d8nsker du \u00e5 sette opp Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pl.json b/homeassistant/components/sonos/.translations/pl.json index a45cb4e98241..2ebe0e5d3f3f 100644 --- a/homeassistant/components/sonos/.translations/pl.json +++ b/homeassistant/components/sonos/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Czy chcesz skonfigurowa\u0107 Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pt-BR.json b/homeassistant/components/sonos/.translations/pt-BR.json index e8264b2d6e09..c761b08c6027 100644 --- a/homeassistant/components/sonos/.translations/pt-BR.json +++ b/homeassistant/components/sonos/.translations/pt-BR.json @@ -9,7 +9,7 @@ "description": "Voc\u00ea quer configurar o Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pt.json b/homeassistant/components/sonos/.translations/pt.json index 379ca9653146..7296efb6879e 100644 --- a/homeassistant/components/sonos/.translations/pt.json +++ b/homeassistant/components/sonos/.translations/pt.json @@ -9,7 +9,7 @@ "description": "Deseja configurar o Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ro.json b/homeassistant/components/sonos/.translations/ro.json index e442ab9504e3..c2e4899b5d5a 100644 --- a/homeassistant/components/sonos/.translations/ro.json +++ b/homeassistant/components/sonos/.translations/ro.json @@ -9,7 +9,7 @@ "description": "Dori\u021bi s\u0103 configura\u021bi Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ru.json b/homeassistant/components/sonos/.translations/ru.json index 1bff827d2739..5389beaec722 100644 --- a/homeassistant/components/sonos/.translations/ru.json +++ b/homeassistant/components/sonos/.translations/ru.json @@ -9,7 +9,7 @@ "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 Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/sl.json b/homeassistant/components/sonos/.translations/sl.json index 6773465bbbfd..e4fb004456fb 100644 --- a/homeassistant/components/sonos/.translations/sl.json +++ b/homeassistant/components/sonos/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/sv.json b/homeassistant/components/sonos/.translations/sv.json index 756fe8a74832..439e9aca7901 100644 --- a/homeassistant/components/sonos/.translations/sv.json +++ b/homeassistant/components/sonos/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera Sonos?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/vi.json b/homeassistant/components/sonos/.translations/vi.json index ebeb1a8b07ce..5ff26dea4987 100644 --- a/homeassistant/components/sonos/.translations/vi.json +++ b/homeassistant/components/sonos/.translations/vi.json @@ -9,7 +9,7 @@ "description": "B\u1ea1n c\u00f3 mu\u1ed1n thi\u1ebft l\u1eadp Sonos kh\u00f4ng?", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/zh-Hans.json b/homeassistant/components/sonos/.translations/zh-Hans.json index de2609f4a715..4a29360e2cb7 100644 --- a/homeassistant/components/sonos/.translations/zh-Hans.json +++ b/homeassistant/components/sonos/.translations/zh-Hans.json @@ -9,7 +9,7 @@ "description": "\u60a8\u60f3\u8981\u914d\u7f6e Sonos \u5417\uff1f", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/zh-Hant.json b/homeassistant/components/sonos/.translations/zh-Hant.json index c6fb13c3605d..d118212e77b1 100644 --- a/homeassistant/components/sonos/.translations/zh-Hant.json +++ b/homeassistant/components/sonos/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Sonos\uff1f", "title": "Sonos" } - }, - "title": "Sonos" - } + } + }, + "title": "Sonos" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ca.json b/homeassistant/components/spotify/.translations/ca.json index fa0fa7343537..c4aacd2700db 100644 --- a/homeassistant/components/spotify/.translations/ca.json +++ b/homeassistant/components/spotify/.translations/ca.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/cs.json b/homeassistant/components/spotify/.translations/cs.json index bcb73eb66b0b..7e0f58ad78d7 100644 --- a/homeassistant/components/spotify/.translations/cs.json +++ b/homeassistant/components/spotify/.translations/cs.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Vyberte metodu ov\u011b\u0159en\u00ed" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/da.json b/homeassistant/components/spotify/.translations/da.json index f4f4950317a4..b9cf4cb2eff9 100644 --- a/homeassistant/components/spotify/.translations/da.json +++ b/homeassistant/components/spotify/.translations/da.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e6lg godkendelsesmetode" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/de.json b/homeassistant/components/spotify/.translations/de.json index 49670e77285d..8d16fbf7f991 100644 --- a/homeassistant/components/spotify/.translations/de.json +++ b/homeassistant/components/spotify/.translations/de.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Authentifizierungsmethode ausw\u00e4hlen" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/en.json b/homeassistant/components/spotify/.translations/en.json index b26b2b6daf50..6400bfcd7dce 100644 --- a/homeassistant/components/spotify/.translations/en.json +++ b/homeassistant/components/spotify/.translations/en.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Pick Authentication Method" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/es.json b/homeassistant/components/spotify/.translations/es.json index 1e8a90246eb4..6da10f785f9f 100644 --- a/homeassistant/components/spotify/.translations/es.json +++ b/homeassistant/components/spotify/.translations/es.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Elija el m\u00e9todo de autenticaci\u00f3n" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/fr.json b/homeassistant/components/spotify/.translations/fr.json index 9c233b9b9470..7fa73eb02cd5 100644 --- a/homeassistant/components/spotify/.translations/fr.json +++ b/homeassistant/components/spotify/.translations/fr.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Choisissez la m\u00e9thode d'authentification" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/hu.json b/homeassistant/components/spotify/.translations/hu.json index 414c82751b54..a51a4fb2583f 100644 --- a/homeassistant/components/spotify/.translations/hu.json +++ b/homeassistant/components/spotify/.translations/hu.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/it.json b/homeassistant/components/spotify/.translations/it.json index ffe78aa0c02a..893d33225f21 100644 --- a/homeassistant/components/spotify/.translations/it.json +++ b/homeassistant/components/spotify/.translations/it.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Scegli il metodo di autenticazione" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ko.json b/homeassistant/components/spotify/.translations/ko.json index af151ecc2d08..9ebb4c70d859 100644 --- a/homeassistant/components/spotify/.translations/ko.json +++ b/homeassistant/components/spotify/.translations/ko.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/lb.json b/homeassistant/components/spotify/.translations/lb.json index b7d555cbce1a..556c5d559b12 100644 --- a/homeassistant/components/spotify/.translations/lb.json +++ b/homeassistant/components/spotify/.translations/lb.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wielt Authentifikatiouns Method aus" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/lv.json b/homeassistant/components/spotify/.translations/lv.json index 2721c5fdffa0..01b2b7a38bd7 100644 --- a/homeassistant/components/spotify/.translations/lv.json +++ b/homeassistant/components/spotify/.translations/lv.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Spotify" - } + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/nl.json b/homeassistant/components/spotify/.translations/nl.json index abe598540441..357d307bc26c 100644 --- a/homeassistant/components/spotify/.translations/nl.json +++ b/homeassistant/components/spotify/.translations/nl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Kies Authenticatiemethode" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/no.json b/homeassistant/components/spotify/.translations/no.json index 7a545d32bad8..4dc334c6bddd 100644 --- a/homeassistant/components/spotify/.translations/no.json +++ b/homeassistant/components/spotify/.translations/no.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Velg autentiseringsmetode" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/pl.json b/homeassistant/components/spotify/.translations/pl.json index 1f2e1213882d..339f86f80a6d 100644 --- a/homeassistant/components/spotify/.translations/pl.json +++ b/homeassistant/components/spotify/.translations/pl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Wybierz metod\u0119 uwierzytelnienia" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ru.json b/homeassistant/components/spotify/.translations/ru.json index b19f226d8bbc..d0985024f139 100644 --- a/homeassistant/components/spotify/.translations/ru.json +++ b/homeassistant/components/spotify/.translations/ru.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/sl.json b/homeassistant/components/spotify/.translations/sl.json index 6ab0b0a40a6b..c1067de1d6ac 100644 --- a/homeassistant/components/spotify/.translations/sl.json +++ b/homeassistant/components/spotify/.translations/sl.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Izberite na\u010din preverjanja pristnosti" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/sv.json b/homeassistant/components/spotify/.translations/sv.json index 5c720a1f26ef..525ebde7c6a9 100644 --- a/homeassistant/components/spotify/.translations/sv.json +++ b/homeassistant/components/spotify/.translations/sv.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "V\u00e4lj autentiseringsmetod." } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/tr.json b/homeassistant/components/spotify/.translations/tr.json index 88755b800f4d..f8f224d2cda3 100644 --- a/homeassistant/components/spotify/.translations/tr.json +++ b/homeassistant/components/spotify/.translations/tr.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "Kimlik Do\u011frulama Y\u00f6ntemini Se\u00e7" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/zh-Hant.json b/homeassistant/components/spotify/.translations/zh-Hant.json index c4ba3d46343e..688f406a67ea 100644 --- a/homeassistant/components/spotify/.translations/zh-Hant.json +++ b/homeassistant/components/spotify/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "pick_implementation": { "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } - }, - "title": "Spotify" - } + } + }, + "title": "Spotify" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/bg.json b/homeassistant/components/starline/.translations/bg.json index 702c061c6294..d2ae496f350f 100644 --- a/homeassistant/components/starline/.translations/bg.json +++ b/homeassistant/components/starline/.translations/bg.json @@ -36,7 +36,7 @@ "description": "\u0418\u043c\u0435\u0439\u043b \u0438 \u043f\u0430\u0440\u043e\u043b\u0430 \u0437\u0430 \u0430\u043a\u0430\u0443\u043d\u0442 \u0432 StarLine", "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0438 \u0434\u0430\u043d\u043d\u0438" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ca.json b/homeassistant/components/starline/.translations/ca.json index 72cf1a667606..b6d7d072e5c8 100644 --- a/homeassistant/components/starline/.translations/ca.json +++ b/homeassistant/components/starline/.translations/ca.json @@ -36,7 +36,7 @@ "description": "Correu electr\u00f2nic i contrasenya del compte StarLine", "title": "Credencials d\u2019usuari" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/da.json b/homeassistant/components/starline/.translations/da.json index 2a8cbcf12700..3be1164d19a5 100644 --- a/homeassistant/components/starline/.translations/da.json +++ b/homeassistant/components/starline/.translations/da.json @@ -36,7 +36,7 @@ "description": "StarLine-konto email og adgangskode", "title": "Brugeroplysninger" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/de.json b/homeassistant/components/starline/.translations/de.json index 28332124f9cb..1c845e1c594d 100644 --- a/homeassistant/components/starline/.translations/de.json +++ b/homeassistant/components/starline/.translations/de.json @@ -36,7 +36,7 @@ "description": "StarLine Konto E-Mail und Passwort", "title": "Anmeldeinformationen" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/en.json b/homeassistant/components/starline/.translations/en.json index afe8f8c732b0..f93f6d3ff44f 100644 --- a/homeassistant/components/starline/.translations/en.json +++ b/homeassistant/components/starline/.translations/en.json @@ -36,7 +36,7 @@ "description": "StarLine account email and password", "title": "User credentials" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/es.json b/homeassistant/components/starline/.translations/es.json index bc881ced6a2e..9263a8c3ff76 100644 --- a/homeassistant/components/starline/.translations/es.json +++ b/homeassistant/components/starline/.translations/es.json @@ -36,7 +36,7 @@ "description": "Correo electr\u00f3nico y contrase\u00f1a de la cuenta StarLine", "title": "Credenciales de usuario" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/fr.json b/homeassistant/components/starline/.translations/fr.json index d15f5c37edf3..8854ec470d57 100644 --- a/homeassistant/components/starline/.translations/fr.json +++ b/homeassistant/components/starline/.translations/fr.json @@ -36,7 +36,7 @@ "description": "Adresse e-mail et mot de passe du compte StarLine", "title": "Informations d'identification de l'utilisateur" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/hu.json b/homeassistant/components/starline/.translations/hu.json index ccc5b7983d09..54d000ff614d 100644 --- a/homeassistant/components/starline/.translations/hu.json +++ b/homeassistant/components/starline/.translations/hu.json @@ -36,7 +36,7 @@ "description": "A StarLine fi\u00f3k e-mail c\u00edme \u00e9s jelszava", "title": "Felhaszn\u00e1l\u00f3i hiteles\u00edt\u0151 adatok" } - }, - "title": "Starline" - } + } + }, + "title": "Starline" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/it.json b/homeassistant/components/starline/.translations/it.json index f68732354c66..6828cffbf7c1 100644 --- a/homeassistant/components/starline/.translations/it.json +++ b/homeassistant/components/starline/.translations/it.json @@ -36,7 +36,7 @@ "description": "Email e password dell'account StarLine", "title": "Credenziali utente" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ko.json b/homeassistant/components/starline/.translations/ko.json index 4d7ecf427f86..8dcd6526865e 100644 --- a/homeassistant/components/starline/.translations/ko.json +++ b/homeassistant/components/starline/.translations/ko.json @@ -36,7 +36,7 @@ "description": "StarLine \uacc4\uc815 \uc774\uba54\uc77c \ubc0f \ube44\ubc00\ubc88\ud638", "title": "\uc0ac\uc6a9\uc790 \uc790\uaca9 \uc99d\uba85" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/lb.json b/homeassistant/components/starline/.translations/lb.json index 527add9920b9..6a917bb17b58 100644 --- a/homeassistant/components/starline/.translations/lb.json +++ b/homeassistant/components/starline/.translations/lb.json @@ -36,7 +36,7 @@ "description": "StarLine Konto Email a Passwuert", "title": "Login Informatiounen" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/nl.json b/homeassistant/components/starline/.translations/nl.json index df6a51136b68..c5d7905c5ba8 100644 --- a/homeassistant/components/starline/.translations/nl.json +++ b/homeassistant/components/starline/.translations/nl.json @@ -36,7 +36,7 @@ "description": "StarLine-account e-mailadres en wachtwoord", "title": "Gebruikersgegevens" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/nn.json b/homeassistant/components/starline/.translations/nn.json index 88b146144fbc..cb69fa9c8d8a 100644 --- a/homeassistant/components/starline/.translations/nn.json +++ b/homeassistant/components/starline/.translations/nn.json @@ -4,7 +4,7 @@ "auth_captcha": { "description": "{captcha_img}" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/no.json b/homeassistant/components/starline/.translations/no.json index 37d55aea194b..c7e3a1fee38f 100644 --- a/homeassistant/components/starline/.translations/no.json +++ b/homeassistant/components/starline/.translations/no.json @@ -36,7 +36,7 @@ "description": "E-postadresse og passord for StarLine-kontoen", "title": "Brukerlegitimasjon" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/pl.json b/homeassistant/components/starline/.translations/pl.json index 71d54bbbcd1b..f0b94eef383e 100644 --- a/homeassistant/components/starline/.translations/pl.json +++ b/homeassistant/components/starline/.translations/pl.json @@ -36,7 +36,7 @@ "description": "Adres e-mail i has\u0142o do konta StarLine", "title": "Po\u015bwiadczenia u\u017cytkownika" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ru.json b/homeassistant/components/starline/.translations/ru.json index aa84c36772b0..5555158828a8 100644 --- a/homeassistant/components/starline/.translations/ru.json +++ b/homeassistant/components/starline/.translations/ru.json @@ -36,7 +36,7 @@ "description": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 StarLine", "title": "\u0423\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/sl.json b/homeassistant/components/starline/.translations/sl.json index 3cdc5bc4bac9..a2e3728ea715 100644 --- a/homeassistant/components/starline/.translations/sl.json +++ b/homeassistant/components/starline/.translations/sl.json @@ -36,7 +36,7 @@ "description": "StarLine e-po\u0161tni ra\u010dun in geslo", "title": "Uporabni\u0161ke poverilnice" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/sv.json b/homeassistant/components/starline/.translations/sv.json index 83f2300892d8..205088154da7 100644 --- a/homeassistant/components/starline/.translations/sv.json +++ b/homeassistant/components/starline/.translations/sv.json @@ -36,7 +36,7 @@ "description": "StarLine-kontots e-postadress och l\u00f6senord", "title": "Anv\u00e4ndaruppgifter" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/zh-Hant.json b/homeassistant/components/starline/.translations/zh-Hant.json index 6f8eeffc8b19..f6b7ba833087 100644 --- a/homeassistant/components/starline/.translations/zh-Hant.json +++ b/homeassistant/components/starline/.translations/zh-Hant.json @@ -36,7 +36,7 @@ "description": "StarLine \u5e33\u865f\u90f5\u4ef6\u8207\u5bc6\u78bc", "title": "\u4f7f\u7528\u8005\u6191\u8b49" } - }, - "title": "StarLine" - } + } + }, + "title": "StarLine" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ca.json b/homeassistant/components/synology_dsm/.translations/ca.json index ce408778b55e..1e3f7b573c35 100644 --- a/homeassistant/components/synology_dsm/.translations/ca.json +++ b/homeassistant/components/synology_dsm/.translations/ca.json @@ -32,7 +32,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/de.json b/homeassistant/components/synology_dsm/.translations/de.json index fcf31df3920a..c9b127fecf29 100644 --- a/homeassistant/components/synology_dsm/.translations/de.json +++ b/homeassistant/components/synology_dsm/.translations/de.json @@ -30,7 +30,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json index 3bac6d162885..f3ffdb997ea8 100644 --- a/homeassistant/components/synology_dsm/.translations/en.json +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -32,7 +32,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json index 3bf4555641a3..80b55da4b634 100644 --- a/homeassistant/components/synology_dsm/.translations/es.json +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -32,7 +32,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ko.json b/homeassistant/components/synology_dsm/.translations/ko.json index 60fcd9866c12..6d73cc6fc9af 100644 --- a/homeassistant/components/synology_dsm/.translations/ko.json +++ b/homeassistant/components/synology_dsm/.translations/ko.json @@ -20,7 +20,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/lb.json b/homeassistant/components/synology_dsm/.translations/lb.json index 553a29634372..cc5343589a21 100644 --- a/homeassistant/components/synology_dsm/.translations/lb.json +++ b/homeassistant/components/synology_dsm/.translations/lb.json @@ -32,7 +32,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/nl.json b/homeassistant/components/synology_dsm/.translations/nl.json index 1927227b65f1..f5fe2bc17a7b 100644 --- a/homeassistant/components/synology_dsm/.translations/nl.json +++ b/homeassistant/components/synology_dsm/.translations/nl.json @@ -31,7 +31,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/no.json b/homeassistant/components/synology_dsm/.translations/no.json new file mode 100644 index 000000000000..998080b1ca9c --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/no.json @@ -0,0 +1,11 @@ +{ + "config": { + "step": { + "user": { + "data": { + "port": "Port (valgfritt)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ru.json b/homeassistant/components/synology_dsm/.translations/ru.json index 5fae9bd32ec7..a850db0f7323 100644 --- a/homeassistant/components/synology_dsm/.translations/ru.json +++ b/homeassistant/components/synology_dsm/.translations/ru.json @@ -32,7 +32,7 @@ }, "title": "Synology DSM" } - }, - "title": "Synology DSM" - } + } + }, + "title": "Synology DSM" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/zh-Hant.json b/homeassistant/components/synology_dsm/.translations/zh-Hant.json index 76144afa4c58..f7e1a9d22356 100644 --- a/homeassistant/components/synology_dsm/.translations/zh-Hant.json +++ b/homeassistant/components/synology_dsm/.translations/zh-Hant.json @@ -32,7 +32,7 @@ }, "title": "\u7fa4\u6689 DSM" } - }, - "title": "\u7fa4\u6689 DSM" - } + } + }, + "title": "\u7fa4\u6689 DSM" } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/de.json b/homeassistant/components/tado/.translations/de.json index 303e2c099ed9..eb33565615ec 100644 --- a/homeassistant/components/tado/.translations/de.json +++ b/homeassistant/components/tado/.translations/de.json @@ -16,8 +16,7 @@ }, "title": "Stellen Sie eine Verbindung zu Ihrem Tado-Konto her" } - }, - "title": "Tado" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } }, "title": "Tado" - } + }, + "title": "Tado" } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/en.json b/homeassistant/components/tado/.translations/en.json index 00890a786d1e..4eb4d59e6420 100644 --- a/homeassistant/components/tado/.translations/en.json +++ b/homeassistant/components/tado/.translations/en.json @@ -17,8 +17,7 @@ }, "title": "Connect to your Tado account" } - }, - "title": "Tado" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } }, "title": "Tado" - } + }, + "title": "Tado" } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/es.json b/homeassistant/components/tado/.translations/es.json index 908d0f7b1763..68178af768dd 100644 --- a/homeassistant/components/tado/.translations/es.json +++ b/homeassistant/components/tado/.translations/es.json @@ -17,8 +17,7 @@ }, "title": "Conectar con tu cuenta de Tado" } - }, - "title": "Tado" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } }, "title": "Tado" - } + }, + "title": "Tado" } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/no.json b/homeassistant/components/tado/.translations/no.json new file mode 100644 index 000000000000..5d2a003e5eb5 --- /dev/null +++ b/homeassistant/components/tado/.translations/no.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert" + }, + "error": { + "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", + "invalid_auth": "Ugyldig godkjenning", + "no_homes": "Det er ingen hjem knyttet til denne tado-kontoen.", + "unknown": "Uventet feil" + } + }, + "options": { + "step": { + "init": { + "description": "Fallback-modus bytter til Smart Schedule ved neste planbryter etter manuell justering av en sone.", + "title": "Juster Tado-alternativene." + } + }, + "title": "Tado" + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/ru.json b/homeassistant/components/tado/.translations/ru.json index 7690efe94f93..a2ae32f5aa96 100644 --- a/homeassistant/components/tado/.translations/ru.json +++ b/homeassistant/components/tado/.translations/ru.json @@ -17,8 +17,7 @@ }, "title": "Tado" } - }, - "title": "Tado" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } }, "title": "Tado" - } + }, + "title": "Tado" } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/zh-Hant.json b/homeassistant/components/tado/.translations/zh-Hant.json index 97e1c1f282c6..054c4464922f 100644 --- a/homeassistant/components/tado/.translations/zh-Hant.json +++ b/homeassistant/components/tado/.translations/zh-Hant.json @@ -17,8 +17,7 @@ }, "title": "\u9023\u7dda\u81f3 Tado \u5e33\u865f" } - }, - "title": "Tado" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } }, "title": "Tado" - } + }, + "title": "Tado" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/bg.json b/homeassistant/components/tellduslive/.translations/bg.json index 46ae4eba463c..96beb3141c5d 100644 --- a/homeassistant/components/tellduslive/.translations/bg.json +++ b/homeassistant/components/tellduslive/.translations/bg.json @@ -20,7 +20,7 @@ }, "title": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043a\u0440\u0430\u0439\u043d\u0430 \u0442\u043e\u0447\u043a\u0430." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ca.json b/homeassistant/components/tellduslive/.translations/ca.json index 6f337d9a4d35..933ad3cf7da0 100644 --- a/homeassistant/components/tellduslive/.translations/ca.json +++ b/homeassistant/components/tellduslive/.translations/ca.json @@ -21,7 +21,7 @@ "description": "buit", "title": "Selecci\u00f3 extrem" } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/da.json b/homeassistant/components/tellduslive/.translations/da.json index 895570c36986..c85251a0e137 100644 --- a/homeassistant/components/tellduslive/.translations/da.json +++ b/homeassistant/components/tellduslive/.translations/da.json @@ -21,7 +21,7 @@ "description": "Tom", "title": "V\u00e6lg slutpunkt." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/de.json b/homeassistant/components/tellduslive/.translations/de.json index c07ff5283635..e58c69931796 100644 --- a/homeassistant/components/tellduslive/.translations/de.json +++ b/homeassistant/components/tellduslive/.translations/de.json @@ -21,7 +21,7 @@ "description": "Leer", "title": "Endpunkt ausw\u00e4hlen." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/en.json b/homeassistant/components/tellduslive/.translations/en.json index 4ed9ef597f48..601c83d31e05 100644 --- a/homeassistant/components/tellduslive/.translations/en.json +++ b/homeassistant/components/tellduslive/.translations/en.json @@ -20,7 +20,7 @@ }, "title": "Pick endpoint." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/es-419.json b/homeassistant/components/tellduslive/.translations/es-419.json index 1281784dceb9..3b8cdff3985d 100644 --- a/homeassistant/components/tellduslive/.translations/es-419.json +++ b/homeassistant/components/tellduslive/.translations/es-419.json @@ -18,7 +18,7 @@ "host": "Host" } } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/es.json b/homeassistant/components/tellduslive/.translations/es.json index 0cee7ade0d76..b760f25a47dd 100644 --- a/homeassistant/components/tellduslive/.translations/es.json +++ b/homeassistant/components/tellduslive/.translations/es.json @@ -21,7 +21,7 @@ "description": "Vac\u00edo", "title": "Elige el punto final." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/fr.json b/homeassistant/components/tellduslive/.translations/fr.json index 70f4ef6f1d9f..f5c7efb4cd44 100644 --- a/homeassistant/components/tellduslive/.translations/fr.json +++ b/homeassistant/components/tellduslive/.translations/fr.json @@ -21,7 +21,7 @@ "description": "Vide", "title": "Choisissez le point de terminaison." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/hu.json b/homeassistant/components/tellduslive/.translations/hu.json index 8519f02ef5bb..823b50fa869b 100644 --- a/homeassistant/components/tellduslive/.translations/hu.json +++ b/homeassistant/components/tellduslive/.translations/hu.json @@ -17,7 +17,7 @@ "description": "\u00dcres", "title": "V\u00e1lassz v\u00e9gpontot." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/it.json b/homeassistant/components/tellduslive/.translations/it.json index ce152285e757..414286efdb00 100644 --- a/homeassistant/components/tellduslive/.translations/it.json +++ b/homeassistant/components/tellduslive/.translations/it.json @@ -21,7 +21,7 @@ "description": "Vuoto", "title": "Scegli l'endpoint." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ko.json b/homeassistant/components/tellduslive/.translations/ko.json index 10e289f25204..5790bc6d7a64 100644 --- a/homeassistant/components/tellduslive/.translations/ko.json +++ b/homeassistant/components/tellduslive/.translations/ko.json @@ -21,7 +21,7 @@ "description": "\uc8c4\uc1a1\ud569\ub2c8\ub2e4. \uad00\ub828 \ub0b4\uc6a9\uc774 \uc544\uc9c1 \uc5c5\ub370\uc774\ud2b8 \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ucd94\ud6c4\uc5d0 \ubc18\uc601\ub420 \uc608\uc815\uc774\ub2c8 \uc870\uae08\ub9cc \uae30\ub2e4\ub824\uc8fc\uc138\uc694.", "title": "\uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uc120\ud0dd" } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/lb.json b/homeassistant/components/tellduslive/.translations/lb.json index a01436f9ba82..3437a73f6a4f 100644 --- a/homeassistant/components/tellduslive/.translations/lb.json +++ b/homeassistant/components/tellduslive/.translations/lb.json @@ -21,7 +21,7 @@ "description": "Eidel", "title": "Endpoint auswielen" } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/nl.json b/homeassistant/components/tellduslive/.translations/nl.json index fac9475f6f36..905653b70159 100644 --- a/homeassistant/components/tellduslive/.translations/nl.json +++ b/homeassistant/components/tellduslive/.translations/nl.json @@ -21,7 +21,7 @@ "description": "Leeg", "title": "Kies eindpunt." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/nn.json b/homeassistant/components/tellduslive/.translations/nn.json index 934f56a420b3..a98ce99c970f 100644 --- a/homeassistant/components/tellduslive/.translations/nn.json +++ b/homeassistant/components/tellduslive/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Telldus Live" - } + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/no.json b/homeassistant/components/tellduslive/.translations/no.json index 3977bde4a3c8..854b7fb562c6 100644 --- a/homeassistant/components/tellduslive/.translations/no.json +++ b/homeassistant/components/tellduslive/.translations/no.json @@ -21,7 +21,7 @@ "description": "Tom", "title": "Velg endepunkt." } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pl.json b/homeassistant/components/tellduslive/.translations/pl.json index 68e53df57f13..5565fb21111a 100644 --- a/homeassistant/components/tellduslive/.translations/pl.json +++ b/homeassistant/components/tellduslive/.translations/pl.json @@ -21,7 +21,7 @@ "description": "Puste", "title": "Wybierz punkt ko\u0144cowy." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pt-BR.json b/homeassistant/components/tellduslive/.translations/pt-BR.json index 2183b9068b86..e0066a271dcd 100644 --- a/homeassistant/components/tellduslive/.translations/pt-BR.json +++ b/homeassistant/components/tellduslive/.translations/pt-BR.json @@ -21,7 +21,7 @@ "description": "Vazio", "title": "Escolha o ponto final." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pt.json b/homeassistant/components/tellduslive/.translations/pt.json index 9f8134ed07dd..e4f8bf05563c 100644 --- a/homeassistant/components/tellduslive/.translations/pt.json +++ b/homeassistant/components/tellduslive/.translations/pt.json @@ -21,7 +21,7 @@ "description": "Vazio", "title": "Escolher endpoint." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ru.json b/homeassistant/components/tellduslive/.translations/ru.json index fa5b7e2d3192..71204c886021 100644 --- a/homeassistant/components/tellduslive/.translations/ru.json +++ b/homeassistant/components/tellduslive/.translations/ru.json @@ -21,7 +21,7 @@ "description": "\u043f\u0443\u0441\u0442\u043e", "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/sl.json b/homeassistant/components/tellduslive/.translations/sl.json index 7e0a8d28b9ab..0ee0c4b6ac7e 100644 --- a/homeassistant/components/tellduslive/.translations/sl.json +++ b/homeassistant/components/tellduslive/.translations/sl.json @@ -21,7 +21,7 @@ "description": "Prazno", "title": "Izberite kon\u010dno to\u010dko." } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/sv.json b/homeassistant/components/tellduslive/.translations/sv.json index 809132e01b02..a7692f2a68e3 100644 --- a/homeassistant/components/tellduslive/.translations/sv.json +++ b/homeassistant/components/tellduslive/.translations/sv.json @@ -21,7 +21,7 @@ "description": "?", "title": "V\u00e4lj endpoint." } - }, - "title": "Telldus Live!" - } + } + }, + "title": "Telldus Live!" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/zh-Hans.json b/homeassistant/components/tellduslive/.translations/zh-Hans.json index 657722f7f13e..a9449ad999f7 100644 --- a/homeassistant/components/tellduslive/.translations/zh-Hans.json +++ b/homeassistant/components/tellduslive/.translations/zh-Hans.json @@ -21,7 +21,7 @@ "description": "\u7a7a", "title": "\u9009\u62e9 endpoint\u3002" } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/zh-Hant.json b/homeassistant/components/tellduslive/.translations/zh-Hant.json index 23093d247ee6..959e1744082c 100644 --- a/homeassistant/components/tellduslive/.translations/zh-Hant.json +++ b/homeassistant/components/tellduslive/.translations/zh-Hant.json @@ -21,7 +21,7 @@ "description": "\u7a7a\u767d", "title": "\u9078\u64c7\u7aef\u9ede\u3002" } - }, - "title": "Telldus Live" - } + } + }, + "title": "Telldus Live" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ca.json b/homeassistant/components/tesla/.translations/ca.json index 2f0257d47a44..ad1ae6935d2a 100644 --- a/homeassistant/components/tesla/.translations/ca.json +++ b/homeassistant/components/tesla/.translations/ca.json @@ -15,8 +15,7 @@ "description": "Introdueix la teva informaci\u00f3.", "title": "Configuraci\u00f3 de Tesla" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/da.json b/homeassistant/components/tesla/.translations/da.json index 85091c350d8c..a6036e479846 100644 --- a/homeassistant/components/tesla/.translations/da.json +++ b/homeassistant/components/tesla/.translations/da.json @@ -15,8 +15,7 @@ "description": "Indtast dine oplysninger.", "title": "Tesla - Konfiguration" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/de.json b/homeassistant/components/tesla/.translations/de.json index 4f435aa7839e..4c458f06bce0 100644 --- a/homeassistant/components/tesla/.translations/de.json +++ b/homeassistant/components/tesla/.translations/de.json @@ -15,8 +15,7 @@ "description": "Bitte gib deine Daten ein.", "title": "Tesla - Konfiguration" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/en.json b/homeassistant/components/tesla/.translations/en.json index 4dbee73717e5..67d91759e249 100644 --- a/homeassistant/components/tesla/.translations/en.json +++ b/homeassistant/components/tesla/.translations/en.json @@ -15,8 +15,7 @@ "description": "Please enter your information.", "title": "Tesla - Configuration" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/es.json b/homeassistant/components/tesla/.translations/es.json index 3f9e9c4e9db0..465d76689812 100644 --- a/homeassistant/components/tesla/.translations/es.json +++ b/homeassistant/components/tesla/.translations/es.json @@ -15,8 +15,7 @@ "description": "Por favor, introduzca su informaci\u00f3n.", "title": "Tesla - Configuraci\u00f3n" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/fr.json b/homeassistant/components/tesla/.translations/fr.json index ef9d51628999..9712f1f780dd 100644 --- a/homeassistant/components/tesla/.translations/fr.json +++ b/homeassistant/components/tesla/.translations/fr.json @@ -15,8 +15,7 @@ "description": "Veuillez saisir vos informations.", "title": "Tesla - Configuration" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/hu.json b/homeassistant/components/tesla/.translations/hu.json index 01090bbfa9e9..976de89687bd 100644 --- a/homeassistant/components/tesla/.translations/hu.json +++ b/homeassistant/components/tesla/.translations/hu.json @@ -15,8 +15,7 @@ "description": "K\u00e9rlek, add meg az adataidat.", "title": "Tesla - Konfigur\u00e1ci\u00f3" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/it.json b/homeassistant/components/tesla/.translations/it.json index e9bf5e2d4fe2..dc7350982e5a 100644 --- a/homeassistant/components/tesla/.translations/it.json +++ b/homeassistant/components/tesla/.translations/it.json @@ -15,8 +15,7 @@ "description": "Si prega di inserire le tue informazioni.", "title": "Tesla - Configurazione" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ko.json b/homeassistant/components/tesla/.translations/ko.json index a0f8d353349b..4879d5ce9fe1 100644 --- a/homeassistant/components/tesla/.translations/ko.json +++ b/homeassistant/components/tesla/.translations/ko.json @@ -15,8 +15,7 @@ "description": "\uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694", "title": "Tesla - \uad6c\uc131" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/lb.json b/homeassistant/components/tesla/.translations/lb.json index 64bf528e95fd..9d5e030900e7 100644 --- a/homeassistant/components/tesla/.translations/lb.json +++ b/homeassistant/components/tesla/.translations/lb.json @@ -15,8 +15,7 @@ "description": "F\u00ebllt \u00e4r Informatiounen aus.", "title": "Tesla - Konfiguratioun" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/nl.json b/homeassistant/components/tesla/.translations/nl.json index 5f3e83dd2484..618ec9382086 100644 --- a/homeassistant/components/tesla/.translations/nl.json +++ b/homeassistant/components/tesla/.translations/nl.json @@ -15,8 +15,7 @@ "description": "Vul alstublieft uw gegevens in.", "title": "Tesla - Configuratie" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/no.json b/homeassistant/components/tesla/.translations/no.json index 8df2cdd20186..e46a184ac449 100644 --- a/homeassistant/components/tesla/.translations/no.json +++ b/homeassistant/components/tesla/.translations/no.json @@ -15,8 +15,7 @@ "description": "Vennligst skriv inn informasjonen din.", "title": "Tesla - Konfigurasjon" } - }, - "title": "" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/pl.json b/homeassistant/components/tesla/.translations/pl.json index 89233646ef0a..eac0ef77433f 100644 --- a/homeassistant/components/tesla/.translations/pl.json +++ b/homeassistant/components/tesla/.translations/pl.json @@ -15,8 +15,7 @@ "description": "Wprowad\u017a dane", "title": "Tesla - konfiguracja" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/pt-BR.json b/homeassistant/components/tesla/.translations/pt-BR.json index 4b6de20d2d73..c8a1b1bd2404 100644 --- a/homeassistant/components/tesla/.translations/pt-BR.json +++ b/homeassistant/components/tesla/.translations/pt-BR.json @@ -15,7 +15,7 @@ "description": "Por favor, insira suas informa\u00e7\u00f5es.", "title": "Tesla - Configura\u00e7\u00e3o" } - }, - "title": "Tesla" - } + } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ru.json b/homeassistant/components/tesla/.translations/ru.json index 5354e4e63908..4dd852403d05 100644 --- a/homeassistant/components/tesla/.translations/ru.json +++ b/homeassistant/components/tesla/.translations/ru.json @@ -15,8 +15,7 @@ "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.", "title": "Tesla" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/sl.json b/homeassistant/components/tesla/.translations/sl.json index ec6d5850d92d..6260a5bcb22c 100644 --- a/homeassistant/components/tesla/.translations/sl.json +++ b/homeassistant/components/tesla/.translations/sl.json @@ -15,8 +15,7 @@ "description": "Prosimo, vnesite svoje podatke.", "title": "Tesla - konfiguracija" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/sv.json b/homeassistant/components/tesla/.translations/sv.json index 46263ff64aea..ec2763d01f78 100644 --- a/homeassistant/components/tesla/.translations/sv.json +++ b/homeassistant/components/tesla/.translations/sv.json @@ -15,8 +15,7 @@ "description": "V\u00e4nligen ange din information.", "title": "Tesla - Konfiguration" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -26,5 +25,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/zh-Hant.json b/homeassistant/components/tesla/.translations/zh-Hant.json index c35cbfb944a5..f302a4fdb904 100644 --- a/homeassistant/components/tesla/.translations/zh-Hant.json +++ b/homeassistant/components/tesla/.translations/zh-Hant.json @@ -15,8 +15,7 @@ "description": "\u8acb\u8f38\u5165\u8cc7\u8a0a\u3002", "title": "Tesla - \u8a2d\u5b9a" } - }, - "title": "Tesla" + } }, "options": { "step": { @@ -27,5 +26,6 @@ } } } - } + }, + "title": "Tesla" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/bg.json b/homeassistant/components/toon/.translations/bg.json index 0de9452b3cd2..187595724396 100644 --- a/homeassistant/components/toon/.translations/bg.json +++ b/homeassistant/components/toon/.translations/bg.json @@ -28,7 +28,7 @@ "description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u043d\u0430 Toon, \u0441 \u043a\u043e\u0439\u0442\u043e \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0436\u0435\u0442\u0435.", "title": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u0439" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/ca.json b/homeassistant/components/toon/.translations/ca.json index 0a88b82f8296..3830c131650b 100644 --- a/homeassistant/components/toon/.translations/ca.json +++ b/homeassistant/components/toon/.translations/ca.json @@ -28,7 +28,7 @@ "description": "Selecciona la pantalla Toon amb la qual vols connectar-te.", "title": "Selecci\u00f3 de pantalla" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/da.json b/homeassistant/components/toon/.translations/da.json index e4f73bc7c6bf..fe588e01439e 100644 --- a/homeassistant/components/toon/.translations/da.json +++ b/homeassistant/components/toon/.translations/da.json @@ -28,7 +28,7 @@ "description": "V\u00e6lg den Toon sk\u00e6rm, du vil oprette forbindelse til.", "title": "V\u00e6lg sk\u00e6rm" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/de.json b/homeassistant/components/toon/.translations/de.json index cbcfd5d4adc8..938b86add170 100644 --- a/homeassistant/components/toon/.translations/de.json +++ b/homeassistant/components/toon/.translations/de.json @@ -28,7 +28,7 @@ "description": "W\u00e4hle die Toon-Anzeige aus, die verbunden werden soll.", "title": "Anzeige ausw\u00e4hlen" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/en.json b/homeassistant/components/toon/.translations/en.json index 7d7d6c73e163..c43e8079ec02 100644 --- a/homeassistant/components/toon/.translations/en.json +++ b/homeassistant/components/toon/.translations/en.json @@ -28,7 +28,7 @@ "description": "Select the Toon display to connect with.", "title": "Select display" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/es-419.json b/homeassistant/components/toon/.translations/es-419.json index 598bc77aee9b..800e9a1a18a2 100644 --- a/homeassistant/components/toon/.translations/es-419.json +++ b/homeassistant/components/toon/.translations/es-419.json @@ -23,7 +23,7 @@ "description": "Seleccione la pantalla Toon para conectarse.", "title": "Seleccionar pantalla" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/es.json b/homeassistant/components/toon/.translations/es.json index 10b0532a53ab..e37995b0aabc 100644 --- a/homeassistant/components/toon/.translations/es.json +++ b/homeassistant/components/toon/.translations/es.json @@ -28,7 +28,7 @@ "description": "Selecciona la pantalla Toon que quieres conectar.", "title": "Seleccionar pantalla" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/fr.json b/homeassistant/components/toon/.translations/fr.json index 7c41cdc0d246..d711a2edfc32 100644 --- a/homeassistant/components/toon/.translations/fr.json +++ b/homeassistant/components/toon/.translations/fr.json @@ -28,7 +28,7 @@ "description": "S\u00e9lectionnez l'affichage Toon avec lequel vous connecter.", "title": "S\u00e9lectionnez l'affichage" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/it.json b/homeassistant/components/toon/.translations/it.json index 793491355811..3793aa76404b 100644 --- a/homeassistant/components/toon/.translations/it.json +++ b/homeassistant/components/toon/.translations/it.json @@ -28,7 +28,7 @@ "description": "Seleziona il display Toon con cui connettersi.", "title": "Seleziona il display" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/ko.json b/homeassistant/components/toon/.translations/ko.json index dcdf19ca1c36..079f6eddb6f7 100644 --- a/homeassistant/components/toon/.translations/ko.json +++ b/homeassistant/components/toon/.translations/ko.json @@ -28,7 +28,7 @@ "description": "\uc5f0\uacb0\ud560 Toon \ub514\uc2a4\ud50c\ub808\uc774\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694.", "title": "\ub514\uc2a4\ud50c\ub808\uc774 \uc120\ud0dd" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/lb.json b/homeassistant/components/toon/.translations/lb.json index 6ea86c00057c..4bf599b598b9 100644 --- a/homeassistant/components/toon/.translations/lb.json +++ b/homeassistant/components/toon/.translations/lb.json @@ -28,7 +28,7 @@ "description": "Wielt den Toon Ecran aus fir sech domat ze verbannen.", "title": "Ecran auswielen" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/nl.json b/homeassistant/components/toon/.translations/nl.json index 2ca887b17660..32df22700737 100644 --- a/homeassistant/components/toon/.translations/nl.json +++ b/homeassistant/components/toon/.translations/nl.json @@ -28,7 +28,7 @@ "description": "Kies het Toon-scherm om mee te verbinden.", "title": "Kies scherm" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/nn.json b/homeassistant/components/toon/.translations/nn.json index eed288a5e39a..0dcee9de5885 100644 --- a/homeassistant/components/toon/.translations/nn.json +++ b/homeassistant/components/toon/.translations/nn.json @@ -6,7 +6,7 @@ "username": "Brukarnamn" } } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/no.json b/homeassistant/components/toon/.translations/no.json index 80a101ac67bb..aa65b65dc8ef 100644 --- a/homeassistant/components/toon/.translations/no.json +++ b/homeassistant/components/toon/.translations/no.json @@ -28,7 +28,7 @@ "description": "Velg Toon skjerm \u00e5 koble til.", "title": "Velg skjerm" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/pl.json b/homeassistant/components/toon/.translations/pl.json index 52da6579a030..bdc98c5e2ce4 100644 --- a/homeassistant/components/toon/.translations/pl.json +++ b/homeassistant/components/toon/.translations/pl.json @@ -28,7 +28,7 @@ "description": "Wybierz wy\u015bwietlacz Toon, z kt\u00f3rym chcesz si\u0119 po\u0142\u0105czy\u0107.", "title": "Wybierz wy\u015bwietlacz" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/pt-BR.json b/homeassistant/components/toon/.translations/pt-BR.json index 8cb5ddaadd84..1b819056273b 100644 --- a/homeassistant/components/toon/.translations/pt-BR.json +++ b/homeassistant/components/toon/.translations/pt-BR.json @@ -28,7 +28,7 @@ "description": "Selecione a exibi\u00e7\u00e3o Toon para se conectar.", "title": "Selecione a exibi\u00e7\u00e3o" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/ru.json b/homeassistant/components/toon/.translations/ru.json index 75b46d3f600b..e9f1b919680b 100644 --- a/homeassistant/components/toon/.translations/ru.json +++ b/homeassistant/components/toon/.translations/ru.json @@ -28,7 +28,7 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 Toon \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.", "title": "Toon" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/sl.json b/homeassistant/components/toon/.translations/sl.json index 8fb71b80acc4..8de052d911a1 100644 --- a/homeassistant/components/toon/.translations/sl.json +++ b/homeassistant/components/toon/.translations/sl.json @@ -28,7 +28,7 @@ "description": "Izberite zaslon Toon, s katerim se \u017eelite povezati.", "title": "Izberite zaslon" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/sv.json b/homeassistant/components/toon/.translations/sv.json index 4427b90ab9cc..b38d0fb8f85b 100644 --- a/homeassistant/components/toon/.translations/sv.json +++ b/homeassistant/components/toon/.translations/sv.json @@ -28,7 +28,7 @@ "description": "V\u00e4lj Toon-sk\u00e4rm att ansluta till.", "title": "V\u00e4lj sk\u00e4rm" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/zh-Hant.json b/homeassistant/components/toon/.translations/zh-Hant.json index f3c9cf9588a6..888015973968 100644 --- a/homeassistant/components/toon/.translations/zh-Hant.json +++ b/homeassistant/components/toon/.translations/zh-Hant.json @@ -28,7 +28,7 @@ "description": "\u9078\u64c7\u6240\u8981\u9023\u63a5\u7684 Toon display\u3002", "title": "\u9078\u64c7\u8a2d\u5099" } - }, - "title": "Toon" - } + } + }, + "title": "Toon" } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/de.json b/homeassistant/components/totalconnect/.translations/de.json index c8daeda3f4e5..c239b1ec5bfc 100644 --- a/homeassistant/components/totalconnect/.translations/de.json +++ b/homeassistant/components/totalconnect/.translations/de.json @@ -11,7 +11,7 @@ }, "title": "Total Connect" } - }, - "title": "Total Connect" - } + } + }, + "title": "Total Connect" } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/en.json b/homeassistant/components/totalconnect/.translations/en.json index 44111d74bebd..797bf3c55a71 100644 --- a/homeassistant/components/totalconnect/.translations/en.json +++ b/homeassistant/components/totalconnect/.translations/en.json @@ -14,7 +14,7 @@ }, "title": "Total Connect" } - }, - "title": "Total Connect" - } + } + }, + "title": "Total Connect" } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/es.json b/homeassistant/components/totalconnect/.translations/es.json index a456027be044..361e22534c48 100644 --- a/homeassistant/components/totalconnect/.translations/es.json +++ b/homeassistant/components/totalconnect/.translations/es.json @@ -14,7 +14,7 @@ }, "title": "Total Connect" } - }, - "title": "Total Connect" - } + } + }, + "title": "Total Connect" } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/no.json b/homeassistant/components/totalconnect/.translations/no.json new file mode 100644 index 000000000000..1f04e414991a --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/no.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Kontoen er allerede konfigurert" + }, + "error": { + "login": "P\u00e5loggingsfeil: Vennligst sjekk brukernavnet ditt og passordet ditt" + }, + "step": { + "user": { + "data": { + "password": "Passord", + "username": "Brukernavn" + }, + "title": "Total Connect" + } + } + }, + "title": "Total Connect" +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/ru.json b/homeassistant/components/totalconnect/.translations/ru.json index cd7f633f3239..8eecf7a087a3 100644 --- a/homeassistant/components/totalconnect/.translations/ru.json +++ b/homeassistant/components/totalconnect/.translations/ru.json @@ -14,7 +14,7 @@ }, "title": "Total Connect" } - }, - "title": "Total Connect" - } + } + }, + "title": "Total Connect" } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/zh-Hant.json b/homeassistant/components/totalconnect/.translations/zh-Hant.json index aa8fb858fead..dfc201734e9f 100644 --- a/homeassistant/components/totalconnect/.translations/zh-Hant.json +++ b/homeassistant/components/totalconnect/.translations/zh-Hant.json @@ -14,7 +14,7 @@ }, "title": "Total Connect" } - }, - "title": "Total Connect" - } + } + }, + "title": "Total Connect" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/bg.json b/homeassistant/components/tplink/.translations/bg.json index 25ffb753076d..8ee618ee6eff 100644 --- a/homeassistant/components/tplink/.translations/bg.json +++ b/homeassistant/components/tplink/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 TP-Link \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ca.json b/homeassistant/components/tplink/.translations/ca.json index cf286f853f22..3beb6170ca25 100644 --- a/homeassistant/components/tplink/.translations/ca.json +++ b/homeassistant/components/tplink/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar dispositius intel\u00b7ligents TP-Link?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/cs.json b/homeassistant/components/tplink/.translations/cs.json index 1d9fb41fc8ce..12b54c61ff39 100644 --- a/homeassistant/components/tplink/.translations/cs.json +++ b/homeassistant/components/tplink/.translations/cs.json @@ -4,7 +4,7 @@ "confirm": { "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/da.json b/homeassistant/components/tplink/.translations/da.json index 5225a89fb954..6a81b59c4377 100644 --- a/homeassistant/components/tplink/.translations/da.json +++ b/homeassistant/components/tplink/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere TP-Link-smartenheder?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/de.json b/homeassistant/components/tplink/.translations/de.json index ba19fd04390b..d96ea151ce3e 100644 --- a/homeassistant/components/tplink/.translations/de.json +++ b/homeassistant/components/tplink/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du TP-Link Smart Devices einrichten?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/en.json b/homeassistant/components/tplink/.translations/en.json index ff349fe1b68f..339c0bf6e658 100644 --- a/homeassistant/components/tplink/.translations/en.json +++ b/homeassistant/components/tplink/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to setup TP-Link smart devices?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/es-419.json b/homeassistant/components/tplink/.translations/es-419.json index 2832804113a6..51de23bec32c 100644 --- a/homeassistant/components/tplink/.translations/es-419.json +++ b/homeassistant/components/tplink/.translations/es-419.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar dispositivos inteligentes TP-Link?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/es.json b/homeassistant/components/tplink/.translations/es.json index 1a1199eeac6c..4559384383a7 100644 --- a/homeassistant/components/tplink/.translations/es.json +++ b/homeassistant/components/tplink/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar dispositivos inteligentes de TP-Link?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/fr.json b/homeassistant/components/tplink/.translations/fr.json index 7351825398f5..87e3f7203654 100644 --- a/homeassistant/components/tplink/.translations/fr.json +++ b/homeassistant/components/tplink/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer TP-Link smart devices?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/he.json b/homeassistant/components/tplink/.translations/he.json index 094174b09c13..b8a8c59f58ce 100644 --- a/homeassistant/components/tplink/.translations/he.json +++ b/homeassistant/components/tplink/.translations/he.json @@ -9,7 +9,7 @@ "description": "\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05e8\u05d5\u05e6\u05d4 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d4\u05ea\u05e7\u05e0\u05d9\u05dd \u05d7\u05db\u05de\u05d9\u05dd \u05e9\u05dc TP-Link ?", "title": "\u05d1\u05d9\u05ea \u05d7\u05db\u05dd \u05e9\u05dc TP-Link" } - }, - "title": "\u05d1\u05d9\u05ea \u05d7\u05db\u05dd \u05e9\u05dc TP-Link" - } + } + }, + "title": "\u05d1\u05d9\u05ea \u05d7\u05db\u05dd \u05e9\u05dc TP-Link" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/it.json b/homeassistant/components/tplink/.translations/it.json index 4931e2293dd8..0d591c0850c7 100644 --- a/homeassistant/components/tplink/.translations/it.json +++ b/homeassistant/components/tplink/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare i dispositivi intelligenti TP-Link?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ko.json b/homeassistant/components/tplink/.translations/ko.json index 89255d785182..c442ad2387b5 100644 --- a/homeassistant/components/tplink/.translations/ko.json +++ b/homeassistant/components/tplink/.translations/ko.json @@ -9,7 +9,7 @@ "description": "TP-Link \uc2a4\ub9c8\ud2b8 \uae30\uae30\ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/lb.json b/homeassistant/components/tplink/.translations/lb.json index 11ca7218e116..3a40495a18a3 100644 --- a/homeassistant/components/tplink/.translations/lb.json +++ b/homeassistant/components/tplink/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll TP-Link Smart Home konfigur\u00e9iert ginn?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/nl.json b/homeassistant/components/tplink/.translations/nl.json index 622315fd84cb..6fdce954a961 100644 --- a/homeassistant/components/tplink/.translations/nl.json +++ b/homeassistant/components/tplink/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wil je TP-Link slimme apparaten instellen?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/nn.json b/homeassistant/components/tplink/.translations/nn.json index 1d9fb41fc8ce..12b54c61ff39 100644 --- a/homeassistant/components/tplink/.translations/nn.json +++ b/homeassistant/components/tplink/.translations/nn.json @@ -4,7 +4,7 @@ "confirm": { "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/no.json b/homeassistant/components/tplink/.translations/no.json index 2cb30df1a428..38578dafc89a 100644 --- a/homeassistant/components/tplink/.translations/no.json +++ b/homeassistant/components/tplink/.translations/no.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere TP-Link smart enheter?", "title": "" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pl.json b/homeassistant/components/tplink/.translations/pl.json index fa90495a5bfb..40839e8f4cc9 100644 --- a/homeassistant/components/tplink/.translations/pl.json +++ b/homeassistant/components/tplink/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Czy chcesz skonfigurowa\u0107 urz\u0105dzenia TP-Link smart?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pt-BR.json b/homeassistant/components/tplink/.translations/pt-BR.json index 1289a9178f48..ce12d35086a5 100644 --- a/homeassistant/components/tplink/.translations/pt-BR.json +++ b/homeassistant/components/tplink/.translations/pt-BR.json @@ -9,7 +9,7 @@ "description": "Deseja configurar dispositivos inteligentes TP-Link?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pt.json b/homeassistant/components/tplink/.translations/pt.json index 1d9fb41fc8ce..12b54c61ff39 100644 --- a/homeassistant/components/tplink/.translations/pt.json +++ b/homeassistant/components/tplink/.translations/pt.json @@ -4,7 +4,7 @@ "confirm": { "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ru.json b/homeassistant/components/tplink/.translations/ru.json index b7d767932458..b22057ca71ec 100644 --- a/homeassistant/components/tplink/.translations/ru.json +++ b/homeassistant/components/tplink/.translations/ru.json @@ -9,7 +9,7 @@ "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?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/sl.json b/homeassistant/components/tplink/.translations/sl.json index e686ee4bc041..3f35a246054c 100644 --- a/homeassistant/components/tplink/.translations/sl.json +++ b/homeassistant/components/tplink/.translations/sl.json @@ -9,7 +9,7 @@ "description": "\u017delite namestiti pametne naprave TP-Link?", "title": "TP-Link Pametni Dom" } - }, - "title": "TP-Link Pametni Dom" - } + } + }, + "title": "TP-Link Pametni Dom" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/sv.json b/homeassistant/components/tplink/.translations/sv.json index 14b6417d5934..6ab2cf93a9b9 100644 --- a/homeassistant/components/tplink/.translations/sv.json +++ b/homeassistant/components/tplink/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera TP-Link smart enheter?", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/th.json b/homeassistant/components/tplink/.translations/th.json index 80740c9190f0..23c027fa4af9 100644 --- a/homeassistant/components/tplink/.translations/th.json +++ b/homeassistant/components/tplink/.translations/th.json @@ -1,5 +1,3 @@ { - "config": { - "title": "TP-Link Smart Home" - } + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/zh-Hans.json b/homeassistant/components/tplink/.translations/zh-Hans.json index ca3ac9133755..81f264ce16ee 100644 --- a/homeassistant/components/tplink/.translations/zh-Hans.json +++ b/homeassistant/components/tplink/.translations/zh-Hans.json @@ -9,7 +9,7 @@ "description": "\u60a8\u60f3\u8981\u914d\u7f6e TP-Link \u667a\u80fd\u8bbe\u5907\u5417\uff1f", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/zh-Hant.json b/homeassistant/components/tplink/.translations/zh-Hant.json index 17cdebd3f83b..d8ff1e977663 100644 --- a/homeassistant/components/tplink/.translations/zh-Hant.json +++ b/homeassistant/components/tplink/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a TP-Link \u667a\u80fd\u8a2d\u5099\uff1f", "title": "TP-Link Smart Home" } - }, - "title": "TP-Link Smart Home" - } + } + }, + "title": "TP-Link Smart Home" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/bg.json b/homeassistant/components/traccar/.translations/bg.json index 7fe89d491c95..68c2b1d11abb 100644 --- a/homeassistant/components/traccar/.translations/bg.json +++ b/homeassistant/components/traccar/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Traccar?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ca.json b/homeassistant/components/traccar/.translations/ca.json index 0cfb9738d5dd..52d5b776d5d1 100644 --- a/homeassistant/components/traccar/.translations/ca.json +++ b/homeassistant/components/traccar/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar Traccar?", "title": "Configura Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/da.json b/homeassistant/components/traccar/.translations/da.json index b1ab350c9058..2159542b8023 100644 --- a/homeassistant/components/traccar/.translations/da.json +++ b/homeassistant/components/traccar/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Traccar?", "title": "Konfigurer Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/de.json b/homeassistant/components/traccar/.translations/de.json index 92b1f3e6b290..6cf78485ada2 100644 --- a/homeassistant/components/traccar/.translations/de.json +++ b/homeassistant/components/traccar/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du Traccar wirklich einrichten?", "title": "Traccar einrichten" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/en.json b/homeassistant/components/traccar/.translations/en.json index a88048352788..99bfc2f0ef6d 100644 --- a/homeassistant/components/traccar/.translations/en.json +++ b/homeassistant/components/traccar/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up Traccar?", "title": "Set up Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/es.json b/homeassistant/components/traccar/.translations/es.json index dedaf02971c7..294ffd96bef4 100644 --- a/homeassistant/components/traccar/.translations/es.json +++ b/homeassistant/components/traccar/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1 seguro de querer configurar Traccar?", "title": "Configurar Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/fr.json b/homeassistant/components/traccar/.translations/fr.json index 0948a31739fc..0fea457b5b10 100644 --- a/homeassistant/components/traccar/.translations/fr.json +++ b/homeassistant/components/traccar/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer Traccar?", "title": "Configurer Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/it.json b/homeassistant/components/traccar/.translations/it.json index a0980644a71a..ce56480f01be 100644 --- a/homeassistant/components/traccar/.translations/it.json +++ b/homeassistant/components/traccar/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare Traccar?", "title": "Imposta Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ko.json b/homeassistant/components/traccar/.translations/ko.json index 40e1aaf4d6bf..07199c7cffe3 100644 --- a/homeassistant/components/traccar/.translations/ko.json +++ b/homeassistant/components/traccar/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Traccar \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Traccar \uc124\uc815" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/lb.json b/homeassistant/components/traccar/.translations/lb.json index 8808d85a1d6d..156fdcc6c4e0 100644 --- a/homeassistant/components/traccar/.translations/lb.json +++ b/homeassistant/components/traccar/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Traccar anzeriichten?", "title": "Traccar ariichten" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/nl.json b/homeassistant/components/traccar/.translations/nl.json index c4ee0544a2e7..61295f3d90b0 100644 --- a/homeassistant/components/traccar/.translations/nl.json +++ b/homeassistant/components/traccar/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u Traccar wilt instellen?", "title": "Traccar instellen" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/nn.json b/homeassistant/components/traccar/.translations/nn.json index 9fc23b3e3940..8db28ed69824 100644 --- a/homeassistant/components/traccar/.translations/nn.json +++ b/homeassistant/components/traccar/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Traccar" - } + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/no.json b/homeassistant/components/traccar/.translations/no.json index 805b952690e5..f9ae3236a1aa 100644 --- a/homeassistant/components/traccar/.translations/no.json +++ b/homeassistant/components/traccar/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil sette opp Traccar?", "title": "Sett opp Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/pl.json b/homeassistant/components/traccar/.translations/pl.json index b7eaf7fe16e8..85527af7d61d 100644 --- a/homeassistant/components/traccar/.translations/pl.json +++ b/homeassistant/components/traccar/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Traccar?", "title": "Konfiguracja Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/pt-BR.json b/homeassistant/components/traccar/.translations/pt-BR.json index 4fa0c4e6714f..b7ad0024d65b 100644 --- a/homeassistant/components/traccar/.translations/pt-BR.json +++ b/homeassistant/components/traccar/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Traccar?", "title": "Configurar Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ru.json b/homeassistant/components/traccar/.translations/ru.json index 1a215c90d4b3..e1d7aa08392b 100644 --- a/homeassistant/components/traccar/.translations/ru.json +++ b/homeassistant/components/traccar/.translations/ru.json @@ -12,7 +12,7 @@ "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 Traccar?", "title": "Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/sl.json b/homeassistant/components/traccar/.translations/sl.json index 95aaca7e67df..c6cdc90aa4e8 100644 --- a/homeassistant/components/traccar/.translations/sl.json +++ b/homeassistant/components/traccar/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Traccar?", "title": "Nastavite Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/sv.json b/homeassistant/components/traccar/.translations/sv.json index ddd33235e01b..8a67cb2db080 100644 --- a/homeassistant/components/traccar/.translations/sv.json +++ b/homeassistant/components/traccar/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill st\u00e4lla in Traccar?", "title": "St\u00e4ll in Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/tr.json b/homeassistant/components/traccar/.translations/tr.json index 22944e1c4cc6..f1f50d847319 100644 --- a/homeassistant/components/traccar/.translations/tr.json +++ b/homeassistant/components/traccar/.translations/tr.json @@ -4,7 +4,7 @@ "user": { "title": "Traccar'\u0131 kur" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/zh-Hant.json b/homeassistant/components/traccar/.translations/zh-Hant.json index 85e8994dc55c..adb7da378db7 100644 --- a/homeassistant/components/traccar/.translations/zh-Hant.json +++ b/homeassistant/components/traccar/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Traccar\uff1f", "title": "\u8a2d\u5b9a Traccar" } - }, - "title": "Traccar" - } + } + }, + "title": "Traccar" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/bg.json b/homeassistant/components/tradfri/.translations/bg.json index a9ce5213d452..74abca0ce08c 100644 --- a/homeassistant/components/tradfri/.translations/bg.json +++ b/homeassistant/components/tradfri/.translations/bg.json @@ -18,7 +18,7 @@ "description": "\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043d\u0430\u043c\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0441\u0438\u0433\u0443\u0440\u043d\u043e\u0441\u0442 \u043d\u0430 \u0433\u044a\u0440\u0431\u0430 \u043d\u0430 \u0448\u043b\u044e\u0437\u0430.", "title": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043a\u043e\u0434 \u0437\u0430 \u0441\u0438\u0433\u0443\u0440\u043d\u043e\u0441\u0442" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ca.json b/homeassistant/components/tradfri/.translations/ca.json index eb3f25e8b49c..ee5e2de904ea 100644 --- a/homeassistant/components/tradfri/.translations/ca.json +++ b/homeassistant/components/tradfri/.translations/ca.json @@ -18,7 +18,7 @@ "description": "Pots trobar el codi de seguretat a la part posterior de la teva passarel\u00b7la d'enlla\u00e7.", "title": "Introdueix el codi de seguretat" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/cs.json b/homeassistant/components/tradfri/.translations/cs.json index 58782a1b4211..f7270ed94447 100644 --- a/homeassistant/components/tradfri/.translations/cs.json +++ b/homeassistant/components/tradfri/.translations/cs.json @@ -17,7 +17,7 @@ "description": "Bezpe\u010dnostn\u00ed k\u00f3d naleznete na zadn\u00ed stran\u011b za\u0159\u00edzen\u00ed.", "title": "Zadejte bezpe\u010dnostn\u00ed k\u00f3d" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/da.json b/homeassistant/components/tradfri/.translations/da.json index 36995aaae467..bf6bcb094e24 100644 --- a/homeassistant/components/tradfri/.translations/da.json +++ b/homeassistant/components/tradfri/.translations/da.json @@ -18,7 +18,7 @@ "description": "Du kan finde sikkerhedskoden p\u00e5 bagsiden af din gateway.", "title": "Indtast sikkerhedskode" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/de.json b/homeassistant/components/tradfri/.translations/de.json index 68165dbb2914..7b38a1ca3424 100644 --- a/homeassistant/components/tradfri/.translations/de.json +++ b/homeassistant/components/tradfri/.translations/de.json @@ -18,7 +18,7 @@ "description": "Du findest den Sicherheitscode auf der R\u00fcckseite deines Gateways.", "title": "Sicherheitscode eingeben" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/en.json b/homeassistant/components/tradfri/.translations/en.json index 0b11474d6777..6a2889e3e362 100644 --- a/homeassistant/components/tradfri/.translations/en.json +++ b/homeassistant/components/tradfri/.translations/en.json @@ -18,7 +18,7 @@ "description": "You can find the security code on the back of your gateway.", "title": "Enter security code" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "$1" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/es-419.json b/homeassistant/components/tradfri/.translations/es-419.json index 4b3e1ed52d44..6387813915f7 100644 --- a/homeassistant/components/tradfri/.translations/es-419.json +++ b/homeassistant/components/tradfri/.translations/es-419.json @@ -18,7 +18,7 @@ "description": "Puede encontrar el c\u00f3digo de seguridad en la parte posterior de su puerta de enlace.", "title": "Ingrese el c\u00f3digo de seguridad" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/es.json b/homeassistant/components/tradfri/.translations/es.json index 343810f92cf6..151f7e8fd28a 100644 --- a/homeassistant/components/tradfri/.translations/es.json +++ b/homeassistant/components/tradfri/.translations/es.json @@ -18,7 +18,7 @@ "description": "Puedes encontrar el c\u00f3digo de seguridad en la parte posterior de tu gateway.", "title": "Introduzca el c\u00f3digo de seguridad" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/fr.json b/homeassistant/components/tradfri/.translations/fr.json index c1dc31028a8d..4f8c26088530 100644 --- a/homeassistant/components/tradfri/.translations/fr.json +++ b/homeassistant/components/tradfri/.translations/fr.json @@ -18,7 +18,7 @@ "description": "Vous pouvez trouver le code de s\u00e9curit\u00e9 au dos de votre passerelle.", "title": "Entrer le code de s\u00e9curit\u00e9" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/he.json b/homeassistant/components/tradfri/.translations/he.json index 09af3d09bdcc..6d704b37d804 100644 --- a/homeassistant/components/tradfri/.translations/he.json +++ b/homeassistant/components/tradfri/.translations/he.json @@ -17,7 +17,7 @@ "description": "\u05ea\u05d5\u05db\u05dc \u05dc\u05de\u05e6\u05d5\u05d0 \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4\u05d0\u05d1\u05d8\u05d7\u05d4 \u05d1\u05d2\u05d1 \u05d4\u05de\u05d2\u05e9\u05e8 \u05e9\u05dc\u05da.", "title": "\u05d4\u05d6\u05df \u05e7\u05d5\u05d3 \u05d0\u05d1\u05d8\u05d7\u05d4" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/hr.json b/homeassistant/components/tradfri/.translations/hr.json index b9b9cc6c0eba..38a496e40df6 100644 --- a/homeassistant/components/tradfri/.translations/hr.json +++ b/homeassistant/components/tradfri/.translations/hr.json @@ -9,7 +9,7 @@ "host": "Host" } } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/hu.json b/homeassistant/components/tradfri/.translations/hu.json index 88ff9e6104b9..158524d93251 100644 --- a/homeassistant/components/tradfri/.translations/hu.json +++ b/homeassistant/components/tradfri/.translations/hu.json @@ -17,7 +17,7 @@ "description": "A biztons\u00e1gi k\u00f3dot a Gatewayed h\u00e1toldal\u00e1n tal\u00e1lod.", "title": "Add meg a biztons\u00e1gi k\u00f3dot" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/id.json b/homeassistant/components/tradfri/.translations/id.json index 5e1439c8d7d0..d10183877aab 100644 --- a/homeassistant/components/tradfri/.translations/id.json +++ b/homeassistant/components/tradfri/.translations/id.json @@ -17,7 +17,7 @@ "description": "Anda dapat menemukan kode keamanan di belakang gateway Anda.", "title": "Masukkan kode keamanan" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/it.json b/homeassistant/components/tradfri/.translations/it.json index 99ba9053d797..6a1d26cb75b0 100644 --- a/homeassistant/components/tradfri/.translations/it.json +++ b/homeassistant/components/tradfri/.translations/it.json @@ -18,7 +18,7 @@ "description": "Puoi trovare il codice di sicurezza sul retro del tuo gateway.", "title": "Inserisci il codice di sicurezza" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ko.json b/homeassistant/components/tradfri/.translations/ko.json index 02c46b52f6d5..f551eff52436 100644 --- a/homeassistant/components/tradfri/.translations/ko.json +++ b/homeassistant/components/tradfri/.translations/ko.json @@ -18,7 +18,7 @@ "description": "\uac8c\uc774\ud2b8\uc6e8\uc774 \ub4b7\uba74\uc5d0\uc11c \ubcf4\uc548 \ucf54\ub4dc\ub97c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", "title": "\ubcf4\uc548 \ucf54\ub4dc \uc785\ub825" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/lb.json b/homeassistant/components/tradfri/.translations/lb.json index cd3e61a42ce6..0acf3a310a8f 100644 --- a/homeassistant/components/tradfri/.translations/lb.json +++ b/homeassistant/components/tradfri/.translations/lb.json @@ -18,7 +18,7 @@ "description": "Dir fannt de S\u00e9cherheets Code op der R\u00e9cks\u00e4it vun \u00e4rem Gateway.", "title": "Gitt de S\u00e9cherheets Code an" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/nl.json b/homeassistant/components/tradfri/.translations/nl.json index f190d378ec7a..951a8419dd10 100644 --- a/homeassistant/components/tradfri/.translations/nl.json +++ b/homeassistant/components/tradfri/.translations/nl.json @@ -18,7 +18,7 @@ "description": "U vindt de beveiligingscode op de achterkant van uw gateway.", "title": "Voer beveiligingscode in" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/nn.json b/homeassistant/components/tradfri/.translations/nn.json index 544604e2b2a5..e60a9efa5e4a 100644 --- a/homeassistant/components/tradfri/.translations/nn.json +++ b/homeassistant/components/tradfri/.translations/nn.json @@ -17,7 +17,7 @@ "description": "Du finn sikkerheitskoda p\u00e5 baksida av gatewayen din.", "title": "Skriv inn sikkerheitskode" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/no.json b/homeassistant/components/tradfri/.translations/no.json index 490fbaed5aaf..ebbe5da4877e 100644 --- a/homeassistant/components/tradfri/.translations/no.json +++ b/homeassistant/components/tradfri/.translations/no.json @@ -18,7 +18,7 @@ "description": "Du finner sikkerhetskoden p\u00e5 baksiden av gatewayen din.", "title": "Skriv inn sikkerhetskode" } - }, - "title": "Ikea Tr\u00e5dfri" - } + } + }, + "title": "Ikea Tr\u00e5dfri" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pl.json b/homeassistant/components/tradfri/.translations/pl.json index 208687839ddf..caa4291b881a 100644 --- a/homeassistant/components/tradfri/.translations/pl.json +++ b/homeassistant/components/tradfri/.translations/pl.json @@ -18,7 +18,7 @@ "description": "Mo\u017cesz znale\u017a\u0107 kod bezpiecze\u0144stwa z ty\u0142u bramki.", "title": "Wprowad\u017a kod bezpiecze\u0144stwa" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pt-BR.json b/homeassistant/components/tradfri/.translations/pt-BR.json index 50c987dba616..0ba666cee11d 100644 --- a/homeassistant/components/tradfri/.translations/pt-BR.json +++ b/homeassistant/components/tradfri/.translations/pt-BR.json @@ -18,7 +18,7 @@ "description": "Voc\u00ea pode encontrar o c\u00f3digo de seguran\u00e7a na parte de tr\u00e1s do seu gateway.", "title": "Digite o c\u00f3digo de seguran\u00e7a" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pt.json b/homeassistant/components/tradfri/.translations/pt.json index d728bc32f0bc..f4ea78179908 100644 --- a/homeassistant/components/tradfri/.translations/pt.json +++ b/homeassistant/components/tradfri/.translations/pt.json @@ -17,7 +17,7 @@ "description": "Encontra o c\u00f3digo de seguran\u00e7a na base da gateway.", "title": "Introduzir c\u00f3digo de seguran\u00e7a" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ro.json b/homeassistant/components/tradfri/.translations/ro.json index cea0e6d938f1..bc5444e7b0c4 100644 --- a/homeassistant/components/tradfri/.translations/ro.json +++ b/homeassistant/components/tradfri/.translations/ro.json @@ -17,7 +17,7 @@ "description": "Pute\u021bi g\u0103si codul de securitate pe spatele gateway-ului.", "title": "Introduce\u021bi codul de securitate" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ru.json b/homeassistant/components/tradfri/.translations/ru.json index 7d2925fd3f2b..90902691e1fc 100644 --- a/homeassistant/components/tradfri/.translations/ru.json +++ b/homeassistant/components/tradfri/.translations/ru.json @@ -18,7 +18,7 @@ "description": "\u041a\u043e\u0434 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0437\u0430\u0434\u043d\u0435\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0448\u043b\u044e\u0437\u0430.", "title": "IKEA TR\u00c5DFRI" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/sl.json b/homeassistant/components/tradfri/.translations/sl.json index dbdc39c60476..7b3e1fc2de1c 100644 --- a/homeassistant/components/tradfri/.translations/sl.json +++ b/homeassistant/components/tradfri/.translations/sl.json @@ -18,7 +18,7 @@ "description": "Varnostno kodo najdete na hrbtni strani va\u0161ega prehoda.", "title": "Vnesite varnostno kodo" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/sv.json b/homeassistant/components/tradfri/.translations/sv.json index 65c7bbd9401f..4959b35d8972 100644 --- a/homeassistant/components/tradfri/.translations/sv.json +++ b/homeassistant/components/tradfri/.translations/sv.json @@ -18,7 +18,7 @@ "description": "Du kan hitta s\u00e4kerhetskoden p\u00e5 baksidan av din gateway.", "title": "Ange s\u00e4kerhetskod" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/zh-Hans.json b/homeassistant/components/tradfri/.translations/zh-Hans.json index d5c46f63f0b4..f98e4d2ea6ea 100644 --- a/homeassistant/components/tradfri/.translations/zh-Hans.json +++ b/homeassistant/components/tradfri/.translations/zh-Hans.json @@ -18,7 +18,7 @@ "description": "\u60a8\u53ef\u4ee5\u5728\u7f51\u5173\u80cc\u9762\u627e\u5230\u5b89\u5168\u7801\u3002", "title": "\u8f93\u5165\u5b89\u5168\u7801" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/zh-Hant.json b/homeassistant/components/tradfri/.translations/zh-Hant.json index 4ca6970b5c69..cac431bd450e 100644 --- a/homeassistant/components/tradfri/.translations/zh-Hant.json +++ b/homeassistant/components/tradfri/.translations/zh-Hant.json @@ -18,7 +18,7 @@ "description": "\u60a8\u53ef\u4ee5\u65bc\u9598\u9053\u5668\u80cc\u9762\u627e\u5230\u5b89\u5168\u78bc\u3002", "title": "\u8f38\u5165\u5b89\u5168\u78bc" } - }, - "title": "IKEA TR\u00c5DFRI" - } + } + }, + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/bg.json b/homeassistant/components/transmission/.translations/bg.json index 3278f7a3a4cf..6a04b7a166f5 100644 --- a/homeassistant/components/transmission/.translations/bg.json +++ b/homeassistant/components/transmission/.translations/bg.json @@ -19,8 +19,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 Transmission \u043a\u043b\u0438\u0435\u043d\u0442" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438\u0442\u0435 \u0437\u0430 Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ca.json b/homeassistant/components/transmission/.translations/ca.json index 7630b50cdcf4..ba0b48429eb0 100644 --- a/homeassistant/components/transmission/.translations/ca.json +++ b/homeassistant/components/transmission/.translations/ca.json @@ -19,8 +19,7 @@ }, "title": "Configuraci\u00f3 del client de Transmission" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Opcions de configuraci\u00f3 de Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/da.json b/homeassistant/components/transmission/.translations/da.json index feabb364344a..4b9712967c55 100644 --- a/homeassistant/components/transmission/.translations/da.json +++ b/homeassistant/components/transmission/.translations/da.json @@ -19,8 +19,7 @@ }, "title": "Konfigurer Transmission-klient" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Konfigurationsindstillinger for Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/de.json b/homeassistant/components/transmission/.translations/de.json index c3d912e5e77a..716e4ad239f9 100644 --- a/homeassistant/components/transmission/.translations/de.json +++ b/homeassistant/components/transmission/.translations/de.json @@ -19,8 +19,7 @@ }, "title": "Transmission-Client einrichten" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Konfiguriere die Optionen f\u00fcr die \u00dcbertragung" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/en.json b/homeassistant/components/transmission/.translations/en.json index 3605f21e1409..9f9a3e423052 100644 --- a/homeassistant/components/transmission/.translations/en.json +++ b/homeassistant/components/transmission/.translations/en.json @@ -19,8 +19,7 @@ }, "title": "Setup Transmission Client" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configure options for Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/es.json b/homeassistant/components/transmission/.translations/es.json index e64a23873afa..b6b4423f6297 100644 --- a/homeassistant/components/transmission/.translations/es.json +++ b/homeassistant/components/transmission/.translations/es.json @@ -19,8 +19,7 @@ }, "title": "Configuraci\u00f3n del cliente de transmisi\u00f3n" } - }, - "title": "Transmisi\u00f3n" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configurar opciones para la transmisi\u00f3n" } } - } + }, + "title": "Transmisi\u00f3n" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/fr.json b/homeassistant/components/transmission/.translations/fr.json index c7a782017970..f63c0a3ee54c 100644 --- a/homeassistant/components/transmission/.translations/fr.json +++ b/homeassistant/components/transmission/.translations/fr.json @@ -19,8 +19,7 @@ }, "title": "Configuration du client Transmission" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configurer les options pour Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/it.json b/homeassistant/components/transmission/.translations/it.json index 8a1f01783c12..b20145b7c4d4 100644 --- a/homeassistant/components/transmission/.translations/it.json +++ b/homeassistant/components/transmission/.translations/it.json @@ -19,8 +19,7 @@ }, "title": "Configura client di Trasmissione" } - }, - "title": "Trasmissione" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configurare le opzioni per Transmission" } } - } + }, + "title": "Trasmissione" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ko.json b/homeassistant/components/transmission/.translations/ko.json index 4d3537818b79..fa1582daa730 100644 --- a/homeassistant/components/transmission/.translations/ko.json +++ b/homeassistant/components/transmission/.translations/ko.json @@ -19,8 +19,7 @@ }, "title": "Transmission \ud074\ub77c\uc774\uc5b8\ud2b8 \uc124\uc815" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Transmission \uc635\uc158 \uc124\uc815" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/lb.json b/homeassistant/components/transmission/.translations/lb.json index 0533574efb01..a32c2e539d4f 100644 --- a/homeassistant/components/transmission/.translations/lb.json +++ b/homeassistant/components/transmission/.translations/lb.json @@ -19,8 +19,7 @@ }, "title": "Transmission Client ariichten" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Optioune fir Transmission konfigur\u00e9ieren" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/nl.json b/homeassistant/components/transmission/.translations/nl.json index 5abf25e286c0..526851425265 100644 --- a/homeassistant/components/transmission/.translations/nl.json +++ b/homeassistant/components/transmission/.translations/nl.json @@ -19,8 +19,7 @@ }, "title": "Verzendclient instellen" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configureer de opties voor Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/no.json b/homeassistant/components/transmission/.translations/no.json index d18a854d6e38..413fe69560af 100644 --- a/homeassistant/components/transmission/.translations/no.json +++ b/homeassistant/components/transmission/.translations/no.json @@ -19,8 +19,7 @@ }, "title": "Oppsett av Transmission-klient" } - }, - "title": "" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Konfigurer alternativer for Transmission" } } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/pl.json b/homeassistant/components/transmission/.translations/pl.json index f3e8c01f3d76..0805a5a7ff79 100644 --- a/homeassistant/components/transmission/.translations/pl.json +++ b/homeassistant/components/transmission/.translations/pl.json @@ -19,8 +19,7 @@ }, "title": "Konfiguracja klienta Transmission" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Konfiguracja opcji dla Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/pt-BR.json b/homeassistant/components/transmission/.translations/pt-BR.json index 2c162e66ce79..1e927c081bb5 100644 --- a/homeassistant/components/transmission/.translations/pt-BR.json +++ b/homeassistant/components/transmission/.translations/pt-BR.json @@ -19,8 +19,7 @@ }, "title": "Configurar o cliente de transmiss\u00e3o" } - }, - "title": "Transmiss\u00e3o" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Configurar op\u00e7\u00f5es para Transmission" } } - } + }, + "title": "Transmiss\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ru.json b/homeassistant/components/transmission/.translations/ru.json index ad43d3ee6001..b0445528e400 100644 --- a/homeassistant/components/transmission/.translations/ru.json +++ b/homeassistant/components/transmission/.translations/ru.json @@ -19,8 +19,7 @@ }, "title": "Transmission" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/sl.json b/homeassistant/components/transmission/.translations/sl.json index 765fb284c3a6..da77960f288a 100644 --- a/homeassistant/components/transmission/.translations/sl.json +++ b/homeassistant/components/transmission/.translations/sl.json @@ -19,8 +19,7 @@ }, "title": "Namestitev odjemalca Transmission" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Nastavite mo\u017enosti za Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/sv.json b/homeassistant/components/transmission/.translations/sv.json index 289c9f985e3b..da20997d7334 100644 --- a/homeassistant/components/transmission/.translations/sv.json +++ b/homeassistant/components/transmission/.translations/sv.json @@ -19,8 +19,7 @@ }, "title": "St\u00e4ll in Transmission-klienten" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Konfigurera alternativ f\u00f6r Transmission" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/zh-Hant.json b/homeassistant/components/transmission/.translations/zh-Hant.json index 6ae573211c67..b05e458f5cef 100644 --- a/homeassistant/components/transmission/.translations/zh-Hant.json +++ b/homeassistant/components/transmission/.translations/zh-Hant.json @@ -19,8 +19,7 @@ }, "title": "\u8a2d\u5b9a Transmission \u5ba2\u6236\u7aef" } - }, - "title": "Transmission" + } }, "options": { "step": { @@ -31,5 +30,6 @@ "title": "Transmission \u8a2d\u5b9a\u9078\u9805" } } - } + }, + "title": "Transmission" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/bg.json b/homeassistant/components/twentemilieu/.translations/bg.json index df36ab070d79..2ef1a75001d5 100644 --- a/homeassistant/components/twentemilieu/.translations/bg.json +++ b/homeassistant/components/twentemilieu/.translations/bg.json @@ -17,7 +17,7 @@ "description": "\u0421\u044a\u0437\u0434\u0430\u0439\u0442\u0435 Twente Milieu, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044f\u0449\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0441\u044a\u0431\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u043f\u0430\u0434\u044a\u0446\u0438 \u043d\u0430 \u0432\u0430\u0448\u0438\u044f \u0430\u0434\u0440\u0435\u0441.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ca.json b/homeassistant/components/twentemilieu/.translations/ca.json index 27ab8e8a8b2b..caadb8b4da1c 100644 --- a/homeassistant/components/twentemilieu/.translations/ca.json +++ b/homeassistant/components/twentemilieu/.translations/ca.json @@ -17,7 +17,7 @@ "description": "Configura Twente Milieu amb informaci\u00f3 de la recollida de residus a la teva adre\u00e7a.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/da.json b/homeassistant/components/twentemilieu/.translations/da.json index 1e3ca933e389..2d60ef39d883 100644 --- a/homeassistant/components/twentemilieu/.translations/da.json +++ b/homeassistant/components/twentemilieu/.translations/da.json @@ -17,7 +17,7 @@ "description": "Konfigurer Twente Milieu, der leverer oplysninger om indsamling af affald p\u00e5 din adresse.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/de.json b/homeassistant/components/twentemilieu/.translations/de.json index 586e36a5d317..e01a5a40ff66 100644 --- a/homeassistant/components/twentemilieu/.translations/de.json +++ b/homeassistant/components/twentemilieu/.translations/de.json @@ -17,7 +17,7 @@ "description": "Richte Twente Milieu mit Informationen zur Abfallsammlung unter Ihrer Adresse ein.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/en.json b/homeassistant/components/twentemilieu/.translations/en.json index ce969a4f464e..a747845c18f6 100644 --- a/homeassistant/components/twentemilieu/.translations/en.json +++ b/homeassistant/components/twentemilieu/.translations/en.json @@ -17,7 +17,7 @@ "description": "Set up Twente Milieu providing waste collection information on your address.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/es-419.json b/homeassistant/components/twentemilieu/.translations/es-419.json index 02ac8ecf27a2..c61566312848 100644 --- a/homeassistant/components/twentemilieu/.translations/es-419.json +++ b/homeassistant/components/twentemilieu/.translations/es-419.json @@ -4,7 +4,7 @@ "user": { "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/es.json b/homeassistant/components/twentemilieu/.translations/es.json index 60a412684f77..7402843f7aaa 100644 --- a/homeassistant/components/twentemilieu/.translations/es.json +++ b/homeassistant/components/twentemilieu/.translations/es.json @@ -17,7 +17,7 @@ "description": "Configure Twente Milieu proporcionando informaci\u00f3n sobre la recolecci\u00f3n de residuos en su direcci\u00f3n.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/fr.json b/homeassistant/components/twentemilieu/.translations/fr.json index 0321a6b73cec..6f45ff67feff 100644 --- a/homeassistant/components/twentemilieu/.translations/fr.json +++ b/homeassistant/components/twentemilieu/.translations/fr.json @@ -17,7 +17,7 @@ "description": "Configurez Twente Milieu en fournissant des informations sur la collecte des d\u00e9chets sur votre adresse.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/it.json b/homeassistant/components/twentemilieu/.translations/it.json index 27850d207b05..6fb69db04232 100644 --- a/homeassistant/components/twentemilieu/.translations/it.json +++ b/homeassistant/components/twentemilieu/.translations/it.json @@ -17,7 +17,7 @@ "description": "Imposta Twente Milieu fornendo le informazioni sulla raccolta dei rifiuti al tuo indirizzo.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ko.json b/homeassistant/components/twentemilieu/.translations/ko.json index a78867d86a8b..1a9c683614d7 100644 --- a/homeassistant/components/twentemilieu/.translations/ko.json +++ b/homeassistant/components/twentemilieu/.translations/ko.json @@ -17,7 +17,7 @@ "description": "\uc8fc\uc18c\uc5d0 \uc4f0\ub808\uae30 \uc218\uac70 \uc815\ubcf4\ub97c \ub123\uc5b4 Twente Milieu \ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/lb.json b/homeassistant/components/twentemilieu/.translations/lb.json index b6f10842b4d1..186f6f687dca 100644 --- a/homeassistant/components/twentemilieu/.translations/lb.json +++ b/homeassistant/components/twentemilieu/.translations/lb.json @@ -17,7 +17,7 @@ "description": "Offallsammlung Informatiounen vun Twente Milieu zu \u00e4erer Adresse ariichten.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/nl.json b/homeassistant/components/twentemilieu/.translations/nl.json index a420133f464c..c376709b628f 100644 --- a/homeassistant/components/twentemilieu/.translations/nl.json +++ b/homeassistant/components/twentemilieu/.translations/nl.json @@ -17,7 +17,7 @@ "description": "Stel Twente Milieu in voor het inzamelen van afval op uw adres.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/nn.json b/homeassistant/components/twentemilieu/.translations/nn.json index 02ac8ecf27a2..c61566312848 100644 --- a/homeassistant/components/twentemilieu/.translations/nn.json +++ b/homeassistant/components/twentemilieu/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/no.json b/homeassistant/components/twentemilieu/.translations/no.json index 1d4395bb2c80..e9e341c8b03f 100644 --- a/homeassistant/components/twentemilieu/.translations/no.json +++ b/homeassistant/components/twentemilieu/.translations/no.json @@ -17,7 +17,7 @@ "description": "Sett opp Twente Milieu som gir informasjon om innsamling av avfall p\u00e5 adressen din.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/pl.json b/homeassistant/components/twentemilieu/.translations/pl.json index 130672906ef5..0025a9a995c1 100644 --- a/homeassistant/components/twentemilieu/.translations/pl.json +++ b/homeassistant/components/twentemilieu/.translations/pl.json @@ -17,7 +17,7 @@ "description": "Skonfiguruj Twente Milieu, dostarczaj\u0105c informacji o zbieraniu odpad\u00f3w pod swoim adresem.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/pt-BR.json b/homeassistant/components/twentemilieu/.translations/pt-BR.json index 73735dda1d97..15590dabc314 100644 --- a/homeassistant/components/twentemilieu/.translations/pt-BR.json +++ b/homeassistant/components/twentemilieu/.translations/pt-BR.json @@ -17,7 +17,7 @@ "description": "Configure o Twente Milieu, fornecendo informa\u00e7\u00f5es de coleta de lixo em seu endere\u00e7o.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ru.json b/homeassistant/components/twentemilieu/.translations/ru.json index 5d964604a773..6d975fc20374 100644 --- a/homeassistant/components/twentemilieu/.translations/ru.json +++ b/homeassistant/components/twentemilieu/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 Twente Milieu \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u044b\u0432\u043e\u0437\u0435 \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u043e \u0412\u0430\u0448\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/sl.json b/homeassistant/components/twentemilieu/.translations/sl.json index 7b74b96d0574..3ccf19e22f7f 100644 --- a/homeassistant/components/twentemilieu/.translations/sl.json +++ b/homeassistant/components/twentemilieu/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Nastavite Twente milieu, ki zagotavlja informacije o zbiranju odpadkov na va\u0161em naslovu.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/sv.json b/homeassistant/components/twentemilieu/.translations/sv.json index ba2d87436816..edbd77699fa6 100644 --- a/homeassistant/components/twentemilieu/.translations/sv.json +++ b/homeassistant/components/twentemilieu/.translations/sv.json @@ -17,7 +17,7 @@ "description": "St\u00e4ll in Twente Milieu som ger information om avfallshantering p\u00e5 din adress.", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/zh-Hant.json b/homeassistant/components/twentemilieu/.translations/zh-Hant.json index 0e0083ec5c17..46685b2b74de 100644 --- a/homeassistant/components/twentemilieu/.translations/zh-Hant.json +++ b/homeassistant/components/twentemilieu/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u8a2d\u5b9a Twente Milieu \u4ee5\u53d6\u5f97\u8a72\u5730\u5740\u5ee2\u68c4\u7269\u56de\u6536\u8cc7\u8a0a\u3002", "title": "Twente Milieu" } - }, - "title": "Twente Milieu" - } + } + }, + "title": "Twente Milieu" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/bg.json b/homeassistant/components/twilio/.translations/bg.json index 1329a8418ae4..5cc940b6d9a5 100644 --- a/homeassistant/components/twilio/.translations/bg.json +++ b/homeassistant/components/twilio/.translations/bg.json @@ -12,7 +12,7 @@ "description": "\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Twilio?", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ca.json b/homeassistant/components/twilio/.translations/ca.json index bad78e51a36c..e945154a9277 100644 --- a/homeassistant/components/twilio/.translations/ca.json +++ b/homeassistant/components/twilio/.translations/ca.json @@ -12,7 +12,7 @@ "description": "Est\u00e0s segur que vols configurar Twilio?", "title": "Configuraci\u00f3 del Webhook de Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/cs.json b/homeassistant/components/twilio/.translations/cs.json index d484ede413e8..da50d02bf8d8 100644 --- a/homeassistant/components/twilio/.translations/cs.json +++ b/homeassistant/components/twilio/.translations/cs.json @@ -12,7 +12,7 @@ "description": "Opravdu chcete nastavit slu\u017ebu Twilio?", "title": "Nastaven\u00ed Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/da.json b/homeassistant/components/twilio/.translations/da.json index d5f40d56446e..4c3e69c3d87e 100644 --- a/homeassistant/components/twilio/.translations/da.json +++ b/homeassistant/components/twilio/.translations/da.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du vil konfigurere Twilio?", "title": "Konfigurer Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/de.json b/homeassistant/components/twilio/.translations/de.json index 46e53e182a14..5c69717cdf95 100644 --- a/homeassistant/components/twilio/.translations/de.json +++ b/homeassistant/components/twilio/.translations/de.json @@ -12,7 +12,7 @@ "description": "M\u00f6chtest du Twilio wirklich einrichten?", "title": "Twilio-Webhook einrichten" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/en.json b/homeassistant/components/twilio/.translations/en.json index 3ee0421469cf..cfc522ba8eb2 100644 --- a/homeassistant/components/twilio/.translations/en.json +++ b/homeassistant/components/twilio/.translations/en.json @@ -12,7 +12,7 @@ "description": "Are you sure you want to set up Twilio?", "title": "Set up the Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/es-419.json b/homeassistant/components/twilio/.translations/es-419.json index a5fd83abef4f..81721c85bda9 100644 --- a/homeassistant/components/twilio/.translations/es-419.json +++ b/homeassistant/components/twilio/.translations/es-419.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar Twilio?", "title": "Configurar el Webhook Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/es.json b/homeassistant/components/twilio/.translations/es.json index 8112c2a47c38..253878789156 100644 --- a/homeassistant/components/twilio/.translations/es.json +++ b/homeassistant/components/twilio/.translations/es.json @@ -12,7 +12,7 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar Twilio?", "title": "Configurar el Webhook de Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/fr.json b/homeassistant/components/twilio/.translations/fr.json index 09ca0f63cfd7..869520ee9562 100644 --- a/homeassistant/components/twilio/.translations/fr.json +++ b/homeassistant/components/twilio/.translations/fr.json @@ -12,7 +12,7 @@ "description": "\u00cates-vous s\u00fbr de vouloir configurer Twilio?", "title": "Configurer le Webhook Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/hu.json b/homeassistant/components/twilio/.translations/hu.json index ae96d08976de..26e66e7d584b 100644 --- a/homeassistant/components/twilio/.translations/hu.json +++ b/homeassistant/components/twilio/.translations/hu.json @@ -9,7 +9,7 @@ "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Twilio-t?", "title": "A Twilio Webhook be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/it.json b/homeassistant/components/twilio/.translations/it.json index 4f8926c23e5f..80b740b62d9c 100644 --- a/homeassistant/components/twilio/.translations/it.json +++ b/homeassistant/components/twilio/.translations/it.json @@ -12,7 +12,7 @@ "description": "Sei sicuro di voler configurare Twilio?", "title": "Configura il webhook di Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ko.json b/homeassistant/components/twilio/.translations/ko.json index b8e888205902..b42fcbf4e275 100644 --- a/homeassistant/components/twilio/.translations/ko.json +++ b/homeassistant/components/twilio/.translations/ko.json @@ -12,7 +12,7 @@ "description": "Twilio \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Twilio Webhook \uc124\uc815" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/lb.json b/homeassistant/components/twilio/.translations/lb.json index 96b884b0c8e3..c1329c0aee90 100644 --- a/homeassistant/components/twilio/.translations/lb.json +++ b/homeassistant/components/twilio/.translations/lb.json @@ -12,7 +12,7 @@ "description": "S\u00e9cher fir Twilio anzeriichten?", "title": "Twilio Webhook ariichten" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/nl.json b/homeassistant/components/twilio/.translations/nl.json index 842307c666bb..b0b021be457e 100644 --- a/homeassistant/components/twilio/.translations/nl.json +++ b/homeassistant/components/twilio/.translations/nl.json @@ -12,7 +12,7 @@ "description": "Weet u zeker dat u Twilio wilt instellen?", "title": "Stel de Twilio Webhook in" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/nn.json b/homeassistant/components/twilio/.translations/nn.json index 86e5d9051b33..8831caab4768 100644 --- a/homeassistant/components/twilio/.translations/nn.json +++ b/homeassistant/components/twilio/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Twilio" - } + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/no.json b/homeassistant/components/twilio/.translations/no.json index c3d6ff16e2dd..3da622c7f515 100644 --- a/homeassistant/components/twilio/.translations/no.json +++ b/homeassistant/components/twilio/.translations/no.json @@ -12,7 +12,7 @@ "description": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 sette opp Twilio?", "title": "Sett opp Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pl.json b/homeassistant/components/twilio/.translations/pl.json index c61d22db8804..7191eba4a5ca 100644 --- a/homeassistant/components/twilio/.translations/pl.json +++ b/homeassistant/components/twilio/.translations/pl.json @@ -12,7 +12,7 @@ "description": "Na pewno chcesz skonfigurowa\u0107 Twilio?", "title": "Konfiguracja Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pt-BR.json b/homeassistant/components/twilio/.translations/pt-BR.json index 28d6488f2ed6..f715e1d5711a 100644 --- a/homeassistant/components/twilio/.translations/pt-BR.json +++ b/homeassistant/components/twilio/.translations/pt-BR.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Twilio?", "title": "Configurar o Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pt.json b/homeassistant/components/twilio/.translations/pt.json index 30495e5854f6..8327206773e0 100644 --- a/homeassistant/components/twilio/.translations/pt.json +++ b/homeassistant/components/twilio/.translations/pt.json @@ -12,7 +12,7 @@ "description": "Tem certeza de que deseja configurar o Twilio?", "title": "Configurar o Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ru.json b/homeassistant/components/twilio/.translations/ru.json index ba8ed6179d4b..34fdd4145de1 100644 --- a/homeassistant/components/twilio/.translations/ru.json +++ b/homeassistant/components/twilio/.translations/ru.json @@ -12,7 +12,7 @@ "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 Twilio?", "title": "Twilio" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/sl.json b/homeassistant/components/twilio/.translations/sl.json index 86d2c44f11cf..9da6470144ef 100644 --- a/homeassistant/components/twilio/.translations/sl.json +++ b/homeassistant/components/twilio/.translations/sl.json @@ -12,7 +12,7 @@ "description": "Ali ste prepri\u010dani, da \u017eelite nastaviti Twilio?", "title": "Nastavite Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/sv.json b/homeassistant/components/twilio/.translations/sv.json index 673997d5aa98..b3863083cf64 100644 --- a/homeassistant/components/twilio/.translations/sv.json +++ b/homeassistant/components/twilio/.translations/sv.json @@ -12,7 +12,7 @@ "description": "\u00c4r du s\u00e4ker p\u00e5 att du vill konfigurera Twilio?", "title": "Konfigurera Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/zh-Hans.json b/homeassistant/components/twilio/.translations/zh-Hans.json index 6fda9f0143c9..35ccf1ecfbbd 100644 --- a/homeassistant/components/twilio/.translations/zh-Hans.json +++ b/homeassistant/components/twilio/.translations/zh-Hans.json @@ -12,7 +12,7 @@ "description": "\u60a8\u786e\u5b9a\u8981\u8bbe\u7f6e Twilio \u5417\uff1f", "title": "\u8bbe\u7f6e Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/zh-Hant.json b/homeassistant/components/twilio/.translations/zh-Hant.json index 858970539cd2..c5ffa00dd5c7 100644 --- a/homeassistant/components/twilio/.translations/zh-Hant.json +++ b/homeassistant/components/twilio/.translations/zh-Hant.json @@ -12,7 +12,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Twilio\uff1f", "title": "\u8a2d\u5b9a Twilio Webhook" } - }, - "title": "Twilio" - } + } + }, + "title": "Twilio" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/bg.json b/homeassistant/components/unifi/.translations/bg.json index 4b8b89774914..527b1a7a3746 100644 --- a/homeassistant/components/unifi/.translations/bg.json +++ b/homeassistant/components/unifi/.translations/bg.json @@ -20,8 +20,7 @@ }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 UniFi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440" } - }, - "title": "UniFi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440" + } }, "options": { "step": { @@ -39,5 +38,6 @@ } } } - } + }, + "title": "UniFi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ca.json b/homeassistant/components/unifi/.translations/ca.json index 7eefb77b3d21..786bd871ff45 100644 --- a/homeassistant/components/unifi/.translations/ca.json +++ b/homeassistant/components/unifi/.translations/ca.json @@ -21,8 +21,7 @@ }, "title": "Configuraci\u00f3 del controlador UniFi" } - }, - "title": "Controlador UniFi" + } }, "error": { "unknown_client_mac": "No hi ha cap client disponible a UniFi en aquesta adre\u00e7a MAC" @@ -57,5 +56,6 @@ "title": "Opcions d'UniFi" } } - } + }, + "title": "Controlador UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/cs.json b/homeassistant/components/unifi/.translations/cs.json index 32711da56f71..0d7da884aba4 100644 --- a/homeassistant/components/unifi/.translations/cs.json +++ b/homeassistant/components/unifi/.translations/cs.json @@ -20,8 +20,7 @@ }, "title": "Nastaven\u00ed UniFi \u0159adi\u010de" } - }, - "title": "UniFi \u0159adi\u010d" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } } } - } + }, + "title": "UniFi \u0159adi\u010d" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/da.json b/homeassistant/components/unifi/.translations/da.json index 1afd1ca96ce3..8f2f33868e46 100644 --- a/homeassistant/components/unifi/.translations/da.json +++ b/homeassistant/components/unifi/.translations/da.json @@ -20,8 +20,7 @@ }, "title": "Konfigurer UniFi Controller" } - }, - "title": "UniFi Controller" + } }, "options": { "step": { @@ -50,5 +49,6 @@ "title": "UniFi-indstillinger" } } - } + }, + "title": "UniFi Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/de.json b/homeassistant/components/unifi/.translations/de.json index afdea87956b3..db7cf1b6ab21 100644 --- a/homeassistant/components/unifi/.translations/de.json +++ b/homeassistant/components/unifi/.translations/de.json @@ -21,8 +21,7 @@ }, "title": "UniFi-Controller einrichten" } - }, - "title": "UniFi-Controller" + } }, "error": { "unknown_client_mac": "Unter dieser MAC-Adresse ist in UniFi kein Client verf\u00fcgbar" @@ -63,5 +62,6 @@ "title": "UniFi-Optionen 3/3" } } - } + }, + "title": "UniFi-Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index d42a647c82fe..4b83deb174ff 100644 --- a/homeassistant/components/unifi/.translations/en.json +++ b/homeassistant/components/unifi/.translations/en.json @@ -21,8 +21,7 @@ }, "title": "Set up UniFi Controller" } - }, - "title": "UniFi Controller" + } }, "error": { "unknown_client_mac": "No client available in UniFi on that MAC address" @@ -57,5 +56,6 @@ "title": "UniFi options 3/3" } } - } + }, + "title": "UniFi Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/es-419.json b/homeassistant/components/unifi/.translations/es-419.json index 9b729e4c4aba..515e5fbe9641 100644 --- a/homeassistant/components/unifi/.translations/es-419.json +++ b/homeassistant/components/unifi/.translations/es-419.json @@ -20,7 +20,7 @@ }, "title": "Configurar el controlador UniFi" } - }, - "title": "Controlador UniFi" - } + } + }, + "title": "Controlador UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/es.json b/homeassistant/components/unifi/.translations/es.json index 31c7e6c0bcd4..87b64e7809d2 100644 --- a/homeassistant/components/unifi/.translations/es.json +++ b/homeassistant/components/unifi/.translations/es.json @@ -21,8 +21,7 @@ }, "title": "Configurar el controlador UniFi" } - }, - "title": "Controlador UniFi" + } }, "error": { "unknown_client_mac": "Ning\u00fan cliente disponible en UniFi en esa direcci\u00f3n MAC" @@ -63,5 +62,6 @@ "title": "Opciones UniFi 3/3" } } - } + }, + "title": "Controlador UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/fr.json b/homeassistant/components/unifi/.translations/fr.json index 659a567a91f0..71930db04f24 100644 --- a/homeassistant/components/unifi/.translations/fr.json +++ b/homeassistant/components/unifi/.translations/fr.json @@ -21,8 +21,7 @@ }, "title": "Configurer le contr\u00f4leur UniFi" } - }, - "title": "Contr\u00f4leur UniFi" + } }, "error": { "unknown_client_mac": "Aucun client disponible dans UniFi sur cette adresse MAC" @@ -60,5 +59,6 @@ "title": "Options UniFi 3/3" } } - } + }, + "title": "Contr\u00f4leur UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/hu.json b/homeassistant/components/unifi/.translations/hu.json index f6919f985dcd..6a5f30913aed 100644 --- a/homeassistant/components/unifi/.translations/hu.json +++ b/homeassistant/components/unifi/.translations/hu.json @@ -19,8 +19,7 @@ }, "title": "UniFi vez\u00e9rl\u0151 be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "UniFi Vez\u00e9rl\u0151" + } }, "options": { "step": { @@ -30,5 +29,6 @@ } } } - } + }, + "title": "UniFi Vez\u00e9rl\u0151" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/it.json b/homeassistant/components/unifi/.translations/it.json index 9439715fe792..7cb0a0a9ee1d 100644 --- a/homeassistant/components/unifi/.translations/it.json +++ b/homeassistant/components/unifi/.translations/it.json @@ -21,8 +21,7 @@ }, "title": "Configura l'UniFi Controller" } - }, - "title": "UniFi Controller" + } }, "error": { "unknown_client_mac": "Nessun client disponibile in UniFi su quell'indirizzo MAC" @@ -62,5 +61,6 @@ "title": "Opzioni UniFi 3/3" } } - } + }, + "title": "UniFi Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ko.json b/homeassistant/components/unifi/.translations/ko.json index d57d80c79114..730f11189f08 100644 --- a/homeassistant/components/unifi/.translations/ko.json +++ b/homeassistant/components/unifi/.translations/ko.json @@ -21,8 +21,7 @@ }, "title": "UniFi \ucee8\ud2b8\ub864\ub7ec \uc124\uc815" } - }, - "title": "UniFi \ucee8\ud2b8\ub864\ub7ec" + } }, "error": { "unknown_client_mac": "\ud574\ub2f9 MAC \uc8fc\uc18c\uc758 UniFi \uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4." @@ -57,5 +56,6 @@ "title": "UniFi \uc635\uc158 3/3" } } - } + }, + "title": "UniFi \ucee8\ud2b8\ub864\ub7ec" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/lb.json b/homeassistant/components/unifi/.translations/lb.json index 26872a9f9a2b..b82c0036c7a7 100644 --- a/homeassistant/components/unifi/.translations/lb.json +++ b/homeassistant/components/unifi/.translations/lb.json @@ -21,8 +21,7 @@ }, "title": "Unifi Kontroller ariichten" } - }, - "title": "Unifi Kontroller" + } }, "error": { "unknown_client_mac": "Kee Client am Unifi disponibel mat der MAC Adress" @@ -63,5 +62,6 @@ "title": "UniFi Optiounen 3/3" } } - } + }, + "title": "Unifi Kontroller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/nl.json b/homeassistant/components/unifi/.translations/nl.json index fe31651173b3..7e03a1314ab4 100644 --- a/homeassistant/components/unifi/.translations/nl.json +++ b/homeassistant/components/unifi/.translations/nl.json @@ -20,8 +20,7 @@ }, "title": "Stel de UniFi-controller in" } - }, - "title": "UniFi-controller" + } }, "options": { "step": { @@ -50,5 +49,6 @@ } } } - } + }, + "title": "UniFi-controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/no.json b/homeassistant/components/unifi/.translations/no.json index 156faf83d92c..5085372747aa 100644 --- a/homeassistant/components/unifi/.translations/no.json +++ b/homeassistant/components/unifi/.translations/no.json @@ -21,8 +21,7 @@ }, "title": "Sett opp UniFi kontroller" } - }, - "title": "UniFi kontroller" + } }, "error": { "unknown_client_mac": "Ingen klient tilgjengelig i UniFi p\u00e5 den MAC-adressen" @@ -56,5 +55,6 @@ "title": "UniFi-alternativ 3/3" } } - } + }, + "title": "UniFi kontroller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pl.json b/homeassistant/components/unifi/.translations/pl.json index 08329aed574a..b02484e18270 100644 --- a/homeassistant/components/unifi/.translations/pl.json +++ b/homeassistant/components/unifi/.translations/pl.json @@ -21,8 +21,7 @@ }, "title": "Konfiguracja kontrolera UniFi" } - }, - "title": "Kontroler UniFi" + } }, "error": { "unknown_client_mac": "Brak klienta w UniFi z tym adresem MAC" @@ -64,5 +63,6 @@ "title": "Opcje UniFi" } } - } + }, + "title": "Kontroler UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pt-BR.json b/homeassistant/components/unifi/.translations/pt-BR.json index a57bb33ee7a7..d60b4b5275b4 100644 --- a/homeassistant/components/unifi/.translations/pt-BR.json +++ b/homeassistant/components/unifi/.translations/pt-BR.json @@ -20,8 +20,7 @@ }, "title": "Configurar o Controlador UniFi" } - }, - "title": "Controlador UniFi" + } }, "options": { "step": { @@ -40,5 +39,6 @@ } } } - } + }, + "title": "Controlador UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pt.json b/homeassistant/components/unifi/.translations/pt.json index c602a58660bb..6044aa4fa6fd 100644 --- a/homeassistant/components/unifi/.translations/pt.json +++ b/homeassistant/components/unifi/.translations/pt.json @@ -20,8 +20,7 @@ }, "title": "Configurar o controlador UniFi" } - }, - "title": "Controlador UniFi" + } }, "options": { "step": { @@ -45,5 +44,6 @@ } } } - } + }, + "title": "Controlador UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ro.json b/homeassistant/components/unifi/.translations/ro.json index 99b1ac57e0b8..8b1c55af0891 100644 --- a/homeassistant/components/unifi/.translations/ro.json +++ b/homeassistant/components/unifi/.translations/ro.json @@ -18,7 +18,7 @@ }, "title": "Configura\u021bi un controler UniFi" } - }, - "title": "Controler UniFi" - } + } + }, + "title": "Controler UniFi" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ru.json b/homeassistant/components/unifi/.translations/ru.json index 6cd09a947eb2..2850f91efb87 100644 --- a/homeassistant/components/unifi/.translations/ru.json +++ b/homeassistant/components/unifi/.translations/ru.json @@ -21,8 +21,7 @@ }, "title": "UniFi Controller" } - }, - "title": "UniFi Controller" + } }, "options": { "step": { @@ -61,5 +60,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 UniFi. \u0428\u0430\u0433 3" } } - } + }, + "title": "UniFi Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/sl.json b/homeassistant/components/unifi/.translations/sl.json index a2c37f027b20..6606175b9dfd 100644 --- a/homeassistant/components/unifi/.translations/sl.json +++ b/homeassistant/components/unifi/.translations/sl.json @@ -21,8 +21,7 @@ }, "title": "Nastavi UniFi Controller" } - }, - "title": "UniFi Krmilnik" + } }, "error": { "unknown_client_mac": "V UniFi na tem naslovu MAC ni na voljo nobenega odjemalca" @@ -64,5 +63,6 @@ "title": "Mo\u017enosti UniFi 3/3" } } - } + }, + "title": "UniFi Krmilnik" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/sv.json b/homeassistant/components/unifi/.translations/sv.json index dbf5373aa9a3..c1ea81e01d36 100644 --- a/homeassistant/components/unifi/.translations/sv.json +++ b/homeassistant/components/unifi/.translations/sv.json @@ -20,8 +20,7 @@ }, "title": "Konfigurera UniFi Controller" } - }, - "title": "UniFi Controller" + } }, "options": { "step": { @@ -45,5 +44,6 @@ } } } - } + }, + "title": "UniFi Controller" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/zh-Hans.json b/homeassistant/components/unifi/.translations/zh-Hans.json index ebed653732fe..86855859961f 100644 --- a/homeassistant/components/unifi/.translations/zh-Hans.json +++ b/homeassistant/components/unifi/.translations/zh-Hans.json @@ -20,8 +20,7 @@ }, "title": "\u914d\u7f6e UniFi \u63a7\u5236\u5668" } - }, - "title": "UniFi \u63a7\u5236\u5668" + } }, "options": { "step": { @@ -41,5 +40,6 @@ "title": "UniFi \u9009\u9879" } } - } + }, + "title": "UniFi \u63a7\u5236\u5668" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/zh-Hant.json b/homeassistant/components/unifi/.translations/zh-Hant.json index e91bfca407c0..df4ecc4a05e6 100644 --- a/homeassistant/components/unifi/.translations/zh-Hant.json +++ b/homeassistant/components/unifi/.translations/zh-Hant.json @@ -21,8 +21,7 @@ }, "title": "\u8a2d\u5b9a UniFi \u63a7\u5236\u5668" } - }, - "title": "UniFi \u63a7\u5236\u5668" + } }, "error": { "unknown_client_mac": "\u8a72 Mac \u4f4d\u5740\u7121\u53ef\u7528 UniFi \u5ba2\u6236\u7aef" @@ -57,5 +56,6 @@ "title": "UniFi \u9078\u9805 3/3" } } - } + }, + "title": "UniFi \u63a7\u5236\u5668" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/bg.json b/homeassistant/components/upnp/.translations/bg.json index 6ee5961f1524..66847b1a6ca5 100644 --- a/homeassistant/components/upnp/.translations/bg.json +++ b/homeassistant/components/upnp/.translations/bg.json @@ -28,7 +28,7 @@ }, "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0438 \u043e\u043f\u0446\u0438\u0438 \u0437\u0430 UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ca.json b/homeassistant/components/upnp/.translations/ca.json index 85370eec8e6c..7d75b1481482 100644 --- a/homeassistant/components/upnp/.translations/ca.json +++ b/homeassistant/components/upnp/.translations/ca.json @@ -28,7 +28,7 @@ }, "title": "Opcions de configuraci\u00f3 d'UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/cs.json b/homeassistant/components/upnp/.translations/cs.json index 17d9949453c8..8f5a1a2cfc01 100644 --- a/homeassistant/components/upnp/.translations/cs.json +++ b/homeassistant/components/upnp/.translations/cs.json @@ -24,7 +24,7 @@ }, "title": "Mo\u017enosti konfigurace pro UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/da.json b/homeassistant/components/upnp/.translations/da.json index c41741b86354..334641b30595 100644 --- a/homeassistant/components/upnp/.translations/da.json +++ b/homeassistant/components/upnp/.translations/da.json @@ -28,7 +28,7 @@ }, "title": "Konfigurationsindstillinger for UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/de.json b/homeassistant/components/upnp/.translations/de.json index 253dfd59a6c4..c195c8a7c7b7 100644 --- a/homeassistant/components/upnp/.translations/de.json +++ b/homeassistant/components/upnp/.translations/de.json @@ -28,7 +28,7 @@ }, "title": "Konfigurationsoptionen f\u00fcr UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/en.json b/homeassistant/components/upnp/.translations/en.json index 632d5112f1ae..a913ee054c65 100644 --- a/homeassistant/components/upnp/.translations/en.json +++ b/homeassistant/components/upnp/.translations/en.json @@ -24,7 +24,7 @@ }, "title": "Configuration options for the UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/es-419.json b/homeassistant/components/upnp/.translations/es-419.json index bd95b48359ee..e8098013fb5d 100644 --- a/homeassistant/components/upnp/.translations/es-419.json +++ b/homeassistant/components/upnp/.translations/es-419.json @@ -24,7 +24,7 @@ }, "title": "Opciones de configuraci\u00f3n para UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/es.json b/homeassistant/components/upnp/.translations/es.json index fa299cc379f6..eb8695eb8ea3 100644 --- a/homeassistant/components/upnp/.translations/es.json +++ b/homeassistant/components/upnp/.translations/es.json @@ -28,7 +28,7 @@ }, "title": "Opciones de configuraci\u00f3n para UPnP/IGD" } - }, - "title": "UPnP / IGD" - } + } + }, + "title": "UPnP / IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/et.json b/homeassistant/components/upnp/.translations/et.json index 0c49a92bc0a7..91834ec81bb1 100644 --- a/homeassistant/components/upnp/.translations/et.json +++ b/homeassistant/components/upnp/.translations/et.json @@ -9,7 +9,7 @@ "igd": "" } } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/fr.json b/homeassistant/components/upnp/.translations/fr.json index 6864658b3794..da06ae079399 100644 --- a/homeassistant/components/upnp/.translations/fr.json +++ b/homeassistant/components/upnp/.translations/fr.json @@ -28,7 +28,7 @@ }, "title": "Options de configuration pour UPnP / IGD" } - }, - "title": "UPnP / IGD" - } + } + }, + "title": "UPnP / IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/hu.json b/homeassistant/components/upnp/.translations/hu.json index 29dab5e09da0..a4caa11a0eed 100644 --- a/homeassistant/components/upnp/.translations/hu.json +++ b/homeassistant/components/upnp/.translations/hu.json @@ -27,7 +27,7 @@ }, "title": "Az UPnP/IGD be\u00e1ll\u00edt\u00e1si lehet\u0151s\u00e9gei" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/it.json b/homeassistant/components/upnp/.translations/it.json index e822895a6cfa..99c9cd2366fe 100644 --- a/homeassistant/components/upnp/.translations/it.json +++ b/homeassistant/components/upnp/.translations/it.json @@ -28,7 +28,7 @@ }, "title": "Opzioni di configurazione per UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ko.json b/homeassistant/components/upnp/.translations/ko.json index bd6aaeef4e29..4ce12cfbe3ab 100644 --- a/homeassistant/components/upnp/.translations/ko.json +++ b/homeassistant/components/upnp/.translations/ko.json @@ -24,7 +24,7 @@ }, "title": "UPnP/IGD \uc758 \uad6c\uc131 \uc635\uc158" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/lb.json b/homeassistant/components/upnp/.translations/lb.json index 029e1e87cf13..4304a5e7954f 100644 --- a/homeassistant/components/upnp/.translations/lb.json +++ b/homeassistant/components/upnp/.translations/lb.json @@ -28,7 +28,7 @@ }, "title": "Konfiguratiouns Optiounen fir UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/nl.json b/homeassistant/components/upnp/.translations/nl.json index a94471bb6102..522a42ec1723 100644 --- a/homeassistant/components/upnp/.translations/nl.json +++ b/homeassistant/components/upnp/.translations/nl.json @@ -28,7 +28,7 @@ }, "title": "Configuratiemogelijkheden voor de UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/nn.json b/homeassistant/components/upnp/.translations/nn.json index 8e173e4297fb..ed6238dd83ae 100644 --- a/homeassistant/components/upnp/.translations/nn.json +++ b/homeassistant/components/upnp/.translations/nn.json @@ -19,7 +19,7 @@ "igd": "UPnP/IGD" } } - }, - "title": "UPnP / IGD" - } + } + }, + "title": "UPnP / IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/no.json b/homeassistant/components/upnp/.translations/no.json index fb1508a1aab0..9b45ea7965a6 100644 --- a/homeassistant/components/upnp/.translations/no.json +++ b/homeassistant/components/upnp/.translations/no.json @@ -32,7 +32,7 @@ }, "title": "Konfigurasjonsalternativer for UPnP / IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pl.json b/homeassistant/components/upnp/.translations/pl.json index 964e5a6818d8..084ecfa1371c 100644 --- a/homeassistant/components/upnp/.translations/pl.json +++ b/homeassistant/components/upnp/.translations/pl.json @@ -30,7 +30,7 @@ }, "title": "Opcje konfiguracji dla UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pt-BR.json b/homeassistant/components/upnp/.translations/pt-BR.json index bfe4a2ab862e..443bb933900a 100644 --- a/homeassistant/components/upnp/.translations/pt-BR.json +++ b/homeassistant/components/upnp/.translations/pt-BR.json @@ -24,7 +24,7 @@ }, "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o para o UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pt.json b/homeassistant/components/upnp/.translations/pt.json index d559a05ff23a..f05f025ff823 100644 --- a/homeassistant/components/upnp/.translations/pt.json +++ b/homeassistant/components/upnp/.translations/pt.json @@ -28,7 +28,7 @@ }, "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o para o UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ro.json b/homeassistant/components/upnp/.translations/ro.json index bb584da05dc4..406d1e964f34 100644 --- a/homeassistant/components/upnp/.translations/ro.json +++ b/homeassistant/components/upnp/.translations/ro.json @@ -21,7 +21,7 @@ }, "title": "Op\u021biuni de configurare pentru UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ru.json b/homeassistant/components/upnp/.translations/ru.json index b0a7b7e7b65b..358f589dd470 100644 --- a/homeassistant/components/upnp/.translations/ru.json +++ b/homeassistant/components/upnp/.translations/ru.json @@ -30,7 +30,7 @@ }, "title": "UPnP / IGD" } - }, - "title": "UPnP / IGD" - } + } + }, + "title": "UPnP / IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/sl.json b/homeassistant/components/upnp/.translations/sl.json index 4c019d8f2076..38fd6134baef 100644 --- a/homeassistant/components/upnp/.translations/sl.json +++ b/homeassistant/components/upnp/.translations/sl.json @@ -30,7 +30,7 @@ }, "title": "Mo\u017enosti konfiguracije za UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/sv.json b/homeassistant/components/upnp/.translations/sv.json index e3864aee4da2..c5232db59daa 100644 --- a/homeassistant/components/upnp/.translations/sv.json +++ b/homeassistant/components/upnp/.translations/sv.json @@ -28,7 +28,7 @@ }, "title": "Konfigurationsalternativ f\u00f6r UPnP/IGD" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/zh-Hans.json b/homeassistant/components/upnp/.translations/zh-Hans.json index 2194a2dc264c..3a0942e91569 100644 --- a/homeassistant/components/upnp/.translations/zh-Hans.json +++ b/homeassistant/components/upnp/.translations/zh-Hans.json @@ -24,7 +24,7 @@ }, "title": "UPnP/IGD \u7684\u914d\u7f6e\u9009\u9879" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/zh-Hant.json b/homeassistant/components/upnp/.translations/zh-Hant.json index 1611dac27213..490b0c218df6 100644 --- a/homeassistant/components/upnp/.translations/zh-Hant.json +++ b/homeassistant/components/upnp/.translations/zh-Hant.json @@ -24,7 +24,7 @@ }, "title": "UPnP/IGD \u8a2d\u5b9a\u9078\u9805" } - }, - "title": "UPnP/IGD" - } + } + }, + "title": "UPnP/IGD" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/bg.json b/homeassistant/components/velbus/.translations/bg.json index e769f83d28e2..283a24ea2260 100644 --- a/homeassistant/components/velbus/.translations/bg.json +++ b/homeassistant/components/velbus/.translations/bg.json @@ -15,7 +15,7 @@ }, "title": "\u0414\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0442\u0438\u043f\u0430 \u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0441 velbus" } - }, - "title": "Velbus \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441" - } + } + }, + "title": "Velbus \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ca.json b/homeassistant/components/velbus/.translations/ca.json index e38977a483fa..3a9be7d213e4 100644 --- a/homeassistant/components/velbus/.translations/ca.json +++ b/homeassistant/components/velbus/.translations/ca.json @@ -15,7 +15,7 @@ }, "title": "Tipus de connexi\u00f3 Velbus" } - }, - "title": "Interf\u00edcie Velbus" - } + } + }, + "title": "Interf\u00edcie Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/da.json b/homeassistant/components/velbus/.translations/da.json index 5e636c8bcd77..6d70f7c3d60b 100644 --- a/homeassistant/components/velbus/.translations/da.json +++ b/homeassistant/components/velbus/.translations/da.json @@ -15,7 +15,7 @@ }, "title": "Definer velbus forbindelsestypen" } - }, - "title": "Velbus-interface" - } + } + }, + "title": "Velbus-interface" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/de.json b/homeassistant/components/velbus/.translations/de.json index 72af917e12ed..48f23aa0cf88 100644 --- a/homeassistant/components/velbus/.translations/de.json +++ b/homeassistant/components/velbus/.translations/de.json @@ -15,7 +15,7 @@ }, "title": "Definieren des Velbus-Verbindungstyps" } - }, - "title": "Velbus-Schnittstelle" - } + } + }, + "title": "Velbus-Schnittstelle" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/en.json b/homeassistant/components/velbus/.translations/en.json index 898380a6f290..b28088efa6a7 100644 --- a/homeassistant/components/velbus/.translations/en.json +++ b/homeassistant/components/velbus/.translations/en.json @@ -15,7 +15,7 @@ }, "title": "Define the velbus connection type" } - }, - "title": "Velbus interface" - } + } + }, + "title": "Velbus interface" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/es-419.json b/homeassistant/components/velbus/.translations/es-419.json index 1e1e8897c301..197bff064b02 100644 --- a/homeassistant/components/velbus/.translations/es-419.json +++ b/homeassistant/components/velbus/.translations/es-419.json @@ -15,7 +15,7 @@ }, "title": "Definir el tipo de conexi\u00f3n velbus" } - }, - "title": "Interfaz Velbus" - } + } + }, + "title": "Interfaz Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/es.json b/homeassistant/components/velbus/.translations/es.json index 1e1e8897c301..197bff064b02 100644 --- a/homeassistant/components/velbus/.translations/es.json +++ b/homeassistant/components/velbus/.translations/es.json @@ -15,7 +15,7 @@ }, "title": "Definir el tipo de conexi\u00f3n velbus" } - }, - "title": "Interfaz Velbus" - } + } + }, + "title": "Interfaz Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/fr.json b/homeassistant/components/velbus/.translations/fr.json index 8d93adbf4a92..95987d48a301 100644 --- a/homeassistant/components/velbus/.translations/fr.json +++ b/homeassistant/components/velbus/.translations/fr.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9finir le type de connexion velbus" } - }, - "title": "Interface Velbus" - } + } + }, + "title": "Interface Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/it.json b/homeassistant/components/velbus/.translations/it.json index e4f1fbf9c6b7..d1b74e9ec22a 100644 --- a/homeassistant/components/velbus/.translations/it.json +++ b/homeassistant/components/velbus/.translations/it.json @@ -15,7 +15,7 @@ }, "title": "Definire il tipo di connessione Velbus" } - }, - "title": "Interfaccia Velbus" - } + } + }, + "title": "Interfaccia Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ko.json b/homeassistant/components/velbus/.translations/ko.json index 6e218afc97c1..06ca9a058e3d 100644 --- a/homeassistant/components/velbus/.translations/ko.json +++ b/homeassistant/components/velbus/.translations/ko.json @@ -15,7 +15,7 @@ }, "title": "Velbus \uc5f0\uacb0 \uc720\ud615 \uc815\uc758" } - }, - "title": "Velbus \uc778\ud130\ud398\uc774\uc2a4" - } + } + }, + "title": "Velbus \uc778\ud130\ud398\uc774\uc2a4" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/lb.json b/homeassistant/components/velbus/.translations/lb.json index f38a74e5c1fd..b902843ae46f 100644 --- a/homeassistant/components/velbus/.translations/lb.json +++ b/homeassistant/components/velbus/.translations/lb.json @@ -15,7 +15,7 @@ }, "title": "D\u00e9fin\u00e9iert den Typ vun der Velbus Verbindung" } - }, - "title": "Velbus Interface" - } + } + }, + "title": "Velbus Interface" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/nl.json b/homeassistant/components/velbus/.translations/nl.json index b2908e8d2210..03d979827576 100644 --- a/homeassistant/components/velbus/.translations/nl.json +++ b/homeassistant/components/velbus/.translations/nl.json @@ -15,7 +15,7 @@ }, "title": "Definieer de velbus-verbindingstype" } - }, - "title": "Velbus interface" - } + } + }, + "title": "Velbus interface" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/no.json b/homeassistant/components/velbus/.translations/no.json index c6b16170877e..99a3706cf137 100644 --- a/homeassistant/components/velbus/.translations/no.json +++ b/homeassistant/components/velbus/.translations/no.json @@ -15,7 +15,7 @@ }, "title": "Definer tilkoblingstype for velbus" } - }, - "title": "Velbus-grensesnitt" - } + } + }, + "title": "Velbus-grensesnitt" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/pl.json b/homeassistant/components/velbus/.translations/pl.json index 0856d142befe..a412d583fa4a 100644 --- a/homeassistant/components/velbus/.translations/pl.json +++ b/homeassistant/components/velbus/.translations/pl.json @@ -15,7 +15,7 @@ }, "title": "Zdefiniuj typ po\u0142\u0105czenia Velbus" } - }, - "title": "Interfejs Velbus" - } + } + }, + "title": "Interfejs Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ru.json b/homeassistant/components/velbus/.translations/ru.json index 10ae06ffa7c3..ab07c0f6183e 100644 --- a/homeassistant/components/velbus/.translations/ru.json +++ b/homeassistant/components/velbus/.translations/ru.json @@ -15,7 +15,7 @@ }, "title": "Velbus" } - }, - "title": "Velbus" - } + } + }, + "title": "Velbus" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/sl.json b/homeassistant/components/velbus/.translations/sl.json index 2fa1ccadcea6..2e1cf68cf266 100644 --- a/homeassistant/components/velbus/.translations/sl.json +++ b/homeassistant/components/velbus/.translations/sl.json @@ -15,7 +15,7 @@ }, "title": "Dolo\u010dite vrsto povezave z velbusom" } - }, - "title": "Velbus vmesnik" - } + } + }, + "title": "Velbus vmesnik" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/sv.json b/homeassistant/components/velbus/.translations/sv.json index 5a8644394237..528c6143279b 100644 --- a/homeassistant/components/velbus/.translations/sv.json +++ b/homeassistant/components/velbus/.translations/sv.json @@ -15,7 +15,7 @@ }, "title": "Definiera velbus-anslutningstypen" } - }, - "title": "Velbus-gr\u00e4nssnitt" - } + } + }, + "title": "Velbus-gr\u00e4nssnitt" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/zh-Hant.json b/homeassistant/components/velbus/.translations/zh-Hant.json index 33f9191e8a21..5916b339ddd4 100644 --- a/homeassistant/components/velbus/.translations/zh-Hant.json +++ b/homeassistant/components/velbus/.translations/zh-Hant.json @@ -15,7 +15,7 @@ }, "title": "\u5b9a\u7fa9 Velbus \u9023\u7dda\u985e\u578b" } - }, - "title": "Velbus \u4ecb\u9762" - } + } + }, + "title": "Velbus \u4ecb\u9762" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ca.json b/homeassistant/components/vera/.translations/ca.json index d15d12ce6c3e..9749a468b09a 100644 --- a/homeassistant/components/vera/.translations/ca.json +++ b/homeassistant/components/vera/.translations/ca.json @@ -14,8 +14,7 @@ "description": "Proporciona un URL pel controlador Vera. Hauria de quedar aix\u00ed: http://192.168.1.161:3480.", "title": "Configuraci\u00f3 del controlador Vera" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Opcions del controlador Vera" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/de.json b/homeassistant/components/vera/.translations/de.json index 91f61c9c2bc5..c10e24321e63 100644 --- a/homeassistant/components/vera/.translations/de.json +++ b/homeassistant/components/vera/.translations/de.json @@ -14,8 +14,7 @@ "description": "Stellen Sie unten eine Vera-Controller-Url zur Verf\u00fcgung. Sie sollte wie folgt aussehen: http://192.168.1.161:3480.", "title": "Richten Sie den Vera-Controller ein" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -27,5 +26,6 @@ "title": "Vera Controller Optionen" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/en.json b/homeassistant/components/vera/.translations/en.json index 0578daa4c0bb..898c533f1e0f 100644 --- a/homeassistant/components/vera/.translations/en.json +++ b/homeassistant/components/vera/.translations/en.json @@ -14,8 +14,7 @@ "description": "Provide a Vera controller url below. It should look like this: http://192.168.1.161:3480.", "title": "Setup Vera controller" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Vera controller options" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/es.json b/homeassistant/components/vera/.translations/es.json index 672bcc9056e1..347fb5ce5690 100644 --- a/homeassistant/components/vera/.translations/es.json +++ b/homeassistant/components/vera/.translations/es.json @@ -14,8 +14,7 @@ "description": "Introduce una URL para el controlador Vera a continuaci\u00f3n. Ser\u00eda algo como: http://192.168.1.161:3480.", "title": "Configurar el controlador Vera" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Opciones del controlador Vera" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/fr.json b/homeassistant/components/vera/.translations/fr.json index d24bf97393ec..24c7829a14c2 100644 --- a/homeassistant/components/vera/.translations/fr.json +++ b/homeassistant/components/vera/.translations/fr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Vera" - } + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ko.json b/homeassistant/components/vera/.translations/ko.json index cecde6b9183f..4ebd3f804a21 100644 --- a/homeassistant/components/vera/.translations/ko.json +++ b/homeassistant/components/vera/.translations/ko.json @@ -14,8 +14,7 @@ "description": "\uc544\ub798\uc5d0 Vera \ucee8\ud2b8\ub864\ub7ec URL \uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694. http://192.168.1.161:3480 \uacfc \uac19\uc740 \ud615\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.", "title": "Vera \ucee8\ud2b8\ub864\ub7ec \uc124\uc815" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Vera \ucee8\ud2b8\ub864\ub7ec \uc635\uc158" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/lb.json b/homeassistant/components/vera/.translations/lb.json index 440c576596f1..c3c769ef7b4b 100644 --- a/homeassistant/components/vera/.translations/lb.json +++ b/homeassistant/components/vera/.translations/lb.json @@ -14,8 +14,7 @@ "description": "Vera Kontroller URL uginn: D\u00e9i sollt sou ausgesinn:\nhttp://192.168.1.161:3480.", "title": "Vera Kontroller ariichten" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Vera Kontroller Optiounen" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ru.json b/homeassistant/components/vera/.translations/ru.json index de374358e848..6dece462ef08 100644 --- a/homeassistant/components/vera/.translations/ru.json +++ b/homeassistant/components/vera/.translations/ru.json @@ -14,8 +14,7 @@ "description": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Vera. \u0410\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 'http://192.168.1.161:3480'.", "title": "Vera" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Vera" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/zh-Hant.json b/homeassistant/components/vera/.translations/zh-Hant.json index 6fb71a57abed..521b3fb9eba7 100644 --- a/homeassistant/components/vera/.translations/zh-Hant.json +++ b/homeassistant/components/vera/.translations/zh-Hant.json @@ -14,8 +14,7 @@ "description": "\u65bc\u4e0b\u65b9\u63d0\u4f9b Vera \u63a7\u5236\u5668 URL\u3002\u683c\u5f0f\u61c9\u8a72\u70ba\uff1ahttp://192.168.1.161:3480\u3002", "title": "\u8a2d\u5b9a Vera \u63a7\u5236\u5668" } - }, - "title": "Vera" + } }, "options": { "step": { @@ -28,5 +27,6 @@ "title": "Vera \u63a7\u5236\u5668\u9078\u9805" } } - } + }, + "title": "Vera" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/bg.json b/homeassistant/components/vesync/.translations/bg.json index a12436936e69..95cc2f4406a9 100644 --- a/homeassistant/components/vesync/.translations/bg.json +++ b/homeassistant/components/vesync/.translations/bg.json @@ -14,7 +14,7 @@ }, "title": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u0430" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ca.json b/homeassistant/components/vesync/.translations/ca.json index 0c253fd4812c..96f991c0560f 100644 --- a/homeassistant/components/vesync/.translations/ca.json +++ b/homeassistant/components/vesync/.translations/ca.json @@ -14,7 +14,7 @@ }, "title": "Introdueix el nom d\u2019usuari i contrasenya" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/da.json b/homeassistant/components/vesync/.translations/da.json index f2be5792f33c..69f8b7452904 100644 --- a/homeassistant/components/vesync/.translations/da.json +++ b/homeassistant/components/vesync/.translations/da.json @@ -14,7 +14,7 @@ }, "title": "Indtast brugernavn og adgangskode" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/de.json b/homeassistant/components/vesync/.translations/de.json index 44b3ea86c550..357309448110 100644 --- a/homeassistant/components/vesync/.translations/de.json +++ b/homeassistant/components/vesync/.translations/de.json @@ -14,7 +14,7 @@ }, "title": "Benutzername und Passwort eingeben" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/en.json b/homeassistant/components/vesync/.translations/en.json index cd8b3e59cbf9..664721c2fd33 100644 --- a/homeassistant/components/vesync/.translations/en.json +++ b/homeassistant/components/vesync/.translations/en.json @@ -14,7 +14,7 @@ }, "title": "Enter Username and Password" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/es-419.json b/homeassistant/components/vesync/.translations/es-419.json index 58c62fb64b60..2ed046a81539 100644 --- a/homeassistant/components/vesync/.translations/es-419.json +++ b/homeassistant/components/vesync/.translations/es-419.json @@ -14,7 +14,7 @@ }, "title": "Ingrese nombre de usuario y contrase\u00f1a" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/es.json b/homeassistant/components/vesync/.translations/es.json index 856dc77a52c4..a11d7b0a12a4 100644 --- a/homeassistant/components/vesync/.translations/es.json +++ b/homeassistant/components/vesync/.translations/es.json @@ -14,7 +14,7 @@ }, "title": "Introduzca el nombre de usuario y la contrase\u00f1a" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/fr.json b/homeassistant/components/vesync/.translations/fr.json index 4928ea4f0be5..4382525752f3 100644 --- a/homeassistant/components/vesync/.translations/fr.json +++ b/homeassistant/components/vesync/.translations/fr.json @@ -14,7 +14,7 @@ }, "title": "Entrez vos identifiants" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/it.json b/homeassistant/components/vesync/.translations/it.json index d3e53547559a..1d59a36e6a4a 100644 --- a/homeassistant/components/vesync/.translations/it.json +++ b/homeassistant/components/vesync/.translations/it.json @@ -14,7 +14,7 @@ }, "title": "Immettere nome utente e password" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ko.json b/homeassistant/components/vesync/.translations/ko.json index ca43b90acc96..2d6cbb52020c 100644 --- a/homeassistant/components/vesync/.translations/ko.json +++ b/homeassistant/components/vesync/.translations/ko.json @@ -14,7 +14,7 @@ }, "title": "\uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/lb.json b/homeassistant/components/vesync/.translations/lb.json index 0825bd0805d6..7fb25b588535 100644 --- a/homeassistant/components/vesync/.translations/lb.json +++ b/homeassistant/components/vesync/.translations/lb.json @@ -14,7 +14,7 @@ }, "title": "Benotzernumm a Passwuert aginn" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/nl.json b/homeassistant/components/vesync/.translations/nl.json index d19d528c61a3..c47e27f22c7d 100644 --- a/homeassistant/components/vesync/.translations/nl.json +++ b/homeassistant/components/vesync/.translations/nl.json @@ -14,7 +14,7 @@ }, "title": "Voer gebruikersnaam en wachtwoord in" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/nn.json b/homeassistant/components/vesync/.translations/nn.json index 372e37133b12..3c1ca41456da 100644 --- a/homeassistant/components/vesync/.translations/nn.json +++ b/homeassistant/components/vesync/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "VeSync" - } + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/no.json b/homeassistant/components/vesync/.translations/no.json index be5f27b7a0f0..f97fee03c5a2 100644 --- a/homeassistant/components/vesync/.translations/no.json +++ b/homeassistant/components/vesync/.translations/no.json @@ -14,7 +14,7 @@ }, "title": "Skriv inn brukernavn og passord" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/pl.json b/homeassistant/components/vesync/.translations/pl.json index d6584f11d290..62c280748084 100644 --- a/homeassistant/components/vesync/.translations/pl.json +++ b/homeassistant/components/vesync/.translations/pl.json @@ -14,7 +14,7 @@ }, "title": "Wprowad\u017a nazw\u0119 u\u017cytkownika i has\u0142o." } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ru.json b/homeassistant/components/vesync/.translations/ru.json index 23cb6fdfac7b..47fb6fc50452 100644 --- a/homeassistant/components/vesync/.translations/ru.json +++ b/homeassistant/components/vesync/.translations/ru.json @@ -14,7 +14,7 @@ }, "title": "VeSync" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/sl.json b/homeassistant/components/vesync/.translations/sl.json index 636237dcfc19..02307dd7e505 100644 --- a/homeassistant/components/vesync/.translations/sl.json +++ b/homeassistant/components/vesync/.translations/sl.json @@ -14,7 +14,7 @@ }, "title": "Vnesite uporabni\u0161ko Ime in Geslo" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/sv.json b/homeassistant/components/vesync/.translations/sv.json index a477ca6e5da0..64f413a78b08 100644 --- a/homeassistant/components/vesync/.translations/sv.json +++ b/homeassistant/components/vesync/.translations/sv.json @@ -14,7 +14,7 @@ }, "title": "Ange anv\u00e4ndarnamn och l\u00f6senord" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/zh-Hant.json b/homeassistant/components/vesync/.translations/zh-Hant.json index 05e4a1bbc797..72b340ec88e6 100644 --- a/homeassistant/components/vesync/.translations/zh-Hant.json +++ b/homeassistant/components/vesync/.translations/zh-Hant.json @@ -14,7 +14,7 @@ }, "title": "\u8acb\u8f38\u5165\u4f7f\u7528\u8005\u540d\u7a31\u8207\u5bc6\u78bc" } - }, - "title": "VeSync" - } + } + }, + "title": "VeSync" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ca.json b/homeassistant/components/vilfo/.translations/ca.json index 07d9ddafb515..522a2db1a929 100644 --- a/homeassistant/components/vilfo/.translations/ca.json +++ b/homeassistant/components/vilfo/.translations/ca.json @@ -17,7 +17,7 @@ "description": "Configura la integraci\u00f3 de l'encaminador Vilfo. Necessites la seva IP o nom d'amfitri\u00f3 i el testimoni d'acc\u00e9s de l'API (token). Per a m\u00e9s informaci\u00f3, visita: https://www.home-assistant.io/integrations/vilfo", "title": "Connexi\u00f3 amb l'encaminador Vilfo" } - }, - "title": "Encaminador Vilfo" - } + } + }, + "title": "Encaminador Vilfo" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/da.json b/homeassistant/components/vilfo/.translations/da.json index f233b4cb7b9b..2ff2ad7f97cd 100644 --- a/homeassistant/components/vilfo/.translations/da.json +++ b/homeassistant/components/vilfo/.translations/da.json @@ -17,7 +17,7 @@ "description": "Indstil Vilfo-routerintegration. Du har brug for dit Vilfo-routerv\u00e6rtsnavn/IP og et API-adgangstoken. For yderligere information om denne integration og hvordan du f\u00e5r disse detaljer, kan du bes\u00f8ge: https://www.home-assistant.io/integrations/vilfo", "title": "Opret forbindelse til Vilfo-router" } - }, - "title": "Vilfo-router" - } + } + }, + "title": "Vilfo-router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/de.json b/homeassistant/components/vilfo/.translations/de.json index fed2265def25..b36990d9a534 100644 --- a/homeassistant/components/vilfo/.translations/de.json +++ b/homeassistant/components/vilfo/.translations/de.json @@ -17,7 +17,7 @@ "description": "Richten Sie die Vilfo Router-Integration ein. Sie ben\u00f6tigen Ihren Vilfo Router-Hostnamen / Ihre IP-Adresse und ein API-Zugriffstoken. Weitere Informationen zu dieser Integration und wie Sie diese Details erhalten, finden Sie unter: https://www.home-assistant.io/integrations/vilfo", "title": "Stellen Sie eine Verbindung zum Vilfo Router her" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/en.json b/homeassistant/components/vilfo/.translations/en.json index e6b9817f5a83..1941c399b78e 100644 --- a/homeassistant/components/vilfo/.translations/en.json +++ b/homeassistant/components/vilfo/.translations/en.json @@ -17,7 +17,7 @@ "description": "Set up the Vilfo Router integration. You need your Vilfo Router hostname/IP and an API access token. For additional information on this integration and how to get those details, visit: https://www.home-assistant.io/integrations/vilfo", "title": "Connect to the Vilfo Router" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/es.json b/homeassistant/components/vilfo/.translations/es.json index a9d8b8c8990c..f555647e8a99 100644 --- a/homeassistant/components/vilfo/.translations/es.json +++ b/homeassistant/components/vilfo/.translations/es.json @@ -17,7 +17,7 @@ "description": "Configure la integraci\u00f3n del Router Vilfo. Necesita su nombre de host/IP del Router Vilfo y un token de acceso a la API. Para obtener informaci\u00f3n adicional sobre esta integraci\u00f3n y c\u00f3mo obtener esos detalles, visite: https://www.home-assistant.io/integrations/vilfo", "title": "Conectar con el Router Vilfo" } - }, - "title": "Router Vilfo" - } + } + }, + "title": "Router Vilfo" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/fr.json b/homeassistant/components/vilfo/.translations/fr.json index 64e48adc5734..3c6643bf0e03 100644 --- a/homeassistant/components/vilfo/.translations/fr.json +++ b/homeassistant/components/vilfo/.translations/fr.json @@ -4,7 +4,7 @@ "user": { "title": "Connectez-vous au routeur Vilfo" } - }, - "title": "Routeur Vilfo" - } + } + }, + "title": "Routeur Vilfo" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/hu.json b/homeassistant/components/vilfo/.translations/hu.json index 5ae11707c192..d7d9b1695dcf 100644 --- a/homeassistant/components/vilfo/.translations/hu.json +++ b/homeassistant/components/vilfo/.translations/hu.json @@ -7,7 +7,7 @@ }, "title": "Csatlakoz\u00e1s a Vilfo routerhez" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/it.json b/homeassistant/components/vilfo/.translations/it.json index 5523dcc0c098..2ea2434ac85c 100644 --- a/homeassistant/components/vilfo/.translations/it.json +++ b/homeassistant/components/vilfo/.translations/it.json @@ -17,7 +17,7 @@ "description": "Configurare l'integrazione del Vilfo Router. \u00c8 necessario il vostro hostname/IP del Vilfo Router e un token di accesso API. Per ulteriori informazioni su questa integrazione e su come ottenere tali dettagli, visitare il sito: https://www.home-assistant.io/integrations/vilfo", "title": "Collegamento al Vilfo Router" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ko.json b/homeassistant/components/vilfo/.translations/ko.json index 85cb147ff6c8..c5b66f873936 100644 --- a/homeassistant/components/vilfo/.translations/ko.json +++ b/homeassistant/components/vilfo/.translations/ko.json @@ -17,7 +17,7 @@ "description": "Vilfo \ub77c\uc6b0\ud130 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4. Vilfo \ub77c\uc6b0\ud130 \ud638\uc2a4\ud2b8 \uc774\ub984 / IP \uc640 API \uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\uc5d0 \ub300\ud55c \ucd94\uac00 \uc815\ubcf4\uc640 \uc138\ubd80 \uc0ac\ud56d\uc740 https://www.home-assistant.io/integrations/vilfo \ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694", "title": "Vilfo \ub77c\uc6b0\ud130\uc5d0 \uc5f0\uacb0\ud558\uae30" } - }, - "title": "Vilfo \ub77c\uc6b0\ud130" - } + } + }, + "title": "Vilfo \ub77c\uc6b0\ud130" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/lb.json b/homeassistant/components/vilfo/.translations/lb.json index 7b88bd31d173..a02cd1362aa7 100644 --- a/homeassistant/components/vilfo/.translations/lb.json +++ b/homeassistant/components/vilfo/.translations/lb.json @@ -17,7 +17,7 @@ "description": "Vilfo Router Integratioun ariichten. Dir braucht \u00e4re Vilfo Router Numm/IP an een API Acc\u00e8s Jeton. Fir weider Informatiounen zu d\u00ebser Integratioun a w\u00e9i een zu d\u00ebsen n\u00e9idegen Informatioune k\u00ebnnt, gitt op: https://www.home-assistant.io/integrations/vilfo", "title": "Mam Vilfo Router verbannen" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/nl.json b/homeassistant/components/vilfo/.translations/nl.json index db2691d3eebd..c7c30ca0fd1d 100644 --- a/homeassistant/components/vilfo/.translations/nl.json +++ b/homeassistant/components/vilfo/.translations/nl.json @@ -15,7 +15,7 @@ }, "title": "Maak verbinding met de Vilfo Router" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/no.json b/homeassistant/components/vilfo/.translations/no.json index 61b9c56f4962..840098abd695 100644 --- a/homeassistant/components/vilfo/.translations/no.json +++ b/homeassistant/components/vilfo/.translations/no.json @@ -17,7 +17,7 @@ "description": "Konfigurer Vilfo Router-integreringen. Du trenger ditt Vilfo Router vertsnavn/IP og et API-tilgangstoken. Hvis du vil ha mer informasjon om denne integreringen og hvordan du f\u00e5r disse detaljene, kan du g\u00e5 til: https://www.home-assistant.io/integrations/vilfo", "title": "Koble til Vilfo Ruteren" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/pl.json b/homeassistant/components/vilfo/.translations/pl.json index e9cd91209a47..6868f1f79036 100644 --- a/homeassistant/components/vilfo/.translations/pl.json +++ b/homeassistant/components/vilfo/.translations/pl.json @@ -17,7 +17,7 @@ "description": "Skonfiguruj integracj\u0119 routera Vilfo. Potrzebujesz nazwy hosta/adresu IP routera Vilfo i tokena dost\u0119pu do interfejsu API. Aby uzyska\u0107 dodatkowe informacje na temat tej integracji i sposobu uzyskania niezb\u0119dnych danych do konfiguracji, odwied\u017a: https://www.home-assistant.io/integrations/vilfo", "title": "Po\u0142\u0105czenie z routerem Vilfo" } - }, - "title": "Router Vilfo" - } + } + }, + "title": "Router Vilfo" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ru.json b/homeassistant/components/vilfo/.translations/ru.json index ce8f325e0ead..1863076baf5d 100644 --- a/homeassistant/components/vilfo/.translations/ru.json +++ b/homeassistant/components/vilfo/.translations/ru.json @@ -17,7 +17,7 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 Vilfo. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0438 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 API. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u044d\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442: https://www.home-assistant.io/integrations/vilfo.", "title": "Vilfo Router" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/sl.json b/homeassistant/components/vilfo/.translations/sl.json index a7d683e793cf..84ccb05ece6e 100644 --- a/homeassistant/components/vilfo/.translations/sl.json +++ b/homeassistant/components/vilfo/.translations/sl.json @@ -17,7 +17,7 @@ "description": "Nastavite integracijo Vilfo Router. Potrebujete ime gostitelja ali IP Vilfo usmerjevalnika in dostopni \u017eeton API. Za dodatne informacije o tej integraciji in kako do teh podrobnosti obi\u0161\u010dite: https://www.home-assistant.io/integrations/vilfo", "title": "Pove\u017eite se z usmerjevalnikom Vilfo" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/sv.json b/homeassistant/components/vilfo/.translations/sv.json index 69edce6b9d8b..5e2b3a1f6e5d 100644 --- a/homeassistant/components/vilfo/.translations/sv.json +++ b/homeassistant/components/vilfo/.translations/sv.json @@ -17,7 +17,7 @@ "description": "St\u00e4ll in Vilfo Router-integrationen. Du beh\u00f6ver din Vilfo-routers v\u00e4rdnamn eller IP-adress och en \u00e5tkomstnyckel till dess API. F\u00f6r ytterligare information om den h\u00e4r integrationen och hur du f\u00e5r fram den n\u00f6dv\u00e4ndiga informationen, bes\u00f6k: https://www.home-assistant.io/integrations/vilfo", "title": "Anslut till Vilfo-routern" } - }, - "title": "Vilfo Router" - } + } + }, + "title": "Vilfo Router" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/zh-Hans.json b/homeassistant/components/vilfo/.translations/zh-Hans.json index 788f85b9382a..7ad772ae8952 100644 --- a/homeassistant/components/vilfo/.translations/zh-Hans.json +++ b/homeassistant/components/vilfo/.translations/zh-Hans.json @@ -13,7 +13,7 @@ "description": "\u8bbe\u7f6e Vilfo \u8def\u7531\u5668\u6574\u5408\u3002\u60a8\u9700\u8981\u8f93\u5165 Vilfo \u8def\u7531\u5668\u4e3b\u673a\u540d/IP \u5730\u5740\u3001API\u5b58\u53d6\u5bc6\u94a5\u3002\u5176\u4ed6\u6574\u5408\u7684\u76f8\u5173\u4fe1\u606f\uff0c\u8bf7\u8bbf\u95ee\uff1ahttps://www.home-assistant.io/integrations/vilfo", "title": "\u8fde\u63a5\u5230 Vilfo \u8def\u7531\u5668" } - }, - "title": "Vilfo \u8def\u7531\u5668" - } + } + }, + "title": "Vilfo \u8def\u7531\u5668" } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/zh-Hant.json b/homeassistant/components/vilfo/.translations/zh-Hant.json index 7553cc683cd3..bdc14bb4f96f 100644 --- a/homeassistant/components/vilfo/.translations/zh-Hant.json +++ b/homeassistant/components/vilfo/.translations/zh-Hant.json @@ -17,7 +17,7 @@ "description": "\u8a2d\u5b9a Vilfo \u8def\u7531\u5668\u6574\u5408\u3002\u9700\u8981\u8f38\u5165 Vilfo \u8def\u7531\u5668\u4e3b\u6a5f\u540d\u7a31/IP \u4f4d\u5740\u3001API \u5b58\u53d6\u5bc6\u9470\u3002\u5176\u4ed6\u6574\u5408\u76f8\u95dc\u8cc7\u8a0a\uff0c\u8acb\u53c3\u8003\uff1ahttps://www.home-assistant.io/integrations/vilfo", "title": "\u9023\u7dda\u81f3 Vilfo \u8def\u7531\u5668" } - }, - "title": "Vilfo \u8def\u7531\u5668" - } + } + }, + "title": "Vilfo \u8def\u7531\u5668" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ca.json b/homeassistant/components/vizio/.translations/ca.json index 6b9a3a89134b..fc103b734216 100644 --- a/homeassistant/components/vizio/.translations/ca.json +++ b/homeassistant/components/vizio/.translations/ca.json @@ -36,8 +36,7 @@ "description": "Nom\u00e9s es necessita testimoni d'acc\u00e9s per als televisors. Si est\u00e0s configurant un televisor i encara no tens un testimoni d'acc\u00e9s, deixeu-ho en blanc per poder fer el proc\u00e9s d'emparellament.", "title": "Configuraci\u00f3 del client de Vizio SmartCast" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Actualitzaci\u00f3 de les opcions de Vizo SmartCast" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/da.json b/homeassistant/components/vizio/.translations/da.json index 5317c1c2adb7..83e5c363f4ec 100644 --- a/homeassistant/components/vizio/.translations/da.json +++ b/homeassistant/components/vizio/.translations/da.json @@ -19,8 +19,7 @@ }, "title": "Ops\u00e6t Vizio SmartCast-enhed" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -32,5 +31,6 @@ } }, "title": "Opdater Vizo SmartCast-indstillinger" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/de.json b/homeassistant/components/vizio/.translations/de.json index e2d391da0c29..97cddfb44ba8 100644 --- a/homeassistant/components/vizio/.translations/de.json +++ b/homeassistant/components/vizio/.translations/de.json @@ -36,8 +36,7 @@ "description": "Ein Zugriffstoken wird nur f\u00fcr Fernsehger\u00e4te ben\u00f6tigt. Wenn Sie ein Fernsehger\u00e4t konfigurieren und noch kein Zugriffstoken haben, lassen Sie es leer, um einen Pairing-Vorgang durchzuf\u00fchren.", "title": "Richten Sie das VIZIO SmartCast-Ger\u00e4t ein" } - }, - "title": "VIZIO SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Aktualisieren Sie die VIZIO SmartCast-Optionen" - } + }, + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/en.json b/homeassistant/components/vizio/.translations/en.json index a4918978ba7a..7e8ab7057051 100644 --- a/homeassistant/components/vizio/.translations/en.json +++ b/homeassistant/components/vizio/.translations/en.json @@ -36,8 +36,7 @@ "description": "An Access Token is only needed for TVs. If you are configuring a TV and do not have an Access Token yet, leave it blank to go through a pairing process.", "title": "Setup VIZIO SmartCast Device" } - }, - "title": "VIZIO SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Update VIZIO SmartCast Options" - } + }, + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/es.json b/homeassistant/components/vizio/.translations/es.json index eb35fbb0b5b7..44c732e49486 100644 --- a/homeassistant/components/vizio/.translations/es.json +++ b/homeassistant/components/vizio/.translations/es.json @@ -36,8 +36,7 @@ "description": "Todos los campos son obligatorios excepto el Token de Acceso. Si decides no proporcionar un Token de Acceso y tu Tipo de Dispositivo es \"tv\", se te llevar\u00e1 por un proceso de emparejamiento con tu dispositivo para que se pueda recuperar un Token de Acceso.\n\nPara pasar por el proceso de emparejamiento, antes de pulsar en Enviar, aseg\u00farese de que tu TV est\u00e9 encendida y conectada a la red. Tambi\u00e9n es necesario poder ver la pantalla.", "title": "Configurar el cliente de Vizio SmartCast" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Actualizar las opciones de SmartCast de Vizo" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/fr.json b/homeassistant/components/vizio/.translations/fr.json index 0c0ff56af69f..81e38391a19f 100644 --- a/homeassistant/components/vizio/.translations/fr.json +++ b/homeassistant/components/vizio/.translations/fr.json @@ -34,8 +34,7 @@ "description": "Un jeton d'acc\u00e8s n'est n\u00e9cessaire que pour les t\u00e9l\u00e9viseurs. Si vous configurez un t\u00e9l\u00e9viseur et que vous n'avez pas encore de jeton d'acc\u00e8s, laissez-le vide pour passer par un processus de couplage.", "title": "Configurer le client Vizio SmartCast" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -50,5 +49,6 @@ } }, "title": "Mettre \u00e0 jour les options de Vizo SmartCast" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/hu.json b/homeassistant/components/vizio/.translations/hu.json index c8b74f33e3d2..e47abb0d57cb 100644 --- a/homeassistant/components/vizio/.translations/hu.json +++ b/homeassistant/components/vizio/.translations/hu.json @@ -18,8 +18,7 @@ }, "title": "A Vizio SmartCast Client be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -31,5 +30,6 @@ } }, "title": "Friss\u00edtse a Vizo SmartCast be\u00e1ll\u00edt\u00e1sokat" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/it.json b/homeassistant/components/vizio/.translations/it.json index 4a26a40ad56a..1786fad932a9 100644 --- a/homeassistant/components/vizio/.translations/it.json +++ b/homeassistant/components/vizio/.translations/it.json @@ -36,8 +36,7 @@ "description": "Un Token di Accesso \u00e8 necessario solo per i televisori. Se si sta configurando un televisore e non si dispone ancora di un Token di Accesso, lasciarlo vuoto per passare attraverso un processo di associazione.", "title": "Configurazione del dispositivo SmartCast Vizio" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Aggiornamento delle opzioni di Vizo SmartCast" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ko.json b/homeassistant/components/vizio/.translations/ko.json index df2fb243f886..48c91c86a1e1 100644 --- a/homeassistant/components/vizio/.translations/ko.json +++ b/homeassistant/components/vizio/.translations/ko.json @@ -36,8 +36,7 @@ "description": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc740 TV \uc5d0\ub9cc \ud544\uc694\ud569\ub2c8\ub2e4. TV \ub97c \uad6c\uc131\ud558\uace0 \uc788\uace0 \uc544\uc9c1 \uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \uc5c6\ub294 \uacbd\uc6b0 \ud398\uc5b4\ub9c1 \uacfc\uc815\uc744 \uc9c4\ud589\ud558\ub824\uba74 \ube44\uc6cc\ub450\uc138\uc694.", "title": "Vizio SmartCast \uae30\uae30 \uc124\uc815" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Vizo SmartCast \uc635\uc158 \uc5c5\ub370\uc774\ud2b8" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/lb.json b/homeassistant/components/vizio/.translations/lb.json index 3146c8756a8a..6301e8f18627 100644 --- a/homeassistant/components/vizio/.translations/lb.json +++ b/homeassistant/components/vizio/.translations/lb.json @@ -36,8 +36,7 @@ "description": "Een Access Jeton g\u00ebtt nn\u00ebmme fir Fernseher gebraucht. Wann Dir e Fernseh konfigur\u00e9iert a keen Access Jeton hutt, da loosst et eidel fir duerch dee Pairing Prozess ze goen.", "title": "Vizo Smartcast Apparat ariichten" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Vizo Smartcast Optiounen aktualis\u00e9ieren" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/nl.json b/homeassistant/components/vizio/.translations/nl.json index 797836e01456..c16c99a455e0 100644 --- a/homeassistant/components/vizio/.translations/nl.json +++ b/homeassistant/components/vizio/.translations/nl.json @@ -19,8 +19,7 @@ }, "title": "Vizio SmartCast Client instellen" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -32,5 +31,6 @@ } }, "title": "Update Vizo SmartCast Opties" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/no.json b/homeassistant/components/vizio/.translations/no.json index 65e96945e466..0f79faa0e1cd 100644 --- a/homeassistant/components/vizio/.translations/no.json +++ b/homeassistant/components/vizio/.translations/no.json @@ -19,11 +19,11 @@ "title": "Fullf\u00f8r Sammenkoblings Prosessen" }, "pairing_complete": { - "description": "Din Vizio SmartCast-enheten er n\u00e5 koblet til Home Assistant.", + "description": "Din VIZIO SmartCast enheten er n\u00e5 koblet til Hjemme-Assistent.", "title": "Sammenkoblingen Er Fullf\u00f8rt" }, "pairing_complete_import": { - "description": "Din Vizio SmartCast TV er n\u00e5 koblet til Home Assistant.\n\nTilgangstokenet er **{access_token}**.", + "description": "VIZIO SmartCast TV er n\u00e5 koblet til Hjemmeassistent.\n\nTilgangstokenet er **{access_token}**.", "title": "Sammenkoblingen Er Fullf\u00f8rt" }, "user": { @@ -34,10 +34,9 @@ "name": "Navn" }, "description": "En tilgangstoken er bare n\u00f8dvendig for TV-er. Hvis du konfigurerer en TV og ikke har tilgangstoken enn\u00e5, m\u00e5 du la den st\u00e5 tom for \u00e5 g\u00e5 gjennom en sammenkoblingsprosess.", - "title": "Sett opp Vizio SmartCast-enhet" + "title": "Konfigurer VIZIO SmartCast-enhet" } - }, - "title": "" + } }, "options": { "step": { @@ -48,9 +47,10 @@ "volume_step": "St\u00f8rrelse p\u00e5 volum trinn" }, "description": "Hvis du har en Smart-TV, kan du eventuelt filtrere kildelisten ved \u00e5 velge hvilke apper som skal inkluderes eller utelates i kildelisten.", - "title": "Oppdater Vizo SmartCast alternativer" + "title": "Oppdater VIZIO SmartCast-alternativer" } }, - "title": "Oppdater Vizo SmartCast alternativer" - } + "title": "Oppdater VIZIO SmartCast-alternativer" + }, + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/pl.json b/homeassistant/components/vizio/.translations/pl.json index 2537279d998d..ebd99d088269 100644 --- a/homeassistant/components/vizio/.translations/pl.json +++ b/homeassistant/components/vizio/.translations/pl.json @@ -30,8 +30,7 @@ }, "title": "Konfiguracja klienta Vizio SmartCast" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -46,5 +45,6 @@ } }, "title": "Aktualizuj opcje Vizo SmartCast" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ru.json b/homeassistant/components/vizio/.translations/ru.json index ff729735d726..5dcf65435a1f 100644 --- a/homeassistant/components/vizio/.translations/ru.json +++ b/homeassistant/components/vizio/.translations/ru.json @@ -36,8 +36,7 @@ "description": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0412\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0438 \u0443 \u0412\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f.", "title": "VIZIO SmartCast" } - }, - "title": "VIZIO SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 VIZIO SmartCast" - } + }, + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/sl.json b/homeassistant/components/vizio/.translations/sl.json index ed325acd868a..bf38cdb24e0d 100644 --- a/homeassistant/components/vizio/.translations/sl.json +++ b/homeassistant/components/vizio/.translations/sl.json @@ -36,8 +36,7 @@ "description": "Dostopni \u017eeton je potreben samo za televizorje. \u010ce konfigurirate televizor in \u0161e nimate \u017eetona za dostop, ga pustite prazno in boste \u0161li, da bo \u0161el skozi postopek seznanjanja.", "title": "Namestite Vizio SmartCast napravo" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "Posodobite mo\u017enosti Vizo SmartCast" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/sv.json b/homeassistant/components/vizio/.translations/sv.json index bafd7d1bd2fb..a435fc1fc60b 100644 --- a/homeassistant/components/vizio/.translations/sv.json +++ b/homeassistant/components/vizio/.translations/sv.json @@ -19,8 +19,7 @@ }, "title": "St\u00e4ll in Vizio SmartCast-klient" } - }, - "title": "Vizio SmartCast" + } }, "options": { "step": { @@ -32,5 +31,6 @@ } }, "title": "Uppdatera Vizo SmartCast-alternativ" - } + }, + "title": "Vizio SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/zh-Hant.json b/homeassistant/components/vizio/.translations/zh-Hant.json index d5b6986e9dba..ed40c4105d7d 100644 --- a/homeassistant/components/vizio/.translations/zh-Hant.json +++ b/homeassistant/components/vizio/.translations/zh-Hant.json @@ -36,8 +36,7 @@ "description": "\u6b64\u96fb\u8996\u50c5\u9700\u5b58\u53d6\u5bc6\u9470\u3002\u5047\u5982\u60a8\u6b63\u5728\u8a2d\u5b9a\u96fb\u8996\u3001\u5c1a\u672a\u53d6\u5f97\u5bc6\u9470\uff0c\u4fdd\u6301\u7a7a\u767d\u4ee5\u9032\u884c\u914d\u5c0d\u904e\u7a0b\u3002", "title": "\u8a2d\u5b9a VIZIO SmartCast \u8a2d\u5099" } - }, - "title": "VIZIO SmartCast" + } }, "options": { "step": { @@ -52,5 +51,6 @@ } }, "title": "\u66f4\u65b0 VIZIO SmartCast \u9078\u9805" - } + }, + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/bg.json b/homeassistant/components/wemo/.translations/bg.json index fe52c21e5f62..0c853a79a3f5 100644 --- a/homeassistant/components/wemo/.translations/bg.json +++ b/homeassistant/components/wemo/.translations/bg.json @@ -9,7 +9,7 @@ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ca.json b/homeassistant/components/wemo/.translations/ca.json index 62db7fa3eb83..f27fc576dcdc 100644 --- a/homeassistant/components/wemo/.translations/ca.json +++ b/homeassistant/components/wemo/.translations/ca.json @@ -9,7 +9,7 @@ "description": "Vols configurar Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/da.json b/homeassistant/components/wemo/.translations/da.json index 1da4d4078495..72b322178c3b 100644 --- a/homeassistant/components/wemo/.translations/da.json +++ b/homeassistant/components/wemo/.translations/da.json @@ -9,7 +9,7 @@ "description": "Vil du konfigurere Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/de.json b/homeassistant/components/wemo/.translations/de.json index 8af563b6dbb5..b9c4d698da4c 100644 --- a/homeassistant/components/wemo/.translations/de.json +++ b/homeassistant/components/wemo/.translations/de.json @@ -9,7 +9,7 @@ "description": "M\u00f6chtest du Wemo einrichten?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/en.json b/homeassistant/components/wemo/.translations/en.json index a3751b7f5d63..fa785558c663 100644 --- a/homeassistant/components/wemo/.translations/en.json +++ b/homeassistant/components/wemo/.translations/en.json @@ -9,7 +9,7 @@ "description": "Do you want to set up Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/es-419.json b/homeassistant/components/wemo/.translations/es-419.json index df390e73dd10..196d1833bab8 100644 --- a/homeassistant/components/wemo/.translations/es-419.json +++ b/homeassistant/components/wemo/.translations/es-419.json @@ -9,7 +9,7 @@ "description": "\u00bfDesea configurar Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/es.json b/homeassistant/components/wemo/.translations/es.json index e5363a459e30..5f4664dae9a4 100644 --- a/homeassistant/components/wemo/.translations/es.json +++ b/homeassistant/components/wemo/.translations/es.json @@ -9,7 +9,7 @@ "description": "\u00bfQuieres configurar Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/fr.json b/homeassistant/components/wemo/.translations/fr.json index 08b55e2366ad..444d4b93c15e 100644 --- a/homeassistant/components/wemo/.translations/fr.json +++ b/homeassistant/components/wemo/.translations/fr.json @@ -9,7 +9,7 @@ "description": "Voulez-vous configurer Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/hr.json b/homeassistant/components/wemo/.translations/hr.json index 389bfbd3cb1d..36e06157eb70 100644 --- a/homeassistant/components/wemo/.translations/hr.json +++ b/homeassistant/components/wemo/.translations/hr.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Wemo" - } + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/it.json b/homeassistant/components/wemo/.translations/it.json index dcfa1954db35..0974a312f9cd 100644 --- a/homeassistant/components/wemo/.translations/it.json +++ b/homeassistant/components/wemo/.translations/it.json @@ -9,7 +9,7 @@ "description": "Vuoi configurare Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ko.json b/homeassistant/components/wemo/.translations/ko.json index cc3a70a0bc60..ece4f091b0d7 100644 --- a/homeassistant/components/wemo/.translations/ko.json +++ b/homeassistant/components/wemo/.translations/ko.json @@ -9,7 +9,7 @@ "description": "Wemo \ub97c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/lb.json b/homeassistant/components/wemo/.translations/lb.json index cf8a52cef2d4..cc2cce56d0b5 100644 --- a/homeassistant/components/wemo/.translations/lb.json +++ b/homeassistant/components/wemo/.translations/lb.json @@ -9,7 +9,7 @@ "description": "Soll Wemo konfigur\u00e9iert ginn?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/nl.json b/homeassistant/components/wemo/.translations/nl.json index 65fc3865bdd5..86e0418be342 100644 --- a/homeassistant/components/wemo/.translations/nl.json +++ b/homeassistant/components/wemo/.translations/nl.json @@ -9,7 +9,7 @@ "description": "Wilt u Wemo instellen?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/nn.json b/homeassistant/components/wemo/.translations/nn.json index c1c8830cb256..e9bdca8ffe88 100644 --- a/homeassistant/components/wemo/.translations/nn.json +++ b/homeassistant/components/wemo/.translations/nn.json @@ -4,7 +4,7 @@ "confirm": { "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/no.json b/homeassistant/components/wemo/.translations/no.json index 25a4172f00c0..9e6edf3b8ab5 100644 --- a/homeassistant/components/wemo/.translations/no.json +++ b/homeassistant/components/wemo/.translations/no.json @@ -9,7 +9,7 @@ "description": "\u00d8nsker du \u00e5 sette opp Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/pl.json b/homeassistant/components/wemo/.translations/pl.json index a5315967ba4f..18161cb7d995 100644 --- a/homeassistant/components/wemo/.translations/pl.json +++ b/homeassistant/components/wemo/.translations/pl.json @@ -9,7 +9,7 @@ "description": "Czy chcesz skonfigurowa\u0107 Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/pt-BR.json b/homeassistant/components/wemo/.translations/pt-BR.json index b64fab85f78f..0a6c90a15b1a 100644 --- a/homeassistant/components/wemo/.translations/pt-BR.json +++ b/homeassistant/components/wemo/.translations/pt-BR.json @@ -9,7 +9,7 @@ "description": "Voc\u00ea quer configurar o Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ru.json b/homeassistant/components/wemo/.translations/ru.json index c05725109250..d220fa7fb63f 100644 --- a/homeassistant/components/wemo/.translations/ru.json +++ b/homeassistant/components/wemo/.translations/ru.json @@ -9,7 +9,7 @@ "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 Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/sl.json b/homeassistant/components/wemo/.translations/sl.json index 61340d9df452..ccd298e262a1 100644 --- a/homeassistant/components/wemo/.translations/sl.json +++ b/homeassistant/components/wemo/.translations/sl.json @@ -9,7 +9,7 @@ "description": "Ali \u017eelite nastaviti Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/sv.json b/homeassistant/components/wemo/.translations/sv.json index 0773b0079bf6..f39ee5e11eb7 100644 --- a/homeassistant/components/wemo/.translations/sv.json +++ b/homeassistant/components/wemo/.translations/sv.json @@ -9,7 +9,7 @@ "description": "Vill du konfigurera Wemo?", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/zh-Hant.json b/homeassistant/components/wemo/.translations/zh-Hant.json index 4663cf579f8b..a7680b677156 100644 --- a/homeassistant/components/wemo/.translations/zh-Hant.json +++ b/homeassistant/components/wemo/.translations/zh-Hant.json @@ -9,7 +9,7 @@ "description": "\u662f\u5426\u8981\u8a2d\u5b9a Wemo\uff1f", "title": "Wemo" } - }, - "title": "Wemo" - } + } + }, + "title": "Wemo" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/bg.json b/homeassistant/components/withings/.translations/bg.json index 30e384e0bc0b..4994ffddbb6b 100644 --- a/homeassistant/components/withings/.translations/bg.json +++ b/homeassistant/components/withings/.translations/bg.json @@ -11,7 +11,7 @@ "description": "\u041a\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b \u0441\u0442\u0435 \u0438\u0437\u0431\u0440\u0430\u043b\u0438 \u043d\u0430 \u0443\u0435\u0431\u0441\u0430\u0439\u0442\u0430 \u043d\u0430 Withings? \u0412\u0430\u0436\u043d\u043e \u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0442\u0435 \u0434\u0430 \u0441\u044a\u0432\u043f\u0430\u0434\u0430\u0442, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u0435\u043d \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0449\u0435 \u0431\u044a\u0434\u0430\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438.", "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ca.json b/homeassistant/components/withings/.translations/ca.json index 6363ddf19836..7c72068b93cd 100644 --- a/homeassistant/components/withings/.translations/ca.json +++ b/homeassistant/components/withings/.translations/ca.json @@ -18,7 +18,7 @@ "description": "Quin perfil has seleccionat al lloc web de Withings? \u00c9s important que els perfils coincideixin sin\u00f3, les dades no s\u2019etiquetaran correctament.", "title": "Perfil d'usuari." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/da.json b/homeassistant/components/withings/.translations/da.json index 09e73e4ea8e0..57ae3d10fc43 100644 --- a/homeassistant/components/withings/.translations/da.json +++ b/homeassistant/components/withings/.translations/da.json @@ -18,7 +18,7 @@ "description": "Hvilken profil har du valgt p\u00e5 Withings hjemmeside? Det er vigtigt, at profilerne matcher, ellers vil data blive m\u00e6rket forkert.", "title": "Brugerprofil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/de.json b/homeassistant/components/withings/.translations/de.json index 6295d9188486..c214bd3215cd 100644 --- a/homeassistant/components/withings/.translations/de.json +++ b/homeassistant/components/withings/.translations/de.json @@ -18,7 +18,7 @@ "description": "Welches Profil hast du auf der Withings-Website ausgew\u00e4hlt? Es ist wichtig, dass die Profile \u00fcbereinstimmen, da sonst die Daten falsch beschriftet werden.", "title": "Benutzerprofil" } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/en.json b/homeassistant/components/withings/.translations/en.json index eefa54b94908..668927f2805c 100644 --- a/homeassistant/components/withings/.translations/en.json +++ b/homeassistant/components/withings/.translations/en.json @@ -18,7 +18,7 @@ "description": "Which profile did you select on the Withings website? It's important the profiles match, otherwise data will be mis-labeled.", "title": "User Profile." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/es-419.json b/homeassistant/components/withings/.translations/es-419.json index f0490e5724b8..3fe3b06bf9e7 100644 --- a/homeassistant/components/withings/.translations/es-419.json +++ b/homeassistant/components/withings/.translations/es-419.json @@ -2,7 +2,7 @@ "config": { "create_entry": { "default": "Autenticado correctamente con Withings para el perfil seleccionado." - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/es.json b/homeassistant/components/withings/.translations/es.json index f3e2c36ae727..b2ec33e67c01 100644 --- a/homeassistant/components/withings/.translations/es.json +++ b/homeassistant/components/withings/.translations/es.json @@ -18,7 +18,7 @@ "description": "\u00bfQu\u00e9 perfil seleccion\u00f3 en el sitio web de Withings? Es importante que los perfiles coincidan, de lo contrario los datos se etiquetar\u00e1n incorrectamente.", "title": "Perfil de usuario." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/fr.json b/homeassistant/components/withings/.translations/fr.json index d178ef6c8894..d201fe70ab51 100644 --- a/homeassistant/components/withings/.translations/fr.json +++ b/homeassistant/components/withings/.translations/fr.json @@ -18,7 +18,7 @@ "description": "Quel profil avez-vous s\u00e9lectionn\u00e9 sur le site Withings? Il est important que les profils correspondent, sinon les donn\u00e9es seront mal \u00e9tiquet\u00e9es.", "title": "Profil utilisateur" } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/hu.json b/homeassistant/components/withings/.translations/hu.json index b13cf9ec5244..177662c6f183 100644 --- a/homeassistant/components/withings/.translations/hu.json +++ b/homeassistant/components/withings/.translations/hu.json @@ -18,7 +18,7 @@ "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.", "title": "Felhaszn\u00e1l\u00f3i profil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/it.json b/homeassistant/components/withings/.translations/it.json index 6deeff074899..edc03010a5ea 100644 --- a/homeassistant/components/withings/.translations/it.json +++ b/homeassistant/components/withings/.translations/it.json @@ -18,7 +18,7 @@ "description": "Quale profilo hai selezionato sul sito web di Withings? \u00c8 importante che i profili corrispondano, altrimenti i dati avranno con un'errata etichettatura.", "title": "Profilo utente." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ko.json b/homeassistant/components/withings/.translations/ko.json index 8cdd85119199..5e4287caa667 100644 --- a/homeassistant/components/withings/.translations/ko.json +++ b/homeassistant/components/withings/.translations/ko.json @@ -18,7 +18,7 @@ "description": "Withings \uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc5b4\ub5a4 \ud504\ub85c\ud544\uc744 \uc120\ud0dd\ud558\uc168\ub098\uc694? \ud504\ub85c\ud544\uc774 \uc77c\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74, \ub370\uc774\ud130\uc5d0 \ub808\uc774\ube14\uc774 \uc798\ubabb \uc9c0\uc815\ub429\ub2c8\ub2e4.", "title": "\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/lb.json b/homeassistant/components/withings/.translations/lb.json index 14e6be4091ed..ed2c1a7d8252 100644 --- a/homeassistant/components/withings/.translations/lb.json +++ b/homeassistant/components/withings/.translations/lb.json @@ -18,7 +18,7 @@ "description": "W\u00e9ie Profil hutt dir op der Withings Webs\u00e4it ausgewielt? Et ass wichteg dass Profiller passen, soss ginn Donn\u00e9e\u00eb falsch gekennzeechent.", "title": "Benotzer Profil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/lv.json b/homeassistant/components/withings/.translations/lv.json index 7d8b268367c3..a23ba89ea71b 100644 --- a/homeassistant/components/withings/.translations/lv.json +++ b/homeassistant/components/withings/.translations/lv.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Withings" - } + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/nl.json b/homeassistant/components/withings/.translations/nl.json index d534acc5c093..286550aafb10 100644 --- a/homeassistant/components/withings/.translations/nl.json +++ b/homeassistant/components/withings/.translations/nl.json @@ -18,7 +18,7 @@ "description": "Welk profiel hebt u op de website van Withings selecteren? Het is belangrijk dat de profielen overeenkomen, anders worden gegevens verkeerd gelabeld.", "title": "Gebruikersprofiel." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/nn.json b/homeassistant/components/withings/.translations/nn.json index 7d8b268367c3..a23ba89ea71b 100644 --- a/homeassistant/components/withings/.translations/nn.json +++ b/homeassistant/components/withings/.translations/nn.json @@ -1,5 +1,3 @@ { - "config": { - "title": "Withings" - } + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/no.json b/homeassistant/components/withings/.translations/no.json index fac2fa3a8fc3..0ec8d9d85466 100644 --- a/homeassistant/components/withings/.translations/no.json +++ b/homeassistant/components/withings/.translations/no.json @@ -18,7 +18,7 @@ "description": "Hvilken profil valgte du p\u00e5 Withings nettsted? Det er viktig at profilene samsvarer, ellers blir data feilmerket.", "title": "Brukerprofil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/pl.json b/homeassistant/components/withings/.translations/pl.json index c20f7a9ba538..1b3c2a17d83b 100644 --- a/homeassistant/components/withings/.translations/pl.json +++ b/homeassistant/components/withings/.translations/pl.json @@ -18,7 +18,7 @@ "description": "Kt\u00f3ry profil wybra\u0142e\u015b na stronie Withings? Wa\u017cne jest, aby profile si\u0119 zgadza\u0142y, w przeciwnym razie dane zostan\u0105 b\u0142\u0119dnie oznaczone.", "title": "Profil u\u017cytkownika" } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ru.json b/homeassistant/components/withings/.translations/ru.json index eba162904532..ddbf61d9e3e2 100644 --- a/homeassistant/components/withings/.translations/ru.json +++ b/homeassistant/components/withings/.translations/ru.json @@ -18,7 +18,7 @@ "description": "\u041a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0412\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Withings? \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u0438\u043d\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b.", "title": "Withings" } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/sl.json b/homeassistant/components/withings/.translations/sl.json index 1de0a0d6ce7e..8c204171e5b7 100644 --- a/homeassistant/components/withings/.translations/sl.json +++ b/homeassistant/components/withings/.translations/sl.json @@ -18,7 +18,7 @@ "description": "Kateri profil ste izbrali na spletni strani Withings? Pomembno je, da se profili ujemajo, sicer bodo podatki napa\u010dno ozna\u010deni.", "title": "Uporabni\u0161ki profil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/sv.json b/homeassistant/components/withings/.translations/sv.json index dfaa09d52f02..02f627e07b37 100644 --- a/homeassistant/components/withings/.translations/sv.json +++ b/homeassistant/components/withings/.translations/sv.json @@ -18,7 +18,7 @@ "description": "Vilken profil valde du p\u00e5 Withings webbplats? Det \u00e4r viktigt att profilerna matchar, annars kommer data att vara felm\u00e4rkta.", "title": "Anv\u00e4ndarprofil." } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/zh-Hant.json b/homeassistant/components/withings/.translations/zh-Hant.json index 61ae1fd8e06a..b4eca4629bee 100644 --- a/homeassistant/components/withings/.translations/zh-Hant.json +++ b/homeassistant/components/withings/.translations/zh-Hant.json @@ -18,7 +18,7 @@ "description": "\u65bc Withings \u7db2\u7ad9\u6240\u9078\u64c7\u7684\u500b\u4eba\u8a2d\u5b9a\u70ba\u4f55\uff1f\u5047\u5982\u500b\u4eba\u8a2d\u5b9a\u4e0d\u7b26\u5408\u7684\u8a71\uff0c\u8cc7\u6599\u5c07\u6703\u6a19\u793a\u932f\u8aa4\u3002", "title": "\u500b\u4eba\u8a2d\u5b9a\u3002" } - }, - "title": "Withings" - } + } + }, + "title": "Withings" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/af.json b/homeassistant/components/wled/.translations/af.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/af.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ar.json b/homeassistant/components/wled/.translations/ar.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/ar.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/bg.json b/homeassistant/components/wled/.translations/bg.json index d99df20187f7..52a707a050f3 100644 --- a/homeassistant/components/wled/.translations/bg.json +++ b/homeassistant/components/wled/.translations/bg.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "\u0422\u043e\u0432\u0430 WLED \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0435\u0447\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u043e.", - "connection_error": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 WLED \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 WLED \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "\u0410\u0434\u0440\u0435\u0441" }, - "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0432\u0430\u0448\u0438\u044f WLED \u0434\u0430 \u0441\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430 \u0441 Home Assistant.", - "title": "\u0421\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u0412\u0430\u0448\u0438\u044f WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 WLED \u0441 \u0438\u043c\u0435 {name} `\u043a\u044a\u043c Home Assistant?", - "title": "\u041e\u0442\u043a\u0440\u0438\u0442\u043e \u0435 WLED \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/bs.json b/homeassistant/components/wled/.translations/bs.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/bs.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ca.json b/homeassistant/components/wled/.translations/ca.json index cf4d1d98f6ee..305684b3f161 100644 --- a/homeassistant/components/wled/.translations/ca.json +++ b/homeassistant/components/wled/.translations/ca.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Aquest dispositiu WLED ja est\u00e0 configurat.", - "connection_error": "No s'ha pogut connectar amb el dispositiu WLED." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "No s'ha pogut connectar amb el dispositiu WLED." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Amfitri\u00f3 o adre\u00e7a IP" }, - "description": "Configura el teu WLED per integrar-lo amb Home Assistant.", - "title": "Enlla\u00e7 amb WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Vols afegir el WLED `{name}` a Home Assistant?", - "title": "Dispositiu WLED descobert" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/cs.json b/homeassistant/components/wled/.translations/cs.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/cs.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/cy.json b/homeassistant/components/wled/.translations/cy.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/cy.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/da.json b/homeassistant/components/wled/.translations/da.json index 0ab3a789b3a4..bd6feaf1019c 100644 --- a/homeassistant/components/wled/.translations/da.json +++ b/homeassistant/components/wled/.translations/da.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Denne WLED-enhed er allerede konfigureret.", - "connection_error": "Kunne ikke oprette forbindelse til WLED-enheden." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Kunne ikke oprette forbindelse til WLED-enheden." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "V\u00e6rt eller IP-adresse" }, - "description": "Indstil din WLED til at integrere med Home Assistant.", - "title": "Forbind din WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "\u00d8nsker du at tilf\u00f8je WLED-enhed med navnet `{name}' til Home Assistant?", - "title": "Fandt WLED-enhed" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/de.json b/homeassistant/components/wled/.translations/de.json index 2a7ef92b0ece..fe172b7aa9aa 100644 --- a/homeassistant/components/wled/.translations/de.json +++ b/homeassistant/components/wled/.translations/de.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Dieses WLED-Ger\u00e4t ist bereits konfiguriert.", - "connection_error": "Verbindung zum WLED-Ger\u00e4t fehlgeschlagen." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Verbindung zum WLED-Ger\u00e4t fehlgeschlagen." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Hostname oder IP-Adresse" }, - "description": "Richte deine WLED f\u00fcr die Integration mit Home Assistant ein.", - "title": "Verkn\u00fcpfe dein WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "M\u00f6chtest du die WLED mit dem Namen \"{name}\" zu Home Assistant hinzuf\u00fcgen?", - "title": "Gefundenes WLED-Ger\u00e4t" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/el.json b/homeassistant/components/wled/.translations/el.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/el.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/en.json b/homeassistant/components/wled/.translations/en.json index 0271f7d2b1e3..74d981fa2e90 100644 --- a/homeassistant/components/wled/.translations/en.json +++ b/homeassistant/components/wled/.translations/en.json @@ -20,7 +20,7 @@ "description": "Do you want to add the WLED named `{name}` to Home Assistant?", "title": "Discovered WLED device" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/eo.json b/homeassistant/components/wled/.translations/eo.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/eo.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/es-419.json b/homeassistant/components/wled/.translations/es-419.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/es-419.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/es.json b/homeassistant/components/wled/.translations/es.json index b7f567698ea4..c1bfc9596b18 100644 --- a/homeassistant/components/wled/.translations/es.json +++ b/homeassistant/components/wled/.translations/es.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Este dispositivo WLED ya est\u00e1 configurado.", - "connection_error": "No se ha podido conectar al dispositivo WLED." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "No se ha podido conectar al dispositivo WLED." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Host o direcci\u00f3n IP" }, - "description": "Configure su WLED para integrarse con Home Assistant.", - "title": "Vincula tu WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "\u00bfQuieres a\u00f1adir el WLED llamado `{name}` a Home Assistant?", - "title": "Descubierto dispositivo WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/et.json b/homeassistant/components/wled/.translations/et.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/et.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/eu.json b/homeassistant/components/wled/.translations/eu.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/eu.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/fa.json b/homeassistant/components/wled/.translations/fa.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/fa.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/fi.json b/homeassistant/components/wled/.translations/fi.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/fi.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/fr.json b/homeassistant/components/wled/.translations/fr.json index 6f275ad81998..a39efca5fa87 100644 --- a/homeassistant/components/wled/.translations/fr.json +++ b/homeassistant/components/wled/.translations/fr.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Cet appareil WLED est d\u00e9j\u00e0 configur\u00e9.", - "connection_error": "\u00c9chec de la connexion au p\u00e9riph\u00e9rique WLED." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "\u00c9chec de la connexion au p\u00e9riph\u00e9rique WLED." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "H\u00f4te ou adresse IP" }, - "description": "Configurer votre WLED pour l'int\u00e9grer \u00e0 Home Assistant.", - "title": "Liez votre WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Voulez-vous ajouter le dispositif WLED nomm\u00e9 `{name}` \u00e0 Home Assistant?", - "title": "Dispositif WLED d\u00e9couvert" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/gsw.json b/homeassistant/components/wled/.translations/gsw.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/gsw.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/he.json b/homeassistant/components/wled/.translations/he.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/he.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/hi.json b/homeassistant/components/wled/.translations/hi.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/hi.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/hr.json b/homeassistant/components/wled/.translations/hr.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/hr.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/hu.json b/homeassistant/components/wled/.translations/hu.json index 644b61ceb739..d179d634143f 100644 --- a/homeassistant/components/wled/.translations/hu.json +++ b/homeassistant/components/wled/.translations/hu.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Ez a WLED eszk\u00f6z m\u00e1r konfigur\u00e1lva van.", - "connection_error": "Nem siker\u00fclt csatlakozni a WLED eszk\u00f6zh\u00f6z." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Nem siker\u00fclt csatlakozni a WLED eszk\u00f6zh\u00f6z." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Hosztn\u00e9v vagy IP c\u00edm" }, - "description": "\u00c1ll\u00edtsa be a WLED-et, hogy integr\u00e1l\u00f3djon a Home Assistant alkalmaz\u00e1sba.", - "title": "Csatlakoztassa a WLED-t" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Hozz\u00e1 akarja adni a {name} `nev\u0171 WLED-et a Home Assistant-hez?", - "title": "Felfedezett WLED eszk\u00f6z" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/iba.json b/homeassistant/components/wled/.translations/iba.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/iba.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/id.json b/homeassistant/components/wled/.translations/id.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/id.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/is.json b/homeassistant/components/wled/.translations/is.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/is.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/it.json b/homeassistant/components/wled/.translations/it.json index 300f88ddc466..c331024664af 100644 --- a/homeassistant/components/wled/.translations/it.json +++ b/homeassistant/components/wled/.translations/it.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Questo dispositivo WLED \u00e8 gi\u00e0 configurato.", - "connection_error": "Impossibile connettersi al dispositivo WLED." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Impossibile connettersi al dispositivo WLED." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Host o indirizzo IP" }, - "description": "Configura WLED per l'integrazione con Home Assistant.", - "title": "Collega il tuo WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Vuoi aggiungere il WLED chiamato `{name}` a Home Assistant?", - "title": "Dispositivo WLED rilevato" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ja.json b/homeassistant/components/wled/.translations/ja.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/ja.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ko.json b/homeassistant/components/wled/.translations/ko.json index 38496c01ee83..cb70263e07cd 100644 --- a/homeassistant/components/wled/.translations/ko.json +++ b/homeassistant/components/wled/.translations/ko.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "WLED \uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "connection_error": "WLED \uae30\uae30\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "WLED \uae30\uae30\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "\ud638\uc2a4\ud2b8 \ub610\ub294 IP \uc8fc\uc18c" }, - "description": "Home Assistant \uc5d0 WLED \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.", - "title": "WLED \uc5f0\uacb0" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Home Assistant \uc5d0 WLED `{name}` \uc744(\ub97c) \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "title": "\ubc1c\uacac\ub41c WLED \uae30\uae30" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/lb.json b/homeassistant/components/wled/.translations/lb.json index 0e9381bd164b..acd10f5794ea 100644 --- a/homeassistant/components/wled/.translations/lb.json +++ b/homeassistant/components/wled/.translations/lb.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "D\u00ebsen WLED Apparat ass scho konfigur\u00e9iert.", - "connection_error": "Feeler beim verbannen mam WLED Apparat." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Feeler beim verbannen mam WLED Apparat." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Numm oder IP Adresse" }, - "description": "\u00c4ren WLED als Integratioun mam Home Assistant ariichten.", - "title": "\u00c4ren WLED verbannen" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "W\u00ebllt dir den WLED mam Numm `{name}` am Home Assistant dob\u00e4isetzen?", - "title": "Entdeckten WLED Apparat" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/lt.json b/homeassistant/components/wled/.translations/lt.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/lt.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/lv.json b/homeassistant/components/wled/.translations/lv.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/lv.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/nl.json b/homeassistant/components/wled/.translations/nl.json index 266f74ce6c24..6258ab61cf16 100644 --- a/homeassistant/components/wled/.translations/nl.json +++ b/homeassistant/components/wled/.translations/nl.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Dit WLED-apparaat is al geconfigureerd.", - "connection_error": "Kan geen verbinding maken met WLED-apparaat." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Kan geen verbinding maken met WLED-apparaat." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Hostnaam of IP-adres" }, - "description": "Stel uw WLED in op integratie met Home Assistant.", - "title": "Koppel je WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Wil je de WLED genaamd `{name}` toevoegen aan Home Assistant?", - "title": "Ontdekt WLED-apparaat" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/nn.json b/homeassistant/components/wled/.translations/nn.json index f50a24eeac06..e3edb991fb43 100644 --- a/homeassistant/components/wled/.translations/nn.json +++ b/homeassistant/components/wled/.translations/nn.json @@ -1,6 +1,23 @@ { "config": { - "flow_title": "WLED: {name}", - "title": "WLED" - } + "abort": { + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie WLED" + }, + "flow_title": "Wykryto urz\u0105dzenie WLED", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" + } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/no.json b/homeassistant/components/wled/.translations/no.json index b2dc9cb6547f..252b87e1e1a9 100644 --- a/homeassistant/components/wled/.translations/no.json +++ b/homeassistant/components/wled/.translations/no.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Denne WLED-enheten er allerede konfigurert.", - "connection_error": "Kunne ikke koble til WLED-enheten." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Kunne ikke koble til WLED-enheten." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Vert eller IP-adresse" }, - "description": "Konfigurer WLED til \u00e5 integreres med Home Assistant.", - "title": "Linken din WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Vil du legge til WLED med navnet ' {name} ' i Home Assistant?", - "title": "Oppdaget WLED-enhet" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/pl.json b/homeassistant/components/wled/.translations/pl.json index 6080336c44f9..94c4f91abea8 100644 --- a/homeassistant/components/wled/.translations/pl.json +++ b/homeassistant/components/wled/.translations/pl.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "To urz\u0105dzenie WLED jest ju\u017c skonfigurowane.", - "connection_error": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia z urz\u0105dzeniem WLED." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia z urz\u0105dzeniem WLED." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Nazwa hosta lub adres IP" }, - "description": "Konfiguracja WLED w celu integracji z Home Assistant'em.", - "title": "Po\u0142\u0105cz sw\u00f3j WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Czy chcesz doda\u0107 WLED o nazwie `{name}` do Home Assistant'a?", + "description": "Wykryto urz\u0105dzenie WLED", "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/pt-BR.json b/homeassistant/components/wled/.translations/pt-BR.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/pt-BR.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/pt.json b/homeassistant/components/wled/.translations/pt.json index 521434d11a8b..996f5823a5d8 100644 --- a/homeassistant/components/wled/.translations/pt.json +++ b/homeassistant/components/wled/.translations/pt.json @@ -1,22 +1,26 @@ { "config": { "abort": { - "connection_error": "Falha ao ligar ao dispositivo WLED" + "already_configured": "Wykryto urz\u0105dzenie [VOID]", + "connection_error": "Wykryto urz\u0105dzenie [VOID]" }, "error": { - "connection_error": "Falha ao ligar ao dispositivo WLED" + "connection_error": "Wykryto urz\u0105dzenie [VOID]" }, + "flow_title": "Wykryto urz\u0105dzenie [VOID]", "step": { "user": { "data": { "host": "Nome servidor ou endere\u00e7o IP" }, - "title": "Associar WLED" + "description": "Wykryto urz\u0105dzenie [VOID]", + "title": "Wykryto urz\u0105dzenie [VOID]" }, "zeroconf_confirm": { - "title": "Dispositivo WLED descoberto" + "description": "Wykryto urz\u0105dzenie [VOID]", + "title": "Wykryto urz\u0105dzenie [VOID]" } - }, - "title": "" - } + } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ro.json b/homeassistant/components/wled/.translations/ro.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/ro.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ru.json b/homeassistant/components/wled/.translations/ru.json index a1893bbce581..c5d36b0dbabc 100644 --- a/homeassistant/components/wled/.translations/ru.json +++ b/homeassistant/components/wled/.translations/ru.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", - "connection_error": "\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." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "\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." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "\u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441" }, - "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 WLED \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Home Assistant.", - "title": "WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "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 WLED `{name}`?", - "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sk.json b/homeassistant/components/wled/.translations/sk.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/sk.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sl.json b/homeassistant/components/wled/.translations/sl.json index b9ffb347a805..3eaf52e8a862 100644 --- a/homeassistant/components/wled/.translations/sl.json +++ b/homeassistant/components/wled/.translations/sl.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Ta naprava WLED je \u017ee konfigurirana.", - "connection_error": "Povezava z napravo WLED ni uspela." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Povezava z napravo WLED ni uspela." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "Gostitelj ali IP naslov" }, - "description": "Nastavite svoj WLED za integracijo s Home Assistant.", - "title": "Pove\u017eite svoj WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Ali \u017eelite dodati WLED z imenom `{name}` v Home Assistant?", - "title": "Odkrite WLED naprave" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sr-Latn.json b/homeassistant/components/wled/.translations/sr-Latn.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/sr-Latn.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sr.json b/homeassistant/components/wled/.translations/sr.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/sr.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sv.json b/homeassistant/components/wled/.translations/sv.json index 980c023118e4..4b2af95ccc53 100644 --- a/homeassistant/components/wled/.translations/sv.json +++ b/homeassistant/components/wled/.translations/sv.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "Den h\u00e4r WLED-enheten \u00e4r redan konfigurerad.", - "connection_error": "Det gick inte att ansluta till WLED-enheten." + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "Det gick inte att ansluta till WLED-enheten." + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED: {name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "V\u00e4rd eller IP-adress" }, - "description": "St\u00e4ll in din WLED f\u00f6r att integrera med Home Assistant.", - "title": "L\u00e4nka din WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "Vill du l\u00e4gga till WLED med namnet `{name}` till Home Assistant?", - "title": "Uppt\u00e4ckt WLED-enhet" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ta.json b/homeassistant/components/wled/.translations/ta.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/ta.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/te.json b/homeassistant/components/wled/.translations/te.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/te.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/th.json b/homeassistant/components/wled/.translations/th.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/th.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/tr.json b/homeassistant/components/wled/.translations/tr.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/tr.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/uk.json b/homeassistant/components/wled/.translations/uk.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/uk.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ur.json b/homeassistant/components/wled/.translations/ur.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/ur.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/vi.json b/homeassistant/components/wled/.translations/vi.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/vi.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/zh-Hans.json b/homeassistant/components/wled/.translations/zh-Hans.json new file mode 100644 index 000000000000..6e5a8c9293d5 --- /dev/null +++ b/homeassistant/components/wled/.translations/zh-Hans.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Wykryto urz\u0105dzenie ", + "connection_error": "Wykryto urz\u0105dzenie " + }, + "error": { + "connection_error": "Wykryto urz\u0105dzenie " + }, + "flow_title": "Wykryto urz\u0105dzenie ", + "step": { + "user": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + }, + "zeroconf_confirm": { + "description": "Wykryto urz\u0105dzenie ", + "title": "Wykryto urz\u0105dzenie " + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/zh-Hant.json b/homeassistant/components/wled/.translations/zh-Hant.json index 14139a204019..311a6fc2c633 100644 --- a/homeassistant/components/wled/.translations/zh-Hant.json +++ b/homeassistant/components/wled/.translations/zh-Hant.json @@ -1,26 +1,26 @@ { "config": { "abort": { - "already_configured": "WLED \u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", - "connection_error": "WLED \u8a2d\u5099\u9023\u7dda\u5931\u6557\u3002" + "already_configured": "Wykryto urz\u0105dzenie WLED", + "connection_error": "Wykryto urz\u0105dzenie WLED" }, "error": { - "connection_error": "WLED \u8a2d\u5099\u9023\u7dda\u5931\u6557\u3002" + "connection_error": "Wykryto urz\u0105dzenie WLED" }, - "flow_title": "WLED\uff1a{name}", + "flow_title": "Wykryto urz\u0105dzenie WLED", "step": { "user": { "data": { "host": "\u4e3b\u6a5f\u6216 IP \u4f4d\u5740" }, - "description": "\u8a2d\u5b9a WLED \u4ee5\u6574\u5408\u81f3 Home Assistant\u3002", - "title": "\u9023\u7d50 WLED" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" }, "zeroconf_confirm": { - "description": "\u662f\u5426\u8981\u65b0\u589e WLED \u540d\u7a31\u300c{name}\u300d\u8a2d\u5099\u81f3 Home Assistant\uff1f", - "title": "\u81ea\u52d5\u63a2\u7d22\u5230 WLED \u8a2d\u5099" + "description": "Wykryto urz\u0105dzenie WLED", + "title": "Wykryto urz\u0105dzenie WLED" } - }, - "title": "WLED" - } + } + }, + "title": "WLED" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/bg.json b/homeassistant/components/wwlln/.translations/bg.json index f252518fcab0..b7effeac9a52 100644 --- a/homeassistant/components/wwlln/.translations/bg.json +++ b/homeassistant/components/wwlln/.translations/bg.json @@ -9,7 +9,7 @@ }, "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0441\u0438." } - }, - "title": "\u0421\u0432\u0435\u0442\u043e\u0432\u043d\u0430 \u043c\u0440\u0435\u0436\u0430 \u0437\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u044a\u043b\u043d\u0438\u044f (WWLLN)" - } + } + }, + "title": "\u0421\u0432\u0435\u0442\u043e\u0432\u043d\u0430 \u043c\u0440\u0435\u0436\u0430 \u0437\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u044a\u043b\u043d\u0438\u044f (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ca.json b/homeassistant/components/wwlln/.translations/ca.json index f7fe15f27ecd..28772b25c47f 100644 --- a/homeassistant/components/wwlln/.translations/ca.json +++ b/homeassistant/components/wwlln/.translations/ca.json @@ -12,7 +12,7 @@ }, "title": "Introdueix la teva informaci\u00f3 d'ubicaci\u00f3." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/cy.json b/homeassistant/components/wwlln/.translations/cy.json index 6050207304f3..7127066c1297 100644 --- a/homeassistant/components/wwlln/.translations/cy.json +++ b/homeassistant/components/wwlln/.translations/cy.json @@ -9,7 +9,7 @@ }, "title": "Cwblhewch gwybodaeth eich lleoliad" } - }, - "title": "Rhwydwaith Lleoliad Golau Byd-eang (WWLLN)" - } + } + }, + "title": "Rhwydwaith Lleoliad Golau Byd-eang (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/da.json b/homeassistant/components/wwlln/.translations/da.json index df10f39657ab..6370a98d6fd4 100644 --- a/homeassistant/components/wwlln/.translations/da.json +++ b/homeassistant/components/wwlln/.translations/da.json @@ -9,7 +9,7 @@ }, "title": "Udfyld dine lokalitetsoplysninger." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/de.json b/homeassistant/components/wwlln/.translations/de.json index 487f2294dc69..f16a8cc40579 100644 --- a/homeassistant/components/wwlln/.translations/de.json +++ b/homeassistant/components/wwlln/.translations/de.json @@ -12,7 +12,7 @@ }, "title": "Gib deine Standortinformationen ein." } - }, - "title": "Weltweites Blitzlokalisierungsnetzwerk (WWLLN)" - } + } + }, + "title": "Weltweites Blitzlokalisierungsnetzwerk (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/en.json b/homeassistant/components/wwlln/.translations/en.json index 48896cc86821..c62cccaf4902 100644 --- a/homeassistant/components/wwlln/.translations/en.json +++ b/homeassistant/components/wwlln/.translations/en.json @@ -12,7 +12,7 @@ }, "title": "Fill in your location information." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/es-419.json b/homeassistant/components/wwlln/.translations/es-419.json index 6b2e5d23ffbe..6b753642e841 100644 --- a/homeassistant/components/wwlln/.translations/es-419.json +++ b/homeassistant/components/wwlln/.translations/es-419.json @@ -9,7 +9,7 @@ }, "title": "Complete su informaci\u00f3n de ubicaci\u00f3n." } - }, - "title": "Red Mundial de Localizaci\u00f3n de Rayos (WWLLN)" - } + } + }, + "title": "Red Mundial de Localizaci\u00f3n de Rayos (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/es.json b/homeassistant/components/wwlln/.translations/es.json index 22eb2c1e7041..ebee314c56a2 100644 --- a/homeassistant/components/wwlln/.translations/es.json +++ b/homeassistant/components/wwlln/.translations/es.json @@ -12,7 +12,7 @@ }, "title": "Completa la informaci\u00f3n de tu ubicaci\u00f3n." } - }, - "title": "Red mundial de localizaci\u00f3n de rayos (WWLLN)" - } + } + }, + "title": "Red mundial de localizaci\u00f3n de rayos (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/fr.json b/homeassistant/components/wwlln/.translations/fr.json index d19114286ad1..06439ef5cf47 100644 --- a/homeassistant/components/wwlln/.translations/fr.json +++ b/homeassistant/components/wwlln/.translations/fr.json @@ -12,7 +12,7 @@ }, "title": "Veuillez saisir vos informations d'emplacement." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/hr.json b/homeassistant/components/wwlln/.translations/hr.json index 3dec14ffa174..6d4d31e01346 100644 --- a/homeassistant/components/wwlln/.translations/hr.json +++ b/homeassistant/components/wwlln/.translations/hr.json @@ -9,7 +9,7 @@ }, "title": "Ispunite podatke o lokaciji." } - }, - "title": "Svjetska mre\u017ea lokacija munje (WWLLN)" - } + } + }, + "title": "Svjetska mre\u017ea lokacija munje (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/it.json b/homeassistant/components/wwlln/.translations/it.json index 1733cfdf172a..0e4ef8640755 100644 --- a/homeassistant/components/wwlln/.translations/it.json +++ b/homeassistant/components/wwlln/.translations/it.json @@ -12,7 +12,7 @@ }, "title": "Inserisci le informazioni sulla tua posizione." } - }, - "title": "Rete mondiale di localizzazione dei fulmini (WWLLN)" - } + } + }, + "title": "Rete mondiale di localizzazione dei fulmini (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ko.json b/homeassistant/components/wwlln/.translations/ko.json index a71ebe3ea0c3..db7dd9852c87 100644 --- a/homeassistant/components/wwlln/.translations/ko.json +++ b/homeassistant/components/wwlln/.translations/ko.json @@ -12,7 +12,7 @@ }, "title": "\uc704\uce58 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694." } - }, - "title": "\uc138\uacc4 \ub099\ub8b0 \uc704\uce58\ub9dd (WWLLN)" - } + } + }, + "title": "\uc138\uacc4 \ub099\ub8b0 \uc704\uce58\ub9dd (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/lb.json b/homeassistant/components/wwlln/.translations/lb.json index 9632cb372b20..6fab54213730 100644 --- a/homeassistant/components/wwlln/.translations/lb.json +++ b/homeassistant/components/wwlln/.translations/lb.json @@ -12,7 +12,7 @@ }, "title": "F\u00ebllt \u00e4r Informatiounen aus." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/nl.json b/homeassistant/components/wwlln/.translations/nl.json index 542c53f0c034..af00e027a8cf 100644 --- a/homeassistant/components/wwlln/.translations/nl.json +++ b/homeassistant/components/wwlln/.translations/nl.json @@ -9,7 +9,7 @@ }, "title": "Vul uw locatiegegevens in." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/no.json b/homeassistant/components/wwlln/.translations/no.json index fab8810ba5e4..00704aad5234 100644 --- a/homeassistant/components/wwlln/.translations/no.json +++ b/homeassistant/components/wwlln/.translations/no.json @@ -12,7 +12,7 @@ }, "title": "Fyll ut posisjonsinformasjonen din." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/pl.json b/homeassistant/components/wwlln/.translations/pl.json index 22d84209b7fd..5ba66970d3ae 100644 --- a/homeassistant/components/wwlln/.translations/pl.json +++ b/homeassistant/components/wwlln/.translations/pl.json @@ -12,7 +12,7 @@ }, "title": "Wprowad\u017a informacje o lokalizacji." } - }, - "title": "\u015awiatowa sie\u0107 lokalizacji wy\u0142adowa\u0144 atmosferycznych (WWLLN)" - } + } + }, + "title": "\u015awiatowa sie\u0107 lokalizacji wy\u0142adowa\u0144 atmosferycznych (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/pt-BR.json b/homeassistant/components/wwlln/.translations/pt-BR.json index 296588f66a8e..f948b11007f8 100644 --- a/homeassistant/components/wwlln/.translations/pt-BR.json +++ b/homeassistant/components/wwlln/.translations/pt-BR.json @@ -9,7 +9,7 @@ }, "title": "Preencha suas informa\u00e7\u00f5es de localiza\u00e7\u00e3o." } - }, - "title": "Rede mundial de localiza\u00e7\u00e3o de rel\u00e2mpagos (WWLLN)" - } + } + }, + "title": "Rede mundial de localiza\u00e7\u00e3o de rel\u00e2mpagos (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ru.json b/homeassistant/components/wwlln/.translations/ru.json index b67d70e057be..ad4b78ae5631 100644 --- a/homeassistant/components/wwlln/.translations/ru.json +++ b/homeassistant/components/wwlln/.translations/ru.json @@ -12,7 +12,7 @@ }, "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } - }, - "title": "\u0412\u0441\u0435\u043c\u0438\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u043b\u043d\u0438\u0439 (WWLLN)" - } + } + }, + "title": "\u0412\u0441\u0435\u043c\u0438\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u043b\u043d\u0438\u0439 (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/sl.json b/homeassistant/components/wwlln/.translations/sl.json index 11fc4f00db8e..a001deee547f 100644 --- a/homeassistant/components/wwlln/.translations/sl.json +++ b/homeassistant/components/wwlln/.translations/sl.json @@ -12,7 +12,7 @@ }, "title": "Izpolnite podatke o va\u0161i lokaciji." } - }, - "title": "Svetovna mre\u017ea za lokacije strel (WWLLN)" - } + } + }, + "title": "Svetovna mre\u017ea za lokacije strel (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/sv.json b/homeassistant/components/wwlln/.translations/sv.json index 3180c5434527..ad738c2131bd 100644 --- a/homeassistant/components/wwlln/.translations/sv.json +++ b/homeassistant/components/wwlln/.translations/sv.json @@ -9,7 +9,7 @@ }, "title": "Fyll i platsinformation." } - }, - "title": "World Wide Lightning Location Network (WWLLN)" - } + } + }, + "title": "World Wide Lightning Location Network (WWLLN)" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/zh-Hans.json b/homeassistant/components/wwlln/.translations/zh-Hans.json index e53d33512e18..3e13c944a335 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hans.json +++ b/homeassistant/components/wwlln/.translations/zh-Hans.json @@ -9,7 +9,7 @@ }, "title": "\u586b\u5199\u60a8\u7684\u4f4d\u7f6e\u4fe1\u606f\u3002" } - }, - "title": "\u5168\u7403\u95ea\u7535\u5b9a\u4f4d\u7f51\u7edc\uff08WWLLN\uff09" - } + } + }, + "title": "\u5168\u7403\u95ea\u7535\u5b9a\u4f4d\u7f51\u7edc\uff08WWLLN\uff09" } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/zh-Hant.json b/homeassistant/components/wwlln/.translations/zh-Hant.json index fac13ffe77f2..47180cf070f3 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hant.json +++ b/homeassistant/components/wwlln/.translations/zh-Hant.json @@ -12,7 +12,7 @@ }, "title": "\u586b\u5beb\u5ea7\u6a19\u8cc7\u8a0a\u3002" } - }, - "title": "\u5168\u7403\u9583\u96fb\u5b9a\u4f4d\u7db2\uff08WWLLN\uff09" - } + } + }, + "title": "\u5168\u7403\u9583\u96fb\u5b9a\u4f4d\u7db2\uff08WWLLN\uff09" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/bg.json b/homeassistant/components/zha/.translations/bg.json index 916d09a68306..634e1f3b6d07 100644 --- a/homeassistant/components/zha/.translations/bg.json +++ b/homeassistant/components/zha/.translations/bg.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -63,5 +62,6 @@ "remote_button_short_release": "\"{subtype}\" \u0431\u0443\u0442\u043e\u043d\u044a\u0442 \u0431\u0435\u0448\u0435 \u043e\u0442\u043f\u0443\u0441\u043d\u0430\u0442", "remote_button_triple_press": "\"{subtype}\" \u0431\u0443\u0442\u043e\u043d\u044a\u0442 \u0431\u0435\u0448\u0435 \u043d\u0430\u0442\u0438\u0441\u043d\u0430\u0442 \u0442\u0440\u0438\u043a\u0440\u0430\u0442\u043d\u043e" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ca.json b/homeassistant/components/zha/.translations/ca.json index 9ad486f5041a..2b4edb07c295 100644 --- a/homeassistant/components/zha/.translations/ca.json +++ b/homeassistant/components/zha/.translations/ca.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "Bot\u00f3 \"{subtype}\" alliberat", "remote_button_triple_press": "Bot\u00f3 \"{subtype}\" clicat tres vegades" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/da.json b/homeassistant/components/zha/.translations/da.json index 908d8113b2e4..60f9c60e8b59 100644 --- a/homeassistant/components/zha/.translations/da.json +++ b/homeassistant/components/zha/.translations/da.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -63,5 +62,6 @@ "remote_button_short_release": "\"{subtype}\"-knappen frigivet", "remote_button_triple_press": "\"{subtype}\"-knappen tredobbeltklikkes" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/de.json b/homeassistant/components/zha/.translations/de.json index f7a00fcfa7f4..d61ab9ce4347 100644 --- a/homeassistant/components/zha/.translations/de.json +++ b/homeassistant/components/zha/.translations/de.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" Taste losgelassen", "remote_button_triple_press": "\"{subtype}\" Taste dreimal geklickt" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/en.json b/homeassistant/components/zha/.translations/en.json index 500083a7e4ea..803d058e0c20 100644 --- a/homeassistant/components/zha/.translations/en.json +++ b/homeassistant/components/zha/.translations/en.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" button released", "remote_button_triple_press": "\"{subtype}\" button triple clicked" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/es-419.json b/homeassistant/components/zha/.translations/es-419.json index edf38b4fd3bd..eb02c27d7483 100644 --- a/homeassistant/components/zha/.translations/es-419.json +++ b/homeassistant/components/zha/.translations/es-419.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "trigger_subtype": { @@ -34,5 +33,6 @@ "device_slid": "Dispositivo deslizado \"{subtype}\"", "device_tilted": "Dispositivo inclinado" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/es.json b/homeassistant/components/zha/.translations/es.json index 2bf817daf638..32aa48328bd7 100644 --- a/homeassistant/components/zha/.translations/es.json +++ b/homeassistant/components/zha/.translations/es.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "Bot\u00f3n \"{subtype}\" soltado", "remote_button_triple_press": "Bot\u00f3n \"{subtype}\" triple pulsaci\u00f3n" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/fr.json b/homeassistant/components/zha/.translations/fr.json index 99905bba836c..3e22c7cba55d 100644 --- a/homeassistant/components/zha/.translations/fr.json +++ b/homeassistant/components/zha/.translations/fr.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -63,5 +62,6 @@ "remote_button_short_release": "Bouton \" {subtype} \" est rel\u00e2ch\u00e9", "remote_button_triple_press": "Bouton \"{subtype}\" \u00e0 trois clics" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/hu.json b/homeassistant/components/zha/.translations/hu.json index 11b2a9fc8335..df10e978d72b 100644 --- a/homeassistant/components/zha/.translations/hu.json +++ b/homeassistant/components/zha/.translations/hu.json @@ -14,7 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" - } + } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/it.json b/homeassistant/components/zha/.translations/it.json index 5048ce52599c..70ab49a8017f 100644 --- a/homeassistant/components/zha/.translations/it.json +++ b/homeassistant/components/zha/.translations/it.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "Pulsante \"{subtype}\" rilasciato", "remote_button_triple_press": "Pulsante \"{subtype}\" cliccato tre volte" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ko.json b/homeassistant/components/zha/.translations/ko.json index 76a10d2c976f..2ea67ece4a50 100644 --- a/homeassistant/components/zha/.translations/ko.json +++ b/homeassistant/components/zha/.translations/ko.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c", "remote_button_triple_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \uc138 \ubc88 \ub20c\ub9b4 \ub54c" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/lb.json b/homeassistant/components/zha/.translations/lb.json index c4c65bf20375..b447c2e44b46 100644 --- a/homeassistant/components/zha/.translations/lb.json +++ b/homeassistant/components/zha/.translations/lb.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss", "remote_button_triple_press": "\"{subtype}\" Kn\u00e4ppche dr\u00e4imol gedr\u00e9ckt" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/nl.json b/homeassistant/components/zha/.translations/nl.json index fc7ae970503c..64a6d760d452 100644 --- a/homeassistant/components/zha/.translations/nl.json +++ b/homeassistant/components/zha/.translations/nl.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -63,5 +62,6 @@ "remote_button_short_release": "\"{subtype}\" knop losgelaten", "remote_button_triple_press": "\" {subtype} \" knop driemaal geklikt" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/nn.json b/homeassistant/components/zha/.translations/nn.json index 392018bb1f1c..d5a8a89ff60c 100644 --- a/homeassistant/components/zha/.translations/nn.json +++ b/homeassistant/components/zha/.translations/nn.json @@ -4,12 +4,12 @@ "user": { "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { "squawk": "Squawk" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/no.json b/homeassistant/components/zha/.translations/no.json index 656926017cf4..096164e72918 100644 --- a/homeassistant/components/zha/.translations/no.json +++ b/homeassistant/components/zha/.translations/no.json @@ -14,8 +14,7 @@ }, "title": "" } - }, - "title": "" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\"-knappen sluppet", "remote_button_triple_press": "\"{subtype}\"-knappen ble trippelklikket" } - } + }, + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pl.json b/homeassistant/components/zha/.translations/pl.json index bf651fb16ed7..fc5b04e10384 100644 --- a/homeassistant/components/zha/.translations/pl.json +++ b/homeassistant/components/zha/.translations/pl.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" zostanie zwolniony", "remote_button_triple_press": "\"{subtype}\" zostanie trzykrotnie naci\u015bni\u0119ty" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pt-BR.json b/homeassistant/components/zha/.translations/pt-BR.json index 7ccc661dd28d..02db7d60823b 100644 --- a/homeassistant/components/zha/.translations/pt-BR.json +++ b/homeassistant/components/zha/.translations/pt-BR.json @@ -14,13 +14,13 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { "squawk": "Squawk", "warn": "Aviso" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pt.json b/homeassistant/components/zha/.translations/pt.json index 0c86dc95d099..4883c7643201 100644 --- a/homeassistant/components/zha/.translations/pt.json +++ b/homeassistant/components/zha/.translations/pt.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -24,5 +23,6 @@ "trigger_subtype": { "left": "Esquerda" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ru.json b/homeassistant/components/zha/.translations/ru.json index c5f38d00d691..54ed72d674e5 100644 --- a/homeassistant/components/zha/.translations/ru.json +++ b/homeassistant/components/zha/.translations/ru.json @@ -14,8 +14,7 @@ }, "title": "Zigbee Home Automation" } - }, - "title": "Zigbee Home Automation (ZHA)" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430", "remote_button_triple_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430" } - } + }, + "title": "Zigbee Home Automation (ZHA)" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/sl.json b/homeassistant/components/zha/.translations/sl.json index 53a45000701c..2d6c9c687d83 100644 --- a/homeassistant/components/zha/.translations/sl.json +++ b/homeassistant/components/zha/.translations/sl.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "Gumb \"{subtype}\" spro\u0161\u010den", "remote_button_triple_press": "Gumb \"{subtype}\" trikrat kliknjen" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/sv.json b/homeassistant/components/zha/.translations/sv.json index 473cf1cd2a97..e9887441c00f 100644 --- a/homeassistant/components/zha/.translations/sv.json +++ b/homeassistant/components/zha/.translations/sv.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -63,5 +62,6 @@ "remote_button_short_release": "\"{subtype}\"-knappen sl\u00e4ppt", "remote_button_triple_press": "\"{subtype}\"-knappen trippelklickades" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/zh-Hans.json b/homeassistant/components/zha/.translations/zh-Hans.json index b0a553263f7a..22a0152b73b6 100644 --- a/homeassistant/components/zha/.translations/zh-Hans.json +++ b/homeassistant/components/zha/.translations/zh-Hans.json @@ -14,7 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" - } + } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/zh-Hant.json b/homeassistant/components/zha/.translations/zh-Hant.json index 9547e7b5b7d0..6f042345407d 100644 --- a/homeassistant/components/zha/.translations/zh-Hant.json +++ b/homeassistant/components/zha/.translations/zh-Hant.json @@ -14,8 +14,7 @@ }, "title": "ZHA" } - }, - "title": "ZHA" + } }, "device_automation": { "action_type": { @@ -71,5 +70,6 @@ "remote_button_short_release": "\"{subtype}\" \u6309\u9215\u5df2\u91cb\u653e", "remote_button_triple_press": "\"{subtype}\" \u6309\u9215\u4e09\u9023\u64ca" } - } + }, + "title": "ZHA" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/bg.json b/homeassistant/components/zwave/.translations/bg.json index 7140e3956df7..77ec3bc45dd8 100644 --- a/homeassistant/components/zwave/.translations/bg.json +++ b/homeassistant/components/zwave/.translations/bg.json @@ -16,7 +16,7 @@ "description": "\u0412\u0438\u0436\u0442\u0435 https://www.home-assistant.io/docs/z-wave/installation/ \u0437\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0438\u0442\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u043b\u0438\u0432\u0438", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ca.json b/homeassistant/components/zwave/.translations/ca.json index bbf303a1f5e3..cb6c71f06ec1 100644 --- a/homeassistant/components/zwave/.translations/ca.json +++ b/homeassistant/components/zwave/.translations/ca.json @@ -16,7 +16,7 @@ "description": "Consulta https://www.home-assistant.io/docs/z-wave/installation/ per obtenir informaci\u00f3 sobre les variables de configuraci\u00f3", "title": "Configuraci\u00f3 de Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/cs.json b/homeassistant/components/zwave/.translations/cs.json index a44fb8ad34b0..90aad3286bc0 100644 --- a/homeassistant/components/zwave/.translations/cs.json +++ b/homeassistant/components/zwave/.translations/cs.json @@ -16,7 +16,7 @@ "description": "Viz https://www.home-assistant.io/docs/z-wave/installation/ pro informace o konfigura\u010dn\u00edch prom\u011bnn\u00fdch", "title": "Nastavit Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/da.json b/homeassistant/components/zwave/.translations/da.json index 25eee9b3d91b..52ba1fe06f09 100644 --- a/homeassistant/components/zwave/.translations/da.json +++ b/homeassistant/components/zwave/.translations/da.json @@ -16,7 +16,7 @@ "description": "Se https://www.home-assistant.io/docs/z-wave/installation/ for oplysninger om konfigurationsvariabler", "title": "Ops\u00e6t Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/de.json b/homeassistant/components/zwave/.translations/de.json index f2438f1561f1..c245e010ded9 100644 --- a/homeassistant/components/zwave/.translations/de.json +++ b/homeassistant/components/zwave/.translations/de.json @@ -16,7 +16,7 @@ "description": "Informationen zu den Konfigurationsvariablen findest du unter https://www.home-assistant.io/docs/z-wave/installation/", "title": "Z-Wave einrichten" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/en.json b/homeassistant/components/zwave/.translations/en.json index 081d5c858cbf..bb35af63373c 100644 --- a/homeassistant/components/zwave/.translations/en.json +++ b/homeassistant/components/zwave/.translations/en.json @@ -16,7 +16,7 @@ "description": "See https://www.home-assistant.io/docs/z-wave/installation/ for information on the configuration variables", "title": "Set up Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/es-419.json b/homeassistant/components/zwave/.translations/es-419.json index f2ca1a19aa49..5e44c2612d88 100644 --- a/homeassistant/components/zwave/.translations/es-419.json +++ b/homeassistant/components/zwave/.translations/es-419.json @@ -16,7 +16,7 @@ "description": "Consulte https://www.home-assistant.io/docs/z-wave/installation/ para obtener informaci\u00f3n sobre las variables de configuraci\u00f3n", "title": "Configurar Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/es.json b/homeassistant/components/zwave/.translations/es.json index ba7885f2e252..bef69802ba92 100644 --- a/homeassistant/components/zwave/.translations/es.json +++ b/homeassistant/components/zwave/.translations/es.json @@ -16,7 +16,7 @@ "description": "Consulta https://www.home-assistant.io/docs/z-wave/installation/ para obtener informaci\u00f3n sobre las variables de configuraci\u00f3n", "title": "Configurar Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/et.json b/homeassistant/components/zwave/.translations/et.json index 8c4c45f9c897..d8a4c4530151 100644 --- a/homeassistant/components/zwave/.translations/et.json +++ b/homeassistant/components/zwave/.translations/et.json @@ -1,5 +1,3 @@ { - "config": { - "title": "" - } + "title": "" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/fr.json b/homeassistant/components/zwave/.translations/fr.json index 797a64b20761..7f4ba7ac899d 100644 --- a/homeassistant/components/zwave/.translations/fr.json +++ b/homeassistant/components/zwave/.translations/fr.json @@ -16,7 +16,7 @@ "description": "Voir https://www.home-assistant.io/docs/z-wave/installation/ pour plus d'informations sur les variables de configuration.", "title": "Configurer Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/hu.json b/homeassistant/components/zwave/.translations/hu.json index 2842c535984a..e067002ca89b 100644 --- a/homeassistant/components/zwave/.translations/hu.json +++ b/homeassistant/components/zwave/.translations/hu.json @@ -16,7 +16,7 @@ "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.", "title": "Z-Wave be\u00e1ll\u00edt\u00e1sa" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/it.json b/homeassistant/components/zwave/.translations/it.json index c380d8e5625e..2e73c109e57e 100644 --- a/homeassistant/components/zwave/.translations/it.json +++ b/homeassistant/components/zwave/.translations/it.json @@ -16,7 +16,7 @@ "description": "Vai su https://www.home-assistant.io/docs/z-wave/installation/ per le informazioni sulle variabili di configurazione", "title": "Configura Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ko.json b/homeassistant/components/zwave/.translations/ko.json index e288019de0c3..93d8e43553a4 100644 --- a/homeassistant/components/zwave/.translations/ko.json +++ b/homeassistant/components/zwave/.translations/ko.json @@ -16,7 +16,7 @@ "description": "\uad6c\uc131 \ubcc0\uc218\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 [\uc548\ub0b4](https://www.home-assistant.io/docs/z-wave/installation/) \ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694", "title": "Z-Wave \uc124\uc815" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/lb.json b/homeassistant/components/zwave/.translations/lb.json index 84b6d8aa67de..0747ed4514a3 100644 --- a/homeassistant/components/zwave/.translations/lb.json +++ b/homeassistant/components/zwave/.translations/lb.json @@ -16,7 +16,7 @@ "description": "Lies op https://www.home-assistant.io/docs/z-wave/installation/ fir weider Informatiounen iwwert d'Konfiguratioun vun den Variabelen", "title": "Z-Wave konfigur\u00e9ieren" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/nl.json b/homeassistant/components/zwave/.translations/nl.json index 0b700b895fd4..db03b4af231f 100644 --- a/homeassistant/components/zwave/.translations/nl.json +++ b/homeassistant/components/zwave/.translations/nl.json @@ -16,7 +16,7 @@ "description": "Zie https://www.home-assistant.io/docs/z-wave/installation/ voor informatie over de configuratievariabelen", "title": "Stel Z-Wave in" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/nn.json b/homeassistant/components/zwave/.translations/nn.json index 8d1c737170f3..98d65a2d2433 100644 --- a/homeassistant/components/zwave/.translations/nn.json +++ b/homeassistant/components/zwave/.translations/nn.json @@ -4,7 +4,7 @@ "user": { "description": "Sj\u00e5 [www.home-assistant.io/docs/z-wave/installation/](https://www.home-assistant.io/docs/z-wave/installation/) for informasjon om konfigurasjonsvariablene." } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/no.json b/homeassistant/components/zwave/.translations/no.json index 1d5584a82a05..bc890e9715cf 100644 --- a/homeassistant/components/zwave/.translations/no.json +++ b/homeassistant/components/zwave/.translations/no.json @@ -16,7 +16,7 @@ "description": "Se [www.home-assistant.io/docs/z-wave/installation/](https://www.home-assistant.io/docs/z-wave/installation/) for informasjon om konfigurasjon variablene", "title": "Sett opp Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pl.json b/homeassistant/components/zwave/.translations/pl.json index a985405c009d..de31220ac5cb 100644 --- a/homeassistant/components/zwave/.translations/pl.json +++ b/homeassistant/components/zwave/.translations/pl.json @@ -16,7 +16,7 @@ "description": "Przejd\u017a na https://www.home-assistant.io/docs/z-wave/installation/, aby uzyska\u0107 informacje na temat zmiennych konfiguracyjnych", "title": "Konfiguracja Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pt-BR.json b/homeassistant/components/zwave/.translations/pt-BR.json index 2b4b19cde5a3..b069a5f0f83a 100644 --- a/homeassistant/components/zwave/.translations/pt-BR.json +++ b/homeassistant/components/zwave/.translations/pt-BR.json @@ -16,7 +16,7 @@ "description": "Consulte https://www.home-assistant.io/docs/z-wave/installation/ para obter informa\u00e7\u00f5es sobre as vari\u00e1veis de configura\u00e7\u00e3o", "title": "Configurar o Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pt.json b/homeassistant/components/zwave/.translations/pt.json index 23c653d02fc3..4b82173125a7 100644 --- a/homeassistant/components/zwave/.translations/pt.json +++ b/homeassistant/components/zwave/.translations/pt.json @@ -16,7 +16,7 @@ "description": "Consulte https://www.home-assistant.io/docs/z-wave/installation/ para obter informa\u00e7\u00f5es sobre as vari\u00e1veis de configura\u00e7\u00e3o", "title": "Configurar o Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ro.json b/homeassistant/components/zwave/.translations/ro.json index 6920f56cdb14..79f6b986252b 100644 --- a/homeassistant/components/zwave/.translations/ro.json +++ b/homeassistant/components/zwave/.translations/ro.json @@ -16,7 +16,7 @@ "description": "Vede\u021bi https://www.home-assistant.io/docs/z-wave/installation/ pentru informa\u021bii despre variabilele de configurare", "title": "Configura\u021bi Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ru.json b/homeassistant/components/zwave/.translations/ru.json index a1039c2dedc4..50b4e4bc70ab 100644 --- a/homeassistant/components/zwave/.translations/ru.json +++ b/homeassistant/components/zwave/.translations/ru.json @@ -16,7 +16,7 @@ "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438](https://www.home-assistant.io/docs/z-wave/installation/) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.", "title": "Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/sl.json b/homeassistant/components/zwave/.translations/sl.json index fa799d1ed364..cb718668daaa 100644 --- a/homeassistant/components/zwave/.translations/sl.json +++ b/homeassistant/components/zwave/.translations/sl.json @@ -16,7 +16,7 @@ "description": "Za informacije o konfiguracijskih spremenljivka si oglejte https://www.home-assistant.io/docs/z-wave/installation/", "title": "Nastavite Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/sv.json b/homeassistant/components/zwave/.translations/sv.json index 508652a1784e..9296127a38c7 100644 --- a/homeassistant/components/zwave/.translations/sv.json +++ b/homeassistant/components/zwave/.translations/sv.json @@ -16,7 +16,7 @@ "description": "Se https://www.home-assistant.io/docs/z-wave/installation/ f\u00f6r information om konfigurationsvariabler", "title": "St\u00e4lla in Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/zh-Hans.json b/homeassistant/components/zwave/.translations/zh-Hans.json index 2c72ce72c606..929968941289 100644 --- a/homeassistant/components/zwave/.translations/zh-Hans.json +++ b/homeassistant/components/zwave/.translations/zh-Hans.json @@ -16,7 +16,7 @@ "description": "\u6709\u5173\u914d\u7f6e\u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 https://www.home-assistant.io/docs/z-wave/installation/", "title": "\u8bbe\u7f6e Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/zh-Hant.json b/homeassistant/components/zwave/.translations/zh-Hant.json index 2a84e8b3fd68..c7ef7f65875a 100644 --- a/homeassistant/components/zwave/.translations/zh-Hant.json +++ b/homeassistant/components/zwave/.translations/zh-Hant.json @@ -16,7 +16,7 @@ "description": "\u95dc\u65bc\u8a2d\u5b9a\u8b8a\u6578\u8cc7\u8a0a\uff0c\u8acb\u53c3\u95b1 https://www.home-assistant.io/docs/z-wave/installation/", "title": "\u8a2d\u5b9a Z-Wave" } - }, - "title": "Z-Wave" - } + } + }, + "title": "Z-Wave" } \ No newline at end of file From 86f09a42a233fb47ae3b36c1f10cd10cb3c3ad0c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 10:00:37 -0700 Subject: [PATCH 422/653] Fix translations --- homeassistant/components/gios/strings.json | 2 +- homeassistant/components/tradfri/strings.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/gios/strings.json b/homeassistant/components/gios/strings.json index 0519eec87d3a..124d2b19a4b2 100644 --- a/homeassistant/components/gios/strings.json +++ b/homeassistant/components/gios/strings.json @@ -1,5 +1,5 @@ { - "title": "$1", + "title": "GIOŚ", "config": { "step": { "user": { diff --git a/homeassistant/components/tradfri/strings.json b/homeassistant/components/tradfri/strings.json index a4bf785dd4ae..d1324b9afb91 100644 --- a/homeassistant/components/tradfri/strings.json +++ b/homeassistant/components/tradfri/strings.json @@ -1,5 +1,5 @@ { - "title": "$1", + "title": "IKEA TRÅDFRI", "config": { "step": { "auth": { From e41753556cb3cec0c2ca7f0905925f0b1483329d Mon Sep 17 00:00:00 2001 From: presslab-us Date: Wed, 15 Apr 2020 14:11:04 -0400 Subject: [PATCH 423/653] Add MQTT climate temperature unit (#34066) * Add MQTT temperature unit --- homeassistant/components/mqtt/climate.py | 7 +++++-- tests/components/mqtt/test_climate.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mqtt/climate.py b/homeassistant/components/mqtt/climate.py index 0216302c6515..91e30c7b1b17 100644 --- a/homeassistant/components/mqtt/climate.py +++ b/homeassistant/components/mqtt/climate.py @@ -37,6 +37,7 @@ from homeassistant.const import ( ATTR_TEMPERATURE, CONF_DEVICE, CONF_NAME, + CONF_TEMPERATURE_UNIT, CONF_VALUE_TEMPLATE, PRECISION_HALVES, PRECISION_TENTHS, @@ -223,6 +224,7 @@ PLATFORM_SCHEMA = ( vol.Optional(CONF_TEMP_LOW_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_TEMP_STATE_TEMPLATE): cv.template, vol.Optional(CONF_TEMP_STATE_TOPIC): mqtt.valid_subscribe_topic, + vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, vol.Optional(CONF_UNIQUE_ID): cv.string, vol.Optional(CONF_VALUE_TEMPLATE): cv.template, } @@ -294,7 +296,6 @@ class MqttClimate( self._target_temp_high = None self._target_temp_low = None self._topic = None - self._unit_of_measurement = hass.config.units.temperature_unit self._value_templates = None self._setup_from_config(config) @@ -583,7 +584,9 @@ class MqttClimate( @property def temperature_unit(self): """Return the unit of measurement.""" - return self._unit_of_measurement + if self._config.get(CONF_TEMPERATURE_UNIT): + return self._config.get(CONF_TEMPERATURE_UNIT) + return self.hass.config.units.temperature_unit @property def current_temperature(self): diff --git a/tests/components/mqtt/test_climate.py b/tests/components/mqtt/test_climate.py index 03e22cd72e2e..1d485c4be133 100644 --- a/tests/components/mqtt/test_climate.py +++ b/tests/components/mqtt/test_climate.py @@ -793,6 +793,20 @@ async def test_temp_step_custom(hass, mqtt_mock): assert temp_step == 0.01 +async def test_temperature_unit(hass, mqtt_mock): + """Test that setting temperature unit converts temperature values.""" + config = copy.deepcopy(DEFAULT_CONFIG) + config["climate"]["temperature_unit"] = "F" + config["climate"]["current_temperature_topic"] = "current_temperature" + + assert await async_setup_component(hass, CLIMATE_DOMAIN, config) + + async_fire_mqtt_message(hass, "current_temperature", "77") + + state = hass.states.get(ENTITY_CLIMATE) + assert state.attributes.get("current_temperature") == 25 + + async def test_setting_attribute_via_mqtt_json_message(hass, mqtt_mock): """Test the setting of attribute via MQTT with JSON payload.""" await help_test_setting_attribute_via_mqtt_json_message( From 9f1bffe3be097017afc1140f2fd66f434df858ab Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 13:36:16 -0700 Subject: [PATCH 424/653] Add command to get integration manifests (#34262) * Add command to get integration manifests * Add is_built_in value to manifest * Update APIs --- .../components/websocket_api/commands.py | 75 +++++++++++-------- homeassistant/loader.py | 1 + .../components/websocket_api/test_commands.py | 44 +++++++++++ 3 files changed, 88 insertions(+), 32 deletions(-) diff --git a/homeassistant/components/websocket_api/commands.py b/homeassistant/components/websocket_api/commands.py index 3e43f824e69f..3de41bc89184 100644 --- a/homeassistant/components/websocket_api/commands.py +++ b/homeassistant/components/websocket_api/commands.py @@ -1,4 +1,6 @@ """Commands part of Websocket API.""" +import asyncio + import voluptuous as vol from homeassistant.auth.permissions.const import POLICY_READ @@ -8,6 +10,7 @@ from homeassistant.exceptions import HomeAssistantError, ServiceNotFound, Unauth from homeassistant.helpers import config_validation as cv from homeassistant.helpers.event import async_track_state_change from homeassistant.helpers.service import async_get_all_descriptions +from homeassistant.loader import IntegrationNotFound, async_get_integration from . import const, decorators, messages @@ -25,6 +28,8 @@ def async_register_commands(hass, async_reg): async_reg(hass, handle_get_config) async_reg(hass, handle_ping) async_reg(hass, handle_render_template) + async_reg(hass, handle_manifest_list) + async_reg(hass, handle_manifest_get) def pong_message(iden): @@ -40,10 +45,7 @@ def pong_message(iden): } ) def handle_subscribe_events(hass, connection, msg): - """Handle subscribe events command. - - Async friendly. - """ + """Handle subscribe events command.""" # Circular dep # pylint: disable=import-outside-toplevel from .permissions import SUBSCRIBE_WHITELIST @@ -90,10 +92,7 @@ def handle_subscribe_events(hass, connection, msg): } ) def handle_unsubscribe_events(hass, connection, msg): - """Handle unsubscribe events command. - - Async friendly. - """ + """Handle unsubscribe events command.""" subscription = msg["subscription"] if subscription in connection.subscriptions: @@ -117,10 +116,7 @@ def handle_unsubscribe_events(hass, connection, msg): ) @decorators.async_response async def handle_call_service(hass, connection, msg): - """Handle call service command. - - Async friendly. - """ + """Handle call service command.""" blocking = True if msg["domain"] == HASS_DOMAIN and msg["service"] in ["restart", "stop"]: blocking = False @@ -164,10 +160,7 @@ async def handle_call_service(hass, connection, msg): @callback @decorators.websocket_command({vol.Required("type"): "get_states"}) def handle_get_states(hass, connection, msg): - """Handle get states command. - - Async friendly. - """ + """Handle get states command.""" if connection.user.permissions.access_all_entities("read"): states = hass.states.async_all() else: @@ -184,10 +177,7 @@ def handle_get_states(hass, connection, msg): @decorators.websocket_command({vol.Required("type"): "get_services"}) @decorators.async_response async def handle_get_services(hass, connection, msg): - """Handle get services command. - - Async friendly. - """ + """Handle get services command.""" descriptions = await async_get_all_descriptions(hass) connection.send_message(messages.result_message(msg["id"], descriptions)) @@ -195,20 +185,44 @@ async def handle_get_services(hass, connection, msg): @callback @decorators.websocket_command({vol.Required("type"): "get_config"}) def handle_get_config(hass, connection, msg): - """Handle get config command. - - Async friendly. - """ + """Handle get config command.""" connection.send_message(messages.result_message(msg["id"], hass.config.as_dict())) +@decorators.websocket_command({vol.Required("type"): "manifest/list"}) +@decorators.async_response +async def handle_manifest_list(hass, connection, msg): + """Handle integrations command.""" + integrations = await asyncio.gather( + *[ + async_get_integration(hass, domain) + for domain in hass.config.components + # Filter out platforms. + if "." not in domain + ] + ) + connection.send_result( + msg["id"], [integration.manifest for integration in integrations] + ) + + +@decorators.websocket_command( + {vol.Required("type"): "manifest/get", vol.Required("integration"): str} +) +@decorators.async_response +async def handle_manifest_get(hass, connection, msg): + """Handle integrations command.""" + try: + integration = await async_get_integration(hass, msg["integration"]) + connection.send_result(msg["id"], integration.manifest) + except IntegrationNotFound: + connection.send_error(msg["id"], const.ERR_NOT_FOUND, "Integration not found") + + @callback @decorators.websocket_command({vol.Required("type"): "ping"}) def handle_ping(hass, connection, msg): - """Handle ping command. - - Async friendly. - """ + """Handle ping command.""" connection.send_message(pong_message(msg["id"])) @@ -222,10 +236,7 @@ def handle_ping(hass, connection, msg): } ) def handle_render_template(hass, connection, msg): - """Handle render_template command. - - Async friendly. - """ + """Handle render_template command.""" template = msg["template"] template.hass = hass diff --git a/homeassistant/loader.py b/homeassistant/loader.py index 3e82adeb2e26..3c7e46991274 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -205,6 +205,7 @@ class Integration: self.pkg_path = pkg_path self.file_path = file_path self.manifest = manifest + manifest["is_built_in"] = self.is_built_in _LOGGER.info("Loaded %s from %s", self.domain, pkg_path) @property diff --git a/tests/components/websocket_api/test_commands.py b/tests/components/websocket_api/test_commands.py index 58d904c8f4b0..3754767dd9e5 100644 --- a/tests/components/websocket_api/test_commands.py +++ b/tests/components/websocket_api/test_commands.py @@ -10,6 +10,7 @@ from homeassistant.components.websocket_api.auth import ( from homeassistant.components.websocket_api.const import URL from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError +from homeassistant.loader import async_get_integration from homeassistant.setup import async_setup_component from tests.common import async_mock_service @@ -467,3 +468,46 @@ async def test_render_template_returns_with_match_all( assert msg["id"] == 5 assert msg["type"] == const.TYPE_RESULT assert msg["success"] + + +async def test_manifest_list(hass, websocket_client): + """Test loading manifests.""" + http = await async_get_integration(hass, "http") + websocket_api = await async_get_integration(hass, "websocket_api") + + await websocket_client.send_json({"id": 5, "type": "manifest/list"}) + + msg = await websocket_client.receive_json() + assert msg["id"] == 5 + assert msg["type"] == const.TYPE_RESULT + assert msg["success"] + assert sorted(msg["result"], key=lambda manifest: manifest["domain"]) == [ + http.manifest, + websocket_api.manifest, + ] + + +async def test_manifest_get(hass, websocket_client): + """Test getting a manifest.""" + hue = await async_get_integration(hass, "hue") + + await websocket_client.send_json( + {"id": 6, "type": "manifest/get", "integration": "hue"} + ) + + msg = await websocket_client.receive_json() + assert msg["id"] == 6 + assert msg["type"] == const.TYPE_RESULT + assert msg["success"] + assert msg["result"] == hue.manifest + + # Non existing + await websocket_client.send_json( + {"id": 7, "type": "manifest/get", "integration": "non_existing"} + ) + + msg = await websocket_client.receive_json() + assert msg["id"] == 7 + assert msg["type"] == const.TYPE_RESULT + assert not msg["success"] + assert msg["error"]["code"] == "not_found" From 72cc656b7e116c7cc38bbbae0e4919d60a67451b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 13:53:52 -0700 Subject: [PATCH 425/653] Add Translations 2.0 migrate script (#34261) --- script/translations/clean.py | 7 ++--- script/translations/lokalise.py | 17 ++++++++++- script/translations/migrate.py | 50 +++++++++++++++++++++++++++++++++ script/translations/util.py | 4 ++- 4 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 script/translations/migrate.py diff --git a/script/translations/clean.py b/script/translations/clean.py index 51afbae1caee..348b8ca6c4d9 100644 --- a/script/translations/clean.py +++ b/script/translations/clean.py @@ -1,9 +1,8 @@ """Find translation keys that are in Lokalise but no longer defined in source.""" import json -from .const import INTEGRATIONS_DIR, PROJECT_ID -from .lokalise import Lokalise -from .util import get_lokalise_token +from .const import INTEGRATIONS_DIR +from .lokalise import get_api def find_extra(base, translations, path_prefix, missing_keys): @@ -50,7 +49,7 @@ def run(): print("No missing translations!") return - lokalise = Lokalise(PROJECT_ID, get_lokalise_token()) + lokalise = get_api() to_delete = [] diff --git a/script/translations/lokalise.py b/script/translations/lokalise.py index 67bd1bc56000..bcb9ecac32d1 100644 --- a/script/translations/lokalise.py +++ b/script/translations/lokalise.py @@ -1,6 +1,14 @@ """API for Lokalise.""" import requests +from .const import PROJECT_ID +from .util import get_lokalise_token + + +def get_api() -> "Lokalise": + """Get Lokalise API.""" + return Lokalise(PROJECT_ID, get_lokalise_token()) + class Lokalise: """Lokalise API.""" @@ -28,7 +36,7 @@ class Lokalise: return req.json() def keys_list(self, params={}): - """Fetch key ID from a name. + """List keys. https://app.lokalise.com/api2docs/curl/#transition-list-all-keys-get """ @@ -40,3 +48,10 @@ class Lokalise: https://app.lokalise.com/api2docs/curl/#transition-delete-multiple-keys-delete """ return self.request("DELETE", "keys", {"keys": key_ids}) + + def keys_bulk_update(self, updates): + """Update multiple keys. + + https://app.lokalise.com/api2docs/curl/#transition-bulk-update-put + """ + return self.request("PUT", "keys", {"keys": updates}) diff --git a/script/translations/migrate.py b/script/translations/migrate.py new file mode 100644 index 000000000000..644bfec5b303 --- /dev/null +++ b/script/translations/migrate.py @@ -0,0 +1,50 @@ +"""Migrate things.""" +import json +from pprint import pprint + +from .const import INTEGRATIONS_DIR +from .lokalise import get_api + +MIGRATED = {} + + +def run(): + """Migrate translations.""" + to_migrate = {} + + for integration in INTEGRATIONS_DIR.iterdir(): + strings_file = integration / "strings.json" + if not strings_file.is_file(): + continue + + if integration.name in MIGRATED: + continue + + strings = json.loads(strings_file.read_text()) + + if "title" in strings: + from_key = f"component::{integration.name}::config::title" + to_key = f"component::{integration.name}::title" + to_migrate[from_key] = to_key + + updates = [] + + lokalise = get_api() + + print("Gathering IDs") + + for from_key, to_key in to_migrate.items(): + key_data = lokalise.keys_list({"filter_keys": from_key}) + if len(key_data) != 1: + print( + f"Lookin up {from_key} key in Lokalise returns {len(key_data)} results, expected 1" + ) + continue + + updates.append({"key_id": key_data[0]["key_id"], "key_name": to_key}) + + pprint(updates) + + print() + print("Updating keys") + pprint(lokalise.keys_bulk_update(updates).json()) diff --git a/script/translations/util.py b/script/translations/util.py index ca747678139d..02a7d577e668 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -11,7 +11,9 @@ def get_base_arg_parser(): """Get a base argument parser.""" parser = argparse.ArgumentParser(description="Home Assistant Translations") parser.add_argument( - "action", type=str, choices=["download", "clean", "upload", "develop"] + "action", + type=str, + choices=["download", "clean", "upload", "develop", "migrate"], ) parser.add_argument("--debug", action="store_true", help="Enable log output") return parser From 5bfc1f3d4d6e43bc02a127ac773d6cc45556bf03 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Thu, 16 Apr 2020 00:03:14 +0300 Subject: [PATCH 426/653] Removed uncaught exceptions from Dyson (#34112) * fixed what seems to be a typo * added load_mock_device in common.py so it loads all the required things into the mocks so they don't throw exceptions for mocks not being able to convert to int * reverted change in homeassistant/components/dyson/sensor.py added both values to the mock device (volatil and volatile) --- tests/components/dyson/common.py | 25 ++++++++++++++++ tests/components/dyson/test_air_quality.py | 6 ++-- tests/components/dyson/test_climate.py | 33 +++++++--------------- tests/components/dyson/test_fan.py | 24 +++------------- tests/components/dyson/test_init.py | 8 ++++-- tests/components/dyson/test_sensor.py | 20 ++++--------- tests/ignore_uncaught_exceptions.py | 30 -------------------- 7 files changed, 52 insertions(+), 94 deletions(-) create mode 100644 tests/components/dyson/common.py diff --git a/tests/components/dyson/common.py b/tests/components/dyson/common.py new file mode 100644 index 000000000000..b78e7d582834 --- /dev/null +++ b/tests/components/dyson/common.py @@ -0,0 +1,25 @@ +"""Common utils for Dyson tests.""" + +from unittest import mock + +from libpurecool.dyson_pure_cool import FanSpeed + + +def load_mock_device(device): + """Load the mock with default values so it doesn't throw errors.""" + device.serial = "XX-XXXXX-XX" + device.name = "Temp Name" + device.connect = mock.Mock(return_value=True) + device.auto_connect = mock.Mock(return_value=True) + device.environmental_state.particulate_matter_25 = "0000" + device.environmental_state.particulate_matter_10 = "0000" + device.environmental_state.nitrogen_dioxide = "0000" + device.environmental_state.volatil_organic_compounds = "0000" + device.environmental_state.volatile_organic_compounds = "0000" + device.environmental_state.temperature = 250 + device.state.hepa_filter_state = 0 + device.state.carbon_filter_state = 0 + device.state.speed = FanSpeed.FAN_SPEED_1.value + device.state.oscillation_angle_low = "000" + device.state.oscillation_angle_high = "000" + device.state.filter_life = "000" diff --git a/tests/components/dyson/test_air_quality.py b/tests/components/dyson/test_air_quality.py index ed2fbed34f3d..fcd801616c95 100644 --- a/tests/components/dyson/test_air_quality.py +++ b/tests/components/dyson/test_air_quality.py @@ -17,14 +17,14 @@ import homeassistant.components.dyson.air_quality as dyson from homeassistant.helpers import discovery from homeassistant.setup import async_setup_component +from .common import load_mock_device + def _get_dyson_purecool_device(): """Return a valid device as provided by the Dyson web services.""" device = mock.Mock(spec=DysonPureCool) - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.name = "Living room" - device.connect = mock.Mock(return_value=True) - device.auto_connect = mock.Mock(return_value=True) device.environmental_state.particulate_matter_25 = "0014" device.environmental_state.particulate_matter_10 = "0025" device.environmental_state.nitrogen_dioxide = "0042" diff --git a/tests/components/dyson/test_climate.py b/tests/components/dyson/test_climate.py index dbc477203a1a..345eae6f5530 100644 --- a/tests/components/dyson/test_climate.py +++ b/tests/components/dyson/test_climate.py @@ -3,7 +3,7 @@ import unittest from unittest import mock import asynctest -from libpurecool.const import FocusMode, HeatMode, HeatState, HeatTarget, TiltState +from libpurecool.const import FocusMode, HeatMode, HeatState, HeatTarget from libpurecool.dyson_pure_hotcool_link import DysonPureHotCoolLink from libpurecool.dyson_pure_state import DysonPureHotCoolState @@ -12,6 +12,8 @@ from homeassistant.components.dyson import climate as dyson from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS from homeassistant.setup import async_setup_component +from .common import load_mock_device + from tests.common import get_test_home_assistant @@ -41,7 +43,7 @@ def _get_config(): def _get_device_with_no_state(): """Return a device with no state.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" + load_mock_device(device) device.state = None device.environmental_state = None return device @@ -50,16 +52,14 @@ def _get_device_with_no_state(): def _get_device_off(): """Return a device with state off.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" - device.state = mock.Mock() - device.environmental_state = mock.Mock() + load_mock_device(device) return device def _get_device_focus(): """Return a device with fan state of focus mode.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" + load_mock_device(device) device.state.focus_mode = FocusMode.FOCUS_ON.value return device @@ -67,7 +67,7 @@ def _get_device_focus(): def _get_device_diffuse(): """Return a device with fan state of diffuse mode.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" + load_mock_device(device) device.state.focus_mode = FocusMode.FOCUS_OFF.value return device @@ -75,41 +75,28 @@ def _get_device_diffuse(): def _get_device_cool(): """Return a device with state of cooling.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" - device.serial = "XX-XXXXX-XX" - device.state.tilt = TiltState.TILT_FALSE.value + load_mock_device(device) device.state.focus_mode = FocusMode.FOCUS_OFF.value device.state.heat_target = HeatTarget.celsius(12) device.state.heat_mode = HeatMode.HEAT_OFF.value device.state.heat_state = HeatState.HEAT_STATE_OFF.value - device.environmental_state.temperature = 288 - device.environmental_state.humidity = 53 return device def _get_device_heat_off(): """Return a device with state of heat reached target.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" - device.state = mock.Mock() - device.state.tilt = TiltState.TILT_FALSE.value - device.state.focus_mode = FocusMode.FOCUS_ON.value - device.state.heat_target = HeatTarget.celsius(20) + load_mock_device(device) device.state.heat_mode = HeatMode.HEAT_ON.value device.state.heat_state = HeatState.HEAT_STATE_OFF.value - device.environmental_state.temperature = 293 - device.environmental_state.humidity = 53 return device def _get_device_heat_on(): """Return a device with state of heating.""" device = mock.Mock(spec=DysonPureHotCoolLink) - device.name = "Device_name" + load_mock_device(device) device.serial = "YY-YYYYY-YY" - device.state = mock.Mock() - device.state.tilt = TiltState.TILT_FALSE.value - device.state.focus_mode = FocusMode.FOCUS_ON.value device.state.heat_target = HeatTarget.celsius(23) device.state.heat_mode = HeatMode.HEAT_ON.value device.state.heat_state = HeatState.HEAT_STATE_ON.value diff --git a/tests/components/dyson/test_fan.py b/tests/components/dyson/test_fan.py index 367a86eabb4d..7801c897723d 100644 --- a/tests/components/dyson/test_fan.py +++ b/tests/components/dyson/test_fan.py @@ -26,6 +26,8 @@ from homeassistant.const import ATTR_ENTITY_ID, SERVICE_TURN_OFF, SERVICE_TURN_O from homeassistant.helpers import discovery from homeassistant.setup import async_setup_component +from .common import load_mock_device + from tests.common import get_test_home_assistant @@ -40,37 +42,19 @@ class MockDysonState(DysonPureCoolState): def _get_dyson_purecool_device(): """Return a valid device as provided by the Dyson web services.""" device = mock.Mock(spec=DysonPureCool) - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.name = "Living room" - device.connect = mock.Mock(return_value=True) - device.auto_connect = mock.Mock(return_value=True) - device.state = mock.Mock() - device.state.oscillation = "OION" - device.state.fan_power = "ON" - device.state.speed = FanSpeed.FAN_SPEED_AUTO.value - device.state.night_mode = "OFF" - device.state.auto_mode = "ON" - device.state.oscillation_angle_low = "0090" - device.state.oscillation_angle_high = "0180" - device.state.front_direction = "ON" - device.state.sleep_timer = 60 - device.state.hepa_filter_state = "0090" - device.state.carbon_filter_state = "0080" return device def _get_dyson_purecoollink_device(): """Return a valid device as provided by the Dyson web services.""" device = mock.Mock(spec=DysonPureCoolLink) - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.name = "Living room" - device.connect = mock.Mock(return_value=True) - device.auto_connect = mock.Mock(return_value=True) - device.state = mock.Mock() device.state.oscillation = "ON" device.state.fan_mode = "FAN" device.state.speed = FanSpeed.FAN_SPEED_AUTO.value - device.state.night_mode = "OFF" return device diff --git a/tests/components/dyson/test_init.py b/tests/components/dyson/test_init.py index 067f6a360ed6..37cc69b6765d 100644 --- a/tests/components/dyson/test_init.py +++ b/tests/components/dyson/test_init.py @@ -4,13 +4,15 @@ from unittest import mock from homeassistant.components import dyson +from .common import load_mock_device + from tests.common import get_test_home_assistant def _get_dyson_account_device_available(): """Return a valid device provide by Dyson web services.""" device = mock.Mock() - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.connect = mock.Mock(return_value=True) device.auto_connect = mock.Mock(return_value=True) return device @@ -19,7 +21,7 @@ def _get_dyson_account_device_available(): def _get_dyson_account_device_not_available(): """Return an invalid device provide by Dyson web services.""" device = mock.Mock() - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.connect = mock.Mock(return_value=False) device.auto_connect = mock.Mock(return_value=False) return device @@ -28,7 +30,7 @@ def _get_dyson_account_device_not_available(): def _get_dyson_account_device_error(): """Return an invalid device raising OSError while connecting.""" device = mock.Mock() - device.serial = "XX-XXXXX-XX" + load_mock_device(device) device.connect = mock.Mock(side_effect=OSError("Network error")) return device diff --git a/tests/components/dyson/test_sensor.py b/tests/components/dyson/test_sensor.py index 6dd29741153b..4d3d1c961016 100644 --- a/tests/components/dyson/test_sensor.py +++ b/tests/components/dyson/test_sensor.py @@ -18,20 +18,15 @@ from homeassistant.const import ( from homeassistant.helpers import discovery from homeassistant.setup import async_setup_component +from .common import load_mock_device + from tests.common import get_test_home_assistant def _get_dyson_purecool_device(): """Return a valid device provide by Dyson web services.""" device = mock.Mock(spec=DysonPureCool) - device.serial = "XX-XXXXX-XX" - device.name = "Living room" - device.connect = mock.Mock(return_value=True) - device.auto_connect = mock.Mock(return_value=True) - device.environmental_state.humidity = 42 - device.environmental_state.temperature = 280 - device.state.hepa_filter_state = 90 - device.state.carbon_filter_state = 80 + load_mock_device(device) return device @@ -61,10 +56,9 @@ def _get_device_without_state(): def _get_with_state(): """Return a valid device with state values.""" device = mock.Mock() + load_mock_device(device) device.name = "Device_name" - device.state = mock.Mock() device.state.filter_life = 100 - device.environmental_state = mock.Mock() device.environmental_state.dust = 5 device.environmental_state.humidity = 45 device.environmental_state.temperature = 295 @@ -76,14 +70,10 @@ def _get_with_state(): def _get_with_standby_monitoring(): """Return a valid device with state but with standby monitoring disable.""" device = mock.Mock() + load_mock_device(device) device.name = "Device_name" - device.state = mock.Mock() - device.state.filter_life = 100 - device.environmental_state = mock.Mock() - device.environmental_state.dust = 5 device.environmental_state.humidity = 0 device.environmental_state.temperature = 0 - device.environmental_state.volatil_organic_compounds = 2 return device diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 3b569ebaedd2..8e6004d362e1 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -1,35 +1,5 @@ """List of modules that have uncaught exceptions today. Will be shrunk over time.""" IGNORE_UNCAUGHT_EXCEPTIONS = [ - ("tests.components.dyson.test_air_quality", "test_purecool_aiq_attributes"), - ("tests.components.dyson.test_air_quality", "test_purecool_aiq_update_state"), - ( - "tests.components.dyson.test_air_quality", - "test_purecool_component_setup_only_once", - ), - ("tests.components.dyson.test_air_quality", "test_purecool_aiq_without_discovery"), - ( - "tests.components.dyson.test_air_quality", - "test_purecool_aiq_empty_environment_state", - ), - ( - "tests.components.dyson.test_climate", - "test_setup_component_with_parent_discovery", - ), - ("tests.components.dyson.test_fan", "test_purecoollink_attributes"), - ("tests.components.dyson.test_fan", "test_purecool_turn_on"), - ("tests.components.dyson.test_fan", "test_purecool_set_speed"), - ("tests.components.dyson.test_fan", "test_purecool_turn_off"), - ("tests.components.dyson.test_fan", "test_purecool_set_dyson_speed"), - ("tests.components.dyson.test_fan", "test_purecool_oscillate"), - ("tests.components.dyson.test_fan", "test_purecool_set_night_mode"), - ("tests.components.dyson.test_fan", "test_purecool_set_auto_mode"), - ("tests.components.dyson.test_fan", "test_purecool_set_angle"), - ("tests.components.dyson.test_fan", "test_purecool_set_flow_direction_front"), - ("tests.components.dyson.test_fan", "test_purecool_set_timer"), - ("tests.components.dyson.test_fan", "test_purecool_update_state"), - ("tests.components.dyson.test_fan", "test_purecool_update_state_filter_inv"), - ("tests.components.dyson.test_fan", "test_purecool_component_setup_only_once"), - ("tests.components.dyson.test_sensor", "test_purecool_component_setup_only_once"), ("tests.components.ios.test_init", "test_creating_entry_sets_up_sensor"), ("tests.components.ios.test_init", "test_not_configuring_ios_not_creates_entry"), ("tests.components.local_file.test_camera", "test_file_not_readable"), From d011b469852c05c63f26c14c543f3e26f29402e1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 15:32:10 -0700 Subject: [PATCH 427/653] Patch http.client to not do I/O in the event loop (#34194) --- homeassistant/block_async_io.py | 14 ++++++ homeassistant/core.py | 5 +- homeassistant/util/async_.py | 66 ++++++++++++++++++++++++++- tests/util/test_async.py | 81 ++++++++++++++++++++++++++++++++- 4 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 homeassistant/block_async_io.py diff --git a/homeassistant/block_async_io.py b/homeassistant/block_async_io.py new file mode 100644 index 000000000000..cd33a4207a88 --- /dev/null +++ b/homeassistant/block_async_io.py @@ -0,0 +1,14 @@ +"""Block I/O being done in asyncio.""" +from http.client import HTTPConnection + +from homeassistant.util.async_ import protect_loop + + +def enable() -> None: + """Enable the detection of I/O in the event loop.""" + # Prevent urllib3 and requests doing I/O in event loop + HTTPConnection.putrequest = protect_loop(HTTPConnection.putrequest) + + # Currently disabled. pytz doing I/O when getting timezone. + # Prevent files being opened inside the event loop + # builtins.open = protect_loop(builtins.open) diff --git a/homeassistant/core.py b/homeassistant/core.py index d35e7f48cc73..2553dbea74ea 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -36,7 +36,7 @@ from async_timeout import timeout import attr import voluptuous as vol -from homeassistant import loader, util +from homeassistant import block_async_io, loader, util from homeassistant.const import ( ATTR_DOMAIN, ATTR_FRIENDLY_NAME, @@ -77,6 +77,9 @@ if TYPE_CHECKING: from homeassistant.config_entries import ConfigEntries from homeassistant.components.http import HomeAssistantHTTP + +block_async_io.enable() + # pylint: disable=invalid-name T = TypeVar("T") CALLABLE_T = TypeVar("CALLABLE_T", bound=Callable) diff --git a/homeassistant/util/async_.py b/homeassistant/util/async_.py index 212c2bff9106..5785759d591d 100644 --- a/homeassistant/util/async_.py +++ b/homeassistant/util/async_.py @@ -1,9 +1,11 @@ """Asyncio backports for Python 3.6 compatibility.""" -from asyncio import coroutines, ensure_future +from asyncio import coroutines, ensure_future, get_running_loop from asyncio.events import AbstractEventLoop import concurrent.futures +import functools import logging import threading +from traceback import extract_stack from typing import Any, Callable, Coroutine _LOGGER = logging.getLogger(__name__) @@ -55,3 +57,65 @@ def run_callback_threadsafe( loop.call_soon_threadsafe(run_callback) return future + + +def check_loop() -> None: + """Warn if called inside the event loop.""" + try: + get_running_loop() + in_loop = True + except RuntimeError: + in_loop = False + + if not in_loop: + return + + found_frame = None + + for frame in reversed(extract_stack()): + for path in ("custom_components/", "homeassistant/components/"): + try: + index = frame.filename.index(path) + found_frame = frame + break + except ValueError: + continue + + if found_frame is not None: + break + + # Did not source from integration? Hard error. + if found_frame is None: + raise RuntimeError( + "Detected I/O inside the event loop. This is causing stability issues. Please report issue" + ) + + start = index + len(path) + end = found_frame.filename.index("/", start) + + integration = found_frame.filename[start:end] + + if path == "custom_components/": + extra = " to the custom component author" + else: + extra = "" + + _LOGGER.warning( + "Detected I/O inside the event loop. This is causing stability issues. Please report issue%s for %s doing I/O at %s, line %s: %s", + extra, + integration, + found_frame.filename[index:], + found_frame.lineno, + found_frame.line.strip(), + ) + + +def protect_loop(func: Callable) -> Callable: + """Protect function from running in event loop.""" + + @functools.wraps(func) + def protected_loop_func(*args, **kwargs): # type: ignore + check_loop() + return func(*args, **kwargs) + + return protected_loop_func diff --git a/tests/util/test_async.py b/tests/util/test_async.py index 098b04a30486..33280895ba2f 100644 --- a/tests/util/test_async.py +++ b/tests/util/test_async.py @@ -1,7 +1,7 @@ """Tests for async util methods from Python source.""" import asyncio from unittest import TestCase -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock, Mock, patch import pytest @@ -165,3 +165,82 @@ class RunThreadsafeTests(TestCase): with self.assertRaises(ValueError) as exc_context: self.loop.run_until_complete(future) self.assertIn("Invalid!", exc_context.exception.args) + + +async def test_check_loop_async(): + """Test check_loop detects when called from event loop without integration context.""" + with pytest.raises(RuntimeError): + hasync.check_loop() + + +async def test_check_loop_async_integration(caplog): + """Test check_loop detects when called from event loop from integration context.""" + with patch( + "homeassistant.util.async_.extract_stack", + return_value=[ + Mock( + filename="/home/paulus/homeassistant/core.py", + lineno="23", + line="do_something()", + ), + Mock( + filename="/home/paulus/homeassistant/components/hue/light.py", + lineno="23", + line="self.light.is_on", + ), + Mock( + filename="/home/paulus/aiohue/lights.py", + lineno="2", + line="something()", + ), + ], + ): + hasync.check_loop() + assert ( + "Detected I/O inside the event loop. This is causing stability issues. Please report issue for hue doing I/O at homeassistant/components/hue/light.py, line 23: self.light.is_on" + in caplog.text + ) + + +async def test_check_loop_async_custom(caplog): + """Test check_loop detects when called from event loop with custom component context.""" + with patch( + "homeassistant.util.async_.extract_stack", + return_value=[ + Mock( + filename="/home/paulus/homeassistant/core.py", + lineno="23", + line="do_something()", + ), + Mock( + filename="/home/paulus/config/custom_components/hue/light.py", + lineno="23", + line="self.light.is_on", + ), + Mock( + filename="/home/paulus/aiohue/lights.py", + lineno="2", + line="something()", + ), + ], + ): + hasync.check_loop() + assert ( + "Detected I/O inside the event loop. This is causing stability issues. Please report issue to the custom component author for hue doing I/O at custom_components/hue/light.py, line 23: self.light.is_on" + in caplog.text + ) + + +def test_check_loop_sync(caplog): + """Test check_loop does nothing when called from thread.""" + hasync.check_loop() + assert "Detected I/O inside the event loop" not in caplog.text + + +def test_protect_loop_sync(): + """Test protect_loop calls check_loop.""" + calls = [] + with patch("homeassistant.util.async_.check_loop") as mock_loop: + hasync.protect_loop(calls.append)(1) + assert len(mock_loop.mock_calls) == 1 + assert calls == [1] From 1ffc3a00e77b9794d6a36cffd2ef5ede7463a014 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 15 Apr 2020 16:58:20 -0700 Subject: [PATCH 428/653] Add translations check script (#34272) --- .pre-commit-config.yaml | 2 +- homeassistant/components/deconz/strings.json | 2 +- homeassistant/components/unifi/strings.json | 3 - script/hassfest/__main__.py | 4 +- script/hassfest/json.py | 29 ------- script/hassfest/translations.py | 90 ++++++++++++++++++++ script/translations/__main__.py | 4 +- script/translations/clean.py | 2 + script/translations/develop.py | 2 + script/translations/download.py | 2 + script/translations/migrate.py | 2 + script/translations/upload.py | 2 + script/translations/util.py | 2 +- 13 files changed, 106 insertions(+), 40 deletions(-) delete mode 100644 script/hassfest/json.py create mode 100644 script/hassfest/translations.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4bc8a956f1c0..5ec14e9ab6a4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -88,4 +88,4 @@ repos: pass_filenames: false language: script types: [json] - files: ^homeassistant/.+/manifest\.json$ + files: ^homeassistant/.+/(manifest|strings)\.json$ diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index 2293be4b247d..ab2d21195fbb 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -84,7 +84,7 @@ "close": "Close", "both_buttons": "Both buttons", "top_buttons": "Top buttons", - "bottom_buttons" : "Bottom buttons", + "bottom_buttons": "Bottom buttons", "button_1": "First button", "button_2": "Second button", "button_3": "Third button", diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index cb7767eba129..50f29de9104b 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -57,8 +57,5 @@ "title": "UniFi options 3/3" } } - }, - "error": { - "unknown_client_mac": "No client available in UniFi on that MAC address" } } diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index a1541ef68c9d..7c86a1ca6c45 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -8,16 +8,15 @@ from . import ( config_flow, coverage, dependencies, - json, manifest, services, ssdp, + translations, zeroconf, ) from .model import Config, Integration PLUGINS = [ - json, codeowners, config_flow, coverage, @@ -25,6 +24,7 @@ PLUGINS = [ manifest, services, ssdp, + translations, zeroconf, ] diff --git a/script/hassfest/json.py b/script/hassfest/json.py deleted file mode 100644 index 73b6c372b4f5..000000000000 --- a/script/hassfest/json.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Validate integration JSON files.""" -import json -from typing import Dict - -from .model import Integration - - -def validate_json_files(integration: Integration): - """Validate JSON files for integration.""" - for json_file in integration.path.glob("**/*.json"): - if not json_file.is_file(): - continue - - try: - json.loads(json_file.read_text()) - except json.JSONDecodeError: - relative_path = json_file.relative_to(integration.path) - integration.add_error("json", f"Invalid JSON file {relative_path}") - - return - - -def validate(integrations: Dict[str, Integration], config): - """Handle JSON files inside integrations.""" - for integration in integrations.values(): - if not integration.manifest: - continue - - validate_json_files(integration) diff --git a/script/hassfest/translations.py b/script/hassfest/translations.py new file mode 100644 index 000000000000..f55e793ad923 --- /dev/null +++ b/script/hassfest/translations.py @@ -0,0 +1,90 @@ +"""Validate integration translation files.""" +import json +from typing import Dict + +import voluptuous as vol +from voluptuous.humanize import humanize_error + +from .model import Integration + + +def data_entry_schema(*, require_title: bool, require_step_title: bool): + """Generate a data entry schema.""" + step_title_class = vol.Required if require_step_title else vol.Optional + data_entry_schema = { + vol.Optional("flow_title"): str, + vol.Required("step"): { + str: { + step_title_class("title"): str, + vol.Optional("description"): str, + vol.Optional("data"): {str: str}, + } + }, + vol.Optional("error"): {str: str}, + vol.Optional("abort"): {str: str}, + vol.Optional("create_entry"): {str: str}, + } + if require_title: + data_entry_schema[vol.Required("title")] = str + + return data_entry_schema + + +STRINGS_SCHEMA = vol.Schema( + { + vol.Optional("title"): str, + vol.Optional("config"): data_entry_schema( + require_title=False, require_step_title=True + ), + vol.Optional("options"): data_entry_schema( + require_title=False, require_step_title=False + ), + vol.Optional("device_automation"): { + vol.Optional("action_type"): {str: str}, + vol.Optional("condition_type"): {str: str}, + vol.Optional("trigger_type"): {str: str}, + vol.Optional("trigger_subtype"): {str: str}, + }, + vol.Optional("state"): {str: str}, + } +) + +AUTH_SCHEMA = vol.Schema( + { + vol.Optional("mfa_setup"): { + str: data_entry_schema(require_title=True, require_step_title=True) + } + } +) + +ONBOARDING_SCHEMA = vol.Schema({vol.Required("area"): {str: str}}) + + +def validate_translation_file(integration: Integration): + """Validate translation files for integration.""" + strings_file = integration.path / "strings.json" + + if not strings_file.is_file(): + return + + strings = json.loads(strings_file.read_text()) + + if integration.domain == "auth": + schema = AUTH_SCHEMA + elif integration.domain == "onboarding": + schema = ONBOARDING_SCHEMA + else: + schema = STRINGS_SCHEMA + + try: + schema(strings) + except vol.Invalid as err: + integration.add_error( + "translations", f"Invalid strings.json: {humanize_error(strings, err)}" + ) + + +def validate(integrations: Dict[str, Integration], config): + """Handle JSON files inside integrations.""" + for integration in integrations.values(): + validate_translation_file(integration) diff --git a/script/translations/__main__.py b/script/translations/__main__.py index 3b64b4168c21..52a390381070 100644 --- a/script/translations/__main__.py +++ b/script/translations/__main__.py @@ -21,9 +21,7 @@ def main(): args = get_arguments() module = importlib.import_module(f".{args.action}", "script.translations") - module.run() - - return 0 + return module.run() if __name__ == "__main__": diff --git a/script/translations/clean.py b/script/translations/clean.py index 348b8ca6c4d9..57e23bee9dfb 100644 --- a/script/translations/clean.py +++ b/script/translations/clean.py @@ -68,3 +68,5 @@ def run(): print("Deleting keys:", ", ".join(map(str, to_delete))) print(lokalise.keys_delete_multiple(to_delete)) + + return 0 diff --git a/script/translations/develop.py b/script/translations/develop.py index 27f3a8843359..8886debd5551 100644 --- a/script/translations/develop.py +++ b/script/translations/develop.py @@ -61,3 +61,5 @@ def run(): ) download.write_integration_translations() + + return 0 diff --git a/script/translations/download.py b/script/translations/download.py index 2191a8195a8d..e6e4415f16d1 100755 --- a/script/translations/download.py +++ b/script/translations/download.py @@ -149,3 +149,5 @@ def run(): run_download_docker() write_integration_translations() + + return 0 diff --git a/script/translations/migrate.py b/script/translations/migrate.py index 644bfec5b303..7026aef2840c 100644 --- a/script/translations/migrate.py +++ b/script/translations/migrate.py @@ -48,3 +48,5 @@ def run(): print() print("Updating keys") pprint(lokalise.keys_bulk_update(updates).json()) + + return 0 diff --git a/script/translations/upload.py b/script/translations/upload.py index cf14ffa3cf9e..ecd9ec405df1 100755 --- a/script/translations/upload.py +++ b/script/translations/upload.py @@ -82,3 +82,5 @@ def run(): LOCAL_FILE.write_text(json.dumps(translations, indent=4, sort_keys=True)) run_upload_docker() + + return 0 diff --git a/script/translations/util.py b/script/translations/util.py index 02a7d577e668..ad415481e8e5 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -13,7 +13,7 @@ def get_base_arg_parser(): parser.add_argument( "action", type=str, - choices=["download", "clean", "upload", "develop", "migrate"], + choices=["clean", "develop", "download", "migrate", "upload"], ) parser.add_argument("--debug", action="store_true", help="Enable log output") return parser From 0d8c75d9ce8929d9eb73850677260e3a217a0777 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 16 Apr 2020 00:04:36 +0000 Subject: [PATCH 429/653] [ci skip] Translation update --- .../components/braviatv/.translations/de.json | 39 ++++++++++++++ .../components/braviatv/.translations/it.json | 39 ++++++++++++++ .../components/braviatv/.translations/ru.json | 39 ++++++++++++++ .../components/deconz/.translations/it.json | 2 + .../components/doorbird/.translations/it.json | 5 +- .../components/flume/.translations/it.json | 25 +++++++++ .../flunearyou/.translations/it.json | 21 ++++++++ .../components/gios/.translations/en.json | 2 +- .../components/hue/.translations/it.json | 17 +++++++ .../components/ipp/.translations/it.json | 35 +++++++++++++ .../components/ipp/.translations/ru.json | 2 + .../konnected/.translations/it.json | 8 ++- .../components/light/.translations/de.json | 1 + .../components/light/.translations/it.json | 1 + .../components/local_ip/.translations/it.json | 3 +- .../components/nut/.translations/it.json | 51 +++++++++++++++++++ .../components/roomba/.translations/it.json | 33 ++++++++++++ .../smartthings/.translations/de.json | 21 ++++++-- .../smartthings/.translations/it.json | 27 ++++++++-- .../smartthings/.translations/ru.json | 27 ++++++++-- .../synology_dsm/.translations/it.json | 38 ++++++++++++++ .../components/tado/.translations/de.json | 3 ++ .../components/tado/.translations/it.json | 35 +++++++++++++ .../totalconnect/.translations/de.json | 3 ++ .../totalconnect/.translations/it.json | 20 ++++++++ .../components/tradfri/.translations/en.json | 2 +- .../components/unifi/.translations/it.json | 3 +- .../components/vera/.translations/it.json | 32 ++++++++++++ .../components/vizio/.translations/it.json | 16 +++--- .../components/wled/.translations/de.json | 16 +++--- .../components/wled/.translations/it.json | 16 +++--- .../components/wled/.translations/ru.json | 16 +++--- 32 files changed, 550 insertions(+), 48 deletions(-) create mode 100644 homeassistant/components/braviatv/.translations/de.json create mode 100644 homeassistant/components/braviatv/.translations/it.json create mode 100644 homeassistant/components/braviatv/.translations/ru.json create mode 100644 homeassistant/components/flume/.translations/it.json create mode 100644 homeassistant/components/flunearyou/.translations/it.json create mode 100644 homeassistant/components/ipp/.translations/it.json create mode 100644 homeassistant/components/nut/.translations/it.json create mode 100644 homeassistant/components/roomba/.translations/it.json create mode 100644 homeassistant/components/synology_dsm/.translations/it.json create mode 100644 homeassistant/components/tado/.translations/it.json create mode 100644 homeassistant/components/totalconnect/.translations/it.json create mode 100644 homeassistant/components/vera/.translations/it.json diff --git a/homeassistant/components/braviatv/.translations/de.json b/homeassistant/components/braviatv/.translations/de.json new file mode 100644 index 000000000000..e1735d815172 --- /dev/null +++ b/homeassistant/components/braviatv/.translations/de.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "Dieser Fernseher ist bereits konfiguriert." + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen, ung\u00fcltiger Host- oder PIN-Code.", + "invalid_host": "Ung\u00fcltiger Hostname oder IP-Adresse", + "unsupported_model": "Ihr TV-Modell wird nicht unterst\u00fctzt." + }, + "step": { + "authorize": { + "data": { + "pin": "PIN Code" + }, + "description": "Geben Sie den auf dem Sony Bravia-Fernseher angezeigten PIN-Code ein. \n\nWenn der PIN-Code nicht angezeigt wird, m\u00fcssen Sie die Registrierung von Home Assistant auf Ihrem Fernseher aufheben, gehen Sie daf\u00fcr zu: Einstellungen -> Netzwerk -> Remote - Ger\u00e4teeinstellungen -> Registrierung des entfernten Ger\u00e4ts aufheben.", + "title": "Autorisieren Sie Sony Bravia TV" + }, + "user": { + "data": { + "host": "TV-Hostname oder IP-Adresse" + }, + "description": "Richten Sie die Sony Bravia TV-Integration ein. Wenn Sie Probleme mit der Konfiguration haben, gehen Sie zu: https://www.home-assistant.io/integrations/braviatv \n\n Stellen Sie sicher, dass Ihr Fernseher eingeschaltet ist.", + "title": "Sony Bravia TV" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Liste der ignorierten Quellen" + }, + "title": "Optionen f\u00fcr Sony Bravia TV" + } + } + }, + "title": "Sony Bravia TV" +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/it.json b/homeassistant/components/braviatv/.translations/it.json new file mode 100644 index 000000000000..6f709b38963b --- /dev/null +++ b/homeassistant/components/braviatv/.translations/it.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "Questo televisore \u00e8 gi\u00e0 configurato." + }, + "error": { + "cannot_connect": "Connessione non riuscita, host o codice PIN non valido.", + "invalid_host": "Nome host o indirizzo IP non valido.", + "unsupported_model": "Il tuo modello TV non \u00e8 supportato." + }, + "step": { + "authorize": { + "data": { + "pin": "Codice PIN" + }, + "description": "Immettere il codice PIN visualizzato sul Sony Bravia TV. \n\nSe il codice PIN non viene visualizzato, \u00e8 necessario annullare la registrazione di Home Assistant sul televisore, andare su: Impostazioni - > Rete - > Impostazioni dispositivo remoto - > Annulla registrazione dispositivo remoto.", + "title": "Autorizzare Sony Bravia TV" + }, + "user": { + "data": { + "host": "Nome host TV o indirizzo IP" + }, + "description": "Configurare l'integrazione TV di Sony Bravia. In caso di problemi con la configurazione visitare: https://www.home-assistant.io/integrations/braviatv\n\nAssicurarsi che il televisore sia acceso.", + "title": "Sony Bravia TV" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Elenco delle fonti ignorate" + }, + "title": "Opzioni per Sony Bravia TV" + } + } + }, + "title": "Sony Bravia TV" +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/ru.json b/homeassistant/components/braviatv/.translations/ru.json new file mode 100644 index 000000000000..077a39bb73f8 --- /dev/null +++ b/homeassistant/components/braviatv/.translations/ru.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\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, \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 \u0438\u043b\u0438 PIN-\u043a\u043e\u0434.", + "invalid_host": "\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441.", + "unsupported_model": "\u042d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f." + }, + "step": { + "authorize": { + "data": { + "pin": "PIN-\u043a\u043e\u0434" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 PIN-\u043a\u043e\u0434, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 Sony Bravia. \n\n\u0415\u0441\u043b\u0438 \u0412\u044b \u043d\u0435 \u0432\u0438\u0434\u0438\u0442\u0435 PIN-\u043a\u043e\u0434, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e Home Assistant \u043d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -> \u0421\u0435\u0442\u044c -> \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -> \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.", + "title": "\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 Sony Bravia" + }, + "user": { + "data": { + "host": "\u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441" + }, + "description": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438:\nhttps://www.home-assistant.io/integrations/braviatv", + "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Sony Bravia" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "\u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432" + }, + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 Sony Bravia" + } + } + }, + "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Sony Bravia" +} \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/it.json b/homeassistant/components/deconz/.translations/it.json index 7973749aebbc..8978bb14eba5 100644 --- a/homeassistant/components/deconz/.translations/it.json +++ b/homeassistant/components/deconz/.translations/it.json @@ -33,6 +33,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Entrambi", + "bottom_buttons": "Pulsanti inferiori", "button_1": "Primo", "button_2": "Secondo pulsante", "button_3": "Terzo pulsante", @@ -49,6 +50,7 @@ "side_4": "Lato 4", "side_5": "Lato 5", "side_6": "Lato 6", + "top_buttons": "Pulsanti superiori", "turn_off": "Spegnere", "turn_on": "Accendere" }, diff --git a/homeassistant/components/doorbird/.translations/it.json b/homeassistant/components/doorbird/.translations/it.json index 25a2257dc894..0bd9fc1d9fd1 100644 --- a/homeassistant/components/doorbird/.translations/it.json +++ b/homeassistant/components/doorbird/.translations/it.json @@ -1,13 +1,16 @@ { "config": { "abort": { - "already_configured": "Questo DoorBird \u00e8 gi\u00e0 configurato" + "already_configured": "Questo DoorBird \u00e8 gi\u00e0 configurato", + "link_local_address": "Gli indirizzi locali di collegamento non sono supportati", + "not_doorbird_device": "Questo dispositivo non \u00e8 un DoorBird" }, "error": { "cannot_connect": "Impossibile connettersi, si prega di riprovare", "invalid_auth": "Autenticazione non valida", "unknown": "Errore imprevisto" }, + "flow_title": "DoorBird {name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/flume/.translations/it.json b/homeassistant/components/flume/.translations/it.json new file mode 100644 index 000000000000..5be8180dfc59 --- /dev/null +++ b/homeassistant/components/flume/.translations/it.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "Questo account \u00e8 gi\u00e0 configurato." + }, + "error": { + "cannot_connect": "Impossibile connettersi, si prega di riprovare", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "client_id": "Client ID", + "client_secret": "Client Secret", + "password": "Password", + "username": "Nome utente" + }, + "description": "Per accedere all'API personale di Flume, \u00e8 necessario richiedere un \"Client ID\" e un \"Client Secret\" all'indirizzo https://portal.flumetech.com/settings#token.", + "title": "Collegati al tuo account Flume" + } + } + }, + "title": "Flume" +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/it.json b/homeassistant/components/flunearyou/.translations/it.json new file mode 100644 index 000000000000..c77bebd296a4 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/it.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Queste coordinate sono gi\u00e0 registrate." + }, + "error": { + "general_error": "Si \u00e8 verificato un errore sconosciuto." + }, + "step": { + "user": { + "data": { + "latitude": "Latitudine", + "longitude": "Logitudine" + }, + "description": "Monitorare i repot basati su utenti e CDC per una coppia di coordinate.", + "title": "Configurare Flu Near You" + } + } + }, + "title": "Flu Near You" +} \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/en.json b/homeassistant/components/gios/.translations/en.json index 2a61daf25c27..7825a4a84dfb 100644 --- a/homeassistant/components/gios/.translations/en.json +++ b/homeassistant/components/gios/.translations/en.json @@ -19,5 +19,5 @@ } } }, - "title": "$1" + "title": "GIO\u015a" } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/it.json b/homeassistant/components/hue/.translations/it.json index 33a49773c1d4..352da3409fbb 100644 --- a/homeassistant/components/hue/.translations/it.json +++ b/homeassistant/components/hue/.translations/it.json @@ -27,5 +27,22 @@ } } }, + "device_automation": { + "trigger_subtype": { + "button_1": "Primo pulsante", + "button_2": "Secondo pulsante", + "button_3": "Terzo pulsante", + "button_4": "Quarto pulsante", + "dim_down": "Diminuisce luminosit\u00e0", + "dim_up": "Aumenta luminosit\u00e0", + "turn_off": "Spento", + "turn_on": "Acceso" + }, + "trigger_type": { + "remote_button_long_release": "Pulsante \"{subtype}\" rilasciato dopo una lunga pressione", + "remote_button_short_press": "Pulsante \"{subtype}\" premuto", + "remote_button_short_release": "Pulsante \"{subtype}\" rilasciato" + } + }, "title": "Philips Hue" } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/it.json b/homeassistant/components/ipp/.translations/it.json new file mode 100644 index 000000000000..9d8f6a8716f3 --- /dev/null +++ b/homeassistant/components/ipp/.translations/it.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "Questa stampante \u00e8 gi\u00e0 configurata.", + "connection_error": "Impossibile connettersi alla stampante.", + "connection_upgrade": "Impossibile connettersi alla stampante a causa della necessit\u00e0 dell'aggiornamento della connessione.", + "ipp_error": "Si \u00e8 verificato un errore IPP.", + "ipp_version_error": "Versione IPP non supportata dalla stampante.", + "parse_error": "Impossibile analizzare la risposta dalla stampante." + }, + "error": { + "connection_error": "Impossibile connettersi alla stampante.", + "connection_upgrade": "Impossibile connettersi alla stampante. Riprovare selezionando l'opzione SSL/TLS." + }, + "flow_title": "Stampante: {name}", + "step": { + "user": { + "data": { + "base_path": "Percorso relativo alla stampante", + "host": "Host o indirizzo IP", + "port": "Porta", + "ssl": "La stampante supporta la comunicazione su SSL/TLS", + "verify_ssl": "La stampante utilizza un certificato SSL adeguato" + }, + "description": "Configurare la stampante tramite Internet Printing Protocol (IPP) per l'integrazione con Home Assistant.", + "title": "Collegare la stampante" + }, + "zeroconf_confirm": { + "description": "Vuoi aggiungere la stampante denominata `{name}` a Home Assistant?", + "title": "Stampante rilevata" + } + } + }, + "title": "Protocollo IPP (Internet Printing Protocol)" +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ru.json b/homeassistant/components/ipp/.translations/ru.json index 7fb1e4753c92..32275bfbfbc1 100644 --- a/homeassistant/components/ipp/.translations/ru.json +++ b/homeassistant/components/ipp/.translations/ru.json @@ -4,6 +4,8 @@ "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", "connection_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443.", "connection_upgrade": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.", + "ipp_error": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 IPP.", + "ipp_version_error": "\u0412\u0435\u0440\u0441\u0438\u044f IPP \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u043e\u043c.", "parse_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430." }, "error": { diff --git a/homeassistant/components/konnected/.translations/it.json b/homeassistant/components/konnected/.translations/it.json index 2d381f81f4bc..2b025862ca74 100644 --- a/homeassistant/components/konnected/.translations/it.json +++ b/homeassistant/components/konnected/.translations/it.json @@ -33,6 +33,7 @@ "not_konn_panel": "Non \u00e8 un dispositivo Konnected.io riconosciuto" }, "error": { + "bad_host": "URL dell'host API di sostituzione non valido", "one": "uno", "other": "altri" }, @@ -85,7 +86,9 @@ }, "options_misc": { "data": { - "blink": "Attiva il lampeggio del LED del pannello durante l'invio del cambiamento di stato " + "api_host": "Sovrascrivi l'URL dell'host API (opzionale)", + "blink": "Attiva il lampeggio del LED del pannello durante l'invio del cambiamento di stato ", + "override_api_host": "Sovrascrivi l'URL predefinito del pannello host API di Home Assistant" }, "description": "Seleziona il comportamento desiderato per il tuo pannello", "title": "Configura Altro" @@ -94,11 +97,12 @@ "data": { "activation": "Uscita quando acceso", "momentary": "Durata impulso (ms) (opzionale)", + "more_states": "Configurare stati aggiuntivi per questa zona", "name": "Nome (opzionale)", "pause": "Pausa tra gli impulsi (ms) (opzionale)", "repeat": "Numero di volte da ripetere (-1 = infinito) (opzionale)" }, - "description": "Selezionare le opzioni di uscita per {zona}", + "description": "Selezionare le opzioni di uscita per {zone}: stato {state}", "title": "Configurare l'uscita commutabile" } }, diff --git a/homeassistant/components/light/.translations/de.json b/homeassistant/components/light/.translations/de.json index 1984cf31d79b..eb8a1b5bb001 100644 --- a/homeassistant/components/light/.translations/de.json +++ b/homeassistant/components/light/.translations/de.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Helligkeit von {entity_name} verringern", "brightness_increase": "Helligkeit von {entity_name} erh\u00f6hen", + "flash": "Flash {entity_name}", "toggle": "Schalte {entity_name} um.", "turn_off": "Schalte {entity_name} aus.", "turn_on": "Schalte {entity_name} ein." diff --git a/homeassistant/components/light/.translations/it.json b/homeassistant/components/light/.translations/it.json index ae1492d514ea..a95af835908c 100644 --- a/homeassistant/components/light/.translations/it.json +++ b/homeassistant/components/light/.translations/it.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Riduci la luminosit\u00e0 di {entity_name}", "brightness_increase": "Aumenta la luminosit\u00e0 di {entity_name}", + "flash": "Flash {entity_name}", "toggle": "Commuta {entity_name}", "turn_off": "Spegnere {entity_name}", "turn_on": "Accendere {entity_name}" diff --git a/homeassistant/components/local_ip/.translations/it.json b/homeassistant/components/local_ip/.translations/it.json index 3edda00dc1c5..a180d448fbda 100644 --- a/homeassistant/components/local_ip/.translations/it.json +++ b/homeassistant/components/local_ip/.translations/it.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "L'integrazione \u00e8 gi\u00e0 configurata con un sensore esistente con questo nome" + "already_configured": "L'integrazione \u00e8 gi\u00e0 configurata con un sensore esistente con questo nome", + "single_instance_allowed": "\u00c8 consentita una sola configurazione dell'IP locale." }, "step": { "user": { diff --git a/homeassistant/components/nut/.translations/it.json b/homeassistant/components/nut/.translations/it.json new file mode 100644 index 000000000000..b3841ba87c39 --- /dev/null +++ b/homeassistant/components/nut/.translations/it.json @@ -0,0 +1,51 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi, si prega di riprovare", + "unknown": "Errore imprevisto" + }, + "step": { + "resources": { + "data": { + "resources": "Risorse" + }, + "title": "Scegliere le risorse da monitorare" + }, + "ups": { + "data": { + "alias": "Alias", + "resources": "Risorse" + }, + "title": "Scegliere l'UPS da monitorare" + }, + "user": { + "data": { + "alias": "Alias", + "host": "Host", + "name": "Nome", + "password": "Password", + "port": "Porta", + "resources": "Risorse", + "username": "Nome utente" + }, + "description": "Se al server NUT sono collegati pi\u00f9 UPS, inserire il nome UPS da interrogare nel campo 'Alias'.", + "title": "Connessione al server NUT" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "resources": "Risorse", + "scan_interval": "Intervallo di scansione (secondi)" + }, + "description": "Scegliere le Risorse del Sensore." + } + } + }, + "title": "Strumenti UPS di rete (NUT)" +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/it.json b/homeassistant/components/roomba/.translations/it.json new file mode 100644 index 000000000000..fa58cfde3c19 --- /dev/null +++ b/homeassistant/components/roomba/.translations/it.json @@ -0,0 +1,33 @@ +{ + "config": { + "error": { + "cannot_connect": "Impossibile connettersi, si prega di riprovare", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Certificato", + "continuous": "Continuo", + "delay": "Ritardo", + "host": "Nome dell'host o indirizzo IP", + "password": "Password" + }, + "description": "Attualmente il recupero del BLID e della password \u00e8 un processo manuale. Si prega di seguire i passi descritti nella documentazione all'indirizzo: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Connettersi al dispositivo" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Continuo", + "delay": "Ritardo" + } + } + } + }, + "title": "iRobot Roomba" +} \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/de.json b/homeassistant/components/smartthings/.translations/de.json index 4096720d02bf..dfe406db41ad 100644 --- a/homeassistant/components/smartthings/.translations/de.json +++ b/homeassistant/components/smartthings/.translations/de.json @@ -8,15 +8,30 @@ "token_forbidden": "Das Token verf\u00fcgt nicht \u00fcber die erforderlichen OAuth-Bereiche.", "token_invalid_format": "Das Token muss im UID/GUID-Format vorliegen.", "token_unauthorized": "Das Token ist ung\u00fcltig oder nicht mehr autorisiert.", - "webhook_error": "SmartThings konnte den in 'base_url' angegebenen Endpunkt nicht validieren. Bitte \u00fcberpr\u00fcfe die Komponentenanforderungen." + "webhook_error": "SmartThings konnte die Webhook-URL nicht \u00fcberpr\u00fcfen. Bitte stellen Sie sicher, dass die Webhook-URL \u00fcber das Internet erreichbar ist, und versuchen Sie es erneut." }, "step": { + "authorize": { + "title": "Home Assistant autorisieren" + }, + "pat": { + "data": { + "access_token": "Zugangstoken" + }, + "title": "Gib den pers\u00f6nlichen Zugangstoken an" + }, + "select_location": { + "data": { + "location_id": "Standort" + }, + "title": "Standort ausw\u00e4hlen" + }, "user": { "data": { "access_token": "Zugangstoken" }, - "description": "Bitte gib einen SmartThings [pers\u00f6nlichen Zugangstoken]({token_url}) ein, welcher gem\u00e4\u00df den [Anweisungen]({component_url}) erstellt wurde.", - "title": "Gib den pers\u00f6nlichen Zugangstoken an" + "description": "SmartThings wird so konfiguriert, dass Push-Updates an Home Assistant gesendet werden an die URL: \n > {webhook_url} \n\nWenn dies nicht korrekt ist, aktualisieren Sie bitte Ihre Konfiguration, starten Sie Home Assistant neu und versuchen Sie es erneut.", + "title": "R\u00fcckruf-URL best\u00e4tigen" }, "wait_install": { "description": "Installiere die Home-Assistent SmartApp an mindestens einer Stelle, und klicke auf Absenden.", diff --git a/homeassistant/components/smartthings/.translations/it.json b/homeassistant/components/smartthings/.translations/it.json index 0b96963199ea..a4148036eb57 100644 --- a/homeassistant/components/smartthings/.translations/it.json +++ b/homeassistant/components/smartthings/.translations/it.json @@ -1,5 +1,9 @@ { "config": { + "abort": { + "invalid_webhook_url": "Home Assistant non \u00e8 configurato correttamente per ricevere gli aggiornamenti da SmartThings. L'URL del webhook non \u00e8 valido:\n> {webhook_url}\n\nSi prega di aggiornare la configurazione secondo le [istruzioni]({component_url}), riavviare Home Assistant e riprovare.", + "no_available_locations": "Non ci sono posizioni SmartThings disponibili da configurare in Home Assistant." + }, "error": { "app_not_installed": "Assicurati di avere installato ed autorizzato la SmartApp Home Assistant e riprova.", "app_setup_error": "Impossibile configurare SmartApp. Riprovare.", @@ -8,15 +12,32 @@ "token_forbidden": "Il token non dispone degli ambiti OAuth necessari.", "token_invalid_format": "Il token deve essere nel formato UID/GUID", "token_unauthorized": "Il token non \u00e8 valido o non \u00e8 pi\u00f9 autorizzato.", - "webhook_error": "SmartThings non ha potuto convalidare l'endpoint configurato in `base_url`. Si prega di rivedere i requisiti del componente." + "webhook_error": "SmartThings non \u00e8 riuscito a convalidare l'URL del webhook. Assicurati che l'URL del webhook sia raggiungibile da Internet e riprova." }, "step": { + "authorize": { + "title": "Autorizza Home Assistant" + }, + "pat": { + "data": { + "access_token": "Token di accesso" + }, + "description": "Si prega di inserire un SmartThings [Personal Access Token]({token_url}) che \u00e8 stato creato secondo le [istruzioni]({component_url}). Questo verr\u00e0 utilizzato per creare l'integrazione Home Assistant all'interno del vostro account SmartThings.", + "title": "Inserisci il Token di Accesso Personale" + }, + "select_location": { + "data": { + "location_id": "Posizione" + }, + "description": "Selezionare la posizione SmartThings che si desidera aggiungere a Home Assistant. Apriremo quindi una nuova finestra e vi chiederemo di effettuare il login e di autorizzare l'installazione dell'integrazione dell'Home Assistant nella posizione selezionata.", + "title": "Seleziona posizione" + }, "user": { "data": { "access_token": "Token di accesso" }, - "description": "Inserisci un [Token di Accesso Personale]({token_url}) di SmartThings che \u00e8 stato creato secondo lo [istruzioni]({component_url}).", - "title": "Inserisci il Token di Accesso Personale" + "description": "SmartThings sar\u00e0 configurato per inviare aggiornamenti push a Home Assistant su: \n > {webhook_url} \n\nSe ci\u00f2 non fosse corretto, aggiornare la configurazione, riavviare Home Assistant e riprovare.", + "title": "Confermare l'URL di richiamo" }, "wait_install": { "description": "Si prega di installare l'Home Assistant SmartApp in almeno una posizione e fare clic su Invia.", diff --git a/homeassistant/components/smartthings/.translations/ru.json b/homeassistant/components/smartthings/.translations/ru.json index 0ad425bc930c..19051f906fa4 100644 --- a/homeassistant/components/smartthings/.translations/ru.json +++ b/homeassistant/components/smartthings/.translations/ru.json @@ -1,5 +1,9 @@ { "config": { + "abort": { + "invalid_webhook_url": "Webhook URL, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043e\u0442 SmartThings, \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d: \n> {webhook_url} \n\n\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438]({component_url}), \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Home Assistant \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", + "no_available_locations": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 SmartThings." + }, "error": { "app_not_installed": "\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0412\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u0438 SmartApp 'Home Assistant' \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", "app_setup_error": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c SmartApp. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", @@ -8,15 +12,32 @@ "token_forbidden": "\u0422\u043e\u043a\u0435\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f OAuth.", "token_invalid_format": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 UID / GUID.", "token_unauthorized": "\u0422\u043e\u043a\u0435\u043d \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d.", - "webhook_error": "SmartThings \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0432 `base_url`. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443." + "webhook_error": "SmartThings \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c Webhook URL. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 Webhook URL \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443." }, "step": { + "authorize": { + "title": "\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f Home Assistant" + }, + "pat": { + "data": { + "access_token": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 [\u041b\u0438\u0447\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 SmartThings]({token_url}), \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438]({component_url}).", + "title": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430" + }, + "select_location": { + "data": { + "location_id": "\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 SmartThings, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Home Assistant. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Home Assistant \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438.", + "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" + }, "user": { "data": { "access_token": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430" }, - "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 [\u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430]({token_url}) SmartThings, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438]({component_url}).", - "title": "SmartThings" + "description": "SmartThings \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 push-\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: \n> {webhook_url} \n\n\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Home Assistant \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", + "title": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 Callback URL" }, "wait_install": { "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 SmartApp 'Home Assistant' \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 **\u041f\u041e\u0414\u0422\u0412\u0415\u0420\u0414\u0418\u0422\u042c**.", diff --git a/homeassistant/components/synology_dsm/.translations/it.json b/homeassistant/components/synology_dsm/.translations/it.json new file mode 100644 index 000000000000..98a78e17d86a --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/it.json @@ -0,0 +1,38 @@ +{ + "config": { + "abort": { + "already_configured": "Host gi\u00e0 configurato" + }, + "error": { + "login": "Errore di accesso: si prega di controllare il nome utente e la password", + "unknown": "Errore sconosciuto: riprovare pi\u00f9 tardi o un'altra configurazione" + }, + "flow_title": "Synology DSM {nome} ({host})", + "step": { + "link": { + "data": { + "api_version": "Versione DSM", + "password": "Password", + "port": "Porta (opzionale)", + "ssl": "Utilizzare SSL/TLS per connettersi al NAS", + "username": "Nome utente" + }, + "description": "Vuoi impostare {nome} ({host})?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "Versione DSM", + "host": "Host", + "name": "Nome", + "password": "Password", + "port": "Porta (opzionale)", + "ssl": "Utilizzare SSL/TLS per connettersi al NAS", + "username": "Nome utente" + }, + "title": "Synology DSM" + } + } + }, + "title": "Synology DSM" +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/de.json b/homeassistant/components/tado/.translations/de.json index eb33565615ec..0acac0df43b9 100644 --- a/homeassistant/components/tado/.translations/de.json +++ b/homeassistant/components/tado/.translations/de.json @@ -21,6 +21,9 @@ "options": { "step": { "init": { + "data": { + "fallback": "Aktivieren Sie den Fallback-Modus." + }, "title": "Passen Sie die Tado-Optionen an." } }, diff --git a/homeassistant/components/tado/.translations/it.json b/homeassistant/components/tado/.translations/it.json new file mode 100644 index 000000000000..6fbabbc13bb1 --- /dev/null +++ b/homeassistant/components/tado/.translations/it.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi, si prega di riprovare", + "invalid_auth": "Autenticazione non valida", + "no_homes": "Non ci sono case collegate a questo account tado.", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Nome utente" + }, + "title": "Collegati al tuo account Tado" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "Abilitare la modalit\u00e0 di fallback." + }, + "description": "La modalit\u00e0 di fallback passer\u00e0 a Smart Schedule al prossimo cambio di programma dopo aver regolato manualmente una zona.", + "title": "Regolare le opzioni di Tado." + } + }, + "title": "Tado" + }, + "title": "Tado" +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/de.json b/homeassistant/components/totalconnect/.translations/de.json index c239b1ec5bfc..6a34670b9dbd 100644 --- a/homeassistant/components/totalconnect/.translations/de.json +++ b/homeassistant/components/totalconnect/.translations/de.json @@ -3,6 +3,9 @@ "abort": { "already_configured": "Konto bereits konfiguriert" }, + "error": { + "login": "Login-Fehler: Bitte \u00fcberpr\u00fcfen Sie Ihren Benutzernamen & Passwort" + }, "step": { "user": { "data": { diff --git a/homeassistant/components/totalconnect/.translations/it.json b/homeassistant/components/totalconnect/.translations/it.json new file mode 100644 index 000000000000..f4d91ccc3520 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/it.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Account gi\u00e0 configurato" + }, + "error": { + "login": "Errore di accesso: si prega di controllare il nome utente e la password" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Nome utente" + }, + "title": "Total Connect" + } + } + }, + "title": "Total Connect" +} \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/en.json b/homeassistant/components/tradfri/.translations/en.json index 6a2889e3e362..b66cfb8d446b 100644 --- a/homeassistant/components/tradfri/.translations/en.json +++ b/homeassistant/components/tradfri/.translations/en.json @@ -20,5 +20,5 @@ } } }, - "title": "$1" + "title": "IKEA TR\u00c5DFRI" } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/it.json b/homeassistant/components/unifi/.translations/it.json index 7cb0a0a9ee1d..d959589644ee 100644 --- a/homeassistant/components/unifi/.translations/it.json +++ b/homeassistant/components/unifi/.translations/it.json @@ -31,7 +31,8 @@ "client_control": { "data": { "block_client": "Client controllati per l'accesso alla rete", - "new_client": "Aggiungere un nuovo client per il controllo dell'accesso alla rete" + "new_client": "Aggiungere un nuovo client per il controllo dell'accesso alla rete", + "poe_clients": "Consentire il controllo POE dei client" }, "description": "Configurare i controlli client \n\nCreare interruttori per i numeri di serie dei quali si desidera controllare l'accesso alla rete.", "title": "Opzioni UniFi 2/3" diff --git a/homeassistant/components/vera/.translations/it.json b/homeassistant/components/vera/.translations/it.json new file mode 100644 index 000000000000..56d69efe360f --- /dev/null +++ b/homeassistant/components/vera/.translations/it.json @@ -0,0 +1,32 @@ +{ + "config": { + "abort": { + "already_configured": "Un controller \u00e8 gi\u00e0 configurato.", + "cannot_connect": "Impossibile connettersi al controllore con l'url {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "ID dispositivo Vera da escludere da Home Assistant.", + "lights": "Gli ID dei dispositivi switch Vera da trattare come luci in Home Assistant.", + "vera_controller_url": "URL del controller" + }, + "description": "Fornire un url di controllo Vera di seguito. Dovrebbe avere questo aspetto: http://192.168.1.161:3480.", + "title": "Configurazione controller Vera" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "ID dispositivo Vera da escludere da Home Assistant.", + "lights": "Gli ID dei dispositivi switch Vera da trattare come luci in Home Assistant." + }, + "description": "Consultare la documentazione di vera per i dettagli sui parametri opzionali: https://www.home-assistant.io/integrations/vera/. Nota: qualsiasi modifica qui effettuata necessita del riavvio del server di Home Assistant. Per cancellare i valori, inserire uno spazio.", + "title": "Opzioni controller Vera" + } + } + }, + "title": "Vera" +} \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/it.json b/homeassistant/components/vizio/.translations/it.json index 1786fad932a9..5b19b4ed66f8 100644 --- a/homeassistant/components/vizio/.translations/it.json +++ b/homeassistant/components/vizio/.translations/it.json @@ -7,8 +7,8 @@ "error": { "cant_connect": "Impossibile connettersi al dispositivo. [Esamina i documenti] (https://www.home-assistant.io/integrations/vizio/) e verifica nuovamente che: \n - Il dispositivo sia acceso \n - Il dispositivo sia collegato alla rete \n - I valori inseriti siano corretti \n prima di ritentare.", "complete_pairing failed": "Impossibile completare l'associazione. Assicurarsi che il PIN fornito sia corretto e che il televisore sia ancora alimentato e connesso alla rete prima di inviarlo di nuovo.", - "host_exists": "Dispositivo Vizio con host specificato gi\u00e0 configurato.", - "name_exists": "Dispositivo Vizio con il nome specificato gi\u00e0 configurato." + "host_exists": "Dispositivo VIZIO con host specificato gi\u00e0 configurato.", + "name_exists": "Dispositivo VIZIO con il nome specificato gi\u00e0 configurato." }, "step": { "pair_tv": { @@ -19,11 +19,11 @@ "title": "Processo di associazione completo" }, "pairing_complete": { - "description": "Il dispositivo Vizio SmartCast \u00e8 ora connesso a Home Assistant.", + "description": "Il dispositivo VIZIO SmartCast \u00e8 ora connesso a Home Assistant.", "title": "Associazione completata" }, "pairing_complete_import": { - "description": "Il dispositivo Vizio SmartCast TV \u00e8 ora connesso a Home Assistant. \n\nIl tuo Token di Accesso \u00e8 '**{access_token}**'.", + "description": "Il dispositivo VIZIO SmartCast TV \u00e8 ora connesso a Home Assistant. \n\nIl tuo Token di Accesso \u00e8 '**{access_token}**'.", "title": "Associazione completata" }, "user": { @@ -34,7 +34,7 @@ "name": "Nome" }, "description": "Un Token di Accesso \u00e8 necessario solo per i televisori. Se si sta configurando un televisore e non si dispone ancora di un Token di Accesso, lasciarlo vuoto per passare attraverso un processo di associazione.", - "title": "Configurazione del dispositivo SmartCast Vizio" + "title": "Configurazione del dispositivo SmartCast VIZIO" } } }, @@ -47,10 +47,10 @@ "volume_step": "Dimensione del passo del volume" }, "description": "Se si dispone di una Smart TV, \u00e8 possibile filtrare l'elenco di origine scegliendo le app da includere o escludere in esso.", - "title": "Aggiornamento delle opzioni di Vizo SmartCast" + "title": "Aggiornamento delle opzioni di VIZIO SmartCast" } }, - "title": "Aggiornamento delle opzioni di Vizo SmartCast" + "title": "Aggiornamento delle opzioni di VIZIO SmartCast" }, - "title": "Vizio SmartCast" + "title": "VIZIO SmartCast" } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/de.json b/homeassistant/components/wled/.translations/de.json index fe172b7aa9aa..421ade359263 100644 --- a/homeassistant/components/wled/.translations/de.json +++ b/homeassistant/components/wled/.translations/de.json @@ -1,24 +1,24 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Dieses WLED-Ger\u00e4t ist bereits konfiguriert.", + "connection_error": "Verbindung zum WLED-Ger\u00e4t fehlgeschlagen." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Verbindung zum WLED-Ger\u00e4t fehlgeschlagen." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "Hostname oder IP-Adresse" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Richten Sie Ihren WLED f\u00fcr die Integration mit Home Assistant ein.", + "title": "Verkn\u00fcpfen Sie Ihre WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "M\u00f6chten Sie die WLED mit dem Namen `{name}` zu Home Assistant hinzuf\u00fcgen?", + "title": "WLED-Ger\u00e4t entdeckt" } } }, diff --git a/homeassistant/components/wled/.translations/it.json b/homeassistant/components/wled/.translations/it.json index c331024664af..97cf128fc38e 100644 --- a/homeassistant/components/wled/.translations/it.json +++ b/homeassistant/components/wled/.translations/it.json @@ -1,24 +1,24 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Questo dispositivo WLED \u00e8 gi\u00e0 configurato.", + "connection_error": "Impossibile connettersi al dispositivo WLED." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Impossibile connettersi al dispositivo WLED." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "Host o indirizzo IP" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Configura WLED per l'integrazione con Home Assistant.", + "title": "Collega il tuo WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Vuoi aggiungere il WLED chiamato `{name}` a Home Assistant?", + "title": "Dispositivo WLED rilevato" } } }, diff --git a/homeassistant/components/wled/.translations/ru.json b/homeassistant/components/wled/.translations/ru.json index c5d36b0dbabc..4fc85c40103c 100644 --- a/homeassistant/components/wled/.translations/ru.json +++ b/homeassistant/components/wled/.translations/ru.json @@ -1,24 +1,24 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", + "connection_error": "\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." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "\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." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "\u0414\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 WLED \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Home Assistant.", + "title": "WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "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 WLED `{name}`?", + "title": "WLED" } } }, From 446c7349ffad8e5f86798335ddb0355603bfe834 Mon Sep 17 00:00:00 2001 From: Philipp Danner Date: Thu, 16 Apr 2020 02:44:39 +0200 Subject: [PATCH 430/653] Fix Keba request data service call (#34254) --- homeassistant/components/keba/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/keba/__init__.py b/homeassistant/components/keba/__init__.py index 466b53212451..cbc9428b2eac 100644 --- a/homeassistant/components/keba/__init__.py +++ b/homeassistant/components/keba/__init__.py @@ -42,7 +42,7 @@ CONFIG_SCHEMA = vol.Schema( ) _SERVICE_MAP = { - "request_data": "request_data", + "request_data": "async_request_data", "set_energy": "async_set_energy", "set_current": "async_set_current", "authorize": "async_start", @@ -180,6 +180,11 @@ class KebaHandler(KebaKeContact): # initial data is already loaded, thus update the component listener() + async def async_request_data(self, param): + """Request new data in async way.""" + await self.request_data() + _LOGGER.debug("New data from KEBA wallbox requested") + async def async_set_energy(self, param): """Set energy target in async way.""" try: From 1f4cdda234b0e84dda4502c31650de677a2ade71 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 15 Apr 2020 20:08:54 -0500 Subject: [PATCH 431/653] Support DirecTV music channels with extended meta (#34228) --- .../components/directv/media_player.py | 25 +++++++- tests/components/directv/__init__.py | 24 ++++++- tests/components/directv/test_media_player.py | 64 +++++++++++++++++++ .../fixtures/directv/info-get-locations.json | 12 ++++ tests/fixtures/directv/info-mode-standby.json | 9 +++ .../fixtures/directv/tv-get-tuned-music.json | 28 ++++++++ .../directv/tv-get-tuned-restricted.json | 8 +++ 7 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/directv/info-mode-standby.json create mode 100644 tests/fixtures/directv/tv-get-tuned-music.json create mode 100644 tests/fixtures/directv/tv-get-tuned-restricted.json diff --git a/homeassistant/components/directv/media_player.py b/homeassistant/components/directv/media_player.py index b93577a03d6a..ec39734573bf 100644 --- a/homeassistant/components/directv/media_player.py +++ b/homeassistant/components/directv/media_player.py @@ -8,6 +8,7 @@ from homeassistant.components.media_player import MediaPlayerDevice from homeassistant.components.media_player.const import ( MEDIA_TYPE_CHANNEL, MEDIA_TYPE_MOVIE, + MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, @@ -34,6 +35,8 @@ from .const import ( _LOGGER = logging.getLogger(__name__) +KNOWN_MEDIA_TYPES = [MEDIA_TYPE_MOVIE, MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW] + SUPPORT_DTV = ( SUPPORT_PAUSE | SUPPORT_TURN_ON @@ -177,8 +180,7 @@ class DIRECTVMediaPlayer(DIRECTVEntity, MediaPlayerDevice): if self._is_standby or self._program is None: return None - known_types = [MEDIA_TYPE_MOVIE, MEDIA_TYPE_TVSHOW] - if self._program.program_type in known_types: + if self._program.program_type in KNOWN_MEDIA_TYPES: return self._program.program_type return MEDIA_TYPE_MOVIE @@ -213,8 +215,27 @@ class DIRECTVMediaPlayer(DIRECTVEntity, MediaPlayerDevice): if self._is_standby or self._program is None: return None + if self.media_content_type == MEDIA_TYPE_MUSIC: + return self._program.music_title + return self._program.title + @property + def media_artist(self): + """Artist of current playing media, music track only.""" + if self._is_standby or self._program is None: + return None + + return self._program.music_artist + + @property + def media_album_name(self): + """Album name of current playing media, music track only.""" + if self._is_standby or self._program is None: + return None + + return self._program.music_album + @property def media_series_title(self): """Return the title of current episode of TV show.""" diff --git a/tests/components/directv/__init__.py b/tests/components/directv/__init__.py index d34ab0266afc..6b71b1e8cfed 100644 --- a/tests/components/directv/__init__.py +++ b/tests/components/directv/__init__.py @@ -1,7 +1,7 @@ """Tests for the DirecTV component.""" from homeassistant.components.directv.const import CONF_RECEIVER_ID, DOMAIN from homeassistant.components.ssdp import ATTR_SSDP_LOCATION -from homeassistant.const import CONF_HOST, HTTP_INTERNAL_SERVER_ERROR +from homeassistant.const import CONF_HOST, HTTP_FORBIDDEN, HTTP_INTERNAL_SERVER_ERROR from homeassistant.helpers.typing import HomeAssistantType from tests.common import MockConfigEntry, load_fixture @@ -31,6 +31,13 @@ def mock_connection(aioclient_mock: AiohttpClientMocker) -> None: headers={"Content-Type": "application/json"}, ) + aioclient_mock.get( + f"http://{HOST}:8080/info/mode", + params={"clientAddr": "B01234567890"}, + text=load_fixture("directv/info-mode-standby.json"), + headers={"Content-Type": "application/json"}, + ) + aioclient_mock.get( f"http://{HOST}:8080/info/mode", params={"clientAddr": "9XXXXXXXXXX9"}, @@ -64,6 +71,21 @@ def mock_connection(aioclient_mock: AiohttpClientMocker) -> None: headers={"Content-Type": "application/json"}, ) + aioclient_mock.get( + f"http://{HOST}:8080/tv/getTuned", + params={"clientAddr": "A01234567890"}, + text=load_fixture("directv/tv-get-tuned-music.json"), + headers={"Content-Type": "application/json"}, + ) + + aioclient_mock.get( + f"http://{HOST}:8080/tv/getTuned", + params={"clientAddr": "C01234567890"}, + status=HTTP_FORBIDDEN, + text=load_fixture("directv/tv-get-tuned-restricted.json"), + headers={"Content-Type": "application/json"}, + ) + aioclient_mock.get( f"http://{HOST}:8080/tv/getTuned", text=load_fixture("directv/tv-get-tuned-movie.json"), diff --git a/tests/components/directv/test_media_player.py b/tests/components/directv/test_media_player.py index 698e6ddac314..8b428c1b708b 100644 --- a/tests/components/directv/test_media_player.py +++ b/tests/components/directv/test_media_player.py @@ -13,6 +13,8 @@ from homeassistant.components.directv.media_player import ( ) from homeassistant.components.media_player.const import ( ATTR_INPUT_SOURCE, + ATTR_MEDIA_ALBUM_NAME, + ATTR_MEDIA_ARTIST, ATTR_MEDIA_CHANNEL, ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_TYPE, @@ -24,6 +26,7 @@ from homeassistant.components.media_player.const import ( ATTR_MEDIA_TITLE, DOMAIN as MP_DOMAIN, MEDIA_TYPE_MOVIE, + MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, SERVICE_PLAY_MEDIA, SUPPORT_NEXT_TRACK, @@ -44,6 +47,7 @@ from homeassistant.const import ( SERVICE_MEDIA_STOP, SERVICE_TURN_OFF, SERVICE_TURN_ON, + STATE_OFF, STATE_PAUSED, STATE_PLAYING, STATE_UNAVAILABLE, @@ -57,6 +61,9 @@ from tests.test_util.aiohttp import AiohttpClientMocker ATTR_UNIQUE_ID = "unique_id" CLIENT_ENTITY_ID = f"{MP_DOMAIN}.client" MAIN_ENTITY_ID = f"{MP_DOMAIN}.host" +MUSIC_ENTITY_ID = f"{MP_DOMAIN}.music_client" +RESTRICTED_ENTITY_ID = f"{MP_DOMAIN}.restricted_client" +STANDBY_ENTITY_ID = f"{MP_DOMAIN}.standby_client" UNAVAILABLE_ENTITY_ID = f"{MP_DOMAIN}.unavailable_client" # pylint: disable=redefined-outer-name @@ -250,6 +257,63 @@ async def test_check_attributes( 2010, 7, 5, 15, 0, 8, tzinfo=dt_util.UTC ) + state = hass.states.get(MUSIC_ENTITY_ID) + assert state.state == STATE_PLAYING + + assert state.attributes.get(ATTR_MEDIA_CONTENT_ID) == "76917562" + assert state.attributes.get(ATTR_MEDIA_CONTENT_TYPE) == MEDIA_TYPE_MUSIC + assert state.attributes.get(ATTR_MEDIA_DURATION) == 86400 + assert state.attributes.get(ATTR_MEDIA_POSITION) == 15050 + assert state.attributes.get(ATTR_MEDIA_POSITION_UPDATED_AT) + assert state.attributes.get(ATTR_MEDIA_TITLE) == "Sparkle In Your Eyes" + assert state.attributes.get(ATTR_MEDIA_ARTIST) == "Gerald Albright" + assert state.attributes.get(ATTR_MEDIA_ALBUM_NAME) == "Slam Dunk (2014)" + assert state.attributes.get(ATTR_MEDIA_SERIES_TITLE) is None + assert state.attributes.get(ATTR_MEDIA_CHANNEL) == "{} ({})".format("MCSJ", "851") + assert state.attributes.get(ATTR_INPUT_SOURCE) == "851" + assert not state.attributes.get(ATTR_MEDIA_CURRENTLY_RECORDING) + assert state.attributes.get(ATTR_MEDIA_RATING) == "TV-PG" + assert not state.attributes.get(ATTR_MEDIA_RECORDED) + assert state.attributes.get(ATTR_MEDIA_START_TIME) == datetime( + 2020, 3, 21, 10, 0, 0, tzinfo=dt_util.UTC + ) + + state = hass.states.get(STANDBY_ENTITY_ID) + assert state.state == STATE_OFF + + assert state.attributes.get(ATTR_MEDIA_CONTENT_ID) is None + assert state.attributes.get(ATTR_MEDIA_CONTENT_TYPE) is None + assert state.attributes.get(ATTR_MEDIA_DURATION) is None + assert state.attributes.get(ATTR_MEDIA_POSITION) is None + assert state.attributes.get(ATTR_MEDIA_POSITION_UPDATED_AT) is None + assert state.attributes.get(ATTR_MEDIA_TITLE) is None + assert state.attributes.get(ATTR_MEDIA_ARTIST) is None + assert state.attributes.get(ATTR_MEDIA_ALBUM_NAME) is None + assert state.attributes.get(ATTR_MEDIA_SERIES_TITLE) is None + assert state.attributes.get(ATTR_MEDIA_CHANNEL) is None + assert state.attributes.get(ATTR_INPUT_SOURCE) is None + assert not state.attributes.get(ATTR_MEDIA_CURRENTLY_RECORDING) + assert state.attributes.get(ATTR_MEDIA_RATING) is None + assert not state.attributes.get(ATTR_MEDIA_RECORDED) + + state = hass.states.get(RESTRICTED_ENTITY_ID) + assert state.state == STATE_PLAYING + + assert state.attributes.get(ATTR_MEDIA_CONTENT_ID) is None + assert state.attributes.get(ATTR_MEDIA_CONTENT_TYPE) is None + assert state.attributes.get(ATTR_MEDIA_DURATION) is None + assert state.attributes.get(ATTR_MEDIA_POSITION) is None + assert state.attributes.get(ATTR_MEDIA_POSITION_UPDATED_AT) is None + assert state.attributes.get(ATTR_MEDIA_TITLE) is None + assert state.attributes.get(ATTR_MEDIA_ARTIST) is None + assert state.attributes.get(ATTR_MEDIA_ALBUM_NAME) is None + assert state.attributes.get(ATTR_MEDIA_SERIES_TITLE) is None + assert state.attributes.get(ATTR_MEDIA_CHANNEL) is None + assert state.attributes.get(ATTR_INPUT_SOURCE) is None + assert not state.attributes.get(ATTR_MEDIA_CURRENTLY_RECORDING) + assert state.attributes.get(ATTR_MEDIA_RATING) is None + assert not state.attributes.get(ATTR_MEDIA_RECORDED) + state = hass.states.get(UNAVAILABLE_ENTITY_ID) assert state.state == STATE_UNAVAILABLE diff --git a/tests/fixtures/directv/info-get-locations.json b/tests/fixtures/directv/info-get-locations.json index 5279bcebefc4..d8b14124c135 100644 --- a/tests/fixtures/directv/info-get-locations.json +++ b/tests/fixtures/directv/info-get-locations.json @@ -8,6 +8,18 @@ "clientAddr": "2CA17D1CD30X", "locationName": "Client" }, + { + "clientAddr": "A01234567890", + "locationName": "Music Client" + }, + { + "clientAddr": "B01234567890", + "locationName": "Standby Client" + }, + { + "clientAddr": "C01234567890", + "locationName": "Restricted Client" + }, { "clientAddr": "9XXXXXXXXXX9", "locationName": "Unavailable Client" diff --git a/tests/fixtures/directv/info-mode-standby.json b/tests/fixtures/directv/info-mode-standby.json new file mode 100644 index 000000000000..4c40c305723b --- /dev/null +++ b/tests/fixtures/directv/info-mode-standby.json @@ -0,0 +1,9 @@ +{ + "mode": 1, + "status": { + "code": 200, + "commandResult": 0, + "msg": "OK", + "query": "/info/mode" + } +} diff --git a/tests/fixtures/directv/tv-get-tuned-music.json b/tests/fixtures/directv/tv-get-tuned-music.json new file mode 100644 index 000000000000..d7e51e5dfe7b --- /dev/null +++ b/tests/fixtures/directv/tv-get-tuned-music.json @@ -0,0 +1,28 @@ +{ + "callsign": "MCSJ", + "duration": 86400, + "isOffAir": false, + "isPclocked": 3, + "isPpv": false, + "isRecording": false, + "isVod": false, + "major": 851, + "minor": 65535, + "music": { + "by": "Gerald Albright", + "cd": "Slam Dunk (2014)", + "title": "Sparkle In Your Eyes" + }, + "offset": 15050, + "programId": "76917562", + "rating": "TV-PG", + "startTime": 1584784800, + "stationId": 2872196, + "status": { + "code": 200, + "commandResult": 0, + "msg": "OK.", + "query": "/tv/getTuned" + }, + "title": "Smooth Jazz" +} diff --git a/tests/fixtures/directv/tv-get-tuned-restricted.json b/tests/fixtures/directv/tv-get-tuned-restricted.json new file mode 100644 index 000000000000..1e705b37d64c --- /dev/null +++ b/tests/fixtures/directv/tv-get-tuned-restricted.json @@ -0,0 +1,8 @@ +{ + "status": { + "code": 403, + "commandResult": 1, + "msg": "Forbidden.", + "query": "/tv/getTuned" + } +} From 188f3e35fdab484f368fcb6c238fed8392022f57 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Apr 2020 20:28:03 -0500 Subject: [PATCH 432/653] Add tests for additional nut ups models (#34240) * Add NUT tests for an Eaton 5E650I UPS * add a test to make sure multiple ups get setup * Add a few more upses * fix missing status key * cover * Force CI run --- homeassistant/components/nut/config_flow.py | 7 ++ tests/components/nut/test_config_flow.py | 17 +++-- tests/components/nut/test_sensor.py | 75 +++++++++++++++++++++ tests/fixtures/nut/5E650I.json | 36 ++++++++++ tests/fixtures/nut/DL650ELCD.json | 39 +++++++++++ tests/fixtures/nut/blazer_usb.json | 28 ++++++++ 6 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/nut/5E650I.json create mode 100644 tests/fixtures/nut/DL650ELCD.json create mode 100644 tests/fixtures/nut/blazer_usb.json diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index f1066fe28994..ba005f04a6a8 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -21,6 +21,8 @@ from .const import ( DEFAULT_HOST, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, + KEY_STATUS, + KEY_STATUS_DISPLAY, SENSOR_NAME, SENSOR_TYPES, ) @@ -53,6 +55,11 @@ def _resource_schema_base(available_resources, selected_resources): if sensor_id in available_resources } + if KEY_STATUS in known_available_resources: + known_available_resources[KEY_STATUS_DISPLAY] = SENSOR_TYPES[ + KEY_STATUS_DISPLAY + ][SENSOR_NAME] + return { vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select( known_available_resources diff --git a/tests/components/nut/test_config_flow.py b/tests/components/nut/test_config_flow.py index 5833d06c8a9e..ac20c989de93 100644 --- a/tests/components/nut/test_config_flow.py +++ b/tests/components/nut/test_config_flow.py @@ -27,7 +27,7 @@ async def test_form_user_one_ups(hass): assert result["errors"] == {} mock_pynut = _get_mock_pynutclient( - list_vars={"battery.voltage": "voltage"}, list_ups=["ups1"] + list_vars={"battery.voltage": "voltage", "ups.status": "OL"}, list_ups=["ups1"] ) with patch( @@ -54,7 +54,8 @@ async def test_form_user_one_ups(hass): "homeassistant.components.nut.async_setup_entry", return_value=True, ) as mock_setup_entry: result3 = await hass.config_entries.flow.async_configure( - result2["flow_id"], {"resources": ["battery.voltage"]}, + result2["flow_id"], + {"resources": ["battery.voltage", "ups.status", "ups.status.display"]}, ) assert result3["type"] == "create_entry" @@ -63,7 +64,7 @@ async def test_form_user_one_ups(hass): "host": "1.1.1.1", "password": "test-password", "port": 2222, - "resources": ["battery.voltage"], + "resources": ["battery.voltage", "ups.status", "ups.status.display"], "username": "test-username", } await hass.async_block_till_done() @@ -74,6 +75,14 @@ async def test_form_user_one_ups(hass): async def test_form_user_multiple_ups(hass): """Test we get the form.""" await setup.async_setup_component(hass, "persistent_notification", {}) + + config_entry = MockConfigEntry( + domain=DOMAIN, + data={"host": "2.2.2.2", "port": 123, "resources": ["battery.charge"]}, + options={CONF_RESOURCES: ["battery.charge"]}, + ) + config_entry.add_to_hass(hass) + result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -134,7 +143,7 @@ async def test_form_user_multiple_ups(hass): } await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 2 async def test_form_import(hass): diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py index 430720785ca1..645855389484 100644 --- a/tests/components/nut/test_sensor.py +++ b/tests/components/nut/test_sensor.py @@ -80,6 +80,31 @@ async def test_5e850i(hass): ) +async def test_5e650i(hass): + """Test creation of 5E650I sensors.""" + + await async_init_integration(hass, "5E650I", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online Battery Charging", + "unit_of_measurement": "%", + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + async def test_backupsses600m1(hass): """Test creation of BACKUPSES600M1 sensors.""" @@ -132,3 +157,53 @@ async def test_cp1500pfclcd(hass): assert all( state.attributes[key] == expected_attributes[key] for key in expected_attributes ) + + +async def test_dl650elcd(hass): + """Test creation of DL650ELCD sensors.""" + + await async_init_integration(hass, "DL650ELCD", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": UNIT_PERCENTAGE, + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) + + +async def test_blazer_usb(hass): + """Test creation of blazer_usb sensors.""" + + await async_init_integration(hass, "blazer_usb", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() + entry = registry.async_get("sensor.ups1_battery_charge") + # No unique id, no registry entry + assert not entry + + state = hass.states.get("sensor.ups1_battery_charge") + assert state.state == "100" + + expected_attributes = { + "device_class": "battery", + "friendly_name": "Ups1 Battery Charge", + "state": "Online", + "unit_of_measurement": UNIT_PERCENTAGE, + } + # Only test for a subset of attributes in case + # HA changes the implementation and a new one appears + assert all( + state.attributes[key] == expected_attributes[key] for key in expected_attributes + ) diff --git a/tests/fixtures/nut/5E650I.json b/tests/fixtures/nut/5E650I.json new file mode 100644 index 000000000000..2f5eae5a86a0 --- /dev/null +++ b/tests/fixtures/nut/5E650I.json @@ -0,0 +1,36 @@ +{ + "driver.version.internal" : "0.38", + "outlet.switchable" : "no", + "driver.parameter.port" : "auto", + "device.model" : "5E 650i", + "ups.model" : "5E 650i", + "driver.parameter.pollfreq" : "30", + "ups.timer.shutdown" : "-1", + "ups.productid" : "ffff", + "ups.load" : "28", + "ups.delay.shutdown" : "20", + "ups.power.nominal" : "650", + "output.voltage.nominal" : "230", + "outlet.1.status" : "on", + "battery.type" : "PbAc", + "driver.version.data" : "MGE HID 1.33", + "ups.vendorid" : "0463", + "driver.parameter.pollinterval" : "5", + "ups.status" : "OL CHRG", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.firmware" : "03.08.0018", + "ups.start.battery" : "yes", + "output.frequency.nominal" : "50", + "battery.charge" : "100", + "outlet.id" : "1", + "output.frequency" : "49.9", + "driver.name" : "usbhid-ups", + "battery.runtime" : "1032", + "input.voltage" : "239.0", + "ups.beeper.status" : "enabled", + "device.mfr" : "EATON", + "device.type" : "ups", + "ups.mfr" : "EATON", + "output.voltage" : "238.0", + "outlet.desc" : "Main Outlet" +} diff --git a/tests/fixtures/nut/DL650ELCD.json b/tests/fixtures/nut/DL650ELCD.json new file mode 100644 index 000000000000..fe6686e7f6fb --- /dev/null +++ b/tests/fixtures/nut/DL650ELCD.json @@ -0,0 +1,39 @@ +{ + "ups.delay.shutdown" : "20", + "battery.charge.warning" : "20", + "battery.runtime.low" : "300", + "device.type" : "ups", + "ups.load" : "33", + "driver.parameter.port" : "auto", + "driver.name" : "usbhid-ups", + "input.transfer.high" : "0", + "ups.mfr" : "CPS", + "ups.test.result" : "No test initiated", + "output.voltage" : "229.0", + "ups.vendorid" : "0764", + "ups.realpower.nominal" : "360", + "device.model" : "DL650ELCD", + "battery.voltage.nominal" : "12", + "battery.type" : "PbAcid", + "ups.model" : "DL650ELCD", + "ups.beeper.status" : "enabled", + "driver.version.data" : "CyberPower HID 0.3", + "device.mfr" : "CPS", + "driver.parameter.pollinterval" : "5", + "ups.status" : "OL", + "battery.mfr.date" : "CPS", + "battery.charge.low" : "10", + "input.voltage" : "230.0", + "driver.version" : "SDS5-2-2015Q1branch-5619-150904", + "input.transfer.low" : "0", + "driver.parameter.pollfreq" : "30", + "driver.version.internal" : "0.38", + "ups.productid" : "0501", + "ups.timer.shutdown" : "-60", + "input.voltage.nominal" : "230", + "battery.voltage" : "9.1", + "battery.charge" : "100", + "ups.timer.start" : "-60", + "battery.runtime" : "850", + "ups.delay.start" : "30" +} diff --git a/tests/fixtures/nut/blazer_usb.json b/tests/fixtures/nut/blazer_usb.json new file mode 100644 index 000000000000..4f9acf2a6f05 --- /dev/null +++ b/tests/fixtures/nut/blazer_usb.json @@ -0,0 +1,28 @@ +{ + "input.voltage.fault" : "228.4", + "ups.status" : "OL", + "ups.productid" : "0000", + "ups.beeper.status" : "enabled", + "input.current.nominal" : "4.0", + "driver.name" : "blazer_usb", + "input.voltage" : "228.4", + "battery.voltage.low" : "20.80", + "battery.charge" : "100", + "driver.version.internal" : "0.11", + "input.frequency.nominal" : "50", + "battery.voltage.high" : "26.00", + "driver.parameter.port" : "auto", + "ups.type" : "offline / line interactive", + "driver.parameter.pollinterval" : "5", + "device.type" : "ups", + "output.voltage" : "228.4", + "input.frequency" : "50.1", + "input.voltage.nominal" : "230", + "ups.delay.shutdown" : "30", + "battery.voltage.nominal" : "24.0", + "ups.load" : "7", + "driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507", + "ups.vendorid" : "0001", + "battery.voltage" : "27.00", + "ups.delay.start" : "180" +} From d6a47cb3e058ca3c10eecc048347ef4e51ae4ebe Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Apr 2020 21:38:31 -0500 Subject: [PATCH 433/653] Set homekit alarm/sensor/switch/cover state as soon as possible (#34245) * Set homekit alarm/sensor/switch state as soon as possible This change is part of a multi-part effort to fix the HomeKit event storms on startup. Previously we would set the states after HomeKit had started up which meant that when the controller client connected it would request the states and get a list of default states so all the initial states would always be wrong. The defaults states generally went unnoticed because we set the state of each HomeKit device soon after which would result in an event storm in the log that looked like the following for every client and every device: Sending event to client: ('192.168.x.x', 58410) Sending event to client: ('192.168.x.x', 53399) Sending event to client: ('192.168.x.x', 53399) To solve this, we now set the state right away when we create the entity in HomeKit, so it is correct on initial sync, which avoids the event storm. Additionally, we now check all states values before sending an update to HomeKit to ensure we do not send events when nothing has changed. * pylint * Fix event storm in covers as well * fix refactoring error in security system * cover positions, now with constants --- homeassistant/components/homekit/const.py | 5 ++ .../components/homekit/type_covers.py | 54 +++++++----- .../homekit/type_security_systems.py | 27 +++--- .../components/homekit/type_sensors.py | 82 +++++++++++++------ .../components/homekit/type_switches.py | 38 +++++---- .../components/homekit/test_type_switches.py | 20 ++--- 6 files changed, 146 insertions(+), 80 deletions(-) diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index 3d64aaf3bea3..5f48b122e64e 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -190,3 +190,8 @@ HK_DOOR_CLOSED = 1 HK_DOOR_OPENING = 2 HK_DOOR_CLOSING = 3 HK_DOOR_STOPPED = 4 + +# ### Position State #### +HK_POSITION_GOING_TO_MIN = 0 +HK_POSITION_GOING_TO_MAX = 1 +HK_POSITION_STOPPED = 2 diff --git a/homeassistant/components/homekit/type_covers.py b/homeassistant/components/homekit/type_covers.py index 8e55bc2a4b91..987ba900bc84 100644 --- a/homeassistant/components/homekit/type_covers.py +++ b/homeassistant/components/homekit/type_covers.py @@ -42,6 +42,9 @@ from .const import ( HK_DOOR_CLOSING, HK_DOOR_OPEN, HK_DOOR_OPENING, + HK_POSITION_GOING_TO_MAX, + HK_POSITION_GOING_TO_MIN, + HK_POSITION_STOPPED, SERV_GARAGE_DOOR_OPENER, SERV_WINDOW_COVERING, ) @@ -134,10 +137,9 @@ class WindowCoveringBase(HomeAccessory): def __init__(self, *args, category): """Initialize a WindowCoveringBase accessory object.""" super().__init__(*args, category=CATEGORY_WINDOW_COVERING) + state = self.hass.states.get(self.entity_id) - self.features = self.hass.states.get(self.entity_id).attributes.get( - ATTR_SUPPORTED_FEATURES, 0 - ) + self.features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) self._supports_stop = self.features & SUPPORT_STOP self._homekit_target_tilt = None self.chars = [] @@ -192,7 +194,8 @@ class WindowCoveringBase(HomeAccessory): # We'll have to normalize to [0,100] current_tilt = (current_tilt / 100.0 * 180.0) - 90.0 current_tilt = int(current_tilt) - self.char_current_tilt.set_value(current_tilt) + if self.char_current_tilt.value != current_tilt: + self.char_current_tilt.set_value(current_tilt) # We have to assume that the device has worse precision than HomeKit. # If it reports back a state that is only _close_ to HK's requested @@ -201,7 +204,8 @@ class WindowCoveringBase(HomeAccessory): if self._homekit_target_tilt is None or abs( current_tilt - self._homekit_target_tilt < DEVICE_PRECISION_LEEWAY ): - self.char_target_tilt.set_value(current_tilt) + if self.char_target_tilt.value != current_tilt: + self.char_target_tilt.set_value(current_tilt) self._homekit_target_tilt = None @@ -215,7 +219,7 @@ class WindowCovering(WindowCoveringBase, HomeAccessory): def __init__(self, *args): """Initialize a WindowCovering accessory object.""" super().__init__(*args, category=CATEGORY_WINDOW_COVERING) - + state = self.hass.states.get(self.entity_id) self._homekit_target = None self.char_current_position = self.serv_cover.configure_char( @@ -225,8 +229,9 @@ class WindowCovering(WindowCoveringBase, HomeAccessory): CHAR_TARGET_POSITION, value=0, setter_callback=self.move_cover ) self.char_position_state = self.serv_cover.configure_char( - CHAR_POSITION_STATE, value=2 + CHAR_POSITION_STATE, value=HK_POSITION_STOPPED ) + self.update_state(state) @debounce def move_cover(self, value): @@ -242,7 +247,8 @@ class WindowCovering(WindowCoveringBase, HomeAccessory): current_position = new_state.attributes.get(ATTR_CURRENT_POSITION) if isinstance(current_position, (float, int)): current_position = int(current_position) - self.char_current_position.set_value(current_position) + if self.char_current_position.value != current_position: + self.char_current_position.set_value(current_position) # We have to assume that the device has worse precision than HomeKit. # If it reports back a state that is only _close_ to HK's requested @@ -253,14 +259,18 @@ class WindowCovering(WindowCoveringBase, HomeAccessory): or abs(current_position - self._homekit_target) < DEVICE_PRECISION_LEEWAY ): - self.char_target_position.set_value(current_position) + if self.char_target_position.value != current_position: + self.char_target_position.set_value(current_position) self._homekit_target = None if new_state.state == STATE_OPENING: - self.char_position_state.set_value(1) + if self.char_position_state.value != HK_POSITION_GOING_TO_MAX: + self.char_position_state.set_value(HK_POSITION_GOING_TO_MAX) elif new_state.state == STATE_CLOSING: - self.char_position_state.set_value(0) + if self.char_position_state.value != HK_POSITION_GOING_TO_MIN: + self.char_position_state.set_value(HK_POSITION_GOING_TO_MIN) else: - self.char_position_state.set_value(2) + if self.char_position_state.value != HK_POSITION_STOPPED: + self.char_position_state.set_value(HK_POSITION_STOPPED) super().update_state(new_state) @@ -276,7 +286,7 @@ class WindowCoveringBasic(WindowCoveringBase, HomeAccessory): def __init__(self, *args): """Initialize a WindowCovering accessory object.""" super().__init__(*args, category=CATEGORY_WINDOW_COVERING) - + state = self.hass.states.get(self.entity_id) self.char_current_position = self.serv_cover.configure_char( CHAR_CURRENT_POSITION, value=0 ) @@ -284,8 +294,9 @@ class WindowCoveringBasic(WindowCoveringBase, HomeAccessory): CHAR_TARGET_POSITION, value=0, setter_callback=self.move_cover ) self.char_position_state = self.serv_cover.configure_char( - CHAR_POSITION_STATE, value=2 + CHAR_POSITION_STATE, value=HK_POSITION_STOPPED ) + self.update_state(state) @debounce def move_cover(self, value): @@ -317,13 +328,18 @@ class WindowCoveringBasic(WindowCoveringBase, HomeAccessory): position_mapping = {STATE_OPEN: 100, STATE_CLOSED: 0} hk_position = position_mapping.get(new_state.state) if hk_position is not None: - self.char_current_position.set_value(hk_position) - self.char_target_position.set_value(hk_position) + if self.char_current_position.value != hk_position: + self.char_current_position.set_value(hk_position) + if self.char_target_position.value != hk_position: + self.char_target_position.set_value(hk_position) if new_state.state == STATE_OPENING: - self.char_position_state.set_value(1) + if self.char_position_state.value != HK_POSITION_GOING_TO_MAX: + self.char_position_state.set_value(HK_POSITION_GOING_TO_MAX) elif new_state.state == STATE_CLOSING: - self.char_position_state.set_value(0) + if self.char_position_state.value != HK_POSITION_GOING_TO_MIN: + self.char_position_state.set_value(HK_POSITION_GOING_TO_MIN) else: - self.char_position_state.set_value(2) + if self.char_position_state.value != HK_POSITION_STOPPED: + self.char_position_state.set_value(HK_POSITION_STOPPED) super().update_state(new_state) diff --git a/homeassistant/components/homekit/type_security_systems.py b/homeassistant/components/homekit/type_security_systems.py index 345709eb7daa..59e10a42c29e 100644 --- a/homeassistant/components/homekit/type_security_systems.py +++ b/homeassistant/components/homekit/type_security_systems.py @@ -53,8 +53,8 @@ class SecuritySystem(HomeAccessory): def __init__(self, *args): """Initialize a SecuritySystem accessory object.""" super().__init__(*args, category=CATEGORY_ALARM_SYSTEM) + state = self.hass.states.get(self.entity_id) self._alarm_code = self.config.get(ATTR_CODE) - self._flag_state = False serv_alarm = self.add_preload_service(SERV_SECURITY_SYSTEM) self.char_current_state = serv_alarm.configure_char( @@ -63,11 +63,13 @@ class SecuritySystem(HomeAccessory): self.char_target_state = serv_alarm.configure_char( CHAR_TARGET_SECURITY_STATE, value=3, setter_callback=self.set_security_state ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def set_security_state(self, value): """Move security state to value if call came from HomeKit.""" _LOGGER.debug("%s: Set security state to %d", self.entity_id, value) - self._flag_state = True hass_value = HOMEKIT_TO_HASS[value] service = STATE_TO_SERVICE[hass_value] @@ -81,15 +83,18 @@ class SecuritySystem(HomeAccessory): hass_state = new_state.state if hass_state in HASS_TO_HOMEKIT: current_security_state = HASS_TO_HOMEKIT[hass_state] - self.char_current_state.set_value(current_security_state) - _LOGGER.debug( - "%s: Updated current state to %s (%d)", - self.entity_id, - hass_state, - current_security_state, - ) + if self.char_current_state.value != current_security_state: + self.char_current_state.set_value(current_security_state) + _LOGGER.debug( + "%s: Updated current state to %s (%d)", + self.entity_id, + hass_state, + current_security_state, + ) # SecuritySystemTargetState does not support triggered - if not self._flag_state and hass_state != STATE_ALARM_TRIGGERED: + if ( + hass_state != STATE_ALARM_TRIGGERED + and self.char_target_state.value != current_security_state + ): self.char_target_state.set_value(current_security_state) - self._flag_state = False diff --git a/homeassistant/components/homekit/type_sensors.py b/homeassistant/components/homekit/type_sensors.py index a1450518e0cf..78cb21bc88ac 100644 --- a/homeassistant/components/homekit/type_sensors.py +++ b/homeassistant/components/homekit/type_sensors.py @@ -83,10 +83,14 @@ class TemperatureSensor(HomeAccessory): def __init__(self, *args): """Initialize a TemperatureSensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) + state = self.hass.states.get(self.entity_id) serv_temp = self.add_preload_service(SERV_TEMPERATURE_SENSOR) self.char_temp = serv_temp.configure_char( CHAR_CURRENT_TEMPERATURE, value=0, properties=PROP_CELSIUS ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update temperature after state changed.""" @@ -94,10 +98,11 @@ class TemperatureSensor(HomeAccessory): temperature = convert_to_float(new_state.state) if temperature: temperature = temperature_to_homekit(temperature, unit) - self.char_temp.set_value(temperature) - _LOGGER.debug( - "%s: Current temperature set to %.1f°C", self.entity_id, temperature - ) + if self.char_temp.value != temperature: + self.char_temp.set_value(temperature) + _LOGGER.debug( + "%s: Current temperature set to %.1f°C", self.entity_id, temperature + ) @TYPES.register("HumiditySensor") @@ -107,15 +112,19 @@ class HumiditySensor(HomeAccessory): def __init__(self, *args): """Initialize a HumiditySensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) + state = self.hass.states.get(self.entity_id) serv_humidity = self.add_preload_service(SERV_HUMIDITY_SENSOR) self.char_humidity = serv_humidity.configure_char( CHAR_CURRENT_HUMIDITY, value=0 ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" humidity = convert_to_float(new_state.state) - if humidity: + if humidity and self.char_humidity.value != humidity: self.char_humidity.set_value(humidity) _LOGGER.debug("%s: Percent set to %d%%", self.entity_id, humidity) @@ -127,7 +136,7 @@ class AirQualitySensor(HomeAccessory): def __init__(self, *args): """Initialize a AirQualitySensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) - + state = self.hass.states.get(self.entity_id) serv_air_quality = self.add_preload_service( SERV_AIR_QUALITY_SENSOR, [CHAR_AIR_PARTICULATE_DENSITY] ) @@ -135,14 +144,21 @@ class AirQualitySensor(HomeAccessory): self.char_density = serv_air_quality.configure_char( CHAR_AIR_PARTICULATE_DENSITY, value=0 ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" density = convert_to_float(new_state.state) if density: - self.char_density.set_value(density) - self.char_quality.set_value(density_to_air_quality(density)) - _LOGGER.debug("%s: Set to %d", self.entity_id, density) + if self.char_density.value != density: + self.char_density.set_value(density) + _LOGGER.debug("%s: Set density to %d", self.entity_id, density) + air_quality = density_to_air_quality(density) + if self.char_quality.value != air_quality: + self.char_quality.set_value(air_quality) + _LOGGER.debug("%s: Set air_quality to %d", self.entity_id, air_quality) @TYPES.register("CarbonMonoxideSensor") @@ -152,7 +168,7 @@ class CarbonMonoxideSensor(HomeAccessory): def __init__(self, *args): """Initialize a CarbonMonoxideSensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) - + state = self.hass.states.get(self.entity_id) serv_co = self.add_preload_service( SERV_CARBON_MONOXIDE_SENSOR, [CHAR_CARBON_MONOXIDE_LEVEL, CHAR_CARBON_MONOXIDE_PEAK_LEVEL], @@ -164,16 +180,22 @@ class CarbonMonoxideSensor(HomeAccessory): self.char_detected = serv_co.configure_char( CHAR_CARBON_MONOXIDE_DETECTED, value=0 ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" value = convert_to_float(new_state.state) if value: - self.char_level.set_value(value) + if self.char_level.value != value: + self.char_level.set_value(value) if value > self.char_peak.value: self.char_peak.set_value(value) - self.char_detected.set_value(value > THRESHOLD_CO) - _LOGGER.debug("%s: Set to %d", self.entity_id, value) + co_detected = value > THRESHOLD_CO + if self.char_detected.value is not co_detected: + self.char_detected.set_value(co_detected) + _LOGGER.debug("%s: Set to %d", self.entity_id, value) @TYPES.register("CarbonDioxideSensor") @@ -183,7 +205,7 @@ class CarbonDioxideSensor(HomeAccessory): def __init__(self, *args): """Initialize a CarbonDioxideSensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) - + state = self.hass.states.get(self.entity_id) serv_co2 = self.add_preload_service( SERV_CARBON_DIOXIDE_SENSOR, [CHAR_CARBON_DIOXIDE_LEVEL, CHAR_CARBON_DIOXIDE_PEAK_LEVEL], @@ -195,16 +217,22 @@ class CarbonDioxideSensor(HomeAccessory): self.char_detected = serv_co2.configure_char( CHAR_CARBON_DIOXIDE_DETECTED, value=0 ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" value = convert_to_float(new_state.state) if value: - self.char_level.set_value(value) + if self.char_level.value != value: + self.char_level.set_value(value) if value > self.char_peak.value: self.char_peak.set_value(value) - self.char_detected.set_value(value > THRESHOLD_CO2) - _LOGGER.debug("%s: Set to %d", self.entity_id, value) + co2_detected = value > THRESHOLD_CO2 + if self.char_detected.value is not co2_detected: + self.char_detected.set_value(co2_detected) + _LOGGER.debug("%s: Set to %d", self.entity_id, value) @TYPES.register("LightSensor") @@ -214,16 +242,19 @@ class LightSensor(HomeAccessory): def __init__(self, *args): """Initialize a LightSensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) - + state = self.hass.states.get(self.entity_id) serv_light = self.add_preload_service(SERV_LIGHT_SENSOR) self.char_light = serv_light.configure_char( CHAR_CURRENT_AMBIENT_LIGHT_LEVEL, value=0 ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" luminance = convert_to_float(new_state.state) - if luminance: + if luminance and self.char_light.value != luminance: self.char_light.set_value(luminance) _LOGGER.debug("%s: Set to %d", self.entity_id, luminance) @@ -235,9 +266,8 @@ class BinarySensor(HomeAccessory): def __init__(self, *args): """Initialize a BinarySensor accessory object.""" super().__init__(*args, category=CATEGORY_SENSOR) - device_class = self.hass.states.get(self.entity_id).attributes.get( - ATTR_DEVICE_CLASS - ) + state = self.hass.states.get(self.entity_id) + device_class = state.attributes.get(ATTR_DEVICE_CLASS) service_char = ( BINARY_SENSOR_SERVICE_MAP[device_class] if device_class in BINARY_SENSOR_SERVICE_MAP @@ -246,10 +276,14 @@ class BinarySensor(HomeAccessory): service = self.add_preload_service(service_char[0]) self.char_detected = service.configure_char(service_char[1], value=0) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def update_state(self, new_state): """Update accessory after state change.""" state = new_state.state detected = state in (STATE_ON, STATE_HOME) - self.char_detected.set_value(detected) - _LOGGER.debug("%s: Set to %d", self.entity_id, detected) + if self.char_detected.value != detected: + self.char_detected.set_value(detected) + _LOGGER.debug("%s: Set to %d", self.entity_id, detected) diff --git a/homeassistant/components/homekit/type_switches.py b/homeassistant/components/homekit/type_switches.py index 66d3037b8944..5dcac8b7259b 100644 --- a/homeassistant/components/homekit/type_switches.py +++ b/homeassistant/components/homekit/type_switches.py @@ -55,7 +55,7 @@ class Outlet(HomeAccessory): def __init__(self, *args): """Initialize an Outlet accessory object.""" super().__init__(*args, category=CATEGORY_OUTLET) - self._flag_state = False + state = self.hass.states.get(self.entity_id) serv_outlet = self.add_preload_service(SERV_OUTLET) self.char_on = serv_outlet.configure_char( @@ -64,11 +64,13 @@ class Outlet(HomeAccessory): self.char_outlet_in_use = serv_outlet.configure_char( CHAR_OUTLET_IN_USE, value=True ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def set_state(self, value): """Move switch state to value if call came from HomeKit.""" _LOGGER.debug("%s: Set switch state to %s", self.entity_id, value) - self._flag_state = True params = {ATTR_ENTITY_ID: self.entity_id} service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF self.call_service(DOMAIN, service, params) @@ -76,10 +78,9 @@ class Outlet(HomeAccessory): def update_state(self, new_state): """Update switch state after state changed.""" current_state = new_state.state == STATE_ON - if not self._flag_state: + if self.char_on.value is not current_state: _LOGGER.debug("%s: Set current state to %s", self.entity_id, current_state) self.char_on.set_value(current_state) - self._flag_state = False @TYPES.register("Switch") @@ -90,7 +91,7 @@ class Switch(HomeAccessory): """Initialize a Switch accessory object.""" super().__init__(*args, category=CATEGORY_SWITCH) self._domain = split_entity_id(self.entity_id)[0] - self._flag_state = False + state = self.hass.states.get(self.entity_id) self.activate_only = self.is_activate(self.hass.states.get(self.entity_id)) @@ -98,6 +99,9 @@ class Switch(HomeAccessory): self.char_on = serv_switch.configure_char( CHAR_ON, value=False, setter_callback=self.set_state ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def is_activate(self, state): """Check if entity is activate only.""" @@ -111,15 +115,15 @@ class Switch(HomeAccessory): def reset_switch(self, *args): """Reset switch to emulate activate click.""" _LOGGER.debug("%s: Reset switch to off", self.entity_id) - self.char_on.set_value(0) + if self.char_on.value is not False: + self.char_on.set_value(False) def set_state(self, value): """Move switch state to value if call came from HomeKit.""" _LOGGER.debug("%s: Set switch state to %s", self.entity_id, value) - if self.activate_only and value == 0: + if self.activate_only and not value: _LOGGER.debug("%s: Ignoring turn_off call", self.entity_id) return - self._flag_state = True params = {ATTR_ENTITY_ID: self.entity_id} service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF self.call_service(self._domain, service, params) @@ -137,10 +141,9 @@ class Switch(HomeAccessory): return current_state = new_state.state == STATE_ON - if not self._flag_state: + if self.char_on.value is not current_state: _LOGGER.debug("%s: Set current state to %s", self.entity_id, current_state) self.char_on.set_value(current_state) - self._flag_state = False @TYPES.register("Valve") @@ -150,7 +153,7 @@ class Valve(HomeAccessory): def __init__(self, *args): """Initialize a Valve accessory object.""" super().__init__(*args) - self._flag_state = False + state = self.hass.states.get(self.entity_id) valve_type = self.config[CONF_TYPE] self.category = VALVE_TYPE[valve_type][0] @@ -162,11 +165,13 @@ class Valve(HomeAccessory): self.char_valve_type = serv_valve.configure_char( CHAR_VALVE_TYPE, value=VALVE_TYPE[valve_type][1] ) + # Set the state so it is in sync on initial + # GET to avoid an event storm after homekit startup + self.update_state(state) def set_state(self, value): """Move value state to value if call came from HomeKit.""" _LOGGER.debug("%s: Set switch state to %s", self.entity_id, value) - self._flag_state = True self.char_in_use.set_value(value) params = {ATTR_ENTITY_ID: self.entity_id} service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF @@ -174,9 +179,10 @@ class Valve(HomeAccessory): def update_state(self, new_state): """Update switch state after state changed.""" - current_state = new_state.state == STATE_ON - if not self._flag_state: - _LOGGER.debug("%s: Set current state to %s", self.entity_id, current_state) + current_state = 1 if new_state.state == STATE_ON else 0 + if self.char_active.value != current_state: + _LOGGER.debug("%s: Set active state to %s", self.entity_id, current_state) self.char_active.set_value(current_state) + if self.char_in_use.value != current_state: + _LOGGER.debug("%s: Set in_use state to %s", self.entity_id, current_state) self.char_in_use.set_value(current_state) - self._flag_state = False diff --git a/tests/components/homekit/test_type_switches.py b/tests/components/homekit/test_type_switches.py index 1a24c883c046..f8120d8ebbc0 100644 --- a/tests/components/homekit/test_type_switches.py +++ b/tests/components/homekit/test_type_switches.py @@ -147,35 +147,35 @@ async def test_valve_set_state(hass, hk_driver, events): assert acc.aid == 2 assert acc.category == 29 # Faucet - assert acc.char_active.value is False - assert acc.char_in_use.value is False + assert acc.char_active.value == 0 + assert acc.char_in_use.value == 0 assert acc.char_valve_type.value == 0 # Generic Valve hass.states.async_set(entity_id, STATE_ON) await hass.async_block_till_done() - assert acc.char_active.value is True - assert acc.char_in_use.value is True + assert acc.char_active.value == 1 + assert acc.char_in_use.value == 1 hass.states.async_set(entity_id, STATE_OFF) await hass.async_block_till_done() - assert acc.char_active.value is False - assert acc.char_in_use.value is False + assert acc.char_active.value == 0 + assert acc.char_in_use.value == 0 # Set from HomeKit call_turn_on = async_mock_service(hass, "switch", "turn_on") call_turn_off = async_mock_service(hass, "switch", "turn_off") - await hass.async_add_executor_job(acc.char_active.client_update_value, True) + await hass.async_add_executor_job(acc.char_active.client_update_value, 1) await hass.async_block_till_done() - assert acc.char_in_use.value is True + assert acc.char_in_use.value == 1 assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is None - await hass.async_add_executor_job(acc.char_active.client_update_value, False) + await hass.async_add_executor_job(acc.char_active.client_update_value, 0) await hass.async_block_till_done() - assert acc.char_in_use.value is False + assert acc.char_in_use.value == 0 assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id assert len(events) == 2 From e8710002b119845b6833df4af876135ef7e1f2bb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Apr 2020 21:39:31 -0500 Subject: [PATCH 434/653] Convert homekit fans to use service callbacks (#34229) * Convert homekit fans to use service callbacks * Convert homekit fans to use service callbacks Service callbacks allow us ensure that we call fan services in the correct order. * Avoid calling turn_on if a speed is sent and the device is on * Fix test to not leave files behind * Fix test * Update homeassistant/components/homekit/type_fans.py Co-Authored-By: Paulus Schoutsen Co-authored-by: Paulus Schoutsen --- homeassistant/components/homekit/type_fans.py | 84 ++--- tests/components/homekit/conftest.py | 4 +- tests/components/homekit/test_type_fans.py | 317 +++++++++++++++++- tests/components/homekit/test_type_lights.py | 59 ++-- .../homekit/test_type_thermostats.py | 94 +++--- 5 files changed, 420 insertions(+), 138 deletions(-) diff --git a/homeassistant/components/homekit/type_fans.py b/homeassistant/components/homekit/type_fans.py index e6d128d1e28b..9167c8fcf5dd 100644 --- a/homeassistant/components/homekit/type_fans.py +++ b/homeassistant/components/homekit/type_fans.py @@ -28,7 +28,7 @@ from homeassistant.const import ( ) from . import TYPES -from .accessories import HomeAccessory, debounce +from .accessories import HomeAccessory from .const import ( CHAR_ACTIVE, CHAR_ROTATION_DIRECTION, @@ -51,17 +51,11 @@ class Fan(HomeAccessory): def __init__(self, *args): """Initialize a new Light accessory object.""" super().__init__(*args, category=CATEGORY_FAN) - self._flag = { - CHAR_ACTIVE: False, - CHAR_ROTATION_DIRECTION: False, - CHAR_SWING_MODE: False, - } - self._state = 0 - chars = [] - features = self.hass.states.get(self.entity_id).attributes.get( - ATTR_SUPPORTED_FEATURES - ) + state = self.hass.states.get(self.entity_id) + + features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0) + if features & SUPPORT_DIRECTION: chars.append(CHAR_ROTATION_DIRECTION) if features & SUPPORT_OSCILLATE: @@ -74,9 +68,7 @@ class Fan(HomeAccessory): chars.append(CHAR_ROTATION_SPEED) serv_fan = self.add_preload_service(SERV_FANV2, chars) - self.char_active = serv_fan.configure_char( - CHAR_ACTIVE, value=0, setter_callback=self.set_state - ) + self.char_active = serv_fan.configure_char(CHAR_ACTIVE, value=0) self.char_direction = None self.char_speed = None @@ -84,26 +76,52 @@ class Fan(HomeAccessory): if CHAR_ROTATION_DIRECTION in chars: self.char_direction = serv_fan.configure_char( - CHAR_ROTATION_DIRECTION, value=0, setter_callback=self.set_direction + CHAR_ROTATION_DIRECTION, value=0 ) if CHAR_ROTATION_SPEED in chars: # Initial value is set to 100 because 0 is a special value (off). 100 is # an arbitrary non-zero value. It is updated immediately by update_state # to set to the correct initial value. - self.char_speed = serv_fan.configure_char( - CHAR_ROTATION_SPEED, value=100, setter_callback=self.set_speed - ) + self.char_speed = serv_fan.configure_char(CHAR_ROTATION_SPEED, value=100) if CHAR_SWING_MODE in chars: - self.char_swing = serv_fan.configure_char( - CHAR_SWING_MODE, value=0, setter_callback=self.set_oscillating - ) + self.char_swing = serv_fan.configure_char(CHAR_SWING_MODE, value=0) + self.update_state(state) + serv_fan.setter_callback = self._set_chars + + def _set_chars(self, char_values): + _LOGGER.debug("Fan _set_chars: %s", char_values) + if CHAR_ACTIVE in char_values: + if char_values[CHAR_ACTIVE]: + is_on = False + state = self.hass.states.get(self.entity_id) + if state and state.state == STATE_ON: + is_on = True + # Only set the state to active if we + # did not get a rotation speed or its off + if not is_on or CHAR_ROTATION_SPEED not in char_values: + self.set_state(1) + else: + # Its off, nothing more to do as setting the + # other chars will likely turn it back on which + # is what we want to avoid + self.set_state(0) + return + + if CHAR_SWING_MODE in char_values: + self.set_oscillating(char_values[CHAR_SWING_MODE]) + if CHAR_ROTATION_DIRECTION in char_values: + self.set_direction(char_values[CHAR_ROTATION_DIRECTION]) + + # We always do this LAST to ensure they + # get the speed they asked for + if CHAR_ROTATION_SPEED in char_values: + self.set_speed(char_values[CHAR_ROTATION_SPEED]) def set_state(self, value): """Set state if call came from HomeKit.""" _LOGGER.debug("%s: Set state to %d", self.entity_id, value) - self._flag[CHAR_ACTIVE] = True service = SERVICE_TURN_ON if value == 1 else SERVICE_TURN_OFF params = {ATTR_ENTITY_ID: self.entity_id} self.call_service(DOMAIN, service, params) @@ -111,7 +129,6 @@ class Fan(HomeAccessory): def set_direction(self, value): """Set state if call came from HomeKit.""" _LOGGER.debug("%s: Set direction to %d", self.entity_id, value) - self._flag[CHAR_ROTATION_DIRECTION] = True direction = DIRECTION_REVERSE if value == 1 else DIRECTION_FORWARD params = {ATTR_ENTITY_ID: self.entity_id, ATTR_DIRECTION: direction} self.call_service(DOMAIN, SERVICE_SET_DIRECTION, params, direction) @@ -119,12 +136,10 @@ class Fan(HomeAccessory): def set_oscillating(self, value): """Set state if call came from HomeKit.""" _LOGGER.debug("%s: Set oscillating to %d", self.entity_id, value) - self._flag[CHAR_SWING_MODE] = True oscillating = value == 1 params = {ATTR_ENTITY_ID: self.entity_id, ATTR_OSCILLATING: oscillating} self.call_service(DOMAIN, SERVICE_OSCILLATE, params, oscillating) - @debounce def set_speed(self, value): """Set state if call came from HomeKit.""" _LOGGER.debug("%s: Set speed to %d", self.entity_id, value) @@ -138,21 +153,16 @@ class Fan(HomeAccessory): state = new_state.state if state in (STATE_ON, STATE_OFF): self._state = 1 if state == STATE_ON else 0 - if not self._flag[CHAR_ACTIVE] and self.char_active.value != self._state: + if self.char_active.value != self._state: self.char_active.set_value(self._state) - self._flag[CHAR_ACTIVE] = False # Handle Direction if self.char_direction is not None: direction = new_state.attributes.get(ATTR_DIRECTION) - if not self._flag[CHAR_ROTATION_DIRECTION] and direction in ( - DIRECTION_FORWARD, - DIRECTION_REVERSE, - ): + if direction in (DIRECTION_FORWARD, DIRECTION_REVERSE): hk_direction = 1 if direction == DIRECTION_REVERSE else 0 if self.char_direction.value != hk_direction: self.char_direction.set_value(hk_direction) - self._flag[CHAR_ROTATION_DIRECTION] = False # Handle Speed if self.char_speed is not None: @@ -170,17 +180,15 @@ class Fan(HomeAccessory): # Therefore, if the hk_speed_value is 0 and the device is still on, # the rotation speed is mapped to 1 otherwise the update is ignored # in order to avoid this incorrect behavior. - if hk_speed_value == 0: - if state == STATE_ON: - self.char_speed.set_value(1) - else: + if hk_speed_value == 0 and state == STATE_ON: + hk_speed_value = 1 + if self.char_speed.value != hk_speed_value: self.char_speed.set_value(hk_speed_value) # Handle Oscillating if self.char_swing is not None: oscillating = new_state.attributes.get(ATTR_OSCILLATING) - if not self._flag[CHAR_SWING_MODE] and oscillating in (True, False): + if isinstance(oscillating, bool): hk_oscillating = 1 if oscillating else 0 if self.char_swing.value != hk_oscillating: self.char_swing.set_value(hk_oscillating) - self._flag[CHAR_SWING_MODE] = False diff --git a/tests/components/homekit/conftest.py b/tests/components/homekit/conftest.py index ef534d0e4728..7093bebf9aba 100644 --- a/tests/components/homekit/conftest.py +++ b/tests/components/homekit/conftest.py @@ -15,8 +15,10 @@ def hk_driver(): "pyhap.accessory_driver.AccessoryEncoder" ), patch("pyhap.accessory_driver.HAPServer"), patch( "pyhap.accessory_driver.AccessoryDriver.publish" + ), patch( + "pyhap.accessory_driver.AccessoryDriver.persist" ): - return AccessoryDriver(pincode=b"123-45-678", address="127.0.0.1") + yield AccessoryDriver(pincode=b"123-45-678", address="127.0.0.1") @pytest.fixture diff --git a/tests/components/homekit/test_type_fans.py b/tests/components/homekit/test_type_fans.py index 8d51d5a7181a..b77b799900a7 100644 --- a/tests/components/homekit/test_type_fans.py +++ b/tests/components/homekit/test_type_fans.py @@ -2,6 +2,7 @@ from collections import namedtuple from unittest.mock import Mock +from pyhap.const import HAP_REPR_AID, HAP_REPR_CHARS, HAP_REPR_IID, HAP_REPR_VALUE import pytest from homeassistant.components.fan import ( @@ -53,11 +54,12 @@ async def test_fan_basic(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_ON, {ATTR_SUPPORTED_FEATURES: 0}) await hass.async_block_till_done() - acc = cls.fan(hass, hk_driver, "Fan", entity_id, 2, None) + acc = cls.fan(hass, hk_driver, "Fan", entity_id, 1, None) + hk_driver.add_accessory(acc) - assert acc.aid == 2 + assert acc.aid == 1 assert acc.category == 3 # Fan - assert acc.char_active.value == 0 + assert acc.char_active.value == 1 # If there are no speed_list values, then HomeKit speed is unsupported assert acc.char_speed is None @@ -82,7 +84,20 @@ async def test_fan_basic(hass, hk_driver, cls, events): call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") - await hass.async_add_executor_job(acc.char_active.client_update_value, 1) + char_active_iid = acc.char_active.to_HAP()[HAP_REPR_IID] + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_active_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_on assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id @@ -92,7 +107,18 @@ async def test_fan_basic(hass, hk_driver, cls, events): hass.states.async_set(entity_id, STATE_ON) await hass.async_block_till_done() - await hass.async_add_executor_job(acc.char_active.client_update_value, 0) + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_active_iid, + HAP_REPR_VALUE: 0, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_turn_off assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id @@ -110,7 +136,8 @@ async def test_fan_direction(hass, hk_driver, cls, events): {ATTR_SUPPORTED_FEATURES: SUPPORT_DIRECTION, ATTR_DIRECTION: DIRECTION_FORWARD}, ) await hass.async_block_till_done() - acc = cls.fan(hass, hk_driver, "Fan", entity_id, 2, None) + acc = cls.fan(hass, hk_driver, "Fan", entity_id, 1, None) + hk_driver.add_accessory(acc) assert acc.char_direction.value == 0 @@ -125,7 +152,20 @@ async def test_fan_direction(hass, hk_driver, cls, events): # Set from HomeKit call_set_direction = async_mock_service(hass, DOMAIN, "set_direction") - await hass.async_add_executor_job(acc.char_direction.client_update_value, 0) + char_direction_iid = acc.char_direction.to_HAP()[HAP_REPR_IID] + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_direction_iid, + HAP_REPR_VALUE: 0, + }, + ] + }, + "mock_addr", + ) await hass.async_block_till_done() assert call_set_direction[0] assert call_set_direction[0].data[ATTR_ENTITY_ID] == entity_id @@ -133,6 +173,18 @@ async def test_fan_direction(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == DIRECTION_FORWARD + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_direction_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) await hass.async_add_executor_job(acc.char_direction.client_update_value, 1) await hass.async_block_till_done() assert call_set_direction[1] @@ -152,7 +204,8 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): {ATTR_SUPPORTED_FEATURES: SUPPORT_OSCILLATE, ATTR_OSCILLATING: False}, ) await hass.async_block_till_done() - acc = cls.fan(hass, hk_driver, "Fan", entity_id, 2, None) + acc = cls.fan(hass, hk_driver, "Fan", entity_id, 1, None) + hk_driver.add_accessory(acc) assert acc.char_swing.value == 0 @@ -167,6 +220,20 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): # Set from HomeKit call_oscillate = async_mock_service(hass, DOMAIN, "oscillate") + char_swing_iid = acc.char_swing.to_HAP()[HAP_REPR_IID] + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_swing_iid, + HAP_REPR_VALUE: 0, + }, + ] + }, + "mock_addr", + ) await hass.async_add_executor_job(acc.char_swing.client_update_value, 0) await hass.async_block_till_done() assert call_oscillate[0] @@ -175,6 +242,18 @@ async def test_fan_oscillate(hass, hk_driver, cls, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] is False + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_swing_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) await hass.async_add_executor_job(acc.char_swing.client_update_value, 1) await hass.async_block_till_done() assert call_oscillate[1] @@ -199,7 +278,8 @@ async def test_fan_speed(hass, hk_driver, cls, events): }, ) await hass.async_block_till_done() - acc = cls.fan(hass, hk_driver, "Fan", entity_id, 2, None) + acc = cls.fan(hass, hk_driver, "Fan", entity_id, 1, None) + hk_driver.add_accessory(acc) # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the # speed to 100 when turning on a fan on a freshly booted up server. @@ -221,6 +301,20 @@ async def test_fan_speed(hass, hk_driver, cls, events): # Set from HomeKit call_set_speed = async_mock_service(hass, DOMAIN, "set_speed") + char_speed_iid = acc.char_speed.to_HAP()[HAP_REPR_IID] + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_speed_iid, + HAP_REPR_VALUE: 42, + }, + ] + }, + "mock_addr", + ) await hass.async_add_executor_job(acc.char_speed.client_update_value, 42) await hass.async_block_till_done() acc.speed_mapping.speed_to_states.assert_called_with(42) @@ -231,6 +325,211 @@ async def test_fan_speed(hass, hk_driver, cls, events): assert events[-1].data[ATTR_VALUE] == "ludicrous" +async def test_fan_set_all_one_shot(hass, hk_driver, cls, events): + """Test fan with speed.""" + entity_id = "fan.demo" + speed_list = [SPEED_OFF, SPEED_LOW, SPEED_HIGH] + + hass.states.async_set( + entity_id, + STATE_ON, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_SET_SPEED + | SUPPORT_OSCILLATE + | SUPPORT_DIRECTION, + ATTR_SPEED: SPEED_OFF, + ATTR_OSCILLATING: False, + ATTR_DIRECTION: DIRECTION_FORWARD, + ATTR_SPEED_LIST: speed_list, + }, + ) + await hass.async_block_till_done() + acc = cls.fan(hass, hk_driver, "Fan", entity_id, 1, None) + hk_driver.add_accessory(acc) + + # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the + # speed to 100 when turning on a fan on a freshly booted up server. + assert acc.char_speed.value != 0 + await acc.run_handler() + assert ( + acc.speed_mapping.speed_ranges == HomeKitSpeedMapping(speed_list).speed_ranges + ) + + acc.speed_mapping.speed_to_homekit = Mock(return_value=42) + acc.speed_mapping.speed_to_states = Mock(return_value="ludicrous") + + hass.states.async_set( + entity_id, + STATE_OFF, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_SET_SPEED + | SUPPORT_OSCILLATE + | SUPPORT_DIRECTION, + ATTR_SPEED: SPEED_OFF, + ATTR_OSCILLATING: False, + ATTR_DIRECTION: DIRECTION_FORWARD, + ATTR_SPEED_LIST: speed_list, + }, + ) + await hass.async_block_till_done() + assert hass.states.get(entity_id).state == STATE_OFF + + # Set from HomeKit + call_set_speed = async_mock_service(hass, DOMAIN, "set_speed") + call_oscillate = async_mock_service(hass, DOMAIN, "oscillate") + call_set_direction = async_mock_service(hass, DOMAIN, "set_direction") + call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") + call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") + + char_active_iid = acc.char_active.to_HAP()[HAP_REPR_IID] + char_direction_iid = acc.char_direction.to_HAP()[HAP_REPR_IID] + char_swing_iid = acc.char_swing.to_HAP()[HAP_REPR_IID] + char_speed_iid = acc.char_speed.to_HAP()[HAP_REPR_IID] + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_active_iid, + HAP_REPR_VALUE: 1, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_speed_iid, + HAP_REPR_VALUE: 42, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_swing_iid, + HAP_REPR_VALUE: 1, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_direction_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() + acc.speed_mapping.speed_to_states.assert_called_with(42) + assert call_turn_on + assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_speed[0] + assert call_set_speed[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_speed[0].data[ATTR_SPEED] == "ludicrous" + assert call_oscillate[0] + assert call_oscillate[0].data[ATTR_ENTITY_ID] == entity_id + assert call_oscillate[0].data[ATTR_OSCILLATING] is True + assert call_set_direction[0] + assert call_set_direction[0].data[ATTR_ENTITY_ID] == entity_id + assert call_set_direction[0].data[ATTR_DIRECTION] == DIRECTION_REVERSE + assert len(events) == 4 + + assert events[1].data[ATTR_VALUE] is True + assert events[2].data[ATTR_VALUE] == DIRECTION_REVERSE + assert events[3].data[ATTR_VALUE] == "ludicrous" + + hass.states.async_set( + entity_id, + STATE_ON, + { + ATTR_SUPPORTED_FEATURES: SUPPORT_SET_SPEED + | SUPPORT_OSCILLATE + | SUPPORT_DIRECTION, + ATTR_SPEED: SPEED_OFF, + ATTR_OSCILLATING: False, + ATTR_DIRECTION: DIRECTION_FORWARD, + ATTR_SPEED_LIST: speed_list, + }, + ) + await hass.async_block_till_done() + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_active_iid, + HAP_REPR_VALUE: 1, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_speed_iid, + HAP_REPR_VALUE: 42, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_swing_iid, + HAP_REPR_VALUE: 1, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_direction_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) + # Turn on should not be called if its already on + # and we set a fan speed + await hass.async_block_till_done() + acc.speed_mapping.speed_to_states.assert_called_with(42) + assert len(events) == 7 + assert call_set_speed[1] + assert call_set_speed[1].data[ATTR_ENTITY_ID] == entity_id + assert call_set_speed[1].data[ATTR_SPEED] == "ludicrous" + assert call_oscillate[1] + assert call_oscillate[1].data[ATTR_ENTITY_ID] == entity_id + assert call_oscillate[1].data[ATTR_OSCILLATING] is True + assert call_set_direction[1] + assert call_set_direction[1].data[ATTR_ENTITY_ID] == entity_id + assert call_set_direction[1].data[ATTR_DIRECTION] == DIRECTION_REVERSE + + assert events[-3].data[ATTR_VALUE] is True + assert events[-2].data[ATTR_VALUE] == DIRECTION_REVERSE + assert events[-1].data[ATTR_VALUE] == "ludicrous" + + hk_driver.set_characteristics( + { + HAP_REPR_CHARS: [ + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_active_iid, + HAP_REPR_VALUE: 0, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_speed_iid, + HAP_REPR_VALUE: 42, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_swing_iid, + HAP_REPR_VALUE: 1, + }, + { + HAP_REPR_AID: acc.aid, + HAP_REPR_IID: char_direction_iid, + HAP_REPR_VALUE: 1, + }, + ] + }, + "mock_addr", + ) + await hass.async_block_till_done() + + assert len(events) == 8 + assert call_turn_off + assert call_turn_off[0].data[ATTR_ENTITY_ID] == entity_id + assert len(call_set_speed) == 2 + assert len(call_oscillate) == 2 + assert len(call_set_direction) == 2 + + async def test_fan_restore(hass, hk_driver, cls, events): """Test setting up an entity from state in the event registry.""" hass.state = CoreState.not_running diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index 5b5dcf8f3a27..26bb5bfdbad0 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -1,8 +1,6 @@ """Test different accessory types: Lights.""" from collections import namedtuple -from asynctest import patch -from pyhap.accessory_driver import AccessoryDriver from pyhap.const import HAP_REPR_AID, HAP_REPR_CHARS, HAP_REPR_IID, HAP_REPR_VALUE import pytest @@ -33,15 +31,6 @@ from tests.common import async_mock_service from tests.components.homekit.common import patch_debounce -@pytest.fixture -def driver(): - """Patch AccessoryDriver without zeroconf or HAPServer.""" - with patch("pyhap.accessory_driver.HAPServer"), patch( - "pyhap.accessory_driver.Zeroconf" - ), patch("pyhap.accessory_driver.AccessoryDriver.persist"): - yield AccessoryDriver() - - @pytest.fixture(scope="module") def cls(): """Patch debounce decorator during import of type_lights.""" @@ -55,14 +44,14 @@ def cls(): patcher.stop() -async def test_light_basic(hass, hk_driver, cls, events, driver): +async def test_light_basic(hass, hk_driver, cls, events): """Test light with char state.""" entity_id = "light.demo" hass.states.async_set(entity_id, STATE_ON, {ATTR_SUPPORTED_FEATURES: 0}) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) assert acc.aid == 1 assert acc.category == 5 # Lightbulb @@ -90,7 +79,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): char_on_iid = acc.char_on.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1} @@ -109,7 +98,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): hass.states.async_set(entity_id, STATE_ON) await hass.async_block_till_done() - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 0} @@ -124,7 +113,7 @@ async def test_light_basic(hass, hk_driver, cls, events, driver): assert events[-1].data[ATTR_VALUE] == "Set state to 0" -async def test_light_brightness(hass, hk_driver, cls, events, driver): +async def test_light_brightness(hass, hk_driver, cls, events): """Test light with brightness.""" entity_id = "light.demo" @@ -135,7 +124,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the # brightness to 100 when turning on a light on a freshly booted up server. @@ -155,7 +144,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") call_turn_off = async_mock_service(hass, DOMAIN, "turn_off") - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, @@ -178,7 +167,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): == f"Set state to 1, brightness at 20{UNIT_PERCENTAGE}" ) - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, @@ -201,7 +190,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): == f"Set state to 1, brightness at 40{UNIT_PERCENTAGE}" ) - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, @@ -247,7 +236,7 @@ async def test_light_brightness(hass, hk_driver, cls, events, driver): assert acc.char_brightness.value == 1 -async def test_light_color_temperature(hass, hk_driver, cls, events, driver): +async def test_light_color_temperature(hass, hk_driver, cls, events): """Test light with color temperature.""" entity_id = "light.demo" @@ -258,7 +247,7 @@ async def test_light_color_temperature(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) assert acc.char_color_temperature.value == 190 @@ -271,7 +260,7 @@ async def test_light_color_temperature(hass, hk_driver, cls, events, driver): char_color_temperature_iid = acc.char_color_temperature.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -313,7 +302,7 @@ async def test_light_color_temperature_and_rgb_color(hass, hk_driver, cls, event assert not hasattr(acc, "char_color_temperature") -async def test_light_rgb_color(hass, hk_driver, cls, events, driver): +async def test_light_rgb_color(hass, hk_driver, cls, events): """Test light with rgb_color.""" entity_id = "light.demo" @@ -324,7 +313,7 @@ async def test_light_rgb_color(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) assert acc.char_hue.value == 260 assert acc.char_saturation.value == 90 @@ -340,7 +329,7 @@ async def test_light_rgb_color(hass, hk_driver, cls, events, driver): char_hue_iid = acc.char_hue.to_HAP()[HAP_REPR_IID] char_saturation_iid = acc.char_saturation.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -365,7 +354,7 @@ async def test_light_rgb_color(hass, hk_driver, cls, events, driver): assert events[-1].data[ATTR_VALUE] == "set color at (145, 75)" -async def test_light_restore(hass, hk_driver, cls, events, driver): +async def test_light_restore(hass, hk_driver, cls, events): """Test setting up an entity from state in the event registry.""" hass.state = CoreState.not_running @@ -386,7 +375,7 @@ async def test_light_restore(hass, hk_driver, cls, events, driver): await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", "light.simple", 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) assert acc.category == 5 # Lightbulb assert acc.chars == [] @@ -398,7 +387,7 @@ async def test_light_restore(hass, hk_driver, cls, events, driver): assert acc.char_on.value == 0 -async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driver): +async def test_light_set_brightness_and_color(hass, hk_driver, cls, events): """Test light with all chars in one go.""" entity_id = "light.demo" @@ -412,7 +401,7 @@ async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driv ) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the # brightness to 100 when turning on a light on a freshly booted up server. @@ -438,7 +427,7 @@ async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driv # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, @@ -474,9 +463,7 @@ async def test_light_set_brightness_and_color(hass, hk_driver, cls, events, driv ) -async def test_light_set_brightness_and_color_temp( - hass, hk_driver, cls, events, driver -): +async def test_light_set_brightness_and_color_temp(hass, hk_driver, cls, events): """Test light with all chars in one go.""" entity_id = "light.demo" @@ -490,7 +477,7 @@ async def test_light_set_brightness_and_color_temp( ) await hass.async_block_till_done() acc = cls.light(hass, hk_driver, "Light", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) # Initial value can be anything but 0. If it is 0, it might cause HomeKit to set the # brightness to 100 when turning on a light on a freshly booted up server. @@ -514,7 +501,7 @@ async def test_light_set_brightness_and_color_temp( # Set from HomeKit call_turn_on = async_mock_service(hass, DOMAIN, "turn_on") - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ {HAP_REPR_AID: acc.aid, HAP_REPR_IID: char_on_iid, HAP_REPR_VALUE: 1}, diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index 93b781170b40..8ee533521e84 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -2,7 +2,6 @@ from collections import namedtuple from unittest.mock import patch -from pyhap.accessory_driver import AccessoryDriver from pyhap.const import HAP_REPR_AID, HAP_REPR_CHARS, HAP_REPR_IID, HAP_REPR_VALUE import pytest @@ -62,15 +61,6 @@ from tests.common import async_mock_service from tests.components.homekit.common import patch_debounce -@pytest.fixture -def driver(): - """Patch AccessoryDriver without zeroconf or HAPServer.""" - with patch("pyhap.accessory_driver.HAPServer"), patch( - "pyhap.accessory_driver.Zeroconf" - ), patch("pyhap.accessory_driver.AccessoryDriver.persist"): - yield AccessoryDriver() - - @pytest.fixture(scope="module") def cls(): """Patch debounce decorator during import of type_thermostats.""" @@ -85,7 +75,7 @@ def cls(): patcher.stop() -async def test_thermostat(hass, hk_driver, cls, events, driver): +async def test_thermostat(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -106,7 +96,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -293,7 +283,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] char_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -313,7 +303,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 19.0°C" - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -328,7 +318,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): await hass.async_block_till_done() assert not call_set_hvac_mode - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -348,7 +338,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 1" - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -369,7 +359,7 @@ async def test_thermostat(hass, hk_driver, cls, events, driver): assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 3" -async def test_thermostat_auto(hass, hk_driver, cls, events, driver): +async def test_thermostat_auto(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -384,7 +374,7 @@ async def test_thermostat_auto(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -459,7 +449,7 @@ async def test_thermostat_auto(hass, hk_driver, cls, events, driver): char_heating_thresh_temp_iid = acc.char_heating_thresh_temp.to_HAP()[HAP_REPR_IID] char_cooling_thresh_temp_iid = acc.char_cooling_thresh_temp.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -491,7 +481,7 @@ async def test_thermostat_auto(hass, hk_driver, cls, events, driver): ) -async def test_thermostat_humidity(hass, hk_driver, cls, events, driver): +async def test_thermostat_humidity(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly with humidity.""" entity_id = "climate.test" @@ -499,7 +489,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events, driver): hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_SUPPORTED_FEATURES: 4}) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -528,7 +518,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events, driver): char_target_humidity_iid = acc.char_target_humidity.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -550,7 +540,7 @@ async def test_thermostat_humidity(hass, hk_driver, cls, events, driver): assert events[-1].data[ATTR_VALUE] == "35%" -async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): +async def test_thermostat_power_state(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -574,7 +564,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -627,7 +617,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -648,7 +638,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "TargetHeatingCoolingState to 1" - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -670,7 +660,7 @@ async def test_thermostat_power_state(hass, hk_driver, cls, events, driver): assert acc.char_target_heat_cool.value == 2 -async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): +async def test_thermostat_fahrenheit(hass, hk_driver, cls, events): """Test if accessory and HA are updated accordingly.""" entity_id = "climate.test" @@ -686,7 +676,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): await hass.async_block_till_done() with patch.object(hass.config.units, CONF_TEMPERATURE_UNIT, new=TEMP_FAHRENHEIT): acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -717,7 +707,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): char_heating_thresh_temp_iid = acc.char_heating_thresh_temp.to_HAP()[HAP_REPR_IID] char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -738,7 +728,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == "CoolingThresholdTemperature to 23°C" - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -759,7 +749,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): assert len(events) == 2 assert events[-1].data[ATTR_VALUE] == "HeatingThresholdTemperature to 22°C" - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -779,7 +769,7 @@ async def test_thermostat_fahrenheit(hass, hk_driver, cls, events, driver): assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 24.0°C" -async def test_thermostat_get_temperature_range(hass, hk_driver, cls, driver): +async def test_thermostat_get_temperature_range(hass, hk_driver, cls): """Test if temperature range is evaluated correctly.""" entity_id = "climate.test" @@ -801,14 +791,14 @@ async def test_thermostat_get_temperature_range(hass, hk_driver, cls, driver): assert acc.get_temperature_range() == (15.5, 21.0) -async def test_thermostat_temperature_step_whole(hass, hk_driver, cls, driver): +async def test_thermostat_temperature_step_whole(hass, hk_driver, cls): """Test climate device with single digit precision.""" entity_id = "climate.test" hass.states.async_set(entity_id, HVAC_MODE_OFF, {ATTR_TARGET_TEMP_STEP: 1}) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -861,7 +851,7 @@ async def test_thermostat_restore(hass, hk_driver, cls, events): } -async def test_thermostat_hvac_modes(hass, hk_driver, cls, driver): +async def test_thermostat_hvac_modes(hass, hk_driver, cls): """Test if unsupported HVAC modes are deactivated in HomeKit.""" entity_id = "climate.test" @@ -871,7 +861,7 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls, driver): await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -894,7 +884,7 @@ async def test_thermostat_hvac_modes(hass, hk_driver, cls, driver): assert acc.char_target_heat_cool.value == 1 -async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls, driver): +async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls): """Test we get heat cool over auto.""" entity_id = "climate.test" @@ -914,7 +904,7 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls, d await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -937,7 +927,7 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls, d char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -957,9 +947,7 @@ async def test_thermostat_hvac_modes_with_auto_heat_cool(hass, hk_driver, cls, d assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_with_auto_no_heat_cool( - hass, hk_driver, cls, driver -): +async def test_thermostat_hvac_modes_with_auto_no_heat_cool(hass, hk_driver, cls): """Test we get auto when there is no heat cool.""" entity_id = "climate.test" @@ -972,7 +960,7 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool( await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -995,7 +983,7 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool( char_target_heat_cool_iid = acc.char_target_heat_cool.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -1015,7 +1003,7 @@ async def test_thermostat_hvac_modes_with_auto_no_heat_cool( assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls, driver): +async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls): """Test if unsupported HVAC modes are deactivated in HomeKit.""" entity_id = "climate.test" @@ -1025,7 +1013,7 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls, driver await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -1048,7 +1036,7 @@ async def test_thermostat_hvac_modes_with_auto_only(hass, hk_driver, cls, driver assert acc.char_target_heat_cool.value == 3 -async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls, driver): +async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls): """Test a thermostat that has no off.""" entity_id = "climate.test" @@ -1058,7 +1046,7 @@ async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls, driver): await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -1085,9 +1073,7 @@ async def test_thermostat_hvac_modes_without_off(hass, hk_driver, cls, driver): assert acc.char_target_heat_cool.value == 1 -async def test_thermostat_without_target_temp_only_range( - hass, hk_driver, cls, events, driver -): +async def test_thermostat_without_target_temp_only_range(hass, hk_driver, cls, events): """Test a thermostat that only supports a range.""" entity_id = "climate.test" @@ -1099,7 +1085,7 @@ async def test_thermostat_without_target_temp_only_range( ) await hass.async_block_till_done() acc = cls.thermostat(hass, hk_driver, "Climate", entity_id, 1, None) - driver.add_accessory(acc) + hk_driver.add_accessory(acc) await acc.run_handler() await hass.async_block_till_done() @@ -1176,7 +1162,7 @@ async def test_thermostat_without_target_temp_only_range( char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { @@ -1222,7 +1208,7 @@ async def test_thermostat_without_target_temp_only_range( char_target_temp_iid = acc.char_target_temp.to_HAP()[HAP_REPR_IID] - driver.set_characteristics( + hk_driver.set_characteristics( { HAP_REPR_CHARS: [ { From 5e3e4bda282491740c4ab81eb53cce71a95d7e22 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Apr 2020 21:40:38 -0500 Subject: [PATCH 435/653] Prevent a single accessory setup failure from breaking all HomeKit accessories (#34263) * Prevent a single accessory setup failure from breaking all HomeKit accessories Raise the max devices to 150 as the spec allows for this many. Previously 100 made sense because of the event storms when homekit started would sometimes break pairing, as these have largely been fixed in 0.109 (still a few to cleanup) using the HAP spec limit of 150 is now possible. * Handle both failure states --- homeassistant/components/homekit/__init__.py | 16 +++++++--- tests/components/homekit/test_homekit.py | 33 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index c2ba5a465257..aeb8cb7e4b8f 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -67,7 +67,7 @@ from .util import ( _LOGGER = logging.getLogger(__name__) -MAX_DEVICES = 100 +MAX_DEVICES = 150 TYPES = Registry() # #### Driver Status #### @@ -361,9 +361,17 @@ class HomeKit: return aid = generate_aid(state.entity_id) conf = self._config.pop(state.entity_id, {}) - acc = get_accessory(self.hass, self.driver, state, aid, conf) - if acc is not None: - self.bridge.add_accessory(acc) + # If an accessory cannot be created or added due to an exception + # of any kind (usually in pyhap) it should not prevent + # the rest of the accessories from being created + try: + acc = get_accessory(self.hass, self.driver, state, aid, conf) + if acc is not None: + self.bridge.add_accessory(acc) + except Exception: # pylint: disable=broad-except + _LOGGER.exception( + "Failed to create a HomeKit accessory for %s", state.entity_id + ) def remove_bridge_accessory(self, aid): """Try adding accessory to bridge if configured beforehand.""" diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index 124366ba2417..721d25d09a0b 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -309,6 +309,39 @@ async def test_homekit_start(hass, hk_driver, debounce_patcher): assert not hk_driver_start.called +async def test_homekit_start_with_a_broken_accessory(hass, hk_driver, debounce_patcher): + """Test HomeKit start method.""" + pin = b"123-45-678" + entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], []) + + homekit = HomeKit(hass, None, None, None, entity_filter, {}, None, None) + homekit.bridge = Mock() + homekit.bridge.accessories = [] + homekit.driver = hk_driver + + hass.states.async_set("light.demo", "on") + hass.states.async_set("light.broken", "on") + + with patch(f"{PATH_HOMEKIT}.get_accessory", side_effect=Exception), patch( + f"{PATH_HOMEKIT}.show_setup_message" + ) as mock_setup_msg, patch( + "pyhap.accessory_driver.AccessoryDriver.add_accessory", + ) as hk_driver_add_acc, patch( + "pyhap.accessory_driver.AccessoryDriver.start" + ) as hk_driver_start: + await hass.async_add_executor_job(homekit.start) + + mock_setup_msg.assert_called_with(hass, pin) + hk_driver_add_acc.assert_called_with(homekit.bridge) + assert hk_driver_start.called + assert homekit.status == STATUS_RUNNING + + # Test start() if already started + hk_driver_start.reset_mock() + await hass.async_add_executor_job(homekit.start) + assert not hk_driver_start.called + + async def test_homekit_stop(hass): """Test HomeKit stop method.""" homekit = HomeKit(hass, None, None, None, None, None, None) From 77655cad0d926231fa2779ab049204c5ba4fa09f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 16 Apr 2020 01:27:41 -0500 Subject: [PATCH 436/653] Fix synology_dsm i/o in event loop (#34281) --- homeassistant/components/synology_dsm/__init__.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py index 874afb185840..59173e72fd53 100644 --- a/homeassistant/components/synology_dsm/__init__.py +++ b/homeassistant/components/synology_dsm/__init__.py @@ -139,16 +139,20 @@ class SynoApi: self._use_ssl, dsm_version=self._api_version, ) - self.information = self._dsm.information - self.utilisation = self._dsm.utilisation - self.storage = self._dsm.storage + await self._hass.async_add_executor_job(self._fetch_device_configuration) await self.update() self._unsub_dispatcher = async_track_time_interval( self._hass, self.update, SCAN_INTERVAL ) + def _fetch_device_configuration(self): + """Fetch initial device config.""" + self.information = self._dsm.information + self.utilisation = self._dsm.utilisation + self.storage = self._dsm.storage + async def async_unload(self): """Stop interacting with the NAS and prepare for removal from hass.""" self._unsub_dispatcher() From 19a0a7029fa355f98567e0b5cb962395b3fca26c Mon Sep 17 00:00:00 2001 From: Oleksii Serdiuk Date: Thu, 16 Apr 2020 12:31:36 +0200 Subject: [PATCH 437/653] Improve MAX! Cube integration (#28845) * maxcube: Make it possible to return to auto mode It's currently not possible to switch back to auto (schedule) mode after changing to manual or vacation. Add `PRESET_NONE` to list of presets that will return thermostat back into auto (schedule) mode. Additionally, use `PRESET_AWAY` instead of custom preset name for vacation mode. * maxcube: Provide `hvac_action` based on valve state Not supported for wall thermostats. * maxcube: Add support for Comfort, Eco, Off and On modes Off is mapped to HVAC_OFF, while On - to HVAC_HEAT. * maxcube: Add `hvac_action` support for wall thermostats We check all thermostats in the same room as the wall thermostat. If at least one of them has its valve open - the room is being heated. * maxcube: Expose valve position as state attribute Also fix a small logical error in `hvac_action`. * maxcube: Fix linter errors and formatting * maxcube: Adjust mapping between MAX! and HA modes and presets MAX! 'Manual' mode now corresponds to 'Heating' mode of HA. MAX! 'Eco' and 'Comfort' temperatures are 'Heating' mode presets. MAX! 'On' mode is now a 'Heating' preset, too. * maxcube: Address review comments --- homeassistant/components/maxcube/climate.py | 186 +++++++++++++++----- 1 file changed, 146 insertions(+), 40 deletions(-) diff --git a/homeassistant/components/maxcube/climate.py b/homeassistant/components/maxcube/climate.py index 333baab1ab19..19bbf8bf0006 100644 --- a/homeassistant/components/maxcube/climate.py +++ b/homeassistant/components/maxcube/climate.py @@ -11,7 +11,17 @@ from maxcube.device import ( from homeassistant.components.climate import ClimateDevice from homeassistant.components.climate.const import ( + CURRENT_HVAC_HEAT, + CURRENT_HVAC_IDLE, + CURRENT_HVAC_OFF, HVAC_MODE_AUTO, + HVAC_MODE_HEAT, + HVAC_MODE_OFF, + PRESET_AWAY, + PRESET_BOOST, + PRESET_COMFORT, + PRESET_ECO, + PRESET_NONE, SUPPORT_PRESET_MODE, SUPPORT_TARGET_TEMPERATURE, ) @@ -21,12 +31,31 @@ from . import DATA_KEY _LOGGER = logging.getLogger(__name__) -PRESET_MANUAL = "manual" -PRESET_BOOST = "boost" -PRESET_VACATION = "vacation" +ATTR_VALVE_POSITION = "valve_position" +PRESET_ON = "on" + +# There are two magic temperature values, which indicate: +# Off (valve fully closed) +OFF_TEMPERATURE = 4.5 +# On (valve fully open) +ON_TEMPERATURE = 30.5 SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE | SUPPORT_PRESET_MODE +HASS_PRESET_TO_MAX_MODE = { + PRESET_AWAY: MAX_DEVICE_MODE_VACATION, + PRESET_BOOST: MAX_DEVICE_MODE_BOOST, + PRESET_NONE: MAX_DEVICE_MODE_AUTOMATIC, + PRESET_ON: MAX_DEVICE_MODE_MANUAL, +} + +MAX_MODE_TO_HASS_PRESET = { + MAX_DEVICE_MODE_AUTOMATIC: PRESET_NONE, + MAX_DEVICE_MODE_BOOST: PRESET_BOOST, + MAX_DEVICE_MODE_MANUAL: PRESET_NONE, + MAX_DEVICE_MODE_VACATION: PRESET_AWAY, +} + def setup_platform(hass, config, add_entities, discovery_info=None): """Iterate through all MAX! Devices and add thermostats.""" @@ -49,7 +78,6 @@ class MaxCubeClimate(ClimateDevice): def __init__(self, handler, name, rf_address): """Initialize MAX! Cube ClimateDevice.""" self._name = name - self._operation_list = [HVAC_MODE_AUTO] self._rf_address = rf_address self._cubehandle = handler @@ -95,13 +123,76 @@ class MaxCubeClimate(ClimateDevice): @property def hvac_mode(self): - """Return current operation (auto, manual, boost, vacation).""" - return HVAC_MODE_AUTO + """Return current operation mode.""" + device = self._cubehandle.cube.device_by_rf(self._rf_address) + if device.mode in [MAX_DEVICE_MODE_AUTOMATIC, MAX_DEVICE_MODE_BOOST]: + return HVAC_MODE_AUTO + if ( + device.mode == MAX_DEVICE_MODE_MANUAL + and device.target_temperature == OFF_TEMPERATURE + ): + return HVAC_MODE_OFF + + return HVAC_MODE_HEAT @property def hvac_modes(self): """Return the list of available operation modes.""" - return self._operation_list + return [HVAC_MODE_OFF, HVAC_MODE_AUTO, HVAC_MODE_HEAT] + + def set_hvac_mode(self, hvac_mode: str): + """Set new target hvac mode.""" + device = self._cubehandle.cube.device_by_rf(self._rf_address) + temp = device.target_temperature + mode = device.mode + + if hvac_mode == HVAC_MODE_OFF: + temp = OFF_TEMPERATURE + mode = MAX_DEVICE_MODE_MANUAL + elif hvac_mode == HVAC_MODE_HEAT: + mode = MAX_DEVICE_MODE_MANUAL + else: + # Reset the temperature to a sane value. + # Ideally, we should send 0 and the device will set its + # temperature according to the schedule. However, current + # version of the library has a bug which causes an + # exception when setting values below 8. + if temp in [OFF_TEMPERATURE, ON_TEMPERATURE]: + temp = device.eco_temperature + mode = MAX_DEVICE_MODE_AUTOMATIC + + cube = self._cubehandle.cube + with self._cubehandle.mutex: + try: + cube.set_temperature_mode(device, temp, mode) + except (socket.timeout, OSError): + _LOGGER.error("Setting HVAC mode failed") + return + + @property + def hvac_action(self): + """Return the current running hvac operation if supported.""" + cube = self._cubehandle.cube + device = cube.device_by_rf(self._rf_address) + valve = 0 + + if cube.is_thermostat(device): + valve = device.valve_position + elif cube.is_wallthermostat(device): + for device in cube.devices_by_room(cube.room_by_id(device.room_id)): + if cube.is_thermostat(device) and device.valve_position > 0: + valve = device.valve_position + break + else: + return None + + # Assume heating when valve is open + if valve > 0: + return CURRENT_HVAC_HEAT + + return ( + CURRENT_HVAC_OFF if self.hvac_mode == HVAC_MODE_OFF else CURRENT_HVAC_IDLE + ) @property def target_temperature(self): @@ -130,24 +221,67 @@ class MaxCubeClimate(ClimateDevice): def preset_mode(self): """Return the current preset mode.""" device = self._cubehandle.cube.device_by_rf(self._rf_address) - return self.map_mode_max_hass(device.mode) + if self.hvac_mode == HVAC_MODE_OFF: + return PRESET_NONE + + if device.mode == MAX_DEVICE_MODE_MANUAL: + if device.target_temperature == device.comfort_temperature: + return PRESET_COMFORT + if device.target_temperature == device.eco_temperature: + return PRESET_ECO + if device.target_temperature == ON_TEMPERATURE: + return PRESET_ON + return PRESET_NONE + + return MAX_MODE_TO_HASS_PRESET[device.mode] @property def preset_modes(self): """Return available preset modes.""" - return [PRESET_BOOST, PRESET_MANUAL, PRESET_VACATION] + return [ + PRESET_NONE, + PRESET_BOOST, + PRESET_COMFORT, + PRESET_ECO, + PRESET_AWAY, + PRESET_ON, + ] def set_preset_mode(self, preset_mode): """Set new operation mode.""" device = self._cubehandle.cube.device_by_rf(self._rf_address) - mode = self.map_mode_hass_max(preset_mode) or MAX_DEVICE_MODE_AUTOMATIC + temp = device.target_temperature + mode = MAX_DEVICE_MODE_AUTOMATIC + + if preset_mode in [PRESET_COMFORT, PRESET_ECO, PRESET_ON]: + mode = MAX_DEVICE_MODE_MANUAL + if preset_mode == PRESET_COMFORT: + temp = device.comfort_temperature + elif preset_mode == PRESET_ECO: + temp = device.eco_temperature + else: + temp = ON_TEMPERATURE + else: + mode = HASS_PRESET_TO_MAX_MODE[preset_mode] or MAX_DEVICE_MODE_AUTOMATIC with self._cubehandle.mutex: try: - self._cubehandle.cube.set_mode(device, mode) + self._cubehandle.cube.set_temperature_mode(device, temp, mode) except (socket.timeout, OSError): _LOGGER.error("Setting operation mode failed") - return False + return + + @property + def device_state_attributes(self): + """Return the optional state attributes.""" + cube = self._cubehandle.cube + device = cube.device_by_rf(self._rf_address) + attributes = {} + + if cube.is_thermostat(device): + attributes[ATTR_VALVE_POSITION] = device.valve_position + + return attributes def update(self): """Get latest data from MAX! Cube.""" @@ -160,31 +294,3 @@ class MaxCubeClimate(ClimateDevice): return 0.0 return temperature - - @staticmethod - def map_mode_hass_max(mode): - """Map Home Assistant Operation Modes to MAX! Operation Modes.""" - if mode == PRESET_MANUAL: - mode = MAX_DEVICE_MODE_MANUAL - elif mode == PRESET_VACATION: - mode = MAX_DEVICE_MODE_VACATION - elif mode == PRESET_BOOST: - mode = MAX_DEVICE_MODE_BOOST - else: - mode = None - - return mode - - @staticmethod - def map_mode_max_hass(mode): - """Map MAX! Operation Modes to Home Assistant Operation Modes.""" - if mode == MAX_DEVICE_MODE_MANUAL: - operation_mode = PRESET_MANUAL - elif mode == MAX_DEVICE_MODE_VACATION: - operation_mode = PRESET_VACATION - elif mode == MAX_DEVICE_MODE_BOOST: - operation_mode = PRESET_BOOST - else: - operation_mode = None - - return operation_mode From 5617e6913b4eee185edd5e7ce3108781e91b6ad5 Mon Sep 17 00:00:00 2001 From: Ernst Klamer Date: Thu, 16 Apr 2020 15:07:55 +0200 Subject: [PATCH 438/653] Add state to RFXtrx covers (#30935) * Add state to rfxtrx cover * Add state to rfxtrx cover (cover.py) --- homeassistant/components/rfxtrx/__init__.py | 32 +++++++++++++++++---- homeassistant/components/rfxtrx/cover.py | 2 +- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/rfxtrx/__init__.py b/homeassistant/components/rfxtrx/__init__.py index b37ad8c15a83..387c42a35b5a 100644 --- a/homeassistant/components/rfxtrx/__init__.py +++ b/homeassistant/components/rfxtrx/__init__.py @@ -131,7 +131,7 @@ def setup(hass, config): if dummy_connection: rfx_object = rfxtrxmod.Connect( - device, None, debug=debug, transport_protocol=rfxtrxmod.DummyTransport2 + device, None, debug=debug, transport_protocol=rfxtrxmod.DummyTransport2, ) elif port is not None: # If port is set then we create a TCP connection @@ -215,7 +215,7 @@ def get_pt2262_device(device_id): and device.masked_id == get_pt2262_deviceid(device_id, device.data_bits) ): _LOGGER.debug( - "rfxtrx: found matching device %s for %s", device_id, device.masked_id + "rfxtrx: found matching device %s for %s", device_id, device.masked_id, ) return device return None @@ -307,13 +307,32 @@ def apply_received_command(event): return _LOGGER.debug( - "Device_id: %s device_update. Command: %s", device_id, event.values["Command"] + "Device_id: %s device_update. Command: %s", device_id, event.values["Command"], ) - if event.values["Command"] == "On" or event.values["Command"] == "Off": + if event.values["Command"] in [ + "On", + "Off", + "Up", + "Down", + "Stop", + "Open (inline relay)", + "Close (inline relay)", + "Stop (inline relay)", + ]: # Update the rfxtrx device state - is_on = event.values["Command"] == "On" + command = event.values["Command"] + if command in [ + "On", + "Up", + "Stop", + "Open (inline relay)", + "Stop (inline relay)", + ]: + is_on = True + elif command in ["Off", "Down", "Close (inline relay)"]: + is_on = False RFX_DEVICES[device_id].update_state(is_on) elif ( @@ -425,14 +444,17 @@ class RfxtrxDevice(Entity): elif command == "roll_up": for _ in range(self.signal_repetitions): self._event.device.send_open(rfx_object.transport) + self._state = True elif command == "roll_down": for _ in range(self.signal_repetitions): self._event.device.send_close(rfx_object.transport) + self._state = False elif command == "stop_roll": for _ in range(self.signal_repetitions): self._event.device.send_stop(rfx_object.transport) + self._state = True if self.added_to_hass: self.schedule_update_ha_state() diff --git a/homeassistant/components/rfxtrx/cover.py b/homeassistant/components/rfxtrx/cover.py index e1eb6ae77f5e..da19c42ed696 100644 --- a/homeassistant/components/rfxtrx/cover.py +++ b/homeassistant/components/rfxtrx/cover.py @@ -82,7 +82,7 @@ class RfxtrxCover(RfxtrxDevice, CoverDevice, RestoreEntity): @property def is_closed(self): """Return if the cover is closed.""" - return None + return not self._state def open_cover(self, **kwargs): """Move the cover up.""" From 6d812bd957eb0789d8c507049ec0226275c32472 Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Thu, 16 Apr 2020 10:15:55 -0400 Subject: [PATCH 439/653] Add config flow to nws and remove yaml configuration (#34267) * add config flow to nws and remove yaml * Don't duplicate scan_time Co-Authored-By: J. Nick Koston * Use _abort_if_unique_id_configured Co-Authored-By: J. Nick Koston * fix abort * Add unavailable tests * update and use better strings * lint Co-authored-by: J. Nick Koston --- .../components/nws/.translations/en.json | 24 ++++ homeassistant/components/nws/__init__.py | 75 +++++++----- homeassistant/components/nws/config_flow.py | 84 +++++++++++++ homeassistant/components/nws/const.py | 3 + homeassistant/components/nws/manifest.json | 3 +- homeassistant/components/nws/strings.json | 24 ++++ homeassistant/components/nws/weather.py | 41 ++----- homeassistant/generated/config_flows.py | 1 + tests/components/nws/const.py | 11 +- tests/components/nws/test_config_flow.py | 113 ++++++++++++++++++ tests/components/nws/test_init.py | 100 +++------------- tests/components/nws/test_weather.py | 77 ++++++++++-- 12 files changed, 401 insertions(+), 155 deletions(-) create mode 100644 homeassistant/components/nws/.translations/en.json create mode 100644 homeassistant/components/nws/config_flow.py create mode 100644 homeassistant/components/nws/strings.json create mode 100644 tests/components/nws/test_config_flow.py diff --git a/homeassistant/components/nws/.translations/en.json b/homeassistant/components/nws/.translations/en.json new file mode 100644 index 000000000000..dd91b04bedce --- /dev/null +++ b/homeassistant/components/nws/.translations/en.json @@ -0,0 +1,24 @@ +{ + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "api_key": "API key (email)", + "latitude": "Latitude", + "longitude": "Longitude", + "station": "METAR station code" + }, + "description": "If a METAR station code is not specified, the latitude and longitude will be used to find the closest station.", + "title": "Connect to the National Weather Service" + } + } + }, + "title": "National Weather Service (NWS)" +} \ No newline at end of file diff --git a/homeassistant/components/nws/__init__.py b/homeassistant/components/nws/__init__.py index 66e791e627ae..f39525f70680 100644 --- a/homeassistant/components/nws/__init__.py +++ b/homeassistant/components/nws/__init__.py @@ -7,9 +7,9 @@ import aiohttp from pynws import SimpleNWS import voluptuous as vol +from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE from homeassistant.core import HomeAssistant -from homeassistant.helpers import discovery from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -52,38 +52,53 @@ def signal_unique_id(latitude, longitude): async def async_setup(hass: HomeAssistant, config: dict): - """Set up the National Weather Service integration.""" - if DOMAIN not in config: - return True - - hass.data[DOMAIN] = hass.data.get(DOMAIN, {}) - for entry in config[DOMAIN]: - latitude = entry.get(CONF_LATITUDE, hass.config.latitude) - longitude = entry.get(CONF_LONGITUDE, hass.config.longitude) - api_key = entry[CONF_API_KEY] - - client_session = async_get_clientsession(hass) - - if base_unique_id(latitude, longitude) in hass.data[DOMAIN]: - _LOGGER.error( - "Duplicate entry in config: latitude %s latitude: %s", - latitude, - longitude, - ) - continue - - nws_data = NwsData(hass, latitude, longitude, api_key, client_session) - hass.data[DOMAIN][base_unique_id(latitude, longitude)] = nws_data - async_track_time_interval(hass, nws_data.async_update, DEFAULT_SCAN_INTERVAL) - - for component in PLATFORMS: - hass.async_create_task( - discovery.async_load_platform(hass, component, DOMAIN, entry, config) - ) - + """Set up the National Weather Service (NWS) component.""" + hass.data.setdefault(DOMAIN, {}) return True +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): + """Set up a National Weather Service entry.""" + latitude = entry.data[CONF_LATITUDE] + longitude = entry.data[CONF_LONGITUDE] + api_key = entry.data[CONF_API_KEY] + station = entry.data[CONF_STATION] + + client_session = async_get_clientsession(hass) + + nws_data = NwsData(hass, latitude, longitude, api_key, client_session) + hass.data[DOMAIN][entry.entry_id] = nws_data + + # async_set_station only does IO when station is None + await nws_data.async_set_station(station) + await nws_data.async_update() + + async_track_time_interval(hass, nws_data.async_update, DEFAULT_SCAN_INTERVAL) + + for component in PLATFORMS: + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, component) + ) + return True + + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): + """Unload a config entry.""" + unload_ok = all( + await asyncio.gather( + *[ + hass.config_entries.async_forward_entry_unload(entry, component) + for component in PLATFORMS + ] + ) + ) + if unload_ok: + hass.data[DOMAIN].pop(entry.entry_id) + if len(hass.data[DOMAIN]) == 0: + hass.data.pop(DOMAIN) + return unload_ok + + class NwsData: """Data class for National Weather Service integration.""" diff --git a/homeassistant/components/nws/config_flow.py b/homeassistant/components/nws/config_flow.py new file mode 100644 index 000000000000..19d8de4bce02 --- /dev/null +++ b/homeassistant/components/nws/config_flow.py @@ -0,0 +1,84 @@ +"""Config flow for National Weather Service (NWS) integration.""" +import logging + +import aiohttp +import voluptuous as vol + +from homeassistant import config_entries, core, exceptions +from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.aiohttp_client import async_get_clientsession + +from . import NwsData, base_unique_id +from .const import CONF_STATION, DOMAIN # pylint:disable=unused-import + +_LOGGER = logging.getLogger(__name__) + + +async def validate_input(hass: core.HomeAssistant, data): + """Validate the user input allows us to connect. + + Data has the keys from DATA_SCHEMA with values provided by the user. + """ + latitude = data[CONF_LATITUDE] + longitude = data[CONF_LONGITUDE] + api_key = data[CONF_API_KEY] + station = data.get(CONF_STATION) + + client_session = async_get_clientsession(hass) + ha_api_key = f"{api_key} homeassistant" + nws = NwsData(hass, latitude, longitude, ha_api_key, client_session) + + try: + await nws.async_set_station(station) + except aiohttp.ClientError as err: + _LOGGER.error("Could not connect: %s", err) + raise CannotConnect + + return {"title": nws.station} + + +class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for National Weather Service (NWS).""" + + VERSION = 1 + CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL + + async def async_step_user(self, user_input=None): + """Handle the initial step.""" + errors = {} + if user_input is not None: + await self.async_set_unique_id( + base_unique_id(user_input[CONF_LATITUDE], user_input[CONF_LONGITUDE]) + ) + self._abort_if_unique_id_configured() + try: + info = await validate_input(self.hass, user_input) + user_input[CONF_STATION] = info["title"] + return self.async_create_entry(title=info["title"], data=user_input) + except CannotConnect: + errors["base"] = "cannot_connect" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + + data_schema = vol.Schema( + { + vol.Required(CONF_API_KEY): str, + vol.Required( + CONF_LATITUDE, default=self.hass.config.latitude + ): cv.latitude, + vol.Required( + CONF_LONGITUDE, default=self.hass.config.longitude + ): cv.longitude, + vol.Optional(CONF_STATION): str, + } + ) + + return self.async_show_form( + step_id="user", data_schema=data_schema, errors=errors + ) + + +class CannotConnect(exceptions.HomeAssistantError): + """Error to indicate we cannot connect.""" diff --git a/homeassistant/components/nws/const.py b/homeassistant/components/nws/const.py index 769f927ea71a..dea1c36b5fca 100644 --- a/homeassistant/components/nws/const.py +++ b/homeassistant/components/nws/const.py @@ -52,3 +52,6 @@ CONDITION_CLASSES = { "cloudy": ["Mostly cloudy", "Overcast"], "partlycloudy": ["A few clouds", "Partly cloudy"], } + +DAYNIGHT = "daynight" +HOURLY = "hourly" diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index b4b6e402941c..2aa783f7a28c 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -4,5 +4,6 @@ "documentation": "https://www.home-assistant.io/integrations/nws", "codeowners": ["@MatthewFlamm"], "requirements": ["pynws==0.10.4"], - "quality_scale": "silver" + "quality_scale": "silver", + "config_flow": true } diff --git a/homeassistant/components/nws/strings.json b/homeassistant/components/nws/strings.json new file mode 100644 index 000000000000..44c5c6ca3267 --- /dev/null +++ b/homeassistant/components/nws/strings.json @@ -0,0 +1,24 @@ +{ + "title": "National Weather Service (NWS)", + "config": { + "step": { + "user": { + "description": "If a METAR station code is not specified, the latitude and longitude will be used to find the closest station.", + "title": "Connect to the National Weather Service", + "data": { + "api_key": "API key (email)", + "latitude": "Latitude", + "longitude": "Longitude", + "station": "METAR station code" + } + } + }, + "error": { + "cannot_connect": "Failed to connect, please try again", + "unknown": "Unexpected error" + }, + "abort": { + "already_configured": "Device is already configured" + } + } +} diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index 8e4e7e560cb5..457bba72bbee 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -1,9 +1,6 @@ """Support for NWS weather service.""" -import asyncio import logging -import aiohttp - from homeassistant.components.weather import ( ATTR_FORECAST_CONDITION, ATTR_FORECAST_TEMP, @@ -13,8 +10,6 @@ from homeassistant.components.weather import ( WeatherEntity, ) from homeassistant.const import ( - CONF_LATITUDE, - CONF_LONGITUDE, LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_MILES, @@ -25,8 +20,8 @@ from homeassistant.const import ( TEMP_FAHRENHEIT, ) from homeassistant.core import callback -from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.typing import ConfigType, HomeAssistantType from homeassistant.util.distance import convert as convert_distance from homeassistant.util.pressure import convert as convert_pressure from homeassistant.util.temperature import convert as convert_temperature @@ -38,8 +33,9 @@ from .const import ( ATTR_FORECAST_PRECIP_PROB, ATTRIBUTION, CONDITION_CLASSES, - CONF_STATION, + DAYNIGHT, DOMAIN, + HOURLY, ) _LOGGER = logging.getLogger(__name__) @@ -73,28 +69,15 @@ def convert_condition(time, weather): return cond, max(prec_probs) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +async def async_setup_entry( + hass: HomeAssistantType, entry: ConfigType, async_add_entities +) -> None: """Set up the NWS weather platform.""" - if discovery_info is None: - return - latitude = discovery_info.get(CONF_LATITUDE, hass.config.latitude) - longitude = discovery_info.get(CONF_LONGITUDE, hass.config.longitude) - station = discovery_info.get(CONF_STATION) - - nws_data = hass.data[DOMAIN][base_unique_id(latitude, longitude)] - - try: - await nws_data.async_set_station(station) - except (aiohttp.ClientError, asyncio.TimeoutError) as err: - _LOGGER.error("Error automatically setting station: %s", str(err)) - raise PlatformNotReady - - await nws_data.async_update() - + nws_data = hass.data[DOMAIN][entry.entry_id] async_add_entities( [ - NWSWeather(nws_data, "daynight", hass.config.units), - NWSWeather(nws_data, "hourly", hass.config.units), + NWSWeather(nws_data, DAYNIGHT, hass.config.units), + NWSWeather(nws_data, HOURLY, hass.config.units), ], False, ) @@ -131,7 +114,7 @@ class NWSWeather(WeatherEntity): def _update_callback(self) -> None: """Load data from integration.""" self.observation = self.nws.observation - if self.mode == "daynight": + if self.mode == DAYNIGHT: self._forecast = self.nws.forecast else: self._forecast = self.nws.forecast_hourly @@ -259,7 +242,7 @@ class NWSWeather(WeatherEntity): ATTR_FORECAST_TIME: forecast_entry.get("startTime"), } - if self.mode == "daynight": + if self.mode == DAYNIGHT: data[ATTR_FORECAST_DAYTIME] = forecast_entry.get("isDaytime") time = forecast_entry.get("iconTime") weather = forecast_entry.get("iconWeather") @@ -292,7 +275,7 @@ class NWSWeather(WeatherEntity): @property def available(self): """Return if state is available.""" - if self.mode == "daynight": + if self.mode == DAYNIGHT: return ( self.nws.update_observation_success and self.nws.update_forecast_success ) diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 521e75ab36d6..975b62b3e99a 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -85,6 +85,7 @@ FLOWS = [ "notion", "nuheat", "nut", + "nws", "opentherm_gw", "openuv", "owntracks", diff --git a/tests/components/nws/const.py b/tests/components/nws/const.py index 26490e512f9a..6dee20a07592 100644 --- a/tests/components/nws/const.py +++ b/tests/components/nws/const.py @@ -1,5 +1,5 @@ """Helpers for interacting with pynws.""" -from homeassistant.components.nws.const import DOMAIN +from homeassistant.components.nws.const import CONF_STATION from homeassistant.components.nws.weather import ATTR_FORECAST_PRECIP_PROB from homeassistant.components.weather import ( ATTR_FORECAST_CONDITION, @@ -16,6 +16,8 @@ from homeassistant.components.weather import ( ) from homeassistant.const import ( CONF_API_KEY, + CONF_LATITUDE, + CONF_LONGITUDE, LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_MILES, @@ -29,7 +31,12 @@ from homeassistant.util.distance import convert as convert_distance from homeassistant.util.pressure import convert as convert_pressure from homeassistant.util.temperature import convert as convert_temperature -MINIMAL_CONFIG = {DOMAIN: [{CONF_API_KEY: "test"}]} +NWS_CONFIG = { + CONF_API_KEY: "test", + CONF_LATITUDE: 35, + CONF_LONGITUDE: -75, + CONF_STATION: "ABC", +} DEFAULT_STATIONS = ["ABC", "XYZ"] diff --git a/tests/components/nws/test_config_flow.py b/tests/components/nws/test_config_flow.py new file mode 100644 index 000000000000..b88be18bb4e2 --- /dev/null +++ b/tests/components/nws/test_config_flow.py @@ -0,0 +1,113 @@ +"""Test the National Weather Service (NWS) config flow.""" +import aiohttp +from asynctest import patch + +from homeassistant import config_entries, setup +from homeassistant.components.nws.const import DOMAIN + + +async def test_form(hass, mock_simple_nws): + """Test we get the form.""" + hass.config.latitude = 35 + hass.config.longitude = -90 + + await setup.async_setup_component(hass, "persistent_notification", {}) + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + with patch( + "homeassistant.components.nws.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.nws.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"api_key": "test"} + ) + + assert result2["type"] == "create_entry" + assert result2["title"] == "ABC" + assert result2["data"] == { + "api_key": "test", + "latitude": 35, + "longitude": -90, + "station": "ABC", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_cannot_connect(hass, mock_simple_nws): + """Test we handle cannot connect error.""" + mock_instance = mock_simple_nws.return_value + mock_instance.set_station.side_effect = aiohttp.ClientError + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"api_key": "test"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "cannot_connect"} + + +async def test_form_unknown_error(hass, mock_simple_nws): + """Test we handle unknown error.""" + mock_instance = mock_simple_nws.return_value + mock_instance.set_station.side_effect = ValueError + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"api_key": "test"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "unknown"} + + +async def test_form_already_configured(hass, mock_simple_nws): + """Test we handle duplicate entries.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.nws.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.nws.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"api_key": "test"}, + ) + + assert result2["type"] == "create_entry" + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.nws.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.nws.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"api_key": "test"}, + ) + assert result2["type"] == "abort" + assert result2["reason"] == "already_configured" + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 0 + assert len(mock_setup_entry.mock_calls) == 0 diff --git a/tests/components/nws/test_init.py b/tests/components/nws/test_init.py index e6fe5707a0d7..68c1e8c81304 100644 --- a/tests/components/nws/test_init.py +++ b/tests/components/nws/test_init.py @@ -1,92 +1,26 @@ """Tests for init module.""" -from homeassistant.components import nws -from homeassistant.components.nws.const import CONF_STATION, DOMAIN -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE -from homeassistant.setup import async_setup_component +from homeassistant.components.nws.const import DOMAIN +from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN -from tests.common import assert_setup_component -from tests.components.nws.const import MINIMAL_CONFIG - -LATLON_CONFIG = { - DOMAIN: [{CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}] -} -FULL_CONFIG = { - DOMAIN: [ - { - CONF_API_KEY: "test", - CONF_LATITUDE: 45.0, - CONF_LONGITUDE: -75.0, - CONF_STATION: "XYZ", - } - ] -} -DUPLICATE_CONFIG = { - DOMAIN: [ - {CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}, - {CONF_API_KEY: "test", CONF_LATITUDE: 45.0, CONF_LONGITUDE: -75.0}, - ] -} +from tests.common import MockConfigEntry +from tests.components.nws.const import NWS_CONFIG -async def test_no_config(hass, mock_simple_nws): - """Test that nws does not setup with no config.""" - with assert_setup_component(0): - assert await async_setup_component(hass, DOMAIN, {}) - await hass.async_block_till_done() +async def test_unload_entry(hass, mock_simple_nws): + """Test that nws setup with config yaml.""" + entry = MockConfigEntry(domain=DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) - entity_registry = await hass.helpers.entity_registry.async_get_registry() - assert len(entity_registry.entities) == 0 - - assert DOMAIN not in hass.data - - -async def test_successful_minimal_config(hass, mock_simple_nws): - """Test that nws setup with minimal config.""" - hass.config.latitude = 40.0 - hass.config.longitude = -75.0 - with assert_setup_component(1, DOMAIN): - assert await async_setup_component(hass, DOMAIN, MINIMAL_CONFIG) - await hass.async_block_till_done() - - entity_registry = await hass.helpers.entity_registry.async_get_registry() - assert len(entity_registry.entities) == 2 - - assert DOMAIN in hass.data - assert nws.base_unique_id(40.0, -75.0) in hass.data[DOMAIN] - - -async def test_successful_latlon_config(hass, mock_simple_nws): - """Test that nws setup with latlon config.""" - with assert_setup_component(1, DOMAIN): - assert await async_setup_component(hass, DOMAIN, LATLON_CONFIG) - await hass.async_block_till_done() - - entity_registry = await hass.helpers.entity_registry.async_get_registry() - assert len(entity_registry.entities) == 2 - - assert DOMAIN in hass.data - assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] - - -async def test_successful_full_config(hass, mock_simple_nws): - """Test that nws setup with full config.""" - with assert_setup_component(1, DOMAIN): - assert await async_setup_component(hass, DOMAIN, FULL_CONFIG) - await hass.async_block_till_done() - - entity_registry = await hass.helpers.entity_registry.async_get_registry() - assert len(entity_registry.entities) == 2 - - assert DOMAIN in hass.data - assert nws.base_unique_id(45.0, -75.0) in hass.data[DOMAIN] - - -async def test_unsuccessful_duplicate_config(hass, mock_simple_nws): - """Test that nws setup with duplicate config.""" - assert await async_setup_component(hass, DOMAIN, DUPLICATE_CONFIG) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() - entity_registry = await hass.helpers.entity_registry.async_get_registry() - assert len(entity_registry.entities) == 2 + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 2 + assert DOMAIN in hass.data assert len(hass.data[DOMAIN]) == 1 + entries = hass.config_entries.async_entries(DOMAIN) + assert len(entries) == 1 + + assert await hass.config_entries.async_unload(entries[0].entry_id) + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0 + assert DOMAIN not in hass.data diff --git a/tests/components/nws/test_weather.py b/tests/components/nws/test_weather.py index 4ebc4580ff8a..2af76242410e 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -6,19 +6,18 @@ import pytest from homeassistant.components import nws from homeassistant.components.weather import ATTR_FORECAST -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 tests.common import async_fire_time_changed +from tests.common import MockConfigEntry, async_fire_time_changed from tests.components.nws.const import ( EXPECTED_FORECAST_IMPERIAL, EXPECTED_FORECAST_METRIC, EXPECTED_OBSERVATION_IMPERIAL, EXPECTED_OBSERVATION_METRIC, - MINIMAL_CONFIG, NONE_FORECAST, NONE_OBSERVATION, + NWS_CONFIG, ) @@ -34,7 +33,9 @@ async def test_imperial_metric( ): """Test with imperial and metric units.""" hass.config.units = units - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() state = hass.states.get("weather.abc_hourly") @@ -73,7 +74,9 @@ async def test_none_values(hass, mock_simple_nws): instance.observation = NONE_OBSERVATION instance.forecast = NONE_FORECAST - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() state = hass.states.get("weather.abc_daynight") @@ -93,7 +96,9 @@ async def test_none(hass, mock_simple_nws): instance.observation = None instance.forecast = None - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() state = hass.states.get("weather.abc_daynight") @@ -114,7 +119,9 @@ async def test_error_station(hass, mock_simple_nws): instance = mock_simple_nws.return_value instance.set_station.side_effect = aiohttp.ClientError - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) is True + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() assert hass.states.get("weather.abc_hourly") is None @@ -126,9 +133,21 @@ async def test_error_observation(hass, mock_simple_nws, caplog): instance = mock_simple_nws.return_value instance.update_observation.side_effect = aiohttp.ClientError - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() + instance.update_observation.assert_called_once() + + state = hass.states.get("weather.abc_daynight") + assert state + assert state.state == "unavailable" + + state = hass.states.get("weather.abc_hourly") + assert state + assert state.state == "unavailable" + assert "Error updating observation for station ABC" in caplog.text assert "Success updating observation for station ABC" not in caplog.text caplog.clear() @@ -139,6 +158,16 @@ async def test_error_observation(hass, mock_simple_nws, caplog): async_fire_time_changed(hass, future_time) await hass.async_block_till_done() + assert instance.update_observation.call_count == 2 + + state = hass.states.get("weather.abc_daynight") + assert state + assert state.state == "sunny" + + state = hass.states.get("weather.abc_hourly") + assert state + assert state.state == "sunny" + assert "Error updating observation for station ABC" not in caplog.text assert "Success updating observation for station ABC" in caplog.text @@ -148,9 +177,17 @@ async def test_error_forecast(hass, caplog, mock_simple_nws): instance = mock_simple_nws.return_value instance.update_forecast.side_effect = aiohttp.ClientError - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() + instance.update_forecast.assert_called_once() + + state = hass.states.get("weather.abc_daynight") + assert state + assert state.state == "unavailable" + assert "Error updating forecast for station ABC" in caplog.text assert "Success updating forecast for station ABC" not in caplog.text caplog.clear() @@ -161,6 +198,12 @@ async def test_error_forecast(hass, caplog, mock_simple_nws): async_fire_time_changed(hass, future_time) await hass.async_block_till_done() + assert instance.update_forecast.call_count == 2 + + state = hass.states.get("weather.abc_daynight") + assert state + assert state.state == "sunny" + assert "Error updating forecast for station ABC" not in caplog.text assert "Success updating forecast for station ABC" in caplog.text @@ -170,9 +213,17 @@ async def test_error_forecast_hourly(hass, caplog, mock_simple_nws): instance = mock_simple_nws.return_value instance.update_forecast_hourly.side_effect = aiohttp.ClientError - assert await async_setup_component(hass, nws.DOMAIN, MINIMAL_CONFIG) + entry = MockConfigEntry(domain=nws.DOMAIN, data=NWS_CONFIG,) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() + state = hass.states.get("weather.abc_hourly") + assert state + assert state.state == "unavailable" + + instance.update_forecast_hourly.assert_called_once() + assert "Error updating forecast_hourly for station ABC" in caplog.text assert "Success updating forecast_hourly for station ABC" not in caplog.text caplog.clear() @@ -183,5 +234,11 @@ async def test_error_forecast_hourly(hass, caplog, mock_simple_nws): async_fire_time_changed(hass, future_time) await hass.async_block_till_done() + assert instance.update_forecast_hourly.call_count == 2 + + state = hass.states.get("weather.abc_hourly") + assert state + assert state.state == "sunny" + assert "Error updating forecast_hourly for station ABC" not in caplog.text assert "Success updating forecast_hourly for station ABC" in caplog.text From 5a2eddb32c8bee329679160e4a94ee456f88dbd5 Mon Sep 17 00:00:00 2001 From: lewei50 Date: Thu, 16 Apr 2020 23:06:23 +0800 Subject: [PATCH 440/653] Bump iammeter to 0.1.7 to fix empty SN (#34279) * update pypi lib to fix empty SN issue. * Update requirements_all.txt --- homeassistant/components/iammeter/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/iammeter/manifest.json b/homeassistant/components/iammeter/manifest.json index f5f21dcfe481..a5893c54f5a8 100644 --- a/homeassistant/components/iammeter/manifest.json +++ b/homeassistant/components/iammeter/manifest.json @@ -3,5 +3,5 @@ "name": "IamMeter", "documentation": "https://www.home-assistant.io/integrations/iammeter", "codeowners": ["@lewei50"], - "requirements": ["iammeter==0.1.3"] + "requirements": ["iammeter==0.1.7"] } diff --git a/requirements_all.txt b/requirements_all.txt index 38133b1a4760..fbc87c049c9c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -730,7 +730,7 @@ hydrawiser==0.1.1 # i2csense==0.0.4 # homeassistant.components.iammeter -iammeter==0.1.3 +iammeter==0.1.7 # homeassistant.components.iaqualink iaqualink==0.3.1 From 3d9ae1b8bd05de2c481122a9446c5d09db6bc072 Mon Sep 17 00:00:00 2001 From: Arjan van Balken Date: Thu, 16 Apr 2020 17:10:32 +0200 Subject: [PATCH 441/653] Add device tracking support for the Arris TG2492LG router (#30972) * Add device tracker based on arris-tg2492lg * Return name of device and update version of arris_tg2492lg * Update CODEOWNERS, requirements_all.txt and .coveragerc * Change default url to host * Use f-strings Co-Authored-By: Franck Nijhof * Clean up * Fix formatting Co-authored-by: Franck Nijhof Co-authored-by: Martin Hjelmare --- .coveragerc | 1 + CODEOWNERS | 1 + .../components/arris_tg2492lg/__init__.py | 1 + .../arris_tg2492lg/device_tracker.py | 70 +++++++++++++++++++ .../components/arris_tg2492lg/manifest.json | 11 +++ requirements_all.txt | 3 + 6 files changed, 87 insertions(+) create mode 100644 homeassistant/components/arris_tg2492lg/__init__.py create mode 100644 homeassistant/components/arris_tg2492lg/device_tracker.py create mode 100644 homeassistant/components/arris_tg2492lg/manifest.json diff --git a/.coveragerc b/.coveragerc index 3bae7386c3bb..3e0e523f95f6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -45,6 +45,7 @@ omit = homeassistant/components/arest/sensor.py homeassistant/components/arest/switch.py homeassistant/components/arlo/* + homeassistant/components/arris_tg2492lg/* homeassistant/components/aruba/device_tracker.py homeassistant/components/arwn/sensor.py homeassistant/components/asterisk_cdr/mailbox.py diff --git a/CODEOWNERS b/CODEOWNERS index fa7f6745aeec..bdf3bbbbe523 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -33,6 +33,7 @@ homeassistant/components/aprs/* @PhilRW homeassistant/components/arcam_fmj/* @elupus homeassistant/components/arduino/* @fabaff homeassistant/components/arest/* @fabaff +homeassistant/components/arris_tg2492lg/* @vanbalken homeassistant/components/asuswrt/* @kennedyshead homeassistant/components/aten_pe/* @mtdcr homeassistant/components/atome/* @baqs diff --git a/homeassistant/components/arris_tg2492lg/__init__.py b/homeassistant/components/arris_tg2492lg/__init__.py new file mode 100644 index 000000000000..c08ddcba48fc --- /dev/null +++ b/homeassistant/components/arris_tg2492lg/__init__.py @@ -0,0 +1 @@ +"""The Arris TG2492LG component.""" diff --git a/homeassistant/components/arris_tg2492lg/device_tracker.py b/homeassistant/components/arris_tg2492lg/device_tracker.py new file mode 100644 index 000000000000..d18d19806f97 --- /dev/null +++ b/homeassistant/components/arris_tg2492lg/device_tracker.py @@ -0,0 +1,70 @@ +"""Support for Arris TG2492LG router.""" +import logging +from typing import List + +from arris_tg2492lg import ConnectBox, Device +import voluptuous as vol + +from homeassistant.components.device_tracker import ( + DOMAIN, + PLATFORM_SCHEMA, + DeviceScanner, +) +from homeassistant.const import CONF_HOST, CONF_PASSWORD +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_HOST = "192.168.178.1" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_PASSWORD): cv.string, + vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + } +) + + +def get_scanner(hass, config): + """Return the Arris device scanner.""" + conf = config[DOMAIN] + url = f"http://{conf[CONF_HOST]}" + connect_box = ConnectBox(url, conf[CONF_PASSWORD]) + return ArrisDeviceScanner(connect_box) + + +class ArrisDeviceScanner(DeviceScanner): + """This class queries a Arris TG2492LG router for connected devices.""" + + def __init__(self, connect_box: ConnectBox): + """Initialize the scanner.""" + self.connect_box = connect_box + self.last_results: List[Device] = [] + + def scan_devices(self): + """Scan for new devices and return a list with found device IDs.""" + self._update_info() + + return [device.mac for device in self.last_results] + + def get_device_name(self, device): + """Return the name of the given device or None if we don't know.""" + name = next( + (result.hostname for result in self.last_results if result.mac == device), + None, + ) + return name + + def _update_info(self): + """Ensure the information from the Arris TG2492LG router is up to date.""" + result = self.connect_box.get_connected_devices() + + last_results = [] + mac_addresses = set() + + for device in result: + if device.online and device.mac not in mac_addresses: + last_results.append(device) + mac_addresses.add(device.mac) + + self.last_results = last_results diff --git a/homeassistant/components/arris_tg2492lg/manifest.json b/homeassistant/components/arris_tg2492lg/manifest.json new file mode 100644 index 000000000000..385bb9556272 --- /dev/null +++ b/homeassistant/components/arris_tg2492lg/manifest.json @@ -0,0 +1,11 @@ +{ + "domain": "arris_tg2492lg", + "name": "Arris TG2492LG", + "documentation": "https://www.home-assistant.io/integrations/arris_tg2492lg", + "requirements": [ + "arris-tg2492lg==1.0.0" + ], + "codeowners": [ + "@vanbalken" + ] +} diff --git a/requirements_all.txt b/requirements_all.txt index fbc87c049c9c..c39d1760efbc 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -261,6 +261,9 @@ aqualogic==1.0 # homeassistant.components.arcam_fmj arcam-fmj==0.4.3 +# homeassistant.components.arris_tg2492lg +arris-tg2492lg==1.0.0 + # homeassistant.components.ampio asmog==0.0.6 From 94a3cec4bf8483af385bff7764be2c607e98ece9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 08:38:54 -0700 Subject: [PATCH 442/653] Take integration title from manifest if not translated (#34283) --- homeassistant/components/hue/strings.json | 1 - homeassistant/helpers/translation.py | 66 ++++++++++++++++------- tests/helpers/test_translation.py | 40 +++++++++++--- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/hue/strings.json b/homeassistant/components/hue/strings.json index 620207c14bf6..498a96058337 100644 --- a/homeassistant/components/hue/strings.json +++ b/homeassistant/components/hue/strings.json @@ -1,5 +1,4 @@ { - "title": "Philips Hue", "config": { "step": { "init": { diff --git a/homeassistant/helpers/translation.py b/homeassistant/helpers/translation.py index e58c6379e959..6989e7770b96 100644 --- a/homeassistant/helpers/translation.py +++ b/homeassistant/helpers/translation.py @@ -1,8 +1,11 @@ """Translation string lookup helpers.""" +import asyncio import logging from typing import Any, Dict, Iterable, Optional +from homeassistant.core import callback from homeassistant.loader import ( + Integration, async_get_config_flows, async_get_integration, bind_hass, @@ -32,8 +35,9 @@ def flatten(data: Dict) -> Dict[str, Any]: return recursive_flatten("", data) -async def component_translation_file( - hass: HomeAssistantType, component: str, language: str +@callback +def component_translation_file( + component: str, language: str, integration: Integration ) -> Optional[str]: """Return the translation json file location for a component. @@ -49,9 +53,6 @@ async def component_translation_file( domain = parts[-1] is_platform = len(parts) == 2 - integration = await async_get_integration(hass, domain) - assert integration is not None, domain - if is_platform: filename = f"{parts[0]}.{language}.json" return str(integration.file_path / ".translations" / filename) @@ -105,26 +106,47 @@ def build_resources( async def async_get_component_resources( hass: HomeAssistantType, language: str ) -> Dict[str, Any]: - """Return translation resources for all components.""" - if TRANSLATION_STRING_CACHE not in hass.data: - hass.data[TRANSLATION_STRING_CACHE] = {} - if language not in hass.data[TRANSLATION_STRING_CACHE]: - hass.data[TRANSLATION_STRING_CACHE][language] = {} - translation_cache = hass.data[TRANSLATION_STRING_CACHE][language] + """Return translation resources for all components. - # Get the set of components + We go through all loaded components and platforms: + - see if they have already been loaded (exist in translation_cache) + - load them if they have not been loaded yet + - write them to cache + - flatten the cache and return + """ + # Get cache for this language + cache = hass.data.setdefault(TRANSLATION_STRING_CACHE, {}) + translation_cache = cache.setdefault(language, {}) + + # Get the set of components to check components = hass.config.components | await async_get_config_flows(hass) - # Calculate the missing components - missing_components = components - set(translation_cache) + # Calculate the missing components and platforms + missing_loaded = components - set(translation_cache) + missing_domains = {loaded.split(".")[-1] for loaded in missing_loaded} + + missing_integrations = dict( + zip( + missing_domains, + await asyncio.gather( + *[async_get_integration(hass, domain) for domain in missing_domains] + ), + ) + ) + + # Determine paths of missing components/platforms missing_files = {} - for component in missing_components: - path = await component_translation_file(hass, component, language) + for loaded in missing_loaded: + parts = loaded.split(".") + domain = parts[-1] + integration = missing_integrations[domain] + + path = component_translation_file(loaded, language, integration) # No translation available if path is None: - translation_cache[component] = {} + translation_cache[loaded] = {} else: - missing_files[component] = path + missing_files[loaded] = path # Load missing files if missing_files: @@ -134,6 +156,14 @@ async def async_get_component_resources( assert load_translations_job is not None loaded_translations = await load_translations_job + # Translations that miss "title" will get integration put in. + for loaded, translations in loaded_translations.items(): + if "." in loaded: + continue + + if "title" not in translations: + translations["title"] = missing_integrations[loaded].name + # Update cache translation_cache.update(loaded_translations) diff --git a/tests/helpers/test_translation.py b/tests/helpers/test_translation.py index 6b846703914e..f85425c575f0 100644 --- a/tests/helpers/test_translation.py +++ b/tests/helpers/test_translation.py @@ -1,12 +1,14 @@ """Test the translation helper.""" -# pylint: disable=protected-access +import asyncio from os import path -from unittest.mock import patch +import pathlib +from asynctest import Mock, patch import pytest from homeassistant.generated import config_flows import homeassistant.helpers.translation as translation +from homeassistant.loader import async_get_integration from homeassistant.setup import async_setup_component from tests.common import mock_coro @@ -43,14 +45,28 @@ async def test_component_translation_file(hass): assert await async_setup_component(hass, "test_standalone", {"test_standalone"}) assert await async_setup_component(hass, "test_package", {"test_package"}) + ( + int_test, + int_test_embedded, + int_test_standalone, + int_test_package, + ) = await asyncio.gather( + async_get_integration(hass, "test"), + async_get_integration(hass, "test_embedded"), + async_get_integration(hass, "test_standalone"), + async_get_integration(hass, "test_package"), + ) + assert path.normpath( - await translation.component_translation_file(hass, "switch.test", "en") + translation.component_translation_file("switch.test", "en", int_test) ) == path.normpath( hass.config.path("custom_components", "test", ".translations", "switch.en.json") ) assert path.normpath( - await translation.component_translation_file(hass, "switch.test_embedded", "en") + translation.component_translation_file( + "switch.test_embedded", "en", int_test_embedded + ) ) == path.normpath( hass.config.path( "custom_components", "test_embedded", ".translations", "switch.en.json" @@ -58,12 +74,14 @@ async def test_component_translation_file(hass): ) assert ( - await translation.component_translation_file(hass, "test_standalone", "en") + translation.component_translation_file( + "test_standalone", "en", int_test_standalone + ) is None ) assert path.normpath( - await translation.component_translation_file(hass, "test_package", "en") + translation.component_translation_file("test_package", "en", int_test_package) ) == path.normpath( hass.config.path( "custom_components", "test_package", ".translations", "en.json" @@ -118,6 +136,8 @@ async def test_get_translations(hass, mock_config_flows): async def test_get_translations_loads_config_flows(hass, mock_config_flows): """Test the get translations helper loads config flow translations.""" mock_config_flows.append("component1") + integration = Mock(file_path=pathlib.Path(__file__)) + integration.name = "Component 1" with patch.object( translation, "component_translation_file", return_value=mock_coro("bla.json") @@ -125,6 +145,12 @@ async def test_get_translations_loads_config_flows(hass, mock_config_flows): translation, "load_translations_files", return_value={"component1": {"hello": "world"}}, + ), patch( + "homeassistant.helpers.translation.async_get_integration", + return_value=integration, ): translations = await translation.async_get_translations(hass, "en") - assert translations == {"component.component1.hello": "world"} + assert translations == { + "component.component1.title": "Component 1", + "component.component1.hello": "world", + } From 371bea03d659b7c03475dac4d14905e4123c5d29 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 09:00:04 -0700 Subject: [PATCH 443/653] Allow hassfest to validate specific integrations (#34277) --- azure-pipelines-ci.yml | 2 +- script/hassfest/__main__.py | 74 +++++++++++++++++++++++++++------ script/hassfest/codeowners.py | 3 ++ script/hassfest/config_flow.py | 3 ++ script/hassfest/dependencies.py | 3 ++ script/hassfest/manifest.py | 8 ++-- script/hassfest/model.py | 11 ++--- script/hassfest/ssdp.py | 3 ++ script/hassfest/zeroconf.py | 3 ++ 9 files changed, 88 insertions(+), 22 deletions(-) diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 0b5c8678f115..af323ecde1a0 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -96,7 +96,7 @@ stages: pip install -e . - script: | . venv/bin/activate - python -m script.hassfest validate + python -m script.hassfest --action validate displayName: 'Validate manifests' - script: | . venv/bin/activate diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index 7c86a1ca6c45..00fd30b5278c 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -1,4 +1,5 @@ """Validate manifests.""" +import argparse import pathlib import sys from time import monotonic @@ -16,10 +17,9 @@ from . import ( ) from .model import Config, Integration -PLUGINS = [ +INTEGRATION_PLUGINS = [ codeowners, config_flow, - coverage, dependencies, manifest, services, @@ -27,16 +27,52 @@ PLUGINS = [ translations, zeroconf, ] +HASS_PLUGINS = [ + coverage, +] + + +def valid_integration_path(integration_path): + """Test if it's a valid integration.""" + path = pathlib.Path(integration_path) + if not path.is_dir(): + raise argparse.ArgumentTypeError(f"{integration_path} is not a directory.") + + return path def get_config() -> Config: """Return config.""" - if not pathlib.Path("requirements_all.txt").is_file(): - raise RuntimeError("Run from project root") + parser = argparse.ArgumentParser(description="Hassfest") + parser.add_argument( + "--action", type=str, choices=["validate", "generate"], default=None + ) + parser.add_argument( + "--integration-path", + action="append", + type=valid_integration_path, + help="Validate a single integration", + ) + parsed = parser.parse_args() + + if parsed.action is None: + parsed.action = "validate" if parsed.integration_path else "generate" + + if parsed.action == "generate" and parsed.integration_path: + raise RuntimeError( + "Generate is not allowed when limiting to specific integrations" + ) + + if ( + not parsed.integration_path + and not pathlib.Path("requirements_all.txt").is_file() + ): + raise RuntimeError("Run from Home Assistant root") return Config( root=pathlib.Path(".").absolute(), - action="validate" if sys.argv[-1] == "validate" else "generate", + specific_integrations=parsed.integration_path, + action=parsed.action, ) @@ -48,9 +84,21 @@ def main(): print(err) return 1 - integrations = Integration.load_dir(pathlib.Path("homeassistant/components")) + plugins = INTEGRATION_PLUGINS - for plugin in PLUGINS: + if config.specific_integrations: + integrations = {} + + for int_path in config.specific_integrations: + integration = Integration(int_path) + integration.load_manifest() + integrations[integration.domain] = integration + + else: + integrations = Integration.load_dir(pathlib.Path("homeassistant/components")) + plugins += HASS_PLUGINS + + for plugin in plugins: try: start = monotonic() print(f"Validating {plugin.__name__.split('.')[-1]}...", end="", flush=True) @@ -77,14 +125,15 @@ def main(): general_errors = config.errors invalid_itg = [itg for itg in integrations.values() if itg.errors] + print() print("Integrations:", len(integrations)) print("Invalid integrations:", len(invalid_itg)) if not invalid_itg and not general_errors: - for plugin in PLUGINS: - if hasattr(plugin, "generate"): - plugin.generate(integrations, config) - + if config.action == "generate": + for plugin in plugins: + if hasattr(plugin, "generate"): + plugin.generate(integrations, config) return 0 print() @@ -99,7 +148,8 @@ def main(): print() for integration in sorted(invalid_itg, key=lambda itg: itg.domain): - print(f"Integration {integration.domain}:") + extra = f" - {integration.path}" if config.specific_integrations else "" + print(f"Integration {integration.domain}{extra}:") for error in integration.errors: print("*", error) print() diff --git a/script/hassfest/codeowners.py b/script/hassfest/codeowners.py index 76d62bda6067..6d312bf86104 100644 --- a/script/hassfest/codeowners.py +++ b/script/hassfest/codeowners.py @@ -60,6 +60,9 @@ def validate(integrations: Dict[str, Integration], config: Config): codeowners_path = config.root / "CODEOWNERS" config.cache["codeowners"] = content = generate_and_validate(integrations) + if config.specific_integrations: + return + with open(str(codeowners_path)) as fp: if fp.read().strip() != content: config.add_error( diff --git a/script/hassfest/config_flow.py b/script/hassfest/config_flow.py index 1f14beafd736..6971cc28fc90 100644 --- a/script/hassfest/config_flow.py +++ b/script/hassfest/config_flow.py @@ -68,6 +68,9 @@ def validate(integrations: Dict[str, Integration], config: Config): config_flow_path = config.root / "homeassistant/generated/config_flows.py" config.cache["config_flow"] = content = generate_and_validate(integrations) + if config.specific_integrations: + return + with open(str(config_flow_path)) as fp: if fp.read().strip() != content: config.add_error( diff --git a/script/hassfest/dependencies.py b/script/hassfest/dependencies.py index 660e80659665..ba9e971d02e3 100644 --- a/script/hassfest/dependencies.py +++ b/script/hassfest/dependencies.py @@ -249,6 +249,9 @@ def validate(integrations: Dict[str, Integration], config): validate_dependencies(integrations, integration) + if config.specific_integrations: + continue + # check that all referenced dependencies exist for dep in integration.manifest.get("dependencies", []): if dep not in integrations: diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index eeaf6f01262b..7ae2ae818a51 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -10,7 +10,7 @@ from .model import Integration DOCUMENTATION_URL_SCHEMA = "https" DOCUMENTATION_URL_HOST = "www.home-assistant.io" DOCUMENTATION_URL_PATH_PREFIX = "/integrations/" -DOCUMENTATION_URL_EXCEPTIONS = ["https://www.home-assistant.io/hassio"] +DOCUMENTATION_URL_EXCEPTIONS = {"https://www.home-assistant.io/hassio"} SUPPORTED_QUALITY_SCALES = ["gold", "internal", "platinum", "silver"] @@ -23,9 +23,9 @@ def documentation_url(value: str) -> str: parsed_url = urlparse(value) if not parsed_url.scheme == DOCUMENTATION_URL_SCHEMA: raise vol.Invalid("Documentation url is not prefixed with https") - if not parsed_url.netloc == DOCUMENTATION_URL_HOST: - raise vol.Invalid("Documentation url not hosted at www.home-assistant.io") - if not parsed_url.path.startswith(DOCUMENTATION_URL_PATH_PREFIX): + if parsed_url.netloc == DOCUMENTATION_URL_HOST and not parsed_url.path.startswith( + DOCUMENTATION_URL_PATH_PREFIX + ): raise vol.Invalid( "Documentation url does not begin with www.home-assistant.io/integrations" ) diff --git a/script/hassfest/model.py b/script/hassfest/model.py index 0a17b5aab9fb..a03bc3ebd00a 100644 --- a/script/hassfest/model.py +++ b/script/hassfest/model.py @@ -2,7 +2,7 @@ import importlib import json import pathlib -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional import attr @@ -24,10 +24,11 @@ class Error: class Config: """Config for the run.""" - root = attr.ib(type=pathlib.Path) - action = attr.ib(type=str) - errors = attr.ib(type=List[Error], factory=list) - cache = attr.ib(type=Dict[str, Any], factory=dict) + specific_integrations: Optional[pathlib.Path] = attr.ib() + root: pathlib.Path = attr.ib() + action: str = attr.ib() + errors: List[Error] = attr.ib(factory=list) + cache: Dict[str, Any] = attr.ib(factory=dict) def add_error(self, *args, **kwargs): """Add an error.""" diff --git a/script/hassfest/ssdp.py b/script/hassfest/ssdp.py index 71e94997b0ca..05a9dee332d7 100644 --- a/script/hassfest/ssdp.py +++ b/script/hassfest/ssdp.py @@ -65,6 +65,9 @@ def validate(integrations: Dict[str, Integration], config: Config): ssdp_path = config.root / "homeassistant/generated/ssdp.py" config.cache["ssdp"] = content = generate_and_validate(integrations) + if config.specific_integrations: + return + with open(str(ssdp_path)) as fp: if fp.read().strip() != content: config.add_error( diff --git a/script/hassfest/zeroconf.py b/script/hassfest/zeroconf.py index 89e0eb7fba4a..5ff102ea4801 100644 --- a/script/hassfest/zeroconf.py +++ b/script/hassfest/zeroconf.py @@ -120,6 +120,9 @@ def validate(integrations: Dict[str, Integration], config: Config): zeroconf_path = config.root / "homeassistant/generated/zeroconf.py" config.cache["zeroconf"] = content = generate_and_validate(integrations) + if config.specific_integrations: + return + with open(str(zeroconf_path)) as fp: current = fp.read().strip() if current != content: From 0d999649c0a2d4624c8bf5cf607cba99609fc6c8 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Thu, 16 Apr 2020 18:16:14 +0200 Subject: [PATCH 444/653] Support contemporary entity selectors for LIFX services (#33062) * Support contemporary entity selectors for LIFX services * Use async_register_entity_service() for lifx.set_state * Call directly --- homeassistant/components/lifx/light.py | 68 +++++++------------------- 1 file changed, 17 insertions(+), 51 deletions(-) diff --git a/homeassistant/components/lifx/light.py b/homeassistant/components/lifx/light.py index e5bbe88edfb8..ca04dbefb7f8 100644 --- a/homeassistant/components/lifx/light.py +++ b/homeassistant/components/lifx/light.py @@ -35,18 +35,12 @@ from homeassistant.components.light import ( Light, preprocess_turn_on_alternatives, ) -from homeassistant.const import ( - ATTR_ENTITY_ID, - ATTR_MODE, - ENTITY_MATCH_ALL, - ENTITY_MATCH_NONE, - EVENT_HOMEASSISTANT_STOP, -) +from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE, EVENT_HOMEASSISTANT_STOP from homeassistant.core import callback +from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv import homeassistant.helpers.device_registry as dr from homeassistant.helpers.event import async_track_point_in_utc_time -from homeassistant.helpers.service import async_extract_entity_ids import homeassistant.util.color as color_util from . import ( @@ -105,15 +99,13 @@ PULSE_MODES = [ PULSE_MODE_SOLID, ] -LIFX_EFFECT_SCHEMA = vol.Schema( - { - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, - vol.Optional(ATTR_POWER_ON, default=True): cv.boolean, - } -) +LIFX_EFFECT_SCHEMA = { + vol.Optional(ATTR_POWER_ON, default=True): cv.boolean, +} -LIFX_EFFECT_PULSE_SCHEMA = LIFX_EFFECT_SCHEMA.extend( +LIFX_EFFECT_PULSE_SCHEMA = cv.make_entity_service_schema( { + **LIFX_EFFECT_SCHEMA, ATTR_BRIGHTNESS: VALID_BRIGHTNESS, ATTR_BRIGHTNESS_PCT: VALID_BRIGHTNESS_PCT, vol.Exclusive(ATTR_COLOR_NAME, COLOR_GROUP): cv.string, @@ -144,8 +136,9 @@ LIFX_EFFECT_PULSE_SCHEMA = LIFX_EFFECT_SCHEMA.extend( } ) -LIFX_EFFECT_COLORLOOP_SCHEMA = LIFX_EFFECT_SCHEMA.extend( +LIFX_EFFECT_COLORLOOP_SCHEMA = cv.make_entity_service_schema( { + **LIFX_EFFECT_SCHEMA, ATTR_BRIGHTNESS: VALID_BRIGHTNESS, ATTR_BRIGHTNESS_PCT: VALID_BRIGHTNESS_PCT, ATTR_PERIOD: vol.All(vol.Coerce(float), vol.Clamp(min=0.05)), @@ -155,7 +148,7 @@ LIFX_EFFECT_COLORLOOP_SCHEMA = LIFX_EFFECT_SCHEMA.extend( } ) -LIFX_EFFECT_STOP_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) +LIFX_EFFECT_STOP_SCHEMA = cv.make_entity_service_schema({}) def aiolifx(): @@ -191,7 +184,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): # Priority 3: default interface interfaces = [{}] - lifx_manager = LIFXManager(hass, async_add_entities) + platform = entity_platform.current_platform.get() + lifx_manager = LIFXManager(hass, platform, async_add_entities) hass.data[DATA_LIFX_MANAGER] = lifx_manager for interface in interfaces: @@ -242,10 +236,11 @@ def merge_hsbk(base, change): class LIFXManager: """Representation of all known LIFX entities.""" - def __init__(self, hass, async_add_entities): + def __init__(self, hass, platform, async_add_entities): """Initialize the light.""" self.entities = {} self.hass = hass + self.platform = platform self.async_add_entities = async_add_entities self.effects_conductor = aiolifx_effects().Conductor(hass.loop) self.discoveries = [] @@ -293,22 +288,8 @@ class LIFXManager: def register_set_state(self): """Register the LIFX set_state service call.""" - - async def service_handler(service): - """Apply a service.""" - tasks = [] - for light in await self.async_service_to_entities(service): - if service.service == SERVICE_LIFX_SET_STATE: - task = light.set_state(**service.data) - tasks.append(self.hass.async_create_task(task)) - if tasks: - await asyncio.wait(tasks) - - self.hass.services.async_register( - LIFX_DOMAIN, - SERVICE_LIFX_SET_STATE, - service_handler, - schema=LIFX_SET_STATE_SCHEMA, + self.platform.async_register_entity_service( + SERVICE_LIFX_SET_STATE, LIFX_SET_STATE_SCHEMA, "set_state" ) def register_effects(self): @@ -316,7 +297,7 @@ class LIFXManager: async def service_handler(service): """Apply a service, i.e. start an effect.""" - entities = await self.async_service_to_entities(service) + entities = await self.platform.async_extract_from_service(service) if entities: await self.start_effect(entities, service.service, **service.data) @@ -373,21 +354,6 @@ class LIFXManager: elif service == SERVICE_EFFECT_STOP: await self.effects_conductor.stop(bulbs) - async def async_service_to_entities(self, service): - """Return the known entities that a service call mentions.""" - if service.data.get(ATTR_ENTITY_ID) == ENTITY_MATCH_NONE: - return [] - - if service.data.get(ATTR_ENTITY_ID) == ENTITY_MATCH_ALL: - return self.entities.values() - - entity_ids = await async_extract_entity_ids(self.hass, service) - return [ - entity - for entity in self.entities.values() - if entity.entity_id in entity_ids - ] - @callback def register(self, bulb): """Handle aiolifx detected bulb.""" From e20bfdd19cec061b704ee9ee0f3a59744413d212 Mon Sep 17 00:00:00 2001 From: Kit Klein <33464407+kit-klein@users.noreply.github.com> Date: Thu, 16 Apr 2020 12:34:53 -0400 Subject: [PATCH 445/653] Ensure zone in update payload for konnected (#34289) --- .../components/konnected/__init__.py | 1 + tests/components/konnected/test_init.py | 150 +++++++++++++++++- 2 files changed, 150 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/konnected/__init__.py b/homeassistant/components/konnected/__init__.py index 75cc3126c24a..ae50e14d40ae 100644 --- a/homeassistant/components/konnected/__init__.py +++ b/homeassistant/components/konnected/__init__.py @@ -348,6 +348,7 @@ class KonnectedView(HomeAssistantView): try: zone_num = str(payload.get(CONF_ZONE) or PIN_TO_ZONE[payload[CONF_PIN]]) + payload[CONF_ZONE] = zone_num zone_data = device[CONF_BINARY_SENSORS].get(zone_num) or next( (s for s in device[CONF_SENSORS] if s[CONF_ZONE] == zone_num), None ) diff --git a/tests/components/konnected/test_init.py b/tests/components/konnected/test_init.py index 1bf239852f86..f87c66fe412c 100644 --- a/tests/components/konnected/test_init.py +++ b/tests/components/konnected/test_init.py @@ -561,7 +561,7 @@ async def test_api(hass, aiohttp_client, mock_panel): assert result == {"message": "ok"} -async def test_state_updates(hass, aiohttp_client, mock_panel): +async def test_state_updates_zone(hass, aiohttp_client, mock_panel): """Test callback view.""" await async_setup_component(hass, "http", {"http": {}}) @@ -707,3 +707,151 @@ async def test_state_updates(hass, aiohttp_client, mock_panel): assert result == {"message": "ok"} await hass.async_block_till_done() assert hass.states.get("sensor.temper_temperature").state == "42.0" + + +async def test_state_updates_pin(hass, aiohttp_client, mock_panel): + """Test callback view.""" + await async_setup_component(hass, "http", {"http": {}}) + + device_config = config_flow.CONFIG_ENTRY_SCHEMA( + { + "host": "1.2.3.4", + "port": 1234, + "id": "112233445566", + "model": "Konnected", + "access_token": "abcdefgh", + "default_options": config_flow.OPTIONS_SCHEMA({config_flow.CONF_IO: {}}), + } + ) + + device_options = config_flow.OPTIONS_SCHEMA( + { + "io": { + "1": "Binary Sensor", + "2": "Binary Sensor", + "3": "Binary Sensor", + "4": "Digital Sensor", + "5": "Digital Sensor", + "6": "Switchable Output", + "out": "Switchable Output", + }, + "binary_sensors": [ + {"zone": "1", "type": "door"}, + {"zone": "2", "type": "window", "name": "winder", "inverse": True}, + {"zone": "3", "type": "door"}, + ], + "sensors": [ + {"zone": "4", "type": "dht"}, + {"zone": "5", "type": "ds18b20", "name": "temper"}, + ], + "switches": [ + { + "zone": "out", + "name": "switcher", + "activation": "low", + "momentary": 50, + "pause": 100, + "repeat": 4, + }, + {"zone": "6"}, + ], + } + ) + + entry = MockConfigEntry( + domain="konnected", + title="Konnected Alarm Panel", + data=device_config, + options=device_options, + ) + entry.add_to_hass(hass) + + # Add empty data field to ensure we process it correctly (possible if entry is ignored) + entry = MockConfigEntry(domain="konnected", title="Konnected Alarm Panel", data={},) + entry.add_to_hass(hass) + + assert ( + await async_setup_component( + hass, + konnected.DOMAIN, + {konnected.DOMAIN: {konnected.CONF_ACCESS_TOKEN: "1122334455"}}, + ) + is True + ) + + client = await aiohttp_client(hass.http.app) + + # Test updating a binary sensor + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "1", "state": 0}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("binary_sensor.konnected_445566_zone_1").state == "off" + + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "1", "state": 1}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("binary_sensor.konnected_445566_zone_1").state == "on" + + # Test updating sht sensor + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "6", "temp": 22, "humi": 20}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("sensor.konnected_445566_sensor_4_humidity").state == "20" + assert ( + hass.states.get("sensor.konnected_445566_sensor_4_temperature").state == "22.0" + ) + + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "6", "temp": 25, "humi": 23}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("sensor.konnected_445566_sensor_4_humidity").state == "23" + assert ( + hass.states.get("sensor.konnected_445566_sensor_4_temperature").state == "25.0" + ) + + # Test updating ds sensor + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "7", "temp": 32, "addr": 1}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("sensor.temper_temperature").state == "32.0" + + resp = await client.post( + "/api/konnected/device/112233445566", + headers={"Authorization": "Bearer abcdefgh"}, + json={"pin": "7", "temp": 42, "addr": 1}, + ) + assert resp.status == 200 + result = await resp.json() + assert result == {"message": "ok"} + await hass.async_block_till_done() + assert hass.states.get("sensor.temper_temperature").state == "42.0" From 2f415b0db187cd25a7d8151a3ea68d21b580b1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Thu, 16 Apr 2020 20:51:07 +0200 Subject: [PATCH 446/653] Upgrade broadlink lib to 0.13.1 (#34290) --- homeassistant/components/broadlink/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/broadlink/manifest.json b/homeassistant/components/broadlink/manifest.json index 74ec59195df0..3c2c03384f34 100644 --- a/homeassistant/components/broadlink/manifest.json +++ b/homeassistant/components/broadlink/manifest.json @@ -2,6 +2,6 @@ "domain": "broadlink", "name": "Broadlink", "documentation": "https://www.home-assistant.io/integrations/broadlink", - "requirements": ["broadlink==0.13.0"], + "requirements": ["broadlink==0.13.1"], "codeowners": ["@danielhiversen", "@felipediel"] } diff --git a/requirements_all.txt b/requirements_all.txt index c39d1760efbc..7cd4accf59ed 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -358,7 +358,7 @@ boto3==1.9.252 bravia-tv==1.0.1 # homeassistant.components.broadlink -broadlink==0.13.0 +broadlink==0.13.1 # homeassistant.components.brother brother==0.1.11 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 6f013a52da05..92351e401082 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -140,7 +140,7 @@ bomradarloop==0.1.4 bravia-tv==1.0.1 # homeassistant.components.broadlink -broadlink==0.13.0 +broadlink==0.13.1 # homeassistant.components.brother brother==0.1.11 From 6119e790231eb04a2ede8d0e133de8724aae8cb2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 11:52:27 -0700 Subject: [PATCH 447/653] Migrate frontend translations of domains to backend (#34294) --- .../alarm_control_panel/strings.json | 1 + .../components/automation/strings.json | 1 + .../components/binary_sensor/strings.json | 1 + .../components/calendar/strings.json | 1 + homeassistant/components/camera/strings.json | 1 + homeassistant/components/climate/strings.json | 1 + .../components/configurator/strings.json | 1 + .../components/conversation/strings.json | 1 + homeassistant/components/cover/strings.json | 1 + .../components/device_tracker/strings.json | 1 + homeassistant/components/fan/strings.json | 1 + homeassistant/components/group/strings.json | 1 + .../components/image_processing/strings.json | 1 + .../components/input_boolean/strings.json | 1 + .../components/input_datetime/strings.json | 1 + .../components/input_number/strings.json | 1 + .../components/input_select/strings.json | 1 + .../components/input_text/strings.json | 1 + homeassistant/components/light/strings.json | 1 + homeassistant/components/lock/strings.json | 1 + homeassistant/components/mailbox/strings.json | 1 + .../components/media_player/strings.json | 1 + homeassistant/components/notify/strings.json | 1 + homeassistant/components/person/strings.json | 1 + homeassistant/components/plant/strings.json | 1 + .../components/proximity/strings.json | 1 + homeassistant/components/remote/strings.json | 1 + homeassistant/components/scene/strings.json | 1 + homeassistant/components/script/strings.json | 1 + homeassistant/components/sensor/strings.json | 1 + homeassistant/components/sun/strings.json | 1 + homeassistant/components/switch/strings.json | 1 + .../components/system_health/strings.json | 1 + homeassistant/components/updater/strings.json | 1 + homeassistant/components/vacuum/strings.json | 1 + script/translations/const.py | 3 +- script/translations/download.py | 4 +- script/translations/lokalise.py | 42 +++++- script/translations/migrate.py | 141 +++++++++++++++--- script/translations/upload.py | 4 +- 40 files changed, 199 insertions(+), 30 deletions(-) create mode 100644 homeassistant/components/automation/strings.json create mode 100644 homeassistant/components/calendar/strings.json create mode 100644 homeassistant/components/camera/strings.json create mode 100644 homeassistant/components/configurator/strings.json create mode 100644 homeassistant/components/conversation/strings.json create mode 100644 homeassistant/components/group/strings.json create mode 100644 homeassistant/components/image_processing/strings.json create mode 100644 homeassistant/components/input_boolean/strings.json create mode 100644 homeassistant/components/input_datetime/strings.json create mode 100644 homeassistant/components/input_number/strings.json create mode 100644 homeassistant/components/input_select/strings.json create mode 100644 homeassistant/components/input_text/strings.json create mode 100644 homeassistant/components/mailbox/strings.json create mode 100644 homeassistant/components/notify/strings.json create mode 100644 homeassistant/components/person/strings.json create mode 100644 homeassistant/components/plant/strings.json create mode 100644 homeassistant/components/proximity/strings.json create mode 100644 homeassistant/components/remote/strings.json create mode 100644 homeassistant/components/scene/strings.json create mode 100644 homeassistant/components/script/strings.json create mode 100644 homeassistant/components/sun/strings.json create mode 100644 homeassistant/components/system_health/strings.json create mode 100644 homeassistant/components/updater/strings.json diff --git a/homeassistant/components/alarm_control_panel/strings.json b/homeassistant/components/alarm_control_panel/strings.json index 928c8d2a2e25..19af428df2e7 100644 --- a/homeassistant/components/alarm_control_panel/strings.json +++ b/homeassistant/components/alarm_control_panel/strings.json @@ -1,4 +1,5 @@ { + "title": "Alarm control panel", "device_automation": { "action_type": { "arm_away": "Arm {entity_name} away", diff --git a/homeassistant/components/automation/strings.json b/homeassistant/components/automation/strings.json new file mode 100644 index 000000000000..c52c0f44f57b --- /dev/null +++ b/homeassistant/components/automation/strings.json @@ -0,0 +1 @@ +{ "title": "Automation" } diff --git a/homeassistant/components/binary_sensor/strings.json b/homeassistant/components/binary_sensor/strings.json index f2b32f45304e..45886a86ab86 100644 --- a/homeassistant/components/binary_sensor/strings.json +++ b/homeassistant/components/binary_sensor/strings.json @@ -1,4 +1,5 @@ { + "title": "Binary sensor", "device_automation": { "condition_type": { "is_bat_low": "{entity_name} battery is low", diff --git a/homeassistant/components/calendar/strings.json b/homeassistant/components/calendar/strings.json new file mode 100644 index 000000000000..6c452164a397 --- /dev/null +++ b/homeassistant/components/calendar/strings.json @@ -0,0 +1 @@ +{ "title": "Calendar" } diff --git a/homeassistant/components/camera/strings.json b/homeassistant/components/camera/strings.json new file mode 100644 index 000000000000..3f8b8cc718e7 --- /dev/null +++ b/homeassistant/components/camera/strings.json @@ -0,0 +1 @@ +{ "title": "Camera" } diff --git a/homeassistant/components/climate/strings.json b/homeassistant/components/climate/strings.json index ff071aed083d..d1c9821f892c 100644 --- a/homeassistant/components/climate/strings.json +++ b/homeassistant/components/climate/strings.json @@ -1,4 +1,5 @@ { + "title": "Climate", "device_automation": { "condition_type": { "is_hvac_mode": "{entity_name} is set to a specific HVAC mode", diff --git a/homeassistant/components/configurator/strings.json b/homeassistant/components/configurator/strings.json new file mode 100644 index 000000000000..4231e0268a0f --- /dev/null +++ b/homeassistant/components/configurator/strings.json @@ -0,0 +1 @@ +{ "title": "Configurator" } diff --git a/homeassistant/components/conversation/strings.json b/homeassistant/components/conversation/strings.json new file mode 100644 index 000000000000..dc6f2b5f52bd --- /dev/null +++ b/homeassistant/components/conversation/strings.json @@ -0,0 +1 @@ +{ "title": "Conversation" } diff --git a/homeassistant/components/cover/strings.json b/homeassistant/components/cover/strings.json index 90dac7c7d022..df20bd5ca9a9 100644 --- a/homeassistant/components/cover/strings.json +++ b/homeassistant/components/cover/strings.json @@ -1,4 +1,5 @@ { + "title": "Cover", "device_automation": { "action_type": { "open": "Open {entity_name}", diff --git a/homeassistant/components/device_tracker/strings.json b/homeassistant/components/device_tracker/strings.json index 285bac2cb4bb..7af9dd354793 100644 --- a/homeassistant/components/device_tracker/strings.json +++ b/homeassistant/components/device_tracker/strings.json @@ -1,4 +1,5 @@ { + "title": "Device tracker", "device_automation": { "condition_type": { "is_home": "{entity_name} is home", diff --git a/homeassistant/components/fan/strings.json b/homeassistant/components/fan/strings.json index 98c3012c1232..b7925e0f7284 100644 --- a/homeassistant/components/fan/strings.json +++ b/homeassistant/components/fan/strings.json @@ -1,4 +1,5 @@ { + "title": "Fan", "device_automation": { "condition_type": { "is_on": "{entity_name} is on", diff --git a/homeassistant/components/group/strings.json b/homeassistant/components/group/strings.json new file mode 100644 index 000000000000..fd98cea97e52 --- /dev/null +++ b/homeassistant/components/group/strings.json @@ -0,0 +1 @@ +{ "title": "Group" } diff --git a/homeassistant/components/image_processing/strings.json b/homeassistant/components/image_processing/strings.json new file mode 100644 index 000000000000..b635fb6aaeaf --- /dev/null +++ b/homeassistant/components/image_processing/strings.json @@ -0,0 +1 @@ +{ "title": "Image processing" } diff --git a/homeassistant/components/input_boolean/strings.json b/homeassistant/components/input_boolean/strings.json new file mode 100644 index 000000000000..b024071faf3d --- /dev/null +++ b/homeassistant/components/input_boolean/strings.json @@ -0,0 +1 @@ +{ "title": "Input boolean" } diff --git a/homeassistant/components/input_datetime/strings.json b/homeassistant/components/input_datetime/strings.json new file mode 100644 index 000000000000..8d51025070e3 --- /dev/null +++ b/homeassistant/components/input_datetime/strings.json @@ -0,0 +1 @@ +{ "title": "Input datetime" } diff --git a/homeassistant/components/input_number/strings.json b/homeassistant/components/input_number/strings.json new file mode 100644 index 000000000000..35bbbebbdd77 --- /dev/null +++ b/homeassistant/components/input_number/strings.json @@ -0,0 +1 @@ +{ "title": "Input number" } diff --git a/homeassistant/components/input_select/strings.json b/homeassistant/components/input_select/strings.json new file mode 100644 index 000000000000..c3cd5c0c71c8 --- /dev/null +++ b/homeassistant/components/input_select/strings.json @@ -0,0 +1 @@ +{ "title": "Input select" } diff --git a/homeassistant/components/input_text/strings.json b/homeassistant/components/input_text/strings.json new file mode 100644 index 000000000000..dac5995acade --- /dev/null +++ b/homeassistant/components/input_text/strings.json @@ -0,0 +1 @@ +{ "title": "Input text" } diff --git a/homeassistant/components/light/strings.json b/homeassistant/components/light/strings.json index fc089e64b36f..81a4aaeb690f 100644 --- a/homeassistant/components/light/strings.json +++ b/homeassistant/components/light/strings.json @@ -1,4 +1,5 @@ { + "title": "Light", "device_automation": { "action_type": { "brightness_decrease": "Decrease {entity_name} brightness", diff --git a/homeassistant/components/lock/strings.json b/homeassistant/components/lock/strings.json index 1645b78295df..f7296c9a4dbe 100644 --- a/homeassistant/components/lock/strings.json +++ b/homeassistant/components/lock/strings.json @@ -1,4 +1,5 @@ { + "title": "Lock", "device_automation": { "action_type": { "lock": "Lock {entity_name}", diff --git a/homeassistant/components/mailbox/strings.json b/homeassistant/components/mailbox/strings.json new file mode 100644 index 000000000000..84acd4400445 --- /dev/null +++ b/homeassistant/components/mailbox/strings.json @@ -0,0 +1 @@ +{ "title": "Mailbox" } diff --git a/homeassistant/components/media_player/strings.json b/homeassistant/components/media_player/strings.json index e9cb812767b2..51be96633bc1 100644 --- a/homeassistant/components/media_player/strings.json +++ b/homeassistant/components/media_player/strings.json @@ -1,4 +1,5 @@ { + "title": "Media player", "device_automation": { "condition_type": { "is_on": "{entity_name} is on", diff --git a/homeassistant/components/notify/strings.json b/homeassistant/components/notify/strings.json new file mode 100644 index 000000000000..b9f694e470e2 --- /dev/null +++ b/homeassistant/components/notify/strings.json @@ -0,0 +1 @@ +{ "title": "Notify" } diff --git a/homeassistant/components/person/strings.json b/homeassistant/components/person/strings.json new file mode 100644 index 000000000000..f7a77f0d815c --- /dev/null +++ b/homeassistant/components/person/strings.json @@ -0,0 +1 @@ +{ "title": "Person" } diff --git a/homeassistant/components/plant/strings.json b/homeassistant/components/plant/strings.json new file mode 100644 index 000000000000..d34066b40922 --- /dev/null +++ b/homeassistant/components/plant/strings.json @@ -0,0 +1 @@ +{ "title": "Plant" } diff --git a/homeassistant/components/proximity/strings.json b/homeassistant/components/proximity/strings.json new file mode 100644 index 000000000000..bc338149d3db --- /dev/null +++ b/homeassistant/components/proximity/strings.json @@ -0,0 +1 @@ +{ "title": "Proximity" } diff --git a/homeassistant/components/remote/strings.json b/homeassistant/components/remote/strings.json new file mode 100644 index 000000000000..c8945c8e49af --- /dev/null +++ b/homeassistant/components/remote/strings.json @@ -0,0 +1 @@ +{ "title": "Remote" } diff --git a/homeassistant/components/scene/strings.json b/homeassistant/components/scene/strings.json new file mode 100644 index 000000000000..c92838ea322f --- /dev/null +++ b/homeassistant/components/scene/strings.json @@ -0,0 +1 @@ +{ "title": "Scene" } diff --git a/homeassistant/components/script/strings.json b/homeassistant/components/script/strings.json new file mode 100644 index 000000000000..b261c40510da --- /dev/null +++ b/homeassistant/components/script/strings.json @@ -0,0 +1 @@ +{ "title": "Script" } diff --git a/homeassistant/components/sensor/strings.json b/homeassistant/components/sensor/strings.json index a05f57f4584b..15d52149e182 100644 --- a/homeassistant/components/sensor/strings.json +++ b/homeassistant/components/sensor/strings.json @@ -1,4 +1,5 @@ { + "title": "Sensor", "device_automation": { "condition_type": { "is_battery_level": "Current {entity_name} battery level", diff --git a/homeassistant/components/sun/strings.json b/homeassistant/components/sun/strings.json new file mode 100644 index 000000000000..5083d17aca75 --- /dev/null +++ b/homeassistant/components/sun/strings.json @@ -0,0 +1 @@ +{ "title": "Sun" } diff --git a/homeassistant/components/switch/strings.json b/homeassistant/components/switch/strings.json index 77b842ba0783..1ccf7aac06bb 100644 --- a/homeassistant/components/switch/strings.json +++ b/homeassistant/components/switch/strings.json @@ -1,4 +1,5 @@ { + "title": "Switch", "device_automation": { "action_type": { "toggle": "Toggle {entity_name}", diff --git a/homeassistant/components/system_health/strings.json b/homeassistant/components/system_health/strings.json new file mode 100644 index 000000000000..c1fb1480047b --- /dev/null +++ b/homeassistant/components/system_health/strings.json @@ -0,0 +1 @@ +{ "title": "System Health" } diff --git a/homeassistant/components/updater/strings.json b/homeassistant/components/updater/strings.json new file mode 100644 index 000000000000..d4fe2079d8fd --- /dev/null +++ b/homeassistant/components/updater/strings.json @@ -0,0 +1 @@ +{ "title": "Updater" } diff --git a/homeassistant/components/vacuum/strings.json b/homeassistant/components/vacuum/strings.json index 4eee3f359b5d..aa02e3046e14 100644 --- a/homeassistant/components/vacuum/strings.json +++ b/homeassistant/components/vacuum/strings.json @@ -1,4 +1,5 @@ { + "title": "Vacuum", "device_automation": { "condition_type": { "is_docked": "{entity_name} is docked", diff --git a/script/translations/const.py b/script/translations/const.py index f70cc72811e7..3d9126610a39 100644 --- a/script/translations/const.py +++ b/script/translations/const.py @@ -1,6 +1,7 @@ """Translation constants.""" import pathlib -PROJECT_ID = "130246255a974bd3b5e8a1.51616605" +CORE_PROJECT_ID = "130246255a974bd3b5e8a1.51616605" +FRONTEND_PROJECT_ID = "3420425759f6d6d241f598.13594006" DOCKER_IMAGE = "b8329d20280263cad04f65b843e54b9e8e6909a348a678eac959550b5ef5c75f" INTEGRATIONS_DIR = pathlib.Path("homeassistant/components") diff --git a/script/translations/download.py b/script/translations/download.py index e6e4415f16d1..f2f95963cb7b 100755 --- a/script/translations/download.py +++ b/script/translations/download.py @@ -8,7 +8,7 @@ import re import subprocess from typing import Dict, List, Union -from .const import DOCKER_IMAGE, PROJECT_ID +from .const import CORE_PROJECT_ID, DOCKER_IMAGE from .error import ExitApp from .util import get_lokalise_token @@ -32,7 +32,7 @@ def run_download_docker(): "--token", get_lokalise_token(), "export", - PROJECT_ID, + CORE_PROJECT_ID, "--export_empty", "skip", "--type", diff --git a/script/translations/lokalise.py b/script/translations/lokalise.py index bcb9ecac32d1..02ac81cafd2e 100644 --- a/script/translations/lokalise.py +++ b/script/translations/lokalise.py @@ -1,22 +1,25 @@ """API for Lokalise.""" +from pprint import pprint + import requests -from .const import PROJECT_ID +from .const import CORE_PROJECT_ID from .util import get_lokalise_token -def get_api() -> "Lokalise": +def get_api(project_id=CORE_PROJECT_ID, debug=False) -> "Lokalise": """Get Lokalise API.""" - return Lokalise(PROJECT_ID, get_lokalise_token()) + return Lokalise(project_id, get_lokalise_token(), debug) class Lokalise: """Lokalise API.""" - def __init__(self, project_id, token): + def __init__(self, project_id, token, debug): """Initialize Lokalise API.""" self.project_id = project_id self.token = token + self.debug = debug def request(self, method, path, data): """Make a request to the Lokalise API.""" @@ -27,12 +30,20 @@ class Lokalise: else: kwargs["json"] = data + if self.debug: + print(method, f"{self.project_id}/{path}", data) + req = requests.request( method, f"https://api.lokalise.com/api2/projects/{self.project_id}/{path}", **kwargs, ) req.raise_for_status() + + if self.debug: + pprint(req.json()) + print() + return req.json() def keys_list(self, params={}): @@ -42,6 +53,13 @@ class Lokalise: """ return self.request("GET", "keys", params)["keys"] + def keys_create(self, keys): + """Create keys. + + https://app.lokalise.com/api2docs/curl/#transition-create-keys-post + """ + return self.request("POST", "keys", {"keys": keys})["keys"] + def keys_delete_multiple(self, key_ids): """Delete multiple keys. @@ -54,4 +72,18 @@ class Lokalise: https://app.lokalise.com/api2docs/curl/#transition-bulk-update-put """ - return self.request("PUT", "keys", {"keys": updates}) + return self.request("PUT", "keys", {"keys": updates})["keys"] + + def translations_list(self, params={}): + """List translations. + + https://app.lokalise.com/api2docs/curl/#transition-list-all-translations-get + """ + return self.request("GET", "translations", params)["translations"] + + def languages_list(self, params={}): + """List languages. + + https://app.lokalise.com/api2docs/curl/#transition-list-project-languages-get + """ + return self.request("GET", "languages", params)["languages"] diff --git a/script/translations/migrate.py b/script/translations/migrate.py index 7026aef2840c..a292c3b443bd 100644 --- a/script/translations/migrate.py +++ b/script/translations/migrate.py @@ -2,31 +2,20 @@ import json from pprint import pprint -from .const import INTEGRATIONS_DIR +from .const import CORE_PROJECT_ID, FRONTEND_PROJECT_ID, INTEGRATIONS_DIR from .lokalise import get_api -MIGRATED = {} + +def create_lookup(results): + """Create a lookup table by key name.""" + return {key["key_name"]["web"]: key for key in results} -def run(): - """Migrate translations.""" - to_migrate = {} - - for integration in INTEGRATIONS_DIR.iterdir(): - strings_file = integration / "strings.json" - if not strings_file.is_file(): - continue - - if integration.name in MIGRATED: - continue - - strings = json.loads(strings_file.read_text()) - - if "title" in strings: - from_key = f"component::{integration.name}::config::title" - to_key = f"component::{integration.name}::title" - to_migrate[from_key] = to_key +def rename_keys(to_migrate): + """Rename keys. + to_migrate is Dict[from_key] = to_key. + """ updates = [] lokalise = get_api() @@ -49,4 +38,116 @@ def run(): print("Updating keys") pprint(lokalise.keys_bulk_update(updates).json()) + +def migrate_project_keys_translations(from_project_id, to_project_id, to_migrate): + """Migrate keys and translations from one project to another. + + to_migrate is Dict[from_key] = to_key. + """ + from_lokalise = get_api(from_project_id) + to_lokalise = get_api(to_project_id, True) + + from_key_data = from_lokalise.keys_list( + {"filter_keys": ",".join(to_migrate), "include_translations": 1} + ) + if len(from_key_data) != len(to_migrate): + print( + f"Lookin up keys in Lokalise returns {len(from_key_data)} results, expected {len(to_migrate)}" + ) + return + + from_key_lookup = create_lookup(from_key_data) + + # Fetch keys in target + # We are going to skip migrating existing keys + to_key_data = to_lokalise.keys_list( + {"filter_keys": ",".join(to_migrate.values()), "include_translations": 1} + ) + existing = set(create_lookup(to_key_data)) + + missing = [key for key in to_migrate.values() if key not in existing] + + if not missing: + print("All keys to migrate exist already, nothing to do") + return + + print("Creating", ", ".join(missing)) + to_key_lookup = create_lookup( + to_lokalise.keys_create( + [{"key_name": key, "platforms": ["web"]} for key in missing] + ) + ) + + updates = [] + + for from_key, to_key in to_migrate.items(): + # If it is not in lookup, it already existed, skipping it. + if to_key not in to_key_lookup: + continue + + updates.append( + { + "key_id": to_key_lookup[to_key]["key_id"], + "translations": [ + { + "language_iso": from_translation["language_iso"], + "translation": from_translation["translation"], + "is_reviewed": from_translation["is_reviewed"], + "is_fuzzy": from_translation["is_fuzzy"], + } + for from_translation in from_key_lookup[from_key]["translations"] + ], + } + ) + + print("Updating") + pprint(updates) + print() + print() + pprint(to_lokalise.keys_bulk_update(updates)) + + +def find_and_rename_keys(): + """Find and rename keys in core.""" + to_migrate = {} + + for integration in INTEGRATIONS_DIR.iterdir(): + strings_file = integration / "strings.json" + if not strings_file.is_file(): + continue + + strings = json.loads(strings_file.read_text()) + + if "title" in strings.get("config", {}): + from_key = f"component::{integration.name}::config::title" + to_key = f"component::{integration.name}::title" + to_migrate[from_key] = to_key + + rename_keys(to_migrate) + + +def find_different_languages(): + """Find different supported languages.""" + core_api = get_api(CORE_PROJECT_ID) + frontend_api = get_api(FRONTEND_PROJECT_ID) + + core_languages = {lang["lang_iso"] for lang in core_api.languages_list()} + frontend_languages = {lang["lang_iso"] for lang in frontend_api.languages_list()} + + print("Core minus frontend", core_languages - frontend_languages) + print("Frontend minus core", frontend_languages - core_languages) + + +def run(): + """Migrate translations.""" + # find_different_languages() + migrate_project_keys_translations( + FRONTEND_PROJECT_ID, + CORE_PROJECT_ID, + { + "domain::binary_sensor": "component::binary_sensor::title", + "domain::sensor": "component::sensor::title", + }, + ) + return 0 diff --git a/script/translations/upload.py b/script/translations/upload.py index ecd9ec405df1..b22737519b4d 100755 --- a/script/translations/upload.py +++ b/script/translations/upload.py @@ -6,7 +6,7 @@ import pathlib import re import subprocess -from .const import DOCKER_IMAGE, INTEGRATIONS_DIR, PROJECT_ID +from .const import CORE_PROJECT_ID, DOCKER_IMAGE, INTEGRATIONS_DIR from .error import ExitApp from .util import get_current_branch, get_lokalise_token @@ -32,7 +32,7 @@ def run_upload_docker(): "--token", get_lokalise_token(), "import", - PROJECT_ID, + CORE_PROJECT_ID, "--file", CONTAINER_FILE, "--lang_iso", From 55dfca7467044107d6e3a654a82b8e4dd04e5afe Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 12:52:53 -0700 Subject: [PATCH 448/653] Drop title from translations if brand name (#34306) --- homeassistant/components/abode/strings.json | 6 +--- homeassistant/components/adguard/strings.json | 5 +-- homeassistant/components/airly/strings.json | 1 - .../components/airvisual/strings.json | 9 ++--- homeassistant/components/almond/strings.json | 5 +-- .../components/ambiclimate/strings.json | 1 - .../components/ambient_station/strings.json | 10 ++---- .../components/arcam_fmj/strings.json | 3 -- homeassistant/components/august/strings.json | 9 ++--- .../components/braviatv/strings.json | 17 +++------- homeassistant/components/brother/strings.json | 5 +-- homeassistant/components/cast/strings.json | 1 - .../components/coolmaster/strings.json | 1 - .../components/coronavirus/strings.json | 9 ++--- homeassistant/components/daikin/strings.json | 5 +-- homeassistant/components/deconz/strings.json | 10 ++---- .../components/dialogflow/strings.json | 1 - homeassistant/components/directv/strings.json | 9 ++--- .../components/doorbird/strings.json | 5 +-- homeassistant/components/ecobee/strings.json | 1 - homeassistant/components/elgato/strings.json | 6 +--- homeassistant/components/elkm1/strings.json | 1 - .../components/emulated_roku/strings.json | 6 ++-- homeassistant/components/esphome/strings.json | 14 ++------ homeassistant/components/flume/manifest.json | 11 ++----- homeassistant/components/flume/strings.json | 5 +-- .../components/flunearyou/strings.json | 10 ++---- homeassistant/components/freebox/strings.json | 10 ++---- .../components/garmin_connect/strings.json | 10 ++---- homeassistant/components/gdacs/strings.json | 9 ++--- .../components/geofency/strings.json | 1 - .../components/geonetnz_quakes/strings.json | 10 ++---- .../components/geonetnz_volcano/strings.json | 9 ++--- homeassistant/components/gios/strings.json | 9 +++-- homeassistant/components/glances/strings.json | 9 ++--- .../components/gpslogger/strings.json | 1 - homeassistant/components/griddy/strings.json | 11 ++----- .../components/hangouts/strings.json | 5 +-- homeassistant/components/harmony/strings.json | 10 ++---- homeassistant/components/heos/strings.json | 6 +--- .../components/hisense_aehw4a1/strings.json | 1 - .../components/homematicip_cloud/strings.json | 1 - .../components/huawei_lte/strings.json | 1 - .../components/iaqualink/strings.json | 1 - homeassistant/components/icloud/strings.json | 9 ++--- homeassistant/components/ifttt/strings.json | 1 - homeassistant/components/ios/manifest.json | 2 +- homeassistant/components/ios/strings.json | 1 - homeassistant/components/ipma/strings.json | 7 ++-- homeassistant/components/ipp/strings.json | 1 - homeassistant/components/iqvia/strings.json | 5 +-- homeassistant/components/izone/strings.json | 1 - .../components/konnected/manifest.json | 2 +- .../components/konnected/strings.json | 9 ++--- homeassistant/components/life360/strings.json | 6 +--- homeassistant/components/lifx/strings.json | 1 - homeassistant/components/linky/strings.json | 10 ++---- .../components/locative/strings.json | 1 - .../components/logi_circle/strings.json | 5 +-- .../components/luftdaten/strings.json | 1 - .../components/lutron_caseta/manifest.json | 2 +- .../components/lutron_caseta/strings.json | 3 -- homeassistant/components/mailgun/strings.json | 1 - .../components/melcloud/strings.json | 1 - homeassistant/components/met/strings.json | 5 +-- .../components/meteo_france/strings.json | 7 ++-- .../components/mikrotik/strings.json | 5 +-- .../components/minecraft_server/strings.json | 10 ++---- .../components/mobile_app/manifest.json | 2 +- .../components/mobile_app/strings.json | 1 - .../components/monoprice/strings.json | 5 +-- homeassistant/components/mqtt/strings.json | 9 ++--- homeassistant/components/myq/strings.json | 10 ++---- homeassistant/components/neato/strings.json | 5 +-- homeassistant/components/nest/strings.json | 9 ++--- homeassistant/components/netatmo/strings.json | 9 ++--- homeassistant/components/nexia/strings.json | 10 ++---- homeassistant/components/notify/strings.json | 2 +- homeassistant/components/notion/strings.json | 10 ++---- homeassistant/components/nuheat/strings.json | 7 ++-- homeassistant/components/nut/strings.json | 14 ++------ homeassistant/components/nws/strings.json | 17 ++++------ .../components/opentherm_gw/strings.json | 7 +--- homeassistant/components/openuv/manifest.json | 2 +- homeassistant/components/openuv/strings.json | 1 - .../components/owntracks/strings.json | 5 +-- homeassistant/components/plaato/strings.json | 1 - homeassistant/components/plant/strings.json | 2 +- homeassistant/components/plex/strings.json | 5 +-- homeassistant/components/point/strings.json | 5 +-- .../components/powerwall/strings.json | 9 ++--- .../components/proximity/strings.json | 4 ++- homeassistant/components/ps4/strings.json | 1 - .../pvpc_hourly_pricing/strings.json | 1 - homeassistant/components/rachio/strings.json | 9 ++--- .../components/rainmachine/strings.json | 1 - homeassistant/components/ring/strings.json | 14 ++------ homeassistant/components/roku/strings.json | 9 ++--- homeassistant/components/roomba/strings.json | 8 +---- .../components/samsungtv/strings.json | 6 +--- homeassistant/components/sense/strings.json | 10 ++---- homeassistant/components/sentry/strings.json | 15 ++------- .../components/simplisafe/strings.json | 10 ++---- .../components/smartthings/manifest.json | 2 +- .../components/smartthings/strings.json | 13 ++------ homeassistant/components/smhi/strings.json | 1 - .../components/solaredge/strings.json | 9 ++--- .../components/solarlog/strings.json | 5 +-- homeassistant/components/soma/strings.json | 10 ++---- homeassistant/components/somfy/manifest.json | 2 +- homeassistant/components/somfy/strings.json | 9 ++--- homeassistant/components/sonos/strings.json | 1 - homeassistant/components/spotify/strings.json | 9 ++--- .../components/starline/strings.json | 19 +++-------- .../components/synology_dsm/strings.json | 5 +-- homeassistant/components/tado/strings.json | 14 ++------ .../components/tellduslive/strings.json | 12 ++----- homeassistant/components/tesla/strings.json | 6 +--- homeassistant/components/toon/strings.json | 5 +-- .../components/totalconnect/strings.json | 14 ++------ homeassistant/components/tplink/strings.json | 1 - homeassistant/components/traccar/strings.json | 1 - .../components/tradfri/manifest.json | 2 +- homeassistant/components/tradfri/strings.json | 6 +--- .../components/transmission/strings.json | 9 ++--- .../components/twentemilieu/strings.json | 5 +-- homeassistant/components/twilio/strings.json | 1 - homeassistant/components/unifi/strings.json | 5 +-- homeassistant/components/upnp/strings.json | 5 +-- homeassistant/components/velbus/strings.json | 5 +-- homeassistant/components/vera/strings.json | 1 - homeassistant/components/vesync/strings.json | 14 ++------ homeassistant/components/vilfo/strings.json | 1 - homeassistant/components/vizio/strings.json | 5 +-- homeassistant/components/wemo/strings.json | 1 - .../components/withings/strings.json | 9 ++--- homeassistant/components/wled/strings.json | 9 ++--- homeassistant/components/wwlln/strings.json | 5 +-- homeassistant/components/zha/strings.json | 15 ++------- homeassistant/components/zwave/strings.json | 1 - script/translations/migrate.py | 33 ++++++++++++++----- 141 files changed, 205 insertions(+), 666 deletions(-) delete mode 100644 homeassistant/components/arcam_fmj/strings.json delete mode 100644 homeassistant/components/lutron_caseta/strings.json diff --git a/homeassistant/components/abode/strings.json b/homeassistant/components/abode/strings.json index 162d6400fb21..f6e7039a9089 100644 --- a/homeassistant/components/abode/strings.json +++ b/homeassistant/components/abode/strings.json @@ -1,13 +1,9 @@ { - "title": "Abode", "config": { "step": { "user": { "title": "Fill in your Abode login information", - "data": { - "username": "Email Address", - "password": "Password" - } + "data": { "username": "Email Address", "password": "Password" } } }, "error": { diff --git a/homeassistant/components/adguard/strings.json b/homeassistant/components/adguard/strings.json index c0c0c22f560a..bf079e4c593e 100644 --- a/homeassistant/components/adguard/strings.json +++ b/homeassistant/components/adguard/strings.json @@ -1,5 +1,4 @@ { - "title": "AdGuard Home", "config": { "step": { "user": { @@ -19,9 +18,7 @@ "description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the Hass.io add-on: {addon}?" } }, - "error": { - "connection_error": "Failed to connect." - }, + "error": { "connection_error": "Failed to connect." }, "abort": { "adguard_home_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}.", "adguard_home_addon_outdated": "This integration requires AdGuard Home {minimal_version} or higher, you have {current_version}. Please update your Hass.io AdGuard Home add-on.", diff --git a/homeassistant/components/airly/strings.json b/homeassistant/components/airly/strings.json index 8e35b091b331..794f70901f39 100644 --- a/homeassistant/components/airly/strings.json +++ b/homeassistant/components/airly/strings.json @@ -1,5 +1,4 @@ { - "title": "Airly", "config": { "step": { "user": { diff --git a/homeassistant/components/airvisual/strings.json b/homeassistant/components/airvisual/strings.json index 86c6a2d2c6e4..cd81d1862dda 100644 --- a/homeassistant/components/airvisual/strings.json +++ b/homeassistant/components/airvisual/strings.json @@ -1,5 +1,4 @@ { - "title": "AirVisual", "config": { "step": { "user": { @@ -12,9 +11,7 @@ } } }, - "error": { - "invalid_api_key": "Invalid API key" - }, + "error": { "invalid_api_key": "Invalid API key" }, "abort": { "already_configured": "These coordinates have already been registered." } @@ -24,9 +21,7 @@ "init": { "title": "Configure AirVisual", "description": "Set various options for the AirVisual integration.", - "data": { - "show_on_map": "Show monitored geography on the map" - } + "data": { "show_on_map": "Show monitored geography on the map" } } } } diff --git a/homeassistant/components/almond/strings.json b/homeassistant/components/almond/strings.json index dd31116212c1..008d21c463b0 100644 --- a/homeassistant/components/almond/strings.json +++ b/homeassistant/components/almond/strings.json @@ -1,10 +1,7 @@ { - "title": "Almond", "config": { "step": { - "pick_implementation": { - "title": "Pick Authentication Method" - }, + "pick_implementation": { "title": "Pick Authentication Method" }, "hassio_confirm": { "title": "Almond via Hass.io add-on", "description": "Do you want to configure Home Assistant to connect to Almond provided by the Hass.io add-on: {addon}?" diff --git a/homeassistant/components/ambiclimate/strings.json b/homeassistant/components/ambiclimate/strings.json index 02ccf930c0cf..50bc8284b717 100644 --- a/homeassistant/components/ambiclimate/strings.json +++ b/homeassistant/components/ambiclimate/strings.json @@ -1,5 +1,4 @@ { - "title": "Ambiclimate", "config": { "step": { "auth": { diff --git a/homeassistant/components/ambient_station/strings.json b/homeassistant/components/ambient_station/strings.json index 763c22499aab..0e49301198c2 100644 --- a/homeassistant/components/ambient_station/strings.json +++ b/homeassistant/components/ambient_station/strings.json @@ -1,21 +1,15 @@ { - "title": "Ambient PWS", "config": { "step": { "user": { "title": "Fill in your information", - "data": { - "api_key": "API Key", - "app_key": "Application Key" - } + "data": { "api_key": "API Key", "app_key": "Application Key" } } }, "error": { "invalid_key": "Invalid API Key and/or Application Key", "no_devices": "No devices found in account" }, - "abort": { - "already_configured": "This app key is already in use." - } + "abort": { "already_configured": "This app key is already in use." } } } diff --git a/homeassistant/components/arcam_fmj/strings.json b/homeassistant/components/arcam_fmj/strings.json deleted file mode 100644 index 57eedd7885c4..000000000000 --- a/homeassistant/components/arcam_fmj/strings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "title": "Arcam FMJ" -} diff --git a/homeassistant/components/august/strings.json b/homeassistant/components/august/strings.json index 07c77b806f6a..bffca81ab337 100644 --- a/homeassistant/components/august/strings.json +++ b/homeassistant/components/august/strings.json @@ -1,20 +1,15 @@ { - "title": "August", "config": { "error": { "unknown": "Unexpected error", "cannot_connect": "Failed to connect, please try again", "invalid_auth": "Invalid authentication" }, - "abort": { - "already_configured": "Account is already configured" - }, + "abort": { "already_configured": "Account is already configured" }, "step": { "validation": { "title": "Two factor authentication", - "data": { - "code": "Verification code" - }, + "data": { "code": "Verification code" }, "description": "Please check your {login_method} ({username}) and enter the verification code below" }, "user": { diff --git a/homeassistant/components/braviatv/strings.json b/homeassistant/components/braviatv/strings.json index d20619c3df6f..1e434cd118a8 100644 --- a/homeassistant/components/braviatv/strings.json +++ b/homeassistant/components/braviatv/strings.json @@ -1,20 +1,15 @@ { - "title": "Sony Bravia TV", "config": { "step": { "user": { "title": "Sony Bravia TV", "description": "Set up Sony Bravia TV integration. If you have problems with configuration go to: https://www.home-assistant.io/integrations/braviatv \n\nEnsure that your TV is turned on.", - "data": { - "host": "TV hostname or IP address" - } + "data": { "host": "TV hostname or IP address" } }, "authorize": { "title": "Authorize Sony Bravia TV", "description": "Enter the PIN code shown on the Sony Bravia TV. \n\nIf the PIN code is not shown, you have to unregister Home Assistant on your TV, go to: Settings -> Network -> Remote device settings -> Unregister remote device.", - "data": { - "pin": "PIN code" - } + "data": { "pin": "PIN code" } } }, "error": { @@ -22,17 +17,13 @@ "cannot_connect": "Failed to connect, invalid host or PIN code.", "unsupported_model": "Your TV model is not supported." }, - "abort": { - "already_configured": "This TV is already configured." - } + "abort": { "already_configured": "This TV is already configured." } }, "options": { "step": { "user": { "title": "Options for Sony Bravia TV", - "data": { - "ignored_sources": "List of ignored sources" - } + "data": { "ignored_sources": "List of ignored sources" } } } } diff --git a/homeassistant/components/brother/strings.json b/homeassistant/components/brother/strings.json index 22df2e88d779..12b309b740ed 100644 --- a/homeassistant/components/brother/strings.json +++ b/homeassistant/components/brother/strings.json @@ -1,5 +1,4 @@ { - "title": "Brother Printer", "config": { "flow_title": "Brother Printer: {model} {serial_number}", "step": { @@ -14,9 +13,7 @@ "zeroconf_confirm": { "description": "Do you want to add the Brother Printer {model} with serial number `{serial_number}` to Home Assistant?", "title": "Discovered Brother Printer", - "data": { - "type": "Type of the printer" - } + "data": { "type": "Type of the printer" } } }, "error": { diff --git a/homeassistant/components/cast/strings.json b/homeassistant/components/cast/strings.json index 06bbf1b764c6..c7de86ba63c3 100644 --- a/homeassistant/components/cast/strings.json +++ b/homeassistant/components/cast/strings.json @@ -1,5 +1,4 @@ { - "title": "Google Cast", "config": { "step": { "confirm": { diff --git a/homeassistant/components/coolmaster/strings.json b/homeassistant/components/coolmaster/strings.json index c16aa9d52ad7..3bb5d3ad4e17 100644 --- a/homeassistant/components/coolmaster/strings.json +++ b/homeassistant/components/coolmaster/strings.json @@ -1,5 +1,4 @@ { - "title": "CoolMasterNet", "config": { "step": { "user": { diff --git a/homeassistant/components/coronavirus/strings.json b/homeassistant/components/coronavirus/strings.json index 9b21c015f582..949034e6bc7f 100644 --- a/homeassistant/components/coronavirus/strings.json +++ b/homeassistant/components/coronavirus/strings.json @@ -1,16 +1,11 @@ { - "title": "Coronavirus", "config": { "step": { "user": { "title": "Pick a country to monitor", - "data": { - "country": "Country" - } + "data": { "country": "Country" } } }, - "abort": { - "already_configured": "This country is already configured." - } + "abort": { "already_configured": "This country is already configured." } } } diff --git a/homeassistant/components/daikin/strings.json b/homeassistant/components/daikin/strings.json index e165b66f0026..1e82d285eee0 100644 --- a/homeassistant/components/daikin/strings.json +++ b/homeassistant/components/daikin/strings.json @@ -1,13 +1,10 @@ { - "title": "Daikin AC", "config": { "step": { "user": { "title": "Configure Daikin AC", "description": "Enter IP address of your Daikin AC.", - "data": { - "host": "Host" - } + "data": { "host": "Host" } } }, "abort": { diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index ab2d21195fbb..baa749166de4 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -1,14 +1,10 @@ { - "title": "deCONZ Zigbee gateway", "config": { "flow_title": "deCONZ Zigbee gateway ({host})", "step": { "init": { "title": "Define deCONZ gateway", - "data": { - "host": "Host", - "port": "Port" - } + "data": { "host": "Host", "port": "Port" } }, "link": { "title": "Link with deCONZ", @@ -19,9 +15,7 @@ "description": "Do you want to configure Home Assistant to connect to the deCONZ gateway provided by the Hass.io add-on {addon}?" } }, - "error": { - "no_key": "Couldn't get an API key" - }, + "error": { "no_key": "Couldn't get an API key" }, "abort": { "already_configured": "Bridge is already configured", "already_in_progress": "Config flow for bridge is already in progress.", diff --git a/homeassistant/components/dialogflow/strings.json b/homeassistant/components/dialogflow/strings.json index 1a477ca4d57c..d1a691dc92bf 100644 --- a/homeassistant/components/dialogflow/strings.json +++ b/homeassistant/components/dialogflow/strings.json @@ -1,5 +1,4 @@ { - "title": "Dialogflow", "config": { "step": { "user": { diff --git a/homeassistant/components/directv/strings.json b/homeassistant/components/directv/strings.json index 254229d091fc..606a2f0f0c9d 100644 --- a/homeassistant/components/directv/strings.json +++ b/homeassistant/components/directv/strings.json @@ -1,5 +1,4 @@ { - "title": "DirecTV", "config": { "flow_title": "DirecTV: {name}", "step": { @@ -10,14 +9,10 @@ }, "user": { "title": "Connect to the DirecTV receiver", - "data": { - "host": "Host or IP address" - } + "data": { "host": "Host or IP address" } } }, - "error": { - "cannot_connect": "Failed to connect, please try again" - }, + "error": { "cannot_connect": "Failed to connect, please try again" }, "abort": { "already_configured": "DirecTV receiver is already configured", "unknown": "Unexpected error" diff --git a/homeassistant/components/doorbird/strings.json b/homeassistant/components/doorbird/strings.json index 9b56bc9f39da..e27083d2e093 100644 --- a/homeassistant/components/doorbird/strings.json +++ b/homeassistant/components/doorbird/strings.json @@ -1,11 +1,8 @@ { - "title": "DoorBird", "options": { "step": { "init": { - "data": { - "events": "Comma separated list of events." - }, + "data": { "events": "Comma separated list of events." }, "description": "Add an comma separated event name for each event you wish to track. After entering them here, use the DoorBird app to assign them to a specific event. See the documentation at https://www.home-assistant.io/integrations/doorbird/#events. Example: somebody_pressed_the_button, motion" } } diff --git a/homeassistant/components/ecobee/strings.json b/homeassistant/components/ecobee/strings.json index 535c5add3f39..6e3a5687db11 100644 --- a/homeassistant/components/ecobee/strings.json +++ b/homeassistant/components/ecobee/strings.json @@ -1,5 +1,4 @@ { - "title": "ecobee", "config": { "step": { "user": { diff --git a/homeassistant/components/elgato/strings.json b/homeassistant/components/elgato/strings.json index 037084385401..bae8b6ff0642 100644 --- a/homeassistant/components/elgato/strings.json +++ b/homeassistant/components/elgato/strings.json @@ -1,15 +1,11 @@ { - "title": "Elgato Key Light", "config": { "flow_title": "Elgato Key Light: {serial_number}", "step": { "user": { "title": "Link your Elgato Key Light", "description": "Set up your Elgato Key Light to integrate with Home Assistant.", - "data": { - "host": "Host or IP address", - "port": "Port number" - } + "data": { "host": "Host or IP address", "port": "Port number" } }, "zeroconf_confirm": { "description": "Do you want to add the Elgato Key Light with serial number `{serial_number}` to Home Assistant?", diff --git a/homeassistant/components/elkm1/strings.json b/homeassistant/components/elkm1/strings.json index 85d12844593d..be7d0aa1d740 100644 --- a/homeassistant/components/elkm1/strings.json +++ b/homeassistant/components/elkm1/strings.json @@ -1,5 +1,4 @@ { - "title": "Elk-M1 Control", "config": { "step": { "user": { diff --git a/homeassistant/components/emulated_roku/strings.json b/homeassistant/components/emulated_roku/strings.json index 960e2f22af31..a47c1c4799b7 100644 --- a/homeassistant/components/emulated_roku/strings.json +++ b/homeassistant/components/emulated_roku/strings.json @@ -1,9 +1,7 @@ { - "title": "EmulatedRoku", + "title": "Emulated Roku", "config": { - "abort": { - "name_exists": "Name already exists" - }, + "abort": { "name_exists": "Name already exists" }, "step": { "user": { "data": { diff --git a/homeassistant/components/esphome/strings.json b/homeassistant/components/esphome/strings.json index 0c1c50e493da..48b72d0de0bf 100644 --- a/homeassistant/components/esphome/strings.json +++ b/homeassistant/components/esphome/strings.json @@ -1,9 +1,6 @@ { - "title": "ESPHome", "config": { - "abort": { - "already_configured": "ESP is already configured" - }, + "abort": { "already_configured": "ESP is already configured" }, "error": { "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", "connection_error": "Can't connect to ESP. Please make sure your YAML file contains an 'api:' line.", @@ -11,17 +8,12 @@ }, "step": { "user": { - "data": { - "host": "Host", - "port": "Port" - }, + "data": { "host": "Host", "port": "Port" }, "description": "Please enter connection settings of your [ESPHome](https://esphomelib.com/) node.", "title": "ESPHome" }, "authenticate": { - "data": { - "password": "Password" - }, + "data": { "password": "Password" }, "description": "Please enter the password you set in your configuration for {name}.", "title": "Enter Password" }, diff --git a/homeassistant/components/flume/manifest.json b/homeassistant/components/flume/manifest.json index b0bf08cd8fad..f801eedf73b5 100644 --- a/homeassistant/components/flume/manifest.json +++ b/homeassistant/components/flume/manifest.json @@ -1,14 +1,9 @@ { "domain": "flume", - "name": "flume", + "name": "Flume", "documentation": "https://www.home-assistant.io/integrations/flume/", - "requirements": [ - "pyflume==0.4.0" - ], + "requirements": ["pyflume==0.4.0"], "dependencies": [], - "codeowners": [ - "@ChrisMandich", - "@bdraco" - ], + "codeowners": ["@ChrisMandich", "@bdraco"], "config_flow": true } diff --git a/homeassistant/components/flume/strings.json b/homeassistant/components/flume/strings.json index 65ee5b59a41c..50fa03f3e93a 100644 --- a/homeassistant/components/flume/strings.json +++ b/homeassistant/components/flume/strings.json @@ -1,5 +1,4 @@ { - "title": "Flume", "config": { "error": { "unknown": "Unexpected error", @@ -18,8 +17,6 @@ } } }, - "abort": { - "already_configured": "This account is already configured" - } + "abort": { "already_configured": "This account is already configured" } } } diff --git a/homeassistant/components/flunearyou/strings.json b/homeassistant/components/flunearyou/strings.json index 14ebb5ecb955..2a7e59989b0b 100644 --- a/homeassistant/components/flunearyou/strings.json +++ b/homeassistant/components/flunearyou/strings.json @@ -1,19 +1,13 @@ { - "title": "Flu Near You", "config": { "step": { "user": { "title": "Configure Flu Near You", "description": "Monitor user-based and CDC repots for a pair of coordinates.", - "data": { - "latitude": "Latitude", - "longitude": "Longitude" - } + "data": { "latitude": "Latitude", "longitude": "Longitude" } } }, - "error": { - "general_error": "There was an unknown error." - }, + "error": { "general_error": "There was an unknown error." }, "abort": { "already_configured": "These coordinates are already registered." } diff --git a/homeassistant/components/freebox/strings.json b/homeassistant/components/freebox/strings.json index bad618321e4e..72265a54558d 100644 --- a/homeassistant/components/freebox/strings.json +++ b/homeassistant/components/freebox/strings.json @@ -1,13 +1,9 @@ { - "title": "Freebox", "config": { "step": { "user": { "title": "Freebox", - "data": { - "host": "Host", - "port": "Port" - } + "data": { "host": "Host", "port": "Port" } }, "link": { "title": "Link Freebox router", @@ -19,8 +15,6 @@ "connection_failed": "Failed to connect, please try again", "unknown": "Unknown error: please retry later" }, - "abort": { - "already_configured": "Host already configured" - } + "abort": { "already_configured": "Host already configured" } } } diff --git a/homeassistant/components/garmin_connect/strings.json b/homeassistant/components/garmin_connect/strings.json index b0571bb7d80c..1f14d91e04ae 100644 --- a/homeassistant/components/garmin_connect/strings.json +++ b/homeassistant/components/garmin_connect/strings.json @@ -1,9 +1,6 @@ { - "title": "Garmin Connect", "config": { - "abort": { - "already_configured": "This account is already configured." - }, + "abort": { "already_configured": "This account is already configured." }, "error": { "cannot_connect": "Failed to connect, please try again.", "invalid_auth": "Invalid authentication.", @@ -12,10 +9,7 @@ }, "step": { "user": { - "data": { - "password": "Password", - "username": "Username" - }, + "data": { "password": "Password", "username": "Username" }, "description": "Enter your credentials.", "title": "Garmin Connect" } diff --git a/homeassistant/components/gdacs/strings.json b/homeassistant/components/gdacs/strings.json index 809d87e13cc7..496b996823a9 100644 --- a/homeassistant/components/gdacs/strings.json +++ b/homeassistant/components/gdacs/strings.json @@ -1,16 +1,11 @@ { - "title": "Global Disaster Alert and Coordination System (GDACS)", "config": { "step": { "user": { "title": "Fill in your filter details.", - "data": { - "radius": "Radius" - } + "data": { "radius": "Radius" } } }, - "abort": { - "already_configured": "Location is already configured." - } + "abort": { "already_configured": "Location is already configured." } } } diff --git a/homeassistant/components/geofency/strings.json b/homeassistant/components/geofency/strings.json index 784fa3d0056d..1c6a72f27c83 100644 --- a/homeassistant/components/geofency/strings.json +++ b/homeassistant/components/geofency/strings.json @@ -1,5 +1,4 @@ { - "title": "Geofency Webhook", "config": { "step": { "user": { diff --git a/homeassistant/components/geonetnz_quakes/strings.json b/homeassistant/components/geonetnz_quakes/strings.json index 46dd3f25ded9..fe328c05603b 100644 --- a/homeassistant/components/geonetnz_quakes/strings.json +++ b/homeassistant/components/geonetnz_quakes/strings.json @@ -1,17 +1,11 @@ { - "title": "GeoNet NZ Quakes", "config": { "step": { "user": { "title": "Fill in your filter details.", - "data": { - "radius": "Radius", - "mmi": "MMI" - } + "data": { "radius": "Radius", "mmi": "MMI" } } }, - "abort": { - "already_configured": "Location is already configured." - } + "abort": { "already_configured": "Location is already configured." } } } diff --git a/homeassistant/components/geonetnz_volcano/strings.json b/homeassistant/components/geonetnz_volcano/strings.json index 62537be6024a..d364d76b2edc 100644 --- a/homeassistant/components/geonetnz_volcano/strings.json +++ b/homeassistant/components/geonetnz_volcano/strings.json @@ -1,16 +1,11 @@ { - "title": "GeoNet NZ Volcano", "config": { "step": { "user": { "title": "Fill in your filter details.", - "data": { - "radius": "Radius" - } + "data": { "radius": "Radius" } } }, - "error": { - "identifier_exists": "Location already registered" - } + "error": { "identifier_exists": "Location already registered" } } } diff --git a/homeassistant/components/gios/strings.json b/homeassistant/components/gios/strings.json index 124d2b19a4b2..2187bcbc9980 100644 --- a/homeassistant/components/gios/strings.json +++ b/homeassistant/components/gios/strings.json @@ -1,10 +1,9 @@ { - "title": "GIOŚ", "config": { "step": { "user": { - "title": "GIOŚ (Polish Chief Inspectorate Of Environmental Protection)", - "description": "Set up GIOŚ (Polish Chief Inspectorate Of Environmental Protection) air quality integration. If you need help with the configuration have a look here: https://www.home-assistant.io/integrations/gios", + "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)", + "description": "Set up GIO\u015a (Polish Chief Inspectorate Of Environmental Protection) air quality integration. If you need help with the configuration have a look here: https://www.home-assistant.io/integrations/gios", "data": { "name": "Name of the integration", "station_id": "ID of the measuring station" @@ -14,10 +13,10 @@ "error": { "wrong_station_id": "ID of the measuring station is not correct.", "invalid_sensors_data": "Invalid sensors' data for this measuring station.", - "cannot_connect": "Cannot connect to the GIOŚ server." + "cannot_connect": "Cannot connect to the GIO\u015a server." }, "abort": { - "already_configured": "GIOŚ integration for this measuring station is already configured." + "already_configured": "GIO\u015a integration for this measuring station is already configured." } } } diff --git a/homeassistant/components/glances/strings.json b/homeassistant/components/glances/strings.json index 8c1078fb8349..ae8ab0357f31 100644 --- a/homeassistant/components/glances/strings.json +++ b/homeassistant/components/glances/strings.json @@ -1,5 +1,4 @@ { - "title": "Glances", "config": { "step": { "user": { @@ -20,17 +19,13 @@ "cannot_connect": "Unable to connect to host", "wrong_version": "Version not supported (2 or 3 only)" }, - "abort": { - "already_configured": "Host is already configured." - } + "abort": { "already_configured": "Host is already configured." } }, "options": { "step": { "init": { "description": "Configure options for Glances", - "data": { - "scan_interval": "Update frequency" - } + "data": { "scan_interval": "Update frequency" } } } } diff --git a/homeassistant/components/gpslogger/strings.json b/homeassistant/components/gpslogger/strings.json index dfa66b5844f0..f3d4344cd49c 100644 --- a/homeassistant/components/gpslogger/strings.json +++ b/homeassistant/components/gpslogger/strings.json @@ -1,5 +1,4 @@ { - "title": "GPSLogger Webhook", "config": { "step": { "user": { diff --git a/homeassistant/components/griddy/strings.json b/homeassistant/components/griddy/strings.json index c7565881a823..d8ccb94fae72 100644 --- a/homeassistant/components/griddy/strings.json +++ b/homeassistant/components/griddy/strings.json @@ -1,5 +1,4 @@ { - "title": "Griddy", "config": { "error": { "cannot_connect": "Failed to connect, please try again", @@ -7,15 +6,11 @@ }, "step": { "user": { - "description": "Your Load Zone is in your Griddy account under “Account > Meter > Load Zone.”", - "data": { - "loadzone": "Load Zone (Settlement Point)" - }, + "description": "Your Load Zone is in your Griddy account under \u201cAccount > Meter > Load Zone.\u201d", + "data": { "loadzone": "Load Zone (Settlement Point)" }, "title": "Setup your Griddy Load Zone" } }, - "abort": { - "already_configured": "This Load Zone is already configured" - } + "abort": { "already_configured": "This Load Zone is already configured" } } } diff --git a/homeassistant/components/hangouts/strings.json b/homeassistant/components/hangouts/strings.json index 13771825fc00..8d5229c99415 100644 --- a/homeassistant/components/hangouts/strings.json +++ b/homeassistant/components/hangouts/strings.json @@ -1,5 +1,4 @@ { - "title": "Google Hangouts", "config": { "abort": { "already_configured": "Google Hangouts is already configured", @@ -20,9 +19,7 @@ "title": "Google Hangouts Login" }, "2fa": { - "data": { - "2fa": "2FA Pin" - }, + "data": { "2fa": "2FA Pin" }, "title": "2-Factor-Authentication" } } diff --git a/homeassistant/components/harmony/strings.json b/homeassistant/components/harmony/strings.json index a486772139d4..e093d02051d5 100644 --- a/homeassistant/components/harmony/strings.json +++ b/homeassistant/components/harmony/strings.json @@ -1,14 +1,10 @@ { - "title": "Logitech Harmony Hub", "config": { "flow_title": "Logitech Harmony Hub {name}", "step": { "user": { "title": "Setup Logitech Harmony Hub", - "data": { - "host": "Hostname or IP Address", - "name": "Hub Name" - } + "data": { "host": "Hostname or IP Address", "name": "Hub Name" } }, "link": { "title": "Setup Logitech Harmony Hub", @@ -19,9 +15,7 @@ "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } }, "options": { "step": { diff --git a/homeassistant/components/heos/strings.json b/homeassistant/components/heos/strings.json index 12bc234fc4d3..383afad1b963 100644 --- a/homeassistant/components/heos/strings.json +++ b/homeassistant/components/heos/strings.json @@ -1,14 +1,10 @@ { - "title": "HEOS", "config": { "step": { "user": { "title": "Connect to Heos", "description": "Please enter the host name or IP address of a Heos device (preferably one connected via wire to the network).", - "data": { - "access_token": "Host", - "host": "Host" - } + "data": { "access_token": "Host", "host": "Host" } } }, "error": { diff --git a/homeassistant/components/hisense_aehw4a1/strings.json b/homeassistant/components/hisense_aehw4a1/strings.json index 1d92864aa277..47d8bce7e739 100644 --- a/homeassistant/components/hisense_aehw4a1/strings.json +++ b/homeassistant/components/hisense_aehw4a1/strings.json @@ -1,5 +1,4 @@ { - "title": "Hisense AEH-W4A1", "config": { "step": { "confirm": { diff --git a/homeassistant/components/homematicip_cloud/strings.json b/homeassistant/components/homematicip_cloud/strings.json index e269121086cb..2b2a75ebc08f 100644 --- a/homeassistant/components/homematicip_cloud/strings.json +++ b/homeassistant/components/homematicip_cloud/strings.json @@ -1,5 +1,4 @@ { - "title": "HomematicIP Cloud", "config": { "step": { "init": { diff --git a/homeassistant/components/huawei_lte/strings.json b/homeassistant/components/huawei_lte/strings.json index 4c613a286d64..e3a89b8f4184 100644 --- a/homeassistant/components/huawei_lte/strings.json +++ b/homeassistant/components/huawei_lte/strings.json @@ -1,5 +1,4 @@ { - "title": "Huawei LTE", "config": { "abort": { "already_configured": "This device has already been configured", diff --git a/homeassistant/components/iaqualink/strings.json b/homeassistant/components/iaqualink/strings.json index 185e9ab5498f..f4ad099be830 100644 --- a/homeassistant/components/iaqualink/strings.json +++ b/homeassistant/components/iaqualink/strings.json @@ -1,5 +1,4 @@ { - "title": "Jandy iAqualink", "config": { "step": { "user": { diff --git a/homeassistant/components/icloud/strings.json b/homeassistant/components/icloud/strings.json index d0f343a21f61..b9e22a7b042a 100644 --- a/homeassistant/components/icloud/strings.json +++ b/homeassistant/components/icloud/strings.json @@ -1,5 +1,4 @@ { - "title": "Apple iCloud", "config": { "step": { "user": { @@ -14,16 +13,12 @@ "trusted_device": { "title": "iCloud trusted device", "description": "Select your trusted device", - "data": { - "trusted_device": "Trusted device" - } + "data": { "trusted_device": "Trusted device" } }, "verification_code": { "title": "iCloud verification code", "description": "Please enter the verification code you just received from iCloud", - "data": { - "verification_code": "Verification code" - } + "data": { "verification_code": "Verification code" } } }, "error": { diff --git a/homeassistant/components/ifttt/strings.json b/homeassistant/components/ifttt/strings.json index 2039f3f39ffa..b637e0de13da 100644 --- a/homeassistant/components/ifttt/strings.json +++ b/homeassistant/components/ifttt/strings.json @@ -1,5 +1,4 @@ { - "title": "IFTTT", "config": { "step": { "user": { diff --git a/homeassistant/components/ios/manifest.json b/homeassistant/components/ios/manifest.json index f714cee825f6..3ab8573edc8e 100644 --- a/homeassistant/components/ios/manifest.json +++ b/homeassistant/components/ios/manifest.json @@ -1,6 +1,6 @@ { "domain": "ios", - "name": "Apple iOS", + "name": "Home Assistant iOS", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/ios", "dependencies": ["device_tracker", "http", "zeroconf"], diff --git a/homeassistant/components/ios/strings.json b/homeassistant/components/ios/strings.json index 53ba28972eea..0029ad0688c8 100644 --- a/homeassistant/components/ios/strings.json +++ b/homeassistant/components/ios/strings.json @@ -1,5 +1,4 @@ { - "title": "Home Assistant iOS", "config": { "step": { "confirm": { diff --git a/homeassistant/components/ipma/strings.json b/homeassistant/components/ipma/strings.json index 78471e703bac..5b325938411f 100644 --- a/homeassistant/components/ipma/strings.json +++ b/homeassistant/components/ipma/strings.json @@ -1,10 +1,9 @@ { - "title": "Portuguese weather service (IPMA)", "config": { "step": { "user": { "title": "Location", - "description": "Instituto Português do Mar e Atmosfera", + "description": "Instituto Portugu\u00eas do Mar e Atmosfera", "data": { "name": "Name", "latitude": "Latitude", @@ -13,8 +12,6 @@ } } }, - "error": { - "name_exists": "Name already exists" - } + "error": { "name_exists": "Name already exists" } } } diff --git a/homeassistant/components/ipp/strings.json b/homeassistant/components/ipp/strings.json index 0e6a005d3ed7..e3e28ace1fd8 100644 --- a/homeassistant/components/ipp/strings.json +++ b/homeassistant/components/ipp/strings.json @@ -1,5 +1,4 @@ { - "title": "Internet Printing Protocol (IPP)", "config": { "flow_title": "Printer: {name}", "step": { diff --git a/homeassistant/components/iqvia/strings.json b/homeassistant/components/iqvia/strings.json index 62ceae7753bd..efc9582e20a6 100644 --- a/homeassistant/components/iqvia/strings.json +++ b/homeassistant/components/iqvia/strings.json @@ -1,13 +1,10 @@ { - "title": "IQVIA", "config": { "step": { "user": { "title": "IQVIA", "description": "Fill out your U.S. or Canadian ZIP code.", - "data": { - "zip_code": "ZIP Code" - } + "data": { "zip_code": "ZIP Code" } } }, "error": { diff --git a/homeassistant/components/izone/strings.json b/homeassistant/components/izone/strings.json index 7af3fffd09a3..78512dba772a 100644 --- a/homeassistant/components/izone/strings.json +++ b/homeassistant/components/izone/strings.json @@ -1,5 +1,4 @@ { - "title": "iZone", "config": { "step": { "confirm": { diff --git a/homeassistant/components/konnected/manifest.json b/homeassistant/components/konnected/manifest.json index 48f61ece4c4d..95c14050a726 100644 --- a/homeassistant/components/konnected/manifest.json +++ b/homeassistant/components/konnected/manifest.json @@ -1,6 +1,6 @@ { "domain": "konnected", - "name": "Konnected", + "name": "Konnected.io", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/konnected", "requirements": ["konnected==1.1.0"], diff --git a/homeassistant/components/konnected/strings.json b/homeassistant/components/konnected/strings.json index cb1cd5df8bf2..60ab4cac7c4b 100644 --- a/homeassistant/components/konnected/strings.json +++ b/homeassistant/components/konnected/strings.json @@ -1,5 +1,4 @@ { - "title": "Konnected.io", "config": { "step": { "import_confirm": { @@ -99,11 +98,7 @@ } } }, - "error": { - "bad_host": "Invalid Override API host url" - }, - "abort": { - "not_konn_panel": "Not a recognized Konnected.io device" - } + "error": { "bad_host": "Invalid Override API host url" }, + "abort": { "not_konn_panel": "Not a recognized Konnected.io device" } } } diff --git a/homeassistant/components/life360/strings.json b/homeassistant/components/life360/strings.json index 10735b7f454b..22d3f52c63b8 100644 --- a/homeassistant/components/life360/strings.json +++ b/homeassistant/components/life360/strings.json @@ -1,13 +1,9 @@ { - "title": "Life360", "config": { "step": { "user": { "title": "Life360 Account Info", - "data": { - "username": "Username", - "password": "Password" - }, + "data": { "username": "Username", "password": "Password" }, "description": "To set advanced options, see [Life360 documentation]({docs_url}).\nYou may want to do that before adding accounts." } }, diff --git a/homeassistant/components/lifx/strings.json b/homeassistant/components/lifx/strings.json index d111aa9583eb..663ba3a66809 100644 --- a/homeassistant/components/lifx/strings.json +++ b/homeassistant/components/lifx/strings.json @@ -1,5 +1,4 @@ { - "title": "LIFX", "config": { "step": { "confirm": { diff --git a/homeassistant/components/linky/strings.json b/homeassistant/components/linky/strings.json index e50a20aefcda..7770ce3d0ee4 100644 --- a/homeassistant/components/linky/strings.json +++ b/homeassistant/components/linky/strings.json @@ -1,14 +1,10 @@ { - "title": "Linky", "config": { "step": { "user": { "title": "Linky", "description": "Enter your credentials", - "data": { - "username": "Email", - "password": "Password" - } + "data": { "username": "Email", "password": "Password" } } }, "error": { @@ -17,8 +13,6 @@ "wrong_login": "Login error: please check your email & password", "unknown": "Unknown error: please retry later (usually not between 11PM and 2AM)" }, - "abort": { - "already_configured": "Account already configured" - } + "abort": { "already_configured": "Account already configured" } } } diff --git a/homeassistant/components/locative/strings.json b/homeassistant/components/locative/strings.json index 07ca54318690..53a0c160e99a 100644 --- a/homeassistant/components/locative/strings.json +++ b/homeassistant/components/locative/strings.json @@ -1,5 +1,4 @@ { - "title": "Locative Webhook", "config": { "step": { "user": { diff --git a/homeassistant/components/logi_circle/strings.json b/homeassistant/components/logi_circle/strings.json index f580e7bc1ddc..347589c7881d 100644 --- a/homeassistant/components/logi_circle/strings.json +++ b/homeassistant/components/logi_circle/strings.json @@ -1,13 +1,10 @@ { - "title": "Logi Circle", "config": { "step": { "user": { "title": "Authentication Provider", "description": "Pick via which authentication provider you want to authenticate with Logi Circle.", - "data": { - "flow_impl": "Provider" - } + "data": { "flow_impl": "Provider" } }, "auth": { "title": "Authenticate with Logi Circle", diff --git a/homeassistant/components/luftdaten/strings.json b/homeassistant/components/luftdaten/strings.json index 8e4acd1ad96e..2ac026d3001b 100644 --- a/homeassistant/components/luftdaten/strings.json +++ b/homeassistant/components/luftdaten/strings.json @@ -1,5 +1,4 @@ { - "title": "Luftdaten", "config": { "step": { "user": { diff --git a/homeassistant/components/lutron_caseta/manifest.json b/homeassistant/components/lutron_caseta/manifest.json index 90c9d4fc9c97..e3b74d8157be 100644 --- a/homeassistant/components/lutron_caseta/manifest.json +++ b/homeassistant/components/lutron_caseta/manifest.json @@ -1,6 +1,6 @@ { "domain": "lutron_caseta", - "name": "Lutron Caseta", + "name": "Lutron Caséta", "documentation": "https://www.home-assistant.io/integrations/lutron_caseta", "requirements": ["pylutron-caseta==0.6.1"], "codeowners": ["@swails"] diff --git a/homeassistant/components/lutron_caseta/strings.json b/homeassistant/components/lutron_caseta/strings.json deleted file mode 100644 index 354c69cd55ab..000000000000 --- a/homeassistant/components/lutron_caseta/strings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "title": "Lutron Caséta" -} diff --git a/homeassistant/components/mailgun/strings.json b/homeassistant/components/mailgun/strings.json index 8afa6eaed257..29ea3c0b952a 100644 --- a/homeassistant/components/mailgun/strings.json +++ b/homeassistant/components/mailgun/strings.json @@ -1,5 +1,4 @@ { - "title": "Mailgun", "config": { "step": { "user": { diff --git a/homeassistant/components/melcloud/strings.json b/homeassistant/components/melcloud/strings.json index 5afa10f3aa52..f74398e94437 100644 --- a/homeassistant/components/melcloud/strings.json +++ b/homeassistant/components/melcloud/strings.json @@ -1,5 +1,4 @@ { - "title": "MELCloud", "config": { "step": { "user": { diff --git a/homeassistant/components/met/strings.json b/homeassistant/components/met/strings.json index a5f0c6ce3815..814df01b49ec 100644 --- a/homeassistant/components/met/strings.json +++ b/homeassistant/components/met/strings.json @@ -1,5 +1,4 @@ { - "title": "Met.no", "config": { "step": { "user": { @@ -13,8 +12,6 @@ } } }, - "error": { - "name_exists": "Location already exists" - } + "error": { "name_exists": "Location already exists" } } } diff --git a/homeassistant/components/meteo_france/strings.json b/homeassistant/components/meteo_france/strings.json index 0cd5c7d8da2d..fc6e426b8d46 100644 --- a/homeassistant/components/meteo_france/strings.json +++ b/homeassistant/components/meteo_france/strings.json @@ -1,13 +1,10 @@ { - "title": "Météo-France", "config": { "step": { "user": { - "title": "Météo-France", + "title": "M\u00e9t\u00e9o-France", "description": "Enter the postal code (only for France, recommended) or city name", - "data": { - "city": "City" - } + "data": { "city": "City" } } }, "abort": { diff --git a/homeassistant/components/mikrotik/strings.json b/homeassistant/components/mikrotik/strings.json index c0c77261e5a8..3f4bd769eac3 100644 --- a/homeassistant/components/mikrotik/strings.json +++ b/homeassistant/components/mikrotik/strings.json @@ -1,5 +1,4 @@ { - "title": "Mikrotik", "config": { "step": { "user": { @@ -19,9 +18,7 @@ "cannot_connect": "Connection Unsuccessful", "wrong_credentials": "Wrong Credentials" }, - "abort": { - "already_configured": "Mikrotik is already configured" - } + "abort": { "already_configured": "Mikrotik is already configured" } }, "options": { "step": { diff --git a/homeassistant/components/minecraft_server/strings.json b/homeassistant/components/minecraft_server/strings.json index 650f95198d50..0ca0b03134d5 100644 --- a/homeassistant/components/minecraft_server/strings.json +++ b/homeassistant/components/minecraft_server/strings.json @@ -1,14 +1,10 @@ { - "title": "Minecraft Server", "config": { "step": { "user": { "title": "Link your Minecraft Server", "description": "Set up your Minecraft Server instance to allow monitoring.", - "data": { - "name": "Name", - "host": "Host" - } + "data": { "name": "Name", "host": "Host" } } }, "error": { @@ -16,8 +12,6 @@ "cannot_connect": "Failed to connect to server. Please check the host and port and try again. Also ensure that you are running at least Minecraft version 1.7 on your server.", "invalid_ip": "IP address is invalid (MAC address could not be determined). Please correct it and try again." }, - "abort": { - "already_configured": "Host is already configured." - } + "abort": { "already_configured": "Host is already configured." } } } diff --git a/homeassistant/components/mobile_app/manifest.json b/homeassistant/components/mobile_app/manifest.json index d6e1156b2334..0576a466d7ed 100644 --- a/homeassistant/components/mobile_app/manifest.json +++ b/homeassistant/components/mobile_app/manifest.json @@ -1,6 +1,6 @@ { "domain": "mobile_app", - "name": "Home Assistant Mobile App Support", + "name": "Mobile App", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/mobile_app", "requirements": ["PyNaCl==1.3.0"], diff --git a/homeassistant/components/mobile_app/strings.json b/homeassistant/components/mobile_app/strings.json index 17a390fb575e..c7b3aec27f89 100644 --- a/homeassistant/components/mobile_app/strings.json +++ b/homeassistant/components/mobile_app/strings.json @@ -1,5 +1,4 @@ { - "title": "Mobile App", "config": { "step": { "confirm": { diff --git a/homeassistant/components/monoprice/strings.json b/homeassistant/components/monoprice/strings.json index fb7739546c3a..2b6395876732 100644 --- a/homeassistant/components/monoprice/strings.json +++ b/homeassistant/components/monoprice/strings.json @@ -1,5 +1,4 @@ { - "title": "Monoprice 6-Zone Amplifier", "config": { "step": { "user": { @@ -19,9 +18,7 @@ "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } }, "options": { "step": { diff --git a/homeassistant/components/mqtt/strings.json b/homeassistant/components/mqtt/strings.json index 7d55bd448b7b..b182dc6b8b31 100644 --- a/homeassistant/components/mqtt/strings.json +++ b/homeassistant/components/mqtt/strings.json @@ -1,5 +1,4 @@ { - "title": "MQTT", "config": { "step": { "broker": { @@ -16,17 +15,13 @@ "hassio_confirm": { "title": "MQTT Broker via Hass.io add-on", "description": "Do you want to configure Home Assistant to connect to the MQTT broker provided by the Hass.io add-on {addon}?", - "data": { - "discovery": "Enable discovery" - } + "data": { "discovery": "Enable discovery" } } }, "abort": { "single_instance_allowed": "Only a single configuration of MQTT is allowed." }, - "error": { - "cannot_connect": "Unable to connect to the broker." - } + "error": { "cannot_connect": "Unable to connect to the broker." } }, "device_automation": { "trigger_type": { diff --git a/homeassistant/components/myq/strings.json b/homeassistant/components/myq/strings.json index 47157e64d960..a7300b165989 100644 --- a/homeassistant/components/myq/strings.json +++ b/homeassistant/components/myq/strings.json @@ -1,13 +1,9 @@ { - "title": "MyQ", "config": { "step": { "user": { "title": "Connect to the MyQ Gateway", - "data": { - "username": "Username", - "password": "Password" - } + "data": { "username": "Username", "password": "Password" } } }, "error": { @@ -15,8 +11,6 @@ "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "MyQ is already configured" - } + "abort": { "already_configured": "MyQ is already configured" } } } diff --git a/homeassistant/components/neato/strings.json b/homeassistant/components/neato/strings.json index 5346e2da3ac4..f104a37a93a1 100644 --- a/homeassistant/components/neato/strings.json +++ b/homeassistant/components/neato/strings.json @@ -1,5 +1,4 @@ { - "title": "Neato", "config": { "step": { "user": { @@ -16,9 +15,7 @@ "invalid_credentials": "Invalid credentials", "unexpected_error": "Unexpected error" }, - "create_entry": { - "default": "See [Neato documentation]({docs_url})." - }, + "create_entry": { "default": "See [Neato documentation]({docs_url})." }, "abort": { "already_configured": "Already configured", "invalid_credentials": "Invalid credentials" diff --git a/homeassistant/components/nest/strings.json b/homeassistant/components/nest/strings.json index bacd16f5f298..015df1645339 100644 --- a/homeassistant/components/nest/strings.json +++ b/homeassistant/components/nest/strings.json @@ -1,20 +1,15 @@ { - "title": "Nest", "config": { "step": { "init": { "title": "Authentication Provider", "description": "Pick via which authentication provider you want to authenticate with Nest.", - "data": { - "flow_impl": "Provider" - } + "data": { "flow_impl": "Provider" } }, "link": { "title": "Link Nest Account", "description": "To link your Nest account, [authorize your account]({url}).\n\nAfter authorization, copy-paste the provided pin code below.", - "data": { - "code": "Pin code" - } + "data": { "code": "Pin code" } } }, "error": { diff --git a/homeassistant/components/netatmo/strings.json b/homeassistant/components/netatmo/strings.json index 4261608e2484..e25ca1e58495 100644 --- a/homeassistant/components/netatmo/strings.json +++ b/homeassistant/components/netatmo/strings.json @@ -1,18 +1,13 @@ { - "title": "Netatmo", "config": { "step": { - "pick_implementation": { - "title": "Pick Authentication Method" - } + "pick_implementation": { "title": "Pick Authentication Method" } }, "abort": { "already_setup": "You can only configure one Netatmo account.", "authorize_url_timeout": "Timeout generating authorize url.", "missing_configuration": "The Netatmo component is not configured. Please follow the documentation." }, - "create_entry": { - "default": "Successfully authenticated with Netatmo." - } + "create_entry": { "default": "Successfully authenticated with Netatmo." } } } diff --git a/homeassistant/components/nexia/strings.json b/homeassistant/components/nexia/strings.json index dc9b4833aab2..2d5c5bbfb172 100644 --- a/homeassistant/components/nexia/strings.json +++ b/homeassistant/components/nexia/strings.json @@ -1,13 +1,9 @@ { - "title": "Nexia", "config": { "step": { "user": { "title": "Connect to mynexia.com", - "data": { - "username": "Username", - "password": "Password" - } + "data": { "username": "Username", "password": "Password" } } }, "error": { @@ -15,8 +11,6 @@ "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "This nexia home is already configured" - } + "abort": { "already_configured": "This nexia home is already configured" } } } diff --git a/homeassistant/components/notify/strings.json b/homeassistant/components/notify/strings.json index b9f694e470e2..02027a84d8f4 100644 --- a/homeassistant/components/notify/strings.json +++ b/homeassistant/components/notify/strings.json @@ -1 +1 @@ -{ "title": "Notify" } +{ "title": "Notifications" } diff --git a/homeassistant/components/notion/strings.json b/homeassistant/components/notion/strings.json index 5c70e37ddb0c..1764e6cc9626 100644 --- a/homeassistant/components/notion/strings.json +++ b/homeassistant/components/notion/strings.json @@ -1,21 +1,15 @@ { - "title": "Notion", "config": { "step": { "user": { "title": "Fill in your information", - "data": { - "username": "Username/Email Address", - "password": "Password" - } + "data": { "username": "Username/Email Address", "password": "Password" } } }, "error": { "invalid_credentials": "Invalid username or password", "no_devices": "No devices found in account" }, - "abort": { - "already_configured": "This username is already in use." - } + "abort": { "already_configured": "This username is already in use." } } } diff --git a/homeassistant/components/nuheat/strings.json b/homeassistant/components/nuheat/strings.json index a3b34456b0b9..6a3d79e04044 100644 --- a/homeassistant/components/nuheat/strings.json +++ b/homeassistant/components/nuheat/strings.json @@ -1,5 +1,4 @@ { - "title": "NuHeat", "config": { "error": { "unknown": "Unexpected error", @@ -7,13 +6,11 @@ "invalid_auth": "Invalid authentication", "invalid_thermostat": "The thermostat serial number is invalid." }, - "abort": { - "already_configured": "The thermostat is already configured" - }, + "abort": { "already_configured": "The thermostat is already configured" }, "step": { "user": { "title": "Connect to the NuHeat", - "description": "You will need to obtain your thermostat’s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", + "description": "You will need to obtain your thermostat\u2019s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", "data": { "username": "Username", "password": "Password", diff --git a/homeassistant/components/nut/strings.json b/homeassistant/components/nut/strings.json index ef942394a561..76c12cdacfe0 100644 --- a/homeassistant/components/nut/strings.json +++ b/homeassistant/components/nut/strings.json @@ -1,5 +1,4 @@ { - "title": "Network UPS Tools (NUT)", "config": { "step": { "user": { @@ -13,25 +12,18 @@ }, "ups": { "title": "Choose the UPS to Monitor", - "data": { - "alias": "Alias", - "resources": "Resources" - } + "data": { "alias": "Alias", "resources": "Resources" } }, "resources": { "title": "Choose the Resources to Monitor", - "data": { - "resources": "Resources" - } + "data": { "resources": "Resources" } } }, "error": { "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } }, "options": { "step": { diff --git a/homeassistant/components/nws/strings.json b/homeassistant/components/nws/strings.json index 44c5c6ca3267..4d9783ca1a04 100644 --- a/homeassistant/components/nws/strings.json +++ b/homeassistant/components/nws/strings.json @@ -1,15 +1,14 @@ { - "title": "National Weather Service (NWS)", "config": { "step": { - "user": { - "description": "If a METAR station code is not specified, the latitude and longitude will be used to find the closest station.", + "user": { + "description": "If a METAR station code is not specified, the latitude and longitude will be used to find the closest station.", "title": "Connect to the National Weather Service", "data": { - "api_key": "API key (email)", - "latitude": "Latitude", - "longitude": "Longitude", - "station": "METAR station code" + "api_key": "API key (email)", + "latitude": "Latitude", + "longitude": "Longitude", + "station": "METAR station code" } } }, @@ -17,8 +16,6 @@ "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } } } diff --git a/homeassistant/components/opentherm_gw/strings.json b/homeassistant/components/opentherm_gw/strings.json index 4b257eca7485..eb074e608ca6 100644 --- a/homeassistant/components/opentherm_gw/strings.json +++ b/homeassistant/components/opentherm_gw/strings.json @@ -1,14 +1,9 @@ { - "title": "OpenTherm Gateway", "config": { "step": { "init": { "title": "OpenTherm Gateway", - "data": { - "name": "Name", - "device": "Path or URL", - "id": "ID" - } + "data": { "name": "Name", "device": "Path or URL", "id": "ID" } } }, "error": { diff --git a/homeassistant/components/openuv/manifest.json b/homeassistant/components/openuv/manifest.json index d1045e3eca96..f55ca587679b 100644 --- a/homeassistant/components/openuv/manifest.json +++ b/homeassistant/components/openuv/manifest.json @@ -1,6 +1,6 @@ { "domain": "openuv", - "name": "Openuv", + "name": "OpenUV", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/openuv", "requirements": ["pyopenuv==1.0.9"], diff --git a/homeassistant/components/openuv/strings.json b/homeassistant/components/openuv/strings.json index 8692c42127f0..2d4b530cd55d 100644 --- a/homeassistant/components/openuv/strings.json +++ b/homeassistant/components/openuv/strings.json @@ -1,5 +1,4 @@ { - "title": "OpenUV", "config": { "step": { "user": { diff --git a/homeassistant/components/owntracks/strings.json b/homeassistant/components/owntracks/strings.json index a79bee5ce631..b82761461ecb 100644 --- a/homeassistant/components/owntracks/strings.json +++ b/homeassistant/components/owntracks/strings.json @@ -1,5 +1,4 @@ { - "title": "OwnTracks", "config": { "step": { "user": { @@ -7,9 +6,7 @@ "description": "Are you sure you want to set up OwnTracks?" } }, - "abort": { - "one_instance_allowed": "Only a single instance is necessary." - }, + "abort": { "one_instance_allowed": "Only a single instance is necessary." }, "create_entry": { "default": "\n\nOn Android, open [the OwnTracks app]({android_url}), go to preferences -> connection. Change the following settings:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\nOn iOS, open [the OwnTracks app]({ios_url}), tap (i) icon in top left -> settings. Change the following settings:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\nSee [the documentation]({docs_url}) for more information." } diff --git a/homeassistant/components/plaato/strings.json b/homeassistant/components/plaato/strings.json index 697b1466ef0e..f78943ca9418 100644 --- a/homeassistant/components/plaato/strings.json +++ b/homeassistant/components/plaato/strings.json @@ -1,5 +1,4 @@ { - "title": "Plaato Airlock", "config": { "step": { "user": { diff --git a/homeassistant/components/plant/strings.json b/homeassistant/components/plant/strings.json index d34066b40922..52e1d8165e2c 100644 --- a/homeassistant/components/plant/strings.json +++ b/homeassistant/components/plant/strings.json @@ -1 +1 @@ -{ "title": "Plant" } +{ "title": "Plant Monitor" } diff --git a/homeassistant/components/plex/strings.json b/homeassistant/components/plex/strings.json index 2952c8436a68..962e8d35225d 100644 --- a/homeassistant/components/plex/strings.json +++ b/homeassistant/components/plex/strings.json @@ -1,13 +1,10 @@ { - "title": "Plex", "config": { "step": { "select_server": { "title": "Select Plex server", "description": "Multiple servers available, select one:", - "data": { - "server": "Server" - } + "data": { "server": "Server" } }, "start_website_auth": { "title": "Connect Plex server", diff --git a/homeassistant/components/point/strings.json b/homeassistant/components/point/strings.json index fc7f189bd0ee..f3b5fd5c4c46 100644 --- a/homeassistant/components/point/strings.json +++ b/homeassistant/components/point/strings.json @@ -1,13 +1,10 @@ { - "title": "Minut Point", "config": { "step": { "user": { "title": "Authentication Provider", "description": "Pick via which authentication provider you want to authenticate with Point.", - "data": { - "flow_impl": "Provider" - } + "data": { "flow_impl": "Provider" } }, "auth": { "title": "Authenticate Point", diff --git a/homeassistant/components/powerwall/strings.json b/homeassistant/components/powerwall/strings.json index 66ed7edff442..bb5ed6714352 100644 --- a/homeassistant/components/powerwall/strings.json +++ b/homeassistant/components/powerwall/strings.json @@ -1,20 +1,15 @@ { - "title": "Tesla Powerwall", "config": { "step": { "user": { "title": "Connect to the powerwall", - "data": { - "ip_address": "IP Address" - } + "data": { "ip_address": "IP Address" } } }, "error": { "cannot_connect": "Failed to connect, please try again", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "The powerwall is already configured" - } + "abort": { "already_configured": "The powerwall is already configured" } } } diff --git a/homeassistant/components/proximity/strings.json b/homeassistant/components/proximity/strings.json index bc338149d3db..4949ec80ba18 100644 --- a/homeassistant/components/proximity/strings.json +++ b/homeassistant/components/proximity/strings.json @@ -1 +1,3 @@ -{ "title": "Proximity" } +{ + "title": "Proximity" +} diff --git a/homeassistant/components/ps4/strings.json b/homeassistant/components/ps4/strings.json index ff7d2d82f05b..c3a864565cf1 100644 --- a/homeassistant/components/ps4/strings.json +++ b/homeassistant/components/ps4/strings.json @@ -1,5 +1,4 @@ { - "title": "PlayStation 4", "config": { "step": { "creds": { diff --git a/homeassistant/components/pvpc_hourly_pricing/strings.json b/homeassistant/components/pvpc_hourly_pricing/strings.json index 44d3ec5f5250..fbda22c51495 100644 --- a/homeassistant/components/pvpc_hourly_pricing/strings.json +++ b/homeassistant/components/pvpc_hourly_pricing/strings.json @@ -1,5 +1,4 @@ { - "title": "Hourly price of electricity in Spain (PVPC)", "config": { "step": { "user": { diff --git a/homeassistant/components/rachio/strings.json b/homeassistant/components/rachio/strings.json index f905f7810d36..1c73e74902ca 100644 --- a/homeassistant/components/rachio/strings.json +++ b/homeassistant/components/rachio/strings.json @@ -1,13 +1,10 @@ { - "title": "Rachio", "config": { "step": { "user": { "title": "Connect to your Rachio device", "description": "You will need the API Key from https://app.rach.io/. Select 'Account Settings, and then click on 'GET API KEY'.", - "data": { - "api_key": "The API key for the Rachio account." - } + "data": { "api_key": "The API key for the Rachio account." } } }, "error": { @@ -15,9 +12,7 @@ "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } }, "options": { "step": { diff --git a/homeassistant/components/rainmachine/strings.json b/homeassistant/components/rainmachine/strings.json index 10e7e2e1400f..0d1eabc1cdeb 100644 --- a/homeassistant/components/rainmachine/strings.json +++ b/homeassistant/components/rainmachine/strings.json @@ -1,5 +1,4 @@ { - "title": "RainMachine", "config": { "step": { "user": { diff --git a/homeassistant/components/ring/strings.json b/homeassistant/components/ring/strings.json index 9ba9bbf49c11..8c8c7b1e6ab5 100644 --- a/homeassistant/components/ring/strings.json +++ b/homeassistant/components/ring/strings.json @@ -1,27 +1,19 @@ { - "title": "Ring", "config": { "step": { "user": { "title": "Sign-in with Ring account", - "data": { - "username": "Username", - "password": "Password" - } + "data": { "username": "Username", "password": "Password" } }, "2fa": { "title": "Two-factor authentication", - "data": { - "2fa": "Two-factor code" - } + "data": { "2fa": "Two-factor code" } } }, "error": { "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } } } diff --git a/homeassistant/components/roku/strings.json b/homeassistant/components/roku/strings.json index 8494f350b2c6..7d187994a24c 100644 --- a/homeassistant/components/roku/strings.json +++ b/homeassistant/components/roku/strings.json @@ -1,14 +1,11 @@ { - "title": "Roku", "config": { "flow_title": "Roku: {name}", "step": { "user": { "title": "Roku", "description": "Enter your Roku information.", - "data": { - "host": "Host or IP address" - } + "data": { "host": "Host or IP address" } }, "ssdp_confirm": { "title": "Roku", @@ -16,9 +13,7 @@ "data": {} } }, - "error": { - "cannot_connect": "Failed to connect, please try again" - }, + "error": { "cannot_connect": "Failed to connect, please try again" }, "abort": { "already_configured": "Roku device is already configured", "unknown": "Unexpected error" diff --git a/homeassistant/components/roomba/strings.json b/homeassistant/components/roomba/strings.json index 7d55b1f304e6..a679b2fdbb50 100644 --- a/homeassistant/components/roomba/strings.json +++ b/homeassistant/components/roomba/strings.json @@ -1,5 +1,4 @@ { - "title": "iRobot Roomba", "config": { "step": { "user": { @@ -22,12 +21,7 @@ }, "options": { "step": { - "init": { - "data": { - "continuous": "Continuous", - "delay": "Delay" - } - } + "init": { "data": { "continuous": "Continuous", "delay": "Delay" } } } } } diff --git a/homeassistant/components/samsungtv/strings.json b/homeassistant/components/samsungtv/strings.json index 8a3d44f62291..36081fe967f1 100644 --- a/homeassistant/components/samsungtv/strings.json +++ b/homeassistant/components/samsungtv/strings.json @@ -1,15 +1,11 @@ { - "title": "Samsung TV", "config": { "flow_title": "Samsung TV: {model}", "step": { "user": { "title": "Samsung TV", "description": "Enter your Samsung TV information. If you never connected Home Assistant before you should see a popup on your TV asking for authorization.", - "data": { - "host": "Host or IP address", - "name": "Name" - } + "data": { "host": "Host or IP address", "name": "Name" } }, "confirm": { "title": "Samsung TV", diff --git a/homeassistant/components/sense/strings.json b/homeassistant/components/sense/strings.json index 0577fc7d24e8..6c90fdbaab84 100644 --- a/homeassistant/components/sense/strings.json +++ b/homeassistant/components/sense/strings.json @@ -1,13 +1,9 @@ { - "title": "Sense", "config": { "step": { "user": { "title": "Connect to your Sense Energy Monitor", - "data": { - "email": "Email Address", - "password": "Password" - } + "data": { "email": "Email Address", "password": "Password" } } }, "error": { @@ -15,8 +11,6 @@ "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } } } diff --git a/homeassistant/components/sentry/strings.json b/homeassistant/components/sentry/strings.json index d6dc5a3af15f..97a945a5a9d2 100644 --- a/homeassistant/components/sentry/strings.json +++ b/homeassistant/components/sentry/strings.json @@ -1,18 +1,9 @@ { - "title": "Sentry", "config": { "step": { - "user": { - "title": "Sentry", - "description": "Enter your Sentry DSN" - } + "user": { "title": "Sentry", "description": "Enter your Sentry DSN" } }, - "error": { - "unknown": "Unexpected error", - "bad_dsn": "Invalid DSN" - }, - "abort": { - "already_configured": "Sentry is already configured" - } + "error": { "unknown": "Unexpected error", "bad_dsn": "Invalid DSN" }, + "abort": { "already_configured": "Sentry is already configured" } } } diff --git a/homeassistant/components/simplisafe/strings.json b/homeassistant/components/simplisafe/strings.json index 7ffb6dfbe1a7..3d9d832c99a0 100644 --- a/homeassistant/components/simplisafe/strings.json +++ b/homeassistant/components/simplisafe/strings.json @@ -1,13 +1,9 @@ { - "title": "SimpliSafe", "config": { "step": { "user": { "title": "Fill in your information", - "data": { - "username": "Email Address", - "password": "Password" - } + "data": { "username": "Email Address", "password": "Password" } } }, "error": { @@ -22,9 +18,7 @@ "step": { "init": { "title": "Configure SimpliSafe", - "data": { - "code": "Code (used in Home Assistant UI)" - } + "data": { "code": "Code (used in Home Assistant UI)" } } } } diff --git a/homeassistant/components/smartthings/manifest.json b/homeassistant/components/smartthings/manifest.json index 4c78bbb23dff..3f9ee75b173b 100644 --- a/homeassistant/components/smartthings/manifest.json +++ b/homeassistant/components/smartthings/manifest.json @@ -1,6 +1,6 @@ { "domain": "smartthings", - "name": "Smartthings", + "name": "SmartThings", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/smartthings", "requirements": ["pysmartapp==0.3.2", "pysmartthings==0.7.1"], diff --git a/homeassistant/components/smartthings/strings.json b/homeassistant/components/smartthings/strings.json index 313570506246..c8b938ebc6ad 100644 --- a/homeassistant/components/smartthings/strings.json +++ b/homeassistant/components/smartthings/strings.json @@ -1,5 +1,4 @@ { - "title": "SmartThings", "config": { "step": { "user": { @@ -9,20 +8,14 @@ "pat": { "title": "Enter Personal Access Token", "description": "Please enter a SmartThings [Personal Access Token]({token_url}) that has been created per the [instructions]({component_url}). This will be used to create the Home Assistant integration within your SmartThings account.", - "data": { - "access_token": "Access Token" - } + "data": { "access_token": "Access Token" } }, "select_location": { "title": "Select Location", "description": "Please select the SmartThings Location you wish to add to Home Assistant. We will then open a new window and ask you to login and authorize installation of the Home Assistant integration into the selected location.", - "data": { - "location_id": "Location" - } + "data": { "location_id": "Location" } }, - "authorize": { - "title": "Authorize Home Assistant" - } + "authorize": { "title": "Authorize Home Assistant" } }, "abort": { "invalid_webhook_url": "Home Assistant is not configured correctly to receive updates from SmartThings. The webhook URL is invalid:\n> {webhook_url}\n\nPlease update your configuration per the [instructions]({component_url}), restart Home Assistant, and try again.", diff --git a/homeassistant/components/smhi/strings.json b/homeassistant/components/smhi/strings.json index 015b24848afc..245260b0fce4 100644 --- a/homeassistant/components/smhi/strings.json +++ b/homeassistant/components/smhi/strings.json @@ -1,5 +1,4 @@ { - "title": "Swedish weather service (SMHI)", "config": { "step": { "user": { diff --git a/homeassistant/components/solaredge/strings.json b/homeassistant/components/solaredge/strings.json index ba02a718cbfb..03b14c51a187 100644 --- a/homeassistant/components/solaredge/strings.json +++ b/homeassistant/components/solaredge/strings.json @@ -1,5 +1,4 @@ { - "title": "SolarEdge", "config": { "step": { "user": { @@ -11,11 +10,7 @@ } } }, - "error": { - "site_exists": "This site_id is already configured" - }, - "abort": { - "site_exists": "This site_id is already configured" - } + "error": { "site_exists": "This site_id is already configured" }, + "abort": { "site_exists": "This site_id is already configured" } } } diff --git a/homeassistant/components/solarlog/strings.json b/homeassistant/components/solarlog/strings.json index fe4b8540f4b0..6d54e5a8be98 100644 --- a/homeassistant/components/solarlog/strings.json +++ b/homeassistant/components/solarlog/strings.json @@ -1,5 +1,4 @@ { - "title": "Solar-Log", "config": { "step": { "user": { @@ -14,8 +13,6 @@ "already_configured": "Device is already configured", "cannot_connect": "Failed to connect, please verify host address" }, - "abort": { - "already_configured": "Device is already configured" - } + "abort": { "already_configured": "Device is already configured" } } } diff --git a/homeassistant/components/soma/strings.json b/homeassistant/components/soma/strings.json index 50570f8f396b..7b82a658a722 100644 --- a/homeassistant/components/soma/strings.json +++ b/homeassistant/components/soma/strings.json @@ -1,5 +1,4 @@ { - "title": "Soma", "config": { "abort": { "already_setup": "You can only configure one Soma account.", @@ -8,15 +7,10 @@ "result_error": "SOMA Connect responded with error status.", "connection_error": "Failed to connect to SOMA Connect." }, - "create_entry": { - "default": "Successfully authenticated with Soma." - }, + "create_entry": { "default": "Successfully authenticated with Soma." }, "step": { "user": { - "data": { - "host": "Host", - "port": "Port" - }, + "data": { "host": "Host", "port": "Port" }, "description": "Please enter connection settings of your SOMA Connect.", "title": "SOMA Connect" } diff --git a/homeassistant/components/somfy/manifest.json b/homeassistant/components/somfy/manifest.json index 82e62e7dd08e..6e15b01e9614 100644 --- a/homeassistant/components/somfy/manifest.json +++ b/homeassistant/components/somfy/manifest.json @@ -1,6 +1,6 @@ { "domain": "somfy", - "name": "Somfy Open API", + "name": "Somfy", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/somfy", "dependencies": ["http"], diff --git a/homeassistant/components/somfy/strings.json b/homeassistant/components/somfy/strings.json index 2b6dff2c0fa1..90ea98f7a870 100644 --- a/homeassistant/components/somfy/strings.json +++ b/homeassistant/components/somfy/strings.json @@ -1,18 +1,13 @@ { - "title": "Somfy", "config": { "step": { - "pick_implementation": { - "title": "Pick Authentication Method" - } + "pick_implementation": { "title": "Pick Authentication Method" } }, "abort": { "already_setup": "You can only configure one Somfy account.", "authorize_url_timeout": "Timeout generating authorize url.", "missing_configuration": "The Somfy component is not configured. Please follow the documentation." }, - "create_entry": { - "default": "Successfully authenticated with Somfy." - } + "create_entry": { "default": "Successfully authenticated with Somfy." } } } diff --git a/homeassistant/components/sonos/strings.json b/homeassistant/components/sonos/strings.json index e5b81fe2c9a3..b20ed95b4100 100644 --- a/homeassistant/components/sonos/strings.json +++ b/homeassistant/components/sonos/strings.json @@ -1,5 +1,4 @@ { - "title": "Sonos", "config": { "step": { "confirm": { diff --git a/homeassistant/components/spotify/strings.json b/homeassistant/components/spotify/strings.json index fe12c6cedad7..c7831e31ca4d 100644 --- a/homeassistant/components/spotify/strings.json +++ b/homeassistant/components/spotify/strings.json @@ -1,18 +1,13 @@ { - "title": "Spotify", "config": { "step": { - "pick_implementation": { - "title": "Pick Authentication Method" - } + "pick_implementation": { "title": "Pick Authentication Method" } }, "abort": { "already_setup": "You can only configure one Spotify account.", "authorize_url_timeout": "Timeout generating authorize url.", "missing_configuration": "The Spotify integration is not configured. Please follow the documentation." }, - "create_entry": { - "default": "Successfully authenticated with Spotify." - } + "create_entry": { "default": "Successfully authenticated with Spotify." } } } diff --git a/homeassistant/components/starline/strings.json b/homeassistant/components/starline/strings.json index d51199499534..41d303b78768 100644 --- a/homeassistant/components/starline/strings.json +++ b/homeassistant/components/starline/strings.json @@ -1,36 +1,25 @@ { - "title": "StarLine", "config": { "step": { "auth_app": { "title": "Application credentials", "description": "Application ID and secret code from StarLine developer account", - "data": { - "app_id": "App ID", - "app_secret": "Secret" - } + "data": { "app_id": "App ID", "app_secret": "Secret" } }, "auth_user": { "title": "User credentials", "description": "StarLine account email and password", - "data": { - "username": "Username", - "password": "Password" - } + "data": { "username": "Username", "password": "Password" } }, "auth_mfa": { "title": "Two-factor authorization", "description": "Enter the code sent to phone {phone_number}", - "data": { - "mfa_code": "SMS code" - } + "data": { "mfa_code": "SMS code" } }, "auth_captcha": { "title": "Captcha", "description": "{captcha_img}", - "data": { - "captcha_code": "Code from image" - } + "data": { "captcha_code": "Code from image" } } }, "error": { diff --git a/homeassistant/components/synology_dsm/strings.json b/homeassistant/components/synology_dsm/strings.json index 49d9e2974efd..f865ca000274 100644 --- a/homeassistant/components/synology_dsm/strings.json +++ b/homeassistant/components/synology_dsm/strings.json @@ -1,5 +1,4 @@ { - "title": "Synology DSM", "config": { "flow_title": "Synology DSM {name} ({host})", "step": { @@ -30,8 +29,6 @@ "login": "Login error: please check your username & password", "unknown": "Unknown error: please retry later or an other configuration" }, - "abort": { - "already_configured": "Host already configured" - } + "abort": { "already_configured": "Host already configured" } } } diff --git a/homeassistant/components/tado/strings.json b/homeassistant/components/tado/strings.json index 65d0462486d2..1192ba544d97 100644 --- a/homeassistant/components/tado/strings.json +++ b/homeassistant/components/tado/strings.json @@ -1,15 +1,9 @@ { - "title": "Tado", "config": { - "abort": { - "already_configured": "Device is already configured" - }, + "abort": { "already_configured": "Device is already configured" }, "step": { "user": { - "data": { - "password": "Password", - "username": "Username" - }, + "data": { "password": "Password", "username": "Username" }, "title": "Connect to your Tado account" } }, @@ -24,9 +18,7 @@ "step": { "init": { "description": "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", - "data": { - "fallback": "Enable fallback mode." - }, + "data": { "fallback": "Enable fallback mode." }, "title": "Adjust Tado options." } } diff --git a/homeassistant/components/tellduslive/strings.json b/homeassistant/components/tellduslive/strings.json index 3668209ac6c0..d94b8965ce8a 100644 --- a/homeassistant/components/tellduslive/strings.json +++ b/homeassistant/components/tellduslive/strings.json @@ -1,5 +1,4 @@ { - "title": "Telldus Live", "config": { "abort": { "already_setup": "TelldusLive is already configured", @@ -7,20 +6,13 @@ "authorize_url_timeout": "Timeout generating authorize url.", "unknown": "Unknown error occurred" }, - "error": { - "auth_error": "Authentication error, please try again" - }, + "error": { "auth_error": "Authentication error, please try again" }, "step": { "auth": { "description": "To link your TelldusLive account:\n 1. Click the link below\n 2. Login to Telldus Live\n 3. Authorize **{app_name}** (click **Yes**).\n 4. Come back here and click **SUBMIT**.\n\n [Link TelldusLive account]({auth_url})", "title": "Authenticate against TelldusLive" }, - "user": { - "data": { - "host": "Host" - }, - "title": "Pick endpoint." - } + "user": { "data": { "host": "Host" }, "title": "Pick endpoint." } } } } diff --git a/homeassistant/components/tesla/strings.json b/homeassistant/components/tesla/strings.json index 5c66562cbbd5..7a15e5d35d91 100644 --- a/homeassistant/components/tesla/strings.json +++ b/homeassistant/components/tesla/strings.json @@ -1,5 +1,4 @@ { - "title": "Tesla", "config": { "error": { "connection_error": "Error connecting; check network and retry", @@ -9,10 +8,7 @@ }, "step": { "user": { - "data": { - "username": "Email Address", - "password": "Password" - }, + "data": { "username": "Email Address", "password": "Password" }, "description": "Please enter your information.", "title": "Tesla - Configuration" } diff --git a/homeassistant/components/toon/strings.json b/homeassistant/components/toon/strings.json index 11447a72d2a7..3ab64dafa244 100644 --- a/homeassistant/components/toon/strings.json +++ b/homeassistant/components/toon/strings.json @@ -1,5 +1,4 @@ { - "title": "Toon", "config": { "step": { "authenticate": { @@ -14,9 +13,7 @@ "display": { "title": "Select display", "description": "Select the Toon display to connect with.", - "data": { - "display": "Choose display" - } + "data": { "display": "Choose display" } } }, "error": { diff --git a/homeassistant/components/totalconnect/strings.json b/homeassistant/components/totalconnect/strings.json index e2883db8d7d8..0ce98c7c4d42 100644 --- a/homeassistant/components/totalconnect/strings.json +++ b/homeassistant/components/totalconnect/strings.json @@ -1,20 +1,12 @@ { - "title": "Total Connect", "config": { "step": { "user": { "title": "Total Connect", - "data": { - "username": "Username", - "password": "Password" - } + "data": { "username": "Username", "password": "Password" } } }, - "error": { - "login": "Login error: please check your username & password" - }, - "abort": { - "already_configured": "Account already configured" - } + "error": { "login": "Login error: please check your username & password" }, + "abort": { "already_configured": "Account already configured" } } } diff --git a/homeassistant/components/tplink/strings.json b/homeassistant/components/tplink/strings.json index fd9f4c982432..f462f411bf78 100644 --- a/homeassistant/components/tplink/strings.json +++ b/homeassistant/components/tplink/strings.json @@ -1,5 +1,4 @@ { - "title": "TP-Link Smart Home", "config": { "step": { "confirm": { diff --git a/homeassistant/components/traccar/strings.json b/homeassistant/components/traccar/strings.json index f70795f2f636..8574f4f34f11 100644 --- a/homeassistant/components/traccar/strings.json +++ b/homeassistant/components/traccar/strings.json @@ -1,5 +1,4 @@ { - "title": "Traccar", "config": { "step": { "user": { diff --git a/homeassistant/components/tradfri/manifest.json b/homeassistant/components/tradfri/manifest.json index 9052a2280885..ce88766039b2 100644 --- a/homeassistant/components/tradfri/manifest.json +++ b/homeassistant/components/tradfri/manifest.json @@ -1,6 +1,6 @@ { "domain": "tradfri", - "name": "IKEA TRÅDFRI (TRADFRI)", + "name": "IKEA TRÅDFRI", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tradfri", "requirements": ["pytradfri[async]==6.4.0"], diff --git a/homeassistant/components/tradfri/strings.json b/homeassistant/components/tradfri/strings.json index d1324b9afb91..5f33549260db 100644 --- a/homeassistant/components/tradfri/strings.json +++ b/homeassistant/components/tradfri/strings.json @@ -1,14 +1,10 @@ { - "title": "IKEA TRÅDFRI", "config": { "step": { "auth": { "title": "Enter security code", "description": "You can find the security code on the back of your gateway.", - "data": { - "host": "Host", - "security_code": "Security Code" - } + "data": { "host": "Host", "security_code": "Security Code" } } }, "error": { diff --git a/homeassistant/components/transmission/strings.json b/homeassistant/components/transmission/strings.json index e5ea812a1321..ef8f49ab3d16 100644 --- a/homeassistant/components/transmission/strings.json +++ b/homeassistant/components/transmission/strings.json @@ -1,5 +1,4 @@ { - "title": "Transmission", "config": { "step": { "user": { @@ -18,17 +17,13 @@ "wrong_credentials": "Wrong username or password", "cannot_connect": "Unable to Connect to host" }, - "abort": { - "already_configured": "Host is already configured." - } + "abort": { "already_configured": "Host is already configured." } }, "options": { "step": { "init": { "title": "Configure options for Transmission", - "data": { - "scan_interval": "Update frequency" - } + "data": { "scan_interval": "Update frequency" } } } } diff --git a/homeassistant/components/twentemilieu/strings.json b/homeassistant/components/twentemilieu/strings.json index f5110e7bf88d..75005e7cb37a 100644 --- a/homeassistant/components/twentemilieu/strings.json +++ b/homeassistant/components/twentemilieu/strings.json @@ -1,5 +1,4 @@ { - "title": "Twente Milieu", "config": { "step": { "user": { @@ -16,8 +15,6 @@ "connection_error": "Failed to connect.", "invalid_address": "Address not found in Twente Milieu service area." }, - "abort": { - "address_exists": "Address already set up." - } + "abort": { "address_exists": "Address already set up." } } } diff --git a/homeassistant/components/twilio/strings.json b/homeassistant/components/twilio/strings.json index c766993d4544..96e0249df9a8 100644 --- a/homeassistant/components/twilio/strings.json +++ b/homeassistant/components/twilio/strings.json @@ -1,5 +1,4 @@ { - "title": "Twilio", "config": { "step": { "user": { diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index 50f29de9104b..40f4e1f50086 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -1,5 +1,4 @@ { - "title": "UniFi Controller", "config": { "step": { "user": { @@ -26,9 +25,7 @@ }, "options": { "step": { - "init": { - "data": {} - }, + "init": { "data": {} }, "device_tracker": { "data": { "detection_time": "Time in seconds from last seen until considered away", diff --git a/homeassistant/components/upnp/strings.json b/homeassistant/components/upnp/strings.json index be5aab88f211..8c1c3fa237ef 100644 --- a/homeassistant/components/upnp/strings.json +++ b/homeassistant/components/upnp/strings.json @@ -1,10 +1,7 @@ { - "title": "UPnP/IGD", "config": { "step": { - "init": { - "title": "UPnP/IGD" - }, + "init": { "title": "UPnP/IGD" }, "confirm": { "title": "UPnP/IGD", "description": "Do you want to set up UPnP/IGD?" diff --git a/homeassistant/components/velbus/strings.json b/homeassistant/components/velbus/strings.json index 700fd26aaff1..d5f9d4e7ccfc 100644 --- a/homeassistant/components/velbus/strings.json +++ b/homeassistant/components/velbus/strings.json @@ -1,5 +1,4 @@ { - "title": "Velbus interface", "config": { "step": { "user": { @@ -14,8 +13,6 @@ "port_exists": "This port is already configured", "connection_failed": "The velbus connection failed" }, - "abort": { - "port_exists": "This port is already configured" - } + "abort": { "port_exists": "This port is already configured" } } } diff --git a/homeassistant/components/vera/strings.json b/homeassistant/components/vera/strings.json index 17cb2ad85c68..7b294eddbb9d 100644 --- a/homeassistant/components/vera/strings.json +++ b/homeassistant/components/vera/strings.json @@ -1,5 +1,4 @@ { - "title": "Vera", "config": { "abort": { "already_configured": "A controller is already configured.", diff --git a/homeassistant/components/vesync/strings.json b/homeassistant/components/vesync/strings.json index 183892042b36..80c934c98dbf 100644 --- a/homeassistant/components/vesync/strings.json +++ b/homeassistant/components/vesync/strings.json @@ -1,20 +1,12 @@ { - "title": "VeSync", "config": { "step": { "user": { "title": "Enter Username and Password", - "data": { - "username": "Email Address", - "password": "Password" - } + "data": { "username": "Email Address", "password": "Password" } } }, - "error": { - "invalid_login": "Invalid username or password" - }, - "abort": { - "already_setup": "Only one Vesync instance is allowed" - } + "error": { "invalid_login": "Invalid username or password" }, + "abort": { "already_setup": "Only one Vesync instance is allowed" } } } diff --git a/homeassistant/components/vilfo/strings.json b/homeassistant/components/vilfo/strings.json index ec4f7b41a2e0..399e30446e96 100644 --- a/homeassistant/components/vilfo/strings.json +++ b/homeassistant/components/vilfo/strings.json @@ -1,5 +1,4 @@ { - "title": "Vilfo Router", "config": { "step": { "user": { diff --git a/homeassistant/components/vizio/strings.json b/homeassistant/components/vizio/strings.json index a3773d839500..3a9766c207b5 100644 --- a/homeassistant/components/vizio/strings.json +++ b/homeassistant/components/vizio/strings.json @@ -1,5 +1,4 @@ { - "title": "VIZIO SmartCast", "config": { "step": { "user": { @@ -15,9 +14,7 @@ "pair_tv": { "title": "Complete Pairing Process", "description": "Your TV should be displaying a code. Enter that code into the form and then continue to the next step to complete the pairing.", - "data": { - "pin": "PIN" - } + "data": { "pin": "PIN" } }, "pairing_complete": { "title": "Pairing Complete", diff --git a/homeassistant/components/wemo/strings.json b/homeassistant/components/wemo/strings.json index 84ffc9399377..41138029e60c 100644 --- a/homeassistant/components/wemo/strings.json +++ b/homeassistant/components/wemo/strings.json @@ -1,5 +1,4 @@ { - "title": "Wemo", "config": { "step": { "confirm": { diff --git a/homeassistant/components/withings/strings.json b/homeassistant/components/withings/strings.json index 908a122daa28..b4f5123d5af9 100644 --- a/homeassistant/components/withings/strings.json +++ b/homeassistant/components/withings/strings.json @@ -1,13 +1,10 @@ { - "title": "Withings", "config": { "step": { "profile": { "title": "User Profile.", "description": "Which profile did you select on the Withings website? It's important the profiles match, otherwise data will be mis-labeled.", - "data": { - "profile": "Profile" - } + "data": { "profile": "Profile" } }, "pick_implementation": { "title": "Pick Authentication Method" } }, @@ -15,8 +12,6 @@ "authorize_url_timeout": "Timeout generating authorize url.", "missing_configuration": "The Withings integration is not configured. Please follow the documentation." }, - "create_entry": { - "default": "Successfully authenticated with Withings." - } + "create_entry": { "default": "Successfully authenticated with Withings." } } } diff --git a/homeassistant/components/wled/strings.json b/homeassistant/components/wled/strings.json index 1f69203992aa..3900d0cb5f0f 100644 --- a/homeassistant/components/wled/strings.json +++ b/homeassistant/components/wled/strings.json @@ -1,23 +1,18 @@ { - "title": "WLED", "config": { "flow_title": "WLED: {name}", "step": { "user": { "title": "Link your WLED", "description": "Set up your WLED to integrate with Home Assistant.", - "data": { - "host": "Host or IP address" - } + "data": { "host": "Host or IP address" } }, "zeroconf_confirm": { "description": "Do you want to add the WLED named `{name}` to Home Assistant?", "title": "Discovered WLED device" } }, - "error": { - "connection_error": "Failed to connect to WLED device." - }, + "error": { "connection_error": "Failed to connect to WLED device." }, "abort": { "already_configured": "This WLED device is already configured.", "connection_error": "Failed to connect to WLED device." diff --git a/homeassistant/components/wwlln/strings.json b/homeassistant/components/wwlln/strings.json index f02c5cebdcb2..c3c9193df33a 100644 --- a/homeassistant/components/wwlln/strings.json +++ b/homeassistant/components/wwlln/strings.json @@ -1,5 +1,4 @@ { - "title": "World Wide Lightning Location Network (WWLLN)", "config": { "step": { "user": { @@ -11,8 +10,6 @@ } } }, - "abort": { - "already_configured": "This location is already registered." - } + "abort": { "already_configured": "This location is already registered." } } } diff --git a/homeassistant/components/zha/strings.json b/homeassistant/components/zha/strings.json index 99d21c2886a2..755ba7ae7102 100644 --- a/homeassistant/components/zha/strings.json +++ b/homeassistant/components/zha/strings.json @@ -1,27 +1,18 @@ { - "title": "ZHA", "config": { "step": { "user": { "title": "ZHA", - "data": { - "radio_type": "Radio Type", - "usb_path": "USB Device Path" - } + "data": { "radio_type": "Radio Type", "usb_path": "USB Device Path" } } }, - "error": { - "cannot_connect": "Unable to connect to ZHA device." - }, + "error": { "cannot_connect": "Unable to connect to ZHA device." }, "abort": { "single_instance_allowed": "Only a single configuration of ZHA is allowed." } }, "device_automation": { - "action_type": { - "squawk": "Squawk", - "warn": "Warn" - }, + "action_type": { "squawk": "Squawk", "warn": "Warn" }, "trigger_type": { "remote_button_short_press": "\"{subtype}\" button pressed", "remote_button_short_release": "\"{subtype}\" button released", diff --git a/homeassistant/components/zwave/strings.json b/homeassistant/components/zwave/strings.json index 393d7f6b7db5..f1bbad0ec0fa 100644 --- a/homeassistant/components/zwave/strings.json +++ b/homeassistant/components/zwave/strings.json @@ -1,5 +1,4 @@ { - "title": "Z-Wave", "config": { "step": { "user": { diff --git a/script/translations/migrate.py b/script/translations/migrate.py index a292c3b443bd..65d26a47f6ae 100644 --- a/script/translations/migrate.py +++ b/script/translations/migrate.py @@ -138,16 +138,31 @@ def find_different_languages(): print("Frontend minus core", frontend_languages - core_languages) +def interactive_update(): + """Interactive update integration strings.""" + for integration in INTEGRATIONS_DIR.iterdir(): + strings_file = integration / "strings.json" + + if not strings_file.is_file(): + continue + + strings = json.loads(strings_file.read_text()) + + if "title" not in strings: + continue + + manifest = json.loads((integration / "manifest.json").read_text()) + + print("Processing", manifest["name"]) + print("Translation title", strings["title"]) + if input("Drop title? (1=yes, 2=no) ") == "1": + strings.pop("title") + strings_file.write_text(json.dumps(strings)) + print() + + def run(): """Migrate translations.""" - # find_different_languages() - migrate_project_keys_translations( - FRONTEND_PROJECT_ID, - CORE_PROJECT_ID, - { - "domain::binary_sensor": "component::binary_sensor::title", - "domain::sensor": "component::sensor::title", - }, - ) + interactive_update() return 0 From 0d60d40512fae2d8ae16cdb7e489bdddac770de5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 13:00:10 -0700 Subject: [PATCH 449/653] Update translations --- .../.translations/history_graph.af.json | 3 ++ .../.translations/history_graph.ar.json | 3 ++ .../.translations/history_graph.bg.json | 3 ++ .../.translations/history_graph.bs.json | 3 ++ .../.translations/history_graph.ca.json | 3 ++ .../.translations/history_graph.cs.json | 3 ++ .../.translations/history_graph.cy.json | 3 ++ .../.translations/history_graph.da.json | 3 ++ .../.translations/history_graph.de.json | 3 ++ .../.translations/history_graph.el.json | 3 ++ .../.translations/history_graph.en.json | 3 ++ .../.translations/history_graph.es-419.json | 3 ++ .../.translations/history_graph.es.json | 3 ++ .../.translations/history_graph.et.json | 3 ++ .../.translations/history_graph.fi.json | 3 ++ .../.translations/history_graph.fr.json | 3 ++ .../.translations/history_graph.he.json | 3 ++ .../.translations/history_graph.hi.json | 3 ++ .../.translations/history_graph.hr.json | 3 ++ .../.translations/history_graph.hu.json | 3 ++ .../.translations/history_graph.hy.json | 3 ++ .../.translations/history_graph.id.json | 3 ++ .../.translations/history_graph.is.json | 3 ++ .../.translations/history_graph.it.json | 3 ++ .../.translations/history_graph.ko.json | 3 ++ .../.translations/history_graph.lb.json | 3 ++ .../.translations/history_graph.lv.json | 3 ++ .../.translations/history_graph.nb.json | 3 ++ .../.translations/history_graph.nl.json | 3 ++ .../.translations/history_graph.nn.json | 3 ++ .../.translations/history_graph.pl.json | 3 ++ .../.translations/history_graph.pt-BR.json | 3 ++ .../.translations/history_graph.pt.json | 3 ++ .../.translations/history_graph.ro.json | 3 ++ .../.translations/history_graph.ru.json | 3 ++ .../.translations/history_graph.sk.json | 3 ++ .../.translations/history_graph.sl.json | 3 ++ .../.translations/history_graph.sv.json | 3 ++ .../.translations/history_graph.te.json | 3 ++ .../.translations/history_graph.th.json | 3 ++ .../.translations/history_graph.tr.json | 3 ++ .../.translations/history_graph.uk.json | 3 ++ .../.translations/history_graph.vi.json | 3 ++ .../.translations/history_graph.zh-Hans.json | 3 ++ .../.translations/history_graph.zh-Hant.json | 3 ++ .../components/.translations/weblink.af.json | 3 ++ .../components/.translations/weblink.ar.json | 3 ++ .../components/.translations/weblink.bg.json | 3 ++ .../components/.translations/weblink.bs.json | 3 ++ .../components/.translations/weblink.ca.json | 3 ++ .../components/.translations/weblink.cs.json | 3 ++ .../components/.translations/weblink.cy.json | 3 ++ .../components/.translations/weblink.da.json | 3 ++ .../components/.translations/weblink.de.json | 3 ++ .../components/.translations/weblink.el.json | 3 ++ .../components/.translations/weblink.en.json | 3 ++ .../.translations/weblink.es-419.json | 3 ++ .../components/.translations/weblink.es.json | 3 ++ .../components/.translations/weblink.et.json | 3 ++ .../components/.translations/weblink.fa.json | 3 ++ .../components/.translations/weblink.fi.json | 3 ++ .../components/.translations/weblink.fr.json | 3 ++ .../components/.translations/weblink.gsw.json | 3 ++ .../components/.translations/weblink.he.json | 3 ++ .../components/.translations/weblink.hi.json | 3 ++ .../components/.translations/weblink.hr.json | 3 ++ .../components/.translations/weblink.hu.json | 3 ++ .../components/.translations/weblink.hy.json | 3 ++ .../components/.translations/weblink.id.json | 3 ++ .../components/.translations/weblink.is.json | 3 ++ .../components/.translations/weblink.it.json | 3 ++ .../components/.translations/weblink.ko.json | 3 ++ .../components/.translations/weblink.lb.json | 3 ++ .../components/.translations/weblink.lv.json | 3 ++ .../components/.translations/weblink.nb.json | 3 ++ .../components/.translations/weblink.nl.json | 3 ++ .../components/.translations/weblink.nn.json | 3 ++ .../components/.translations/weblink.pl.json | 3 ++ .../.translations/weblink.pt-BR.json | 3 ++ .../components/.translations/weblink.pt.json | 3 ++ .../components/.translations/weblink.ro.json | 3 ++ .../components/.translations/weblink.ru.json | 3 ++ .../components/.translations/weblink.sk.json | 3 ++ .../components/.translations/weblink.sl.json | 3 ++ .../components/.translations/weblink.sv.json | 3 ++ .../components/.translations/weblink.ta.json | 3 ++ .../components/.translations/weblink.te.json | 3 ++ .../components/.translations/weblink.th.json | 3 ++ .../components/.translations/weblink.tr.json | 3 ++ .../components/.translations/weblink.uk.json | 3 ++ .../components/.translations/weblink.vi.json | 3 ++ .../.translations/weblink.zh-Hans.json | 3 ++ .../.translations/weblink.zh-Hant.json | 3 ++ .../components/abode/.translations/bg.json | 3 +- .../components/abode/.translations/ca.json | 3 +- .../components/abode/.translations/cs.json | 3 +- .../components/abode/.translations/da.json | 3 +- .../components/abode/.translations/de.json | 3 +- .../components/abode/.translations/en.json | 3 +- .../abode/.translations/es-419.json | 3 +- .../components/abode/.translations/es.json | 3 +- .../components/abode/.translations/fr.json | 3 +- .../components/abode/.translations/hu.json | 3 +- .../components/abode/.translations/it.json | 3 +- .../components/abode/.translations/ko.json | 3 +- .../components/abode/.translations/lb.json | 3 +- .../components/abode/.translations/nl.json | 3 +- .../components/abode/.translations/no.json | 3 +- .../components/abode/.translations/pl.json | 3 +- .../components/abode/.translations/pt-BR.json | 3 +- .../components/abode/.translations/pt.json | 3 +- .../components/abode/.translations/ru.json | 3 +- .../components/abode/.translations/sl.json | 3 +- .../components/abode/.translations/sv.json | 3 +- .../abode/.translations/zh-Hant.json | 3 +- .../components/adguard/.translations/bg.json | 3 +- .../components/adguard/.translations/ca.json | 3 +- .../components/adguard/.translations/da.json | 3 +- .../components/adguard/.translations/de.json | 3 +- .../components/adguard/.translations/en.json | 3 +- .../adguard/.translations/es-419.json | 3 +- .../components/adguard/.translations/es.json | 3 +- .../components/adguard/.translations/fr.json | 3 +- .../components/adguard/.translations/it.json | 3 +- .../components/adguard/.translations/ko.json | 3 +- .../components/adguard/.translations/lb.json | 3 +- .../components/adguard/.translations/nl.json | 3 +- .../components/adguard/.translations/nn.json | 3 +- .../components/adguard/.translations/no.json | 3 +- .../components/adguard/.translations/pl.json | 3 +- .../adguard/.translations/pt-BR.json | 3 +- .../components/adguard/.translations/ru.json | 3 +- .../components/adguard/.translations/sl.json | 3 +- .../components/adguard/.translations/sv.json | 3 +- .../adguard/.translations/zh-Hant.json | 3 +- .../components/airly/.translations/bg.json | 3 +- .../components/airly/.translations/ca.json | 3 +- .../components/airly/.translations/da.json | 3 +- .../components/airly/.translations/de.json | 3 +- .../components/airly/.translations/en.json | 3 +- .../airly/.translations/es-419.json | 3 +- .../components/airly/.translations/es.json | 3 +- .../components/airly/.translations/fr.json | 3 +- .../components/airly/.translations/hu.json | 3 +- .../components/airly/.translations/it.json | 3 +- .../components/airly/.translations/ko.json | 3 +- .../components/airly/.translations/lb.json | 3 +- .../components/airly/.translations/nl.json | 3 +- .../components/airly/.translations/nn.json | 3 +- .../components/airly/.translations/no.json | 3 +- .../components/airly/.translations/pl.json | 3 +- .../components/airly/.translations/pt.json | 3 +- .../components/airly/.translations/ru.json | 3 +- .../components/airly/.translations/sl.json | 3 +- .../components/airly/.translations/sv.json | 3 +- .../airly/.translations/zh-Hant.json | 3 +- .../airvisual/.translations/ca.json | 3 +- .../airvisual/.translations/de.json | 3 +- .../airvisual/.translations/en.json | 3 +- .../airvisual/.translations/es-419.json | 3 +- .../airvisual/.translations/es.json | 3 +- .../airvisual/.translations/fr.json | 3 +- .../airvisual/.translations/it.json | 3 +- .../airvisual/.translations/ko.json | 3 +- .../airvisual/.translations/lb.json | 3 +- .../airvisual/.translations/no.json | 3 +- .../airvisual/.translations/pl.json | 3 +- .../airvisual/.translations/ru.json | 3 +- .../airvisual/.translations/sl.json | 5 +- .../airvisual/.translations/zh-Hant.json | 3 +- .../alarm_control_panel/.translations/af.json | 3 ++ .../alarm_control_panel/.translations/ar.json | 3 ++ .../alarm_control_panel/.translations/bg.json | 3 +- .../alarm_control_panel/.translations/bs.json | 3 ++ .../alarm_control_panel/.translations/ca.json | 3 +- .../alarm_control_panel/.translations/cs.json | 3 +- .../alarm_control_panel/.translations/cy.json | 3 ++ .../alarm_control_panel/.translations/da.json | 3 +- .../alarm_control_panel/.translations/de.json | 3 +- .../alarm_control_panel/.translations/el.json | 3 ++ .../alarm_control_panel/.translations/en.json | 3 +- .../.translations/es-419.json | 3 +- .../alarm_control_panel/.translations/es.json | 3 +- .../alarm_control_panel/.translations/et.json | 3 ++ .../alarm_control_panel/.translations/eu.json | 3 ++ .../alarm_control_panel/.translations/fa.json | 3 ++ .../alarm_control_panel/.translations/fi.json | 3 ++ .../alarm_control_panel/.translations/fr.json | 3 +- .../alarm_control_panel/.translations/he.json | 3 ++ .../alarm_control_panel/.translations/hr.json | 3 ++ .../alarm_control_panel/.translations/hu.json | 3 +- .../alarm_control_panel/.translations/hy.json | 3 ++ .../alarm_control_panel/.translations/id.json | 3 ++ .../alarm_control_panel/.translations/is.json | 3 ++ .../alarm_control_panel/.translations/it.json | 3 +- .../alarm_control_panel/.translations/ko.json | 3 +- .../alarm_control_panel/.translations/lb.json | 3 +- .../alarm_control_panel/.translations/lv.json | 3 ++ .../alarm_control_panel/.translations/nb.json | 3 ++ .../alarm_control_panel/.translations/nl.json | 3 +- .../alarm_control_panel/.translations/nn.json | 3 ++ .../alarm_control_panel/.translations/pl.json | 3 +- .../.translations/pt-BR.json | 3 +- .../alarm_control_panel/.translations/pt.json | 3 +- .../alarm_control_panel/.translations/ro.json | 3 ++ .../alarm_control_panel/.translations/ru.json | 3 +- .../alarm_control_panel/.translations/sk.json | 3 ++ .../alarm_control_panel/.translations/sl.json | 3 +- .../alarm_control_panel/.translations/sv.json | 3 +- .../alarm_control_panel/.translations/te.json | 3 ++ .../alarm_control_panel/.translations/th.json | 3 ++ .../alarm_control_panel/.translations/tr.json | 3 ++ .../alarm_control_panel/.translations/uk.json | 3 ++ .../alarm_control_panel/.translations/vi.json | 3 ++ .../.translations/zh-Hans.json | 3 ++ .../.translations/zh-Hant.json | 3 +- .../components/almond/.translations/bg.json | 3 +- .../components/almond/.translations/ca.json | 3 +- .../components/almond/.translations/da.json | 3 +- .../components/almond/.translations/de.json | 3 +- .../components/almond/.translations/en.json | 3 +- .../components/almond/.translations/es.json | 3 +- .../components/almond/.translations/fr.json | 3 +- .../components/almond/.translations/hu.json | 3 +- .../components/almond/.translations/it.json | 3 +- .../components/almond/.translations/ko.json | 3 +- .../components/almond/.translations/lb.json | 3 +- .../components/almond/.translations/nl.json | 3 +- .../components/almond/.translations/no.json | 3 +- .../components/almond/.translations/pl.json | 3 +- .../components/almond/.translations/pt.json | 3 +- .../components/almond/.translations/ru.json | 3 +- .../components/almond/.translations/sl.json | 3 +- .../components/almond/.translations/sv.json | 3 +- .../almond/.translations/zh-Hant.json | 3 +- .../ambiclimate/.translations/bg.json | 3 +- .../ambiclimate/.translations/ca.json | 3 +- .../ambiclimate/.translations/cs.json | 3 +- .../ambiclimate/.translations/da.json | 3 +- .../ambiclimate/.translations/de.json | 3 +- .../ambiclimate/.translations/en.json | 3 +- .../ambiclimate/.translations/es-419.json | 3 +- .../ambiclimate/.translations/es.json | 3 +- .../ambiclimate/.translations/fr.json | 3 +- .../ambiclimate/.translations/it.json | 3 +- .../ambiclimate/.translations/ko.json | 3 +- .../ambiclimate/.translations/lb.json | 3 +- .../ambiclimate/.translations/nl.json | 3 +- .../ambiclimate/.translations/no.json | 3 +- .../ambiclimate/.translations/pl.json | 3 +- .../ambiclimate/.translations/pt-BR.json | 3 +- .../ambiclimate/.translations/ru.json | 3 +- .../ambiclimate/.translations/sl.json | 3 +- .../ambiclimate/.translations/sv.json | 3 +- .../ambiclimate/.translations/zh-Hant.json | 3 +- .../ambient_station/.translations/bg.json | 3 +- .../ambient_station/.translations/ca.json | 3 +- .../ambient_station/.translations/da.json | 3 +- .../ambient_station/.translations/de.json | 3 +- .../ambient_station/.translations/en.json | 3 +- .../ambient_station/.translations/es-419.json | 3 +- .../ambient_station/.translations/es.json | 3 +- .../ambient_station/.translations/fr.json | 3 +- .../ambient_station/.translations/hu.json | 3 +- .../ambient_station/.translations/it.json | 3 +- .../ambient_station/.translations/ko.json | 3 +- .../ambient_station/.translations/lb.json | 3 +- .../ambient_station/.translations/nl.json | 3 +- .../ambient_station/.translations/no.json | 3 +- .../ambient_station/.translations/pl.json | 3 +- .../ambient_station/.translations/pt-BR.json | 3 +- .../ambient_station/.translations/pt.json | 3 +- .../ambient_station/.translations/ru.json | 3 +- .../ambient_station/.translations/sl.json | 3 +- .../ambient_station/.translations/sv.json | 3 +- .../.translations/zh-Hans.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../components/august/.translations/ca.json | 3 +- .../components/august/.translations/da.json | 3 +- .../components/august/.translations/de.json | 3 +- .../components/august/.translations/en.json | 3 +- .../components/august/.translations/es.json | 3 +- .../components/august/.translations/fr.json | 3 +- .../components/august/.translations/it.json | 3 +- .../components/august/.translations/ko.json | 3 +- .../components/august/.translations/lb.json | 3 +- .../components/august/.translations/no.json | 3 +- .../components/august/.translations/ru.json | 3 +- .../components/august/.translations/sl.json | 3 +- .../august/.translations/zh-Hant.json | 3 +- .../automation/.translations/af.json | 3 ++ .../automation/.translations/ar.json | 3 ++ .../automation/.translations/bg.json | 3 ++ .../automation/.translations/bs.json | 3 ++ .../automation/.translations/ca.json | 3 ++ .../automation/.translations/cs.json | 3 ++ .../automation/.translations/cy.json | 3 ++ .../automation/.translations/da.json | 3 ++ .../automation/.translations/de.json | 3 ++ .../automation/.translations/el.json | 3 ++ .../automation/.translations/en.json | 3 ++ .../automation/.translations/es-419.json | 3 ++ .../automation/.translations/es.json | 3 ++ .../automation/.translations/et.json | 3 ++ .../automation/.translations/eu.json | 3 ++ .../automation/.translations/fa.json | 3 ++ .../automation/.translations/fi.json | 3 ++ .../automation/.translations/fr.json | 3 ++ .../automation/.translations/gsw.json | 3 ++ .../automation/.translations/he.json | 3 ++ .../automation/.translations/hi.json | 3 ++ .../automation/.translations/hr.json | 3 ++ .../automation/.translations/hu.json | 3 ++ .../automation/.translations/hy.json | 3 ++ .../automation/.translations/id.json | 3 ++ .../automation/.translations/is.json | 3 ++ .../automation/.translations/it.json | 3 ++ .../automation/.translations/ja.json | 3 ++ .../automation/.translations/ko.json | 3 ++ .../automation/.translations/lb.json | 3 ++ .../automation/.translations/lv.json | 3 ++ .../automation/.translations/nb.json | 3 ++ .../automation/.translations/nl.json | 3 ++ .../automation/.translations/nn.json | 3 ++ .../automation/.translations/pl.json | 3 ++ .../automation/.translations/pt-BR.json | 3 ++ .../automation/.translations/pt.json | 3 ++ .../automation/.translations/ro.json | 3 ++ .../automation/.translations/ru.json | 3 ++ .../automation/.translations/sk.json | 3 ++ .../automation/.translations/sl.json | 3 ++ .../automation/.translations/sv.json | 3 ++ .../automation/.translations/te.json | 3 ++ .../automation/.translations/th.json | 3 ++ .../automation/.translations/tr.json | 3 ++ .../automation/.translations/uk.json | 3 ++ .../automation/.translations/vi.json | 3 ++ .../automation/.translations/zh-Hans.json | 3 ++ .../automation/.translations/zh-Hant.json | 3 ++ .../binary_sensor/.translations/af.json | 3 ++ .../binary_sensor/.translations/ar.json | 3 ++ .../binary_sensor/.translations/bg.json | 3 +- .../binary_sensor/.translations/bs.json | 3 ++ .../binary_sensor/.translations/ca.json | 3 +- .../binary_sensor/.translations/cs.json | 3 +- .../binary_sensor/.translations/cy.json | 3 ++ .../binary_sensor/.translations/da.json | 3 +- .../binary_sensor/.translations/de.json | 3 +- .../binary_sensor/.translations/el.json | 3 ++ .../binary_sensor/.translations/en.json | 3 +- .../binary_sensor/.translations/es-419.json | 3 +- .../binary_sensor/.translations/es.json | 3 +- .../binary_sensor/.translations/et.json | 3 ++ .../binary_sensor/.translations/eu.json | 3 ++ .../binary_sensor/.translations/fa.json | 3 ++ .../binary_sensor/.translations/fi.json | 3 ++ .../binary_sensor/.translations/fr.json | 3 +- .../binary_sensor/.translations/gsw.json | 3 ++ .../binary_sensor/.translations/he.json | 3 ++ .../binary_sensor/.translations/hi.json | 3 ++ .../binary_sensor/.translations/hr.json | 3 ++ .../binary_sensor/.translations/hu.json | 3 +- .../binary_sensor/.translations/hy.json | 3 ++ .../binary_sensor/.translations/id.json | 3 ++ .../binary_sensor/.translations/is.json | 3 ++ .../binary_sensor/.translations/it.json | 3 +- .../binary_sensor/.translations/ja.json | 3 ++ .../binary_sensor/.translations/ko.json | 3 +- .../binary_sensor/.translations/lb.json | 3 +- .../binary_sensor/.translations/lv.json | 3 +- .../binary_sensor/.translations/nb.json | 3 ++ .../binary_sensor/.translations/nl.json | 3 +- .../binary_sensor/.translations/nn.json | 3 ++ .../binary_sensor/.translations/pl.json | 3 +- .../binary_sensor/.translations/pt-BR.json | 3 ++ .../binary_sensor/.translations/pt.json | 3 +- .../binary_sensor/.translations/ro.json | 3 +- .../binary_sensor/.translations/ru.json | 3 +- .../binary_sensor/.translations/sk.json | 3 ++ .../binary_sensor/.translations/sl.json | 3 +- .../binary_sensor/.translations/sv.json | 3 +- .../binary_sensor/.translations/te.json | 3 ++ .../binary_sensor/.translations/th.json | 3 ++ .../binary_sensor/.translations/tr.json | 3 ++ .../binary_sensor/.translations/uk.json | 3 ++ .../binary_sensor/.translations/vi.json | 3 ++ .../binary_sensor/.translations/zh-Hans.json | 3 +- .../binary_sensor/.translations/zh-Hant.json | 3 +- .../components/braviatv/.translations/ca.json | 36 +++++++++++++++ .../components/braviatv/.translations/de.json | 3 +- .../components/braviatv/.translations/en.json | 3 +- .../components/braviatv/.translations/it.json | 3 +- .../components/braviatv/.translations/no.json | 3 +- .../components/braviatv/.translations/pl.json | 3 +- .../components/braviatv/.translations/pt.json | 37 +++++++++++++++ .../components/braviatv/.translations/ru.json | 3 +- .../components/braviatv/.translations/sl.json | 38 +++++++++++++++ .../braviatv/.translations/zh-Hant.json | 3 +- .../components/brother/.translations/ca.json | 3 +- .../components/brother/.translations/da.json | 3 +- .../components/brother/.translations/de.json | 3 +- .../components/brother/.translations/en.json | 3 +- .../brother/.translations/es-419.json | 3 +- .../components/brother/.translations/es.json | 3 +- .../components/brother/.translations/fr.json | 3 +- .../components/brother/.translations/hu.json | 3 +- .../components/brother/.translations/it.json | 3 +- .../components/brother/.translations/ko.json | 3 +- .../components/brother/.translations/lb.json | 3 +- .../components/brother/.translations/nl.json | 3 +- .../components/brother/.translations/no.json | 3 +- .../components/brother/.translations/pl.json | 3 +- .../brother/.translations/pt-BR.json | 3 +- .../components/brother/.translations/ru.json | 3 +- .../components/brother/.translations/sl.json | 3 +- .../components/brother/.translations/sv.json | 3 +- .../brother/.translations/zh-Hant.json | 3 +- .../components/calendar/.translations/af.json | 3 ++ .../components/calendar/.translations/ar.json | 3 ++ .../components/calendar/.translations/bg.json | 3 ++ .../components/calendar/.translations/bs.json | 3 ++ .../components/calendar/.translations/ca.json | 3 ++ .../components/calendar/.translations/cs.json | 3 ++ .../components/calendar/.translations/cy.json | 3 ++ .../components/calendar/.translations/da.json | 3 ++ .../components/calendar/.translations/de.json | 3 ++ .../components/calendar/.translations/el.json | 3 ++ .../components/calendar/.translations/en.json | 3 ++ .../calendar/.translations/es-419.json | 3 ++ .../components/calendar/.translations/es.json | 3 ++ .../components/calendar/.translations/et.json | 3 ++ .../components/calendar/.translations/eu.json | 3 ++ .../components/calendar/.translations/fa.json | 3 ++ .../components/calendar/.translations/fi.json | 3 ++ .../components/calendar/.translations/fr.json | 3 ++ .../calendar/.translations/gsw.json | 3 ++ .../components/calendar/.translations/he.json | 3 ++ .../components/calendar/.translations/hr.json | 3 ++ .../components/calendar/.translations/hu.json | 3 ++ .../components/calendar/.translations/hy.json | 3 ++ .../components/calendar/.translations/id.json | 3 ++ .../components/calendar/.translations/is.json | 3 ++ .../components/calendar/.translations/it.json | 3 ++ .../components/calendar/.translations/ja.json | 3 ++ .../components/calendar/.translations/ko.json | 3 ++ .../components/calendar/.translations/lb.json | 3 ++ .../components/calendar/.translations/lv.json | 3 ++ .../components/calendar/.translations/nb.json | 3 ++ .../components/calendar/.translations/nl.json | 3 ++ .../components/calendar/.translations/nn.json | 3 ++ .../components/calendar/.translations/pl.json | 3 ++ .../calendar/.translations/pt-BR.json | 3 ++ .../components/calendar/.translations/pt.json | 3 ++ .../components/calendar/.translations/ro.json | 3 ++ .../components/calendar/.translations/ru.json | 3 ++ .../components/calendar/.translations/sk.json | 3 ++ .../components/calendar/.translations/sl.json | 3 ++ .../components/calendar/.translations/sv.json | 3 ++ .../components/calendar/.translations/te.json | 3 ++ .../components/calendar/.translations/th.json | 3 ++ .../components/calendar/.translations/tr.json | 3 ++ .../components/calendar/.translations/uk.json | 3 ++ .../components/calendar/.translations/vi.json | 3 ++ .../calendar/.translations/zh-Hans.json | 3 ++ .../calendar/.translations/zh-Hant.json | 3 ++ .../components/camera/.translations/af.json | 3 ++ .../components/camera/.translations/ar.json | 3 ++ .../components/camera/.translations/bg.json | 3 ++ .../components/camera/.translations/bs.json | 3 ++ .../components/camera/.translations/ca.json | 3 ++ .../components/camera/.translations/cs.json | 3 ++ .../components/camera/.translations/cy.json | 3 ++ .../components/camera/.translations/da.json | 3 ++ .../components/camera/.translations/de.json | 3 ++ .../components/camera/.translations/el.json | 3 ++ .../components/camera/.translations/en.json | 3 ++ .../camera/.translations/es-419.json | 3 ++ .../components/camera/.translations/es.json | 3 ++ .../components/camera/.translations/et.json | 3 ++ .../components/camera/.translations/eu.json | 3 ++ .../components/camera/.translations/fa.json | 3 ++ .../components/camera/.translations/fi.json | 3 ++ .../components/camera/.translations/fr.json | 3 ++ .../components/camera/.translations/gsw.json | 3 ++ .../components/camera/.translations/he.json | 3 ++ .../components/camera/.translations/hr.json | 3 ++ .../components/camera/.translations/hu.json | 3 ++ .../components/camera/.translations/hy.json | 3 ++ .../components/camera/.translations/id.json | 3 ++ .../components/camera/.translations/is.json | 3 ++ .../components/camera/.translations/it.json | 3 ++ .../components/camera/.translations/ja.json | 3 ++ .../components/camera/.translations/ko.json | 3 ++ .../components/camera/.translations/lb.json | 3 ++ .../components/camera/.translations/lv.json | 3 ++ .../components/camera/.translations/nb.json | 3 ++ .../components/camera/.translations/nl.json | 3 ++ .../components/camera/.translations/nn.json | 3 ++ .../components/camera/.translations/pl.json | 3 ++ .../camera/.translations/pt-BR.json | 3 ++ .../components/camera/.translations/pt.json | 3 ++ .../components/camera/.translations/ro.json | 3 ++ .../components/camera/.translations/ru.json | 3 ++ .../components/camera/.translations/sk.json | 3 ++ .../components/camera/.translations/sl.json | 3 ++ .../components/camera/.translations/sv.json | 3 ++ .../components/camera/.translations/te.json | 3 ++ .../components/camera/.translations/th.json | 3 ++ .../components/camera/.translations/tr.json | 3 ++ .../components/camera/.translations/uk.json | 3 ++ .../components/camera/.translations/vi.json | 3 ++ .../camera/.translations/zh-Hans.json | 3 ++ .../camera/.translations/zh-Hant.json | 3 ++ .../components/cast/.translations/bg.json | 3 +- .../components/cast/.translations/ca.json | 3 +- .../components/cast/.translations/cs.json | 3 +- .../components/cast/.translations/da.json | 3 +- .../components/cast/.translations/de.json | 3 +- .../components/cast/.translations/en.json | 3 +- .../components/cast/.translations/es-419.json | 3 +- .../components/cast/.translations/es.json | 3 +- .../components/cast/.translations/et.json | 3 +- .../components/cast/.translations/fr.json | 3 +- .../components/cast/.translations/he.json | 3 +- .../components/cast/.translations/hr.json | 3 +- .../components/cast/.translations/hu.json | 3 +- .../components/cast/.translations/id.json | 3 +- .../components/cast/.translations/it.json | 3 +- .../components/cast/.translations/ja.json | 3 +- .../components/cast/.translations/ko.json | 3 +- .../components/cast/.translations/lb.json | 3 +- .../components/cast/.translations/nl.json | 3 +- .../components/cast/.translations/nn.json | 3 +- .../components/cast/.translations/no.json | 3 +- .../components/cast/.translations/pl.json | 3 +- .../components/cast/.translations/pt-BR.json | 3 +- .../components/cast/.translations/pt.json | 3 +- .../components/cast/.translations/ro.json | 3 +- .../components/cast/.translations/ru.json | 3 +- .../components/cast/.translations/sl.json | 3 +- .../components/cast/.translations/sv.json | 3 +- .../components/cast/.translations/th.json | 3 +- .../components/cast/.translations/vi.json | 3 +- .../cast/.translations/zh-Hans.json | 3 +- .../cast/.translations/zh-Hant.json | 3 +- .../components/climate/.translations/af.json | 3 ++ .../components/climate/.translations/ar.json | 3 ++ .../components/climate/.translations/bg.json | 3 +- .../components/climate/.translations/bs.json | 3 ++ .../components/climate/.translations/ca.json | 3 +- .../components/climate/.translations/cs.json | 3 ++ .../components/climate/.translations/cy.json | 3 ++ .../components/climate/.translations/da.json | 3 +- .../components/climate/.translations/de.json | 3 +- .../components/climate/.translations/el.json | 3 ++ .../components/climate/.translations/en.json | 3 +- .../climate/.translations/es-419.json | 3 +- .../components/climate/.translations/es.json | 3 +- .../components/climate/.translations/et.json | 3 ++ .../components/climate/.translations/eu.json | 3 ++ .../components/climate/.translations/fa.json | 3 ++ .../components/climate/.translations/fi.json | 3 ++ .../components/climate/.translations/fr.json | 3 +- .../components/climate/.translations/gsw.json | 3 ++ .../components/climate/.translations/he.json | 3 ++ .../components/climate/.translations/hi.json | 3 ++ .../components/climate/.translations/hr.json | 3 ++ .../components/climate/.translations/hu.json | 3 +- .../components/climate/.translations/hy.json | 3 ++ .../components/climate/.translations/id.json | 3 ++ .../components/climate/.translations/is.json | 3 ++ .../components/climate/.translations/it.json | 3 +- .../components/climate/.translations/ko.json | 3 +- .../components/climate/.translations/lb.json | 3 +- .../components/climate/.translations/lv.json | 3 ++ .../components/climate/.translations/nb.json | 3 ++ .../components/climate/.translations/nl.json | 3 +- .../components/climate/.translations/nn.json | 3 ++ .../components/climate/.translations/pl.json | 3 +- .../climate/.translations/pt-BR.json | 3 ++ .../components/climate/.translations/pt.json | 3 ++ .../components/climate/.translations/ro.json | 3 ++ .../components/climate/.translations/ru.json | 3 +- .../components/climate/.translations/sk.json | 3 ++ .../components/climate/.translations/sl.json | 3 +- .../components/climate/.translations/sv.json | 3 +- .../components/climate/.translations/te.json | 3 ++ .../components/climate/.translations/th.json | 3 ++ .../components/climate/.translations/tr.json | 3 ++ .../components/climate/.translations/uk.json | 3 ++ .../components/climate/.translations/vi.json | 3 ++ .../climate/.translations/zh-Hans.json | 3 +- .../climate/.translations/zh-Hant.json | 3 +- .../configurator/.translations/af.json | 3 ++ .../configurator/.translations/ar.json | 3 ++ .../configurator/.translations/bg.json | 3 ++ .../configurator/.translations/bs.json | 3 ++ .../configurator/.translations/ca.json | 3 ++ .../configurator/.translations/cs.json | 3 ++ .../configurator/.translations/cy.json | 3 ++ .../configurator/.translations/da.json | 3 ++ .../configurator/.translations/de.json | 3 ++ .../configurator/.translations/el.json | 3 ++ .../configurator/.translations/en.json | 3 ++ .../configurator/.translations/es-419.json | 3 ++ .../configurator/.translations/es.json | 3 ++ .../configurator/.translations/et.json | 3 ++ .../configurator/.translations/eu.json | 3 ++ .../configurator/.translations/fa.json | 3 ++ .../configurator/.translations/fi.json | 3 ++ .../configurator/.translations/fr.json | 3 ++ .../configurator/.translations/gsw.json | 3 ++ .../configurator/.translations/he.json | 3 ++ .../configurator/.translations/hr.json | 3 ++ .../configurator/.translations/hu.json | 3 ++ .../configurator/.translations/hy.json | 3 ++ .../configurator/.translations/id.json | 3 ++ .../configurator/.translations/is.json | 3 ++ .../configurator/.translations/it.json | 3 ++ .../configurator/.translations/ko.json | 3 ++ .../configurator/.translations/lb.json | 3 ++ .../configurator/.translations/lv.json | 3 ++ .../configurator/.translations/nb.json | 3 ++ .../configurator/.translations/nl.json | 3 ++ .../configurator/.translations/nn.json | 3 ++ .../configurator/.translations/pl.json | 3 ++ .../configurator/.translations/pt-BR.json | 3 ++ .../configurator/.translations/pt.json | 3 ++ .../configurator/.translations/ro.json | 3 ++ .../configurator/.translations/ru.json | 3 ++ .../configurator/.translations/sk.json | 3 ++ .../configurator/.translations/sl.json | 3 ++ .../configurator/.translations/sv.json | 3 ++ .../configurator/.translations/te.json | 3 ++ .../configurator/.translations/th.json | 3 ++ .../configurator/.translations/tr.json | 3 ++ .../configurator/.translations/uk.json | 3 ++ .../configurator/.translations/vi.json | 3 ++ .../configurator/.translations/zh-Hans.json | 3 ++ .../configurator/.translations/zh-Hant.json | 3 ++ .../conversation/.translations/af.json | 3 ++ .../conversation/.translations/ar.json | 3 ++ .../conversation/.translations/bg.json | 3 ++ .../conversation/.translations/bs.json | 3 ++ .../conversation/.translations/ca.json | 3 ++ .../conversation/.translations/cs.json | 3 ++ .../conversation/.translations/cy.json | 3 ++ .../conversation/.translations/da.json | 3 ++ .../conversation/.translations/de.json | 3 ++ .../conversation/.translations/el.json | 3 ++ .../conversation/.translations/en.json | 3 ++ .../conversation/.translations/es-419.json | 3 ++ .../conversation/.translations/es.json | 3 ++ .../conversation/.translations/et.json | 3 ++ .../conversation/.translations/eu.json | 3 ++ .../conversation/.translations/fa.json | 3 ++ .../conversation/.translations/fi.json | 3 ++ .../conversation/.translations/fr.json | 3 ++ .../conversation/.translations/gsw.json | 3 ++ .../conversation/.translations/he.json | 3 ++ .../conversation/.translations/hr.json | 3 ++ .../conversation/.translations/hu.json | 3 ++ .../conversation/.translations/hy.json | 3 ++ .../conversation/.translations/id.json | 3 ++ .../conversation/.translations/is.json | 3 ++ .../conversation/.translations/it.json | 3 ++ .../conversation/.translations/ko.json | 3 ++ .../conversation/.translations/lb.json | 3 ++ .../conversation/.translations/lv.json | 3 ++ .../conversation/.translations/nb.json | 3 ++ .../conversation/.translations/nl.json | 3 ++ .../conversation/.translations/nn.json | 3 ++ .../conversation/.translations/pl.json | 3 ++ .../conversation/.translations/pt-BR.json | 3 ++ .../conversation/.translations/pt.json | 3 ++ .../conversation/.translations/ro.json | 3 ++ .../conversation/.translations/ru.json | 3 ++ .../conversation/.translations/sk.json | 3 ++ .../conversation/.translations/sl.json | 3 ++ .../conversation/.translations/sv.json | 3 ++ .../conversation/.translations/te.json | 3 ++ .../conversation/.translations/th.json | 3 ++ .../conversation/.translations/tr.json | 3 ++ .../conversation/.translations/uk.json | 3 ++ .../conversation/.translations/vi.json | 3 ++ .../conversation/.translations/zh-Hans.json | 3 ++ .../conversation/.translations/zh-Hant.json | 3 ++ .../coolmaster/.translations/bg.json | 3 +- .../coolmaster/.translations/ca.json | 3 +- .../coolmaster/.translations/cs.json | 3 +- .../coolmaster/.translations/da.json | 3 +- .../coolmaster/.translations/de.json | 3 +- .../coolmaster/.translations/en.json | 3 +- .../coolmaster/.translations/es-419.json | 3 +- .../coolmaster/.translations/es.json | 3 +- .../coolmaster/.translations/fr.json | 3 +- .../coolmaster/.translations/it.json | 3 +- .../coolmaster/.translations/ko.json | 3 +- .../coolmaster/.translations/lb.json | 3 +- .../coolmaster/.translations/nl.json | 3 +- .../coolmaster/.translations/no.json | 3 +- .../coolmaster/.translations/pl.json | 3 +- .../coolmaster/.translations/ru.json | 3 +- .../coolmaster/.translations/sl.json | 3 +- .../coolmaster/.translations/sv.json | 3 +- .../coolmaster/.translations/zh-Hant.json | 3 +- .../coronavirus/.translations/ca.json | 3 +- .../coronavirus/.translations/da.json | 3 +- .../coronavirus/.translations/de.json | 3 +- .../coronavirus/.translations/en.json | 3 +- .../coronavirus/.translations/es.json | 3 +- .../coronavirus/.translations/fr.json | 3 +- .../coronavirus/.translations/hu.json | 3 +- .../coronavirus/.translations/it.json | 3 +- .../coronavirus/.translations/ko.json | 3 +- .../coronavirus/.translations/lb.json | 3 +- .../coronavirus/.translations/no.json | 3 +- .../coronavirus/.translations/pl.json | 3 +- .../coronavirus/.translations/ru.json | 3 +- .../coronavirus/.translations/sl.json | 3 +- .../coronavirus/.translations/zh-Hans.json | 3 +- .../coronavirus/.translations/zh-Hant.json | 3 +- .../components/cover/.translations/af.json | 3 ++ .../components/cover/.translations/ar.json | 3 ++ .../components/cover/.translations/bg.json | 3 +- .../components/cover/.translations/bs.json | 3 ++ .../components/cover/.translations/ca.json | 3 +- .../components/cover/.translations/cs.json | 3 +- .../components/cover/.translations/cy.json | 3 ++ .../components/cover/.translations/da.json | 3 +- .../components/cover/.translations/de.json | 3 +- .../components/cover/.translations/el.json | 3 ++ .../components/cover/.translations/en.json | 3 +- .../cover/.translations/es-419.json | 3 ++ .../components/cover/.translations/es.json | 3 +- .../components/cover/.translations/et.json | 3 ++ .../components/cover/.translations/fa.json | 3 ++ .../components/cover/.translations/fi.json | 3 ++ .../components/cover/.translations/fr.json | 3 +- .../components/cover/.translations/gsw.json | 3 ++ .../components/cover/.translations/he.json | 3 ++ .../components/cover/.translations/hr.json | 3 ++ .../components/cover/.translations/hu.json | 3 +- .../components/cover/.translations/hy.json | 3 ++ .../components/cover/.translations/id.json | 3 ++ .../components/cover/.translations/is.json | 3 ++ .../components/cover/.translations/it.json | 3 +- .../components/cover/.translations/ko.json | 3 +- .../components/cover/.translations/lb.json | 3 +- .../components/cover/.translations/lv.json | 3 ++ .../components/cover/.translations/nb.json | 3 ++ .../components/cover/.translations/nl.json | 3 +- .../components/cover/.translations/nn.json | 3 ++ .../components/cover/.translations/pl.json | 3 +- .../components/cover/.translations/pt-BR.json | 3 ++ .../components/cover/.translations/pt.json | 3 +- .../components/cover/.translations/ro.json | 3 ++ .../components/cover/.translations/ru.json | 3 +- .../components/cover/.translations/sk.json | 3 ++ .../components/cover/.translations/sl.json | 3 +- .../components/cover/.translations/sv.json | 3 +- .../components/cover/.translations/te.json | 3 ++ .../components/cover/.translations/th.json | 3 ++ .../components/cover/.translations/tr.json | 3 ++ .../components/cover/.translations/uk.json | 3 ++ .../components/cover/.translations/vi.json | 3 ++ .../cover/.translations/zh-Hans.json | 3 ++ .../cover/.translations/zh-Hant.json | 3 +- .../components/daikin/.translations/bg.json | 3 +- .../components/daikin/.translations/ca.json | 3 +- .../components/daikin/.translations/da.json | 3 +- .../components/daikin/.translations/de.json | 3 +- .../components/daikin/.translations/en.json | 3 +- .../daikin/.translations/es-419.json | 3 +- .../components/daikin/.translations/es.json | 3 +- .../components/daikin/.translations/fr.json | 3 +- .../components/daikin/.translations/hu.json | 3 +- .../components/daikin/.translations/it.json | 3 +- .../components/daikin/.translations/ko.json | 3 +- .../components/daikin/.translations/lb.json | 3 +- .../components/daikin/.translations/nl.json | 3 +- .../components/daikin/.translations/no.json | 3 +- .../components/daikin/.translations/pl.json | 3 +- .../daikin/.translations/pt-BR.json | 3 +- .../components/daikin/.translations/pt.json | 3 +- .../components/daikin/.translations/ru.json | 3 +- .../components/daikin/.translations/sl.json | 3 +- .../components/daikin/.translations/sv.json | 3 +- .../components/daikin/.translations/th.json | 3 +- .../daikin/.translations/zh-Hans.json | 3 +- .../daikin/.translations/zh-Hant.json | 3 +- .../components/deconz/.translations/bg.json | 3 +- .../components/deconz/.translations/ca.json | 5 +- .../components/deconz/.translations/cs.json | 3 +- .../components/deconz/.translations/cy.json | 3 +- .../components/deconz/.translations/da.json | 3 +- .../components/deconz/.translations/de.json | 3 +- .../components/deconz/.translations/en.json | 3 +- .../deconz/.translations/es-419.json | 3 +- .../components/deconz/.translations/es.json | 3 +- .../components/deconz/.translations/et.json | 3 +- .../components/deconz/.translations/fr.json | 3 +- .../components/deconz/.translations/he.json | 3 +- .../components/deconz/.translations/hu.json | 3 +- .../components/deconz/.translations/id.json | 3 +- .../components/deconz/.translations/it.json | 3 +- .../components/deconz/.translations/ko.json | 3 +- .../components/deconz/.translations/lb.json | 3 +- .../components/deconz/.translations/nl.json | 3 +- .../components/deconz/.translations/nn.json | 3 +- .../components/deconz/.translations/no.json | 3 +- .../components/deconz/.translations/pl.json | 3 +- .../deconz/.translations/pt-BR.json | 3 +- .../components/deconz/.translations/pt.json | 5 +- .../components/deconz/.translations/ru.json | 3 +- .../components/deconz/.translations/sl.json | 5 +- .../components/deconz/.translations/sv.json | 3 +- .../deconz/.translations/zh-Hans.json | 3 +- .../deconz/.translations/zh-Hant.json | 3 +- .../device_tracker/.translations/af.json | 3 ++ .../device_tracker/.translations/ar.json | 3 ++ .../device_tracker/.translations/bg.json | 3 +- .../device_tracker/.translations/bs.json | 3 ++ .../device_tracker/.translations/ca.json | 3 +- .../device_tracker/.translations/cs.json | 3 +- .../device_tracker/.translations/cy.json | 3 ++ .../device_tracker/.translations/da.json | 3 +- .../device_tracker/.translations/de.json | 3 +- .../device_tracker/.translations/el.json | 3 ++ .../device_tracker/.translations/en.json | 3 +- .../device_tracker/.translations/es-419.json | 3 +- .../device_tracker/.translations/es.json | 3 +- .../device_tracker/.translations/et.json | 3 ++ .../device_tracker/.translations/fa.json | 3 ++ .../device_tracker/.translations/fi.json | 3 ++ .../device_tracker/.translations/fr.json | 3 +- .../device_tracker/.translations/he.json | 3 ++ .../device_tracker/.translations/hi.json | 3 ++ .../device_tracker/.translations/hr.json | 3 ++ .../device_tracker/.translations/hu.json | 3 +- .../device_tracker/.translations/hy.json | 3 ++ .../device_tracker/.translations/id.json | 3 ++ .../device_tracker/.translations/is.json | 3 ++ .../device_tracker/.translations/it.json | 3 +- .../device_tracker/.translations/ko.json | 3 +- .../device_tracker/.translations/lb.json | 3 +- .../device_tracker/.translations/lv.json | 3 ++ .../device_tracker/.translations/nb.json | 3 ++ .../device_tracker/.translations/nl.json | 3 +- .../device_tracker/.translations/nn.json | 3 ++ .../device_tracker/.translations/pl.json | 3 +- .../device_tracker/.translations/pt-BR.json | 3 ++ .../device_tracker/.translations/pt.json | 3 +- .../device_tracker/.translations/ro.json | 3 ++ .../device_tracker/.translations/ru.json | 3 +- .../device_tracker/.translations/sk.json | 3 ++ .../device_tracker/.translations/sl.json | 3 +- .../device_tracker/.translations/sv.json | 3 +- .../device_tracker/.translations/te.json | 3 ++ .../device_tracker/.translations/th.json | 3 ++ .../device_tracker/.translations/tr.json | 3 ++ .../device_tracker/.translations/uk.json | 3 ++ .../device_tracker/.translations/vi.json | 3 ++ .../device_tracker/.translations/zh-Hans.json | 3 +- .../device_tracker/.translations/zh-Hant.json | 3 +- .../dialogflow/.translations/bg.json | 3 +- .../dialogflow/.translations/ca.json | 3 +- .../dialogflow/.translations/cs.json | 3 +- .../dialogflow/.translations/da.json | 3 +- .../dialogflow/.translations/de.json | 3 +- .../dialogflow/.translations/en.json | 3 +- .../dialogflow/.translations/es-419.json | 3 +- .../dialogflow/.translations/es.json | 3 +- .../dialogflow/.translations/fr.json | 3 +- .../dialogflow/.translations/hu.json | 3 +- .../dialogflow/.translations/it.json | 3 +- .../dialogflow/.translations/ko.json | 3 +- .../dialogflow/.translations/lb.json | 3 +- .../dialogflow/.translations/nl.json | 3 +- .../dialogflow/.translations/no.json | 3 +- .../dialogflow/.translations/pl.json | 3 +- .../dialogflow/.translations/pt-BR.json | 3 +- .../dialogflow/.translations/pt.json | 3 +- .../dialogflow/.translations/ru.json | 3 +- .../dialogflow/.translations/sl.json | 3 +- .../dialogflow/.translations/sv.json | 3 +- .../dialogflow/.translations/zh-Hans.json | 3 +- .../dialogflow/.translations/zh-Hant.json | 3 +- .../components/directv/.translations/ca.json | 3 +- .../components/directv/.translations/de.json | 3 +- .../components/directv/.translations/en.json | 3 +- .../components/directv/.translations/es.json | 3 +- .../components/directv/.translations/fr.json | 3 +- .../components/directv/.translations/it.json | 3 +- .../components/directv/.translations/ko.json | 3 +- .../components/directv/.translations/lb.json | 3 +- .../components/directv/.translations/no.json | 3 +- .../components/directv/.translations/pl.json | 3 +- .../components/directv/.translations/ru.json | 3 +- .../components/directv/.translations/sl.json | 3 +- .../directv/.translations/zh-Hant.json | 3 +- .../components/doorbird/.translations/ca.json | 3 +- .../components/doorbird/.translations/de.json | 3 +- .../components/doorbird/.translations/en.json | 3 +- .../components/doorbird/.translations/es.json | 3 +- .../components/doorbird/.translations/fr.json | 3 +- .../components/doorbird/.translations/it.json | 3 +- .../components/doorbird/.translations/ko.json | 3 +- .../components/doorbird/.translations/lb.json | 3 +- .../components/doorbird/.translations/no.json | 4 +- .../components/doorbird/.translations/ru.json | 3 +- .../components/doorbird/.translations/sl.json | 36 +++++++++++++++ .../doorbird/.translations/zh-Hant.json | 3 +- .../components/ecobee/.translations/bg.json | 3 +- .../components/ecobee/.translations/ca.json | 3 +- .../components/ecobee/.translations/da.json | 3 +- .../components/ecobee/.translations/de.json | 3 +- .../components/ecobee/.translations/en.json | 3 +- .../components/ecobee/.translations/es.json | 3 +- .../components/ecobee/.translations/fr.json | 3 +- .../components/ecobee/.translations/hu.json | 3 +- .../components/ecobee/.translations/it.json | 3 +- .../components/ecobee/.translations/ko.json | 3 +- .../components/ecobee/.translations/lb.json | 3 +- .../components/ecobee/.translations/nl.json | 3 +- .../components/ecobee/.translations/no.json | 3 +- .../components/ecobee/.translations/pl.json | 3 +- .../ecobee/.translations/pt-BR.json | 3 +- .../components/ecobee/.translations/ru.json | 3 +- .../components/ecobee/.translations/sl.json | 3 +- .../components/ecobee/.translations/sv.json | 3 +- .../ecobee/.translations/zh-Hant.json | 3 +- .../components/elgato/.translations/ca.json | 5 +- .../components/elgato/.translations/da.json | 3 +- .../components/elgato/.translations/de.json | 3 +- .../components/elgato/.translations/en.json | 3 +- .../elgato/.translations/es-419.json | 3 +- .../components/elgato/.translations/es.json | 3 +- .../components/elgato/.translations/fr.json | 3 +- .../components/elgato/.translations/it.json | 3 +- .../components/elgato/.translations/ko.json | 3 +- .../components/elgato/.translations/lb.json | 3 +- .../components/elgato/.translations/nl.json | 3 +- .../components/elgato/.translations/no.json | 3 +- .../components/elgato/.translations/pl.json | 3 +- .../elgato/.translations/pt-BR.json | 3 +- .../components/elgato/.translations/ru.json | 3 +- .../components/elgato/.translations/sl.json | 3 +- .../components/elgato/.translations/sv.json | 3 +- .../elgato/.translations/zh-Hant.json | 3 +- .../components/elkm1/.translations/ca.json | 3 +- .../components/elkm1/.translations/de.json | 3 +- .../components/elkm1/.translations/en.json | 3 +- .../components/elkm1/.translations/es.json | 3 +- .../components/elkm1/.translations/fr.json | 3 +- .../components/elkm1/.translations/it.json | 3 +- .../components/elkm1/.translations/ko.json | 3 +- .../components/elkm1/.translations/lb.json | 3 +- .../components/elkm1/.translations/no.json | 3 +- .../components/elkm1/.translations/ru.json | 3 +- .../components/elkm1/.translations/sl.json | 27 +++++++++++ .../elkm1/.translations/zh-Hant.json | 3 +- .../emulated_roku/.translations/en.json | 2 +- .../components/esphome/.translations/af.json | 9 ++++ .../components/esphome/.translations/ar.json | 9 ++++ .../components/esphome/.translations/bg.json | 5 +- .../components/esphome/.translations/bs.json | 9 ++++ .../components/esphome/.translations/ca.json | 5 +- .../components/esphome/.translations/cs.json | 3 ++ .../components/esphome/.translations/cy.json | 9 ++++ .../components/esphome/.translations/da.json | 5 +- .../components/esphome/.translations/de.json | 3 +- .../components/esphome/.translations/el.json | 9 ++++ .../components/esphome/.translations/en.json | 3 +- .../components/esphome/.translations/eo.json | 9 ++++ .../esphome/.translations/es-419.json | 5 +- .../components/esphome/.translations/es.json | 5 +- .../components/esphome/.translations/et.json | 9 ++++ .../components/esphome/.translations/eu.json | 9 ++++ .../components/esphome/.translations/fa.json | 9 ++++ .../components/esphome/.translations/fi.json | 9 ++++ .../components/esphome/.translations/fr.json | 5 +- .../components/esphome/.translations/gsw.json | 9 ++++ .../components/esphome/.translations/he.json | 9 ++++ .../components/esphome/.translations/hi.json | 9 ++++ .../components/esphome/.translations/hr.json | 9 ++++ .../components/esphome/.translations/hu.json | 5 +- .../components/esphome/.translations/iba.json | 9 ++++ .../components/esphome/.translations/id.json | 3 ++ .../components/esphome/.translations/is.json | 9 ++++ .../components/esphome/.translations/it.json | 3 +- .../components/esphome/.translations/ja.json | 9 ++++ .../components/esphome/.translations/ko.json | 5 +- .../components/esphome/.translations/lb.json | 5 +- .../components/esphome/.translations/lt.json | 9 ++++ .../components/esphome/.translations/lv.json | 9 ++++ .../components/esphome/.translations/nl.json | 5 +- .../components/esphome/.translations/nn.json | 5 +- .../components/esphome/.translations/no.json | 5 +- .../components/esphome/.translations/pl.json | 5 +- .../esphome/.translations/pt-BR.json | 5 +- .../components/esphome/.translations/pt.json | 9 ++-- .../components/esphome/.translations/ro.json | 9 ++++ .../components/esphome/.translations/ru.json | 3 +- .../components/esphome/.translations/sk.json | 9 ++++ .../components/esphome/.translations/sl.json | 3 +- .../esphome/.translations/sr-Latn.json | 9 ++++ .../components/esphome/.translations/sr.json | 9 ++++ .../components/esphome/.translations/sv.json | 5 +- .../components/esphome/.translations/ta.json | 9 ++++ .../components/esphome/.translations/te.json | 9 ++++ .../components/esphome/.translations/th.json | 3 ++ .../components/esphome/.translations/tr.json | 9 ++++ .../components/esphome/.translations/uk.json | 3 +- .../components/esphome/.translations/ur.json | 9 ++++ .../components/esphome/.translations/vi.json | 9 ++++ .../esphome/.translations/zh-Hans.json | 5 +- .../esphome/.translations/zh-Hant.json | 5 +- .../components/fan/.translations/af.json | 3 ++ .../components/fan/.translations/ar.json | 3 ++ .../components/fan/.translations/bg.json | 3 +- .../components/fan/.translations/bs.json | 3 ++ .../components/fan/.translations/ca.json | 3 +- .../components/fan/.translations/cs.json | 3 ++ .../components/fan/.translations/cy.json | 3 ++ .../components/fan/.translations/da.json | 3 +- .../components/fan/.translations/de.json | 3 +- .../components/fan/.translations/el.json | 3 ++ .../components/fan/.translations/en.json | 3 +- .../components/fan/.translations/es-419.json | 3 +- .../components/fan/.translations/es.json | 3 +- .../components/fan/.translations/et.json | 3 ++ .../components/fan/.translations/eu.json | 3 ++ .../components/fan/.translations/fa.json | 3 ++ .../components/fan/.translations/fi.json | 3 ++ .../components/fan/.translations/fr.json | 3 +- .../components/fan/.translations/he.json | 3 ++ .../components/fan/.translations/hi.json | 3 ++ .../components/fan/.translations/hr.json | 3 ++ .../components/fan/.translations/hu.json | 3 +- .../components/fan/.translations/hy.json | 3 ++ .../components/fan/.translations/id.json | 3 ++ .../components/fan/.translations/is.json | 3 ++ .../components/fan/.translations/it.json | 3 +- .../components/fan/.translations/ko.json | 3 +- .../components/fan/.translations/lb.json | 3 +- .../components/fan/.translations/lv.json | 3 ++ .../components/fan/.translations/nb.json | 3 ++ .../components/fan/.translations/nl.json | 3 +- .../components/fan/.translations/nn.json | 3 ++ .../components/fan/.translations/pl.json | 3 +- .../components/fan/.translations/pt-BR.json | 3 +- .../components/fan/.translations/pt.json | 3 +- .../components/fan/.translations/ro.json | 3 ++ .../components/fan/.translations/ru.json | 3 +- .../components/fan/.translations/sk.json | 3 ++ .../components/fan/.translations/sl.json | 3 +- .../components/fan/.translations/sv.json | 3 +- .../components/fan/.translations/te.json | 3 ++ .../components/fan/.translations/th.json | 3 ++ .../components/fan/.translations/tr.json | 3 ++ .../components/fan/.translations/uk.json | 3 ++ .../components/fan/.translations/vi.json | 3 ++ .../components/fan/.translations/zh-Hans.json | 3 +- .../components/fan/.translations/zh-Hant.json | 3 +- .../components/flume/.translations/ca.json | 3 +- .../components/flume/.translations/de.json | 3 +- .../components/flume/.translations/en.json | 3 +- .../components/flume/.translations/es.json | 3 +- .../components/flume/.translations/fr.json | 3 +- .../components/flume/.translations/it.json | 3 +- .../components/flume/.translations/nl.json | 3 +- .../components/flume/.translations/no.json | 8 +++- .../components/flume/.translations/ru.json | 3 +- .../components/flume/.translations/sl.json | 24 ++++++++++ .../flume/.translations/zh-Hant.json | 3 +- .../flunearyou/.translations/ca.json | 3 +- .../flunearyou/.translations/de.json | 3 +- .../flunearyou/.translations/en.json | 3 +- .../flunearyou/.translations/es.json | 3 +- .../flunearyou/.translations/it.json | 3 +- .../flunearyou/.translations/ko.json | 3 +- .../flunearyou/.translations/lb.json | 3 +- .../flunearyou/.translations/no.json | 20 ++++++++ .../flunearyou/.translations/ru.json | 3 +- .../flunearyou/.translations/sl.json | 20 ++++++++ .../flunearyou/.translations/zh-Hant.json | 3 +- .../components/freebox/.translations/ca.json | 3 +- .../components/freebox/.translations/de.json | 3 +- .../components/freebox/.translations/en.json | 3 +- .../components/freebox/.translations/es.json | 3 +- .../components/freebox/.translations/fr.json | 3 +- .../components/freebox/.translations/it.json | 3 +- .../components/freebox/.translations/ko.json | 3 +- .../components/freebox/.translations/lb.json | 3 +- .../components/freebox/.translations/no.json | 3 +- .../components/freebox/.translations/pl.json | 3 +- .../components/freebox/.translations/ru.json | 3 +- .../components/freebox/.translations/sl.json | 3 +- .../freebox/.translations/zh-Hant.json | 3 +- .../garmin_connect/.translations/ca.json | 3 +- .../garmin_connect/.translations/cs.json | 3 +- .../garmin_connect/.translations/da.json | 3 +- .../garmin_connect/.translations/de.json | 3 +- .../garmin_connect/.translations/en.json | 3 +- .../garmin_connect/.translations/es.json | 3 +- .../garmin_connect/.translations/fr.json | 3 +- .../garmin_connect/.translations/hu.json | 3 +- .../garmin_connect/.translations/it.json | 3 +- .../garmin_connect/.translations/ko.json | 3 +- .../garmin_connect/.translations/lb.json | 3 +- .../garmin_connect/.translations/nl.json | 3 +- .../garmin_connect/.translations/no.json | 3 +- .../garmin_connect/.translations/pl.json | 3 +- .../garmin_connect/.translations/ru.json | 3 +- .../garmin_connect/.translations/sl.json | 3 +- .../garmin_connect/.translations/sv.json | 3 +- .../garmin_connect/.translations/zh-Hant.json | 3 +- .../components/gdacs/.translations/ca.json | 3 +- .../components/gdacs/.translations/da.json | 3 +- .../components/gdacs/.translations/de.json | 3 +- .../components/gdacs/.translations/en.json | 3 +- .../components/gdacs/.translations/es.json | 3 +- .../components/gdacs/.translations/fr.json | 3 +- .../components/gdacs/.translations/hu.json | 3 +- .../components/gdacs/.translations/it.json | 3 +- .../components/gdacs/.translations/ko.json | 3 +- .../components/gdacs/.translations/lb.json | 3 +- .../components/gdacs/.translations/nl.json | 3 +- .../components/gdacs/.translations/no.json | 3 +- .../components/gdacs/.translations/pl.json | 3 +- .../components/gdacs/.translations/ru.json | 3 +- .../components/gdacs/.translations/sl.json | 3 +- .../components/gdacs/.translations/sv.json | 3 +- .../gdacs/.translations/zh-Hant.json | 3 +- .../components/geofency/.translations/bg.json | 3 +- .../components/geofency/.translations/ca.json | 3 +- .../components/geofency/.translations/cs.json | 3 +- .../components/geofency/.translations/da.json | 3 +- .../components/geofency/.translations/de.json | 3 +- .../components/geofency/.translations/en.json | 3 +- .../geofency/.translations/es-419.json | 3 +- .../components/geofency/.translations/es.json | 3 +- .../components/geofency/.translations/fr.json | 3 +- .../components/geofency/.translations/hu.json | 3 +- .../components/geofency/.translations/it.json | 3 +- .../components/geofency/.translations/ko.json | 3 +- .../components/geofency/.translations/lb.json | 3 +- .../components/geofency/.translations/nl.json | 3 +- .../components/geofency/.translations/no.json | 3 +- .../components/geofency/.translations/pl.json | 3 +- .../geofency/.translations/pt-BR.json | 3 +- .../components/geofency/.translations/pt.json | 3 +- .../components/geofency/.translations/ru.json | 3 +- .../components/geofency/.translations/sl.json | 3 +- .../components/geofency/.translations/sv.json | 3 +- .../geofency/.translations/zh-Hans.json | 3 +- .../geofency/.translations/zh-Hant.json | 3 +- .../geonetnz_quakes/.translations/bg.json | 3 +- .../geonetnz_quakes/.translations/ca.json | 3 +- .../geonetnz_quakes/.translations/da.json | 3 +- .../geonetnz_quakes/.translations/de.json | 3 +- .../geonetnz_quakes/.translations/en.json | 3 +- .../geonetnz_quakes/.translations/es.json | 3 +- .../geonetnz_quakes/.translations/fr.json | 3 +- .../geonetnz_quakes/.translations/it.json | 3 +- .../geonetnz_quakes/.translations/ko.json | 3 +- .../geonetnz_quakes/.translations/lb.json | 3 +- .../geonetnz_quakes/.translations/nl.json | 3 +- .../geonetnz_quakes/.translations/no.json | 3 +- .../geonetnz_quakes/.translations/pl.json | 3 +- .../geonetnz_quakes/.translations/pt-BR.json | 3 +- .../geonetnz_quakes/.translations/ru.json | 3 +- .../geonetnz_quakes/.translations/sl.json | 3 +- .../geonetnz_quakes/.translations/sv.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../geonetnz_volcano/.translations/bg.json | 3 +- .../geonetnz_volcano/.translations/ca.json | 3 +- .../geonetnz_volcano/.translations/da.json | 3 +- .../geonetnz_volcano/.translations/de.json | 3 +- .../geonetnz_volcano/.translations/en.json | 3 +- .../geonetnz_volcano/.translations/es.json | 3 +- .../geonetnz_volcano/.translations/fr.json | 3 +- .../geonetnz_volcano/.translations/hu.json | 3 +- .../geonetnz_volcano/.translations/it.json | 3 +- .../geonetnz_volcano/.translations/ko.json | 3 +- .../geonetnz_volcano/.translations/lb.json | 3 +- .../geonetnz_volcano/.translations/nl.json | 3 +- .../geonetnz_volcano/.translations/no.json | 3 +- .../geonetnz_volcano/.translations/pl.json | 3 +- .../geonetnz_volcano/.translations/ro.json | 3 +- .../geonetnz_volcano/.translations/ru.json | 3 +- .../geonetnz_volcano/.translations/sl.json | 3 +- .../geonetnz_volcano/.translations/sv.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../components/gios/.translations/ca.json | 3 +- .../components/gios/.translations/da.json | 3 +- .../components/gios/.translations/de.json | 3 +- .../components/gios/.translations/en.json | 3 +- .../components/gios/.translations/es.json | 3 +- .../components/gios/.translations/fr.json | 3 +- .../components/gios/.translations/hu.json | 3 +- .../components/gios/.translations/it.json | 3 +- .../components/gios/.translations/ko.json | 3 +- .../components/gios/.translations/lb.json | 3 +- .../components/gios/.translations/nl.json | 3 +- .../components/gios/.translations/no.json | 3 +- .../components/gios/.translations/pl.json | 3 +- .../components/gios/.translations/ru.json | 3 +- .../components/gios/.translations/sl.json | 3 +- .../components/gios/.translations/sv.json | 3 +- .../gios/.translations/zh-Hant.json | 3 +- .../components/glances/.translations/bg.json | 3 +- .../components/glances/.translations/ca.json | 3 +- .../components/glances/.translations/da.json | 3 +- .../components/glances/.translations/de.json | 3 +- .../components/glances/.translations/en.json | 3 +- .../components/glances/.translations/es.json | 3 +- .../components/glances/.translations/fr.json | 3 +- .../components/glances/.translations/hu.json | 3 +- .../components/glances/.translations/it.json | 3 +- .../components/glances/.translations/ko.json | 3 +- .../components/glances/.translations/lb.json | 3 +- .../components/glances/.translations/nl.json | 3 +- .../components/glances/.translations/no.json | 3 +- .../components/glances/.translations/pl.json | 3 +- .../components/glances/.translations/ru.json | 3 +- .../components/glances/.translations/sl.json | 3 +- .../components/glances/.translations/sv.json | 3 +- .../glances/.translations/zh-Hant.json | 3 +- .../gpslogger/.translations/bg.json | 3 +- .../gpslogger/.translations/ca.json | 3 +- .../gpslogger/.translations/cs.json | 3 +- .../gpslogger/.translations/da.json | 3 +- .../gpslogger/.translations/de.json | 3 +- .../gpslogger/.translations/en.json | 3 +- .../gpslogger/.translations/es-419.json | 3 +- .../gpslogger/.translations/es.json | 3 +- .../gpslogger/.translations/fr.json | 3 +- .../gpslogger/.translations/hu.json | 3 +- .../gpslogger/.translations/it.json | 3 +- .../gpslogger/.translations/ko.json | 3 +- .../gpslogger/.translations/lb.json | 3 +- .../gpslogger/.translations/nl.json | 3 +- .../gpslogger/.translations/no.json | 3 +- .../gpslogger/.translations/pl.json | 3 +- .../gpslogger/.translations/pt-BR.json | 3 +- .../gpslogger/.translations/pt.json | 3 +- .../gpslogger/.translations/ru.json | 3 +- .../gpslogger/.translations/sl.json | 3 +- .../gpslogger/.translations/sv.json | 3 +- .../gpslogger/.translations/zh-Hans.json | 3 +- .../gpslogger/.translations/zh-Hant.json | 3 +- .../components/griddy/.translations/ca.json | 3 +- .../components/griddy/.translations/de.json | 3 +- .../components/griddy/.translations/en.json | 3 +- .../components/griddy/.translations/es.json | 3 +- .../components/griddy/.translations/fr.json | 3 +- .../components/griddy/.translations/it.json | 3 +- .../components/griddy/.translations/ko.json | 3 +- .../components/griddy/.translations/lb.json | 3 +- .../components/griddy/.translations/no.json | 3 +- .../components/griddy/.translations/pl.json | 3 +- .../components/griddy/.translations/ru.json | 3 +- .../components/griddy/.translations/sl.json | 3 +- .../griddy/.translations/zh-Hant.json | 3 +- .../components/group/.translations/af.json | 3 ++ .../components/group/.translations/ar.json | 3 ++ .../components/group/.translations/bg.json | 3 ++ .../components/group/.translations/bs.json | 3 ++ .../components/group/.translations/ca.json | 3 ++ .../components/group/.translations/cs.json | 3 ++ .../components/group/.translations/cy.json | 3 ++ .../components/group/.translations/da.json | 3 ++ .../components/group/.translations/de.json | 3 ++ .../components/group/.translations/el.json | 3 ++ .../components/group/.translations/en.json | 3 ++ .../group/.translations/es-419.json | 3 ++ .../components/group/.translations/es.json | 3 ++ .../components/group/.translations/et.json | 3 ++ .../components/group/.translations/eu.json | 3 ++ .../components/group/.translations/fa.json | 3 ++ .../components/group/.translations/fi.json | 3 ++ .../components/group/.translations/fr.json | 3 ++ .../components/group/.translations/gsw.json | 3 ++ .../components/group/.translations/he.json | 3 ++ .../components/group/.translations/hi.json | 3 ++ .../components/group/.translations/hr.json | 3 ++ .../components/group/.translations/hu.json | 3 ++ .../components/group/.translations/hy.json | 3 ++ .../components/group/.translations/id.json | 3 ++ .../components/group/.translations/is.json | 3 ++ .../components/group/.translations/it.json | 3 ++ .../components/group/.translations/ja.json | 3 ++ .../components/group/.translations/ko.json | 3 ++ .../components/group/.translations/lb.json | 3 ++ .../components/group/.translations/lv.json | 3 ++ .../components/group/.translations/nb.json | 3 ++ .../components/group/.translations/nl.json | 3 ++ .../components/group/.translations/nn.json | 3 ++ .../components/group/.translations/pl.json | 3 ++ .../components/group/.translations/pt-BR.json | 3 ++ .../components/group/.translations/pt.json | 3 ++ .../components/group/.translations/ro.json | 3 ++ .../components/group/.translations/ru.json | 3 ++ .../components/group/.translations/sk.json | 3 ++ .../components/group/.translations/sl.json | 3 ++ .../components/group/.translations/sv.json | 3 ++ .../components/group/.translations/te.json | 3 ++ .../components/group/.translations/th.json | 3 ++ .../components/group/.translations/tr.json | 3 ++ .../components/group/.translations/uk.json | 3 ++ .../components/group/.translations/vi.json | 3 ++ .../group/.translations/zh-Hans.json | 3 ++ .../group/.translations/zh-Hant.json | 3 ++ .../components/hangouts/.translations/bg.json | 3 +- .../components/hangouts/.translations/ca.json | 3 +- .../components/hangouts/.translations/cs.json | 3 +- .../components/hangouts/.translations/da.json | 3 +- .../components/hangouts/.translations/de.json | 3 +- .../components/hangouts/.translations/en.json | 3 +- .../hangouts/.translations/es-419.json | 3 +- .../components/hangouts/.translations/es.json | 3 +- .../components/hangouts/.translations/et.json | 3 +- .../components/hangouts/.translations/fr.json | 3 +- .../components/hangouts/.translations/he.json | 3 +- .../components/hangouts/.translations/hu.json | 3 +- .../components/hangouts/.translations/id.json | 3 +- .../components/hangouts/.translations/it.json | 3 +- .../components/hangouts/.translations/ko.json | 3 +- .../components/hangouts/.translations/lb.json | 3 +- .../components/hangouts/.translations/nl.json | 3 +- .../components/hangouts/.translations/nn.json | 3 +- .../components/hangouts/.translations/no.json | 3 +- .../components/hangouts/.translations/pl.json | 3 +- .../hangouts/.translations/pt-BR.json | 3 +- .../components/hangouts/.translations/pt.json | 3 +- .../components/hangouts/.translations/ro.json | 3 +- .../components/hangouts/.translations/ru.json | 3 +- .../components/hangouts/.translations/sl.json | 3 +- .../components/hangouts/.translations/sv.json | 3 +- .../hangouts/.translations/zh-Hans.json | 3 +- .../hangouts/.translations/zh-Hant.json | 3 +- .../components/harmony/.translations/ca.json | 3 +- .../components/harmony/.translations/de.json | 3 +- .../components/harmony/.translations/en.json | 3 +- .../components/harmony/.translations/es.json | 3 +- .../components/harmony/.translations/fr.json | 3 +- .../components/harmony/.translations/it.json | 3 +- .../components/harmony/.translations/ko.json | 3 +- .../components/harmony/.translations/lb.json | 3 +- .../components/harmony/.translations/no.json | 3 +- .../components/harmony/.translations/pl.json | 3 +- .../components/harmony/.translations/ru.json | 3 +- .../components/harmony/.translations/sl.json | 36 +++++++++++++++ .../harmony/.translations/zh-Hant.json | 3 +- .../components/hassio/.translations/af.json | 3 ++ .../components/hassio/.translations/bg.json | 3 ++ .../components/hassio/.translations/ca.json | 3 ++ .../components/hassio/.translations/cs.json | 3 ++ .../components/hassio/.translations/cy.json | 3 ++ .../components/hassio/.translations/da.json | 3 ++ .../components/hassio/.translations/de.json | 3 ++ .../components/hassio/.translations/el.json | 3 ++ .../components/hassio/.translations/en.json | 3 ++ .../hassio/.translations/es-419.json | 3 ++ .../components/hassio/.translations/es.json | 3 ++ .../components/hassio/.translations/et.json | 3 ++ .../components/hassio/.translations/eu.json | 3 ++ .../components/hassio/.translations/fa.json | 3 ++ .../components/hassio/.translations/fi.json | 3 ++ .../components/hassio/.translations/fr.json | 3 ++ .../components/hassio/.translations/he.json | 3 ++ .../components/hassio/.translations/hr.json | 3 ++ .../components/hassio/.translations/hu.json | 3 ++ .../components/hassio/.translations/hy.json | 3 ++ .../components/hassio/.translations/is.json | 3 ++ .../components/hassio/.translations/it.json | 3 ++ .../components/hassio/.translations/ja.json | 3 ++ .../components/hassio/.translations/ko.json | 3 ++ .../components/hassio/.translations/lb.json | 3 ++ .../components/hassio/.translations/lt.json | 3 ++ .../components/hassio/.translations/lv.json | 3 ++ .../components/hassio/.translations/nb.json | 3 ++ .../components/hassio/.translations/nl.json | 3 ++ .../components/hassio/.translations/nn.json | 3 ++ .../components/hassio/.translations/pl.json | 3 ++ .../hassio/.translations/pt-BR.json | 3 ++ .../components/hassio/.translations/pt.json | 3 ++ .../components/hassio/.translations/ro.json | 3 ++ .../components/hassio/.translations/ru.json | 3 ++ .../components/hassio/.translations/sk.json | 3 ++ .../components/hassio/.translations/sl.json | 3 ++ .../components/hassio/.translations/sv.json | 3 ++ .../components/hassio/.translations/th.json | 3 ++ .../components/hassio/.translations/tr.json | 3 ++ .../components/hassio/.translations/uk.json | 3 ++ .../components/hassio/.translations/vi.json | 3 ++ .../hassio/.translations/zh-Hans.json | 3 ++ .../hassio/.translations/zh-Hant.json | 3 ++ .../components/heos/.translations/bg.json | 3 +- .../components/heos/.translations/ca.json | 3 +- .../components/heos/.translations/da.json | 3 +- .../components/heos/.translations/de.json | 3 +- .../components/heos/.translations/en.json | 3 +- .../components/heos/.translations/es-419.json | 3 +- .../components/heos/.translations/es.json | 3 +- .../components/heos/.translations/fr.json | 3 +- .../components/heos/.translations/hu.json | 3 +- .../components/heos/.translations/it.json | 3 +- .../components/heos/.translations/ko.json | 3 +- .../components/heos/.translations/lb.json | 3 +- .../components/heos/.translations/nl.json | 3 +- .../components/heos/.translations/nn.json | 3 +- .../components/heos/.translations/no.json | 3 +- .../components/heos/.translations/pl.json | 3 +- .../components/heos/.translations/pt-BR.json | 3 +- .../components/heos/.translations/pt.json | 3 +- .../components/heos/.translations/ru.json | 3 +- .../components/heos/.translations/sl.json | 3 +- .../components/heos/.translations/sv.json | 3 +- .../heos/.translations/zh-Hant.json | 3 +- .../hisense_aehw4a1/.translations/bg.json | 3 +- .../hisense_aehw4a1/.translations/ca.json | 3 +- .../hisense_aehw4a1/.translations/da.json | 3 +- .../hisense_aehw4a1/.translations/de.json | 3 +- .../hisense_aehw4a1/.translations/en.json | 3 +- .../hisense_aehw4a1/.translations/es.json | 3 +- .../hisense_aehw4a1/.translations/fr.json | 3 +- .../hisense_aehw4a1/.translations/hu.json | 3 +- .../hisense_aehw4a1/.translations/it.json | 3 +- .../hisense_aehw4a1/.translations/ko.json | 3 +- .../hisense_aehw4a1/.translations/lb.json | 3 +- .../hisense_aehw4a1/.translations/nl.json | 3 +- .../hisense_aehw4a1/.translations/no.json | 3 +- .../hisense_aehw4a1/.translations/pl.json | 3 +- .../hisense_aehw4a1/.translations/ru.json | 3 +- .../hisense_aehw4a1/.translations/sl.json | 3 +- .../hisense_aehw4a1/.translations/sv.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../homeassistant/.translations/af.json | 3 ++ .../homeassistant/.translations/bg.json | 3 ++ .../homeassistant/.translations/ca.json | 3 ++ .../homeassistant/.translations/cs.json | 3 ++ .../homeassistant/.translations/cy.json | 3 ++ .../homeassistant/.translations/da.json | 3 ++ .../homeassistant/.translations/de.json | 3 ++ .../homeassistant/.translations/el.json | 3 ++ .../homeassistant/.translations/en.json | 3 ++ .../homeassistant/.translations/es-419.json | 3 ++ .../homeassistant/.translations/es.json | 3 ++ .../homeassistant/.translations/et.json | 3 ++ .../homeassistant/.translations/eu.json | 3 ++ .../homeassistant/.translations/fa.json | 3 ++ .../homeassistant/.translations/fi.json | 3 ++ .../homeassistant/.translations/fr.json | 3 ++ .../homeassistant/.translations/he.json | 3 ++ .../homeassistant/.translations/hr.json | 3 ++ .../homeassistant/.translations/hu.json | 3 ++ .../homeassistant/.translations/hy.json | 3 ++ .../homeassistant/.translations/is.json | 3 ++ .../homeassistant/.translations/it.json | 3 ++ .../homeassistant/.translations/ko.json | 3 ++ .../homeassistant/.translations/lb.json | 3 ++ .../homeassistant/.translations/lt.json | 3 ++ .../homeassistant/.translations/lv.json | 3 ++ .../homeassistant/.translations/nb.json | 3 ++ .../homeassistant/.translations/nl.json | 3 ++ .../homeassistant/.translations/nn.json | 3 ++ .../homeassistant/.translations/pl.json | 3 ++ .../homeassistant/.translations/pt-BR.json | 3 ++ .../homeassistant/.translations/pt.json | 3 ++ .../homeassistant/.translations/ro.json | 3 ++ .../homeassistant/.translations/ru.json | 3 ++ .../homeassistant/.translations/sk.json | 3 ++ .../homeassistant/.translations/sl.json | 3 ++ .../homeassistant/.translations/sv.json | 3 ++ .../homeassistant/.translations/th.json | 3 ++ .../homeassistant/.translations/tr.json | 3 ++ .../homeassistant/.translations/uk.json | 3 ++ .../homeassistant/.translations/vi.json | 3 ++ .../homeassistant/.translations/zh-Hans.json | 3 ++ .../homeassistant/.translations/zh-Hant.json | 3 ++ .../homekit_controller/.translations/pt.json | 27 ++++++++++- .../homematicip_cloud/.translations/bg.json | 3 +- .../homematicip_cloud/.translations/ca.json | 3 +- .../homematicip_cloud/.translations/cs.json | 3 +- .../homematicip_cloud/.translations/da.json | 3 +- .../homematicip_cloud/.translations/de.json | 3 +- .../homematicip_cloud/.translations/en.json | 3 +- .../.translations/es-419.json | 3 +- .../homematicip_cloud/.translations/es.json | 3 +- .../homematicip_cloud/.translations/et.json | 3 +- .../homematicip_cloud/.translations/fr.json | 3 +- .../homematicip_cloud/.translations/he.json | 3 +- .../homematicip_cloud/.translations/hu.json | 3 +- .../homematicip_cloud/.translations/id.json | 3 +- .../homematicip_cloud/.translations/it.json | 3 +- .../homematicip_cloud/.translations/ko.json | 3 +- .../homematicip_cloud/.translations/lb.json | 3 +- .../homematicip_cloud/.translations/nl.json | 3 +- .../homematicip_cloud/.translations/nn.json | 3 +- .../homematicip_cloud/.translations/no.json | 3 +- .../homematicip_cloud/.translations/pl.json | 3 +- .../.translations/pt-BR.json | 3 +- .../homematicip_cloud/.translations/pt.json | 3 +- .../homematicip_cloud/.translations/ru.json | 3 +- .../homematicip_cloud/.translations/sl.json | 3 +- .../homematicip_cloud/.translations/sv.json | 3 +- .../.translations/zh-Hans.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../huawei_lte/.translations/bg.json | 3 +- .../huawei_lte/.translations/ca.json | 3 +- .../huawei_lte/.translations/cs.json | 3 +- .../huawei_lte/.translations/da.json | 3 +- .../huawei_lte/.translations/de.json | 3 +- .../huawei_lte/.translations/en.json | 3 +- .../huawei_lte/.translations/es.json | 3 +- .../huawei_lte/.translations/fr.json | 3 +- .../huawei_lte/.translations/hu.json | 3 +- .../huawei_lte/.translations/it.json | 3 +- .../huawei_lte/.translations/ko.json | 3 +- .../huawei_lte/.translations/lb.json | 3 +- .../huawei_lte/.translations/nl.json | 3 +- .../huawei_lte/.translations/no.json | 3 +- .../huawei_lte/.translations/pl.json | 3 +- .../huawei_lte/.translations/pt.json | 3 +- .../huawei_lte/.translations/ru.json | 3 +- .../huawei_lte/.translations/sl.json | 3 +- .../huawei_lte/.translations/sv.json | 3 +- .../huawei_lte/.translations/zh-Hant.json | 3 +- .../components/hue/.translations/bg.json | 3 +- .../components/hue/.translations/ca.json | 3 +- .../components/hue/.translations/cs.json | 3 +- .../components/hue/.translations/cy.json | 3 +- .../components/hue/.translations/da.json | 3 +- .../components/hue/.translations/de.json | 3 +- .../components/hue/.translations/en.json | 3 +- .../components/hue/.translations/es-419.json | 3 +- .../components/hue/.translations/es.json | 3 +- .../components/hue/.translations/et.json | 3 +- .../components/hue/.translations/fr.json | 3 +- .../components/hue/.translations/he.json | 3 +- .../components/hue/.translations/hr.json | 3 +- .../components/hue/.translations/hu.json | 3 +- .../components/hue/.translations/id.json | 3 +- .../components/hue/.translations/it.json | 3 +- .../components/hue/.translations/ja.json | 3 +- .../components/hue/.translations/ko.json | 3 +- .../components/hue/.translations/lb.json | 3 +- .../components/hue/.translations/nl.json | 3 +- .../components/hue/.translations/nn.json | 3 +- .../components/hue/.translations/no.json | 18 +++++++- .../components/hue/.translations/pl.json | 3 +- .../components/hue/.translations/pt-BR.json | 3 +- .../components/hue/.translations/pt.json | 15 +++--- .../components/hue/.translations/ro.json | 3 +- .../components/hue/.translations/ru.json | 3 +- .../components/hue/.translations/sl.json | 18 +++++++- .../components/hue/.translations/sv.json | 3 +- .../components/hue/.translations/th.json | 3 +- .../components/hue/.translations/zh-Hans.json | 3 +- .../components/hue/.translations/zh-Hant.json | 3 +- .../iaqualink/.translations/bg.json | 3 +- .../iaqualink/.translations/ca.json | 3 +- .../iaqualink/.translations/da.json | 3 +- .../iaqualink/.translations/de.json | 3 +- .../iaqualink/.translations/en.json | 3 +- .../iaqualink/.translations/es.json | 3 +- .../iaqualink/.translations/fr.json | 3 +- .../iaqualink/.translations/it.json | 3 +- .../iaqualink/.translations/ko.json | 3 +- .../iaqualink/.translations/lb.json | 3 +- .../iaqualink/.translations/nl.json | 3 +- .../iaqualink/.translations/no.json | 3 +- .../iaqualink/.translations/pl.json | 3 +- .../iaqualink/.translations/ru.json | 3 +- .../iaqualink/.translations/sl.json | 3 +- .../iaqualink/.translations/sv.json | 3 +- .../iaqualink/.translations/zh-Hant.json | 3 +- .../components/icloud/.translations/ca.json | 3 +- .../components/icloud/.translations/da.json | 3 +- .../components/icloud/.translations/de.json | 3 +- .../components/icloud/.translations/en.json | 3 +- .../components/icloud/.translations/es.json | 3 +- .../components/icloud/.translations/fr.json | 3 +- .../components/icloud/.translations/hu.json | 3 +- .../components/icloud/.translations/it.json | 3 +- .../components/icloud/.translations/ko.json | 3 +- .../components/icloud/.translations/lb.json | 3 +- .../components/icloud/.translations/lv.json | 3 +- .../components/icloud/.translations/nl.json | 3 +- .../components/icloud/.translations/no.json | 3 +- .../components/icloud/.translations/pl.json | 3 +- .../icloud/.translations/pt-BR.json | 3 +- .../components/icloud/.translations/ru.json | 3 +- .../components/icloud/.translations/sl.json | 3 +- .../components/icloud/.translations/sv.json | 3 +- .../icloud/.translations/zh-Hans.json | 3 +- .../icloud/.translations/zh-Hant.json | 3 +- .../components/ifttt/.translations/bg.json | 3 +- .../components/ifttt/.translations/ca.json | 3 +- .../components/ifttt/.translations/cs.json | 3 +- .../components/ifttt/.translations/da.json | 3 +- .../components/ifttt/.translations/de.json | 3 +- .../components/ifttt/.translations/en.json | 3 +- .../ifttt/.translations/es-419.json | 3 +- .../components/ifttt/.translations/es.json | 3 +- .../components/ifttt/.translations/fr.json | 3 +- .../components/ifttt/.translations/hu.json | 3 +- .../components/ifttt/.translations/it.json | 3 +- .../components/ifttt/.translations/ko.json | 3 +- .../components/ifttt/.translations/lb.json | 3 +- .../components/ifttt/.translations/nl.json | 3 +- .../components/ifttt/.translations/nn.json | 3 +- .../components/ifttt/.translations/no.json | 3 +- .../components/ifttt/.translations/pl.json | 3 +- .../components/ifttt/.translations/pt-BR.json | 3 +- .../components/ifttt/.translations/pt.json | 3 +- .../components/ifttt/.translations/ro.json | 3 +- .../components/ifttt/.translations/ru.json | 3 +- .../components/ifttt/.translations/sl.json | 3 +- .../components/ifttt/.translations/sv.json | 3 +- .../ifttt/.translations/zh-Hans.json | 3 +- .../ifttt/.translations/zh-Hant.json | 3 +- .../image_processing/.translations/af.json | 3 ++ .../image_processing/.translations/ar.json | 3 ++ .../image_processing/.translations/bg.json | 3 ++ .../image_processing/.translations/bs.json | 3 ++ .../image_processing/.translations/ca.json | 3 ++ .../image_processing/.translations/cs.json | 3 ++ .../image_processing/.translations/cy.json | 3 ++ .../image_processing/.translations/da.json | 3 ++ .../image_processing/.translations/de.json | 3 ++ .../image_processing/.translations/el.json | 3 ++ .../image_processing/.translations/en.json | 3 ++ .../.translations/es-419.json | 3 ++ .../image_processing/.translations/es.json | 3 ++ .../image_processing/.translations/et.json | 3 ++ .../image_processing/.translations/fa.json | 3 ++ .../image_processing/.translations/fi.json | 3 ++ .../image_processing/.translations/fr.json | 3 ++ .../image_processing/.translations/he.json | 3 ++ .../image_processing/.translations/hi.json | 3 ++ .../image_processing/.translations/hr.json | 3 ++ .../image_processing/.translations/hu.json | 3 ++ .../image_processing/.translations/hy.json | 3 ++ .../image_processing/.translations/id.json | 3 ++ .../image_processing/.translations/it.json | 3 ++ .../image_processing/.translations/ja.json | 3 ++ .../image_processing/.translations/ko.json | 3 ++ .../image_processing/.translations/lb.json | 3 ++ .../image_processing/.translations/lv.json | 3 ++ .../image_processing/.translations/nb.json | 3 ++ .../image_processing/.translations/nl.json | 3 ++ .../image_processing/.translations/nn.json | 3 ++ .../image_processing/.translations/pl.json | 3 ++ .../image_processing/.translations/pt-BR.json | 3 ++ .../image_processing/.translations/pt.json | 3 ++ .../image_processing/.translations/ro.json | 3 ++ .../image_processing/.translations/ru.json | 3 ++ .../image_processing/.translations/sk.json | 3 ++ .../image_processing/.translations/sl.json | 3 ++ .../image_processing/.translations/sv.json | 3 ++ .../image_processing/.translations/te.json | 3 ++ .../image_processing/.translations/th.json | 3 ++ .../image_processing/.translations/tr.json | 3 ++ .../image_processing/.translations/uk.json | 3 ++ .../image_processing/.translations/vi.json | 3 ++ .../.translations/zh-Hans.json | 3 ++ .../.translations/zh-Hant.json | 3 ++ .../input_boolean/.translations/af.json | 3 ++ .../input_boolean/.translations/ar.json | 3 ++ .../input_boolean/.translations/bg.json | 3 ++ .../input_boolean/.translations/bs.json | 3 ++ .../input_boolean/.translations/ca.json | 3 ++ .../input_boolean/.translations/cs.json | 3 ++ .../input_boolean/.translations/cy.json | 3 ++ .../input_boolean/.translations/da.json | 3 ++ .../input_boolean/.translations/de.json | 3 ++ .../input_boolean/.translations/el.json | 3 ++ .../input_boolean/.translations/en.json | 3 ++ .../input_boolean/.translations/es-419.json | 3 ++ .../input_boolean/.translations/es.json | 3 ++ .../input_boolean/.translations/et.json | 3 ++ .../input_boolean/.translations/eu.json | 3 ++ .../input_boolean/.translations/fa.json | 3 ++ .../input_boolean/.translations/fi.json | 3 ++ .../input_boolean/.translations/fr.json | 3 ++ .../input_boolean/.translations/he.json | 3 ++ .../input_boolean/.translations/hi.json | 3 ++ .../input_boolean/.translations/hr.json | 3 ++ .../input_boolean/.translations/hu.json | 3 ++ .../input_boolean/.translations/hy.json | 3 ++ .../input_boolean/.translations/id.json | 3 ++ .../input_boolean/.translations/it.json | 3 ++ .../input_boolean/.translations/ko.json | 3 ++ .../input_boolean/.translations/lb.json | 3 ++ .../input_boolean/.translations/lv.json | 3 ++ .../input_boolean/.translations/nb.json | 3 ++ .../input_boolean/.translations/nl.json | 3 ++ .../input_boolean/.translations/nn.json | 3 ++ .../input_boolean/.translations/pl.json | 3 ++ .../input_boolean/.translations/pt-BR.json | 3 ++ .../input_boolean/.translations/pt.json | 3 ++ .../input_boolean/.translations/ro.json | 3 ++ .../input_boolean/.translations/ru.json | 3 ++ .../input_boolean/.translations/sk.json | 3 ++ .../input_boolean/.translations/sl.json | 3 ++ .../input_boolean/.translations/sv.json | 3 ++ .../input_boolean/.translations/te.json | 3 ++ .../input_boolean/.translations/th.json | 3 ++ .../input_boolean/.translations/tr.json | 3 ++ .../input_boolean/.translations/uk.json | 3 ++ .../input_boolean/.translations/vi.json | 3 ++ .../input_boolean/.translations/zh-Hans.json | 3 ++ .../input_boolean/.translations/zh-Hant.json | 3 ++ .../input_datetime/.translations/af.json | 3 ++ .../input_datetime/.translations/ar.json | 3 ++ .../input_datetime/.translations/bg.json | 3 ++ .../input_datetime/.translations/bs.json | 3 ++ .../input_datetime/.translations/ca.json | 3 ++ .../input_datetime/.translations/cs.json | 3 ++ .../input_datetime/.translations/cy.json | 3 ++ .../input_datetime/.translations/da.json | 3 ++ .../input_datetime/.translations/de.json | 3 ++ .../input_datetime/.translations/el.json | 3 ++ .../input_datetime/.translations/en.json | 3 ++ .../input_datetime/.translations/es-419.json | 3 ++ .../input_datetime/.translations/es.json | 3 ++ .../input_datetime/.translations/et.json | 3 ++ .../input_datetime/.translations/eu.json | 3 ++ .../input_datetime/.translations/fi.json | 3 ++ .../input_datetime/.translations/fr.json | 3 ++ .../input_datetime/.translations/he.json | 3 ++ .../input_datetime/.translations/hi.json | 3 ++ .../input_datetime/.translations/hr.json | 3 ++ .../input_datetime/.translations/hu.json | 3 ++ .../input_datetime/.translations/hy.json | 3 ++ .../input_datetime/.translations/id.json | 3 ++ .../input_datetime/.translations/is.json | 3 ++ .../input_datetime/.translations/it.json | 3 ++ .../input_datetime/.translations/ko.json | 3 ++ .../input_datetime/.translations/lb.json | 3 ++ .../input_datetime/.translations/lv.json | 3 ++ .../input_datetime/.translations/nb.json | 3 ++ .../input_datetime/.translations/nl.json | 3 ++ .../input_datetime/.translations/nn.json | 3 ++ .../input_datetime/.translations/pl.json | 3 ++ .../input_datetime/.translations/pt-BR.json | 3 ++ .../input_datetime/.translations/pt.json | 3 ++ .../input_datetime/.translations/ro.json | 3 ++ .../input_datetime/.translations/ru.json | 3 ++ .../input_datetime/.translations/sk.json | 3 ++ .../input_datetime/.translations/sl.json | 3 ++ .../input_datetime/.translations/sv.json | 3 ++ .../input_datetime/.translations/te.json | 3 ++ .../input_datetime/.translations/th.json | 3 ++ .../input_datetime/.translations/tr.json | 3 ++ .../input_datetime/.translations/uk.json | 3 ++ .../input_datetime/.translations/vi.json | 3 ++ .../input_datetime/.translations/zh-Hans.json | 3 ++ .../input_datetime/.translations/zh-Hant.json | 3 ++ .../input_number/.translations/af.json | 3 ++ .../input_number/.translations/ar.json | 3 ++ .../input_number/.translations/bg.json | 3 ++ .../input_number/.translations/bs.json | 3 ++ .../input_number/.translations/ca.json | 3 ++ .../input_number/.translations/cs.json | 3 ++ .../input_number/.translations/cy.json | 3 ++ .../input_number/.translations/da.json | 3 ++ .../input_number/.translations/de.json | 3 ++ .../input_number/.translations/el.json | 3 ++ .../input_number/.translations/en.json | 3 ++ .../input_number/.translations/es-419.json | 3 ++ .../input_number/.translations/es.json | 3 ++ .../input_number/.translations/et.json | 3 ++ .../input_number/.translations/eu.json | 3 ++ .../input_number/.translations/fi.json | 3 ++ .../input_number/.translations/fr.json | 3 ++ .../input_number/.translations/he.json | 3 ++ .../input_number/.translations/hi.json | 3 ++ .../input_number/.translations/hr.json | 3 ++ .../input_number/.translations/hu.json | 3 ++ .../input_number/.translations/hy.json | 3 ++ .../input_number/.translations/id.json | 3 ++ .../input_number/.translations/is.json | 3 ++ .../input_number/.translations/it.json | 3 ++ .../input_number/.translations/ko.json | 3 ++ .../input_number/.translations/lb.json | 3 ++ .../input_number/.translations/lv.json | 3 ++ .../input_number/.translations/nb.json | 3 ++ .../input_number/.translations/nl.json | 3 ++ .../input_number/.translations/nn.json | 3 ++ .../input_number/.translations/pl.json | 3 ++ .../input_number/.translations/pt-BR.json | 3 ++ .../input_number/.translations/pt.json | 3 ++ .../input_number/.translations/ro.json | 3 ++ .../input_number/.translations/ru.json | 3 ++ .../input_number/.translations/sk.json | 3 ++ .../input_number/.translations/sl.json | 3 ++ .../input_number/.translations/sv.json | 3 ++ .../input_number/.translations/te.json | 3 ++ .../input_number/.translations/th.json | 3 ++ .../input_number/.translations/tr.json | 3 ++ .../input_number/.translations/uk.json | 3 ++ .../input_number/.translations/vi.json | 3 ++ .../input_number/.translations/zh-Hans.json | 3 ++ .../input_number/.translations/zh-Hant.json | 3 ++ .../input_select/.translations/af.json | 3 ++ .../input_select/.translations/ar.json | 3 ++ .../input_select/.translations/bg.json | 3 ++ .../input_select/.translations/bs.json | 3 ++ .../input_select/.translations/ca.json | 3 ++ .../input_select/.translations/cs.json | 3 ++ .../input_select/.translations/cy.json | 3 ++ .../input_select/.translations/da.json | 3 ++ .../input_select/.translations/de.json | 3 ++ .../input_select/.translations/el.json | 3 ++ .../input_select/.translations/en.json | 3 ++ .../input_select/.translations/es-419.json | 3 ++ .../input_select/.translations/es.json | 3 ++ .../input_select/.translations/et.json | 3 ++ .../input_select/.translations/eu.json | 3 ++ .../input_select/.translations/fi.json | 3 ++ .../input_select/.translations/fr.json | 3 ++ .../input_select/.translations/he.json | 3 ++ .../input_select/.translations/hi.json | 3 ++ .../input_select/.translations/hr.json | 3 ++ .../input_select/.translations/hu.json | 3 ++ .../input_select/.translations/hy.json | 3 ++ .../input_select/.translations/id.json | 3 ++ .../input_select/.translations/is.json | 3 ++ .../input_select/.translations/it.json | 3 ++ .../input_select/.translations/ko.json | 3 ++ .../input_select/.translations/lb.json | 3 ++ .../input_select/.translations/lv.json | 3 ++ .../input_select/.translations/nb.json | 3 ++ .../input_select/.translations/nl.json | 3 ++ .../input_select/.translations/nn.json | 3 ++ .../input_select/.translations/pl.json | 3 ++ .../input_select/.translations/pt-BR.json | 3 ++ .../input_select/.translations/pt.json | 3 ++ .../input_select/.translations/ro.json | 3 ++ .../input_select/.translations/ru.json | 3 ++ .../input_select/.translations/sk.json | 3 ++ .../input_select/.translations/sl.json | 3 ++ .../input_select/.translations/sv.json | 3 ++ .../input_select/.translations/te.json | 3 ++ .../input_select/.translations/th.json | 3 ++ .../input_select/.translations/tr.json | 3 ++ .../input_select/.translations/uk.json | 3 ++ .../input_select/.translations/vi.json | 3 ++ .../input_select/.translations/zh-Hans.json | 3 ++ .../input_select/.translations/zh-Hant.json | 3 ++ .../input_text/.translations/af.json | 3 ++ .../input_text/.translations/ar.json | 3 ++ .../input_text/.translations/bg.json | 3 ++ .../input_text/.translations/bs.json | 3 ++ .../input_text/.translations/ca.json | 3 ++ .../input_text/.translations/cs.json | 3 ++ .../input_text/.translations/cy.json | 3 ++ .../input_text/.translations/da.json | 3 ++ .../input_text/.translations/de.json | 3 ++ .../input_text/.translations/el.json | 3 ++ .../input_text/.translations/en.json | 3 ++ .../input_text/.translations/es-419.json | 3 ++ .../input_text/.translations/es.json | 3 ++ .../input_text/.translations/et.json | 3 ++ .../input_text/.translations/eu.json | 3 ++ .../input_text/.translations/fi.json | 3 ++ .../input_text/.translations/fr.json | 3 ++ .../input_text/.translations/he.json | 3 ++ .../input_text/.translations/hi.json | 3 ++ .../input_text/.translations/hr.json | 3 ++ .../input_text/.translations/hu.json | 3 ++ .../input_text/.translations/hy.json | 3 ++ .../input_text/.translations/id.json | 3 ++ .../input_text/.translations/is.json | 3 ++ .../input_text/.translations/it.json | 3 ++ .../input_text/.translations/ko.json | 3 ++ .../input_text/.translations/lb.json | 3 ++ .../input_text/.translations/lv.json | 3 ++ .../input_text/.translations/nb.json | 3 ++ .../input_text/.translations/nl.json | 3 ++ .../input_text/.translations/nn.json | 3 ++ .../input_text/.translations/pl.json | 3 ++ .../input_text/.translations/pt-BR.json | 3 ++ .../input_text/.translations/pt.json | 3 ++ .../input_text/.translations/ro.json | 3 ++ .../input_text/.translations/ru.json | 3 ++ .../input_text/.translations/sk.json | 3 ++ .../input_text/.translations/sl.json | 3 ++ .../input_text/.translations/sv.json | 3 ++ .../input_text/.translations/ta.json | 3 ++ .../input_text/.translations/te.json | 3 ++ .../input_text/.translations/th.json | 3 ++ .../input_text/.translations/tr.json | 3 ++ .../input_text/.translations/uk.json | 3 ++ .../input_text/.translations/vi.json | 3 ++ .../input_text/.translations/zh-Hans.json | 3 ++ .../input_text/.translations/zh-Hant.json | 3 ++ .../components/ios/.translations/bg.json | 3 +- .../components/ios/.translations/ca.json | 3 +- .../components/ios/.translations/cs.json | 3 +- .../components/ios/.translations/da.json | 3 +- .../components/ios/.translations/de.json | 3 +- .../components/ios/.translations/en.json | 3 +- .../components/ios/.translations/es-419.json | 3 +- .../components/ios/.translations/es.json | 3 +- .../components/ios/.translations/et.json | 3 +- .../components/ios/.translations/fr.json | 3 +- .../components/ios/.translations/he.json | 3 +- .../components/ios/.translations/hu.json | 3 +- .../components/ios/.translations/id.json | 3 +- .../components/ios/.translations/it.json | 3 +- .../components/ios/.translations/ko.json | 3 +- .../components/ios/.translations/lb.json | 3 +- .../components/ios/.translations/nl.json | 3 +- .../components/ios/.translations/nn.json | 3 +- .../components/ios/.translations/no.json | 3 +- .../components/ios/.translations/pl.json | 3 +- .../components/ios/.translations/pt-BR.json | 3 +- .../components/ios/.translations/pt.json | 3 +- .../components/ios/.translations/ro.json | 3 +- .../components/ios/.translations/ru.json | 3 +- .../components/ios/.translations/sl.json | 3 +- .../components/ios/.translations/sv.json | 3 +- .../components/ios/.translations/zh-Hans.json | 3 +- .../components/ios/.translations/zh-Hant.json | 3 +- .../components/ipma/.translations/bg.json | 3 +- .../components/ipma/.translations/ca.json | 3 +- .../components/ipma/.translations/da.json | 3 +- .../components/ipma/.translations/de.json | 3 +- .../components/ipma/.translations/en.json | 3 +- .../components/ipma/.translations/es-419.json | 3 +- .../components/ipma/.translations/es.json | 3 +- .../components/ipma/.translations/fr.json | 3 +- .../components/ipma/.translations/he.json | 3 +- .../components/ipma/.translations/hu.json | 3 +- .../components/ipma/.translations/it.json | 3 +- .../components/ipma/.translations/ko.json | 3 +- .../components/ipma/.translations/lb.json | 3 +- .../components/ipma/.translations/nl.json | 3 +- .../components/ipma/.translations/no.json | 3 +- .../components/ipma/.translations/pl.json | 3 +- .../components/ipma/.translations/pt-BR.json | 3 +- .../components/ipma/.translations/pt.json | 3 +- .../components/ipma/.translations/ru.json | 3 +- .../components/ipma/.translations/sl.json | 3 +- .../components/ipma/.translations/sv.json | 3 +- .../ipma/.translations/zh-Hans.json | 3 +- .../ipma/.translations/zh-Hant.json | 3 +- .../components/ipp/.translations/ca.json | 5 +- .../components/ipp/.translations/da.json | 3 +- .../components/ipp/.translations/de.json | 3 +- .../components/ipp/.translations/en.json | 3 +- .../components/ipp/.translations/es.json | 3 +- .../components/ipp/.translations/it.json | 3 +- .../components/ipp/.translations/ko.json | 3 +- .../components/ipp/.translations/lb.json | 3 +- .../components/ipp/.translations/no.json | 6 +-- .../components/ipp/.translations/pt.json | 8 ++++ .../components/ipp/.translations/ru.json | 3 +- .../components/ipp/.translations/sl.json | 34 ++++++++++++++ .../components/ipp/.translations/zh-Hant.json | 3 +- .../components/iqvia/.translations/bg.json | 3 +- .../components/iqvia/.translations/ca.json | 3 +- .../components/iqvia/.translations/da.json | 3 +- .../components/iqvia/.translations/de.json | 3 +- .../components/iqvia/.translations/en.json | 3 +- .../components/iqvia/.translations/es.json | 3 +- .../components/iqvia/.translations/fr.json | 3 +- .../components/iqvia/.translations/it.json | 3 +- .../components/iqvia/.translations/ko.json | 3 +- .../components/iqvia/.translations/lb.json | 3 +- .../components/iqvia/.translations/nl.json | 3 +- .../components/iqvia/.translations/nn.json | 3 +- .../components/iqvia/.translations/no.json | 3 +- .../components/iqvia/.translations/pl.json | 3 +- .../components/iqvia/.translations/pt-BR.json | 3 +- .../components/iqvia/.translations/ru.json | 3 +- .../components/iqvia/.translations/sl.json | 3 +- .../components/iqvia/.translations/sv.json | 3 +- .../iqvia/.translations/zh-Hans.json | 3 +- .../iqvia/.translations/zh-Hant.json | 3 +- .../components/izone/.translations/bg.json | 3 +- .../components/izone/.translations/ca.json | 3 +- .../components/izone/.translations/da.json | 3 +- .../components/izone/.translations/de.json | 3 +- .../components/izone/.translations/en.json | 3 +- .../components/izone/.translations/es.json | 3 +- .../components/izone/.translations/fr.json | 3 +- .../components/izone/.translations/hu.json | 3 +- .../components/izone/.translations/it.json | 3 +- .../components/izone/.translations/ko.json | 3 +- .../components/izone/.translations/lb.json | 3 +- .../components/izone/.translations/nl.json | 3 +- .../components/izone/.translations/nn.json | 3 +- .../components/izone/.translations/no.json | 3 +- .../components/izone/.translations/pl.json | 3 +- .../components/izone/.translations/ru.json | 3 +- .../components/izone/.translations/sl.json | 3 +- .../components/izone/.translations/sv.json | 3 +- .../izone/.translations/zh-Hant.json | 3 +- .../konnected/.translations/ca.json | 6 +-- .../konnected/.translations/da.json | 6 +-- .../konnected/.translations/de.json | 6 +-- .../konnected/.translations/en.json | 6 +-- .../konnected/.translations/es.json | 6 +-- .../konnected/.translations/fr.json | 3 +- .../konnected/.translations/it.json | 6 +-- .../konnected/.translations/ko.json | 6 +-- .../konnected/.translations/lb.json | 6 +-- .../konnected/.translations/nl.json | 6 +-- .../konnected/.translations/no.json | 6 +-- .../konnected/.translations/pl.json | 6 +-- .../konnected/.translations/ru.json | 6 +-- .../konnected/.translations/sl.json | 14 +++--- .../konnected/.translations/sv.json | 6 +-- .../konnected/.translations/zh-Hant.json | 6 +-- .../components/life360/.translations/bg.json | 3 +- .../components/life360/.translations/ca.json | 3 +- .../components/life360/.translations/da.json | 3 +- .../components/life360/.translations/de.json | 3 +- .../components/life360/.translations/en.json | 3 +- .../life360/.translations/es-419.json | 3 +- .../components/life360/.translations/es.json | 3 +- .../components/life360/.translations/fr.json | 3 +- .../components/life360/.translations/it.json | 3 +- .../components/life360/.translations/ko.json | 3 +- .../components/life360/.translations/lb.json | 3 +- .../components/life360/.translations/nl.json | 3 +- .../components/life360/.translations/nn.json | 3 +- .../components/life360/.translations/no.json | 3 +- .../components/life360/.translations/pl.json | 3 +- .../life360/.translations/pt-BR.json | 3 +- .../components/life360/.translations/ru.json | 3 +- .../components/life360/.translations/sl.json | 3 +- .../components/life360/.translations/sv.json | 3 +- .../life360/.translations/zh-Hant.json | 3 +- .../components/lifx/.translations/bg.json | 3 +- .../components/lifx/.translations/ca.json | 3 +- .../components/lifx/.translations/cs.json | 3 +- .../components/lifx/.translations/da.json | 3 +- .../components/lifx/.translations/de.json | 3 +- .../components/lifx/.translations/en.json | 3 +- .../components/lifx/.translations/es-419.json | 3 +- .../components/lifx/.translations/es.json | 3 +- .../components/lifx/.translations/fr.json | 3 +- .../components/lifx/.translations/hu.json | 3 +- .../components/lifx/.translations/it.json | 3 +- .../components/lifx/.translations/ko.json | 3 +- .../components/lifx/.translations/lb.json | 3 +- .../components/lifx/.translations/nl.json | 3 +- .../components/lifx/.translations/nn.json | 3 +- .../components/lifx/.translations/no.json | 3 +- .../components/lifx/.translations/pl.json | 3 +- .../components/lifx/.translations/pt-BR.json | 3 +- .../components/lifx/.translations/pt.json | 3 +- .../components/lifx/.translations/ro.json | 3 +- .../components/lifx/.translations/ru.json | 3 +- .../components/lifx/.translations/sl.json | 3 +- .../components/lifx/.translations/sv.json | 3 +- .../lifx/.translations/zh-Hans.json | 3 +- .../lifx/.translations/zh-Hant.json | 3 +- .../components/light/.translations/af.json | 3 ++ .../components/light/.translations/ar.json | 3 ++ .../components/light/.translations/bg.json | 3 +- .../components/light/.translations/bs.json | 3 ++ .../components/light/.translations/ca.json | 4 +- .../components/light/.translations/cs.json | 3 ++ .../components/light/.translations/cy.json | 3 ++ .../components/light/.translations/da.json | 3 +- .../components/light/.translations/de.json | 3 +- .../components/light/.translations/el.json | 3 ++ .../components/light/.translations/en.json | 3 +- .../light/.translations/es-419.json | 3 +- .../components/light/.translations/es.json | 3 +- .../components/light/.translations/et.json | 3 ++ .../components/light/.translations/eu.json | 3 ++ .../components/light/.translations/fa.json | 3 ++ .../components/light/.translations/fi.json | 3 ++ .../components/light/.translations/fr.json | 3 +- .../components/light/.translations/gsw.json | 3 ++ .../components/light/.translations/he.json | 3 ++ .../components/light/.translations/hi.json | 3 ++ .../components/light/.translations/hr.json | 3 ++ .../components/light/.translations/hu.json | 3 +- .../components/light/.translations/hy.json | 3 ++ .../components/light/.translations/id.json | 3 ++ .../components/light/.translations/is.json | 3 ++ .../components/light/.translations/it.json | 3 +- .../components/light/.translations/ja.json | 3 ++ .../components/light/.translations/ko.json | 3 +- .../components/light/.translations/lb.json | 3 +- .../components/light/.translations/lv.json | 3 +- .../components/light/.translations/nb.json | 3 ++ .../components/light/.translations/nl.json | 3 +- .../components/light/.translations/nn.json | 3 ++ .../components/light/.translations/pl.json | 3 +- .../components/light/.translations/pt-BR.json | 3 +- .../components/light/.translations/pt.json | 3 +- .../components/light/.translations/ro.json | 3 ++ .../components/light/.translations/ru.json | 3 +- .../components/light/.translations/sk.json | 3 ++ .../components/light/.translations/sl.json | 4 +- .../components/light/.translations/sv.json | 3 +- .../components/light/.translations/ta.json | 3 ++ .../components/light/.translations/te.json | 3 ++ .../components/light/.translations/th.json | 3 ++ .../components/light/.translations/tr.json | 3 ++ .../components/light/.translations/uk.json | 3 ++ .../components/light/.translations/vi.json | 3 ++ .../light/.translations/zh-Hans.json | 3 +- .../light/.translations/zh-Hant.json | 3 +- .../components/linky/.translations/bg.json | 3 +- .../components/linky/.translations/ca.json | 3 +- .../components/linky/.translations/da.json | 3 +- .../components/linky/.translations/de.json | 3 +- .../components/linky/.translations/en.json | 3 +- .../linky/.translations/es-419.json | 3 +- .../components/linky/.translations/es.json | 3 +- .../components/linky/.translations/fr.json | 3 +- .../components/linky/.translations/it.json | 3 +- .../components/linky/.translations/ko.json | 3 +- .../components/linky/.translations/lb.json | 3 +- .../components/linky/.translations/nl.json | 3 +- .../components/linky/.translations/nn.json | 3 +- .../components/linky/.translations/no.json | 3 +- .../components/linky/.translations/pl.json | 3 +- .../components/linky/.translations/pt-BR.json | 3 +- .../components/linky/.translations/ru.json | 3 +- .../components/linky/.translations/sl.json | 3 +- .../components/linky/.translations/sv.json | 3 +- .../linky/.translations/zh-Hant.json | 3 +- .../components/local_ip/.translations/ca.json | 1 - .../components/local_ip/.translations/da.json | 3 -- .../components/local_ip/.translations/de.json | 1 - .../components/local_ip/.translations/en.json | 1 - .../components/local_ip/.translations/es.json | 1 - .../components/local_ip/.translations/fr.json | 1 - .../components/local_ip/.translations/hu.json | 3 -- .../components/local_ip/.translations/it.json | 1 - .../components/local_ip/.translations/ko.json | 3 -- .../components/local_ip/.translations/lb.json | 3 -- .../components/local_ip/.translations/nl.json | 3 -- .../components/local_ip/.translations/no.json | 1 - .../components/local_ip/.translations/pl.json | 3 -- .../local_ip/.translations/pt-BR.json | 3 -- .../components/local_ip/.translations/ru.json | 1 - .../components/local_ip/.translations/sl.json | 2 +- .../components/local_ip/.translations/sv.json | 3 -- .../local_ip/.translations/zh-Hant.json | 1 - .../components/locative/.translations/bg.json | 3 +- .../components/locative/.translations/ca.json | 3 +- .../components/locative/.translations/cs.json | 3 +- .../components/locative/.translations/da.json | 3 +- .../components/locative/.translations/de.json | 3 +- .../components/locative/.translations/en.json | 3 +- .../locative/.translations/es-419.json | 3 +- .../components/locative/.translations/es.json | 3 +- .../components/locative/.translations/fr.json | 3 +- .../components/locative/.translations/hu.json | 3 +- .../components/locative/.translations/it.json | 3 +- .../components/locative/.translations/ko.json | 3 +- .../components/locative/.translations/lb.json | 3 +- .../components/locative/.translations/nl.json | 3 +- .../components/locative/.translations/no.json | 3 +- .../components/locative/.translations/pl.json | 3 +- .../locative/.translations/pt-BR.json | 3 +- .../components/locative/.translations/pt.json | 3 +- .../components/locative/.translations/ru.json | 3 +- .../components/locative/.translations/sl.json | 3 +- .../components/locative/.translations/sv.json | 3 +- .../locative/.translations/zh-Hans.json | 3 +- .../locative/.translations/zh-Hant.json | 3 +- .../components/lock/.translations/af.json | 3 ++ .../components/lock/.translations/ar.json | 3 ++ .../components/lock/.translations/bg.json | 3 +- .../components/lock/.translations/bs.json | 3 ++ .../components/lock/.translations/ca.json | 3 +- .../components/lock/.translations/cs.json | 3 +- .../components/lock/.translations/cy.json | 3 ++ .../components/lock/.translations/da.json | 3 +- .../components/lock/.translations/de.json | 3 +- .../components/lock/.translations/el.json | 3 ++ .../components/lock/.translations/en.json | 3 +- .../components/lock/.translations/es-419.json | 3 ++ .../components/lock/.translations/es.json | 3 +- .../components/lock/.translations/et.json | 3 ++ .../components/lock/.translations/eu.json | 3 ++ .../components/lock/.translations/fa.json | 3 ++ .../components/lock/.translations/fi.json | 3 ++ .../components/lock/.translations/fr.json | 3 +- .../components/lock/.translations/gsw.json | 3 ++ .../components/lock/.translations/he.json | 3 ++ .../components/lock/.translations/hi.json | 3 ++ .../components/lock/.translations/hr.json | 3 ++ .../components/lock/.translations/hu.json | 3 +- .../components/lock/.translations/hy.json | 3 ++ .../components/lock/.translations/id.json | 3 ++ .../components/lock/.translations/is.json | 3 ++ .../components/lock/.translations/it.json | 3 +- .../components/lock/.translations/ko.json | 3 +- .../components/lock/.translations/lb.json | 3 +- .../components/lock/.translations/lv.json | 3 ++ .../components/lock/.translations/nb.json | 3 ++ .../components/lock/.translations/nl.json | 3 +- .../components/lock/.translations/nn.json | 3 ++ .../components/lock/.translations/pl.json | 3 +- .../components/lock/.translations/pt-BR.json | 3 +- .../components/lock/.translations/pt.json | 3 +- .../components/lock/.translations/ro.json | 3 ++ .../components/lock/.translations/ru.json | 3 +- .../components/lock/.translations/sk.json | 3 ++ .../components/lock/.translations/sl.json | 3 +- .../components/lock/.translations/sv.json | 3 +- .../components/lock/.translations/ta.json | 3 ++ .../components/lock/.translations/te.json | 3 ++ .../components/lock/.translations/th.json | 3 ++ .../components/lock/.translations/tr.json | 3 ++ .../components/lock/.translations/uk.json | 3 ++ .../components/lock/.translations/vi.json | 3 ++ .../lock/.translations/zh-Hans.json | 3 +- .../lock/.translations/zh-Hant.json | 3 +- .../logi_circle/.translations/bg.json | 3 +- .../logi_circle/.translations/ca.json | 3 +- .../logi_circle/.translations/da.json | 3 +- .../logi_circle/.translations/de.json | 3 +- .../logi_circle/.translations/en.json | 3 +- .../logi_circle/.translations/es-419.json | 3 +- .../logi_circle/.translations/es.json | 3 +- .../logi_circle/.translations/fr.json | 3 +- .../logi_circle/.translations/it.json | 3 +- .../logi_circle/.translations/ko.json | 3 +- .../logi_circle/.translations/lb.json | 3 +- .../logi_circle/.translations/nl.json | 3 +- .../logi_circle/.translations/nn.json | 3 +- .../logi_circle/.translations/no.json | 3 +- .../logi_circle/.translations/pl.json | 3 +- .../logi_circle/.translations/pt-BR.json | 3 +- .../logi_circle/.translations/ru.json | 3 +- .../logi_circle/.translations/sl.json | 3 +- .../logi_circle/.translations/sv.json | 3 +- .../logi_circle/.translations/zh-Hant.json | 3 +- .../components/lovelace/.translations/af.json | 3 ++ .../components/lovelace/.translations/bg.json | 3 ++ .../components/lovelace/.translations/ca.json | 3 ++ .../components/lovelace/.translations/cs.json | 3 ++ .../components/lovelace/.translations/cy.json | 3 ++ .../components/lovelace/.translations/da.json | 3 ++ .../components/lovelace/.translations/de.json | 3 ++ .../components/lovelace/.translations/el.json | 3 ++ .../components/lovelace/.translations/en.json | 3 ++ .../lovelace/.translations/es-419.json | 3 ++ .../components/lovelace/.translations/es.json | 3 ++ .../components/lovelace/.translations/et.json | 3 ++ .../components/lovelace/.translations/eu.json | 3 ++ .../components/lovelace/.translations/fa.json | 3 ++ .../components/lovelace/.translations/fi.json | 3 ++ .../components/lovelace/.translations/fr.json | 3 ++ .../components/lovelace/.translations/he.json | 3 ++ .../components/lovelace/.translations/hr.json | 3 ++ .../components/lovelace/.translations/hu.json | 3 ++ .../components/lovelace/.translations/hy.json | 3 ++ .../components/lovelace/.translations/is.json | 3 ++ .../components/lovelace/.translations/it.json | 3 ++ .../components/lovelace/.translations/ko.json | 3 ++ .../components/lovelace/.translations/lb.json | 3 ++ .../components/lovelace/.translations/lt.json | 3 ++ .../components/lovelace/.translations/lv.json | 3 ++ .../components/lovelace/.translations/nb.json | 3 ++ .../components/lovelace/.translations/nl.json | 3 ++ .../components/lovelace/.translations/nn.json | 3 ++ .../components/lovelace/.translations/pl.json | 3 ++ .../lovelace/.translations/pt-BR.json | 3 ++ .../components/lovelace/.translations/pt.json | 3 ++ .../components/lovelace/.translations/ro.json | 3 ++ .../components/lovelace/.translations/ru.json | 3 ++ .../components/lovelace/.translations/sk.json | 3 ++ .../components/lovelace/.translations/sl.json | 3 ++ .../components/lovelace/.translations/sv.json | 3 ++ .../components/lovelace/.translations/th.json | 3 ++ .../components/lovelace/.translations/tr.json | 3 ++ .../components/lovelace/.translations/uk.json | 3 ++ .../components/lovelace/.translations/vi.json | 3 ++ .../lovelace/.translations/zh-Hans.json | 3 ++ .../lovelace/.translations/zh-Hant.json | 3 ++ .../luftdaten/.translations/bg.json | 3 +- .../luftdaten/.translations/ca.json | 3 +- .../luftdaten/.translations/cs.json | 3 +- .../luftdaten/.translations/da.json | 3 +- .../luftdaten/.translations/de.json | 3 +- .../luftdaten/.translations/en.json | 3 +- .../luftdaten/.translations/es-419.json | 3 +- .../luftdaten/.translations/es.json | 3 +- .../luftdaten/.translations/fr.json | 3 +- .../luftdaten/.translations/hu.json | 3 +- .../luftdaten/.translations/it.json | 3 +- .../luftdaten/.translations/ko.json | 3 +- .../luftdaten/.translations/lb.json | 3 +- .../luftdaten/.translations/nl.json | 3 +- .../luftdaten/.translations/no.json | 3 +- .../luftdaten/.translations/pl.json | 3 +- .../luftdaten/.translations/pt-BR.json | 3 +- .../luftdaten/.translations/pt.json | 3 +- .../luftdaten/.translations/ru.json | 3 +- .../luftdaten/.translations/sl.json | 3 +- .../luftdaten/.translations/sv.json | 3 +- .../luftdaten/.translations/zh-Hans.json | 3 +- .../luftdaten/.translations/zh-Hant.json | 3 +- .../components/mailbox/.translations/af.json | 3 ++ .../components/mailbox/.translations/ar.json | 3 ++ .../components/mailbox/.translations/bg.json | 3 ++ .../components/mailbox/.translations/bs.json | 3 ++ .../components/mailbox/.translations/ca.json | 3 ++ .../components/mailbox/.translations/cs.json | 3 ++ .../components/mailbox/.translations/cy.json | 3 ++ .../components/mailbox/.translations/da.json | 3 ++ .../components/mailbox/.translations/de.json | 3 ++ .../components/mailbox/.translations/el.json | 3 ++ .../components/mailbox/.translations/en.json | 3 ++ .../mailbox/.translations/es-419.json | 3 ++ .../components/mailbox/.translations/es.json | 3 ++ .../components/mailbox/.translations/et.json | 3 ++ .../components/mailbox/.translations/eu.json | 3 ++ .../components/mailbox/.translations/fa.json | 3 ++ .../components/mailbox/.translations/fi.json | 3 ++ .../components/mailbox/.translations/fr.json | 3 ++ .../components/mailbox/.translations/he.json | 3 ++ .../components/mailbox/.translations/hi.json | 3 ++ .../components/mailbox/.translations/hr.json | 3 ++ .../components/mailbox/.translations/hu.json | 3 ++ .../components/mailbox/.translations/hy.json | 3 ++ .../components/mailbox/.translations/id.json | 3 ++ .../components/mailbox/.translations/is.json | 3 ++ .../components/mailbox/.translations/it.json | 3 ++ .../components/mailbox/.translations/ja.json | 3 ++ .../components/mailbox/.translations/ko.json | 3 ++ .../components/mailbox/.translations/lb.json | 3 ++ .../components/mailbox/.translations/lv.json | 3 ++ .../components/mailbox/.translations/nb.json | 3 ++ .../components/mailbox/.translations/nl.json | 3 ++ .../components/mailbox/.translations/nn.json | 3 ++ .../components/mailbox/.translations/pl.json | 3 ++ .../mailbox/.translations/pt-BR.json | 3 ++ .../components/mailbox/.translations/pt.json | 3 ++ .../components/mailbox/.translations/ro.json | 3 ++ .../components/mailbox/.translations/ru.json | 3 ++ .../components/mailbox/.translations/sk.json | 3 ++ .../components/mailbox/.translations/sl.json | 3 ++ .../components/mailbox/.translations/sv.json | 3 ++ .../components/mailbox/.translations/ta.json | 3 ++ .../components/mailbox/.translations/te.json | 3 ++ .../components/mailbox/.translations/th.json | 3 ++ .../components/mailbox/.translations/tr.json | 3 ++ .../components/mailbox/.translations/uk.json | 3 ++ .../components/mailbox/.translations/vi.json | 3 ++ .../mailbox/.translations/zh-Hans.json | 3 ++ .../mailbox/.translations/zh-Hant.json | 3 ++ .../components/mailgun/.translations/bg.json | 3 +- .../components/mailgun/.translations/ca.json | 3 +- .../components/mailgun/.translations/cs.json | 3 +- .../components/mailgun/.translations/da.json | 3 +- .../components/mailgun/.translations/de.json | 3 +- .../components/mailgun/.translations/en.json | 3 +- .../mailgun/.translations/es-419.json | 3 +- .../components/mailgun/.translations/es.json | 3 +- .../components/mailgun/.translations/fr.json | 3 +- .../components/mailgun/.translations/hu.json | 3 +- .../components/mailgun/.translations/it.json | 3 +- .../components/mailgun/.translations/ko.json | 3 +- .../components/mailgun/.translations/lb.json | 3 +- .../components/mailgun/.translations/nl.json | 3 +- .../components/mailgun/.translations/no.json | 3 +- .../components/mailgun/.translations/pl.json | 3 +- .../mailgun/.translations/pt-BR.json | 3 +- .../components/mailgun/.translations/pt.json | 3 +- .../components/mailgun/.translations/ru.json | 3 +- .../components/mailgun/.translations/sl.json | 3 +- .../components/mailgun/.translations/sv.json | 3 +- .../mailgun/.translations/zh-Hans.json | 3 +- .../mailgun/.translations/zh-Hant.json | 3 +- .../media_player/.translations/af.json | 3 ++ .../media_player/.translations/ar.json | 3 ++ .../media_player/.translations/bg.json | 3 +- .../media_player/.translations/bs.json | 3 ++ .../media_player/.translations/ca.json | 3 +- .../media_player/.translations/cs.json | 3 +- .../media_player/.translations/cy.json | 3 ++ .../media_player/.translations/da.json | 3 +- .../media_player/.translations/de.json | 3 +- .../media_player/.translations/el.json | 3 ++ .../media_player/.translations/en.json | 3 +- .../media_player/.translations/es-419.json | 3 ++ .../media_player/.translations/es.json | 3 +- .../media_player/.translations/et.json | 3 ++ .../media_player/.translations/fi.json | 3 ++ .../media_player/.translations/fr.json | 3 +- .../media_player/.translations/he.json | 3 ++ .../media_player/.translations/hi.json | 3 ++ .../media_player/.translations/hr.json | 3 ++ .../media_player/.translations/hu.json | 3 +- .../media_player/.translations/hy.json | 3 ++ .../media_player/.translations/id.json | 3 ++ .../media_player/.translations/is.json | 3 ++ .../media_player/.translations/it.json | 3 +- .../media_player/.translations/ja.json | 3 ++ .../media_player/.translations/ko.json | 3 +- .../media_player/.translations/lb.json | 3 +- .../media_player/.translations/lv.json | 3 ++ .../media_player/.translations/nb.json | 3 ++ .../media_player/.translations/nl.json | 3 +- .../media_player/.translations/nn.json | 3 ++ .../media_player/.translations/pl.json | 3 +- .../media_player/.translations/pt-BR.json | 3 ++ .../media_player/.translations/pt.json | 3 ++ .../media_player/.translations/ro.json | 3 ++ .../media_player/.translations/ru.json | 3 +- .../media_player/.translations/sk.json | 3 ++ .../media_player/.translations/sl.json | 3 +- .../media_player/.translations/sv.json | 3 +- .../media_player/.translations/ta.json | 3 ++ .../media_player/.translations/te.json | 3 ++ .../media_player/.translations/th.json | 3 ++ .../media_player/.translations/tr.json | 3 ++ .../media_player/.translations/uk.json | 3 ++ .../media_player/.translations/vi.json | 3 ++ .../media_player/.translations/zh-Hans.json | 3 +- .../media_player/.translations/zh-Hant.json | 3 +- .../components/melcloud/.translations/ca.json | 3 +- .../components/melcloud/.translations/da.json | 3 +- .../components/melcloud/.translations/de.json | 3 +- .../components/melcloud/.translations/en.json | 3 +- .../components/melcloud/.translations/es.json | 3 +- .../components/melcloud/.translations/fr.json | 3 +- .../components/melcloud/.translations/it.json | 3 +- .../components/melcloud/.translations/ko.json | 3 +- .../components/melcloud/.translations/lb.json | 3 +- .../components/melcloud/.translations/nl.json | 3 +- .../components/melcloud/.translations/no.json | 3 +- .../components/melcloud/.translations/pl.json | 3 +- .../components/melcloud/.translations/ru.json | 3 +- .../components/melcloud/.translations/sl.json | 3 +- .../components/melcloud/.translations/sv.json | 3 +- .../melcloud/.translations/zh-Hant.json | 3 +- .../components/met/.translations/bg.json | 3 +- .../components/met/.translations/ca.json | 3 +- .../components/met/.translations/da.json | 3 +- .../components/met/.translations/de.json | 3 +- .../components/met/.translations/en.json | 3 +- .../components/met/.translations/es-419.json | 3 +- .../components/met/.translations/es.json | 3 +- .../components/met/.translations/fr.json | 3 +- .../components/met/.translations/hr.json | 3 +- .../components/met/.translations/hu.json | 3 +- .../components/met/.translations/it.json | 3 +- .../components/met/.translations/ko.json | 3 +- .../components/met/.translations/lb.json | 3 +- .../components/met/.translations/nl.json | 3 +- .../components/met/.translations/nn.json | 3 +- .../components/met/.translations/no.json | 3 +- .../components/met/.translations/pl.json | 3 +- .../components/met/.translations/pt-BR.json | 3 +- .../components/met/.translations/ru.json | 3 +- .../components/met/.translations/sl.json | 3 +- .../components/met/.translations/sv.json | 3 +- .../components/met/.translations/zh-Hant.json | 3 +- .../meteo_france/.translations/ca.json | 3 +- .../meteo_france/.translations/da.json | 3 +- .../meteo_france/.translations/de.json | 3 +- .../meteo_france/.translations/en.json | 3 +- .../meteo_france/.translations/es.json | 3 +- .../meteo_france/.translations/fr.json | 3 +- .../meteo_france/.translations/hu.json | 3 +- .../meteo_france/.translations/it.json | 3 +- .../meteo_france/.translations/ko.json | 3 +- .../meteo_france/.translations/lb.json | 3 +- .../meteo_france/.translations/nl.json | 3 +- .../meteo_france/.translations/no.json | 3 +- .../meteo_france/.translations/pl.json | 3 +- .../meteo_france/.translations/ru.json | 3 +- .../meteo_france/.translations/sl.json | 3 +- .../meteo_france/.translations/sv.json | 3 +- .../meteo_france/.translations/zh-Hant.json | 3 +- .../components/mikrotik/.translations/ca.json | 3 +- .../components/mikrotik/.translations/da.json | 3 +- .../components/mikrotik/.translations/de.json | 3 +- .../components/mikrotik/.translations/en.json | 3 +- .../components/mikrotik/.translations/es.json | 3 +- .../components/mikrotik/.translations/fr.json | 3 +- .../components/mikrotik/.translations/hu.json | 3 +- .../components/mikrotik/.translations/it.json | 3 +- .../components/mikrotik/.translations/ko.json | 3 +- .../components/mikrotik/.translations/lb.json | 3 +- .../components/mikrotik/.translations/lv.json | 3 +- .../components/mikrotik/.translations/nl.json | 3 +- .../components/mikrotik/.translations/no.json | 3 +- .../components/mikrotik/.translations/pl.json | 3 +- .../components/mikrotik/.translations/ru.json | 3 +- .../components/mikrotik/.translations/sl.json | 3 +- .../components/mikrotik/.translations/sv.json | 3 +- .../mikrotik/.translations/zh-Hant.json | 3 +- .../minecraft_server/.translations/ca.json | 3 +- .../minecraft_server/.translations/da.json | 3 +- .../minecraft_server/.translations/de.json | 3 +- .../minecraft_server/.translations/en.json | 3 +- .../minecraft_server/.translations/es.json | 3 +- .../minecraft_server/.translations/fr.json | 3 +- .../minecraft_server/.translations/hu.json | 3 +- .../minecraft_server/.translations/it.json | 3 +- .../minecraft_server/.translations/ko.json | 3 +- .../minecraft_server/.translations/lb.json | 3 +- .../minecraft_server/.translations/nl.json | 3 +- .../minecraft_server/.translations/no.json | 3 +- .../minecraft_server/.translations/pl.json | 3 +- .../minecraft_server/.translations/ru.json | 3 +- .../minecraft_server/.translations/sl.json | 3 +- .../minecraft_server/.translations/sv.json | 3 +- .../minecraft_server/.translations/tr.json | 3 +- .../.translations/zh-Hant.json | 3 +- .../mobile_app/.translations/bg.json | 3 +- .../mobile_app/.translations/ca.json | 3 +- .../mobile_app/.translations/cs.json | 3 +- .../mobile_app/.translations/da.json | 3 +- .../mobile_app/.translations/de.json | 3 +- .../mobile_app/.translations/en.json | 3 +- .../mobile_app/.translations/es-419.json | 3 +- .../mobile_app/.translations/es.json | 3 +- .../mobile_app/.translations/fr.json | 3 +- .../mobile_app/.translations/hu.json | 3 +- .../mobile_app/.translations/it.json | 3 +- .../mobile_app/.translations/ko.json | 3 +- .../mobile_app/.translations/lb.json | 3 +- .../mobile_app/.translations/nl.json | 3 +- .../mobile_app/.translations/nn.json | 3 +- .../mobile_app/.translations/no.json | 3 +- .../mobile_app/.translations/pl.json | 3 +- .../mobile_app/.translations/pt-BR.json | 3 +- .../mobile_app/.translations/pt.json | 3 +- .../mobile_app/.translations/ru.json | 3 +- .../mobile_app/.translations/sl.json | 3 +- .../mobile_app/.translations/sv.json | 3 +- .../mobile_app/.translations/uk.json | 3 +- .../mobile_app/.translations/vi.json | 3 +- .../mobile_app/.translations/zh-Hans.json | 3 +- .../mobile_app/.translations/zh-Hant.json | 3 +- .../monoprice/.translations/ca.json | 3 +- .../monoprice/.translations/de.json | 3 +- .../monoprice/.translations/en.json | 3 +- .../monoprice/.translations/es.json | 3 +- .../monoprice/.translations/it.json | 3 +- .../monoprice/.translations/ko.json | 3 +- .../monoprice/.translations/lb.json | 3 +- .../monoprice/.translations/no.json | 3 +- .../monoprice/.translations/ru.json | 3 +- .../monoprice/.translations/sl.json | 40 ++++++++++++++++ .../monoprice/.translations/zh-Hant.json | 3 +- .../components/mqtt/.translations/bg.json | 3 +- .../components/mqtt/.translations/ca.json | 3 +- .../components/mqtt/.translations/cs.json | 3 +- .../components/mqtt/.translations/da.json | 3 +- .../components/mqtt/.translations/de.json | 3 +- .../components/mqtt/.translations/en.json | 3 +- .../components/mqtt/.translations/es-419.json | 3 +- .../components/mqtt/.translations/es.json | 3 +- .../components/mqtt/.translations/et.json | 3 +- .../components/mqtt/.translations/fr.json | 3 +- .../components/mqtt/.translations/he.json | 3 +- .../components/mqtt/.translations/hr.json | 3 +- .../components/mqtt/.translations/hu.json | 3 +- .../components/mqtt/.translations/id.json | 3 +- .../components/mqtt/.translations/it.json | 3 +- .../components/mqtt/.translations/ko.json | 3 +- .../components/mqtt/.translations/lb.json | 3 +- .../components/mqtt/.translations/nl.json | 3 +- .../components/mqtt/.translations/nn.json | 3 +- .../components/mqtt/.translations/no.json | 3 +- .../components/mqtt/.translations/pl.json | 3 +- .../components/mqtt/.translations/pt-BR.json | 3 +- .../components/mqtt/.translations/pt.json | 3 +- .../components/mqtt/.translations/ro.json | 3 +- .../components/mqtt/.translations/ru.json | 3 +- .../components/mqtt/.translations/sl.json | 3 +- .../components/mqtt/.translations/sv.json | 3 +- .../mqtt/.translations/zh-Hans.json | 3 +- .../mqtt/.translations/zh-Hant.json | 3 +- .../components/myq/.translations/ca.json | 3 +- .../components/myq/.translations/de.json | 3 +- .../components/myq/.translations/en.json | 3 +- .../components/myq/.translations/es.json | 3 +- .../components/myq/.translations/fr.json | 3 +- .../components/myq/.translations/it.json | 3 +- .../components/myq/.translations/ko.json | 3 +- .../components/myq/.translations/lb.json | 3 +- .../components/myq/.translations/no.json | 3 +- .../components/myq/.translations/ru.json | 3 +- .../components/myq/.translations/sl.json | 21 +++++++++ .../components/myq/.translations/zh-Hant.json | 3 +- .../components/neato/.translations/bg.json | 3 +- .../components/neato/.translations/ca.json | 3 +- .../components/neato/.translations/da.json | 3 +- .../components/neato/.translations/de.json | 3 +- .../components/neato/.translations/en.json | 3 +- .../components/neato/.translations/es.json | 3 +- .../components/neato/.translations/fr.json | 3 +- .../components/neato/.translations/hu.json | 3 +- .../components/neato/.translations/it.json | 3 +- .../components/neato/.translations/ko.json | 3 +- .../components/neato/.translations/lb.json | 3 +- .../components/neato/.translations/lv.json | 3 +- .../components/neato/.translations/nl.json | 3 +- .../components/neato/.translations/nn.json | 3 +- .../components/neato/.translations/no.json | 3 +- .../components/neato/.translations/pl.json | 3 +- .../components/neato/.translations/ru.json | 3 +- .../components/neato/.translations/sl.json | 3 +- .../components/neato/.translations/sv.json | 3 +- .../neato/.translations/zh-Hant.json | 3 +- .../components/nest/.translations/bg.json | 3 +- .../components/nest/.translations/ca.json | 3 +- .../components/nest/.translations/cs.json | 3 +- .../components/nest/.translations/da.json | 3 +- .../components/nest/.translations/de.json | 3 +- .../components/nest/.translations/en.json | 3 +- .../components/nest/.translations/es-419.json | 3 +- .../components/nest/.translations/es.json | 3 +- .../components/nest/.translations/et.json | 3 +- .../components/nest/.translations/fr.json | 3 +- .../components/nest/.translations/he.json | 3 +- .../components/nest/.translations/hr.json | 3 +- .../components/nest/.translations/hu.json | 3 +- .../components/nest/.translations/id.json | 3 +- .../components/nest/.translations/it.json | 3 +- .../components/nest/.translations/ko.json | 3 +- .../components/nest/.translations/lb.json | 3 +- .../components/nest/.translations/nl.json | 3 +- .../components/nest/.translations/nn.json | 3 +- .../components/nest/.translations/no.json | 3 +- .../components/nest/.translations/pl.json | 3 +- .../components/nest/.translations/pt-BR.json | 3 +- .../components/nest/.translations/pt.json | 5 +- .../components/nest/.translations/ro.json | 3 +- .../components/nest/.translations/ru.json | 3 +- .../components/nest/.translations/sl.json | 3 +- .../components/nest/.translations/sv.json | 3 +- .../components/nest/.translations/th.json | 3 +- .../components/nest/.translations/vi.json | 3 +- .../nest/.translations/zh-Hans.json | 3 +- .../nest/.translations/zh-Hant.json | 3 +- .../components/netatmo/.translations/ca.json | 3 +- .../components/netatmo/.translations/da.json | 3 +- .../components/netatmo/.translations/de.json | 3 +- .../components/netatmo/.translations/en.json | 3 +- .../components/netatmo/.translations/es.json | 3 +- .../components/netatmo/.translations/fr.json | 3 +- .../components/netatmo/.translations/hu.json | 3 +- .../components/netatmo/.translations/it.json | 3 +- .../components/netatmo/.translations/ko.json | 3 +- .../components/netatmo/.translations/lb.json | 3 +- .../components/netatmo/.translations/nl.json | 3 +- .../components/netatmo/.translations/no.json | 3 +- .../components/netatmo/.translations/pl.json | 3 +- .../components/netatmo/.translations/ru.json | 3 +- .../components/netatmo/.translations/sl.json | 3 +- .../components/netatmo/.translations/sv.json | 3 +- .../netatmo/.translations/zh-Hant.json | 3 +- .../components/nexia/.translations/ca.json | 3 +- .../components/nexia/.translations/de.json | 3 +- .../components/nexia/.translations/en.json | 3 +- .../components/nexia/.translations/es.json | 3 +- .../components/nexia/.translations/fr.json | 3 +- .../components/nexia/.translations/it.json | 3 +- .../components/nexia/.translations/ko.json | 3 +- .../components/nexia/.translations/lb.json | 3 +- .../components/nexia/.translations/no.json | 3 +- .../components/nexia/.translations/ru.json | 3 +- .../components/nexia/.translations/sl.json | 21 +++++++++ .../nexia/.translations/zh-Hant.json | 3 +- .../components/notify/.translations/af.json | 3 ++ .../components/notify/.translations/ar.json | 3 ++ .../components/notify/.translations/bg.json | 3 ++ .../components/notify/.translations/bs.json | 3 ++ .../components/notify/.translations/ca.json | 3 ++ .../components/notify/.translations/cs.json | 3 ++ .../components/notify/.translations/cy.json | 3 ++ .../components/notify/.translations/da.json | 3 ++ .../components/notify/.translations/de.json | 3 ++ .../components/notify/.translations/el.json | 3 ++ .../components/notify/.translations/en.json | 3 ++ .../notify/.translations/es-419.json | 3 ++ .../components/notify/.translations/es.json | 3 ++ .../components/notify/.translations/et.json | 3 ++ .../components/notify/.translations/eu.json | 3 ++ .../components/notify/.translations/fi.json | 3 ++ .../components/notify/.translations/fr.json | 3 ++ .../components/notify/.translations/he.json | 3 ++ .../components/notify/.translations/hi.json | 3 ++ .../components/notify/.translations/hr.json | 3 ++ .../components/notify/.translations/hu.json | 3 ++ .../components/notify/.translations/hy.json | 3 ++ .../components/notify/.translations/id.json | 3 ++ .../components/notify/.translations/is.json | 3 ++ .../components/notify/.translations/it.json | 3 ++ .../components/notify/.translations/ja.json | 3 ++ .../components/notify/.translations/ko.json | 3 ++ .../components/notify/.translations/lb.json | 3 ++ .../components/notify/.translations/lv.json | 3 ++ .../components/notify/.translations/nb.json | 3 ++ .../components/notify/.translations/nl.json | 3 ++ .../components/notify/.translations/nn.json | 3 ++ .../components/notify/.translations/pl.json | 3 ++ .../notify/.translations/pt-BR.json | 3 ++ .../components/notify/.translations/pt.json | 3 ++ .../components/notify/.translations/ro.json | 3 ++ .../components/notify/.translations/ru.json | 3 ++ .../components/notify/.translations/sk.json | 3 ++ .../components/notify/.translations/sl.json | 3 ++ .../components/notify/.translations/sv.json | 3 ++ .../components/notify/.translations/ta.json | 3 ++ .../components/notify/.translations/te.json | 3 ++ .../components/notify/.translations/th.json | 3 ++ .../components/notify/.translations/tr.json | 3 ++ .../components/notify/.translations/uk.json | 3 ++ .../components/notify/.translations/vi.json | 3 ++ .../notify/.translations/zh-Hans.json | 3 ++ .../notify/.translations/zh-Hant.json | 3 ++ .../components/notion/.translations/bg.json | 3 +- .../components/notion/.translations/ca.json | 3 +- .../components/notion/.translations/cy.json | 3 +- .../components/notion/.translations/da.json | 3 +- .../components/notion/.translations/de.json | 3 +- .../components/notion/.translations/en.json | 3 +- .../notion/.translations/es-419.json | 3 +- .../components/notion/.translations/es.json | 3 +- .../components/notion/.translations/fr.json | 3 +- .../components/notion/.translations/hr.json | 3 +- .../components/notion/.translations/it.json | 3 +- .../components/notion/.translations/ko.json | 3 +- .../components/notion/.translations/lb.json | 3 +- .../components/notion/.translations/nl.json | 3 +- .../components/notion/.translations/no.json | 3 +- .../components/notion/.translations/pl.json | 3 +- .../notion/.translations/pt-BR.json | 3 +- .../components/notion/.translations/ru.json | 3 +- .../components/notion/.translations/sl.json | 3 +- .../components/notion/.translations/sv.json | 3 +- .../notion/.translations/zh-Hans.json | 3 +- .../notion/.translations/zh-Hant.json | 3 +- .../components/nuheat/.translations/ca.json | 3 +- .../components/nuheat/.translations/de.json | 3 +- .../components/nuheat/.translations/en.json | 3 +- .../components/nuheat/.translations/es.json | 3 +- .../components/nuheat/.translations/fr.json | 3 +- .../components/nuheat/.translations/it.json | 3 +- .../components/nuheat/.translations/ko.json | 3 +- .../components/nuheat/.translations/lb.json | 3 +- .../components/nuheat/.translations/no.json | 3 +- .../components/nuheat/.translations/ru.json | 3 +- .../components/nuheat/.translations/sl.json | 24 ++++++++++ .../nuheat/.translations/zh-Hant.json | 3 +- .../components/nut/.translations/ca.json | 7 +-- .../components/nut/.translations/de.json | 3 -- .../components/nut/.translations/en.json | 7 +-- .../components/nut/.translations/es.json | 7 +-- .../components/nut/.translations/it.json | 7 +-- .../components/nut/.translations/ko.json | 7 +-- .../components/nut/.translations/lb.json | 7 +-- .../components/nut/.translations/nl.json | 6 +-- .../components/nut/.translations/no.json | 20 +++++--- .../components/nut/.translations/pl.json | 7 +-- .../components/nut/.translations/ru.json | 7 +-- .../components/nut/.translations/sl.json | 46 +++++++++++++++++++ .../components/nut/.translations/zh-Hant.json | 7 +-- .../components/nws/.translations/en.json | 3 +- .../components/nws/.translations/it.json | 23 ++++++++++ .../components/nws/.translations/pt.json | 20 ++++++++ .../components/nws/.translations/ru.json | 23 ++++++++++ .../components/nws/.translations/zh-Hant.json | 23 ++++++++++ .../opentherm_gw/.translations/bg.json | 3 +- .../opentherm_gw/.translations/ca.json | 3 +- .../opentherm_gw/.translations/da.json | 3 +- .../opentherm_gw/.translations/de.json | 3 +- .../opentherm_gw/.translations/en.json | 3 +- .../opentherm_gw/.translations/es.json | 3 +- .../opentherm_gw/.translations/fr.json | 3 +- .../opentherm_gw/.translations/hu.json | 3 +- .../opentherm_gw/.translations/it.json | 3 +- .../opentherm_gw/.translations/ko.json | 3 +- .../opentherm_gw/.translations/lb.json | 3 +- .../opentherm_gw/.translations/nl.json | 3 +- .../opentherm_gw/.translations/no.json | 3 +- .../opentherm_gw/.translations/pl.json | 3 +- .../opentherm_gw/.translations/ru.json | 3 +- .../opentherm_gw/.translations/sl.json | 3 +- .../opentherm_gw/.translations/sv.json | 3 +- .../opentherm_gw/.translations/zh-Hant.json | 3 +- .../components/openuv/.translations/bg.json | 3 +- .../components/openuv/.translations/ca.json | 3 +- .../components/openuv/.translations/cs.json | 3 +- .../components/openuv/.translations/da.json | 3 +- .../components/openuv/.translations/de.json | 3 +- .../components/openuv/.translations/en.json | 3 +- .../openuv/.translations/es-419.json | 3 +- .../components/openuv/.translations/es.json | 3 +- .../components/openuv/.translations/fr.json | 3 +- .../components/openuv/.translations/he.json | 3 +- .../components/openuv/.translations/hu.json | 3 +- .../components/openuv/.translations/id.json | 3 +- .../components/openuv/.translations/it.json | 3 +- .../components/openuv/.translations/ko.json | 3 +- .../components/openuv/.translations/lb.json | 3 +- .../components/openuv/.translations/nl.json | 3 +- .../components/openuv/.translations/nn.json | 3 +- .../components/openuv/.translations/no.json | 3 +- .../components/openuv/.translations/pl.json | 3 +- .../openuv/.translations/pt-BR.json | 3 +- .../components/openuv/.translations/pt.json | 3 +- .../components/openuv/.translations/ro.json | 3 +- .../components/openuv/.translations/ru.json | 3 +- .../components/openuv/.translations/sl.json | 3 +- .../components/openuv/.translations/sv.json | 3 +- .../openuv/.translations/zh-Hans.json | 3 +- .../openuv/.translations/zh-Hant.json | 3 +- .../owntracks/.translations/bg.json | 3 +- .../owntracks/.translations/ca.json | 3 +- .../owntracks/.translations/cs.json | 3 +- .../owntracks/.translations/da.json | 3 +- .../owntracks/.translations/de.json | 3 +- .../owntracks/.translations/en.json | 3 +- .../owntracks/.translations/es-419.json | 3 +- .../owntracks/.translations/es.json | 3 +- .../owntracks/.translations/fr.json | 3 +- .../owntracks/.translations/hu.json | 3 +- .../owntracks/.translations/it.json | 3 +- .../owntracks/.translations/ko.json | 3 +- .../owntracks/.translations/lb.json | 3 +- .../owntracks/.translations/nl.json | 3 +- .../owntracks/.translations/no.json | 3 +- .../owntracks/.translations/pl.json | 3 +- .../owntracks/.translations/pt-BR.json | 3 +- .../owntracks/.translations/pt.json | 3 +- .../owntracks/.translations/ru.json | 3 +- .../owntracks/.translations/sl.json | 3 +- .../owntracks/.translations/sv.json | 3 +- .../owntracks/.translations/zh-Hans.json | 3 +- .../owntracks/.translations/zh-Hant.json | 3 +- .../components/person/.translations/af.json | 3 ++ .../components/person/.translations/ar.json | 3 ++ .../components/person/.translations/bg.json | 3 ++ .../components/person/.translations/ca.json | 3 ++ .../components/person/.translations/cs.json | 3 ++ .../components/person/.translations/cy.json | 3 ++ .../components/person/.translations/da.json | 3 ++ .../components/person/.translations/de.json | 3 ++ .../components/person/.translations/el.json | 3 ++ .../components/person/.translations/en.json | 3 ++ .../person/.translations/es-419.json | 3 ++ .../components/person/.translations/es.json | 3 ++ .../components/person/.translations/et.json | 3 ++ .../components/person/.translations/eu.json | 3 ++ .../components/person/.translations/fa.json | 3 ++ .../components/person/.translations/fi.json | 3 ++ .../components/person/.translations/fr.json | 3 ++ .../components/person/.translations/he.json | 3 ++ .../components/person/.translations/hr.json | 3 ++ .../components/person/.translations/hu.json | 3 ++ .../components/person/.translations/hy.json | 3 ++ .../components/person/.translations/id.json | 3 ++ .../components/person/.translations/is.json | 3 ++ .../components/person/.translations/it.json | 3 ++ .../components/person/.translations/ko.json | 3 ++ .../components/person/.translations/lb.json | 3 ++ .../components/person/.translations/lt.json | 3 ++ .../components/person/.translations/lv.json | 3 ++ .../components/person/.translations/nb.json | 3 ++ .../components/person/.translations/nl.json | 3 ++ .../components/person/.translations/nn.json | 3 ++ .../components/person/.translations/pl.json | 3 ++ .../person/.translations/pt-BR.json | 3 ++ .../components/person/.translations/pt.json | 3 ++ .../components/person/.translations/ro.json | 3 ++ .../components/person/.translations/ru.json | 3 ++ .../components/person/.translations/sk.json | 3 ++ .../components/person/.translations/sl.json | 3 ++ .../components/person/.translations/sr.json | 3 ++ .../components/person/.translations/sv.json | 3 ++ .../components/person/.translations/th.json | 3 ++ .../components/person/.translations/tr.json | 3 ++ .../components/person/.translations/uk.json | 3 ++ .../components/person/.translations/vi.json | 3 ++ .../person/.translations/zh-Hans.json | 3 ++ .../person/.translations/zh-Hant.json | 3 ++ .../components/plaato/.translations/bg.json | 3 +- .../components/plaato/.translations/ca.json | 3 +- .../components/plaato/.translations/da.json | 3 +- .../components/plaato/.translations/de.json | 3 +- .../components/plaato/.translations/en.json | 3 +- .../plaato/.translations/es-419.json | 3 +- .../components/plaato/.translations/es.json | 3 +- .../components/plaato/.translations/fr.json | 3 +- .../components/plaato/.translations/hr.json | 3 +- .../components/plaato/.translations/it.json | 3 +- .../components/plaato/.translations/ko.json | 3 +- .../components/plaato/.translations/lb.json | 3 +- .../components/plaato/.translations/nl.json | 3 +- .../components/plaato/.translations/no.json | 3 +- .../components/plaato/.translations/pl.json | 3 +- .../plaato/.translations/pt-BR.json | 3 +- .../components/plaato/.translations/ru.json | 3 +- .../components/plaato/.translations/sl.json | 3 +- .../components/plaato/.translations/sv.json | 3 +- .../plaato/.translations/zh-Hant.json | 3 +- .../components/plant/.translations/af.json | 3 ++ .../components/plant/.translations/ar.json | 3 ++ .../components/plant/.translations/bg.json | 3 ++ .../components/plant/.translations/bs.json | 3 ++ .../components/plant/.translations/ca.json | 3 ++ .../components/plant/.translations/cs.json | 3 ++ .../components/plant/.translations/cy.json | 3 ++ .../components/plant/.translations/da.json | 3 ++ .../components/plant/.translations/de.json | 3 ++ .../components/plant/.translations/el.json | 3 ++ .../components/plant/.translations/en.json | 3 ++ .../plant/.translations/es-419.json | 3 ++ .../components/plant/.translations/es.json | 3 ++ .../components/plant/.translations/et.json | 3 ++ .../components/plant/.translations/eu.json | 3 ++ .../components/plant/.translations/fi.json | 3 ++ .../components/plant/.translations/fr.json | 3 ++ .../components/plant/.translations/gsw.json | 3 ++ .../components/plant/.translations/he.json | 3 ++ .../components/plant/.translations/hr.json | 3 ++ .../components/plant/.translations/hu.json | 3 ++ .../components/plant/.translations/hy.json | 3 ++ .../components/plant/.translations/id.json | 3 ++ .../components/plant/.translations/is.json | 3 ++ .../components/plant/.translations/it.json | 3 ++ .../components/plant/.translations/ko.json | 3 ++ .../components/plant/.translations/lb.json | 3 ++ .../components/plant/.translations/lv.json | 3 ++ .../components/plant/.translations/nb.json | 3 ++ .../components/plant/.translations/nl.json | 3 ++ .../components/plant/.translations/nn.json | 3 ++ .../components/plant/.translations/pl.json | 3 ++ .../components/plant/.translations/pt-BR.json | 3 ++ .../components/plant/.translations/pt.json | 3 ++ .../components/plant/.translations/ro.json | 3 ++ .../components/plant/.translations/ru.json | 3 ++ .../components/plant/.translations/sk.json | 3 ++ .../components/plant/.translations/sl.json | 3 ++ .../components/plant/.translations/sv.json | 3 ++ .../components/plant/.translations/te.json | 3 ++ .../components/plant/.translations/th.json | 3 ++ .../components/plant/.translations/tr.json | 3 ++ .../components/plant/.translations/uk.json | 3 ++ .../components/plant/.translations/vi.json | 3 ++ .../plant/.translations/zh-Hans.json | 3 ++ .../plant/.translations/zh-Hant.json | 3 ++ .../components/plex/.translations/bg.json | 3 +- .../components/plex/.translations/ca.json | 3 +- .../components/plex/.translations/da.json | 3 +- .../components/plex/.translations/de.json | 3 +- .../components/plex/.translations/en.json | 3 +- .../components/plex/.translations/es-419.json | 3 +- .../components/plex/.translations/es.json | 3 +- .../components/plex/.translations/fr.json | 3 +- .../components/plex/.translations/hu.json | 3 +- .../components/plex/.translations/it.json | 3 +- .../components/plex/.translations/ko.json | 3 +- .../components/plex/.translations/lb.json | 3 +- .../components/plex/.translations/nl.json | 3 +- .../components/plex/.translations/no.json | 3 +- .../components/plex/.translations/pl.json | 3 +- .../components/plex/.translations/ru.json | 3 +- .../components/plex/.translations/sl.json | 3 +- .../components/plex/.translations/sv.json | 3 +- .../plex/.translations/zh-Hant.json | 3 +- .../components/point/.translations/bg.json | 3 +- .../components/point/.translations/ca.json | 3 +- .../components/point/.translations/cs.json | 3 +- .../components/point/.translations/da.json | 3 +- .../components/point/.translations/de.json | 3 +- .../components/point/.translations/en.json | 3 +- .../point/.translations/es-419.json | 3 +- .../components/point/.translations/es.json | 3 +- .../components/point/.translations/fr.json | 3 +- .../components/point/.translations/hu.json | 3 +- .../components/point/.translations/it.json | 3 +- .../components/point/.translations/ko.json | 3 +- .../components/point/.translations/lb.json | 3 +- .../components/point/.translations/nl.json | 3 +- .../components/point/.translations/no.json | 3 +- .../components/point/.translations/pl.json | 3 +- .../components/point/.translations/pt-BR.json | 3 +- .../components/point/.translations/pt.json | 3 +- .../components/point/.translations/ru.json | 3 +- .../components/point/.translations/sl.json | 3 +- .../components/point/.translations/sv.json | 3 +- .../point/.translations/zh-Hans.json | 3 +- .../point/.translations/zh-Hant.json | 3 +- .../powerwall/.translations/ca.json | 3 +- .../powerwall/.translations/de.json | 3 +- .../powerwall/.translations/en.json | 3 +- .../powerwall/.translations/es.json | 3 +- .../powerwall/.translations/fr.json | 3 +- .../powerwall/.translations/it.json | 3 +- .../powerwall/.translations/ko.json | 3 +- .../powerwall/.translations/lb.json | 3 +- .../powerwall/.translations/no.json | 3 +- .../powerwall/.translations/ru.json | 3 +- .../powerwall/.translations/sl.json | 19 ++++++++ .../powerwall/.translations/zh-Hant.json | 3 +- .../proximity/.translations/af.json | 3 ++ .../proximity/.translations/ar.json | 3 ++ .../proximity/.translations/bg.json | 3 ++ .../proximity/.translations/bs.json | 3 ++ .../proximity/.translations/ca.json | 3 ++ .../proximity/.translations/cs.json | 3 ++ .../proximity/.translations/cy.json | 3 ++ .../proximity/.translations/da.json | 3 ++ .../proximity/.translations/de.json | 3 ++ .../proximity/.translations/el.json | 3 ++ .../proximity/.translations/en.json | 3 ++ .../proximity/.translations/es-419.json | 3 ++ .../proximity/.translations/es.json | 3 ++ .../proximity/.translations/et.json | 3 ++ .../proximity/.translations/eu.json | 3 ++ .../proximity/.translations/fi.json | 3 ++ .../proximity/.translations/fr.json | 3 ++ .../proximity/.translations/he.json | 3 ++ .../proximity/.translations/hi.json | 3 ++ .../proximity/.translations/hr.json | 3 ++ .../proximity/.translations/hu.json | 3 ++ .../proximity/.translations/hy.json | 3 ++ .../proximity/.translations/id.json | 3 ++ .../proximity/.translations/is.json | 3 ++ .../proximity/.translations/it.json | 3 ++ .../proximity/.translations/ko.json | 3 ++ .../proximity/.translations/lb.json | 3 ++ .../proximity/.translations/lv.json | 3 ++ .../proximity/.translations/nb.json | 3 ++ .../proximity/.translations/nl.json | 3 ++ .../proximity/.translations/nn.json | 3 ++ .../proximity/.translations/pl.json | 3 ++ .../proximity/.translations/pt-BR.json | 3 ++ .../proximity/.translations/pt.json | 3 ++ .../proximity/.translations/ro.json | 3 ++ .../proximity/.translations/ru.json | 3 ++ .../proximity/.translations/sk.json | 3 ++ .../proximity/.translations/sl.json | 3 ++ .../proximity/.translations/sv.json | 3 ++ .../proximity/.translations/te.json | 3 ++ .../proximity/.translations/th.json | 3 ++ .../proximity/.translations/tr.json | 3 ++ .../proximity/.translations/uk.json | 3 ++ .../proximity/.translations/vi.json | 3 ++ .../proximity/.translations/zh-Hans.json | 3 ++ .../proximity/.translations/zh-Hant.json | 3 ++ .../components/ps4/.translations/bg.json | 3 +- .../components/ps4/.translations/ca.json | 3 +- .../components/ps4/.translations/cs.json | 3 +- .../components/ps4/.translations/da.json | 3 +- .../components/ps4/.translations/de.json | 3 +- .../components/ps4/.translations/en.json | 3 +- .../components/ps4/.translations/es-419.json | 3 +- .../components/ps4/.translations/es.json | 3 +- .../components/ps4/.translations/fr.json | 3 +- .../components/ps4/.translations/he.json | 3 +- .../components/ps4/.translations/it.json | 3 +- .../components/ps4/.translations/ko.json | 3 +- .../components/ps4/.translations/lb.json | 3 +- .../components/ps4/.translations/nl.json | 3 +- .../components/ps4/.translations/nn.json | 3 +- .../components/ps4/.translations/no.json | 3 +- .../components/ps4/.translations/pl.json | 3 +- .../components/ps4/.translations/pt-BR.json | 3 +- .../components/ps4/.translations/pt.json | 11 ++++- .../components/ps4/.translations/ru.json | 3 +- .../components/ps4/.translations/sl.json | 3 +- .../components/ps4/.translations/sv.json | 3 +- .../components/ps4/.translations/th.json | 3 +- .../components/ps4/.translations/zh-Hans.json | 3 +- .../components/ps4/.translations/zh-Hant.json | 3 +- .../pvpc_hourly_pricing/.translations/ca.json | 3 +- .../pvpc_hourly_pricing/.translations/de.json | 3 +- .../pvpc_hourly_pricing/.translations/en.json | 3 +- .../pvpc_hourly_pricing/.translations/es.json | 3 +- .../pvpc_hourly_pricing/.translations/it.json | 3 +- .../pvpc_hourly_pricing/.translations/ko.json | 3 +- .../pvpc_hourly_pricing/.translations/lb.json | 3 +- .../pvpc_hourly_pricing/.translations/no.json | 3 +- .../pvpc_hourly_pricing/.translations/ru.json | 3 +- .../pvpc_hourly_pricing/.translations/sl.json | 17 +++++++ .../.translations/zh-Hant.json | 3 +- .../components/rachio/.translations/ca.json | 3 +- .../components/rachio/.translations/de.json | 3 +- .../components/rachio/.translations/en.json | 3 +- .../components/rachio/.translations/es.json | 3 +- .../components/rachio/.translations/fr.json | 3 +- .../components/rachio/.translations/it.json | 3 +- .../components/rachio/.translations/ko.json | 3 +- .../components/rachio/.translations/lb.json | 3 +- .../components/rachio/.translations/no.json | 3 +- .../components/rachio/.translations/pl.json | 3 +- .../components/rachio/.translations/ru.json | 3 +- .../components/rachio/.translations/sl.json | 3 +- .../rachio/.translations/zh-Hant.json | 3 +- .../rainmachine/.translations/bg.json | 3 +- .../rainmachine/.translations/ca.json | 3 +- .../rainmachine/.translations/cs.json | 3 +- .../rainmachine/.translations/da.json | 3 +- .../rainmachine/.translations/de.json | 3 +- .../rainmachine/.translations/en.json | 3 +- .../rainmachine/.translations/es-419.json | 3 +- .../rainmachine/.translations/es.json | 3 +- .../rainmachine/.translations/fr.json | 3 +- .../rainmachine/.translations/hu.json | 3 +- .../rainmachine/.translations/it.json | 3 +- .../rainmachine/.translations/ko.json | 3 +- .../rainmachine/.translations/lb.json | 3 +- .../rainmachine/.translations/nl.json | 3 +- .../rainmachine/.translations/no.json | 3 +- .../rainmachine/.translations/pl.json | 3 +- .../rainmachine/.translations/pt-BR.json | 3 +- .../rainmachine/.translations/pt.json | 3 +- .../rainmachine/.translations/ru.json | 3 +- .../rainmachine/.translations/sl.json | 3 +- .../rainmachine/.translations/sv.json | 3 +- .../rainmachine/.translations/zh-Hans.json | 3 +- .../rainmachine/.translations/zh-Hant.json | 3 +- .../components/remote/.translations/af.json | 3 ++ .../components/remote/.translations/ar.json | 3 ++ .../components/remote/.translations/bg.json | 3 ++ .../components/remote/.translations/bs.json | 3 ++ .../components/remote/.translations/ca.json | 3 ++ .../components/remote/.translations/cs.json | 3 ++ .../components/remote/.translations/cy.json | 3 ++ .../components/remote/.translations/da.json | 3 ++ .../components/remote/.translations/de.json | 3 ++ .../components/remote/.translations/el.json | 3 ++ .../components/remote/.translations/en.json | 3 ++ .../remote/.translations/es-419.json | 3 ++ .../components/remote/.translations/es.json | 3 ++ .../components/remote/.translations/et.json | 3 ++ .../components/remote/.translations/eu.json | 3 ++ .../components/remote/.translations/fi.json | 3 ++ .../components/remote/.translations/fr.json | 3 ++ .../components/remote/.translations/gsw.json | 3 ++ .../components/remote/.translations/he.json | 3 ++ .../components/remote/.translations/hi.json | 3 ++ .../components/remote/.translations/hr.json | 3 ++ .../components/remote/.translations/hu.json | 3 ++ .../components/remote/.translations/hy.json | 3 ++ .../components/remote/.translations/id.json | 3 ++ .../components/remote/.translations/is.json | 3 ++ .../components/remote/.translations/it.json | 3 ++ .../components/remote/.translations/ko.json | 3 ++ .../components/remote/.translations/lb.json | 3 ++ .../components/remote/.translations/lv.json | 3 ++ .../components/remote/.translations/nb.json | 3 ++ .../components/remote/.translations/nl.json | 3 ++ .../components/remote/.translations/nn.json | 3 ++ .../components/remote/.translations/pl.json | 3 ++ .../remote/.translations/pt-BR.json | 3 ++ .../components/remote/.translations/pt.json | 3 ++ .../components/remote/.translations/ro.json | 3 ++ .../components/remote/.translations/ru.json | 3 ++ .../components/remote/.translations/sk.json | 3 ++ .../components/remote/.translations/sl.json | 3 ++ .../components/remote/.translations/sv.json | 3 ++ .../components/remote/.translations/ta.json | 3 ++ .../components/remote/.translations/te.json | 3 ++ .../components/remote/.translations/th.json | 3 ++ .../components/remote/.translations/tr.json | 3 ++ .../components/remote/.translations/uk.json | 3 ++ .../components/remote/.translations/vi.json | 3 ++ .../remote/.translations/zh-Hans.json | 3 ++ .../remote/.translations/zh-Hant.json | 3 ++ .../components/ring/.translations/ca.json | 3 +- .../components/ring/.translations/da.json | 3 +- .../components/ring/.translations/de.json | 3 +- .../components/ring/.translations/en.json | 3 +- .../components/ring/.translations/es.json | 3 +- .../components/ring/.translations/fr.json | 3 +- .../components/ring/.translations/hu.json | 3 +- .../components/ring/.translations/it.json | 3 +- .../components/ring/.translations/ko.json | 3 +- .../components/ring/.translations/lb.json | 3 +- .../components/ring/.translations/nl.json | 3 +- .../components/ring/.translations/no.json | 3 +- .../components/ring/.translations/pl.json | 3 +- .../components/ring/.translations/ru.json | 3 +- .../components/ring/.translations/sl.json | 3 +- .../components/ring/.translations/sv.json | 3 +- .../ring/.translations/zh-Hant.json | 3 +- .../components/roku/.translations/ca.json | 3 +- .../components/roku/.translations/de.json | 3 +- .../components/roku/.translations/en.json | 3 +- .../components/roku/.translations/es.json | 3 +- .../components/roku/.translations/fr.json | 3 +- .../components/roku/.translations/it.json | 3 +- .../components/roku/.translations/ko.json | 3 +- .../components/roku/.translations/lb.json | 3 +- .../components/roku/.translations/no.json | 3 +- .../components/roku/.translations/pl.json | 3 +- .../components/roku/.translations/ru.json | 3 +- .../components/roku/.translations/sl.json | 3 +- .../roku/.translations/zh-Hant.json | 3 +- .../components/roomba/.translations/ca.json | 3 +- .../components/roomba/.translations/de.json | 3 +- .../components/roomba/.translations/en.json | 3 +- .../components/roomba/.translations/es.json | 3 +- .../components/roomba/.translations/it.json | 3 +- .../components/roomba/.translations/no.json | 3 +- .../components/roomba/.translations/pt.json | 30 ++++++++++++ .../components/roomba/.translations/ru.json | 3 +- .../components/roomba/.translations/sl.json | 32 +++++++++++++ .../roomba/.translations/zh-Hant.json | 3 +- .../samsungtv/.translations/ca.json | 3 +- .../samsungtv/.translations/da.json | 3 +- .../samsungtv/.translations/de.json | 3 +- .../samsungtv/.translations/en.json | 3 +- .../samsungtv/.translations/es.json | 3 +- .../samsungtv/.translations/fr.json | 3 +- .../samsungtv/.translations/hu.json | 3 +- .../samsungtv/.translations/it.json | 3 +- .../samsungtv/.translations/ko.json | 3 +- .../samsungtv/.translations/lb.json | 3 +- .../samsungtv/.translations/nl.json | 3 +- .../samsungtv/.translations/no.json | 3 +- .../samsungtv/.translations/pl.json | 3 +- .../samsungtv/.translations/ru.json | 3 +- .../samsungtv/.translations/sl.json | 3 +- .../samsungtv/.translations/sv.json | 3 +- .../samsungtv/.translations/tr.json | 3 +- .../samsungtv/.translations/zh-Hant.json | 3 +- .../components/scene/.translations/af.json | 3 ++ .../components/scene/.translations/ar.json | 3 ++ .../components/scene/.translations/bg.json | 3 ++ .../components/scene/.translations/bs.json | 3 ++ .../components/scene/.translations/ca.json | 3 ++ .../components/scene/.translations/cs.json | 3 ++ .../components/scene/.translations/cy.json | 3 ++ .../components/scene/.translations/da.json | 3 ++ .../components/scene/.translations/de.json | 3 ++ .../components/scene/.translations/el.json | 3 ++ .../components/scene/.translations/en.json | 3 ++ .../scene/.translations/es-419.json | 3 ++ .../components/scene/.translations/es.json | 3 ++ .../components/scene/.translations/et.json | 3 ++ .../components/scene/.translations/eu.json | 3 ++ .../components/scene/.translations/fa.json | 3 ++ .../components/scene/.translations/fi.json | 3 ++ .../components/scene/.translations/fr.json | 3 ++ .../components/scene/.translations/gsw.json | 3 ++ .../components/scene/.translations/he.json | 3 ++ .../components/scene/.translations/hi.json | 3 ++ .../components/scene/.translations/hr.json | 3 ++ .../components/scene/.translations/hu.json | 3 ++ .../components/scene/.translations/hy.json | 3 ++ .../components/scene/.translations/id.json | 3 ++ .../components/scene/.translations/is.json | 3 ++ .../components/scene/.translations/it.json | 3 ++ .../components/scene/.translations/ko.json | 3 ++ .../components/scene/.translations/lb.json | 3 ++ .../components/scene/.translations/lv.json | 3 ++ .../components/scene/.translations/nb.json | 3 ++ .../components/scene/.translations/nl.json | 3 ++ .../components/scene/.translations/nn.json | 3 ++ .../components/scene/.translations/pl.json | 3 ++ .../components/scene/.translations/pt-BR.json | 3 ++ .../components/scene/.translations/pt.json | 3 ++ .../components/scene/.translations/ro.json | 3 ++ .../components/scene/.translations/ru.json | 3 ++ .../components/scene/.translations/sk.json | 3 ++ .../components/scene/.translations/sl.json | 3 ++ .../components/scene/.translations/sv.json | 3 ++ .../components/scene/.translations/ta.json | 3 ++ .../components/scene/.translations/te.json | 3 ++ .../components/scene/.translations/th.json | 3 ++ .../components/scene/.translations/tr.json | 3 ++ .../components/scene/.translations/uk.json | 3 ++ .../components/scene/.translations/vi.json | 3 ++ .../scene/.translations/zh-Hans.json | 3 ++ .../scene/.translations/zh-Hant.json | 3 ++ .../components/script/.translations/af.json | 3 ++ .../components/script/.translations/ar.json | 3 ++ .../components/script/.translations/bg.json | 3 ++ .../components/script/.translations/bs.json | 3 ++ .../components/script/.translations/ca.json | 3 ++ .../components/script/.translations/cs.json | 3 ++ .../components/script/.translations/cy.json | 3 ++ .../components/script/.translations/da.json | 3 ++ .../components/script/.translations/de.json | 3 ++ .../components/script/.translations/el.json | 3 ++ .../components/script/.translations/en.json | 3 ++ .../script/.translations/es-419.json | 3 ++ .../components/script/.translations/es.json | 3 ++ .../components/script/.translations/et.json | 3 ++ .../components/script/.translations/eu.json | 3 ++ .../components/script/.translations/fa.json | 3 ++ .../components/script/.translations/fi.json | 3 ++ .../components/script/.translations/fr.json | 3 ++ .../components/script/.translations/gsw.json | 3 ++ .../components/script/.translations/he.json | 3 ++ .../components/script/.translations/hi.json | 3 ++ .../components/script/.translations/hr.json | 3 ++ .../components/script/.translations/hu.json | 3 ++ .../components/script/.translations/hy.json | 3 ++ .../components/script/.translations/id.json | 3 ++ .../components/script/.translations/is.json | 3 ++ .../components/script/.translations/it.json | 3 ++ .../components/script/.translations/ja.json | 3 ++ .../components/script/.translations/ko.json | 3 ++ .../components/script/.translations/lb.json | 3 ++ .../components/script/.translations/lv.json | 3 ++ .../components/script/.translations/nb.json | 3 ++ .../components/script/.translations/nl.json | 3 ++ .../components/script/.translations/nn.json | 3 ++ .../components/script/.translations/pl.json | 3 ++ .../script/.translations/pt-BR.json | 3 ++ .../components/script/.translations/pt.json | 3 ++ .../components/script/.translations/ro.json | 3 ++ .../components/script/.translations/ru.json | 3 ++ .../components/script/.translations/sk.json | 3 ++ .../components/script/.translations/sl.json | 3 ++ .../components/script/.translations/sv.json | 3 ++ .../components/script/.translations/ta.json | 3 ++ .../components/script/.translations/te.json | 3 ++ .../components/script/.translations/th.json | 3 ++ .../components/script/.translations/tr.json | 3 ++ .../components/script/.translations/uk.json | 3 ++ .../components/script/.translations/vi.json | 3 ++ .../script/.translations/zh-Hans.json | 3 ++ .../script/.translations/zh-Hant.json | 3 ++ .../components/sense/.translations/ca.json | 3 +- .../components/sense/.translations/de.json | 3 +- .../components/sense/.translations/en.json | 3 +- .../components/sense/.translations/es.json | 3 +- .../components/sense/.translations/fr.json | 3 +- .../components/sense/.translations/it.json | 3 +- .../components/sense/.translations/ko.json | 3 +- .../components/sense/.translations/lb.json | 3 +- .../components/sense/.translations/no.json | 3 +- .../components/sense/.translations/ru.json | 3 +- .../components/sense/.translations/sl.json | 3 +- .../sense/.translations/zh-Hant.json | 3 +- .../components/sensor/.translations/af.json | 3 ++ .../components/sensor/.translations/ar.json | 3 ++ .../components/sensor/.translations/bg.json | 3 +- .../components/sensor/.translations/bs.json | 3 ++ .../components/sensor/.translations/ca.json | 3 +- .../components/sensor/.translations/cs.json | 3 +- .../components/sensor/.translations/cy.json | 3 ++ .../components/sensor/.translations/da.json | 3 +- .../components/sensor/.translations/de.json | 3 +- .../components/sensor/.translations/el.json | 3 ++ .../components/sensor/.translations/en.json | 3 +- .../sensor/.translations/es-419.json | 3 ++ .../components/sensor/.translations/es.json | 3 +- .../components/sensor/.translations/et.json | 3 ++ .../components/sensor/.translations/eu.json | 3 ++ .../components/sensor/.translations/fa.json | 3 ++ .../components/sensor/.translations/fi.json | 3 ++ .../components/sensor/.translations/fr.json | 3 +- .../components/sensor/.translations/gsw.json | 3 ++ .../components/sensor/.translations/he.json | 3 ++ .../components/sensor/.translations/hi.json | 3 ++ .../components/sensor/.translations/hr.json | 3 ++ .../components/sensor/.translations/hu.json | 3 +- .../components/sensor/.translations/hy.json | 3 ++ .../components/sensor/.translations/id.json | 3 ++ .../components/sensor/.translations/is.json | 3 ++ .../components/sensor/.translations/it.json | 3 +- .../components/sensor/.translations/ja.json | 3 ++ .../components/sensor/.translations/ko.json | 3 +- .../components/sensor/.translations/lb.json | 3 +- .../components/sensor/.translations/lv.json | 3 ++ .../components/sensor/.translations/nb.json | 3 ++ .../components/sensor/.translations/nl.json | 3 +- .../components/sensor/.translations/nn.json | 3 ++ .../components/sensor/.translations/pl.json | 3 +- .../sensor/.translations/pt-BR.json | 3 ++ .../components/sensor/.translations/pt.json | 3 +- .../components/sensor/.translations/ro.json | 3 ++ .../components/sensor/.translations/ru.json | 3 +- .../components/sensor/.translations/sk.json | 3 ++ .../components/sensor/.translations/sl.json | 3 +- .../components/sensor/.translations/sv.json | 3 +- .../components/sensor/.translations/ta.json | 3 ++ .../components/sensor/.translations/te.json | 3 ++ .../components/sensor/.translations/th.json | 3 ++ .../components/sensor/.translations/tr.json | 3 ++ .../components/sensor/.translations/uk.json | 3 ++ .../components/sensor/.translations/vi.json | 3 ++ .../sensor/.translations/zh-Hans.json | 3 +- .../sensor/.translations/zh-Hant.json | 3 +- .../components/sentry/.translations/af.json | 3 +- .../components/sentry/.translations/ca.json | 3 +- .../components/sentry/.translations/da.json | 3 +- .../components/sentry/.translations/de.json | 3 +- .../components/sentry/.translations/en.json | 3 +- .../components/sentry/.translations/es.json | 3 +- .../components/sentry/.translations/fr.json | 3 +- .../components/sentry/.translations/hu.json | 3 +- .../components/sentry/.translations/it.json | 3 +- .../components/sentry/.translations/ko.json | 3 +- .../components/sentry/.translations/lb.json | 3 +- .../components/sentry/.translations/nl.json | 3 +- .../components/sentry/.translations/no.json | 3 +- .../components/sentry/.translations/pl.json | 3 +- .../components/sentry/.translations/ru.json | 3 +- .../components/sentry/.translations/sl.json | 3 +- .../components/sentry/.translations/sv.json | 3 +- .../sentry/.translations/zh-Hant.json | 3 +- .../simplisafe/.translations/bg.json | 3 +- .../simplisafe/.translations/ca.json | 3 +- .../simplisafe/.translations/cs.json | 3 +- .../simplisafe/.translations/da.json | 3 +- .../simplisafe/.translations/de.json | 3 +- .../simplisafe/.translations/en.json | 3 +- .../simplisafe/.translations/es-419.json | 3 +- .../simplisafe/.translations/es.json | 3 +- .../simplisafe/.translations/fr.json | 3 +- .../simplisafe/.translations/hu.json | 3 +- .../simplisafe/.translations/it.json | 3 +- .../simplisafe/.translations/ko.json | 3 +- .../simplisafe/.translations/lb.json | 3 +- .../simplisafe/.translations/nl.json | 3 +- .../simplisafe/.translations/no.json | 3 +- .../simplisafe/.translations/pl.json | 3 +- .../simplisafe/.translations/pt-BR.json | 3 +- .../simplisafe/.translations/pt.json | 3 +- .../simplisafe/.translations/ro.json | 3 +- .../simplisafe/.translations/ru.json | 3 +- .../simplisafe/.translations/sl.json | 3 +- .../simplisafe/.translations/sv.json | 3 +- .../simplisafe/.translations/zh-Hans.json | 3 +- .../simplisafe/.translations/zh-Hant.json | 3 +- .../smartthings/.translations/bg.json | 13 +----- .../smartthings/.translations/ca.json | 30 ++++++------ .../smartthings/.translations/cs.json | 10 ---- .../smartthings/.translations/da.json | 13 +----- .../smartthings/.translations/de.json | 13 +----- .../smartthings/.translations/en.json | 13 +----- .../smartthings/.translations/es-419.json | 12 +---- .../smartthings/.translations/es.json | 13 +----- .../smartthings/.translations/fr.json | 13 +----- .../smartthings/.translations/he.json | 13 +----- .../smartthings/.translations/hu.json | 13 +----- .../smartthings/.translations/it.json | 13 +----- .../smartthings/.translations/ko.json | 13 +----- .../smartthings/.translations/lb.json | 13 +----- .../smartthings/.translations/nl.json | 13 +----- .../smartthings/.translations/no.json | 13 +----- .../smartthings/.translations/pl.json | 13 +----- .../smartthings/.translations/pt-BR.json | 13 +----- .../smartthings/.translations/pt.json | 31 ++++++++----- .../smartthings/.translations/ru.json | 13 +----- .../smartthings/.translations/sl.json | 32 ++++++++----- .../smartthings/.translations/sv.json | 13 +----- .../smartthings/.translations/zh-Hans.json | 13 +----- .../smartthings/.translations/zh-Hant.json | 13 +----- .../components/smhi/.translations/bg.json | 3 +- .../components/smhi/.translations/ca.json | 3 +- .../components/smhi/.translations/cs.json | 3 +- .../components/smhi/.translations/da.json | 3 +- .../components/smhi/.translations/de.json | 3 +- .../components/smhi/.translations/en.json | 3 +- .../components/smhi/.translations/es-419.json | 3 +- .../components/smhi/.translations/es.json | 3 +- .../components/smhi/.translations/fr.json | 3 +- .../components/smhi/.translations/hu.json | 3 +- .../components/smhi/.translations/it.json | 3 +- .../components/smhi/.translations/ko.json | 3 +- .../components/smhi/.translations/lb.json | 3 +- .../components/smhi/.translations/nl.json | 3 +- .../components/smhi/.translations/no.json | 3 +- .../components/smhi/.translations/pl.json | 3 +- .../components/smhi/.translations/pt-BR.json | 3 +- .../components/smhi/.translations/pt.json | 3 +- .../components/smhi/.translations/ro.json | 3 +- .../components/smhi/.translations/ru.json | 3 +- .../components/smhi/.translations/sl.json | 3 +- .../components/smhi/.translations/sv.json | 3 +- .../smhi/.translations/zh-Hans.json | 3 +- .../smhi/.translations/zh-Hant.json | 3 +- .../solaredge/.translations/bg.json | 3 +- .../solaredge/.translations/ca.json | 3 +- .../solaredge/.translations/da.json | 3 +- .../solaredge/.translations/de.json | 3 +- .../solaredge/.translations/en.json | 3 +- .../solaredge/.translations/es.json | 3 +- .../solaredge/.translations/fr.json | 3 +- .../solaredge/.translations/hu.json | 3 +- .../solaredge/.translations/it.json | 3 +- .../solaredge/.translations/ko.json | 3 +- .../solaredge/.translations/lb.json | 3 +- .../solaredge/.translations/nl.json | 3 +- .../solaredge/.translations/no.json | 3 +- .../solaredge/.translations/pl.json | 3 +- .../solaredge/.translations/ru.json | 3 +- .../solaredge/.translations/sl.json | 3 +- .../solaredge/.translations/sv.json | 3 +- .../solaredge/.translations/zh-Hant.json | 3 +- .../components/solarlog/.translations/bg.json | 3 +- .../components/solarlog/.translations/ca.json | 3 +- .../components/solarlog/.translations/cs.json | 3 +- .../components/solarlog/.translations/da.json | 3 +- .../components/solarlog/.translations/de.json | 3 +- .../components/solarlog/.translations/en.json | 3 +- .../components/solarlog/.translations/es.json | 3 +- .../components/solarlog/.translations/fr.json | 3 +- .../components/solarlog/.translations/it.json | 3 +- .../components/solarlog/.translations/ko.json | 3 +- .../components/solarlog/.translations/lb.json | 3 +- .../components/solarlog/.translations/nl.json | 3 +- .../components/solarlog/.translations/no.json | 3 +- .../components/solarlog/.translations/pl.json | 3 +- .../components/solarlog/.translations/ru.json | 3 +- .../components/solarlog/.translations/sl.json | 3 +- .../components/solarlog/.translations/sv.json | 3 +- .../solarlog/.translations/zh-Hant.json | 3 +- .../components/soma/.translations/bg.json | 3 +- .../components/soma/.translations/ca.json | 3 +- .../components/soma/.translations/da.json | 3 +- .../components/soma/.translations/de.json | 3 +- .../components/soma/.translations/en.json | 3 +- .../components/soma/.translations/es.json | 3 +- .../components/soma/.translations/fr.json | 3 +- .../components/soma/.translations/hu.json | 3 +- .../components/soma/.translations/it.json | 3 +- .../components/soma/.translations/ko.json | 3 +- .../components/soma/.translations/lb.json | 3 +- .../components/soma/.translations/nl.json | 3 +- .../components/soma/.translations/no.json | 3 +- .../components/soma/.translations/pl.json | 3 +- .../components/soma/.translations/ru.json | 3 +- .../components/soma/.translations/sl.json | 3 +- .../components/soma/.translations/sv.json | 3 +- .../soma/.translations/zh-Hant.json | 3 +- .../components/somfy/.translations/bg.json | 3 +- .../components/somfy/.translations/ca.json | 3 +- .../components/somfy/.translations/da.json | 3 +- .../components/somfy/.translations/de.json | 3 +- .../components/somfy/.translations/en.json | 3 +- .../components/somfy/.translations/es.json | 3 +- .../components/somfy/.translations/fr.json | 3 +- .../components/somfy/.translations/hr.json | 3 +- .../components/somfy/.translations/it.json | 3 +- .../components/somfy/.translations/ko.json | 3 +- .../components/somfy/.translations/lb.json | 3 +- .../components/somfy/.translations/nl.json | 3 +- .../components/somfy/.translations/no.json | 3 +- .../components/somfy/.translations/pl.json | 3 +- .../components/somfy/.translations/pt-BR.json | 3 +- .../components/somfy/.translations/ru.json | 3 +- .../components/somfy/.translations/sl.json | 3 +- .../components/somfy/.translations/sv.json | 3 +- .../somfy/.translations/zh-Hant.json | 3 +- .../components/sonos/.translations/bg.json | 3 +- .../components/sonos/.translations/ca.json | 3 +- .../components/sonos/.translations/cs.json | 3 +- .../components/sonos/.translations/da.json | 3 +- .../components/sonos/.translations/de.json | 3 +- .../components/sonos/.translations/en.json | 3 +- .../sonos/.translations/es-419.json | 3 +- .../components/sonos/.translations/es.json | 3 +- .../components/sonos/.translations/et.json | 3 +- .../components/sonos/.translations/fr.json | 3 +- .../components/sonos/.translations/he.json | 3 +- .../components/sonos/.translations/hr.json | 3 +- .../components/sonos/.translations/hu.json | 3 +- .../components/sonos/.translations/id.json | 3 +- .../components/sonos/.translations/it.json | 3 +- .../components/sonos/.translations/ko.json | 3 +- .../components/sonos/.translations/lb.json | 3 +- .../components/sonos/.translations/nl.json | 3 +- .../components/sonos/.translations/nn.json | 3 +- .../components/sonos/.translations/no.json | 3 +- .../components/sonos/.translations/pl.json | 3 +- .../components/sonos/.translations/pt-BR.json | 3 +- .../components/sonos/.translations/pt.json | 3 +- .../components/sonos/.translations/ro.json | 3 +- .../components/sonos/.translations/ru.json | 3 +- .../components/sonos/.translations/sl.json | 3 +- .../components/sonos/.translations/sv.json | 3 +- .../components/sonos/.translations/vi.json | 3 +- .../sonos/.translations/zh-Hans.json | 3 +- .../sonos/.translations/zh-Hant.json | 3 +- .../components/spotify/.translations/ca.json | 3 +- .../components/spotify/.translations/cs.json | 3 +- .../components/spotify/.translations/da.json | 3 +- .../components/spotify/.translations/de.json | 3 +- .../components/spotify/.translations/en.json | 3 +- .../components/spotify/.translations/es.json | 3 +- .../components/spotify/.translations/fr.json | 3 +- .../components/spotify/.translations/hu.json | 3 +- .../components/spotify/.translations/it.json | 3 +- .../components/spotify/.translations/ko.json | 3 +- .../components/spotify/.translations/lb.json | 3 +- .../components/spotify/.translations/nl.json | 3 +- .../components/spotify/.translations/no.json | 3 +- .../components/spotify/.translations/pl.json | 3 +- .../components/spotify/.translations/ru.json | 3 +- .../components/spotify/.translations/sl.json | 3 +- .../components/spotify/.translations/sv.json | 3 +- .../components/spotify/.translations/tr.json | 3 +- .../spotify/.translations/zh-Hant.json | 3 +- .../components/starline/.translations/bg.json | 3 +- .../components/starline/.translations/ca.json | 3 +- .../components/starline/.translations/da.json | 3 +- .../components/starline/.translations/de.json | 3 +- .../components/starline/.translations/en.json | 3 +- .../components/starline/.translations/es.json | 3 +- .../components/starline/.translations/fr.json | 3 +- .../components/starline/.translations/hu.json | 3 +- .../components/starline/.translations/it.json | 3 +- .../components/starline/.translations/ko.json | 3 +- .../components/starline/.translations/lb.json | 3 +- .../components/starline/.translations/nl.json | 3 +- .../components/starline/.translations/nn.json | 3 +- .../components/starline/.translations/no.json | 3 +- .../components/starline/.translations/pl.json | 3 +- .../components/starline/.translations/ru.json | 3 +- .../components/starline/.translations/sl.json | 3 +- .../components/starline/.translations/sv.json | 3 +- .../starline/.translations/zh-Hant.json | 3 +- .../components/sun/.translations/af.json | 3 ++ .../components/sun/.translations/ar.json | 3 ++ .../components/sun/.translations/bg.json | 3 ++ .../components/sun/.translations/bs.json | 3 ++ .../components/sun/.translations/ca.json | 3 ++ .../components/sun/.translations/cs.json | 3 ++ .../components/sun/.translations/cy.json | 3 ++ .../components/sun/.translations/da.json | 3 ++ .../components/sun/.translations/de.json | 3 ++ .../components/sun/.translations/el.json | 3 ++ .../components/sun/.translations/en.json | 3 ++ .../components/sun/.translations/es-419.json | 3 ++ .../components/sun/.translations/es.json | 3 ++ .../components/sun/.translations/et.json | 3 ++ .../components/sun/.translations/eu.json | 3 ++ .../components/sun/.translations/fa.json | 3 ++ .../components/sun/.translations/fi.json | 3 ++ .../components/sun/.translations/fr.json | 3 ++ .../components/sun/.translations/gsw.json | 3 ++ .../components/sun/.translations/he.json | 3 ++ .../components/sun/.translations/hi.json | 3 ++ .../components/sun/.translations/hr.json | 3 ++ .../components/sun/.translations/hu.json | 3 ++ .../components/sun/.translations/hy.json | 3 ++ .../components/sun/.translations/id.json | 3 ++ .../components/sun/.translations/is.json | 3 ++ .../components/sun/.translations/it.json | 3 ++ .../components/sun/.translations/ja.json | 3 ++ .../components/sun/.translations/ko.json | 3 ++ .../components/sun/.translations/lb.json | 3 ++ .../components/sun/.translations/lv.json | 3 ++ .../components/sun/.translations/nb.json | 3 ++ .../components/sun/.translations/nl.json | 3 ++ .../components/sun/.translations/nn.json | 3 ++ .../components/sun/.translations/pl.json | 3 ++ .../components/sun/.translations/pt-BR.json | 3 ++ .../components/sun/.translations/pt.json | 3 ++ .../components/sun/.translations/ro.json | 3 ++ .../components/sun/.translations/ru.json | 3 ++ .../components/sun/.translations/sk.json | 3 ++ .../components/sun/.translations/sl.json | 3 ++ .../components/sun/.translations/sv.json | 3 ++ .../components/sun/.translations/ta.json | 3 ++ .../components/sun/.translations/te.json | 3 ++ .../components/sun/.translations/th.json | 3 ++ .../components/sun/.translations/tr.json | 3 ++ .../components/sun/.translations/uk.json | 3 ++ .../components/sun/.translations/vi.json | 3 ++ .../components/sun/.translations/zh-Hans.json | 3 ++ .../components/sun/.translations/zh-Hant.json | 3 ++ .../components/switch/.translations/af.json | 3 ++ .../components/switch/.translations/ar.json | 3 ++ .../components/switch/.translations/bg.json | 3 +- .../components/switch/.translations/bs.json | 3 ++ .../components/switch/.translations/ca.json | 3 +- .../components/switch/.translations/cs.json | 3 ++ .../components/switch/.translations/cy.json | 3 ++ .../components/switch/.translations/da.json | 3 +- .../components/switch/.translations/de.json | 3 +- .../components/switch/.translations/el.json | 3 ++ .../components/switch/.translations/en.json | 3 +- .../switch/.translations/es-419.json | 3 +- .../components/switch/.translations/es.json | 3 +- .../components/switch/.translations/et.json | 3 ++ .../components/switch/.translations/fa.json | 3 ++ .../components/switch/.translations/fi.json | 3 ++ .../components/switch/.translations/fr.json | 3 +- .../components/switch/.translations/gsw.json | 3 ++ .../components/switch/.translations/he.json | 3 ++ .../components/switch/.translations/hi.json | 3 ++ .../components/switch/.translations/hr.json | 3 ++ .../components/switch/.translations/hu.json | 3 +- .../components/switch/.translations/hy.json | 3 ++ .../components/switch/.translations/id.json | 3 ++ .../components/switch/.translations/is.json | 3 ++ .../components/switch/.translations/it.json | 3 +- .../components/switch/.translations/ja.json | 3 ++ .../components/switch/.translations/ko.json | 3 +- .../components/switch/.translations/lb.json | 3 +- .../components/switch/.translations/lv.json | 3 +- .../components/switch/.translations/nb.json | 3 ++ .../components/switch/.translations/nl.json | 3 +- .../components/switch/.translations/nn.json | 3 ++ .../components/switch/.translations/pl.json | 3 +- .../switch/.translations/pt-BR.json | 3 ++ .../components/switch/.translations/pt.json | 3 ++ .../components/switch/.translations/ro.json | 3 ++ .../components/switch/.translations/ru.json | 3 +- .../components/switch/.translations/sk.json | 3 ++ .../components/switch/.translations/sl.json | 3 +- .../components/switch/.translations/sv.json | 3 +- .../components/switch/.translations/ta.json | 3 ++ .../components/switch/.translations/te.json | 3 ++ .../components/switch/.translations/th.json | 3 ++ .../components/switch/.translations/tr.json | 3 ++ .../components/switch/.translations/uk.json | 3 ++ .../components/switch/.translations/vi.json | 3 ++ .../switch/.translations/zh-Hans.json | 3 ++ .../switch/.translations/zh-Hant.json | 3 +- .../synology_dsm/.translations/ca.json | 4 +- .../synology_dsm/.translations/de.json | 4 +- .../synology_dsm/.translations/en.json | 4 +- .../synology_dsm/.translations/es.json | 4 +- .../synology_dsm/.translations/fr.json | 1 - .../synology_dsm/.translations/it.json | 4 +- .../synology_dsm/.translations/ko.json | 4 +- .../synology_dsm/.translations/lb.json | 4 +- .../synology_dsm/.translations/nl.json | 4 +- .../synology_dsm/.translations/no.json | 29 +++++++++++- .../synology_dsm/.translations/ru.json | 4 +- .../synology_dsm/.translations/sl.json | 36 +++++++++++++++ .../synology_dsm/.translations/zh-Hant.json | 4 +- .../system_health/.translations/af.json | 3 ++ .../system_health/.translations/bg.json | 3 ++ .../system_health/.translations/ca.json | 3 ++ .../system_health/.translations/cs.json | 3 ++ .../system_health/.translations/cy.json | 3 ++ .../system_health/.translations/da.json | 3 ++ .../system_health/.translations/de.json | 3 ++ .../system_health/.translations/el.json | 3 ++ .../system_health/.translations/en.json | 3 ++ .../system_health/.translations/es-419.json | 3 ++ .../system_health/.translations/es.json | 3 ++ .../system_health/.translations/et.json | 3 ++ .../system_health/.translations/eu.json | 3 ++ .../system_health/.translations/fa.json | 3 ++ .../system_health/.translations/fi.json | 3 ++ .../system_health/.translations/fr.json | 3 ++ .../system_health/.translations/he.json | 3 ++ .../system_health/.translations/hr.json | 3 ++ .../system_health/.translations/hu.json | 3 ++ .../system_health/.translations/hy.json | 3 ++ .../system_health/.translations/is.json | 3 ++ .../system_health/.translations/it.json | 3 ++ .../system_health/.translations/ja.json | 3 ++ .../system_health/.translations/ko.json | 3 ++ .../system_health/.translations/lb.json | 3 ++ .../system_health/.translations/lt.json | 3 ++ .../system_health/.translations/nb.json | 3 ++ .../system_health/.translations/nl.json | 3 ++ .../system_health/.translations/nn.json | 3 ++ .../system_health/.translations/pl.json | 3 ++ .../system_health/.translations/pt-BR.json | 3 ++ .../system_health/.translations/pt.json | 3 ++ .../system_health/.translations/ro.json | 3 ++ .../system_health/.translations/ru.json | 3 ++ .../system_health/.translations/sk.json | 3 ++ .../system_health/.translations/sl.json | 3 ++ .../system_health/.translations/sv.json | 3 ++ .../system_health/.translations/th.json | 3 ++ .../system_health/.translations/tr.json | 3 ++ .../system_health/.translations/uk.json | 3 ++ .../system_health/.translations/vi.json | 3 ++ .../system_health/.translations/zh-Hans.json | 3 ++ .../system_health/.translations/zh-Hant.json | 3 ++ .../components/tado/.translations/ca.json | 29 ++++++++++++ .../components/tado/.translations/de.json | 6 +-- .../components/tado/.translations/en.json | 6 +-- .../components/tado/.translations/es.json | 6 +-- .../components/tado/.translations/it.json | 6 +-- .../components/tado/.translations/no.json | 15 +++++- .../components/tado/.translations/ru.json | 6 +-- .../components/tado/.translations/sl.json | 33 +++++++++++++ .../tado/.translations/zh-Hant.json | 6 +-- .../tellduslive/.translations/bg.json | 3 +- .../tellduslive/.translations/ca.json | 3 +- .../tellduslive/.translations/da.json | 3 +- .../tellduslive/.translations/de.json | 3 +- .../tellduslive/.translations/en.json | 3 +- .../tellduslive/.translations/es-419.json | 3 +- .../tellduslive/.translations/es.json | 3 +- .../tellduslive/.translations/fr.json | 3 +- .../tellduslive/.translations/hu.json | 3 +- .../tellduslive/.translations/it.json | 3 +- .../tellduslive/.translations/ko.json | 3 +- .../tellduslive/.translations/lb.json | 3 +- .../tellduslive/.translations/nl.json | 3 +- .../tellduslive/.translations/no.json | 3 +- .../tellduslive/.translations/pl.json | 3 +- .../tellduslive/.translations/pt-BR.json | 3 +- .../tellduslive/.translations/pt.json | 3 +- .../tellduslive/.translations/ru.json | 3 +- .../tellduslive/.translations/sl.json | 3 +- .../tellduslive/.translations/sv.json | 3 +- .../tellduslive/.translations/zh-Hans.json | 3 +- .../tellduslive/.translations/zh-Hant.json | 3 +- .../components/tesla/.translations/ca.json | 3 +- .../components/tesla/.translations/da.json | 3 +- .../components/tesla/.translations/de.json | 3 +- .../components/tesla/.translations/en.json | 3 +- .../components/tesla/.translations/es.json | 3 +- .../components/tesla/.translations/fr.json | 3 +- .../components/tesla/.translations/hu.json | 3 +- .../components/tesla/.translations/it.json | 3 +- .../components/tesla/.translations/ko.json | 3 +- .../components/tesla/.translations/lb.json | 3 +- .../components/tesla/.translations/nl.json | 3 +- .../components/tesla/.translations/no.json | 3 +- .../components/tesla/.translations/pl.json | 3 +- .../components/tesla/.translations/pt-BR.json | 3 +- .../components/tesla/.translations/ru.json | 3 +- .../components/tesla/.translations/sl.json | 4 +- .../components/tesla/.translations/sv.json | 3 +- .../tesla/.translations/zh-Hant.json | 3 +- .../components/toon/.translations/bg.json | 3 +- .../components/toon/.translations/ca.json | 3 +- .../components/toon/.translations/da.json | 3 +- .../components/toon/.translations/de.json | 3 +- .../components/toon/.translations/en.json | 3 +- .../components/toon/.translations/es-419.json | 3 +- .../components/toon/.translations/es.json | 3 +- .../components/toon/.translations/fr.json | 3 +- .../components/toon/.translations/it.json | 3 +- .../components/toon/.translations/ko.json | 3 +- .../components/toon/.translations/lb.json | 3 +- .../components/toon/.translations/nl.json | 3 +- .../components/toon/.translations/nn.json | 3 +- .../components/toon/.translations/no.json | 3 +- .../components/toon/.translations/pl.json | 3 +- .../components/toon/.translations/pt-BR.json | 3 +- .../components/toon/.translations/pt.json | 8 ++++ .../components/toon/.translations/ru.json | 3 +- .../components/toon/.translations/sl.json | 3 +- .../components/toon/.translations/sv.json | 3 +- .../toon/.translations/zh-Hant.json | 3 +- .../totalconnect/.translations/ca.json | 19 ++++++++ .../totalconnect/.translations/de.json | 3 +- .../totalconnect/.translations/en.json | 3 +- .../totalconnect/.translations/es.json | 3 +- .../totalconnect/.translations/it.json | 3 +- .../totalconnect/.translations/no.json | 3 +- .../totalconnect/.translations/pt.json | 18 ++++++++ .../totalconnect/.translations/ru.json | 3 +- .../totalconnect/.translations/sl.json | 19 ++++++++ .../totalconnect/.translations/zh-Hant.json | 3 +- .../components/tplink/.translations/bg.json | 3 +- .../components/tplink/.translations/ca.json | 3 +- .../components/tplink/.translations/cs.json | 3 +- .../components/tplink/.translations/da.json | 3 +- .../components/tplink/.translations/de.json | 3 +- .../components/tplink/.translations/en.json | 3 +- .../tplink/.translations/es-419.json | 3 +- .../components/tplink/.translations/es.json | 3 +- .../components/tplink/.translations/fr.json | 3 +- .../components/tplink/.translations/he.json | 3 +- .../components/tplink/.translations/it.json | 3 +- .../components/tplink/.translations/ko.json | 3 +- .../components/tplink/.translations/lb.json | 3 +- .../components/tplink/.translations/nl.json | 3 +- .../components/tplink/.translations/nn.json | 3 +- .../components/tplink/.translations/no.json | 3 +- .../components/tplink/.translations/pl.json | 3 +- .../tplink/.translations/pt-BR.json | 3 +- .../components/tplink/.translations/pt.json | 8 +++- .../components/tplink/.translations/ru.json | 3 +- .../components/tplink/.translations/sl.json | 3 +- .../components/tplink/.translations/sv.json | 3 +- .../tplink/.translations/zh-Hans.json | 3 +- .../tplink/.translations/zh-Hant.json | 3 +- .../components/traccar/.translations/bg.json | 3 +- .../components/traccar/.translations/ca.json | 3 +- .../components/traccar/.translations/da.json | 3 +- .../components/traccar/.translations/de.json | 3 +- .../components/traccar/.translations/en.json | 3 +- .../components/traccar/.translations/es.json | 3 +- .../components/traccar/.translations/fr.json | 3 +- .../components/traccar/.translations/it.json | 3 +- .../components/traccar/.translations/ko.json | 3 +- .../components/traccar/.translations/lb.json | 3 +- .../components/traccar/.translations/nl.json | 3 +- .../components/traccar/.translations/no.json | 3 +- .../components/traccar/.translations/pl.json | 3 +- .../traccar/.translations/pt-BR.json | 3 +- .../components/traccar/.translations/ru.json | 3 +- .../components/traccar/.translations/sl.json | 3 +- .../components/traccar/.translations/sv.json | 3 +- .../components/traccar/.translations/tr.json | 3 +- .../traccar/.translations/zh-Hant.json | 3 +- .../components/tradfri/.translations/bg.json | 3 +- .../components/tradfri/.translations/ca.json | 3 +- .../components/tradfri/.translations/cs.json | 3 +- .../components/tradfri/.translations/da.json | 3 +- .../components/tradfri/.translations/de.json | 3 +- .../components/tradfri/.translations/en.json | 3 +- .../tradfri/.translations/es-419.json | 3 +- .../components/tradfri/.translations/es.json | 3 +- .../components/tradfri/.translations/fr.json | 3 +- .../components/tradfri/.translations/he.json | 3 +- .../components/tradfri/.translations/hr.json | 3 +- .../components/tradfri/.translations/hu.json | 3 +- .../components/tradfri/.translations/id.json | 3 +- .../components/tradfri/.translations/it.json | 3 +- .../components/tradfri/.translations/ko.json | 3 +- .../components/tradfri/.translations/lb.json | 3 +- .../components/tradfri/.translations/nl.json | 3 +- .../components/tradfri/.translations/nn.json | 3 +- .../components/tradfri/.translations/no.json | 3 +- .../components/tradfri/.translations/pl.json | 3 +- .../tradfri/.translations/pt-BR.json | 3 +- .../components/tradfri/.translations/pt.json | 3 +- .../components/tradfri/.translations/ro.json | 3 +- .../components/tradfri/.translations/ru.json | 3 +- .../components/tradfri/.translations/sl.json | 3 +- .../components/tradfri/.translations/sv.json | 3 +- .../tradfri/.translations/zh-Hans.json | 3 +- .../tradfri/.translations/zh-Hant.json | 3 +- .../transmission/.translations/bg.json | 3 +- .../transmission/.translations/ca.json | 3 +- .../transmission/.translations/da.json | 3 +- .../transmission/.translations/de.json | 3 +- .../transmission/.translations/en.json | 3 +- .../transmission/.translations/es.json | 3 +- .../transmission/.translations/fr.json | 3 +- .../transmission/.translations/it.json | 3 +- .../transmission/.translations/ko.json | 3 +- .../transmission/.translations/lb.json | 3 +- .../transmission/.translations/nl.json | 3 +- .../transmission/.translations/no.json | 3 +- .../transmission/.translations/pl.json | 3 +- .../transmission/.translations/pt-BR.json | 3 +- .../transmission/.translations/ru.json | 3 +- .../transmission/.translations/sl.json | 3 +- .../transmission/.translations/sv.json | 3 +- .../transmission/.translations/zh-Hant.json | 3 +- .../twentemilieu/.translations/bg.json | 3 +- .../twentemilieu/.translations/ca.json | 3 +- .../twentemilieu/.translations/da.json | 3 +- .../twentemilieu/.translations/de.json | 3 +- .../twentemilieu/.translations/en.json | 3 +- .../twentemilieu/.translations/es-419.json | 3 +- .../twentemilieu/.translations/es.json | 3 +- .../twentemilieu/.translations/fr.json | 3 +- .../twentemilieu/.translations/it.json | 3 +- .../twentemilieu/.translations/ko.json | 3 +- .../twentemilieu/.translations/lb.json | 3 +- .../twentemilieu/.translations/nl.json | 3 +- .../twentemilieu/.translations/nn.json | 3 +- .../twentemilieu/.translations/no.json | 3 +- .../twentemilieu/.translations/pl.json | 3 +- .../twentemilieu/.translations/pt-BR.json | 3 +- .../twentemilieu/.translations/ru.json | 3 +- .../twentemilieu/.translations/sl.json | 3 +- .../twentemilieu/.translations/sv.json | 3 +- .../twentemilieu/.translations/zh-Hant.json | 3 +- .../components/twilio/.translations/bg.json | 3 +- .../components/twilio/.translations/ca.json | 3 +- .../components/twilio/.translations/cs.json | 3 +- .../components/twilio/.translations/da.json | 3 +- .../components/twilio/.translations/de.json | 3 +- .../components/twilio/.translations/en.json | 3 +- .../twilio/.translations/es-419.json | 3 +- .../components/twilio/.translations/es.json | 3 +- .../components/twilio/.translations/fr.json | 3 +- .../components/twilio/.translations/hu.json | 3 +- .../components/twilio/.translations/it.json | 3 +- .../components/twilio/.translations/ko.json | 3 +- .../components/twilio/.translations/lb.json | 3 +- .../components/twilio/.translations/nl.json | 3 +- .../components/twilio/.translations/no.json | 3 +- .../components/twilio/.translations/pl.json | 3 +- .../twilio/.translations/pt-BR.json | 3 +- .../components/twilio/.translations/pt.json | 3 +- .../components/twilio/.translations/ru.json | 3 +- .../components/twilio/.translations/sl.json | 3 +- .../components/twilio/.translations/sv.json | 3 +- .../twilio/.translations/zh-Hans.json | 3 +- .../twilio/.translations/zh-Hant.json | 3 +- .../components/unifi/.translations/bg.json | 3 +- .../components/unifi/.translations/ca.json | 6 +-- .../components/unifi/.translations/cs.json | 3 +- .../components/unifi/.translations/da.json | 3 +- .../components/unifi/.translations/de.json | 6 +-- .../components/unifi/.translations/en.json | 6 +-- .../unifi/.translations/es-419.json | 3 +- .../components/unifi/.translations/es.json | 6 +-- .../components/unifi/.translations/fr.json | 6 +-- .../components/unifi/.translations/hu.json | 3 +- .../components/unifi/.translations/it.json | 6 +-- .../components/unifi/.translations/ko.json | 6 +-- .../components/unifi/.translations/lb.json | 6 +-- .../components/unifi/.translations/nl.json | 3 +- .../components/unifi/.translations/no.json | 9 ++-- .../components/unifi/.translations/pl.json | 6 +-- .../components/unifi/.translations/pt-BR.json | 3 +- .../components/unifi/.translations/pt.json | 3 +- .../components/unifi/.translations/ro.json | 3 +- .../components/unifi/.translations/ru.json | 3 +- .../components/unifi/.translations/sl.json | 9 ++-- .../components/unifi/.translations/sv.json | 3 +- .../unifi/.translations/zh-Hans.json | 3 +- .../unifi/.translations/zh-Hant.json | 6 +-- .../components/updater/.translations/af.json | 3 ++ .../components/updater/.translations/ar.json | 3 ++ .../components/updater/.translations/bg.json | 3 ++ .../components/updater/.translations/bs.json | 3 ++ .../components/updater/.translations/ca.json | 3 ++ .../components/updater/.translations/cs.json | 3 ++ .../components/updater/.translations/cy.json | 3 ++ .../components/updater/.translations/da.json | 3 ++ .../components/updater/.translations/de.json | 3 ++ .../components/updater/.translations/el.json | 3 ++ .../components/updater/.translations/en.json | 3 ++ .../updater/.translations/es-419.json | 3 ++ .../components/updater/.translations/es.json | 3 ++ .../components/updater/.translations/et.json | 3 ++ .../components/updater/.translations/eu.json | 3 ++ .../components/updater/.translations/fa.json | 3 ++ .../components/updater/.translations/fi.json | 3 ++ .../components/updater/.translations/fr.json | 3 ++ .../components/updater/.translations/gsw.json | 3 ++ .../components/updater/.translations/he.json | 3 ++ .../components/updater/.translations/hr.json | 3 ++ .../components/updater/.translations/hu.json | 3 ++ .../components/updater/.translations/hy.json | 3 ++ .../components/updater/.translations/id.json | 3 ++ .../components/updater/.translations/is.json | 3 ++ .../components/updater/.translations/it.json | 3 ++ .../components/updater/.translations/ja.json | 3 ++ .../components/updater/.translations/ko.json | 3 ++ .../components/updater/.translations/lb.json | 3 ++ .../components/updater/.translations/lv.json | 3 ++ .../components/updater/.translations/nb.json | 3 ++ .../components/updater/.translations/nl.json | 3 ++ .../components/updater/.translations/nn.json | 3 ++ .../components/updater/.translations/pl.json | 3 ++ .../updater/.translations/pt-BR.json | 3 ++ .../components/updater/.translations/pt.json | 3 ++ .../components/updater/.translations/ro.json | 3 ++ .../components/updater/.translations/ru.json | 3 ++ .../components/updater/.translations/sk.json | 3 ++ .../components/updater/.translations/sl.json | 3 ++ .../components/updater/.translations/sv.json | 3 ++ .../components/updater/.translations/ta.json | 3 ++ .../components/updater/.translations/te.json | 3 ++ .../components/updater/.translations/th.json | 3 ++ .../components/updater/.translations/tr.json | 3 ++ .../components/updater/.translations/uk.json | 3 ++ .../components/updater/.translations/vi.json | 3 ++ .../updater/.translations/zh-Hans.json | 3 ++ .../updater/.translations/zh-Hant.json | 3 ++ .../components/upnp/.translations/bg.json | 3 +- .../components/upnp/.translations/ca.json | 3 +- .../components/upnp/.translations/cs.json | 3 +- .../components/upnp/.translations/da.json | 3 +- .../components/upnp/.translations/de.json | 3 +- .../components/upnp/.translations/en.json | 3 +- .../components/upnp/.translations/es-419.json | 3 +- .../components/upnp/.translations/es.json | 3 +- .../components/upnp/.translations/et.json | 3 +- .../components/upnp/.translations/fr.json | 3 +- .../components/upnp/.translations/hu.json | 3 +- .../components/upnp/.translations/it.json | 3 +- .../components/upnp/.translations/ko.json | 3 +- .../components/upnp/.translations/lb.json | 3 +- .../components/upnp/.translations/nl.json | 3 +- .../components/upnp/.translations/nn.json | 3 +- .../components/upnp/.translations/no.json | 3 +- .../components/upnp/.translations/pl.json | 3 +- .../components/upnp/.translations/pt-BR.json | 3 +- .../components/upnp/.translations/pt.json | 3 +- .../components/upnp/.translations/ro.json | 3 +- .../components/upnp/.translations/ru.json | 3 +- .../components/upnp/.translations/sl.json | 3 +- .../components/upnp/.translations/sv.json | 3 +- .../upnp/.translations/zh-Hans.json | 3 +- .../upnp/.translations/zh-Hant.json | 3 +- .../components/vacuum/.translations/af.json | 3 ++ .../components/vacuum/.translations/ar.json | 3 ++ .../components/vacuum/.translations/bg.json | 3 +- .../components/vacuum/.translations/ca.json | 3 +- .../components/vacuum/.translations/cs.json | 3 ++ .../components/vacuum/.translations/da.json | 3 +- .../components/vacuum/.translations/de.json | 3 +- .../components/vacuum/.translations/el.json | 3 ++ .../components/vacuum/.translations/en.json | 3 +- .../vacuum/.translations/es-419.json | 3 ++ .../components/vacuum/.translations/es.json | 3 +- .../components/vacuum/.translations/et.json | 3 ++ .../components/vacuum/.translations/eu.json | 3 ++ .../components/vacuum/.translations/fa.json | 3 ++ .../components/vacuum/.translations/fi.json | 3 ++ .../components/vacuum/.translations/fr.json | 3 +- .../components/vacuum/.translations/gsw.json | 3 ++ .../components/vacuum/.translations/he.json | 3 ++ .../components/vacuum/.translations/hr.json | 3 ++ .../components/vacuum/.translations/hu.json | 3 +- .../components/vacuum/.translations/hy.json | 3 ++ .../components/vacuum/.translations/id.json | 3 ++ .../components/vacuum/.translations/is.json | 3 ++ .../components/vacuum/.translations/it.json | 3 +- .../components/vacuum/.translations/ko.json | 3 +- .../components/vacuum/.translations/lb.json | 3 +- .../components/vacuum/.translations/lv.json | 3 ++ .../components/vacuum/.translations/nb.json | 3 ++ .../components/vacuum/.translations/nl.json | 3 +- .../components/vacuum/.translations/nn.json | 3 ++ .../components/vacuum/.translations/pl.json | 3 +- .../vacuum/.translations/pt-BR.json | 3 ++ .../components/vacuum/.translations/pt.json | 3 +- .../components/vacuum/.translations/ro.json | 3 ++ .../components/vacuum/.translations/ru.json | 3 +- .../components/vacuum/.translations/sk.json | 3 ++ .../components/vacuum/.translations/sl.json | 3 +- .../components/vacuum/.translations/sv.json | 3 +- .../components/vacuum/.translations/th.json | 3 ++ .../components/vacuum/.translations/tr.json | 3 ++ .../components/vacuum/.translations/uk.json | 3 ++ .../components/vacuum/.translations/vi.json | 3 ++ .../vacuum/.translations/zh-Hans.json | 3 +- .../vacuum/.translations/zh-Hant.json | 3 +- .../components/velbus/.translations/bg.json | 3 +- .../components/velbus/.translations/ca.json | 3 +- .../components/velbus/.translations/da.json | 3 +- .../components/velbus/.translations/de.json | 3 +- .../components/velbus/.translations/en.json | 3 +- .../velbus/.translations/es-419.json | 3 +- .../components/velbus/.translations/es.json | 3 +- .../components/velbus/.translations/fr.json | 3 +- .../components/velbus/.translations/it.json | 3 +- .../components/velbus/.translations/ko.json | 3 +- .../components/velbus/.translations/lb.json | 3 +- .../components/velbus/.translations/nl.json | 3 +- .../components/velbus/.translations/no.json | 3 +- .../components/velbus/.translations/pl.json | 3 +- .../components/velbus/.translations/ru.json | 3 +- .../components/velbus/.translations/sl.json | 3 +- .../components/velbus/.translations/sv.json | 3 +- .../velbus/.translations/zh-Hant.json | 3 +- .../components/vera/.translations/ca.json | 3 +- .../components/vera/.translations/de.json | 3 +- .../components/vera/.translations/en.json | 3 +- .../components/vera/.translations/es.json | 3 +- .../components/vera/.translations/it.json | 3 +- .../components/vera/.translations/ko.json | 3 +- .../components/vera/.translations/lb.json | 3 +- .../components/vera/.translations/no.json | 31 +++++++++++++ .../components/vera/.translations/ru.json | 3 +- .../components/vera/.translations/sl.json | 31 +++++++++++++ .../vera/.translations/zh-Hant.json | 3 +- .../components/vesync/.translations/bg.json | 3 +- .../components/vesync/.translations/ca.json | 3 +- .../components/vesync/.translations/da.json | 3 +- .../components/vesync/.translations/de.json | 3 +- .../components/vesync/.translations/en.json | 3 +- .../vesync/.translations/es-419.json | 3 +- .../components/vesync/.translations/es.json | 3 +- .../components/vesync/.translations/fr.json | 3 +- .../components/vesync/.translations/it.json | 3 +- .../components/vesync/.translations/ko.json | 3 +- .../components/vesync/.translations/lb.json | 3 +- .../components/vesync/.translations/nl.json | 3 +- .../components/vesync/.translations/no.json | 3 +- .../components/vesync/.translations/pl.json | 3 +- .../components/vesync/.translations/ru.json | 3 +- .../components/vesync/.translations/sl.json | 3 +- .../components/vesync/.translations/sv.json | 3 +- .../vesync/.translations/zh-Hant.json | 3 +- .../components/vilfo/.translations/ca.json | 3 +- .../components/vilfo/.translations/da.json | 3 +- .../components/vilfo/.translations/de.json | 3 +- .../components/vilfo/.translations/en.json | 3 +- .../components/vilfo/.translations/es.json | 3 +- .../components/vilfo/.translations/fr.json | 3 +- .../components/vilfo/.translations/hu.json | 3 +- .../components/vilfo/.translations/it.json | 3 +- .../components/vilfo/.translations/ko.json | 3 +- .../components/vilfo/.translations/lb.json | 3 +- .../components/vilfo/.translations/nl.json | 3 +- .../components/vilfo/.translations/no.json | 3 +- .../components/vilfo/.translations/pl.json | 3 +- .../components/vilfo/.translations/ru.json | 3 +- .../components/vilfo/.translations/sl.json | 3 +- .../components/vilfo/.translations/sv.json | 3 +- .../vilfo/.translations/zh-Hans.json | 3 +- .../vilfo/.translations/zh-Hant.json | 3 +- .../components/vizio/.translations/ca.json | 6 +-- .../components/vizio/.translations/da.json | 6 +-- .../components/vizio/.translations/de.json | 6 +-- .../components/vizio/.translations/en.json | 6 +-- .../components/vizio/.translations/es.json | 6 +-- .../components/vizio/.translations/fr.json | 6 +-- .../components/vizio/.translations/hu.json | 6 +-- .../components/vizio/.translations/it.json | 6 +-- .../components/vizio/.translations/ko.json | 6 +-- .../components/vizio/.translations/lb.json | 6 +-- .../components/vizio/.translations/nl.json | 6 +-- .../components/vizio/.translations/no.json | 10 ++-- .../components/vizio/.translations/pl.json | 6 +-- .../components/vizio/.translations/ru.json | 6 +-- .../components/vizio/.translations/sl.json | 12 ++--- .../components/vizio/.translations/sv.json | 6 +-- .../vizio/.translations/zh-Hant.json | 6 +-- .../components/wemo/.translations/bg.json | 3 +- .../components/wemo/.translations/ca.json | 3 +- .../components/wemo/.translations/da.json | 3 +- .../components/wemo/.translations/de.json | 3 +- .../components/wemo/.translations/en.json | 3 +- .../components/wemo/.translations/es-419.json | 3 +- .../components/wemo/.translations/es.json | 3 +- .../components/wemo/.translations/fr.json | 3 +- .../components/wemo/.translations/it.json | 3 +- .../components/wemo/.translations/ko.json | 3 +- .../components/wemo/.translations/lb.json | 3 +- .../components/wemo/.translations/nl.json | 3 +- .../components/wemo/.translations/nn.json | 3 +- .../components/wemo/.translations/no.json | 3 +- .../components/wemo/.translations/pl.json | 3 +- .../components/wemo/.translations/pt-BR.json | 3 +- .../components/wemo/.translations/ru.json | 3 +- .../components/wemo/.translations/sl.json | 3 +- .../components/wemo/.translations/sv.json | 3 +- .../wemo/.translations/zh-Hant.json | 3 +- .../components/withings/.translations/bg.json | 3 +- .../components/withings/.translations/ca.json | 3 +- .../components/withings/.translations/da.json | 3 +- .../components/withings/.translations/de.json | 3 +- .../components/withings/.translations/en.json | 3 +- .../withings/.translations/es-419.json | 3 +- .../components/withings/.translations/es.json | 3 +- .../components/withings/.translations/fr.json | 3 +- .../components/withings/.translations/hu.json | 3 +- .../components/withings/.translations/it.json | 3 +- .../components/withings/.translations/ko.json | 3 +- .../components/withings/.translations/lb.json | 3 +- .../components/withings/.translations/nl.json | 3 +- .../components/withings/.translations/no.json | 3 +- .../components/withings/.translations/pl.json | 3 +- .../components/withings/.translations/ru.json | 3 +- .../components/withings/.translations/sl.json | 3 +- .../components/withings/.translations/sv.json | 3 +- .../withings/.translations/zh-Hant.json | 3 +- .../components/wled/.translations/af.json | 16 +++---- .../components/wled/.translations/ar.json | 16 +++---- .../components/wled/.translations/bg.json | 19 ++++---- .../components/wled/.translations/bs.json | 16 +++---- .../components/wled/.translations/ca.json | 19 ++++---- .../components/wled/.translations/cs.json | 16 +++---- .../components/wled/.translations/cy.json | 16 +++---- .../components/wled/.translations/da.json | 19 ++++---- .../components/wled/.translations/de.json | 3 +- .../components/wled/.translations/el.json | 16 +++---- .../components/wled/.translations/en.json | 3 +- .../components/wled/.translations/eo.json | 16 +++---- .../components/wled/.translations/es-419.json | 16 +++---- .../components/wled/.translations/es.json | 19 ++++---- .../components/wled/.translations/et.json | 16 +++---- .../components/wled/.translations/eu.json | 16 +++---- .../components/wled/.translations/fa.json | 16 +++---- .../components/wled/.translations/fi.json | 16 +++---- .../components/wled/.translations/fr.json | 19 ++++---- .../components/wled/.translations/gsw.json | 16 +++---- .../components/wled/.translations/he.json | 16 +++---- .../components/wled/.translations/hi.json | 16 +++---- .../components/wled/.translations/hr.json | 16 +++---- .../components/wled/.translations/hu.json | 19 ++++---- .../components/wled/.translations/iba.json | 16 +++---- .../components/wled/.translations/id.json | 16 +++---- .../components/wled/.translations/is.json | 16 +++---- .../components/wled/.translations/it.json | 3 +- .../components/wled/.translations/ja.json | 16 +++---- .../components/wled/.translations/ko.json | 19 ++++---- .../components/wled/.translations/lb.json | 19 ++++---- .../components/wled/.translations/lt.json | 16 +++---- .../components/wled/.translations/lv.json | 16 +++---- .../components/wled/.translations/nl.json | 19 ++++---- .../components/wled/.translations/nn.json | 19 ++++---- .../components/wled/.translations/no.json | 19 ++++---- .../components/wled/.translations/pl.json | 19 ++++---- .../components/wled/.translations/pt-BR.json | 16 +++---- .../components/wled/.translations/pt.json | 19 ++++---- .../components/wled/.translations/ro.json | 16 +++---- .../components/wled/.translations/ru.json | 3 +- .../components/wled/.translations/sk.json | 16 +++---- .../components/wled/.translations/sl.json | 19 ++++---- .../wled/.translations/sr-Latn.json | 16 +++---- .../components/wled/.translations/sr.json | 16 +++---- .../components/wled/.translations/sv.json | 19 ++++---- .../components/wled/.translations/ta.json | 16 +++---- .../components/wled/.translations/te.json | 16 +++---- .../components/wled/.translations/th.json | 16 +++---- .../components/wled/.translations/tr.json | 16 +++---- .../components/wled/.translations/uk.json | 16 +++---- .../components/wled/.translations/ur.json | 16 +++---- .../components/wled/.translations/vi.json | 16 +++---- .../wled/.translations/zh-Hans.json | 16 +++---- .../wled/.translations/zh-Hant.json | 19 ++++---- .../components/wwlln/.translations/bg.json | 3 +- .../components/wwlln/.translations/ca.json | 3 +- .../components/wwlln/.translations/cy.json | 3 +- .../components/wwlln/.translations/da.json | 3 +- .../components/wwlln/.translations/de.json | 3 +- .../components/wwlln/.translations/en.json | 3 +- .../wwlln/.translations/es-419.json | 3 +- .../components/wwlln/.translations/es.json | 3 +- .../components/wwlln/.translations/fr.json | 3 +- .../components/wwlln/.translations/hr.json | 3 +- .../components/wwlln/.translations/it.json | 3 +- .../components/wwlln/.translations/ko.json | 3 +- .../components/wwlln/.translations/lb.json | 3 +- .../components/wwlln/.translations/nl.json | 3 +- .../components/wwlln/.translations/no.json | 3 +- .../components/wwlln/.translations/pl.json | 3 +- .../components/wwlln/.translations/pt-BR.json | 3 +- .../components/wwlln/.translations/ru.json | 3 +- .../components/wwlln/.translations/sl.json | 3 +- .../components/wwlln/.translations/sv.json | 3 +- .../wwlln/.translations/zh-Hans.json | 3 +- .../wwlln/.translations/zh-Hant.json | 3 +- .../components/zha/.translations/bg.json | 3 +- .../components/zha/.translations/ca.json | 3 +- .../components/zha/.translations/da.json | 3 +- .../components/zha/.translations/de.json | 3 +- .../components/zha/.translations/en.json | 3 +- .../components/zha/.translations/es-419.json | 3 +- .../components/zha/.translations/es.json | 3 +- .../components/zha/.translations/fr.json | 3 +- .../components/zha/.translations/hu.json | 3 +- .../components/zha/.translations/it.json | 3 +- .../components/zha/.translations/ko.json | 3 +- .../components/zha/.translations/lb.json | 3 +- .../components/zha/.translations/nl.json | 3 +- .../components/zha/.translations/nn.json | 3 +- .../components/zha/.translations/no.json | 3 +- .../components/zha/.translations/pl.json | 3 +- .../components/zha/.translations/pt-BR.json | 3 +- .../components/zha/.translations/pt.json | 3 +- .../components/zha/.translations/ru.json | 3 +- .../components/zha/.translations/sl.json | 3 +- .../components/zha/.translations/sv.json | 3 +- .../components/zha/.translations/zh-Hans.json | 3 +- .../components/zha/.translations/zh-Hant.json | 3 +- .../components/zwave/.translations/bg.json | 3 +- .../components/zwave/.translations/ca.json | 3 +- .../components/zwave/.translations/cs.json | 3 +- .../components/zwave/.translations/da.json | 3 +- .../components/zwave/.translations/de.json | 3 +- .../components/zwave/.translations/en.json | 3 +- .../zwave/.translations/es-419.json | 3 +- .../components/zwave/.translations/es.json | 3 +- .../components/zwave/.translations/fr.json | 3 +- .../components/zwave/.translations/hu.json | 3 +- .../components/zwave/.translations/it.json | 3 +- .../components/zwave/.translations/ko.json | 3 +- .../components/zwave/.translations/lb.json | 3 +- .../components/zwave/.translations/nl.json | 3 +- .../components/zwave/.translations/nn.json | 3 +- .../components/zwave/.translations/no.json | 3 +- .../components/zwave/.translations/pl.json | 3 +- .../components/zwave/.translations/pt-BR.json | 3 +- .../components/zwave/.translations/pt.json | 3 +- .../components/zwave/.translations/ro.json | 3 +- .../components/zwave/.translations/ru.json | 3 +- .../components/zwave/.translations/sl.json | 3 +- .../components/zwave/.translations/sv.json | 3 +- .../zwave/.translations/zh-Hans.json | 3 +- .../zwave/.translations/zh-Hant.json | 3 +- script/translations/clean.py | 26 +++++------ 4387 files changed, 9627 insertions(+), 5907 deletions(-) create mode 100644 homeassistant/components/.translations/history_graph.af.json create mode 100644 homeassistant/components/.translations/history_graph.ar.json create mode 100644 homeassistant/components/.translations/history_graph.bg.json create mode 100644 homeassistant/components/.translations/history_graph.bs.json create mode 100644 homeassistant/components/.translations/history_graph.ca.json create mode 100644 homeassistant/components/.translations/history_graph.cs.json create mode 100644 homeassistant/components/.translations/history_graph.cy.json create mode 100644 homeassistant/components/.translations/history_graph.da.json create mode 100644 homeassistant/components/.translations/history_graph.de.json create mode 100644 homeassistant/components/.translations/history_graph.el.json create mode 100644 homeassistant/components/.translations/history_graph.en.json create mode 100644 homeassistant/components/.translations/history_graph.es-419.json create mode 100644 homeassistant/components/.translations/history_graph.es.json create mode 100644 homeassistant/components/.translations/history_graph.et.json create mode 100644 homeassistant/components/.translations/history_graph.fi.json create mode 100644 homeassistant/components/.translations/history_graph.fr.json create mode 100644 homeassistant/components/.translations/history_graph.he.json create mode 100644 homeassistant/components/.translations/history_graph.hi.json create mode 100644 homeassistant/components/.translations/history_graph.hr.json create mode 100644 homeassistant/components/.translations/history_graph.hu.json create mode 100644 homeassistant/components/.translations/history_graph.hy.json create mode 100644 homeassistant/components/.translations/history_graph.id.json create mode 100644 homeassistant/components/.translations/history_graph.is.json create mode 100644 homeassistant/components/.translations/history_graph.it.json create mode 100644 homeassistant/components/.translations/history_graph.ko.json create mode 100644 homeassistant/components/.translations/history_graph.lb.json create mode 100644 homeassistant/components/.translations/history_graph.lv.json create mode 100644 homeassistant/components/.translations/history_graph.nb.json create mode 100644 homeassistant/components/.translations/history_graph.nl.json create mode 100644 homeassistant/components/.translations/history_graph.nn.json create mode 100644 homeassistant/components/.translations/history_graph.pl.json create mode 100644 homeassistant/components/.translations/history_graph.pt-BR.json create mode 100644 homeassistant/components/.translations/history_graph.pt.json create mode 100644 homeassistant/components/.translations/history_graph.ro.json create mode 100644 homeassistant/components/.translations/history_graph.ru.json create mode 100644 homeassistant/components/.translations/history_graph.sk.json create mode 100644 homeassistant/components/.translations/history_graph.sl.json create mode 100644 homeassistant/components/.translations/history_graph.sv.json create mode 100644 homeassistant/components/.translations/history_graph.te.json create mode 100644 homeassistant/components/.translations/history_graph.th.json create mode 100644 homeassistant/components/.translations/history_graph.tr.json create mode 100644 homeassistant/components/.translations/history_graph.uk.json create mode 100644 homeassistant/components/.translations/history_graph.vi.json create mode 100644 homeassistant/components/.translations/history_graph.zh-Hans.json create mode 100644 homeassistant/components/.translations/history_graph.zh-Hant.json create mode 100644 homeassistant/components/.translations/weblink.af.json create mode 100644 homeassistant/components/.translations/weblink.ar.json create mode 100644 homeassistant/components/.translations/weblink.bg.json create mode 100644 homeassistant/components/.translations/weblink.bs.json create mode 100644 homeassistant/components/.translations/weblink.ca.json create mode 100644 homeassistant/components/.translations/weblink.cs.json create mode 100644 homeassistant/components/.translations/weblink.cy.json create mode 100644 homeassistant/components/.translations/weblink.da.json create mode 100644 homeassistant/components/.translations/weblink.de.json create mode 100644 homeassistant/components/.translations/weblink.el.json create mode 100644 homeassistant/components/.translations/weblink.en.json create mode 100644 homeassistant/components/.translations/weblink.es-419.json create mode 100644 homeassistant/components/.translations/weblink.es.json create mode 100644 homeassistant/components/.translations/weblink.et.json create mode 100644 homeassistant/components/.translations/weblink.fa.json create mode 100644 homeassistant/components/.translations/weblink.fi.json create mode 100644 homeassistant/components/.translations/weblink.fr.json create mode 100644 homeassistant/components/.translations/weblink.gsw.json create mode 100644 homeassistant/components/.translations/weblink.he.json create mode 100644 homeassistant/components/.translations/weblink.hi.json create mode 100644 homeassistant/components/.translations/weblink.hr.json create mode 100644 homeassistant/components/.translations/weblink.hu.json create mode 100644 homeassistant/components/.translations/weblink.hy.json create mode 100644 homeassistant/components/.translations/weblink.id.json create mode 100644 homeassistant/components/.translations/weblink.is.json create mode 100644 homeassistant/components/.translations/weblink.it.json create mode 100644 homeassistant/components/.translations/weblink.ko.json create mode 100644 homeassistant/components/.translations/weblink.lb.json create mode 100644 homeassistant/components/.translations/weblink.lv.json create mode 100644 homeassistant/components/.translations/weblink.nb.json create mode 100644 homeassistant/components/.translations/weblink.nl.json create mode 100644 homeassistant/components/.translations/weblink.nn.json create mode 100644 homeassistant/components/.translations/weblink.pl.json create mode 100644 homeassistant/components/.translations/weblink.pt-BR.json create mode 100644 homeassistant/components/.translations/weblink.pt.json create mode 100644 homeassistant/components/.translations/weblink.ro.json create mode 100644 homeassistant/components/.translations/weblink.ru.json create mode 100644 homeassistant/components/.translations/weblink.sk.json create mode 100644 homeassistant/components/.translations/weblink.sl.json create mode 100644 homeassistant/components/.translations/weblink.sv.json create mode 100644 homeassistant/components/.translations/weblink.ta.json create mode 100644 homeassistant/components/.translations/weblink.te.json create mode 100644 homeassistant/components/.translations/weblink.th.json create mode 100644 homeassistant/components/.translations/weblink.tr.json create mode 100644 homeassistant/components/.translations/weblink.uk.json create mode 100644 homeassistant/components/.translations/weblink.vi.json create mode 100644 homeassistant/components/.translations/weblink.zh-Hans.json create mode 100644 homeassistant/components/.translations/weblink.zh-Hant.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/af.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/ar.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/bs.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/cy.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/el.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/et.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/eu.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/fa.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/fi.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/he.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/hr.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/hy.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/id.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/is.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/lv.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/nb.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/nn.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/ro.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/sk.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/te.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/th.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/tr.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/uk.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/vi.json create mode 100644 homeassistant/components/alarm_control_panel/.translations/zh-Hans.json create mode 100644 homeassistant/components/automation/.translations/af.json create mode 100644 homeassistant/components/automation/.translations/ar.json create mode 100644 homeassistant/components/automation/.translations/bg.json create mode 100644 homeassistant/components/automation/.translations/bs.json create mode 100644 homeassistant/components/automation/.translations/ca.json create mode 100644 homeassistant/components/automation/.translations/cs.json create mode 100644 homeassistant/components/automation/.translations/cy.json create mode 100644 homeassistant/components/automation/.translations/da.json create mode 100644 homeassistant/components/automation/.translations/de.json create mode 100644 homeassistant/components/automation/.translations/el.json create mode 100644 homeassistant/components/automation/.translations/en.json create mode 100644 homeassistant/components/automation/.translations/es-419.json create mode 100644 homeassistant/components/automation/.translations/es.json create mode 100644 homeassistant/components/automation/.translations/et.json create mode 100644 homeassistant/components/automation/.translations/eu.json create mode 100644 homeassistant/components/automation/.translations/fa.json create mode 100644 homeassistant/components/automation/.translations/fi.json create mode 100644 homeassistant/components/automation/.translations/fr.json create mode 100644 homeassistant/components/automation/.translations/gsw.json create mode 100644 homeassistant/components/automation/.translations/he.json create mode 100644 homeassistant/components/automation/.translations/hi.json create mode 100644 homeassistant/components/automation/.translations/hr.json create mode 100644 homeassistant/components/automation/.translations/hu.json create mode 100644 homeassistant/components/automation/.translations/hy.json create mode 100644 homeassistant/components/automation/.translations/id.json create mode 100644 homeassistant/components/automation/.translations/is.json create mode 100644 homeassistant/components/automation/.translations/it.json create mode 100644 homeassistant/components/automation/.translations/ja.json create mode 100644 homeassistant/components/automation/.translations/ko.json create mode 100644 homeassistant/components/automation/.translations/lb.json create mode 100644 homeassistant/components/automation/.translations/lv.json create mode 100644 homeassistant/components/automation/.translations/nb.json create mode 100644 homeassistant/components/automation/.translations/nl.json create mode 100644 homeassistant/components/automation/.translations/nn.json create mode 100644 homeassistant/components/automation/.translations/pl.json create mode 100644 homeassistant/components/automation/.translations/pt-BR.json create mode 100644 homeassistant/components/automation/.translations/pt.json create mode 100644 homeassistant/components/automation/.translations/ro.json create mode 100644 homeassistant/components/automation/.translations/ru.json create mode 100644 homeassistant/components/automation/.translations/sk.json create mode 100644 homeassistant/components/automation/.translations/sl.json create mode 100644 homeassistant/components/automation/.translations/sv.json create mode 100644 homeassistant/components/automation/.translations/te.json create mode 100644 homeassistant/components/automation/.translations/th.json create mode 100644 homeassistant/components/automation/.translations/tr.json create mode 100644 homeassistant/components/automation/.translations/uk.json create mode 100644 homeassistant/components/automation/.translations/vi.json create mode 100644 homeassistant/components/automation/.translations/zh-Hans.json create mode 100644 homeassistant/components/automation/.translations/zh-Hant.json create mode 100644 homeassistant/components/binary_sensor/.translations/af.json create mode 100644 homeassistant/components/binary_sensor/.translations/ar.json create mode 100644 homeassistant/components/binary_sensor/.translations/bs.json create mode 100644 homeassistant/components/binary_sensor/.translations/cy.json create mode 100644 homeassistant/components/binary_sensor/.translations/el.json create mode 100644 homeassistant/components/binary_sensor/.translations/et.json create mode 100644 homeassistant/components/binary_sensor/.translations/eu.json create mode 100644 homeassistant/components/binary_sensor/.translations/fa.json create mode 100644 homeassistant/components/binary_sensor/.translations/fi.json create mode 100644 homeassistant/components/binary_sensor/.translations/gsw.json create mode 100644 homeassistant/components/binary_sensor/.translations/he.json create mode 100644 homeassistant/components/binary_sensor/.translations/hi.json create mode 100644 homeassistant/components/binary_sensor/.translations/hr.json create mode 100644 homeassistant/components/binary_sensor/.translations/hy.json create mode 100644 homeassistant/components/binary_sensor/.translations/id.json create mode 100644 homeassistant/components/binary_sensor/.translations/is.json create mode 100644 homeassistant/components/binary_sensor/.translations/ja.json create mode 100644 homeassistant/components/binary_sensor/.translations/nb.json create mode 100644 homeassistant/components/binary_sensor/.translations/nn.json create mode 100644 homeassistant/components/binary_sensor/.translations/pt-BR.json create mode 100644 homeassistant/components/binary_sensor/.translations/sk.json create mode 100644 homeassistant/components/binary_sensor/.translations/te.json create mode 100644 homeassistant/components/binary_sensor/.translations/th.json create mode 100644 homeassistant/components/binary_sensor/.translations/tr.json create mode 100644 homeassistant/components/binary_sensor/.translations/uk.json create mode 100644 homeassistant/components/binary_sensor/.translations/vi.json create mode 100644 homeassistant/components/braviatv/.translations/ca.json create mode 100644 homeassistant/components/braviatv/.translations/pt.json create mode 100644 homeassistant/components/braviatv/.translations/sl.json create mode 100644 homeassistant/components/calendar/.translations/af.json create mode 100644 homeassistant/components/calendar/.translations/ar.json create mode 100644 homeassistant/components/calendar/.translations/bg.json create mode 100644 homeassistant/components/calendar/.translations/bs.json create mode 100644 homeassistant/components/calendar/.translations/ca.json create mode 100644 homeassistant/components/calendar/.translations/cs.json create mode 100644 homeassistant/components/calendar/.translations/cy.json create mode 100644 homeassistant/components/calendar/.translations/da.json create mode 100644 homeassistant/components/calendar/.translations/de.json create mode 100644 homeassistant/components/calendar/.translations/el.json create mode 100644 homeassistant/components/calendar/.translations/en.json create mode 100644 homeassistant/components/calendar/.translations/es-419.json create mode 100644 homeassistant/components/calendar/.translations/es.json create mode 100644 homeassistant/components/calendar/.translations/et.json create mode 100644 homeassistant/components/calendar/.translations/eu.json create mode 100644 homeassistant/components/calendar/.translations/fa.json create mode 100644 homeassistant/components/calendar/.translations/fi.json create mode 100644 homeassistant/components/calendar/.translations/fr.json create mode 100644 homeassistant/components/calendar/.translations/gsw.json create mode 100644 homeassistant/components/calendar/.translations/he.json create mode 100644 homeassistant/components/calendar/.translations/hr.json create mode 100644 homeassistant/components/calendar/.translations/hu.json create mode 100644 homeassistant/components/calendar/.translations/hy.json create mode 100644 homeassistant/components/calendar/.translations/id.json create mode 100644 homeassistant/components/calendar/.translations/is.json create mode 100644 homeassistant/components/calendar/.translations/it.json create mode 100644 homeassistant/components/calendar/.translations/ja.json create mode 100644 homeassistant/components/calendar/.translations/ko.json create mode 100644 homeassistant/components/calendar/.translations/lb.json create mode 100644 homeassistant/components/calendar/.translations/lv.json create mode 100644 homeassistant/components/calendar/.translations/nb.json create mode 100644 homeassistant/components/calendar/.translations/nl.json create mode 100644 homeassistant/components/calendar/.translations/nn.json create mode 100644 homeassistant/components/calendar/.translations/pl.json create mode 100644 homeassistant/components/calendar/.translations/pt-BR.json create mode 100644 homeassistant/components/calendar/.translations/pt.json create mode 100644 homeassistant/components/calendar/.translations/ro.json create mode 100644 homeassistant/components/calendar/.translations/ru.json create mode 100644 homeassistant/components/calendar/.translations/sk.json create mode 100644 homeassistant/components/calendar/.translations/sl.json create mode 100644 homeassistant/components/calendar/.translations/sv.json create mode 100644 homeassistant/components/calendar/.translations/te.json create mode 100644 homeassistant/components/calendar/.translations/th.json create mode 100644 homeassistant/components/calendar/.translations/tr.json create mode 100644 homeassistant/components/calendar/.translations/uk.json create mode 100644 homeassistant/components/calendar/.translations/vi.json create mode 100644 homeassistant/components/calendar/.translations/zh-Hans.json create mode 100644 homeassistant/components/calendar/.translations/zh-Hant.json create mode 100644 homeassistant/components/camera/.translations/af.json create mode 100644 homeassistant/components/camera/.translations/ar.json create mode 100644 homeassistant/components/camera/.translations/bg.json create mode 100644 homeassistant/components/camera/.translations/bs.json create mode 100644 homeassistant/components/camera/.translations/ca.json create mode 100644 homeassistant/components/camera/.translations/cs.json create mode 100644 homeassistant/components/camera/.translations/cy.json create mode 100644 homeassistant/components/camera/.translations/da.json create mode 100644 homeassistant/components/camera/.translations/de.json create mode 100644 homeassistant/components/camera/.translations/el.json create mode 100644 homeassistant/components/camera/.translations/en.json create mode 100644 homeassistant/components/camera/.translations/es-419.json create mode 100644 homeassistant/components/camera/.translations/es.json create mode 100644 homeassistant/components/camera/.translations/et.json create mode 100644 homeassistant/components/camera/.translations/eu.json create mode 100644 homeassistant/components/camera/.translations/fa.json create mode 100644 homeassistant/components/camera/.translations/fi.json create mode 100644 homeassistant/components/camera/.translations/fr.json create mode 100644 homeassistant/components/camera/.translations/gsw.json create mode 100644 homeassistant/components/camera/.translations/he.json create mode 100644 homeassistant/components/camera/.translations/hr.json create mode 100644 homeassistant/components/camera/.translations/hu.json create mode 100644 homeassistant/components/camera/.translations/hy.json create mode 100644 homeassistant/components/camera/.translations/id.json create mode 100644 homeassistant/components/camera/.translations/is.json create mode 100644 homeassistant/components/camera/.translations/it.json create mode 100644 homeassistant/components/camera/.translations/ja.json create mode 100644 homeassistant/components/camera/.translations/ko.json create mode 100644 homeassistant/components/camera/.translations/lb.json create mode 100644 homeassistant/components/camera/.translations/lv.json create mode 100644 homeassistant/components/camera/.translations/nb.json create mode 100644 homeassistant/components/camera/.translations/nl.json create mode 100644 homeassistant/components/camera/.translations/nn.json create mode 100644 homeassistant/components/camera/.translations/pl.json create mode 100644 homeassistant/components/camera/.translations/pt-BR.json create mode 100644 homeassistant/components/camera/.translations/pt.json create mode 100644 homeassistant/components/camera/.translations/ro.json create mode 100644 homeassistant/components/camera/.translations/ru.json create mode 100644 homeassistant/components/camera/.translations/sk.json create mode 100644 homeassistant/components/camera/.translations/sl.json create mode 100644 homeassistant/components/camera/.translations/sv.json create mode 100644 homeassistant/components/camera/.translations/te.json create mode 100644 homeassistant/components/camera/.translations/th.json create mode 100644 homeassistant/components/camera/.translations/tr.json create mode 100644 homeassistant/components/camera/.translations/uk.json create mode 100644 homeassistant/components/camera/.translations/vi.json create mode 100644 homeassistant/components/camera/.translations/zh-Hans.json create mode 100644 homeassistant/components/camera/.translations/zh-Hant.json create mode 100644 homeassistant/components/climate/.translations/af.json create mode 100644 homeassistant/components/climate/.translations/ar.json create mode 100644 homeassistant/components/climate/.translations/bs.json create mode 100644 homeassistant/components/climate/.translations/cs.json create mode 100644 homeassistant/components/climate/.translations/cy.json create mode 100644 homeassistant/components/climate/.translations/el.json create mode 100644 homeassistant/components/climate/.translations/et.json create mode 100644 homeassistant/components/climate/.translations/eu.json create mode 100644 homeassistant/components/climate/.translations/fa.json create mode 100644 homeassistant/components/climate/.translations/fi.json create mode 100644 homeassistant/components/climate/.translations/gsw.json create mode 100644 homeassistant/components/climate/.translations/he.json create mode 100644 homeassistant/components/climate/.translations/hi.json create mode 100644 homeassistant/components/climate/.translations/hr.json create mode 100644 homeassistant/components/climate/.translations/hy.json create mode 100644 homeassistant/components/climate/.translations/id.json create mode 100644 homeassistant/components/climate/.translations/is.json create mode 100644 homeassistant/components/climate/.translations/lv.json create mode 100644 homeassistant/components/climate/.translations/nb.json create mode 100644 homeassistant/components/climate/.translations/nn.json create mode 100644 homeassistant/components/climate/.translations/pt-BR.json create mode 100644 homeassistant/components/climate/.translations/pt.json create mode 100644 homeassistant/components/climate/.translations/ro.json create mode 100644 homeassistant/components/climate/.translations/sk.json create mode 100644 homeassistant/components/climate/.translations/te.json create mode 100644 homeassistant/components/climate/.translations/th.json create mode 100644 homeassistant/components/climate/.translations/tr.json create mode 100644 homeassistant/components/climate/.translations/uk.json create mode 100644 homeassistant/components/climate/.translations/vi.json create mode 100644 homeassistant/components/configurator/.translations/af.json create mode 100644 homeassistant/components/configurator/.translations/ar.json create mode 100644 homeassistant/components/configurator/.translations/bg.json create mode 100644 homeassistant/components/configurator/.translations/bs.json create mode 100644 homeassistant/components/configurator/.translations/ca.json create mode 100644 homeassistant/components/configurator/.translations/cs.json create mode 100644 homeassistant/components/configurator/.translations/cy.json create mode 100644 homeassistant/components/configurator/.translations/da.json create mode 100644 homeassistant/components/configurator/.translations/de.json create mode 100644 homeassistant/components/configurator/.translations/el.json create mode 100644 homeassistant/components/configurator/.translations/en.json create mode 100644 homeassistant/components/configurator/.translations/es-419.json create mode 100644 homeassistant/components/configurator/.translations/es.json create mode 100644 homeassistant/components/configurator/.translations/et.json create mode 100644 homeassistant/components/configurator/.translations/eu.json create mode 100644 homeassistant/components/configurator/.translations/fa.json create mode 100644 homeassistant/components/configurator/.translations/fi.json create mode 100644 homeassistant/components/configurator/.translations/fr.json create mode 100644 homeassistant/components/configurator/.translations/gsw.json create mode 100644 homeassistant/components/configurator/.translations/he.json create mode 100644 homeassistant/components/configurator/.translations/hr.json create mode 100644 homeassistant/components/configurator/.translations/hu.json create mode 100644 homeassistant/components/configurator/.translations/hy.json create mode 100644 homeassistant/components/configurator/.translations/id.json create mode 100644 homeassistant/components/configurator/.translations/is.json create mode 100644 homeassistant/components/configurator/.translations/it.json create mode 100644 homeassistant/components/configurator/.translations/ko.json create mode 100644 homeassistant/components/configurator/.translations/lb.json create mode 100644 homeassistant/components/configurator/.translations/lv.json create mode 100644 homeassistant/components/configurator/.translations/nb.json create mode 100644 homeassistant/components/configurator/.translations/nl.json create mode 100644 homeassistant/components/configurator/.translations/nn.json create mode 100644 homeassistant/components/configurator/.translations/pl.json create mode 100644 homeassistant/components/configurator/.translations/pt-BR.json create mode 100644 homeassistant/components/configurator/.translations/pt.json create mode 100644 homeassistant/components/configurator/.translations/ro.json create mode 100644 homeassistant/components/configurator/.translations/ru.json create mode 100644 homeassistant/components/configurator/.translations/sk.json create mode 100644 homeassistant/components/configurator/.translations/sl.json create mode 100644 homeassistant/components/configurator/.translations/sv.json create mode 100644 homeassistant/components/configurator/.translations/te.json create mode 100644 homeassistant/components/configurator/.translations/th.json create mode 100644 homeassistant/components/configurator/.translations/tr.json create mode 100644 homeassistant/components/configurator/.translations/uk.json create mode 100644 homeassistant/components/configurator/.translations/vi.json create mode 100644 homeassistant/components/configurator/.translations/zh-Hans.json create mode 100644 homeassistant/components/configurator/.translations/zh-Hant.json create mode 100644 homeassistant/components/conversation/.translations/af.json create mode 100644 homeassistant/components/conversation/.translations/ar.json create mode 100644 homeassistant/components/conversation/.translations/bg.json create mode 100644 homeassistant/components/conversation/.translations/bs.json create mode 100644 homeassistant/components/conversation/.translations/ca.json create mode 100644 homeassistant/components/conversation/.translations/cs.json create mode 100644 homeassistant/components/conversation/.translations/cy.json create mode 100644 homeassistant/components/conversation/.translations/da.json create mode 100644 homeassistant/components/conversation/.translations/de.json create mode 100644 homeassistant/components/conversation/.translations/el.json create mode 100644 homeassistant/components/conversation/.translations/en.json create mode 100644 homeassistant/components/conversation/.translations/es-419.json create mode 100644 homeassistant/components/conversation/.translations/es.json create mode 100644 homeassistant/components/conversation/.translations/et.json create mode 100644 homeassistant/components/conversation/.translations/eu.json create mode 100644 homeassistant/components/conversation/.translations/fa.json create mode 100644 homeassistant/components/conversation/.translations/fi.json create mode 100644 homeassistant/components/conversation/.translations/fr.json create mode 100644 homeassistant/components/conversation/.translations/gsw.json create mode 100644 homeassistant/components/conversation/.translations/he.json create mode 100644 homeassistant/components/conversation/.translations/hr.json create mode 100644 homeassistant/components/conversation/.translations/hu.json create mode 100644 homeassistant/components/conversation/.translations/hy.json create mode 100644 homeassistant/components/conversation/.translations/id.json create mode 100644 homeassistant/components/conversation/.translations/is.json create mode 100644 homeassistant/components/conversation/.translations/it.json create mode 100644 homeassistant/components/conversation/.translations/ko.json create mode 100644 homeassistant/components/conversation/.translations/lb.json create mode 100644 homeassistant/components/conversation/.translations/lv.json create mode 100644 homeassistant/components/conversation/.translations/nb.json create mode 100644 homeassistant/components/conversation/.translations/nl.json create mode 100644 homeassistant/components/conversation/.translations/nn.json create mode 100644 homeassistant/components/conversation/.translations/pl.json create mode 100644 homeassistant/components/conversation/.translations/pt-BR.json create mode 100644 homeassistant/components/conversation/.translations/pt.json create mode 100644 homeassistant/components/conversation/.translations/ro.json create mode 100644 homeassistant/components/conversation/.translations/ru.json create mode 100644 homeassistant/components/conversation/.translations/sk.json create mode 100644 homeassistant/components/conversation/.translations/sl.json create mode 100644 homeassistant/components/conversation/.translations/sv.json create mode 100644 homeassistant/components/conversation/.translations/te.json create mode 100644 homeassistant/components/conversation/.translations/th.json create mode 100644 homeassistant/components/conversation/.translations/tr.json create mode 100644 homeassistant/components/conversation/.translations/uk.json create mode 100644 homeassistant/components/conversation/.translations/vi.json create mode 100644 homeassistant/components/conversation/.translations/zh-Hans.json create mode 100644 homeassistant/components/conversation/.translations/zh-Hant.json create mode 100644 homeassistant/components/cover/.translations/af.json create mode 100644 homeassistant/components/cover/.translations/ar.json create mode 100644 homeassistant/components/cover/.translations/bs.json create mode 100644 homeassistant/components/cover/.translations/cy.json create mode 100644 homeassistant/components/cover/.translations/el.json create mode 100644 homeassistant/components/cover/.translations/es-419.json create mode 100644 homeassistant/components/cover/.translations/et.json create mode 100644 homeassistant/components/cover/.translations/fa.json create mode 100644 homeassistant/components/cover/.translations/fi.json create mode 100644 homeassistant/components/cover/.translations/gsw.json create mode 100644 homeassistant/components/cover/.translations/he.json create mode 100644 homeassistant/components/cover/.translations/hr.json create mode 100644 homeassistant/components/cover/.translations/hy.json create mode 100644 homeassistant/components/cover/.translations/id.json create mode 100644 homeassistant/components/cover/.translations/is.json create mode 100644 homeassistant/components/cover/.translations/lv.json create mode 100644 homeassistant/components/cover/.translations/nb.json create mode 100644 homeassistant/components/cover/.translations/nn.json create mode 100644 homeassistant/components/cover/.translations/pt-BR.json create mode 100644 homeassistant/components/cover/.translations/ro.json create mode 100644 homeassistant/components/cover/.translations/sk.json create mode 100644 homeassistant/components/cover/.translations/te.json create mode 100644 homeassistant/components/cover/.translations/th.json create mode 100644 homeassistant/components/cover/.translations/tr.json create mode 100644 homeassistant/components/cover/.translations/uk.json create mode 100644 homeassistant/components/cover/.translations/vi.json create mode 100644 homeassistant/components/cover/.translations/zh-Hans.json create mode 100644 homeassistant/components/device_tracker/.translations/af.json create mode 100644 homeassistant/components/device_tracker/.translations/ar.json create mode 100644 homeassistant/components/device_tracker/.translations/bs.json create mode 100644 homeassistant/components/device_tracker/.translations/cy.json create mode 100644 homeassistant/components/device_tracker/.translations/el.json create mode 100644 homeassistant/components/device_tracker/.translations/et.json create mode 100644 homeassistant/components/device_tracker/.translations/fa.json create mode 100644 homeassistant/components/device_tracker/.translations/fi.json create mode 100644 homeassistant/components/device_tracker/.translations/he.json create mode 100644 homeassistant/components/device_tracker/.translations/hi.json create mode 100644 homeassistant/components/device_tracker/.translations/hr.json create mode 100644 homeassistant/components/device_tracker/.translations/hy.json create mode 100644 homeassistant/components/device_tracker/.translations/id.json create mode 100644 homeassistant/components/device_tracker/.translations/is.json create mode 100644 homeassistant/components/device_tracker/.translations/lv.json create mode 100644 homeassistant/components/device_tracker/.translations/nb.json create mode 100644 homeassistant/components/device_tracker/.translations/nn.json create mode 100644 homeassistant/components/device_tracker/.translations/pt-BR.json create mode 100644 homeassistant/components/device_tracker/.translations/ro.json create mode 100644 homeassistant/components/device_tracker/.translations/sk.json create mode 100644 homeassistant/components/device_tracker/.translations/te.json create mode 100644 homeassistant/components/device_tracker/.translations/th.json create mode 100644 homeassistant/components/device_tracker/.translations/tr.json create mode 100644 homeassistant/components/device_tracker/.translations/uk.json create mode 100644 homeassistant/components/device_tracker/.translations/vi.json create mode 100644 homeassistant/components/doorbird/.translations/sl.json create mode 100644 homeassistant/components/elkm1/.translations/sl.json create mode 100644 homeassistant/components/esphome/.translations/af.json create mode 100644 homeassistant/components/esphome/.translations/ar.json create mode 100644 homeassistant/components/esphome/.translations/bs.json create mode 100644 homeassistant/components/esphome/.translations/cy.json create mode 100644 homeassistant/components/esphome/.translations/el.json create mode 100644 homeassistant/components/esphome/.translations/eo.json create mode 100644 homeassistant/components/esphome/.translations/et.json create mode 100644 homeassistant/components/esphome/.translations/eu.json create mode 100644 homeassistant/components/esphome/.translations/fa.json create mode 100644 homeassistant/components/esphome/.translations/fi.json create mode 100644 homeassistant/components/esphome/.translations/gsw.json create mode 100644 homeassistant/components/esphome/.translations/he.json create mode 100644 homeassistant/components/esphome/.translations/hi.json create mode 100644 homeassistant/components/esphome/.translations/hr.json create mode 100644 homeassistant/components/esphome/.translations/iba.json create mode 100644 homeassistant/components/esphome/.translations/is.json create mode 100644 homeassistant/components/esphome/.translations/ja.json create mode 100644 homeassistant/components/esphome/.translations/lt.json create mode 100644 homeassistant/components/esphome/.translations/lv.json create mode 100644 homeassistant/components/esphome/.translations/ro.json create mode 100644 homeassistant/components/esphome/.translations/sk.json create mode 100644 homeassistant/components/esphome/.translations/sr-Latn.json create mode 100644 homeassistant/components/esphome/.translations/sr.json create mode 100644 homeassistant/components/esphome/.translations/ta.json create mode 100644 homeassistant/components/esphome/.translations/te.json create mode 100644 homeassistant/components/esphome/.translations/tr.json create mode 100644 homeassistant/components/esphome/.translations/ur.json create mode 100644 homeassistant/components/esphome/.translations/vi.json create mode 100644 homeassistant/components/fan/.translations/af.json create mode 100644 homeassistant/components/fan/.translations/ar.json create mode 100644 homeassistant/components/fan/.translations/bs.json create mode 100644 homeassistant/components/fan/.translations/cs.json create mode 100644 homeassistant/components/fan/.translations/cy.json create mode 100644 homeassistant/components/fan/.translations/el.json create mode 100644 homeassistant/components/fan/.translations/et.json create mode 100644 homeassistant/components/fan/.translations/eu.json create mode 100644 homeassistant/components/fan/.translations/fa.json create mode 100644 homeassistant/components/fan/.translations/fi.json create mode 100644 homeassistant/components/fan/.translations/he.json create mode 100644 homeassistant/components/fan/.translations/hi.json create mode 100644 homeassistant/components/fan/.translations/hr.json create mode 100644 homeassistant/components/fan/.translations/hy.json create mode 100644 homeassistant/components/fan/.translations/id.json create mode 100644 homeassistant/components/fan/.translations/is.json create mode 100644 homeassistant/components/fan/.translations/lv.json create mode 100644 homeassistant/components/fan/.translations/nb.json create mode 100644 homeassistant/components/fan/.translations/nn.json create mode 100644 homeassistant/components/fan/.translations/ro.json create mode 100644 homeassistant/components/fan/.translations/sk.json create mode 100644 homeassistant/components/fan/.translations/te.json create mode 100644 homeassistant/components/fan/.translations/th.json create mode 100644 homeassistant/components/fan/.translations/tr.json create mode 100644 homeassistant/components/fan/.translations/uk.json create mode 100644 homeassistant/components/fan/.translations/vi.json create mode 100644 homeassistant/components/flume/.translations/sl.json create mode 100644 homeassistant/components/flunearyou/.translations/no.json create mode 100644 homeassistant/components/flunearyou/.translations/sl.json create mode 100644 homeassistant/components/group/.translations/af.json create mode 100644 homeassistant/components/group/.translations/ar.json create mode 100644 homeassistant/components/group/.translations/bg.json create mode 100644 homeassistant/components/group/.translations/bs.json create mode 100644 homeassistant/components/group/.translations/ca.json create mode 100644 homeassistant/components/group/.translations/cs.json create mode 100644 homeassistant/components/group/.translations/cy.json create mode 100644 homeassistant/components/group/.translations/da.json create mode 100644 homeassistant/components/group/.translations/de.json create mode 100644 homeassistant/components/group/.translations/el.json create mode 100644 homeassistant/components/group/.translations/en.json create mode 100644 homeassistant/components/group/.translations/es-419.json create mode 100644 homeassistant/components/group/.translations/es.json create mode 100644 homeassistant/components/group/.translations/et.json create mode 100644 homeassistant/components/group/.translations/eu.json create mode 100644 homeassistant/components/group/.translations/fa.json create mode 100644 homeassistant/components/group/.translations/fi.json create mode 100644 homeassistant/components/group/.translations/fr.json create mode 100644 homeassistant/components/group/.translations/gsw.json create mode 100644 homeassistant/components/group/.translations/he.json create mode 100644 homeassistant/components/group/.translations/hi.json create mode 100644 homeassistant/components/group/.translations/hr.json create mode 100644 homeassistant/components/group/.translations/hu.json create mode 100644 homeassistant/components/group/.translations/hy.json create mode 100644 homeassistant/components/group/.translations/id.json create mode 100644 homeassistant/components/group/.translations/is.json create mode 100644 homeassistant/components/group/.translations/it.json create mode 100644 homeassistant/components/group/.translations/ja.json create mode 100644 homeassistant/components/group/.translations/ko.json create mode 100644 homeassistant/components/group/.translations/lb.json create mode 100644 homeassistant/components/group/.translations/lv.json create mode 100644 homeassistant/components/group/.translations/nb.json create mode 100644 homeassistant/components/group/.translations/nl.json create mode 100644 homeassistant/components/group/.translations/nn.json create mode 100644 homeassistant/components/group/.translations/pl.json create mode 100644 homeassistant/components/group/.translations/pt-BR.json create mode 100644 homeassistant/components/group/.translations/pt.json create mode 100644 homeassistant/components/group/.translations/ro.json create mode 100644 homeassistant/components/group/.translations/ru.json create mode 100644 homeassistant/components/group/.translations/sk.json create mode 100644 homeassistant/components/group/.translations/sl.json create mode 100644 homeassistant/components/group/.translations/sv.json create mode 100644 homeassistant/components/group/.translations/te.json create mode 100644 homeassistant/components/group/.translations/th.json create mode 100644 homeassistant/components/group/.translations/tr.json create mode 100644 homeassistant/components/group/.translations/uk.json create mode 100644 homeassistant/components/group/.translations/vi.json create mode 100644 homeassistant/components/group/.translations/zh-Hans.json create mode 100644 homeassistant/components/group/.translations/zh-Hant.json create mode 100644 homeassistant/components/harmony/.translations/sl.json create mode 100644 homeassistant/components/hassio/.translations/af.json create mode 100644 homeassistant/components/hassio/.translations/bg.json create mode 100644 homeassistant/components/hassio/.translations/ca.json create mode 100644 homeassistant/components/hassio/.translations/cs.json create mode 100644 homeassistant/components/hassio/.translations/cy.json create mode 100644 homeassistant/components/hassio/.translations/da.json create mode 100644 homeassistant/components/hassio/.translations/de.json create mode 100644 homeassistant/components/hassio/.translations/el.json create mode 100644 homeassistant/components/hassio/.translations/en.json create mode 100644 homeassistant/components/hassio/.translations/es-419.json create mode 100644 homeassistant/components/hassio/.translations/es.json create mode 100644 homeassistant/components/hassio/.translations/et.json create mode 100644 homeassistant/components/hassio/.translations/eu.json create mode 100644 homeassistant/components/hassio/.translations/fa.json create mode 100644 homeassistant/components/hassio/.translations/fi.json create mode 100644 homeassistant/components/hassio/.translations/fr.json create mode 100644 homeassistant/components/hassio/.translations/he.json create mode 100644 homeassistant/components/hassio/.translations/hr.json create mode 100644 homeassistant/components/hassio/.translations/hu.json create mode 100644 homeassistant/components/hassio/.translations/hy.json create mode 100644 homeassistant/components/hassio/.translations/is.json create mode 100644 homeassistant/components/hassio/.translations/it.json create mode 100644 homeassistant/components/hassio/.translations/ja.json create mode 100644 homeassistant/components/hassio/.translations/ko.json create mode 100644 homeassistant/components/hassio/.translations/lb.json create mode 100644 homeassistant/components/hassio/.translations/lt.json create mode 100644 homeassistant/components/hassio/.translations/lv.json create mode 100644 homeassistant/components/hassio/.translations/nb.json create mode 100644 homeassistant/components/hassio/.translations/nl.json create mode 100644 homeassistant/components/hassio/.translations/nn.json create mode 100644 homeassistant/components/hassio/.translations/pl.json create mode 100644 homeassistant/components/hassio/.translations/pt-BR.json create mode 100644 homeassistant/components/hassio/.translations/pt.json create mode 100644 homeassistant/components/hassio/.translations/ro.json create mode 100644 homeassistant/components/hassio/.translations/ru.json create mode 100644 homeassistant/components/hassio/.translations/sk.json create mode 100644 homeassistant/components/hassio/.translations/sl.json create mode 100644 homeassistant/components/hassio/.translations/sv.json create mode 100644 homeassistant/components/hassio/.translations/th.json create mode 100644 homeassistant/components/hassio/.translations/tr.json create mode 100644 homeassistant/components/hassio/.translations/uk.json create mode 100644 homeassistant/components/hassio/.translations/vi.json create mode 100644 homeassistant/components/hassio/.translations/zh-Hans.json create mode 100644 homeassistant/components/hassio/.translations/zh-Hant.json create mode 100644 homeassistant/components/homeassistant/.translations/af.json create mode 100644 homeassistant/components/homeassistant/.translations/bg.json create mode 100644 homeassistant/components/homeassistant/.translations/ca.json create mode 100644 homeassistant/components/homeassistant/.translations/cs.json create mode 100644 homeassistant/components/homeassistant/.translations/cy.json create mode 100644 homeassistant/components/homeassistant/.translations/da.json create mode 100644 homeassistant/components/homeassistant/.translations/de.json create mode 100644 homeassistant/components/homeassistant/.translations/el.json create mode 100644 homeassistant/components/homeassistant/.translations/en.json create mode 100644 homeassistant/components/homeassistant/.translations/es-419.json create mode 100644 homeassistant/components/homeassistant/.translations/es.json create mode 100644 homeassistant/components/homeassistant/.translations/et.json create mode 100644 homeassistant/components/homeassistant/.translations/eu.json create mode 100644 homeassistant/components/homeassistant/.translations/fa.json create mode 100644 homeassistant/components/homeassistant/.translations/fi.json create mode 100644 homeassistant/components/homeassistant/.translations/fr.json create mode 100644 homeassistant/components/homeassistant/.translations/he.json create mode 100644 homeassistant/components/homeassistant/.translations/hr.json create mode 100644 homeassistant/components/homeassistant/.translations/hu.json create mode 100644 homeassistant/components/homeassistant/.translations/hy.json create mode 100644 homeassistant/components/homeassistant/.translations/is.json create mode 100644 homeassistant/components/homeassistant/.translations/it.json create mode 100644 homeassistant/components/homeassistant/.translations/ko.json create mode 100644 homeassistant/components/homeassistant/.translations/lb.json create mode 100644 homeassistant/components/homeassistant/.translations/lt.json create mode 100644 homeassistant/components/homeassistant/.translations/lv.json create mode 100644 homeassistant/components/homeassistant/.translations/nb.json create mode 100644 homeassistant/components/homeassistant/.translations/nl.json create mode 100644 homeassistant/components/homeassistant/.translations/nn.json create mode 100644 homeassistant/components/homeassistant/.translations/pl.json create mode 100644 homeassistant/components/homeassistant/.translations/pt-BR.json create mode 100644 homeassistant/components/homeassistant/.translations/pt.json create mode 100644 homeassistant/components/homeassistant/.translations/ro.json create mode 100644 homeassistant/components/homeassistant/.translations/ru.json create mode 100644 homeassistant/components/homeassistant/.translations/sk.json create mode 100644 homeassistant/components/homeassistant/.translations/sl.json create mode 100644 homeassistant/components/homeassistant/.translations/sv.json create mode 100644 homeassistant/components/homeassistant/.translations/th.json create mode 100644 homeassistant/components/homeassistant/.translations/tr.json create mode 100644 homeassistant/components/homeassistant/.translations/uk.json create mode 100644 homeassistant/components/homeassistant/.translations/vi.json create mode 100644 homeassistant/components/homeassistant/.translations/zh-Hans.json create mode 100644 homeassistant/components/homeassistant/.translations/zh-Hant.json create mode 100644 homeassistant/components/image_processing/.translations/af.json create mode 100644 homeassistant/components/image_processing/.translations/ar.json create mode 100644 homeassistant/components/image_processing/.translations/bg.json create mode 100644 homeassistant/components/image_processing/.translations/bs.json create mode 100644 homeassistant/components/image_processing/.translations/ca.json create mode 100644 homeassistant/components/image_processing/.translations/cs.json create mode 100644 homeassistant/components/image_processing/.translations/cy.json create mode 100644 homeassistant/components/image_processing/.translations/da.json create mode 100644 homeassistant/components/image_processing/.translations/de.json create mode 100644 homeassistant/components/image_processing/.translations/el.json create mode 100644 homeassistant/components/image_processing/.translations/en.json create mode 100644 homeassistant/components/image_processing/.translations/es-419.json create mode 100644 homeassistant/components/image_processing/.translations/es.json create mode 100644 homeassistant/components/image_processing/.translations/et.json create mode 100644 homeassistant/components/image_processing/.translations/fa.json create mode 100644 homeassistant/components/image_processing/.translations/fi.json create mode 100644 homeassistant/components/image_processing/.translations/fr.json create mode 100644 homeassistant/components/image_processing/.translations/he.json create mode 100644 homeassistant/components/image_processing/.translations/hi.json create mode 100644 homeassistant/components/image_processing/.translations/hr.json create mode 100644 homeassistant/components/image_processing/.translations/hu.json create mode 100644 homeassistant/components/image_processing/.translations/hy.json create mode 100644 homeassistant/components/image_processing/.translations/id.json create mode 100644 homeassistant/components/image_processing/.translations/it.json create mode 100644 homeassistant/components/image_processing/.translations/ja.json create mode 100644 homeassistant/components/image_processing/.translations/ko.json create mode 100644 homeassistant/components/image_processing/.translations/lb.json create mode 100644 homeassistant/components/image_processing/.translations/lv.json create mode 100644 homeassistant/components/image_processing/.translations/nb.json create mode 100644 homeassistant/components/image_processing/.translations/nl.json create mode 100644 homeassistant/components/image_processing/.translations/nn.json create mode 100644 homeassistant/components/image_processing/.translations/pl.json create mode 100644 homeassistant/components/image_processing/.translations/pt-BR.json create mode 100644 homeassistant/components/image_processing/.translations/pt.json create mode 100644 homeassistant/components/image_processing/.translations/ro.json create mode 100644 homeassistant/components/image_processing/.translations/ru.json create mode 100644 homeassistant/components/image_processing/.translations/sk.json create mode 100644 homeassistant/components/image_processing/.translations/sl.json create mode 100644 homeassistant/components/image_processing/.translations/sv.json create mode 100644 homeassistant/components/image_processing/.translations/te.json create mode 100644 homeassistant/components/image_processing/.translations/th.json create mode 100644 homeassistant/components/image_processing/.translations/tr.json create mode 100644 homeassistant/components/image_processing/.translations/uk.json create mode 100644 homeassistant/components/image_processing/.translations/vi.json create mode 100644 homeassistant/components/image_processing/.translations/zh-Hans.json create mode 100644 homeassistant/components/image_processing/.translations/zh-Hant.json create mode 100644 homeassistant/components/input_boolean/.translations/af.json create mode 100644 homeassistant/components/input_boolean/.translations/ar.json create mode 100644 homeassistant/components/input_boolean/.translations/bg.json create mode 100644 homeassistant/components/input_boolean/.translations/bs.json create mode 100644 homeassistant/components/input_boolean/.translations/ca.json create mode 100644 homeassistant/components/input_boolean/.translations/cs.json create mode 100644 homeassistant/components/input_boolean/.translations/cy.json create mode 100644 homeassistant/components/input_boolean/.translations/da.json create mode 100644 homeassistant/components/input_boolean/.translations/de.json create mode 100644 homeassistant/components/input_boolean/.translations/el.json create mode 100644 homeassistant/components/input_boolean/.translations/en.json create mode 100644 homeassistant/components/input_boolean/.translations/es-419.json create mode 100644 homeassistant/components/input_boolean/.translations/es.json create mode 100644 homeassistant/components/input_boolean/.translations/et.json create mode 100644 homeassistant/components/input_boolean/.translations/eu.json create mode 100644 homeassistant/components/input_boolean/.translations/fa.json create mode 100644 homeassistant/components/input_boolean/.translations/fi.json create mode 100644 homeassistant/components/input_boolean/.translations/fr.json create mode 100644 homeassistant/components/input_boolean/.translations/he.json create mode 100644 homeassistant/components/input_boolean/.translations/hi.json create mode 100644 homeassistant/components/input_boolean/.translations/hr.json create mode 100644 homeassistant/components/input_boolean/.translations/hu.json create mode 100644 homeassistant/components/input_boolean/.translations/hy.json create mode 100644 homeassistant/components/input_boolean/.translations/id.json create mode 100644 homeassistant/components/input_boolean/.translations/it.json create mode 100644 homeassistant/components/input_boolean/.translations/ko.json create mode 100644 homeassistant/components/input_boolean/.translations/lb.json create mode 100644 homeassistant/components/input_boolean/.translations/lv.json create mode 100644 homeassistant/components/input_boolean/.translations/nb.json create mode 100644 homeassistant/components/input_boolean/.translations/nl.json create mode 100644 homeassistant/components/input_boolean/.translations/nn.json create mode 100644 homeassistant/components/input_boolean/.translations/pl.json create mode 100644 homeassistant/components/input_boolean/.translations/pt-BR.json create mode 100644 homeassistant/components/input_boolean/.translations/pt.json create mode 100644 homeassistant/components/input_boolean/.translations/ro.json create mode 100644 homeassistant/components/input_boolean/.translations/ru.json create mode 100644 homeassistant/components/input_boolean/.translations/sk.json create mode 100644 homeassistant/components/input_boolean/.translations/sl.json create mode 100644 homeassistant/components/input_boolean/.translations/sv.json create mode 100644 homeassistant/components/input_boolean/.translations/te.json create mode 100644 homeassistant/components/input_boolean/.translations/th.json create mode 100644 homeassistant/components/input_boolean/.translations/tr.json create mode 100644 homeassistant/components/input_boolean/.translations/uk.json create mode 100644 homeassistant/components/input_boolean/.translations/vi.json create mode 100644 homeassistant/components/input_boolean/.translations/zh-Hans.json create mode 100644 homeassistant/components/input_boolean/.translations/zh-Hant.json create mode 100644 homeassistant/components/input_datetime/.translations/af.json create mode 100644 homeassistant/components/input_datetime/.translations/ar.json create mode 100644 homeassistant/components/input_datetime/.translations/bg.json create mode 100644 homeassistant/components/input_datetime/.translations/bs.json create mode 100644 homeassistant/components/input_datetime/.translations/ca.json create mode 100644 homeassistant/components/input_datetime/.translations/cs.json create mode 100644 homeassistant/components/input_datetime/.translations/cy.json create mode 100644 homeassistant/components/input_datetime/.translations/da.json create mode 100644 homeassistant/components/input_datetime/.translations/de.json create mode 100644 homeassistant/components/input_datetime/.translations/el.json create mode 100644 homeassistant/components/input_datetime/.translations/en.json create mode 100644 homeassistant/components/input_datetime/.translations/es-419.json create mode 100644 homeassistant/components/input_datetime/.translations/es.json create mode 100644 homeassistant/components/input_datetime/.translations/et.json create mode 100644 homeassistant/components/input_datetime/.translations/eu.json create mode 100644 homeassistant/components/input_datetime/.translations/fi.json create mode 100644 homeassistant/components/input_datetime/.translations/fr.json create mode 100644 homeassistant/components/input_datetime/.translations/he.json create mode 100644 homeassistant/components/input_datetime/.translations/hi.json create mode 100644 homeassistant/components/input_datetime/.translations/hr.json create mode 100644 homeassistant/components/input_datetime/.translations/hu.json create mode 100644 homeassistant/components/input_datetime/.translations/hy.json create mode 100644 homeassistant/components/input_datetime/.translations/id.json create mode 100644 homeassistant/components/input_datetime/.translations/is.json create mode 100644 homeassistant/components/input_datetime/.translations/it.json create mode 100644 homeassistant/components/input_datetime/.translations/ko.json create mode 100644 homeassistant/components/input_datetime/.translations/lb.json create mode 100644 homeassistant/components/input_datetime/.translations/lv.json create mode 100644 homeassistant/components/input_datetime/.translations/nb.json create mode 100644 homeassistant/components/input_datetime/.translations/nl.json create mode 100644 homeassistant/components/input_datetime/.translations/nn.json create mode 100644 homeassistant/components/input_datetime/.translations/pl.json create mode 100644 homeassistant/components/input_datetime/.translations/pt-BR.json create mode 100644 homeassistant/components/input_datetime/.translations/pt.json create mode 100644 homeassistant/components/input_datetime/.translations/ro.json create mode 100644 homeassistant/components/input_datetime/.translations/ru.json create mode 100644 homeassistant/components/input_datetime/.translations/sk.json create mode 100644 homeassistant/components/input_datetime/.translations/sl.json create mode 100644 homeassistant/components/input_datetime/.translations/sv.json create mode 100644 homeassistant/components/input_datetime/.translations/te.json create mode 100644 homeassistant/components/input_datetime/.translations/th.json create mode 100644 homeassistant/components/input_datetime/.translations/tr.json create mode 100644 homeassistant/components/input_datetime/.translations/uk.json create mode 100644 homeassistant/components/input_datetime/.translations/vi.json create mode 100644 homeassistant/components/input_datetime/.translations/zh-Hans.json create mode 100644 homeassistant/components/input_datetime/.translations/zh-Hant.json create mode 100644 homeassistant/components/input_number/.translations/af.json create mode 100644 homeassistant/components/input_number/.translations/ar.json create mode 100644 homeassistant/components/input_number/.translations/bg.json create mode 100644 homeassistant/components/input_number/.translations/bs.json create mode 100644 homeassistant/components/input_number/.translations/ca.json create mode 100644 homeassistant/components/input_number/.translations/cs.json create mode 100644 homeassistant/components/input_number/.translations/cy.json create mode 100644 homeassistant/components/input_number/.translations/da.json create mode 100644 homeassistant/components/input_number/.translations/de.json create mode 100644 homeassistant/components/input_number/.translations/el.json create mode 100644 homeassistant/components/input_number/.translations/en.json create mode 100644 homeassistant/components/input_number/.translations/es-419.json create mode 100644 homeassistant/components/input_number/.translations/es.json create mode 100644 homeassistant/components/input_number/.translations/et.json create mode 100644 homeassistant/components/input_number/.translations/eu.json create mode 100644 homeassistant/components/input_number/.translations/fi.json create mode 100644 homeassistant/components/input_number/.translations/fr.json create mode 100644 homeassistant/components/input_number/.translations/he.json create mode 100644 homeassistant/components/input_number/.translations/hi.json create mode 100644 homeassistant/components/input_number/.translations/hr.json create mode 100644 homeassistant/components/input_number/.translations/hu.json create mode 100644 homeassistant/components/input_number/.translations/hy.json create mode 100644 homeassistant/components/input_number/.translations/id.json create mode 100644 homeassistant/components/input_number/.translations/is.json create mode 100644 homeassistant/components/input_number/.translations/it.json create mode 100644 homeassistant/components/input_number/.translations/ko.json create mode 100644 homeassistant/components/input_number/.translations/lb.json create mode 100644 homeassistant/components/input_number/.translations/lv.json create mode 100644 homeassistant/components/input_number/.translations/nb.json create mode 100644 homeassistant/components/input_number/.translations/nl.json create mode 100644 homeassistant/components/input_number/.translations/nn.json create mode 100644 homeassistant/components/input_number/.translations/pl.json create mode 100644 homeassistant/components/input_number/.translations/pt-BR.json create mode 100644 homeassistant/components/input_number/.translations/pt.json create mode 100644 homeassistant/components/input_number/.translations/ro.json create mode 100644 homeassistant/components/input_number/.translations/ru.json create mode 100644 homeassistant/components/input_number/.translations/sk.json create mode 100644 homeassistant/components/input_number/.translations/sl.json create mode 100644 homeassistant/components/input_number/.translations/sv.json create mode 100644 homeassistant/components/input_number/.translations/te.json create mode 100644 homeassistant/components/input_number/.translations/th.json create mode 100644 homeassistant/components/input_number/.translations/tr.json create mode 100644 homeassistant/components/input_number/.translations/uk.json create mode 100644 homeassistant/components/input_number/.translations/vi.json create mode 100644 homeassistant/components/input_number/.translations/zh-Hans.json create mode 100644 homeassistant/components/input_number/.translations/zh-Hant.json create mode 100644 homeassistant/components/input_select/.translations/af.json create mode 100644 homeassistant/components/input_select/.translations/ar.json create mode 100644 homeassistant/components/input_select/.translations/bg.json create mode 100644 homeassistant/components/input_select/.translations/bs.json create mode 100644 homeassistant/components/input_select/.translations/ca.json create mode 100644 homeassistant/components/input_select/.translations/cs.json create mode 100644 homeassistant/components/input_select/.translations/cy.json create mode 100644 homeassistant/components/input_select/.translations/da.json create mode 100644 homeassistant/components/input_select/.translations/de.json create mode 100644 homeassistant/components/input_select/.translations/el.json create mode 100644 homeassistant/components/input_select/.translations/en.json create mode 100644 homeassistant/components/input_select/.translations/es-419.json create mode 100644 homeassistant/components/input_select/.translations/es.json create mode 100644 homeassistant/components/input_select/.translations/et.json create mode 100644 homeassistant/components/input_select/.translations/eu.json create mode 100644 homeassistant/components/input_select/.translations/fi.json create mode 100644 homeassistant/components/input_select/.translations/fr.json create mode 100644 homeassistant/components/input_select/.translations/he.json create mode 100644 homeassistant/components/input_select/.translations/hi.json create mode 100644 homeassistant/components/input_select/.translations/hr.json create mode 100644 homeassistant/components/input_select/.translations/hu.json create mode 100644 homeassistant/components/input_select/.translations/hy.json create mode 100644 homeassistant/components/input_select/.translations/id.json create mode 100644 homeassistant/components/input_select/.translations/is.json create mode 100644 homeassistant/components/input_select/.translations/it.json create mode 100644 homeassistant/components/input_select/.translations/ko.json create mode 100644 homeassistant/components/input_select/.translations/lb.json create mode 100644 homeassistant/components/input_select/.translations/lv.json create mode 100644 homeassistant/components/input_select/.translations/nb.json create mode 100644 homeassistant/components/input_select/.translations/nl.json create mode 100644 homeassistant/components/input_select/.translations/nn.json create mode 100644 homeassistant/components/input_select/.translations/pl.json create mode 100644 homeassistant/components/input_select/.translations/pt-BR.json create mode 100644 homeassistant/components/input_select/.translations/pt.json create mode 100644 homeassistant/components/input_select/.translations/ro.json create mode 100644 homeassistant/components/input_select/.translations/ru.json create mode 100644 homeassistant/components/input_select/.translations/sk.json create mode 100644 homeassistant/components/input_select/.translations/sl.json create mode 100644 homeassistant/components/input_select/.translations/sv.json create mode 100644 homeassistant/components/input_select/.translations/te.json create mode 100644 homeassistant/components/input_select/.translations/th.json create mode 100644 homeassistant/components/input_select/.translations/tr.json create mode 100644 homeassistant/components/input_select/.translations/uk.json create mode 100644 homeassistant/components/input_select/.translations/vi.json create mode 100644 homeassistant/components/input_select/.translations/zh-Hans.json create mode 100644 homeassistant/components/input_select/.translations/zh-Hant.json create mode 100644 homeassistant/components/input_text/.translations/af.json create mode 100644 homeassistant/components/input_text/.translations/ar.json create mode 100644 homeassistant/components/input_text/.translations/bg.json create mode 100644 homeassistant/components/input_text/.translations/bs.json create mode 100644 homeassistant/components/input_text/.translations/ca.json create mode 100644 homeassistant/components/input_text/.translations/cs.json create mode 100644 homeassistant/components/input_text/.translations/cy.json create mode 100644 homeassistant/components/input_text/.translations/da.json create mode 100644 homeassistant/components/input_text/.translations/de.json create mode 100644 homeassistant/components/input_text/.translations/el.json create mode 100644 homeassistant/components/input_text/.translations/en.json create mode 100644 homeassistant/components/input_text/.translations/es-419.json create mode 100644 homeassistant/components/input_text/.translations/es.json create mode 100644 homeassistant/components/input_text/.translations/et.json create mode 100644 homeassistant/components/input_text/.translations/eu.json create mode 100644 homeassistant/components/input_text/.translations/fi.json create mode 100644 homeassistant/components/input_text/.translations/fr.json create mode 100644 homeassistant/components/input_text/.translations/he.json create mode 100644 homeassistant/components/input_text/.translations/hi.json create mode 100644 homeassistant/components/input_text/.translations/hr.json create mode 100644 homeassistant/components/input_text/.translations/hu.json create mode 100644 homeassistant/components/input_text/.translations/hy.json create mode 100644 homeassistant/components/input_text/.translations/id.json create mode 100644 homeassistant/components/input_text/.translations/is.json create mode 100644 homeassistant/components/input_text/.translations/it.json create mode 100644 homeassistant/components/input_text/.translations/ko.json create mode 100644 homeassistant/components/input_text/.translations/lb.json create mode 100644 homeassistant/components/input_text/.translations/lv.json create mode 100644 homeassistant/components/input_text/.translations/nb.json create mode 100644 homeassistant/components/input_text/.translations/nl.json create mode 100644 homeassistant/components/input_text/.translations/nn.json create mode 100644 homeassistant/components/input_text/.translations/pl.json create mode 100644 homeassistant/components/input_text/.translations/pt-BR.json create mode 100644 homeassistant/components/input_text/.translations/pt.json create mode 100644 homeassistant/components/input_text/.translations/ro.json create mode 100644 homeassistant/components/input_text/.translations/ru.json create mode 100644 homeassistant/components/input_text/.translations/sk.json create mode 100644 homeassistant/components/input_text/.translations/sl.json create mode 100644 homeassistant/components/input_text/.translations/sv.json create mode 100644 homeassistant/components/input_text/.translations/ta.json create mode 100644 homeassistant/components/input_text/.translations/te.json create mode 100644 homeassistant/components/input_text/.translations/th.json create mode 100644 homeassistant/components/input_text/.translations/tr.json create mode 100644 homeassistant/components/input_text/.translations/uk.json create mode 100644 homeassistant/components/input_text/.translations/vi.json create mode 100644 homeassistant/components/input_text/.translations/zh-Hans.json create mode 100644 homeassistant/components/input_text/.translations/zh-Hant.json create mode 100644 homeassistant/components/ipp/.translations/pt.json create mode 100644 homeassistant/components/ipp/.translations/sl.json create mode 100644 homeassistant/components/light/.translations/af.json create mode 100644 homeassistant/components/light/.translations/ar.json create mode 100644 homeassistant/components/light/.translations/bs.json create mode 100644 homeassistant/components/light/.translations/cs.json create mode 100644 homeassistant/components/light/.translations/cy.json create mode 100644 homeassistant/components/light/.translations/el.json create mode 100644 homeassistant/components/light/.translations/et.json create mode 100644 homeassistant/components/light/.translations/eu.json create mode 100644 homeassistant/components/light/.translations/fa.json create mode 100644 homeassistant/components/light/.translations/fi.json create mode 100644 homeassistant/components/light/.translations/gsw.json create mode 100644 homeassistant/components/light/.translations/he.json create mode 100644 homeassistant/components/light/.translations/hi.json create mode 100644 homeassistant/components/light/.translations/hr.json create mode 100644 homeassistant/components/light/.translations/hy.json create mode 100644 homeassistant/components/light/.translations/id.json create mode 100644 homeassistant/components/light/.translations/is.json create mode 100644 homeassistant/components/light/.translations/ja.json create mode 100644 homeassistant/components/light/.translations/nb.json create mode 100644 homeassistant/components/light/.translations/nn.json create mode 100644 homeassistant/components/light/.translations/ro.json create mode 100644 homeassistant/components/light/.translations/sk.json create mode 100644 homeassistant/components/light/.translations/ta.json create mode 100644 homeassistant/components/light/.translations/te.json create mode 100644 homeassistant/components/light/.translations/th.json create mode 100644 homeassistant/components/light/.translations/tr.json create mode 100644 homeassistant/components/light/.translations/uk.json create mode 100644 homeassistant/components/light/.translations/vi.json create mode 100644 homeassistant/components/lock/.translations/af.json create mode 100644 homeassistant/components/lock/.translations/ar.json create mode 100644 homeassistant/components/lock/.translations/bs.json create mode 100644 homeassistant/components/lock/.translations/cy.json create mode 100644 homeassistant/components/lock/.translations/el.json create mode 100644 homeassistant/components/lock/.translations/es-419.json create mode 100644 homeassistant/components/lock/.translations/et.json create mode 100644 homeassistant/components/lock/.translations/eu.json create mode 100644 homeassistant/components/lock/.translations/fa.json create mode 100644 homeassistant/components/lock/.translations/fi.json create mode 100644 homeassistant/components/lock/.translations/gsw.json create mode 100644 homeassistant/components/lock/.translations/he.json create mode 100644 homeassistant/components/lock/.translations/hi.json create mode 100644 homeassistant/components/lock/.translations/hr.json create mode 100644 homeassistant/components/lock/.translations/hy.json create mode 100644 homeassistant/components/lock/.translations/id.json create mode 100644 homeassistant/components/lock/.translations/is.json create mode 100644 homeassistant/components/lock/.translations/lv.json create mode 100644 homeassistant/components/lock/.translations/nb.json create mode 100644 homeassistant/components/lock/.translations/nn.json create mode 100644 homeassistant/components/lock/.translations/ro.json create mode 100644 homeassistant/components/lock/.translations/sk.json create mode 100644 homeassistant/components/lock/.translations/ta.json create mode 100644 homeassistant/components/lock/.translations/te.json create mode 100644 homeassistant/components/lock/.translations/th.json create mode 100644 homeassistant/components/lock/.translations/tr.json create mode 100644 homeassistant/components/lock/.translations/uk.json create mode 100644 homeassistant/components/lock/.translations/vi.json create mode 100644 homeassistant/components/lovelace/.translations/af.json create mode 100644 homeassistant/components/lovelace/.translations/bg.json create mode 100644 homeassistant/components/lovelace/.translations/ca.json create mode 100644 homeassistant/components/lovelace/.translations/cs.json create mode 100644 homeassistant/components/lovelace/.translations/cy.json create mode 100644 homeassistant/components/lovelace/.translations/da.json create mode 100644 homeassistant/components/lovelace/.translations/de.json create mode 100644 homeassistant/components/lovelace/.translations/el.json create mode 100644 homeassistant/components/lovelace/.translations/en.json create mode 100644 homeassistant/components/lovelace/.translations/es-419.json create mode 100644 homeassistant/components/lovelace/.translations/es.json create mode 100644 homeassistant/components/lovelace/.translations/et.json create mode 100644 homeassistant/components/lovelace/.translations/eu.json create mode 100644 homeassistant/components/lovelace/.translations/fa.json create mode 100644 homeassistant/components/lovelace/.translations/fi.json create mode 100644 homeassistant/components/lovelace/.translations/fr.json create mode 100644 homeassistant/components/lovelace/.translations/he.json create mode 100644 homeassistant/components/lovelace/.translations/hr.json create mode 100644 homeassistant/components/lovelace/.translations/hu.json create mode 100644 homeassistant/components/lovelace/.translations/hy.json create mode 100644 homeassistant/components/lovelace/.translations/is.json create mode 100644 homeassistant/components/lovelace/.translations/it.json create mode 100644 homeassistant/components/lovelace/.translations/ko.json create mode 100644 homeassistant/components/lovelace/.translations/lb.json create mode 100644 homeassistant/components/lovelace/.translations/lt.json create mode 100644 homeassistant/components/lovelace/.translations/lv.json create mode 100644 homeassistant/components/lovelace/.translations/nb.json create mode 100644 homeassistant/components/lovelace/.translations/nl.json create mode 100644 homeassistant/components/lovelace/.translations/nn.json create mode 100644 homeassistant/components/lovelace/.translations/pl.json create mode 100644 homeassistant/components/lovelace/.translations/pt-BR.json create mode 100644 homeassistant/components/lovelace/.translations/pt.json create mode 100644 homeassistant/components/lovelace/.translations/ro.json create mode 100644 homeassistant/components/lovelace/.translations/ru.json create mode 100644 homeassistant/components/lovelace/.translations/sk.json create mode 100644 homeassistant/components/lovelace/.translations/sl.json create mode 100644 homeassistant/components/lovelace/.translations/sv.json create mode 100644 homeassistant/components/lovelace/.translations/th.json create mode 100644 homeassistant/components/lovelace/.translations/tr.json create mode 100644 homeassistant/components/lovelace/.translations/uk.json create mode 100644 homeassistant/components/lovelace/.translations/vi.json create mode 100644 homeassistant/components/lovelace/.translations/zh-Hans.json create mode 100644 homeassistant/components/lovelace/.translations/zh-Hant.json create mode 100644 homeassistant/components/mailbox/.translations/af.json create mode 100644 homeassistant/components/mailbox/.translations/ar.json create mode 100644 homeassistant/components/mailbox/.translations/bg.json create mode 100644 homeassistant/components/mailbox/.translations/bs.json create mode 100644 homeassistant/components/mailbox/.translations/ca.json create mode 100644 homeassistant/components/mailbox/.translations/cs.json create mode 100644 homeassistant/components/mailbox/.translations/cy.json create mode 100644 homeassistant/components/mailbox/.translations/da.json create mode 100644 homeassistant/components/mailbox/.translations/de.json create mode 100644 homeassistant/components/mailbox/.translations/el.json create mode 100644 homeassistant/components/mailbox/.translations/en.json create mode 100644 homeassistant/components/mailbox/.translations/es-419.json create mode 100644 homeassistant/components/mailbox/.translations/es.json create mode 100644 homeassistant/components/mailbox/.translations/et.json create mode 100644 homeassistant/components/mailbox/.translations/eu.json create mode 100644 homeassistant/components/mailbox/.translations/fa.json create mode 100644 homeassistant/components/mailbox/.translations/fi.json create mode 100644 homeassistant/components/mailbox/.translations/fr.json create mode 100644 homeassistant/components/mailbox/.translations/he.json create mode 100644 homeassistant/components/mailbox/.translations/hi.json create mode 100644 homeassistant/components/mailbox/.translations/hr.json create mode 100644 homeassistant/components/mailbox/.translations/hu.json create mode 100644 homeassistant/components/mailbox/.translations/hy.json create mode 100644 homeassistant/components/mailbox/.translations/id.json create mode 100644 homeassistant/components/mailbox/.translations/is.json create mode 100644 homeassistant/components/mailbox/.translations/it.json create mode 100644 homeassistant/components/mailbox/.translations/ja.json create mode 100644 homeassistant/components/mailbox/.translations/ko.json create mode 100644 homeassistant/components/mailbox/.translations/lb.json create mode 100644 homeassistant/components/mailbox/.translations/lv.json create mode 100644 homeassistant/components/mailbox/.translations/nb.json create mode 100644 homeassistant/components/mailbox/.translations/nl.json create mode 100644 homeassistant/components/mailbox/.translations/nn.json create mode 100644 homeassistant/components/mailbox/.translations/pl.json create mode 100644 homeassistant/components/mailbox/.translations/pt-BR.json create mode 100644 homeassistant/components/mailbox/.translations/pt.json create mode 100644 homeassistant/components/mailbox/.translations/ro.json create mode 100644 homeassistant/components/mailbox/.translations/ru.json create mode 100644 homeassistant/components/mailbox/.translations/sk.json create mode 100644 homeassistant/components/mailbox/.translations/sl.json create mode 100644 homeassistant/components/mailbox/.translations/sv.json create mode 100644 homeassistant/components/mailbox/.translations/ta.json create mode 100644 homeassistant/components/mailbox/.translations/te.json create mode 100644 homeassistant/components/mailbox/.translations/th.json create mode 100644 homeassistant/components/mailbox/.translations/tr.json create mode 100644 homeassistant/components/mailbox/.translations/uk.json create mode 100644 homeassistant/components/mailbox/.translations/vi.json create mode 100644 homeassistant/components/mailbox/.translations/zh-Hans.json create mode 100644 homeassistant/components/mailbox/.translations/zh-Hant.json create mode 100644 homeassistant/components/media_player/.translations/af.json create mode 100644 homeassistant/components/media_player/.translations/ar.json create mode 100644 homeassistant/components/media_player/.translations/bs.json create mode 100644 homeassistant/components/media_player/.translations/cy.json create mode 100644 homeassistant/components/media_player/.translations/el.json create mode 100644 homeassistant/components/media_player/.translations/es-419.json create mode 100644 homeassistant/components/media_player/.translations/et.json create mode 100644 homeassistant/components/media_player/.translations/fi.json create mode 100644 homeassistant/components/media_player/.translations/he.json create mode 100644 homeassistant/components/media_player/.translations/hi.json create mode 100644 homeassistant/components/media_player/.translations/hr.json create mode 100644 homeassistant/components/media_player/.translations/hy.json create mode 100644 homeassistant/components/media_player/.translations/id.json create mode 100644 homeassistant/components/media_player/.translations/is.json create mode 100644 homeassistant/components/media_player/.translations/ja.json create mode 100644 homeassistant/components/media_player/.translations/lv.json create mode 100644 homeassistant/components/media_player/.translations/nb.json create mode 100644 homeassistant/components/media_player/.translations/nn.json create mode 100644 homeassistant/components/media_player/.translations/pt-BR.json create mode 100644 homeassistant/components/media_player/.translations/pt.json create mode 100644 homeassistant/components/media_player/.translations/ro.json create mode 100644 homeassistant/components/media_player/.translations/sk.json create mode 100644 homeassistant/components/media_player/.translations/ta.json create mode 100644 homeassistant/components/media_player/.translations/te.json create mode 100644 homeassistant/components/media_player/.translations/th.json create mode 100644 homeassistant/components/media_player/.translations/tr.json create mode 100644 homeassistant/components/media_player/.translations/uk.json create mode 100644 homeassistant/components/media_player/.translations/vi.json create mode 100644 homeassistant/components/monoprice/.translations/sl.json create mode 100644 homeassistant/components/myq/.translations/sl.json create mode 100644 homeassistant/components/nexia/.translations/sl.json create mode 100644 homeassistant/components/notify/.translations/af.json create mode 100644 homeassistant/components/notify/.translations/ar.json create mode 100644 homeassistant/components/notify/.translations/bg.json create mode 100644 homeassistant/components/notify/.translations/bs.json create mode 100644 homeassistant/components/notify/.translations/ca.json create mode 100644 homeassistant/components/notify/.translations/cs.json create mode 100644 homeassistant/components/notify/.translations/cy.json create mode 100644 homeassistant/components/notify/.translations/da.json create mode 100644 homeassistant/components/notify/.translations/de.json create mode 100644 homeassistant/components/notify/.translations/el.json create mode 100644 homeassistant/components/notify/.translations/en.json create mode 100644 homeassistant/components/notify/.translations/es-419.json create mode 100644 homeassistant/components/notify/.translations/es.json create mode 100644 homeassistant/components/notify/.translations/et.json create mode 100644 homeassistant/components/notify/.translations/eu.json create mode 100644 homeassistant/components/notify/.translations/fi.json create mode 100644 homeassistant/components/notify/.translations/fr.json create mode 100644 homeassistant/components/notify/.translations/he.json create mode 100644 homeassistant/components/notify/.translations/hi.json create mode 100644 homeassistant/components/notify/.translations/hr.json create mode 100644 homeassistant/components/notify/.translations/hu.json create mode 100644 homeassistant/components/notify/.translations/hy.json create mode 100644 homeassistant/components/notify/.translations/id.json create mode 100644 homeassistant/components/notify/.translations/is.json create mode 100644 homeassistant/components/notify/.translations/it.json create mode 100644 homeassistant/components/notify/.translations/ja.json create mode 100644 homeassistant/components/notify/.translations/ko.json create mode 100644 homeassistant/components/notify/.translations/lb.json create mode 100644 homeassistant/components/notify/.translations/lv.json create mode 100644 homeassistant/components/notify/.translations/nb.json create mode 100644 homeassistant/components/notify/.translations/nl.json create mode 100644 homeassistant/components/notify/.translations/nn.json create mode 100644 homeassistant/components/notify/.translations/pl.json create mode 100644 homeassistant/components/notify/.translations/pt-BR.json create mode 100644 homeassistant/components/notify/.translations/pt.json create mode 100644 homeassistant/components/notify/.translations/ro.json create mode 100644 homeassistant/components/notify/.translations/ru.json create mode 100644 homeassistant/components/notify/.translations/sk.json create mode 100644 homeassistant/components/notify/.translations/sl.json create mode 100644 homeassistant/components/notify/.translations/sv.json create mode 100644 homeassistant/components/notify/.translations/ta.json create mode 100644 homeassistant/components/notify/.translations/te.json create mode 100644 homeassistant/components/notify/.translations/th.json create mode 100644 homeassistant/components/notify/.translations/tr.json create mode 100644 homeassistant/components/notify/.translations/uk.json create mode 100644 homeassistant/components/notify/.translations/vi.json create mode 100644 homeassistant/components/notify/.translations/zh-Hans.json create mode 100644 homeassistant/components/notify/.translations/zh-Hant.json create mode 100644 homeassistant/components/nuheat/.translations/sl.json create mode 100644 homeassistant/components/nut/.translations/sl.json create mode 100644 homeassistant/components/nws/.translations/it.json create mode 100644 homeassistant/components/nws/.translations/pt.json create mode 100644 homeassistant/components/nws/.translations/ru.json create mode 100644 homeassistant/components/nws/.translations/zh-Hant.json create mode 100644 homeassistant/components/person/.translations/af.json create mode 100644 homeassistant/components/person/.translations/ar.json create mode 100644 homeassistant/components/person/.translations/bg.json create mode 100644 homeassistant/components/person/.translations/ca.json create mode 100644 homeassistant/components/person/.translations/cs.json create mode 100644 homeassistant/components/person/.translations/cy.json create mode 100644 homeassistant/components/person/.translations/da.json create mode 100644 homeassistant/components/person/.translations/de.json create mode 100644 homeassistant/components/person/.translations/el.json create mode 100644 homeassistant/components/person/.translations/en.json create mode 100644 homeassistant/components/person/.translations/es-419.json create mode 100644 homeassistant/components/person/.translations/es.json create mode 100644 homeassistant/components/person/.translations/et.json create mode 100644 homeassistant/components/person/.translations/eu.json create mode 100644 homeassistant/components/person/.translations/fa.json create mode 100644 homeassistant/components/person/.translations/fi.json create mode 100644 homeassistant/components/person/.translations/fr.json create mode 100644 homeassistant/components/person/.translations/he.json create mode 100644 homeassistant/components/person/.translations/hr.json create mode 100644 homeassistant/components/person/.translations/hu.json create mode 100644 homeassistant/components/person/.translations/hy.json create mode 100644 homeassistant/components/person/.translations/id.json create mode 100644 homeassistant/components/person/.translations/is.json create mode 100644 homeassistant/components/person/.translations/it.json create mode 100644 homeassistant/components/person/.translations/ko.json create mode 100644 homeassistant/components/person/.translations/lb.json create mode 100644 homeassistant/components/person/.translations/lt.json create mode 100644 homeassistant/components/person/.translations/lv.json create mode 100644 homeassistant/components/person/.translations/nb.json create mode 100644 homeassistant/components/person/.translations/nl.json create mode 100644 homeassistant/components/person/.translations/nn.json create mode 100644 homeassistant/components/person/.translations/pl.json create mode 100644 homeassistant/components/person/.translations/pt-BR.json create mode 100644 homeassistant/components/person/.translations/pt.json create mode 100644 homeassistant/components/person/.translations/ro.json create mode 100644 homeassistant/components/person/.translations/ru.json create mode 100644 homeassistant/components/person/.translations/sk.json create mode 100644 homeassistant/components/person/.translations/sl.json create mode 100644 homeassistant/components/person/.translations/sr.json create mode 100644 homeassistant/components/person/.translations/sv.json create mode 100644 homeassistant/components/person/.translations/th.json create mode 100644 homeassistant/components/person/.translations/tr.json create mode 100644 homeassistant/components/person/.translations/uk.json create mode 100644 homeassistant/components/person/.translations/vi.json create mode 100644 homeassistant/components/person/.translations/zh-Hans.json create mode 100644 homeassistant/components/person/.translations/zh-Hant.json create mode 100644 homeassistant/components/plant/.translations/af.json create mode 100644 homeassistant/components/plant/.translations/ar.json create mode 100644 homeassistant/components/plant/.translations/bg.json create mode 100644 homeassistant/components/plant/.translations/bs.json create mode 100644 homeassistant/components/plant/.translations/ca.json create mode 100644 homeassistant/components/plant/.translations/cs.json create mode 100644 homeassistant/components/plant/.translations/cy.json create mode 100644 homeassistant/components/plant/.translations/da.json create mode 100644 homeassistant/components/plant/.translations/de.json create mode 100644 homeassistant/components/plant/.translations/el.json create mode 100644 homeassistant/components/plant/.translations/en.json create mode 100644 homeassistant/components/plant/.translations/es-419.json create mode 100644 homeassistant/components/plant/.translations/es.json create mode 100644 homeassistant/components/plant/.translations/et.json create mode 100644 homeassistant/components/plant/.translations/eu.json create mode 100644 homeassistant/components/plant/.translations/fi.json create mode 100644 homeassistant/components/plant/.translations/fr.json create mode 100644 homeassistant/components/plant/.translations/gsw.json create mode 100644 homeassistant/components/plant/.translations/he.json create mode 100644 homeassistant/components/plant/.translations/hr.json create mode 100644 homeassistant/components/plant/.translations/hu.json create mode 100644 homeassistant/components/plant/.translations/hy.json create mode 100644 homeassistant/components/plant/.translations/id.json create mode 100644 homeassistant/components/plant/.translations/is.json create mode 100644 homeassistant/components/plant/.translations/it.json create mode 100644 homeassistant/components/plant/.translations/ko.json create mode 100644 homeassistant/components/plant/.translations/lb.json create mode 100644 homeassistant/components/plant/.translations/lv.json create mode 100644 homeassistant/components/plant/.translations/nb.json create mode 100644 homeassistant/components/plant/.translations/nl.json create mode 100644 homeassistant/components/plant/.translations/nn.json create mode 100644 homeassistant/components/plant/.translations/pl.json create mode 100644 homeassistant/components/plant/.translations/pt-BR.json create mode 100644 homeassistant/components/plant/.translations/pt.json create mode 100644 homeassistant/components/plant/.translations/ro.json create mode 100644 homeassistant/components/plant/.translations/ru.json create mode 100644 homeassistant/components/plant/.translations/sk.json create mode 100644 homeassistant/components/plant/.translations/sl.json create mode 100644 homeassistant/components/plant/.translations/sv.json create mode 100644 homeassistant/components/plant/.translations/te.json create mode 100644 homeassistant/components/plant/.translations/th.json create mode 100644 homeassistant/components/plant/.translations/tr.json create mode 100644 homeassistant/components/plant/.translations/uk.json create mode 100644 homeassistant/components/plant/.translations/vi.json create mode 100644 homeassistant/components/plant/.translations/zh-Hans.json create mode 100644 homeassistant/components/plant/.translations/zh-Hant.json create mode 100644 homeassistant/components/powerwall/.translations/sl.json create mode 100644 homeassistant/components/proximity/.translations/af.json create mode 100644 homeassistant/components/proximity/.translations/ar.json create mode 100644 homeassistant/components/proximity/.translations/bg.json create mode 100644 homeassistant/components/proximity/.translations/bs.json create mode 100644 homeassistant/components/proximity/.translations/ca.json create mode 100644 homeassistant/components/proximity/.translations/cs.json create mode 100644 homeassistant/components/proximity/.translations/cy.json create mode 100644 homeassistant/components/proximity/.translations/da.json create mode 100644 homeassistant/components/proximity/.translations/de.json create mode 100644 homeassistant/components/proximity/.translations/el.json create mode 100644 homeassistant/components/proximity/.translations/en.json create mode 100644 homeassistant/components/proximity/.translations/es-419.json create mode 100644 homeassistant/components/proximity/.translations/es.json create mode 100644 homeassistant/components/proximity/.translations/et.json create mode 100644 homeassistant/components/proximity/.translations/eu.json create mode 100644 homeassistant/components/proximity/.translations/fi.json create mode 100644 homeassistant/components/proximity/.translations/fr.json create mode 100644 homeassistant/components/proximity/.translations/he.json create mode 100644 homeassistant/components/proximity/.translations/hi.json create mode 100644 homeassistant/components/proximity/.translations/hr.json create mode 100644 homeassistant/components/proximity/.translations/hu.json create mode 100644 homeassistant/components/proximity/.translations/hy.json create mode 100644 homeassistant/components/proximity/.translations/id.json create mode 100644 homeassistant/components/proximity/.translations/is.json create mode 100644 homeassistant/components/proximity/.translations/it.json create mode 100644 homeassistant/components/proximity/.translations/ko.json create mode 100644 homeassistant/components/proximity/.translations/lb.json create mode 100644 homeassistant/components/proximity/.translations/lv.json create mode 100644 homeassistant/components/proximity/.translations/nb.json create mode 100644 homeassistant/components/proximity/.translations/nl.json create mode 100644 homeassistant/components/proximity/.translations/nn.json create mode 100644 homeassistant/components/proximity/.translations/pl.json create mode 100644 homeassistant/components/proximity/.translations/pt-BR.json create mode 100644 homeassistant/components/proximity/.translations/pt.json create mode 100644 homeassistant/components/proximity/.translations/ro.json create mode 100644 homeassistant/components/proximity/.translations/ru.json create mode 100644 homeassistant/components/proximity/.translations/sk.json create mode 100644 homeassistant/components/proximity/.translations/sl.json create mode 100644 homeassistant/components/proximity/.translations/sv.json create mode 100644 homeassistant/components/proximity/.translations/te.json create mode 100644 homeassistant/components/proximity/.translations/th.json create mode 100644 homeassistant/components/proximity/.translations/tr.json create mode 100644 homeassistant/components/proximity/.translations/uk.json create mode 100644 homeassistant/components/proximity/.translations/vi.json create mode 100644 homeassistant/components/proximity/.translations/zh-Hans.json create mode 100644 homeassistant/components/proximity/.translations/zh-Hant.json create mode 100644 homeassistant/components/pvpc_hourly_pricing/.translations/sl.json create mode 100644 homeassistant/components/remote/.translations/af.json create mode 100644 homeassistant/components/remote/.translations/ar.json create mode 100644 homeassistant/components/remote/.translations/bg.json create mode 100644 homeassistant/components/remote/.translations/bs.json create mode 100644 homeassistant/components/remote/.translations/ca.json create mode 100644 homeassistant/components/remote/.translations/cs.json create mode 100644 homeassistant/components/remote/.translations/cy.json create mode 100644 homeassistant/components/remote/.translations/da.json create mode 100644 homeassistant/components/remote/.translations/de.json create mode 100644 homeassistant/components/remote/.translations/el.json create mode 100644 homeassistant/components/remote/.translations/en.json create mode 100644 homeassistant/components/remote/.translations/es-419.json create mode 100644 homeassistant/components/remote/.translations/es.json create mode 100644 homeassistant/components/remote/.translations/et.json create mode 100644 homeassistant/components/remote/.translations/eu.json create mode 100644 homeassistant/components/remote/.translations/fi.json create mode 100644 homeassistant/components/remote/.translations/fr.json create mode 100644 homeassistant/components/remote/.translations/gsw.json create mode 100644 homeassistant/components/remote/.translations/he.json create mode 100644 homeassistant/components/remote/.translations/hi.json create mode 100644 homeassistant/components/remote/.translations/hr.json create mode 100644 homeassistant/components/remote/.translations/hu.json create mode 100644 homeassistant/components/remote/.translations/hy.json create mode 100644 homeassistant/components/remote/.translations/id.json create mode 100644 homeassistant/components/remote/.translations/is.json create mode 100644 homeassistant/components/remote/.translations/it.json create mode 100644 homeassistant/components/remote/.translations/ko.json create mode 100644 homeassistant/components/remote/.translations/lb.json create mode 100644 homeassistant/components/remote/.translations/lv.json create mode 100644 homeassistant/components/remote/.translations/nb.json create mode 100644 homeassistant/components/remote/.translations/nl.json create mode 100644 homeassistant/components/remote/.translations/nn.json create mode 100644 homeassistant/components/remote/.translations/pl.json create mode 100644 homeassistant/components/remote/.translations/pt-BR.json create mode 100644 homeassistant/components/remote/.translations/pt.json create mode 100644 homeassistant/components/remote/.translations/ro.json create mode 100644 homeassistant/components/remote/.translations/ru.json create mode 100644 homeassistant/components/remote/.translations/sk.json create mode 100644 homeassistant/components/remote/.translations/sl.json create mode 100644 homeassistant/components/remote/.translations/sv.json create mode 100644 homeassistant/components/remote/.translations/ta.json create mode 100644 homeassistant/components/remote/.translations/te.json create mode 100644 homeassistant/components/remote/.translations/th.json create mode 100644 homeassistant/components/remote/.translations/tr.json create mode 100644 homeassistant/components/remote/.translations/uk.json create mode 100644 homeassistant/components/remote/.translations/vi.json create mode 100644 homeassistant/components/remote/.translations/zh-Hans.json create mode 100644 homeassistant/components/remote/.translations/zh-Hant.json create mode 100644 homeassistant/components/roomba/.translations/pt.json create mode 100644 homeassistant/components/roomba/.translations/sl.json create mode 100644 homeassistant/components/scene/.translations/af.json create mode 100644 homeassistant/components/scene/.translations/ar.json create mode 100644 homeassistant/components/scene/.translations/bg.json create mode 100644 homeassistant/components/scene/.translations/bs.json create mode 100644 homeassistant/components/scene/.translations/ca.json create mode 100644 homeassistant/components/scene/.translations/cs.json create mode 100644 homeassistant/components/scene/.translations/cy.json create mode 100644 homeassistant/components/scene/.translations/da.json create mode 100644 homeassistant/components/scene/.translations/de.json create mode 100644 homeassistant/components/scene/.translations/el.json create mode 100644 homeassistant/components/scene/.translations/en.json create mode 100644 homeassistant/components/scene/.translations/es-419.json create mode 100644 homeassistant/components/scene/.translations/es.json create mode 100644 homeassistant/components/scene/.translations/et.json create mode 100644 homeassistant/components/scene/.translations/eu.json create mode 100644 homeassistant/components/scene/.translations/fa.json create mode 100644 homeassistant/components/scene/.translations/fi.json create mode 100644 homeassistant/components/scene/.translations/fr.json create mode 100644 homeassistant/components/scene/.translations/gsw.json create mode 100644 homeassistant/components/scene/.translations/he.json create mode 100644 homeassistant/components/scene/.translations/hi.json create mode 100644 homeassistant/components/scene/.translations/hr.json create mode 100644 homeassistant/components/scene/.translations/hu.json create mode 100644 homeassistant/components/scene/.translations/hy.json create mode 100644 homeassistant/components/scene/.translations/id.json create mode 100644 homeassistant/components/scene/.translations/is.json create mode 100644 homeassistant/components/scene/.translations/it.json create mode 100644 homeassistant/components/scene/.translations/ko.json create mode 100644 homeassistant/components/scene/.translations/lb.json create mode 100644 homeassistant/components/scene/.translations/lv.json create mode 100644 homeassistant/components/scene/.translations/nb.json create mode 100644 homeassistant/components/scene/.translations/nl.json create mode 100644 homeassistant/components/scene/.translations/nn.json create mode 100644 homeassistant/components/scene/.translations/pl.json create mode 100644 homeassistant/components/scene/.translations/pt-BR.json create mode 100644 homeassistant/components/scene/.translations/pt.json create mode 100644 homeassistant/components/scene/.translations/ro.json create mode 100644 homeassistant/components/scene/.translations/ru.json create mode 100644 homeassistant/components/scene/.translations/sk.json create mode 100644 homeassistant/components/scene/.translations/sl.json create mode 100644 homeassistant/components/scene/.translations/sv.json create mode 100644 homeassistant/components/scene/.translations/ta.json create mode 100644 homeassistant/components/scene/.translations/te.json create mode 100644 homeassistant/components/scene/.translations/th.json create mode 100644 homeassistant/components/scene/.translations/tr.json create mode 100644 homeassistant/components/scene/.translations/uk.json create mode 100644 homeassistant/components/scene/.translations/vi.json create mode 100644 homeassistant/components/scene/.translations/zh-Hans.json create mode 100644 homeassistant/components/scene/.translations/zh-Hant.json create mode 100644 homeassistant/components/script/.translations/af.json create mode 100644 homeassistant/components/script/.translations/ar.json create mode 100644 homeassistant/components/script/.translations/bg.json create mode 100644 homeassistant/components/script/.translations/bs.json create mode 100644 homeassistant/components/script/.translations/ca.json create mode 100644 homeassistant/components/script/.translations/cs.json create mode 100644 homeassistant/components/script/.translations/cy.json create mode 100644 homeassistant/components/script/.translations/da.json create mode 100644 homeassistant/components/script/.translations/de.json create mode 100644 homeassistant/components/script/.translations/el.json create mode 100644 homeassistant/components/script/.translations/en.json create mode 100644 homeassistant/components/script/.translations/es-419.json create mode 100644 homeassistant/components/script/.translations/es.json create mode 100644 homeassistant/components/script/.translations/et.json create mode 100644 homeassistant/components/script/.translations/eu.json create mode 100644 homeassistant/components/script/.translations/fa.json create mode 100644 homeassistant/components/script/.translations/fi.json create mode 100644 homeassistant/components/script/.translations/fr.json create mode 100644 homeassistant/components/script/.translations/gsw.json create mode 100644 homeassistant/components/script/.translations/he.json create mode 100644 homeassistant/components/script/.translations/hi.json create mode 100644 homeassistant/components/script/.translations/hr.json create mode 100644 homeassistant/components/script/.translations/hu.json create mode 100644 homeassistant/components/script/.translations/hy.json create mode 100644 homeassistant/components/script/.translations/id.json create mode 100644 homeassistant/components/script/.translations/is.json create mode 100644 homeassistant/components/script/.translations/it.json create mode 100644 homeassistant/components/script/.translations/ja.json create mode 100644 homeassistant/components/script/.translations/ko.json create mode 100644 homeassistant/components/script/.translations/lb.json create mode 100644 homeassistant/components/script/.translations/lv.json create mode 100644 homeassistant/components/script/.translations/nb.json create mode 100644 homeassistant/components/script/.translations/nl.json create mode 100644 homeassistant/components/script/.translations/nn.json create mode 100644 homeassistant/components/script/.translations/pl.json create mode 100644 homeassistant/components/script/.translations/pt-BR.json create mode 100644 homeassistant/components/script/.translations/pt.json create mode 100644 homeassistant/components/script/.translations/ro.json create mode 100644 homeassistant/components/script/.translations/ru.json create mode 100644 homeassistant/components/script/.translations/sk.json create mode 100644 homeassistant/components/script/.translations/sl.json create mode 100644 homeassistant/components/script/.translations/sv.json create mode 100644 homeassistant/components/script/.translations/ta.json create mode 100644 homeassistant/components/script/.translations/te.json create mode 100644 homeassistant/components/script/.translations/th.json create mode 100644 homeassistant/components/script/.translations/tr.json create mode 100644 homeassistant/components/script/.translations/uk.json create mode 100644 homeassistant/components/script/.translations/vi.json create mode 100644 homeassistant/components/script/.translations/zh-Hans.json create mode 100644 homeassistant/components/script/.translations/zh-Hant.json create mode 100644 homeassistant/components/sensor/.translations/af.json create mode 100644 homeassistant/components/sensor/.translations/ar.json create mode 100644 homeassistant/components/sensor/.translations/bs.json create mode 100644 homeassistant/components/sensor/.translations/cy.json create mode 100644 homeassistant/components/sensor/.translations/el.json create mode 100644 homeassistant/components/sensor/.translations/es-419.json create mode 100644 homeassistant/components/sensor/.translations/et.json create mode 100644 homeassistant/components/sensor/.translations/eu.json create mode 100644 homeassistant/components/sensor/.translations/fa.json create mode 100644 homeassistant/components/sensor/.translations/fi.json create mode 100644 homeassistant/components/sensor/.translations/gsw.json create mode 100644 homeassistant/components/sensor/.translations/he.json create mode 100644 homeassistant/components/sensor/.translations/hi.json create mode 100644 homeassistant/components/sensor/.translations/hr.json create mode 100644 homeassistant/components/sensor/.translations/hy.json create mode 100644 homeassistant/components/sensor/.translations/id.json create mode 100644 homeassistant/components/sensor/.translations/is.json create mode 100644 homeassistant/components/sensor/.translations/ja.json create mode 100644 homeassistant/components/sensor/.translations/lv.json create mode 100644 homeassistant/components/sensor/.translations/nb.json create mode 100644 homeassistant/components/sensor/.translations/nn.json create mode 100644 homeassistant/components/sensor/.translations/pt-BR.json create mode 100644 homeassistant/components/sensor/.translations/ro.json create mode 100644 homeassistant/components/sensor/.translations/sk.json create mode 100644 homeassistant/components/sensor/.translations/ta.json create mode 100644 homeassistant/components/sensor/.translations/te.json create mode 100644 homeassistant/components/sensor/.translations/th.json create mode 100644 homeassistant/components/sensor/.translations/tr.json create mode 100644 homeassistant/components/sensor/.translations/uk.json create mode 100644 homeassistant/components/sensor/.translations/vi.json create mode 100644 homeassistant/components/sun/.translations/af.json create mode 100644 homeassistant/components/sun/.translations/ar.json create mode 100644 homeassistant/components/sun/.translations/bg.json create mode 100644 homeassistant/components/sun/.translations/bs.json create mode 100644 homeassistant/components/sun/.translations/ca.json create mode 100644 homeassistant/components/sun/.translations/cs.json create mode 100644 homeassistant/components/sun/.translations/cy.json create mode 100644 homeassistant/components/sun/.translations/da.json create mode 100644 homeassistant/components/sun/.translations/de.json create mode 100644 homeassistant/components/sun/.translations/el.json create mode 100644 homeassistant/components/sun/.translations/en.json create mode 100644 homeassistant/components/sun/.translations/es-419.json create mode 100644 homeassistant/components/sun/.translations/es.json create mode 100644 homeassistant/components/sun/.translations/et.json create mode 100644 homeassistant/components/sun/.translations/eu.json create mode 100644 homeassistant/components/sun/.translations/fa.json create mode 100644 homeassistant/components/sun/.translations/fi.json create mode 100644 homeassistant/components/sun/.translations/fr.json create mode 100644 homeassistant/components/sun/.translations/gsw.json create mode 100644 homeassistant/components/sun/.translations/he.json create mode 100644 homeassistant/components/sun/.translations/hi.json create mode 100644 homeassistant/components/sun/.translations/hr.json create mode 100644 homeassistant/components/sun/.translations/hu.json create mode 100644 homeassistant/components/sun/.translations/hy.json create mode 100644 homeassistant/components/sun/.translations/id.json create mode 100644 homeassistant/components/sun/.translations/is.json create mode 100644 homeassistant/components/sun/.translations/it.json create mode 100644 homeassistant/components/sun/.translations/ja.json create mode 100644 homeassistant/components/sun/.translations/ko.json create mode 100644 homeassistant/components/sun/.translations/lb.json create mode 100644 homeassistant/components/sun/.translations/lv.json create mode 100644 homeassistant/components/sun/.translations/nb.json create mode 100644 homeassistant/components/sun/.translations/nl.json create mode 100644 homeassistant/components/sun/.translations/nn.json create mode 100644 homeassistant/components/sun/.translations/pl.json create mode 100644 homeassistant/components/sun/.translations/pt-BR.json create mode 100644 homeassistant/components/sun/.translations/pt.json create mode 100644 homeassistant/components/sun/.translations/ro.json create mode 100644 homeassistant/components/sun/.translations/ru.json create mode 100644 homeassistant/components/sun/.translations/sk.json create mode 100644 homeassistant/components/sun/.translations/sl.json create mode 100644 homeassistant/components/sun/.translations/sv.json create mode 100644 homeassistant/components/sun/.translations/ta.json create mode 100644 homeassistant/components/sun/.translations/te.json create mode 100644 homeassistant/components/sun/.translations/th.json create mode 100644 homeassistant/components/sun/.translations/tr.json create mode 100644 homeassistant/components/sun/.translations/uk.json create mode 100644 homeassistant/components/sun/.translations/vi.json create mode 100644 homeassistant/components/sun/.translations/zh-Hans.json create mode 100644 homeassistant/components/sun/.translations/zh-Hant.json create mode 100644 homeassistant/components/switch/.translations/af.json create mode 100644 homeassistant/components/switch/.translations/ar.json create mode 100644 homeassistant/components/switch/.translations/bs.json create mode 100644 homeassistant/components/switch/.translations/cs.json create mode 100644 homeassistant/components/switch/.translations/cy.json create mode 100644 homeassistant/components/switch/.translations/el.json create mode 100644 homeassistant/components/switch/.translations/et.json create mode 100644 homeassistant/components/switch/.translations/fa.json create mode 100644 homeassistant/components/switch/.translations/fi.json create mode 100644 homeassistant/components/switch/.translations/gsw.json create mode 100644 homeassistant/components/switch/.translations/he.json create mode 100644 homeassistant/components/switch/.translations/hi.json create mode 100644 homeassistant/components/switch/.translations/hr.json create mode 100644 homeassistant/components/switch/.translations/hy.json create mode 100644 homeassistant/components/switch/.translations/id.json create mode 100644 homeassistant/components/switch/.translations/is.json create mode 100644 homeassistant/components/switch/.translations/ja.json create mode 100644 homeassistant/components/switch/.translations/nb.json create mode 100644 homeassistant/components/switch/.translations/nn.json create mode 100644 homeassistant/components/switch/.translations/pt-BR.json create mode 100644 homeassistant/components/switch/.translations/pt.json create mode 100644 homeassistant/components/switch/.translations/ro.json create mode 100644 homeassistant/components/switch/.translations/sk.json create mode 100644 homeassistant/components/switch/.translations/ta.json create mode 100644 homeassistant/components/switch/.translations/te.json create mode 100644 homeassistant/components/switch/.translations/th.json create mode 100644 homeassistant/components/switch/.translations/tr.json create mode 100644 homeassistant/components/switch/.translations/uk.json create mode 100644 homeassistant/components/switch/.translations/vi.json create mode 100644 homeassistant/components/switch/.translations/zh-Hans.json create mode 100644 homeassistant/components/synology_dsm/.translations/sl.json create mode 100644 homeassistant/components/system_health/.translations/af.json create mode 100644 homeassistant/components/system_health/.translations/bg.json create mode 100644 homeassistant/components/system_health/.translations/ca.json create mode 100644 homeassistant/components/system_health/.translations/cs.json create mode 100644 homeassistant/components/system_health/.translations/cy.json create mode 100644 homeassistant/components/system_health/.translations/da.json create mode 100644 homeassistant/components/system_health/.translations/de.json create mode 100644 homeassistant/components/system_health/.translations/el.json create mode 100644 homeassistant/components/system_health/.translations/en.json create mode 100644 homeassistant/components/system_health/.translations/es-419.json create mode 100644 homeassistant/components/system_health/.translations/es.json create mode 100644 homeassistant/components/system_health/.translations/et.json create mode 100644 homeassistant/components/system_health/.translations/eu.json create mode 100644 homeassistant/components/system_health/.translations/fa.json create mode 100644 homeassistant/components/system_health/.translations/fi.json create mode 100644 homeassistant/components/system_health/.translations/fr.json create mode 100644 homeassistant/components/system_health/.translations/he.json create mode 100644 homeassistant/components/system_health/.translations/hr.json create mode 100644 homeassistant/components/system_health/.translations/hu.json create mode 100644 homeassistant/components/system_health/.translations/hy.json create mode 100644 homeassistant/components/system_health/.translations/is.json create mode 100644 homeassistant/components/system_health/.translations/it.json create mode 100644 homeassistant/components/system_health/.translations/ja.json create mode 100644 homeassistant/components/system_health/.translations/ko.json create mode 100644 homeassistant/components/system_health/.translations/lb.json create mode 100644 homeassistant/components/system_health/.translations/lt.json create mode 100644 homeassistant/components/system_health/.translations/nb.json create mode 100644 homeassistant/components/system_health/.translations/nl.json create mode 100644 homeassistant/components/system_health/.translations/nn.json create mode 100644 homeassistant/components/system_health/.translations/pl.json create mode 100644 homeassistant/components/system_health/.translations/pt-BR.json create mode 100644 homeassistant/components/system_health/.translations/pt.json create mode 100644 homeassistant/components/system_health/.translations/ro.json create mode 100644 homeassistant/components/system_health/.translations/ru.json create mode 100644 homeassistant/components/system_health/.translations/sk.json create mode 100644 homeassistant/components/system_health/.translations/sl.json create mode 100644 homeassistant/components/system_health/.translations/sv.json create mode 100644 homeassistant/components/system_health/.translations/th.json create mode 100644 homeassistant/components/system_health/.translations/tr.json create mode 100644 homeassistant/components/system_health/.translations/uk.json create mode 100644 homeassistant/components/system_health/.translations/vi.json create mode 100644 homeassistant/components/system_health/.translations/zh-Hans.json create mode 100644 homeassistant/components/system_health/.translations/zh-Hant.json create mode 100644 homeassistant/components/tado/.translations/ca.json create mode 100644 homeassistant/components/tado/.translations/sl.json create mode 100644 homeassistant/components/totalconnect/.translations/ca.json create mode 100644 homeassistant/components/totalconnect/.translations/pt.json create mode 100644 homeassistant/components/totalconnect/.translations/sl.json create mode 100644 homeassistant/components/updater/.translations/af.json create mode 100644 homeassistant/components/updater/.translations/ar.json create mode 100644 homeassistant/components/updater/.translations/bg.json create mode 100644 homeassistant/components/updater/.translations/bs.json create mode 100644 homeassistant/components/updater/.translations/ca.json create mode 100644 homeassistant/components/updater/.translations/cs.json create mode 100644 homeassistant/components/updater/.translations/cy.json create mode 100644 homeassistant/components/updater/.translations/da.json create mode 100644 homeassistant/components/updater/.translations/de.json create mode 100644 homeassistant/components/updater/.translations/el.json create mode 100644 homeassistant/components/updater/.translations/en.json create mode 100644 homeassistant/components/updater/.translations/es-419.json create mode 100644 homeassistant/components/updater/.translations/es.json create mode 100644 homeassistant/components/updater/.translations/et.json create mode 100644 homeassistant/components/updater/.translations/eu.json create mode 100644 homeassistant/components/updater/.translations/fa.json create mode 100644 homeassistant/components/updater/.translations/fi.json create mode 100644 homeassistant/components/updater/.translations/fr.json create mode 100644 homeassistant/components/updater/.translations/gsw.json create mode 100644 homeassistant/components/updater/.translations/he.json create mode 100644 homeassistant/components/updater/.translations/hr.json create mode 100644 homeassistant/components/updater/.translations/hu.json create mode 100644 homeassistant/components/updater/.translations/hy.json create mode 100644 homeassistant/components/updater/.translations/id.json create mode 100644 homeassistant/components/updater/.translations/is.json create mode 100644 homeassistant/components/updater/.translations/it.json create mode 100644 homeassistant/components/updater/.translations/ja.json create mode 100644 homeassistant/components/updater/.translations/ko.json create mode 100644 homeassistant/components/updater/.translations/lb.json create mode 100644 homeassistant/components/updater/.translations/lv.json create mode 100644 homeassistant/components/updater/.translations/nb.json create mode 100644 homeassistant/components/updater/.translations/nl.json create mode 100644 homeassistant/components/updater/.translations/nn.json create mode 100644 homeassistant/components/updater/.translations/pl.json create mode 100644 homeassistant/components/updater/.translations/pt-BR.json create mode 100644 homeassistant/components/updater/.translations/pt.json create mode 100644 homeassistant/components/updater/.translations/ro.json create mode 100644 homeassistant/components/updater/.translations/ru.json create mode 100644 homeassistant/components/updater/.translations/sk.json create mode 100644 homeassistant/components/updater/.translations/sl.json create mode 100644 homeassistant/components/updater/.translations/sv.json create mode 100644 homeassistant/components/updater/.translations/ta.json create mode 100644 homeassistant/components/updater/.translations/te.json create mode 100644 homeassistant/components/updater/.translations/th.json create mode 100644 homeassistant/components/updater/.translations/tr.json create mode 100644 homeassistant/components/updater/.translations/uk.json create mode 100644 homeassistant/components/updater/.translations/vi.json create mode 100644 homeassistant/components/updater/.translations/zh-Hans.json create mode 100644 homeassistant/components/updater/.translations/zh-Hant.json create mode 100644 homeassistant/components/vacuum/.translations/af.json create mode 100644 homeassistant/components/vacuum/.translations/ar.json create mode 100644 homeassistant/components/vacuum/.translations/cs.json create mode 100644 homeassistant/components/vacuum/.translations/el.json create mode 100644 homeassistant/components/vacuum/.translations/es-419.json create mode 100644 homeassistant/components/vacuum/.translations/et.json create mode 100644 homeassistant/components/vacuum/.translations/eu.json create mode 100644 homeassistant/components/vacuum/.translations/fa.json create mode 100644 homeassistant/components/vacuum/.translations/fi.json create mode 100644 homeassistant/components/vacuum/.translations/gsw.json create mode 100644 homeassistant/components/vacuum/.translations/he.json create mode 100644 homeassistant/components/vacuum/.translations/hr.json create mode 100644 homeassistant/components/vacuum/.translations/hy.json create mode 100644 homeassistant/components/vacuum/.translations/id.json create mode 100644 homeassistant/components/vacuum/.translations/is.json create mode 100644 homeassistant/components/vacuum/.translations/lv.json create mode 100644 homeassistant/components/vacuum/.translations/nb.json create mode 100644 homeassistant/components/vacuum/.translations/nn.json create mode 100644 homeassistant/components/vacuum/.translations/pt-BR.json create mode 100644 homeassistant/components/vacuum/.translations/ro.json create mode 100644 homeassistant/components/vacuum/.translations/sk.json create mode 100644 homeassistant/components/vacuum/.translations/th.json create mode 100644 homeassistant/components/vacuum/.translations/tr.json create mode 100644 homeassistant/components/vacuum/.translations/uk.json create mode 100644 homeassistant/components/vacuum/.translations/vi.json create mode 100644 homeassistant/components/vera/.translations/no.json create mode 100644 homeassistant/components/vera/.translations/sl.json diff --git a/homeassistant/components/.translations/history_graph.af.json b/homeassistant/components/.translations/history_graph.af.json new file mode 100644 index 000000000000..118a5c964ddd --- /dev/null +++ b/homeassistant/components/.translations/history_graph.af.json @@ -0,0 +1,3 @@ +{ + "title": "Geskiedenis grafiek" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.ar.json b/homeassistant/components/.translations/history_graph.ar.json new file mode 100644 index 000000000000..8715bfb22a16 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0631\u0633\u0645 \u0628\u064a\u0627\u0646\u064a" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.bg.json b/homeassistant/components/.translations/history_graph.bg.json new file mode 100644 index 000000000000..2c69d1c1bf5f --- /dev/null +++ b/homeassistant/components/.translations/history_graph.bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0425\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.bs.json b/homeassistant/components/.translations/history_graph.bs.json new file mode 100644 index 000000000000..40ccefb0c741 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.bs.json @@ -0,0 +1,3 @@ +{ + "title": "Grafik istorije" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.ca.json b/homeassistant/components/.translations/history_graph.ca.json new file mode 100644 index 000000000000..742f92319808 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.ca.json @@ -0,0 +1,3 @@ +{ + "title": "Gr\u00e0fics hist\u00f2rics" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.cs.json b/homeassistant/components/.translations/history_graph.cs.json new file mode 100644 index 000000000000..36ce7786de6b --- /dev/null +++ b/homeassistant/components/.translations/history_graph.cs.json @@ -0,0 +1,3 @@ +{ + "title": "Graf historie" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.cy.json b/homeassistant/components/.translations/history_graph.cy.json new file mode 100644 index 000000000000..b138be83e8e0 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.cy.json @@ -0,0 +1,3 @@ +{ + "title": "Hanes graff" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.da.json b/homeassistant/components/.translations/history_graph.da.json new file mode 100644 index 000000000000..e0bc56da9b00 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.da.json @@ -0,0 +1,3 @@ +{ + "title": "Historikgraf" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.de.json b/homeassistant/components/.translations/history_graph.de.json new file mode 100644 index 000000000000..c484ebc4589e --- /dev/null +++ b/homeassistant/components/.translations/history_graph.de.json @@ -0,0 +1,3 @@ +{ + "title": "Verlaufsgrafik" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.el.json b/homeassistant/components/.translations/history_graph.el.json new file mode 100644 index 000000000000..1042bda1dbc1 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0393\u03c1\u03ac\u03c6\u03b7\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03bf\u03cd" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.en.json b/homeassistant/components/.translations/history_graph.en.json new file mode 100644 index 000000000000..57d644f0ff76 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.en.json @@ -0,0 +1,3 @@ +{ + "title": "History graph" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.es-419.json b/homeassistant/components/.translations/history_graph.es-419.json new file mode 100644 index 000000000000..3a5c61dcebe6 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Gr\u00e1fico hist\u00f3rico" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.es.json b/homeassistant/components/.translations/history_graph.es.json new file mode 100644 index 000000000000..ed2d6bc2fbc5 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.es.json @@ -0,0 +1,3 @@ +{ + "title": "Historial gr\u00e1fico" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.et.json b/homeassistant/components/.translations/history_graph.et.json new file mode 100644 index 000000000000..3e69ec05e809 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.et.json @@ -0,0 +1,3 @@ +{ + "title": "Ajaloo graafik" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.fi.json b/homeassistant/components/.translations/history_graph.fi.json new file mode 100644 index 000000000000..dc8e2d498ff0 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.fi.json @@ -0,0 +1,3 @@ +{ + "title": "Historiakuvaaja" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.fr.json b/homeassistant/components/.translations/history_graph.fr.json new file mode 100644 index 000000000000..311b3516ffd6 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.fr.json @@ -0,0 +1,3 @@ +{ + "title": "Graphique historique" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.he.json b/homeassistant/components/.translations/history_graph.he.json new file mode 100644 index 000000000000..cc160bf6e6da --- /dev/null +++ b/homeassistant/components/.translations/history_graph.he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d2\u05e8\u05e3 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.hi.json b/homeassistant/components/.translations/history_graph.hi.json new file mode 100644 index 000000000000..abca631cc854 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0917\u094d\u0930\u093e\u092b" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.hr.json b/homeassistant/components/.translations/history_graph.hr.json new file mode 100644 index 000000000000..aedf1bc5fe63 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.hr.json @@ -0,0 +1,3 @@ +{ + "title": "Grafikon povijesti" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.hu.json b/homeassistant/components/.translations/history_graph.hu.json new file mode 100644 index 000000000000..64159727e1ae --- /dev/null +++ b/homeassistant/components/.translations/history_graph.hu.json @@ -0,0 +1,3 @@ +{ + "title": "El\u0151zm\u00e9ny grafikon" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.hy.json b/homeassistant/components/.translations/history_graph.hy.json new file mode 100644 index 000000000000..3021ac6fc081 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054a\u0561\u057f\u0574\u0578\u0582\u0569\u0575\u0561\u0576 \u0563\u0580\u0561\u0586\u056b\u056f" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.id.json b/homeassistant/components/.translations/history_graph.id.json new file mode 100644 index 000000000000..39b69596915a --- /dev/null +++ b/homeassistant/components/.translations/history_graph.id.json @@ -0,0 +1,3 @@ +{ + "title": "Riwayat grafik" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.is.json b/homeassistant/components/.translations/history_graph.is.json new file mode 100644 index 000000000000..38635ffa15cd --- /dev/null +++ b/homeassistant/components/.translations/history_graph.is.json @@ -0,0 +1,3 @@ +{ + "title": "S\u00f6gul\u00ednurit" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.it.json b/homeassistant/components/.translations/history_graph.it.json new file mode 100644 index 000000000000..2c022f25ba4d --- /dev/null +++ b/homeassistant/components/.translations/history_graph.it.json @@ -0,0 +1,3 @@ +{ + "title": "Grafico cronologico" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.ko.json b/homeassistant/components/.translations/history_graph.ko.json new file mode 100644 index 000000000000..75f35a48fd25 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uae30\ub85d \uadf8\ub798\ud504" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.lb.json b/homeassistant/components/.translations/history_graph.lb.json new file mode 100644 index 000000000000..4a269befc244 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.lb.json @@ -0,0 +1,3 @@ +{ + "title": "Verlafs Grafik" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.lv.json b/homeassistant/components/.translations/history_graph.lv.json new file mode 100644 index 000000000000..c235a4536195 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.lv.json @@ -0,0 +1,3 @@ +{ + "title": "V\u0113stures grafiks" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.nb.json b/homeassistant/components/.translations/history_graph.nb.json new file mode 100644 index 000000000000..9569b55f8a63 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.nb.json @@ -0,0 +1,3 @@ +{ + "title": "Historie graf" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.nl.json b/homeassistant/components/.translations/history_graph.nl.json new file mode 100644 index 000000000000..ca53ce780d03 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.nl.json @@ -0,0 +1,3 @@ +{ + "title": "Geschiedenis" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.nn.json b/homeassistant/components/.translations/history_graph.nn.json new file mode 100644 index 000000000000..25a9cdab1047 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.nn.json @@ -0,0 +1,3 @@ +{ + "title": "Historisk graf" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.pl.json b/homeassistant/components/.translations/history_graph.pl.json new file mode 100644 index 000000000000..c5dcc8f30871 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.pl.json @@ -0,0 +1,3 @@ +{ + "title": "Wykres historii" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.pt-BR.json b/homeassistant/components/.translations/history_graph.pt-BR.json new file mode 100644 index 000000000000..73e71a0f3505 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Gr\u00e1fico de hist\u00f3rico" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.pt.json b/homeassistant/components/.translations/history_graph.pt.json new file mode 100644 index 000000000000..73e71a0f3505 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.pt.json @@ -0,0 +1,3 @@ +{ + "title": "Gr\u00e1fico de hist\u00f3rico" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.ro.json b/homeassistant/components/.translations/history_graph.ro.json new file mode 100644 index 000000000000..5dc1e78a1be0 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.ro.json @@ -0,0 +1,3 @@ +{ + "title": "Istorie grafic" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.ru.json b/homeassistant/components/.translations/history_graph.ru.json new file mode 100644 index 000000000000..292b4186ce84 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0413\u0440\u0430\u0444\u0438\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.sk.json b/homeassistant/components/.translations/history_graph.sk.json new file mode 100644 index 000000000000..b3377bbf11c4 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.sk.json @@ -0,0 +1,3 @@ +{ + "title": "Graf hist\u00f3rie" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.sl.json b/homeassistant/components/.translations/history_graph.sl.json new file mode 100644 index 000000000000..1be9e2a822e1 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.sl.json @@ -0,0 +1,3 @@ +{ + "title": "Graf zgodovine" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.sv.json b/homeassistant/components/.translations/history_graph.sv.json new file mode 100644 index 000000000000..0ccb6b64fbe2 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.sv.json @@ -0,0 +1,3 @@ +{ + "title": "Historikdiagram" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.te.json b/homeassistant/components/.translations/history_graph.te.json new file mode 100644 index 000000000000..7d28e9b3a051 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30 \u0c17\u0c4d\u0c30\u0c3e\u0c2b\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.th.json b/homeassistant/components/.translations/history_graph.th.json new file mode 100644 index 000000000000..76ff4f8d5b5e --- /dev/null +++ b/homeassistant/components/.translations/history_graph.th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e23\u0e32\u0e1f\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.tr.json b/homeassistant/components/.translations/history_graph.tr.json new file mode 100644 index 000000000000..41b261b92f10 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.tr.json @@ -0,0 +1,3 @@ +{ + "title": "Ge\u00e7mi\u015f grafi\u011fi" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.uk.json b/homeassistant/components/.translations/history_graph.uk.json new file mode 100644 index 000000000000..679a9c0701fc --- /dev/null +++ b/homeassistant/components/.translations/history_graph.uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0413\u0440\u0430\u0444\u0456\u043a \u0456\u0441\u0442\u043e\u0440\u0456\u0457" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.vi.json b/homeassistant/components/.translations/history_graph.vi.json new file mode 100644 index 000000000000..12901ae7704e --- /dev/null +++ b/homeassistant/components/.translations/history_graph.vi.json @@ -0,0 +1,3 @@ +{ + "title": "Bi\u1ec3u \u0111\u1ed3 l\u1ecbch s\u1eed" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.zh-Hans.json b/homeassistant/components/.translations/history_graph.zh-Hans.json new file mode 100644 index 000000000000..1f16215f7e9a --- /dev/null +++ b/homeassistant/components/.translations/history_graph.zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u5386\u53f2\u56fe\u8868" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/history_graph.zh-Hant.json b/homeassistant/components/.translations/history_graph.zh-Hant.json new file mode 100644 index 000000000000..65350eea60d5 --- /dev/null +++ b/homeassistant/components/.translations/history_graph.zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u6b77\u53f2\u5716" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.af.json b/homeassistant/components/.translations/weblink.af.json new file mode 100644 index 000000000000..b36d7749f796 --- /dev/null +++ b/homeassistant/components/.translations/weblink.af.json @@ -0,0 +1,3 @@ +{ + "title": "Web skakel" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ar.json b/homeassistant/components/.translations/weblink.ar.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.ar.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.bg.json b/homeassistant/components/.translations/weblink.bg.json new file mode 100644 index 000000000000..fbedd03d8089 --- /dev/null +++ b/homeassistant/components/.translations/weblink.bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0423\u0435\u0431 \u0432\u0440\u044a\u0437\u043a\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.bs.json b/homeassistant/components/.translations/weblink.bs.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.bs.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ca.json b/homeassistant/components/.translations/weblink.ca.json new file mode 100644 index 000000000000..7cbc4542ddbe --- /dev/null +++ b/homeassistant/components/.translations/weblink.ca.json @@ -0,0 +1,3 @@ +{ + "title": "Enlla\u00e7os web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.cs.json b/homeassistant/components/.translations/weblink.cs.json new file mode 100644 index 000000000000..f442b3e9568d --- /dev/null +++ b/homeassistant/components/.translations/weblink.cs.json @@ -0,0 +1,3 @@ +{ + "title": "Webov\u00fd odkaz" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.cy.json b/homeassistant/components/.translations/weblink.cy.json new file mode 100644 index 000000000000..6e49f3139cd1 --- /dev/null +++ b/homeassistant/components/.translations/weblink.cy.json @@ -0,0 +1,3 @@ +{ + "title": "Cyswllt gwe" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.da.json b/homeassistant/components/.translations/weblink.da.json new file mode 100644 index 000000000000..c80dadbad5ef --- /dev/null +++ b/homeassistant/components/.translations/weblink.da.json @@ -0,0 +1,3 @@ +{ + "title": "Link" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.de.json b/homeassistant/components/.translations/weblink.de.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.de.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.el.json b/homeassistant/components/.translations/weblink.el.json new file mode 100644 index 000000000000..4a834715be43 --- /dev/null +++ b/homeassistant/components/.translations/weblink.el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.en.json b/homeassistant/components/.translations/weblink.en.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.en.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.es-419.json b/homeassistant/components/.translations/weblink.es-419.json new file mode 100644 index 000000000000..ae95841c3c06 --- /dev/null +++ b/homeassistant/components/.translations/weblink.es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Enlace web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.es.json b/homeassistant/components/.translations/weblink.es.json new file mode 100644 index 000000000000..ae95841c3c06 --- /dev/null +++ b/homeassistant/components/.translations/weblink.es.json @@ -0,0 +1,3 @@ +{ + "title": "Enlace web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.et.json b/homeassistant/components/.translations/weblink.et.json new file mode 100644 index 000000000000..26d1b60db702 --- /dev/null +++ b/homeassistant/components/.translations/weblink.et.json @@ -0,0 +1,3 @@ +{ + "title": "Veebilink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.fa.json b/homeassistant/components/.translations/weblink.fa.json new file mode 100644 index 000000000000..fdccc2443915 --- /dev/null +++ b/homeassistant/components/.translations/weblink.fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0644\u06cc\u0646\u06a9 \u0633\u0627\u06cc\u062a" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.fi.json b/homeassistant/components/.translations/weblink.fi.json new file mode 100644 index 000000000000..1fc2c848da1f --- /dev/null +++ b/homeassistant/components/.translations/weblink.fi.json @@ -0,0 +1,3 @@ +{ + "title": "Linkki" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.fr.json b/homeassistant/components/.translations/weblink.fr.json new file mode 100644 index 000000000000..582aba7c2479 --- /dev/null +++ b/homeassistant/components/.translations/weblink.fr.json @@ -0,0 +1,3 @@ +{ + "title": "Lien" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.gsw.json b/homeassistant/components/.translations/weblink.gsw.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.he.json b/homeassistant/components/.translations/weblink.he.json new file mode 100644 index 000000000000..f7cd91ea130c --- /dev/null +++ b/homeassistant/components/.translations/weblink.he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05d9\u05e9\u05d5\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.hi.json b/homeassistant/components/.translations/weblink.hi.json new file mode 100644 index 000000000000..6cf05d967554 --- /dev/null +++ b/homeassistant/components/.translations/weblink.hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0935\u0947\u092c \u0932\u093f\u0902\u0915" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.hr.json b/homeassistant/components/.translations/weblink.hr.json new file mode 100644 index 000000000000..6316af1892f5 --- /dev/null +++ b/homeassistant/components/.translations/weblink.hr.json @@ -0,0 +1,3 @@ +{ + "title": "WebLink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.hu.json b/homeassistant/components/.translations/weblink.hu.json new file mode 100644 index 000000000000..715ef2c82d6b --- /dev/null +++ b/homeassistant/components/.translations/weblink.hu.json @@ -0,0 +1,3 @@ +{ + "title": "Hivatkoz\u00e1s" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.hy.json b/homeassistant/components/.translations/weblink.hy.json new file mode 100644 index 000000000000..1210d512b35f --- /dev/null +++ b/homeassistant/components/.translations/weblink.hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054e\u0565\u0562 \u0570\u0561\u057d\u0581\u0565" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.id.json b/homeassistant/components/.translations/weblink.id.json new file mode 100644 index 000000000000..1e5b40167f92 --- /dev/null +++ b/homeassistant/components/.translations/weblink.id.json @@ -0,0 +1,3 @@ +{ + "title": "Tautan web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.is.json b/homeassistant/components/.translations/weblink.is.json new file mode 100644 index 000000000000..89d2b8e5aa1b --- /dev/null +++ b/homeassistant/components/.translations/weblink.is.json @@ -0,0 +1,3 @@ +{ + "title": "Vefsl\u00f3\u00f0" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.it.json b/homeassistant/components/.translations/weblink.it.json new file mode 100644 index 000000000000..63135ea5e1ba --- /dev/null +++ b/homeassistant/components/.translations/weblink.it.json @@ -0,0 +1,3 @@ +{ + "title": "Link Web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ko.json b/homeassistant/components/.translations/weblink.ko.json new file mode 100644 index 000000000000..ed650d75357e --- /dev/null +++ b/homeassistant/components/.translations/weblink.ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc6f9\ub9c1\ud06c" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.lb.json b/homeassistant/components/.translations/weblink.lb.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.lb.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.lv.json b/homeassistant/components/.translations/weblink.lv.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.lv.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.nb.json b/homeassistant/components/.translations/weblink.nb.json new file mode 100644 index 000000000000..489ca4904074 --- /dev/null +++ b/homeassistant/components/.translations/weblink.nb.json @@ -0,0 +1,3 @@ +{ + "title": "Nettlink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.nl.json b/homeassistant/components/.translations/weblink.nl.json new file mode 100644 index 000000000000..219b31689014 --- /dev/null +++ b/homeassistant/components/.translations/weblink.nl.json @@ -0,0 +1,3 @@ +{ + "title": "Web link" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.nn.json b/homeassistant/components/.translations/weblink.nn.json new file mode 100644 index 000000000000..88f28fd40d61 --- /dev/null +++ b/homeassistant/components/.translations/weblink.nn.json @@ -0,0 +1,3 @@ +{ + "title": "Nettlenke" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.pl.json b/homeassistant/components/.translations/weblink.pl.json new file mode 100644 index 000000000000..c80dadbad5ef --- /dev/null +++ b/homeassistant/components/.translations/weblink.pl.json @@ -0,0 +1,3 @@ +{ + "title": "Link" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.pt-BR.json b/homeassistant/components/.translations/weblink.pt-BR.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.pt.json b/homeassistant/components/.translations/weblink.pt.json new file mode 100644 index 000000000000..c9fbb307a4c2 --- /dev/null +++ b/homeassistant/components/.translations/weblink.pt.json @@ -0,0 +1,3 @@ +{ + "title": "Weblink" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ro.json b/homeassistant/components/.translations/weblink.ro.json new file mode 100644 index 000000000000..518760278f2a --- /dev/null +++ b/homeassistant/components/.translations/weblink.ro.json @@ -0,0 +1,3 @@ +{ + "title": "Leg\u0103tur\u0103 web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ru.json b/homeassistant/components/.translations/weblink.ru.json new file mode 100644 index 000000000000..c92e99488cc4 --- /dev/null +++ b/homeassistant/components/.translations/weblink.ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0441\u044b\u043b\u043a\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.sk.json b/homeassistant/components/.translations/weblink.sk.json new file mode 100644 index 000000000000..f442b3e9568d --- /dev/null +++ b/homeassistant/components/.translations/weblink.sk.json @@ -0,0 +1,3 @@ +{ + "title": "Webov\u00fd odkaz" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.sl.json b/homeassistant/components/.translations/weblink.sl.json new file mode 100644 index 000000000000..0b963871f639 --- /dev/null +++ b/homeassistant/components/.translations/weblink.sl.json @@ -0,0 +1,3 @@ +{ + "title": "Spletna povezava" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.sv.json b/homeassistant/components/.translations/weblink.sv.json new file mode 100644 index 000000000000..83190e2c935e --- /dev/null +++ b/homeassistant/components/.translations/weblink.sv.json @@ -0,0 +1,3 @@ +{ + "title": "Webbl\u00e4nk" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.ta.json b/homeassistant/components/.translations/weblink.ta.json new file mode 100644 index 000000000000..5bd171dfca3b --- /dev/null +++ b/homeassistant/components/.translations/weblink.ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b87\u0ba3\u0bc8\u0baf\u0ba4\u0bb3 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.te.json b/homeassistant/components/.translations/weblink.te.json new file mode 100644 index 000000000000..2e7e568b00e9 --- /dev/null +++ b/homeassistant/components/.translations/weblink.te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c35\u0c46\u0c2c\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c41" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.th.json b/homeassistant/components/.translations/weblink.th.json new file mode 100644 index 000000000000..140c06dbbf00 --- /dev/null +++ b/homeassistant/components/.translations/weblink.th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e27\u0e47\u0e1a\u0e25\u0e34\u0e07\u0e04\u0e4c" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.tr.json b/homeassistant/components/.translations/weblink.tr.json new file mode 100644 index 000000000000..6189fc95e5a3 --- /dev/null +++ b/homeassistant/components/.translations/weblink.tr.json @@ -0,0 +1,3 @@ +{ + "title": "Web ba\u011flant\u0131s\u0131" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.uk.json b/homeassistant/components/.translations/weblink.uk.json new file mode 100644 index 000000000000..938dcac5fa17 --- /dev/null +++ b/homeassistant/components/.translations/weblink.uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.vi.json b/homeassistant/components/.translations/weblink.vi.json new file mode 100644 index 000000000000..48543378da8b --- /dev/null +++ b/homeassistant/components/.translations/weblink.vi.json @@ -0,0 +1,3 @@ +{ + "title": "Li\u00ean k\u1ebft web" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.zh-Hans.json b/homeassistant/components/.translations/weblink.zh-Hans.json new file mode 100644 index 000000000000..a975126d9ec6 --- /dev/null +++ b/homeassistant/components/.translations/weblink.zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u7f51\u5740" +} \ No newline at end of file diff --git a/homeassistant/components/.translations/weblink.zh-Hant.json b/homeassistant/components/.translations/weblink.zh-Hant.json new file mode 100644 index 000000000000..f39ec9e654fa --- /dev/null +++ b/homeassistant/components/.translations/weblink.zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u7db2\u7ad9\u93c8\u63a5" +} \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/bg.json b/homeassistant/components/abode/.translations/bg.json index 681acd610153..3489c8bc8660 100644 --- a/homeassistant/components/abode/.translations/bg.json +++ b/homeassistant/components/abode/.translations/bg.json @@ -17,6 +17,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0412\u0430\u0448\u0430\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0432\u0445\u043e\u0434 \u0432 Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ca.json b/homeassistant/components/abode/.translations/ca.json index f7431ee79f17..5a1552700d99 100644 --- a/homeassistant/components/abode/.translations/ca.json +++ b/homeassistant/components/abode/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Introducci\u00f3 de la informaci\u00f3 d'inici de sessi\u00f3 a Abode." } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/cs.json b/homeassistant/components/abode/.translations/cs.json index df5855b0cee5..e482cce526f9 100644 --- a/homeassistant/components/abode/.translations/cs.json +++ b/homeassistant/components/abode/.translations/cs.json @@ -17,6 +17,5 @@ "title": "Vypl\u0148te p\u0159ihla\u0161ovac\u00ed \u00fadaje Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/da.json b/homeassistant/components/abode/.translations/da.json index 410553fac93f..c00fd6ad5af6 100644 --- a/homeassistant/components/abode/.translations/da.json +++ b/homeassistant/components/abode/.translations/da.json @@ -17,6 +17,5 @@ "title": "Udfyld dine Abode-loginoplysninger" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/de.json b/homeassistant/components/abode/.translations/de.json index acfd480e0681..abbac44f2e31 100644 --- a/homeassistant/components/abode/.translations/de.json +++ b/homeassistant/components/abode/.translations/de.json @@ -17,6 +17,5 @@ "title": "Gib deine Abode-Anmeldeinformationen ein" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/en.json b/homeassistant/components/abode/.translations/en.json index 6b83daece1e4..feaef16fdffc 100644 --- a/homeassistant/components/abode/.translations/en.json +++ b/homeassistant/components/abode/.translations/en.json @@ -17,6 +17,5 @@ "title": "Fill in your Abode login information" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/es-419.json b/homeassistant/components/abode/.translations/es-419.json index 053078c20314..ced57c4fdbd8 100644 --- a/homeassistant/components/abode/.translations/es-419.json +++ b/homeassistant/components/abode/.translations/es-419.json @@ -17,6 +17,5 @@ "title": "Complete su informaci\u00f3n de inicio de sesi\u00f3n de Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/es.json b/homeassistant/components/abode/.translations/es.json index d7be7f924809..76f06de9b854 100644 --- a/homeassistant/components/abode/.translations/es.json +++ b/homeassistant/components/abode/.translations/es.json @@ -17,6 +17,5 @@ "title": "Rellene la informaci\u00f3n de acceso Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/fr.json b/homeassistant/components/abode/.translations/fr.json index 1cff6db701e8..1c4cfe008725 100644 --- a/homeassistant/components/abode/.translations/fr.json +++ b/homeassistant/components/abode/.translations/fr.json @@ -17,6 +17,5 @@ "title": "Remplissez vos informations de connexion Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/hu.json b/homeassistant/components/abode/.translations/hu.json index 501ca5f43695..89b695da7d91 100644 --- a/homeassistant/components/abode/.translations/hu.json +++ b/homeassistant/components/abode/.translations/hu.json @@ -17,6 +17,5 @@ "title": "T\u00f6ltse ki az Abode bejelentkez\u00e9si adatait" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/it.json b/homeassistant/components/abode/.translations/it.json index e3e80942bb23..414ffb92ef49 100644 --- a/homeassistant/components/abode/.translations/it.json +++ b/homeassistant/components/abode/.translations/it.json @@ -17,6 +17,5 @@ "title": "Inserisci le tue informazioni di accesso Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ko.json b/homeassistant/components/abode/.translations/ko.json index e27cafce1f94..857a460fa0fd 100644 --- a/homeassistant/components/abode/.translations/ko.json +++ b/homeassistant/components/abode/.translations/ko.json @@ -17,6 +17,5 @@ "title": "Abode \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/lb.json b/homeassistant/components/abode/.translations/lb.json index cb75480e75de..4e8f6084b54f 100644 --- a/homeassistant/components/abode/.translations/lb.json +++ b/homeassistant/components/abode/.translations/lb.json @@ -17,6 +17,5 @@ "title": "F\u00ebllt \u00e4r Abode Login Informatiounen aus." } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/nl.json b/homeassistant/components/abode/.translations/nl.json index de52e9fe28b8..580b1f487c02 100644 --- a/homeassistant/components/abode/.translations/nl.json +++ b/homeassistant/components/abode/.translations/nl.json @@ -17,6 +17,5 @@ "title": "Vul uw Abode-inloggegevens in" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/no.json b/homeassistant/components/abode/.translations/no.json index f2c19a12a18c..dc269b112d79 100644 --- a/homeassistant/components/abode/.translations/no.json +++ b/homeassistant/components/abode/.translations/no.json @@ -17,6 +17,5 @@ "title": "Fyll ut innloggingsinformasjonen for Abode" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pl.json b/homeassistant/components/abode/.translations/pl.json index 59b0c47ddb0d..d7a25bb20b76 100644 --- a/homeassistant/components/abode/.translations/pl.json +++ b/homeassistant/components/abode/.translations/pl.json @@ -17,6 +17,5 @@ "title": "Wprowad\u017a informacje logowania Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pt-BR.json b/homeassistant/components/abode/.translations/pt-BR.json index 741379997006..1f9cf968fb0a 100644 --- a/homeassistant/components/abode/.translations/pt-BR.json +++ b/homeassistant/components/abode/.translations/pt-BR.json @@ -16,6 +16,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/pt.json b/homeassistant/components/abode/.translations/pt.json index 2221106987f4..505e1a850ec6 100644 --- a/homeassistant/components/abode/.translations/pt.json +++ b/homeassistant/components/abode/.translations/pt.json @@ -11,6 +11,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/ru.json b/homeassistant/components/abode/.translations/ru.json index 1e9e403b00ff..e0e6e131289d 100644 --- a/homeassistant/components/abode/.translations/ru.json +++ b/homeassistant/components/abode/.translations/ru.json @@ -17,6 +17,5 @@ "title": "Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/sl.json b/homeassistant/components/abode/.translations/sl.json index b75600bf2e28..d56b1335390f 100644 --- a/homeassistant/components/abode/.translations/sl.json +++ b/homeassistant/components/abode/.translations/sl.json @@ -17,6 +17,5 @@ "title": "Izpolnite svoje podatke za prijavo v Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/sv.json b/homeassistant/components/abode/.translations/sv.json index 7a40f7b9410d..40328574ba7e 100644 --- a/homeassistant/components/abode/.translations/sv.json +++ b/homeassistant/components/abode/.translations/sv.json @@ -17,6 +17,5 @@ "title": "Fyll i din inloggningsinformation f\u00f6r Abode" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/abode/.translations/zh-Hant.json b/homeassistant/components/abode/.translations/zh-Hant.json index 7b40e7ffaba9..5120d529cb53 100644 --- a/homeassistant/components/abode/.translations/zh-Hant.json +++ b/homeassistant/components/abode/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u586b\u5beb Abode \u767b\u5165\u8cc7\u8a0a" } } - }, - "title": "Abode" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/bg.json b/homeassistant/components/adguard/.translations/bg.json index 6d43dd7849cb..90c3ddcb359a 100644 --- a/homeassistant/components/adguard/.translations/bg.json +++ b/homeassistant/components/adguard/.translations/bg.json @@ -27,6 +27,5 @@ "title": "\u0421\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u0412\u0430\u0448\u0438\u044f AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ca.json b/homeassistant/components/adguard/.translations/ca.json index 43fa21ce5a2c..adabb83ab0b3 100644 --- a/homeassistant/components/adguard/.translations/ca.json +++ b/homeassistant/components/adguard/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Enlla\u00e7ar AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/da.json b/homeassistant/components/adguard/.translations/da.json index d03b6c303217..3a1a73ac6bdb 100644 --- a/homeassistant/components/adguard/.translations/da.json +++ b/homeassistant/components/adguard/.translations/da.json @@ -27,6 +27,5 @@ "title": "Forbind din AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/de.json b/homeassistant/components/adguard/.translations/de.json index 04c1c0eac6fc..19c1a5ce6fc3 100644 --- a/homeassistant/components/adguard/.translations/de.json +++ b/homeassistant/components/adguard/.translations/de.json @@ -27,6 +27,5 @@ "title": "Verkn\u00fcpfe AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/en.json b/homeassistant/components/adguard/.translations/en.json index d19eabc26ec5..d9b5d81b4695 100644 --- a/homeassistant/components/adguard/.translations/en.json +++ b/homeassistant/components/adguard/.translations/en.json @@ -27,6 +27,5 @@ "title": "Link your AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/es-419.json b/homeassistant/components/adguard/.translations/es-419.json index 109513671735..5a36b35d028a 100644 --- a/homeassistant/components/adguard/.translations/es-419.json +++ b/homeassistant/components/adguard/.translations/es-419.json @@ -26,6 +26,5 @@ "title": "Enlace su AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/es.json b/homeassistant/components/adguard/.translations/es.json index 4c625cdaf974..8e4bc821fdfa 100644 --- a/homeassistant/components/adguard/.translations/es.json +++ b/homeassistant/components/adguard/.translations/es.json @@ -27,6 +27,5 @@ "title": "Enlace su AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/fr.json b/homeassistant/components/adguard/.translations/fr.json index 9f20561b9a99..777e1e992af9 100644 --- a/homeassistant/components/adguard/.translations/fr.json +++ b/homeassistant/components/adguard/.translations/fr.json @@ -27,6 +27,5 @@ "title": "Liez votre AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/it.json b/homeassistant/components/adguard/.translations/it.json index fb818140f8c5..c3c9aef22c9e 100644 --- a/homeassistant/components/adguard/.translations/it.json +++ b/homeassistant/components/adguard/.translations/it.json @@ -27,6 +27,5 @@ "title": "Collega la tua AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ko.json b/homeassistant/components/adguard/.translations/ko.json index 981bb3f877f2..95ce591747e4 100644 --- a/homeassistant/components/adguard/.translations/ko.json +++ b/homeassistant/components/adguard/.translations/ko.json @@ -27,6 +27,5 @@ "title": "AdGuard Home \uc5f0\uacb0" } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/lb.json b/homeassistant/components/adguard/.translations/lb.json index 806d986f8507..4c839fc9e18e 100644 --- a/homeassistant/components/adguard/.translations/lb.json +++ b/homeassistant/components/adguard/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Verbannt \u00e4ren AdGuard Home" } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/nl.json b/homeassistant/components/adguard/.translations/nl.json index 5686ae42f155..4e3439dd624c 100644 --- a/homeassistant/components/adguard/.translations/nl.json +++ b/homeassistant/components/adguard/.translations/nl.json @@ -27,6 +27,5 @@ "title": "Link uw AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/nn.json b/homeassistant/components/adguard/.translations/nn.json index 8f8a98dc2823..7c129cba3afc 100644 --- a/homeassistant/components/adguard/.translations/nn.json +++ b/homeassistant/components/adguard/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/no.json b/homeassistant/components/adguard/.translations/no.json index f40527697c62..5194e799b165 100644 --- a/homeassistant/components/adguard/.translations/no.json +++ b/homeassistant/components/adguard/.translations/no.json @@ -27,6 +27,5 @@ "title": "Koble til ditt AdGuard Hjem." } } - }, - "title": "AdGuard Hjem" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/pl.json b/homeassistant/components/adguard/.translations/pl.json index 7504155ed6f7..7b2886b660e0 100644 --- a/homeassistant/components/adguard/.translations/pl.json +++ b/homeassistant/components/adguard/.translations/pl.json @@ -27,6 +27,5 @@ "title": "Po\u0142\u0105cz AdGuard Home" } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/pt-BR.json b/homeassistant/components/adguard/.translations/pt-BR.json index d8c1bd75d3e1..605085af1f13 100644 --- a/homeassistant/components/adguard/.translations/pt-BR.json +++ b/homeassistant/components/adguard/.translations/pt-BR.json @@ -25,6 +25,5 @@ "title": "Vincule o seu AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/ru.json b/homeassistant/components/adguard/.translations/ru.json index 39c073ad5bae..8c83b8c024c5 100644 --- a/homeassistant/components/adguard/.translations/ru.json +++ b/homeassistant/components/adguard/.translations/ru.json @@ -27,6 +27,5 @@ "title": "AdGuard Home" } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/sl.json b/homeassistant/components/adguard/.translations/sl.json index 62d7bfac76a9..7cad7c1ac3a0 100644 --- a/homeassistant/components/adguard/.translations/sl.json +++ b/homeassistant/components/adguard/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Pove\u017eite svoj AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/sv.json b/homeassistant/components/adguard/.translations/sv.json index 704ef784655c..8ae4a5481d29 100644 --- a/homeassistant/components/adguard/.translations/sv.json +++ b/homeassistant/components/adguard/.translations/sv.json @@ -27,6 +27,5 @@ "title": "L\u00e4nka din AdGuard Home." } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/adguard/.translations/zh-Hant.json b/homeassistant/components/adguard/.translations/zh-Hant.json index 1687e3936885..f3473fd31976 100644 --- a/homeassistant/components/adguard/.translations/zh-Hant.json +++ b/homeassistant/components/adguard/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u9023\u7d50 AdGuard Home\u3002" } } - }, - "title": "AdGuard Home" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/bg.json b/homeassistant/components/airly/.translations/bg.json index fcec0623ec00..d4e7dd2ec281 100644 --- a/homeassistant/components/airly/.translations/bg.json +++ b/homeassistant/components/airly/.translations/bg.json @@ -16,6 +16,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ca.json b/homeassistant/components/airly/.translations/ca.json index 0fbdf397d960..76e8702e8fc2 100644 --- a/homeassistant/components/airly/.translations/ca.json +++ b/homeassistant/components/airly/.translations/ca.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/da.json b/homeassistant/components/airly/.translations/da.json index ab56e8721577..5eaaeac8cfc3 100644 --- a/homeassistant/components/airly/.translations/da.json +++ b/homeassistant/components/airly/.translations/da.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/de.json b/homeassistant/components/airly/.translations/de.json index c3090fdd2c2e..551c5cd294d9 100644 --- a/homeassistant/components/airly/.translations/de.json +++ b/homeassistant/components/airly/.translations/de.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/en.json b/homeassistant/components/airly/.translations/en.json index 528f0ca60146..ab243699232c 100644 --- a/homeassistant/components/airly/.translations/en.json +++ b/homeassistant/components/airly/.translations/en.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/es-419.json b/homeassistant/components/airly/.translations/es-419.json index 62507451e1ea..43770d1767b1 100644 --- a/homeassistant/components/airly/.translations/es-419.json +++ b/homeassistant/components/airly/.translations/es-419.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/es.json b/homeassistant/components/airly/.translations/es.json index 697fb332c7b7..353acfe2fb8c 100644 --- a/homeassistant/components/airly/.translations/es.json +++ b/homeassistant/components/airly/.translations/es.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/fr.json b/homeassistant/components/airly/.translations/fr.json index 3fe44b47c19c..a454a38fbe69 100644 --- a/homeassistant/components/airly/.translations/fr.json +++ b/homeassistant/components/airly/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/hu.json b/homeassistant/components/airly/.translations/hu.json index fa22af87cf8b..f91b2de241f4 100644 --- a/homeassistant/components/airly/.translations/hu.json +++ b/homeassistant/components/airly/.translations/hu.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/it.json b/homeassistant/components/airly/.translations/it.json index 46079d040078..c42af14f0300 100644 --- a/homeassistant/components/airly/.translations/it.json +++ b/homeassistant/components/airly/.translations/it.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ko.json b/homeassistant/components/airly/.translations/ko.json index f5eb89f9e463..5283797eb793 100644 --- a/homeassistant/components/airly/.translations/ko.json +++ b/homeassistant/components/airly/.translations/ko.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/lb.json b/homeassistant/components/airly/.translations/lb.json index a9154d11f4c7..9a935079d99e 100644 --- a/homeassistant/components/airly/.translations/lb.json +++ b/homeassistant/components/airly/.translations/lb.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/nl.json b/homeassistant/components/airly/.translations/nl.json index e94b35dfb563..f8edf64daa2c 100644 --- a/homeassistant/components/airly/.translations/nl.json +++ b/homeassistant/components/airly/.translations/nl.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/nn.json b/homeassistant/components/airly/.translations/nn.json index 117bf40d2719..9cf2b5d70fb6 100644 --- a/homeassistant/components/airly/.translations/nn.json +++ b/homeassistant/components/airly/.translations/nn.json @@ -5,6 +5,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/no.json b/homeassistant/components/airly/.translations/no.json index ae3b8cd7858e..965b12ef1fe9 100644 --- a/homeassistant/components/airly/.translations/no.json +++ b/homeassistant/components/airly/.translations/no.json @@ -19,6 +19,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/pl.json b/homeassistant/components/airly/.translations/pl.json index f2ab2c7d5d6c..3cc43883308d 100644 --- a/homeassistant/components/airly/.translations/pl.json +++ b/homeassistant/components/airly/.translations/pl.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/pt.json b/homeassistant/components/airly/.translations/pt.json index f5bdf90b9f1c..971b4653be32 100644 --- a/homeassistant/components/airly/.translations/pt.json +++ b/homeassistant/components/airly/.translations/pt.json @@ -9,6 +9,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/ru.json b/homeassistant/components/airly/.translations/ru.json index 010f8dc827b3..9b3a62331db4 100644 --- a/homeassistant/components/airly/.translations/ru.json +++ b/homeassistant/components/airly/.translations/ru.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/sl.json b/homeassistant/components/airly/.translations/sl.json index e329f1208a02..9fe84c532d1f 100644 --- a/homeassistant/components/airly/.translations/sl.json +++ b/homeassistant/components/airly/.translations/sl.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/sv.json b/homeassistant/components/airly/.translations/sv.json index c435eedd3cf4..4a79f9cefe94 100644 --- a/homeassistant/components/airly/.translations/sv.json +++ b/homeassistant/components/airly/.translations/sv.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airly/.translations/zh-Hant.json b/homeassistant/components/airly/.translations/zh-Hant.json index fb22747348b5..d594922cd8fc 100644 --- a/homeassistant/components/airly/.translations/zh-Hant.json +++ b/homeassistant/components/airly/.translations/zh-Hant.json @@ -19,6 +19,5 @@ "title": "Airly" } } - }, - "title": "Airly" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ca.json b/homeassistant/components/airvisual/.translations/ca.json index 5a08b7f07ff6..d8866051c6cb 100644 --- a/homeassistant/components/airvisual/.translations/ca.json +++ b/homeassistant/components/airvisual/.translations/ca.json @@ -28,6 +28,5 @@ "title": "Configuraci\u00f3 d'AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/de.json b/homeassistant/components/airvisual/.translations/de.json index 0c50069f7de6..82e4c122c33f 100644 --- a/homeassistant/components/airvisual/.translations/de.json +++ b/homeassistant/components/airvisual/.translations/de.json @@ -28,6 +28,5 @@ "title": "Konfigurieren Sie AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/en.json b/homeassistant/components/airvisual/.translations/en.json index 2749cd65248d..c7f2c32b4e31 100644 --- a/homeassistant/components/airvisual/.translations/en.json +++ b/homeassistant/components/airvisual/.translations/en.json @@ -28,6 +28,5 @@ "title": "Configure AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/es-419.json b/homeassistant/components/airvisual/.translations/es-419.json index 14a73c551cc3..ada76676ca9e 100644 --- a/homeassistant/components/airvisual/.translations/es-419.json +++ b/homeassistant/components/airvisual/.translations/es-419.json @@ -28,6 +28,5 @@ "title": "Configurar AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/es.json b/homeassistant/components/airvisual/.translations/es.json index d325b036ada7..2c442f5c3a58 100644 --- a/homeassistant/components/airvisual/.translations/es.json +++ b/homeassistant/components/airvisual/.translations/es.json @@ -28,6 +28,5 @@ "title": "Configurar AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/fr.json b/homeassistant/components/airvisual/.translations/fr.json index 90571a9c6d4d..f53113a6b6a8 100644 --- a/homeassistant/components/airvisual/.translations/fr.json +++ b/homeassistant/components/airvisual/.translations/fr.json @@ -25,6 +25,5 @@ "title": "Configurer AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/it.json b/homeassistant/components/airvisual/.translations/it.json index 3ac89b1c9685..268c82bfccf3 100644 --- a/homeassistant/components/airvisual/.translations/it.json +++ b/homeassistant/components/airvisual/.translations/it.json @@ -28,6 +28,5 @@ "title": "Configurare AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ko.json b/homeassistant/components/airvisual/.translations/ko.json index 55a12a37f096..c28790288abe 100644 --- a/homeassistant/components/airvisual/.translations/ko.json +++ b/homeassistant/components/airvisual/.translations/ko.json @@ -28,6 +28,5 @@ "title": "AirVisual \uad6c\uc131" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/lb.json b/homeassistant/components/airvisual/.translations/lb.json index f9426000102e..69e8ea6d380a 100644 --- a/homeassistant/components/airvisual/.translations/lb.json +++ b/homeassistant/components/airvisual/.translations/lb.json @@ -28,6 +28,5 @@ "title": "Airvisual ariichten" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/no.json b/homeassistant/components/airvisual/.translations/no.json index 2c50b00fc12a..1a9463da15e0 100644 --- a/homeassistant/components/airvisual/.translations/no.json +++ b/homeassistant/components/airvisual/.translations/no.json @@ -28,6 +28,5 @@ "title": "Konfigurer AirVisual" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/pl.json b/homeassistant/components/airvisual/.translations/pl.json index cc96048b3781..8258c0e86ede 100644 --- a/homeassistant/components/airvisual/.translations/pl.json +++ b/homeassistant/components/airvisual/.translations/pl.json @@ -28,6 +28,5 @@ "title": "Konfiguracja AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/ru.json b/homeassistant/components/airvisual/.translations/ru.json index 1784dd55153e..1d2a5edd96d1 100644 --- a/homeassistant/components/airvisual/.translations/ru.json +++ b/homeassistant/components/airvisual/.translations/ru.json @@ -28,6 +28,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/sl.json b/homeassistant/components/airvisual/.translations/sl.json index 6b4031efb03f..376da5c39001 100644 --- a/homeassistant/components/airvisual/.translations/sl.json +++ b/homeassistant/components/airvisual/.translations/sl.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Ta klju\u010d API je \u017ee v uporabi." + "already_configured": "Te koordinate so \u017ee registrirane." }, "error": { "invalid_api_key": "Neveljaven API klju\u010d" @@ -28,6 +28,5 @@ "title": "Nastavite AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/airvisual/.translations/zh-Hant.json b/homeassistant/components/airvisual/.translations/zh-Hant.json index eb4169afe422..a655743685c1 100644 --- a/homeassistant/components/airvisual/.translations/zh-Hant.json +++ b/homeassistant/components/airvisual/.translations/zh-Hant.json @@ -28,6 +28,5 @@ "title": "\u8a2d\u5b9a AirVisual" } } - }, - "title": "AirVisual" + } } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/af.json b/homeassistant/components/alarm_control_panel/.translations/af.json new file mode 100644 index 000000000000..558f49fb0973 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Alarm beheer paneel" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/ar.json b/homeassistant/components/alarm_control_panel/.translations/ar.json new file mode 100644 index 000000000000..3e6de5ae7eaf --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0644\u0648\u062d\u0629 \u062a\u062d\u0643\u0645 \u0627\u0644\u0625\u0646\u0630\u0627\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/bg.json b/homeassistant/components/alarm_control_panel/.translations/bg.json index a9342c8c4772..3caca9aeac2f 100644 --- a/homeassistant/components/alarm_control_panel/.translations/bg.json +++ b/homeassistant/components/alarm_control_panel/.translations/bg.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u0430", "triggered": "{entity_name} \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0430\u043d\u0430" } - } + }, + "title": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b \u043d\u0430 \u0430\u043b\u0430\u0440\u043c\u0430" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/bs.json b/homeassistant/components/alarm_control_panel/.translations/bs.json new file mode 100644 index 000000000000..3426337861f1 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Centralni sistem za alarm" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/ca.json b/homeassistant/components/alarm_control_panel/.translations/ca.json index 5c33ac3c9631..24af5bf30965 100644 --- a/homeassistant/components/alarm_control_panel/.translations/ca.json +++ b/homeassistant/components/alarm_control_panel/.translations/ca.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} desactivada", "triggered": "{entity_name} disparat/ada" } - } + }, + "title": "Panell de control d'alarma" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/cs.json b/homeassistant/components/alarm_control_panel/.translations/cs.json index 247a4e96da47..00c7bf78d8e9 100644 --- a/homeassistant/components/alarm_control_panel/.translations/cs.json +++ b/homeassistant/components/alarm_control_panel/.translations/cs.json @@ -7,5 +7,6 @@ "disarm": "Deaktivovat {entity_name}", "trigger": "Spustit {entity_name}" } - } + }, + "title": "Ovl\u00e1dac\u00ed panel alarmu" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/cy.json b/homeassistant/components/alarm_control_panel/.translations/cy.json new file mode 100644 index 000000000000..ba8f7ec16fc1 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Panel rheoli larwm" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/da.json b/homeassistant/components/alarm_control_panel/.translations/da.json index 220034d23e17..7946020e1ed7 100644 --- a/homeassistant/components/alarm_control_panel/.translations/da.json +++ b/homeassistant/components/alarm_control_panel/.translations/da.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} frakoblet", "triggered": "{entity_name} udl\u00f8st" } - } + }, + "title": "Alarmkontrolpanel" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/de.json b/homeassistant/components/alarm_control_panel/.translations/de.json index 2b319c4a8a6c..265d423fee44 100644 --- a/homeassistant/components/alarm_control_panel/.translations/de.json +++ b/homeassistant/components/alarm_control_panel/.translations/de.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} deaktiviert", "triggered": "{entity_name} ausgel\u00f6st" } - } + }, + "title": "Alarmanlage" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/el.json b/homeassistant/components/alarm_control_panel/.translations/el.json new file mode 100644 index 000000000000..d35aa5e86e39 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5 \u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c9\u03bd" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/en.json b/homeassistant/components/alarm_control_panel/.translations/en.json index 85b6be1138cd..05f7a455dee6 100644 --- a/homeassistant/components/alarm_control_panel/.translations/en.json +++ b/homeassistant/components/alarm_control_panel/.translations/en.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} disarmed", "triggered": "{entity_name} triggered" } - } + }, + "title": "Alarm control panel" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/es-419.json b/homeassistant/components/alarm_control_panel/.translations/es-419.json index 861d9c13273c..bb52cc9d0c55 100644 --- a/homeassistant/components/alarm_control_panel/.translations/es-419.json +++ b/homeassistant/components/alarm_control_panel/.translations/es-419.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} deshabilitada", "triggered": "{entity_name} activada" } - } + }, + "title": "Panel de control de alarma" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/es.json b/homeassistant/components/alarm_control_panel/.translations/es.json index 0acc0e5c98c7..13c676dffa8c 100644 --- a/homeassistant/components/alarm_control_panel/.translations/es.json +++ b/homeassistant/components/alarm_control_panel/.translations/es.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} desarmado", "triggered": "{entity_name} activado" } - } + }, + "title": "Panel de control de alarmas" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/et.json b/homeassistant/components/alarm_control_panel/.translations/et.json new file mode 100644 index 000000000000..a8fc08d0da4f --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Valvekeskuse juhtpaneel" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/eu.json b/homeassistant/components/alarm_control_panel/.translations/eu.json new file mode 100644 index 000000000000..6b9d2ee0ebbf --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Alarmen kontrol panela" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/fa.json b/homeassistant/components/alarm_control_panel/.translations/fa.json new file mode 100644 index 000000000000..ea6d95099a31 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u06a9\u0646\u062a\u0631\u0644 \u067e\u0646\u0644 \u0622\u0644\u0627\u0631\u0645" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/fi.json b/homeassistant/components/alarm_control_panel/.translations/fi.json new file mode 100644 index 000000000000..282efed45dcb --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "H\u00e4lytysasetukset" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/fr.json b/homeassistant/components/alarm_control_panel/.translations/fr.json index f87f1b79b875..a57315a9eccb 100644 --- a/homeassistant/components/alarm_control_panel/.translations/fr.json +++ b/homeassistant/components/alarm_control_panel/.translations/fr.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} d\u00e9sarm\u00e9", "triggered": "{entity_name} d\u00e9clench\u00e9" } - } + }, + "title": "Panneau de contr\u00f4le d'alarme" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/he.json b/homeassistant/components/alarm_control_panel/.translations/he.json new file mode 100644 index 000000000000..bbf257ca18c6 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05dc\u05d5\u05d7 \u05d1\u05e7\u05e8\u05d4 \u05e9\u05dc \u05d0\u05d6\u05e2\u05e7\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/hr.json b/homeassistant/components/alarm_control_panel/.translations/hr.json new file mode 100644 index 000000000000..b04df4494649 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Upravlja\u010dka plo\u010da za alarm" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/hu.json b/homeassistant/components/alarm_control_panel/.translations/hu.json index b249a16c9f1c..d617a9d38fd3 100644 --- a/homeassistant/components/alarm_control_panel/.translations/hu.json +++ b/homeassistant/components/alarm_control_panel/.translations/hu.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} hat\u00e1stalan\u00edtva lett", "triggered": "{entity_name} riaszt\u00e1sba ker\u00fclt" } - } + }, + "title": "Riaszt\u00f3 k\u00f6zpont" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/hy.json b/homeassistant/components/alarm_control_panel/.translations/hy.json new file mode 100644 index 000000000000..aeeadc1438d2 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054f\u0561\u0563\u0576\u0561\u057a\u056b \u056f\u0561\u057c\u0561\u057e\u0561\u0580\u0574\u0561\u0576 \u057e\u0561\u0570\u0561\u0576\u0561\u056f" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/id.json b/homeassistant/components/alarm_control_panel/.translations/id.json new file mode 100644 index 000000000000..fe0f0a10860a --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kontrol panel alarm" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/is.json b/homeassistant/components/alarm_control_panel/.translations/is.json new file mode 100644 index 000000000000..b21763c9bebf --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Stj\u00f3rnbor\u00f0 \u00f6ryggiskerfis" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/it.json b/homeassistant/components/alarm_control_panel/.translations/it.json index 0857f0665aa7..5bef0c6fff0c 100644 --- a/homeassistant/components/alarm_control_panel/.translations/it.json +++ b/homeassistant/components/alarm_control_panel/.translations/it.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} disattivato", "triggered": "{entity_name} attivato" } - } + }, + "title": "Pannello di controllo degli allarmi" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/ko.json b/homeassistant/components/alarm_control_panel/.translations/ko.json index 321bc4424440..97cc34b29b4d 100644 --- a/homeassistant/components/alarm_control_panel/.translations/ko.json +++ b/homeassistant/components/alarm_control_panel/.translations/ko.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} \uc774(\uac00) \ud574\uc81c\ub420 \ub54c", "triggered": "{entity_name} \uc774(\uac00) \ud2b8\ub9ac\uac70\ub420 \ub54c" } - } + }, + "title": "\uc54c\ub78c\uc81c\uc5b4\ud310" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/lb.json b/homeassistant/components/alarm_control_panel/.translations/lb.json index 6c0d32f42ad4..c12dbb76481a 100644 --- a/homeassistant/components/alarm_control_panel/.translations/lb.json +++ b/homeassistant/components/alarm_control_panel/.translations/lb.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} entsch\u00e4rft", "triggered": "{entity_name} ausgel\u00e9ist" } - } + }, + "title": "Kontroll Feld Alarm" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/lv.json b/homeassistant/components/alarm_control_panel/.translations/lv.json new file mode 100644 index 000000000000..7de5a3c5b73a --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Signaliz\u0101cijas vad\u012bbas panelis" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/nb.json b/homeassistant/components/alarm_control_panel/.translations/nb.json new file mode 100644 index 000000000000..8391a34d2c53 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Alarm kontrollpanel" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/nl.json b/homeassistant/components/alarm_control_panel/.translations/nl.json index 6f26cc99e21f..f65ec99619c9 100644 --- a/homeassistant/components/alarm_control_panel/.translations/nl.json +++ b/homeassistant/components/alarm_control_panel/.translations/nl.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} uitgeschakeld", "triggered": "{entity_name} geactiveerd" } - } + }, + "title": "Alarm bedieningspaneel" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/nn.json b/homeassistant/components/alarm_control_panel/.translations/nn.json new file mode 100644 index 000000000000..8901d664eec5 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Alarmkontrollpanel" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/pl.json b/homeassistant/components/alarm_control_panel/.translations/pl.json index c1125be31b6a..6e54256780eb 100644 --- a/homeassistant/components/alarm_control_panel/.translations/pl.json +++ b/homeassistant/components/alarm_control_panel/.translations/pl.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} zostanie rozbrojony", "triggered": "{entity_name} zostanie wyzwolony" } - } + }, + "title": "Panel kontrolny alarmu" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/pt-BR.json b/homeassistant/components/alarm_control_panel/.translations/pt-BR.json index 274aa8cb4c2e..da6c981eeefd 100644 --- a/homeassistant/components/alarm_control_panel/.translations/pt-BR.json +++ b/homeassistant/components/alarm_control_panel/.translations/pt-BR.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} desarmado", "triggered": "{entity_name} acionado" } - } + }, + "title": "Painel de controle do alarme" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/pt.json b/homeassistant/components/alarm_control_panel/.translations/pt.json index 90b9b1d43d52..fd9b6b730863 100644 --- a/homeassistant/components/alarm_control_panel/.translations/pt.json +++ b/homeassistant/components/alarm_control_panel/.translations/pt.json @@ -5,5 +5,6 @@ "arm_night": "Armar noite {entity_name}", "disarm": "Desarmar {entity_name}" } - } + }, + "title": "Painel de controlo do alarme" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/ro.json b/homeassistant/components/alarm_control_panel/.translations/ro.json new file mode 100644 index 000000000000..46bcb39baf01 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Panoul de control alarma" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/ru.json b/homeassistant/components/alarm_control_panel/.translations/ru.json index 36705dbcefdd..acabe6d9845e 100644 --- a/homeassistant/components/alarm_control_panel/.translations/ru.json +++ b/homeassistant/components/alarm_control_panel/.translations/ru.json @@ -21,5 +21,6 @@ "disarmed": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0430 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 {entity_name}", "triggered": "{entity_name} \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442" } - } + }, + "title": "\u041f\u0430\u043d\u0435\u043b\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/sk.json b/homeassistant/components/alarm_control_panel/.translations/sk.json new file mode 100644 index 000000000000..6b479d22a802 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Ovl\u00e1dac\u00ed panel alarmu" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/sl.json b/homeassistant/components/alarm_control_panel/.translations/sl.json index c817f7830bae..b1125b44cc68 100644 --- a/homeassistant/components/alarm_control_panel/.translations/sl.json +++ b/homeassistant/components/alarm_control_panel/.translations/sl.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name} razoro\u017een", "triggered": "{entity_name} spro\u017een" } - } + }, + "title": "Nadzorna plo\u0161\u010da Alarma" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/sv.json b/homeassistant/components/alarm_control_panel/.translations/sv.json index 65e4433f5a38..e06234640261 100644 --- a/homeassistant/components/alarm_control_panel/.translations/sv.json +++ b/homeassistant/components/alarm_control_panel/.translations/sv.json @@ -14,5 +14,6 @@ "disarmed": "{entity_name} bortkopplad", "triggered": "{entity_name} utl\u00f6st" } - } + }, + "title": "Larmkontrollpanel" } \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/te.json b/homeassistant/components/alarm_control_panel/.translations/te.json new file mode 100644 index 000000000000..85fe22c57681 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c05\u0c32\u0c3e\u0c30\u0c02 \u0c28\u0c3f\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c23 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/th.json b/homeassistant/components/alarm_control_panel/.translations/th.json new file mode 100644 index 000000000000..541e5a658c5d --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e13\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e20\u0e31\u0e22" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/tr.json b/homeassistant/components/alarm_control_panel/.translations/tr.json new file mode 100644 index 000000000000..821755f7f037 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Alarm kontrol paneli" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/uk.json b/homeassistant/components/alarm_control_panel/.translations/uk.json new file mode 100644 index 000000000000..eb827764e19a --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0430\u043d\u0435\u043b\u044c \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u0454\u044e" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/vi.json b/homeassistant/components/alarm_control_panel/.translations/vi.json new file mode 100644 index 000000000000..c8b6740e26a7 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "B\u1ea3ng \u0111i\u1ec1u khi\u1ec3n an ninh" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/zh-Hans.json b/homeassistant/components/alarm_control_panel/.translations/zh-Hans.json new file mode 100644 index 000000000000..8f09efc1d217 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u8b66\u62a5\u63a7\u5236\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/alarm_control_panel/.translations/zh-Hant.json b/homeassistant/components/alarm_control_panel/.translations/zh-Hant.json index a02ea1c1966f..1d3a7a1efaad 100644 --- a/homeassistant/components/alarm_control_panel/.translations/zh-Hant.json +++ b/homeassistant/components/alarm_control_panel/.translations/zh-Hant.json @@ -21,5 +21,6 @@ "disarmed": "{entity_name}\u5df2\u89e3\u9664", "triggered": "{entity_name}\u5df2\u89f8\u767c" } - } + }, + "title": "\u8b66\u6212\u6a21\u5f0f\u63a7\u5236\u9762\u677f" } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/bg.json b/homeassistant/components/almond/.translations/bg.json index 29539f78eab2..c2bcab535f36 100644 --- a/homeassistant/components/almond/.translations/bg.json +++ b/homeassistant/components/almond/.translations/bg.json @@ -10,6 +10,5 @@ "title": "\u0418\u0437\u0431\u043e\u0440 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ca.json b/homeassistant/components/almond/.translations/ca.json index e5b9b6f64cb4..8747f1ed7dff 100644 --- a/homeassistant/components/almond/.translations/ca.json +++ b/homeassistant/components/almond/.translations/ca.json @@ -14,6 +14,5 @@ "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/da.json b/homeassistant/components/almond/.translations/da.json index 12e125f4f667..9ce415cf8f97 100644 --- a/homeassistant/components/almond/.translations/da.json +++ b/homeassistant/components/almond/.translations/da.json @@ -14,6 +14,5 @@ "title": "V\u00e6lg godkendelsesmetode" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/de.json b/homeassistant/components/almond/.translations/de.json index e0c0c8ba0d1d..d90bbc9154f6 100644 --- a/homeassistant/components/almond/.translations/de.json +++ b/homeassistant/components/almond/.translations/de.json @@ -14,6 +14,5 @@ "title": "W\u00e4hle die Authentifizierungsmethode" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/en.json b/homeassistant/components/almond/.translations/en.json index 27a4106f3f6b..2a587d464033 100644 --- a/homeassistant/components/almond/.translations/en.json +++ b/homeassistant/components/almond/.translations/en.json @@ -14,6 +14,5 @@ "title": "Pick Authentication Method" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/es.json b/homeassistant/components/almond/.translations/es.json index bdecd6454a3d..de9fb58eabdd 100644 --- a/homeassistant/components/almond/.translations/es.json +++ b/homeassistant/components/almond/.translations/es.json @@ -14,6 +14,5 @@ "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/fr.json b/homeassistant/components/almond/.translations/fr.json index 53a12848c0e8..f39a1660bb90 100644 --- a/homeassistant/components/almond/.translations/fr.json +++ b/homeassistant/components/almond/.translations/fr.json @@ -14,6 +14,5 @@ "title": "S\u00e9lectionner une m\u00e9thode d'authentification" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/hu.json b/homeassistant/components/almond/.translations/hu.json index 30d5b4b60285..2f9be096d79c 100644 --- a/homeassistant/components/almond/.translations/hu.json +++ b/homeassistant/components/almond/.translations/hu.json @@ -14,6 +14,5 @@ "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/it.json b/homeassistant/components/almond/.translations/it.json index b5eeea46850c..3e68336bf3e7 100644 --- a/homeassistant/components/almond/.translations/it.json +++ b/homeassistant/components/almond/.translations/it.json @@ -14,6 +14,5 @@ "title": "Seleziona metodo di autenticazione" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ko.json b/homeassistant/components/almond/.translations/ko.json index e02232f02728..f8791895d503 100644 --- a/homeassistant/components/almond/.translations/ko.json +++ b/homeassistant/components/almond/.translations/ko.json @@ -14,6 +14,5 @@ "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/lb.json b/homeassistant/components/almond/.translations/lb.json index 6f696a7b1fa8..3b866a326bea 100644 --- a/homeassistant/components/almond/.translations/lb.json +++ b/homeassistant/components/almond/.translations/lb.json @@ -14,6 +14,5 @@ "title": "Wielt Authentifikatiouns Method aus" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/nl.json b/homeassistant/components/almond/.translations/nl.json index ea7e20a920f2..7a2a60b1a695 100644 --- a/homeassistant/components/almond/.translations/nl.json +++ b/homeassistant/components/almond/.translations/nl.json @@ -14,6 +14,5 @@ "title": "Kies de authenticatie methode" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/no.json b/homeassistant/components/almond/.translations/no.json index d4527c69ba77..d27b903452d3 100644 --- a/homeassistant/components/almond/.translations/no.json +++ b/homeassistant/components/almond/.translations/no.json @@ -14,6 +14,5 @@ "title": "Velg autentiseringsmetode" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/pl.json b/homeassistant/components/almond/.translations/pl.json index bc26b8f5ff2e..6b3feb4bd0ba 100644 --- a/homeassistant/components/almond/.translations/pl.json +++ b/homeassistant/components/almond/.translations/pl.json @@ -14,6 +14,5 @@ "title": "Wybierz metod\u0119 uwierzytelniania" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/pt.json b/homeassistant/components/almond/.translations/pt.json index efb460f0e016..94dfbefb86a2 100644 --- a/homeassistant/components/almond/.translations/pt.json +++ b/homeassistant/components/almond/.translations/pt.json @@ -5,6 +5,5 @@ "title": "Escolha o m\u00e9todo de autentica\u00e7\u00e3o" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/ru.json b/homeassistant/components/almond/.translations/ru.json index dd9004a6b198..3821a65e08b8 100644 --- a/homeassistant/components/almond/.translations/ru.json +++ b/homeassistant/components/almond/.translations/ru.json @@ -14,6 +14,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/sl.json b/homeassistant/components/almond/.translations/sl.json index b24954bb955e..cc2197ffaba4 100644 --- a/homeassistant/components/almond/.translations/sl.json +++ b/homeassistant/components/almond/.translations/sl.json @@ -14,6 +14,5 @@ "title": "Izberite na\u010din preverjanja pristnosti" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/sv.json b/homeassistant/components/almond/.translations/sv.json index 5ce4086ce155..70743f68e4d6 100644 --- a/homeassistant/components/almond/.translations/sv.json +++ b/homeassistant/components/almond/.translations/sv.json @@ -14,6 +14,5 @@ "title": "V\u00e4lj autentiseringsmetod" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/almond/.translations/zh-Hant.json b/homeassistant/components/almond/.translations/zh-Hant.json index 65b6198c9aef..96e3d92e0607 100644 --- a/homeassistant/components/almond/.translations/zh-Hant.json +++ b/homeassistant/components/almond/.translations/zh-Hant.json @@ -14,6 +14,5 @@ "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } } - }, - "title": "Almond" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/bg.json b/homeassistant/components/ambiclimate/.translations/bg.json index e7c68a67b737..e76a714d5b01 100644 --- a/homeassistant/components/ambiclimate/.translations/bg.json +++ b/homeassistant/components/ambiclimate/.translations/bg.json @@ -18,6 +18,5 @@ "title": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0438\u0440\u0430\u043d\u0435 \u0441 Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ca.json b/homeassistant/components/ambiclimate/.translations/ca.json index 1e9fe221fbf2..d260691eb901 100644 --- a/homeassistant/components/ambiclimate/.translations/ca.json +++ b/homeassistant/components/ambiclimate/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Autenticaci\u00f3 amb Ambi Climate" } } - }, - "title": "Ambi Climate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/cs.json b/homeassistant/components/ambiclimate/.translations/cs.json index 3f71608800a5..da0430346a73 100644 --- a/homeassistant/components/ambiclimate/.translations/cs.json +++ b/homeassistant/components/ambiclimate/.translations/cs.json @@ -10,6 +10,5 @@ "title": "Ov\u011b\u0159it Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/da.json b/homeassistant/components/ambiclimate/.translations/da.json index 0039e484a05b..3229e9f4127a 100644 --- a/homeassistant/components/ambiclimate/.translations/da.json +++ b/homeassistant/components/ambiclimate/.translations/da.json @@ -18,6 +18,5 @@ "title": "Godkend Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/de.json b/homeassistant/components/ambiclimate/.translations/de.json index 2b21e1c0553a..6fba5772a100 100644 --- a/homeassistant/components/ambiclimate/.translations/de.json +++ b/homeassistant/components/ambiclimate/.translations/de.json @@ -18,6 +18,5 @@ "title": "Ambiclimate authentifizieren" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/en.json b/homeassistant/components/ambiclimate/.translations/en.json index 780599c2163e..509b801fa62f 100644 --- a/homeassistant/components/ambiclimate/.translations/en.json +++ b/homeassistant/components/ambiclimate/.translations/en.json @@ -18,6 +18,5 @@ "title": "Authenticate Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/es-419.json b/homeassistant/components/ambiclimate/.translations/es-419.json index 93b9067414ec..55fb20ef45c9 100644 --- a/homeassistant/components/ambiclimate/.translations/es-419.json +++ b/homeassistant/components/ambiclimate/.translations/es-419.json @@ -18,6 +18,5 @@ "title": "Autenticaci\u00f3n de Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/es.json b/homeassistant/components/ambiclimate/.translations/es.json index 7ec8e2418a66..01d6643b6349 100644 --- a/homeassistant/components/ambiclimate/.translations/es.json +++ b/homeassistant/components/ambiclimate/.translations/es.json @@ -18,6 +18,5 @@ "title": "Autenticaci\u00f3n de Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/fr.json b/homeassistant/components/ambiclimate/.translations/fr.json index f62d3de9252e..c16b0c102661 100644 --- a/homeassistant/components/ambiclimate/.translations/fr.json +++ b/homeassistant/components/ambiclimate/.translations/fr.json @@ -18,6 +18,5 @@ "title": "Authentifier Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/it.json b/homeassistant/components/ambiclimate/.translations/it.json index 22de0b870e49..2da7a0ee4c8a 100644 --- a/homeassistant/components/ambiclimate/.translations/it.json +++ b/homeassistant/components/ambiclimate/.translations/it.json @@ -18,6 +18,5 @@ "title": "Autenticare Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ko.json b/homeassistant/components/ambiclimate/.translations/ko.json index 6d4aeaf21ce5..311e05fa19e4 100644 --- a/homeassistant/components/ambiclimate/.translations/ko.json +++ b/homeassistant/components/ambiclimate/.translations/ko.json @@ -18,6 +18,5 @@ "title": "Ambi Climate \uc778\uc99d" } } - }, - "title": "Ambi Climate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/lb.json b/homeassistant/components/ambiclimate/.translations/lb.json index 6ce77e0cd953..3d2b56ba466a 100644 --- a/homeassistant/components/ambiclimate/.translations/lb.json +++ b/homeassistant/components/ambiclimate/.translations/lb.json @@ -18,6 +18,5 @@ "title": "Ambiclimate authentifiz\u00e9ieren" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/nl.json b/homeassistant/components/ambiclimate/.translations/nl.json index 2b782dd5c3d0..17e6dfa9c82a 100644 --- a/homeassistant/components/ambiclimate/.translations/nl.json +++ b/homeassistant/components/ambiclimate/.translations/nl.json @@ -18,6 +18,5 @@ "title": "Authenticatie Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/no.json b/homeassistant/components/ambiclimate/.translations/no.json index ae69e238fff5..e0df96e03616 100644 --- a/homeassistant/components/ambiclimate/.translations/no.json +++ b/homeassistant/components/ambiclimate/.translations/no.json @@ -18,6 +18,5 @@ "title": "Autensiere Ambiclimate" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/pl.json b/homeassistant/components/ambiclimate/.translations/pl.json index 1696fb3d6b74..69cb3f0e8189 100644 --- a/homeassistant/components/ambiclimate/.translations/pl.json +++ b/homeassistant/components/ambiclimate/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Uwierzytelnienie Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/pt-BR.json b/homeassistant/components/ambiclimate/.translations/pt-BR.json index 7187dfd0e842..1b0ae2a74df9 100644 --- a/homeassistant/components/ambiclimate/.translations/pt-BR.json +++ b/homeassistant/components/ambiclimate/.translations/pt-BR.json @@ -18,6 +18,5 @@ "title": "Autenticar Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/ru.json b/homeassistant/components/ambiclimate/.translations/ru.json index cd3ad4ba29ef..a1eefc78575a 100644 --- a/homeassistant/components/ambiclimate/.translations/ru.json +++ b/homeassistant/components/ambiclimate/.translations/ru.json @@ -18,6 +18,5 @@ "title": "Ambi Climate" } } - }, - "title": "Ambi Climate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/sl.json b/homeassistant/components/ambiclimate/.translations/sl.json index 06429d200d99..e293b411226a 100644 --- a/homeassistant/components/ambiclimate/.translations/sl.json +++ b/homeassistant/components/ambiclimate/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Overi Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/sv.json b/homeassistant/components/ambiclimate/.translations/sv.json index f82c899184a3..3ff8ed3da976 100644 --- a/homeassistant/components/ambiclimate/.translations/sv.json +++ b/homeassistant/components/ambiclimate/.translations/sv.json @@ -18,6 +18,5 @@ "title": "Autentisera Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/.translations/zh-Hant.json b/homeassistant/components/ambiclimate/.translations/zh-Hant.json index 0490f2f7f962..2efd9f135497 100644 --- a/homeassistant/components/ambiclimate/.translations/zh-Hant.json +++ b/homeassistant/components/ambiclimate/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "\u8a8d\u8b49 Ambiclimate" } } - }, - "title": "Ambiclimate" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/bg.json b/homeassistant/components/ambient_station/.translations/bg.json index 0edb0b06e243..173b1c39c5f6 100644 --- a/homeassistant/components/ambient_station/.translations/bg.json +++ b/homeassistant/components/ambient_station/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } } - }, - "title": "\u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u0430 PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ca.json b/homeassistant/components/ambient_station/.translations/ca.json index 75a12da869cf..87934f8e90c5 100644 --- a/homeassistant/components/ambient_station/.translations/ca.json +++ b/homeassistant/components/ambient_station/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Introdueix la teva informaci\u00f3" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/da.json b/homeassistant/components/ambient_station/.translations/da.json index ddceeb5c5dc1..b8a4f1ab29ed 100644 --- a/homeassistant/components/ambient_station/.translations/da.json +++ b/homeassistant/components/ambient_station/.translations/da.json @@ -16,6 +16,5 @@ "title": "Udfyld dine oplysninger" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/de.json b/homeassistant/components/ambient_station/.translations/de.json index 434c30071825..ae4fbe365057 100644 --- a/homeassistant/components/ambient_station/.translations/de.json +++ b/homeassistant/components/ambient_station/.translations/de.json @@ -16,6 +16,5 @@ "title": "Gib deine Informationen ein" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/en.json b/homeassistant/components/ambient_station/.translations/en.json index bd9a4a659c84..10b7eebc38ab 100644 --- a/homeassistant/components/ambient_station/.translations/en.json +++ b/homeassistant/components/ambient_station/.translations/en.json @@ -16,6 +16,5 @@ "title": "Fill in your information" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/es-419.json b/homeassistant/components/ambient_station/.translations/es-419.json index 425cc1bc94f4..d2c60aee5a0f 100644 --- a/homeassistant/components/ambient_station/.translations/es-419.json +++ b/homeassistant/components/ambient_station/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/es.json b/homeassistant/components/ambient_station/.translations/es.json index 0a5e46514c16..12272affdf1e 100644 --- a/homeassistant/components/ambient_station/.translations/es.json +++ b/homeassistant/components/ambient_station/.translations/es.json @@ -16,6 +16,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "Ambiente PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/fr.json b/homeassistant/components/ambient_station/.translations/fr.json index 4b915da3565f..d88e9f9c9f67 100644 --- a/homeassistant/components/ambient_station/.translations/fr.json +++ b/homeassistant/components/ambient_station/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Veuillez saisir vos informations" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/hu.json b/homeassistant/components/ambient_station/.translations/hu.json index f7ee20987a83..e6b95634827d 100644 --- a/homeassistant/components/ambient_station/.translations/hu.json +++ b/homeassistant/components/ambient_station/.translations/hu.json @@ -13,6 +13,5 @@ "title": "T\u00f6ltsd ki az adataid" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/it.json b/homeassistant/components/ambient_station/.translations/it.json index 7b3b4bb9f358..1991d053f6ca 100644 --- a/homeassistant/components/ambient_station/.translations/it.json +++ b/homeassistant/components/ambient_station/.translations/it.json @@ -16,6 +16,5 @@ "title": "Inserisci i tuoi dati" } } - }, - "title": "PWS ambientale" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ko.json b/homeassistant/components/ambient_station/.translations/ko.json index 081370192845..83d273dc4dff 100644 --- a/homeassistant/components/ambient_station/.translations/ko.json +++ b/homeassistant/components/ambient_station/.translations/ko.json @@ -16,6 +16,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/lb.json b/homeassistant/components/ambient_station/.translations/lb.json index e4d6c2c823fd..c679b270e80e 100644 --- a/homeassistant/components/ambient_station/.translations/lb.json +++ b/homeassistant/components/ambient_station/.translations/lb.json @@ -16,6 +16,5 @@ "title": "F\u00ebllt \u00e4r Informatiounen aus" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/nl.json b/homeassistant/components/ambient_station/.translations/nl.json index 1054d22b2e25..53ad8c9094bf 100644 --- a/homeassistant/components/ambient_station/.translations/nl.json +++ b/homeassistant/components/ambient_station/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Vul uw gegevens in" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/no.json b/homeassistant/components/ambient_station/.translations/no.json index 5ad62a7877e3..972d1210f002 100644 --- a/homeassistant/components/ambient_station/.translations/no.json +++ b/homeassistant/components/ambient_station/.translations/no.json @@ -16,6 +16,5 @@ "title": "Fyll ut informasjonen din" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pl.json b/homeassistant/components/ambient_station/.translations/pl.json index 74a24d2f912c..bb597971b0cd 100644 --- a/homeassistant/components/ambient_station/.translations/pl.json +++ b/homeassistant/components/ambient_station/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Wprowad\u017a dane" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pt-BR.json b/homeassistant/components/ambient_station/.translations/pt-BR.json index a53edc2ab4cb..d3ac36bf0e2f 100644 --- a/homeassistant/components/ambient_station/.translations/pt-BR.json +++ b/homeassistant/components/ambient_station/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Preencha suas informa\u00e7\u00f5es" } } - }, - "title": "Ambiente PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/pt.json b/homeassistant/components/ambient_station/.translations/pt.json index ca258dbc9dc9..56c8b5f718a9 100644 --- a/homeassistant/components/ambient_station/.translations/pt.json +++ b/homeassistant/components/ambient_station/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Preencha as suas informa\u00e7\u00f5es" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/ru.json b/homeassistant/components/ambient_station/.translations/ru.json index ee6ddcd32c5e..a78bfbe30499 100644 --- a/homeassistant/components/ambient_station/.translations/ru.json +++ b/homeassistant/components/ambient_station/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Ambient PWS" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/sl.json b/homeassistant/components/ambient_station/.translations/sl.json index 676f6f9dee90..0fbacf5ccc11 100644 --- a/homeassistant/components/ambient_station/.translations/sl.json +++ b/homeassistant/components/ambient_station/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Izpolnite svoje podatke" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/sv.json b/homeassistant/components/ambient_station/.translations/sv.json index 5adce28ab088..7c6be84d5947 100644 --- a/homeassistant/components/ambient_station/.translations/sv.json +++ b/homeassistant/components/ambient_station/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Fyll i dina uppgifter" } } - }, - "title": "Ambient Weather PWS (Personal Weather Station)" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/zh-Hans.json b/homeassistant/components/ambient_station/.translations/zh-Hans.json index 5a0255e74d79..fc092c7c2475 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hans.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } } - }, - "title": "Ambient PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/ambient_station/.translations/zh-Hant.json b/homeassistant/components/ambient_station/.translations/zh-Hant.json index 59f8b132e74c..f14d177e899c 100644 --- a/homeassistant/components/ambient_station/.translations/zh-Hant.json +++ b/homeassistant/components/ambient_station/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u586b\u5beb\u8cc7\u8a0a" } } - }, - "title": "\u74b0\u5883 PWS" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ca.json b/homeassistant/components/august/.translations/ca.json index 01cd9146f499..4f8f9cebe63e 100644 --- a/homeassistant/components/august/.translations/ca.json +++ b/homeassistant/components/august/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Autenticaci\u00f3 de dos factors" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/da.json b/homeassistant/components/august/.translations/da.json index 5159d8b9f265..e022fac37906 100644 --- a/homeassistant/components/august/.translations/da.json +++ b/homeassistant/components/august/.translations/da.json @@ -27,6 +27,5 @@ "title": "Tofaktorgodkendelse" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/de.json b/homeassistant/components/august/.translations/de.json index 94e2e76d9198..d46be650e2c5 100644 --- a/homeassistant/components/august/.translations/de.json +++ b/homeassistant/components/august/.translations/de.json @@ -27,6 +27,5 @@ "title": "Zwei-Faktor-Authentifizierung" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/en.json b/homeassistant/components/august/.translations/en.json index 0a86c59934b9..b8bf1b1bc03c 100644 --- a/homeassistant/components/august/.translations/en.json +++ b/homeassistant/components/august/.translations/en.json @@ -27,6 +27,5 @@ "title": "Two factor authentication" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/es.json b/homeassistant/components/august/.translations/es.json index 7f47a67ba219..28d9743c073a 100644 --- a/homeassistant/components/august/.translations/es.json +++ b/homeassistant/components/august/.translations/es.json @@ -27,6 +27,5 @@ "title": "Autenticaci\u00f3n de dos factores" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/fr.json b/homeassistant/components/august/.translations/fr.json index d7191e0a317f..da2df2461a1b 100644 --- a/homeassistant/components/august/.translations/fr.json +++ b/homeassistant/components/august/.translations/fr.json @@ -25,6 +25,5 @@ "title": "Authentification \u00e0 deux facteurs" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/it.json b/homeassistant/components/august/.translations/it.json index 1c992f4351bf..3a5f2676acdb 100644 --- a/homeassistant/components/august/.translations/it.json +++ b/homeassistant/components/august/.translations/it.json @@ -27,6 +27,5 @@ "title": "Autenticazione a due fattori" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ko.json b/homeassistant/components/august/.translations/ko.json index bdceb09daef1..28d6ed8842ed 100644 --- a/homeassistant/components/august/.translations/ko.json +++ b/homeassistant/components/august/.translations/ko.json @@ -27,6 +27,5 @@ "title": "2\ub2e8\uacc4 \uc778\uc99d" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/lb.json b/homeassistant/components/august/.translations/lb.json index bdbe41fbcf58..501af05c2dff 100644 --- a/homeassistant/components/august/.translations/lb.json +++ b/homeassistant/components/august/.translations/lb.json @@ -27,6 +27,5 @@ "title": "2-Faktor-Authentifikatioun" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/no.json b/homeassistant/components/august/.translations/no.json index 51b6add6a918..2ba841ea139c 100644 --- a/homeassistant/components/august/.translations/no.json +++ b/homeassistant/components/august/.translations/no.json @@ -27,6 +27,5 @@ "title": "To-faktor autentisering" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/ru.json b/homeassistant/components/august/.translations/ru.json index 6a0eae5d05f9..5cc039b8e9e3 100644 --- a/homeassistant/components/august/.translations/ru.json +++ b/homeassistant/components/august/.translations/ru.json @@ -27,6 +27,5 @@ "title": "\u0414\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/sl.json b/homeassistant/components/august/.translations/sl.json index 67b85faf8062..5d78dac5ef12 100644 --- a/homeassistant/components/august/.translations/sl.json +++ b/homeassistant/components/august/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Dvofaktorska avtentikacija" } } - }, - "title": "Avgust" + } } \ No newline at end of file diff --git a/homeassistant/components/august/.translations/zh-Hant.json b/homeassistant/components/august/.translations/zh-Hant.json index 2ec3e6debaf6..6b7e206d4c4f 100644 --- a/homeassistant/components/august/.translations/zh-Hant.json +++ b/homeassistant/components/august/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u5169\u6b65\u9a5f\u9a57\u8b49" } } - }, - "title": "August" + } } \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/af.json b/homeassistant/components/automation/.translations/af.json new file mode 100644 index 000000000000..533b050087ae --- /dev/null +++ b/homeassistant/components/automation/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Outomatisering" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ar.json b/homeassistant/components/automation/.translations/ar.json new file mode 100644 index 000000000000..4dc0cbf56daa --- /dev/null +++ b/homeassistant/components/automation/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/bg.json b/homeassistant/components/automation/.translations/bg.json new file mode 100644 index 000000000000..76d41381eae8 --- /dev/null +++ b/homeassistant/components/automation/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/bs.json b/homeassistant/components/automation/.translations/bs.json new file mode 100644 index 000000000000..af5a1d1c6477 --- /dev/null +++ b/homeassistant/components/automation/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizacija" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ca.json b/homeassistant/components/automation/.translations/ca.json new file mode 100644 index 000000000000..85ad9be7718e --- /dev/null +++ b/homeassistant/components/automation/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Automatitzaci\u00f3" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/cs.json b/homeassistant/components/automation/.translations/cs.json new file mode 100644 index 000000000000..765ef3f1ced1 --- /dev/null +++ b/homeassistant/components/automation/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizace" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/cy.json b/homeassistant/components/automation/.translations/cy.json new file mode 100644 index 000000000000..92f6c37c4a0d --- /dev/null +++ b/homeassistant/components/automation/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Awtomeiddio" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/da.json b/homeassistant/components/automation/.translations/da.json new file mode 100644 index 000000000000..2e6c49d89938 --- /dev/null +++ b/homeassistant/components/automation/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Automatisering" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/de.json b/homeassistant/components/automation/.translations/de.json new file mode 100644 index 000000000000..364c1e6a7f47 --- /dev/null +++ b/homeassistant/components/automation/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Automatisierung" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/el.json b/homeassistant/components/automation/.translations/el.json new file mode 100644 index 000000000000..377d161111e1 --- /dev/null +++ b/homeassistant/components/automation/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0391\u03c5\u03c4\u03bf\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03cc\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/en.json b/homeassistant/components/automation/.translations/en.json new file mode 100644 index 000000000000..a9d5176d842a --- /dev/null +++ b/homeassistant/components/automation/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Automation" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/es-419.json b/homeassistant/components/automation/.translations/es-419.json new file mode 100644 index 000000000000..d42bb67a7cb7 --- /dev/null +++ b/homeassistant/components/automation/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizaci\u00f3n" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/es.json b/homeassistant/components/automation/.translations/es.json new file mode 100644 index 000000000000..d42bb67a7cb7 --- /dev/null +++ b/homeassistant/components/automation/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizaci\u00f3n" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/et.json b/homeassistant/components/automation/.translations/et.json new file mode 100644 index 000000000000..9c8a688873a2 --- /dev/null +++ b/homeassistant/components/automation/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Automatiseerimine" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/eu.json b/homeassistant/components/automation/.translations/eu.json new file mode 100644 index 000000000000..1d581a8099f8 --- /dev/null +++ b/homeassistant/components/automation/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizazioa" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/fa.json b/homeassistant/components/automation/.translations/fa.json new file mode 100644 index 000000000000..20d20198cffd --- /dev/null +++ b/homeassistant/components/automation/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u062a\u0648\u0645\u0627\u0633\u06cc\u0648\u0646" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/fi.json b/homeassistant/components/automation/.translations/fi.json new file mode 100644 index 000000000000..c0fe052d97ff --- /dev/null +++ b/homeassistant/components/automation/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Automaatio" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/fr.json b/homeassistant/components/automation/.translations/fr.json new file mode 100644 index 000000000000..a9d5176d842a --- /dev/null +++ b/homeassistant/components/automation/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Automation" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/gsw.json b/homeassistant/components/automation/.translations/gsw.json new file mode 100644 index 000000000000..a9d5176d842a --- /dev/null +++ b/homeassistant/components/automation/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Automation" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/he.json b/homeassistant/components/automation/.translations/he.json new file mode 100644 index 000000000000..9fecfc15e057 --- /dev/null +++ b/homeassistant/components/automation/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d0\u05d5\u05d8\u05d5\u05de\u05e6\u05d9\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/hi.json b/homeassistant/components/automation/.translations/hi.json new file mode 100644 index 000000000000..22bca4eea0e5 --- /dev/null +++ b/homeassistant/components/automation/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u094d\u0935\u091a\u093e\u0932\u0928" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/hr.json b/homeassistant/components/automation/.translations/hr.json new file mode 100644 index 000000000000..af5a1d1c6477 --- /dev/null +++ b/homeassistant/components/automation/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Automatizacija" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/hu.json b/homeassistant/components/automation/.translations/hu.json new file mode 100644 index 000000000000..5af915af6a71 --- /dev/null +++ b/homeassistant/components/automation/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Automatiz\u00e1l\u00e1s" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/hy.json b/homeassistant/components/automation/.translations/hy.json new file mode 100644 index 000000000000..cdc8aef914ec --- /dev/null +++ b/homeassistant/components/automation/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0531\u057e\u057f\u0578\u0574\u0561\u057f\u0561\u0581\u0578\u0582\u0574" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/id.json b/homeassistant/components/automation/.translations/id.json new file mode 100644 index 000000000000..39fd058fbf6d --- /dev/null +++ b/homeassistant/components/automation/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Otomasi" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/is.json b/homeassistant/components/automation/.translations/is.json new file mode 100644 index 000000000000..578f496e7a35 --- /dev/null +++ b/homeassistant/components/automation/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Sj\u00e1lfvirkni" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/it.json b/homeassistant/components/automation/.translations/it.json new file mode 100644 index 000000000000..b31bce51bfcf --- /dev/null +++ b/homeassistant/components/automation/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Automazione" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ja.json b/homeassistant/components/automation/.translations/ja.json new file mode 100644 index 000000000000..2ad5a773f28e --- /dev/null +++ b/homeassistant/components/automation/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30aa\u30fc\u30c8\u30e1\u30fc\u30b7\u30e7\u30f3" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ko.json b/homeassistant/components/automation/.translations/ko.json new file mode 100644 index 000000000000..baf560f5579e --- /dev/null +++ b/homeassistant/components/automation/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc790\ub3d9\ud654" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/lb.json b/homeassistant/components/automation/.translations/lb.json new file mode 100644 index 000000000000..a36d5e398032 --- /dev/null +++ b/homeassistant/components/automation/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Automatismen" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/lv.json b/homeassistant/components/automation/.translations/lv.json new file mode 100644 index 000000000000..7ce7b3aee434 --- /dev/null +++ b/homeassistant/components/automation/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Automatiz\u0101cija" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/nb.json b/homeassistant/components/automation/.translations/nb.json new file mode 100644 index 000000000000..1a6f96ff9e17 --- /dev/null +++ b/homeassistant/components/automation/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Automasjon" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/nl.json b/homeassistant/components/automation/.translations/nl.json new file mode 100644 index 000000000000..2e6c49d89938 --- /dev/null +++ b/homeassistant/components/automation/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Automatisering" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/nn.json b/homeassistant/components/automation/.translations/nn.json new file mode 100644 index 000000000000..4ee698511e8e --- /dev/null +++ b/homeassistant/components/automation/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Automasjonar" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/pl.json b/homeassistant/components/automation/.translations/pl.json new file mode 100644 index 000000000000..a50d79febca7 --- /dev/null +++ b/homeassistant/components/automation/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Automatyzacja" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/pt-BR.json b/homeassistant/components/automation/.translations/pt-BR.json new file mode 100644 index 000000000000..d36d6a60c20e --- /dev/null +++ b/homeassistant/components/automation/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Automa\u00e7\u00e3o" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/pt.json b/homeassistant/components/automation/.translations/pt.json new file mode 100644 index 000000000000..d36d6a60c20e --- /dev/null +++ b/homeassistant/components/automation/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Automa\u00e7\u00e3o" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ro.json b/homeassistant/components/automation/.translations/ro.json new file mode 100644 index 000000000000..8ba4a19e64c3 --- /dev/null +++ b/homeassistant/components/automation/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Automatiz\u0103ri" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/ru.json b/homeassistant/components/automation/.translations/ru.json new file mode 100644 index 000000000000..76d41381eae8 --- /dev/null +++ b/homeassistant/components/automation/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/sk.json b/homeassistant/components/automation/.translations/sk.json new file mode 100644 index 000000000000..522cf4e238fa --- /dev/null +++ b/homeassistant/components/automation/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Automatiz\u00e1cia" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/sl.json b/homeassistant/components/automation/.translations/sl.json new file mode 100644 index 000000000000..109203867d59 --- /dev/null +++ b/homeassistant/components/automation/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Avtomatizacija" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/sv.json b/homeassistant/components/automation/.translations/sv.json new file mode 100644 index 000000000000..a9d5176d842a --- /dev/null +++ b/homeassistant/components/automation/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Automation" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/te.json b/homeassistant/components/automation/.translations/te.json new file mode 100644 index 000000000000..dd710dddef5a --- /dev/null +++ b/homeassistant/components/automation/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c06\u0c1f\u0c4b\u0c2e\u0c47\u0c37\u0c28\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/th.json b/homeassistant/components/automation/.translations/th.json new file mode 100644 index 000000000000..1ec9bf6a48d2 --- /dev/null +++ b/homeassistant/components/automation/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/tr.json b/homeassistant/components/automation/.translations/tr.json new file mode 100644 index 000000000000..5699356f6709 --- /dev/null +++ b/homeassistant/components/automation/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Otomasyon" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/uk.json b/homeassistant/components/automation/.translations/uk.json new file mode 100644 index 000000000000..616dac85b1fc --- /dev/null +++ b/homeassistant/components/automation/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0456\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/vi.json b/homeassistant/components/automation/.translations/vi.json new file mode 100644 index 000000000000..82e40903615f --- /dev/null +++ b/homeassistant/components/automation/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "T\u1ef1 \u0111\u1ed9ng h\u00f3a" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/zh-Hans.json b/homeassistant/components/automation/.translations/zh-Hans.json new file mode 100644 index 000000000000..2a1a63c716d2 --- /dev/null +++ b/homeassistant/components/automation/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u81ea\u52a8\u5316" +} \ No newline at end of file diff --git a/homeassistant/components/automation/.translations/zh-Hant.json b/homeassistant/components/automation/.translations/zh-Hant.json new file mode 100644 index 000000000000..e98a4cdb7928 --- /dev/null +++ b/homeassistant/components/automation/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u81ea\u52d5\u5316" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/af.json b/homeassistant/components/binary_sensor/.translations/af.json new file mode 100644 index 000000000000..fce4c42735e1 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00eare sensor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ar.json b/homeassistant/components/binary_sensor/.translations/ar.json new file mode 100644 index 000000000000..8c321e51dedd --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062c\u0647\u0627\u0632 \u0627\u0633\u062a\u0634\u0639\u0627\u0631 \u062b\u0646\u0627\u0626\u064a" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/bg.json b/homeassistant/components/binary_sensor/.translations/bg.json index 3006b8cadbc0..3b5266ed09b1 100644 --- a/homeassistant/components/binary_sensor/.translations/bg.json +++ b/homeassistant/components/binary_sensor/.translations/bg.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} \u0441\u0442\u0430\u043d\u0430 \u043e\u043f\u0430\u0441\u0435\u043d", "vibration": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u0434\u0430 \u0437\u0430\u0441\u0438\u0447\u0430 \u0432\u0438\u0431\u0440\u0430\u0446\u0438\u0438" } - } + }, + "title": "\u0414\u0432\u043e\u0438\u0447\u0435\u043d \u0441\u0435\u043d\u0437\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/bs.json b/homeassistant/components/binary_sensor/.translations/bs.json new file mode 100644 index 000000000000..e793b8a61f2d --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Binarni senzor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ca.json b/homeassistant/components/binary_sensor/.translations/ca.json index 3a3485a3be71..da64d5e4890b 100644 --- a/homeassistant/components/binary_sensor/.translations/ca.json +++ b/homeassistant/components/binary_sensor/.translations/ca.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} es torna insegur", "vibration": "{entity_name} ha comen\u00e7at a detectar vibraci\u00f3" } - } + }, + "title": "Sensor binari" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/cs.json b/homeassistant/components/binary_sensor/.translations/cs.json index cb941e67883f..0957dabe35d7 100644 --- a/homeassistant/components/binary_sensor/.translations/cs.json +++ b/homeassistant/components/binary_sensor/.translations/cs.json @@ -4,5 +4,6 @@ "moist": "{entity_name} se navlh\u010dil", "not_opened": "{entity_name} uzav\u0159eno" } - } + }, + "title": "Bin\u00e1rn\u00ed senzor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/cy.json b/homeassistant/components/binary_sensor/.translations/cy.json new file mode 100644 index 000000000000..2ae1c0fe167a --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Synhwyrydd deuaidd" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/da.json b/homeassistant/components/binary_sensor/.translations/da.json index ffa68b094be4..be8ed7dd5f69 100644 --- a/homeassistant/components/binary_sensor/.translations/da.json +++ b/homeassistant/components/binary_sensor/.translations/da.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} blev usikker", "vibration": "{entity_name} begyndte at registrere vibration" } - } + }, + "title": "Bin\u00e6r sensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/de.json b/homeassistant/components/binary_sensor/.translations/de.json index 55a079ca42af..38f0975720dc 100644 --- a/homeassistant/components/binary_sensor/.translations/de.json +++ b/homeassistant/components/binary_sensor/.translations/de.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} ist unsicher", "vibration": "{entity_name} detektiert Vibrationen" } - } + }, + "title": "Bin\u00e4rsensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/el.json b/homeassistant/components/binary_sensor/.translations/el.json new file mode 100644 index 000000000000..0ade7a09c995 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0394\u03c5\u03b1\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b1\u03b9\u03c3\u03b8\u03b7\u03c4\u03ae\u03c1\u03b1\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/en.json b/homeassistant/components/binary_sensor/.translations/en.json index 213d947236ca..0db078b845fe 100644 --- a/homeassistant/components/binary_sensor/.translations/en.json +++ b/homeassistant/components/binary_sensor/.translations/en.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} became unsafe", "vibration": "{entity_name} started detecting vibration" } - } + }, + "title": "Binary sensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/es-419.json b/homeassistant/components/binary_sensor/.translations/es-419.json index f6f3a378eb01..60a844a1733b 100644 --- a/homeassistant/components/binary_sensor/.translations/es-419.json +++ b/homeassistant/components/binary_sensor/.translations/es-419.json @@ -82,5 +82,6 @@ "turned_off": "{entity_name} apagado", "turned_on": "{entity_name} encendido" } - } + }, + "title": "Sensor binario" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/es.json b/homeassistant/components/binary_sensor/.translations/es.json index 02fbc4652522..9b7a47220873 100644 --- a/homeassistant/components/binary_sensor/.translations/es.json +++ b/homeassistant/components/binary_sensor/.translations/es.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} se volvi\u00f3 inseguro", "vibration": "{entity_name} empez\u00f3 a detectar vibraciones" } - } + }, + "title": "Sensor binario" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/et.json b/homeassistant/components/binary_sensor/.translations/et.json new file mode 100644 index 000000000000..6dccfd6054b0 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Binaarne andur" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/eu.json b/homeassistant/components/binary_sensor/.translations/eu.json new file mode 100644 index 000000000000..7870fed8bf52 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Sentsore bitarra" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/fa.json b/homeassistant/components/binary_sensor/.translations/fa.json new file mode 100644 index 000000000000..960e5fa59336 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u062d\u0633\u06af\u0631 \u0628\u0627\u06cc\u0646\u0631\u06cc" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/fi.json b/homeassistant/components/binary_sensor/.translations/fi.json new file mode 100644 index 000000000000..a33c9bf4e8f2 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00e4\u00e4risensori" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/fr.json b/homeassistant/components/binary_sensor/.translations/fr.json index f5b2e2bfd97d..ce5f0e4db8f0 100644 --- a/homeassistant/components/binary_sensor/.translations/fr.json +++ b/homeassistant/components/binary_sensor/.translations/fr.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} est devenu dangereux", "vibration": "{entity_name} a commenc\u00e9 \u00e0 d\u00e9tecter les vibrations" } - } + }, + "title": "Capteur binaire" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/gsw.json b/homeassistant/components/binary_sensor/.translations/gsw.json new file mode 100644 index 000000000000..63d106094f6c --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00e4re Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/he.json b/homeassistant/components/binary_sensor/.translations/he.json new file mode 100644 index 000000000000..27f4ed3d2d21 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d7\u05d9\u05d9\u05e9\u05df \u05d1\u05d9\u05e0\u05d0\u05e8\u05d9" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/hi.json b/homeassistant/components/binary_sensor/.translations/hi.json new file mode 100644 index 000000000000..afbb516a8aec --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u092c\u093e\u0907\u0928\u0930\u0940 \u0938\u0947\u0902\u0938\u0930" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/hr.json b/homeassistant/components/binary_sensor/.translations/hr.json new file mode 100644 index 000000000000..e793b8a61f2d --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Binarni senzor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/hu.json b/homeassistant/components/binary_sensor/.translations/hu.json index d53e869e0756..0286d3164b1b 100644 --- a/homeassistant/components/binary_sensor/.translations/hu.json +++ b/homeassistant/components/binary_sensor/.translations/hu.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} m\u00e1r nem biztons\u00e1gos", "vibration": "{entity_name} rezg\u00e9st \u00e9rz\u00e9kel" } - } + }, + "title": "Bin\u00e1ris \u00e9rz\u00e9kel\u0151" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/hy.json b/homeassistant/components/binary_sensor/.translations/hy.json new file mode 100644 index 000000000000..d228e3312f99 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0535\u0580\u056f\u0578\u0582\u0561\u056f\u0561\u0576 \u054d\u0565\u0576\u057d\u0578\u0580" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/id.json b/homeassistant/components/binary_sensor/.translations/id.json new file mode 100644 index 000000000000..0e75343c31f1 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor biner" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/is.json b/homeassistant/components/binary_sensor/.translations/is.json new file mode 100644 index 000000000000..3b543a371c9a --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Tv\u00edundar skynjari" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/it.json b/homeassistant/components/binary_sensor/.translations/it.json index db897b68da01..29c3f16a18e1 100644 --- a/homeassistant/components/binary_sensor/.translations/it.json +++ b/homeassistant/components/binary_sensor/.translations/it.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} diventato non sicuro", "vibration": "{entity_name} iniziato a rilevare le vibrazioni" } - } + }, + "title": "Sensore binario" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ja.json b/homeassistant/components/binary_sensor/.translations/ja.json new file mode 100644 index 000000000000..27dc24d0285e --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30d0\u30a4\u30ca\u30ea\u30bb\u30f3\u30b5\u30fc" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ko.json b/homeassistant/components/binary_sensor/.translations/ko.json index 733d3a8de8fd..a6eed61f1b5b 100644 --- a/homeassistant/components/binary_sensor/.translations/ko.json +++ b/homeassistant/components/binary_sensor/.translations/ko.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} \uc774(\uac00) \uc548\uc804\ud558\uc9c0 \uc54a\uc744 \ub54c", "vibration": "{entity_name} \uc774(\uac00) \uc9c4\ub3d9\uc744 \uac10\uc9c0\ud560 \ub54c" } - } + }, + "title": "\uc774\uc9c4\uc13c\uc11c" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/lb.json b/homeassistant/components/binary_sensor/.translations/lb.json index 7120b1bb2893..ecd276a8ec75 100644 --- a/homeassistant/components/binary_sensor/.translations/lb.json +++ b/homeassistant/components/binary_sensor/.translations/lb.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} gouf ons\u00e9cher", "vibration": "{entity_name} huet ugefaange Vibratiounen z'entdecken" } - } + }, + "title": "Bin\u00e4ren Sensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/lv.json b/homeassistant/components/binary_sensor/.translations/lv.json index 7668dfa5ac86..295919e27ba7 100644 --- a/homeassistant/components/binary_sensor/.translations/lv.json +++ b/homeassistant/components/binary_sensor/.translations/lv.json @@ -4,5 +4,6 @@ "turned_off": "{entity_name} tika izsl\u0113gta", "turned_on": "{entity_name} tika iesl\u0113gta" } - } + }, + "title": "Bin\u0101rais sensors" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/nb.json b/homeassistant/components/binary_sensor/.translations/nb.json new file mode 100644 index 000000000000..cbaa6c032e67 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00e6r sensor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/nl.json b/homeassistant/components/binary_sensor/.translations/nl.json index 04d40ecf9b8b..552def8dbf22 100644 --- a/homeassistant/components/binary_sensor/.translations/nl.json +++ b/homeassistant/components/binary_sensor/.translations/nl.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} werd onveilig", "vibration": "{entity_name} begon trillingen te detecteren" } - } + }, + "title": "Binaire sensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/nn.json b/homeassistant/components/binary_sensor/.translations/nn.json new file mode 100644 index 000000000000..4f35d2212f68 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00e6rsensor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/pl.json b/homeassistant/components/binary_sensor/.translations/pl.json index ef174e723364..e713441bb5d3 100644 --- a/homeassistant/components/binary_sensor/.translations/pl.json +++ b/homeassistant/components/binary_sensor/.translations/pl.json @@ -88,5 +88,6 @@ "unsafe": "sensor {entity_name} wykryje niebezpiecze\u0144stwo", "vibration": "sensor {entity_name} wykryje wibracje" } - } + }, + "title": "Sensor binarny" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/pt-BR.json b/homeassistant/components/binary_sensor/.translations/pt-BR.json new file mode 100644 index 000000000000..5b1e6642247e --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor bin\u00e1rio" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/pt.json b/homeassistant/components/binary_sensor/.translations/pt.json index caea4c6c97a0..3a1401e7463c 100644 --- a/homeassistant/components/binary_sensor/.translations/pt.json +++ b/homeassistant/components/binary_sensor/.translations/pt.json @@ -36,5 +36,6 @@ "unsafe": "ficou inseguro {entity_name}", "vibration": "foram detectadas vibra\u00e7\u00f5es em {entity_name}" } - } + }, + "title": "Sensor bin\u00e1rio" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ro.json b/homeassistant/components/binary_sensor/.translations/ro.json index 438822a97f5b..8bf81d850332 100644 --- a/homeassistant/components/binary_sensor/.translations/ro.json +++ b/homeassistant/components/binary_sensor/.translations/ro.json @@ -41,5 +41,6 @@ "unsafe": "{entity_name} a devenit nesigur", "vibration": "{entity_name} a \u00eenceput s\u0103 detecteze vibra\u021biile" } - } + }, + "title": "Senzor binar" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/ru.json b/homeassistant/components/binary_sensor/.translations/ru.json index fe1323c67448..5ca84a4b3a43 100644 --- a/homeassistant/components/binary_sensor/.translations/ru.json +++ b/homeassistant/components/binary_sensor/.translations/ru.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} \u043d\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c", "vibration": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0438\u0431\u0440\u0430\u0446\u0438\u044e" } - } + }, + "title": "\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0441\u0435\u043d\u0441\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/sk.json b/homeassistant/components/binary_sensor/.translations/sk.json new file mode 100644 index 000000000000..597060def825 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Bin\u00e1rny senzor" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/sl.json b/homeassistant/components/binary_sensor/.translations/sl.json index 234146e2e6f6..25064209e715 100644 --- a/homeassistant/components/binary_sensor/.translations/sl.json +++ b/homeassistant/components/binary_sensor/.translations/sl.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} je postal nevaren", "vibration": "{entity_name} je za\u010del odkrivat vibracije" } - } + }, + "title": "Binarni senzor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/sv.json b/homeassistant/components/binary_sensor/.translations/sv.json index ec5d57daa791..1e89b6eb75fc 100644 --- a/homeassistant/components/binary_sensor/.translations/sv.json +++ b/homeassistant/components/binary_sensor/.translations/sv.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name} blev os\u00e4ker", "vibration": "{entity_name} b\u00f6rjade detektera vibrationer" } - } + }, + "title": "Bin\u00e4r sensor" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/te.json b/homeassistant/components/binary_sensor/.translations/te.json new file mode 100644 index 000000000000..fc106a12252c --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2c\u0c48\u0c28\u0c30\u0c40 \u0c38\u0c46\u0c28\u0c4d\u0c38\u0c3e\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/th.json b/homeassistant/components/binary_sensor/.translations/th.json new file mode 100644 index 000000000000..63a898f407bf --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e0b\u0e47\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e41\u0e1a\u0e1a\u0e44\u0e1a\u0e19\u0e32\u0e23\u0e35" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/tr.json b/homeassistant/components/binary_sensor/.translations/tr.json new file mode 100644 index 000000000000..efa686ba703e --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "\u0130kili sens\u00f6r" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/uk.json b/homeassistant/components/binary_sensor/.translations/uk.json new file mode 100644 index 000000000000..bdc2f8a37884 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0411\u0456\u043d\u0430\u0440\u043d\u0438\u0439 \u0434\u0430\u0442\u0447\u0438\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/vi.json b/homeassistant/components/binary_sensor/.translations/vi.json new file mode 100644 index 000000000000..d7b293c54292 --- /dev/null +++ b/homeassistant/components/binary_sensor/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "C\u1ea3m bi\u1ebfn nh\u1ecb ph\u00e2n" +} \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/zh-Hans.json b/homeassistant/components/binary_sensor/.translations/zh-Hans.json index 9ad8e67e6b8d..ed74b1bf8b12 100644 --- a/homeassistant/components/binary_sensor/.translations/zh-Hans.json +++ b/homeassistant/components/binary_sensor/.translations/zh-Hans.json @@ -50,5 +50,6 @@ "hot": "{entity_name} \u53d8\u70ed", "light": "{entity_name} \u5f00\u59cb\u68c0\u6d4b\u5230\u5149\u7ebf" } - } + }, + "title": "\u4e8c\u5143\u4f20\u611f\u5668" } \ No newline at end of file diff --git a/homeassistant/components/binary_sensor/.translations/zh-Hant.json b/homeassistant/components/binary_sensor/.translations/zh-Hant.json index 7b48833dd7b5..5124c449d182 100644 --- a/homeassistant/components/binary_sensor/.translations/zh-Hant.json +++ b/homeassistant/components/binary_sensor/.translations/zh-Hant.json @@ -88,5 +88,6 @@ "unsafe": "{entity_name}\u5df2\u4e0d\u5b89\u5168", "vibration": "{entity_name}\u5df2\u5075\u6e2c\u5230\u9707\u52d5" } - } + }, + "title": "\u4e8c\u9032\u4f4d\u50b3\u611f\u5668" } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/ca.json b/homeassistant/components/braviatv/.translations/ca.json new file mode 100644 index 000000000000..a569c7548ddd --- /dev/null +++ b/homeassistant/components/braviatv/.translations/ca.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Aquest televisor ja est\u00e0 configurat." + }, + "error": { + "cannot_connect": "No s'ha pogut connectar, amfitri\u00f3 o codi PIN inv\u00e0lids.", + "invalid_host": "Nom de l'amfitri\u00f3 o adre\u00e7a IP inv\u00e0lids.", + "unsupported_model": "Aquest model de televisor no \u00e9s compatible." + }, + "step": { + "authorize": { + "data": { + "pin": "Codi PIN" + }, + "title": "Autoritzaci\u00f3 del televisor Sony Bravia" + }, + "user": { + "data": { + "host": "Nom d\u2019amfitri\u00f3 o adre\u00e7a IP del televisor" + }, + "title": "Televisor Sony Bravia" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Llista de fonts ignorades" + }, + "title": "Opcions del televisor Sony Bravia" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/de.json b/homeassistant/components/braviatv/.translations/de.json index e1735d815172..f46ff584d6cf 100644 --- a/homeassistant/components/braviatv/.translations/de.json +++ b/homeassistant/components/braviatv/.translations/de.json @@ -34,6 +34,5 @@ "title": "Optionen f\u00fcr Sony Bravia TV" } } - }, - "title": "Sony Bravia TV" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/en.json b/homeassistant/components/braviatv/.translations/en.json index 9332b67d232c..04ab58307398 100644 --- a/homeassistant/components/braviatv/.translations/en.json +++ b/homeassistant/components/braviatv/.translations/en.json @@ -34,6 +34,5 @@ "title": "Options for Sony Bravia TV" } } - }, - "title": "Sony Bravia TV" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/it.json b/homeassistant/components/braviatv/.translations/it.json index 6f709b38963b..c6fe7db44390 100644 --- a/homeassistant/components/braviatv/.translations/it.json +++ b/homeassistant/components/braviatv/.translations/it.json @@ -34,6 +34,5 @@ "title": "Opzioni per Sony Bravia TV" } } - }, - "title": "Sony Bravia TV" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/no.json b/homeassistant/components/braviatv/.translations/no.json index 7c24e94b552d..afd0f0d758c1 100644 --- a/homeassistant/components/braviatv/.translations/no.json +++ b/homeassistant/components/braviatv/.translations/no.json @@ -34,6 +34,5 @@ "title": "Alternativer for Sony Bravia TV" } } - }, - "title": "Sony Bravia TV" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/pl.json b/homeassistant/components/braviatv/.translations/pl.json index 0468cb57f954..cbafa3c4b445 100644 --- a/homeassistant/components/braviatv/.translations/pl.json +++ b/homeassistant/components/braviatv/.translations/pl.json @@ -34,6 +34,5 @@ "title": "Opcje dla Sony Bravia TV" } } - }, - "title": "Sony Bravia TV" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/pt.json b/homeassistant/components/braviatv/.translations/pt.json new file mode 100644 index 000000000000..d818bda11ffa --- /dev/null +++ b/homeassistant/components/braviatv/.translations/pt.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured": "Esta TV j\u00e1 est\u00e1 configurada." + }, + "error": { + "cannot_connect": "Falha na conex\u00e3o, nome de servidor inv\u00e1lido ou c\u00f3digo PIN.", + "invalid_host": "Nome de servidor ou endere\u00e7o IP inv\u00e1lido.", + "unsupported_model": "O seu modelo de TV n\u00e3o \u00e9 suportado." + }, + "step": { + "authorize": { + "data": { + "pin": "C\u00f3digo PIN" + }, + "description": "Digite o c\u00f3digo PIN mostrado na TV Sony Bravia. \n\nSe o c\u00f3digo PIN n\u00e3o for exibido, \u00e9 necess\u00e1rio cancelar o registro do Home Assistant na TV, v\u00e1 para: Configura\u00e7\u00f5es -> Rede -> Configura\u00e7\u00f5es do dispositivo remoto -> Cancelar registro do dispositivo remoto.", + "title": "Autorizar TV Sony Bravia" + }, + "user": { + "data": { + "host": "Nome do host da TV ou endere\u00e7o IP" + }, + "title": "TV Sony Bravia" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Lista de fontes ignoradas" + }, + "title": "Op\u00e7\u00f5es para a TV Sony Bravia" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/ru.json b/homeassistant/components/braviatv/.translations/ru.json index 077a39bb73f8..33e8d71bd641 100644 --- a/homeassistant/components/braviatv/.translations/ru.json +++ b/homeassistant/components/braviatv/.translations/ru.json @@ -34,6 +34,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 Sony Bravia" } } - }, - "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Sony Bravia" + } } \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/sl.json b/homeassistant/components/braviatv/.translations/sl.json new file mode 100644 index 000000000000..99ab83a39c6c --- /dev/null +++ b/homeassistant/components/braviatv/.translations/sl.json @@ -0,0 +1,38 @@ +{ + "config": { + "abort": { + "already_configured": "Ta televizor je \u017ee konfiguriran." + }, + "error": { + "cannot_connect": "Povezava ni bila mogo\u010de, neveljaven gostitelj ali PIN koda.", + "invalid_host": "Neveljavno ime gostitelja ali IP naslov.", + "unsupported_model": "Va\u0161 model televizorja ni podprt." + }, + "step": { + "authorize": { + "data": { + "pin": "PIN koda" + }, + "description": "Vnesite kodo PIN, ki je prikazana na Sony Bravia TVju. \n\n \u010ce koda PIN ni prikazana, morate na televizorju odjaviti Home Assistant, pojdite na: Nastavitve - > Omre\u017eje - > Nastavitve oddaljenih naprav - > Odjavite oddaljeno napravo.", + "title": "Pooblastite Sony Bravia TV" + }, + "user": { + "data": { + "host": "TV ime gostitelja ali IP naslov" + }, + "description": "Nastavite integracijo Sony Bravia TV. \u010ce imate te\u017eave s konfiguracijo, pojdite na: https://www.home-assistant.io/integrations/braviatv \n\n Prepri\u010dajte se, da je va\u0161 televizor vklopljen.", + "title": "Sony Bravia TV" + } + } + }, + "options": { + "step": { + "user": { + "data": { + "ignored_sources": "Seznam prezrtih virov" + }, + "title": "Mo\u017enosti za Sony Bravia TV" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/braviatv/.translations/zh-Hant.json b/homeassistant/components/braviatv/.translations/zh-Hant.json index 8f8c84b952bf..cf2c87f4c93a 100644 --- a/homeassistant/components/braviatv/.translations/zh-Hant.json +++ b/homeassistant/components/braviatv/.translations/zh-Hant.json @@ -34,6 +34,5 @@ "title": "Sony Bravia \u96fb\u8996\u9078\u9805" } } - }, - "title": "Sony Bravia \u96fb\u8996" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ca.json b/homeassistant/components/brother/.translations/ca.json index 6c5e66765b9e..bf96f4c3d58e 100644 --- a/homeassistant/components/brother/.translations/ca.json +++ b/homeassistant/components/brother/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Impressora Brother descoberta" } } - }, - "title": "Impressora Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/da.json b/homeassistant/components/brother/.translations/da.json index c89e9e5964bb..6d9edc1fcad9 100644 --- a/homeassistant/components/brother/.translations/da.json +++ b/homeassistant/components/brother/.translations/da.json @@ -27,6 +27,5 @@ "title": "Fandt Brother-printer" } } - }, - "title": "Brother-printer" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/de.json b/homeassistant/components/brother/.translations/de.json index 1067e85f1f61..fb1a14203971 100644 --- a/homeassistant/components/brother/.translations/de.json +++ b/homeassistant/components/brother/.translations/de.json @@ -27,6 +27,5 @@ "title": "Brother-Drucker entdeckt" } } - }, - "title": "Brother Drucker" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/en.json b/homeassistant/components/brother/.translations/en.json index 8a01f48e7ff3..6d4534780837 100644 --- a/homeassistant/components/brother/.translations/en.json +++ b/homeassistant/components/brother/.translations/en.json @@ -27,6 +27,5 @@ "title": "Discovered Brother Printer" } } - }, - "title": "Brother Printer" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/es-419.json b/homeassistant/components/brother/.translations/es-419.json index 5ee8c5eb77f6..337f5b624fbe 100644 --- a/homeassistant/components/brother/.translations/es-419.json +++ b/homeassistant/components/brother/.translations/es-419.json @@ -8,6 +8,5 @@ "connection_error": "Error de conexi\u00f3n.", "snmp_error": "El servidor SNMP est\u00e1 apagado o la impresora no es compatible." } - }, - "title": "Impresora Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/es.json b/homeassistant/components/brother/.translations/es.json index 8c805c6cac48..7773a02d0b62 100644 --- a/homeassistant/components/brother/.translations/es.json +++ b/homeassistant/components/brother/.translations/es.json @@ -27,6 +27,5 @@ "title": "Impresora Brother encontrada" } } - }, - "title": "Impresora Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/fr.json b/homeassistant/components/brother/.translations/fr.json index 6e5b1668ae37..9dba52055aca 100644 --- a/homeassistant/components/brother/.translations/fr.json +++ b/homeassistant/components/brother/.translations/fr.json @@ -27,6 +27,5 @@ "title": "Imprimante Brother d\u00e9couverte" } } - }, - "title": "Imprimante Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/hu.json b/homeassistant/components/brother/.translations/hu.json index 88c6677f1ec4..77bdb4b6bf10 100644 --- a/homeassistant/components/brother/.translations/hu.json +++ b/homeassistant/components/brother/.translations/hu.json @@ -27,6 +27,5 @@ "title": "Felfedezett Brother nyomtat\u00f3" } } - }, - "title": "Brother nyomtat\u00f3" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/it.json b/homeassistant/components/brother/.translations/it.json index 768d76deb8f7..7631709d0b06 100644 --- a/homeassistant/components/brother/.translations/it.json +++ b/homeassistant/components/brother/.translations/it.json @@ -27,6 +27,5 @@ "title": "Trovata stampante Brother" } } - }, - "title": "Stampante Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ko.json b/homeassistant/components/brother/.translations/ko.json index 9b3c75bffb4b..5b79c87c175e 100644 --- a/homeassistant/components/brother/.translations/ko.json +++ b/homeassistant/components/brother/.translations/ko.json @@ -27,6 +27,5 @@ "title": "\ubc1c\uacac\ub41c \ube0c\ub77c\ub354 \ud504\ub9b0\ud130" } } - }, - "title": "\ube0c\ub77c\ub354 \ud504\ub9b0\ud130" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/lb.json b/homeassistant/components/brother/.translations/lb.json index 6ebb11f72906..d8d49b0b3ac8 100644 --- a/homeassistant/components/brother/.translations/lb.json +++ b/homeassistant/components/brother/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Entdeckten Brother Printer" } } - }, - "title": "Brother Printer" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/nl.json b/homeassistant/components/brother/.translations/nl.json index 4563adfb0d7b..2dfef67fb18b 100644 --- a/homeassistant/components/brother/.translations/nl.json +++ b/homeassistant/components/brother/.translations/nl.json @@ -27,6 +27,5 @@ "title": "Ontdekte Brother Printer" } } - }, - "title": "Brother Printer" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/no.json b/homeassistant/components/brother/.translations/no.json index b2cd8953d691..c612e5f89860 100644 --- a/homeassistant/components/brother/.translations/no.json +++ b/homeassistant/components/brother/.translations/no.json @@ -27,6 +27,5 @@ "title": "Oppdaget Brother-Skriveren" } } - }, - "title": "Brother skriver" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/pl.json b/homeassistant/components/brother/.translations/pl.json index 4d888941fc17..94f23b8b5d28 100644 --- a/homeassistant/components/brother/.translations/pl.json +++ b/homeassistant/components/brother/.translations/pl.json @@ -27,6 +27,5 @@ "title": "Wykryto drukark\u0119 Brother" } } - }, - "title": "Drukarka Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/pt-BR.json b/homeassistant/components/brother/.translations/pt-BR.json index 3616626b123b..b59501e8cfbe 100644 --- a/homeassistant/components/brother/.translations/pt-BR.json +++ b/homeassistant/components/brother/.translations/pt-BR.json @@ -18,6 +18,5 @@ "title": "Impressora Brother" } } - }, - "title": "Impressora Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/ru.json b/homeassistant/components/brother/.translations/ru.json index b921f2914c61..66c4df1ac6a9 100644 --- a/homeassistant/components/brother/.translations/ru.json +++ b/homeassistant/components/brother/.translations/ru.json @@ -27,6 +27,5 @@ "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0442\u0435\u0440 Brother" } } - }, - "title": "\u041f\u0440\u0438\u043d\u0442\u0435\u0440 Brother" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/sl.json b/homeassistant/components/brother/.translations/sl.json index e1b7cc0aece5..91085e32ba17 100644 --- a/homeassistant/components/brother/.translations/sl.json +++ b/homeassistant/components/brother/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Odkriti Brother tiskalniki" } } - }, - "title": "Brother Tiskalnik" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/sv.json b/homeassistant/components/brother/.translations/sv.json index 8843d7387a2b..ad6372c423ee 100644 --- a/homeassistant/components/brother/.translations/sv.json +++ b/homeassistant/components/brother/.translations/sv.json @@ -27,6 +27,5 @@ "title": "Uppt\u00e4ckte Brother-skrivare" } } - }, - "title": "Brother-skrivare" + } } \ No newline at end of file diff --git a/homeassistant/components/brother/.translations/zh-Hant.json b/homeassistant/components/brother/.translations/zh-Hant.json index 025fe7674b3c..cf268cb4563d 100644 --- a/homeassistant/components/brother/.translations/zh-Hant.json +++ b/homeassistant/components/brother/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Brother \u5370\u8868\u6a5f" } } - }, - "title": "Brother \u5370\u8868\u6a5f" + } } \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/af.json b/homeassistant/components/calendar/.translations/af.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ar.json b/homeassistant/components/calendar/.translations/ar.json new file mode 100644 index 000000000000..bec892cb35f3 --- /dev/null +++ b/homeassistant/components/calendar/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u062a\u0642\u0648\u064a\u0645" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/bg.json b/homeassistant/components/calendar/.translations/bg.json new file mode 100644 index 000000000000..6552f959bea1 --- /dev/null +++ b/homeassistant/components/calendar/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/bs.json b/homeassistant/components/calendar/.translations/bs.json new file mode 100644 index 000000000000..0f65da1b8f56 --- /dev/null +++ b/homeassistant/components/calendar/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Kalendar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ca.json b/homeassistant/components/calendar/.translations/ca.json new file mode 100644 index 000000000000..3209d2e34df0 --- /dev/null +++ b/homeassistant/components/calendar/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Calendari" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/cs.json b/homeassistant/components/calendar/.translations/cs.json new file mode 100644 index 000000000000..1ef286616de4 --- /dev/null +++ b/homeassistant/components/calendar/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Kalend\u00e1\u0159" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/cy.json b/homeassistant/components/calendar/.translations/cy.json new file mode 100644 index 000000000000..89ab8601d0bf --- /dev/null +++ b/homeassistant/components/calendar/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Calendr" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/da.json b/homeassistant/components/calendar/.translations/da.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/de.json b/homeassistant/components/calendar/.translations/de.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/el.json b/homeassistant/components/calendar/.translations/el.json new file mode 100644 index 000000000000..a2481a086a6d --- /dev/null +++ b/homeassistant/components/calendar/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03bf" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/en.json b/homeassistant/components/calendar/.translations/en.json new file mode 100644 index 000000000000..0eac68d8a36c --- /dev/null +++ b/homeassistant/components/calendar/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Calendar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/es-419.json b/homeassistant/components/calendar/.translations/es-419.json new file mode 100644 index 000000000000..38a154a4b108 --- /dev/null +++ b/homeassistant/components/calendar/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Calendario" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/es.json b/homeassistant/components/calendar/.translations/es.json new file mode 100644 index 000000000000..38a154a4b108 --- /dev/null +++ b/homeassistant/components/calendar/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Calendario" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/et.json b/homeassistant/components/calendar/.translations/et.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/eu.json b/homeassistant/components/calendar/.translations/eu.json new file mode 100644 index 000000000000..a478c39e279a --- /dev/null +++ b/homeassistant/components/calendar/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Egutegia" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/fa.json b/homeassistant/components/calendar/.translations/fa.json new file mode 100644 index 000000000000..15fc7951a2e1 --- /dev/null +++ b/homeassistant/components/calendar/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u062a\u0642\u0648\u06cc\u0645" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/fi.json b/homeassistant/components/calendar/.translations/fi.json new file mode 100644 index 000000000000..9a11644e4ab9 --- /dev/null +++ b/homeassistant/components/calendar/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kalenteri" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/fr.json b/homeassistant/components/calendar/.translations/fr.json new file mode 100644 index 000000000000..ba981a80defe --- /dev/null +++ b/homeassistant/components/calendar/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Calendrier" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/gsw.json b/homeassistant/components/calendar/.translations/gsw.json new file mode 100644 index 000000000000..01d71d8e1269 --- /dev/null +++ b/homeassistant/components/calendar/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Kal\u00e4nder" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/he.json b/homeassistant/components/calendar/.translations/he.json new file mode 100644 index 000000000000..5bd795c98f5d --- /dev/null +++ b/homeassistant/components/calendar/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05dc\u05d5\u05bc\u05d7\u05b7 \u05e9\u05c1\u05b8\u05e0\u05b8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/hr.json b/homeassistant/components/calendar/.translations/hr.json new file mode 100644 index 000000000000..0f65da1b8f56 --- /dev/null +++ b/homeassistant/components/calendar/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Kalendar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/hu.json b/homeassistant/components/calendar/.translations/hu.json new file mode 100644 index 000000000000..27caf3918695 --- /dev/null +++ b/homeassistant/components/calendar/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Napt\u00e1r" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/hy.json b/homeassistant/components/calendar/.translations/hy.json new file mode 100644 index 000000000000..6ee3308d4145 --- /dev/null +++ b/homeassistant/components/calendar/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0555\u0580\u0561\u0581\u0578\u0582\u0575\u0581" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/id.json b/homeassistant/components/calendar/.translations/id.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/is.json b/homeassistant/components/calendar/.translations/is.json new file mode 100644 index 000000000000..09c1bccc8ec8 --- /dev/null +++ b/homeassistant/components/calendar/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Dagatal" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/it.json b/homeassistant/components/calendar/.translations/it.json new file mode 100644 index 000000000000..38a154a4b108 --- /dev/null +++ b/homeassistant/components/calendar/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Calendario" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ja.json b/homeassistant/components/calendar/.translations/ja.json new file mode 100644 index 000000000000..f81d502bfeca --- /dev/null +++ b/homeassistant/components/calendar/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30ab\u30ec\u30f3\u30c0\u30fc" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ko.json b/homeassistant/components/calendar/.translations/ko.json new file mode 100644 index 000000000000..7e52dc3b9dd7 --- /dev/null +++ b/homeassistant/components/calendar/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc77c\uc815" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/lb.json b/homeassistant/components/calendar/.translations/lb.json new file mode 100644 index 000000000000..5c2ca2dd4a9b --- /dev/null +++ b/homeassistant/components/calendar/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Kalenner" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/lv.json b/homeassistant/components/calendar/.translations/lv.json new file mode 100644 index 000000000000..4048cac0a397 --- /dev/null +++ b/homeassistant/components/calendar/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Kalend\u0101rs" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/nb.json b/homeassistant/components/calendar/.translations/nb.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/nl.json b/homeassistant/components/calendar/.translations/nl.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/nn.json b/homeassistant/components/calendar/.translations/nn.json new file mode 100644 index 000000000000..0f65da1b8f56 --- /dev/null +++ b/homeassistant/components/calendar/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Kalendar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/pl.json b/homeassistant/components/calendar/.translations/pl.json new file mode 100644 index 000000000000..f813b69b68f7 --- /dev/null +++ b/homeassistant/components/calendar/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Kalendarz" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/pt-BR.json b/homeassistant/components/calendar/.translations/pt-BR.json new file mode 100644 index 000000000000..c83427ddc84a --- /dev/null +++ b/homeassistant/components/calendar/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Calend\u00e1rio" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/pt.json b/homeassistant/components/calendar/.translations/pt.json new file mode 100644 index 000000000000..c83427ddc84a --- /dev/null +++ b/homeassistant/components/calendar/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Calend\u00e1rio" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ro.json b/homeassistant/components/calendar/.translations/ro.json new file mode 100644 index 000000000000..0eac68d8a36c --- /dev/null +++ b/homeassistant/components/calendar/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Calendar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/ru.json b/homeassistant/components/calendar/.translations/ru.json new file mode 100644 index 000000000000..e62c8f2897c2 --- /dev/null +++ b/homeassistant/components/calendar/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/sk.json b/homeassistant/components/calendar/.translations/sk.json new file mode 100644 index 000000000000..f529e83a5947 --- /dev/null +++ b/homeassistant/components/calendar/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Kalend\u00e1r" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/sl.json b/homeassistant/components/calendar/.translations/sl.json new file mode 100644 index 000000000000..83ba7739cdaa --- /dev/null +++ b/homeassistant/components/calendar/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Koledar" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/sv.json b/homeassistant/components/calendar/.translations/sv.json new file mode 100644 index 000000000000..ba22ae540fca --- /dev/null +++ b/homeassistant/components/calendar/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Kalender" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/te.json b/homeassistant/components/calendar/.translations/te.json new file mode 100644 index 000000000000..8194b8c28f00 --- /dev/null +++ b/homeassistant/components/calendar/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c15\u0c4d\u0c2f\u0c3e\u0c32\u0c46\u0c02\u0c21\u0c30\u0c41" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/th.json b/homeassistant/components/calendar/.translations/th.json new file mode 100644 index 000000000000..ec9862732cbe --- /dev/null +++ b/homeassistant/components/calendar/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1b\u0e0f\u0e34\u0e17\u0e34\u0e19" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/tr.json b/homeassistant/components/calendar/.translations/tr.json new file mode 100644 index 000000000000..1e330ed3f577 --- /dev/null +++ b/homeassistant/components/calendar/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Takvim" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/uk.json b/homeassistant/components/calendar/.translations/uk.json new file mode 100644 index 000000000000..6552f959bea1 --- /dev/null +++ b/homeassistant/components/calendar/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/vi.json b/homeassistant/components/calendar/.translations/vi.json new file mode 100644 index 000000000000..4ee82e7a4658 --- /dev/null +++ b/homeassistant/components/calendar/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "L\u1ecbch" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/zh-Hans.json b/homeassistant/components/calendar/.translations/zh-Hans.json new file mode 100644 index 000000000000..5b4f640364a3 --- /dev/null +++ b/homeassistant/components/calendar/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u65e5\u5386" +} \ No newline at end of file diff --git a/homeassistant/components/calendar/.translations/zh-Hant.json b/homeassistant/components/calendar/.translations/zh-Hant.json new file mode 100644 index 000000000000..3953cc142837 --- /dev/null +++ b/homeassistant/components/calendar/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u884c\u4e8b\u66c6" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/af.json b/homeassistant/components/camera/.translations/af.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ar.json b/homeassistant/components/camera/.translations/ar.json new file mode 100644 index 000000000000..08b820644935 --- /dev/null +++ b/homeassistant/components/camera/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0643\u0627\u0645\u064a\u0631\u0627" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/bg.json b/homeassistant/components/camera/.translations/bg.json new file mode 100644 index 000000000000..f1a15a7a821b --- /dev/null +++ b/homeassistant/components/camera/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043c\u0435\u0440\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/bs.json b/homeassistant/components/camera/.translations/bs.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ca.json b/homeassistant/components/camera/.translations/ca.json new file mode 100644 index 000000000000..418353464215 --- /dev/null +++ b/homeassistant/components/camera/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e0mera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/cs.json b/homeassistant/components/camera/.translations/cs.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/cy.json b/homeassistant/components/camera/.translations/cy.json new file mode 100644 index 000000000000..cc881ee406cd --- /dev/null +++ b/homeassistant/components/camera/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Camera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/da.json b/homeassistant/components/camera/.translations/da.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/de.json b/homeassistant/components/camera/.translations/de.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/el.json b/homeassistant/components/camera/.translations/el.json new file mode 100644 index 000000000000..7203c2118d2e --- /dev/null +++ b/homeassistant/components/camera/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u039a\u03ac\u03bc\u03b5\u03c1\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/en.json b/homeassistant/components/camera/.translations/en.json new file mode 100644 index 000000000000..cc881ee406cd --- /dev/null +++ b/homeassistant/components/camera/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Camera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/es-419.json b/homeassistant/components/camera/.translations/es-419.json new file mode 100644 index 000000000000..e3c81d8bb6ff --- /dev/null +++ b/homeassistant/components/camera/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e1mara" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/es.json b/homeassistant/components/camera/.translations/es.json new file mode 100644 index 000000000000..e3c81d8bb6ff --- /dev/null +++ b/homeassistant/components/camera/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e1mara" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/et.json b/homeassistant/components/camera/.translations/et.json new file mode 100644 index 000000000000..1003a79e3c47 --- /dev/null +++ b/homeassistant/components/camera/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Kaamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/eu.json b/homeassistant/components/camera/.translations/eu.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/fa.json b/homeassistant/components/camera/.translations/fa.json new file mode 100644 index 000000000000..da13f0eb55e1 --- /dev/null +++ b/homeassistant/components/camera/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u062f\u0648\u0631\u0628\u06cc\u0646" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/fi.json b/homeassistant/components/camera/.translations/fi.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/fr.json b/homeassistant/components/camera/.translations/fr.json new file mode 100644 index 000000000000..bbda5dfdef22 --- /dev/null +++ b/homeassistant/components/camera/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Cam\u00e9ra" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/gsw.json b/homeassistant/components/camera/.translations/gsw.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/he.json b/homeassistant/components/camera/.translations/he.json new file mode 100644 index 000000000000..e1980ddd88e3 --- /dev/null +++ b/homeassistant/components/camera/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05b7\u05e6\u05dc\u05b5\u05de\u05b8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/hr.json b/homeassistant/components/camera/.translations/hr.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/hu.json b/homeassistant/components/camera/.translations/hu.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/hy.json b/homeassistant/components/camera/.translations/hy.json new file mode 100644 index 000000000000..dd0f23055623 --- /dev/null +++ b/homeassistant/components/camera/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054f\u0565\u057d\u0561\u056d\u0581\u056b\u056f" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/id.json b/homeassistant/components/camera/.translations/id.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/is.json b/homeassistant/components/camera/.translations/is.json new file mode 100644 index 000000000000..b15ca2701483 --- /dev/null +++ b/homeassistant/components/camera/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Myndav\u00e9l" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/it.json b/homeassistant/components/camera/.translations/it.json new file mode 100644 index 000000000000..14b7f2226fe6 --- /dev/null +++ b/homeassistant/components/camera/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Telecamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ja.json b/homeassistant/components/camera/.translations/ja.json new file mode 100644 index 000000000000..6cd37d2c0ad5 --- /dev/null +++ b/homeassistant/components/camera/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30ab\u30e1\u30e9" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ko.json b/homeassistant/components/camera/.translations/ko.json new file mode 100644 index 000000000000..207991703087 --- /dev/null +++ b/homeassistant/components/camera/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uce74\uba54\ub77c" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/lb.json b/homeassistant/components/camera/.translations/lb.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/lv.json b/homeassistant/components/camera/.translations/lv.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/nb.json b/homeassistant/components/camera/.translations/nb.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/nl.json b/homeassistant/components/camera/.translations/nl.json new file mode 100644 index 000000000000..cc881ee406cd --- /dev/null +++ b/homeassistant/components/camera/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Camera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/nn.json b/homeassistant/components/camera/.translations/nn.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/pl.json b/homeassistant/components/camera/.translations/pl.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/pt-BR.json b/homeassistant/components/camera/.translations/pt-BR.json new file mode 100644 index 000000000000..a72d99e23ab8 --- /dev/null +++ b/homeassistant/components/camera/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e2mera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/pt.json b/homeassistant/components/camera/.translations/pt.json new file mode 100644 index 000000000000..02fc2b75f947 --- /dev/null +++ b/homeassistant/components/camera/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e2mara" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ro.json b/homeassistant/components/camera/.translations/ro.json new file mode 100644 index 000000000000..cc881ee406cd --- /dev/null +++ b/homeassistant/components/camera/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Camera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/ru.json b/homeassistant/components/camera/.translations/ru.json new file mode 100644 index 000000000000..f1a15a7a821b --- /dev/null +++ b/homeassistant/components/camera/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043c\u0435\u0440\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/sk.json b/homeassistant/components/camera/.translations/sk.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/sl.json b/homeassistant/components/camera/.translations/sl.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/sv.json b/homeassistant/components/camera/.translations/sv.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/te.json b/homeassistant/components/camera/.translations/te.json new file mode 100644 index 000000000000..b11756de7a38 --- /dev/null +++ b/homeassistant/components/camera/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c15\u0c46\u0c2e\u0c47\u0c30\u0c3e" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/th.json b/homeassistant/components/camera/.translations/th.json new file mode 100644 index 000000000000..adeed7fbf39c --- /dev/null +++ b/homeassistant/components/camera/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e25\u0e49\u0e2d\u0e07" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/tr.json b/homeassistant/components/camera/.translations/tr.json new file mode 100644 index 000000000000..f3d16970c011 --- /dev/null +++ b/homeassistant/components/camera/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Kamera" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/uk.json b/homeassistant/components/camera/.translations/uk.json new file mode 100644 index 000000000000..f1a15a7a821b --- /dev/null +++ b/homeassistant/components/camera/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u0430\u043c\u0435\u0440\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/vi.json b/homeassistant/components/camera/.translations/vi.json new file mode 100644 index 000000000000..2636db35b4e2 --- /dev/null +++ b/homeassistant/components/camera/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "M\u00e1y \u1ea3nh" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/zh-Hans.json b/homeassistant/components/camera/.translations/zh-Hans.json new file mode 100644 index 000000000000..5d04ffdfc0e3 --- /dev/null +++ b/homeassistant/components/camera/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u6444\u50cf\u5934" +} \ No newline at end of file diff --git a/homeassistant/components/camera/.translations/zh-Hant.json b/homeassistant/components/camera/.translations/zh-Hant.json new file mode 100644 index 000000000000..1cc988e8bed5 --- /dev/null +++ b/homeassistant/components/camera/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u651d\u5f71\u6a5f" +} \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/bg.json b/homeassistant/components/cast/.translations/bg.json index 1a882fd23bd0..746278595d06 100644 --- a/homeassistant/components/cast/.translations/bg.json +++ b/homeassistant/components/cast/.translations/bg.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ca.json b/homeassistant/components/cast/.translations/ca.json index bf99c857f73e..0b358293304d 100644 --- a/homeassistant/components/cast/.translations/ca.json +++ b/homeassistant/components/cast/.translations/ca.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/cs.json b/homeassistant/components/cast/.translations/cs.json index 99138d836520..79694e427caf 100644 --- a/homeassistant/components/cast/.translations/cs.json +++ b/homeassistant/components/cast/.translations/cs.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/da.json b/homeassistant/components/cast/.translations/da.json index 45dcec602311..3230e215bff7 100644 --- a/homeassistant/components/cast/.translations/da.json +++ b/homeassistant/components/cast/.translations/da.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/de.json b/homeassistant/components/cast/.translations/de.json index d2f01f33bfec..5a87e714bf6d 100644 --- a/homeassistant/components/cast/.translations/de.json +++ b/homeassistant/components/cast/.translations/de.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/en.json b/homeassistant/components/cast/.translations/en.json index 2a386a2c08c1..81ba0457240b 100644 --- a/homeassistant/components/cast/.translations/en.json +++ b/homeassistant/components/cast/.translations/en.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/es-419.json b/homeassistant/components/cast/.translations/es-419.json index f23bc80877c5..c4374997d8a5 100644 --- a/homeassistant/components/cast/.translations/es-419.json +++ b/homeassistant/components/cast/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/es.json b/homeassistant/components/cast/.translations/es.json index dd52c6360d19..3a5f56532377 100644 --- a/homeassistant/components/cast/.translations/es.json +++ b/homeassistant/components/cast/.translations/es.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/et.json b/homeassistant/components/cast/.translations/et.json index a98a23c7f0bd..0e652624ef61 100644 --- a/homeassistant/components/cast/.translations/et.json +++ b/homeassistant/components/cast/.translations/et.json @@ -5,6 +5,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/fr.json b/homeassistant/components/cast/.translations/fr.json index b004a2113c75..a4fef5a7c525 100644 --- a/homeassistant/components/cast/.translations/fr.json +++ b/homeassistant/components/cast/.translations/fr.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/he.json b/homeassistant/components/cast/.translations/he.json index 95646e7c7fc5..019561c2b87a 100644 --- a/homeassistant/components/cast/.translations/he.json +++ b/homeassistant/components/cast/.translations/he.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/hr.json b/homeassistant/components/cast/.translations/hr.json index 6d11110f1e2c..e3f09f8b09c0 100644 --- a/homeassistant/components/cast/.translations/hr.json +++ b/homeassistant/components/cast/.translations/hr.json @@ -5,6 +5,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/hu.json b/homeassistant/components/cast/.translations/hu.json index 28421b72e1ff..83f0f959c71d 100644 --- a/homeassistant/components/cast/.translations/hu.json +++ b/homeassistant/components/cast/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/id.json b/homeassistant/components/cast/.translations/id.json index 80d59ed8f533..f4d66facce1d 100644 --- a/homeassistant/components/cast/.translations/id.json +++ b/homeassistant/components/cast/.translations/id.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/it.json b/homeassistant/components/cast/.translations/it.json index e7180c39a996..ba3cdc0645d3 100644 --- a/homeassistant/components/cast/.translations/it.json +++ b/homeassistant/components/cast/.translations/it.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ja.json b/homeassistant/components/cast/.translations/ja.json index 07660869dbe9..f078c7c13e91 100644 --- a/homeassistant/components/cast/.translations/ja.json +++ b/homeassistant/components/cast/.translations/ja.json @@ -9,6 +9,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ko.json b/homeassistant/components/cast/.translations/ko.json index a5ebfa778dad..c41b24077923 100644 --- a/homeassistant/components/cast/.translations/ko.json +++ b/homeassistant/components/cast/.translations/ko.json @@ -10,6 +10,5 @@ "title": "Google \uce90\uc2a4\ud2b8" } } - }, - "title": "Google \uce90\uc2a4\ud2b8" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/lb.json b/homeassistant/components/cast/.translations/lb.json index 0149962a5e04..9ea5e36b3791 100644 --- a/homeassistant/components/cast/.translations/lb.json +++ b/homeassistant/components/cast/.translations/lb.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/nl.json b/homeassistant/components/cast/.translations/nl.json index dddcb7869099..b22c25f1292b 100644 --- a/homeassistant/components/cast/.translations/nl.json +++ b/homeassistant/components/cast/.translations/nl.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/nn.json b/homeassistant/components/cast/.translations/nn.json index f51d51301e38..0c7d56d3ad81 100644 --- a/homeassistant/components/cast/.translations/nn.json +++ b/homeassistant/components/cast/.translations/nn.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/no.json b/homeassistant/components/cast/.translations/no.json index ee5fddaff760..de041d89f811 100644 --- a/homeassistant/components/cast/.translations/no.json +++ b/homeassistant/components/cast/.translations/no.json @@ -10,6 +10,5 @@ "title": "" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pl.json b/homeassistant/components/cast/.translations/pl.json index 2dff5973a2cf..26897da5da3c 100644 --- a/homeassistant/components/cast/.translations/pl.json +++ b/homeassistant/components/cast/.translations/pl.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pt-BR.json b/homeassistant/components/cast/.translations/pt-BR.json index 76a9f0d2b001..25c0adf866fd 100644 --- a/homeassistant/components/cast/.translations/pt-BR.json +++ b/homeassistant/components/cast/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pt.json b/homeassistant/components/cast/.translations/pt.json index 2eb62fd0a187..dcf0391c4201 100644 --- a/homeassistant/components/cast/.translations/pt.json +++ b/homeassistant/components/cast/.translations/pt.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ro.json b/homeassistant/components/cast/.translations/ro.json index 1595f47e55dd..4dd8c04c3815 100644 --- a/homeassistant/components/cast/.translations/ro.json +++ b/homeassistant/components/cast/.translations/ro.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ru.json b/homeassistant/components/cast/.translations/ru.json index a44b3d91ed7b..fae0cd417ffb 100644 --- a/homeassistant/components/cast/.translations/ru.json +++ b/homeassistant/components/cast/.translations/ru.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/sl.json b/homeassistant/components/cast/.translations/sl.json index 9fde52f421d7..eb4e930af865 100644 --- a/homeassistant/components/cast/.translations/sl.json +++ b/homeassistant/components/cast/.translations/sl.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/sv.json b/homeassistant/components/cast/.translations/sv.json index c712eef68866..937604b1000b 100644 --- a/homeassistant/components/cast/.translations/sv.json +++ b/homeassistant/components/cast/.translations/sv.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/th.json b/homeassistant/components/cast/.translations/th.json index e430e4135c43..9806057716a8 100644 --- a/homeassistant/components/cast/.translations/th.json +++ b/homeassistant/components/cast/.translations/th.json @@ -9,6 +9,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/vi.json b/homeassistant/components/cast/.translations/vi.json index 9d0e96167a98..7e75cfce4fab 100644 --- a/homeassistant/components/cast/.translations/vi.json +++ b/homeassistant/components/cast/.translations/vi.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/zh-Hans.json b/homeassistant/components/cast/.translations/zh-Hans.json index 906f939166bd..9f834a989907 100644 --- a/homeassistant/components/cast/.translations/zh-Hans.json +++ b/homeassistant/components/cast/.translations/zh-Hans.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/zh-Hant.json b/homeassistant/components/cast/.translations/zh-Hant.json index b95cab0f447f..0b7101b5cc8e 100644 --- a/homeassistant/components/cast/.translations/zh-Hant.json +++ b/homeassistant/components/cast/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "Google Cast" } } - }, - "title": "Google Cast" + } } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/af.json b/homeassistant/components/climate/.translations/af.json new file mode 100644 index 000000000000..89e000dff1c7 --- /dev/null +++ b/homeassistant/components/climate/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Klimaat" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/ar.json b/homeassistant/components/climate/.translations/ar.json new file mode 100644 index 000000000000..05fc8ce11194 --- /dev/null +++ b/homeassistant/components/climate/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u0637\u0642\u0633" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/bg.json b/homeassistant/components/climate/.translations/bg.json index ac1b05b096a6..9d918323c5ad 100644 --- a/homeassistant/components/climate/.translations/bg.json +++ b/homeassistant/components/climate/.translations/bg.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0430\u0442\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438", "hvac_mode_changed": "{entity_name} \u0420\u0435\u0436\u0438\u043c \u043d\u0430 \u041e\u0412\u041a \u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438" } - } + }, + "title": "\u041a\u043b\u0438\u043c\u0430\u0442" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/bs.json b/homeassistant/components/climate/.translations/bs.json new file mode 100644 index 000000000000..e8feb64aa878 --- /dev/null +++ b/homeassistant/components/climate/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Klima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/ca.json b/homeassistant/components/climate/.translations/ca.json index bde91c26b7ed..5d6c73db0593 100644 --- a/homeassistant/components/climate/.translations/ca.json +++ b/homeassistant/components/climate/.translations/ca.json @@ -13,5 +13,6 @@ "current_temperature_changed": "Ha canviat la temperatura mesurada per {entity_name}", "hvac_mode_changed": "El mode HVAC de {entity_name} ha canviat" } - } + }, + "title": "Climatitzaci\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/cs.json b/homeassistant/components/climate/.translations/cs.json new file mode 100644 index 000000000000..37d9647e01ae --- /dev/null +++ b/homeassistant/components/climate/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Klimatizace" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/cy.json b/homeassistant/components/climate/.translations/cy.json new file mode 100644 index 000000000000..0f0d63a675e4 --- /dev/null +++ b/homeassistant/components/climate/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Hinsawdd" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/da.json b/homeassistant/components/climate/.translations/da.json index 78731dd1577b..cbb10514f8ad 100644 --- a/homeassistant/components/climate/.translations/da.json +++ b/homeassistant/components/climate/.translations/da.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} m\u00e5lte temperatur \u00e6ndret", "hvac_mode_changed": "{entity_name} klimaanl\u00e6gstilstand \u00e6ndret" } - } + }, + "title": "Klima" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/de.json b/homeassistant/components/climate/.translations/de.json index 444c2cc460b9..c48a617f6781 100644 --- a/homeassistant/components/climate/.translations/de.json +++ b/homeassistant/components/climate/.translations/de.json @@ -13,5 +13,6 @@ "current_temperature_changed": "Gemessene Temperatur von {entity_name} ge\u00e4ndert", "hvac_mode_changed": "{entity_name} HVAC-Modus ge\u00e4ndert" } - } + }, + "title": "Klima" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/el.json b/homeassistant/components/climate/.translations/el.json new file mode 100644 index 000000000000..a4e6c9aeeaba --- /dev/null +++ b/homeassistant/components/climate/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a4\u03bf \u03ba\u03bb\u03af\u03bc\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/en.json b/homeassistant/components/climate/.translations/en.json index 2a56426e9886..e759dd7525d8 100644 --- a/homeassistant/components/climate/.translations/en.json +++ b/homeassistant/components/climate/.translations/en.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} measured temperature changed", "hvac_mode_changed": "{entity_name} HVAC mode changed" } - } + }, + "title": "Climate" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/es-419.json b/homeassistant/components/climate/.translations/es-419.json index f3b861b91956..a7de025af783 100644 --- a/homeassistant/components/climate/.translations/es-419.json +++ b/homeassistant/components/climate/.translations/es-419.json @@ -6,5 +6,6 @@ "condition_type": { "is_hvac_mode": "{entity_name} est\u00e1 configurado en un modo HVAC espec\u00edfico" } - } + }, + "title": "Clima" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/es.json b/homeassistant/components/climate/.translations/es.json index e873427e6948..25731f3b3ad3 100644 --- a/homeassistant/components/climate/.translations/es.json +++ b/homeassistant/components/climate/.translations/es.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} temperatura medida cambi\u00f3", "hvac_mode_changed": "{entity_name} Modo HVAC cambiado" } - } + }, + "title": "Climatizaci\u00f3n" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/et.json b/homeassistant/components/climate/.translations/et.json new file mode 100644 index 000000000000..6c81a5c1f762 --- /dev/null +++ b/homeassistant/components/climate/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Kliima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/eu.json b/homeassistant/components/climate/.translations/eu.json new file mode 100644 index 000000000000..4eb0277b457c --- /dev/null +++ b/homeassistant/components/climate/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Klimatizazioa" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/fa.json b/homeassistant/components/climate/.translations/fa.json new file mode 100644 index 000000000000..307571e2bce2 --- /dev/null +++ b/homeassistant/components/climate/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0622\u0628 \u0648 \u0647\u0648\u0627" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/fi.json b/homeassistant/components/climate/.translations/fi.json new file mode 100644 index 000000000000..592325be44e3 --- /dev/null +++ b/homeassistant/components/climate/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Ilmasto" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/fr.json b/homeassistant/components/climate/.translations/fr.json index 0358a60f180b..c4b087e22b33 100644 --- a/homeassistant/components/climate/.translations/fr.json +++ b/homeassistant/components/climate/.translations/fr.json @@ -13,5 +13,6 @@ "current_temperature_changed": "Changement de temp\u00e9rature mesur\u00e9e pour {entity_name}", "hvac_mode_changed": "Mode HVAC chang\u00e9 pour {entity_name}" } - } + }, + "title": "Thermostat" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/gsw.json b/homeassistant/components/climate/.translations/gsw.json new file mode 100644 index 000000000000..e8feb64aa878 --- /dev/null +++ b/homeassistant/components/climate/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Klima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/he.json b/homeassistant/components/climate/.translations/he.json new file mode 100644 index 000000000000..19a1456e97d1 --- /dev/null +++ b/homeassistant/components/climate/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d0\u05b7\u05e7\u05dc\u05b4\u05d9\u05dd" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/hi.json b/homeassistant/components/climate/.translations/hi.json new file mode 100644 index 000000000000..543b7d512511 --- /dev/null +++ b/homeassistant/components/climate/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u091c\u0932\u0935\u093e\u092f\u0941" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/hr.json b/homeassistant/components/climate/.translations/hr.json new file mode 100644 index 000000000000..e8feb64aa878 --- /dev/null +++ b/homeassistant/components/climate/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Klima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/hu.json b/homeassistant/components/climate/.translations/hu.json index 38d6cc68822c..dd7b55ba0498 100644 --- a/homeassistant/components/climate/.translations/hu.json +++ b/homeassistant/components/climate/.translations/hu.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} m\u00e9rt h\u0151m\u00e9rs\u00e9klete megv\u00e1ltozott", "hvac_mode_changed": "{entity_name} f\u0171t\u00e9s, szell\u0151z\u00e9s \u00e9s l\u00e9gkondicion\u00e1l\u00e1s (HVAC) \u00fczemm\u00f3d megv\u00e1ltozott" } - } + }, + "title": "H\u0171t\u00e9s/f\u0171t\u00e9s" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/hy.json b/homeassistant/components/climate/.translations/hy.json new file mode 100644 index 000000000000..9b63c0e17b35 --- /dev/null +++ b/homeassistant/components/climate/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053f\u056c\u056b\u0574\u0561" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/id.json b/homeassistant/components/climate/.translations/id.json new file mode 100644 index 000000000000..7834c7ddfb34 --- /dev/null +++ b/homeassistant/components/climate/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Cuaca" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/is.json b/homeassistant/components/climate/.translations/is.json new file mode 100644 index 000000000000..8d3595d3163c --- /dev/null +++ b/homeassistant/components/climate/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Loftslag" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/it.json b/homeassistant/components/climate/.translations/it.json index 25a09b7d66da..566d431a7b7c 100644 --- a/homeassistant/components/climate/.translations/it.json +++ b/homeassistant/components/climate/.translations/it.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} temperatura misurata cambiata", "hvac_mode_changed": "{entity_name} modalit\u00e0 HVAC modificata" } - } + }, + "title": "Termostato" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/ko.json b/homeassistant/components/climate/.translations/ko.json index 299172958e82..769e02930386 100644 --- a/homeassistant/components/climate/.translations/ko.json +++ b/homeassistant/components/climate/.translations/ko.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} \uc774(\uac00) \uc628\ub3c4 \ubcc0\ud654\ub97c \uac10\uc9c0\ud560 \ub54c", "hvac_mode_changed": "{entity_name} HVAC \ubaa8\ub4dc\uac00 \ubcc0\uacbd\ub420 \ub54c" } - } + }, + "title": "\uacf5\uc870\uae30\uae30" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/lb.json b/homeassistant/components/climate/.translations/lb.json index 2b6ca061fd87..a66dc687494f 100644 --- a/homeassistant/components/climate/.translations/lb.json +++ b/homeassistant/components/climate/.translations/lb.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} gemoossen Temperatur ge\u00e4nnert", "hvac_mode_changed": "{entity_name} HVAC Modus ge\u00e4nnert" } - } + }, + "title": "Klima" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/lv.json b/homeassistant/components/climate/.translations/lv.json new file mode 100644 index 000000000000..70acb19f0561 --- /dev/null +++ b/homeassistant/components/climate/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Klimats" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/nb.json b/homeassistant/components/climate/.translations/nb.json new file mode 100644 index 000000000000..e8feb64aa878 --- /dev/null +++ b/homeassistant/components/climate/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Klima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/nl.json b/homeassistant/components/climate/.translations/nl.json index 87e16c1c885a..58f2c37536df 100644 --- a/homeassistant/components/climate/.translations/nl.json +++ b/homeassistant/components/climate/.translations/nl.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} gemeten temperatuur veranderd", "hvac_mode_changed": "{entity_name} HVAC-modus gewijzigd" } - } + }, + "title": "Klimaat" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/nn.json b/homeassistant/components/climate/.translations/nn.json new file mode 100644 index 000000000000..e8feb64aa878 --- /dev/null +++ b/homeassistant/components/climate/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Klima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/pl.json b/homeassistant/components/climate/.translations/pl.json index f2a09eee3ef6..5d9a8793c5f2 100644 --- a/homeassistant/components/climate/.translations/pl.json +++ b/homeassistant/components/climate/.translations/pl.json @@ -13,5 +13,6 @@ "current_temperature_changed": "zmieni si\u0119 zmierzona temperatura {entity_name}", "hvac_mode_changed": "zmieni si\u0119 tryb HVAC {entity_name}" } - } + }, + "title": "Klimat" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/pt-BR.json b/homeassistant/components/climate/.translations/pt-BR.json new file mode 100644 index 000000000000..741ab50a8acd --- /dev/null +++ b/homeassistant/components/climate/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Clima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/pt.json b/homeassistant/components/climate/.translations/pt.json new file mode 100644 index 000000000000..3633e0fb2f7c --- /dev/null +++ b/homeassistant/components/climate/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Climatiza\u00e7\u00e3o" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/ro.json b/homeassistant/components/climate/.translations/ro.json new file mode 100644 index 000000000000..741ab50a8acd --- /dev/null +++ b/homeassistant/components/climate/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Clima" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/ru.json b/homeassistant/components/climate/.translations/ru.json index 6a9c52be209b..04d324fb7854 100644 --- a/homeassistant/components/climate/.translations/ru.json +++ b/homeassistant/components/climate/.translations/ru.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b", "hvac_mode_changed": "{entity_name} \u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b" } - } + }, + "title": "\u041a\u043b\u0438\u043c\u0430\u0442" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/sk.json b/homeassistant/components/climate/.translations/sk.json new file mode 100644 index 000000000000..2a1e7aecb47e --- /dev/null +++ b/homeassistant/components/climate/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Klimatiz\u00e1cia" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/sl.json b/homeassistant/components/climate/.translations/sl.json index ecaf24fed80a..e4a6c67cc752 100644 --- a/homeassistant/components/climate/.translations/sl.json +++ b/homeassistant/components/climate/.translations/sl.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} izmerjena temperaturna sprememba", "hvac_mode_changed": "{entity_name} HVAC na\u010din spremenjen" } - } + }, + "title": "Klimat" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/sv.json b/homeassistant/components/climate/.translations/sv.json index 51fe05405499..64e4c06d95a9 100644 --- a/homeassistant/components/climate/.translations/sv.json +++ b/homeassistant/components/climate/.translations/sv.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} uppm\u00e4tt temperatur har \u00e4ndrats", "hvac_mode_changed": "{entity_name} HVAC-l\u00e4ge har \u00e4ndrats" } - } + }, + "title": "Klimat" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/te.json b/homeassistant/components/climate/.translations/te.json new file mode 100644 index 000000000000..d96cc9128d89 --- /dev/null +++ b/homeassistant/components/climate/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c35\u0c3e\u0c24\u0c3e\u0c35\u0c30\u0c23\u0c02" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/th.json b/homeassistant/components/climate/.translations/th.json new file mode 100644 index 000000000000..f80100c2faa0 --- /dev/null +++ b/homeassistant/components/climate/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e2a\u0e20\u0e32\u0e1e\u0e2d\u0e32\u0e01\u0e32\u0e28" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/tr.json b/homeassistant/components/climate/.translations/tr.json new file mode 100644 index 000000000000..899c17661879 --- /dev/null +++ b/homeassistant/components/climate/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "\u0130klim" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/uk.json b/homeassistant/components/climate/.translations/uk.json new file mode 100644 index 000000000000..53b5ff7ba685 --- /dev/null +++ b/homeassistant/components/climate/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u043b\u0456\u043c\u0430\u0442" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/vi.json b/homeassistant/components/climate/.translations/vi.json new file mode 100644 index 000000000000..8602253dd86c --- /dev/null +++ b/homeassistant/components/climate/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Kh\u00ed h\u1eadu" +} \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/zh-Hans.json b/homeassistant/components/climate/.translations/zh-Hans.json index 3459ef3b7987..4be2137810c2 100644 --- a/homeassistant/components/climate/.translations/zh-Hans.json +++ b/homeassistant/components/climate/.translations/zh-Hans.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name} \u6d4b\u91cf\u7684\u5ba4\u5185\u6e29\u5ea6\u53d8\u5316", "hvac_mode_changed": "{entity_name} \u7684\u8fd0\u884c\u6a21\u5f0f\u53d8\u5316" } - } + }, + "title": "\u7a7a\u8c03" } \ No newline at end of file diff --git a/homeassistant/components/climate/.translations/zh-Hant.json b/homeassistant/components/climate/.translations/zh-Hant.json index 28ff10f09f01..2e7c1839b080 100644 --- a/homeassistant/components/climate/.translations/zh-Hant.json +++ b/homeassistant/components/climate/.translations/zh-Hant.json @@ -13,5 +13,6 @@ "current_temperature_changed": "{entity_name}\u91cf\u6e2c\u6eab\u5ea6\u5df2\u8b8a\u66f4", "hvac_mode_changed": "{entity_name} HVAC \u6a21\u5f0f\u5df2\u8b8a\u66f4" } - } + }, + "title": "\u6eab\u63a7" } \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/af.json b/homeassistant/components/configurator/.translations/af.json new file mode 100644 index 000000000000..f4542971d34e --- /dev/null +++ b/homeassistant/components/configurator/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigureerder" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/ar.json b/homeassistant/components/configurator/.translations/ar.json new file mode 100644 index 000000000000..b24fff873a80 --- /dev/null +++ b/homeassistant/components/configurator/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/bg.json b/homeassistant/components/configurator/.translations/bg.json new file mode 100644 index 000000000000..2ac14a92210d --- /dev/null +++ b/homeassistant/components/configurator/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/bs.json b/homeassistant/components/configurator/.translations/bs.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/ca.json b/homeassistant/components/configurator/.translations/ca.json new file mode 100644 index 000000000000..ae7c391ec167 --- /dev/null +++ b/homeassistant/components/configurator/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Configurador" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/cs.json b/homeassistant/components/configurator/.translations/cs.json new file mode 100644 index 000000000000..2ffb94dc9737 --- /dev/null +++ b/homeassistant/components/configurator/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigur\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/cy.json b/homeassistant/components/configurator/.translations/cy.json new file mode 100644 index 000000000000..f4db7378cf29 --- /dev/null +++ b/homeassistant/components/configurator/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Ffurfweddwr" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/da.json b/homeassistant/components/configurator/.translations/da.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/de.json b/homeassistant/components/configurator/.translations/de.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/el.json b/homeassistant/components/configurator/.translations/el.json new file mode 100644 index 000000000000..fb24cfd0b8e4 --- /dev/null +++ b/homeassistant/components/configurator/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0394\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03c4\u03ae\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/en.json b/homeassistant/components/configurator/.translations/en.json new file mode 100644 index 000000000000..26ff6b741bf1 --- /dev/null +++ b/homeassistant/components/configurator/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Configurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/es-419.json b/homeassistant/components/configurator/.translations/es-419.json new file mode 100644 index 000000000000..ae7c391ec167 --- /dev/null +++ b/homeassistant/components/configurator/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Configurador" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/es.json b/homeassistant/components/configurator/.translations/es.json new file mode 100644 index 000000000000..ae7c391ec167 --- /dev/null +++ b/homeassistant/components/configurator/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Configurador" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/et.json b/homeassistant/components/configurator/.translations/et.json new file mode 100644 index 000000000000..37e0a4ea1df2 --- /dev/null +++ b/homeassistant/components/configurator/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Seadistaja" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/eu.json b/homeassistant/components/configurator/.translations/eu.json new file mode 100644 index 000000000000..ec5c8134eba6 --- /dev/null +++ b/homeassistant/components/configurator/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Konfiguratzailea" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/fa.json b/homeassistant/components/configurator/.translations/fa.json new file mode 100644 index 000000000000..d5527516e006 --- /dev/null +++ b/homeassistant/components/configurator/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u0646\u062f\u0647" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/fi.json b/homeassistant/components/configurator/.translations/fi.json new file mode 100644 index 000000000000..30355fa7e1e1 --- /dev/null +++ b/homeassistant/components/configurator/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Asetukset" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/fr.json b/homeassistant/components/configurator/.translations/fr.json new file mode 100644 index 000000000000..1989aecdbcc8 --- /dev/null +++ b/homeassistant/components/configurator/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Configurateur" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/gsw.json b/homeassistant/components/configurator/.translations/gsw.json new file mode 100644 index 000000000000..26ff6b741bf1 --- /dev/null +++ b/homeassistant/components/configurator/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Configurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/he.json b/homeassistant/components/configurator/.translations/he.json new file mode 100644 index 000000000000..42c5ef0793bb --- /dev/null +++ b/homeassistant/components/configurator/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05d5\u05e0\u05e4\u05d9\u05d2\u05d5\u05e8\u05d8\u05d5\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/hr.json b/homeassistant/components/configurator/.translations/hr.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/hu.json b/homeassistant/components/configurator/.translations/hu.json new file mode 100644 index 000000000000..2ffb94dc9737 --- /dev/null +++ b/homeassistant/components/configurator/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigur\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/hy.json b/homeassistant/components/configurator/.translations/hy.json new file mode 100644 index 000000000000..011aa485dd53 --- /dev/null +++ b/homeassistant/components/configurator/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u056b\u0579" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/id.json b/homeassistant/components/configurator/.translations/id.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/is.json b/homeassistant/components/configurator/.translations/is.json new file mode 100644 index 000000000000..e4b36d08778e --- /dev/null +++ b/homeassistant/components/configurator/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Stillingar\u00e1lfur" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/it.json b/homeassistant/components/configurator/.translations/it.json new file mode 100644 index 000000000000..c496e55f60cc --- /dev/null +++ b/homeassistant/components/configurator/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Configuratore" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/ko.json b/homeassistant/components/configurator/.translations/ko.json new file mode 100644 index 000000000000..5b70415caf1c --- /dev/null +++ b/homeassistant/components/configurator/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uad6c\uc131" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/lb.json b/homeassistant/components/configurator/.translations/lb.json new file mode 100644 index 000000000000..666a190572e8 --- /dev/null +++ b/homeassistant/components/configurator/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigur\u00e9ieren" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/lv.json b/homeassistant/components/configurator/.translations/lv.json new file mode 100644 index 000000000000..0fdc255715f6 --- /dev/null +++ b/homeassistant/components/configurator/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigur\u0113t\u0101js" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/nb.json b/homeassistant/components/configurator/.translations/nb.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/nl.json b/homeassistant/components/configurator/.translations/nl.json new file mode 100644 index 000000000000..26ff6b741bf1 --- /dev/null +++ b/homeassistant/components/configurator/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Configurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/nn.json b/homeassistant/components/configurator/.translations/nn.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/pl.json b/homeassistant/components/configurator/.translations/pl.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/pt-BR.json b/homeassistant/components/configurator/.translations/pt-BR.json new file mode 100644 index 000000000000..ae7c391ec167 --- /dev/null +++ b/homeassistant/components/configurator/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Configurador" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/pt.json b/homeassistant/components/configurator/.translations/pt.json new file mode 100644 index 000000000000..ae7c391ec167 --- /dev/null +++ b/homeassistant/components/configurator/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Configurador" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/ro.json b/homeassistant/components/configurator/.translations/ro.json new file mode 100644 index 000000000000..26ff6b741bf1 --- /dev/null +++ b/homeassistant/components/configurator/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Configurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/ru.json b/homeassistant/components/configurator/.translations/ru.json new file mode 100644 index 000000000000..2ac14a92210d --- /dev/null +++ b/homeassistant/components/configurator/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/sk.json b/homeassistant/components/configurator/.translations/sk.json new file mode 100644 index 000000000000..2ffb94dc9737 --- /dev/null +++ b/homeassistant/components/configurator/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigur\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/sl.json b/homeassistant/components/configurator/.translations/sl.json new file mode 100644 index 000000000000..099945f62010 --- /dev/null +++ b/homeassistant/components/configurator/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Konfigurator" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/sv.json b/homeassistant/components/configurator/.translations/sv.json new file mode 100644 index 000000000000..8115938bd575 --- /dev/null +++ b/homeassistant/components/configurator/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Konfiguratorn" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/te.json b/homeassistant/components/configurator/.translations/te.json new file mode 100644 index 000000000000..8be8e71bf701 --- /dev/null +++ b/homeassistant/components/configurator/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c1f\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/th.json b/homeassistant/components/configurator/.translations/th.json new file mode 100644 index 000000000000..8b0137018feb --- /dev/null +++ b/homeassistant/components/configurator/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e15\u0e31\u0e27\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/tr.json b/homeassistant/components/configurator/.translations/tr.json new file mode 100644 index 000000000000..75194b60e17f --- /dev/null +++ b/homeassistant/components/configurator/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Yap\u0131land\u0131r\u0131c\u0131" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/uk.json b/homeassistant/components/configurator/.translations/uk.json new file mode 100644 index 000000000000..29fea28b286e --- /dev/null +++ b/homeassistant/components/configurator/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0442\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/vi.json b/homeassistant/components/configurator/.translations/vi.json new file mode 100644 index 000000000000..0bb59012189d --- /dev/null +++ b/homeassistant/components/configurator/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Tr\u00ecnh c\u1ea5u h\u00ecnh" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/zh-Hans.json b/homeassistant/components/configurator/.translations/zh-Hans.json new file mode 100644 index 000000000000..de0ac733127f --- /dev/null +++ b/homeassistant/components/configurator/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u914d\u7f6e\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/configurator/.translations/zh-Hant.json b/homeassistant/components/configurator/.translations/zh-Hant.json new file mode 100644 index 000000000000..37ccced46178 --- /dev/null +++ b/homeassistant/components/configurator/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8a2d\u5b9a\u6a94\u7de8\u8f2f\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/af.json b/homeassistant/components/conversation/.translations/af.json new file mode 100644 index 000000000000..b74d6fcd9a60 --- /dev/null +++ b/homeassistant/components/conversation/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Konversasie" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/ar.json b/homeassistant/components/conversation/.translations/ar.json new file mode 100644 index 000000000000..753558615c73 --- /dev/null +++ b/homeassistant/components/conversation/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u062d\u0627\u062f\u062b\u0629" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/bg.json b/homeassistant/components/conversation/.translations/bg.json new file mode 100644 index 000000000000..e0183cbce8c6 --- /dev/null +++ b/homeassistant/components/conversation/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/bs.json b/homeassistant/components/conversation/.translations/bs.json new file mode 100644 index 000000000000..60795341d2ff --- /dev/null +++ b/homeassistant/components/conversation/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Razgovor" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/ca.json b/homeassistant/components/conversation/.translations/ca.json new file mode 100644 index 000000000000..3bdf3862d6ac --- /dev/null +++ b/homeassistant/components/conversation/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Conversa" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/cs.json b/homeassistant/components/conversation/.translations/cs.json new file mode 100644 index 000000000000..8f7dfbe50e9f --- /dev/null +++ b/homeassistant/components/conversation/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Konverzace" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/cy.json b/homeassistant/components/conversation/.translations/cy.json new file mode 100644 index 000000000000..20d6f8fefff6 --- /dev/null +++ b/homeassistant/components/conversation/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Sgwrs" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/da.json b/homeassistant/components/conversation/.translations/da.json new file mode 100644 index 000000000000..b27eaed6e90b --- /dev/null +++ b/homeassistant/components/conversation/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Samtale" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/de.json b/homeassistant/components/conversation/.translations/de.json new file mode 100644 index 000000000000..aafff25ebacf --- /dev/null +++ b/homeassistant/components/conversation/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Konversation" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/el.json b/homeassistant/components/conversation/.translations/el.json new file mode 100644 index 000000000000..642c5a64ff4f --- /dev/null +++ b/homeassistant/components/conversation/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/en.json b/homeassistant/components/conversation/.translations/en.json new file mode 100644 index 000000000000..54d9f55a0467 --- /dev/null +++ b/homeassistant/components/conversation/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Conversation" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/es-419.json b/homeassistant/components/conversation/.translations/es-419.json new file mode 100644 index 000000000000..2a05f60c1d7a --- /dev/null +++ b/homeassistant/components/conversation/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Conversacion" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/es.json b/homeassistant/components/conversation/.translations/es.json new file mode 100644 index 000000000000..bdb615bfc187 --- /dev/null +++ b/homeassistant/components/conversation/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Conversaci\u00f3n" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/et.json b/homeassistant/components/conversation/.translations/et.json new file mode 100644 index 000000000000..679432e2d4a4 --- /dev/null +++ b/homeassistant/components/conversation/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Vestlus" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/eu.json b/homeassistant/components/conversation/.translations/eu.json new file mode 100644 index 000000000000..8a4c2d9cd705 --- /dev/null +++ b/homeassistant/components/conversation/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Elkarrizketa" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/fa.json b/homeassistant/components/conversation/.translations/fa.json new file mode 100644 index 000000000000..85516ffaf830 --- /dev/null +++ b/homeassistant/components/conversation/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u06af\u0641\u062a\u06af\u0648" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/fi.json b/homeassistant/components/conversation/.translations/fi.json new file mode 100644 index 000000000000..0a6f93565d1b --- /dev/null +++ b/homeassistant/components/conversation/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Keskustelu" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/fr.json b/homeassistant/components/conversation/.translations/fr.json new file mode 100644 index 000000000000..54d9f55a0467 --- /dev/null +++ b/homeassistant/components/conversation/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Conversation" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/gsw.json b/homeassistant/components/conversation/.translations/gsw.json new file mode 100644 index 000000000000..05a5a43f5116 --- /dev/null +++ b/homeassistant/components/conversation/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Gspr\u00e4ch" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/he.json b/homeassistant/components/conversation/.translations/he.json new file mode 100644 index 000000000000..eeccec319afe --- /dev/null +++ b/homeassistant/components/conversation/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e9\u05c2\u05b4\u05d9\u05d7\u05b8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/hr.json b/homeassistant/components/conversation/.translations/hr.json new file mode 100644 index 000000000000..60795341d2ff --- /dev/null +++ b/homeassistant/components/conversation/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Razgovor" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/hu.json b/homeassistant/components/conversation/.translations/hu.json new file mode 100644 index 000000000000..863f34a26974 --- /dev/null +++ b/homeassistant/components/conversation/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Besz\u00e9lget\u00e9s" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/hy.json b/homeassistant/components/conversation/.translations/hy.json new file mode 100644 index 000000000000..d7cd9c624244 --- /dev/null +++ b/homeassistant/components/conversation/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053d\u0578\u057d\u0561\u056f\u0581\u0578\u0582\u0569\u0575\u0578\u0582\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/id.json b/homeassistant/components/conversation/.translations/id.json new file mode 100644 index 000000000000..3cc821278bbe --- /dev/null +++ b/homeassistant/components/conversation/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Percakapan" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/is.json b/homeassistant/components/conversation/.translations/is.json new file mode 100644 index 000000000000..ec14e3986f1d --- /dev/null +++ b/homeassistant/components/conversation/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Samtal" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/it.json b/homeassistant/components/conversation/.translations/it.json new file mode 100644 index 000000000000..7ee70b92f5f9 --- /dev/null +++ b/homeassistant/components/conversation/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Conversazione" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/ko.json b/homeassistant/components/conversation/.translations/ko.json new file mode 100644 index 000000000000..e2aec03cb12c --- /dev/null +++ b/homeassistant/components/conversation/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\ub300\ud654" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/lb.json b/homeassistant/components/conversation/.translations/lb.json new file mode 100644 index 000000000000..b95eaea7348d --- /dev/null +++ b/homeassistant/components/conversation/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "\u00cbnnerhalung" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/lv.json b/homeassistant/components/conversation/.translations/lv.json new file mode 100644 index 000000000000..714b10688441 --- /dev/null +++ b/homeassistant/components/conversation/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Saruna" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/nb.json b/homeassistant/components/conversation/.translations/nb.json new file mode 100644 index 000000000000..b27eaed6e90b --- /dev/null +++ b/homeassistant/components/conversation/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Samtale" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/nl.json b/homeassistant/components/conversation/.translations/nl.json new file mode 100644 index 000000000000..2b3dcdad5a40 --- /dev/null +++ b/homeassistant/components/conversation/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Conversatie" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/nn.json b/homeassistant/components/conversation/.translations/nn.json new file mode 100644 index 000000000000..b27eaed6e90b --- /dev/null +++ b/homeassistant/components/conversation/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Samtale" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/pl.json b/homeassistant/components/conversation/.translations/pl.json new file mode 100644 index 000000000000..00e93934f92e --- /dev/null +++ b/homeassistant/components/conversation/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Rozmowa" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/pt-BR.json b/homeassistant/components/conversation/.translations/pt-BR.json new file mode 100644 index 000000000000..20b82694d37d --- /dev/null +++ b/homeassistant/components/conversation/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Conversa\u00e7\u00e3o" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/pt.json b/homeassistant/components/conversation/.translations/pt.json new file mode 100644 index 000000000000..3bdf3862d6ac --- /dev/null +++ b/homeassistant/components/conversation/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Conversa" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/ro.json b/homeassistant/components/conversation/.translations/ro.json new file mode 100644 index 000000000000..c407b2a70b31 --- /dev/null +++ b/homeassistant/components/conversation/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Conversa\u0163ie" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/ru.json b/homeassistant/components/conversation/.translations/ru.json new file mode 100644 index 000000000000..cb8c411d6891 --- /dev/null +++ b/homeassistant/components/conversation/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0414\u0438\u0430\u043b\u043e\u0433" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/sk.json b/homeassistant/components/conversation/.translations/sk.json new file mode 100644 index 000000000000..dcb27d50d696 --- /dev/null +++ b/homeassistant/components/conversation/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Konverz\u00e1cia" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/sl.json b/homeassistant/components/conversation/.translations/sl.json new file mode 100644 index 000000000000..8a24231aeb64 --- /dev/null +++ b/homeassistant/components/conversation/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Pogovor" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/sv.json b/homeassistant/components/conversation/.translations/sv.json new file mode 100644 index 000000000000..ec14e3986f1d --- /dev/null +++ b/homeassistant/components/conversation/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Samtal" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/te.json b/homeassistant/components/conversation/.translations/te.json new file mode 100644 index 000000000000..8f3118176df2 --- /dev/null +++ b/homeassistant/components/conversation/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/th.json b/homeassistant/components/conversation/.translations/th.json new file mode 100644 index 000000000000..35921d062e05 --- /dev/null +++ b/homeassistant/components/conversation/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e32\u0e23\u0e2a\u0e19\u0e17\u0e19\u0e32" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/tr.json b/homeassistant/components/conversation/.translations/tr.json new file mode 100644 index 000000000000..eaff12069523 --- /dev/null +++ b/homeassistant/components/conversation/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Konu\u015fma" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/uk.json b/homeassistant/components/conversation/.translations/uk.json new file mode 100644 index 000000000000..713b6c28dae0 --- /dev/null +++ b/homeassistant/components/conversation/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u043e\u0437\u043c\u043e\u0432\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/vi.json b/homeassistant/components/conversation/.translations/vi.json new file mode 100644 index 000000000000..d8fdbc9b4d86 --- /dev/null +++ b/homeassistant/components/conversation/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "H\u1ed9i tho\u1ea1i" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/zh-Hans.json b/homeassistant/components/conversation/.translations/zh-Hans.json new file mode 100644 index 000000000000..ca605ebd370d --- /dev/null +++ b/homeassistant/components/conversation/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u8bed\u97f3\u5bf9\u8bdd" +} \ No newline at end of file diff --git a/homeassistant/components/conversation/.translations/zh-Hant.json b/homeassistant/components/conversation/.translations/zh-Hant.json new file mode 100644 index 000000000000..cfd34df797c8 --- /dev/null +++ b/homeassistant/components/conversation/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8a9e\u97f3\u4e92\u52d5" +} \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/bg.json b/homeassistant/components/coolmaster/.translations/bg.json index 8c8cbf8f36ff..a7fff4f036db 100644 --- a/homeassistant/components/coolmaster/.translations/bg.json +++ b/homeassistant/components/coolmaster/.translations/bg.json @@ -18,6 +18,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0441\u0432\u043e\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0438 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430 \u0441 CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ca.json b/homeassistant/components/coolmaster/.translations/ca.json index 75b269eee97d..fb256e52f882 100644 --- a/homeassistant/components/coolmaster/.translations/ca.json +++ b/homeassistant/components/coolmaster/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Configuraci\u00f3 de la connexi\u00f3 amb CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/cs.json b/homeassistant/components/coolmaster/.translations/cs.json index 99adbab2da44..56e7d591d6b4 100644 --- a/homeassistant/components/coolmaster/.translations/cs.json +++ b/homeassistant/components/coolmaster/.translations/cs.json @@ -18,6 +18,5 @@ "title": "Nastavte podrobnosti p\u0159ipojen\u00ed CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/da.json b/homeassistant/components/coolmaster/.translations/da.json index 25dd40704530..5cd4b98faf8a 100644 --- a/homeassistant/components/coolmaster/.translations/da.json +++ b/homeassistant/components/coolmaster/.translations/da.json @@ -18,6 +18,5 @@ "title": "Ops\u00e6t dine CoolMasterNet-forbindelsesdetaljer." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/de.json b/homeassistant/components/coolmaster/.translations/de.json index f853e2d5a0e3..b29decd38bcf 100644 --- a/homeassistant/components/coolmaster/.translations/de.json +++ b/homeassistant/components/coolmaster/.translations/de.json @@ -18,6 +18,5 @@ "title": "Richte deine CoolMasterNet-Verbindungsdaten ein." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/en.json b/homeassistant/components/coolmaster/.translations/en.json index 587bae0d5e78..6c09ceb725b9 100644 --- a/homeassistant/components/coolmaster/.translations/en.json +++ b/homeassistant/components/coolmaster/.translations/en.json @@ -18,6 +18,5 @@ "title": "Setup your CoolMasterNet connection details." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/es-419.json b/homeassistant/components/coolmaster/.translations/es-419.json index 03911b41cc21..e1da9263a0c1 100644 --- a/homeassistant/components/coolmaster/.translations/es-419.json +++ b/homeassistant/components/coolmaster/.translations/es-419.json @@ -8,6 +8,5 @@ "title": "Configure los detalles de su conexi\u00f3n CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/es.json b/homeassistant/components/coolmaster/.translations/es.json index a3ed82dddf1a..6835914c5137 100644 --- a/homeassistant/components/coolmaster/.translations/es.json +++ b/homeassistant/components/coolmaster/.translations/es.json @@ -18,6 +18,5 @@ "title": "Configure los detalles de su conexi\u00f3n a CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/fr.json b/homeassistant/components/coolmaster/.translations/fr.json index 5007a0e42d11..f790e0187186 100644 --- a/homeassistant/components/coolmaster/.translations/fr.json +++ b/homeassistant/components/coolmaster/.translations/fr.json @@ -18,6 +18,5 @@ "title": "Configurez les d\u00e9tails de votre connexion CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/it.json b/homeassistant/components/coolmaster/.translations/it.json index 552e90dd42d2..33ac306ce1a0 100644 --- a/homeassistant/components/coolmaster/.translations/it.json +++ b/homeassistant/components/coolmaster/.translations/it.json @@ -18,6 +18,5 @@ "title": "Impostare i dettagli della connessione CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ko.json b/homeassistant/components/coolmaster/.translations/ko.json index 9deb850b0208..cd9ac7a3970e 100644 --- a/homeassistant/components/coolmaster/.translations/ko.json +++ b/homeassistant/components/coolmaster/.translations/ko.json @@ -18,6 +18,5 @@ "title": "CoolMasterNet \uc5f0\uacb0 \uc0c1\uc138\uc815\ubcf4\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/lb.json b/homeassistant/components/coolmaster/.translations/lb.json index dea49b78e7ea..e010aeb3e66e 100644 --- a/homeassistant/components/coolmaster/.translations/lb.json +++ b/homeassistant/components/coolmaster/.translations/lb.json @@ -18,6 +18,5 @@ "title": "CoolMasterNet Verbindungs Detailer ariichten" } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/nl.json b/homeassistant/components/coolmaster/.translations/nl.json index feee2547932c..46fb120375a0 100644 --- a/homeassistant/components/coolmaster/.translations/nl.json +++ b/homeassistant/components/coolmaster/.translations/nl.json @@ -18,6 +18,5 @@ "title": "Stel uw CoolMasterNet-verbindingsgegevens in." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/no.json b/homeassistant/components/coolmaster/.translations/no.json index 2d053c6b44e3..328b113a1824 100644 --- a/homeassistant/components/coolmaster/.translations/no.json +++ b/homeassistant/components/coolmaster/.translations/no.json @@ -18,6 +18,5 @@ "title": "Konfigurer informasjonen om CoolMasterNet-tilkoblingen." } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/pl.json b/homeassistant/components/coolmaster/.translations/pl.json index 7daaef692f04..8407a8429b60 100644 --- a/homeassistant/components/coolmaster/.translations/pl.json +++ b/homeassistant/components/coolmaster/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Skonfiguruj szczeg\u00f3\u0142y po\u0142\u0105czenia CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/ru.json b/homeassistant/components/coolmaster/.translations/ru.json index 25518b5efea3..993a66539b2d 100644 --- a/homeassistant/components/coolmaster/.translations/ru.json +++ b/homeassistant/components/coolmaster/.translations/ru.json @@ -18,6 +18,5 @@ "title": "CoolMasterNet" } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/sl.json b/homeassistant/components/coolmaster/.translations/sl.json index 3c7790917219..d97fe244cda3 100644 --- a/homeassistant/components/coolmaster/.translations/sl.json +++ b/homeassistant/components/coolmaster/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Nastavite svoje podatke CoolMasterNet." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/sv.json b/homeassistant/components/coolmaster/.translations/sv.json index 8ba74734a799..60a26c210232 100644 --- a/homeassistant/components/coolmaster/.translations/sv.json +++ b/homeassistant/components/coolmaster/.translations/sv.json @@ -18,6 +18,5 @@ "title": "St\u00e4ll in dina CoolMasterNet-anslutningsdetaljer." } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coolmaster/.translations/zh-Hant.json b/homeassistant/components/coolmaster/.translations/zh-Hant.json index 56c4fdb377c7..a96bf8bd4320 100644 --- a/homeassistant/components/coolmaster/.translations/zh-Hant.json +++ b/homeassistant/components/coolmaster/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "\u8a2d\u5b9a CoolMasterNet \u9023\u7dda\u8cc7\u8a0a\u3002" } } - }, - "title": "CoolMasterNet" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ca.json b/homeassistant/components/coronavirus/.translations/ca.json index d91499dd0d89..c44da0ab21ad 100644 --- a/homeassistant/components/coronavirus/.translations/ca.json +++ b/homeassistant/components/coronavirus/.translations/ca.json @@ -11,6 +11,5 @@ "title": "Tria un pa\u00eds a monitoritzar" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/da.json b/homeassistant/components/coronavirus/.translations/da.json index c9b42c49112f..c368b5af561d 100644 --- a/homeassistant/components/coronavirus/.translations/da.json +++ b/homeassistant/components/coronavirus/.translations/da.json @@ -11,6 +11,5 @@ "title": "V\u00e6lg et land at overv\u00e5ge" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/de.json b/homeassistant/components/coronavirus/.translations/de.json index 3d00dd1f6c1f..f2aee659bc05 100644 --- a/homeassistant/components/coronavirus/.translations/de.json +++ b/homeassistant/components/coronavirus/.translations/de.json @@ -11,6 +11,5 @@ "title": "W\u00e4hlen Sie ein Land aus, das \u00fcberwacht werden soll" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/en.json b/homeassistant/components/coronavirus/.translations/en.json index d75a5ef4704d..f388c7343513 100644 --- a/homeassistant/components/coronavirus/.translations/en.json +++ b/homeassistant/components/coronavirus/.translations/en.json @@ -11,6 +11,5 @@ "title": "Pick a country to monitor" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/es.json b/homeassistant/components/coronavirus/.translations/es.json index a96f48c970ce..91bd835de7e6 100644 --- a/homeassistant/components/coronavirus/.translations/es.json +++ b/homeassistant/components/coronavirus/.translations/es.json @@ -11,6 +11,5 @@ "title": "Elige un pa\u00eds para monitorizar" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/fr.json b/homeassistant/components/coronavirus/.translations/fr.json index c2288786661e..21a72d80f61c 100644 --- a/homeassistant/components/coronavirus/.translations/fr.json +++ b/homeassistant/components/coronavirus/.translations/fr.json @@ -11,6 +11,5 @@ "title": "Choisissez un pays \u00e0 surveiller" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/hu.json b/homeassistant/components/coronavirus/.translations/hu.json index 211c97cd68ef..fcee85c40e82 100644 --- a/homeassistant/components/coronavirus/.translations/hu.json +++ b/homeassistant/components/coronavirus/.translations/hu.json @@ -11,6 +11,5 @@ "title": "V\u00e1lassz egy orsz\u00e1got a megfigyel\u00e9shez" } } - }, - "title": "Koronav\u00edrus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/it.json b/homeassistant/components/coronavirus/.translations/it.json index 129d96ee1839..26b40e06ebd7 100644 --- a/homeassistant/components/coronavirus/.translations/it.json +++ b/homeassistant/components/coronavirus/.translations/it.json @@ -11,6 +11,5 @@ "title": "Scegliere una Nazione da monitorare" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ko.json b/homeassistant/components/coronavirus/.translations/ko.json index 13f65dbe4136..e549a6746936 100644 --- a/homeassistant/components/coronavirus/.translations/ko.json +++ b/homeassistant/components/coronavirus/.translations/ko.json @@ -11,6 +11,5 @@ "title": "\ubaa8\ub2c8\ud130\ub9c1 \ud560 \uad6d\uac00\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694" } } - }, - "title": "\ucf54\ub85c\ub098 \ubc14\uc774\ub7ec\uc2a4" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/lb.json b/homeassistant/components/coronavirus/.translations/lb.json index b0aabd40c0d9..916a3e1d20ec 100644 --- a/homeassistant/components/coronavirus/.translations/lb.json +++ b/homeassistant/components/coronavirus/.translations/lb.json @@ -11,6 +11,5 @@ "title": "Wiel ee Land aus fir z'iwwerwaachen" } } - }, - "title": "Coronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/no.json b/homeassistant/components/coronavirus/.translations/no.json index dff3b965586e..359f15b33234 100644 --- a/homeassistant/components/coronavirus/.translations/no.json +++ b/homeassistant/components/coronavirus/.translations/no.json @@ -11,6 +11,5 @@ "title": "Velg et land du vil overv\u00e5ke" } } - }, - "title": "Koronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/pl.json b/homeassistant/components/coronavirus/.translations/pl.json index 85183b917cea..4660aa81ca67 100644 --- a/homeassistant/components/coronavirus/.translations/pl.json +++ b/homeassistant/components/coronavirus/.translations/pl.json @@ -11,6 +11,5 @@ "title": "Wybierz kraj do monitorowania" } } - }, - "title": "Koronawirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/ru.json b/homeassistant/components/coronavirus/.translations/ru.json index 75e271a297bc..7a39c547c82b 100644 --- a/homeassistant/components/coronavirus/.translations/ru.json +++ b/homeassistant/components/coronavirus/.translations/ru.json @@ -11,6 +11,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0443 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430" } } - }, - "title": "\u041a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/sl.json b/homeassistant/components/coronavirus/.translations/sl.json index 80d1f452c3a8..4ac4358dfc9e 100644 --- a/homeassistant/components/coronavirus/.translations/sl.json +++ b/homeassistant/components/coronavirus/.translations/sl.json @@ -11,6 +11,5 @@ "title": "Izberite dr\u017eavo za spremljanje" } } - }, - "title": "Koronavirus" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/zh-Hans.json b/homeassistant/components/coronavirus/.translations/zh-Hans.json index 36ab96cb8efd..5bb92ac11722 100644 --- a/homeassistant/components/coronavirus/.translations/zh-Hans.json +++ b/homeassistant/components/coronavirus/.translations/zh-Hans.json @@ -11,6 +11,5 @@ "title": "\u8bf7\u9009\u62e9\u8981\u76d1\u63a7\u7684\u56fd\u5bb6/\u5730\u533a" } } - }, - "title": "\u65b0\u578b\u51a0\u72b6\u75c5\u6bd2" + } } \ No newline at end of file diff --git a/homeassistant/components/coronavirus/.translations/zh-Hant.json b/homeassistant/components/coronavirus/.translations/zh-Hant.json index 5de83e5fb0fd..22d5b893e42c 100644 --- a/homeassistant/components/coronavirus/.translations/zh-Hant.json +++ b/homeassistant/components/coronavirus/.translations/zh-Hant.json @@ -11,6 +11,5 @@ "title": "\u9078\u64c7\u6240\u8981\u76e3\u8996\u7684\u570b\u5bb6" } } - }, - "title": "\u65b0\u51a0\u72c0\u75c5\u6bd2" + } } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/af.json b/homeassistant/components/cover/.translations/af.json new file mode 100644 index 000000000000..bd80a5fff77f --- /dev/null +++ b/homeassistant/components/cover/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Dekking" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/ar.json b/homeassistant/components/cover/.translations/ar.json new file mode 100644 index 000000000000..da5bb48f0c1c --- /dev/null +++ b/homeassistant/components/cover/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0633\u062a\u0627\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/bg.json b/homeassistant/components/cover/.translations/bg.json index 4651fb4aebec..8c7ff4baae27 100644 --- a/homeassistant/components/cover/.translations/bg.json +++ b/homeassistant/components/cover/.translations/bg.json @@ -16,5 +16,6 @@ "position": "{entity_name} \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0442\u0430 \u0441\u0438", "tilt_position": "{entity_name} \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u0441\u0438" } - } + }, + "title": "\u041f\u0430\u0440\u0430\u0432\u0430\u043d" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/bs.json b/homeassistant/components/cover/.translations/bs.json new file mode 100644 index 000000000000..8fb2faafcc22 --- /dev/null +++ b/homeassistant/components/cover/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Poklopac" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/ca.json b/homeassistant/components/cover/.translations/ca.json index 1a0f0544698c..cb42b906535e 100644 --- a/homeassistant/components/cover/.translations/ca.json +++ b/homeassistant/components/cover/.translations/ca.json @@ -24,5 +24,6 @@ "position": "Canvia la posici\u00f3 de {entity_name}", "tilt_position": "Canvia la inclinaci\u00f3 de {entity_name}" } - } + }, + "title": "Coberta" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/cs.json b/homeassistant/components/cover/.translations/cs.json index bed9bc976d39..447890ba7f2b 100644 --- a/homeassistant/components/cover/.translations/cs.json +++ b/homeassistant/components/cover/.translations/cs.json @@ -8,5 +8,6 @@ "is_position": "pozice {entity_name} je", "is_tilt_position": "pozice naklon\u011bn\u00ed {entity_name} je" } - } + }, + "title": "Roleta" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/cy.json b/homeassistant/components/cover/.translations/cy.json new file mode 100644 index 000000000000..0c539f587b54 --- /dev/null +++ b/homeassistant/components/cover/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Clawr" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/da.json b/homeassistant/components/cover/.translations/da.json index 29691b4154b9..e4a4d62781a4 100644 --- a/homeassistant/components/cover/.translations/da.json +++ b/homeassistant/components/cover/.translations/da.json @@ -24,5 +24,6 @@ "position": "{entity_name} position \u00e6ndres", "tilt_position": "{entity_name} vippeposition \u00e6ndres" } - } + }, + "title": "Gardin/port" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/de.json b/homeassistant/components/cover/.translations/de.json index 9a9f0be21e24..dbe6c535092b 100644 --- a/homeassistant/components/cover/.translations/de.json +++ b/homeassistant/components/cover/.translations/de.json @@ -24,5 +24,6 @@ "position": "{entity_name} ver\u00e4ndert die Position", "tilt_position": "{entity_name} ver\u00e4ndert die Neigungsposition" } - } + }, + "title": "Abdeckung" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/el.json b/homeassistant/components/cover/.translations/el.json new file mode 100644 index 000000000000..a45ed3b547dd --- /dev/null +++ b/homeassistant/components/cover/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u039a\u03ac\u03bb\u03c5\u03c8\u03b7" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/en.json b/homeassistant/components/cover/.translations/en.json index e529d6e77d73..4bd1c90143f8 100644 --- a/homeassistant/components/cover/.translations/en.json +++ b/homeassistant/components/cover/.translations/en.json @@ -24,5 +24,6 @@ "position": "{entity_name} position changes", "tilt_position": "{entity_name} tilt position changes" } - } + }, + "title": "Cover" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/es-419.json b/homeassistant/components/cover/.translations/es-419.json new file mode 100644 index 000000000000..7d5ad113b22f --- /dev/null +++ b/homeassistant/components/cover/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Portada" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/es.json b/homeassistant/components/cover/.translations/es.json index 04efe4964e80..5232baf8ca4b 100644 --- a/homeassistant/components/cover/.translations/es.json +++ b/homeassistant/components/cover/.translations/es.json @@ -24,5 +24,6 @@ "position": "Posici\u00f3n cambiada de {entity_name}", "tilt_position": "Cambia la posici\u00f3n de inclinaci\u00f3n de {entity_name}" } - } + }, + "title": "Persiana" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/et.json b/homeassistant/components/cover/.translations/et.json new file mode 100644 index 000000000000..361a6957eb51 --- /dev/null +++ b/homeassistant/components/cover/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Kate" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/fa.json b/homeassistant/components/cover/.translations/fa.json new file mode 100644 index 000000000000..3985fed6db9a --- /dev/null +++ b/homeassistant/components/cover/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u067e\u0648\u0634\u0634" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/fi.json b/homeassistant/components/cover/.translations/fi.json new file mode 100644 index 000000000000..183ba79e0647 --- /dev/null +++ b/homeassistant/components/cover/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kaihtimet" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/fr.json b/homeassistant/components/cover/.translations/fr.json index 83bd5df826e7..3033958d9363 100644 --- a/homeassistant/components/cover/.translations/fr.json +++ b/homeassistant/components/cover/.translations/fr.json @@ -19,5 +19,6 @@ "position": "{entity_name} changement de position", "tilt_position": "{entity_name} changement d'inclinaison" } - } + }, + "title": "Volets" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/gsw.json b/homeassistant/components/cover/.translations/gsw.json new file mode 100644 index 000000000000..1ba4c099483b --- /dev/null +++ b/homeassistant/components/cover/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Roulade" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/he.json b/homeassistant/components/cover/.translations/he.json new file mode 100644 index 000000000000..ecc19f2f84e8 --- /dev/null +++ b/homeassistant/components/cover/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d5\u05d9\u05dc\u05d5\u05df" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/hr.json b/homeassistant/components/cover/.translations/hr.json new file mode 100644 index 000000000000..8fb2faafcc22 --- /dev/null +++ b/homeassistant/components/cover/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Poklopac" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/hu.json b/homeassistant/components/cover/.translations/hu.json index 5e91736a263f..b6b085ce9c46 100644 --- a/homeassistant/components/cover/.translations/hu.json +++ b/homeassistant/components/cover/.translations/hu.json @@ -24,5 +24,6 @@ "position": "{entity_name} poz\u00edci\u00f3ja v\u00e1ltozik", "tilt_position": "{entity_name} d\u00f6nt\u00e9si poz\u00edci\u00f3ja v\u00e1ltozik" } - } + }, + "title": "Bor\u00edt\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/hy.json b/homeassistant/components/cover/.translations/hy.json new file mode 100644 index 000000000000..8f24a7993a83 --- /dev/null +++ b/homeassistant/components/cover/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053e\u0561\u056e\u056f\u0565\u056c" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/id.json b/homeassistant/components/cover/.translations/id.json new file mode 100644 index 000000000000..5a7095ea355e --- /dev/null +++ b/homeassistant/components/cover/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Penutup" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/is.json b/homeassistant/components/cover/.translations/is.json new file mode 100644 index 000000000000..a62aa376d287 --- /dev/null +++ b/homeassistant/components/cover/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Gluggatj\u00f6ld" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/it.json b/homeassistant/components/cover/.translations/it.json index 1e2e85821a95..feda2c458c8b 100644 --- a/homeassistant/components/cover/.translations/it.json +++ b/homeassistant/components/cover/.translations/it.json @@ -24,5 +24,6 @@ "position": "{entity_name} cambiamenti della posizione", "tilt_position": "{entity_name} cambiamenti della posizione d'inclinazione" } - } + }, + "title": "Scuri" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/ko.json b/homeassistant/components/cover/.translations/ko.json index ae67663f46f1..b0a10cd63c82 100644 --- a/homeassistant/components/cover/.translations/ko.json +++ b/homeassistant/components/cover/.translations/ko.json @@ -24,5 +24,6 @@ "position": "{entity_name} \uac1c\ud3d0 \uc704\uce58\uac00 \ubcc0\ud560 \ub54c", "tilt_position": "{entity_name} \uac1c\ud3d0 \uae30\uc6b8\uae30\uac00 \ubcc0\ud560 \ub54c" } - } + }, + "title": "\uc5ec\ub2eb\uc774" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/lb.json b/homeassistant/components/cover/.translations/lb.json index 4cbbf3488728..cea00af3e8b8 100644 --- a/homeassistant/components/cover/.translations/lb.json +++ b/homeassistant/components/cover/.translations/lb.json @@ -24,5 +24,6 @@ "position": "{entity_name} positioun \u00e4nnert", "tilt_position": "{entity_name} kipp positioun ge\u00e4nnert" } - } + }, + "title": "Paart" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/lv.json b/homeassistant/components/cover/.translations/lv.json new file mode 100644 index 000000000000..5cc8740ed329 --- /dev/null +++ b/homeassistant/components/cover/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Nosegi" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/nb.json b/homeassistant/components/cover/.translations/nb.json new file mode 100644 index 000000000000..91d23a039ae9 --- /dev/null +++ b/homeassistant/components/cover/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Cover" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/nl.json b/homeassistant/components/cover/.translations/nl.json index 472583687dd8..10539d6204d4 100644 --- a/homeassistant/components/cover/.translations/nl.json +++ b/homeassistant/components/cover/.translations/nl.json @@ -16,5 +16,6 @@ "position": "{entity_name} positiewijzigingen", "tilt_position": "{entity_name} kantel positiewijzigingen" } - } + }, + "title": "Bedekking" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/nn.json b/homeassistant/components/cover/.translations/nn.json new file mode 100644 index 000000000000..d12951fe906f --- /dev/null +++ b/homeassistant/components/cover/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Dekke" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/pl.json b/homeassistant/components/cover/.translations/pl.json index ce035b2533ea..fba3c7607879 100644 --- a/homeassistant/components/cover/.translations/pl.json +++ b/homeassistant/components/cover/.translations/pl.json @@ -24,5 +24,6 @@ "position": "zmieni si\u0119 pozycja pokrywy {entity_name}", "tilt_position": "zmieni si\u0119 pochylenie pokrywy {entity_name}" } - } + }, + "title": "Pokrywa" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/pt-BR.json b/homeassistant/components/cover/.translations/pt-BR.json new file mode 100644 index 000000000000..4a016c9ec851 --- /dev/null +++ b/homeassistant/components/cover/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Cobertura" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/pt.json b/homeassistant/components/cover/.translations/pt.json index 6234d2685f4b..2cfe9c76715d 100644 --- a/homeassistant/components/cover/.translations/pt.json +++ b/homeassistant/components/cover/.translations/pt.json @@ -14,5 +14,6 @@ "opened": "{entity_name} abriu", "opening": "{entity_name} est\u00e1 a abrir" } - } + }, + "title": "Cobertura" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/ro.json b/homeassistant/components/cover/.translations/ro.json new file mode 100644 index 000000000000..876aefaf6c62 --- /dev/null +++ b/homeassistant/components/cover/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Jaluzea" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/ru.json b/homeassistant/components/cover/.translations/ru.json index 97a8a8ba1bb6..32073d7c3eea 100644 --- a/homeassistant/components/cover/.translations/ru.json +++ b/homeassistant/components/cover/.translations/ru.json @@ -22,5 +22,6 @@ "position": "{entity_name} \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435", "tilt_position": "{entity_name} \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u043a\u043b\u043e\u043d" } - } + }, + "title": "\u0428\u0442\u043e\u0440\u044b" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/sk.json b/homeassistant/components/cover/.translations/sk.json new file mode 100644 index 000000000000..ca2ef720cb41 --- /dev/null +++ b/homeassistant/components/cover/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Kryt" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/sl.json b/homeassistant/components/cover/.translations/sl.json index 818f17d58fe2..10d72af13d19 100644 --- a/homeassistant/components/cover/.translations/sl.json +++ b/homeassistant/components/cover/.translations/sl.json @@ -24,5 +24,6 @@ "position": "{entity_name} spremembe polo\u017eaja", "tilt_position": "{entity_name} spremembe nagiba" } - } + }, + "title": "Cover" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/sv.json b/homeassistant/components/cover/.translations/sv.json index 906768d3eb33..1bef92f8dea6 100644 --- a/homeassistant/components/cover/.translations/sv.json +++ b/homeassistant/components/cover/.translations/sv.json @@ -16,5 +16,6 @@ "position": "{entity_name} position \u00e4ndras", "tilt_position": "{entity_name} lutningsposition \u00e4ndras" } - } + }, + "title": "Rullgardin" } \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/te.json b/homeassistant/components/cover/.translations/te.json new file mode 100644 index 000000000000..dfa9112d5e78 --- /dev/null +++ b/homeassistant/components/cover/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c15\u0c35\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/th.json b/homeassistant/components/cover/.translations/th.json new file mode 100644 index 000000000000..6ffc0e869dd4 --- /dev/null +++ b/homeassistant/components/cover/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e21\u0e48\u0e32\u0e19" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/tr.json b/homeassistant/components/cover/.translations/tr.json new file mode 100644 index 000000000000..73d4b523b8b9 --- /dev/null +++ b/homeassistant/components/cover/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Panjur" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/uk.json b/homeassistant/components/cover/.translations/uk.json new file mode 100644 index 000000000000..c1c4b89a3692 --- /dev/null +++ b/homeassistant/components/cover/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/vi.json b/homeassistant/components/cover/.translations/vi.json new file mode 100644 index 000000000000..f2d92c12f509 --- /dev/null +++ b/homeassistant/components/cover/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "R\u00e8m, c\u1eeda cu\u1ed1n" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/zh-Hans.json b/homeassistant/components/cover/.translations/zh-Hans.json new file mode 100644 index 000000000000..b576d350557f --- /dev/null +++ b/homeassistant/components/cover/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u5377\u5e18" +} \ No newline at end of file diff --git a/homeassistant/components/cover/.translations/zh-Hant.json b/homeassistant/components/cover/.translations/zh-Hant.json index d91010e974e9..f525da61ff50 100644 --- a/homeassistant/components/cover/.translations/zh-Hant.json +++ b/homeassistant/components/cover/.translations/zh-Hant.json @@ -24,5 +24,6 @@ "position": "{entity_name}\u4f4d\u7f6e\u8b8a\u66f4", "tilt_position": "{entity_name}\u6a19\u984c\u4f4d\u7f6e\u8b8a\u66f4" } - } + }, + "title": "\u6372\u7c3e/\u9580" } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/bg.json b/homeassistant/components/daikin/.translations/bg.json index c3f714bf77d2..dd80874adaa0 100644 --- a/homeassistant/components/daikin/.translations/bg.json +++ b/homeassistant/components/daikin/.translations/bg.json @@ -14,6 +14,5 @@ "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin" } } - }, - "title": "\u041a\u043b\u0438\u043c\u0430\u0442\u0438\u043a Daikin" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ca.json b/homeassistant/components/daikin/.translations/ca.json index f5338e85d3fd..35d2dafd338d 100644 --- a/homeassistant/components/daikin/.translations/ca.json +++ b/homeassistant/components/daikin/.translations/ca.json @@ -14,6 +14,5 @@ "title": "Configuraci\u00f3 de Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/da.json b/homeassistant/components/daikin/.translations/da.json index f8e21aa44bd0..230bd7ecbd8f 100644 --- a/homeassistant/components/daikin/.translations/da.json +++ b/homeassistant/components/daikin/.translations/da.json @@ -14,6 +14,5 @@ "title": "Konfigurer Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/de.json b/homeassistant/components/daikin/.translations/de.json index ad5fe4dc52e4..ac7df0863bfc 100644 --- a/homeassistant/components/daikin/.translations/de.json +++ b/homeassistant/components/daikin/.translations/de.json @@ -14,6 +14,5 @@ "title": "Daikin AC konfigurieren" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/en.json b/homeassistant/components/daikin/.translations/en.json index 4540db5f2575..f66f360d096e 100644 --- a/homeassistant/components/daikin/.translations/en.json +++ b/homeassistant/components/daikin/.translations/en.json @@ -14,6 +14,5 @@ "title": "Configure Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/es-419.json b/homeassistant/components/daikin/.translations/es-419.json index 5069457a4e69..3facdce66d4d 100644 --- a/homeassistant/components/daikin/.translations/es-419.json +++ b/homeassistant/components/daikin/.translations/es-419.json @@ -14,6 +14,5 @@ "title": "Configurar Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/es.json b/homeassistant/components/daikin/.translations/es.json index 375a4b44fd49..b774ac67ed3b 100644 --- a/homeassistant/components/daikin/.translations/es.json +++ b/homeassistant/components/daikin/.translations/es.json @@ -14,6 +14,5 @@ "title": "Configurar aire acondicionado Daikin" } } - }, - "title": "Aire acondicionado Daikin" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/fr.json b/homeassistant/components/daikin/.translations/fr.json index 5a143252469b..b15a9fae2624 100644 --- a/homeassistant/components/daikin/.translations/fr.json +++ b/homeassistant/components/daikin/.translations/fr.json @@ -14,6 +14,5 @@ "title": "Configurer Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/hu.json b/homeassistant/components/daikin/.translations/hu.json index cb2118c3a0ba..eef3afdc5ee2 100644 --- a/homeassistant/components/daikin/.translations/hu.json +++ b/homeassistant/components/daikin/.translations/hu.json @@ -14,6 +14,5 @@ "title": "A Daikin l\u00e9gkond\u00edcion\u00e1l\u00f3 konfigur\u00e1l\u00e1sa" } } - }, - "title": "Daikin L\u00e9gkond\u00edci\u00f3n\u00e1l\u00f3" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/it.json b/homeassistant/components/daikin/.translations/it.json index 78cd905a4178..72d5acd97a87 100644 --- a/homeassistant/components/daikin/.translations/it.json +++ b/homeassistant/components/daikin/.translations/it.json @@ -14,6 +14,5 @@ "title": "Configura Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ko.json b/homeassistant/components/daikin/.translations/ko.json index 90d9c0b0ead4..129da9b87d01 100644 --- a/homeassistant/components/daikin/.translations/ko.json +++ b/homeassistant/components/daikin/.translations/ko.json @@ -14,6 +14,5 @@ "title": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8 \uad6c\uc131" } } - }, - "title": "\ub2e4\uc774\ud0a8 \uc5d0\uc5b4\ucee8" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/lb.json b/homeassistant/components/daikin/.translations/lb.json index ccd4903bbabc..4fab38c91155 100644 --- a/homeassistant/components/daikin/.translations/lb.json +++ b/homeassistant/components/daikin/.translations/lb.json @@ -14,6 +14,5 @@ "title": "Daikin AC konfigur\u00e9ieren" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/nl.json b/homeassistant/components/daikin/.translations/nl.json index c01c8a734bb8..0e0db0c907c4 100644 --- a/homeassistant/components/daikin/.translations/nl.json +++ b/homeassistant/components/daikin/.translations/nl.json @@ -14,6 +14,5 @@ "title": "Daikin AC instellen" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/no.json b/homeassistant/components/daikin/.translations/no.json index c8dbbcbbba37..42d13cf6844c 100644 --- a/homeassistant/components/daikin/.translations/no.json +++ b/homeassistant/components/daikin/.translations/no.json @@ -14,6 +14,5 @@ "title": "Konfigurer Daikin AC" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pl.json b/homeassistant/components/daikin/.translations/pl.json index fc77fdc9d313..e4444c3f0c1e 100644 --- a/homeassistant/components/daikin/.translations/pl.json +++ b/homeassistant/components/daikin/.translations/pl.json @@ -14,6 +14,5 @@ "title": "Konfiguracja Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pt-BR.json b/homeassistant/components/daikin/.translations/pt-BR.json index 6e8a55d56fbf..294e14b10719 100644 --- a/homeassistant/components/daikin/.translations/pt-BR.json +++ b/homeassistant/components/daikin/.translations/pt-BR.json @@ -14,6 +14,5 @@ "title": "Configurar o AC Daikin" } } - }, - "title": "AC Daikin" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/pt.json b/homeassistant/components/daikin/.translations/pt.json index b8ba5afe94c0..7e8f00861946 100644 --- a/homeassistant/components/daikin/.translations/pt.json +++ b/homeassistant/components/daikin/.translations/pt.json @@ -14,6 +14,5 @@ "title": "Configurar o Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/ru.json b/homeassistant/components/daikin/.translations/ru.json index a5ca34285d1f..a7b57fcb7572 100644 --- a/homeassistant/components/daikin/.translations/ru.json +++ b/homeassistant/components/daikin/.translations/ru.json @@ -14,6 +14,5 @@ "title": "Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/sl.json b/homeassistant/components/daikin/.translations/sl.json index 005ce5910eab..f48d729b83c9 100644 --- a/homeassistant/components/daikin/.translations/sl.json +++ b/homeassistant/components/daikin/.translations/sl.json @@ -14,6 +14,5 @@ "title": "Nastavite Daikin klimo" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/sv.json b/homeassistant/components/daikin/.translations/sv.json index 2058992de2c7..0825d6ed3963 100644 --- a/homeassistant/components/daikin/.translations/sv.json +++ b/homeassistant/components/daikin/.translations/sv.json @@ -14,6 +14,5 @@ "title": "Konfigurera Daikin AC" } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/th.json b/homeassistant/components/daikin/.translations/th.json index d8f55ea6058d..4d01bb3e14cf 100644 --- a/homeassistant/components/daikin/.translations/th.json +++ b/homeassistant/components/daikin/.translations/th.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Daikin AC" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/zh-Hans.json b/homeassistant/components/daikin/.translations/zh-Hans.json index 92898ab0f9b7..57b891d1adfa 100644 --- a/homeassistant/components/daikin/.translations/zh-Hans.json +++ b/homeassistant/components/daikin/.translations/zh-Hans.json @@ -14,6 +14,5 @@ "title": "\u914d\u7f6e Daikin \u7a7a\u8c03" } } - }, - "title": "Daikin \u7a7a\u8c03" + } } \ No newline at end of file diff --git a/homeassistant/components/daikin/.translations/zh-Hant.json b/homeassistant/components/daikin/.translations/zh-Hant.json index 6bf389bcb42f..bab541186874 100644 --- a/homeassistant/components/daikin/.translations/zh-Hant.json +++ b/homeassistant/components/daikin/.translations/zh-Hant.json @@ -14,6 +14,5 @@ "title": "\u8a2d\u5b9a\u5927\u91d1\u7a7a\u8abf" } } - }, - "title": "\u5927\u91d1\u7a7a\u8abf\uff08Daikin AC\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/bg.json b/homeassistant/components/deconz/.translations/bg.json index 84fbb1803979..97b44175a238 100644 --- a/homeassistant/components/deconz/.translations/bg.json +++ b/homeassistant/components/deconz/.translations/bg.json @@ -86,6 +86,5 @@ "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0442\u0430 \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 deCONZ" } } - }, - "title": "deCONZ Zigbee \u0448\u043b\u044e\u0437" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ca.json b/homeassistant/components/deconz/.translations/ca.json index a626e78047aa..2e91223b27e7 100644 --- a/homeassistant/components/deconz/.translations/ca.json +++ b/homeassistant/components/deconz/.translations/ca.json @@ -33,6 +33,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Ambd\u00f3s botons", + "bottom_buttons": "Botons inferiors", "button_1": "Primer bot\u00f3", "button_2": "Segon bot\u00f3", "button_3": "Tercer bot\u00f3", @@ -49,6 +50,7 @@ "side_4": "cara 4", "side_5": "cara 5", "side_6": "cara 6", + "top_buttons": "Botons superiors", "turn_off": "Desactiva", "turn_on": "Activa" }, @@ -93,6 +95,5 @@ "title": "Opcions de deCONZ" } } - }, - "title": "Passarel\u00b7la d'enlla\u00e7 deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/cs.json b/homeassistant/components/deconz/.translations/cs.json index 6be08699b825..9cdeb87ef0e8 100644 --- a/homeassistant/components/deconz/.translations/cs.json +++ b/homeassistant/components/deconz/.translations/cs.json @@ -26,6 +26,5 @@ "title": "Propojit s deCONZ" } } - }, - "title": "Br\u00e1na deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/cy.json b/homeassistant/components/deconz/.translations/cy.json index eb511dedf8fe..07f0e91489e1 100644 --- a/homeassistant/components/deconz/.translations/cy.json +++ b/homeassistant/components/deconz/.translations/cy.json @@ -21,6 +21,5 @@ "title": "Cysylltu \u00e2 deCONZ" } } - }, - "title": "deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/da.json b/homeassistant/components/deconz/.translations/da.json index 01c1097673d5..bfa31d939879 100644 --- a/homeassistant/components/deconz/.translations/da.json +++ b/homeassistant/components/deconz/.translations/da.json @@ -93,6 +93,5 @@ "title": "deCONZ-indstillinger" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/de.json b/homeassistant/components/deconz/.translations/de.json index 2732c6e94eff..9fbf86780b55 100644 --- a/homeassistant/components/deconz/.translations/de.json +++ b/homeassistant/components/deconz/.translations/de.json @@ -95,6 +95,5 @@ "title": "deCONZ-Optionen" } } - }, - "title": "deCONZ Zigbee Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index 117fc3e3398f..1a95816dab76 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -95,6 +95,5 @@ "title": "deCONZ options" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/es-419.json b/homeassistant/components/deconz/.translations/es-419.json index 96c85cb48243..3f26699635eb 100644 --- a/homeassistant/components/deconz/.translations/es-419.json +++ b/homeassistant/components/deconz/.translations/es-419.json @@ -47,6 +47,5 @@ "remote_button_rotated": "Bot\u00f3n girado \"{subtype}\"", "remote_gyro_activated": "Dispositivo agitado" } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/es.json b/homeassistant/components/deconz/.translations/es.json index e64ddeeaa007..ed756dbc2be2 100644 --- a/homeassistant/components/deconz/.translations/es.json +++ b/homeassistant/components/deconz/.translations/es.json @@ -95,6 +95,5 @@ "title": "Opciones deCONZ" } } - }, - "title": "Pasarela Zigbee deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/et.json b/homeassistant/components/deconz/.translations/et.json index dd415341f5b6..60772a762ada 100644 --- a/homeassistant/components/deconz/.translations/et.json +++ b/homeassistant/components/deconz/.translations/et.json @@ -8,6 +8,5 @@ } } } - }, - "title": "deCONZ Zigbee l\u00fc\u00fcs" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/fr.json b/homeassistant/components/deconz/.translations/fr.json index 85463ad1fb43..d14cf775ad4e 100644 --- a/homeassistant/components/deconz/.translations/fr.json +++ b/homeassistant/components/deconz/.translations/fr.json @@ -93,6 +93,5 @@ "title": "Options deCONZ" } } - }, - "title": "Passerelle deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/he.json b/homeassistant/components/deconz/.translations/he.json index e7c09897d481..9dd6fc8f831e 100644 --- a/homeassistant/components/deconz/.translations/he.json +++ b/homeassistant/components/deconz/.translations/he.json @@ -21,6 +21,5 @@ "title": "\u05e7\u05e9\u05e8 \u05e2\u05dd deCONZ" } } - }, - "title": "\u05de\u05d2\u05e9\u05e8 deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/hu.json b/homeassistant/components/deconz/.translations/hu.json index ced8249c85e5..4f2e6e8d2611 100644 --- a/homeassistant/components/deconz/.translations/hu.json +++ b/homeassistant/components/deconz/.translations/hu.json @@ -91,6 +91,5 @@ "description": "A deCONZ eszk\u00f6zt\u00edpusok l\u00e1that\u00f3s\u00e1g\u00e1nak konfigur\u00e1l\u00e1sa" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/id.json b/homeassistant/components/deconz/.translations/id.json index 5bb9a4997de3..ef2688f413d4 100644 --- a/homeassistant/components/deconz/.translations/id.json +++ b/homeassistant/components/deconz/.translations/id.json @@ -21,6 +21,5 @@ "title": "Tautan dengan deCONZ" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/it.json b/homeassistant/components/deconz/.translations/it.json index 8978bb14eba5..4ff508451d89 100644 --- a/homeassistant/components/deconz/.translations/it.json +++ b/homeassistant/components/deconz/.translations/it.json @@ -95,6 +95,5 @@ "title": "Opzioni deCONZ" } } - }, - "title": "Gateway Zigbee deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ko.json b/homeassistant/components/deconz/.translations/ko.json index 54487db6c86e..d2c55261aeb8 100644 --- a/homeassistant/components/deconz/.translations/ko.json +++ b/homeassistant/components/deconz/.translations/ko.json @@ -93,6 +93,5 @@ "title": "deCONZ \uc635\uc158" } } - }, - "title": "deCONZ Zigbee \uac8c\uc774\ud2b8\uc6e8\uc774" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/lb.json b/homeassistant/components/deconz/.translations/lb.json index a7675305ec37..4007c23d2a58 100644 --- a/homeassistant/components/deconz/.translations/lb.json +++ b/homeassistant/components/deconz/.translations/lb.json @@ -93,6 +93,5 @@ "title": "deCONZ Optiounen" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/nl.json b/homeassistant/components/deconz/.translations/nl.json index bf52e00b9f91..193ad115b001 100644 --- a/homeassistant/components/deconz/.translations/nl.json +++ b/homeassistant/components/deconz/.translations/nl.json @@ -92,6 +92,5 @@ "description": "Configureer de zichtbaarheid van deCONZ-apparaattypen" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/nn.json b/homeassistant/components/deconz/.translations/nn.json index 30264b9c820a..bea2f2e00927 100644 --- a/homeassistant/components/deconz/.translations/nn.json +++ b/homeassistant/components/deconz/.translations/nn.json @@ -21,6 +21,5 @@ "title": "Link med deCONZ" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/no.json b/homeassistant/components/deconz/.translations/no.json index b08157ecbc21..b521fdc0401e 100644 --- a/homeassistant/components/deconz/.translations/no.json +++ b/homeassistant/components/deconz/.translations/no.json @@ -95,6 +95,5 @@ "title": "deCONZ alternativer" } } - }, - "title": "deCONZ Zigbee gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pl.json b/homeassistant/components/deconz/.translations/pl.json index 18418b375a20..d48c695a3409 100644 --- a/homeassistant/components/deconz/.translations/pl.json +++ b/homeassistant/components/deconz/.translations/pl.json @@ -93,6 +93,5 @@ "title": "Opcje deCONZ" } } - }, - "title": "Brama deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pt-BR.json b/homeassistant/components/deconz/.translations/pt-BR.json index 5345db7b04e6..84a4389657ab 100644 --- a/homeassistant/components/deconz/.translations/pt-BR.json +++ b/homeassistant/components/deconz/.translations/pt-BR.json @@ -28,6 +28,5 @@ "title": "Linkar com deCONZ" } } - }, - "title": "Gateway deCONZ Zigbee" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/pt.json b/homeassistant/components/deconz/.translations/pt.json index 1d73892e2b3c..759e6340edd3 100644 --- a/homeassistant/components/deconz/.translations/pt.json +++ b/homeassistant/components/deconz/.translations/pt.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Bridge j\u00e1 est\u00e1 configurada", - "no_bridges": "Nenhum deCONZ descoberto", + "no_bridges": "Nenhum hub deCONZ descoberto", "one_instance_only": "Componente suporta apenas uma conex\u00e3o deCONZ" }, "error": { @@ -32,6 +32,5 @@ "side_5": "Lado 5", "side_6": "Lado 6" } - }, - "title": "Gateway Zigbee deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ru.json b/homeassistant/components/deconz/.translations/ru.json index 0798e8ae73c1..1cf09bf8c0cf 100644 --- a/homeassistant/components/deconz/.translations/ru.json +++ b/homeassistant/components/deconz/.translations/ru.json @@ -95,6 +95,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 deCONZ" } } - }, - "title": "deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/sl.json b/homeassistant/components/deconz/.translations/sl.json index 6cd97221fde9..7d7ab2ac6752 100644 --- a/homeassistant/components/deconz/.translations/sl.json +++ b/homeassistant/components/deconz/.translations/sl.json @@ -33,6 +33,7 @@ "device_automation": { "trigger_subtype": { "both_buttons": "Oba gumba", + "bottom_buttons": "Spodnji gumbi", "button_1": "Prvi gumb", "button_2": "Drugi gumb", "button_3": "Tretji gumb", @@ -49,6 +50,7 @@ "side_4": "Stran 4", "side_5": "Stran 5", "side_6": "Stran 6", + "top_buttons": "Zgornji gumbi", "turn_off": "Ugasni", "turn_on": "Pri\u017egi" }, @@ -93,6 +95,5 @@ "title": "mo\u017enosti deCONZ" } } - }, - "title": "deCONZ Zigbee prehod" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/sv.json b/homeassistant/components/deconz/.translations/sv.json index f9c2683ff53f..933b48ca7309 100644 --- a/homeassistant/components/deconz/.translations/sv.json +++ b/homeassistant/components/deconz/.translations/sv.json @@ -92,6 +92,5 @@ "description": "Konfigurera synlighet f\u00f6r deCONZ-enhetstyper" } } - }, - "title": "deCONZ Zigbee Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/zh-Hans.json b/homeassistant/components/deconz/.translations/zh-Hans.json index 40c51f99d0aa..07213aa95398 100644 --- a/homeassistant/components/deconz/.translations/zh-Hans.json +++ b/homeassistant/components/deconz/.translations/zh-Hans.json @@ -51,6 +51,5 @@ "title": "deCONZ \u9009\u9879" } } - }, - "title": "deCONZ" + } } \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/zh-Hant.json b/homeassistant/components/deconz/.translations/zh-Hant.json index a74782396828..0d7cf62f26ec 100644 --- a/homeassistant/components/deconz/.translations/zh-Hant.json +++ b/homeassistant/components/deconz/.translations/zh-Hant.json @@ -95,6 +95,5 @@ "title": "deCONZ \u9078\u9805" } } - }, - "title": "deCONZ Zigbee \u9598\u9053\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/af.json b/homeassistant/components/device_tracker/.translations/af.json new file mode 100644 index 000000000000..b5f17b7b6c5b --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Toestel opspoorder" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/ar.json b/homeassistant/components/device_tracker/.translations/ar.json new file mode 100644 index 000000000000..210306752bc5 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062a\u0639\u0642\u0628 \u0627\u0644\u062c\u0647\u0627\u0632" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/bg.json b/homeassistant/components/device_tracker/.translations/bg.json index 68affa5afd04..4546b7777cd1 100644 --- a/homeassistant/components/device_tracker/.translations/bg.json +++ b/homeassistant/components/device_tracker/.translations/bg.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u0435 \u0443 \u0434\u043e\u043c\u0430", "is_not_home": "{entity_name} \u043d\u0435 \u0435 \u0443 \u0434\u043e\u043c\u0430" } - } + }, + "title": "\u041f\u0440\u043e\u0441\u043b\u0435\u0434\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/bs.json b/homeassistant/components/device_tracker/.translations/bs.json new file mode 100644 index 000000000000..e02959cb4a33 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Pra\u0107enje ure\u0111aja" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/ca.json b/homeassistant/components/device_tracker/.translations/ca.json index 3a95841559b2..21bb882f72f4 100644 --- a/homeassistant/components/device_tracker/.translations/ca.json +++ b/homeassistant/components/device_tracker/.translations/ca.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u00e9s a casa", "is_not_home": "{entity_name} no \u00e9s a casa" } - } + }, + "title": "Seguiment de dispositius" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/cs.json b/homeassistant/components/device_tracker/.translations/cs.json index 7e82f1a34f86..b03a107fb04d 100644 --- a/homeassistant/components/device_tracker/.translations/cs.json +++ b/homeassistant/components/device_tracker/.translations/cs.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} je doma", "is_not_home": "{entity_name} nen\u00ed doma" } - } + }, + "title": "Sledova\u010d za\u0159\u00edzen\u00ed" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/cy.json b/homeassistant/components/device_tracker/.translations/cy.json new file mode 100644 index 000000000000..a43481ced8ac --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Traciwr dyfais" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/da.json b/homeassistant/components/device_tracker/.translations/da.json index d714b5b7d31c..5313afe53b3e 100644 --- a/homeassistant/components/device_tracker/.translations/da.json +++ b/homeassistant/components/device_tracker/.translations/da.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} er hjemme", "is_not_home": "{entity_name} er ikke hjemme" } - } + }, + "title": "Enhedssporing" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/de.json b/homeassistant/components/device_tracker/.translations/de.json index 90a81db6b905..33e2d407f5d7 100644 --- a/homeassistant/components/device_tracker/.translations/de.json +++ b/homeassistant/components/device_tracker/.translations/de.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} ist Zuhause", "is_not_home": "{entity_name} ist nicht zu Hause" } - } + }, + "title": "Ger\u00e4te-Tracker" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/el.json b/homeassistant/components/device_tracker/.translations/el.json new file mode 100644 index 000000000000..4a8c6db80e10 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03b1\u03bd\u03b9\u03c7\u03bd\u03b5\u03c5\u03c4\u03ae" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/en.json b/homeassistant/components/device_tracker/.translations/en.json index 1022608477eb..7a9cad1d87b2 100644 --- a/homeassistant/components/device_tracker/.translations/en.json +++ b/homeassistant/components/device_tracker/.translations/en.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} is home", "is_not_home": "{entity_name} is not home" } - } + }, + "title": "Device tracker" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/es-419.json b/homeassistant/components/device_tracker/.translations/es-419.json index cfbf7bcfe3eb..2943fcb0e08e 100644 --- a/homeassistant/components/device_tracker/.translations/es-419.json +++ b/homeassistant/components/device_tracker/.translations/es-419.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} est\u00e1 en casa", "is_not_home": "{entity_name} no est\u00e1 en casa" } - } + }, + "title": "Rastreador de dispositivos" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/es.json b/homeassistant/components/device_tracker/.translations/es.json index cfbf7bcfe3eb..c9c5ab444bf3 100644 --- a/homeassistant/components/device_tracker/.translations/es.json +++ b/homeassistant/components/device_tracker/.translations/es.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} est\u00e1 en casa", "is_not_home": "{entity_name} no est\u00e1 en casa" } - } + }, + "title": "Rastreador de dispositivo" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/et.json b/homeassistant/components/device_tracker/.translations/et.json new file mode 100644 index 000000000000..343c22aa45ec --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Seadme tr\u00e4kker" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/fa.json b/homeassistant/components/device_tracker/.translations/fa.json new file mode 100644 index 000000000000..5df02049595e --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0631\u062f\u06cc\u0627\u0628" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/fi.json b/homeassistant/components/device_tracker/.translations/fi.json new file mode 100644 index 000000000000..82c64c47046c --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Laiteseuranta" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/fr.json b/homeassistant/components/device_tracker/.translations/fr.json index 4c59d5ea1c8a..1546d885b933 100644 --- a/homeassistant/components/device_tracker/.translations/fr.json +++ b/homeassistant/components/device_tracker/.translations/fr.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} est \u00e0 la maison", "is_not_home": "{entity_name} n'est pas \u00e0 la maison" } - } + }, + "title": "Dispositif de suivi" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/he.json b/homeassistant/components/device_tracker/.translations/he.json new file mode 100644 index 000000000000..d68f6442adcd --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05e2\u05e7\u05d1 \u05de\u05db\u05e9\u05d9\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/hi.json b/homeassistant/components/device_tracker/.translations/hi.json new file mode 100644 index 000000000000..dba6c44f4c98 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0921\u093f\u0935\u093e\u0907\u0938 \u091f\u094d\u0930\u0948\u0915\u0930" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/hr.json b/homeassistant/components/device_tracker/.translations/hr.json new file mode 100644 index 000000000000..e02959cb4a33 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Pra\u0107enje ure\u0111aja" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/hu.json b/homeassistant/components/device_tracker/.translations/hu.json index 7302f40df9e6..794eaeb2c629 100644 --- a/homeassistant/components/device_tracker/.translations/hu.json +++ b/homeassistant/components/device_tracker/.translations/hu.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} otthon van", "is_not_home": "{entity_name} nincs otthon" } - } + }, + "title": "Eszk\u00f6z nyomk\u00f6vet\u0151" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/hy.json b/homeassistant/components/device_tracker/.translations/hy.json new file mode 100644 index 000000000000..52323bd892d6 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054d\u0561\u0580\u0584\u056b \u0578\u0580\u0578\u0576\u056b\u0579" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/id.json b/homeassistant/components/device_tracker/.translations/id.json new file mode 100644 index 000000000000..06d58c264946 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Pelacak perangkat" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/is.json b/homeassistant/components/device_tracker/.translations/is.json new file mode 100644 index 000000000000..55dfbb4dcc11 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Rekja t\u00e6ki" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/it.json b/homeassistant/components/device_tracker/.translations/it.json index 112afc6689f3..0cd34c90fd58 100644 --- a/homeassistant/components/device_tracker/.translations/it.json +++ b/homeassistant/components/device_tracker/.translations/it.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u00e8 in casa", "is_not_home": "{entity_name} non \u00e8 in casa" } - } + }, + "title": "Tracciatore dispositivo" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/ko.json b/homeassistant/components/device_tracker/.translations/ko.json index 1834767222a9..5202f8b6f1db 100644 --- a/homeassistant/components/device_tracker/.translations/ko.json +++ b/homeassistant/components/device_tracker/.translations/ko.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \uc774(\uac00) \uc9d1\uc5d0 \uc788\uc73c\uba74", "is_not_home": "{entity_name} \uc774(\uac00) \uc678\ucd9c \uc911\uc774\uba74" } - } + }, + "title": "\ucd94\uc801 \uae30\uae30" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/lb.json b/homeassistant/components/device_tracker/.translations/lb.json index 2c49f6926627..204488d856af 100644 --- a/homeassistant/components/device_tracker/.translations/lb.json +++ b/homeassistant/components/device_tracker/.translations/lb.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} ass doheem", "is_not_home": "{entity_name} ass net doheem" } - } + }, + "title": "Apparat Verfolgung" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/lv.json b/homeassistant/components/device_tracker/.translations/lv.json new file mode 100644 index 000000000000..0e4d636cb52d --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ier\u012b\u010du izsekot\u0101js" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/nb.json b/homeassistant/components/device_tracker/.translations/nb.json new file mode 100644 index 000000000000..574645aa5374 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Enhetssporing" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/nl.json b/homeassistant/components/device_tracker/.translations/nl.json index 31ab788f171f..73d583cdcd08 100644 --- a/homeassistant/components/device_tracker/.translations/nl.json +++ b/homeassistant/components/device_tracker/.translations/nl.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} is thuis", "is_not_home": "{entity_name} is niet thuis" } - } + }, + "title": "Apparaat tracker" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/nn.json b/homeassistant/components/device_tracker/.translations/nn.json new file mode 100644 index 000000000000..420fab86493d --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Einingssporing" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/pl.json b/homeassistant/components/device_tracker/.translations/pl.json index 3930031ad38f..1bdee1038470 100644 --- a/homeassistant/components/device_tracker/.translations/pl.json +++ b/homeassistant/components/device_tracker/.translations/pl.json @@ -4,5 +4,6 @@ "is_home": "urz\u0105dzenie {entity_name} jest w domu", "is_not_home": "urz\u0105dzenie {entity_name} jest poza domem" } - } + }, + "title": "\u015aledzenie urz\u0105dze\u0144" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/pt-BR.json b/homeassistant/components/device_tracker/.translations/pt-BR.json new file mode 100644 index 000000000000..299568d752d5 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Rastreador de dispositivo" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/pt.json b/homeassistant/components/device_tracker/.translations/pt.json index 8a8f662183a2..193d1622f9fc 100644 --- a/homeassistant/components/device_tracker/.translations/pt.json +++ b/homeassistant/components/device_tracker/.translations/pt.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} est\u00e1 em casa", "is_not_home": "{entity_name} n\u00e3o est\u00e1 em casa" } - } + }, + "title": "Monitorizador de dispositivos" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/ro.json b/homeassistant/components/device_tracker/.translations/ro.json new file mode 100644 index 000000000000..93c8ffc041b9 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Dispozitiv tracker" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/ru.json b/homeassistant/components/device_tracker/.translations/ru.json index 58767361fd4c..6bc3e75e0e5d 100644 --- a/homeassistant/components/device_tracker/.translations/ru.json +++ b/homeassistant/components/device_tracker/.translations/ru.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u0434\u043e\u043c\u0430", "is_not_home": "{entity_name} \u043d\u0435 \u0434\u043e\u043c\u0430" } - } + }, + "title": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/sk.json b/homeassistant/components/device_tracker/.translations/sk.json new file mode 100644 index 000000000000..134b52d04752 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Sledovanie zariadenia" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/sl.json b/homeassistant/components/device_tracker/.translations/sl.json index 11d876883d37..36c1ca747ad4 100644 --- a/homeassistant/components/device_tracker/.translations/sl.json +++ b/homeassistant/components/device_tracker/.translations/sl.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} je doma", "is_not_home": "{entity_name} ni doma" } - } + }, + "title": "Sledilnik naprave" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/sv.json b/homeassistant/components/device_tracker/.translations/sv.json index 70287ad318af..df0ff63f2369 100644 --- a/homeassistant/components/device_tracker/.translations/sv.json +++ b/homeassistant/components/device_tracker/.translations/sv.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u00e4r hemma", "is_not_home": "{entity_name} \u00e4r inte hemma" } - } + }, + "title": "Enhetssp\u00e5rare" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/te.json b/homeassistant/components/device_tracker/.translations/te.json new file mode 100644 index 000000000000..fce36c00386a --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c1f\u0c4d\u0c30\u0c3e\u0c15\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/th.json b/homeassistant/components/device_tracker/.translations/th.json new file mode 100644 index 000000000000..259d24903711 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/tr.json b/homeassistant/components/device_tracker/.translations/tr.json new file mode 100644 index 000000000000..c899992ba6b9 --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Cihaz izleyici" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/uk.json b/homeassistant/components/device_tracker/.translations/uk.json new file mode 100644 index 000000000000..ca99ed4372ff --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0422\u0440\u0435\u043a\u0435\u0440 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/vi.json b/homeassistant/components/device_tracker/.translations/vi.json new file mode 100644 index 000000000000..26d1be1972aa --- /dev/null +++ b/homeassistant/components/device_tracker/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Tr\u00ecnh theo d\u00f5i thi\u1ebft b\u1ecb" +} \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/zh-Hans.json b/homeassistant/components/device_tracker/.translations/zh-Hans.json index 456e09ebf0e8..83595d2b67e1 100644 --- a/homeassistant/components/device_tracker/.translations/zh-Hans.json +++ b/homeassistant/components/device_tracker/.translations/zh-Hans.json @@ -4,5 +4,6 @@ "is_home": "{entity_name} \u5728\u5bb6", "is_not_home": "{entity_name} \u4e0d\u5728\u5bb6" } - } + }, + "title": "\u8bbe\u5907\u8ddf\u8e2a\u5668" } \ No newline at end of file diff --git a/homeassistant/components/device_tracker/.translations/zh-Hant.json b/homeassistant/components/device_tracker/.translations/zh-Hant.json index 6611cb0c279d..e4adb451c203 100644 --- a/homeassistant/components/device_tracker/.translations/zh-Hant.json +++ b/homeassistant/components/device_tracker/.translations/zh-Hant.json @@ -4,5 +4,6 @@ "is_home": "{entity_name}\u5728\u5bb6", "is_not_home": "{entity_name}\u4e0d\u5728\u5bb6" } - } + }, + "title": "\u8a2d\u5099\u8ffd\u8e64\u5668" } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/bg.json b/homeassistant/components/dialogflow/.translations/bg.json index e7b2842e0dc7..069545d93c8f 100644 --- a/homeassistant/components/dialogflow/.translations/bg.json +++ b/homeassistant/components/dialogflow/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ca.json b/homeassistant/components/dialogflow/.translations/ca.json index 3d06f8cb9abf..17dd38ffb203 100644 --- a/homeassistant/components/dialogflow/.translations/ca.json +++ b/homeassistant/components/dialogflow/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/cs.json b/homeassistant/components/dialogflow/.translations/cs.json index 69db954c6f22..3ad8ba78c72e 100644 --- a/homeassistant/components/dialogflow/.translations/cs.json +++ b/homeassistant/components/dialogflow/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastavit Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/da.json b/homeassistant/components/dialogflow/.translations/da.json index 2d06efc2fa60..bcab485a51ad 100644 --- a/homeassistant/components/dialogflow/.translations/da.json +++ b/homeassistant/components/dialogflow/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/de.json b/homeassistant/components/dialogflow/.translations/de.json index 199a1a83d7f3..cc65084d5aef 100644 --- a/homeassistant/components/dialogflow/.translations/de.json +++ b/homeassistant/components/dialogflow/.translations/de.json @@ -13,6 +13,5 @@ "title": "Dialogflow Webhook einrichten" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/en.json b/homeassistant/components/dialogflow/.translations/en.json index f5f1633dfd47..cc9eda6a9680 100644 --- a/homeassistant/components/dialogflow/.translations/en.json +++ b/homeassistant/components/dialogflow/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/es-419.json b/homeassistant/components/dialogflow/.translations/es-419.json index b3e07c6fb263..1aa3d23cb7ef 100644 --- a/homeassistant/components/dialogflow/.translations/es-419.json +++ b/homeassistant/components/dialogflow/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/es.json b/homeassistant/components/dialogflow/.translations/es.json index ff8394ee0e8a..a25f2db891b1 100644 --- a/homeassistant/components/dialogflow/.translations/es.json +++ b/homeassistant/components/dialogflow/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/fr.json b/homeassistant/components/dialogflow/.translations/fr.json index e4aef551359e..81de11edbd5b 100644 --- a/homeassistant/components/dialogflow/.translations/fr.json +++ b/homeassistant/components/dialogflow/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/hu.json b/homeassistant/components/dialogflow/.translations/hu.json index c042737ff671..d44e7f60cc6f 100644 --- a/homeassistant/components/dialogflow/.translations/hu.json +++ b/homeassistant/components/dialogflow/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Dialogflow Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/it.json b/homeassistant/components/dialogflow/.translations/it.json index 717f037a836b..fe31d88e5c41 100644 --- a/homeassistant/components/dialogflow/.translations/it.json +++ b/homeassistant/components/dialogflow/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ko.json b/homeassistant/components/dialogflow/.translations/ko.json index 2ca23b9c4206..ef49094efdb8 100644 --- a/homeassistant/components/dialogflow/.translations/ko.json +++ b/homeassistant/components/dialogflow/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Dialogflow Webhook \uc124\uc815" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/lb.json b/homeassistant/components/dialogflow/.translations/lb.json index d3a4fdc1862f..a10adda67025 100644 --- a/homeassistant/components/dialogflow/.translations/lb.json +++ b/homeassistant/components/dialogflow/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Dialogflow Webhook ariichten" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/nl.json b/homeassistant/components/dialogflow/.translations/nl.json index 5590df8dab20..473953717976 100644 --- a/homeassistant/components/dialogflow/.translations/nl.json +++ b/homeassistant/components/dialogflow/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de Twilio Dialogflow in" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/no.json b/homeassistant/components/dialogflow/.translations/no.json index 7b97ce66a182..8abbc221b7cc 100644 --- a/homeassistant/components/dialogflow/.translations/no.json +++ b/homeassistant/components/dialogflow/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pl.json b/homeassistant/components/dialogflow/.translations/pl.json index a1d35e134d9e..3b939a9f3693 100644 --- a/homeassistant/components/dialogflow/.translations/pl.json +++ b/homeassistant/components/dialogflow/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pt-BR.json b/homeassistant/components/dialogflow/.translations/pt-BR.json index d8bac88ebf19..3d4ad4ca34bb 100644 --- a/homeassistant/components/dialogflow/.translations/pt-BR.json +++ b/homeassistant/components/dialogflow/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/pt.json b/homeassistant/components/dialogflow/.translations/pt.json index 18144097b48b..e6ed255e6c08 100644 --- a/homeassistant/components/dialogflow/.translations/pt.json +++ b/homeassistant/components/dialogflow/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/ru.json b/homeassistant/components/dialogflow/.translations/ru.json index c8e5424ee916..15ecb63392e0 100644 --- a/homeassistant/components/dialogflow/.translations/ru.json +++ b/homeassistant/components/dialogflow/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Dialogflow" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/sl.json b/homeassistant/components/dialogflow/.translations/sl.json index 28ee1a39dbcf..742302dcd178 100644 --- a/homeassistant/components/dialogflow/.translations/sl.json +++ b/homeassistant/components/dialogflow/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/sv.json b/homeassistant/components/dialogflow/.translations/sv.json index 5ebf8da8f7b2..bd3ae17ae743 100644 --- a/homeassistant/components/dialogflow/.translations/sv.json +++ b/homeassistant/components/dialogflow/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/zh-Hans.json b/homeassistant/components/dialogflow/.translations/zh-Hans.json index 7fd74e1d0084..8ae8cb6f78e5 100644 --- a/homeassistant/components/dialogflow/.translations/zh-Hans.json +++ b/homeassistant/components/dialogflow/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/dialogflow/.translations/zh-Hant.json b/homeassistant/components/dialogflow/.translations/zh-Hant.json index 3943e5f07ef8..a9c9316e6003 100644 --- a/homeassistant/components/dialogflow/.translations/zh-Hant.json +++ b/homeassistant/components/dialogflow/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Dialogflow Webhook" } } - }, - "title": "Dialogflow" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ca.json b/homeassistant/components/directv/.translations/ca.json index e9c3621c9560..98156c3c701d 100644 --- a/homeassistant/components/directv/.translations/ca.json +++ b/homeassistant/components/directv/.translations/ca.json @@ -20,6 +20,5 @@ "title": "Connexi\u00f3 amb el receptor DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/de.json b/homeassistant/components/directv/.translations/de.json index bd18159b134a..0b3fa8f29e85 100644 --- a/homeassistant/components/directv/.translations/de.json +++ b/homeassistant/components/directv/.translations/de.json @@ -24,6 +24,5 @@ "title": "Schlie\u00dfen Sie den DirecTV-Empf\u00e4nger an" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/en.json b/homeassistant/components/directv/.translations/en.json index e7b9c7db6b69..e271497ae341 100644 --- a/homeassistant/components/directv/.translations/en.json +++ b/homeassistant/components/directv/.translations/en.json @@ -20,6 +20,5 @@ "title": "Connect to the DirecTV receiver" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/es.json b/homeassistant/components/directv/.translations/es.json index 6e69dfe82531..a69cc9c32dd7 100644 --- a/homeassistant/components/directv/.translations/es.json +++ b/homeassistant/components/directv/.translations/es.json @@ -20,6 +20,5 @@ "title": "Conectar con el receptor DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/fr.json b/homeassistant/components/directv/.translations/fr.json index 0847d858f60d..d165476de662 100644 --- a/homeassistant/components/directv/.translations/fr.json +++ b/homeassistant/components/directv/.translations/fr.json @@ -20,6 +20,5 @@ "title": "Connectez-vous au r\u00e9cepteur DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/it.json b/homeassistant/components/directv/.translations/it.json index cafebc6426fc..3c740c8966cb 100644 --- a/homeassistant/components/directv/.translations/it.json +++ b/homeassistant/components/directv/.translations/it.json @@ -24,6 +24,5 @@ "title": "Collegamento al ricevitore DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ko.json b/homeassistant/components/directv/.translations/ko.json index 49b5bb311bb5..8c3bbb94a8db 100644 --- a/homeassistant/components/directv/.translations/ko.json +++ b/homeassistant/components/directv/.translations/ko.json @@ -20,6 +20,5 @@ "title": "DirecTV \ub9ac\uc2dc\ubc84\uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/lb.json b/homeassistant/components/directv/.translations/lb.json index 4b7bdafb9ed3..1fb8b72cde82 100644 --- a/homeassistant/components/directv/.translations/lb.json +++ b/homeassistant/components/directv/.translations/lb.json @@ -24,6 +24,5 @@ "title": "Mam DirecTV Receiver verbannen" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/no.json b/homeassistant/components/directv/.translations/no.json index 62cefda80a1c..9e0906ea2ac6 100644 --- a/homeassistant/components/directv/.translations/no.json +++ b/homeassistant/components/directv/.translations/no.json @@ -20,6 +20,5 @@ "title": "Koble til DirecTV-mottakeren" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/pl.json b/homeassistant/components/directv/.translations/pl.json index a12229a12dbc..23010c90c1f9 100644 --- a/homeassistant/components/directv/.translations/pl.json +++ b/homeassistant/components/directv/.translations/pl.json @@ -26,6 +26,5 @@ "title": "Po\u0142\u0105czenie z odbiornikiem DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/ru.json b/homeassistant/components/directv/.translations/ru.json index e83fb1547ecd..a45380994802 100644 --- a/homeassistant/components/directv/.translations/ru.json +++ b/homeassistant/components/directv/.translations/ru.json @@ -20,6 +20,5 @@ "title": "DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/sl.json b/homeassistant/components/directv/.translations/sl.json index a0919a772995..19387c68db05 100644 --- a/homeassistant/components/directv/.translations/sl.json +++ b/homeassistant/components/directv/.translations/sl.json @@ -26,6 +26,5 @@ "title": "Pove\u017eite se s sprejemnikom DirecTV" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/directv/.translations/zh-Hant.json b/homeassistant/components/directv/.translations/zh-Hant.json index 98fb3f6519fb..6546dafc133a 100644 --- a/homeassistant/components/directv/.translations/zh-Hant.json +++ b/homeassistant/components/directv/.translations/zh-Hant.json @@ -20,6 +20,5 @@ "title": "\u9023\u7dda\u81f3 DirecTV \u63a5\u6536\u5668" } } - }, - "title": "DirecTV" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ca.json b/homeassistant/components/doorbird/.translations/ca.json index dce019b8e334..9bd469ee4e1d 100644 --- a/homeassistant/components/doorbird/.translations/ca.json +++ b/homeassistant/components/doorbird/.translations/ca.json @@ -32,6 +32,5 @@ "description": "Afegeix el/s noms del/s esdeveniment/s que vulguis seguir separats per comes. Despr\u00e9s d\u2019introduir-los, utilitzeu l\u2019aplicaci\u00f3 de DoorBird per assignar-los a un esdeveniment espec\u00edfic. Consulta la documentaci\u00f3 a https://www.home-assistant.io/integrations/doorbird/#events.\nExemple: algu_ha_premut_el_boto, moviment_detectat" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/de.json b/homeassistant/components/doorbird/.translations/de.json index fc31a6e1af27..ad9d99e555dd 100644 --- a/homeassistant/components/doorbird/.translations/de.json +++ b/homeassistant/components/doorbird/.translations/de.json @@ -32,6 +32,5 @@ "description": "F\u00fcgen Sie f\u00fcr jedes Ereignis, das Sie verfolgen m\u00f6chten, einen durch Kommas getrennten Ereignisnamen hinzu. Nachdem Sie sie hier eingegeben haben, verwenden Sie die DoorBird-App, um sie einem bestimmten Ereignis zuzuweisen. Weitere Informationen finden Sie in der Dokumentation unter https://www.home-assistant.io/integrations/doorbird/#events. Beispiel: jemand_hat_den_knopf_gedr\u00fcckt, bewegung" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/en.json b/homeassistant/components/doorbird/.translations/en.json index 8776359503fd..7e3ba8037715 100644 --- a/homeassistant/components/doorbird/.translations/en.json +++ b/homeassistant/components/doorbird/.translations/en.json @@ -32,6 +32,5 @@ "description": "Add an comma separated event name for each event you wish to track. After entering them here, use the DoorBird app to assign them to a specific event. See the documentation at https://www.home-assistant.io/integrations/doorbird/#events. Example: somebody_pressed_the_button, motion" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/es.json b/homeassistant/components/doorbird/.translations/es.json index d87d5004a857..70717aef6ad8 100644 --- a/homeassistant/components/doorbird/.translations/es.json +++ b/homeassistant/components/doorbird/.translations/es.json @@ -32,6 +32,5 @@ "description": "A\u00f1ade un nombre de evento separado por comas para cada evento del que deseas realizar un seguimiento. Despu\u00e9s de introducirlos aqu\u00ed, utiliza la aplicaci\u00f3n DoorBird para asignarlos a un evento espec\u00edfico. Consulta la documentaci\u00f3n en https://www.home-assistant.io/integrations/doorbird/#events. Ejemplo: somebody_pressed_the_button, motion" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/fr.json b/homeassistant/components/doorbird/.translations/fr.json index be74bc781d00..95a7cfb30867 100644 --- a/homeassistant/components/doorbird/.translations/fr.json +++ b/homeassistant/components/doorbird/.translations/fr.json @@ -28,6 +28,5 @@ } } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/it.json b/homeassistant/components/doorbird/.translations/it.json index 0bd9fc1d9fd1..c08c666d6f87 100644 --- a/homeassistant/components/doorbird/.translations/it.json +++ b/homeassistant/components/doorbird/.translations/it.json @@ -32,6 +32,5 @@ "description": "Aggiungere un nome di evento separato da virgola per ogni evento che si desidera monitorare. Dopo averli inseriti qui, usa l'applicazione DoorBird per assegnarli a un evento specifico. Consultare la documentazione su https://www.home-assistant.io/integrations/doorbird/#events. Esempio: qualcuno_premuto_il_pulsante, movimento" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ko.json b/homeassistant/components/doorbird/.translations/ko.json index d721ba4671a3..72632afed89b 100644 --- a/homeassistant/components/doorbird/.translations/ko.json +++ b/homeassistant/components/doorbird/.translations/ko.json @@ -32,6 +32,5 @@ "description": "\ucd94\uc801\ud558\ub824\ub294 \uac01 \uc774\ubca4\ud2b8\uc5d0 \ub300\ud574 \uc27c\ud45c\ub85c \uad6c\ubd84\ub41c \uc774\ubca4\ud2b8 \uc774\ub984\uc744 \ucd94\uac00\ud574\uc8fc\uc138\uc694. \uc5ec\uae30\uc5d0 \uc785\ub825\ud55c \ud6c4 DoorBird \uc571\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b9\uc815 \uc774\ubca4\ud2b8\uc5d0 \ud560\ub2f9\ud574\uc8fc\uc138\uc694. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 https://www.home-assistant.io/integrations/doorbird/#event \uc124\uba85\uc11c\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694. \uc608: someone_pressed_the_button, motion" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/lb.json b/homeassistant/components/doorbird/.translations/lb.json index 1c2d53870f7d..b41931be828d 100644 --- a/homeassistant/components/doorbird/.translations/lb.json +++ b/homeassistant/components/doorbird/.translations/lb.json @@ -32,6 +32,5 @@ "description": "Setzt ee mat Komma getrennten Evenement Numm fir all Evenement dob\u00e4i d\u00e9i sollt suiv\u00e9iert ginn. Wann's du se hei aginn hues, benotz d'DoorBird App fir se zu engem spezifeschen Evenement dob\u00e4i ze setzen. Kuckt d'Dokumentatioun op https://www.home-assistant.io/integrations/doorbird/#events. Beispill: somebody_pressed_the_button, motion" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/no.json b/homeassistant/components/doorbird/.translations/no.json index 04462798fc72..158b783406a7 100644 --- a/homeassistant/components/doorbird/.translations/no.json +++ b/homeassistant/components/doorbird/.translations/no.json @@ -10,6 +10,7 @@ "invalid_auth": "Ugyldig godkjenning", "unknown": "Uventet feil" }, + "flow_title": "DoorBird {name} ( {host} )", "step": { "user": { "data": { @@ -31,6 +32,5 @@ "description": "Legg til et kommaseparert hendelsesnavn for hvert arrangement du \u00f8nsker \u00e5 spore. Etter \u00e5 ha skrevet dem inn her, bruker du DoorBird-appen til \u00e5 tilordne dem til en bestemt hendelse. Se dokumentasjonen p\u00e5 https://www.home-assistant.io/integrations/doorbird/#events. Eksempel: noen_trykket_knappen, bevegelse" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/ru.json b/homeassistant/components/doorbird/.translations/ru.json index 8baf1e12ccb0..c6a638f2530a 100644 --- a/homeassistant/components/doorbird/.translations/ru.json +++ b/homeassistant/components/doorbird/.translations/ru.json @@ -32,6 +32,5 @@ "description": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 DoorBird, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e. \u041f\u0440\u0438\u043c\u0435\u0440: somebody_pressed_the_button, motion. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438: https://www.home-assistant.io/integrations/doorbird/#events." } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/sl.json b/homeassistant/components/doorbird/.translations/sl.json new file mode 100644 index 000000000000..336a40904d2f --- /dev/null +++ b/homeassistant/components/doorbird/.translations/sl.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Ta DoorBird je \u017ee nastavljen", + "link_local_address": "Lokalni naslovi povezav niso podprti", + "not_doorbird_device": "Ta naprava ni DoorBird" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "unknown": "Nepri\u010dakovana napaka" + }, + "flow_title": "DoorBird {name} ({host})", + "step": { + "user": { + "data": { + "host": "Gostitelj (IP naslov)", + "name": "Ime naprave", + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "title": "Pove\u017eite se z DoorBird" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "events": "Seznam dogodkov, lo\u010denih z vejico." + }, + "description": "Za vsak dogodek, ki ga \u017eelite spremljati, dodajte ime, lo\u010deno z vejico. Ko jih tukaj vnesete, uporabite aplikacijo DoorBird, da jih dodelite dolo\u010denemu dogodku. Glej dokumentacijo na strani https://www.home-assistant.io/integrations/doorbird/#events. Primer: nekdo_pritisnil_gumb, gibanje" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/doorbird/.translations/zh-Hant.json b/homeassistant/components/doorbird/.translations/zh-Hant.json index d751f51edc39..b751d1bcf839 100644 --- a/homeassistant/components/doorbird/.translations/zh-Hant.json +++ b/homeassistant/components/doorbird/.translations/zh-Hant.json @@ -32,6 +32,5 @@ "description": "\u4ee5\u9017\u865f\u5206\u5225\u6240\u8981\u8ffd\u8e64\u7684\u4e8b\u4ef6\u540d\u7a31\u3002\u65bc\u6b64\u8f38\u5165\u5f8c\uff0c\u4f7f\u7528 DoorBird App \u6307\u5b9a\u81f3\u7279\u5b9a\u4e8b\u4ef6\u3002\u8acb\u53c3\u95b1\u6587\u4ef6\uff1ahttps://www.home-assistant.io/integrations/doorbird/#events\u3002\u4f8b\u5982\uff1asomebody_pressed_the_button, motion" } } - }, - "title": "DoorBird" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/bg.json b/homeassistant/components/ecobee/.translations/bg.json index 6fb6ef757bea..773bc6bd11f0 100644 --- a/homeassistant/components/ecobee/.translations/bg.json +++ b/homeassistant/components/ecobee/.translations/bg.json @@ -20,6 +20,5 @@ "title": "ecobee API \u043a\u043b\u044e\u0447" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ca.json b/homeassistant/components/ecobee/.translations/ca.json index db6c064331c3..916c700a1838 100644 --- a/homeassistant/components/ecobee/.translations/ca.json +++ b/homeassistant/components/ecobee/.translations/ca.json @@ -20,6 +20,5 @@ "title": "Clau API d'ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/da.json b/homeassistant/components/ecobee/.translations/da.json index c7db0e1cc0a7..27af2cc09870 100644 --- a/homeassistant/components/ecobee/.translations/da.json +++ b/homeassistant/components/ecobee/.translations/da.json @@ -20,6 +20,5 @@ "title": "ecobee API-n\u00f8gle" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/de.json b/homeassistant/components/ecobee/.translations/de.json index f9567c9a7892..d0be33847c2d 100644 --- a/homeassistant/components/ecobee/.translations/de.json +++ b/homeassistant/components/ecobee/.translations/de.json @@ -20,6 +20,5 @@ "title": "ecobee API-Schl\u00fcssel" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/en.json b/homeassistant/components/ecobee/.translations/en.json index 58c9624857c6..a105296f813e 100644 --- a/homeassistant/components/ecobee/.translations/en.json +++ b/homeassistant/components/ecobee/.translations/en.json @@ -20,6 +20,5 @@ "title": "ecobee API key" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/es.json b/homeassistant/components/ecobee/.translations/es.json index 988d789d3d4d..26260e38ca7f 100644 --- a/homeassistant/components/ecobee/.translations/es.json +++ b/homeassistant/components/ecobee/.translations/es.json @@ -20,6 +20,5 @@ "title": "Clave API de ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/fr.json b/homeassistant/components/ecobee/.translations/fr.json index 6e783913f67f..46e56ce8a16a 100644 --- a/homeassistant/components/ecobee/.translations/fr.json +++ b/homeassistant/components/ecobee/.translations/fr.json @@ -20,6 +20,5 @@ "title": "Cl\u00e9 API ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/hu.json b/homeassistant/components/ecobee/.translations/hu.json index c37646fa6e84..4910991e7382 100644 --- a/homeassistant/components/ecobee/.translations/hu.json +++ b/homeassistant/components/ecobee/.translations/hu.json @@ -20,6 +20,5 @@ "title": "ecobee API kulcs" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/it.json b/homeassistant/components/ecobee/.translations/it.json index 10591facd04b..428ce7822917 100644 --- a/homeassistant/components/ecobee/.translations/it.json +++ b/homeassistant/components/ecobee/.translations/it.json @@ -20,6 +20,5 @@ "title": "chiave API ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ko.json b/homeassistant/components/ecobee/.translations/ko.json index c946ef74a90b..1973c3ab8a3a 100644 --- a/homeassistant/components/ecobee/.translations/ko.json +++ b/homeassistant/components/ecobee/.translations/ko.json @@ -20,6 +20,5 @@ "title": "ecobee API \ud0a4" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/lb.json b/homeassistant/components/ecobee/.translations/lb.json index ab9bb411b5e4..adcee0b0849f 100644 --- a/homeassistant/components/ecobee/.translations/lb.json +++ b/homeassistant/components/ecobee/.translations/lb.json @@ -20,6 +20,5 @@ "title": "ecobee API Schl\u00ebssel" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/nl.json b/homeassistant/components/ecobee/.translations/nl.json index 94c9e1f35b0b..9bb62c258c81 100644 --- a/homeassistant/components/ecobee/.translations/nl.json +++ b/homeassistant/components/ecobee/.translations/nl.json @@ -20,6 +20,5 @@ "title": "ecobee API-sleutel" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/no.json b/homeassistant/components/ecobee/.translations/no.json index b925aeaf26a7..560fe4cf4e17 100644 --- a/homeassistant/components/ecobee/.translations/no.json +++ b/homeassistant/components/ecobee/.translations/no.json @@ -20,6 +20,5 @@ "title": "ecobee API-n\u00f8kkel" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/pl.json b/homeassistant/components/ecobee/.translations/pl.json index 48d36c53fd84..c0fed1d075c6 100644 --- a/homeassistant/components/ecobee/.translations/pl.json +++ b/homeassistant/components/ecobee/.translations/pl.json @@ -20,6 +20,5 @@ "title": "Klucz API" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/pt-BR.json b/homeassistant/components/ecobee/.translations/pt-BR.json index 34650c72e1a0..8b970c140be1 100644 --- a/homeassistant/components/ecobee/.translations/pt-BR.json +++ b/homeassistant/components/ecobee/.translations/pt-BR.json @@ -19,6 +19,5 @@ "title": "chave da API ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/ru.json b/homeassistant/components/ecobee/.translations/ru.json index fe382a390599..37c1f63822c2 100644 --- a/homeassistant/components/ecobee/.translations/ru.json +++ b/homeassistant/components/ecobee/.translations/ru.json @@ -20,6 +20,5 @@ "title": "ecobee" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/sl.json b/homeassistant/components/ecobee/.translations/sl.json index b674dc122603..ee84a98cf34f 100644 --- a/homeassistant/components/ecobee/.translations/sl.json +++ b/homeassistant/components/ecobee/.translations/sl.json @@ -20,6 +20,5 @@ "title": "ecobee API klju\u010d" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/sv.json b/homeassistant/components/ecobee/.translations/sv.json index 2004d82aebad..4bfb4e0ec128 100644 --- a/homeassistant/components/ecobee/.translations/sv.json +++ b/homeassistant/components/ecobee/.translations/sv.json @@ -20,6 +20,5 @@ "title": "ecobee API-nyckel" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/ecobee/.translations/zh-Hant.json b/homeassistant/components/ecobee/.translations/zh-Hant.json index 983ae0351efa..db1ffa56c811 100644 --- a/homeassistant/components/ecobee/.translations/zh-Hant.json +++ b/homeassistant/components/ecobee/.translations/zh-Hant.json @@ -20,6 +20,5 @@ "title": "ecobee API \u5bc6\u9470" } } - }, - "title": "ecobee" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ca.json b/homeassistant/components/elgato/.translations/ca.json index 13bd7eb03fe6..0a15bb125730 100644 --- a/homeassistant/components/elgato/.translations/ca.json +++ b/homeassistant/components/elgato/.translations/ca.json @@ -19,9 +19,8 @@ }, "zeroconf_confirm": { "description": "Vols afegir l'Elgato Key Light amb n\u00famero de s\u00e8rie `{serial_number}` a Home Assistant?", - "title": "S'ha descobert un dispositiu Elgato Key Light" + "title": "Dispositiu Elgato Key Light descobert" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/da.json b/homeassistant/components/elgato/.translations/da.json index afcb56068d9c..99ae908db6b1 100644 --- a/homeassistant/components/elgato/.translations/da.json +++ b/homeassistant/components/elgato/.translations/da.json @@ -22,6 +22,5 @@ "title": "Fandt Elgato Key Light-enhed" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/de.json b/homeassistant/components/elgato/.translations/de.json index e56b1e0bade1..fcebb7aaa05c 100644 --- a/homeassistant/components/elgato/.translations/de.json +++ b/homeassistant/components/elgato/.translations/de.json @@ -22,6 +22,5 @@ "title": "Elgato Key Light Ger\u00e4t entdeckt" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/en.json b/homeassistant/components/elgato/.translations/en.json index 7815379f662d..1a2ff6d97f0d 100644 --- a/homeassistant/components/elgato/.translations/en.json +++ b/homeassistant/components/elgato/.translations/en.json @@ -22,6 +22,5 @@ "title": "Discovered Elgato Key Light device" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/es-419.json b/homeassistant/components/elgato/.translations/es-419.json index 2e882321f34d..46a008009b9f 100644 --- a/homeassistant/components/elgato/.translations/es-419.json +++ b/homeassistant/components/elgato/.translations/es-419.json @@ -12,6 +12,5 @@ "title": "Dispositivo Elgato Key Light descubierto" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/es.json b/homeassistant/components/elgato/.translations/es.json index c18424d54213..3860a09de92f 100644 --- a/homeassistant/components/elgato/.translations/es.json +++ b/homeassistant/components/elgato/.translations/es.json @@ -22,6 +22,5 @@ "title": "Descubierto dispositivo Elgato Key Light" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/fr.json b/homeassistant/components/elgato/.translations/fr.json index 2c121e622de2..7eca88dc2bd6 100644 --- a/homeassistant/components/elgato/.translations/fr.json +++ b/homeassistant/components/elgato/.translations/fr.json @@ -22,6 +22,5 @@ "title": "Appareil Elgato Key Light d\u00e9couvert" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/it.json b/homeassistant/components/elgato/.translations/it.json index 4179fa962f04..6d9e86076763 100644 --- a/homeassistant/components/elgato/.translations/it.json +++ b/homeassistant/components/elgato/.translations/it.json @@ -22,6 +22,5 @@ "title": "Dispositivo Elgato Key Light rilevato" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ko.json b/homeassistant/components/elgato/.translations/ko.json index 62eb49896a93..50b8536ea059 100644 --- a/homeassistant/components/elgato/.translations/ko.json +++ b/homeassistant/components/elgato/.translations/ko.json @@ -22,6 +22,5 @@ "title": "\ubc1c\uacac\ub41c Elgato Key Light \uae30\uae30" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/lb.json b/homeassistant/components/elgato/.translations/lb.json index 8d01a111a6dc..7c2e3cf4e9fc 100644 --- a/homeassistant/components/elgato/.translations/lb.json +++ b/homeassistant/components/elgato/.translations/lb.json @@ -22,6 +22,5 @@ "title": "Entdeckten Elgato Key Light Apparat" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/nl.json b/homeassistant/components/elgato/.translations/nl.json index 0bf3a87222ad..7f027b63f8de 100644 --- a/homeassistant/components/elgato/.translations/nl.json +++ b/homeassistant/components/elgato/.translations/nl.json @@ -22,6 +22,5 @@ "title": "Elgato Key Light apparaat ontdekt" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/no.json b/homeassistant/components/elgato/.translations/no.json index a23c9a442f79..2d60155cbb8a 100644 --- a/homeassistant/components/elgato/.translations/no.json +++ b/homeassistant/components/elgato/.translations/no.json @@ -22,6 +22,5 @@ "title": "Oppdaget Elgato Key Light-enheten" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/pl.json b/homeassistant/components/elgato/.translations/pl.json index e35b89348ead..344c2c086ea4 100644 --- a/homeassistant/components/elgato/.translations/pl.json +++ b/homeassistant/components/elgato/.translations/pl.json @@ -22,6 +22,5 @@ "title": "Wykryto urz\u0105dzenie Elgato Key Light" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/pt-BR.json b/homeassistant/components/elgato/.translations/pt-BR.json index c8b723b7379b..1684ce824331 100644 --- a/homeassistant/components/elgato/.translations/pt-BR.json +++ b/homeassistant/components/elgato/.translations/pt-BR.json @@ -6,6 +6,5 @@ "title": "Dispositivo Elgato Key Light descoberto" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/ru.json b/homeassistant/components/elgato/.translations/ru.json index 768ef1318470..a09a00b840c3 100644 --- a/homeassistant/components/elgato/.translations/ru.json +++ b/homeassistant/components/elgato/.translations/ru.json @@ -22,6 +22,5 @@ "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Elgato Key Light" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/sl.json b/homeassistant/components/elgato/.translations/sl.json index 7b637ee370f1..eac8bcdb295b 100644 --- a/homeassistant/components/elgato/.translations/sl.json +++ b/homeassistant/components/elgato/.translations/sl.json @@ -22,6 +22,5 @@ "title": "Odkrita naprava Elgato Key Light" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/sv.json b/homeassistant/components/elgato/.translations/sv.json index 575ab28df49e..f2b3001ae144 100644 --- a/homeassistant/components/elgato/.translations/sv.json +++ b/homeassistant/components/elgato/.translations/sv.json @@ -22,6 +22,5 @@ "title": "Uppt\u00e4ckte Elgato Key Light-enhet" } } - }, - "title": "Elgato Key Light" + } } \ No newline at end of file diff --git a/homeassistant/components/elgato/.translations/zh-Hant.json b/homeassistant/components/elgato/.translations/zh-Hant.json index 597381bcd69c..87fe1df06338 100644 --- a/homeassistant/components/elgato/.translations/zh-Hant.json +++ b/homeassistant/components/elgato/.translations/zh-Hant.json @@ -22,6 +22,5 @@ "title": "\u81ea\u52d5\u63a2\u7d22\u5230 Elgato Key \u7167\u660e\u8a2d\u5099" } } - }, - "title": "Elgato Key \u7167\u660e" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ca.json b/homeassistant/components/elkm1/.translations/ca.json index 6952472fe997..73ca29cdca04 100644 --- a/homeassistant/components/elkm1/.translations/ca.json +++ b/homeassistant/components/elkm1/.translations/ca.json @@ -23,6 +23,5 @@ "title": "Connexi\u00f3 amb el controlador Elk-M1" } } - }, - "title": "Controlador Elk-M1" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/de.json b/homeassistant/components/elkm1/.translations/de.json index 7910b39368a9..1574af9fa6c6 100644 --- a/homeassistant/components/elkm1/.translations/de.json +++ b/homeassistant/components/elkm1/.translations/de.json @@ -23,6 +23,5 @@ "title": "Stellen Sie eine Verbindung zur Elk-M1-Steuerung her" } } - }, - "title": "Elk-M1-Steuerung" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/en.json b/homeassistant/components/elkm1/.translations/en.json index 0efc9044be30..784a9feb642d 100644 --- a/homeassistant/components/elkm1/.translations/en.json +++ b/homeassistant/components/elkm1/.translations/en.json @@ -23,6 +23,5 @@ "title": "Connect to Elk-M1 Control" } } - }, - "title": "Elk-M1 Control" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/es.json b/homeassistant/components/elkm1/.translations/es.json index 3cf4d12adc33..9dc4f4839b66 100644 --- a/homeassistant/components/elkm1/.translations/es.json +++ b/homeassistant/components/elkm1/.translations/es.json @@ -23,6 +23,5 @@ "title": "Conectar con Control Elk-M1" } } - }, - "title": "Control Elk-M1" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/fr.json b/homeassistant/components/elkm1/.translations/fr.json index 14a3681410dd..6dd87e84718f 100644 --- a/homeassistant/components/elkm1/.translations/fr.json +++ b/homeassistant/components/elkm1/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Se connecter a Elk-M1 Control" } } - }, - "title": "Elk-M1 Control" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/it.json b/homeassistant/components/elkm1/.translations/it.json index abb3d9845022..c9f3f0e18763 100644 --- a/homeassistant/components/elkm1/.translations/it.json +++ b/homeassistant/components/elkm1/.translations/it.json @@ -23,6 +23,5 @@ "title": "Collegamento al controllo Elk-M1" } } - }, - "title": "Controllo Elk-M1" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ko.json b/homeassistant/components/elkm1/.translations/ko.json index 30e3922f0b8f..96837972007e 100644 --- a/homeassistant/components/elkm1/.translations/ko.json +++ b/homeassistant/components/elkm1/.translations/ko.json @@ -23,6 +23,5 @@ "title": "Elk-M1 \uc81c\uc5b4\uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Elk-M1 \uc81c\uc5b4" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/lb.json b/homeassistant/components/elkm1/.translations/lb.json index 78350fab91fc..6e1af6353f89 100644 --- a/homeassistant/components/elkm1/.translations/lb.json +++ b/homeassistant/components/elkm1/.translations/lb.json @@ -23,6 +23,5 @@ "title": "Mat Elk-M1 Control verbannen" } } - }, - "title": "Elk-M1 Control" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/no.json b/homeassistant/components/elkm1/.translations/no.json index 7da8538134e6..6870ca4926d1 100644 --- a/homeassistant/components/elkm1/.translations/no.json +++ b/homeassistant/components/elkm1/.translations/no.json @@ -23,6 +23,5 @@ "title": "Koble til Elk-M1-kontroll" } } - }, - "title": "Elk-M1 kontroll" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/ru.json b/homeassistant/components/elkm1/.translations/ru.json index eb0248625b11..45877e16992a 100644 --- a/homeassistant/components/elkm1/.translations/ru.json +++ b/homeassistant/components/elkm1/.translations/ru.json @@ -23,6 +23,5 @@ "title": "Elk-M1 Control" } } - }, - "title": "Elk-M1 Control" + } } \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/sl.json b/homeassistant/components/elkm1/.translations/sl.json new file mode 100644 index 000000000000..a815011988eb --- /dev/null +++ b/homeassistant/components/elkm1/.translations/sl.json @@ -0,0 +1,27 @@ +{ + "config": { + "abort": { + "address_already_configured": "ElkM1 s tem naslovom je \u017ee konfiguriran", + "already_configured": "ElkM1 s to predpono je \u017ee konfiguriran" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "address": "IP naslov, domena ali serijska vrata, \u010de se povezujete prek serijske povezave.", + "password": "Geslo (samo varno).", + "prefix": "Edinstvena predpona (pustite prazno, \u010de imate samo en ElkM1).", + "protocol": "Protokol", + "temperature_unit": "Temperaturna enota, ki jo uporablja ElkM1.", + "username": "Uporabni\u0161ko ime (samo varno)." + }, + "description": "Naslov mora biti v obliki \"naslov[:port]\" za \"varno\" in \"ne-varno'. Primer: '192.168.1.1'. Vrata so neobvezna in so privzeto nastavljena na 2101 za \"non-secure\" in 2601 za 'varno'. Za serijski protokol, mora biti naslov v obliki \" tty[:baud]'. Primer: '/dev/ttyS1'. Baud je neobvezen in privzeto nastavljen na 115200.", + "title": "Pove\u017eite se z Elk-M1 Control" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/elkm1/.translations/zh-Hant.json b/homeassistant/components/elkm1/.translations/zh-Hant.json index 7df7404d73be..7362ec42e934 100644 --- a/homeassistant/components/elkm1/.translations/zh-Hant.json +++ b/homeassistant/components/elkm1/.translations/zh-Hant.json @@ -23,6 +23,5 @@ "title": "\u9023\u7dda\u81f3 Elk-M1 Control" } } - }, - "title": "Elk-M1 Control" + } } \ No newline at end of file diff --git a/homeassistant/components/emulated_roku/.translations/en.json b/homeassistant/components/emulated_roku/.translations/en.json index b2d8f845cee7..c061f08b178a 100644 --- a/homeassistant/components/emulated_roku/.translations/en.json +++ b/homeassistant/components/emulated_roku/.translations/en.json @@ -17,5 +17,5 @@ } } }, - "title": "EmulatedRoku" + "title": "Emulated Roku" } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/af.json b/homeassistant/components/esphome/.translations/af.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/af.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ar.json b/homeassistant/components/esphome/.translations/ar.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/ar.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/bg.json b/homeassistant/components/esphome/.translations/bg.json index 85b59110a901..f77d3957ea14 100644 --- a/homeassistant/components/esphome/.translations/bg.json +++ b/homeassistant/components/esphome/.translations/bg.json @@ -27,9 +27,8 @@ "port": "\u041f\u043e\u0440\u0442" }, "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430 \u0441 [ESPHome](https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/bs.json b/homeassistant/components/esphome/.translations/bs.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/bs.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ca.json b/homeassistant/components/esphome/.translations/ca.json index edc8fcd19a30..6cd1405b824d 100644 --- a/homeassistant/components/esphome/.translations/ca.json +++ b/homeassistant/components/esphome/.translations/ca.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Introdueix la informaci\u00f3 de connexi\u00f3 del teu node [ESPHome](https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/cs.json b/homeassistant/components/esphome/.translations/cs.json index 081275d3defc..b8c245a66e47 100644 --- a/homeassistant/components/esphome/.translations/cs.json +++ b/homeassistant/components/esphome/.translations/cs.json @@ -7,6 +7,9 @@ "discovery_confirm": { "description": "Chcete do domovsk\u00e9ho asistenta p\u0159idat uzel ESPHome `{name}`?", "title": "Nalezen uzel ESPHome" + }, + "user": { + "title": "[%key:component::esphome::title%]" } } } diff --git a/homeassistant/components/esphome/.translations/cy.json b/homeassistant/components/esphome/.translations/cy.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/cy.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/da.json b/homeassistant/components/esphome/.translations/da.json index 62475b88a6c9..c05e2d34f010 100644 --- a/homeassistant/components/esphome/.translations/da.json +++ b/homeassistant/components/esphome/.translations/da.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Angiv forbindelsesindstillinger for din [ESPHome](https://esphomelib.com/) node.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/de.json b/homeassistant/components/esphome/.translations/de.json index 75d34e925c15..64262aa654a5 100644 --- a/homeassistant/components/esphome/.translations/de.json +++ b/homeassistant/components/esphome/.translations/de.json @@ -30,6 +30,5 @@ "title": "ESPHome" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/el.json b/homeassistant/components/esphome/.translations/el.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/el.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/en.json b/homeassistant/components/esphome/.translations/en.json index 3f58bf520489..b52dbc5a3f1d 100644 --- a/homeassistant/components/esphome/.translations/en.json +++ b/homeassistant/components/esphome/.translations/en.json @@ -30,6 +30,5 @@ "title": "ESPHome" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/eo.json b/homeassistant/components/esphome/.translations/eo.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/eo.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/es-419.json b/homeassistant/components/esphome/.translations/es-419.json index 962a417d09cd..7bbe61aceb2d 100644 --- a/homeassistant/components/esphome/.translations/es-419.json +++ b/homeassistant/components/esphome/.translations/es-419.json @@ -27,9 +27,8 @@ "port": "Puerto" }, "description": "Por favor Ingrese la configuraci\u00f3n de conexi\u00f3n de su nodo [ESPHome] (https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/es.json b/homeassistant/components/esphome/.translations/es.json index 003926d6d589..ff2f1f093c9e 100644 --- a/homeassistant/components/esphome/.translations/es.json +++ b/homeassistant/components/esphome/.translations/es.json @@ -27,9 +27,8 @@ "port": "Puerto" }, "description": "Introduce la configuraci\u00f3n de la conexi\u00f3n de tu nodo [ESPHome](https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/et.json b/homeassistant/components/esphome/.translations/et.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/et.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/eu.json b/homeassistant/components/esphome/.translations/eu.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/eu.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/fa.json b/homeassistant/components/esphome/.translations/fa.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/fa.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/fi.json b/homeassistant/components/esphome/.translations/fi.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/fi.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/fr.json b/homeassistant/components/esphome/.translations/fr.json index 7459f7a1ce42..8159b3cac2e9 100644 --- a/homeassistant/components/esphome/.translations/fr.json +++ b/homeassistant/components/esphome/.translations/fr.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Veuillez saisir les param\u00e8tres de connexion de votre n\u0153ud [ESPHome] (https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/gsw.json b/homeassistant/components/esphome/.translations/gsw.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/gsw.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/he.json b/homeassistant/components/esphome/.translations/he.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/he.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/hi.json b/homeassistant/components/esphome/.translations/hi.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/hi.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/hr.json b/homeassistant/components/esphome/.translations/hr.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/hr.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/hu.json b/homeassistant/components/esphome/.translations/hu.json index f6aed1a1be93..b023bd03cbe7 100644 --- a/homeassistant/components/esphome/.translations/hu.json +++ b/homeassistant/components/esphome/.translations/hu.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "K\u00e9rlek, add meg az [ESPHome](https://esphomelib.com/) csom\u00f3pontod kapcsol\u00f3d\u00e1si be\u00e1ll\u00edt\u00e1sait.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/iba.json b/homeassistant/components/esphome/.translations/iba.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/iba.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/id.json b/homeassistant/components/esphome/.translations/id.json index 837d18d27ad0..9c646def82c1 100644 --- a/homeassistant/components/esphome/.translations/id.json +++ b/homeassistant/components/esphome/.translations/id.json @@ -10,6 +10,9 @@ }, "description": "Silakan masukkan kata kunci yang Anda atur di konfigurasi Anda.", "title": "Masukkan kata kunci" + }, + "user": { + "title": "[%key:component::esphome::title%]" } } } diff --git a/homeassistant/components/esphome/.translations/is.json b/homeassistant/components/esphome/.translations/is.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/is.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/it.json b/homeassistant/components/esphome/.translations/it.json index 8f50a6720fcb..050c12224955 100644 --- a/homeassistant/components/esphome/.translations/it.json +++ b/homeassistant/components/esphome/.translations/it.json @@ -30,6 +30,5 @@ "title": "ESPHome" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ja.json b/homeassistant/components/esphome/.translations/ja.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/ja.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ko.json b/homeassistant/components/esphome/.translations/ko.json index 5eaac8bad65a..e89f3360b32f 100644 --- a/homeassistant/components/esphome/.translations/ko.json +++ b/homeassistant/components/esphome/.translations/ko.json @@ -27,9 +27,8 @@ "port": "\ud3ec\ud2b8" }, "description": "[ESPHome](https://esphomelib.com/) \ub178\ub4dc\uc758 \uc5f0\uacb0 \uad6c\uc131\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/lb.json b/homeassistant/components/esphome/.translations/lb.json index 914560f4a05b..8d00a3d98e5b 100644 --- a/homeassistant/components/esphome/.translations/lb.json +++ b/homeassistant/components/esphome/.translations/lb.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Gitt Verbindungs Informatioune vun \u00e4rem [ESPHome](https://esphomelib.com/) an.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/lt.json b/homeassistant/components/esphome/.translations/lt.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/lt.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/lv.json b/homeassistant/components/esphome/.translations/lv.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/lv.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/nl.json b/homeassistant/components/esphome/.translations/nl.json index 6e727e973a66..4edc46a372a2 100644 --- a/homeassistant/components/esphome/.translations/nl.json +++ b/homeassistant/components/esphome/.translations/nl.json @@ -27,9 +27,8 @@ "port": "Poort" }, "description": "Voer de verbindingsinstellingen in van uw [ESPHome](https://esphomelib.com/) node.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/nn.json b/homeassistant/components/esphome/.translations/nn.json index 7cc1215f820d..628fb01a2cc4 100644 --- a/homeassistant/components/esphome/.translations/nn.json +++ b/homeassistant/components/esphome/.translations/nn.json @@ -6,9 +6,8 @@ "title": "Fann ESPhome node" }, "user": { - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/no.json b/homeassistant/components/esphome/.translations/no.json index 900f255e74d8..c04f0c2a09d4 100644 --- a/homeassistant/components/esphome/.translations/no.json +++ b/homeassistant/components/esphome/.translations/no.json @@ -27,9 +27,8 @@ "port": "" }, "description": "Vennligst skriv inn tilkoblingsinnstillinger for din [ESPHome](https://esphomelib.com/) node.", - "title": "" + "title": "ESPHome" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pl.json b/homeassistant/components/esphome/.translations/pl.json index 10e6278ac048..a2e56e098022 100644 --- a/homeassistant/components/esphome/.translations/pl.json +++ b/homeassistant/components/esphome/.translations/pl.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Wprowad\u017a ustawienia po\u0142\u0105czenia [ESPHome](https://esphomelib.com/) w\u0119z\u0142a.", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pt-BR.json b/homeassistant/components/esphome/.translations/pt-BR.json index aca9bdb80e32..bbc564218991 100644 --- a/homeassistant/components/esphome/.translations/pt-BR.json +++ b/homeassistant/components/esphome/.translations/pt-BR.json @@ -27,9 +27,8 @@ "port": "Porta" }, "description": "Por favor insira as configura\u00e7\u00f5es de conex\u00e3o de seu n\u00f3 de [ESPHome] (https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/pt.json b/homeassistant/components/esphome/.translations/pt.json index a14be0aed6b8..7a5e8621d4cb 100644 --- a/homeassistant/components/esphome/.translations/pt.json +++ b/homeassistant/components/esphome/.translations/pt.json @@ -16,15 +16,18 @@ "description": "Por favor, insira a palavra-passe que colocou na configura\u00e7\u00e3o para {name}", "title": "Palavra-passe" }, + "discovery_confirm": { + "description": "Deseja adicionar um n\u00f3 ESPHome `{name}` ao Home Assistant?", + "title": "N\u00f3 ESPHome descoberto" + }, "user": { "data": { "host": "Servidor", "port": "Porta" }, "description": "Por favor, insira as configura\u00e7\u00f5es de liga\u00e7\u00e3o ao seu n\u00f3 [ESPHome] (https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ro.json b/homeassistant/components/esphome/.translations/ro.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/ro.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ru.json b/homeassistant/components/esphome/.translations/ru.json index cd168681c7a6..8361fa371a45 100644 --- a/homeassistant/components/esphome/.translations/ru.json +++ b/homeassistant/components/esphome/.translations/ru.json @@ -30,6 +30,5 @@ "title": "ESPHome" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sk.json b/homeassistant/components/esphome/.translations/sk.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/sk.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sl.json b/homeassistant/components/esphome/.translations/sl.json index afcabd00eba7..64aa9716f241 100644 --- a/homeassistant/components/esphome/.translations/sl.json +++ b/homeassistant/components/esphome/.translations/sl.json @@ -30,6 +30,5 @@ "title": "ESPHome" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sr-Latn.json b/homeassistant/components/esphome/.translations/sr-Latn.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/sr-Latn.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sr.json b/homeassistant/components/esphome/.translations/sr.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/sr.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/sv.json b/homeassistant/components/esphome/.translations/sv.json index 0f46cdce543e..3c3a4a53f64f 100644 --- a/homeassistant/components/esphome/.translations/sv.json +++ b/homeassistant/components/esphome/.translations/sv.json @@ -27,9 +27,8 @@ "port": "Port" }, "description": "Ange anslutningsinst\u00e4llningarna f\u00f6r noden [ESPHome](https://esphomelib.com/).", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/ta.json b/homeassistant/components/esphome/.translations/ta.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/ta.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/te.json b/homeassistant/components/esphome/.translations/te.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/te.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/th.json b/homeassistant/components/esphome/.translations/th.json index ceab9b6e11b7..10520139bd22 100644 --- a/homeassistant/components/esphome/.translations/th.json +++ b/homeassistant/components/esphome/.translations/th.json @@ -9,6 +9,9 @@ "password": "\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19" }, "title": "\u0e43\u0e2a\u0e48\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19" + }, + "user": { + "title": "[%key:component::esphome::title%]" } } } diff --git a/homeassistant/components/esphome/.translations/tr.json b/homeassistant/components/esphome/.translations/tr.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/tr.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/uk.json b/homeassistant/components/esphome/.translations/uk.json index 79c9e70bcc84..ec22664e46bd 100644 --- a/homeassistant/components/esphome/.translations/uk.json +++ b/homeassistant/components/esphome/.translations/uk.json @@ -25,7 +25,8 @@ "host": "\u0425\u043e\u0441\u0442", "port": "\u041f\u043e\u0440\u0442" }, - "description": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0432\u0430\u0448\u043e\u0433\u043e \u0432\u0443\u0437\u043b\u0430 [ESPHome] (https://esphomelib.com/)." + "description": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0432\u0430\u0448\u043e\u0433\u043e \u0432\u0443\u0437\u043b\u0430 [ESPHome] (https://esphomelib.com/).", + "title": "[%key:component::esphome::title%]" } } } diff --git a/homeassistant/components/esphome/.translations/ur.json b/homeassistant/components/esphome/.translations/ur.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/ur.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/vi.json b/homeassistant/components/esphome/.translations/vi.json new file mode 100644 index 000000000000..9d6d417a053b --- /dev/null +++ b/homeassistant/components/esphome/.translations/vi.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "user": { + "title": "[%key:component::esphome::title%]" + } + } + } +} \ 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 128f1ebf9df0..8c756a696863 100644 --- a/homeassistant/components/esphome/.translations/zh-Hans.json +++ b/homeassistant/components/esphome/.translations/zh-Hans.json @@ -27,9 +27,8 @@ "port": "\u7aef\u53e3" }, "description": "\u8bf7\u8f93\u5165\u60a8\u7684 [ESPHome](https://esphomelib.com/) \u8282\u70b9\u7684\u8fde\u63a5\u8bbe\u7f6e\u3002", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/esphome/.translations/zh-Hant.json b/homeassistant/components/esphome/.translations/zh-Hant.json index 489857342734..7495204945dd 100644 --- a/homeassistant/components/esphome/.translations/zh-Hant.json +++ b/homeassistant/components/esphome/.translations/zh-Hant.json @@ -27,9 +27,8 @@ "port": "\u901a\u8a0a\u57e0" }, "description": "\u8acb\u8f38\u5165 [ESPHome](https://esphomelib.com/) \u7bc0\u9ede\u9023\u7dda\u8cc7\u8a0a\u3002", - "title": "ESPHome" + "title": "[%key:component::esphome::title%]" } } - }, - "title": "ESPHome" + } } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/af.json b/homeassistant/components/fan/.translations/af.json new file mode 100644 index 000000000000..4eb212a6a5a5 --- /dev/null +++ b/homeassistant/components/fan/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Waaier" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/ar.json b/homeassistant/components/fan/.translations/ar.json new file mode 100644 index 000000000000..8f417f02abff --- /dev/null +++ b/homeassistant/components/fan/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0631\u0648\u062d\u0629" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/bg.json b/homeassistant/components/fan/.translations/bg.json index f678c8709682..e20877e0253b 100644 --- a/homeassistant/components/fan/.translations/bg.json +++ b/homeassistant/components/fan/.translations/bg.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} \u0431\u044a\u0434\u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d", "turned_on": "{entity_name} \u0431\u044a\u0434\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d" } - } + }, + "title": "\u0412\u0435\u043d\u0442\u0438\u043b\u0430\u0442\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/bs.json b/homeassistant/components/fan/.translations/bs.json new file mode 100644 index 000000000000..56bb146be2fd --- /dev/null +++ b/homeassistant/components/fan/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Ventilator" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/ca.json b/homeassistant/components/fan/.translations/ca.json index e2f3ce2b0a40..0f96ac998650 100644 --- a/homeassistant/components/fan/.translations/ca.json +++ b/homeassistant/components/fan/.translations/ca.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} s'ha apagat", "turned_on": "{entity_name} s'ha enc\u00e8s" } - } + }, + "title": "Ventiladors" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/cs.json b/homeassistant/components/fan/.translations/cs.json new file mode 100644 index 000000000000..21a705e17f0e --- /dev/null +++ b/homeassistant/components/fan/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Ventil\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/cy.json b/homeassistant/components/fan/.translations/cy.json new file mode 100644 index 000000000000..a176c43186ce --- /dev/null +++ b/homeassistant/components/fan/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Ffan" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/da.json b/homeassistant/components/fan/.translations/da.json index 0c9556bfedb8..290d2ab0e14f 100644 --- a/homeassistant/components/fan/.translations/da.json +++ b/homeassistant/components/fan/.translations/da.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} blev slukket", "turned_on": "{entity_name} blev t\u00e6ndt" } - } + }, + "title": "Bl\u00e6ser" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/de.json b/homeassistant/components/fan/.translations/de.json index 9c3559b7cfc9..a50e53bef7b6 100644 --- a/homeassistant/components/fan/.translations/de.json +++ b/homeassistant/components/fan/.translations/de.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} ausgeschaltet", "turned_on": "{entity_name} eingeschaltet" } - } + }, + "title": "Ventilator" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/el.json b/homeassistant/components/fan/.translations/el.json new file mode 100644 index 000000000000..7eac2381073f --- /dev/null +++ b/homeassistant/components/fan/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0391\u03bd\u03b5\u03bc\u03b9\u03c3\u03c4\u03ae\u03c1\u03b1\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/en.json b/homeassistant/components/fan/.translations/en.json index c27d983ca2e9..a211308d68b6 100644 --- a/homeassistant/components/fan/.translations/en.json +++ b/homeassistant/components/fan/.translations/en.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} turned off", "turned_on": "{entity_name} turned on" } - } + }, + "title": "Fan" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/es-419.json b/homeassistant/components/fan/.translations/es-419.json index dd0c006d760f..3fa024cb905d 100644 --- a/homeassistant/components/fan/.translations/es-419.json +++ b/homeassistant/components/fan/.translations/es-419.json @@ -8,5 +8,6 @@ "turned_off": "{entity_name} se apag\u00f3", "turned_on": "{entity_name} se encendi\u00f3" } - } + }, + "title": "Ventilador" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/es.json b/homeassistant/components/fan/.translations/es.json index 4ceefe9c7212..477b7b473930 100644 --- a/homeassistant/components/fan/.translations/es.json +++ b/homeassistant/components/fan/.translations/es.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} desactivado", "turned_on": "{entity_name} activado" } - } + }, + "title": "Ventilador" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/et.json b/homeassistant/components/fan/.translations/et.json new file mode 100644 index 000000000000..42f2c2420062 --- /dev/null +++ b/homeassistant/components/fan/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Ventilaator" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/eu.json b/homeassistant/components/fan/.translations/eu.json new file mode 100644 index 000000000000..9205f5f38dbb --- /dev/null +++ b/homeassistant/components/fan/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Haizagailua" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/fa.json b/homeassistant/components/fan/.translations/fa.json new file mode 100644 index 000000000000..7e843656062d --- /dev/null +++ b/homeassistant/components/fan/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0641\u0646" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/fi.json b/homeassistant/components/fan/.translations/fi.json new file mode 100644 index 000000000000..15d8186b319d --- /dev/null +++ b/homeassistant/components/fan/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Tuuletin" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/fr.json b/homeassistant/components/fan/.translations/fr.json index e6944dab781b..5317cd664ec4 100644 --- a/homeassistant/components/fan/.translations/fr.json +++ b/homeassistant/components/fan/.translations/fr.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} est \u00e9teint", "turned_on": "{entity_name} allum\u00e9" } - } + }, + "title": "Ventilateur" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/he.json b/homeassistant/components/fan/.translations/he.json new file mode 100644 index 000000000000..841163d60803 --- /dev/null +++ b/homeassistant/components/fan/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05d0\u05d5\u05d5\u05e8\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/hi.json b/homeassistant/components/fan/.translations/hi.json new file mode 100644 index 000000000000..4b76ba30b460 --- /dev/null +++ b/homeassistant/components/fan/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u092a\u0902\u0916\u093e" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/hr.json b/homeassistant/components/fan/.translations/hr.json new file mode 100644 index 000000000000..56bb146be2fd --- /dev/null +++ b/homeassistant/components/fan/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Ventilator" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/hu.json b/homeassistant/components/fan/.translations/hu.json index b559f29c5816..5f8c57542e89 100644 --- a/homeassistant/components/fan/.translations/hu.json +++ b/homeassistant/components/fan/.translations/hu.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} ki lett kapcsolva", "turned_on": "{entity_name} be lett kapcsolva" } - } + }, + "title": "Ventil\u00e1tor" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/hy.json b/homeassistant/components/fan/.translations/hy.json new file mode 100644 index 000000000000..360eb4af7cff --- /dev/null +++ b/homeassistant/components/fan/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0585\u0564\u0561\u0583\u0578\u056d\u056b\u0579" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/id.json b/homeassistant/components/fan/.translations/id.json new file mode 100644 index 000000000000..057da6942696 --- /dev/null +++ b/homeassistant/components/fan/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kipas angin" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/is.json b/homeassistant/components/fan/.translations/is.json new file mode 100644 index 000000000000..975cd23385d8 --- /dev/null +++ b/homeassistant/components/fan/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Vifta" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/it.json b/homeassistant/components/fan/.translations/it.json index 4fab847f1cb6..b3844afce19b 100644 --- a/homeassistant/components/fan/.translations/it.json +++ b/homeassistant/components/fan/.translations/it.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} disattivato", "turned_on": "{entity_name} attivato" } - } + }, + "title": "Ventilatore" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/ko.json b/homeassistant/components/fan/.translations/ko.json index dec2a711e578..f0af6a71bb48 100644 --- a/homeassistant/components/fan/.translations/ko.json +++ b/homeassistant/components/fan/.translations/ko.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} \uc774(\uac00) \uaebc\uc9c8 \ub54c", "turned_on": "{entity_name} \uc774(\uac00) \ucf1c\uc9c8 \ub54c" } - } + }, + "title": "\uc1a1\ud48d\uae30" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/lb.json b/homeassistant/components/fan/.translations/lb.json index f5170949badf..af051c19b7f8 100644 --- a/homeassistant/components/fan/.translations/lb.json +++ b/homeassistant/components/fan/.translations/lb.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} gouf ausgeschalt", "turned_on": "{entity_name} gouf ugeschalt" } - } + }, + "title": "Ventilator" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/lv.json b/homeassistant/components/fan/.translations/lv.json new file mode 100644 index 000000000000..33b887870d6b --- /dev/null +++ b/homeassistant/components/fan/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ventilators" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/nb.json b/homeassistant/components/fan/.translations/nb.json new file mode 100644 index 000000000000..1cc3c49dad30 --- /dev/null +++ b/homeassistant/components/fan/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Vifte" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/nl.json b/homeassistant/components/fan/.translations/nl.json index 4837b301ea7f..641361bc5b40 100644 --- a/homeassistant/components/fan/.translations/nl.json +++ b/homeassistant/components/fan/.translations/nl.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} uitgeschakeld", "turned_on": "{entity_name} ingeschakeld" } - } + }, + "title": "Ventilator" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/nn.json b/homeassistant/components/fan/.translations/nn.json new file mode 100644 index 000000000000..1cc3c49dad30 --- /dev/null +++ b/homeassistant/components/fan/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Vifte" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/pl.json b/homeassistant/components/fan/.translations/pl.json index 709a63c23899..929c72732ffe 100644 --- a/homeassistant/components/fan/.translations/pl.json +++ b/homeassistant/components/fan/.translations/pl.json @@ -12,5 +12,6 @@ "turned_off": "nast\u0105pi wy\u0142\u0105czenie {entity_name}", "turned_on": "nast\u0105pi w\u0142\u0105czenie {entity_name}" } - } + }, + "title": "Wentylator" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/pt-BR.json b/homeassistant/components/fan/.translations/pt-BR.json index 6b95464bdbcd..953726f0d675 100644 --- a/homeassistant/components/fan/.translations/pt-BR.json +++ b/homeassistant/components/fan/.translations/pt-BR.json @@ -4,5 +4,6 @@ "is_off": "{entity_name} est\u00e1 desligado", "is_on": "{entity_name} est\u00e1 ligado" } - } + }, + "title": "Ventilador" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/pt.json b/homeassistant/components/fan/.translations/pt.json index ab78bc776bdd..ffbcc229a097 100644 --- a/homeassistant/components/fan/.translations/pt.json +++ b/homeassistant/components/fan/.translations/pt.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} desligou-se", "turned_on": "{entity_name} ligou-se" } - } + }, + "title": "Vento\u00ednha" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/ro.json b/homeassistant/components/fan/.translations/ro.json new file mode 100644 index 000000000000..56bb146be2fd --- /dev/null +++ b/homeassistant/components/fan/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Ventilator" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/ru.json b/homeassistant/components/fan/.translations/ru.json index 157c78975cb4..9a52a68d44f6 100644 --- a/homeassistant/components/fan/.translations/ru.json +++ b/homeassistant/components/fan/.translations/ru.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", "turned_on": "{entity_name} \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f" } - } + }, + "title": "\u0412\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/sk.json b/homeassistant/components/fan/.translations/sk.json new file mode 100644 index 000000000000..21a705e17f0e --- /dev/null +++ b/homeassistant/components/fan/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Ventil\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/sl.json b/homeassistant/components/fan/.translations/sl.json index a2bca3352ab2..aa112b4ed9dc 100644 --- a/homeassistant/components/fan/.translations/sl.json +++ b/homeassistant/components/fan/.translations/sl.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} izklopljen", "turned_on": "{entity_name} vklopljen" } - } + }, + "title": "Ventilator" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/sv.json b/homeassistant/components/fan/.translations/sv.json index c080d1b364b8..ea1f26b62410 100644 --- a/homeassistant/components/fan/.translations/sv.json +++ b/homeassistant/components/fan/.translations/sv.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} st\u00e4ngdes av", "turned_on": "{entity_name} aktiverades" } - } + }, + "title": "Fl\u00e4kt" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/te.json b/homeassistant/components/fan/.translations/te.json new file mode 100644 index 000000000000..6bba3eccb37d --- /dev/null +++ b/homeassistant/components/fan/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2b\u0c4d\u0c2f\u0c3e\u0c28\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/th.json b/homeassistant/components/fan/.translations/th.json new file mode 100644 index 000000000000..fae832be1fa4 --- /dev/null +++ b/homeassistant/components/fan/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1e\u0e31\u0e14\u0e25\u0e21" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/tr.json b/homeassistant/components/fan/.translations/tr.json new file mode 100644 index 000000000000..0c6f96bcf698 --- /dev/null +++ b/homeassistant/components/fan/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Fan" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/uk.json b/homeassistant/components/fan/.translations/uk.json new file mode 100644 index 000000000000..48ad928b0a78 --- /dev/null +++ b/homeassistant/components/fan/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/vi.json b/homeassistant/components/fan/.translations/vi.json new file mode 100644 index 000000000000..1582154a5b6f --- /dev/null +++ b/homeassistant/components/fan/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Qu\u1ea1t" +} \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/zh-Hans.json b/homeassistant/components/fan/.translations/zh-Hans.json index f909bd8ac622..f6a592b67d30 100644 --- a/homeassistant/components/fan/.translations/zh-Hans.json +++ b/homeassistant/components/fan/.translations/zh-Hans.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} \u88ab\u5173\u95ed", "turned_on": "{entity_name} \u88ab\u5f00\u542f" } - } + }, + "title": "\u98ce\u6247" } \ No newline at end of file diff --git a/homeassistant/components/fan/.translations/zh-Hant.json b/homeassistant/components/fan/.translations/zh-Hant.json index 01da8652b2f0..57bb4bb438d2 100644 --- a/homeassistant/components/fan/.translations/zh-Hant.json +++ b/homeassistant/components/fan/.translations/zh-Hant.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name}\u5df2\u95dc\u9589", "turned_on": "{entity_name}\u5df2\u958b\u555f" } - } + }, + "title": "\u98a8\u6247" } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/ca.json b/homeassistant/components/flume/.translations/ca.json index 02061267cd45..71ee4fd2345e 100644 --- a/homeassistant/components/flume/.translations/ca.json +++ b/homeassistant/components/flume/.translations/ca.json @@ -20,6 +20,5 @@ "title": "Connexi\u00f3 amb Flume" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/de.json b/homeassistant/components/flume/.translations/de.json index a07665dc9ede..99a10728890e 100644 --- a/homeassistant/components/flume/.translations/de.json +++ b/homeassistant/components/flume/.translations/de.json @@ -17,6 +17,5 @@ "title": "Stellen Sie eine Verbindung zu Ihrem Flume-Konto her" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/en.json b/homeassistant/components/flume/.translations/en.json index 33c17cd3021b..ed24c552d8ff 100644 --- a/homeassistant/components/flume/.translations/en.json +++ b/homeassistant/components/flume/.translations/en.json @@ -20,6 +20,5 @@ "title": "Connect to your Flume Account" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/es.json b/homeassistant/components/flume/.translations/es.json index 354f50b2a772..cf872da6de36 100644 --- a/homeassistant/components/flume/.translations/es.json +++ b/homeassistant/components/flume/.translations/es.json @@ -20,6 +20,5 @@ "title": "Conectar con tu cuenta de Flume" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/fr.json b/homeassistant/components/flume/.translations/fr.json index 84052396d976..b44e5fd8945d 100644 --- a/homeassistant/components/flume/.translations/fr.json +++ b/homeassistant/components/flume/.translations/fr.json @@ -14,6 +14,5 @@ "title": "Se connecter \u00e0 votre compte Flume" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/it.json b/homeassistant/components/flume/.translations/it.json index 5be8180dfc59..6d9974f9481f 100644 --- a/homeassistant/components/flume/.translations/it.json +++ b/homeassistant/components/flume/.translations/it.json @@ -20,6 +20,5 @@ "title": "Collegati al tuo account Flume" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/nl.json b/homeassistant/components/flume/.translations/nl.json index 5cc83d418dcf..fe67b5734d11 100644 --- a/homeassistant/components/flume/.translations/nl.json +++ b/homeassistant/components/flume/.translations/nl.json @@ -17,6 +17,5 @@ "title": "Verbind met uw Flume account" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/no.json b/homeassistant/components/flume/.translations/no.json index dd95b221da5d..1440d3d04774 100644 --- a/homeassistant/components/flume/.translations/no.json +++ b/homeassistant/components/flume/.translations/no.json @@ -1,6 +1,11 @@ { "config": { + "abort": { + "already_configured": "Denne kontoen er allerede konfigurert" + }, "error": { + "cannot_connect": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen", + "invalid_auth": "Ugyldig godkjenning", "unknown": "Uventet feil" }, "step": { @@ -15,6 +20,5 @@ "title": "Koble til Flume-kontoen din" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/ru.json b/homeassistant/components/flume/.translations/ru.json index fb36e267f947..eb9b1261bd9d 100644 --- a/homeassistant/components/flume/.translations/ru.json +++ b/homeassistant/components/flume/.translations/ru.json @@ -20,6 +20,5 @@ "title": "Flume" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/sl.json b/homeassistant/components/flume/.translations/sl.json new file mode 100644 index 000000000000..9673cb6c9601 --- /dev/null +++ b/homeassistant/components/flume/.translations/sl.json @@ -0,0 +1,24 @@ +{ + "config": { + "abort": { + "already_configured": "Ta ra\u010dun je \u017ee konfiguriran" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "client_id": "Client ID", + "client_secret": "Client Secret", + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "description": "\u010ce \u017eelite dostopati do osebnega API-ja Flume, boste morali na https://portal.flumetech.com/settings#token zahtevati \"Client ID\" in \"Client Secret\".", + "title": "Pove\u017eite se s svojim ra\u010dunom Flume" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flume/.translations/zh-Hant.json b/homeassistant/components/flume/.translations/zh-Hant.json index 416fe27add30..cc7dea80e522 100644 --- a/homeassistant/components/flume/.translations/zh-Hant.json +++ b/homeassistant/components/flume/.translations/zh-Hant.json @@ -20,6 +20,5 @@ "title": "\u9023\u7dda\u81f3 Flume \u5e33\u865f" } } - }, - "title": "Flume" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ca.json b/homeassistant/components/flunearyou/.translations/ca.json index dc29217e3b57..c26c1f55b2cc 100644 --- a/homeassistant/components/flunearyou/.translations/ca.json +++ b/homeassistant/components/flunearyou/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Configuraci\u00f3 Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/de.json b/homeassistant/components/flunearyou/.translations/de.json index 4df27df0f6c2..69e4fc0f4783 100644 --- a/homeassistant/components/flunearyou/.translations/de.json +++ b/homeassistant/components/flunearyou/.translations/de.json @@ -15,6 +15,5 @@ "title": "Konfigurieren Sie die Grippe in Ihrer N\u00e4he" } } - }, - "title": "Grippe in Ihrer N\u00e4he" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/en.json b/homeassistant/components/flunearyou/.translations/en.json index 5b20c4efca41..88997a89c90c 100644 --- a/homeassistant/components/flunearyou/.translations/en.json +++ b/homeassistant/components/flunearyou/.translations/en.json @@ -16,6 +16,5 @@ "title": "Configure Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/es.json b/homeassistant/components/flunearyou/.translations/es.json index f98770a7b24a..cdaa475037d5 100644 --- a/homeassistant/components/flunearyou/.translations/es.json +++ b/homeassistant/components/flunearyou/.translations/es.json @@ -16,6 +16,5 @@ "title": "Configurar Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/it.json b/homeassistant/components/flunearyou/.translations/it.json index c77bebd296a4..fc90199664ec 100644 --- a/homeassistant/components/flunearyou/.translations/it.json +++ b/homeassistant/components/flunearyou/.translations/it.json @@ -16,6 +16,5 @@ "title": "Configurare Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ko.json b/homeassistant/components/flunearyou/.translations/ko.json index 27001b0d9aa3..a41afe3ebc7a 100644 --- a/homeassistant/components/flunearyou/.translations/ko.json +++ b/homeassistant/components/flunearyou/.translations/ko.json @@ -16,6 +16,5 @@ "title": "Flu Near You \uad6c\uc131" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/lb.json b/homeassistant/components/flunearyou/.translations/lb.json index f6a1b7e4b31c..2692e9219e9d 100644 --- a/homeassistant/components/flunearyou/.translations/lb.json +++ b/homeassistant/components/flunearyou/.translations/lb.json @@ -16,6 +16,5 @@ "title": "Flu Near You konfigur\u00e9ieren" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/no.json b/homeassistant/components/flunearyou/.translations/no.json new file mode 100644 index 000000000000..3b8a17163dc4 --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/no.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Disse koordinatene er allerede registrert." + }, + "error": { + "general_error": "Det oppstod en ukjent feil." + }, + "step": { + "user": { + "data": { + "latitude": "Breddegrad", + "longitude": "Lengdegrad" + }, + "description": "Overv\u00e5k brukerbaserte og CDC-repoter for et par koordinater.", + "title": "Konfigurere influensa i n\u00e6rheten av deg" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/ru.json b/homeassistant/components/flunearyou/.translations/ru.json index ba2831ad6c17..b4ff15d40448 100644 --- a/homeassistant/components/flunearyou/.translations/ru.json +++ b/homeassistant/components/flunearyou/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/sl.json b/homeassistant/components/flunearyou/.translations/sl.json new file mode 100644 index 000000000000..843794b8a52e --- /dev/null +++ b/homeassistant/components/flunearyou/.translations/sl.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Te koordinate so \u017ee registrirane." + }, + "error": { + "general_error": "Pri\u0161lo je do neznane napake." + }, + "step": { + "user": { + "data": { + "latitude": "Zemljepisna \u0161irina", + "longitude": "Zemljepisna dol\u017eina" + }, + "description": "Spremljajte uporabni\u0161ke in CDC obvestila za dolo\u010dene koordinate.", + "title": "Konfigurirajte Flu Near You" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flunearyou/.translations/zh-Hant.json b/homeassistant/components/flunearyou/.translations/zh-Hant.json index 6299bc039800..b10552d0fe3c 100644 --- a/homeassistant/components/flunearyou/.translations/zh-Hant.json +++ b/homeassistant/components/flunearyou/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u8a2d\u5b9a Flu Near You" } } - }, - "title": "Flu Near You" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ca.json b/homeassistant/components/freebox/.translations/ca.json index c49e8cd5ec81..264e0ed30386 100644 --- a/homeassistant/components/freebox/.translations/ca.json +++ b/homeassistant/components/freebox/.translations/ca.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/de.json b/homeassistant/components/freebox/.translations/de.json index a85f8e687447..cf18dce08708 100644 --- a/homeassistant/components/freebox/.translations/de.json +++ b/homeassistant/components/freebox/.translations/de.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/en.json b/homeassistant/components/freebox/.translations/en.json index 1d309944557b..15e18a8982b3 100644 --- a/homeassistant/components/freebox/.translations/en.json +++ b/homeassistant/components/freebox/.translations/en.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/es.json b/homeassistant/components/freebox/.translations/es.json index 20e7c6f60e5e..3c62f33c3be2 100644 --- a/homeassistant/components/freebox/.translations/es.json +++ b/homeassistant/components/freebox/.translations/es.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/fr.json b/homeassistant/components/freebox/.translations/fr.json index af732d70df4d..3854823843bc 100644 --- a/homeassistant/components/freebox/.translations/fr.json +++ b/homeassistant/components/freebox/.translations/fr.json @@ -20,6 +20,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/it.json b/homeassistant/components/freebox/.translations/it.json index 8fd4287866ec..11d27eebd693 100644 --- a/homeassistant/components/freebox/.translations/it.json +++ b/homeassistant/components/freebox/.translations/it.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ko.json b/homeassistant/components/freebox/.translations/ko.json index b0e270572eeb..9c86ce6a775d 100644 --- a/homeassistant/components/freebox/.translations/ko.json +++ b/homeassistant/components/freebox/.translations/ko.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/lb.json b/homeassistant/components/freebox/.translations/lb.json index cbf680ffd966..eccc419c79b8 100644 --- a/homeassistant/components/freebox/.translations/lb.json +++ b/homeassistant/components/freebox/.translations/lb.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/no.json b/homeassistant/components/freebox/.translations/no.json index c7757eb8ac1f..0ec9bf70ecda 100644 --- a/homeassistant/components/freebox/.translations/no.json +++ b/homeassistant/components/freebox/.translations/no.json @@ -21,6 +21,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/pl.json b/homeassistant/components/freebox/.translations/pl.json index d917ba507edf..084dd70ee52f 100644 --- a/homeassistant/components/freebox/.translations/pl.json +++ b/homeassistant/components/freebox/.translations/pl.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/ru.json b/homeassistant/components/freebox/.translations/ru.json index f874e519f6ae..1bef863e15f6 100644 --- a/homeassistant/components/freebox/.translations/ru.json +++ b/homeassistant/components/freebox/.translations/ru.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/sl.json b/homeassistant/components/freebox/.translations/sl.json index 4503700bbbff..0a36450501b4 100644 --- a/homeassistant/components/freebox/.translations/sl.json +++ b/homeassistant/components/freebox/.translations/sl.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/freebox/.translations/zh-Hant.json b/homeassistant/components/freebox/.translations/zh-Hant.json index 8f82f6a623d3..be643ab9fd9a 100644 --- a/homeassistant/components/freebox/.translations/zh-Hant.json +++ b/homeassistant/components/freebox/.translations/zh-Hant.json @@ -21,6 +21,5 @@ "title": "Freebox" } } - }, - "title": "Freebox" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ca.json b/homeassistant/components/garmin_connect/.translations/ca.json index f1cdefd721f1..d128e1d2e25d 100644 --- a/homeassistant/components/garmin_connect/.translations/ca.json +++ b/homeassistant/components/garmin_connect/.translations/ca.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/cs.json b/homeassistant/components/garmin_connect/.translations/cs.json index 01aed49ac2aa..504c95290e1a 100644 --- a/homeassistant/components/garmin_connect/.translations/cs.json +++ b/homeassistant/components/garmin_connect/.translations/cs.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/da.json b/homeassistant/components/garmin_connect/.translations/da.json index 31e8c09be562..f664ad0e1f44 100644 --- a/homeassistant/components/garmin_connect/.translations/da.json +++ b/homeassistant/components/garmin_connect/.translations/da.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/de.json b/homeassistant/components/garmin_connect/.translations/de.json index f9517b8c00a5..54d27e9956e0 100644 --- a/homeassistant/components/garmin_connect/.translations/de.json +++ b/homeassistant/components/garmin_connect/.translations/de.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/en.json b/homeassistant/components/garmin_connect/.translations/en.json index d60c1bf91e93..52ae403cca38 100644 --- a/homeassistant/components/garmin_connect/.translations/en.json +++ b/homeassistant/components/garmin_connect/.translations/en.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/es.json b/homeassistant/components/garmin_connect/.translations/es.json index 4fb7efbf52c3..e14769bc6705 100644 --- a/homeassistant/components/garmin_connect/.translations/es.json +++ b/homeassistant/components/garmin_connect/.translations/es.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/fr.json b/homeassistant/components/garmin_connect/.translations/fr.json index 3fa5fb59dd02..ce97ccccf1be 100644 --- a/homeassistant/components/garmin_connect/.translations/fr.json +++ b/homeassistant/components/garmin_connect/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/hu.json b/homeassistant/components/garmin_connect/.translations/hu.json index cf26729c63bc..fd805fc4e4d5 100644 --- a/homeassistant/components/garmin_connect/.translations/hu.json +++ b/homeassistant/components/garmin_connect/.translations/hu.json @@ -19,6 +19,5 @@ "title": "Garmin Csatlakoz\u00e1s" } } - }, - "title": "Garmin Csatlakoz\u00e1s" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/it.json b/homeassistant/components/garmin_connect/.translations/it.json index aaf67ffe8cae..70f4bf840176 100644 --- a/homeassistant/components/garmin_connect/.translations/it.json +++ b/homeassistant/components/garmin_connect/.translations/it.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ko.json b/homeassistant/components/garmin_connect/.translations/ko.json index 507b7c164b91..4727a21db6a8 100644 --- a/homeassistant/components/garmin_connect/.translations/ko.json +++ b/homeassistant/components/garmin_connect/.translations/ko.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/lb.json b/homeassistant/components/garmin_connect/.translations/lb.json index d7e64cdbf8b1..6a5b859c3e15 100644 --- a/homeassistant/components/garmin_connect/.translations/lb.json +++ b/homeassistant/components/garmin_connect/.translations/lb.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/nl.json b/homeassistant/components/garmin_connect/.translations/nl.json index 086f2032d85e..e9b71c49c717 100644 --- a/homeassistant/components/garmin_connect/.translations/nl.json +++ b/homeassistant/components/garmin_connect/.translations/nl.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/no.json b/homeassistant/components/garmin_connect/.translations/no.json index 28206deade74..ae678abfe05d 100644 --- a/homeassistant/components/garmin_connect/.translations/no.json +++ b/homeassistant/components/garmin_connect/.translations/no.json @@ -19,6 +19,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/pl.json b/homeassistant/components/garmin_connect/.translations/pl.json index 932dcf80a0f8..e144ac994f77 100644 --- a/homeassistant/components/garmin_connect/.translations/pl.json +++ b/homeassistant/components/garmin_connect/.translations/pl.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/ru.json b/homeassistant/components/garmin_connect/.translations/ru.json index 1bd753fcbdc7..b3aa4e6604ca 100644 --- a/homeassistant/components/garmin_connect/.translations/ru.json +++ b/homeassistant/components/garmin_connect/.translations/ru.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/sl.json b/homeassistant/components/garmin_connect/.translations/sl.json index ebc980860de2..594cbffeaa72 100644 --- a/homeassistant/components/garmin_connect/.translations/sl.json +++ b/homeassistant/components/garmin_connect/.translations/sl.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/sv.json b/homeassistant/components/garmin_connect/.translations/sv.json index f77b7c18a09e..0f11ab2a8b96 100644 --- a/homeassistant/components/garmin_connect/.translations/sv.json +++ b/homeassistant/components/garmin_connect/.translations/sv.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/garmin_connect/.translations/zh-Hant.json b/homeassistant/components/garmin_connect/.translations/zh-Hant.json index aa1835d13fa3..f13f62abbedd 100644 --- a/homeassistant/components/garmin_connect/.translations/zh-Hant.json +++ b/homeassistant/components/garmin_connect/.translations/zh-Hant.json @@ -19,6 +19,5 @@ "title": "Garmin Connect" } } - }, - "title": "Garmin Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ca.json b/homeassistant/components/gdacs/.translations/ca.json index 4dd50811ab0f..db6359c881b7 100644 --- a/homeassistant/components/gdacs/.translations/ca.json +++ b/homeassistant/components/gdacs/.translations/ca.json @@ -11,6 +11,5 @@ "title": "Introducci\u00f3 dels detalls del filtre." } } - }, - "title": "Sistema Global de Coordinaci\u00f3 i Alerta per Desastres (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/da.json b/homeassistant/components/gdacs/.translations/da.json index dd97a1e48580..cc59dfa78bbf 100644 --- a/homeassistant/components/gdacs/.translations/da.json +++ b/homeassistant/components/gdacs/.translations/da.json @@ -11,6 +11,5 @@ "title": "Udfyld dine filteroplysninger." } } - }, - "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/de.json b/homeassistant/components/gdacs/.translations/de.json index aa66e0b2aa8b..07d1a4bdb79b 100644 --- a/homeassistant/components/gdacs/.translations/de.json +++ b/homeassistant/components/gdacs/.translations/de.json @@ -11,6 +11,5 @@ "title": "F\u00fclle deine Filterangaben aus." } } - }, - "title": "Globales Katastrophenalarm- und Koordinierungssystem (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/en.json b/homeassistant/components/gdacs/.translations/en.json index ccb2f2054ce3..8b4d3522ce20 100644 --- a/homeassistant/components/gdacs/.translations/en.json +++ b/homeassistant/components/gdacs/.translations/en.json @@ -11,6 +11,5 @@ "title": "Fill in your filter details." } } - }, - "title": "Global Disaster Alert and Coordination System (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/es.json b/homeassistant/components/gdacs/.translations/es.json index 6a87ebe5167e..816b44ceef00 100644 --- a/homeassistant/components/gdacs/.translations/es.json +++ b/homeassistant/components/gdacs/.translations/es.json @@ -11,6 +11,5 @@ "title": "Rellena los datos de tu filtro." } } - }, - "title": "Sistema Mundial de Alerta y Coordinaci\u00f3n de Desastres (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/fr.json b/homeassistant/components/gdacs/.translations/fr.json index d1bb6e48b50e..df44a1d9fa5f 100644 --- a/homeassistant/components/gdacs/.translations/fr.json +++ b/homeassistant/components/gdacs/.translations/fr.json @@ -11,6 +11,5 @@ "title": "Remplissez les d\u00e9tails de votre filtre." } } - }, - "title": "Syst\u00e8me mondial d'alerte et de coordination en cas de catastrophe (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/hu.json b/homeassistant/components/gdacs/.translations/hu.json index 172c6b26ad0b..47eca9a7fac3 100644 --- a/homeassistant/components/gdacs/.translations/hu.json +++ b/homeassistant/components/gdacs/.translations/hu.json @@ -11,6 +11,5 @@ "title": "T\u00f6ltse ki a sz\u0171r\u0151 adatait." } } - }, - "title": "Glob\u00e1lis katasztr\u00f3fariaszt\u00e1si \u00e9s koordin\u00e1ci\u00f3s rendszer (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/it.json b/homeassistant/components/gdacs/.translations/it.json index 1a281a0161df..3fad0146c138 100644 --- a/homeassistant/components/gdacs/.translations/it.json +++ b/homeassistant/components/gdacs/.translations/it.json @@ -11,6 +11,5 @@ "title": "Inserisci i tuoi dettagli del filtro." } } - }, - "title": "Sistema globale di allerta e coordinamento delle catastrofi (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ko.json b/homeassistant/components/gdacs/.translations/ko.json index 8daac5abd50c..1aeaf2192889 100644 --- a/homeassistant/components/gdacs/.translations/ko.json +++ b/homeassistant/components/gdacs/.translations/ko.json @@ -11,6 +11,5 @@ "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } } - }, - "title": "\uad6d\uc81c \uc7ac\ub09c \uacbd\ubcf4 \ubc0f \uc870\uc815 \uae30\uad6c (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/lb.json b/homeassistant/components/gdacs/.translations/lb.json index bbd5d6f6a820..5125ce8c58e8 100644 --- a/homeassistant/components/gdacs/.translations/lb.json +++ b/homeassistant/components/gdacs/.translations/lb.json @@ -11,6 +11,5 @@ "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } } - }, - "title": "Globale D\u00e9saster Alerte a Koordinatioun System (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/nl.json b/homeassistant/components/gdacs/.translations/nl.json index 9a543d205583..f2a09892a663 100644 --- a/homeassistant/components/gdacs/.translations/nl.json +++ b/homeassistant/components/gdacs/.translations/nl.json @@ -11,6 +11,5 @@ "title": "Vul uw filtergegevens in." } } - }, - "title": "Wereldwijd rampenwaarschuwings- en co\u00f6rdinatiesysteem (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/no.json b/homeassistant/components/gdacs/.translations/no.json index 68b8ea06867b..372a24c0b385 100644 --- a/homeassistant/components/gdacs/.translations/no.json +++ b/homeassistant/components/gdacs/.translations/no.json @@ -11,6 +11,5 @@ "title": "Fyll ut filterdetaljene." } } - }, - "title": "Globalt katastrofevarslings- og koordineringssystem (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/pl.json b/homeassistant/components/gdacs/.translations/pl.json index 59b9a9448a73..406f8af58f44 100644 --- a/homeassistant/components/gdacs/.translations/pl.json +++ b/homeassistant/components/gdacs/.translations/pl.json @@ -11,6 +11,5 @@ "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } } - }, - "title": "Globalny system ostrzegania i koordynacji w przypadku katastrof (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/ru.json b/homeassistant/components/gdacs/.translations/ru.json index 9a4aa3e80b02..b94669440378 100644 --- a/homeassistant/components/gdacs/.translations/ru.json +++ b/homeassistant/components/gdacs/.translations/ru.json @@ -11,6 +11,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0438\u0445\u0438\u0439\u043d\u044b\u0445 \u0431\u0435\u0434\u0441\u0442\u0432\u0438\u0439 (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/sl.json b/homeassistant/components/gdacs/.translations/sl.json index f567173702f1..24c4e8a9b50c 100644 --- a/homeassistant/components/gdacs/.translations/sl.json +++ b/homeassistant/components/gdacs/.translations/sl.json @@ -11,6 +11,5 @@ "title": "Izpolnite podrobnosti filtra." } } - }, - "title": "Globalni sistem opozarjanja in koordinacije nesre\u010d (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/sv.json b/homeassistant/components/gdacs/.translations/sv.json index 581b98863292..6688b68eb573 100644 --- a/homeassistant/components/gdacs/.translations/sv.json +++ b/homeassistant/components/gdacs/.translations/sv.json @@ -11,6 +11,5 @@ "title": "Fyll i filterinformation." } } - }, - "title": "Globalt katastrofvarnings- och samordningssystem (GDACS)" + } } \ No newline at end of file diff --git a/homeassistant/components/gdacs/.translations/zh-Hant.json b/homeassistant/components/gdacs/.translations/zh-Hant.json index 63bfc613d111..3e643c732c88 100644 --- a/homeassistant/components/gdacs/.translations/zh-Hant.json +++ b/homeassistant/components/gdacs/.translations/zh-Hant.json @@ -11,6 +11,5 @@ "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } } - }, - "title": "\u5168\u7403\u707d\u96e3\u9810\u8b66\u548c\u5354\u8abf\u7cfb\u7d71\uff08GDACS\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/bg.json b/homeassistant/components/geofency/.translations/bg.json index 35fbd15598c3..1bd9cf1a8188 100644 --- a/homeassistant/components/geofency/.translations/bg.json +++ b/homeassistant/components/geofency/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ca.json b/homeassistant/components/geofency/.translations/ca.json index 06f5c6f4c8e9..315b1d3be8d3 100644 --- a/homeassistant/components/geofency/.translations/ca.json +++ b/homeassistant/components/geofency/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Geofency" } } - }, - "title": "Webhook de Geofency" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/cs.json b/homeassistant/components/geofency/.translations/cs.json index bec6897ed349..a91fa1cbb6f2 100644 --- a/homeassistant/components/geofency/.translations/cs.json +++ b/homeassistant/components/geofency/.translations/cs.json @@ -9,6 +9,5 @@ "title": "Nastavit Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/da.json b/homeassistant/components/geofency/.translations/da.json index 8f9b5a16516c..176ba84b7681 100644 --- a/homeassistant/components/geofency/.translations/da.json +++ b/homeassistant/components/geofency/.translations/da.json @@ -13,6 +13,5 @@ "title": "Ops\u00e6tning af Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/de.json b/homeassistant/components/geofency/.translations/de.json index 0ac6edee190f..c585ee467aab 100644 --- a/homeassistant/components/geofency/.translations/de.json +++ b/homeassistant/components/geofency/.translations/de.json @@ -13,6 +13,5 @@ "title": "Richte den Geofency Webhook ein" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/en.json b/homeassistant/components/geofency/.translations/en.json index eed200f12cb1..dad5e9c77d49 100644 --- a/homeassistant/components/geofency/.translations/en.json +++ b/homeassistant/components/geofency/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/es-419.json b/homeassistant/components/geofency/.translations/es-419.json index e87ce684ac66..bb8160ed5eff 100644 --- a/homeassistant/components/geofency/.translations/es-419.json +++ b/homeassistant/components/geofency/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Geofency" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/es.json b/homeassistant/components/geofency/.translations/es.json index a43b2dd19e91..ae7f87b93bbc 100644 --- a/homeassistant/components/geofency/.translations/es.json +++ b/homeassistant/components/geofency/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Geofency" } } - }, - "title": "Webhook de Geofency" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/fr.json b/homeassistant/components/geofency/.translations/fr.json index cdab9ab2b31e..142f40754b9d 100644 --- a/homeassistant/components/geofency/.translations/fr.json +++ b/homeassistant/components/geofency/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook Geofency" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/hu.json b/homeassistant/components/geofency/.translations/hu.json index 488692028bfd..026912e0d3e3 100644 --- a/homeassistant/components/geofency/.translations/hu.json +++ b/homeassistant/components/geofency/.translations/hu.json @@ -13,6 +13,5 @@ "title": "A Geofency Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/it.json b/homeassistant/components/geofency/.translations/it.json index 74912d710f93..0640d351e53d 100644 --- a/homeassistant/components/geofency/.translations/it.json +++ b/homeassistant/components/geofency/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Geofency" } } - }, - "title": "Webhook di Geofency" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ko.json b/homeassistant/components/geofency/.translations/ko.json index 50e8242c2641..f1ed98f50cd1 100644 --- a/homeassistant/components/geofency/.translations/ko.json +++ b/homeassistant/components/geofency/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Geofency Webhook \uc124\uc815" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/lb.json b/homeassistant/components/geofency/.translations/lb.json index 1ed4b842b07b..16f973e52603 100644 --- a/homeassistant/components/geofency/.translations/lb.json +++ b/homeassistant/components/geofency/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Geofency Webhook ariichten" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/nl.json b/homeassistant/components/geofency/.translations/nl.json index b4378620b14f..bedf5f7efb49 100644 --- a/homeassistant/components/geofency/.translations/nl.json +++ b/homeassistant/components/geofency/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Geofency Webhook instellen" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/no.json b/homeassistant/components/geofency/.translations/no.json index e041048a0433..ea9e1827b637 100644 --- a/homeassistant/components/geofency/.translations/no.json +++ b/homeassistant/components/geofency/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Geofency Webhook" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pl.json b/homeassistant/components/geofency/.translations/pl.json index 23205426c872..9180d3483eff 100644 --- a/homeassistant/components/geofency/.translations/pl.json +++ b/homeassistant/components/geofency/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pt-BR.json b/homeassistant/components/geofency/.translations/pt-BR.json index 5c55feb0efd1..1f715bf4a7a3 100644 --- a/homeassistant/components/geofency/.translations/pt-BR.json +++ b/homeassistant/components/geofency/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/pt.json b/homeassistant/components/geofency/.translations/pt.json index a8a162e55df9..c5b080f0dcd5 100644 --- a/homeassistant/components/geofency/.translations/pt.json +++ b/homeassistant/components/geofency/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/ru.json b/homeassistant/components/geofency/.translations/ru.json index 434a86a634a1..dd2a20ad61c1 100644 --- a/homeassistant/components/geofency/.translations/ru.json +++ b/homeassistant/components/geofency/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Geofency" } } - }, - "title": "Geofency" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/sl.json b/homeassistant/components/geofency/.translations/sl.json index 77067ab1c920..ba293c8c11a4 100644 --- a/homeassistant/components/geofency/.translations/sl.json +++ b/homeassistant/components/geofency/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/sv.json b/homeassistant/components/geofency/.translations/sv.json index 30384a1a3720..f18a7bd25bbe 100644 --- a/homeassistant/components/geofency/.translations/sv.json +++ b/homeassistant/components/geofency/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/zh-Hans.json b/homeassistant/components/geofency/.translations/zh-Hans.json index d86d0eb35e24..5be88f69e41c 100644 --- a/homeassistant/components/geofency/.translations/zh-Hans.json +++ b/homeassistant/components/geofency/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geofency/.translations/zh-Hant.json b/homeassistant/components/geofency/.translations/zh-Hant.json index d6a474f70f33..4bf9f6b71584 100644 --- a/homeassistant/components/geofency/.translations/zh-Hant.json +++ b/homeassistant/components/geofency/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Geofency Webhook" } } - }, - "title": "Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/bg.json b/homeassistant/components/geonetnz_quakes/.translations/bg.json index 79d0b591ef1e..8b4d3e91f2c8 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/bg.json +++ b/homeassistant/components/geonetnz_quakes/.translations/bg.json @@ -9,6 +9,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0437\u0430 \u0444\u0438\u043b\u0442\u044a\u0440\u0430 \u0441\u0438." } } - }, - "title": "GeoNet NZ \u0417\u0435\u043c\u0435\u0442\u0440\u0435\u0441\u0435\u043d\u0438\u044f" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ca.json b/homeassistant/components/geonetnz_quakes/.translations/ca.json index 213a1c19ba8d..e97142a6e3fe 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ca.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ca.json @@ -12,6 +12,5 @@ "title": "Introdueix els detalls del filtre." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/da.json b/homeassistant/components/geonetnz_quakes/.translations/da.json index 0cd170cfd7de..a1ef4d41469c 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/da.json +++ b/homeassistant/components/geonetnz_quakes/.translations/da.json @@ -9,6 +9,5 @@ "title": "Udfyld dine filteroplysninger." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/de.json b/homeassistant/components/geonetnz_quakes/.translations/de.json index 3ed0fbc85046..583712c6c4ea 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/de.json +++ b/homeassistant/components/geonetnz_quakes/.translations/de.json @@ -12,6 +12,5 @@ "title": "F\u00fclle deine Filterdaten aus." } } - }, - "title": "GeoNet NZ Erdbeben" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/en.json b/homeassistant/components/geonetnz_quakes/.translations/en.json index 1a253b18f1bb..68f73bcf0898 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/en.json +++ b/homeassistant/components/geonetnz_quakes/.translations/en.json @@ -12,6 +12,5 @@ "title": "Fill in your filter details." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/es.json b/homeassistant/components/geonetnz_quakes/.translations/es.json index efb3f5deda8c..0de80cf346a3 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/es.json +++ b/homeassistant/components/geonetnz_quakes/.translations/es.json @@ -12,6 +12,5 @@ "title": "Complete todos los campos requeridos" } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/fr.json b/homeassistant/components/geonetnz_quakes/.translations/fr.json index 8c5791b0ed12..e448f9993bf2 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/fr.json +++ b/homeassistant/components/geonetnz_quakes/.translations/fr.json @@ -12,6 +12,5 @@ "title": "Remplissez les d\u00e9tails de votre filtre." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/it.json b/homeassistant/components/geonetnz_quakes/.translations/it.json index 31fbeb84f66e..c07f04cdb644 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/it.json +++ b/homeassistant/components/geonetnz_quakes/.translations/it.json @@ -12,6 +12,5 @@ "title": "Inserisci i tuoi dettagli del filtro." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ko.json b/homeassistant/components/geonetnz_quakes/.translations/ko.json index 8d5cec07df73..b231629e8567 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ko.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ko.json @@ -12,6 +12,5 @@ "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/lb.json b/homeassistant/components/geonetnz_quakes/.translations/lb.json index f850c61bc992..482330099b34 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/lb.json +++ b/homeassistant/components/geonetnz_quakes/.translations/lb.json @@ -12,6 +12,5 @@ "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/nl.json b/homeassistant/components/geonetnz_quakes/.translations/nl.json index adfccab84c38..4fb50788fc92 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/nl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/nl.json @@ -9,6 +9,5 @@ "title": "Vul uw filtergegevens in." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/no.json b/homeassistant/components/geonetnz_quakes/.translations/no.json index e6381bc43762..b14e0ded3787 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/no.json +++ b/homeassistant/components/geonetnz_quakes/.translations/no.json @@ -12,6 +12,5 @@ "title": "Fyll ut filterdetaljene." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/pl.json b/homeassistant/components/geonetnz_quakes/.translations/pl.json index 976c744e96bc..80d891a441ae 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pl.json @@ -12,6 +12,5 @@ "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json index 10d5a7023f4c..9f08d6b820c2 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json +++ b/homeassistant/components/geonetnz_quakes/.translations/pt-BR.json @@ -9,6 +9,5 @@ "title": "Preencha os detalhes do filtro." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/ru.json b/homeassistant/components/geonetnz_quakes/.translations/ru.json index f516da66d62e..7ee4f64431e3 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/ru.json +++ b/homeassistant/components/geonetnz_quakes/.translations/ru.json @@ -12,6 +12,5 @@ "title": "GeoNet NZ Quakes" } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/sl.json b/homeassistant/components/geonetnz_quakes/.translations/sl.json index 3464e03e56c2..b1e207114637 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sl.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sl.json @@ -12,6 +12,5 @@ "title": "Izpolnite podrobnosti filtra." } } - }, - "title": "GeoNet NZ Potresi" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/sv.json b/homeassistant/components/geonetnz_quakes/.translations/sv.json index d32e17ce6a94..b1040e9bc23f 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/sv.json +++ b/homeassistant/components/geonetnz_quakes/.translations/sv.json @@ -9,6 +9,5 @@ "title": "Fyll i dina filterdetaljer." } } - }, - "title": "GeoNet NZ Quakes" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json index 900b97c3222f..1d697401b956 100644 --- a/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json +++ b/homeassistant/components/geonetnz_quakes/.translations/zh-Hant.json @@ -12,6 +12,5 @@ "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } } - }, - "title": "\u7d10\u897f\u862d GeoNet \u5730\u9707\u9810\u8b66" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/bg.json b/homeassistant/components/geonetnz_volcano/.translations/bg.json index fcec44ea3a38..e50751ad49e5 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/bg.json +++ b/homeassistant/components/geonetnz_volcano/.translations/bg.json @@ -11,6 +11,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0437\u0430 \u0444\u0438\u043b\u0442\u044a\u0440\u0430 \u0441\u0438." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ca.json b/homeassistant/components/geonetnz_volcano/.translations/ca.json index 279248735974..8af45618a17a 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ca.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ca.json @@ -11,6 +11,5 @@ "title": "Introducci\u00f3 dels detalls del filtre." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/da.json b/homeassistant/components/geonetnz_volcano/.translations/da.json index a779d8fbe050..b83162e0b352 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/da.json +++ b/homeassistant/components/geonetnz_volcano/.translations/da.json @@ -11,6 +11,5 @@ "title": "Udfyld dine filteroplysninger." } } - }, - "title": "GeoNet NZ vulkan" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/de.json b/homeassistant/components/geonetnz_volcano/.translations/de.json index 525bc38bd034..8c3cd960b4d2 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/de.json +++ b/homeassistant/components/geonetnz_volcano/.translations/de.json @@ -11,6 +11,5 @@ "title": "F\u00fclle deine Filterangaben aus." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/en.json b/homeassistant/components/geonetnz_volcano/.translations/en.json index 3afe70f570b3..fe24b6dcea05 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/en.json +++ b/homeassistant/components/geonetnz_volcano/.translations/en.json @@ -11,6 +11,5 @@ "title": "Fill in your filter details." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/es.json b/homeassistant/components/geonetnz_volcano/.translations/es.json index 5af610a48a4c..c26033e18619 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/es.json +++ b/homeassistant/components/geonetnz_volcano/.translations/es.json @@ -11,6 +11,5 @@ "title": "Complete los detalles de su filtro." } } - }, - "title": "GeoNet NZ Volc\u00e1n" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/fr.json b/homeassistant/components/geonetnz_volcano/.translations/fr.json index 1f984054311f..2692768910c8 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/fr.json +++ b/homeassistant/components/geonetnz_volcano/.translations/fr.json @@ -11,6 +11,5 @@ "title": "Remplissez les d\u00e9tails de votre filtre." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/hu.json b/homeassistant/components/geonetnz_volcano/.translations/hu.json index 41a27d722044..e1d2bdb9f9ed 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/hu.json +++ b/homeassistant/components/geonetnz_volcano/.translations/hu.json @@ -11,6 +11,5 @@ "title": "T\u00f6ltse ki a sz\u0171r\u0151 adatait." } } - }, - "title": "GeoNet NZ vulk\u00e1n" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/it.json b/homeassistant/components/geonetnz_volcano/.translations/it.json index 1200bb174dff..c566cdfb81b7 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/it.json +++ b/homeassistant/components/geonetnz_volcano/.translations/it.json @@ -11,6 +11,5 @@ "title": "Inserisci i tuoi dettagli del filtro." } } - }, - "title": "GeoNet NZ Vulcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ko.json b/homeassistant/components/geonetnz_volcano/.translations/ko.json index 256b21f56c3d..9ee235ea2b65 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ko.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ko.json @@ -11,6 +11,5 @@ "title": "\ud544\ud130 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/lb.json b/homeassistant/components/geonetnz_volcano/.translations/lb.json index dd420fc08f20..0d5108982b67 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/lb.json +++ b/homeassistant/components/geonetnz_volcano/.translations/lb.json @@ -11,6 +11,5 @@ "title": "F\u00ebllt \u00e4r Filter D\u00e9tailer aus." } } - }, - "title": "GeoNet NZ Vulkan" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/nl.json b/homeassistant/components/geonetnz_volcano/.translations/nl.json index f2835c180362..73c7c1eaab35 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/nl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/nl.json @@ -11,6 +11,5 @@ "title": "Vul uw filtergegevens in." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/no.json b/homeassistant/components/geonetnz_volcano/.translations/no.json index 64179ade0e16..17ce4a32b404 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/no.json +++ b/homeassistant/components/geonetnz_volcano/.translations/no.json @@ -11,6 +11,5 @@ "title": "Fyll ut filterdetaljene." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/pl.json b/homeassistant/components/geonetnz_volcano/.translations/pl.json index e124e632cfc4..23a5640ae6f4 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/pl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/pl.json @@ -11,6 +11,5 @@ "title": "Wprowad\u017a szczeg\u00f3\u0142owe dane filtra." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ro.json b/homeassistant/components/geonetnz_volcano/.translations/ro.json index 72de59dafdb4..904bcd683109 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ro.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ro.json @@ -8,6 +8,5 @@ "title": "Completa\u021bi detaliile filtrului." } } - }, - "title": "Vulcanul GeoNet NZ" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/ru.json b/homeassistant/components/geonetnz_volcano/.translations/ru.json index 49fdfa21cbd1..33a7f90b6a71 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/ru.json +++ b/homeassistant/components/geonetnz_volcano/.translations/ru.json @@ -11,6 +11,5 @@ "title": "GeoNet NZ Volcano" } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/sl.json b/homeassistant/components/geonetnz_volcano/.translations/sl.json index e143dd3302f1..885c41957f7c 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/sl.json +++ b/homeassistant/components/geonetnz_volcano/.translations/sl.json @@ -11,6 +11,5 @@ "title": "Izpolnite podrobnosti filtra." } } - }, - "title": "GeoNet NZ vulkan" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/sv.json b/homeassistant/components/geonetnz_volcano/.translations/sv.json index 8846d85233b4..3abddb78c68f 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/sv.json +++ b/homeassistant/components/geonetnz_volcano/.translations/sv.json @@ -11,6 +11,5 @@ "title": "Fyll i dina filterdetaljer." } } - }, - "title": "GeoNet NZ Volcano" + } } \ No newline at end of file diff --git a/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json b/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json index 2ecc8c3a7954..a587c9c0fd4b 100644 --- a/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json +++ b/homeassistant/components/geonetnz_volcano/.translations/zh-Hant.json @@ -11,6 +11,5 @@ "title": "\u586b\u5beb\u904e\u6ffe\u5668\u8cc7\u8a0a\u3002" } } - }, - "title": "\u7d10\u897f\u862d GeoNet \u706b\u5c71\u9810\u8b66" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ca.json b/homeassistant/components/gios/.translations/ca.json index 3896bca38575..1e451432be70 100644 --- a/homeassistant/components/gios/.translations/ca.json +++ b/homeassistant/components/gios/.translations/ca.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/da.json b/homeassistant/components/gios/.translations/da.json index ffdd320ed169..d4442982e1ed 100644 --- a/homeassistant/components/gios/.translations/da.json +++ b/homeassistant/components/gios/.translations/da.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/de.json b/homeassistant/components/gios/.translations/de.json index 1caf8c0d41f7..0a5cea1819db 100644 --- a/homeassistant/components/gios/.translations/de.json +++ b/homeassistant/components/gios/.translations/de.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polnische Hauptinspektion f\u00fcr Umweltschutz)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/en.json b/homeassistant/components/gios/.translations/en.json index 7825a4a84dfb..3d07ad843bd1 100644 --- a/homeassistant/components/gios/.translations/en.json +++ b/homeassistant/components/gios/.translations/en.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/es.json b/homeassistant/components/gios/.translations/es.json index 433f31856427..a7c30cd9d72b 100644 --- a/homeassistant/components/gios/.translations/es.json +++ b/homeassistant/components/gios/.translations/es.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Inspecci\u00f3n Jefe de Protecci\u00f3n del Medio Ambiente de Polonia)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/fr.json b/homeassistant/components/gios/.translations/fr.json index 6c9242872b11..b06c41208bc3 100644 --- a/homeassistant/components/gios/.translations/fr.json +++ b/homeassistant/components/gios/.translations/fr.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Inspection g\u00e9n\u00e9rale polonaise de la protection de l'environnement)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/hu.json b/homeassistant/components/gios/.translations/hu.json index 1ed039228213..5702d3b33d26 100644 --- a/homeassistant/components/gios/.translations/hu.json +++ b/homeassistant/components/gios/.translations/hu.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Lengyel K\u00f6rnyezetv\u00e9delmi F\u0151fel\u00fcgyel\u0151s\u00e9g)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/it.json b/homeassistant/components/gios/.translations/it.json index 8780c8160f63..e49fe2ebfe8d 100644 --- a/homeassistant/components/gios/.translations/it.json +++ b/homeassistant/components/gios/.translations/it.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Ispettorato capo polacco di protezione ambientale)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ko.json b/homeassistant/components/gios/.translations/ko.json index f749fb21d8fa..2ad64efadc1d 100644 --- a/homeassistant/components/gios/.translations/ko.json +++ b/homeassistant/components/gios/.translations/ko.json @@ -18,6 +18,5 @@ "title": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a)" } } - }, - "title": "\ud3f4\ub780\ub4dc \ud658\uacbd\uccad (GIO\u015a)" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/lb.json b/homeassistant/components/gios/.translations/lb.json index 95043a6e9b42..66cd2393a22f 100644 --- a/homeassistant/components/gios/.translations/lb.json +++ b/homeassistant/components/gios/.translations/lb.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polnesch Chefinspektorat vum \u00cbmweltschutz)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/nl.json b/homeassistant/components/gios/.translations/nl.json index 39ed17bcef90..09fddb56225f 100644 --- a/homeassistant/components/gios/.translations/nl.json +++ b/homeassistant/components/gios/.translations/nl.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Poolse hoofdinspectie van milieubescherming)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/no.json b/homeassistant/components/gios/.translations/no.json index a633e68e798e..93c78b33db95 100644 --- a/homeassistant/components/gios/.translations/no.json +++ b/homeassistant/components/gios/.translations/no.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/pl.json b/homeassistant/components/gios/.translations/pl.json index eb8969254c91..4d4b07f31cc9 100644 --- a/homeassistant/components/gios/.translations/pl.json +++ b/homeassistant/components/gios/.translations/pl.json @@ -18,6 +18,5 @@ "title": "G\u0142\u00f3wny Inspektorat Ochrony \u015arodowiska (GIO\u015a)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/ru.json b/homeassistant/components/gios/.translations/ru.json index 936cb10ce2a9..ca94b617c937 100644 --- a/homeassistant/components/gios/.translations/ru.json +++ b/homeassistant/components/gios/.translations/ru.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (\u041f\u043e\u043b\u044c\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u043e\u0445\u0440\u0430\u043d\u0435 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044b)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/sl.json b/homeassistant/components/gios/.translations/sl.json index 71e09774f09c..f01728783cc6 100644 --- a/homeassistant/components/gios/.translations/sl.json +++ b/homeassistant/components/gios/.translations/sl.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (glavni poljski in\u0161pektorat za varstvo okolja)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/sv.json b/homeassistant/components/gios/.translations/sv.json index 3adc8dc3b301..a8bafa50119b 100644 --- a/homeassistant/components/gios/.translations/sv.json +++ b/homeassistant/components/gios/.translations/sv.json @@ -18,6 +18,5 @@ "title": "GIO\u015a (Polish Chief Inspectorate Of Environmental Protection)" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/gios/.translations/zh-Hant.json b/homeassistant/components/gios/.translations/zh-Hant.json index c3bb9b1b7b3c..0d75f83f9e52 100644 --- a/homeassistant/components/gios/.translations/zh-Hant.json +++ b/homeassistant/components/gios/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "GIO\u015a\uff08\u6ce2\u862d\u7e3d\u74b0\u5883\u4fdd\u8b77\u7763\u5bdf\u8655\uff09" } } - }, - "title": "GIO\u015a" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/bg.json b/homeassistant/components/glances/.translations/bg.json index c60247a6e5bd..ef60201a57f1 100644 --- a/homeassistant/components/glances/.translations/bg.json +++ b/homeassistant/components/glances/.translations/bg.json @@ -32,6 +32,5 @@ "description": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438 \u0437\u0430 Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ca.json b/homeassistant/components/glances/.translations/ca.json index 3c8a87902cf2..dd9d151296f3 100644 --- a/homeassistant/components/glances/.translations/ca.json +++ b/homeassistant/components/glances/.translations/ca.json @@ -32,6 +32,5 @@ "description": "Opcions de configuraci\u00f3 de Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/da.json b/homeassistant/components/glances/.translations/da.json index 9bffbed2d917..995ae9d3bba5 100644 --- a/homeassistant/components/glances/.translations/da.json +++ b/homeassistant/components/glances/.translations/da.json @@ -32,6 +32,5 @@ "description": "Konfigurationsindstillinger for Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/de.json b/homeassistant/components/glances/.translations/de.json index efa2e69124a8..69c34907f19b 100644 --- a/homeassistant/components/glances/.translations/de.json +++ b/homeassistant/components/glances/.translations/de.json @@ -32,6 +32,5 @@ "description": "Konfiguriere die Optionen f\u00fcr Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/en.json b/homeassistant/components/glances/.translations/en.json index 1b1099f509ad..0330e8cef653 100644 --- a/homeassistant/components/glances/.translations/en.json +++ b/homeassistant/components/glances/.translations/en.json @@ -32,6 +32,5 @@ "description": "Configure options for Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/es.json b/homeassistant/components/glances/.translations/es.json index 3eb56a46021d..16b768fd922a 100644 --- a/homeassistant/components/glances/.translations/es.json +++ b/homeassistant/components/glances/.translations/es.json @@ -32,6 +32,5 @@ "description": "Configurar opciones para Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/fr.json b/homeassistant/components/glances/.translations/fr.json index 1fd25f69efc7..cc9be2d6ce86 100644 --- a/homeassistant/components/glances/.translations/fr.json +++ b/homeassistant/components/glances/.translations/fr.json @@ -32,6 +32,5 @@ "description": "Configurer les options pour Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/hu.json b/homeassistant/components/glances/.translations/hu.json index df493fca339b..ebb44dc1d6e0 100644 --- a/homeassistant/components/glances/.translations/hu.json +++ b/homeassistant/components/glances/.translations/hu.json @@ -32,6 +32,5 @@ "description": "A Glances be\u00e1ll\u00edt\u00e1sainak konfigur\u00e1l\u00e1sa" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/it.json b/homeassistant/components/glances/.translations/it.json index 9c2197ba443c..7e8d5af6d8fd 100644 --- a/homeassistant/components/glances/.translations/it.json +++ b/homeassistant/components/glances/.translations/it.json @@ -32,6 +32,5 @@ "description": "Configura le opzioni per Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ko.json b/homeassistant/components/glances/.translations/ko.json index 37b580369da8..d0e318a04541 100644 --- a/homeassistant/components/glances/.translations/ko.json +++ b/homeassistant/components/glances/.translations/ko.json @@ -32,6 +32,5 @@ "description": "Glances \uc635\uc158 \uad6c\uc131" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/lb.json b/homeassistant/components/glances/.translations/lb.json index 965a21b892e3..4aba9293bd9f 100644 --- a/homeassistant/components/glances/.translations/lb.json +++ b/homeassistant/components/glances/.translations/lb.json @@ -32,6 +32,5 @@ "description": "Optioune konfigur\u00e9ieren fir d'Usiichten" } } - }, - "title": "Usiichten" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/nl.json b/homeassistant/components/glances/.translations/nl.json index 0ede723702b5..c2f2b9d473a5 100644 --- a/homeassistant/components/glances/.translations/nl.json +++ b/homeassistant/components/glances/.translations/nl.json @@ -32,6 +32,5 @@ "description": "Configureer opties voor Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/no.json b/homeassistant/components/glances/.translations/no.json index 5ba05b639e87..dd593c4add6f 100644 --- a/homeassistant/components/glances/.translations/no.json +++ b/homeassistant/components/glances/.translations/no.json @@ -32,6 +32,5 @@ "description": "Konfigurasjonsalternativer for Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/pl.json b/homeassistant/components/glances/.translations/pl.json index 41634ec4d23c..b0dcfe0c36f7 100644 --- a/homeassistant/components/glances/.translations/pl.json +++ b/homeassistant/components/glances/.translations/pl.json @@ -32,6 +32,5 @@ "description": "Konfiguracja opcji dla Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/ru.json b/homeassistant/components/glances/.translations/ru.json index 648ab7824e9e..d87bcb536cf7 100644 --- a/homeassistant/components/glances/.translations/ru.json +++ b/homeassistant/components/glances/.translations/ru.json @@ -32,6 +32,5 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/sl.json b/homeassistant/components/glances/.translations/sl.json index 1dd99a1572d7..081b9ebfda10 100644 --- a/homeassistant/components/glances/.translations/sl.json +++ b/homeassistant/components/glances/.translations/sl.json @@ -32,6 +32,5 @@ "description": "Konfiguracija mo\u017enosti za Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/sv.json b/homeassistant/components/glances/.translations/sv.json index 6e77b8822115..c4ead9e6aa6c 100644 --- a/homeassistant/components/glances/.translations/sv.json +++ b/homeassistant/components/glances/.translations/sv.json @@ -32,6 +32,5 @@ "description": "Konfigurera alternativ f\u00f6r Glances" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/glances/.translations/zh-Hant.json b/homeassistant/components/glances/.translations/zh-Hant.json index 88286d428155..dd7c3711e373 100644 --- a/homeassistant/components/glances/.translations/zh-Hant.json +++ b/homeassistant/components/glances/.translations/zh-Hant.json @@ -32,6 +32,5 @@ "description": "Glances \u8a2d\u5b9a\u9078\u9805" } } - }, - "title": "Glances" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/bg.json b/homeassistant/components/gpslogger/.translations/bg.json index 5b714dcd6a4a..56843e752c92 100644 --- a/homeassistant/components/gpslogger/.translations/bg.json +++ b/homeassistant/components/gpslogger/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ca.json b/homeassistant/components/gpslogger/.translations/ca.json index 9679e19fabf9..aebd839a8371 100644 --- a/homeassistant/components/gpslogger/.translations/ca.json +++ b/homeassistant/components/gpslogger/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de GPSLogger" } } - }, - "title": "Webhook de GPSLogger" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/cs.json b/homeassistant/components/gpslogger/.translations/cs.json index 11a0eb5ce2e0..d3420c011ca2 100644 --- a/homeassistant/components/gpslogger/.translations/cs.json +++ b/homeassistant/components/gpslogger/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastavit GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/da.json b/homeassistant/components/gpslogger/.translations/da.json index 53d7bc89e898..e14b3a9ceb03 100644 --- a/homeassistant/components/gpslogger/.translations/da.json +++ b/homeassistant/components/gpslogger/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/de.json b/homeassistant/components/gpslogger/.translations/de.json index cebd8ffcd2c9..3aab63489c36 100644 --- a/homeassistant/components/gpslogger/.translations/de.json +++ b/homeassistant/components/gpslogger/.translations/de.json @@ -13,6 +13,5 @@ "title": "GPSLogger Webhook einrichten" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/en.json b/homeassistant/components/gpslogger/.translations/en.json index ee7b32d70309..46bbb2314832 100644 --- a/homeassistant/components/gpslogger/.translations/en.json +++ b/homeassistant/components/gpslogger/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/es-419.json b/homeassistant/components/gpslogger/.translations/es-419.json index fecd6608d4b6..a6d855dc758e 100644 --- a/homeassistant/components/gpslogger/.translations/es-419.json +++ b/homeassistant/components/gpslogger/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de GPSLogger" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/es.json b/homeassistant/components/gpslogger/.translations/es.json index e46aec179028..0c20258fba41 100644 --- a/homeassistant/components/gpslogger/.translations/es.json +++ b/homeassistant/components/gpslogger/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el webhook de GPSLogger" } } - }, - "title": "Webhook de GPSLogger" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/fr.json b/homeassistant/components/gpslogger/.translations/fr.json index 34cf0a4f9513..65db2a5a3000 100644 --- a/homeassistant/components/gpslogger/.translations/fr.json +++ b/homeassistant/components/gpslogger/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook GPSLogger" } } - }, - "title": "Webhook GPSLogger" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/hu.json b/homeassistant/components/gpslogger/.translations/hu.json index eb87d9de8a70..6080cf11c5ef 100644 --- a/homeassistant/components/gpslogger/.translations/hu.json +++ b/homeassistant/components/gpslogger/.translations/hu.json @@ -13,6 +13,5 @@ "title": "GPSLogger Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/it.json b/homeassistant/components/gpslogger/.translations/it.json index a293b4297fd1..8c26f19ac5b7 100644 --- a/homeassistant/components/gpslogger/.translations/it.json +++ b/homeassistant/components/gpslogger/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di GPSLogger" } } - }, - "title": "Webhook di GPSLogger" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ko.json b/homeassistant/components/gpslogger/.translations/ko.json index 72b2aaf868a0..e08488497589 100644 --- a/homeassistant/components/gpslogger/.translations/ko.json +++ b/homeassistant/components/gpslogger/.translations/ko.json @@ -13,6 +13,5 @@ "title": "GPSLogger Webhook \uc124\uc815" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/lb.json b/homeassistant/components/gpslogger/.translations/lb.json index d0bcc4f61f4e..a69ac61bc988 100644 --- a/homeassistant/components/gpslogger/.translations/lb.json +++ b/homeassistant/components/gpslogger/.translations/lb.json @@ -13,6 +13,5 @@ "title": "GPSLogger Webhook ariichten" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/nl.json b/homeassistant/components/gpslogger/.translations/nl.json index d47cedda6a60..c5cb3b737db7 100644 --- a/homeassistant/components/gpslogger/.translations/nl.json +++ b/homeassistant/components/gpslogger/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Configureer de GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/no.json b/homeassistant/components/gpslogger/.translations/no.json index 7e0d87fa3e18..2b3dc0f67fc2 100644 --- a/homeassistant/components/gpslogger/.translations/no.json +++ b/homeassistant/components/gpslogger/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pl.json b/homeassistant/components/gpslogger/.translations/pl.json index 9ec47e600a02..76cac00025f5 100644 --- a/homeassistant/components/gpslogger/.translations/pl.json +++ b/homeassistant/components/gpslogger/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Geofency Webhook" } } - }, - "title": "Konfiguracja Geofency Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pt-BR.json b/homeassistant/components/gpslogger/.translations/pt-BR.json index 8bae8adaeebc..6362914f52a1 100644 --- a/homeassistant/components/gpslogger/.translations/pt-BR.json +++ b/homeassistant/components/gpslogger/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/pt.json b/homeassistant/components/gpslogger/.translations/pt.json index 216ba66d20b7..de430273ba52 100644 --- a/homeassistant/components/gpslogger/.translations/pt.json +++ b/homeassistant/components/gpslogger/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Geofency Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/ru.json b/homeassistant/components/gpslogger/.translations/ru.json index abf5f100fd70..fabf24775901 100644 --- a/homeassistant/components/gpslogger/.translations/ru.json +++ b/homeassistant/components/gpslogger/.translations/ru.json @@ -13,6 +13,5 @@ "title": "GPSLogger" } } - }, - "title": "GPSLogger" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/sl.json b/homeassistant/components/gpslogger/.translations/sl.json index ad1a304dcfc0..1d33f4506990 100644 --- a/homeassistant/components/gpslogger/.translations/sl.json +++ b/homeassistant/components/gpslogger/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite GPSlogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/sv.json b/homeassistant/components/gpslogger/.translations/sv.json index 23b0e19c2aaf..db53fcff9732 100644 --- a/homeassistant/components/gpslogger/.translations/sv.json +++ b/homeassistant/components/gpslogger/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/zh-Hans.json b/homeassistant/components/gpslogger/.translations/zh-Hans.json index 147075c19f3b..f6934cb5e4f8 100644 --- a/homeassistant/components/gpslogger/.translations/zh-Hans.json +++ b/homeassistant/components/gpslogger/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/gpslogger/.translations/zh-Hant.json b/homeassistant/components/gpslogger/.translations/zh-Hant.json index 80955fa9e324..9e410084f818 100644 --- a/homeassistant/components/gpslogger/.translations/zh-Hant.json +++ b/homeassistant/components/gpslogger/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a GPSLogger Webhook" } } - }, - "title": "GPSLogger Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ca.json b/homeassistant/components/griddy/.translations/ca.json index 929fcf408874..cb363a7dfabe 100644 --- a/homeassistant/components/griddy/.translations/ca.json +++ b/homeassistant/components/griddy/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Configuraci\u00f3 de la zona de c\u00e0rrega (Load Zone) de Griddy" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/de.json b/homeassistant/components/griddy/.translations/de.json index 1f77f9e77435..ad6a6e10ab05 100644 --- a/homeassistant/components/griddy/.translations/de.json +++ b/homeassistant/components/griddy/.translations/de.json @@ -16,6 +16,5 @@ "title": "Richten Sie Ihre Griddy Ladezone ein" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/en.json b/homeassistant/components/griddy/.translations/en.json index c5df2742338d..bb1e217133a6 100644 --- a/homeassistant/components/griddy/.translations/en.json +++ b/homeassistant/components/griddy/.translations/en.json @@ -16,6 +16,5 @@ "title": "Setup your Griddy Load Zone" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/es.json b/homeassistant/components/griddy/.translations/es.json index ac6a232db3fe..a3727721b2d5 100644 --- a/homeassistant/components/griddy/.translations/es.json +++ b/homeassistant/components/griddy/.translations/es.json @@ -16,6 +16,5 @@ "title": "Configurar tu Zona de Carga de Griddy" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/fr.json b/homeassistant/components/griddy/.translations/fr.json index 5fa28a09e7c4..845c0968827c 100644 --- a/homeassistant/components/griddy/.translations/fr.json +++ b/homeassistant/components/griddy/.translations/fr.json @@ -14,6 +14,5 @@ } } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/it.json b/homeassistant/components/griddy/.translations/it.json index a43e5f7ced54..2b573170e690 100644 --- a/homeassistant/components/griddy/.translations/it.json +++ b/homeassistant/components/griddy/.translations/it.json @@ -16,6 +16,5 @@ "title": "Configurazione della Zona di Carico Griddy" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ko.json b/homeassistant/components/griddy/.translations/ko.json index 0f00578a96e3..9eda02551e40 100644 --- a/homeassistant/components/griddy/.translations/ko.json +++ b/homeassistant/components/griddy/.translations/ko.json @@ -16,6 +16,5 @@ "title": "Griddy \uc804\ub825 \uacf5\uae09 \uc9c0\uc5ed \uc124\uc815" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/lb.json b/homeassistant/components/griddy/.translations/lb.json index 67024c066351..2e2458cb8edb 100644 --- a/homeassistant/components/griddy/.translations/lb.json +++ b/homeassistant/components/griddy/.translations/lb.json @@ -16,6 +16,5 @@ "title": "Griddy Lued Zon ariichten" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/no.json b/homeassistant/components/griddy/.translations/no.json index af4ae8a29003..000b5dae3067 100644 --- a/homeassistant/components/griddy/.translations/no.json +++ b/homeassistant/components/griddy/.translations/no.json @@ -16,6 +16,5 @@ "title": "Sett opp din Griddy Load Zone" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/pl.json b/homeassistant/components/griddy/.translations/pl.json index 75f58fef9bb4..43a16be8d79f 100644 --- a/homeassistant/components/griddy/.translations/pl.json +++ b/homeassistant/components/griddy/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Konfigurowanie strefy obci\u0105\u017cenia Griddy" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/ru.json b/homeassistant/components/griddy/.translations/ru.json index 2337638a89af..9fe981075103 100644 --- a/homeassistant/components/griddy/.translations/ru.json +++ b/homeassistant/components/griddy/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Griddy" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/sl.json b/homeassistant/components/griddy/.translations/sl.json index 53b138535a13..8df85c6dc67a 100644 --- a/homeassistant/components/griddy/.translations/sl.json +++ b/homeassistant/components/griddy/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Nastavite svojo Griddy Load Cono" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/griddy/.translations/zh-Hant.json b/homeassistant/components/griddy/.translations/zh-Hant.json index 06f55e3dcfcc..e112a2c682f8 100644 --- a/homeassistant/components/griddy/.translations/zh-Hant.json +++ b/homeassistant/components/griddy/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u8a2d\u5b9a Griddy \u8ca0\u8f09\u5340\u57df" } } - }, - "title": "Griddy" + } } \ No newline at end of file diff --git a/homeassistant/components/group/.translations/af.json b/homeassistant/components/group/.translations/af.json new file mode 100644 index 000000000000..755da4e86fba --- /dev/null +++ b/homeassistant/components/group/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Groep" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ar.json b/homeassistant/components/group/.translations/ar.json new file mode 100644 index 000000000000..0274345b0dd3 --- /dev/null +++ b/homeassistant/components/group/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u062c\u0645\u0648\u0639\u0629" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/bg.json b/homeassistant/components/group/.translations/bg.json new file mode 100644 index 000000000000..dbe9eb159462 --- /dev/null +++ b/homeassistant/components/group/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0413\u0440\u0443\u043f\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/bs.json b/homeassistant/components/group/.translations/bs.json new file mode 100644 index 000000000000..ddedd5e0a192 --- /dev/null +++ b/homeassistant/components/group/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Grupa" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ca.json b/homeassistant/components/group/.translations/ca.json new file mode 100644 index 000000000000..4d3cabae91be --- /dev/null +++ b/homeassistant/components/group/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Grups" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/cs.json b/homeassistant/components/group/.translations/cs.json new file mode 100644 index 000000000000..dfb23d2c61eb --- /dev/null +++ b/homeassistant/components/group/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Skupina" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/cy.json b/homeassistant/components/group/.translations/cy.json new file mode 100644 index 000000000000..60260ba96199 --- /dev/null +++ b/homeassistant/components/group/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Gr\u0175p" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/da.json b/homeassistant/components/group/.translations/da.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/de.json b/homeassistant/components/group/.translations/de.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/el.json b/homeassistant/components/group/.translations/el.json new file mode 100644 index 000000000000..39521a87a0b4 --- /dev/null +++ b/homeassistant/components/group/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u039f\u03bc\u03ac\u03b4\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/en.json b/homeassistant/components/group/.translations/en.json new file mode 100644 index 000000000000..1a85d1ddb3ff --- /dev/null +++ b/homeassistant/components/group/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Group" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/es-419.json b/homeassistant/components/group/.translations/es-419.json new file mode 100644 index 000000000000..c3c49f56eeae --- /dev/null +++ b/homeassistant/components/group/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Grupo" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/es.json b/homeassistant/components/group/.translations/es.json new file mode 100644 index 000000000000..c3c49f56eeae --- /dev/null +++ b/homeassistant/components/group/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Grupo" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/et.json b/homeassistant/components/group/.translations/et.json new file mode 100644 index 000000000000..4ec00acf89db --- /dev/null +++ b/homeassistant/components/group/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Grupp" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/eu.json b/homeassistant/components/group/.translations/eu.json new file mode 100644 index 000000000000..6862a0856121 --- /dev/null +++ b/homeassistant/components/group/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Taldea" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/fa.json b/homeassistant/components/group/.translations/fa.json new file mode 100644 index 000000000000..77445f57da2a --- /dev/null +++ b/homeassistant/components/group/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u06af\u0631\u0648\u0647" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/fi.json b/homeassistant/components/group/.translations/fi.json new file mode 100644 index 000000000000..d92d58bb3022 --- /dev/null +++ b/homeassistant/components/group/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Ryhm\u00e4" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/fr.json b/homeassistant/components/group/.translations/fr.json new file mode 100644 index 000000000000..f18765d86ba5 --- /dev/null +++ b/homeassistant/components/group/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Groupe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/gsw.json b/homeassistant/components/group/.translations/gsw.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/he.json b/homeassistant/components/group/.translations/he.json new file mode 100644 index 000000000000..0a96e99d3032 --- /dev/null +++ b/homeassistant/components/group/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05b0\u05d1\u05d5\u05bc\u05e6\u05b8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/hi.json b/homeassistant/components/group/.translations/hi.json new file mode 100644 index 000000000000..debda9db8955 --- /dev/null +++ b/homeassistant/components/group/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u092e\u0942\u0939" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/hr.json b/homeassistant/components/group/.translations/hr.json new file mode 100644 index 000000000000..ddedd5e0a192 --- /dev/null +++ b/homeassistant/components/group/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Grupa" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/hu.json b/homeassistant/components/group/.translations/hu.json new file mode 100644 index 000000000000..0ae5c0d3f153 --- /dev/null +++ b/homeassistant/components/group/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Csoport" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/hy.json b/homeassistant/components/group/.translations/hy.json new file mode 100644 index 000000000000..c1398138df1c --- /dev/null +++ b/homeassistant/components/group/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053d\u0578\u0582\u0574\u0562" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/id.json b/homeassistant/components/group/.translations/id.json new file mode 100644 index 000000000000..c6d0480b1b52 --- /dev/null +++ b/homeassistant/components/group/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Grup" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/is.json b/homeassistant/components/group/.translations/is.json new file mode 100644 index 000000000000..89c542cacb07 --- /dev/null +++ b/homeassistant/components/group/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "H\u00f3pur" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/it.json b/homeassistant/components/group/.translations/it.json new file mode 100644 index 000000000000..16eb80c6bfb6 --- /dev/null +++ b/homeassistant/components/group/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppo" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ja.json b/homeassistant/components/group/.translations/ja.json new file mode 100644 index 000000000000..e5ad363cc482 --- /dev/null +++ b/homeassistant/components/group/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30b0\u30eb\u30fc\u30d7" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ko.json b/homeassistant/components/group/.translations/ko.json new file mode 100644 index 000000000000..cd50cc2a1581 --- /dev/null +++ b/homeassistant/components/group/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uadf8\ub8f9" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/lb.json b/homeassistant/components/group/.translations/lb.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/lv.json b/homeassistant/components/group/.translations/lv.json new file mode 100644 index 000000000000..ddedd5e0a192 --- /dev/null +++ b/homeassistant/components/group/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Grupa" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/nb.json b/homeassistant/components/group/.translations/nb.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/nl.json b/homeassistant/components/group/.translations/nl.json new file mode 100644 index 000000000000..755da4e86fba --- /dev/null +++ b/homeassistant/components/group/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Groep" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/nn.json b/homeassistant/components/group/.translations/nn.json new file mode 100644 index 000000000000..b41c930ac9fb --- /dev/null +++ b/homeassistant/components/group/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Gruppe" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/pl.json b/homeassistant/components/group/.translations/pl.json new file mode 100644 index 000000000000..ddedd5e0a192 --- /dev/null +++ b/homeassistant/components/group/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Grupa" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/pt-BR.json b/homeassistant/components/group/.translations/pt-BR.json new file mode 100644 index 000000000000..c3c49f56eeae --- /dev/null +++ b/homeassistant/components/group/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Grupo" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/pt.json b/homeassistant/components/group/.translations/pt.json new file mode 100644 index 000000000000..c3c49f56eeae --- /dev/null +++ b/homeassistant/components/group/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Grupo" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ro.json b/homeassistant/components/group/.translations/ro.json new file mode 100644 index 000000000000..c6d0480b1b52 --- /dev/null +++ b/homeassistant/components/group/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Grup" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/ru.json b/homeassistant/components/group/.translations/ru.json new file mode 100644 index 000000000000..4478fc5ae104 --- /dev/null +++ b/homeassistant/components/group/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0413\u0440\u0443\u043f\u043f\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/sk.json b/homeassistant/components/group/.translations/sk.json new file mode 100644 index 000000000000..dfb23d2c61eb --- /dev/null +++ b/homeassistant/components/group/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Skupina" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/sl.json b/homeassistant/components/group/.translations/sl.json new file mode 100644 index 000000000000..dfb23d2c61eb --- /dev/null +++ b/homeassistant/components/group/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Skupina" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/sv.json b/homeassistant/components/group/.translations/sv.json new file mode 100644 index 000000000000..4ec00acf89db --- /dev/null +++ b/homeassistant/components/group/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Grupp" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/te.json b/homeassistant/components/group/.translations/te.json new file mode 100644 index 000000000000..4803077aed8e --- /dev/null +++ b/homeassistant/components/group/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c17\u0c4d\u0c30\u0c42\u0c2a\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/th.json b/homeassistant/components/group/.translations/th.json new file mode 100644 index 000000000000..e8862d529cf0 --- /dev/null +++ b/homeassistant/components/group/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e25\u0e38\u0e48\u0e21" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/tr.json b/homeassistant/components/group/.translations/tr.json new file mode 100644 index 000000000000..c6d0480b1b52 --- /dev/null +++ b/homeassistant/components/group/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Grup" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/uk.json b/homeassistant/components/group/.translations/uk.json new file mode 100644 index 000000000000..dbe9eb159462 --- /dev/null +++ b/homeassistant/components/group/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0413\u0440\u0443\u043f\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/vi.json b/homeassistant/components/group/.translations/vi.json new file mode 100644 index 000000000000..83a77447dc04 --- /dev/null +++ b/homeassistant/components/group/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Nh\u00f3m" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/zh-Hans.json b/homeassistant/components/group/.translations/zh-Hans.json new file mode 100644 index 000000000000..7f17036379ac --- /dev/null +++ b/homeassistant/components/group/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u7fa4\u7ec4" +} \ No newline at end of file diff --git a/homeassistant/components/group/.translations/zh-Hant.json b/homeassistant/components/group/.translations/zh-Hant.json new file mode 100644 index 000000000000..068bb7336934 --- /dev/null +++ b/homeassistant/components/group/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u7fa4\u7d44" +} \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/bg.json b/homeassistant/components/hangouts/.translations/bg.json index c425e515f55c..09ffce392a6a 100644 --- a/homeassistant/components/hangouts/.translations/bg.json +++ b/homeassistant/components/hangouts/.translations/bg.json @@ -25,6 +25,5 @@ "title": "\u0412\u0445\u043e\u0434 \u0432 Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ca.json b/homeassistant/components/hangouts/.translations/ca.json index 291e78095dc9..a186723f345c 100644 --- a/homeassistant/components/hangouts/.translations/ca.json +++ b/homeassistant/components/hangouts/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Inici de sessi\u00f3 de Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/cs.json b/homeassistant/components/hangouts/.translations/cs.json index 40972b3b93f7..6b6d430307ec 100644 --- a/homeassistant/components/hangouts/.translations/cs.json +++ b/homeassistant/components/hangouts/.translations/cs.json @@ -24,6 +24,5 @@ "title": "P\u0159ihl\u00e1\u0161en\u00ed do slu\u017eby Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/da.json b/homeassistant/components/hangouts/.translations/da.json index 928e9899dbcf..e490c33805dd 100644 --- a/homeassistant/components/hangouts/.translations/da.json +++ b/homeassistant/components/hangouts/.translations/da.json @@ -25,6 +25,5 @@ "title": "Google Hangouts login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/de.json b/homeassistant/components/hangouts/.translations/de.json index 1688e3cb2622..5602713d2455 100644 --- a/homeassistant/components/hangouts/.translations/de.json +++ b/homeassistant/components/hangouts/.translations/de.json @@ -27,6 +27,5 @@ "title": "Google Hangouts Login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/en.json b/homeassistant/components/hangouts/.translations/en.json index 63d52f53b9c9..bd2170a0f92d 100644 --- a/homeassistant/components/hangouts/.translations/en.json +++ b/homeassistant/components/hangouts/.translations/en.json @@ -25,6 +25,5 @@ "title": "Google Hangouts Login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/es-419.json b/homeassistant/components/hangouts/.translations/es-419.json index 728a0d7ee62d..9ff97592d916 100644 --- a/homeassistant/components/hangouts/.translations/es-419.json +++ b/homeassistant/components/hangouts/.translations/es-419.json @@ -24,6 +24,5 @@ "title": "Inicio de sesi\u00f3n de Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/es.json b/homeassistant/components/hangouts/.translations/es.json index dff492981669..692df44c5bca 100644 --- a/homeassistant/components/hangouts/.translations/es.json +++ b/homeassistant/components/hangouts/.translations/es.json @@ -27,6 +27,5 @@ "title": "Iniciar sesi\u00f3n en Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/et.json b/homeassistant/components/hangouts/.translations/et.json index 87779947d9ea..b1c29f3577b2 100644 --- a/homeassistant/components/hangouts/.translations/et.json +++ b/homeassistant/components/hangouts/.translations/et.json @@ -17,6 +17,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/fr.json b/homeassistant/components/hangouts/.translations/fr.json index 11bf61616469..2e8bec54c34a 100644 --- a/homeassistant/components/hangouts/.translations/fr.json +++ b/homeassistant/components/hangouts/.translations/fr.json @@ -27,6 +27,5 @@ "title": "Connexion \u00e0 Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/he.json b/homeassistant/components/hangouts/.translations/he.json index 485c453777a4..c3863a860f44 100644 --- a/homeassistant/components/hangouts/.translations/he.json +++ b/homeassistant/components/hangouts/.translations/he.json @@ -24,6 +24,5 @@ "title": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc- Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/hu.json b/homeassistant/components/hangouts/.translations/hu.json index 55a48f1df1a0..ea7fd49a5482 100644 --- a/homeassistant/components/hangouts/.translations/hu.json +++ b/homeassistant/components/hangouts/.translations/hu.json @@ -26,6 +26,5 @@ "title": "Google Hangouts Bejelentkez\u00e9s" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/id.json b/homeassistant/components/hangouts/.translations/id.json index 4f35153669e5..1bcfeaeba50d 100644 --- a/homeassistant/components/hangouts/.translations/id.json +++ b/homeassistant/components/hangouts/.translations/id.json @@ -26,6 +26,5 @@ "title": "Google Hangouts Login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/it.json b/homeassistant/components/hangouts/.translations/it.json index 03bcb57aae5a..094280da4eff 100644 --- a/homeassistant/components/hangouts/.translations/it.json +++ b/homeassistant/components/hangouts/.translations/it.json @@ -27,6 +27,5 @@ "title": "Accesso a Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ko.json b/homeassistant/components/hangouts/.translations/ko.json index 73fb9b3722aa..4a5af0779a2b 100644 --- a/homeassistant/components/hangouts/.translations/ko.json +++ b/homeassistant/components/hangouts/.translations/ko.json @@ -27,6 +27,5 @@ "title": "Google \ud589\uc544\uc6c3 \ub85c\uadf8\uc778" } } - }, - "title": "Google \ud589\uc544\uc6c3" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/lb.json b/homeassistant/components/hangouts/.translations/lb.json index 6a28fe831c18..fa146adde234 100644 --- a/homeassistant/components/hangouts/.translations/lb.json +++ b/homeassistant/components/hangouts/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Google Hangouts Login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/nl.json b/homeassistant/components/hangouts/.translations/nl.json index 5133b66cd1ad..fac77660251a 100644 --- a/homeassistant/components/hangouts/.translations/nl.json +++ b/homeassistant/components/hangouts/.translations/nl.json @@ -27,6 +27,5 @@ "title": "Google Hangouts inlog" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/nn.json b/homeassistant/components/hangouts/.translations/nn.json index 2103b6c38a09..883a53441af0 100644 --- a/homeassistant/components/hangouts/.translations/nn.json +++ b/homeassistant/components/hangouts/.translations/nn.json @@ -24,6 +24,5 @@ "title": "Google Hangouts Login" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/no.json b/homeassistant/components/hangouts/.translations/no.json index f0350e810168..9402687b8ff1 100644 --- a/homeassistant/components/hangouts/.translations/no.json +++ b/homeassistant/components/hangouts/.translations/no.json @@ -27,6 +27,5 @@ "title": "Google Hangouts p\u00e5logging" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pl.json b/homeassistant/components/hangouts/.translations/pl.json index 0c685c3020e7..20b17ec37b71 100644 --- a/homeassistant/components/hangouts/.translations/pl.json +++ b/homeassistant/components/hangouts/.translations/pl.json @@ -27,6 +27,5 @@ "title": "Logowanie do Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pt-BR.json b/homeassistant/components/hangouts/.translations/pt-BR.json index bc4e518b1f38..3f8fd23b07c9 100644 --- a/homeassistant/components/hangouts/.translations/pt-BR.json +++ b/homeassistant/components/hangouts/.translations/pt-BR.json @@ -27,6 +27,5 @@ "title": "Login do Hangouts do Google" } } - }, - "title": "Hangouts do Google" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/pt.json b/homeassistant/components/hangouts/.translations/pt.json index 442c5736c16a..d85caeb2bbb6 100644 --- a/homeassistant/components/hangouts/.translations/pt.json +++ b/homeassistant/components/hangouts/.translations/pt.json @@ -26,6 +26,5 @@ "title": "Login Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ro.json b/homeassistant/components/hangouts/.translations/ro.json index 715937b678e3..682d561929cb 100644 --- a/homeassistant/components/hangouts/.translations/ro.json +++ b/homeassistant/components/hangouts/.translations/ro.json @@ -23,6 +23,5 @@ "title": "Conectare Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/ru.json b/homeassistant/components/hangouts/.translations/ru.json index c247654c7eec..580c858d15f1 100644 --- a/homeassistant/components/hangouts/.translations/ru.json +++ b/homeassistant/components/hangouts/.translations/ru.json @@ -27,6 +27,5 @@ "title": "Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/sl.json b/homeassistant/components/hangouts/.translations/sl.json index 7161f3b5d445..853dfa1487a4 100644 --- a/homeassistant/components/hangouts/.translations/sl.json +++ b/homeassistant/components/hangouts/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Prijava za Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/sv.json b/homeassistant/components/hangouts/.translations/sv.json index be4faf69a43a..f9e5ec14c54b 100644 --- a/homeassistant/components/hangouts/.translations/sv.json +++ b/homeassistant/components/hangouts/.translations/sv.json @@ -27,6 +27,5 @@ "title": "Google Hangouts-inloggning" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/zh-Hans.json b/homeassistant/components/hangouts/.translations/zh-Hans.json index ffb8ae30d3d3..46d1de99c734 100644 --- a/homeassistant/components/hangouts/.translations/zh-Hans.json +++ b/homeassistant/components/hangouts/.translations/zh-Hans.json @@ -26,6 +26,5 @@ "title": "\u767b\u5f55 Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/hangouts/.translations/zh-Hant.json b/homeassistant/components/hangouts/.translations/zh-Hant.json index 1cac51a8393d..1619eaddb638 100644 --- a/homeassistant/components/hangouts/.translations/zh-Hant.json +++ b/homeassistant/components/hangouts/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u767b\u5165 Google Hangouts" } } - }, - "title": "Google Hangouts" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ca.json b/homeassistant/components/harmony/.translations/ca.json index 3a00a7b36adb..a7c520c400c4 100644 --- a/homeassistant/components/harmony/.translations/ca.json +++ b/homeassistant/components/harmony/.translations/ca.json @@ -32,6 +32,5 @@ "description": "Ajusta les opcions de Harmony Hub" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/de.json b/homeassistant/components/harmony/.translations/de.json index a879b74fd801..ae640f128703 100644 --- a/homeassistant/components/harmony/.translations/de.json +++ b/homeassistant/components/harmony/.translations/de.json @@ -32,6 +32,5 @@ "description": "Passen Sie die Harmony Hub-Optionen an" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/en.json b/homeassistant/components/harmony/.translations/en.json index b35ebcd587b0..17964db6824f 100644 --- a/homeassistant/components/harmony/.translations/en.json +++ b/homeassistant/components/harmony/.translations/en.json @@ -32,6 +32,5 @@ "description": "Adjust Harmony Hub Options" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/es.json b/homeassistant/components/harmony/.translations/es.json index 7d0691169c54..a5d96ec7ef34 100644 --- a/homeassistant/components/harmony/.translations/es.json +++ b/homeassistant/components/harmony/.translations/es.json @@ -32,6 +32,5 @@ "description": "Ajustar las opciones de Harmony Hub" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/fr.json b/homeassistant/components/harmony/.translations/fr.json index 3021d70024a8..4343ec3139dd 100644 --- a/homeassistant/components/harmony/.translations/fr.json +++ b/homeassistant/components/harmony/.translations/fr.json @@ -32,6 +32,5 @@ "description": "Ajuster les options du hub Harmony" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/it.json b/homeassistant/components/harmony/.translations/it.json index ff079e03122a..8095fa051561 100644 --- a/homeassistant/components/harmony/.translations/it.json +++ b/homeassistant/components/harmony/.translations/it.json @@ -32,6 +32,5 @@ "description": "Regolare le opzioni di Harmony Hub" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ko.json b/homeassistant/components/harmony/.translations/ko.json index ac628f7b012f..3272c8941c7e 100644 --- a/homeassistant/components/harmony/.translations/ko.json +++ b/homeassistant/components/harmony/.translations/ko.json @@ -32,6 +32,5 @@ "description": "Harmony Hub \uc635\uc158 \uc870\uc815" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/lb.json b/homeassistant/components/harmony/.translations/lb.json index 25ce58b97f56..abcc0948835c 100644 --- a/homeassistant/components/harmony/.translations/lb.json +++ b/homeassistant/components/harmony/.translations/lb.json @@ -32,6 +32,5 @@ "description": "Harmony Hub Optioune ajust\u00e9ieren" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/no.json b/homeassistant/components/harmony/.translations/no.json index 7db4f98d7b33..9cae06632084 100644 --- a/homeassistant/components/harmony/.translations/no.json +++ b/homeassistant/components/harmony/.translations/no.json @@ -32,6 +32,5 @@ "description": "Juster alternativene for harmonihub" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/pl.json b/homeassistant/components/harmony/.translations/pl.json index 7d7d3688e6fd..533c14097a54 100644 --- a/homeassistant/components/harmony/.translations/pl.json +++ b/homeassistant/components/harmony/.translations/pl.json @@ -32,6 +32,5 @@ "description": "Dostosuj opcje huba Harmony" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/ru.json b/homeassistant/components/harmony/.translations/ru.json index a7009c5ebc62..85b61f923e1d 100644 --- a/homeassistant/components/harmony/.translations/ru.json +++ b/homeassistant/components/harmony/.translations/ru.json @@ -32,6 +32,5 @@ "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Harmony Hub" } } - }, - "title": "Logitech Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/sl.json b/homeassistant/components/harmony/.translations/sl.json new file mode 100644 index 000000000000..9c99ba98bb25 --- /dev/null +++ b/homeassistant/components/harmony/.translations/sl.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Naprava je \u017ee konfigurirana" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "unknown": "Nepri\u010dakovana napaka" + }, + "flow_title": "Logitech Harmony Hub {name}", + "step": { + "link": { + "description": "Ali \u017eelite nastaviti {name} ({host})?", + "title": "Nastavite Logitech Harmony Hub" + }, + "user": { + "data": { + "host": "Ime gostitelja ali naslov IP", + "name": "Ime vozli\u0161\u010da" + }, + "title": "Nastavite Logitech Harmony Hub" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "activity": "Privzeta dejavnost za izvr\u0161itev, ko ni dolo\u010dena nobena.", + "delay_secs": "Zakasnitev med po\u0161iljanjem ukazov." + }, + "description": "Prilagodite mo\u017enosti vozli\u0161\u010da Harmony" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/harmony/.translations/zh-Hant.json b/homeassistant/components/harmony/.translations/zh-Hant.json index 826e7288badc..5b4171de5cca 100644 --- a/homeassistant/components/harmony/.translations/zh-Hant.json +++ b/homeassistant/components/harmony/.translations/zh-Hant.json @@ -32,6 +32,5 @@ "description": "\u8abf\u6574 Harmony Hub \u9078\u9805" } } - }, - "title": "\u7f85\u6280 Harmony Hub" + } } \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/af.json b/homeassistant/components/hassio/.translations/af.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/bg.json b/homeassistant/components/hassio/.translations/bg.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/ca.json b/homeassistant/components/hassio/.translations/ca.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/cs.json b/homeassistant/components/hassio/.translations/cs.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/cy.json b/homeassistant/components/hassio/.translations/cy.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/da.json b/homeassistant/components/hassio/.translations/da.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/de.json b/homeassistant/components/hassio/.translations/de.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/el.json b/homeassistant/components/hassio/.translations/el.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/en.json b/homeassistant/components/hassio/.translations/en.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/es-419.json b/homeassistant/components/hassio/.translations/es-419.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/es.json b/homeassistant/components/hassio/.translations/es.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/et.json b/homeassistant/components/hassio/.translations/et.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/eu.json b/homeassistant/components/hassio/.translations/eu.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/fa.json b/homeassistant/components/hassio/.translations/fa.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/fi.json b/homeassistant/components/hassio/.translations/fi.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/fr.json b/homeassistant/components/hassio/.translations/fr.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/he.json b/homeassistant/components/hassio/.translations/he.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/hr.json b/homeassistant/components/hassio/.translations/hr.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/hu.json b/homeassistant/components/hassio/.translations/hu.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/hy.json b/homeassistant/components/hassio/.translations/hy.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/is.json b/homeassistant/components/hassio/.translations/is.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/it.json b/homeassistant/components/hassio/.translations/it.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/ja.json b/homeassistant/components/hassio/.translations/ja.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/ko.json b/homeassistant/components/hassio/.translations/ko.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/lb.json b/homeassistant/components/hassio/.translations/lb.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/lt.json b/homeassistant/components/hassio/.translations/lt.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/lt.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/lv.json b/homeassistant/components/hassio/.translations/lv.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/nb.json b/homeassistant/components/hassio/.translations/nb.json new file mode 100644 index 000000000000..d8a4c4530151 --- /dev/null +++ b/homeassistant/components/hassio/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/nl.json b/homeassistant/components/hassio/.translations/nl.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/nn.json b/homeassistant/components/hassio/.translations/nn.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/pl.json b/homeassistant/components/hassio/.translations/pl.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/pt-BR.json b/homeassistant/components/hassio/.translations/pt-BR.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/pt.json b/homeassistant/components/hassio/.translations/pt.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/ro.json b/homeassistant/components/hassio/.translations/ro.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/ru.json b/homeassistant/components/hassio/.translations/ru.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/sk.json b/homeassistant/components/hassio/.translations/sk.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/sl.json b/homeassistant/components/hassio/.translations/sl.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/sv.json b/homeassistant/components/hassio/.translations/sv.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/th.json b/homeassistant/components/hassio/.translations/th.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/tr.json b/homeassistant/components/hassio/.translations/tr.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/uk.json b/homeassistant/components/hassio/.translations/uk.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/vi.json b/homeassistant/components/hassio/.translations/vi.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/zh-Hans.json b/homeassistant/components/hassio/.translations/zh-Hans.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/hassio/.translations/zh-Hant.json b/homeassistant/components/hassio/.translations/zh-Hant.json new file mode 100644 index 000000000000..981cb51c83ab --- /dev/null +++ b/homeassistant/components/hassio/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "Hass.io" +} \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/bg.json b/homeassistant/components/heos/.translations/bg.json index 48efffbb7ee9..4f52830af097 100644 --- a/homeassistant/components/heos/.translations/bg.json +++ b/homeassistant/components/heos/.translations/bg.json @@ -16,6 +16,5 @@ "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ca.json b/homeassistant/components/heos/.translations/ca.json index eb90c5ea04c9..02e8e22d9209 100644 --- a/homeassistant/components/heos/.translations/ca.json +++ b/homeassistant/components/heos/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Connexi\u00f3 amb Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/da.json b/homeassistant/components/heos/.translations/da.json index 5d742100cfc8..b395497d67a5 100644 --- a/homeassistant/components/heos/.translations/da.json +++ b/homeassistant/components/heos/.translations/da.json @@ -16,6 +16,5 @@ "title": "Opret forbindelse til HEOS" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/de.json b/homeassistant/components/heos/.translations/de.json index 5358c3565238..bbd0d8beec71 100644 --- a/homeassistant/components/heos/.translations/de.json +++ b/homeassistant/components/heos/.translations/de.json @@ -16,6 +16,5 @@ "title": "Mit Heos verbinden" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/en.json b/homeassistant/components/heos/.translations/en.json index c5b98770d620..3227e5115f96 100644 --- a/homeassistant/components/heos/.translations/en.json +++ b/homeassistant/components/heos/.translations/en.json @@ -16,6 +16,5 @@ "title": "Connect to Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/es-419.json b/homeassistant/components/heos/.translations/es-419.json index 1c48ceea5ff3..01338dc5af3f 100644 --- a/homeassistant/components/heos/.translations/es-419.json +++ b/homeassistant/components/heos/.translations/es-419.json @@ -12,6 +12,5 @@ "title": "Con\u00e9ctate a Heos" } } - }, - "title": "Heos" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/es.json b/homeassistant/components/heos/.translations/es.json index 6523d44639fd..b79871d487c7 100644 --- a/homeassistant/components/heos/.translations/es.json +++ b/homeassistant/components/heos/.translations/es.json @@ -16,6 +16,5 @@ "title": "Conectar a Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/fr.json b/homeassistant/components/heos/.translations/fr.json index 29afed9c438c..7f76c932c710 100644 --- a/homeassistant/components/heos/.translations/fr.json +++ b/homeassistant/components/heos/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Se connecter \u00e0 Heos" } } - }, - "title": "Heos" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/hu.json b/homeassistant/components/heos/.translations/hu.json index 645c09105b8e..8cd10b3c2466 100644 --- a/homeassistant/components/heos/.translations/hu.json +++ b/homeassistant/components/heos/.translations/hu.json @@ -8,6 +8,5 @@ } } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/it.json b/homeassistant/components/heos/.translations/it.json index 7f6b8b976662..2e6cfab035b4 100644 --- a/homeassistant/components/heos/.translations/it.json +++ b/homeassistant/components/heos/.translations/it.json @@ -16,6 +16,5 @@ "title": "Connetti a Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ko.json b/homeassistant/components/heos/.translations/ko.json index c8c356e4a910..1e7902adfb33 100644 --- a/homeassistant/components/heos/.translations/ko.json +++ b/homeassistant/components/heos/.translations/ko.json @@ -16,6 +16,5 @@ "title": "Heos \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/lb.json b/homeassistant/components/heos/.translations/lb.json index 7b1040ba5d88..de124207d64e 100644 --- a/homeassistant/components/heos/.translations/lb.json +++ b/homeassistant/components/heos/.translations/lb.json @@ -16,6 +16,5 @@ "title": "Mat Heos verbannen" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/nl.json b/homeassistant/components/heos/.translations/nl.json index c7a55288057a..f3e9dfed7e32 100644 --- a/homeassistant/components/heos/.translations/nl.json +++ b/homeassistant/components/heos/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Verbinding maken met Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/nn.json b/homeassistant/components/heos/.translations/nn.json index 24ea5ce4f588..8703148b3f85 100644 --- a/homeassistant/components/heos/.translations/nn.json +++ b/homeassistant/components/heos/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Heos" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/no.json b/homeassistant/components/heos/.translations/no.json index 0c070f322a3d..25588d79e01d 100644 --- a/homeassistant/components/heos/.translations/no.json +++ b/homeassistant/components/heos/.translations/no.json @@ -16,6 +16,5 @@ "title": "Koble til Heos" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pl.json b/homeassistant/components/heos/.translations/pl.json index 4a51f5537264..fbba14d88d63 100644 --- a/homeassistant/components/heos/.translations/pl.json +++ b/homeassistant/components/heos/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Po\u0142\u0105czenie z Heos" } } - }, - "title": "Heos" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pt-BR.json b/homeassistant/components/heos/.translations/pt-BR.json index 1140ad1ed8f0..abacf5c8ca1d 100644 --- a/homeassistant/components/heos/.translations/pt-BR.json +++ b/homeassistant/components/heos/.translations/pt-BR.json @@ -16,6 +16,5 @@ "title": "Conecte-se a Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/pt.json b/homeassistant/components/heos/.translations/pt.json index 19dde27a164d..d0c219cefa9f 100644 --- a/homeassistant/components/heos/.translations/pt.json +++ b/homeassistant/components/heos/.translations/pt.json @@ -8,6 +8,5 @@ } } } - }, - "title": "Heos" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/ru.json b/homeassistant/components/heos/.translations/ru.json index c5f01b155474..9983242b3496 100644 --- a/homeassistant/components/heos/.translations/ru.json +++ b/homeassistant/components/heos/.translations/ru.json @@ -16,6 +16,5 @@ "title": "HEOS" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/sl.json b/homeassistant/components/heos/.translations/sl.json index 574c9f767e8d..76fe3aadc5d5 100644 --- a/homeassistant/components/heos/.translations/sl.json +++ b/homeassistant/components/heos/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Pove\u017eite se z Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/sv.json b/homeassistant/components/heos/.translations/sv.json index c0cae40420e7..8215388a1610 100644 --- a/homeassistant/components/heos/.translations/sv.json +++ b/homeassistant/components/heos/.translations/sv.json @@ -16,6 +16,5 @@ "title": "Anslut till Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/heos/.translations/zh-Hant.json b/homeassistant/components/heos/.translations/zh-Hant.json index 4eec6bc14818..01ca002dd54e 100644 --- a/homeassistant/components/heos/.translations/zh-Hant.json +++ b/homeassistant/components/heos/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u9023\u7dda\u81f3 Heos" } } - }, - "title": "HEOS" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/bg.json b/homeassistant/components/hisense_aehw4a1/.translations/bg.json index c3c273c777d8..607347ff9e91 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/bg.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/bg.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ca.json b/homeassistant/components/hisense_aehw4a1/.translations/ca.json index c452b53bef9f..a0aef80e0315 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ca.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ca.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/da.json b/homeassistant/components/hisense_aehw4a1/.translations/da.json index 94aebf87021d..d75ffed4c568 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/da.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/da.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/de.json b/homeassistant/components/hisense_aehw4a1/.translations/de.json index 70d07ba36fcd..e42d91082e81 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/de.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/de.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/en.json b/homeassistant/components/hisense_aehw4a1/.translations/en.json index 71b5505ebd2a..ca0738ec9a85 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/en.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/en.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/es.json b/homeassistant/components/hisense_aehw4a1/.translations/es.json index ed7dca2f487e..c9c4270360ae 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/es.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/es.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/fr.json b/homeassistant/components/hisense_aehw4a1/.translations/fr.json index 1683d00b4309..dafe3836a504 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/fr.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/fr.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/hu.json b/homeassistant/components/hisense_aehw4a1/.translations/hu.json index 963c23e40626..389653422fd4 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/hu.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/it.json b/homeassistant/components/hisense_aehw4a1/.translations/it.json index 2470fc975dac..3d878ed40bee 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/it.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/it.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ko.json b/homeassistant/components/hisense_aehw4a1/.translations/ko.json index c734a9ccfe0e..18199edf856b 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ko.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ko.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/lb.json b/homeassistant/components/hisense_aehw4a1/.translations/lb.json index 49f910154c41..cdfbb069c0fb 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/lb.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/lb.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/nl.json b/homeassistant/components/hisense_aehw4a1/.translations/nl.json index 7e320fbe9f8f..9fef289f5451 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/nl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/nl.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/no.json b/homeassistant/components/hisense_aehw4a1/.translations/no.json index d672f73d77a7..65c9968dc1eb 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/no.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/no.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/pl.json b/homeassistant/components/hisense_aehw4a1/.translations/pl.json index 45dfbbf8bfd1..77e5c6298eba 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/pl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/pl.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/ru.json b/homeassistant/components/hisense_aehw4a1/.translations/ru.json index 6fb23ac800c1..bb406e90f927 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/ru.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/ru.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/sl.json b/homeassistant/components/hisense_aehw4a1/.translations/sl.json index 4254aa260be1..d24c83986527 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/sl.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/sl.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/sv.json b/homeassistant/components/hisense_aehw4a1/.translations/sv.json index c650796f23ff..01d484075e0f 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/sv.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/sv.json @@ -10,6 +10,5 @@ "title": "Hisense AEH-W4A1" } } - }, - "title": "Hisense AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json b/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json index 912d3e4b7b4b..44feda4fffc3 100644 --- a/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json +++ b/homeassistant/components/hisense_aehw4a1/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "\u6d77\u4fe1 AEH-W4A1" } } - }, - "title": "\u6d77\u4fe1 AEH-W4A1" + } } \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/af.json b/homeassistant/components/homeassistant/.translations/af.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/bg.json b/homeassistant/components/homeassistant/.translations/bg.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/ca.json b/homeassistant/components/homeassistant/.translations/ca.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/cs.json b/homeassistant/components/homeassistant/.translations/cs.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/cy.json b/homeassistant/components/homeassistant/.translations/cy.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/da.json b/homeassistant/components/homeassistant/.translations/da.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/de.json b/homeassistant/components/homeassistant/.translations/de.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/el.json b/homeassistant/components/homeassistant/.translations/el.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/en.json b/homeassistant/components/homeassistant/.translations/en.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/es-419.json b/homeassistant/components/homeassistant/.translations/es-419.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/es.json b/homeassistant/components/homeassistant/.translations/es.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/et.json b/homeassistant/components/homeassistant/.translations/et.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/eu.json b/homeassistant/components/homeassistant/.translations/eu.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/fa.json b/homeassistant/components/homeassistant/.translations/fa.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/fi.json b/homeassistant/components/homeassistant/.translations/fi.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/fr.json b/homeassistant/components/homeassistant/.translations/fr.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/he.json b/homeassistant/components/homeassistant/.translations/he.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/hr.json b/homeassistant/components/homeassistant/.translations/hr.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/hu.json b/homeassistant/components/homeassistant/.translations/hu.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/hy.json b/homeassistant/components/homeassistant/.translations/hy.json new file mode 100644 index 000000000000..d4578360f53c --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054f\u0576\u0561\u0575\u056b\u0576 \u0585\u0563\u0576\u0561\u056f\u0561\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/is.json b/homeassistant/components/homeassistant/.translations/is.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/it.json b/homeassistant/components/homeassistant/.translations/it.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/ko.json b/homeassistant/components/homeassistant/.translations/ko.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/lb.json b/homeassistant/components/homeassistant/.translations/lb.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/lt.json b/homeassistant/components/homeassistant/.translations/lt.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/lt.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/lv.json b/homeassistant/components/homeassistant/.translations/lv.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/nb.json b/homeassistant/components/homeassistant/.translations/nb.json new file mode 100644 index 000000000000..d8a4c4530151 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/nl.json b/homeassistant/components/homeassistant/.translations/nl.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/nn.json b/homeassistant/components/homeassistant/.translations/nn.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/pl.json b/homeassistant/components/homeassistant/.translations/pl.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/pt-BR.json b/homeassistant/components/homeassistant/.translations/pt-BR.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/pt.json b/homeassistant/components/homeassistant/.translations/pt.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/ro.json b/homeassistant/components/homeassistant/.translations/ro.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/ru.json b/homeassistant/components/homeassistant/.translations/ru.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/sk.json b/homeassistant/components/homeassistant/.translations/sk.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/sl.json b/homeassistant/components/homeassistant/.translations/sl.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/sv.json b/homeassistant/components/homeassistant/.translations/sv.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/th.json b/homeassistant/components/homeassistant/.translations/th.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/tr.json b/homeassistant/components/homeassistant/.translations/tr.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/uk.json b/homeassistant/components/homeassistant/.translations/uk.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/vi.json b/homeassistant/components/homeassistant/.translations/vi.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/zh-Hans.json b/homeassistant/components/homeassistant/.translations/zh-Hans.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homeassistant/.translations/zh-Hant.json b/homeassistant/components/homeassistant/.translations/zh-Hant.json new file mode 100644 index 000000000000..04b5b760f604 --- /dev/null +++ b/homeassistant/components/homeassistant/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "Home Assistant" +} \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/.translations/pt.json b/homeassistant/components/homekit_controller/.translations/pt.json index c60ed155569f..f4ffbf157bd3 100644 --- a/homeassistant/components/homekit_controller/.translations/pt.json +++ b/homeassistant/components/homekit_controller/.translations/pt.json @@ -1,17 +1,40 @@ { "config": { + "abort": { + "accessory_not_found_error": "N\u00e3o \u00e9 poss\u00edvel adicionar o emparelhamento. O dispositivo n\u00e3o foi encontrado.", + "already_configured": "O acess\u00f3rio j\u00e1 est\u00e1 configurado com este controlador.", + "already_in_progress": "O fluxo de configura\u00e7\u00e3o do dispositivo j\u00e1 est\u00e1 em andamento.", + "already_paired": "Este acess\u00f3rio j\u00e1 est\u00e1 emparelhado com outro dispositivo. Por favor restaure as defini\u00e7\u00f5es de f\u00e1brica do acess\u00f3rio e tente novamente.", + "ignored_model": "O suporte do HomeKit para este modelo est\u00e1 bloqueado, uma vez que est\u00e1 dispon\u00edvel uma integra\u00e7\u00e3o nativa mais completa.", + "invalid_config_entry": "Este dispositivo est\u00e1 pronto a emparelhar, mas j\u00e1 existe uma configura\u00e7\u00e3o no Home Assistant que precisa ser removida primeiro.", + "no_devices": "N\u00e3o foram encontrados dispositivos por emparelhar" + }, + "error": { + "authentication_error": "C\u00f3digo incorreto do HomeKit. Por favor, verifique e tente novamente.", + "busy_error": "O dispositivo recusou-se a adicionar emparelhamento, pois j\u00e1 est\u00e1 emparelhado com outro controlador.", + "max_peers_error": "O dispositivo recusou-se a adicionar o emparelhamento, pois n\u00e3o possui espa\u00e7o livre para o emparelhamento.", + "max_tries_error": "O dispositivo recusou-se a emparelhar por ter recebido mais de 100 tentativas de autentica\u00e7\u00e3o mal sucedidas.", + "pairing_failed": "Ocorreu um erro n\u00e3o tratado ao tentar emparelhar com este dispositivo. Poder\u00e1 ser uma falha tempor\u00e1ria ou o dispositivo pode n\u00e3o ser suportado agora.", + "unable_to_pair": "N\u00e3o foi poss\u00edvel emparelhar, por favor, tente novamente.", + "unknown_error": "O dispositivo reportou um erro desconhecido. O emparelhamento falhou." + }, + "flow_title": "Acess\u00f3rio HomeKit: {name}", "step": { "pair": { "data": { "pairing_code": "C\u00f3digo de emparelhamento" }, + "description": "Introduza o c\u00f3digo de emparelhamento do seu HomeKit (no formato XXX-XX-XXX) para utilizar este acess\u00f3rio", "title": "Emparelhar com o acess\u00f3rio HomeKit" }, "user": { "data": { "device": "Dispositivo" - } + }, + "description": "Selecione o dispositivo com o qual deseja emparelhar", + "title": "Emparelhar com o acess\u00f3rio HomeKit" } } - } + }, + "title": "Acess\u00f3rio HomeKit" } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/bg.json b/homeassistant/components/homematicip_cloud/.translations/bg.json index eeeee01bcff0..dd04e1e82505 100644 --- a/homeassistant/components/homematicip_cloud/.translations/bg.json +++ b/homeassistant/components/homematicip_cloud/.translations/bg.json @@ -25,6 +25,5 @@ "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f" } } - }, - "title": "HomematicIP \u041e\u0431\u043b\u0430\u043a" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ca.json b/homeassistant/components/homematicip_cloud/.translations/ca.json index 02df0946bef7..4cb5e8d092db 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ca.json +++ b/homeassistant/components/homematicip_cloud/.translations/ca.json @@ -25,6 +25,5 @@ "title": "Enlla\u00e7 amb punt d'acc\u00e9s" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/cs.json b/homeassistant/components/homematicip_cloud/.translations/cs.json index 3b4f99c6a9f4..efb73dd6e7fc 100644 --- a/homeassistant/components/homematicip_cloud/.translations/cs.json +++ b/homeassistant/components/homematicip_cloud/.translations/cs.json @@ -25,6 +25,5 @@ "title": "P\u0159ipojit se k p\u0159\u00edstupov\u00e9mu bodu" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/da.json b/homeassistant/components/homematicip_cloud/.translations/da.json index 8056e4ad5c3d..a520aef37d76 100644 --- a/homeassistant/components/homematicip_cloud/.translations/da.json +++ b/homeassistant/components/homematicip_cloud/.translations/da.json @@ -25,6 +25,5 @@ "title": "Link adgangspunkt" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/de.json b/homeassistant/components/homematicip_cloud/.translations/de.json index 894bdb6dab21..f3ec84fe3aff 100644 --- a/homeassistant/components/homematicip_cloud/.translations/de.json +++ b/homeassistant/components/homematicip_cloud/.translations/de.json @@ -25,6 +25,5 @@ "title": "Verkn\u00fcpfe den Accesspoint" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/en.json b/homeassistant/components/homematicip_cloud/.translations/en.json index 2b7d7c172690..26ca6eb60d6e 100644 --- a/homeassistant/components/homematicip_cloud/.translations/en.json +++ b/homeassistant/components/homematicip_cloud/.translations/en.json @@ -25,6 +25,5 @@ "title": "Link Access point" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/es-419.json b/homeassistant/components/homematicip_cloud/.translations/es-419.json index d9d9a90386ea..a853d7677c8e 100644 --- a/homeassistant/components/homematicip_cloud/.translations/es-419.json +++ b/homeassistant/components/homematicip_cloud/.translations/es-419.json @@ -23,6 +23,5 @@ "description": "Presione el bot\u00f3n azul en el punto de acceso y el bot\u00f3n enviar para registrar HomematicIP con Home Assistant. \n\n ! [Ubicaci\u00f3n del bot\u00f3n en el puente] (/static/images/config_flows/config_homematicip_cloud.png)" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/es.json b/homeassistant/components/homematicip_cloud/.translations/es.json index f7d36fc4aa9f..a017a5a1df7b 100644 --- a/homeassistant/components/homematicip_cloud/.translations/es.json +++ b/homeassistant/components/homematicip_cloud/.translations/es.json @@ -25,6 +25,5 @@ "title": "Enlazar punto de acceso" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/et.json b/homeassistant/components/homematicip_cloud/.translations/et.json index fd3e8189af17..08bd179b4f9f 100644 --- a/homeassistant/components/homematicip_cloud/.translations/et.json +++ b/homeassistant/components/homematicip_cloud/.translations/et.json @@ -11,6 +11,5 @@ } } } - }, - "title": "HomematicIP Pilv" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/fr.json b/homeassistant/components/homematicip_cloud/.translations/fr.json index 07aee5dd6254..212a6d277964 100644 --- a/homeassistant/components/homematicip_cloud/.translations/fr.json +++ b/homeassistant/components/homematicip_cloud/.translations/fr.json @@ -25,6 +25,5 @@ "title": "Lier le point d'acc\u00e8s" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/he.json b/homeassistant/components/homematicip_cloud/.translations/he.json index d404c85a90d4..9e650e132fe1 100644 --- a/homeassistant/components/homematicip_cloud/.translations/he.json +++ b/homeassistant/components/homematicip_cloud/.translations/he.json @@ -25,6 +25,5 @@ "title": "\u05d7\u05d1\u05e8 \u05e0\u05e7\u05d5\u05d3\u05ea \u05d2\u05d9\u05e9\u05d4" } } - }, - "title": "\u05e2\u05e0\u05df HomematicIP" + } } \ 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 3817766103c6..a410d9e28b68 100644 --- a/homeassistant/components/homematicip_cloud/.translations/hu.json +++ b/homeassistant/components/homematicip_cloud/.translations/hu.json @@ -24,6 +24,5 @@ "title": "Link Hozz\u00e1f\u00e9r\u00e9si pont" } } - }, - "title": "HomematicIP Felh\u0151" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/id.json b/homeassistant/components/homematicip_cloud/.translations/id.json index c7b7857a86bd..8c99cddf6fb1 100644 --- a/homeassistant/components/homematicip_cloud/.translations/id.json +++ b/homeassistant/components/homematicip_cloud/.translations/id.json @@ -25,6 +25,5 @@ "title": "Tautkan jalur akses" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/it.json b/homeassistant/components/homematicip_cloud/.translations/it.json index e35e02de4796..d00f082d2ed3 100644 --- a/homeassistant/components/homematicip_cloud/.translations/it.json +++ b/homeassistant/components/homematicip_cloud/.translations/it.json @@ -25,6 +25,5 @@ "title": "Collegamento access point" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ko.json b/homeassistant/components/homematicip_cloud/.translations/ko.json index a3437c0100f2..954aff55b63f 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ko.json +++ b/homeassistant/components/homematicip_cloud/.translations/ko.json @@ -25,6 +25,5 @@ "title": "\uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8 \uc5f0\uacb0" } } - }, - "title": "HomematicIP \ud074\ub77c\uc6b0\ub4dc" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/lb.json b/homeassistant/components/homematicip_cloud/.translations/lb.json index 6c7acc9889fc..393a0689bff3 100644 --- a/homeassistant/components/homematicip_cloud/.translations/lb.json +++ b/homeassistant/components/homematicip_cloud/.translations/lb.json @@ -25,6 +25,5 @@ "title": "Accesspoint verbannen" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/nl.json b/homeassistant/components/homematicip_cloud/.translations/nl.json index aafc2bf1a9b5..af5b37773b01 100644 --- a/homeassistant/components/homematicip_cloud/.translations/nl.json +++ b/homeassistant/components/homematicip_cloud/.translations/nl.json @@ -25,6 +25,5 @@ "title": "Link accesspoint" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/nn.json b/homeassistant/components/homematicip_cloud/.translations/nn.json index 6884739e818c..c4154e748978 100644 --- a/homeassistant/components/homematicip_cloud/.translations/nn.json +++ b/homeassistant/components/homematicip_cloud/.translations/nn.json @@ -25,6 +25,5 @@ "title": "Link tilgangspunk" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/no.json b/homeassistant/components/homematicip_cloud/.translations/no.json index 4465c4f88a8a..e6a506a77680 100644 --- a/homeassistant/components/homematicip_cloud/.translations/no.json +++ b/homeassistant/components/homematicip_cloud/.translations/no.json @@ -25,6 +25,5 @@ "title": "Link tilgangspunkt" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pl.json b/homeassistant/components/homematicip_cloud/.translations/pl.json index e7154eab4b55..7c0497c2d43d 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pl.json +++ b/homeassistant/components/homematicip_cloud/.translations/pl.json @@ -25,6 +25,5 @@ "title": "Po\u0142\u0105cz z punktem dost\u0119pu" } } - }, - "title": "Chmura HomematicIP" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt-BR.json b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json index 3bb9119a0362..5f7fc81bd9d3 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pt-BR.json +++ b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json @@ -25,6 +25,5 @@ "title": "Accesspoint link" } } - }, - "title": "Nuvem do HomematicIP" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt.json b/homeassistant/components/homematicip_cloud/.translations/pt.json index 787aade5de74..649530de53c8 100644 --- a/homeassistant/components/homematicip_cloud/.translations/pt.json +++ b/homeassistant/components/homematicip_cloud/.translations/pt.json @@ -25,6 +25,5 @@ "title": "Associar ponto de acesso" } } - }, - "title": "Nuvem do HomematicIP" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ru.json b/homeassistant/components/homematicip_cloud/.translations/ru.json index cd75b53bce2c..58ee71e722b8 100644 --- a/homeassistant/components/homematicip_cloud/.translations/ru.json +++ b/homeassistant/components/homematicip_cloud/.translations/ru.json @@ -25,6 +25,5 @@ "title": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sl.json b/homeassistant/components/homematicip_cloud/.translations/sl.json index 96ac18a3c02a..a0179dfc90df 100644 --- a/homeassistant/components/homematicip_cloud/.translations/sl.json +++ b/homeassistant/components/homematicip_cloud/.translations/sl.json @@ -25,6 +25,5 @@ "title": "Pove\u017eite dostopno to\u010dko" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sv.json b/homeassistant/components/homematicip_cloud/.translations/sv.json index c21a0f65789f..85c71ca3fad5 100644 --- a/homeassistant/components/homematicip_cloud/.translations/sv.json +++ b/homeassistant/components/homematicip_cloud/.translations/sv.json @@ -25,6 +25,5 @@ "title": "L\u00e4nka Accesspunkt" } } - }, - "title": "HomematicIP Moln" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json index 4165e254658d..02781ba48f47 100644 --- a/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json @@ -25,6 +25,5 @@ "title": "\u8fde\u63a5\u63a5\u5165\u70b9" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json index 6925307e258b..e457ce1631c0 100644 --- a/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json @@ -25,6 +25,5 @@ "title": "\u9023\u7d50 Access point" } } - }, - "title": "HomematicIP Cloud" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/bg.json b/homeassistant/components/huawei_lte/.translations/bg.json index 195cc641405c..5c765c83bb99 100644 --- a/homeassistant/components/huawei_lte/.translations/bg.json +++ b/homeassistant/components/huawei_lte/.translations/bg.json @@ -37,6 +37,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ca.json b/homeassistant/components/huawei_lte/.translations/ca.json index a02b97ea0474..762132a459a6 100644 --- a/homeassistant/components/huawei_lte/.translations/ca.json +++ b/homeassistant/components/huawei_lte/.translations/ca.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/cs.json b/homeassistant/components/huawei_lte/.translations/cs.json index f75445e66d10..6ba708f2b0e2 100644 --- a/homeassistant/components/huawei_lte/.translations/cs.json +++ b/homeassistant/components/huawei_lte/.translations/cs.json @@ -33,6 +33,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/da.json b/homeassistant/components/huawei_lte/.translations/da.json index 0d047af61acb..e07499b0073e 100644 --- a/homeassistant/components/huawei_lte/.translations/da.json +++ b/homeassistant/components/huawei_lte/.translations/da.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/de.json b/homeassistant/components/huawei_lte/.translations/de.json index cd54a593399c..d3a9aa3efbcd 100644 --- a/homeassistant/components/huawei_lte/.translations/de.json +++ b/homeassistant/components/huawei_lte/.translations/de.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/en.json b/homeassistant/components/huawei_lte/.translations/en.json index faa0284891ba..3a66c447e54a 100644 --- a/homeassistant/components/huawei_lte/.translations/en.json +++ b/homeassistant/components/huawei_lte/.translations/en.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/es.json b/homeassistant/components/huawei_lte/.translations/es.json index 14fcfcd8f1ed..495ddb81bc32 100644 --- a/homeassistant/components/huawei_lte/.translations/es.json +++ b/homeassistant/components/huawei_lte/.translations/es.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/fr.json b/homeassistant/components/huawei_lte/.translations/fr.json index 1921dbdf1dcb..39e8b1045b5d 100644 --- a/homeassistant/components/huawei_lte/.translations/fr.json +++ b/homeassistant/components/huawei_lte/.translations/fr.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ 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 30c4dfa4a389..485a29f5a777 100644 --- a/homeassistant/components/huawei_lte/.translations/hu.json +++ b/homeassistant/components/huawei_lte/.translations/hu.json @@ -34,6 +34,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/it.json b/homeassistant/components/huawei_lte/.translations/it.json index 7f08dbcaee40..9f5a2cf04b2c 100644 --- a/homeassistant/components/huawei_lte/.translations/it.json +++ b/homeassistant/components/huawei_lte/.translations/it.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ko.json b/homeassistant/components/huawei_lte/.translations/ko.json index 732c8bbc98ef..28885b9435d8 100644 --- a/homeassistant/components/huawei_lte/.translations/ko.json +++ b/homeassistant/components/huawei_lte/.translations/ko.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/lb.json b/homeassistant/components/huawei_lte/.translations/lb.json index 3d894048d017..25846f40b7cb 100644 --- a/homeassistant/components/huawei_lte/.translations/lb.json +++ b/homeassistant/components/huawei_lte/.translations/lb.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/nl.json b/homeassistant/components/huawei_lte/.translations/nl.json index 151214011f85..0a1ebbf2ea2b 100644 --- a/homeassistant/components/huawei_lte/.translations/nl.json +++ b/homeassistant/components/huawei_lte/.translations/nl.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/no.json b/homeassistant/components/huawei_lte/.translations/no.json index 1d16002e2943..77c212c10b80 100644 --- a/homeassistant/components/huawei_lte/.translations/no.json +++ b/homeassistant/components/huawei_lte/.translations/no.json @@ -38,6 +38,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/pl.json b/homeassistant/components/huawei_lte/.translations/pl.json index 2613b66eea29..86e6e4e5853f 100644 --- a/homeassistant/components/huawei_lte/.translations/pl.json +++ b/homeassistant/components/huawei_lte/.translations/pl.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/pt.json b/homeassistant/components/huawei_lte/.translations/pt.json index db95d808fe48..a55c59332605 100644 --- a/homeassistant/components/huawei_lte/.translations/pt.json +++ b/homeassistant/components/huawei_lte/.translations/pt.json @@ -29,6 +29,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/ru.json b/homeassistant/components/huawei_lte/.translations/ru.json index fab87f065f3c..6e4c34c095d7 100644 --- a/homeassistant/components/huawei_lte/.translations/ru.json +++ b/homeassistant/components/huawei_lte/.translations/ru.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/sl.json b/homeassistant/components/huawei_lte/.translations/sl.json index 13b70516cc4c..fe4a8db5d069 100644 --- a/homeassistant/components/huawei_lte/.translations/sl.json +++ b/homeassistant/components/huawei_lte/.translations/sl.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/sv.json b/homeassistant/components/huawei_lte/.translations/sv.json index 88aebcdffd17..3dd267ed7312 100644 --- a/homeassistant/components/huawei_lte/.translations/sv.json +++ b/homeassistant/components/huawei_lte/.translations/sv.json @@ -38,6 +38,5 @@ } } } - }, - "title": "Huawei LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/.translations/zh-Hant.json b/homeassistant/components/huawei_lte/.translations/zh-Hant.json index be95e0e73ad4..4094733ba629 100644 --- a/homeassistant/components/huawei_lte/.translations/zh-Hant.json +++ b/homeassistant/components/huawei_lte/.translations/zh-Hant.json @@ -38,6 +38,5 @@ } } } - }, - "title": "\u83ef\u70ba LTE" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/bg.json b/homeassistant/components/hue/.translations/bg.json index f73ca791153e..76db584bae74 100644 --- a/homeassistant/components/hue/.translations/bg.json +++ b/homeassistant/components/hue/.translations/bg.json @@ -26,6 +26,5 @@ "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0445\u044a\u0431" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ca.json b/homeassistant/components/hue/.translations/ca.json index 1e1312b096b5..d0f625e73442 100644 --- a/homeassistant/components/hue/.translations/ca.json +++ b/homeassistant/components/hue/.translations/ca.json @@ -43,6 +43,5 @@ "remote_button_short_press": "Bot\u00f3 \"{subtype}\" premut", "remote_button_short_release": "Bot\u00f3 \"{subtype}\" alliberat" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/cs.json b/homeassistant/components/hue/.translations/cs.json index 76afc8c33733..d9070c7c2952 100644 --- a/homeassistant/components/hue/.translations/cs.json +++ b/homeassistant/components/hue/.translations/cs.json @@ -24,6 +24,5 @@ "title": "P\u0159ipojit Hub" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/cy.json b/homeassistant/components/hue/.translations/cy.json index 7e1f32135d76..fa966b7d0f42 100644 --- a/homeassistant/components/hue/.translations/cy.json +++ b/homeassistant/components/hue/.translations/cy.json @@ -24,6 +24,5 @@ "title": "Hwb cyswllt" } } - }, - "title": "Pont Phillips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/da.json b/homeassistant/components/hue/.translations/da.json index 41340856a6b4..031076172ac7 100644 --- a/homeassistant/components/hue/.translations/da.json +++ b/homeassistant/components/hue/.translations/da.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\"-knappen trykket p\u00e5", "remote_button_short_release": "\"{subtype}\"-knappen frigivet" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/de.json b/homeassistant/components/hue/.translations/de.json index 494a7217de2d..c2b667431b63 100644 --- a/homeassistant/components/hue/.translations/de.json +++ b/homeassistant/components/hue/.translations/de.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" Taste gedr\u00fcckt", "remote_button_short_release": "\"{subtype}\" Taste losgelassen" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/en.json b/homeassistant/components/hue/.translations/en.json index 02360d9a7d62..e250da7627ff 100644 --- a/homeassistant/components/hue/.translations/en.json +++ b/homeassistant/components/hue/.translations/en.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" button pressed", "remote_button_short_release": "\"{subtype}\" button released" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es-419.json b/homeassistant/components/hue/.translations/es-419.json index 299f50a6780c..8b2b90456bd8 100644 --- a/homeassistant/components/hue/.translations/es-419.json +++ b/homeassistant/components/hue/.translations/es-419.json @@ -20,6 +20,5 @@ } } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es.json b/homeassistant/components/hue/.translations/es.json index eb04cdcf9fba..550fd805bcdf 100644 --- a/homeassistant/components/hue/.translations/es.json +++ b/homeassistant/components/hue/.translations/es.json @@ -43,6 +43,5 @@ "remote_button_short_press": "Bot\u00f3n \"{subtype}\" pulsado", "remote_button_short_release": "Bot\u00f3n \"{subtype}\" soltado" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/et.json b/homeassistant/components/hue/.translations/et.json index 5362594e4ebe..92553c84cfe2 100644 --- a/homeassistant/components/hue/.translations/et.json +++ b/homeassistant/components/hue/.translations/et.json @@ -10,6 +10,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/fr.json b/homeassistant/components/hue/.translations/fr.json index 5d4bd86cc6bc..5b3efb94559a 100644 --- a/homeassistant/components/hue/.translations/fr.json +++ b/homeassistant/components/hue/.translations/fr.json @@ -26,6 +26,5 @@ "title": "Hub de liaison" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/he.json b/homeassistant/components/hue/.translations/he.json index 125ea33a0e66..3b03fb84bc38 100644 --- a/homeassistant/components/hue/.translations/he.json +++ b/homeassistant/components/hue/.translations/he.json @@ -24,6 +24,5 @@ "title": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e8\u05db\u05d6\u05ea" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/hr.json b/homeassistant/components/hue/.translations/hr.json index 05be972a510b..aa28e012caf7 100644 --- a/homeassistant/components/hue/.translations/hr.json +++ b/homeassistant/components/hue/.translations/hr.json @@ -11,6 +11,5 @@ } } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/hu.json b/homeassistant/components/hue/.translations/hu.json index 52f89dc460bf..80e90f16be08 100644 --- a/homeassistant/components/hue/.translations/hu.json +++ b/homeassistant/components/hue/.translations/hu.json @@ -24,6 +24,5 @@ "title": "Kapcsol\u00f3d\u00e1s a hubhoz" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/id.json b/homeassistant/components/hue/.translations/id.json index 0e2cac536b5b..2af5753f6548 100644 --- a/homeassistant/components/hue/.translations/id.json +++ b/homeassistant/components/hue/.translations/id.json @@ -24,6 +24,5 @@ "title": "Tautan Hub" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/it.json b/homeassistant/components/hue/.translations/it.json index 352da3409fbb..fff0016a46d5 100644 --- a/homeassistant/components/hue/.translations/it.json +++ b/homeassistant/components/hue/.translations/it.json @@ -43,6 +43,5 @@ "remote_button_short_press": "Pulsante \"{subtype}\" premuto", "remote_button_short_release": "Pulsante \"{subtype}\" rilasciato" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ja.json b/homeassistant/components/hue/.translations/ja.json index ef2d27ccb80b..6c4290140dc0 100644 --- a/homeassistant/components/hue/.translations/ja.json +++ b/homeassistant/components/hue/.translations/ja.json @@ -10,6 +10,5 @@ } } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ko.json b/homeassistant/components/hue/.translations/ko.json index 09fd044a1fa8..31bf427196c2 100644 --- a/homeassistant/components/hue/.translations/ko.json +++ b/homeassistant/components/hue/.translations/ko.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \ub20c\ub9b4 \ub54c", "remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c" } - }, - "title": "\ud544\ub9bd\uc2a4 Hue \ube0c\ub9bf\uc9c0" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/lb.json b/homeassistant/components/hue/.translations/lb.json index a0f03689a21f..cbdb31e3b361 100644 --- a/homeassistant/components/hue/.translations/lb.json +++ b/homeassistant/components/hue/.translations/lb.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" Kn\u00e4ppche gedr\u00e9ckt", "remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/nl.json b/homeassistant/components/hue/.translations/nl.json index 5c717391c745..346bc8af9ac2 100644 --- a/homeassistant/components/hue/.translations/nl.json +++ b/homeassistant/components/hue/.translations/nl.json @@ -36,6 +36,5 @@ "turn_off": "Uitschakelen", "turn_on": "Inschakelen" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/nn.json b/homeassistant/components/hue/.translations/nn.json index 14e5b5cbb9df..01ca31cec2b6 100644 --- a/homeassistant/components/hue/.translations/nn.json +++ b/homeassistant/components/hue/.translations/nn.json @@ -24,6 +24,5 @@ "title": "Link Hub" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/no.json b/homeassistant/components/hue/.translations/no.json index 2ddeb89d6b82..a0873737a7e0 100644 --- a/homeassistant/components/hue/.translations/no.json +++ b/homeassistant/components/hue/.translations/no.json @@ -27,5 +27,21 @@ } } }, - "title": "" + "device_automation": { + "trigger_subtype": { + "button_1": "F\u00f8rste knapp", + "button_2": "Andre knapp", + "button_3": "Tredje knapp", + "button_4": "Fjerde knapp", + "dim_down": "Dimm ned", + "dim_up": "Dimm opp", + "turn_off": "Skru av", + "turn_on": "Sl\u00e5 p\u00e5" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\"-knappen sluppet etter langt trykk", + "remote_button_short_press": "\"{subtype}\" -knappen ble trykket", + "remote_button_short_release": "\"{subtype}\"-knappen sluppet" + } + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pl.json b/homeassistant/components/hue/.translations/pl.json index aec784bca4a7..fa9f3f5abc5a 100644 --- a/homeassistant/components/hue/.translations/pl.json +++ b/homeassistant/components/hue/.translations/pl.json @@ -26,6 +26,5 @@ "title": "Hub Link" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pt-BR.json b/homeassistant/components/hue/.translations/pt-BR.json index c37f8ac9dc95..251ee74c9def 100644 --- a/homeassistant/components/hue/.translations/pt-BR.json +++ b/homeassistant/components/hue/.translations/pt-BR.json @@ -26,6 +26,5 @@ "title": "Hub de links" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/pt.json b/homeassistant/components/hue/.translations/pt.json index 422dbc94aa13..dd4656595675 100644 --- a/homeassistant/components/hue/.translations/pt.json +++ b/homeassistant/components/hue/.translations/pt.json @@ -1,16 +1,16 @@ { "config": { "abort": { - "all_configured": "Todas os Philips Hue j\u00e1 est\u00e3o configuradas", + "all_configured": "Todos os hubs Philips Hue j\u00e1 est\u00e3o configurados", "already_configured": "Hue j\u00e1 est\u00e1 configurado", - "cannot_connect": "N\u00e3o foi poss\u00edvel se conectar", - "discover_timeout": "Nenhum Hue bridge descoberto", - "no_bridges": "Nenhum Philips Hue descoberto", + "cannot_connect": "N\u00e3o foi poss\u00edvel conectar-se ao hub", + "discover_timeout": "Nenhum hub Hue descoberto", + "no_bridges": "Nenhum hub Philips Hue descoberto", "unknown": "Ocorreu um erro desconhecido" }, "error": { "linking": "Ocorreu um erro de liga\u00e7\u00e3o desconhecido.", - "register_failed": "Falha ao registrar, por favor, tente novamente" + "register_failed": "Falha ao registar, por favor, tente novamente" }, "step": { "init": { @@ -20,10 +20,9 @@ "title": "Hue bridge" }, "link": { - "description": "Pressione o bot\u00e3o no Philips Hue para registrar com o Home Assistant. \n\n![Localiza\u00e7\u00e3o do bot\u00e3o] (/static/images/config_philips_hue.jpg)", + "description": "Pressione o bot\u00e3o no Philips Hue para registar com o Home Assistant. \n\n![Localiza\u00e7\u00e3o do bot\u00e3o] (/static/images/config_philips_hue.jpg)", "title": "Link Hub" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ro.json b/homeassistant/components/hue/.translations/ro.json index 7850a0cb0b25..055cd02dffbd 100644 --- a/homeassistant/components/hue/.translations/ro.json +++ b/homeassistant/components/hue/.translations/ro.json @@ -20,6 +20,5 @@ "description": "Ap\u0103sa\u021bi butonul de pe pod pentru a \u00eenregistra Philips Hue cu Home Assistant. \n\n![Loca\u021bia butonului pe pod](/static/images/config_philips_hue.jpg)" } } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ru.json b/homeassistant/components/hue/.translations/ru.json index 1de7280fe547..199084020988 100644 --- a/homeassistant/components/hue/.translations/ru.json +++ b/homeassistant/components/hue/.translations/ru.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430", "remote_button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/sl.json b/homeassistant/components/hue/.translations/sl.json index 53a59c63d92a..cefd7393f2a6 100644 --- a/homeassistant/components/hue/.translations/sl.json +++ b/homeassistant/components/hue/.translations/sl.json @@ -27,5 +27,21 @@ } } }, - "title": "Philips Hue" + "device_automation": { + "trigger_subtype": { + "button_1": "Prvi gumb", + "button_2": "Drugi gumb", + "button_3": "Tretji gumb", + "button_4": "\u010cetrti gumb", + "dim_down": "Zatemnite", + "dim_up": "pove\u010dajte mo\u010d", + "turn_off": "Ugasni", + "turn_on": "Pri\u017egi" + }, + "trigger_type": { + "remote_button_long_release": "\"{subtype}\" gumb spro\u0161\u010den po dolgem pritisku", + "remote_button_short_press": "Pritisnjen \"{subtype}\" gumb", + "remote_button_short_release": "Gumb \"{subtype}\" spro\u0161\u010den" + } + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/sv.json b/homeassistant/components/hue/.translations/sv.json index 3b96ff44c286..894c4f9f9885 100644 --- a/homeassistant/components/hue/.translations/sv.json +++ b/homeassistant/components/hue/.translations/sv.json @@ -26,6 +26,5 @@ "title": "L\u00e4nka hub" } } - }, - "title": "Philips Hue Bridge" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/th.json b/homeassistant/components/hue/.translations/th.json index 65b36418d2f2..3de410802f34 100644 --- a/homeassistant/components/hue/.translations/th.json +++ b/homeassistant/components/hue/.translations/th.json @@ -6,6 +6,5 @@ "error": { "register_failed": "\u0e01\u0e32\u0e23\u0e25\u0e07\u0e17\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27\u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/zh-Hans.json b/homeassistant/components/hue/.translations/zh-Hans.json index c7ecdd85e20f..f3b763c7b0cc 100644 --- a/homeassistant/components/hue/.translations/zh-Hans.json +++ b/homeassistant/components/hue/.translations/zh-Hans.json @@ -25,6 +25,5 @@ "title": "\u8fde\u63a5\u4e2d\u67a2" } } - }, - "title": "\u98de\u5229\u6d66 Hue Bridge" + } } \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/zh-Hant.json b/homeassistant/components/hue/.translations/zh-Hant.json index dc48222b5f9f..b7ec9588b3e1 100644 --- a/homeassistant/components/hue/.translations/zh-Hant.json +++ b/homeassistant/components/hue/.translations/zh-Hant.json @@ -43,6 +43,5 @@ "remote_button_short_press": "\"{subtype}\" \u6309\u9215\u5df2\u6309\u4e0b", "remote_button_short_release": "\"{subtype}\" \u6309\u9215\u5df2\u91cb\u653e" } - }, - "title": "Philips Hue" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/bg.json b/homeassistant/components/iaqualink/.translations/bg.json index 70d4247f40dd..4da913f8e24d 100644 --- a/homeassistant/components/iaqualink/.translations/bg.json +++ b/homeassistant/components/iaqualink/.translations/bg.json @@ -16,6 +16,5 @@ "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u0441 iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ca.json b/homeassistant/components/iaqualink/.translations/ca.json index ef90886054fe..b86dd4358b04 100644 --- a/homeassistant/components/iaqualink/.translations/ca.json +++ b/homeassistant/components/iaqualink/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Connexi\u00f3 amb iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/da.json b/homeassistant/components/iaqualink/.translations/da.json index ae5c6ecb1d3b..1988db1767f7 100644 --- a/homeassistant/components/iaqualink/.translations/da.json +++ b/homeassistant/components/iaqualink/.translations/da.json @@ -16,6 +16,5 @@ "title": "Opret forbindelse til iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/de.json b/homeassistant/components/iaqualink/.translations/de.json index d3e6fabb2de8..2b9e1068b606 100644 --- a/homeassistant/components/iaqualink/.translations/de.json +++ b/homeassistant/components/iaqualink/.translations/de.json @@ -16,6 +16,5 @@ "title": "Mit iAqualink verbinden" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/en.json b/homeassistant/components/iaqualink/.translations/en.json index 8cc1c6ed450b..bebad01c3198 100644 --- a/homeassistant/components/iaqualink/.translations/en.json +++ b/homeassistant/components/iaqualink/.translations/en.json @@ -16,6 +16,5 @@ "title": "Connect to iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/es.json b/homeassistant/components/iaqualink/.translations/es.json index 593f41e0e157..74ae609c0d27 100644 --- a/homeassistant/components/iaqualink/.translations/es.json +++ b/homeassistant/components/iaqualink/.translations/es.json @@ -16,6 +16,5 @@ "title": "Con\u00e9ctese a iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/fr.json b/homeassistant/components/iaqualink/.translations/fr.json index 7a36a49f498a..60e9634acce8 100644 --- a/homeassistant/components/iaqualink/.translations/fr.json +++ b/homeassistant/components/iaqualink/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Se connecter \u00e0 iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/it.json b/homeassistant/components/iaqualink/.translations/it.json index 0ce1fd2eead6..471b21cdc9e3 100644 --- a/homeassistant/components/iaqualink/.translations/it.json +++ b/homeassistant/components/iaqualink/.translations/it.json @@ -16,6 +16,5 @@ "title": "Collegati a iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ko.json b/homeassistant/components/iaqualink/.translations/ko.json index 8fe750b661d9..23b3602744cc 100644 --- a/homeassistant/components/iaqualink/.translations/ko.json +++ b/homeassistant/components/iaqualink/.translations/ko.json @@ -16,6 +16,5 @@ "title": "iAqualink \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/lb.json b/homeassistant/components/iaqualink/.translations/lb.json index 5effa2b96274..b0d193254fa1 100644 --- a/homeassistant/components/iaqualink/.translations/lb.json +++ b/homeassistant/components/iaqualink/.translations/lb.json @@ -16,6 +16,5 @@ "title": "Mat iAqualink verbannen" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/nl.json b/homeassistant/components/iaqualink/.translations/nl.json index 80ce76009af8..a83dfe806e78 100644 --- a/homeassistant/components/iaqualink/.translations/nl.json +++ b/homeassistant/components/iaqualink/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Verbinding maken met iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/no.json b/homeassistant/components/iaqualink/.translations/no.json index d607343fe201..622cf931cba5 100644 --- a/homeassistant/components/iaqualink/.translations/no.json +++ b/homeassistant/components/iaqualink/.translations/no.json @@ -16,6 +16,5 @@ "title": "Koble til iAqualink" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/pl.json b/homeassistant/components/iaqualink/.translations/pl.json index 22a0d6364150..dd8ca0adc30d 100644 --- a/homeassistant/components/iaqualink/.translations/pl.json +++ b/homeassistant/components/iaqualink/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Po\u0142\u0105cz z iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/ru.json b/homeassistant/components/iaqualink/.translations/ru.json index 853b3527c9da..a5d75662546d 100644 --- a/homeassistant/components/iaqualink/.translations/ru.json +++ b/homeassistant/components/iaqualink/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Jandy iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/sl.json b/homeassistant/components/iaqualink/.translations/sl.json index d54bce408d52..73e988139f9d 100644 --- a/homeassistant/components/iaqualink/.translations/sl.json +++ b/homeassistant/components/iaqualink/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Pove\u017eite se z iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/sv.json b/homeassistant/components/iaqualink/.translations/sv.json index aa4c31d0ae11..4bab2dda632d 100644 --- a/homeassistant/components/iaqualink/.translations/sv.json +++ b/homeassistant/components/iaqualink/.translations/sv.json @@ -16,6 +16,5 @@ "title": "Anslut till iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/iaqualink/.translations/zh-Hant.json b/homeassistant/components/iaqualink/.translations/zh-Hant.json index abe05d9c37db..7161fec645fb 100644 --- a/homeassistant/components/iaqualink/.translations/zh-Hant.json +++ b/homeassistant/components/iaqualink/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u9023\u7dda\u81f3 iAqualink" } } - }, - "title": "Jandy iAqualink" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ca.json b/homeassistant/components/icloud/.translations/ca.json index 81d907c4824c..ade0c4a3bd3b 100644 --- a/homeassistant/components/icloud/.translations/ca.json +++ b/homeassistant/components/icloud/.translations/ca.json @@ -34,6 +34,5 @@ "title": "Codi de verificaci\u00f3 iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/da.json b/homeassistant/components/icloud/.translations/da.json index 44419d333cef..1c179b253228 100644 --- a/homeassistant/components/icloud/.translations/da.json +++ b/homeassistant/components/icloud/.translations/da.json @@ -34,6 +34,5 @@ "title": "iCloud-bekr\u00e6ftelseskode" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/de.json b/homeassistant/components/icloud/.translations/de.json index 80f2612bfdca..0b06ae422d08 100644 --- a/homeassistant/components/icloud/.translations/de.json +++ b/homeassistant/components/icloud/.translations/de.json @@ -34,6 +34,5 @@ "title": "iCloud-Best\u00e4tigungscode" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/en.json b/homeassistant/components/icloud/.translations/en.json index 2425a37207d0..0e9441882228 100644 --- a/homeassistant/components/icloud/.translations/en.json +++ b/homeassistant/components/icloud/.translations/en.json @@ -34,6 +34,5 @@ "title": "iCloud verification code" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/es.json b/homeassistant/components/icloud/.translations/es.json index 8b6ceb83f582..49bd9d612eb6 100644 --- a/homeassistant/components/icloud/.translations/es.json +++ b/homeassistant/components/icloud/.translations/es.json @@ -34,6 +34,5 @@ "title": "C\u00f3digo de verificaci\u00f3n de iCloud" } } - }, - "title": "iCloud de Apple" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/fr.json b/homeassistant/components/icloud/.translations/fr.json index c017f0a93d70..cce095e02983 100644 --- a/homeassistant/components/icloud/.translations/fr.json +++ b/homeassistant/components/icloud/.translations/fr.json @@ -33,6 +33,5 @@ "title": "Code de v\u00e9rification iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/hu.json b/homeassistant/components/icloud/.translations/hu.json index 9dc7b767e215..4dcf547619c7 100644 --- a/homeassistant/components/icloud/.translations/hu.json +++ b/homeassistant/components/icloud/.translations/hu.json @@ -29,6 +29,5 @@ "title": "iCloud ellen\u0151rz\u0151 k\u00f3d" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/it.json b/homeassistant/components/icloud/.translations/it.json index 60c389473363..27429081e1e7 100644 --- a/homeassistant/components/icloud/.translations/it.json +++ b/homeassistant/components/icloud/.translations/it.json @@ -34,6 +34,5 @@ "title": "Codice di verifica iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ko.json b/homeassistant/components/icloud/.translations/ko.json index 0469853fd705..a39940d42ed5 100644 --- a/homeassistant/components/icloud/.translations/ko.json +++ b/homeassistant/components/icloud/.translations/ko.json @@ -34,6 +34,5 @@ "title": "iCloud \uc778\uc99d \ucf54\ub4dc" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/lb.json b/homeassistant/components/icloud/.translations/lb.json index 3ee3f7a24f34..b6e9abe94bc0 100644 --- a/homeassistant/components/icloud/.translations/lb.json +++ b/homeassistant/components/icloud/.translations/lb.json @@ -34,6 +34,5 @@ "title": "iCloud Verifikatiouns Code" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/lv.json b/homeassistant/components/icloud/.translations/lv.json index 5db8cf1fe6b0..bbfb1fe32b1c 100644 --- a/homeassistant/components/icloud/.translations/lv.json +++ b/homeassistant/components/icloud/.translations/lv.json @@ -13,6 +13,5 @@ } } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/nl.json b/homeassistant/components/icloud/.translations/nl.json index c111234ed376..84691ebd1340 100644 --- a/homeassistant/components/icloud/.translations/nl.json +++ b/homeassistant/components/icloud/.translations/nl.json @@ -32,6 +32,5 @@ "title": "iCloud verificatiecode" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/no.json b/homeassistant/components/icloud/.translations/no.json index ef1dd82f3428..f1384df73b93 100644 --- a/homeassistant/components/icloud/.translations/no.json +++ b/homeassistant/components/icloud/.translations/no.json @@ -34,6 +34,5 @@ "title": "iCloud-bekreftelseskode" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/pl.json b/homeassistant/components/icloud/.translations/pl.json index 636a2dd86942..a4c7f1f8d9c1 100644 --- a/homeassistant/components/icloud/.translations/pl.json +++ b/homeassistant/components/icloud/.translations/pl.json @@ -34,6 +34,5 @@ "title": "Kod weryfikacyjny iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/pt-BR.json b/homeassistant/components/icloud/.translations/pt-BR.json index f9e45c8af8c9..53a0e0090dda 100644 --- a/homeassistant/components/icloud/.translations/pt-BR.json +++ b/homeassistant/components/icloud/.translations/pt-BR.json @@ -32,6 +32,5 @@ "title": "c\u00f3digo de verifica\u00e7\u00e3o do iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/ru.json b/homeassistant/components/icloud/.translations/ru.json index f55a5d4ffa44..c8949bdc16c9 100644 --- a/homeassistant/components/icloud/.translations/ru.json +++ b/homeassistant/components/icloud/.translations/ru.json @@ -34,6 +34,5 @@ "title": "\u041a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f iCloud" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/sl.json b/homeassistant/components/icloud/.translations/sl.json index 6ee3355dfed5..18ffb0709482 100644 --- a/homeassistant/components/icloud/.translations/sl.json +++ b/homeassistant/components/icloud/.translations/sl.json @@ -34,6 +34,5 @@ "title": "iCloud koda za preverjanje" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/sv.json b/homeassistant/components/icloud/.translations/sv.json index 72c0717d85b5..3ca8252a5586 100644 --- a/homeassistant/components/icloud/.translations/sv.json +++ b/homeassistant/components/icloud/.translations/sv.json @@ -32,6 +32,5 @@ "title": "iCloud-verifieringskod" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/zh-Hans.json b/homeassistant/components/icloud/.translations/zh-Hans.json index 851599524764..0fed17b7ce19 100644 --- a/homeassistant/components/icloud/.translations/zh-Hans.json +++ b/homeassistant/components/icloud/.translations/zh-Hans.json @@ -31,6 +31,5 @@ "title": "iCloud \u9a8c\u8bc1\u7801" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/icloud/.translations/zh-Hant.json b/homeassistant/components/icloud/.translations/zh-Hant.json index c2a8ac510db0..f917bfedd60c 100644 --- a/homeassistant/components/icloud/.translations/zh-Hant.json +++ b/homeassistant/components/icloud/.translations/zh-Hant.json @@ -34,6 +34,5 @@ "title": "iCloud \u9a57\u8b49\u78bc" } } - }, - "title": "Apple iCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/bg.json b/homeassistant/components/ifttt/.translations/bg.json index 90b0574cb2da..674757b92b9e 100644 --- a/homeassistant/components/ifttt/.translations/bg.json +++ b/homeassistant/components/ifttt/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 IFTTT Webhook \u0430\u043f\u043b\u0435\u0442" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ca.json b/homeassistant/components/ifttt/.translations/ca.json index d4aa6099d0af..29f9fa29fe99 100644 --- a/homeassistant/components/ifttt/.translations/ca.json +++ b/homeassistant/components/ifttt/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 de la miniaplicaci\u00f3 Webhook de IFTTT" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/cs.json b/homeassistant/components/ifttt/.translations/cs.json index 107657e9cfee..1f14283a05e1 100644 --- a/homeassistant/components/ifttt/.translations/cs.json +++ b/homeassistant/components/ifttt/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastavte applet IFTTT Webhook" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/da.json b/homeassistant/components/ifttt/.translations/da.json index 3b0e2d4b9ef4..109be40acca9 100644 --- a/homeassistant/components/ifttt/.translations/da.json +++ b/homeassistant/components/ifttt/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/de.json b/homeassistant/components/ifttt/.translations/de.json index e5e5c2439ada..1633f091a6ed 100644 --- a/homeassistant/components/ifttt/.translations/de.json +++ b/homeassistant/components/ifttt/.translations/de.json @@ -13,6 +13,5 @@ "title": "Einrichten des IFTTT Webhook Applets" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/en.json b/homeassistant/components/ifttt/.translations/en.json index a5fdd0a5b1d5..5a54f5a9aa5e 100644 --- a/homeassistant/components/ifttt/.translations/en.json +++ b/homeassistant/components/ifttt/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/es-419.json b/homeassistant/components/ifttt/.translations/es-419.json index 3d88caa84f50..097ecad5b792 100644 --- a/homeassistant/components/ifttt/.translations/es-419.json +++ b/homeassistant/components/ifttt/.translations/es-419.json @@ -12,6 +12,5 @@ "description": "\u00bfEst\u00e1s seguro de que quieres configurar IFTTT?" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/es.json b/homeassistant/components/ifttt/.translations/es.json index 4f2c6fb52d48..7160627e5449 100644 --- a/homeassistant/components/ifttt/.translations/es.json +++ b/homeassistant/components/ifttt/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el applet de webhook IFTTT" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/fr.json b/homeassistant/components/ifttt/.translations/fr.json index 132d4f116cc7..823801e97434 100644 --- a/homeassistant/components/ifttt/.translations/fr.json +++ b/homeassistant/components/ifttt/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer l'applet IFTTT Webhook" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/hu.json b/homeassistant/components/ifttt/.translations/hu.json index 41ee9b504790..560c2c84064d 100644 --- a/homeassistant/components/ifttt/.translations/hu.json +++ b/homeassistant/components/ifttt/.translations/hu.json @@ -10,6 +10,5 @@ "title": "IFTTT Webhook Applet be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/it.json b/homeassistant/components/ifttt/.translations/it.json index c93c6823e468..ce037f1c5c34 100644 --- a/homeassistant/components/ifttt/.translations/it.json +++ b/homeassistant/components/ifttt/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura l'applet WebHook IFTTT" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ko.json b/homeassistant/components/ifttt/.translations/ko.json index 7bf288932523..30dd8b04c114 100644 --- a/homeassistant/components/ifttt/.translations/ko.json +++ b/homeassistant/components/ifttt/.translations/ko.json @@ -13,6 +13,5 @@ "title": "IFTTT Webhook \uc560\ud50c\ub9bf \uc124\uc815" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/lb.json b/homeassistant/components/ifttt/.translations/lb.json index 1560b7c8996c..a13dd946a3e5 100644 --- a/homeassistant/components/ifttt/.translations/lb.json +++ b/homeassistant/components/ifttt/.translations/lb.json @@ -13,6 +13,5 @@ "title": "IFTTT Webhook Applet ariichten" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/nl.json b/homeassistant/components/ifttt/.translations/nl.json index 2e913abf64cd..f6ebaa0e7c4d 100644 --- a/homeassistant/components/ifttt/.translations/nl.json +++ b/homeassistant/components/ifttt/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de IFTTT Webhook-applet in" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/nn.json b/homeassistant/components/ifttt/.translations/nn.json index d0218da5b2bc..23bf7895ade2 100644 --- a/homeassistant/components/ifttt/.translations/nn.json +++ b/homeassistant/components/ifttt/.translations/nn.json @@ -5,6 +5,5 @@ "description": "Er du sikker p\u00e5 at du \u00f8nskjer \u00e5 setta opp IFTTT?" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/no.json b/homeassistant/components/ifttt/.translations/no.json index ad11a9b72dfe..54c2f71f40ba 100644 --- a/homeassistant/components/ifttt/.translations/no.json +++ b/homeassistant/components/ifttt/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pl.json b/homeassistant/components/ifttt/.translations/pl.json index e9aa35f5d248..47bf2c29a168 100644 --- a/homeassistant/components/ifttt/.translations/pl.json +++ b/homeassistant/components/ifttt/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja apletu Webhook IFTTT" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pt-BR.json b/homeassistant/components/ifttt/.translations/pt-BR.json index d96a34454db5..18e0791b187c 100644 --- a/homeassistant/components/ifttt/.translations/pt-BR.json +++ b/homeassistant/components/ifttt/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/pt.json b/homeassistant/components/ifttt/.translations/pt.json index e29c103de9e5..f32ced997d35 100644 --- a/homeassistant/components/ifttt/.translations/pt.json +++ b/homeassistant/components/ifttt/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ro.json b/homeassistant/components/ifttt/.translations/ro.json index 1025bedcf7d4..36e75204e924 100644 --- a/homeassistant/components/ifttt/.translations/ro.json +++ b/homeassistant/components/ifttt/.translations/ro.json @@ -9,6 +9,5 @@ "description": "Sigur dori\u021bi s\u0103 configura\u021bi IFTTT?" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/ru.json b/homeassistant/components/ifttt/.translations/ru.json index d2b7e6cd7927..c78fd1090ad0 100644 --- a/homeassistant/components/ifttt/.translations/ru.json +++ b/homeassistant/components/ifttt/.translations/ru.json @@ -13,6 +13,5 @@ "title": "IFTTT" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/sl.json b/homeassistant/components/ifttt/.translations/sl.json index 62b767524a54..83a5a4567de7 100644 --- a/homeassistant/components/ifttt/.translations/sl.json +++ b/homeassistant/components/ifttt/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/sv.json b/homeassistant/components/ifttt/.translations/sv.json index 57c1d1a8d910..6de7b1f4f27d 100644 --- a/homeassistant/components/ifttt/.translations/sv.json +++ b/homeassistant/components/ifttt/.translations/sv.json @@ -13,6 +13,5 @@ "title": "St\u00e4lla in IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/zh-Hans.json b/homeassistant/components/ifttt/.translations/zh-Hans.json index bf8c63c571bb..e58bd80af7c9 100644 --- a/homeassistant/components/ifttt/.translations/zh-Hans.json +++ b/homeassistant/components/ifttt/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/ifttt/.translations/zh-Hant.json b/homeassistant/components/ifttt/.translations/zh-Hant.json index f51ab3954a58..8337aa82479d 100644 --- a/homeassistant/components/ifttt/.translations/zh-Hant.json +++ b/homeassistant/components/ifttt/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a IFTTT Webhook Applet" } } - }, - "title": "IFTTT" + } } \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/af.json b/homeassistant/components/image_processing/.translations/af.json new file mode 100644 index 000000000000..15f4ee4a228d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Beeldverwerking" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ar.json b/homeassistant/components/image_processing/.translations/ar.json new file mode 100644 index 000000000000..06862b4a626e --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0635\u0648\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/bg.json b/homeassistant/components/image_processing/.translations/bg.json new file mode 100644 index 000000000000..8bce5cce6d41 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438e" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/bs.json b/homeassistant/components/image_processing/.translations/bs.json new file mode 100644 index 000000000000..fcfae2b4d67d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Obrada slike" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ca.json b/homeassistant/components/image_processing/.translations/ca.json new file mode 100644 index 000000000000..ecd84483d1de --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Processament d'imatges" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/cs.json b/homeassistant/components/image_processing/.translations/cs.json new file mode 100644 index 000000000000..86c01e96a9fe --- /dev/null +++ b/homeassistant/components/image_processing/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zpracov\u00e1n\u00ed obrazu" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/cy.json b/homeassistant/components/image_processing/.translations/cy.json new file mode 100644 index 000000000000..ed5077cdca20 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Prosesu delwedd" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/da.json b/homeassistant/components/image_processing/.translations/da.json new file mode 100644 index 000000000000..c191ba652527 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Billedbehandling" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/de.json b/homeassistant/components/image_processing/.translations/de.json new file mode 100644 index 000000000000..dbac72848320 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Bildverarbeitung" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/el.json b/homeassistant/components/image_processing/.translations/el.json new file mode 100644 index 000000000000..dab56cff29b6 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/en.json b/homeassistant/components/image_processing/.translations/en.json new file mode 100644 index 000000000000..54e008683932 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Image processing" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/es-419.json b/homeassistant/components/image_processing/.translations/es-419.json new file mode 100644 index 000000000000..abbb60ec2234 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Procesamiento de im\u00e1genes" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/es.json b/homeassistant/components/image_processing/.translations/es.json new file mode 100644 index 000000000000..abbb60ec2234 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Procesamiento de im\u00e1genes" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/et.json b/homeassistant/components/image_processing/.translations/et.json new file mode 100644 index 000000000000..add6434b0242 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Pildit\u00f6\u00f6tlus" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/fa.json b/homeassistant/components/image_processing/.translations/fa.json new file mode 100644 index 000000000000..0782c872fc99 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u067e\u0631\u062f\u0627\u0632\u0634 \u062a\u0635\u0648\u06cc\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/fi.json b/homeassistant/components/image_processing/.translations/fi.json new file mode 100644 index 000000000000..113626f41ec6 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kuvantunnistus" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/fr.json b/homeassistant/components/image_processing/.translations/fr.json new file mode 100644 index 000000000000..d902beb7479b --- /dev/null +++ b/homeassistant/components/image_processing/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Traitement d\u2019image" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/he.json b/homeassistant/components/image_processing/.translations/he.json new file mode 100644 index 000000000000..5a5fb880a27e --- /dev/null +++ b/homeassistant/components/image_processing/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e2\u05d9\u05d1\u05d5\u05d3 \u05ea\u05de\u05d5\u05e0\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/hi.json b/homeassistant/components/image_processing/.translations/hi.json new file mode 100644 index 000000000000..b54f9ef1afc3 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u092e\u0947\u091c \u092a\u094d\u0930\u094b\u0938\u0947\u0938\u093f\u0902\u0917" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/hr.json b/homeassistant/components/image_processing/.translations/hr.json new file mode 100644 index 000000000000..fcfae2b4d67d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Obrada slike" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/hu.json b/homeassistant/components/image_processing/.translations/hu.json new file mode 100644 index 000000000000..8e6fc1470658 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "K\u00e9pfeldolgoz\u00e1s" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/hy.json b/homeassistant/components/image_processing/.translations/hy.json new file mode 100644 index 000000000000..5911e5006451 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054a\u0561\u057f\u056f\u0565\u0580\u056b \u0574\u0577\u0561\u056f\u0578\u0582\u0574" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/id.json b/homeassistant/components/image_processing/.translations/id.json new file mode 100644 index 000000000000..19e3a64dcbad --- /dev/null +++ b/homeassistant/components/image_processing/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Pengolahan gambar" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/it.json b/homeassistant/components/image_processing/.translations/it.json new file mode 100644 index 000000000000..cfb4b6144e6a --- /dev/null +++ b/homeassistant/components/image_processing/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Elaborazione immagini" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ja.json b/homeassistant/components/image_processing/.translations/ja.json new file mode 100644 index 000000000000..ec0bd86fe879 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u753b\u50cf\u51e6\u7406" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ko.json b/homeassistant/components/image_processing/.translations/ko.json new file mode 100644 index 000000000000..0f90ef2df51d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc774\ubbf8\uc9c0\ucc98\ub9ac" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/lb.json b/homeassistant/components/image_processing/.translations/lb.json new file mode 100644 index 000000000000..baf495d13adc --- /dev/null +++ b/homeassistant/components/image_processing/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Bildveraarbechtung" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/lv.json b/homeassistant/components/image_processing/.translations/lv.json new file mode 100644 index 000000000000..0ae600eeb164 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Att\u0113lu apstr\u0101de" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/nb.json b/homeassistant/components/image_processing/.translations/nb.json new file mode 100644 index 000000000000..cdaf3b4128bb --- /dev/null +++ b/homeassistant/components/image_processing/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Bildebehandling" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/nl.json b/homeassistant/components/image_processing/.translations/nl.json new file mode 100644 index 000000000000..15f4ee4a228d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Beeldverwerking" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/nn.json b/homeassistant/components/image_processing/.translations/nn.json new file mode 100644 index 000000000000..e5e3c7ffe982 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Biletehandsaming" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/pl.json b/homeassistant/components/image_processing/.translations/pl.json new file mode 100644 index 000000000000..c8a2c98ee1f9 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Przetwarzanie obrazu" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/pt-BR.json b/homeassistant/components/image_processing/.translations/pt-BR.json new file mode 100644 index 000000000000..96c31ffda19e --- /dev/null +++ b/homeassistant/components/image_processing/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Processamento de imagem" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/pt.json b/homeassistant/components/image_processing/.translations/pt.json new file mode 100644 index 000000000000..96c31ffda19e --- /dev/null +++ b/homeassistant/components/image_processing/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Processamento de imagem" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ro.json b/homeassistant/components/image_processing/.translations/ro.json new file mode 100644 index 000000000000..f5c041230d02 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Procesarea imaginii" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/ru.json b/homeassistant/components/image_processing/.translations/ru.json new file mode 100644 index 000000000000..351f89c43435 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/sk.json b/homeassistant/components/image_processing/.translations/sk.json new file mode 100644 index 000000000000..4d38e1f8c4f4 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Spracovanie obrazu" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/sl.json b/homeassistant/components/image_processing/.translations/sl.json new file mode 100644 index 000000000000..b20e427a3527 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Obdelava slike" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/sv.json b/homeassistant/components/image_processing/.translations/sv.json new file mode 100644 index 000000000000..9aa4622a971d --- /dev/null +++ b/homeassistant/components/image_processing/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Bildbehandling" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/te.json b/homeassistant/components/image_processing/.translations/te.json new file mode 100644 index 000000000000..a00e3b6a8e00 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c2e\u0c47\u0c1c\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c38\u0c46\u0c38\u0c3f\u0c02\u0c17\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/th.json b/homeassistant/components/image_processing/.translations/th.json new file mode 100644 index 000000000000..97c0283501d5 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e21\u0e27\u0e25\u0e1c\u0e25\u0e20\u0e32\u0e1e" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/tr.json b/homeassistant/components/image_processing/.translations/tr.json new file mode 100644 index 000000000000..ecba43fe4de4 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "G\u00f6r\u00fcnt\u00fc i\u015fleme" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/uk.json b/homeassistant/components/image_processing/.translations/uk.json new file mode 100644 index 000000000000..fc353e04967b --- /dev/null +++ b/homeassistant/components/image_processing/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0431\u0440\u043e\u0431\u043a\u0430 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044c" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/vi.json b/homeassistant/components/image_processing/.translations/vi.json new file mode 100644 index 000000000000..de0ffe514901 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "X\u1eed l\u00fd \u1ea3nh" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/zh-Hans.json b/homeassistant/components/image_processing/.translations/zh-Hans.json new file mode 100644 index 000000000000..9d4f10ce0a30 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u56fe\u50cf\u5904\u7406" +} \ No newline at end of file diff --git a/homeassistant/components/image_processing/.translations/zh-Hant.json b/homeassistant/components/image_processing/.translations/zh-Hant.json new file mode 100644 index 000000000000..9e4bd5908590 --- /dev/null +++ b/homeassistant/components/image_processing/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u5716\u50cf\u8655\u7406" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/af.json b/homeassistant/components/input_boolean/.translations/af.json new file mode 100644 index 000000000000..f5bbc92c4fc1 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer boole" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/ar.json b/homeassistant/components/input_boolean/.translations/ar.json new file mode 100644 index 000000000000..cf0a52133b95 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u062f\u062e\u0644 \u0628\u0648\u0644\u064a\u0646\u064a" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/bg.json b/homeassistant/components/input_boolean/.translations/bg.json new file mode 100644 index 000000000000..6ca01629e663 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0411\u0443\u043b\u0435\u0432\u0438 \u043f\u0440\u043e\u043c\u0435\u043b\u0438\u0432\u0438" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/bs.json b/homeassistant/components/input_boolean/.translations/bs.json new file mode 100644 index 000000000000..128931423521 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Unos boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/ca.json b/homeassistant/components/input_boolean/.translations/ca.json new file mode 100644 index 000000000000..6b5bdac6b715 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada booleana" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/cs.json b/homeassistant/components/input_boolean/.translations/cs.json new file mode 100644 index 000000000000..63ddcc2cc490 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zad\u00e1n\u00ed ano/ne" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/cy.json b/homeassistant/components/input_boolean/.translations/cy.json new file mode 100644 index 000000000000..fab62477d57c --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Mewnbynnu boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/da.json b/homeassistant/components/input_boolean/.translations/da.json new file mode 100644 index 000000000000..0331e29f37af --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Boolsk valg" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/de.json b/homeassistant/components/input_boolean/.translations/de.json new file mode 100644 index 000000000000..29b5b3d1f456 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Boolsche Eingabe" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/el.json b/homeassistant/components/input_boolean/.translations/el.json new file mode 100644 index 000000000000..c06686e7db4c --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03bb\u03bf\u03b3\u03b9\u03ba\u03ae\u03c2 \u03c0\u03c1\u03ac\u03be\u03b7\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/en.json b/homeassistant/components/input_boolean/.translations/en.json new file mode 100644 index 000000000000..81d89eb53adc --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Input boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/es-419.json b/homeassistant/components/input_boolean/.translations/es-419.json new file mode 100644 index 000000000000..6b5bdac6b715 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada booleana" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/es.json b/homeassistant/components/input_boolean/.translations/es.json new file mode 100644 index 000000000000..6b5bdac6b715 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada booleana" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/et.json b/homeassistant/components/input_boolean/.translations/et.json new file mode 100644 index 000000000000..eb5f6b8e6511 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Sisesta t\u00f5ev\u00e4\u00e4rtus" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/eu.json b/homeassistant/components/input_boolean/.translations/eu.json new file mode 100644 index 000000000000..c8d78581a4b6 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Sarrera boolearra" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/fa.json b/homeassistant/components/input_boolean/.translations/fa.json new file mode 100644 index 000000000000..2710baee30de --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0648\u0631\u0648\u062f\u06cc \u0628\u0648\u0644\u06cc\u0646" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/fi.json b/homeassistant/components/input_boolean/.translations/fi.json new file mode 100644 index 000000000000..4b01ea6066e6 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Sy\u00f6t\u00e4 totuusarvo" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/fr.json b/homeassistant/components/input_boolean/.translations/fr.json new file mode 100644 index 000000000000..d2b33ef935c9 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Entr\u00e9e logique" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/he.json b/homeassistant/components/input_boolean/.translations/he.json new file mode 100644 index 000000000000..8e692afee12d --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05dc\u05d8 \u05d1\u05d5\u05dc\u05d9\u05d0\u05e0\u05d9" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/hi.json b/homeassistant/components/input_boolean/.translations/hi.json new file mode 100644 index 000000000000..b9e7c7826bfb --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0928\u092a\u0941\u091f \u092c\u0942\u0932\u093f\u092f\u0928" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/hr.json b/homeassistant/components/input_boolean/.translations/hr.json new file mode 100644 index 000000000000..81d89eb53adc --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Input boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/hu.json b/homeassistant/components/input_boolean/.translations/hu.json new file mode 100644 index 000000000000..92d2f41d8068 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Logikai bemenet" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/hy.json b/homeassistant/components/input_boolean/.translations/hy.json new file mode 100644 index 000000000000..acc0dd2ade2e --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u057e\u0561\u056e \u057f\u0580\u0561\u0574\u0561\u0562\u0561\u0576\u0561\u056f\u0561\u0576 \u0561\u0580\u056a\u0565\u0584" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/id.json b/homeassistant/components/input_boolean/.translations/id.json new file mode 100644 index 000000000000..81d89eb53adc --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Input boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/it.json b/homeassistant/components/input_boolean/.translations/it.json new file mode 100644 index 000000000000..4122af6a37d9 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Input booleano" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/ko.json b/homeassistant/components/input_boolean/.translations/ko.json new file mode 100644 index 000000000000..bd252181db41 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\ub17c\ub9ac\uc785\ub825" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/lb.json b/homeassistant/components/input_boolean/.translations/lb.json new file mode 100644 index 000000000000..b9e0a40035e4 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Boolean-Agab" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/lv.json b/homeassistant/components/input_boolean/.translations/lv.json new file mode 100644 index 000000000000..a6535cc544c4 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ieejas boolean" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/nb.json b/homeassistant/components/input_boolean/.translations/nb.json new file mode 100644 index 000000000000..e10574b1e685 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Angi boolsk" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/nl.json b/homeassistant/components/input_boolean/.translations/nl.json new file mode 100644 index 000000000000..e3908eefa7a9 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Boolean invoer" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/nn.json b/homeassistant/components/input_boolean/.translations/nn.json new file mode 100644 index 000000000000..786980e5a793 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Angje boolsk" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/pl.json b/homeassistant/components/input_boolean/.translations/pl.json new file mode 100644 index 000000000000..7e75ea439b7d --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pole warto\u015bci logicznej" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/pt-BR.json b/homeassistant/components/input_boolean/.translations/pt-BR.json new file mode 100644 index 000000000000..6b5bdac6b715 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada booleana" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/pt.json b/homeassistant/components/input_boolean/.translations/pt.json new file mode 100644 index 000000000000..bfca0cadaedd --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Introduzir booleano" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/ro.json b/homeassistant/components/input_boolean/.translations/ro.json new file mode 100644 index 000000000000..7f4de4021aa7 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Selectie On/Off" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/ru.json b/homeassistant/components/input_boolean/.translations/ru.json new file mode 100644 index 000000000000..33ccfb0a3a43 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/sk.json b/homeassistant/components/input_boolean/.translations/sk.json new file mode 100644 index 000000000000..a62957781f7a --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Logick\u00fd vstup" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/sl.json b/homeassistant/components/input_boolean/.translations/sl.json new file mode 100644 index 000000000000..4c7c0eaeb223 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "vnesite logi\u010dno vrednost" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/sv.json b/homeassistant/components/input_boolean/.translations/sv.json new file mode 100644 index 000000000000..fa235bcc11e3 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00e4lj av eller p\u00e5" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/te.json b/homeassistant/components/input_boolean/.translations/te.json new file mode 100644 index 000000000000..d48149c6556a --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c28\u0c4d\u0c2a\u0c41\u0c1f\u0c4d \u0c2c\u0c42\u0c32\u0c3f\u0c2f\u0c28\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/th.json b/homeassistant/components/input_boolean/.translations/th.json new file mode 100644 index 000000000000..355cf7e394e5 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1b\u0e49\u0e2d\u0e19\u0e04\u0e48\u0e32\u0e15\u0e23\u0e23\u0e01\u0e30" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/tr.json b/homeassistant/components/input_boolean/.translations/tr.json new file mode 100644 index 000000000000..4c1537980167 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Do\u011fru/Yanl\u0131\u015f giriniz" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/uk.json b/homeassistant/components/input_boolean/.translations/uk.json new file mode 100644 index 000000000000..a8ae01ea81a7 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043b\u043e\u0433\u0456\u0447\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/vi.json b/homeassistant/components/input_boolean/.translations/vi.json new file mode 100644 index 000000000000..fb601442b658 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110\u1ea7u v\u00e0o l\u00f4gic" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/zh-Hans.json b/homeassistant/components/input_boolean/.translations/zh-Hans.json new file mode 100644 index 000000000000..a7c564e90013 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u4e8c\u5143\u9009\u62e9\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/input_boolean/.translations/zh-Hant.json b/homeassistant/components/input_boolean/.translations/zh-Hant.json new file mode 100644 index 000000000000..c5e809e7e851 --- /dev/null +++ b/homeassistant/components/input_boolean/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u958b\u95dc\u6846" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/af.json b/homeassistant/components/input_datetime/.translations/af.json new file mode 100644 index 000000000000..af6bb4e8dcf6 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer datum/tyd" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/ar.json b/homeassistant/components/input_datetime/.translations/ar.json new file mode 100644 index 000000000000..110852b9142e --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062e\u0627\u0646\u0629 \u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0648\u0627\u0644\u0648\u0642\u062a" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/bg.json b/homeassistant/components/input_datetime/.translations/bg.json new file mode 100644 index 000000000000..8946ef71fddc --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u044a\u0432\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0434\u0430\u0442\u0430 \u0438 \u0447\u0430\u0441" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/bs.json b/homeassistant/components/input_datetime/.translations/bs.json new file mode 100644 index 000000000000..dd8191832967 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Unos datuma" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/ca.json b/homeassistant/components/input_datetime/.translations/ca.json new file mode 100644 index 000000000000..570c7b175923 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de data i hora" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/cs.json b/homeassistant/components/input_datetime/.translations/cs.json new file mode 100644 index 000000000000..810b63fdcf90 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zad\u00e1n\u00ed \u010dasu" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/cy.json b/homeassistant/components/input_datetime/.translations/cy.json new file mode 100644 index 000000000000..08ff0bf4e652 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Mewnbynnu dyddiad/amser" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/da.json b/homeassistant/components/input_datetime/.translations/da.json new file mode 100644 index 000000000000..ffff2a6597fc --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Indtast dato og tid" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/de.json b/homeassistant/components/input_datetime/.translations/de.json new file mode 100644 index 000000000000..79c01a21fc08 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Eingabe Datum/Uhrzeit" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/el.json b/homeassistant/components/input_datetime/.translations/el.json new file mode 100644 index 000000000000..9de1e52eeeed --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/en.json b/homeassistant/components/input_datetime/.translations/en.json new file mode 100644 index 000000000000..54c8ad793689 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Input datetime" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/es-419.json b/homeassistant/components/input_datetime/.translations/es-419.json new file mode 100644 index 000000000000..e86a07db952f --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Fecha de entrada" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/es.json b/homeassistant/components/input_datetime/.translations/es.json new file mode 100644 index 000000000000..025943ee4fb8 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de fecha" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/et.json b/homeassistant/components/input_datetime/.translations/et.json new file mode 100644 index 000000000000..e72e7b102880 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Sisesta kuup\u00e4ev ja kellaaeg" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/eu.json b/homeassistant/components/input_datetime/.translations/eu.json new file mode 100644 index 000000000000..2e81fb69eeb1 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Data sarrera" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/fi.json b/homeassistant/components/input_datetime/.translations/fi.json new file mode 100644 index 000000000000..385584a5e8ef --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Sy\u00f6t\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/fr.json b/homeassistant/components/input_datetime/.translations/fr.json new file mode 100644 index 000000000000..26c1983d1620 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Entr\u00e9e calendrier" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/he.json b/homeassistant/components/input_datetime/.translations/he.json new file mode 100644 index 000000000000..14c37289ac31 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05dc\u05d8 \u05ea\u05d0\u05e8\u05d9\u05da \u05d5\u05d6\u05de\u05df" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/hi.json b/homeassistant/components/input_datetime/.translations/hi.json new file mode 100644 index 000000000000..43f768226837 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0928\u092a\u0941\u091f \u0926\u093f\u0928\u093e\u0902\u0915 \u0938\u092e\u092f" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/hr.json b/homeassistant/components/input_datetime/.translations/hr.json new file mode 100644 index 000000000000..99600fedc7d7 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Unos datuma i vremena" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/hu.json b/homeassistant/components/input_datetime/.translations/hu.json new file mode 100644 index 000000000000..9d9d0cdb3d7d --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Id\u0151pont bemenet" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/hy.json b/homeassistant/components/input_datetime/.translations/hy.json new file mode 100644 index 000000000000..fa1b82196bc7 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u0565\u0584 \u056a\u0561\u0574\u0561\u0576\u0561\u056f\u056b \u057f\u057e\u0575\u0561\u056c\u0576\u0565\u0580\u0568" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/id.json b/homeassistant/components/input_datetime/.translations/id.json new file mode 100644 index 000000000000..c5835319547d --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Input tanggal waktu" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/is.json b/homeassistant/components/input_datetime/.translations/is.json new file mode 100644 index 000000000000..22c089f8f0fc --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Innsl\u00e1ttar dagsetning/t\u00edmi" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/it.json b/homeassistant/components/input_datetime/.translations/it.json new file mode 100644 index 000000000000..dbc7d7f36624 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Input di data" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/ko.json b/homeassistant/components/input_datetime/.translations/ko.json new file mode 100644 index 000000000000..a5984527e151 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\ub0a0\uc9dc / \uc2dc\uac04\uc785\ub825" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/lb.json b/homeassistant/components/input_datetime/.translations/lb.json new file mode 100644 index 000000000000..f3970ce802a3 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Datum-/Z\u00e4it-Agab" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/lv.json b/homeassistant/components/input_datetime/.translations/lv.json new file mode 100644 index 000000000000..d3641924ce2b --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ievades datuma laiks" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/nb.json b/homeassistant/components/input_datetime/.translations/nb.json new file mode 100644 index 000000000000..c22fa606524a --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Angi datotid" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/nl.json b/homeassistant/components/input_datetime/.translations/nl.json new file mode 100644 index 000000000000..a8c4d08abd03 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Voer datum en tijd in" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/nn.json b/homeassistant/components/input_datetime/.translations/nn.json new file mode 100644 index 000000000000..673793f919ad --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Angje dato" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/pl.json b/homeassistant/components/input_datetime/.translations/pl.json new file mode 100644 index 000000000000..9e990791ed81 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pole daty i czasu" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/pt-BR.json b/homeassistant/components/input_datetime/.translations/pt-BR.json new file mode 100644 index 000000000000..ede9ff7bd1a9 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de data e hora" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/pt.json b/homeassistant/components/input_datetime/.translations/pt.json new file mode 100644 index 000000000000..b4d83e081fba --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Introduzir data/hora" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/ro.json b/homeassistant/components/input_datetime/.translations/ro.json new file mode 100644 index 000000000000..6b9dfbd7717e --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Selecta\u021bi o data" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/ru.json b/homeassistant/components/input_datetime/.translations/ru.json new file mode 100644 index 000000000000..51eb69a073e7 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/sk.json b/homeassistant/components/input_datetime/.translations/sk.json new file mode 100644 index 000000000000..65becd11953b --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Vstupn\u00fd d\u00e1tum a \u010das" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/sl.json b/homeassistant/components/input_datetime/.translations/sl.json new file mode 100644 index 000000000000..13933457561c --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Vnos datuma in \u010dasa" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/sv.json b/homeassistant/components/input_datetime/.translations/sv.json new file mode 100644 index 000000000000..c3657e30efb1 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Mata in datum och tid" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/te.json b/homeassistant/components/input_datetime/.translations/te.json new file mode 100644 index 000000000000..8df802648462 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c28\u0c4d\u0c2a\u0c41\u0c1f\u0c4d \u0c24\u0c47\u0c26\u0c40\u0c38\u0c2e\u0c2f\u0c02" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/th.json b/homeassistant/components/input_datetime/.translations/th.json new file mode 100644 index 000000000000..944a288f7738 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1b\u0e49\u0e2d\u0e19\u0e27\u0e31\u0e19\u0e40\u0e27\u0e25\u0e32" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/tr.json b/homeassistant/components/input_datetime/.translations/tr.json new file mode 100644 index 000000000000..1b0c21d30294 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Giri\u015f Tarih/Saat" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/uk.json b/homeassistant/components/input_datetime/.translations/uk.json new file mode 100644 index 000000000000..bd087e535a5c --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u0434\u0430\u0442\u0438" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/vi.json b/homeassistant/components/input_datetime/.translations/vi.json new file mode 100644 index 000000000000..f1bb56d3bf04 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110\u1ea7u v\u00e0o ng\u00e0y gi\u1edd" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/zh-Hans.json b/homeassistant/components/input_datetime/.translations/zh-Hans.json new file mode 100644 index 000000000000..7b80fb16d4e5 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u65e5\u671f\u9009\u62e9\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/input_datetime/.translations/zh-Hant.json b/homeassistant/components/input_datetime/.translations/zh-Hant.json new file mode 100644 index 000000000000..631f486d4636 --- /dev/null +++ b/homeassistant/components/input_datetime/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8f38\u5165\u65e5\u671f" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/af.json b/homeassistant/components/input_number/.translations/af.json new file mode 100644 index 000000000000..21588860453c --- /dev/null +++ b/homeassistant/components/input_number/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer nommer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/ar.json b/homeassistant/components/input_number/.translations/ar.json new file mode 100644 index 000000000000..972b40073878 --- /dev/null +++ b/homeassistant/components/input_number/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062e\u0627\u0646\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/bg.json b/homeassistant/components/input_number/.translations/bg.json new file mode 100644 index 000000000000..3d9ca48933e8 --- /dev/null +++ b/homeassistant/components/input_number/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u044a\u0432\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/bs.json b/homeassistant/components/input_number/.translations/bs.json new file mode 100644 index 000000000000..32be17c859ad --- /dev/null +++ b/homeassistant/components/input_number/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Unos broja" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/ca.json b/homeassistant/components/input_number/.translations/ca.json new file mode 100644 index 000000000000..cd3606e03a95 --- /dev/null +++ b/homeassistant/components/input_number/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada num\u00e8rica" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/cs.json b/homeassistant/components/input_number/.translations/cs.json new file mode 100644 index 000000000000..c639bae22f06 --- /dev/null +++ b/homeassistant/components/input_number/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zad\u00e1n\u00ed \u010d\u00edsla" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/cy.json b/homeassistant/components/input_number/.translations/cy.json new file mode 100644 index 000000000000..d9cb424783df --- /dev/null +++ b/homeassistant/components/input_number/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Mewnbynnu rhif" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/da.json b/homeassistant/components/input_number/.translations/da.json new file mode 100644 index 000000000000..5108e16efcb9 --- /dev/null +++ b/homeassistant/components/input_number/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Indtast nummer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/de.json b/homeassistant/components/input_number/.translations/de.json new file mode 100644 index 000000000000..51a7a178a093 --- /dev/null +++ b/homeassistant/components/input_number/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Numerische Eingabe" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/el.json b/homeassistant/components/input_number/.translations/el.json new file mode 100644 index 000000000000..04e57ee945e0 --- /dev/null +++ b/homeassistant/components/input_number/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/en.json b/homeassistant/components/input_number/.translations/en.json new file mode 100644 index 000000000000..4f474990db07 --- /dev/null +++ b/homeassistant/components/input_number/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Input number" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/es-419.json b/homeassistant/components/input_number/.translations/es-419.json new file mode 100644 index 000000000000..dd280ee7c6f1 --- /dev/null +++ b/homeassistant/components/input_number/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00famero de entrada" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/es.json b/homeassistant/components/input_number/.translations/es.json new file mode 100644 index 000000000000..e05a9130580b --- /dev/null +++ b/homeassistant/components/input_number/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de n\u00famero" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/et.json b/homeassistant/components/input_number/.translations/et.json new file mode 100644 index 000000000000..f4182fbb3d5b --- /dev/null +++ b/homeassistant/components/input_number/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Sisendi number" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/eu.json b/homeassistant/components/input_number/.translations/eu.json new file mode 100644 index 000000000000..a5a7b0c35dda --- /dev/null +++ b/homeassistant/components/input_number/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Zenbaki sarrera" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/fi.json b/homeassistant/components/input_number/.translations/fi.json new file mode 100644 index 000000000000..b521ec9fed38 --- /dev/null +++ b/homeassistant/components/input_number/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Sy\u00f6t\u00e4 numero" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/fr.json b/homeassistant/components/input_number/.translations/fr.json new file mode 100644 index 000000000000..22045841160b --- /dev/null +++ b/homeassistant/components/input_number/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Entr\u00e9e num\u00e9rique" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/he.json b/homeassistant/components/input_number/.translations/he.json new file mode 100644 index 000000000000..6fff8ef5e31e --- /dev/null +++ b/homeassistant/components/input_number/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05dc\u05d8 \u05de\u05e1\u05e4\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/hi.json b/homeassistant/components/input_number/.translations/hi.json new file mode 100644 index 000000000000..abcbfa4f52e0 --- /dev/null +++ b/homeassistant/components/input_number/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0928\u092a\u0941\u091f \u0938\u0902\u0916\u094d\u092f\u093e" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/hr.json b/homeassistant/components/input_number/.translations/hr.json new file mode 100644 index 000000000000..0a909c435f0c --- /dev/null +++ b/homeassistant/components/input_number/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Unesite broj" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/hu.json b/homeassistant/components/input_number/.translations/hu.json new file mode 100644 index 000000000000..766e74582446 --- /dev/null +++ b/homeassistant/components/input_number/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Sz\u00e1m bemenet" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/hy.json b/homeassistant/components/input_number/.translations/hy.json new file mode 100644 index 000000000000..e39ed6234f12 --- /dev/null +++ b/homeassistant/components/input_number/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580\u0568" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/id.json b/homeassistant/components/input_number/.translations/id.json new file mode 100644 index 000000000000..4c533f5eac52 --- /dev/null +++ b/homeassistant/components/input_number/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Input bilangan" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/is.json b/homeassistant/components/input_number/.translations/is.json new file mode 100644 index 000000000000..677efd751f07 --- /dev/null +++ b/homeassistant/components/input_number/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Innsl\u00e1ttarn\u00famer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/it.json b/homeassistant/components/input_number/.translations/it.json new file mode 100644 index 000000000000..c635f1d295ca --- /dev/null +++ b/homeassistant/components/input_number/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Input numerico" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/ko.json b/homeassistant/components/input_number/.translations/ko.json new file mode 100644 index 000000000000..68960733dd8e --- /dev/null +++ b/homeassistant/components/input_number/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc22b\uc790\uc785\ub825" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/lb.json b/homeassistant/components/input_number/.translations/lb.json new file mode 100644 index 000000000000..7d2ec79080e6 --- /dev/null +++ b/homeassistant/components/input_number/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Zuelen-Agab" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/lv.json b/homeassistant/components/input_number/.translations/lv.json new file mode 100644 index 000000000000..6268cf2df3e3 --- /dev/null +++ b/homeassistant/components/input_number/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ievades numurs" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/nb.json b/homeassistant/components/input_number/.translations/nb.json new file mode 100644 index 000000000000..c36d2b6aafc0 --- /dev/null +++ b/homeassistant/components/input_number/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Angi nummer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/nl.json b/homeassistant/components/input_number/.translations/nl.json new file mode 100644 index 000000000000..c5cc37124307 --- /dev/null +++ b/homeassistant/components/input_number/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Numerieke invoer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/nn.json b/homeassistant/components/input_number/.translations/nn.json new file mode 100644 index 000000000000..65240785840d --- /dev/null +++ b/homeassistant/components/input_number/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Angje nummer" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/pl.json b/homeassistant/components/input_number/.translations/pl.json new file mode 100644 index 000000000000..4ef827032d0a --- /dev/null +++ b/homeassistant/components/input_number/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pole numeryczne" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/pt-BR.json b/homeassistant/components/input_number/.translations/pt-BR.json new file mode 100644 index 000000000000..e31e0ccc72f6 --- /dev/null +++ b/homeassistant/components/input_number/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada num\u00e9rica" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/pt.json b/homeassistant/components/input_number/.translations/pt.json new file mode 100644 index 000000000000..5c6efb211e2d --- /dev/null +++ b/homeassistant/components/input_number/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Introduzir n\u00famero" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/ro.json b/homeassistant/components/input_number/.translations/ro.json new file mode 100644 index 000000000000..d519b992eb89 --- /dev/null +++ b/homeassistant/components/input_number/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Selecta\u021bi numarul" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/ru.json b/homeassistant/components/input_number/.translations/ru.json new file mode 100644 index 000000000000..64c8e55f836a --- /dev/null +++ b/homeassistant/components/input_number/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0427\u0438\u0441\u043b\u043e" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/sk.json b/homeassistant/components/input_number/.translations/sk.json new file mode 100644 index 000000000000..c2449db709f8 --- /dev/null +++ b/homeassistant/components/input_number/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "\u010c\u00edseln\u00fd vstup" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/sl.json b/homeassistant/components/input_number/.translations/sl.json new file mode 100644 index 000000000000..09988294d46b --- /dev/null +++ b/homeassistant/components/input_number/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Vnesite \u0161tevilko" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/sv.json b/homeassistant/components/input_number/.translations/sv.json new file mode 100644 index 000000000000..981034c73b95 --- /dev/null +++ b/homeassistant/components/input_number/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Mata in tal" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/te.json b/homeassistant/components/input_number/.translations/te.json new file mode 100644 index 000000000000..1ca8fbd4ec4b --- /dev/null +++ b/homeassistant/components/input_number/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c28\u0c4d\u0c2a\u0c41\u0c1f\u0c4d \u0c38\u0c02\u0c16\u0c4d\u0c2f" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/th.json b/homeassistant/components/input_number/.translations/th.json new file mode 100644 index 000000000000..ec93697dc3b2 --- /dev/null +++ b/homeassistant/components/input_number/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1b\u0e49\u0e2d\u0e19\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/tr.json b/homeassistant/components/input_number/.translations/tr.json new file mode 100644 index 000000000000..c1805180884c --- /dev/null +++ b/homeassistant/components/input_number/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Numara giriniz" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/uk.json b/homeassistant/components/input_number/.translations/uk.json new file mode 100644 index 000000000000..0e4265d7ca0a --- /dev/null +++ b/homeassistant/components/input_number/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043d\u043e\u043c\u0435\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/vi.json b/homeassistant/components/input_number/.translations/vi.json new file mode 100644 index 000000000000..0fcc548a682c --- /dev/null +++ b/homeassistant/components/input_number/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110\u1ea7u v\u00e0o s\u1ed1" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/zh-Hans.json b/homeassistant/components/input_number/.translations/zh-Hans.json new file mode 100644 index 000000000000..b230db9fc60a --- /dev/null +++ b/homeassistant/components/input_number/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u6570\u503c\u9009\u62e9\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/input_number/.translations/zh-Hant.json b/homeassistant/components/input_number/.translations/zh-Hant.json new file mode 100644 index 000000000000..76806d23a5c9 --- /dev/null +++ b/homeassistant/components/input_number/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u6578\u5b57\u6846" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/af.json b/homeassistant/components/input_select/.translations/af.json new file mode 100644 index 000000000000..3c6b44d43d63 --- /dev/null +++ b/homeassistant/components/input_select/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer seleksie" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/ar.json b/homeassistant/components/input_select/.translations/ar.json new file mode 100644 index 000000000000..af85b8135ec1 --- /dev/null +++ b/homeassistant/components/input_select/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0644\u0627\u0626\u062d\u0629 \u0625\u062e\u062a\u064a\u0627\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/bg.json b/homeassistant/components/input_select/.translations/bg.json new file mode 100644 index 000000000000..73689e0e6d64 --- /dev/null +++ b/homeassistant/components/input_select/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0418\u0437\u0431\u043e\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/bs.json b/homeassistant/components/input_select/.translations/bs.json new file mode 100644 index 000000000000..34a36e0cd816 --- /dev/null +++ b/homeassistant/components/input_select/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Unos izbora" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/ca.json b/homeassistant/components/input_select/.translations/ca.json new file mode 100644 index 000000000000..8a20dd83cf50 --- /dev/null +++ b/homeassistant/components/input_select/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de selecci\u00f3" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/cs.json b/homeassistant/components/input_select/.translations/cs.json new file mode 100644 index 000000000000..c36a4687fda2 --- /dev/null +++ b/homeassistant/components/input_select/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zad\u00e1n\u00ed volby" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/cy.json b/homeassistant/components/input_select/.translations/cy.json new file mode 100644 index 000000000000..0558e76de4b4 --- /dev/null +++ b/homeassistant/components/input_select/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Mewnbynnu dewis" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/da.json b/homeassistant/components/input_select/.translations/da.json new file mode 100644 index 000000000000..7354ebf3d772 --- /dev/null +++ b/homeassistant/components/input_select/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00e6lg mulighed" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/de.json b/homeassistant/components/input_select/.translations/de.json new file mode 100644 index 000000000000..8b58030eded7 --- /dev/null +++ b/homeassistant/components/input_select/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Auswahlfeld" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/el.json b/homeassistant/components/input_select/.translations/el.json new file mode 100644 index 000000000000..0832123d47fb --- /dev/null +++ b/homeassistant/components/input_select/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/en.json b/homeassistant/components/input_select/.translations/en.json new file mode 100644 index 000000000000..e74785ed24f4 --- /dev/null +++ b/homeassistant/components/input_select/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Input select" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/es-419.json b/homeassistant/components/input_select/.translations/es-419.json new file mode 100644 index 000000000000..ad5d4266d2c0 --- /dev/null +++ b/homeassistant/components/input_select/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Selecci\u00f3n de entrada" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/es.json b/homeassistant/components/input_select/.translations/es.json new file mode 100644 index 000000000000..ad5d4266d2c0 --- /dev/null +++ b/homeassistant/components/input_select/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Selecci\u00f3n de entrada" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/et.json b/homeassistant/components/input_select/.translations/et.json new file mode 100644 index 000000000000..22378cd35a0d --- /dev/null +++ b/homeassistant/components/input_select/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Vali sisend" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/eu.json b/homeassistant/components/input_select/.translations/eu.json new file mode 100644 index 000000000000..d55843eddae4 --- /dev/null +++ b/homeassistant/components/input_select/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Aukeraketa sarrera" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/fi.json b/homeassistant/components/input_select/.translations/fi.json new file mode 100644 index 000000000000..4f9dfdbf6c1a --- /dev/null +++ b/homeassistant/components/input_select/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Valinta" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/fr.json b/homeassistant/components/input_select/.translations/fr.json new file mode 100644 index 000000000000..e93b725dc491 --- /dev/null +++ b/homeassistant/components/input_select/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "S\u00e9lection" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/he.json b/homeassistant/components/input_select/.translations/he.json new file mode 100644 index 000000000000..6fb50ef1c673 --- /dev/null +++ b/homeassistant/components/input_select/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05dc\u05d8 \u05d1\u05d7\u05d9\u05e8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/hi.json b/homeassistant/components/input_select/.translations/hi.json new file mode 100644 index 000000000000..822ba13d9a46 --- /dev/null +++ b/homeassistant/components/input_select/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0928\u092a\u0941\u091f \u0915\u093e \u091a\u092f\u0928 \u0915\u0930\u0947\u0902" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/hr.json b/homeassistant/components/input_select/.translations/hr.json new file mode 100644 index 000000000000..9927fb325f14 --- /dev/null +++ b/homeassistant/components/input_select/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Izbor unosa" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/hu.json b/homeassistant/components/input_select/.translations/hu.json new file mode 100644 index 000000000000..d528d526afc7 --- /dev/null +++ b/homeassistant/components/input_select/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00e1laszt\u00e1si bemenet" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/hy.json b/homeassistant/components/input_select/.translations/hy.json new file mode 100644 index 000000000000..296e047ba067 --- /dev/null +++ b/homeassistant/components/input_select/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u0565\u0584 \u0568\u0576\u057f\u0580\u0561\u056e\u0568" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/id.json b/homeassistant/components/input_select/.translations/id.json new file mode 100644 index 000000000000..fb8243c7f3d7 --- /dev/null +++ b/homeassistant/components/input_select/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Input pilihan" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/is.json b/homeassistant/components/input_select/.translations/is.json new file mode 100644 index 000000000000..87462c94213f --- /dev/null +++ b/homeassistant/components/input_select/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Innsl\u00e1ttarval" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/it.json b/homeassistant/components/input_select/.translations/it.json new file mode 100644 index 000000000000..80f397dd89e1 --- /dev/null +++ b/homeassistant/components/input_select/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Input selezione" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/ko.json b/homeassistant/components/input_select/.translations/ko.json new file mode 100644 index 000000000000..5620635d9032 --- /dev/null +++ b/homeassistant/components/input_select/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc120\ud0dd\uc785\ub825" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/lb.json b/homeassistant/components/input_select/.translations/lb.json new file mode 100644 index 000000000000..4e1ceb45c94a --- /dev/null +++ b/homeassistant/components/input_select/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Auswiel-Agab" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/lv.json b/homeassistant/components/input_select/.translations/lv.json new file mode 100644 index 000000000000..bd5971875f27 --- /dev/null +++ b/homeassistant/components/input_select/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ievades izv\u0113le" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/nb.json b/homeassistant/components/input_select/.translations/nb.json new file mode 100644 index 000000000000..6840f1416c89 --- /dev/null +++ b/homeassistant/components/input_select/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Angi valg" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/nl.json b/homeassistant/components/input_select/.translations/nl.json new file mode 100644 index 000000000000..9abccb1411be --- /dev/null +++ b/homeassistant/components/input_select/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer selectie" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/nn.json b/homeassistant/components/input_select/.translations/nn.json new file mode 100644 index 000000000000..45abc169e447 --- /dev/null +++ b/homeassistant/components/input_select/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Angje val" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/pl.json b/homeassistant/components/input_select/.translations/pl.json new file mode 100644 index 000000000000..9a1b05e3234d --- /dev/null +++ b/homeassistant/components/input_select/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pole wyboru" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/pt-BR.json b/homeassistant/components/input_select/.translations/pt-BR.json new file mode 100644 index 000000000000..129d8326824b --- /dev/null +++ b/homeassistant/components/input_select/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de sele\u00e7\u00e3o" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/pt.json b/homeassistant/components/input_select/.translations/pt.json new file mode 100644 index 000000000000..6d9b589e7af9 --- /dev/null +++ b/homeassistant/components/input_select/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Escolher" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/ro.json b/homeassistant/components/input_select/.translations/ro.json new file mode 100644 index 000000000000..b745ad43594f --- /dev/null +++ b/homeassistant/components/input_select/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Selecta\u021bi" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/ru.json b/homeassistant/components/input_select/.translations/ru.json new file mode 100644 index 000000000000..51cc2815b267 --- /dev/null +++ b/homeassistant/components/input_select/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u043f\u0438\u0441\u043e\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/sk.json b/homeassistant/components/input_select/.translations/sk.json new file mode 100644 index 000000000000..3d6843727de3 --- /dev/null +++ b/homeassistant/components/input_select/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00fdber z mo\u017enost\u00ed" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/sl.json b/homeassistant/components/input_select/.translations/sl.json new file mode 100644 index 000000000000..94e92eb924f9 --- /dev/null +++ b/homeassistant/components/input_select/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Izbira vnosa" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/sv.json b/homeassistant/components/input_select/.translations/sv.json new file mode 100644 index 000000000000..e16183afa01b --- /dev/null +++ b/homeassistant/components/input_select/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00e4lj" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/te.json b/homeassistant/components/input_select/.translations/te.json new file mode 100644 index 000000000000..94afe97c81e7 --- /dev/null +++ b/homeassistant/components/input_select/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c28\u0c4d\u0c2a\u0c41\u0c1f\u0c4d \u0c0e\u0c02\u0c1a\u0c41\u0c15\u0c4b" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/th.json b/homeassistant/components/input_select/.translations/th.json new file mode 100644 index 000000000000..4e92c4d99e14 --- /dev/null +++ b/homeassistant/components/input_select/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/tr.json b/homeassistant/components/input_select/.translations/tr.json new file mode 100644 index 000000000000..76026f5c0d5c --- /dev/null +++ b/homeassistant/components/input_select/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Girdi se\u00e7iniz" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/uk.json b/homeassistant/components/input_select/.translations/uk.json new file mode 100644 index 000000000000..ace44f8d7a79 --- /dev/null +++ b/homeassistant/components/input_select/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0438\u0431\u0440\u0430\u0442\u0438" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/vi.json b/homeassistant/components/input_select/.translations/vi.json new file mode 100644 index 000000000000..84306384eeb2 --- /dev/null +++ b/homeassistant/components/input_select/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Ch\u1ecdn \u0111\u1ea7u v\u00e0o" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/zh-Hans.json b/homeassistant/components/input_select/.translations/zh-Hans.json new file mode 100644 index 000000000000..49380782fbd2 --- /dev/null +++ b/homeassistant/components/input_select/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u591a\u9879\u9009\u62e9\u5668" +} \ No newline at end of file diff --git a/homeassistant/components/input_select/.translations/zh-Hant.json b/homeassistant/components/input_select/.translations/zh-Hant.json new file mode 100644 index 000000000000..8fd89f7392ca --- /dev/null +++ b/homeassistant/components/input_select/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u9078\u64c7\u6846" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/af.json b/homeassistant/components/input_text/.translations/af.json new file mode 100644 index 000000000000..9d35992c7297 --- /dev/null +++ b/homeassistant/components/input_text/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Invoer teks" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ar.json b/homeassistant/components/input_text/.translations/ar.json new file mode 100644 index 000000000000..e348970b1f76 --- /dev/null +++ b/homeassistant/components/input_text/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062e\u0627\u0646\u0629 \u0628\u064a\u0627\u0646\u0627\u062a" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/bg.json b/homeassistant/components/input_text/.translations/bg.json new file mode 100644 index 000000000000..3bbafad402af --- /dev/null +++ b/homeassistant/components/input_text/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u044a\u0432\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/bs.json b/homeassistant/components/input_text/.translations/bs.json new file mode 100644 index 000000000000..022ceeff5079 --- /dev/null +++ b/homeassistant/components/input_text/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Unos teksta" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ca.json b/homeassistant/components/input_text/.translations/ca.json new file mode 100644 index 000000000000..2648fa7e910c --- /dev/null +++ b/homeassistant/components/input_text/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de text" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/cs.json b/homeassistant/components/input_text/.translations/cs.json new file mode 100644 index 000000000000..a0e09f9fe847 --- /dev/null +++ b/homeassistant/components/input_text/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Zad\u00e1n\u00ed textu" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/cy.json b/homeassistant/components/input_text/.translations/cy.json new file mode 100644 index 000000000000..fedd3397d0e8 --- /dev/null +++ b/homeassistant/components/input_text/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Mewnbynnu testun" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/da.json b/homeassistant/components/input_text/.translations/da.json new file mode 100644 index 000000000000..c0f3910152c5 --- /dev/null +++ b/homeassistant/components/input_text/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Indtast tekst" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/de.json b/homeassistant/components/input_text/.translations/de.json new file mode 100644 index 000000000000..b9c5f81e9b79 --- /dev/null +++ b/homeassistant/components/input_text/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Texteingabe" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/el.json b/homeassistant/components/input_text/.translations/el.json new file mode 100644 index 000000000000..f657840f1cb6 --- /dev/null +++ b/homeassistant/components/input_text/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/en.json b/homeassistant/components/input_text/.translations/en.json new file mode 100644 index 000000000000..dea91ea03a7b --- /dev/null +++ b/homeassistant/components/input_text/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Input text" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/es-419.json b/homeassistant/components/input_text/.translations/es-419.json new file mode 100644 index 000000000000..a44a36a38e7d --- /dev/null +++ b/homeassistant/components/input_text/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Texto de entrada" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/es.json b/homeassistant/components/input_text/.translations/es.json new file mode 100644 index 000000000000..1b39d8546657 --- /dev/null +++ b/homeassistant/components/input_text/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de texto" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/et.json b/homeassistant/components/input_text/.translations/et.json new file mode 100644 index 000000000000..047874d63284 --- /dev/null +++ b/homeassistant/components/input_text/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Teksti sisestamine" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/eu.json b/homeassistant/components/input_text/.translations/eu.json new file mode 100644 index 000000000000..0e3313951858 --- /dev/null +++ b/homeassistant/components/input_text/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Testu sarrera" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/fi.json b/homeassistant/components/input_text/.translations/fi.json new file mode 100644 index 000000000000..6c530bc7e54c --- /dev/null +++ b/homeassistant/components/input_text/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Sy\u00f6t\u00e4 teksti" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/fr.json b/homeassistant/components/input_text/.translations/fr.json new file mode 100644 index 000000000000..5ba2ca12a768 --- /dev/null +++ b/homeassistant/components/input_text/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Saisie de texte" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/he.json b/homeassistant/components/input_text/.translations/he.json new file mode 100644 index 000000000000..31c429c04bb1 --- /dev/null +++ b/homeassistant/components/input_text/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05dc\u05d8 \u05d8\u05e7\u05e1\u05d8" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/hi.json b/homeassistant/components/input_text/.translations/hi.json new file mode 100644 index 000000000000..66ad4c1e7ce4 --- /dev/null +++ b/homeassistant/components/input_text/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0907\u0928\u092a\u0941\u091f \u091f\u0947\u0915\u094d\u0938\u094d\u091f" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/hr.json b/homeassistant/components/input_text/.translations/hr.json new file mode 100644 index 000000000000..1883aae18b27 --- /dev/null +++ b/homeassistant/components/input_text/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Unesite tekst" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/hu.json b/homeassistant/components/input_text/.translations/hu.json new file mode 100644 index 000000000000..e49706939492 --- /dev/null +++ b/homeassistant/components/input_text/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Sz\u00f6veg bemenet" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/hy.json b/homeassistant/components/input_text/.translations/hy.json new file mode 100644 index 000000000000..a729614ea9f1 --- /dev/null +++ b/homeassistant/components/input_text/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0578\u0582\u057f\u0584\u0561\u0563\u0580\u0565\u0584 \u057f\u0565\u0584\u057d\u057f\u0568" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/id.json b/homeassistant/components/input_text/.translations/id.json new file mode 100644 index 000000000000..8f8d4e036e4e --- /dev/null +++ b/homeassistant/components/input_text/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Input teks" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/is.json b/homeassistant/components/input_text/.translations/is.json new file mode 100644 index 000000000000..31b0f430193d --- /dev/null +++ b/homeassistant/components/input_text/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Innsl\u00e1ttartexti" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/it.json b/homeassistant/components/input_text/.translations/it.json new file mode 100644 index 000000000000..e2795fdc36f7 --- /dev/null +++ b/homeassistant/components/input_text/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Input di testo" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ko.json b/homeassistant/components/input_text/.translations/ko.json new file mode 100644 index 000000000000..6f8e3a04f2a8 --- /dev/null +++ b/homeassistant/components/input_text/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\ubb38\uc790\uc785\ub825" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/lb.json b/homeassistant/components/input_text/.translations/lb.json new file mode 100644 index 000000000000..713f325e404d --- /dev/null +++ b/homeassistant/components/input_text/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Text-Agab" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/lv.json b/homeassistant/components/input_text/.translations/lv.json new file mode 100644 index 000000000000..e35d69312320 --- /dev/null +++ b/homeassistant/components/input_text/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Ievades teksts" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/nb.json b/homeassistant/components/input_text/.translations/nb.json new file mode 100644 index 000000000000..a643fa15fdaa --- /dev/null +++ b/homeassistant/components/input_text/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Angi tekst" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/nl.json b/homeassistant/components/input_text/.translations/nl.json new file mode 100644 index 000000000000..13826884fa0a --- /dev/null +++ b/homeassistant/components/input_text/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Tekstinvoer" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/nn.json b/homeassistant/components/input_text/.translations/nn.json new file mode 100644 index 000000000000..fec4d20c3393 --- /dev/null +++ b/homeassistant/components/input_text/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Angje tekst" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/pl.json b/homeassistant/components/input_text/.translations/pl.json new file mode 100644 index 000000000000..5a08514f41c8 --- /dev/null +++ b/homeassistant/components/input_text/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pole tekstowe" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/pt-BR.json b/homeassistant/components/input_text/.translations/pt-BR.json new file mode 100644 index 000000000000..1b39d8546657 --- /dev/null +++ b/homeassistant/components/input_text/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Entrada de texto" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/pt.json b/homeassistant/components/input_text/.translations/pt.json new file mode 100644 index 000000000000..d4f0554e6533 --- /dev/null +++ b/homeassistant/components/input_text/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Introduzir texto" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ro.json b/homeassistant/components/input_text/.translations/ro.json new file mode 100644 index 000000000000..e5fc063ceda8 --- /dev/null +++ b/homeassistant/components/input_text/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Introduceti un text" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ru.json b/homeassistant/components/input_text/.translations/ru.json new file mode 100644 index 000000000000..87a2a7629be7 --- /dev/null +++ b/homeassistant/components/input_text/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0422\u0435\u043a\u0441\u0442" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/sk.json b/homeassistant/components/input_text/.translations/sk.json new file mode 100644 index 000000000000..3799a441e412 --- /dev/null +++ b/homeassistant/components/input_text/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Vstupn\u00fd text" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/sl.json b/homeassistant/components/input_text/.translations/sl.json new file mode 100644 index 000000000000..c0954d42ea5c --- /dev/null +++ b/homeassistant/components/input_text/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Vnesite besedilo" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/sv.json b/homeassistant/components/input_text/.translations/sv.json new file mode 100644 index 000000000000..d93e6d626278 --- /dev/null +++ b/homeassistant/components/input_text/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Mata in text" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/ta.json b/homeassistant/components/input_text/.translations/ta.json new file mode 100644 index 000000000000..6a7d984a3e26 --- /dev/null +++ b/homeassistant/components/input_text/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b89\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bc1" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/te.json b/homeassistant/components/input_text/.translations/te.json new file mode 100644 index 000000000000..b2e6fe41a41f --- /dev/null +++ b/homeassistant/components/input_text/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c07\u0c28\u0c4d\u0c2a\u0c41\u0c1f\u0c4d \u0c1f\u0c46\u0c15\u0c4d\u0c38\u0c4d\u0c1f\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/th.json b/homeassistant/components/input_text/.translations/th.json new file mode 100644 index 000000000000..943e1247709d --- /dev/null +++ b/homeassistant/components/input_text/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1b\u0e49\u0e2d\u0e19\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/tr.json b/homeassistant/components/input_text/.translations/tr.json new file mode 100644 index 000000000000..378d9d5ad3b9 --- /dev/null +++ b/homeassistant/components/input_text/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Metin giriniz" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/uk.json b/homeassistant/components/input_text/.translations/uk.json new file mode 100644 index 000000000000..a80f4325203e --- /dev/null +++ b/homeassistant/components/input_text/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u0442\u0435\u043a\u0441\u0442\u0443" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/vi.json b/homeassistant/components/input_text/.translations/vi.json new file mode 100644 index 000000000000..d23f7f1eaf9c --- /dev/null +++ b/homeassistant/components/input_text/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110\u1ea7u v\u00e0o k\u00fd t\u1ef1" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/zh-Hans.json b/homeassistant/components/input_text/.translations/zh-Hans.json new file mode 100644 index 000000000000..fb1c570b7f65 --- /dev/null +++ b/homeassistant/components/input_text/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u6587\u5b57\u8f93\u5165" +} \ No newline at end of file diff --git a/homeassistant/components/input_text/.translations/zh-Hant.json b/homeassistant/components/input_text/.translations/zh-Hant.json new file mode 100644 index 000000000000..2d8af029612c --- /dev/null +++ b/homeassistant/components/input_text/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8f38\u5165\u6846" +} \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/bg.json b/homeassistant/components/ios/.translations/bg.json index c3cf8fd8df6f..69e1523ac1f1 100644 --- a/homeassistant/components/ios/.translations/bg.json +++ b/homeassistant/components/ios/.translations/bg.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ca.json b/homeassistant/components/ios/.translations/ca.json index 01ab34b1e22f..3f16dbc2204d 100644 --- a/homeassistant/components/ios/.translations/ca.json +++ b/homeassistant/components/ios/.translations/ca.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/cs.json b/homeassistant/components/ios/.translations/cs.json index 6be48c3a2e20..afb0307492d6 100644 --- a/homeassistant/components/ios/.translations/cs.json +++ b/homeassistant/components/ios/.translations/cs.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/da.json b/homeassistant/components/ios/.translations/da.json index 07f90ed2d0ad..37db62d12057 100644 --- a/homeassistant/components/ios/.translations/da.json +++ b/homeassistant/components/ios/.translations/da.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/de.json b/homeassistant/components/ios/.translations/de.json index bf6331c72b71..337ed3ad7c02 100644 --- a/homeassistant/components/ios/.translations/de.json +++ b/homeassistant/components/ios/.translations/de.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/en.json b/homeassistant/components/ios/.translations/en.json index bad6552e178e..6352142e7177 100644 --- a/homeassistant/components/ios/.translations/en.json +++ b/homeassistant/components/ios/.translations/en.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/es-419.json b/homeassistant/components/ios/.translations/es-419.json index 5cae304942a8..5938e27930e3 100644 --- a/homeassistant/components/ios/.translations/es-419.json +++ b/homeassistant/components/ios/.translations/es-419.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/es.json b/homeassistant/components/ios/.translations/es.json index 9bc3db4e6f5c..9e94d536718e 100644 --- a/homeassistant/components/ios/.translations/es.json +++ b/homeassistant/components/ios/.translations/es.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/et.json b/homeassistant/components/ios/.translations/et.json index a98a23c7f0bd..0e652624ef61 100644 --- a/homeassistant/components/ios/.translations/et.json +++ b/homeassistant/components/ios/.translations/et.json @@ -5,6 +5,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/fr.json b/homeassistant/components/ios/.translations/fr.json index da52ef752b38..02fb127e3639 100644 --- a/homeassistant/components/ios/.translations/fr.json +++ b/homeassistant/components/ios/.translations/fr.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/he.json b/homeassistant/components/ios/.translations/he.json index bda9013f6540..fd0c5c7c470e 100644 --- a/homeassistant/components/ios/.translations/he.json +++ b/homeassistant/components/ios/.translations/he.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/hu.json b/homeassistant/components/ios/.translations/hu.json index 3cd84f50b706..77bbc56e3929 100644 --- a/homeassistant/components/ios/.translations/hu.json +++ b/homeassistant/components/ios/.translations/hu.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/id.json b/homeassistant/components/ios/.translations/id.json index 88d01439dc49..1c69ea0a48af 100644 --- a/homeassistant/components/ios/.translations/id.json +++ b/homeassistant/components/ios/.translations/id.json @@ -9,6 +9,5 @@ "title": "Home Asisten iOS" } } - }, - "title": "Home Asisten iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/it.json b/homeassistant/components/ios/.translations/it.json index a1905d3d87a1..e41382ea62e3 100644 --- a/homeassistant/components/ios/.translations/it.json +++ b/homeassistant/components/ios/.translations/it.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant per iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ko.json b/homeassistant/components/ios/.translations/ko.json index 4ae14e28add9..36c18ea34fe6 100644 --- a/homeassistant/components/ios/.translations/ko.json +++ b/homeassistant/components/ios/.translations/ko.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/lb.json b/homeassistant/components/ios/.translations/lb.json index 09303c4d9526..bb6ec7b9f8ad 100644 --- a/homeassistant/components/ios/.translations/lb.json +++ b/homeassistant/components/ios/.translations/lb.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/nl.json b/homeassistant/components/ios/.translations/nl.json index dc7036f8e26a..34050865768d 100644 --- a/homeassistant/components/ios/.translations/nl.json +++ b/homeassistant/components/ios/.translations/nl.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/nn.json b/homeassistant/components/ios/.translations/nn.json index 264b3be1679d..2fc5a3f1c52d 100644 --- a/homeassistant/components/ios/.translations/nn.json +++ b/homeassistant/components/ios/.translations/nn.json @@ -9,6 +9,5 @@ "title": "Home Assistant Ios" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/no.json b/homeassistant/components/ios/.translations/no.json index 5184c27d59bc..5645bd91e2ab 100644 --- a/homeassistant/components/ios/.translations/no.json +++ b/homeassistant/components/ios/.translations/no.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pl.json b/homeassistant/components/ios/.translations/pl.json index 25c8bc48dc59..58b02fe8cad6 100644 --- a/homeassistant/components/ios/.translations/pl.json +++ b/homeassistant/components/ios/.translations/pl.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pt-BR.json b/homeassistant/components/ios/.translations/pt-BR.json index 5a8f41fce6e7..8eee79de746d 100644 --- a/homeassistant/components/ios/.translations/pt-BR.json +++ b/homeassistant/components/ios/.translations/pt-BR.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/pt.json b/homeassistant/components/ios/.translations/pt.json index a9e779c8aad0..52a1a66ba321 100644 --- a/homeassistant/components/ios/.translations/pt.json +++ b/homeassistant/components/ios/.translations/pt.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ro.json b/homeassistant/components/ios/.translations/ro.json index 4de52c75d2f2..b4b13d3955a9 100644 --- a/homeassistant/components/ios/.translations/ro.json +++ b/homeassistant/components/ios/.translations/ro.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/ru.json b/homeassistant/components/ios/.translations/ru.json index 455fcf2d4a31..d19343acc892 100644 --- a/homeassistant/components/ios/.translations/ru.json +++ b/homeassistant/components/ios/.translations/ru.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/sl.json b/homeassistant/components/ios/.translations/sl.json index 46409ea5c961..e0958432a6e9 100644 --- a/homeassistant/components/ios/.translations/sl.json +++ b/homeassistant/components/ios/.translations/sl.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/sv.json b/homeassistant/components/ios/.translations/sv.json index ec982acc0716..03d91e021931 100644 --- a/homeassistant/components/ios/.translations/sv.json +++ b/homeassistant/components/ios/.translations/sv.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/zh-Hans.json b/homeassistant/components/ios/.translations/zh-Hans.json index a02d1d713e20..8e659dbadc17 100644 --- a/homeassistant/components/ios/.translations/zh-Hans.json +++ b/homeassistant/components/ios/.translations/zh-Hans.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ios/.translations/zh-Hant.json b/homeassistant/components/ios/.translations/zh-Hant.json index ba64432f93a0..ba85332cb7fb 100644 --- a/homeassistant/components/ios/.translations/zh-Hant.json +++ b/homeassistant/components/ios/.translations/zh-Hant.json @@ -9,6 +9,5 @@ "title": "Home Assistant iOS" } } - }, - "title": "Home Assistant iOS" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/bg.json b/homeassistant/components/ipma/.translations/bg.json index 99849ee93260..fcabe7be75c6 100644 --- a/homeassistant/components/ipma/.translations/bg.json +++ b/homeassistant/components/ipma/.translations/bg.json @@ -14,6 +14,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ca.json b/homeassistant/components/ipma/.translations/ca.json index 9f36352003f6..2318a5eba054 100644 --- a/homeassistant/components/ipma/.translations/ca.json +++ b/homeassistant/components/ipma/.translations/ca.json @@ -15,6 +15,5 @@ "title": "Ubicaci\u00f3" } } - }, - "title": "Servei meteorol\u00f2gic portugu\u00e8s (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/da.json b/homeassistant/components/ipma/.translations/da.json index acaef8e38849..dca37f617823 100644 --- a/homeassistant/components/ipma/.translations/da.json +++ b/homeassistant/components/ipma/.translations/da.json @@ -15,6 +15,5 @@ "title": "Lokalitet" } } - }, - "title": "Portugisisk vejrservice (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/de.json b/homeassistant/components/ipma/.translations/de.json index d9d485abb109..62e2e1e59c5c 100644 --- a/homeassistant/components/ipma/.translations/de.json +++ b/homeassistant/components/ipma/.translations/de.json @@ -15,6 +15,5 @@ "title": "Standort" } } - }, - "title": "Portugiesischer Wetterdienst (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/en.json b/homeassistant/components/ipma/.translations/en.json index a527f2efaeb0..823bf9ab93b7 100644 --- a/homeassistant/components/ipma/.translations/en.json +++ b/homeassistant/components/ipma/.translations/en.json @@ -15,6 +15,5 @@ "title": "Location" } } - }, - "title": "Portuguese weather service (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/es-419.json b/homeassistant/components/ipma/.translations/es-419.json index ae4158bbc3a8..7b319c66a49a 100644 --- a/homeassistant/components/ipma/.translations/es-419.json +++ b/homeassistant/components/ipma/.translations/es-419.json @@ -14,6 +14,5 @@ "title": "Ubicaci\u00f3n" } } - }, - "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/es.json b/homeassistant/components/ipma/.translations/es.json index 805a3eccd2c8..a3f83c150e70 100644 --- a/homeassistant/components/ipma/.translations/es.json +++ b/homeassistant/components/ipma/.translations/es.json @@ -15,6 +15,5 @@ "title": "Ubicaci\u00f3n" } } - }, - "title": "Servicio meteorol\u00f3gico portugu\u00e9s (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/fr.json b/homeassistant/components/ipma/.translations/fr.json index 5ade982afb51..9a3a11a7a739 100644 --- a/homeassistant/components/ipma/.translations/fr.json +++ b/homeassistant/components/ipma/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Emplacement" } } - }, - "title": "Service m\u00e9t\u00e9orologique portugais (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/he.json b/homeassistant/components/ipma/.translations/he.json index 301a83c5e21e..c4818393edd8 100644 --- a/homeassistant/components/ipma/.translations/he.json +++ b/homeassistant/components/ipma/.translations/he.json @@ -13,6 +13,5 @@ "title": "\u05de\u05d9\u05e7\u05d5\u05dd" } } - }, - "title": "\u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05d6\u05d2 \u05d0\u05d5\u05d5\u05d9\u05e8 \u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05d6\u05d9\u05ea (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/hu.json b/homeassistant/components/ipma/.translations/hu.json index ef01256607e7..0aeb36b04427 100644 --- a/homeassistant/components/ipma/.translations/hu.json +++ b/homeassistant/components/ipma/.translations/hu.json @@ -15,6 +15,5 @@ "title": "Hely" } } - }, - "title": "Portug\u00e1l Meteorol\u00f3giai Szolg\u00e1lat (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/it.json b/homeassistant/components/ipma/.translations/it.json index 04600d8dd8e7..5ab6af8d2183 100644 --- a/homeassistant/components/ipma/.translations/it.json +++ b/homeassistant/components/ipma/.translations/it.json @@ -15,6 +15,5 @@ "title": "Localit\u00e0" } } - }, - "title": "Servizio meteo portoghese (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ko.json b/homeassistant/components/ipma/.translations/ko.json index 009048775fe4..3fd1a8d8ea9e 100644 --- a/homeassistant/components/ipma/.translations/ko.json +++ b/homeassistant/components/ipma/.translations/ko.json @@ -15,6 +15,5 @@ "title": "\uc704\uce58" } } - }, - "title": "\ud3ec\ub974\ud22c\uac08 \uae30\uc0c1 \uc11c\ube44\uc2a4 (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/lb.json b/homeassistant/components/ipma/.translations/lb.json index a45b07808565..e4896df58ba8 100644 --- a/homeassistant/components/ipma/.translations/lb.json +++ b/homeassistant/components/ipma/.translations/lb.json @@ -15,6 +15,5 @@ "title": "Uertschaft" } } - }, - "title": "Portugisesche Wieder D\u00e9ngscht (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/nl.json b/homeassistant/components/ipma/.translations/nl.json index 9b2bebe4d0d3..79248e0d064e 100644 --- a/homeassistant/components/ipma/.translations/nl.json +++ b/homeassistant/components/ipma/.translations/nl.json @@ -15,6 +15,5 @@ "title": "Locatie" } } - }, - "title": "Portugese weerservice (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/no.json b/homeassistant/components/ipma/.translations/no.json index 5c1e3fbf820a..4e4cdebeec61 100644 --- a/homeassistant/components/ipma/.translations/no.json +++ b/homeassistant/components/ipma/.translations/no.json @@ -15,6 +15,5 @@ "title": "Plassering" } } - }, - "title": "Portugisisk v\u00e6rtjeneste (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pl.json b/homeassistant/components/ipma/.translations/pl.json index 410585d02dc7..f87f915c2472 100644 --- a/homeassistant/components/ipma/.translations/pl.json +++ b/homeassistant/components/ipma/.translations/pl.json @@ -15,6 +15,5 @@ "title": "Lokalizacja" } } - }, - "title": "Portugalski serwis pogodowy (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pt-BR.json b/homeassistant/components/ipma/.translations/pt-BR.json index c780f92dcdf2..4a0d8e0b01bf 100644 --- a/homeassistant/components/ipma/.translations/pt-BR.json +++ b/homeassistant/components/ipma/.translations/pt-BR.json @@ -14,6 +14,5 @@ "title": "Localiza\u00e7\u00e3o" } } - }, - "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/pt.json b/homeassistant/components/ipma/.translations/pt.json index fead941a76d2..2e67da762412 100644 --- a/homeassistant/components/ipma/.translations/pt.json +++ b/homeassistant/components/ipma/.translations/pt.json @@ -14,6 +14,5 @@ "title": "Localiza\u00e7\u00e3o" } } - }, - "title": "Servi\u00e7o Meteorol\u00f3gico Portugu\u00eas (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/ru.json b/homeassistant/components/ipma/.translations/ru.json index 84b1c6f383a9..b9e98886e639 100644 --- a/homeassistant/components/ipma/.translations/ru.json +++ b/homeassistant/components/ipma/.translations/ru.json @@ -15,6 +15,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u0438 (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/sl.json b/homeassistant/components/ipma/.translations/sl.json index 14b67fda8a29..d42b858157b4 100644 --- a/homeassistant/components/ipma/.translations/sl.json +++ b/homeassistant/components/ipma/.translations/sl.json @@ -15,6 +15,5 @@ "title": "Lokacija" } } - }, - "title": "Portugalska vremenska storitev (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/sv.json b/homeassistant/components/ipma/.translations/sv.json index 51b5cefd7f1f..1606c8cb5edc 100644 --- a/homeassistant/components/ipma/.translations/sv.json +++ b/homeassistant/components/ipma/.translations/sv.json @@ -15,6 +15,5 @@ "title": "Location" } } - }, - "title": "Portugisiska weather service (IPMA)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/zh-Hans.json b/homeassistant/components/ipma/.translations/zh-Hans.json index e65c05ab90fe..7e0da1fb8447 100644 --- a/homeassistant/components/ipma/.translations/zh-Hans.json +++ b/homeassistant/components/ipma/.translations/zh-Hans.json @@ -15,6 +15,5 @@ "title": "\u4f4d\u7f6e" } } - }, - "title": "\u8461\u8404\u7259\u6c14\u8c61\u670d\u52a1\uff08IPMA\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/ipma/.translations/zh-Hant.json b/homeassistant/components/ipma/.translations/zh-Hant.json index ec51c7bcaa0d..a3d084ddaa3e 100644 --- a/homeassistant/components/ipma/.translations/zh-Hant.json +++ b/homeassistant/components/ipma/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "\u5ea7\u6a19" } } - }, - "title": "\u8461\u8404\u7259\u6c23\u8c61\u670d\u52d9\uff08IPMA\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ca.json b/homeassistant/components/ipp/.translations/ca.json index e517f81ce5d9..8ed12b70d6ad 100644 --- a/homeassistant/components/ipp/.translations/ca.json +++ b/homeassistant/components/ipp/.translations/ca.json @@ -4,6 +4,8 @@ "already_configured": "Aquesta impressora ja est\u00e0 configurada.", "connection_error": "No s'ha pogut connectar amb la impressora.", "connection_upgrade": "No s'ha pogut connectar amb la impressora, es necessita actualitzar la connexi\u00f3.", + "ipp_error": "S'ha produ\u00eft un error IPP.", + "ipp_version_error": "La versi\u00f3 IPP no \u00e9s compatible amb la impressora.", "parse_error": "No s'ha pogut analitzar la resposta de la impressora." }, "error": { @@ -28,6 +30,5 @@ "title": "Impressora descoberta" } } - }, - "title": "Protocol d'impressi\u00f3 per Internet (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/da.json b/homeassistant/components/ipp/.translations/da.json index f3447565c0a6..19ad3f2eedf2 100644 --- a/homeassistant/components/ipp/.translations/da.json +++ b/homeassistant/components/ipp/.translations/da.json @@ -27,6 +27,5 @@ "title": "Fandt printer" } } - }, - "title": "Internet Printing Protocol (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/de.json b/homeassistant/components/ipp/.translations/de.json index dabbca15fdd7..4040275d895d 100644 --- a/homeassistant/components/ipp/.translations/de.json +++ b/homeassistant/components/ipp/.translations/de.json @@ -28,6 +28,5 @@ "title": "Entdeckter Drucker" } } - }, - "title": "Internet-Druckprotokoll (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/en.json b/homeassistant/components/ipp/.translations/en.json index 6742038830c6..7fe5132ed64c 100644 --- a/homeassistant/components/ipp/.translations/en.json +++ b/homeassistant/components/ipp/.translations/en.json @@ -30,6 +30,5 @@ "title": "Discovered printer" } } - }, - "title": "Internet Printing Protocol (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/es.json b/homeassistant/components/ipp/.translations/es.json index c4f01461d6e1..c56083bbf61b 100644 --- a/homeassistant/components/ipp/.translations/es.json +++ b/homeassistant/components/ipp/.translations/es.json @@ -28,6 +28,5 @@ "title": "Impresora encontrada" } } - }, - "title": "Protocolo de Impresi\u00f3n de Internet (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/it.json b/homeassistant/components/ipp/.translations/it.json index 9d8f6a8716f3..d2f53fec24ba 100644 --- a/homeassistant/components/ipp/.translations/it.json +++ b/homeassistant/components/ipp/.translations/it.json @@ -30,6 +30,5 @@ "title": "Stampante rilevata" } } - }, - "title": "Protocollo IPP (Internet Printing Protocol)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ko.json b/homeassistant/components/ipp/.translations/ko.json index 7cdb01eef90b..2f4b9a1171c0 100644 --- a/homeassistant/components/ipp/.translations/ko.json +++ b/homeassistant/components/ipp/.translations/ko.json @@ -27,6 +27,5 @@ "title": "\ubc1c\uacac\ub41c \ud504\ub9b0\ud130" } } - }, - "title": "\uc778\ud130\ub137 \uc778\uc1c4 \ud504\ub85c\ud1a0\ucf5c (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/lb.json b/homeassistant/components/ipp/.translations/lb.json index b7ce182dea14..c331b9c7e220 100644 --- a/homeassistant/components/ipp/.translations/lb.json +++ b/homeassistant/components/ipp/.translations/lb.json @@ -28,6 +28,5 @@ "title": "Entdeckte Printer" } } - }, - "title": "Internet Printing Protocol (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/no.json b/homeassistant/components/ipp/.translations/no.json index ea43c2eca2fb..2d4fe3e64b4c 100644 --- a/homeassistant/components/ipp/.translations/no.json +++ b/homeassistant/components/ipp/.translations/no.json @@ -5,7 +5,8 @@ "connection_error": "Klarte ikke \u00e5 koble til skriveren.", "connection_upgrade": "Kunne ikke koble til skriveren fordi tilkoblingsoppgradering var n\u00f8dvendig.", "ipp_error": "Oppdaget IPP-feil.", - "ipp_version_error": "IPP-versjon st\u00f8ttes ikke av skriveren." + "ipp_version_error": "IPP-versjon st\u00f8ttes ikke av skriveren.", + "parse_error": "Kan ikke analysere svar fra skriveren." }, "error": { "connection_error": "Klarte ikke \u00e5 koble til skriveren.", @@ -29,6 +30,5 @@ "title": "Oppdaget skriver" } } - }, - "title": "Internet Printing Protocol (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/pt.json b/homeassistant/components/ipp/.translations/pt.json new file mode 100644 index 000000000000..742dd8621ec2 --- /dev/null +++ b/homeassistant/components/ipp/.translations/pt.json @@ -0,0 +1,8 @@ +{ + "config": { + "abort": { + "ipp_error": "Erro IPP encontrado.", + "ipp_version_error": "Vers\u00e3o IPP n\u00e3o suportada pela impressora." + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/ru.json b/homeassistant/components/ipp/.translations/ru.json index 32275bfbfbc1..5a8c6068769f 100644 --- a/homeassistant/components/ipp/.translations/ru.json +++ b/homeassistant/components/ipp/.translations/ru.json @@ -30,6 +30,5 @@ "title": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0442\u0435\u0440" } } - }, - "title": "Internet Printing Protocol (IPP)" + } } \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/sl.json b/homeassistant/components/ipp/.translations/sl.json new file mode 100644 index 000000000000..8141aa276bdd --- /dev/null +++ b/homeassistant/components/ipp/.translations/sl.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Ta tiskalnik je \u017ee konfiguriran.", + "connection_error": "Povezava s tiskalnikom ni uspela.", + "connection_upgrade": "Povezava s tiskalnikom ni uspela, ker je potrebna nadgradnja povezave.", + "ipp_error": "Naletel na napako IPP.", + "ipp_version_error": "Razli\u010dica IPP ni podprta s tiskalnikom.", + "parse_error": "Odziva tiskalnika ni bilo mogo\u010de raz\u010dleniti." + }, + "error": { + "connection_error": "Povezava s tiskalnikom ni uspela.", + "connection_upgrade": "Povezave s tiskalnikom ni bilo mogo\u010de vzpostaviti. Prosimo, poskusite znova z odkljukano mo\u017enostjo SSL/TLS." + }, + "flow_title": "Tiskalnik: {name}", + "step": { + "user": { + "data": { + "base_path": "Relativna pot do tiskalnika", + "host": "Gostitelj ali IP naslov", + "port": "Vrata", + "ssl": "Tiskalnik podpira komunikacijo prek SSL/TLS", + "verify_ssl": "Tiskalnik uporablja pravilno SSL potrdilo" + }, + "description": "Tiskalnik nastavite s protokolom za internetni tiskanje (IPP) tako, da se bo integriral s programom Home Assistant.", + "title": "Pove\u017eite svoj tiskalnik" + }, + "zeroconf_confirm": { + "description": "Ali \u017eelite tiskalnik z imenom {name} dodati v Home Assistant?", + "title": "Odkrit tiskalnik" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ipp/.translations/zh-Hant.json b/homeassistant/components/ipp/.translations/zh-Hant.json index b484370a1607..68cda398da26 100644 --- a/homeassistant/components/ipp/.translations/zh-Hant.json +++ b/homeassistant/components/ipp/.translations/zh-Hant.json @@ -30,6 +30,5 @@ "title": "\u81ea\u52d5\u641c\u7d22\u5230\u7684\u5370\u8868\u6a5f" } } - }, - "title": "\u7db2\u969b\u7db2\u8def\u5217\u5370\u5354\u5b9a\uff08IPP\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/bg.json b/homeassistant/components/iqvia/.translations/bg.json index 72224eead481..8a233f30fffb 100644 --- a/homeassistant/components/iqvia/.translations/bg.json +++ b/homeassistant/components/iqvia/.translations/bg.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ca.json b/homeassistant/components/iqvia/.translations/ca.json index 5cb035dc6223..cf75f845ef18 100644 --- a/homeassistant/components/iqvia/.translations/ca.json +++ b/homeassistant/components/iqvia/.translations/ca.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/da.json b/homeassistant/components/iqvia/.translations/da.json index 25104165f571..ee478a67dd54 100644 --- a/homeassistant/components/iqvia/.translations/da.json +++ b/homeassistant/components/iqvia/.translations/da.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/de.json b/homeassistant/components/iqvia/.translations/de.json index 893cf5408129..c42f9092d9ea 100644 --- a/homeassistant/components/iqvia/.translations/de.json +++ b/homeassistant/components/iqvia/.translations/de.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/en.json b/homeassistant/components/iqvia/.translations/en.json index f85226ef50ed..63ffc145594c 100644 --- a/homeassistant/components/iqvia/.translations/en.json +++ b/homeassistant/components/iqvia/.translations/en.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/es.json b/homeassistant/components/iqvia/.translations/es.json index 1ba0877993d9..0fbc0ecceb09 100644 --- a/homeassistant/components/iqvia/.translations/es.json +++ b/homeassistant/components/iqvia/.translations/es.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/fr.json b/homeassistant/components/iqvia/.translations/fr.json index 45493bd79a05..c5b8d0cbd814 100644 --- a/homeassistant/components/iqvia/.translations/fr.json +++ b/homeassistant/components/iqvia/.translations/fr.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/it.json b/homeassistant/components/iqvia/.translations/it.json index c5640be83a91..85de80b5c97f 100644 --- a/homeassistant/components/iqvia/.translations/it.json +++ b/homeassistant/components/iqvia/.translations/it.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ko.json b/homeassistant/components/iqvia/.translations/ko.json index c6020fa1d800..6b7a63d102ba 100644 --- a/homeassistant/components/iqvia/.translations/ko.json +++ b/homeassistant/components/iqvia/.translations/ko.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/lb.json b/homeassistant/components/iqvia/.translations/lb.json index 7caf8d483ca7..5a1f257f8f9c 100644 --- a/homeassistant/components/iqvia/.translations/lb.json +++ b/homeassistant/components/iqvia/.translations/lb.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/nl.json b/homeassistant/components/iqvia/.translations/nl.json index 3319539b7664..a8e1ff5fa7d6 100644 --- a/homeassistant/components/iqvia/.translations/nl.json +++ b/homeassistant/components/iqvia/.translations/nl.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/nn.json b/homeassistant/components/iqvia/.translations/nn.json index b1d656dc4d29..edbbd37f82a6 100644 --- a/homeassistant/components/iqvia/.translations/nn.json +++ b/homeassistant/components/iqvia/.translations/nn.json @@ -5,6 +5,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/no.json b/homeassistant/components/iqvia/.translations/no.json index 3c30d0f35210..37fb766ee36e 100644 --- a/homeassistant/components/iqvia/.translations/no.json +++ b/homeassistant/components/iqvia/.translations/no.json @@ -13,6 +13,5 @@ "title": "" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/pl.json b/homeassistant/components/iqvia/.translations/pl.json index 8d19882bb709..38e10460ae95 100644 --- a/homeassistant/components/iqvia/.translations/pl.json +++ b/homeassistant/components/iqvia/.translations/pl.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/pt-BR.json b/homeassistant/components/iqvia/.translations/pt-BR.json index 0abdd92f841d..3247c162e7bb 100644 --- a/homeassistant/components/iqvia/.translations/pt-BR.json +++ b/homeassistant/components/iqvia/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/ru.json b/homeassistant/components/iqvia/.translations/ru.json index db42824b4555..69b1bd3745e0 100644 --- a/homeassistant/components/iqvia/.translations/ru.json +++ b/homeassistant/components/iqvia/.translations/ru.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/sl.json b/homeassistant/components/iqvia/.translations/sl.json index bde3e2099af7..69297d6aef9a 100644 --- a/homeassistant/components/iqvia/.translations/sl.json +++ b/homeassistant/components/iqvia/.translations/sl.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/sv.json b/homeassistant/components/iqvia/.translations/sv.json index 940fb127c542..3e47ca925dbf 100644 --- a/homeassistant/components/iqvia/.translations/sv.json +++ b/homeassistant/components/iqvia/.translations/sv.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/zh-Hans.json b/homeassistant/components/iqvia/.translations/zh-Hans.json index 7cef08a0e507..066fae277b1c 100644 --- a/homeassistant/components/iqvia/.translations/zh-Hans.json +++ b/homeassistant/components/iqvia/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/iqvia/.translations/zh-Hant.json b/homeassistant/components/iqvia/.translations/zh-Hant.json index b1551bf364ec..035b952d20b0 100644 --- a/homeassistant/components/iqvia/.translations/zh-Hant.json +++ b/homeassistant/components/iqvia/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "IQVIA" } } - }, - "title": "IQVIA" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/bg.json b/homeassistant/components/izone/.translations/bg.json index cb0dedc6d20c..2aed0f309b4b 100644 --- a/homeassistant/components/izone/.translations/bg.json +++ b/homeassistant/components/izone/.translations/bg.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ca.json b/homeassistant/components/izone/.translations/ca.json index ffe751bd02c3..016e0fb070e5 100644 --- a/homeassistant/components/izone/.translations/ca.json +++ b/homeassistant/components/izone/.translations/ca.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/da.json b/homeassistant/components/izone/.translations/da.json index 9b0e0a819953..6c08029d9e03 100644 --- a/homeassistant/components/izone/.translations/da.json +++ b/homeassistant/components/izone/.translations/da.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/de.json b/homeassistant/components/izone/.translations/de.json index 82de0a6bfea1..470324136070 100644 --- a/homeassistant/components/izone/.translations/de.json +++ b/homeassistant/components/izone/.translations/de.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/en.json b/homeassistant/components/izone/.translations/en.json index 2643e53db4cc..7c9b7008f243 100644 --- a/homeassistant/components/izone/.translations/en.json +++ b/homeassistant/components/izone/.translations/en.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/es.json b/homeassistant/components/izone/.translations/es.json index 0bf1271e3945..664cc72d96fe 100644 --- a/homeassistant/components/izone/.translations/es.json +++ b/homeassistant/components/izone/.translations/es.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/fr.json b/homeassistant/components/izone/.translations/fr.json index db4b9649e3cc..9fb3163ae152 100644 --- a/homeassistant/components/izone/.translations/fr.json +++ b/homeassistant/components/izone/.translations/fr.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/hu.json b/homeassistant/components/izone/.translations/hu.json index 2f2efcd6bae1..76b88ebb6b46 100644 --- a/homeassistant/components/izone/.translations/hu.json +++ b/homeassistant/components/izone/.translations/hu.json @@ -6,6 +6,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/it.json b/homeassistant/components/izone/.translations/it.json index 559d95e05a59..8fd2930e8fff 100644 --- a/homeassistant/components/izone/.translations/it.json +++ b/homeassistant/components/izone/.translations/it.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ko.json b/homeassistant/components/izone/.translations/ko.json index b491faec9ae1..8d8e15d218f2 100644 --- a/homeassistant/components/izone/.translations/ko.json +++ b/homeassistant/components/izone/.translations/ko.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/lb.json b/homeassistant/components/izone/.translations/lb.json index cffa27defc62..5b0576a12eb1 100644 --- a/homeassistant/components/izone/.translations/lb.json +++ b/homeassistant/components/izone/.translations/lb.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/nl.json b/homeassistant/components/izone/.translations/nl.json index b51e0bf55f6d..21dfa2f9ad4d 100644 --- a/homeassistant/components/izone/.translations/nl.json +++ b/homeassistant/components/izone/.translations/nl.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/nn.json b/homeassistant/components/izone/.translations/nn.json index a45936716c83..af7146230d0c 100644 --- a/homeassistant/components/izone/.translations/nn.json +++ b/homeassistant/components/izone/.translations/nn.json @@ -5,6 +5,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/no.json b/homeassistant/components/izone/.translations/no.json index 86ee2099b32a..49c806aa5642 100644 --- a/homeassistant/components/izone/.translations/no.json +++ b/homeassistant/components/izone/.translations/no.json @@ -10,6 +10,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/pl.json b/homeassistant/components/izone/.translations/pl.json index d4543a2ad65f..2d0bcdd32927 100644 --- a/homeassistant/components/izone/.translations/pl.json +++ b/homeassistant/components/izone/.translations/pl.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/ru.json b/homeassistant/components/izone/.translations/ru.json index d06c9b64baa2..41c39c32c685 100644 --- a/homeassistant/components/izone/.translations/ru.json +++ b/homeassistant/components/izone/.translations/ru.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/sl.json b/homeassistant/components/izone/.translations/sl.json index 705d907f5926..2e05823ebe6e 100644 --- a/homeassistant/components/izone/.translations/sl.json +++ b/homeassistant/components/izone/.translations/sl.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/sv.json b/homeassistant/components/izone/.translations/sv.json index 5d52e28104aa..fce7cd709608 100644 --- a/homeassistant/components/izone/.translations/sv.json +++ b/homeassistant/components/izone/.translations/sv.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/izone/.translations/zh-Hant.json b/homeassistant/components/izone/.translations/zh-Hant.json index 21f0c84e1b8c..7f7bb327ea96 100644 --- a/homeassistant/components/izone/.translations/zh-Hant.json +++ b/homeassistant/components/izone/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "iZone" } } - }, - "title": "iZone" + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ca.json b/homeassistant/components/konnected/.translations/ca.json index cfb0880f6b95..afe65f67f627 100644 --- a/homeassistant/components/konnected/.translations/ca.json +++ b/homeassistant/components/konnected/.translations/ca.json @@ -103,8 +103,6 @@ "description": "Selecciona les opcions de sortida per a {zone}: estat {state}", "title": "Configuraci\u00f3 de sortida commutable" } - }, - "title": "Opcions del panell d'alarma Konnected" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/da.json b/homeassistant/components/konnected/.translations/da.json index 16fbdd8099a7..48751d0d8dc7 100644 --- a/homeassistant/components/konnected/.translations/da.json +++ b/homeassistant/components/konnected/.translations/da.json @@ -101,8 +101,6 @@ "description": "V\u00e6lg outputindstillingerne for {zone}", "title": "Konfigurer skifteligt output" } - }, - "title": "Indstillinger for Konnected-alarmpanel" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/de.json b/homeassistant/components/konnected/.translations/de.json index 9266e1347152..36ab7150c1f4 100644 --- a/homeassistant/components/konnected/.translations/de.json +++ b/homeassistant/components/konnected/.translations/de.json @@ -102,8 +102,6 @@ }, "description": "Bitte w\u00e4hlen Sie die Ausgabeoptionen f\u00fcr {zone} : Status {state}" } - }, - "title": "Konnected Alarm Panel-Optionen" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/en.json b/homeassistant/components/konnected/.translations/en.json index 04cd775f0aa1..11adeea4c9a9 100644 --- a/homeassistant/components/konnected/.translations/en.json +++ b/homeassistant/components/konnected/.translations/en.json @@ -103,8 +103,6 @@ "description": "Please select the output options for {zone}: state {state}", "title": "Configure Switchable Output" } - }, - "title": "Konnected Alarm Panel Options" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/es.json b/homeassistant/components/konnected/.translations/es.json index 11517e2cdc91..05e3fa3368c3 100644 --- a/homeassistant/components/konnected/.translations/es.json +++ b/homeassistant/components/konnected/.translations/es.json @@ -105,8 +105,6 @@ "description": "Por favor, seleccione las opciones de salida para {zone}", "title": "Configurar la salida conmutable" } - }, - "title": "Opciones del panel de alarma Konnected" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/fr.json b/homeassistant/components/konnected/.translations/fr.json index ef37d2106620..566c623c80ce 100644 --- a/homeassistant/components/konnected/.translations/fr.json +++ b/homeassistant/components/konnected/.translations/fr.json @@ -72,6 +72,5 @@ } } } - }, - "title": "Konnected.io" + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/it.json b/homeassistant/components/konnected/.translations/it.json index 2b025862ca74..84fdcac48804 100644 --- a/homeassistant/components/konnected/.translations/it.json +++ b/homeassistant/components/konnected/.translations/it.json @@ -105,8 +105,6 @@ "description": "Selezionare le opzioni di uscita per {zone}: stato {state}", "title": "Configurare l'uscita commutabile" } - }, - "title": "Opzioni del pannello di allarme Konnected" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ko.json b/homeassistant/components/konnected/.translations/ko.json index d9db35c07cc4..6945c5ae47d6 100644 --- a/homeassistant/components/konnected/.translations/ko.json +++ b/homeassistant/components/konnected/.translations/ko.json @@ -103,8 +103,6 @@ "description": "{zone} \uad6c\uc5ed\uc5d0 \ub300\ud55c \ucd9c\ub825 \uc635\uc158\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694: \uc0c1\ud0dc {state}", "title": "\uc2a4\uc704\uce58 \ucd9c\ub825 \uad6c\uc131" } - }, - "title": "Konnected \uc54c\ub78c \ud328\ub110 \uc635\uc158" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/lb.json b/homeassistant/components/konnected/.translations/lb.json index 6447af84ce1d..7e8ed6759923 100644 --- a/homeassistant/components/konnected/.translations/lb.json +++ b/homeassistant/components/konnected/.translations/lb.json @@ -105,8 +105,6 @@ "description": "Wielt w.e.g. d'Ausgaboptiounen fir {zone}: Status {state}", "title": "\u00cbmschltbaren Ausgang konfigur\u00e9ieren" } - }, - "title": "Konnected Alarm Panneau Optiounen" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/nl.json b/homeassistant/components/konnected/.translations/nl.json index 49d7e1e23e74..c513a9a0d7be 100644 --- a/homeassistant/components/konnected/.translations/nl.json +++ b/homeassistant/components/konnected/.translations/nl.json @@ -72,8 +72,6 @@ }, "title": "Schakelbare uitgang configureren" } - }, - "title": "Konnected Alarm Paneel Opties" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/no.json b/homeassistant/components/konnected/.translations/no.json index 0d7cfecfb863..fe1879875bef 100644 --- a/homeassistant/components/konnected/.translations/no.json +++ b/homeassistant/components/konnected/.translations/no.json @@ -103,8 +103,6 @@ "description": "Velg outputalternativer for {zone} : state {state}", "title": "Konfigurere Valgbare Utgang" } - }, - "title": "Alternativer for Konnected Alarm Panel" - }, - "title": "" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/pl.json b/homeassistant/components/konnected/.translations/pl.json index d5864315d823..fe3ce92f4767 100644 --- a/homeassistant/components/konnected/.translations/pl.json +++ b/homeassistant/components/konnected/.translations/pl.json @@ -99,8 +99,6 @@ "description": "Wybierz opcje wyj\u015bcia dla {zone}", "title": "Konfiguracja prze\u0142\u0105czalne wyj\u015bcie" } - }, - "title": "Opcje panelu alarmu Konnected" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/ru.json b/homeassistant/components/konnected/.translations/ru.json index 139dc8bf3a07..b4f8d74d68fd 100644 --- a/homeassistant/components/konnected/.translations/ru.json +++ b/homeassistant/components/konnected/.translations/ru.json @@ -103,8 +103,6 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0445\u043e\u0434\u0430 \u0434\u043b\u044f {zone}: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 {state}.", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430" } - }, - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Konnected" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/sl.json b/homeassistant/components/konnected/.translations/sl.json index 8438caf251fd..0a6a52d2fb13 100644 --- a/homeassistant/components/konnected/.translations/sl.json +++ b/homeassistant/components/konnected/.translations/sl.json @@ -33,6 +33,7 @@ "not_konn_panel": "Ni prepoznana kot Konnected.io naprava" }, "error": { + "bad_host": "Neveljaven URL gostitelja API-ja za preglasitev", "few": "nekaj", "one": "ena", "other": "drugo", @@ -87,7 +88,9 @@ }, "options_misc": { "data": { - "blink": "Lu\u010dka LED na zaslonu utripa, ko po\u0161iljate spremembo stanja" + "api_host": "Preveri gostiteljski URL API (neobvezno)", + "blink": "Lu\u010dka LED na zaslonu utripa, ko po\u0161iljate spremembo stanja", + "override_api_host": "Preglasi privzeti URL gostiteljske plo\u0161\u010de API-ja za Home Assistant" }, "description": "Izberite \u017eeleno vedenje za va\u0161o plo\u0161\u010do", "title": "Konfigurirajte Razno" @@ -96,15 +99,14 @@ "data": { "activation": "Izhod, ko je vklopljen", "momentary": "Trajanje impulza (ms) (neobvezno)", + "more_states": "Konfigurirajte dodatna stanja za to obmo\u010dje", "name": "Ime (neobvezno)", "pause": "Premor med impulzi (ms) (neobvezno)", "repeat": "\u010casi ponovitve (-1 = neskon\u010dno) (neobvezno)" }, - "description": "Izberite izhodne mo\u017enosti za {zone}", + "description": "Izberite izhodne mo\u017enosti za {zone} : stanje {state}", "title": "Konfigurirajte preklopni izhod" } - }, - "title": "Mo\u017enosti Konnected alarm-a" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/sv.json b/homeassistant/components/konnected/.translations/sv.json index 588700dd3063..3e6136fb2c34 100644 --- a/homeassistant/components/konnected/.translations/sv.json +++ b/homeassistant/components/konnected/.translations/sv.json @@ -97,8 +97,6 @@ "description": "V\u00e4lj utdataalternativ f\u00f6r {zone}", "title": "Konfigurera v\u00e4xelbar utdata" } - }, - "title": "Alternativ f\u00f6r Konnected alarmpanel" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/konnected/.translations/zh-Hant.json b/homeassistant/components/konnected/.translations/zh-Hant.json index ac8476824af8..5a1c8fe08bd5 100644 --- a/homeassistant/components/konnected/.translations/zh-Hant.json +++ b/homeassistant/components/konnected/.translations/zh-Hant.json @@ -103,8 +103,6 @@ "description": "\u8acb\u9078\u64c7 {zone}\u8f38\u51fa\u9078\u9805\uff1a\u72c0\u614b {state}", "title": "\u8a2d\u5b9a Switchable \u8f38\u51fa" } - }, - "title": "Konnected \u8b66\u5831\u9762\u677f\u9078\u9805" - }, - "title": "Konnected.io" + } + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/bg.json b/homeassistant/components/life360/.translations/bg.json index d56b7a333af4..9c8dca0b06f1 100644 --- a/homeassistant/components/life360/.translations/bg.json +++ b/homeassistant/components/life360/.translations/bg.json @@ -23,6 +23,5 @@ "title": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 Life360 \u043f\u0440\u043e\u0444\u0438\u043b" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ca.json b/homeassistant/components/life360/.translations/ca.json index 5498ea9745d3..a61e4372b78a 100644 --- a/homeassistant/components/life360/.translations/ca.json +++ b/homeassistant/components/life360/.translations/ca.json @@ -23,6 +23,5 @@ "title": "Informaci\u00f3 del compte Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/da.json b/homeassistant/components/life360/.translations/da.json index d4ab3aba4719..76f46e7c8168 100644 --- a/homeassistant/components/life360/.translations/da.json +++ b/homeassistant/components/life360/.translations/da.json @@ -23,6 +23,5 @@ "title": "Life360-kontooplysninger" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/de.json b/homeassistant/components/life360/.translations/de.json index 2c02b2aa2ce5..09970c59014e 100644 --- a/homeassistant/components/life360/.translations/de.json +++ b/homeassistant/components/life360/.translations/de.json @@ -23,6 +23,5 @@ "title": "Life360-Kontoinformationen" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/en.json b/homeassistant/components/life360/.translations/en.json index 61711b5d3c48..18f22d7f1b8d 100644 --- a/homeassistant/components/life360/.translations/en.json +++ b/homeassistant/components/life360/.translations/en.json @@ -23,6 +23,5 @@ "title": "Life360 Account Info" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/es-419.json b/homeassistant/components/life360/.translations/es-419.json index 25245dbb44fd..33d8d59d080a 100644 --- a/homeassistant/components/life360/.translations/es-419.json +++ b/homeassistant/components/life360/.translations/es-419.json @@ -18,6 +18,5 @@ "title": "Informaci\u00f3n de la cuenta Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/es.json b/homeassistant/components/life360/.translations/es.json index 145c2fb440fd..fc6c58d8ed88 100644 --- a/homeassistant/components/life360/.translations/es.json +++ b/homeassistant/components/life360/.translations/es.json @@ -23,6 +23,5 @@ "title": "Informaci\u00f3n de la cuenta de Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/fr.json b/homeassistant/components/life360/.translations/fr.json index b76d96cc4638..a08c6bc6efe5 100644 --- a/homeassistant/components/life360/.translations/fr.json +++ b/homeassistant/components/life360/.translations/fr.json @@ -23,6 +23,5 @@ "title": "Informations sur le compte Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/it.json b/homeassistant/components/life360/.translations/it.json index 3233430d8ade..3142208b70c0 100644 --- a/homeassistant/components/life360/.translations/it.json +++ b/homeassistant/components/life360/.translations/it.json @@ -23,6 +23,5 @@ "title": "Informazioni sull'account Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ko.json b/homeassistant/components/life360/.translations/ko.json index cae763b42c28..426f3b242a69 100644 --- a/homeassistant/components/life360/.translations/ko.json +++ b/homeassistant/components/life360/.translations/ko.json @@ -23,6 +23,5 @@ "title": "Life360 \uacc4\uc815 \uc815\ubcf4" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/lb.json b/homeassistant/components/life360/.translations/lb.json index be9de9cc9433..f4a455212cb8 100644 --- a/homeassistant/components/life360/.translations/lb.json +++ b/homeassistant/components/life360/.translations/lb.json @@ -23,6 +23,5 @@ "title": "Life360 Kont Informatiounen" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/nl.json b/homeassistant/components/life360/.translations/nl.json index 5f018605d5af..ad1ececc858c 100644 --- a/homeassistant/components/life360/.translations/nl.json +++ b/homeassistant/components/life360/.translations/nl.json @@ -23,6 +23,5 @@ "title": "Life360-accountgegevens" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/nn.json b/homeassistant/components/life360/.translations/nn.json index 09102bbb4abb..7c129cba3afc 100644 --- a/homeassistant/components/life360/.translations/nn.json +++ b/homeassistant/components/life360/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/no.json b/homeassistant/components/life360/.translations/no.json index 0e5920c384ee..fba620789abb 100644 --- a/homeassistant/components/life360/.translations/no.json +++ b/homeassistant/components/life360/.translations/no.json @@ -23,6 +23,5 @@ "title": "Life360 Kontoinformasjon" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/pl.json b/homeassistant/components/life360/.translations/pl.json index edba5dc17a39..19a6c6d8828a 100644 --- a/homeassistant/components/life360/.translations/pl.json +++ b/homeassistant/components/life360/.translations/pl.json @@ -23,6 +23,5 @@ "title": "Informacje o koncie Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/pt-BR.json b/homeassistant/components/life360/.translations/pt-BR.json index c69ffec899a8..b841e7b28fd5 100644 --- a/homeassistant/components/life360/.translations/pt-BR.json +++ b/homeassistant/components/life360/.translations/pt-BR.json @@ -23,6 +23,5 @@ "title": "Informa\u00e7\u00f5es da conta Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/ru.json b/homeassistant/components/life360/.translations/ru.json index 87eb9762765a..d95bb809cd5e 100644 --- a/homeassistant/components/life360/.translations/ru.json +++ b/homeassistant/components/life360/.translations/ru.json @@ -23,6 +23,5 @@ "title": "Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/sl.json b/homeassistant/components/life360/.translations/sl.json index 7ecdd132bb96..857f12041d1f 100644 --- a/homeassistant/components/life360/.translations/sl.json +++ b/homeassistant/components/life360/.translations/sl.json @@ -23,6 +23,5 @@ "title": "Podatki ra\u010duna Life360" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/sv.json b/homeassistant/components/life360/.translations/sv.json index 561d7418aff2..915c7e7f55b5 100644 --- a/homeassistant/components/life360/.translations/sv.json +++ b/homeassistant/components/life360/.translations/sv.json @@ -23,6 +23,5 @@ "title": "Life360 kontoinformation" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/life360/.translations/zh-Hant.json b/homeassistant/components/life360/.translations/zh-Hant.json index 71150762e614..025ee2026960 100644 --- a/homeassistant/components/life360/.translations/zh-Hant.json +++ b/homeassistant/components/life360/.translations/zh-Hant.json @@ -23,6 +23,5 @@ "title": "Life360 \u5e33\u865f\u8cc7\u8a0a" } } - }, - "title": "Life360" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/bg.json b/homeassistant/components/lifx/.translations/bg.json index f3331e450b41..e44a4524eefc 100644 --- a/homeassistant/components/lifx/.translations/bg.json +++ b/homeassistant/components/lifx/.translations/bg.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ca.json b/homeassistant/components/lifx/.translations/ca.json index 2c0f9c185d09..a9a45f1f4857 100644 --- a/homeassistant/components/lifx/.translations/ca.json +++ b/homeassistant/components/lifx/.translations/ca.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/cs.json b/homeassistant/components/lifx/.translations/cs.json index 621aee364ad7..9ebb8c43b424 100644 --- a/homeassistant/components/lifx/.translations/cs.json +++ b/homeassistant/components/lifx/.translations/cs.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/da.json b/homeassistant/components/lifx/.translations/da.json index e364be3b021c..b6faac51acc8 100644 --- a/homeassistant/components/lifx/.translations/da.json +++ b/homeassistant/components/lifx/.translations/da.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/de.json b/homeassistant/components/lifx/.translations/de.json index b7798bda7f45..654fbe82aeb0 100644 --- a/homeassistant/components/lifx/.translations/de.json +++ b/homeassistant/components/lifx/.translations/de.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/en.json b/homeassistant/components/lifx/.translations/en.json index e918bb28cb2c..fe7daaaed7d7 100644 --- a/homeassistant/components/lifx/.translations/en.json +++ b/homeassistant/components/lifx/.translations/en.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/es-419.json b/homeassistant/components/lifx/.translations/es-419.json index 96c9b6ef6811..8676326e9955 100644 --- a/homeassistant/components/lifx/.translations/es-419.json +++ b/homeassistant/components/lifx/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/es.json b/homeassistant/components/lifx/.translations/es.json index e1508bb06ae9..5ed177125fcd 100644 --- a/homeassistant/components/lifx/.translations/es.json +++ b/homeassistant/components/lifx/.translations/es.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/fr.json b/homeassistant/components/lifx/.translations/fr.json index f6b52394eee4..60dc00a32fe9 100644 --- a/homeassistant/components/lifx/.translations/fr.json +++ b/homeassistant/components/lifx/.translations/fr.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/hu.json b/homeassistant/components/lifx/.translations/hu.json index cbadc37a6c15..9b8fe3632c29 100644 --- a/homeassistant/components/lifx/.translations/hu.json +++ b/homeassistant/components/lifx/.translations/hu.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/it.json b/homeassistant/components/lifx/.translations/it.json index 2768a7ed85ab..380acd0a875f 100644 --- a/homeassistant/components/lifx/.translations/it.json +++ b/homeassistant/components/lifx/.translations/it.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ko.json b/homeassistant/components/lifx/.translations/ko.json index a6992289200b..8fd7a0ca754a 100644 --- a/homeassistant/components/lifx/.translations/ko.json +++ b/homeassistant/components/lifx/.translations/ko.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/lb.json b/homeassistant/components/lifx/.translations/lb.json index 6936dc7f56f5..8bf15060ed44 100644 --- a/homeassistant/components/lifx/.translations/lb.json +++ b/homeassistant/components/lifx/.translations/lb.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/nl.json b/homeassistant/components/lifx/.translations/nl.json index 8624bfc7639f..e8a42bd5676d 100644 --- a/homeassistant/components/lifx/.translations/nl.json +++ b/homeassistant/components/lifx/.translations/nl.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/nn.json b/homeassistant/components/lifx/.translations/nn.json index a0ca32c0d88b..c189eb1e180c 100644 --- a/homeassistant/components/lifx/.translations/nn.json +++ b/homeassistant/components/lifx/.translations/nn.json @@ -5,6 +5,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/no.json b/homeassistant/components/lifx/.translations/no.json index 403ea8f0c4b2..82f99c45e796 100644 --- a/homeassistant/components/lifx/.translations/no.json +++ b/homeassistant/components/lifx/.translations/no.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pl.json b/homeassistant/components/lifx/.translations/pl.json index 16a843202abd..53e623e05df8 100644 --- a/homeassistant/components/lifx/.translations/pl.json +++ b/homeassistant/components/lifx/.translations/pl.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pt-BR.json b/homeassistant/components/lifx/.translations/pt-BR.json index f12ff5bd94c7..e95f452c1e40 100644 --- a/homeassistant/components/lifx/.translations/pt-BR.json +++ b/homeassistant/components/lifx/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/pt.json b/homeassistant/components/lifx/.translations/pt.json index e0716dd707c4..73fdb846b1ea 100644 --- a/homeassistant/components/lifx/.translations/pt.json +++ b/homeassistant/components/lifx/.translations/pt.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ro.json b/homeassistant/components/lifx/.translations/ro.json index 5b62cd462350..6ef2bd8697c4 100644 --- a/homeassistant/components/lifx/.translations/ro.json +++ b/homeassistant/components/lifx/.translations/ro.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/ru.json b/homeassistant/components/lifx/.translations/ru.json index d2e0a2418a4f..a7f6dfbd6a87 100644 --- a/homeassistant/components/lifx/.translations/ru.json +++ b/homeassistant/components/lifx/.translations/ru.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/sl.json b/homeassistant/components/lifx/.translations/sl.json index 7bd4c366c76a..5bcb8b328c4e 100644 --- a/homeassistant/components/lifx/.translations/sl.json +++ b/homeassistant/components/lifx/.translations/sl.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/sv.json b/homeassistant/components/lifx/.translations/sv.json index 591c4677fbd5..c85449078de1 100644 --- a/homeassistant/components/lifx/.translations/sv.json +++ b/homeassistant/components/lifx/.translations/sv.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/zh-Hans.json b/homeassistant/components/lifx/.translations/zh-Hans.json index 2eec5575ce0c..6d30adcd4537 100644 --- a/homeassistant/components/lifx/.translations/zh-Hans.json +++ b/homeassistant/components/lifx/.translations/zh-Hans.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/lifx/.translations/zh-Hant.json b/homeassistant/components/lifx/.translations/zh-Hant.json index a5f9fba3cf28..fc9e407b4b27 100644 --- a/homeassistant/components/lifx/.translations/zh-Hant.json +++ b/homeassistant/components/lifx/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "LIFX" } } - }, - "title": "LIFX" + } } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/af.json b/homeassistant/components/light/.translations/af.json new file mode 100644 index 000000000000..1e21027a6042 --- /dev/null +++ b/homeassistant/components/light/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Lig" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ar.json b/homeassistant/components/light/.translations/ar.json new file mode 100644 index 000000000000..9d445724c1c3 --- /dev/null +++ b/homeassistant/components/light/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u0636\u0648\u0621" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/bg.json b/homeassistant/components/light/.translations/bg.json index 33b57d9e7cd1..b9cc91182207 100644 --- a/homeassistant/components/light/.translations/bg.json +++ b/homeassistant/components/light/.translations/bg.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} \u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d", "turned_on": "{entity_name} \u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d" } - } + }, + "title": "\u041e\u0441\u0432\u0435\u0442\u043b\u0435\u043d\u0438\u0435" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/bs.json b/homeassistant/components/light/.translations/bs.json new file mode 100644 index 000000000000..7f1579001328 --- /dev/null +++ b/homeassistant/components/light/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Svjetlo" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ca.json b/homeassistant/components/light/.translations/ca.json index ec7641e1cab7..62f026fb0351 100644 --- a/homeassistant/components/light/.translations/ca.json +++ b/homeassistant/components/light/.translations/ca.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Redueix la brillantor de {entity_name}", "brightness_increase": "Augmenta la brillantor de {entity_name}", + "flash": "Perpelleja {entity_name}", "toggle": "Commuta {entity_name}", "turn_off": "Apaga {entity_name}", "turn_on": "Enc\u00e9n {entity_name}" @@ -15,5 +16,6 @@ "turned_off": "{entity_name} apagat", "turned_on": "{entity_name} enc\u00e8s" } - } + }, + "title": "Llums" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/cs.json b/homeassistant/components/light/.translations/cs.json new file mode 100644 index 000000000000..2a3458c3f04b --- /dev/null +++ b/homeassistant/components/light/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Sv\u011btlo" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/cy.json b/homeassistant/components/light/.translations/cy.json new file mode 100644 index 000000000000..734a81fba167 --- /dev/null +++ b/homeassistant/components/light/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Golau" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/da.json b/homeassistant/components/light/.translations/da.json index 8115a3bfba91..dd9526e8ad78 100644 --- a/homeassistant/components/light/.translations/da.json +++ b/homeassistant/components/light/.translations/da.json @@ -15,5 +15,6 @@ "turned_off": "{entity_name} slukkede", "turned_on": "{entity_name} t\u00e6ndte" } - } + }, + "title": "Lys" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/de.json b/homeassistant/components/light/.translations/de.json index eb8a1b5bb001..75178c5ed2e2 100644 --- a/homeassistant/components/light/.translations/de.json +++ b/homeassistant/components/light/.translations/de.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name} ausgeschaltet", "turned_on": "{entity_name} eingeschaltet" } - } + }, + "title": "Licht" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/el.json b/homeassistant/components/light/.translations/el.json new file mode 100644 index 000000000000..12356ef38cee --- /dev/null +++ b/homeassistant/components/light/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a6\u03c9\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/en.json b/homeassistant/components/light/.translations/en.json index 6a777265c7cd..50cf04725f02 100644 --- a/homeassistant/components/light/.translations/en.json +++ b/homeassistant/components/light/.translations/en.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name} turned off", "turned_on": "{entity_name} turned on" } - } + }, + "title": "Light" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/es-419.json b/homeassistant/components/light/.translations/es-419.json index b63f0d444523..56469f7842f9 100644 --- a/homeassistant/components/light/.translations/es-419.json +++ b/homeassistant/components/light/.translations/es-419.json @@ -8,5 +8,6 @@ "turned_off": "{entity_name} desactivada", "turned_on": "{entity_name} activada" } - } + }, + "title": "Luz" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/es.json b/homeassistant/components/light/.translations/es.json index f4e999225c48..18eb21be2afa 100644 --- a/homeassistant/components/light/.translations/es.json +++ b/homeassistant/components/light/.translations/es.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name} apagada", "turned_on": "{entity_name} encendida" } - } + }, + "title": "Luz" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/et.json b/homeassistant/components/light/.translations/et.json new file mode 100644 index 000000000000..dc02240fb9a3 --- /dev/null +++ b/homeassistant/components/light/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Tuled" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/eu.json b/homeassistant/components/light/.translations/eu.json new file mode 100644 index 000000000000..c1b2a001623d --- /dev/null +++ b/homeassistant/components/light/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Argia" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/fa.json b/homeassistant/components/light/.translations/fa.json new file mode 100644 index 000000000000..5669c448965a --- /dev/null +++ b/homeassistant/components/light/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0686\u0631\u0627\u063a" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/fi.json b/homeassistant/components/light/.translations/fi.json new file mode 100644 index 000000000000..fad6bd2cc139 --- /dev/null +++ b/homeassistant/components/light/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Valo" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/fr.json b/homeassistant/components/light/.translations/fr.json index 4a1dc82bbd62..b6146584d0a9 100644 --- a/homeassistant/components/light/.translations/fr.json +++ b/homeassistant/components/light/.translations/fr.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} est d\u00e9sactiv\u00e9", "turned_on": "{entity_name} activ\u00e9" } - } + }, + "title": "Lumi\u00e8re" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/gsw.json b/homeassistant/components/light/.translations/gsw.json new file mode 100644 index 000000000000..fff5188e04b4 --- /dev/null +++ b/homeassistant/components/light/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Li\u00e4cht" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/he.json b/homeassistant/components/light/.translations/he.json new file mode 100644 index 000000000000..2343dac5bb14 --- /dev/null +++ b/homeassistant/components/light/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d0\u05d5\u05b9\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/hi.json b/homeassistant/components/light/.translations/hi.json new file mode 100644 index 000000000000..f92740755bf7 --- /dev/null +++ b/homeassistant/components/light/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0930\u094b\u0936\u0928\u0940" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/hr.json b/homeassistant/components/light/.translations/hr.json new file mode 100644 index 000000000000..7f1579001328 --- /dev/null +++ b/homeassistant/components/light/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Svjetlo" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/hu.json b/homeassistant/components/light/.translations/hu.json index 5192a8c7df2c..515260349579 100644 --- a/homeassistant/components/light/.translations/hu.json +++ b/homeassistant/components/light/.translations/hu.json @@ -15,5 +15,6 @@ "turned_off": "{entity_name} le lett kapcsolva", "turned_on": "{entity_name} fel lett kapcsolva" } - } + }, + "title": "Vil\u00e1g\u00edt\u00e1s" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/hy.json b/homeassistant/components/light/.translations/hy.json new file mode 100644 index 000000000000..d6eb30277ced --- /dev/null +++ b/homeassistant/components/light/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053c\u0578\u0582\u0575\u057d" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/id.json b/homeassistant/components/light/.translations/id.json new file mode 100644 index 000000000000..b9ebd3937956 --- /dev/null +++ b/homeassistant/components/light/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Lampu" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/is.json b/homeassistant/components/light/.translations/is.json new file mode 100644 index 000000000000..7c0c5861cf81 --- /dev/null +++ b/homeassistant/components/light/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Lj\u00f3s" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/it.json b/homeassistant/components/light/.translations/it.json index a95af835908c..8049e3658694 100644 --- a/homeassistant/components/light/.translations/it.json +++ b/homeassistant/components/light/.translations/it.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name} disattivato", "turned_on": "{entity_name} attivato" } - } + }, + "title": "Luce" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ja.json b/homeassistant/components/light/.translations/ja.json new file mode 100644 index 000000000000..9608bdb306b2 --- /dev/null +++ b/homeassistant/components/light/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u7167\u660e" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ko.json b/homeassistant/components/light/.translations/ko.json index c0c47dddfbb9..5f8d9034a62a 100644 --- a/homeassistant/components/light/.translations/ko.json +++ b/homeassistant/components/light/.translations/ko.json @@ -15,5 +15,6 @@ "turned_off": "{entity_name} \uc774(\uac00) \uaebc\uc9c8 \ub54c", "turned_on": "{entity_name} \uc774(\uac00) \ucf1c\uc9c8 \ub54c" } - } + }, + "title": "\uc804\ub4f1" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/lb.json b/homeassistant/components/light/.translations/lb.json index 8ffa33a6a3bf..e910eea1074f 100644 --- a/homeassistant/components/light/.translations/lb.json +++ b/homeassistant/components/light/.translations/lb.json @@ -15,5 +15,6 @@ "turned_off": "{entity_name} gouf ausgeschalt", "turned_on": "{entity_name} gouf ugeschalt" } - } + }, + "title": "Luucht" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/lv.json b/homeassistant/components/light/.translations/lv.json index 1436829ee9a6..d9edc58b974f 100644 --- a/homeassistant/components/light/.translations/lv.json +++ b/homeassistant/components/light/.translations/lv.json @@ -8,5 +8,6 @@ "turned_off": "{entity_name} tika izsl\u0113gta", "turned_on": "{entity_name} tika iesl\u0113gta" } - } + }, + "title": "Gaisma" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/nb.json b/homeassistant/components/light/.translations/nb.json new file mode 100644 index 000000000000..81bd5e3a1357 --- /dev/null +++ b/homeassistant/components/light/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Lys" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/nl.json b/homeassistant/components/light/.translations/nl.json index e742a337cca0..51ef35385f0f 100644 --- a/homeassistant/components/light/.translations/nl.json +++ b/homeassistant/components/light/.translations/nl.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} is uitgeschakeld", "turned_on": "{entity_name} is ingeschakeld" } - } + }, + "title": "Licht" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/nn.json b/homeassistant/components/light/.translations/nn.json new file mode 100644 index 000000000000..81bd5e3a1357 --- /dev/null +++ b/homeassistant/components/light/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Lys" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/pl.json b/homeassistant/components/light/.translations/pl.json index 1f2ff19f9c3d..798a8f9f6599 100644 --- a/homeassistant/components/light/.translations/pl.json +++ b/homeassistant/components/light/.translations/pl.json @@ -15,5 +15,6 @@ "turned_off": "nast\u0105pi wy\u0142\u0105czenie {entity_name}", "turned_on": "nast\u0105pi w\u0142\u0105czenie {entity_name}" } - } + }, + "title": "\u015awiat\u0142o" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/pt-BR.json b/homeassistant/components/light/.translations/pt-BR.json index 05414b1e03c5..ecc540b2cf14 100644 --- a/homeassistant/components/light/.translations/pt-BR.json +++ b/homeassistant/components/light/.translations/pt-BR.json @@ -9,5 +9,6 @@ "is_off": "{entity_name} est\u00e1 desligado", "is_on": "{entity_name} est\u00e1 ligado" } - } + }, + "title": "Luz" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/pt.json b/homeassistant/components/light/.translations/pt.json index 272516f4c6b9..19b4e79fe9d7 100644 --- a/homeassistant/components/light/.translations/pt.json +++ b/homeassistant/components/light/.translations/pt.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} foi desligado", "turned_on": "{entity_name} foi ligado" } - } + }, + "title": "Ilumina\u00e7\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ro.json b/homeassistant/components/light/.translations/ro.json new file mode 100644 index 000000000000..2f757b4bad3a --- /dev/null +++ b/homeassistant/components/light/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Lumina" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ru.json b/homeassistant/components/light/.translations/ru.json index d6c3d0375315..8f8b220af885 100644 --- a/homeassistant/components/light/.translations/ru.json +++ b/homeassistant/components/light/.translations/ru.json @@ -15,5 +15,6 @@ "turned_off": "{entity_name} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", "turned_on": "{entity_name} \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f" } - } + }, + "title": "\u041e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/sk.json b/homeassistant/components/light/.translations/sk.json new file mode 100644 index 000000000000..752d3a78a5f9 --- /dev/null +++ b/homeassistant/components/light/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Svetlo" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/sl.json b/homeassistant/components/light/.translations/sl.json index 5704ebb68268..7e62ef3f7ace 100644 --- a/homeassistant/components/light/.translations/sl.json +++ b/homeassistant/components/light/.translations/sl.json @@ -3,6 +3,7 @@ "action_type": { "brightness_decrease": "Zmanj\u0161ajte svetlost {entity_name}", "brightness_increase": "Pove\u010dajte svetlost {entity_name}", + "flash": "Osvetli (pobliskaj) {entity_name}", "toggle": "Preklopite {entity_name}", "turn_off": "Izklopite {entity_name}", "turn_on": "Vklopite {entity_name}" @@ -15,5 +16,6 @@ "turned_off": "{entity_name} izklopljen", "turned_on": "{entity_name} vklopljen" } - } + }, + "title": "Lu\u010di" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/sv.json b/homeassistant/components/light/.translations/sv.json index 8df3f3d382bf..6d9654f3c5c2 100644 --- a/homeassistant/components/light/.translations/sv.json +++ b/homeassistant/components/light/.translations/sv.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} avst\u00e4ngd", "turned_on": "{entity_name} slogs p\u00e5" } - } + }, + "title": "Lampor" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/ta.json b/homeassistant/components/light/.translations/ta.json new file mode 100644 index 000000000000..94b931e03ba4 --- /dev/null +++ b/homeassistant/components/light/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0bae\u0bbf\u0ba9\u0bcd \u0bb5\u0bbf\u0bb3\u0b95\u0bcd\u0b95\u0bc1" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/te.json b/homeassistant/components/light/.translations/te.json new file mode 100644 index 000000000000..695fba906b4e --- /dev/null +++ b/homeassistant/components/light/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c32\u0c46\u0c56\u0c1f\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/th.json b/homeassistant/components/light/.translations/th.json new file mode 100644 index 000000000000..f48d00a7defd --- /dev/null +++ b/homeassistant/components/light/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e41\u0e2a\u0e07\u0e2a\u0e27\u0e48\u0e32\u0e07" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/tr.json b/homeassistant/components/light/.translations/tr.json new file mode 100644 index 000000000000..c70dde76a977 --- /dev/null +++ b/homeassistant/components/light/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "I\u015f\u0131k" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/uk.json b/homeassistant/components/light/.translations/uk.json new file mode 100644 index 000000000000..8d5a70dc0014 --- /dev/null +++ b/homeassistant/components/light/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043d\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/vi.json b/homeassistant/components/light/.translations/vi.json new file mode 100644 index 000000000000..4626033dc5e6 --- /dev/null +++ b/homeassistant/components/light/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110\u00e8n" +} \ No newline at end of file diff --git a/homeassistant/components/light/.translations/zh-Hans.json b/homeassistant/components/light/.translations/zh-Hans.json index 872b5b2e2a49..4cb2f1bab601 100644 --- a/homeassistant/components/light/.translations/zh-Hans.json +++ b/homeassistant/components/light/.translations/zh-Hans.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name} \u88ab\u5173\u95ed", "turned_on": "{entity_name} \u88ab\u6253\u5f00" } - } + }, + "title": "\u706f\u5149" } \ No newline at end of file diff --git a/homeassistant/components/light/.translations/zh-Hant.json b/homeassistant/components/light/.translations/zh-Hant.json index 30dcf2793f30..ec83710e860f 100644 --- a/homeassistant/components/light/.translations/zh-Hant.json +++ b/homeassistant/components/light/.translations/zh-Hant.json @@ -16,5 +16,6 @@ "turned_off": "{entity_name}\u5df2\u95dc\u9589", "turned_on": "{entity_name}\u5df2\u958b\u555f" } - } + }, + "title": "\u71c8\u5149" } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/bg.json b/homeassistant/components/linky/.translations/bg.json index 68da33e30478..dd337013f594 100644 --- a/homeassistant/components/linky/.translations/bg.json +++ b/homeassistant/components/linky/.translations/bg.json @@ -16,6 +16,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ca.json b/homeassistant/components/linky/.translations/ca.json index 75385aa8a6e9..127d2870ae72 100644 --- a/homeassistant/components/linky/.translations/ca.json +++ b/homeassistant/components/linky/.translations/ca.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/da.json b/homeassistant/components/linky/.translations/da.json index e157b8fec566..2fa885d1ffa2 100644 --- a/homeassistant/components/linky/.translations/da.json +++ b/homeassistant/components/linky/.translations/da.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/de.json b/homeassistant/components/linky/.translations/de.json index 72a60759aeb0..c1f06d34a8f3 100644 --- a/homeassistant/components/linky/.translations/de.json +++ b/homeassistant/components/linky/.translations/de.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/en.json b/homeassistant/components/linky/.translations/en.json index 142a87c9071c..512c0567444e 100644 --- a/homeassistant/components/linky/.translations/en.json +++ b/homeassistant/components/linky/.translations/en.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/es-419.json b/homeassistant/components/linky/.translations/es-419.json index c1efff6fa349..ff559803e06c 100644 --- a/homeassistant/components/linky/.translations/es-419.json +++ b/homeassistant/components/linky/.translations/es-419.json @@ -16,6 +16,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/es.json b/homeassistant/components/linky/.translations/es.json index b33163d99ede..ef07dc2ca75c 100644 --- a/homeassistant/components/linky/.translations/es.json +++ b/homeassistant/components/linky/.translations/es.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/fr.json b/homeassistant/components/linky/.translations/fr.json index 723261e164c6..71dba36dbe86 100644 --- a/homeassistant/components/linky/.translations/fr.json +++ b/homeassistant/components/linky/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/it.json b/homeassistant/components/linky/.translations/it.json index ee362f9aa721..ff5e226dcbe9 100644 --- a/homeassistant/components/linky/.translations/it.json +++ b/homeassistant/components/linky/.translations/it.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ko.json b/homeassistant/components/linky/.translations/ko.json index 7f7534192cf4..cd83aad724f2 100644 --- a/homeassistant/components/linky/.translations/ko.json +++ b/homeassistant/components/linky/.translations/ko.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/lb.json b/homeassistant/components/linky/.translations/lb.json index 6a1b10593807..091a3b8d699e 100644 --- a/homeassistant/components/linky/.translations/lb.json +++ b/homeassistant/components/linky/.translations/lb.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/nl.json b/homeassistant/components/linky/.translations/nl.json index e9f6476f0724..2c05353be3fb 100644 --- a/homeassistant/components/linky/.translations/nl.json +++ b/homeassistant/components/linky/.translations/nl.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/nn.json b/homeassistant/components/linky/.translations/nn.json index b9f4c41692e4..6cdaaf837a44 100644 --- a/homeassistant/components/linky/.translations/nn.json +++ b/homeassistant/components/linky/.translations/nn.json @@ -5,6 +5,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/no.json b/homeassistant/components/linky/.translations/no.json index 0a71a623b290..b2c565e13dfe 100644 --- a/homeassistant/components/linky/.translations/no.json +++ b/homeassistant/components/linky/.translations/no.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/pl.json b/homeassistant/components/linky/.translations/pl.json index ebeb37c991f2..1fc09298fd7b 100644 --- a/homeassistant/components/linky/.translations/pl.json +++ b/homeassistant/components/linky/.translations/pl.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/pt-BR.json b/homeassistant/components/linky/.translations/pt-BR.json index 0681172165c7..bf2bc7070ae2 100644 --- a/homeassistant/components/linky/.translations/pt-BR.json +++ b/homeassistant/components/linky/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/ru.json b/homeassistant/components/linky/.translations/ru.json index 69dd4717ec28..65e0269967ad 100644 --- a/homeassistant/components/linky/.translations/ru.json +++ b/homeassistant/components/linky/.translations/ru.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/sl.json b/homeassistant/components/linky/.translations/sl.json index 8c49004aefee..3df56ac5bbbf 100644 --- a/homeassistant/components/linky/.translations/sl.json +++ b/homeassistant/components/linky/.translations/sl.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/sv.json b/homeassistant/components/linky/.translations/sv.json index d4b784046f82..2d8c2b7177ae 100644 --- a/homeassistant/components/linky/.translations/sv.json +++ b/homeassistant/components/linky/.translations/sv.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/linky/.translations/zh-Hant.json b/homeassistant/components/linky/.translations/zh-Hant.json index c5f291289eee..7a28dd692f69 100644 --- a/homeassistant/components/linky/.translations/zh-Hant.json +++ b/homeassistant/components/linky/.translations/zh-Hant.json @@ -19,6 +19,5 @@ "title": "Linky" } } - }, - "title": "Linky" + } } \ No newline at end of file diff --git a/homeassistant/components/local_ip/.translations/ca.json b/homeassistant/components/local_ip/.translations/ca.json index b21164458aac..e0df69343615 100644 --- a/homeassistant/components/local_ip/.translations/ca.json +++ b/homeassistant/components/local_ip/.translations/ca.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "Integraci\u00f3 ja configurada amb un sensor amb aquest nom", "single_instance_allowed": "Nom\u00e9s \u00e9s possible configurar una sola IP local." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/da.json b/homeassistant/components/local_ip/.translations/da.json index 6c3e379c1e91..eebf7c1d0ce0 100644 --- a/homeassistant/components/local_ip/.translations/da.json +++ b/homeassistant/components/local_ip/.translations/da.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Integration er allerede konfigureret med en eksisterende sensor med det navn" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/de.json b/homeassistant/components/local_ip/.translations/de.json index d687518ad30a..072f6ec964d1 100644 --- a/homeassistant/components/local_ip/.translations/de.json +++ b/homeassistant/components/local_ip/.translations/de.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "Integration ist bereits mit einem vorhandenen Sensor mit diesem Namen konfiguriert", "single_instance_allowed": "Es ist nur eine einzige Konfiguration der lokalen IP zul\u00e4ssig." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/en.json b/homeassistant/components/local_ip/.translations/en.json index c81c03bd710c..5a4077352e70 100644 --- a/homeassistant/components/local_ip/.translations/en.json +++ b/homeassistant/components/local_ip/.translations/en.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "Integration is already configured with an existing sensor with that name", "single_instance_allowed": "Only a single configuration of Local IP is allowed." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/es.json b/homeassistant/components/local_ip/.translations/es.json index 5d29b267fa2a..7af25649769c 100644 --- a/homeassistant/components/local_ip/.translations/es.json +++ b/homeassistant/components/local_ip/.translations/es.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "La integraci\u00f3n ya est\u00e1 configurada con un sensor existente con ese nombre", "single_instance_allowed": "Solo se permite una \u00fanica configuraci\u00f3n de IP Local." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/fr.json b/homeassistant/components/local_ip/.translations/fr.json index 383a7d4263c0..c1933032ed0a 100644 --- a/homeassistant/components/local_ip/.translations/fr.json +++ b/homeassistant/components/local_ip/.translations/fr.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "L'int\u00e9gration est d\u00e9j\u00e0 configur\u00e9e avec un capteur existant portant ce nom", "single_instance_allowed": "Une seule configuration d'IP locale est autoris\u00e9e" }, "step": { diff --git a/homeassistant/components/local_ip/.translations/hu.json b/homeassistant/components/local_ip/.translations/hu.json index c57ad99bf0fa..09b894742a6a 100644 --- a/homeassistant/components/local_ip/.translations/hu.json +++ b/homeassistant/components/local_ip/.translations/hu.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Az integr\u00e1ci\u00f3 m\u00e1r konfigur\u00e1lva van egy ilyen nev\u0171 l\u00e9tez\u0151 \u00e9rz\u00e9kel\u0151vel" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/it.json b/homeassistant/components/local_ip/.translations/it.json index a180d448fbda..3e1592546003 100644 --- a/homeassistant/components/local_ip/.translations/it.json +++ b/homeassistant/components/local_ip/.translations/it.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "L'integrazione \u00e8 gi\u00e0 configurata con un sensore esistente con questo nome", "single_instance_allowed": "\u00c8 consentita una sola configurazione dell'IP locale." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/ko.json b/homeassistant/components/local_ip/.translations/ko.json index 9feb39506600..2662eab36e76 100644 --- a/homeassistant/components/local_ip/.translations/ko.json +++ b/homeassistant/components/local_ip/.translations/ko.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "\ud1b5\ud569 \uad6c\uc131\uc694\uc18c\uac00 \uc774\ubbf8 \ud574\ub2f9 \uc774\ub984\uc758 \uc13c\uc11c\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/lb.json b/homeassistant/components/local_ip/.translations/lb.json index 2b2f92ebdbad..a404e1747e9e 100644 --- a/homeassistant/components/local_ip/.translations/lb.json +++ b/homeassistant/components/local_ip/.translations/lb.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Integratioun ass scho konfigur\u00e9iert mat engem Sensor mat deem Numm" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/nl.json b/homeassistant/components/local_ip/.translations/nl.json index 5306d17ea2b0..88de9704a6e6 100644 --- a/homeassistant/components/local_ip/.translations/nl.json +++ b/homeassistant/components/local_ip/.translations/nl.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Integratie is al geconfigureerd met een bestaande sensor met die naam" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/no.json b/homeassistant/components/local_ip/.translations/no.json index 2a2a194c166a..0b12afbcbb38 100644 --- a/homeassistant/components/local_ip/.translations/no.json +++ b/homeassistant/components/local_ip/.translations/no.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "Integrasjonen er allerede konfigurert med en eksisterende sensor med det navnet", "single_instance_allowed": "Bare en enkelt konfigurasjon av lokal IP er tillatt." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/pl.json b/homeassistant/components/local_ip/.translations/pl.json index 26cce0fe770d..c5ae118ef2cb 100644 --- a/homeassistant/components/local_ip/.translations/pl.json +++ b/homeassistant/components/local_ip/.translations/pl.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Integracja jest ju\u017c skonfigurowana z istniej\u0105cym sensorem o tej nazwie." - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/pt-BR.json b/homeassistant/components/local_ip/.translations/pt-BR.json index 69d250ad6f17..24246ca57321 100644 --- a/homeassistant/components/local_ip/.translations/pt-BR.json +++ b/homeassistant/components/local_ip/.translations/pt-BR.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "A integra\u00e7\u00e3o j\u00e1 est\u00e1 configurada com um sensor existente com esse nome" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/ru.json b/homeassistant/components/local_ip/.translations/ru.json index 80a11e4f16d0..e7e7a5647b7a 100644 --- a/homeassistant/components/local_ip/.translations/ru.json +++ b/homeassistant/components/local_ip/.translations/ru.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c.", "single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430." }, "step": { diff --git a/homeassistant/components/local_ip/.translations/sl.json b/homeassistant/components/local_ip/.translations/sl.json index aa71441b8cdf..ca1103043e37 100644 --- a/homeassistant/components/local_ip/.translations/sl.json +++ b/homeassistant/components/local_ip/.translations/sl.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Integracija je \u017ee konfigurirana z obstoje\u010dim senzorjem s tem imenom" + "single_instance_allowed": "Dovoljena je samo ena konfiguracija lokalnega IP-ja." }, "step": { "user": { diff --git a/homeassistant/components/local_ip/.translations/sv.json b/homeassistant/components/local_ip/.translations/sv.json index 3ef9309c9637..9c8f27dff8df 100644 --- a/homeassistant/components/local_ip/.translations/sv.json +++ b/homeassistant/components/local_ip/.translations/sv.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Integrationen \u00e4r redan konfigurerad med en befintlig sensor med det namnet" - }, "step": { "user": { "data": { diff --git a/homeassistant/components/local_ip/.translations/zh-Hant.json b/homeassistant/components/local_ip/.translations/zh-Hant.json index 7ad755226a50..15103177179d 100644 --- a/homeassistant/components/local_ip/.translations/zh-Hant.json +++ b/homeassistant/components/local_ip/.translations/zh-Hant.json @@ -1,7 +1,6 @@ { "config": { "abort": { - "already_configured": "\u6574\u5408\u5df2\u7d93\u8a2d\u5b9a\u4e26\u6709\u73fe\u6709\u50b3\u611f\u5668\u4f7f\u7528\u76f8\u540c\u540d\u7a31", "single_instance_allowed": "\u50c5\u5141\u8a31\u8a2d\u5b9a\u4e00\u7d44\u672c\u5730 IP\u3002" }, "step": { diff --git a/homeassistant/components/locative/.translations/bg.json b/homeassistant/components/locative/.translations/bg.json index a69c443c8889..540724e578f3 100644 --- a/homeassistant/components/locative/.translations/bg.json +++ b/homeassistant/components/locative/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ca.json b/homeassistant/components/locative/.translations/ca.json index 3aef44f12028..61c6a6c48afa 100644 --- a/homeassistant/components/locative/.translations/ca.json +++ b/homeassistant/components/locative/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Locative" } } - }, - "title": "Webhook de Locative" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/cs.json b/homeassistant/components/locative/.translations/cs.json index 1e9eab323d42..074443908f49 100644 --- a/homeassistant/components/locative/.translations/cs.json +++ b/homeassistant/components/locative/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastavit Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/da.json b/homeassistant/components/locative/.translations/da.json index 6df2a846c8cf..afee5b832cc8 100644 --- a/homeassistant/components/locative/.translations/da.json +++ b/homeassistant/components/locative/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/de.json b/homeassistant/components/locative/.translations/de.json index 63420c805ba9..482d43c71175 100644 --- a/homeassistant/components/locative/.translations/de.json +++ b/homeassistant/components/locative/.translations/de.json @@ -13,6 +13,5 @@ "title": "Locative Webhook einrichten" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/en.json b/homeassistant/components/locative/.translations/en.json index fc12bb2d1bcd..750797e535bf 100644 --- a/homeassistant/components/locative/.translations/en.json +++ b/homeassistant/components/locative/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/es-419.json b/homeassistant/components/locative/.translations/es-419.json index 1068dead9c88..d28fb541825e 100644 --- a/homeassistant/components/locative/.translations/es-419.json +++ b/homeassistant/components/locative/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook Locative" } } - }, - "title": "Webhook Locative" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/es.json b/homeassistant/components/locative/.translations/es.json index 86116ef68458..e699e41903e4 100644 --- a/homeassistant/components/locative/.translations/es.json +++ b/homeassistant/components/locative/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el webhook de Locative" } } - }, - "title": "Webhook de Locative" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/fr.json b/homeassistant/components/locative/.translations/fr.json index 0221c2f02a84..4e65415b1b3e 100644 --- a/homeassistant/components/locative/.translations/fr.json +++ b/homeassistant/components/locative/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/hu.json b/homeassistant/components/locative/.translations/hu.json index fba9ff9e13dc..7e3fe9bcb0fc 100644 --- a/homeassistant/components/locative/.translations/hu.json +++ b/homeassistant/components/locative/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Locative Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/it.json b/homeassistant/components/locative/.translations/it.json index 6e691c840311..c023cd832b92 100644 --- a/homeassistant/components/locative/.translations/it.json +++ b/homeassistant/components/locative/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Locative" } } - }, - "title": "Webhook di Locative" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ko.json b/homeassistant/components/locative/.translations/ko.json index a91681736fb7..e2e51a3cbd02 100644 --- a/homeassistant/components/locative/.translations/ko.json +++ b/homeassistant/components/locative/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Locative Webhook \uc124\uc815" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/lb.json b/homeassistant/components/locative/.translations/lb.json index ebbae39b07b0..42086f5cfe58 100644 --- a/homeassistant/components/locative/.translations/lb.json +++ b/homeassistant/components/locative/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Locative Webhook ariichten" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/nl.json b/homeassistant/components/locative/.translations/nl.json index b348b03f2ac4..655752b6e695 100644 --- a/homeassistant/components/locative/.translations/nl.json +++ b/homeassistant/components/locative/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de Locative Webhook in" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/no.json b/homeassistant/components/locative/.translations/no.json index 1363c39d8b83..46f9f4132360 100644 --- a/homeassistant/components/locative/.translations/no.json +++ b/homeassistant/components/locative/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Locative Webhook" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pl.json b/homeassistant/components/locative/.translations/pl.json index 5d254874c512..7294b31ef742 100644 --- a/homeassistant/components/locative/.translations/pl.json +++ b/homeassistant/components/locative/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pt-BR.json b/homeassistant/components/locative/.translations/pt-BR.json index b6fa617b8086..11ea7c671b0c 100644 --- a/homeassistant/components/locative/.translations/pt-BR.json +++ b/homeassistant/components/locative/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/pt.json b/homeassistant/components/locative/.translations/pt.json index b1571ae7516f..e7091e19c094 100644 --- a/homeassistant/components/locative/.translations/pt.json +++ b/homeassistant/components/locative/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/ru.json b/homeassistant/components/locative/.translations/ru.json index 2bb0cccc2817..591f2f423024 100644 --- a/homeassistant/components/locative/.translations/ru.json +++ b/homeassistant/components/locative/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Locative" } } - }, - "title": "Locative" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/sl.json b/homeassistant/components/locative/.translations/sl.json index 77eb3f8a4374..13a2a33aa5fb 100644 --- a/homeassistant/components/locative/.translations/sl.json +++ b/homeassistant/components/locative/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/sv.json b/homeassistant/components/locative/.translations/sv.json index 1f3ae163c76d..45185a5fecaa 100644 --- a/homeassistant/components/locative/.translations/sv.json +++ b/homeassistant/components/locative/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/zh-Hans.json b/homeassistant/components/locative/.translations/zh-Hans.json index 807314ad06c1..9a7245396a15 100644 --- a/homeassistant/components/locative/.translations/zh-Hans.json +++ b/homeassistant/components/locative/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e\u5b9a\u4f4d Webhook" } } - }, - "title": "\u5b9a\u4f4d Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/locative/.translations/zh-Hant.json b/homeassistant/components/locative/.translations/zh-Hant.json index e4590d8f9e6c..53df0ba59eb2 100644 --- a/homeassistant/components/locative/.translations/zh-Hant.json +++ b/homeassistant/components/locative/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Locative Webhook" } } - }, - "title": "Locative Webhook" + } } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/af.json b/homeassistant/components/lock/.translations/af.json new file mode 100644 index 000000000000..e9025e153212 --- /dev/null +++ b/homeassistant/components/lock/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Slot" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ar.json b/homeassistant/components/lock/.translations/ar.json new file mode 100644 index 000000000000..4162a0f14ce3 --- /dev/null +++ b/homeassistant/components/lock/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0642\u0641\u0644" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/bg.json b/homeassistant/components/lock/.translations/bg.json index 54b80842f4f2..69acda4ed489 100644 --- a/homeassistant/components/lock/.translations/bg.json +++ b/homeassistant/components/lock/.translations/bg.json @@ -13,5 +13,6 @@ "locked": "{entity_name} \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d", "unlocked": "{entity_name} \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d" } - } + }, + "title": "\u041a\u043b\u044e\u0447\u0430\u043b\u043a\u0430" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/bs.json b/homeassistant/components/lock/.translations/bs.json new file mode 100644 index 000000000000..51901bb911f1 --- /dev/null +++ b/homeassistant/components/lock/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Zaklju\u010daj" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ca.json b/homeassistant/components/lock/.translations/ca.json index 69655ac1daab..cb7f0207915a 100644 --- a/homeassistant/components/lock/.translations/ca.json +++ b/homeassistant/components/lock/.translations/ca.json @@ -13,5 +13,6 @@ "locked": "{entity_name} s'ha bloquejat", "unlocked": "{entity_name} s'ha desbloquejat" } - } + }, + "title": "Panys" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/cs.json b/homeassistant/components/lock/.translations/cs.json index 3843248a9ee4..8fb24e3ce779 100644 --- a/homeassistant/components/lock/.translations/cs.json +++ b/homeassistant/components/lock/.translations/cs.json @@ -9,5 +9,6 @@ "is_locked": "{entity_name} je uzam\u010deno", "is_unlocked": "{entity_name} je odem\u010deno" } - } + }, + "title": "Z\u00e1mek" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/cy.json b/homeassistant/components/lock/.translations/cy.json new file mode 100644 index 000000000000..696bff2f7768 --- /dev/null +++ b/homeassistant/components/lock/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Clo" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/da.json b/homeassistant/components/lock/.translations/da.json index e2f2588349cc..b3081298e5c2 100644 --- a/homeassistant/components/lock/.translations/da.json +++ b/homeassistant/components/lock/.translations/da.json @@ -13,5 +13,6 @@ "locked": "{entity_name} blev l\u00e5st", "unlocked": "{entity_name} l\u00e5st op" } - } + }, + "title": "L\u00e5s" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/de.json b/homeassistant/components/lock/.translations/de.json index 443c70b68ddf..0ec46ac387c5 100644 --- a/homeassistant/components/lock/.translations/de.json +++ b/homeassistant/components/lock/.translations/de.json @@ -13,5 +13,6 @@ "locked": "{entity_name} gesperrt", "unlocked": "{entity_name} entsperrt" } - } + }, + "title": "Schloss" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/el.json b/homeassistant/components/lock/.translations/el.json new file mode 100644 index 000000000000..62e6aee9f6e2 --- /dev/null +++ b/homeassistant/components/lock/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u039a\u03bb\u03b5\u03af\u03b4\u03c9\u03bc\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/en.json b/homeassistant/components/lock/.translations/en.json index 262ba27d9516..5654afd0281a 100644 --- a/homeassistant/components/lock/.translations/en.json +++ b/homeassistant/components/lock/.translations/en.json @@ -13,5 +13,6 @@ "locked": "{entity_name} locked", "unlocked": "{entity_name} unlocked" } - } + }, + "title": "Lock" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/es-419.json b/homeassistant/components/lock/.translations/es-419.json new file mode 100644 index 000000000000..5f60b921eff9 --- /dev/null +++ b/homeassistant/components/lock/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Cerrar" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/es.json b/homeassistant/components/lock/.translations/es.json index 0c352d9608ab..b0cde00f82ad 100644 --- a/homeassistant/components/lock/.translations/es.json +++ b/homeassistant/components/lock/.translations/es.json @@ -13,5 +13,6 @@ "locked": "{entity_name} bloqueado", "unlocked": "{entity_name} desbloqueado" } - } + }, + "title": "Cerradura" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/et.json b/homeassistant/components/lock/.translations/et.json new file mode 100644 index 000000000000..e830ed3c4bd3 --- /dev/null +++ b/homeassistant/components/lock/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Lukk" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/eu.json b/homeassistant/components/lock/.translations/eu.json new file mode 100644 index 000000000000..f87e718561ae --- /dev/null +++ b/homeassistant/components/lock/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Sarraila" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/fa.json b/homeassistant/components/lock/.translations/fa.json new file mode 100644 index 000000000000..4162a0f14ce3 --- /dev/null +++ b/homeassistant/components/lock/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0642\u0641\u0644" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/fi.json b/homeassistant/components/lock/.translations/fi.json new file mode 100644 index 000000000000..221373a116f3 --- /dev/null +++ b/homeassistant/components/lock/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Lukko" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/fr.json b/homeassistant/components/lock/.translations/fr.json index cc7e7d6f3e3f..526521973806 100644 --- a/homeassistant/components/lock/.translations/fr.json +++ b/homeassistant/components/lock/.translations/fr.json @@ -13,5 +13,6 @@ "locked": "{entity_name} verrouill\u00e9", "unlocked": "{entity_name} d\u00e9verrouill\u00e9" } - } + }, + "title": "Verrou" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/gsw.json b/homeassistant/components/lock/.translations/gsw.json new file mode 100644 index 000000000000..a46901bff353 --- /dev/null +++ b/homeassistant/components/lock/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Schloss" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/he.json b/homeassistant/components/lock/.translations/he.json new file mode 100644 index 000000000000..30915eaf5573 --- /dev/null +++ b/homeassistant/components/lock/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05e0\u05e2\u05d5\u05dc" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/hi.json b/homeassistant/components/lock/.translations/hi.json new file mode 100644 index 000000000000..d4242bd2700d --- /dev/null +++ b/homeassistant/components/lock/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0924\u093e\u0932\u093e" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/hr.json b/homeassistant/components/lock/.translations/hr.json new file mode 100644 index 000000000000..0daad2457c12 --- /dev/null +++ b/homeassistant/components/lock/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Zaklju\u010davanje" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/hu.json b/homeassistant/components/lock/.translations/hu.json index 20b1663558bc..d38a8884cc9d 100644 --- a/homeassistant/components/lock/.translations/hu.json +++ b/homeassistant/components/lock/.translations/hu.json @@ -13,5 +13,6 @@ "locked": "{entity_name} be lett z\u00e1rva", "unlocked": "{entity_name} ki lett nyitva" } - } + }, + "title": "Z\u00e1r" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/hy.json b/homeassistant/components/lock/.translations/hy.json new file mode 100644 index 000000000000..9e48ced4eb66 --- /dev/null +++ b/homeassistant/components/lock/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053f\u0578\u0572\u057a\u0565\u0584" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/id.json b/homeassistant/components/lock/.translations/id.json new file mode 100644 index 000000000000..46cf27299428 --- /dev/null +++ b/homeassistant/components/lock/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kunci" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/is.json b/homeassistant/components/lock/.translations/is.json new file mode 100644 index 000000000000..19571d3ecf7b --- /dev/null +++ b/homeassistant/components/lock/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00e1s" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/it.json b/homeassistant/components/lock/.translations/it.json index 72c350dad242..beb955cdb642 100644 --- a/homeassistant/components/lock/.translations/it.json +++ b/homeassistant/components/lock/.translations/it.json @@ -13,5 +13,6 @@ "locked": "{entity_name} \u00e8 bloccato", "unlocked": "{entity_name} \u00e8 sbloccato" } - } + }, + "title": "Serratura" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ko.json b/homeassistant/components/lock/.translations/ko.json index fb202f73b37a..8398212681ab 100644 --- a/homeassistant/components/lock/.translations/ko.json +++ b/homeassistant/components/lock/.translations/ko.json @@ -13,5 +13,6 @@ "locked": "{entity_name} \uc774(\uac00) \uc7a0\uae38 \ub54c", "unlocked": "{entity_name} \uc774(\uac00) \uc7a0\uae08\uc774 \ud574\uc81c\ub420 \ub54c" } - } + }, + "title": "\uc7a0\uae40" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/lb.json b/homeassistant/components/lock/.translations/lb.json index 1bdfa9ac4ec1..1ce5fcdca0a5 100644 --- a/homeassistant/components/lock/.translations/lb.json +++ b/homeassistant/components/lock/.translations/lb.json @@ -13,5 +13,6 @@ "locked": "{entity_name} gespaart", "unlocked": "{entity_name} entspaart" } - } + }, + "title": "Schlass" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/lv.json b/homeassistant/components/lock/.translations/lv.json new file mode 100644 index 000000000000..ce72e3b3bedb --- /dev/null +++ b/homeassistant/components/lock/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Sl\u0113dzene" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/nb.json b/homeassistant/components/lock/.translations/nb.json new file mode 100644 index 000000000000..db774e6fa0bb --- /dev/null +++ b/homeassistant/components/lock/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00e5s" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/nl.json b/homeassistant/components/lock/.translations/nl.json index 61370236a97a..dc18049ba16d 100644 --- a/homeassistant/components/lock/.translations/nl.json +++ b/homeassistant/components/lock/.translations/nl.json @@ -13,5 +13,6 @@ "locked": "{entity_name} vergrendeld", "unlocked": "{entity_name} ontgrendeld" } - } + }, + "title": "Slot" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/nn.json b/homeassistant/components/lock/.translations/nn.json new file mode 100644 index 000000000000..db774e6fa0bb --- /dev/null +++ b/homeassistant/components/lock/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00e5s" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/pl.json b/homeassistant/components/lock/.translations/pl.json index a3123919615d..527a6f45d30f 100644 --- a/homeassistant/components/lock/.translations/pl.json +++ b/homeassistant/components/lock/.translations/pl.json @@ -13,5 +13,6 @@ "locked": "nast\u0105pi zamkni\u0119cie {entity_name}", "unlocked": "nast\u0105pi otwarcie {entity_name}" } - } + }, + "title": "Zamek" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/pt-BR.json b/homeassistant/components/lock/.translations/pt-BR.json index f6bde89a3a64..76a1e7117b00 100644 --- a/homeassistant/components/lock/.translations/pt-BR.json +++ b/homeassistant/components/lock/.translations/pt-BR.json @@ -5,5 +5,6 @@ "open": "Abrir {entity_name}", "unlock": "Desbloquear {entity_name}" } - } + }, + "title": "Trancar" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/pt.json b/homeassistant/components/lock/.translations/pt.json index 05bcf4416600..b96299070ef6 100644 --- a/homeassistant/components/lock/.translations/pt.json +++ b/homeassistant/components/lock/.translations/pt.json @@ -4,5 +4,6 @@ "locked": "{entity_name} fechada", "unlocked": "{entity_name} aberta" } - } + }, + "title": "Fechadura" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ro.json b/homeassistant/components/lock/.translations/ro.json new file mode 100644 index 000000000000..2a983ee79b84 --- /dev/null +++ b/homeassistant/components/lock/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Blocare" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ru.json b/homeassistant/components/lock/.translations/ru.json index 479fa4bee217..40bc1f09a8b1 100644 --- a/homeassistant/components/lock/.translations/ru.json +++ b/homeassistant/components/lock/.translations/ru.json @@ -13,5 +13,6 @@ "locked": "{entity_name} \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f", "unlocked": "{entity_name} \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f" } - } + }, + "title": "\u0417\u0430\u043c\u043e\u043a" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/sk.json b/homeassistant/components/lock/.translations/sk.json new file mode 100644 index 000000000000..2e8dcdc14cd6 --- /dev/null +++ b/homeassistant/components/lock/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Z\u00e1mok" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/sl.json b/homeassistant/components/lock/.translations/sl.json index 01cf3feb4a68..8ee0aeaaa7b6 100644 --- a/homeassistant/components/lock/.translations/sl.json +++ b/homeassistant/components/lock/.translations/sl.json @@ -13,5 +13,6 @@ "locked": "{entity_name} zaklenjen/a", "unlocked": "{entity_name} odklenjen/a" } - } + }, + "title": "Klju\u010davnice" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/sv.json b/homeassistant/components/lock/.translations/sv.json index 7d50b4ea61a9..d4eecaad20eb 100644 --- a/homeassistant/components/lock/.translations/sv.json +++ b/homeassistant/components/lock/.translations/sv.json @@ -13,5 +13,6 @@ "locked": "{entity_name} l\u00e5st", "unlocked": "{entity_name} ol\u00e5st" } - } + }, + "title": "L\u00e5s" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/ta.json b/homeassistant/components/lock/.translations/ta.json new file mode 100644 index 000000000000..5ffdfc78cfdc --- /dev/null +++ b/homeassistant/components/lock/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0baa\u0bc2\u0b9f\u0bcd\u0b9f\u0bc1" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/te.json b/homeassistant/components/lock/.translations/te.json new file mode 100644 index 000000000000..b32becac8716 --- /dev/null +++ b/homeassistant/components/lock/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c32\u0c3e\u0c15\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/th.json b/homeassistant/components/lock/.translations/th.json new file mode 100644 index 000000000000..e53864e7a02c --- /dev/null +++ b/homeassistant/components/lock/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e25\u0e47\u0e2d\u0e04" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/tr.json b/homeassistant/components/lock/.translations/tr.json new file mode 100644 index 000000000000..9a0a1d8899f7 --- /dev/null +++ b/homeassistant/components/lock/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Kilit" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/uk.json b/homeassistant/components/lock/.translations/uk.json new file mode 100644 index 000000000000..700372a91635 --- /dev/null +++ b/homeassistant/components/lock/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0417\u0430\u043c\u043e\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/vi.json b/homeassistant/components/lock/.translations/vi.json new file mode 100644 index 000000000000..68af2a463987 --- /dev/null +++ b/homeassistant/components/lock/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Kh\u00f3a" +} \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/zh-Hans.json b/homeassistant/components/lock/.translations/zh-Hans.json index 049d88ba3a34..52da286bbc3d 100644 --- a/homeassistant/components/lock/.translations/zh-Hans.json +++ b/homeassistant/components/lock/.translations/zh-Hans.json @@ -4,5 +4,6 @@ "locked": "{entity_name} \u88ab\u9501\u5b9a", "unlocked": "{entity_name} \u88ab\u89e3\u9501" } - } + }, + "title": "\u9501" } \ No newline at end of file diff --git a/homeassistant/components/lock/.translations/zh-Hant.json b/homeassistant/components/lock/.translations/zh-Hant.json index 054f7a5a18d6..bbc7b0c3738a 100644 --- a/homeassistant/components/lock/.translations/zh-Hant.json +++ b/homeassistant/components/lock/.translations/zh-Hant.json @@ -13,5 +13,6 @@ "locked": "{entity_name}\u5df2\u4e0a\u9396", "unlocked": "{entity_name}\u5df2\u89e3\u9396" } - } + }, + "title": "\u5df2\u4e0a\u9396" } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/bg.json b/homeassistant/components/logi_circle/.translations/bg.json index 4b825f1dfd3e..792290656dff 100644 --- a/homeassistant/components/logi_circle/.translations/bg.json +++ b/homeassistant/components/logi_circle/.translations/bg.json @@ -27,6 +27,5 @@ "title": "\u0414\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ca.json b/homeassistant/components/logi_circle/.translations/ca.json index 4be8656a3b1d..2da6bc19d7d8 100644 --- a/homeassistant/components/logi_circle/.translations/ca.json +++ b/homeassistant/components/logi_circle/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Prove\u00efdor d'autenticaci\u00f3" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/da.json b/homeassistant/components/logi_circle/.translations/da.json index bda554b39cc3..fecab8182952 100644 --- a/homeassistant/components/logi_circle/.translations/da.json +++ b/homeassistant/components/logi_circle/.translations/da.json @@ -27,6 +27,5 @@ "title": "Godkendelsesudbyder" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/de.json b/homeassistant/components/logi_circle/.translations/de.json index 34c49f13b9e0..81292c8306df 100644 --- a/homeassistant/components/logi_circle/.translations/de.json +++ b/homeassistant/components/logi_circle/.translations/de.json @@ -27,6 +27,5 @@ "title": "Authentifizierungsanbieter" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/en.json b/homeassistant/components/logi_circle/.translations/en.json index cd829c3f1292..4befbe95f60f 100644 --- a/homeassistant/components/logi_circle/.translations/en.json +++ b/homeassistant/components/logi_circle/.translations/en.json @@ -27,6 +27,5 @@ "title": "Authentication Provider" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/es-419.json b/homeassistant/components/logi_circle/.translations/es-419.json index cb6285e479e0..8cc688338752 100644 --- a/homeassistant/components/logi_circle/.translations/es-419.json +++ b/homeassistant/components/logi_circle/.translations/es-419.json @@ -22,6 +22,5 @@ "title": "Proveedor de autenticaci\u00f3n" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/es.json b/homeassistant/components/logi_circle/.translations/es.json index 17be05d9ff8d..d262a9659d10 100644 --- a/homeassistant/components/logi_circle/.translations/es.json +++ b/homeassistant/components/logi_circle/.translations/es.json @@ -27,6 +27,5 @@ "title": "Proveedor de autenticaci\u00f3n" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/fr.json b/homeassistant/components/logi_circle/.translations/fr.json index 909116d8faf8..170edcaf48a2 100644 --- a/homeassistant/components/logi_circle/.translations/fr.json +++ b/homeassistant/components/logi_circle/.translations/fr.json @@ -27,6 +27,5 @@ "title": "Fournisseur d'authentification" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/it.json b/homeassistant/components/logi_circle/.translations/it.json index f5c066ae4c86..6ce7948472eb 100644 --- a/homeassistant/components/logi_circle/.translations/it.json +++ b/homeassistant/components/logi_circle/.translations/it.json @@ -27,6 +27,5 @@ "title": "Provider di autenticazione" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ko.json b/homeassistant/components/logi_circle/.translations/ko.json index afb9258cddc7..de6ca6f483c0 100644 --- a/homeassistant/components/logi_circle/.translations/ko.json +++ b/homeassistant/components/logi_circle/.translations/ko.json @@ -27,6 +27,5 @@ "title": "\uc778\uc99d \uacf5\uae09\uc790" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/lb.json b/homeassistant/components/logi_circle/.translations/lb.json index 955507c447e4..1d19cb32b8c8 100644 --- a/homeassistant/components/logi_circle/.translations/lb.json +++ b/homeassistant/components/logi_circle/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Authentifikatioun Ubidder" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/nl.json b/homeassistant/components/logi_circle/.translations/nl.json index f1cb6881a95a..01b6309e90a4 100644 --- a/homeassistant/components/logi_circle/.translations/nl.json +++ b/homeassistant/components/logi_circle/.translations/nl.json @@ -27,6 +27,5 @@ "title": "Authenticatieprovider" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/nn.json b/homeassistant/components/logi_circle/.translations/nn.json index 42396486277e..f6c91435c067 100644 --- a/homeassistant/components/logi_circle/.translations/nn.json +++ b/homeassistant/components/logi_circle/.translations/nn.json @@ -14,6 +14,5 @@ "description": "Vel kva for ein autentiseringsleverand\u00f8r du vil godkjenne med Logi Circle" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/no.json b/homeassistant/components/logi_circle/.translations/no.json index 58e86a3d2287..2a274bf75d73 100644 --- a/homeassistant/components/logi_circle/.translations/no.json +++ b/homeassistant/components/logi_circle/.translations/no.json @@ -27,6 +27,5 @@ "title": "Autentiseringsleverand\u00f8r" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/pl.json b/homeassistant/components/logi_circle/.translations/pl.json index 826a6c4bd0df..80d075c35898 100644 --- a/homeassistant/components/logi_circle/.translations/pl.json +++ b/homeassistant/components/logi_circle/.translations/pl.json @@ -27,6 +27,5 @@ "title": "Dostawca uwierzytelnienia" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/pt-BR.json b/homeassistant/components/logi_circle/.translations/pt-BR.json index 0ab768ae7b88..ece65955dee7 100644 --- a/homeassistant/components/logi_circle/.translations/pt-BR.json +++ b/homeassistant/components/logi_circle/.translations/pt-BR.json @@ -27,6 +27,5 @@ "title": "Provedor de Autentica\u00e7\u00e3o" } } - }, - "title": "C\u00edrculo Logi" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/ru.json b/homeassistant/components/logi_circle/.translations/ru.json index b60748ad84c6..906b647bbef7 100644 --- a/homeassistant/components/logi_circle/.translations/ru.json +++ b/homeassistant/components/logi_circle/.translations/ru.json @@ -27,6 +27,5 @@ "title": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/sl.json b/homeassistant/components/logi_circle/.translations/sl.json index 04db56d126a1..e839d9864c28 100644 --- a/homeassistant/components/logi_circle/.translations/sl.json +++ b/homeassistant/components/logi_circle/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Ponudnik overjanja" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/sv.json b/homeassistant/components/logi_circle/.translations/sv.json index 59875cbe61e4..d0ea36f7bfc4 100644 --- a/homeassistant/components/logi_circle/.translations/sv.json +++ b/homeassistant/components/logi_circle/.translations/sv.json @@ -27,6 +27,5 @@ "title": "Verifieringsleverant\u00f6r" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/logi_circle/.translations/zh-Hant.json b/homeassistant/components/logi_circle/.translations/zh-Hant.json index 96e037ce72fc..a94269808d37 100644 --- a/homeassistant/components/logi_circle/.translations/zh-Hant.json +++ b/homeassistant/components/logi_circle/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u8a8d\u8b49\u63d0\u4f9b\u8005" } } - }, - "title": "Logi Circle" + } } \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/af.json b/homeassistant/components/lovelace/.translations/af.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/bg.json b/homeassistant/components/lovelace/.translations/bg.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/ca.json b/homeassistant/components/lovelace/.translations/ca.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/cs.json b/homeassistant/components/lovelace/.translations/cs.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/cy.json b/homeassistant/components/lovelace/.translations/cy.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/da.json b/homeassistant/components/lovelace/.translations/da.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/de.json b/homeassistant/components/lovelace/.translations/de.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/el.json b/homeassistant/components/lovelace/.translations/el.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/en.json b/homeassistant/components/lovelace/.translations/en.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/es-419.json b/homeassistant/components/lovelace/.translations/es-419.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/es.json b/homeassistant/components/lovelace/.translations/es.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/et.json b/homeassistant/components/lovelace/.translations/et.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/eu.json b/homeassistant/components/lovelace/.translations/eu.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/fa.json b/homeassistant/components/lovelace/.translations/fa.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/fi.json b/homeassistant/components/lovelace/.translations/fi.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/fr.json b/homeassistant/components/lovelace/.translations/fr.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/he.json b/homeassistant/components/lovelace/.translations/he.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/hr.json b/homeassistant/components/lovelace/.translations/hr.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/hu.json b/homeassistant/components/lovelace/.translations/hu.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/hy.json b/homeassistant/components/lovelace/.translations/hy.json new file mode 100644 index 000000000000..cbdc153a582c --- /dev/null +++ b/homeassistant/components/lovelace/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u057d\u056b\u0580\u0578" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/is.json b/homeassistant/components/lovelace/.translations/is.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/it.json b/homeassistant/components/lovelace/.translations/it.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/ko.json b/homeassistant/components/lovelace/.translations/ko.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/lb.json b/homeassistant/components/lovelace/.translations/lb.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/lt.json b/homeassistant/components/lovelace/.translations/lt.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/lt.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/lv.json b/homeassistant/components/lovelace/.translations/lv.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/nb.json b/homeassistant/components/lovelace/.translations/nb.json new file mode 100644 index 000000000000..d8a4c4530151 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/nl.json b/homeassistant/components/lovelace/.translations/nl.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/nn.json b/homeassistant/components/lovelace/.translations/nn.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/pl.json b/homeassistant/components/lovelace/.translations/pl.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/pt-BR.json b/homeassistant/components/lovelace/.translations/pt-BR.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/pt.json b/homeassistant/components/lovelace/.translations/pt.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/ro.json b/homeassistant/components/lovelace/.translations/ro.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/ru.json b/homeassistant/components/lovelace/.translations/ru.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/sk.json b/homeassistant/components/lovelace/.translations/sk.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/sl.json b/homeassistant/components/lovelace/.translations/sl.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/sv.json b/homeassistant/components/lovelace/.translations/sv.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/th.json b/homeassistant/components/lovelace/.translations/th.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/tr.json b/homeassistant/components/lovelace/.translations/tr.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/uk.json b/homeassistant/components/lovelace/.translations/uk.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/vi.json b/homeassistant/components/lovelace/.translations/vi.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/zh-Hans.json b/homeassistant/components/lovelace/.translations/zh-Hans.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/lovelace/.translations/zh-Hant.json b/homeassistant/components/lovelace/.translations/zh-Hant.json new file mode 100644 index 000000000000..2fc0c81a46c2 --- /dev/null +++ b/homeassistant/components/lovelace/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "Lovelace" +} \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/bg.json b/homeassistant/components/luftdaten/.translations/bg.json index ced6f0344005..816d0519ecc3 100644 --- a/homeassistant/components/luftdaten/.translations/bg.json +++ b/homeassistant/components/luftdaten/.translations/bg.json @@ -14,6 +14,5 @@ "title": "\u0414\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ca.json b/homeassistant/components/luftdaten/.translations/ca.json index 6b97a4c94bcb..e1b5072b96e6 100644 --- a/homeassistant/components/luftdaten/.translations/ca.json +++ b/homeassistant/components/luftdaten/.translations/ca.json @@ -14,6 +14,5 @@ "title": "Configuraci\u00f3 de Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/cs.json b/homeassistant/components/luftdaten/.translations/cs.json index 244284995ed4..0a38e6200b9d 100644 --- a/homeassistant/components/luftdaten/.translations/cs.json +++ b/homeassistant/components/luftdaten/.translations/cs.json @@ -14,6 +14,5 @@ "title": "Definujte Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/da.json b/homeassistant/components/luftdaten/.translations/da.json index 617ee8bf51c6..c44ee1076180 100644 --- a/homeassistant/components/luftdaten/.translations/da.json +++ b/homeassistant/components/luftdaten/.translations/da.json @@ -14,6 +14,5 @@ "title": "Definer Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/de.json b/homeassistant/components/luftdaten/.translations/de.json index 50c1bd8b430e..b2169dbc2ab7 100644 --- a/homeassistant/components/luftdaten/.translations/de.json +++ b/homeassistant/components/luftdaten/.translations/de.json @@ -14,6 +14,5 @@ "title": "Luftdaten einrichten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/en.json b/homeassistant/components/luftdaten/.translations/en.json index 435497933ddd..0c325c709705 100644 --- a/homeassistant/components/luftdaten/.translations/en.json +++ b/homeassistant/components/luftdaten/.translations/en.json @@ -14,6 +14,5 @@ "title": "Define Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/es-419.json b/homeassistant/components/luftdaten/.translations/es-419.json index a53a04a3cc48..eddf31c91abd 100644 --- a/homeassistant/components/luftdaten/.translations/es-419.json +++ b/homeassistant/components/luftdaten/.translations/es-419.json @@ -14,6 +14,5 @@ "title": "Definir Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/es.json b/homeassistant/components/luftdaten/.translations/es.json index 4f392558d23a..9f8276ff3b86 100644 --- a/homeassistant/components/luftdaten/.translations/es.json +++ b/homeassistant/components/luftdaten/.translations/es.json @@ -14,6 +14,5 @@ "title": "Definir Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/fr.json b/homeassistant/components/luftdaten/.translations/fr.json index ed73bcf0618d..8b3492a04273 100644 --- a/homeassistant/components/luftdaten/.translations/fr.json +++ b/homeassistant/components/luftdaten/.translations/fr.json @@ -14,6 +14,5 @@ "title": "D\u00e9finir Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/hu.json b/homeassistant/components/luftdaten/.translations/hu.json index 4677c69a7ba9..2d63c0f5852e 100644 --- a/homeassistant/components/luftdaten/.translations/hu.json +++ b/homeassistant/components/luftdaten/.translations/hu.json @@ -14,6 +14,5 @@ "title": "Luftdaten be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/it.json b/homeassistant/components/luftdaten/.translations/it.json index 45fb05b01085..f3673c2775d2 100644 --- a/homeassistant/components/luftdaten/.translations/it.json +++ b/homeassistant/components/luftdaten/.translations/it.json @@ -14,6 +14,5 @@ "title": "Definisci Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ko.json b/homeassistant/components/luftdaten/.translations/ko.json index ae77202ec822..a5b4c5cc4668 100644 --- a/homeassistant/components/luftdaten/.translations/ko.json +++ b/homeassistant/components/luftdaten/.translations/ko.json @@ -14,6 +14,5 @@ "title": "Luftdaten \uc124\uc815" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/lb.json b/homeassistant/components/luftdaten/.translations/lb.json index 00b5ec5d08ce..d7f17fb52207 100644 --- a/homeassistant/components/luftdaten/.translations/lb.json +++ b/homeassistant/components/luftdaten/.translations/lb.json @@ -14,6 +14,5 @@ "title": "Luftdaten d\u00e9fin\u00e9ieren" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/nl.json b/homeassistant/components/luftdaten/.translations/nl.json index bc53a164a5bc..f7c93460fa74 100644 --- a/homeassistant/components/luftdaten/.translations/nl.json +++ b/homeassistant/components/luftdaten/.translations/nl.json @@ -14,6 +14,5 @@ "title": "Definieer Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/no.json b/homeassistant/components/luftdaten/.translations/no.json index 10f635d8d4da..1d48834f755e 100644 --- a/homeassistant/components/luftdaten/.translations/no.json +++ b/homeassistant/components/luftdaten/.translations/no.json @@ -14,6 +14,5 @@ "title": "Definer Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pl.json b/homeassistant/components/luftdaten/.translations/pl.json index c7a20a8abadf..1a5b58586df5 100644 --- a/homeassistant/components/luftdaten/.translations/pl.json +++ b/homeassistant/components/luftdaten/.translations/pl.json @@ -14,6 +14,5 @@ "title": "Konfiguracja Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pt-BR.json b/homeassistant/components/luftdaten/.translations/pt-BR.json index 004fbc36c50e..e2fce8f57c4d 100644 --- a/homeassistant/components/luftdaten/.translations/pt-BR.json +++ b/homeassistant/components/luftdaten/.translations/pt-BR.json @@ -14,6 +14,5 @@ "title": "Definir Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/pt.json b/homeassistant/components/luftdaten/.translations/pt.json index 5522e08226a2..deb2de26fdc7 100644 --- a/homeassistant/components/luftdaten/.translations/pt.json +++ b/homeassistant/components/luftdaten/.translations/pt.json @@ -14,6 +14,5 @@ "title": "Definir Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/ru.json b/homeassistant/components/luftdaten/.translations/ru.json index 3d0530c54ea2..5123fa9438b4 100644 --- a/homeassistant/components/luftdaten/.translations/ru.json +++ b/homeassistant/components/luftdaten/.translations/ru.json @@ -14,6 +14,5 @@ "title": "Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/sl.json b/homeassistant/components/luftdaten/.translations/sl.json index 73e1b48b342f..edf88f798f9d 100644 --- a/homeassistant/components/luftdaten/.translations/sl.json +++ b/homeassistant/components/luftdaten/.translations/sl.json @@ -14,6 +14,5 @@ "title": "Dolo\u010dite Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/sv.json b/homeassistant/components/luftdaten/.translations/sv.json index 96172796a599..62d823c5fe9a 100644 --- a/homeassistant/components/luftdaten/.translations/sv.json +++ b/homeassistant/components/luftdaten/.translations/sv.json @@ -14,6 +14,5 @@ "title": "Definiera Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/zh-Hans.json b/homeassistant/components/luftdaten/.translations/zh-Hans.json index 693079bcd9c5..02024b18494f 100644 --- a/homeassistant/components/luftdaten/.translations/zh-Hans.json +++ b/homeassistant/components/luftdaten/.translations/zh-Hans.json @@ -14,6 +14,5 @@ "title": "\u5b9a\u4e49 Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/luftdaten/.translations/zh-Hant.json b/homeassistant/components/luftdaten/.translations/zh-Hant.json index 310cf325f01d..2c0e06f8006a 100644 --- a/homeassistant/components/luftdaten/.translations/zh-Hant.json +++ b/homeassistant/components/luftdaten/.translations/zh-Hant.json @@ -14,6 +14,5 @@ "title": "\u5b9a\u7fa9 Luftdaten" } } - }, - "title": "Luftdaten" + } } \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/af.json b/homeassistant/components/mailbox/.translations/af.json new file mode 100644 index 000000000000..a3922ec5b6bf --- /dev/null +++ b/homeassistant/components/mailbox/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Posbus" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ar.json b/homeassistant/components/mailbox/.translations/ar.json new file mode 100644 index 000000000000..287aace0fe38 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u0628\u0631\u064a\u062f" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/bg.json b/homeassistant/components/mailbox/.translations/bg.json new file mode 100644 index 000000000000..d28a1480f9ad --- /dev/null +++ b/homeassistant/components/mailbox/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u043e\u0449\u0435\u043d\u0441\u043a\u0430 \u043a\u0443\u0442\u0438\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/bs.json b/homeassistant/components/mailbox/.translations/bs.json new file mode 100644 index 000000000000..611c172b426e --- /dev/null +++ b/homeassistant/components/mailbox/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Po\u0161tansko sandu\u010de" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ca.json b/homeassistant/components/mailbox/.translations/ca.json new file mode 100644 index 000000000000..2d25417753e7 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "B\u00fastia" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/cs.json b/homeassistant/components/mailbox/.translations/cs.json new file mode 100644 index 000000000000..13aad35f5b9f --- /dev/null +++ b/homeassistant/components/mailbox/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Po\u0161tovn\u00ed schr\u00e1nka" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/cy.json b/homeassistant/components/mailbox/.translations/cy.json new file mode 100644 index 000000000000..1673ff40443c --- /dev/null +++ b/homeassistant/components/mailbox/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Blwch post" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/da.json b/homeassistant/components/mailbox/.translations/da.json new file mode 100644 index 000000000000..3c5eee88fbd8 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Postkasse" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/de.json b/homeassistant/components/mailbox/.translations/de.json new file mode 100644 index 000000000000..afbbced95e7d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Postfach" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/el.json b/homeassistant/components/mailbox/.translations/el.json new file mode 100644 index 000000000000..1c05c3728117 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03ba\u03b9\u03b2\u03ce\u03c4\u03b9\u03bf" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/en.json b/homeassistant/components/mailbox/.translations/en.json new file mode 100644 index 000000000000..9c47ef20696e --- /dev/null +++ b/homeassistant/components/mailbox/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Mailbox" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/es-419.json b/homeassistant/components/mailbox/.translations/es-419.json new file mode 100644 index 000000000000..a099f895f94d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Buz\u00f3n" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/es.json b/homeassistant/components/mailbox/.translations/es.json new file mode 100644 index 000000000000..a099f895f94d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Buz\u00f3n" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/et.json b/homeassistant/components/mailbox/.translations/et.json new file mode 100644 index 000000000000..6f16b99f5e76 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Postkast" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/eu.json b/homeassistant/components/mailbox/.translations/eu.json new file mode 100644 index 000000000000..a1a6b038670b --- /dev/null +++ b/homeassistant/components/mailbox/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Postontzia" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/fa.json b/homeassistant/components/mailbox/.translations/fa.json new file mode 100644 index 000000000000..eef7cb31d065 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u06cc\u0644 \u0628\u0627\u06a9\u0633" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/fi.json b/homeassistant/components/mailbox/.translations/fi.json new file mode 100644 index 000000000000..34f34c789d37 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Postilaatikko" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/fr.json b/homeassistant/components/mailbox/.translations/fr.json new file mode 100644 index 000000000000..b19309b5aca0 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Boites aux lettres" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/he.json b/homeassistant/components/mailbox/.translations/he.json new file mode 100644 index 000000000000..c22e68673aa5 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05ea\u05d9\u05d1\u05ea \u05d3\u05d5\u05d0\u05e8" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/hi.json b/homeassistant/components/mailbox/.translations/hi.json new file mode 100644 index 000000000000..5fb0b0a2ad29 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u092e\u0947\u0932\u092c\u0949\u0915\u094d\u0938" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/hr.json b/homeassistant/components/mailbox/.translations/hr.json new file mode 100644 index 000000000000..1a330a2e3e19 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Po\u0161tanski sandu\u010di\u0107" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/hu.json b/homeassistant/components/mailbox/.translations/hu.json new file mode 100644 index 000000000000..184ee25ab2bc --- /dev/null +++ b/homeassistant/components/mailbox/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Postafi\u00f3k" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/hy.json b/homeassistant/components/mailbox/.translations/hy.json new file mode 100644 index 000000000000..7671b559d56d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0553\u0578\u057d\u057f\u0561\u0580\u056f\u0572" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/id.json b/homeassistant/components/mailbox/.translations/id.json new file mode 100644 index 000000000000..b91fd076b8a7 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kotak pesan" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/is.json b/homeassistant/components/mailbox/.translations/is.json new file mode 100644 index 000000000000..d4fdf75a2d57 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "P\u00f3sth\u00f3lf" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/it.json b/homeassistant/components/mailbox/.translations/it.json new file mode 100644 index 000000000000..724a20934f12 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Messaggi" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ja.json b/homeassistant/components/mailbox/.translations/ja.json new file mode 100644 index 000000000000..dc980b39088e --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30e1\u30fc\u30eb\u30dc\u30c3\u30af\u30b9" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ko.json b/homeassistant/components/mailbox/.translations/ko.json new file mode 100644 index 000000000000..9f3acdac9897 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uba54\uc77c\ud568" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/lb.json b/homeassistant/components/mailbox/.translations/lb.json new file mode 100644 index 000000000000..ddaa6a26c5fa --- /dev/null +++ b/homeassistant/components/mailbox/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Br\u00e9ifk\u00ebscht" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/lv.json b/homeassistant/components/mailbox/.translations/lv.json new file mode 100644 index 000000000000..fd11ec96cef9 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Pastkast\u012bte" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/nb.json b/homeassistant/components/mailbox/.translations/nb.json new file mode 100644 index 000000000000..3c5eee88fbd8 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Postkasse" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/nl.json b/homeassistant/components/mailbox/.translations/nl.json new file mode 100644 index 000000000000..4392f15554cd --- /dev/null +++ b/homeassistant/components/mailbox/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Postvak" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/nn.json b/homeassistant/components/mailbox/.translations/nn.json new file mode 100644 index 000000000000..3c5eee88fbd8 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Postkasse" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/pl.json b/homeassistant/components/mailbox/.translations/pl.json new file mode 100644 index 000000000000..0950f58f1832 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Poczta" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/pt-BR.json b/homeassistant/components/mailbox/.translations/pt-BR.json new file mode 100644 index 000000000000..91860a296631 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Caixa de correio" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/pt.json b/homeassistant/components/mailbox/.translations/pt.json new file mode 100644 index 000000000000..91860a296631 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Caixa de correio" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ro.json b/homeassistant/components/mailbox/.translations/ro.json new file mode 100644 index 000000000000..fc36e86b9f07 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Cutie po\u0219tal\u0103" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ru.json b/homeassistant/components/mailbox/.translations/ru.json new file mode 100644 index 000000000000..900934ae82c9 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/sk.json b/homeassistant/components/mailbox/.translations/sk.json new file mode 100644 index 000000000000..260d2d80750d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Po\u0161tov\u00e1 schr\u00e1nka" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/sl.json b/homeassistant/components/mailbox/.translations/sl.json new file mode 100644 index 000000000000..2e362de69fe9 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Po\u0161tni predal" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/sv.json b/homeassistant/components/mailbox/.translations/sv.json new file mode 100644 index 000000000000..1238dd85b772 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Brevl\u00e5da" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/ta.json b/homeassistant/components/mailbox/.translations/ta.json new file mode 100644 index 000000000000..ddc6e1a1d3a0 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b85\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0baa\u0bc6\u0b9f\u0bcd\u0b9f\u0bbf" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/te.json b/homeassistant/components/mailbox/.translations/te.json new file mode 100644 index 000000000000..64b24fe6f160 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2c\u0c3e\u0c15\u0c4d\u0c38\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/th.json b/homeassistant/components/mailbox/.translations/th.json new file mode 100644 index 000000000000..bf46c84aa03d --- /dev/null +++ b/homeassistant/components/mailbox/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e08\u0e14\u0e2b\u0e21\u0e32\u0e22" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/tr.json b/homeassistant/components/mailbox/.translations/tr.json new file mode 100644 index 000000000000..b9b8f4471247 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Posta kutusu" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/uk.json b/homeassistant/components/mailbox/.translations/uk.json new file mode 100644 index 000000000000..603e9049fdeb --- /dev/null +++ b/homeassistant/components/mailbox/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u043e\u0448\u0442\u043e\u0432\u0430 \u0441\u043a\u0440\u0438\u043d\u044c\u043a\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/vi.json b/homeassistant/components/mailbox/.translations/vi.json new file mode 100644 index 000000000000..69b22a8448c1 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "H\u1ed9p th\u01b0" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/zh-Hans.json b/homeassistant/components/mailbox/.translations/zh-Hans.json new file mode 100644 index 000000000000..276927624df4 --- /dev/null +++ b/homeassistant/components/mailbox/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u90ae\u7bb1" +} \ No newline at end of file diff --git a/homeassistant/components/mailbox/.translations/zh-Hant.json b/homeassistant/components/mailbox/.translations/zh-Hant.json new file mode 100644 index 000000000000..0f163529163a --- /dev/null +++ b/homeassistant/components/mailbox/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u90f5\u7bb1" +} \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/bg.json b/homeassistant/components/mailgun/.translations/bg.json index 02c4b631fff8..207dbe2b3adf 100644 --- a/homeassistant/components/mailgun/.translations/bg.json +++ b/homeassistant/components/mailgun/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ca.json b/homeassistant/components/mailgun/.translations/ca.json index fe50470f59d0..eb79eb5eddd5 100644 --- a/homeassistant/components/mailgun/.translations/ca.json +++ b/homeassistant/components/mailgun/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/cs.json b/homeassistant/components/mailgun/.translations/cs.json index 6dc7f9f05175..7a687ac8e927 100644 --- a/homeassistant/components/mailgun/.translations/cs.json +++ b/homeassistant/components/mailgun/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastavit Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/da.json b/homeassistant/components/mailgun/.translations/da.json index 1b0b909e5db4..ee50332933f8 100644 --- a/homeassistant/components/mailgun/.translations/da.json +++ b/homeassistant/components/mailgun/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/de.json b/homeassistant/components/mailgun/.translations/de.json index c73eafdc2648..d37fe5d0388a 100644 --- a/homeassistant/components/mailgun/.translations/de.json +++ b/homeassistant/components/mailgun/.translations/de.json @@ -13,6 +13,5 @@ "title": "Mailgun-Webhook einrichten" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/en.json b/homeassistant/components/mailgun/.translations/en.json index dc2cd72d3ac7..85044505c84f 100644 --- a/homeassistant/components/mailgun/.translations/en.json +++ b/homeassistant/components/mailgun/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/es-419.json b/homeassistant/components/mailgun/.translations/es-419.json index 89a3c8751b4a..4e95e6934f82 100644 --- a/homeassistant/components/mailgun/.translations/es-419.json +++ b/homeassistant/components/mailgun/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/es.json b/homeassistant/components/mailgun/.translations/es.json index 1f0614147276..27033df40490 100644 --- a/homeassistant/components/mailgun/.translations/es.json +++ b/homeassistant/components/mailgun/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/fr.json b/homeassistant/components/mailgun/.translations/fr.json index e9a5835e2d34..84c69d1b6f08 100644 --- a/homeassistant/components/mailgun/.translations/fr.json +++ b/homeassistant/components/mailgun/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/hu.json b/homeassistant/components/mailgun/.translations/hu.json index ca2468ced7fb..89cfcbf358ed 100644 --- a/homeassistant/components/mailgun/.translations/hu.json +++ b/homeassistant/components/mailgun/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Mailgun Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/it.json b/homeassistant/components/mailgun/.translations/it.json index 8230edd5ca68..f913f513b213 100644 --- a/homeassistant/components/mailgun/.translations/it.json +++ b/homeassistant/components/mailgun/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ko.json b/homeassistant/components/mailgun/.translations/ko.json index 7d4fbb76be77..975b0154da53 100644 --- a/homeassistant/components/mailgun/.translations/ko.json +++ b/homeassistant/components/mailgun/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Mailgun Webhook \uc124\uc815" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/lb.json b/homeassistant/components/mailgun/.translations/lb.json index ef622bb6b379..e416bdc6a64e 100644 --- a/homeassistant/components/mailgun/.translations/lb.json +++ b/homeassistant/components/mailgun/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Mailgun Webhook ariichten" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/nl.json b/homeassistant/components/mailgun/.translations/nl.json index c9fcc2d150d2..9444b5045d38 100644 --- a/homeassistant/components/mailgun/.translations/nl.json +++ b/homeassistant/components/mailgun/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de Mailgun Webhook in" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/no.json b/homeassistant/components/mailgun/.translations/no.json index 2a6aaa2984a8..9f26892e703b 100644 --- a/homeassistant/components/mailgun/.translations/no.json +++ b/homeassistant/components/mailgun/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pl.json b/homeassistant/components/mailgun/.translations/pl.json index 725ade01ae1c..c1184dbb9e4e 100644 --- a/homeassistant/components/mailgun/.translations/pl.json +++ b/homeassistant/components/mailgun/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pt-BR.json b/homeassistant/components/mailgun/.translations/pt-BR.json index 4b5471bc08e9..6285162878e5 100644 --- a/homeassistant/components/mailgun/.translations/pt-BR.json +++ b/homeassistant/components/mailgun/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/pt.json b/homeassistant/components/mailgun/.translations/pt.json index 102d1420d6d1..e6d7329f52ab 100644 --- a/homeassistant/components/mailgun/.translations/pt.json +++ b/homeassistant/components/mailgun/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/ru.json b/homeassistant/components/mailgun/.translations/ru.json index e21eb422a64c..c26b3b93832e 100644 --- a/homeassistant/components/mailgun/.translations/ru.json +++ b/homeassistant/components/mailgun/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Mailgun" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/sl.json b/homeassistant/components/mailgun/.translations/sl.json index b9594f9ec864..b660cb871dae 100644 --- a/homeassistant/components/mailgun/.translations/sl.json +++ b/homeassistant/components/mailgun/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/sv.json b/homeassistant/components/mailgun/.translations/sv.json index 6bbd3cee3ef4..baed592049e7 100644 --- a/homeassistant/components/mailgun/.translations/sv.json +++ b/homeassistant/components/mailgun/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/zh-Hans.json b/homeassistant/components/mailgun/.translations/zh-Hans.json index 3569cc21659b..1c6af1dc4c06 100644 --- a/homeassistant/components/mailgun/.translations/zh-Hans.json +++ b/homeassistant/components/mailgun/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/mailgun/.translations/zh-Hant.json b/homeassistant/components/mailgun/.translations/zh-Hant.json index 8d437f90dcbf..1d500c180c20 100644 --- a/homeassistant/components/mailgun/.translations/zh-Hant.json +++ b/homeassistant/components/mailgun/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Mailgun Webhook" } } - }, - "title": "Mailgun" + } } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/af.json b/homeassistant/components/media_player/.translations/af.json new file mode 100644 index 000000000000..0e013c92be6a --- /dev/null +++ b/homeassistant/components/media_player/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Media-speler" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ar.json b/homeassistant/components/media_player/.translations/ar.json new file mode 100644 index 000000000000..41a6cd0b14b4 --- /dev/null +++ b/homeassistant/components/media_player/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0634\u063a\u0644 \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/bg.json b/homeassistant/components/media_player/.translations/bg.json index f6c18cbe1191..359768ca7a84 100644 --- a/homeassistant/components/media_player/.translations/bg.json +++ b/homeassistant/components/media_player/.translations/bg.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \u0435 \u043d\u0430 \u043f\u0430\u0443\u0437\u0430", "is_playing": "{entity_name} \u0432\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430" } - } + }, + "title": "\u041c\u0435\u0434\u0438\u0435\u043d \u043f\u043b\u0435\u0439\u044a\u0440" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/bs.json b/homeassistant/components/media_player/.translations/bs.json new file mode 100644 index 000000000000..f611b8ee0648 --- /dev/null +++ b/homeassistant/components/media_player/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Media player" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ca.json b/homeassistant/components/media_player/.translations/ca.json index 4889c1781c31..eb23f36df46c 100644 --- a/homeassistant/components/media_player/.translations/ca.json +++ b/homeassistant/components/media_player/.translations/ca.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} est\u00e0 en pausa", "is_playing": "{entity_name} est\u00e0 reproduint" } - } + }, + "title": "Reproductor multim\u00e8dia" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/cs.json b/homeassistant/components/media_player/.translations/cs.json index afda756740aa..35942dab17f2 100644 --- a/homeassistant/components/media_player/.translations/cs.json +++ b/homeassistant/components/media_player/.translations/cs.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} je pozastaven", "is_playing": "{entity_name} p\u0159ehr\u00e1v\u00e1" } - } + }, + "title": "P\u0159ehr\u00e1va\u010d m\u00e9di\u00ed" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/cy.json b/homeassistant/components/media_player/.translations/cy.json new file mode 100644 index 000000000000..eff781806b04 --- /dev/null +++ b/homeassistant/components/media_player/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Chwaraewr cyfryngau" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/da.json b/homeassistant/components/media_player/.translations/da.json index a53bbed07d01..5e7f38744959 100644 --- a/homeassistant/components/media_player/.translations/da.json +++ b/homeassistant/components/media_player/.translations/da.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} er sat p\u00e5 pause", "is_playing": "{entity_name} afspiller" } - } + }, + "title": "Medieafspiller" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/de.json b/homeassistant/components/media_player/.translations/de.json index 7efad821a9e6..cc3d8a7364ee 100644 --- a/homeassistant/components/media_player/.translations/de.json +++ b/homeassistant/components/media_player/.translations/de.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} ist pausiert", "is_playing": "{entity_name} spielt" } - } + }, + "title": "Mediaplayer" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/el.json b/homeassistant/components/media_player/.translations/el.json new file mode 100644 index 000000000000..792fad8c9d9c --- /dev/null +++ b/homeassistant/components/media_player/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03c9\u03bd" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/en.json b/homeassistant/components/media_player/.translations/en.json index 472cb98f2836..96bd7c448a02 100644 --- a/homeassistant/components/media_player/.translations/en.json +++ b/homeassistant/components/media_player/.translations/en.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} is paused", "is_playing": "{entity_name} is playing" } - } + }, + "title": "Media player" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/es-419.json b/homeassistant/components/media_player/.translations/es-419.json new file mode 100644 index 000000000000..399a8b498d19 --- /dev/null +++ b/homeassistant/components/media_player/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Reproductor multimedia" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/es.json b/homeassistant/components/media_player/.translations/es.json index d4cdcf3d254b..b2b146268723 100644 --- a/homeassistant/components/media_player/.translations/es.json +++ b/homeassistant/components/media_player/.translations/es.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} est\u00e1 en pausa", "is_playing": "{entity_name} est\u00e1 reproduciendo" } - } + }, + "title": "Reproductor multimedia" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/et.json b/homeassistant/components/media_player/.translations/et.json new file mode 100644 index 000000000000..a6c60e9e213d --- /dev/null +++ b/homeassistant/components/media_player/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Meediam\u00e4ngija" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/fi.json b/homeassistant/components/media_player/.translations/fi.json new file mode 100644 index 000000000000..625a21979953 --- /dev/null +++ b/homeassistant/components/media_player/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Mediatoistin" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/fr.json b/homeassistant/components/media_player/.translations/fr.json index 6be3e6095901..3b374ad95902 100644 --- a/homeassistant/components/media_player/.translations/fr.json +++ b/homeassistant/components/media_player/.translations/fr.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} est en pause", "is_playing": "{entity_name} joue" } - } + }, + "title": "Lecteur multim\u00e9dia" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/he.json b/homeassistant/components/media_player/.translations/he.json new file mode 100644 index 000000000000..aac497e66cf0 --- /dev/null +++ b/homeassistant/components/media_player/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e0\u05d2\u05df \u05de\u05d3\u05d9\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/hi.json b/homeassistant/components/media_player/.translations/hi.json new file mode 100644 index 000000000000..659e5eca5d37 --- /dev/null +++ b/homeassistant/components/media_player/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u092e\u0940\u0921\u093f\u092f\u093e \u092a\u094d\u0932\u0947\u092f\u0930" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/hr.json b/homeassistant/components/media_player/.translations/hr.json new file mode 100644 index 000000000000..f611b8ee0648 --- /dev/null +++ b/homeassistant/components/media_player/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Media player" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/hu.json b/homeassistant/components/media_player/.translations/hu.json index fbefbc43e083..08be4695734d 100644 --- a/homeassistant/components/media_player/.translations/hu.json +++ b/homeassistant/components/media_player/.translations/hu.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} sz\u00fcneteltetve van", "is_playing": "{entity_name} lej\u00e1tszik" } - } + }, + "title": "M\u00e9dialej\u00e1tsz\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/hy.json b/homeassistant/components/media_player/.translations/hy.json new file mode 100644 index 000000000000..5550a4f1a100 --- /dev/null +++ b/homeassistant/components/media_player/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0544\u0565\u0564\u056b\u0561 \u0576\u057e\u0561\u0563\u0561\u0580\u056f\u056b\u0579" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/id.json b/homeassistant/components/media_player/.translations/id.json new file mode 100644 index 000000000000..9b5d837269e2 --- /dev/null +++ b/homeassistant/components/media_player/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Pemutar media" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/is.json b/homeassistant/components/media_player/.translations/is.json new file mode 100644 index 000000000000..13918041a624 --- /dev/null +++ b/homeassistant/components/media_player/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Margmi\u00f0lunarspilari" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/it.json b/homeassistant/components/media_player/.translations/it.json index 93ab26d4585a..119152d6124b 100644 --- a/homeassistant/components/media_player/.translations/it.json +++ b/homeassistant/components/media_player/.translations/it.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \u00e8 in pausa", "is_playing": "{entity_name} \u00e8 in esecuzione" } - } + }, + "title": "Lettore multimediale" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ja.json b/homeassistant/components/media_player/.translations/ja.json new file mode 100644 index 000000000000..fd3335f2f459 --- /dev/null +++ b/homeassistant/components/media_player/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ko.json b/homeassistant/components/media_player/.translations/ko.json index b7ebc93099d2..223e78168b74 100644 --- a/homeassistant/components/media_player/.translations/ko.json +++ b/homeassistant/components/media_player/.translations/ko.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \uc774(\uac00) \uc77c\uc2dc\uc911\uc9c0\ub418\uc5b4 \uc788\uc73c\uba74", "is_playing": "{entity_name} \uc774(\uac00) \uc7ac\uc0dd \uc911\uc774\uba74" } - } + }, + "title": "\ubbf8\ub514\uc5b4\uc7ac\uc0dd\uae30" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/lb.json b/homeassistant/components/media_player/.translations/lb.json index 99b6f12fd660..0ef9f04f983e 100644 --- a/homeassistant/components/media_player/.translations/lb.json +++ b/homeassistant/components/media_player/.translations/lb.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} ass paus\u00e9iert", "is_playing": "{entity_name} spillt" } - } + }, + "title": "Medie Spiller" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/lv.json b/homeassistant/components/media_player/.translations/lv.json new file mode 100644 index 000000000000..ffa97a4cd25a --- /dev/null +++ b/homeassistant/components/media_player/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Multivides atska\u0146ot\u0101js" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/nb.json b/homeassistant/components/media_player/.translations/nb.json new file mode 100644 index 000000000000..1c1179756ff5 --- /dev/null +++ b/homeassistant/components/media_player/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Mediaspiller" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/nl.json b/homeassistant/components/media_player/.translations/nl.json index cfd63d190c33..a5b73362a05c 100644 --- a/homeassistant/components/media_player/.translations/nl.json +++ b/homeassistant/components/media_player/.translations/nl.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} is gepauzeerd", "is_playing": "{entity_name} wordt afgespeeld" } - } + }, + "title": "Mediaspeler" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/nn.json b/homeassistant/components/media_player/.translations/nn.json new file mode 100644 index 000000000000..6b4aa51f994c --- /dev/null +++ b/homeassistant/components/media_player/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Mediaspelar" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/pl.json b/homeassistant/components/media_player/.translations/pl.json index 29b3beaee638..c7afb44a0f70 100644 --- a/homeassistant/components/media_player/.translations/pl.json +++ b/homeassistant/components/media_player/.translations/pl.json @@ -7,5 +7,6 @@ "is_paused": "odtwarzanie medi\u00f3w na {entity_name} jest wstrzymane", "is_playing": "{entity_name} odtwarza media" } - } + }, + "title": "Odtwarzacz medi\u00f3w" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/pt-BR.json b/homeassistant/components/media_player/.translations/pt-BR.json new file mode 100644 index 000000000000..f611b8ee0648 --- /dev/null +++ b/homeassistant/components/media_player/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Media player" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/pt.json b/homeassistant/components/media_player/.translations/pt.json new file mode 100644 index 000000000000..ea8b4e6855f9 --- /dev/null +++ b/homeassistant/components/media_player/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Leitor multim\u00e9dia" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ro.json b/homeassistant/components/media_player/.translations/ro.json new file mode 100644 index 000000000000..a5b625e43efb --- /dev/null +++ b/homeassistant/components/media_player/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Media Player" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ru.json b/homeassistant/components/media_player/.translations/ru.json index 2b459ccab05c..d1864a223901 100644 --- a/homeassistant/components/media_player/.translations/ru.json +++ b/homeassistant/components/media_player/.translations/ru.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \u043d\u0430 \u043f\u0430\u0443\u0437\u0435", "is_playing": "{entity_name} \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043c\u0435\u0434\u0438\u0430" } - } + }, + "title": "\u041c\u0435\u0434\u0438\u0430\u043f\u043b\u0435\u0435\u0440" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/sk.json b/homeassistant/components/media_player/.translations/sk.json new file mode 100644 index 000000000000..df9c217fe556 --- /dev/null +++ b/homeassistant/components/media_player/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Prehr\u00e1va\u010d m\u00e9di\u00ed" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/sl.json b/homeassistant/components/media_player/.translations/sl.json index eafc10bd8ab2..a57aa704bda6 100644 --- a/homeassistant/components/media_player/.translations/sl.json +++ b/homeassistant/components/media_player/.translations/sl.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} je zaustavljen", "is_playing": "{entity_name} predvaja" } - } + }, + "title": "Medijski predvajalnik" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/sv.json b/homeassistant/components/media_player/.translations/sv.json index b7f62a138dfa..2d59dcd5ca31 100644 --- a/homeassistant/components/media_player/.translations/sv.json +++ b/homeassistant/components/media_player/.translations/sv.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \u00e4r pausad", "is_playing": "{entity_name} spelar" } - } + }, + "title": "Mediaspelare" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/ta.json b/homeassistant/components/media_player/.translations/ta.json new file mode 100644 index 000000000000..83147683e3fb --- /dev/null +++ b/homeassistant/components/media_player/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0bae\u0bc0\u0b9f\u0bbf\u0baf\u0bbe \u0baa\u0bbf\u0bb3\u0bc7\u0baf\u0bb0\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/te.json b/homeassistant/components/media_player/.translations/te.json new file mode 100644 index 000000000000..c49493bd1786 --- /dev/null +++ b/homeassistant/components/media_player/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2e\u0c40\u0c21\u0c3f\u0c2f\u0c3e \u0c2a\u0c4d\u0c32\u0c47\u0c2f\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/th.json b/homeassistant/components/media_player/.translations/th.json new file mode 100644 index 000000000000..02970796a61e --- /dev/null +++ b/homeassistant/components/media_player/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e40\u0e25\u0e48\u0e19\u0e2a\u0e37\u0e48\u0e2d" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/tr.json b/homeassistant/components/media_player/.translations/tr.json new file mode 100644 index 000000000000..e37ff20a2bdd --- /dev/null +++ b/homeassistant/components/media_player/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Medya oynat\u0131c\u0131" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/uk.json b/homeassistant/components/media_player/.translations/uk.json new file mode 100644 index 000000000000..f5c2c85e22a8 --- /dev/null +++ b/homeassistant/components/media_player/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041c\u0435\u0434\u0456\u0430 \u043f\u043b\u0435\u0454\u0440" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/vi.json b/homeassistant/components/media_player/.translations/vi.json new file mode 100644 index 000000000000..f611b8ee0648 --- /dev/null +++ b/homeassistant/components/media_player/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Media player" +} \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/zh-Hans.json b/homeassistant/components/media_player/.translations/zh-Hans.json index c4020b8194b1..1524b34111f2 100644 --- a/homeassistant/components/media_player/.translations/zh-Hans.json +++ b/homeassistant/components/media_player/.translations/zh-Hans.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name} \u5df2\u6682\u505c", "is_playing": "{entity_name} \u6b63\u5728\u64ad\u653e" } - } + }, + "title": "\u64ad\u653e\u5668" } \ No newline at end of file diff --git a/homeassistant/components/media_player/.translations/zh-Hant.json b/homeassistant/components/media_player/.translations/zh-Hant.json index e3353c5e5b9e..53ff574364ab 100644 --- a/homeassistant/components/media_player/.translations/zh-Hant.json +++ b/homeassistant/components/media_player/.translations/zh-Hant.json @@ -7,5 +7,6 @@ "is_paused": "{entity_name}\u5df2\u66ab\u505c", "is_playing": "{entity_name}\u6b63\u5728\u64ad\u653e" } - } + }, + "title": "\u5a92\u9ad4\u64ad\u653e\u5668" } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ca.json b/homeassistant/components/melcloud/.translations/ca.json index df7ce9050740..f384905d1a4a 100644 --- a/homeassistant/components/melcloud/.translations/ca.json +++ b/homeassistant/components/melcloud/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Connexi\u00f3 amb MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/da.json b/homeassistant/components/melcloud/.translations/da.json index c3c6adcc2187..23263beb4c34 100644 --- a/homeassistant/components/melcloud/.translations/da.json +++ b/homeassistant/components/melcloud/.translations/da.json @@ -18,6 +18,5 @@ "title": "Opret forbindelse til MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/de.json b/homeassistant/components/melcloud/.translations/de.json index 5154a9c2762f..2b4cf1316f31 100644 --- a/homeassistant/components/melcloud/.translations/de.json +++ b/homeassistant/components/melcloud/.translations/de.json @@ -18,6 +18,5 @@ "title": "Stellen Sie eine Verbindung zu MELCloud her" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/en.json b/homeassistant/components/melcloud/.translations/en.json index f482761309be..4ab1ac566ef4 100644 --- a/homeassistant/components/melcloud/.translations/en.json +++ b/homeassistant/components/melcloud/.translations/en.json @@ -18,6 +18,5 @@ "title": "Connect to MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/es.json b/homeassistant/components/melcloud/.translations/es.json index e9144a14e34c..9dbb9d4f1f68 100644 --- a/homeassistant/components/melcloud/.translations/es.json +++ b/homeassistant/components/melcloud/.translations/es.json @@ -18,6 +18,5 @@ "title": "Con\u00e9ctese a MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/fr.json b/homeassistant/components/melcloud/.translations/fr.json index e75a1667ad57..0385113787c4 100644 --- a/homeassistant/components/melcloud/.translations/fr.json +++ b/homeassistant/components/melcloud/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Se connecter \u00e0 MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/it.json b/homeassistant/components/melcloud/.translations/it.json index eb691d13417f..c027473ad14d 100644 --- a/homeassistant/components/melcloud/.translations/it.json +++ b/homeassistant/components/melcloud/.translations/it.json @@ -18,6 +18,5 @@ "title": "Connettersi a MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ko.json b/homeassistant/components/melcloud/.translations/ko.json index 6067a6e62d94..5db3f001b4af 100644 --- a/homeassistant/components/melcloud/.translations/ko.json +++ b/homeassistant/components/melcloud/.translations/ko.json @@ -18,6 +18,5 @@ "title": "MELCloud \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/lb.json b/homeassistant/components/melcloud/.translations/lb.json index 6dfebbd9b435..9bcf41c23afd 100644 --- a/homeassistant/components/melcloud/.translations/lb.json +++ b/homeassistant/components/melcloud/.translations/lb.json @@ -18,6 +18,5 @@ "title": "Mat MELCloud verbannen" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/nl.json b/homeassistant/components/melcloud/.translations/nl.json index ffdd4bce7967..8ef8cc716b1b 100644 --- a/homeassistant/components/melcloud/.translations/nl.json +++ b/homeassistant/components/melcloud/.translations/nl.json @@ -18,6 +18,5 @@ "title": "Maak verbinding met MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/no.json b/homeassistant/components/melcloud/.translations/no.json index 0394dd99ba7d..fcdc00168ebc 100644 --- a/homeassistant/components/melcloud/.translations/no.json +++ b/homeassistant/components/melcloud/.translations/no.json @@ -18,6 +18,5 @@ "title": "Koble til MELCloud" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/pl.json b/homeassistant/components/melcloud/.translations/pl.json index 881b7d57c8e4..070a509cd10a 100644 --- a/homeassistant/components/melcloud/.translations/pl.json +++ b/homeassistant/components/melcloud/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Po\u0142\u0105czenie z MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/ru.json b/homeassistant/components/melcloud/.translations/ru.json index e9306d959181..3b23ca96bfce 100644 --- a/homeassistant/components/melcloud/.translations/ru.json +++ b/homeassistant/components/melcloud/.translations/ru.json @@ -18,6 +18,5 @@ "title": "MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/sl.json b/homeassistant/components/melcloud/.translations/sl.json index a997675accb3..cd78c5f2c5ae 100644 --- a/homeassistant/components/melcloud/.translations/sl.json +++ b/homeassistant/components/melcloud/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Pove\u017eite se z MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/sv.json b/homeassistant/components/melcloud/.translations/sv.json index 514ae2bc020e..f96b2c05ea05 100644 --- a/homeassistant/components/melcloud/.translations/sv.json +++ b/homeassistant/components/melcloud/.translations/sv.json @@ -18,6 +18,5 @@ "title": "Anslut till MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/melcloud/.translations/zh-Hant.json b/homeassistant/components/melcloud/.translations/zh-Hant.json index c89058465e84..0702ca3bbd55 100644 --- a/homeassistant/components/melcloud/.translations/zh-Hant.json +++ b/homeassistant/components/melcloud/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "\u9023\u7dda\u81f3 MELCloud" } } - }, - "title": "MELCloud" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/bg.json b/homeassistant/components/met/.translations/bg.json index e5620f25c880..895bf9c5bf7a 100644 --- a/homeassistant/components/met/.translations/bg.json +++ b/homeassistant/components/met/.translations/bg.json @@ -15,6 +15,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ca.json b/homeassistant/components/met/.translations/ca.json index 0d0ca2413975..242232663f0f 100644 --- a/homeassistant/components/met/.translations/ca.json +++ b/homeassistant/components/met/.translations/ca.json @@ -15,6 +15,5 @@ "title": "Ubicaci\u00f3" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/da.json b/homeassistant/components/met/.translations/da.json index 603d4426ca3a..7a530e44fb35 100644 --- a/homeassistant/components/met/.translations/da.json +++ b/homeassistant/components/met/.translations/da.json @@ -15,6 +15,5 @@ "title": "Lokalitet" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/de.json b/homeassistant/components/met/.translations/de.json index 6114f89afb1a..61d4dc4660b9 100644 --- a/homeassistant/components/met/.translations/de.json +++ b/homeassistant/components/met/.translations/de.json @@ -15,6 +15,5 @@ "title": "Standort" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/en.json b/homeassistant/components/met/.translations/en.json index ed51d481487c..8c57e4226a05 100644 --- a/homeassistant/components/met/.translations/en.json +++ b/homeassistant/components/met/.translations/en.json @@ -15,6 +15,5 @@ "title": "Location" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/es-419.json b/homeassistant/components/met/.translations/es-419.json index 67038a0a5910..fc3d4f64fc72 100644 --- a/homeassistant/components/met/.translations/es-419.json +++ b/homeassistant/components/met/.translations/es-419.json @@ -15,6 +15,5 @@ "title": "Ubicaci\u00f3n" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/es.json b/homeassistant/components/met/.translations/es.json index b6ec410584cd..e9cfbce52918 100644 --- a/homeassistant/components/met/.translations/es.json +++ b/homeassistant/components/met/.translations/es.json @@ -15,6 +15,5 @@ "title": "Ubicaci\u00f3n" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/fr.json b/homeassistant/components/met/.translations/fr.json index 44025b847557..9f43be5d93b0 100644 --- a/homeassistant/components/met/.translations/fr.json +++ b/homeassistant/components/met/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Emplacement" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/hr.json b/homeassistant/components/met/.translations/hr.json index c8fa12df5e0a..5b57e11ac6e7 100644 --- a/homeassistant/components/met/.translations/hr.json +++ b/homeassistant/components/met/.translations/hr.json @@ -15,6 +15,5 @@ "title": "Lokacija" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/hu.json b/homeassistant/components/met/.translations/hu.json index 338593ec0c65..8196d4bffe93 100644 --- a/homeassistant/components/met/.translations/hu.json +++ b/homeassistant/components/met/.translations/hu.json @@ -15,6 +15,5 @@ "title": "Elhelyezked\u00e9s" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/it.json b/homeassistant/components/met/.translations/it.json index 0514010ce523..18433ab16970 100644 --- a/homeassistant/components/met/.translations/it.json +++ b/homeassistant/components/met/.translations/it.json @@ -15,6 +15,5 @@ "title": "Posizione" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ko.json b/homeassistant/components/met/.translations/ko.json index f66fc97a4fcc..846aca7f4eaa 100644 --- a/homeassistant/components/met/.translations/ko.json +++ b/homeassistant/components/met/.translations/ko.json @@ -15,6 +15,5 @@ "title": "\uc704\uce58" } } - }, - "title": "\ub178\ub974\uc6e8\uc774 \uae30\uc0c1 \uc5f0\uad6c\uc18c (Met.no)" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/lb.json b/homeassistant/components/met/.translations/lb.json index cc499625cf84..88041b9abe0a 100644 --- a/homeassistant/components/met/.translations/lb.json +++ b/homeassistant/components/met/.translations/lb.json @@ -15,6 +15,5 @@ "title": "Uertschaft" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/nl.json b/homeassistant/components/met/.translations/nl.json index ca0d1626b9ba..3cb932e60959 100644 --- a/homeassistant/components/met/.translations/nl.json +++ b/homeassistant/components/met/.translations/nl.json @@ -15,6 +15,5 @@ "title": "Locatie" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/nn.json b/homeassistant/components/met/.translations/nn.json index cced4f6314da..0e024a0e1eb7 100644 --- a/homeassistant/components/met/.translations/nn.json +++ b/homeassistant/components/met/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/no.json b/homeassistant/components/met/.translations/no.json index 0d83b874a6bc..a46b53faf8c3 100644 --- a/homeassistant/components/met/.translations/no.json +++ b/homeassistant/components/met/.translations/no.json @@ -15,6 +15,5 @@ "title": "Lokasjon" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/pl.json b/homeassistant/components/met/.translations/pl.json index 52ddf089cf89..a0438b6af8cb 100644 --- a/homeassistant/components/met/.translations/pl.json +++ b/homeassistant/components/met/.translations/pl.json @@ -15,6 +15,5 @@ "title": "Lokalizacja" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/pt-BR.json b/homeassistant/components/met/.translations/pt-BR.json index a240fe50d7f5..f16aac2174d7 100644 --- a/homeassistant/components/met/.translations/pt-BR.json +++ b/homeassistant/components/met/.translations/pt-BR.json @@ -15,6 +15,5 @@ "title": "Localiza\u00e7\u00e3o" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/ru.json b/homeassistant/components/met/.translations/ru.json index a92b9016b3d2..85333490f3cc 100644 --- a/homeassistant/components/met/.translations/ru.json +++ b/homeassistant/components/met/.translations/ru.json @@ -15,6 +15,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u041d\u043e\u0440\u0432\u0435\u0433\u0438\u0438 (Met.no)" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/sl.json b/homeassistant/components/met/.translations/sl.json index cee47da47147..d424f196997a 100644 --- a/homeassistant/components/met/.translations/sl.json +++ b/homeassistant/components/met/.translations/sl.json @@ -15,6 +15,5 @@ "title": "Lokacija" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/sv.json b/homeassistant/components/met/.translations/sv.json index 23b5c7a70cb5..9475a0b29150 100644 --- a/homeassistant/components/met/.translations/sv.json +++ b/homeassistant/components/met/.translations/sv.json @@ -15,6 +15,5 @@ "title": "Position" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/met/.translations/zh-Hant.json b/homeassistant/components/met/.translations/zh-Hant.json index 393c60bc807c..0128f0ad4489 100644 --- a/homeassistant/components/met/.translations/zh-Hant.json +++ b/homeassistant/components/met/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "\u5ea7\u6a19" } } - }, - "title": "Met.no" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ca.json b/homeassistant/components/meteo_france/.translations/ca.json index 397edebc9ce8..02f43e0d4a81 100644 --- a/homeassistant/components/meteo_france/.translations/ca.json +++ b/homeassistant/components/meteo_france/.translations/ca.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/da.json b/homeassistant/components/meteo_france/.translations/da.json index 4b303e4a5b92..d0fe7cba8922 100644 --- a/homeassistant/components/meteo_france/.translations/da.json +++ b/homeassistant/components/meteo_france/.translations/da.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/de.json b/homeassistant/components/meteo_france/.translations/de.json index a6b9b147ee5e..1c05beac3618 100644 --- a/homeassistant/components/meteo_france/.translations/de.json +++ b/homeassistant/components/meteo_france/.translations/de.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/en.json b/homeassistant/components/meteo_france/.translations/en.json index 64b9b97b2ebc..7b161dcda07f 100644 --- a/homeassistant/components/meteo_france/.translations/en.json +++ b/homeassistant/components/meteo_france/.translations/en.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/es.json b/homeassistant/components/meteo_france/.translations/es.json index a489b21033b6..4c04a5d32c33 100644 --- a/homeassistant/components/meteo_france/.translations/es.json +++ b/homeassistant/components/meteo_france/.translations/es.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/fr.json b/homeassistant/components/meteo_france/.translations/fr.json index da640cfb94fb..9ad5f298fba7 100644 --- a/homeassistant/components/meteo_france/.translations/fr.json +++ b/homeassistant/components/meteo_france/.translations/fr.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/hu.json b/homeassistant/components/meteo_france/.translations/hu.json index d243dd162ac4..83333c60fe89 100644 --- a/homeassistant/components/meteo_france/.translations/hu.json +++ b/homeassistant/components/meteo_france/.translations/hu.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/it.json b/homeassistant/components/meteo_france/.translations/it.json index a55e799fc252..23b40164c7b1 100644 --- a/homeassistant/components/meteo_france/.translations/it.json +++ b/homeassistant/components/meteo_france/.translations/it.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ko.json b/homeassistant/components/meteo_france/.translations/ko.json index 9f39e513c69c..166ddaa68ab9 100644 --- a/homeassistant/components/meteo_france/.translations/ko.json +++ b/homeassistant/components/meteo_france/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\ud504\ub791\uc2a4 \uae30\uc0c1\uccad (M\u00e9t\u00e9o-France)" } } - }, - "title": "\ud504\ub791\uc2a4 \uae30\uc0c1\uccad (M\u00e9t\u00e9o-France)" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/lb.json b/homeassistant/components/meteo_france/.translations/lb.json index b439b0892251..1ec89b44d9fd 100644 --- a/homeassistant/components/meteo_france/.translations/lb.json +++ b/homeassistant/components/meteo_france/.translations/lb.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/nl.json b/homeassistant/components/meteo_france/.translations/nl.json index fdbb9a4ea88d..27dfb56f8d78 100644 --- a/homeassistant/components/meteo_france/.translations/nl.json +++ b/homeassistant/components/meteo_france/.translations/nl.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/no.json b/homeassistant/components/meteo_france/.translations/no.json index d902ec35efaa..cecc1d75c6a6 100644 --- a/homeassistant/components/meteo_france/.translations/no.json +++ b/homeassistant/components/meteo_france/.translations/no.json @@ -13,6 +13,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/pl.json b/homeassistant/components/meteo_france/.translations/pl.json index 8d886f249fa0..12e74728fc8c 100644 --- a/homeassistant/components/meteo_france/.translations/pl.json +++ b/homeassistant/components/meteo_france/.translations/pl.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/ru.json b/homeassistant/components/meteo_france/.translations/ru.json index b281d43794ff..47e2eda63af7 100644 --- a/homeassistant/components/meteo_france/.translations/ru.json +++ b/homeassistant/components/meteo_france/.translations/ru.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/sl.json b/homeassistant/components/meteo_france/.translations/sl.json index 2f1468413113..912748ada8f3 100644 --- a/homeassistant/components/meteo_france/.translations/sl.json +++ b/homeassistant/components/meteo_france/.translations/sl.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/sv.json b/homeassistant/components/meteo_france/.translations/sv.json index a25637790237..a3aac5f013ae 100644 --- a/homeassistant/components/meteo_france/.translations/sv.json +++ b/homeassistant/components/meteo_france/.translations/sv.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/meteo_france/.translations/zh-Hant.json b/homeassistant/components/meteo_france/.translations/zh-Hant.json index ac17b44d37b1..afece58eef40 100644 --- a/homeassistant/components/meteo_france/.translations/zh-Hant.json +++ b/homeassistant/components/meteo_france/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "M\u00e9t\u00e9o-France" } } - }, - "title": "M\u00e9t\u00e9o-France" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ca.json b/homeassistant/components/mikrotik/.translations/ca.json index 365be074a16c..10589dac474f 100644 --- a/homeassistant/components/mikrotik/.translations/ca.json +++ b/homeassistant/components/mikrotik/.translations/ca.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/da.json b/homeassistant/components/mikrotik/.translations/da.json index f2233607e6e5..d31465ac3990 100644 --- a/homeassistant/components/mikrotik/.translations/da.json +++ b/homeassistant/components/mikrotik/.translations/da.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/de.json b/homeassistant/components/mikrotik/.translations/de.json index 84cf754b04bf..0eb7c99a91a0 100644 --- a/homeassistant/components/mikrotik/.translations/de.json +++ b/homeassistant/components/mikrotik/.translations/de.json @@ -31,6 +31,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/en.json b/homeassistant/components/mikrotik/.translations/en.json index aa9be5037336..692d1247fcbf 100644 --- a/homeassistant/components/mikrotik/.translations/en.json +++ b/homeassistant/components/mikrotik/.translations/en.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/es.json b/homeassistant/components/mikrotik/.translations/es.json index 461eda1a6324..b575db70f115 100644 --- a/homeassistant/components/mikrotik/.translations/es.json +++ b/homeassistant/components/mikrotik/.translations/es.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/fr.json b/homeassistant/components/mikrotik/.translations/fr.json index 8ed4adbe04d3..533d2edf6f09 100644 --- a/homeassistant/components/mikrotik/.translations/fr.json +++ b/homeassistant/components/mikrotik/.translations/fr.json @@ -31,6 +31,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/hu.json b/homeassistant/components/mikrotik/.translations/hu.json index 1fbd0216cc49..41858abd83af 100644 --- a/homeassistant/components/mikrotik/.translations/hu.json +++ b/homeassistant/components/mikrotik/.translations/hu.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/it.json b/homeassistant/components/mikrotik/.translations/it.json index 8c97176e0ea6..69cdadb4dfc9 100644 --- a/homeassistant/components/mikrotik/.translations/it.json +++ b/homeassistant/components/mikrotik/.translations/it.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ko.json b/homeassistant/components/mikrotik/.translations/ko.json index 985c02493b05..8c73521afd5d 100644 --- a/homeassistant/components/mikrotik/.translations/ko.json +++ b/homeassistant/components/mikrotik/.translations/ko.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/lb.json b/homeassistant/components/mikrotik/.translations/lb.json index 89e102d844aa..2ae18d83422c 100644 --- a/homeassistant/components/mikrotik/.translations/lb.json +++ b/homeassistant/components/mikrotik/.translations/lb.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/lv.json b/homeassistant/components/mikrotik/.translations/lv.json index 0ac2ea209556..d4fa954b4072 100644 --- a/homeassistant/components/mikrotik/.translations/lv.json +++ b/homeassistant/components/mikrotik/.translations/lv.json @@ -11,6 +11,5 @@ "title": "Iestat\u012bt Mikrotik mar\u0161rut\u0113t\u0101ju" } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/nl.json b/homeassistant/components/mikrotik/.translations/nl.json index d05eda995249..a3c86dda34be 100644 --- a/homeassistant/components/mikrotik/.translations/nl.json +++ b/homeassistant/components/mikrotik/.translations/nl.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/no.json b/homeassistant/components/mikrotik/.translations/no.json index 4fcd68942467..6fa745a8b57e 100644 --- a/homeassistant/components/mikrotik/.translations/no.json +++ b/homeassistant/components/mikrotik/.translations/no.json @@ -32,6 +32,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/pl.json b/homeassistant/components/mikrotik/.translations/pl.json index 53367773da9b..44ee1ad44030 100644 --- a/homeassistant/components/mikrotik/.translations/pl.json +++ b/homeassistant/components/mikrotik/.translations/pl.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/ru.json b/homeassistant/components/mikrotik/.translations/ru.json index 32a4ec76caf5..e21472d4da73 100644 --- a/homeassistant/components/mikrotik/.translations/ru.json +++ b/homeassistant/components/mikrotik/.translations/ru.json @@ -32,6 +32,5 @@ } } } - }, - "title": "MikroTik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/sl.json b/homeassistant/components/mikrotik/.translations/sl.json index df4e97ab970a..10030cba5599 100644 --- a/homeassistant/components/mikrotik/.translations/sl.json +++ b/homeassistant/components/mikrotik/.translations/sl.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/sv.json b/homeassistant/components/mikrotik/.translations/sv.json index 7944a8135d98..22cb8590c3bc 100644 --- a/homeassistant/components/mikrotik/.translations/sv.json +++ b/homeassistant/components/mikrotik/.translations/sv.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/mikrotik/.translations/zh-Hant.json b/homeassistant/components/mikrotik/.translations/zh-Hant.json index 55764fb1dc4b..caca14b79ed1 100644 --- a/homeassistant/components/mikrotik/.translations/zh-Hant.json +++ b/homeassistant/components/mikrotik/.translations/zh-Hant.json @@ -32,6 +32,5 @@ } } } - }, - "title": "Mikrotik" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ca.json b/homeassistant/components/minecraft_server/.translations/ca.json index 5adeaf2f0bb0..e34e2fb7fdb5 100644 --- a/homeassistant/components/minecraft_server/.translations/ca.json +++ b/homeassistant/components/minecraft_server/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Enlla\u00e7 del servidor de Minecraft" } } - }, - "title": "Servidor de Minecraft" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/da.json b/homeassistant/components/minecraft_server/.translations/da.json index fde79efe8358..60deb64a0782 100644 --- a/homeassistant/components/minecraft_server/.translations/da.json +++ b/homeassistant/components/minecraft_server/.translations/da.json @@ -18,6 +18,5 @@ "title": "Forbind din Minecraft-server" } } - }, - "title": "Minecraft-server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/de.json b/homeassistant/components/minecraft_server/.translations/de.json index 6341001621b8..484be7bd4186 100644 --- a/homeassistant/components/minecraft_server/.translations/de.json +++ b/homeassistant/components/minecraft_server/.translations/de.json @@ -18,6 +18,5 @@ "title": "Verkn\u00fcpfe deinen Minecraft Server" } } - }, - "title": "Minecraft Server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/en.json b/homeassistant/components/minecraft_server/.translations/en.json index 16771d944703..fc736c667bec 100644 --- a/homeassistant/components/minecraft_server/.translations/en.json +++ b/homeassistant/components/minecraft_server/.translations/en.json @@ -18,6 +18,5 @@ "title": "Link your Minecraft Server" } } - }, - "title": "Minecraft Server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/es.json b/homeassistant/components/minecraft_server/.translations/es.json index 9c4042720f6f..3f30c1babd40 100644 --- a/homeassistant/components/minecraft_server/.translations/es.json +++ b/homeassistant/components/minecraft_server/.translations/es.json @@ -18,6 +18,5 @@ "title": "Enlace su servidor Minecraft" } } - }, - "title": "Servidor Minecraft" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/fr.json b/homeassistant/components/minecraft_server/.translations/fr.json index 529d497e62f0..f2bb4dfa3ded 100644 --- a/homeassistant/components/minecraft_server/.translations/fr.json +++ b/homeassistant/components/minecraft_server/.translations/fr.json @@ -12,6 +12,5 @@ "title": "Reliez votre serveur Minecraft" } } - }, - "title": "Serveur Minecraft" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/hu.json b/homeassistant/components/minecraft_server/.translations/hu.json index dffbe942b158..3a2cb80fc9f5 100644 --- a/homeassistant/components/minecraft_server/.translations/hu.json +++ b/homeassistant/components/minecraft_server/.translations/hu.json @@ -12,6 +12,5 @@ "title": "Kapcsold \u00f6ssze a Minecraft szervered" } } - }, - "title": "Minecraft szerver" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/it.json b/homeassistant/components/minecraft_server/.translations/it.json index c8cd52a169aa..7f214c477433 100644 --- a/homeassistant/components/minecraft_server/.translations/it.json +++ b/homeassistant/components/minecraft_server/.translations/it.json @@ -18,6 +18,5 @@ "title": "Collega il tuo Server Minecraft" } } - }, - "title": "Server Minecraft" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ko.json b/homeassistant/components/minecraft_server/.translations/ko.json index 6fd774482535..9244acb2144f 100644 --- a/homeassistant/components/minecraft_server/.translations/ko.json +++ b/homeassistant/components/minecraft_server/.translations/ko.json @@ -18,6 +18,5 @@ "title": "Minecraft \uc11c\ubc84 \uc5f0\uacb0" } } - }, - "title": "Minecraft \uc11c\ubc84" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/lb.json b/homeassistant/components/minecraft_server/.translations/lb.json index 302c4b9cbd04..8b08af7b10f9 100644 --- a/homeassistant/components/minecraft_server/.translations/lb.json +++ b/homeassistant/components/minecraft_server/.translations/lb.json @@ -18,6 +18,5 @@ "title": "Verbann d\u00e4in Minecraft Server" } } - }, - "title": "Minecraft Server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/nl.json b/homeassistant/components/minecraft_server/.translations/nl.json index 907327ea26fa..1d589f942e7c 100644 --- a/homeassistant/components/minecraft_server/.translations/nl.json +++ b/homeassistant/components/minecraft_server/.translations/nl.json @@ -18,6 +18,5 @@ "title": "Koppel uw Minecraft server" } } - }, - "title": "Minecraft server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/no.json b/homeassistant/components/minecraft_server/.translations/no.json index fada51c6ecee..bc3bb2955add 100644 --- a/homeassistant/components/minecraft_server/.translations/no.json +++ b/homeassistant/components/minecraft_server/.translations/no.json @@ -18,6 +18,5 @@ "title": "Link din Minecraft Server" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/pl.json b/homeassistant/components/minecraft_server/.translations/pl.json index b0458e22bcef..c5e1abdf7294 100644 --- a/homeassistant/components/minecraft_server/.translations/pl.json +++ b/homeassistant/components/minecraft_server/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Po\u0142\u0105cz sw\u00f3j serwer Minecraft" } } - }, - "title": "Serwer Minecraft" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/ru.json b/homeassistant/components/minecraft_server/.translations/ru.json index e0feb85f1744..b95c12a1d802 100644 --- a/homeassistant/components/minecraft_server/.translations/ru.json +++ b/homeassistant/components/minecraft_server/.translations/ru.json @@ -18,6 +18,5 @@ "title": "Minecraft Server" } } - }, - "title": "Minecraft Server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/sl.json b/homeassistant/components/minecraft_server/.translations/sl.json index 0f8c0a86f84a..30607ad3b113 100644 --- a/homeassistant/components/minecraft_server/.translations/sl.json +++ b/homeassistant/components/minecraft_server/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Pove\u017eite svoj Minecraft stre\u017enik" } } - }, - "title": "Minecraft stre\u017enik" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/sv.json b/homeassistant/components/minecraft_server/.translations/sv.json index 857958c0319e..002555114205 100644 --- a/homeassistant/components/minecraft_server/.translations/sv.json +++ b/homeassistant/components/minecraft_server/.translations/sv.json @@ -18,6 +18,5 @@ "title": "L\u00e4nka din Minecraft-server" } } - }, - "title": "Minecraft-server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/tr.json b/homeassistant/components/minecraft_server/.translations/tr.json index be37c8c8244e..7527294a3c7a 100644 --- a/homeassistant/components/minecraft_server/.translations/tr.json +++ b/homeassistant/components/minecraft_server/.translations/tr.json @@ -18,6 +18,5 @@ "title": "Minecraft Servern\u0131 ba\u011fla" } } - }, - "title": "Minecraft Server" + } } \ No newline at end of file diff --git a/homeassistant/components/minecraft_server/.translations/zh-Hant.json b/homeassistant/components/minecraft_server/.translations/zh-Hant.json index bbca18fcfc0f..6dc996fa67dc 100644 --- a/homeassistant/components/minecraft_server/.translations/zh-Hant.json +++ b/homeassistant/components/minecraft_server/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "\u9023\u7d50 Minecraft \u4f3a\u670d\u5668" } } - }, - "title": "Minecraft \u4f3a\u670d\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/bg.json b/homeassistant/components/mobile_app/.translations/bg.json index c55904286ece..487a036e44b8 100644 --- a/homeassistant/components/mobile_app/.translations/bg.json +++ b/homeassistant/components/mobile_app/.translations/bg.json @@ -9,6 +9,5 @@ "title": "\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u041c\u043e\u0431\u0438\u043b\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ca.json b/homeassistant/components/mobile_app/.translations/ca.json index 2c2bfb7abab1..697f676df788 100644 --- a/homeassistant/components/mobile_app/.translations/ca.json +++ b/homeassistant/components/mobile_app/.translations/ca.json @@ -9,6 +9,5 @@ "title": "Aplicaci\u00f3 m\u00f2bil" } } - }, - "title": "Aplicaci\u00f3 m\u00f2bil" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/cs.json b/homeassistant/components/mobile_app/.translations/cs.json index fc299883cf3f..b1d244cc4d6c 100644 --- a/homeassistant/components/mobile_app/.translations/cs.json +++ b/homeassistant/components/mobile_app/.translations/cs.json @@ -9,6 +9,5 @@ "title": "Mobiln\u00ed aplikace" } } - }, - "title": "Mobiln\u00ed aplikace" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/da.json b/homeassistant/components/mobile_app/.translations/da.json index ee06d4802f7f..e497ef546e32 100644 --- a/homeassistant/components/mobile_app/.translations/da.json +++ b/homeassistant/components/mobile_app/.translations/da.json @@ -9,6 +9,5 @@ "title": "Mobilapp" } } - }, - "title": "Mobilapp" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/de.json b/homeassistant/components/mobile_app/.translations/de.json index c6e67d666c55..f71814249648 100644 --- a/homeassistant/components/mobile_app/.translations/de.json +++ b/homeassistant/components/mobile_app/.translations/de.json @@ -9,6 +9,5 @@ "title": "Mobile App" } } - }, - "title": "Mobile App" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/en.json b/homeassistant/components/mobile_app/.translations/en.json index a9af04df80c3..9ddf3c95586f 100644 --- a/homeassistant/components/mobile_app/.translations/en.json +++ b/homeassistant/components/mobile_app/.translations/en.json @@ -9,6 +9,5 @@ "title": "Mobile App" } } - }, - "title": "Mobile App" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/es-419.json b/homeassistant/components/mobile_app/.translations/es-419.json index ac45fd59633d..cb666a7d72d2 100644 --- a/homeassistant/components/mobile_app/.translations/es-419.json +++ b/homeassistant/components/mobile_app/.translations/es-419.json @@ -8,6 +8,5 @@ "title": "Aplicaci\u00f3n movil" } } - }, - "title": "Aplicaci\u00f3n movil" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/es.json b/homeassistant/components/mobile_app/.translations/es.json index 28f081204981..ca145bd68c2b 100644 --- a/homeassistant/components/mobile_app/.translations/es.json +++ b/homeassistant/components/mobile_app/.translations/es.json @@ -9,6 +9,5 @@ "title": "Aplicaci\u00f3n para el m\u00f3vil" } } - }, - "title": "Aplicaci\u00f3n para el m\u00f3vil" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/fr.json b/homeassistant/components/mobile_app/.translations/fr.json index c02c0abf8f20..55d1d4e0d9ed 100644 --- a/homeassistant/components/mobile_app/.translations/fr.json +++ b/homeassistant/components/mobile_app/.translations/fr.json @@ -9,6 +9,5 @@ "title": "Application mobile" } } - }, - "title": "Application mobile" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/hu.json b/homeassistant/components/mobile_app/.translations/hu.json index de3450c581a0..608a4a7879b8 100644 --- a/homeassistant/components/mobile_app/.translations/hu.json +++ b/homeassistant/components/mobile_app/.translations/hu.json @@ -9,6 +9,5 @@ "title": "Mobil alkalmaz\u00e1s" } } - }, - "title": "Mobil alkalmaz\u00e1s" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/it.json b/homeassistant/components/mobile_app/.translations/it.json index 652f16c67c87..1b91c566a53b 100644 --- a/homeassistant/components/mobile_app/.translations/it.json +++ b/homeassistant/components/mobile_app/.translations/it.json @@ -9,6 +9,5 @@ "title": "App per dispositivi mobili" } } - }, - "title": "App per dispositivi mobili" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ko.json b/homeassistant/components/mobile_app/.translations/ko.json index 616ee6d8593f..f427f3e3a12f 100644 --- a/homeassistant/components/mobile_app/.translations/ko.json +++ b/homeassistant/components/mobile_app/.translations/ko.json @@ -9,6 +9,5 @@ "title": "\ubaa8\ubc14\uc77c \uc571" } } - }, - "title": "\ubaa8\ubc14\uc77c \uc571" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/lb.json b/homeassistant/components/mobile_app/.translations/lb.json index 618743d07f1f..77fd6517410d 100644 --- a/homeassistant/components/mobile_app/.translations/lb.json +++ b/homeassistant/components/mobile_app/.translations/lb.json @@ -9,6 +9,5 @@ "title": "Mobil App" } } - }, - "title": "Mobil App" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/nl.json b/homeassistant/components/mobile_app/.translations/nl.json index ce2f97e06a04..06375b4a0b6b 100644 --- a/homeassistant/components/mobile_app/.translations/nl.json +++ b/homeassistant/components/mobile_app/.translations/nl.json @@ -9,6 +9,5 @@ "title": "Mobiele app" } } - }, - "title": "Mobiele app" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/nn.json b/homeassistant/components/mobile_app/.translations/nn.json index 0ccb9a8b9573..25828e48db5f 100644 --- a/homeassistant/components/mobile_app/.translations/nn.json +++ b/homeassistant/components/mobile_app/.translations/nn.json @@ -5,6 +5,5 @@ "title": "Mobilapp" } } - }, - "title": "Mobilapp" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/no.json b/homeassistant/components/mobile_app/.translations/no.json index 143b2155ac18..860d455d5825 100644 --- a/homeassistant/components/mobile_app/.translations/no.json +++ b/homeassistant/components/mobile_app/.translations/no.json @@ -9,6 +9,5 @@ "title": "Mobilapp" } } - }, - "title": "Mobilapp" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pl.json b/homeassistant/components/mobile_app/.translations/pl.json index b8e0636b950a..a6e7e7389033 100644 --- a/homeassistant/components/mobile_app/.translations/pl.json +++ b/homeassistant/components/mobile_app/.translations/pl.json @@ -9,6 +9,5 @@ "title": "Aplikacja mobilna" } } - }, - "title": "Aplikacja mobilna" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pt-BR.json b/homeassistant/components/mobile_app/.translations/pt-BR.json index 132914b74fec..79917f35d780 100644 --- a/homeassistant/components/mobile_app/.translations/pt-BR.json +++ b/homeassistant/components/mobile_app/.translations/pt-BR.json @@ -9,6 +9,5 @@ "title": "Aplicativo m\u00f3vel" } } - }, - "title": "Aplicativo m\u00f3vel" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/pt.json b/homeassistant/components/mobile_app/.translations/pt.json index fd1b4f2dad41..d2c326270e1b 100644 --- a/homeassistant/components/mobile_app/.translations/pt.json +++ b/homeassistant/components/mobile_app/.translations/pt.json @@ -5,6 +5,5 @@ "title": "Aplica\u00e7\u00e3o m\u00f3vel" } } - }, - "title": "Aplica\u00e7\u00e3o m\u00f3vel" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/ru.json b/homeassistant/components/mobile_app/.translations/ru.json index 994cb8da5fe1..f2d2200f4480 100644 --- a/homeassistant/components/mobile_app/.translations/ru.json +++ b/homeassistant/components/mobile_app/.translations/ru.json @@ -9,6 +9,5 @@ "title": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/sl.json b/homeassistant/components/mobile_app/.translations/sl.json index 318ab6220d35..bb79e2d1e526 100644 --- a/homeassistant/components/mobile_app/.translations/sl.json +++ b/homeassistant/components/mobile_app/.translations/sl.json @@ -9,6 +9,5 @@ "title": "Mobilna Aplikacija" } } - }, - "title": "Mobilna Aplikacija" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/sv.json b/homeassistant/components/mobile_app/.translations/sv.json index 03a52485c233..497179b2a190 100644 --- a/homeassistant/components/mobile_app/.translations/sv.json +++ b/homeassistant/components/mobile_app/.translations/sv.json @@ -9,6 +9,5 @@ "title": "Mobilapp" } } - }, - "title": "Mobilapp" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/uk.json b/homeassistant/components/mobile_app/.translations/uk.json index 90dd206046c6..0916a0ac34f4 100644 --- a/homeassistant/components/mobile_app/.translations/uk.json +++ b/homeassistant/components/mobile_app/.translations/uk.json @@ -6,6 +6,5 @@ "title": "\u041c\u043e\u0431\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0434\u0430\u0442\u043e\u043a" } } - }, - "title": "\u041c\u043e\u0431\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0434\u0430\u0442\u043e\u043a" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/vi.json b/homeassistant/components/mobile_app/.translations/vi.json index 7202144aaa96..272e4d6f04f8 100644 --- a/homeassistant/components/mobile_app/.translations/vi.json +++ b/homeassistant/components/mobile_app/.translations/vi.json @@ -9,6 +9,5 @@ "title": "\u1ee8ng d\u1ee5ng di \u0111\u1ed9ng" } } - }, - "title": "\u1ee8ng d\u1ee5ng di \u0111\u1ed9ng" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/zh-Hans.json b/homeassistant/components/mobile_app/.translations/zh-Hans.json index 808637328d08..5bef54b6df69 100644 --- a/homeassistant/components/mobile_app/.translations/zh-Hans.json +++ b/homeassistant/components/mobile_app/.translations/zh-Hans.json @@ -9,6 +9,5 @@ "title": "\u79fb\u52a8\u5e94\u7528" } } - }, - "title": "\u79fb\u52a8\u5e94\u7528" + } } \ No newline at end of file diff --git a/homeassistant/components/mobile_app/.translations/zh-Hant.json b/homeassistant/components/mobile_app/.translations/zh-Hant.json index a7e989f1abf0..d088b64b4d40 100644 --- a/homeassistant/components/mobile_app/.translations/zh-Hant.json +++ b/homeassistant/components/mobile_app/.translations/zh-Hant.json @@ -9,6 +9,5 @@ "title": "\u624b\u6a5f App" } } - }, - "title": "\u624b\u6a5f App" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ca.json b/homeassistant/components/monoprice/.translations/ca.json index d4afcb7a1c61..e6e6208a8a43 100644 --- a/homeassistant/components/monoprice/.translations/ca.json +++ b/homeassistant/components/monoprice/.translations/ca.json @@ -36,6 +36,5 @@ "title": "Configuraci\u00f3 de les fonts" } } - }, - "title": "Amplificador Monoprice de 6 zones" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/de.json b/homeassistant/components/monoprice/.translations/de.json index 167f24d3794c..4c76920226e8 100644 --- a/homeassistant/components/monoprice/.translations/de.json +++ b/homeassistant/components/monoprice/.translations/de.json @@ -36,6 +36,5 @@ "title": "Quellen konfigurieren" } } - }, - "title": "Monoprice 6-Zonen-Verst\u00e4rker" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/en.json b/homeassistant/components/monoprice/.translations/en.json index 8f56813cbb6c..3e62a066308b 100644 --- a/homeassistant/components/monoprice/.translations/en.json +++ b/homeassistant/components/monoprice/.translations/en.json @@ -36,6 +36,5 @@ "title": "Configure sources" } } - }, - "title": "Monoprice 6-Zone Amplifier" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/es.json b/homeassistant/components/monoprice/.translations/es.json index 4e2e3eb72c06..fabc33234b6f 100644 --- a/homeassistant/components/monoprice/.translations/es.json +++ b/homeassistant/components/monoprice/.translations/es.json @@ -36,6 +36,5 @@ "title": "Configurar fuentes" } } - }, - "title": "Amplificador Monoprice de 6 zonas" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/it.json b/homeassistant/components/monoprice/.translations/it.json index e78930a9d3e3..d16a249d1a55 100644 --- a/homeassistant/components/monoprice/.translations/it.json +++ b/homeassistant/components/monoprice/.translations/it.json @@ -36,6 +36,5 @@ "title": "Configurare le sorgenti" } } - }, - "title": "Amplificatore a 6 zone Monoprice" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ko.json b/homeassistant/components/monoprice/.translations/ko.json index 50502ce40e81..4ba78dcfbbf0 100644 --- a/homeassistant/components/monoprice/.translations/ko.json +++ b/homeassistant/components/monoprice/.translations/ko.json @@ -36,6 +36,5 @@ "title": "\uc785\ub825 \uc18c\uc2a4 \uad6c\uc131" } } - }, - "title": "Monoprice 6-Zone \uc570\ud504" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/lb.json b/homeassistant/components/monoprice/.translations/lb.json index a174aba2a1f3..6f530fa8a80d 100644 --- a/homeassistant/components/monoprice/.translations/lb.json +++ b/homeassistant/components/monoprice/.translations/lb.json @@ -36,6 +36,5 @@ "title": "Quelle konfigur\u00e9ieren" } } - }, - "title": "Monoprice 6-Zone Verst\u00e4rker" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/no.json b/homeassistant/components/monoprice/.translations/no.json index f7d53f1449cb..bbbeed0c1fdf 100644 --- a/homeassistant/components/monoprice/.translations/no.json +++ b/homeassistant/components/monoprice/.translations/no.json @@ -36,6 +36,5 @@ "title": "Konfigurer kilder" } } - }, - "title": "Monoprice 6-Zone Forsterker" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/ru.json b/homeassistant/components/monoprice/.translations/ru.json index 0bb393e33899..a16cf1ae38a8 100644 --- a/homeassistant/components/monoprice/.translations/ru.json +++ b/homeassistant/components/monoprice/.translations/ru.json @@ -36,6 +36,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432" } } - }, - "title": "Monoprice 6-Zone Amplifier" + } } \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/sl.json b/homeassistant/components/monoprice/.translations/sl.json new file mode 100644 index 000000000000..02713888762d --- /dev/null +++ b/homeassistant/components/monoprice/.translations/sl.json @@ -0,0 +1,40 @@ +{ + "config": { + "abort": { + "already_configured": "Naprava je \u017ee konfigurirana" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "port": "Serijska vrata", + "source_1": "Ime vira #1", + "source_2": "Ime vira #2", + "source_3": "Ime vira #3", + "source_4": "Ime vira #4", + "source_5": "Ime vira #5", + "source_6": "Ime vira #6" + }, + "title": "Pove\u017eite se z napravo" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "source_1": "Ime vira #1", + "source_2": "Ime vira #2", + "source_3": "Ime vira #3", + "source_4": "Ime vira #4", + "source_5": "Ime vira #5", + "source_6": "Ime vira #6" + }, + "title": "Konfigurirajte vire" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/monoprice/.translations/zh-Hant.json b/homeassistant/components/monoprice/.translations/zh-Hant.json index bf8c7dfc0c66..9113e3c8d8a5 100644 --- a/homeassistant/components/monoprice/.translations/zh-Hant.json +++ b/homeassistant/components/monoprice/.translations/zh-Hant.json @@ -36,6 +36,5 @@ "title": "\u8a2d\u5b9a\u4f86\u6e90" } } - }, - "title": "Monoprice 6-Zone \u653e\u5927\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/bg.json b/homeassistant/components/mqtt/.translations/bg.json index 50f54a177066..384efdebffca 100644 --- a/homeassistant/components/mqtt/.translations/bg.json +++ b/homeassistant/components/mqtt/.translations/bg.json @@ -26,6 +26,5 @@ "title": "MQTT \u0431\u0440\u043e\u043a\u0435\u0440 \u0447\u0440\u0435\u0437 Hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ca.json b/homeassistant/components/mqtt/.translations/ca.json index a667f2224f0a..7b93dfe2fbda 100644 --- a/homeassistant/components/mqtt/.translations/ca.json +++ b/homeassistant/components/mqtt/.translations/ca.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" alliberat", "button_triple_press": "\"{subtype}\" clicat tres vegades" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/cs.json b/homeassistant/components/mqtt/.translations/cs.json index e023916c4201..d021c1fcba82 100644 --- a/homeassistant/components/mqtt/.translations/cs.json +++ b/homeassistant/components/mqtt/.translations/cs.json @@ -26,6 +26,5 @@ "title": "MQTT Broker prost\u0159ednictv\u00edm dopl\u0148ku Hass.io" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/da.json b/homeassistant/components/mqtt/.translations/da.json index 8acd3966bcdc..ba605bd65956 100644 --- a/homeassistant/components/mqtt/.translations/da.json +++ b/homeassistant/components/mqtt/.translations/da.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" sluppet", "button_triple_press": "\"{subtype}\" tredobbeltklikket" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/de.json b/homeassistant/components/mqtt/.translations/de.json index be7f53ec6373..8713163bdfc3 100644 --- a/homeassistant/components/mqtt/.translations/de.json +++ b/homeassistant/components/mqtt/.translations/de.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" freigegeben", "button_triple_press": "\"{subtype}\" dreifach geklickt" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/en.json b/homeassistant/components/mqtt/.translations/en.json index 2eb4e7f90142..f7bc89da80bd 100644 --- a/homeassistant/components/mqtt/.translations/en.json +++ b/homeassistant/components/mqtt/.translations/en.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" released", "button_triple_press": "\"{subtype}\" triple clicked" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/es-419.json b/homeassistant/components/mqtt/.translations/es-419.json index 413af8497b25..af0bd912bc73 100644 --- a/homeassistant/components/mqtt/.translations/es-419.json +++ b/homeassistant/components/mqtt/.translations/es-419.json @@ -26,6 +26,5 @@ "title": "MQTT Broker a trav\u00e9s del complemento Hass.io" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/es.json b/homeassistant/components/mqtt/.translations/es.json index 0cb2a37698b4..131e0855ef9d 100644 --- a/homeassistant/components/mqtt/.translations/es.json +++ b/homeassistant/components/mqtt/.translations/es.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" soltado", "button_triple_press": "\"{subtype}\" triple pulsaci\u00f3n" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/et.json b/homeassistant/components/mqtt/.translations/et.json index 71735d70d9df..20ff3db6518e 100644 --- a/homeassistant/components/mqtt/.translations/et.json +++ b/homeassistant/components/mqtt/.translations/et.json @@ -5,6 +5,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/fr.json b/homeassistant/components/mqtt/.translations/fr.json index fc8c3aeaafbe..74eec7a1f11a 100644 --- a/homeassistant/components/mqtt/.translations/fr.json +++ b/homeassistant/components/mqtt/.translations/fr.json @@ -41,6 +41,5 @@ "trigger_type": { "button_short_press": "\" {subtype} \" press\u00e9" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/he.json b/homeassistant/components/mqtt/.translations/he.json index 1f0b1b4754b8..f8defa49708b 100644 --- a/homeassistant/components/mqtt/.translations/he.json +++ b/homeassistant/components/mqtt/.translations/he.json @@ -19,6 +19,5 @@ "title": "MQTT" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/hr.json b/homeassistant/components/mqtt/.translations/hr.json index f8e2f981a44f..67994227513d 100644 --- a/homeassistant/components/mqtt/.translations/hr.json +++ b/homeassistant/components/mqtt/.translations/hr.json @@ -10,6 +10,5 @@ "title": "MQTT" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/hu.json b/homeassistant/components/mqtt/.translations/hu.json index e4a906e713d9..ee0ac26e0cdf 100644 --- a/homeassistant/components/mqtt/.translations/hu.json +++ b/homeassistant/components/mqtt/.translations/hu.json @@ -38,6 +38,5 @@ "turn_off": "Kikapcsol\u00e1s", "turn_on": "Bekapcsol\u00e1s" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/id.json b/homeassistant/components/mqtt/.translations/id.json index d106a400bdce..0afc9ee70215 100644 --- a/homeassistant/components/mqtt/.translations/id.json +++ b/homeassistant/components/mqtt/.translations/id.json @@ -18,6 +18,5 @@ "title": "MQTT" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/it.json b/homeassistant/components/mqtt/.translations/it.json index a2789f6c1a59..2007a946dd56 100644 --- a/homeassistant/components/mqtt/.translations/it.json +++ b/homeassistant/components/mqtt/.translations/it.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" rilasciato", "button_triple_press": "\"{subtype}\" cliccato tre volte" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ko.json b/homeassistant/components/mqtt/.translations/ko.json index 7bb24458f7de..32c3f892e586 100644 --- a/homeassistant/components/mqtt/.translations/ko.json +++ b/homeassistant/components/mqtt/.translations/ko.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" \uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c", "button_triple_press": "\"{subtype}\" \uc774 \uc138 \ubc88 \ub20c\ub9b4 \ub54c" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/lb.json b/homeassistant/components/mqtt/.translations/lb.json index dce5ea993e43..ba84a2e30c57 100644 --- a/homeassistant/components/mqtt/.translations/lb.json +++ b/homeassistant/components/mqtt/.translations/lb.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" lassgelooss", "button_triple_press": "\"{subtype}\" dr\u00e4imol gedr\u00e9ckt" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/nl.json b/homeassistant/components/mqtt/.translations/nl.json index 228d30b2c601..56684b325351 100644 --- a/homeassistant/components/mqtt/.translations/nl.json +++ b/homeassistant/components/mqtt/.translations/nl.json @@ -26,6 +26,5 @@ "title": "MQTTT Broker via Hass.io add-on" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/nn.json b/homeassistant/components/mqtt/.translations/nn.json index aedbdb99809a..ab64bd1b9fce 100644 --- a/homeassistant/components/mqtt/.translations/nn.json +++ b/homeassistant/components/mqtt/.translations/nn.json @@ -18,6 +18,5 @@ "title": "MQTT" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/no.json b/homeassistant/components/mqtt/.translations/no.json index 365a5ec232f1..3bfceb324a38 100644 --- a/homeassistant/components/mqtt/.translations/no.json +++ b/homeassistant/components/mqtt/.translations/no.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" utgitt", "button_triple_press": "\"{subtype}\" trippel klikket" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pl.json b/homeassistant/components/mqtt/.translations/pl.json index 5d49f0f43c1f..73a29caced60 100644 --- a/homeassistant/components/mqtt/.translations/pl.json +++ b/homeassistant/components/mqtt/.translations/pl.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" zostanie zwolniony", "button_triple_press": "\"{subtype}\" zostanie trzykrotnie naci\u015bni\u0119ty" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pt-BR.json b/homeassistant/components/mqtt/.translations/pt-BR.json index c1011c290422..1fe0ef5c6e5b 100644 --- a/homeassistant/components/mqtt/.translations/pt-BR.json +++ b/homeassistant/components/mqtt/.translations/pt-BR.json @@ -26,6 +26,5 @@ "title": "MQTT Broker via add-on Hass.io" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/pt.json b/homeassistant/components/mqtt/.translations/pt.json index ce1a92a89573..0776c148e908 100644 --- a/homeassistant/components/mqtt/.translations/pt.json +++ b/homeassistant/components/mqtt/.translations/pt.json @@ -26,6 +26,5 @@ "title": "MQTT Broker atrav\u00e9s do add-on Hass.io" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ro.json b/homeassistant/components/mqtt/.translations/ro.json index f25c034e9825..5fb6d3a3e65e 100644 --- a/homeassistant/components/mqtt/.translations/ro.json +++ b/homeassistant/components/mqtt/.translations/ro.json @@ -26,6 +26,5 @@ "title": "MQTT Broker, prin intermediul Hass.io add-on" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/ru.json b/homeassistant/components/mqtt/.translations/ru.json index 3583df79401b..a3747044a592 100644 --- a/homeassistant/components/mqtt/.translations/ru.json +++ b/homeassistant/components/mqtt/.translations/ru.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430", "button_triple_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/sl.json b/homeassistant/components/mqtt/.translations/sl.json index dece8693da93..9ca44a36d842 100644 --- a/homeassistant/components/mqtt/.translations/sl.json +++ b/homeassistant/components/mqtt/.translations/sl.json @@ -48,6 +48,5 @@ "button_short_release": "Gumb \"{subtype}\" spro\u0161\u010den", "button_triple_press": "Gumb \"{subtype}\" trikrat kliknjen" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/sv.json b/homeassistant/components/mqtt/.translations/sv.json index c9c67d1f0fed..58855eeb62bb 100644 --- a/homeassistant/components/mqtt/.translations/sv.json +++ b/homeassistant/components/mqtt/.translations/sv.json @@ -26,6 +26,5 @@ "title": "MQTT Broker via Hass.io till\u00e4gg" } } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/zh-Hans.json b/homeassistant/components/mqtt/.translations/zh-Hans.json index 581e63a15ef4..a5da0304c5de 100644 --- a/homeassistant/components/mqtt/.translations/zh-Hans.json +++ b/homeassistant/components/mqtt/.translations/zh-Hans.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" \u91ca\u653e", "button_triple_press": "\"{subtype}\" \u4e09\u8fde\u51fb" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/mqtt/.translations/zh-Hant.json b/homeassistant/components/mqtt/.translations/zh-Hant.json index 23b299a93901..9b24b09b10ea 100644 --- a/homeassistant/components/mqtt/.translations/zh-Hant.json +++ b/homeassistant/components/mqtt/.translations/zh-Hant.json @@ -48,6 +48,5 @@ "button_short_release": "\"{subtype}\" \u91cb\u653e", "button_triple_press": "\"{subtype}\" \u4e09\u9023\u64ca" } - }, - "title": "MQTT" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ca.json b/homeassistant/components/myq/.translations/ca.json index db2f7336f197..d22f3a39085e 100644 --- a/homeassistant/components/myq/.translations/ca.json +++ b/homeassistant/components/myq/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Connexi\u00f3 amb la passarel\u00b7la de MyQ" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/de.json b/homeassistant/components/myq/.translations/de.json index 5ebc1747f311..d5c890e41699 100644 --- a/homeassistant/components/myq/.translations/de.json +++ b/homeassistant/components/myq/.translations/de.json @@ -17,6 +17,5 @@ "title": "Stellen Sie eine Verbindung zum MyQ Gateway her" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/en.json b/homeassistant/components/myq/.translations/en.json index 133c92f78d9c..54392f3e2935 100644 --- a/homeassistant/components/myq/.translations/en.json +++ b/homeassistant/components/myq/.translations/en.json @@ -17,6 +17,5 @@ "title": "Connect to the MyQ Gateway" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/es.json b/homeassistant/components/myq/.translations/es.json index 955b7081c6bd..a405883fd3c6 100644 --- a/homeassistant/components/myq/.translations/es.json +++ b/homeassistant/components/myq/.translations/es.json @@ -17,6 +17,5 @@ "title": "Conectar con el Gateway " } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/fr.json b/homeassistant/components/myq/.translations/fr.json index 98e2af15c897..4ae00e7495fe 100644 --- a/homeassistant/components/myq/.translations/fr.json +++ b/homeassistant/components/myq/.translations/fr.json @@ -17,6 +17,5 @@ "title": "Connectez-vous \u00e0 la passerelle MyQ" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/it.json b/homeassistant/components/myq/.translations/it.json index eb052f4b9c5e..9e0484dd6bb6 100644 --- a/homeassistant/components/myq/.translations/it.json +++ b/homeassistant/components/myq/.translations/it.json @@ -17,6 +17,5 @@ "title": "Connettersi al gateway MyQ" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ko.json b/homeassistant/components/myq/.translations/ko.json index a054daab118d..31e3f8646e62 100644 --- a/homeassistant/components/myq/.translations/ko.json +++ b/homeassistant/components/myq/.translations/ko.json @@ -17,6 +17,5 @@ "title": "MyQ \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/lb.json b/homeassistant/components/myq/.translations/lb.json index 12d9edeb42a0..9e9ef66d1d66 100644 --- a/homeassistant/components/myq/.translations/lb.json +++ b/homeassistant/components/myq/.translations/lb.json @@ -17,6 +17,5 @@ "title": "Mat NuHeat Router verbannen" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/no.json b/homeassistant/components/myq/.translations/no.json index 90be81c68bc1..4db38e2b91fa 100644 --- a/homeassistant/components/myq/.translations/no.json +++ b/homeassistant/components/myq/.translations/no.json @@ -17,6 +17,5 @@ "title": "Koble til MyQ Gateway" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/ru.json b/homeassistant/components/myq/.translations/ru.json index 8e5f5cca27d5..81ec65f0d638 100644 --- a/homeassistant/components/myq/.translations/ru.json +++ b/homeassistant/components/myq/.translations/ru.json @@ -17,6 +17,5 @@ "title": "MyQ" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/sl.json b/homeassistant/components/myq/.translations/sl.json new file mode 100644 index 000000000000..f39ed488a103 --- /dev/null +++ b/homeassistant/components/myq/.translations/sl.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "MyQ je \u017ee konfiguriran" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "title": "Pove\u017eite se s prehodom MyQ" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/myq/.translations/zh-Hant.json b/homeassistant/components/myq/.translations/zh-Hant.json index 68a77191b9c3..5ed6e4c2f958 100644 --- a/homeassistant/components/myq/.translations/zh-Hant.json +++ b/homeassistant/components/myq/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u9023\u7dda\u81f3 MyQ \u8def\u7531\u5668" } } - }, - "title": "MyQ" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/bg.json b/homeassistant/components/neato/.translations/bg.json index d4d0f0fba838..c2ebfb92f941 100644 --- a/homeassistant/components/neato/.translations/bg.json +++ b/homeassistant/components/neato/.translations/bg.json @@ -22,6 +22,5 @@ "title": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 Neato \u0430\u043a\u0430\u0443\u043d\u0442" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ca.json b/homeassistant/components/neato/.translations/ca.json index 87a6da7b09e3..d1cfe9f7a911 100644 --- a/homeassistant/components/neato/.translations/ca.json +++ b/homeassistant/components/neato/.translations/ca.json @@ -22,6 +22,5 @@ "title": "Informaci\u00f3 del compte Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/da.json b/homeassistant/components/neato/.translations/da.json index d08f9617975e..33b3200927b1 100644 --- a/homeassistant/components/neato/.translations/da.json +++ b/homeassistant/components/neato/.translations/da.json @@ -22,6 +22,5 @@ "title": "Neato-kontooplysninger" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/de.json b/homeassistant/components/neato/.translations/de.json index 2177c2814687..7316275f37b8 100644 --- a/homeassistant/components/neato/.translations/de.json +++ b/homeassistant/components/neato/.translations/de.json @@ -22,6 +22,5 @@ "title": "Neato-Kontoinformationen" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/en.json b/homeassistant/components/neato/.translations/en.json index 27f8eb25795e..d41faddcc665 100644 --- a/homeassistant/components/neato/.translations/en.json +++ b/homeassistant/components/neato/.translations/en.json @@ -22,6 +22,5 @@ "title": "Neato Account Info" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/es.json b/homeassistant/components/neato/.translations/es.json index 571c9f59d668..766f05d31bf7 100644 --- a/homeassistant/components/neato/.translations/es.json +++ b/homeassistant/components/neato/.translations/es.json @@ -22,6 +22,5 @@ "title": "Informaci\u00f3n de la cuenta de Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/fr.json b/homeassistant/components/neato/.translations/fr.json index 5ea3fadf4305..66f1bb528043 100644 --- a/homeassistant/components/neato/.translations/fr.json +++ b/homeassistant/components/neato/.translations/fr.json @@ -22,6 +22,5 @@ "title": "Informations compte Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/hu.json b/homeassistant/components/neato/.translations/hu.json index 5130b3f9f648..329776ed228f 100644 --- a/homeassistant/components/neato/.translations/hu.json +++ b/homeassistant/components/neato/.translations/hu.json @@ -22,6 +22,5 @@ "title": "Neato Fi\u00f3kinform\u00e1ci\u00f3" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/it.json b/homeassistant/components/neato/.translations/it.json index 140f3dd9e4e2..a456a2688e02 100644 --- a/homeassistant/components/neato/.translations/it.json +++ b/homeassistant/components/neato/.translations/it.json @@ -22,6 +22,5 @@ "title": "Informazioni sull'account Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ko.json b/homeassistant/components/neato/.translations/ko.json index 559aecbcd845..806bf54d35d6 100644 --- a/homeassistant/components/neato/.translations/ko.json +++ b/homeassistant/components/neato/.translations/ko.json @@ -22,6 +22,5 @@ "title": "Neato \uacc4\uc815 \uc815\ubcf4" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/lb.json b/homeassistant/components/neato/.translations/lb.json index ef6b051dec0a..a62009f19b09 100644 --- a/homeassistant/components/neato/.translations/lb.json +++ b/homeassistant/components/neato/.translations/lb.json @@ -22,6 +22,5 @@ "title": "Neato Kont Informatiounen" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/lv.json b/homeassistant/components/neato/.translations/lv.json index 37788b1e0563..6ada7a174521 100644 --- a/homeassistant/components/neato/.translations/lv.json +++ b/homeassistant/components/neato/.translations/lv.json @@ -9,6 +9,5 @@ "title": "Neato konta inform\u0101cija" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/nl.json b/homeassistant/components/neato/.translations/nl.json index 0d0188128c31..5e828a826688 100644 --- a/homeassistant/components/neato/.translations/nl.json +++ b/homeassistant/components/neato/.translations/nl.json @@ -22,6 +22,5 @@ "title": "Neato-account info" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/nn.json b/homeassistant/components/neato/.translations/nn.json index 05da161730c6..7c129cba3afc 100644 --- a/homeassistant/components/neato/.translations/nn.json +++ b/homeassistant/components/neato/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/no.json b/homeassistant/components/neato/.translations/no.json index f8d743630760..63ce9b7bec0a 100644 --- a/homeassistant/components/neato/.translations/no.json +++ b/homeassistant/components/neato/.translations/no.json @@ -22,6 +22,5 @@ "title": "Neato kontoinformasjon" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/pl.json b/homeassistant/components/neato/.translations/pl.json index 199fdcd0c804..a040c880e337 100644 --- a/homeassistant/components/neato/.translations/pl.json +++ b/homeassistant/components/neato/.translations/pl.json @@ -22,6 +22,5 @@ "title": "Informacje o koncie Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/ru.json b/homeassistant/components/neato/.translations/ru.json index ebc6f80f70da..92935906a865 100644 --- a/homeassistant/components/neato/.translations/ru.json +++ b/homeassistant/components/neato/.translations/ru.json @@ -22,6 +22,5 @@ "title": "Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/sl.json b/homeassistant/components/neato/.translations/sl.json index 9eab7eff5ac5..ed20b5a904e8 100644 --- a/homeassistant/components/neato/.translations/sl.json +++ b/homeassistant/components/neato/.translations/sl.json @@ -22,6 +22,5 @@ "title": "Podatki o ra\u010dunu Neato" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/sv.json b/homeassistant/components/neato/.translations/sv.json index 9334b5723040..eb0fa0ec6c8a 100644 --- a/homeassistant/components/neato/.translations/sv.json +++ b/homeassistant/components/neato/.translations/sv.json @@ -22,6 +22,5 @@ "title": "Neato-kontoinfo" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/neato/.translations/zh-Hant.json b/homeassistant/components/neato/.translations/zh-Hant.json index 44faede84440..8d8fe6290302 100644 --- a/homeassistant/components/neato/.translations/zh-Hant.json +++ b/homeassistant/components/neato/.translations/zh-Hant.json @@ -22,6 +22,5 @@ "title": "Neato \u5e33\u865f\u8cc7\u8a0a" } } - }, - "title": "Neato" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/bg.json b/homeassistant/components/nest/.translations/bg.json index 553662de6104..c5b303e9cdd7 100644 --- a/homeassistant/components/nest/.translations/bg.json +++ b/homeassistant/components/nest/.translations/bg.json @@ -28,6 +28,5 @@ "title": "\u0421\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u0412\u0430\u0448\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b \u0432 Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ca.json b/homeassistant/components/nest/.translations/ca.json index 4c9a9830bb69..92fd386c5c39 100644 --- a/homeassistant/components/nest/.translations/ca.json +++ b/homeassistant/components/nest/.translations/ca.json @@ -28,6 +28,5 @@ "title": "Enlla\u00e7 amb el compte de Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/cs.json b/homeassistant/components/nest/.translations/cs.json index dc1e3617709a..82a894ffb3b6 100644 --- a/homeassistant/components/nest/.translations/cs.json +++ b/homeassistant/components/nest/.translations/cs.json @@ -28,6 +28,5 @@ "title": "Propojit s Nest \u00fa\u010dtem" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/da.json b/homeassistant/components/nest/.translations/da.json index 9df04019e6cc..2666696f8d61 100644 --- a/homeassistant/components/nest/.translations/da.json +++ b/homeassistant/components/nest/.translations/da.json @@ -28,6 +28,5 @@ "title": "Forbind Nest-konto" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/de.json b/homeassistant/components/nest/.translations/de.json index daec97603e63..27b9b398e78d 100644 --- a/homeassistant/components/nest/.translations/de.json +++ b/homeassistant/components/nest/.translations/de.json @@ -28,6 +28,5 @@ "title": "Nest-Konto verkn\u00fcpfen" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/en.json b/homeassistant/components/nest/.translations/en.json index 8d0304e883e2..2ea9b419501a 100644 --- a/homeassistant/components/nest/.translations/en.json +++ b/homeassistant/components/nest/.translations/en.json @@ -28,6 +28,5 @@ "title": "Link Nest Account" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/es-419.json b/homeassistant/components/nest/.translations/es-419.json index d75bf7e05334..d816813855c1 100644 --- a/homeassistant/components/nest/.translations/es-419.json +++ b/homeassistant/components/nest/.translations/es-419.json @@ -25,6 +25,5 @@ "title": "Enlazar cuenta Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/es.json b/homeassistant/components/nest/.translations/es.json index 4f94c67d12b9..773a2d8c59cc 100644 --- a/homeassistant/components/nest/.translations/es.json +++ b/homeassistant/components/nest/.translations/es.json @@ -28,6 +28,5 @@ "title": "Vincular cuenta de Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/et.json b/homeassistant/components/nest/.translations/et.json index 5297ac3263b0..238ac5711f5d 100644 --- a/homeassistant/components/nest/.translations/et.json +++ b/homeassistant/components/nest/.translations/et.json @@ -10,6 +10,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/fr.json b/homeassistant/components/nest/.translations/fr.json index f75e55b102d6..6308098b9c1f 100644 --- a/homeassistant/components/nest/.translations/fr.json +++ b/homeassistant/components/nest/.translations/fr.json @@ -28,6 +28,5 @@ "title": "Lier un compte Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/he.json b/homeassistant/components/nest/.translations/he.json index 8d472c811c77..a0ed6659865a 100644 --- a/homeassistant/components/nest/.translations/he.json +++ b/homeassistant/components/nest/.translations/he.json @@ -28,6 +28,5 @@ "title": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05e9\u05d1\u05d5\u05df Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/hr.json b/homeassistant/components/nest/.translations/hr.json index 5ab9a2b060a5..d2418b00726a 100644 --- a/homeassistant/components/nest/.translations/hr.json +++ b/homeassistant/components/nest/.translations/hr.json @@ -16,6 +16,5 @@ } } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/hu.json b/homeassistant/components/nest/.translations/hu.json index fffe08d20ced..8ed8bcc843c0 100644 --- a/homeassistant/components/nest/.translations/hu.json +++ b/homeassistant/components/nest/.translations/hu.json @@ -27,6 +27,5 @@ "title": "Nest fi\u00f3k \u00f6sszekapcsol\u00e1sa" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/id.json b/homeassistant/components/nest/.translations/id.json index 7b244a681ea3..3a805baec05b 100644 --- a/homeassistant/components/nest/.translations/id.json +++ b/homeassistant/components/nest/.translations/id.json @@ -28,6 +28,5 @@ "title": "Hubungkan Akun Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/it.json b/homeassistant/components/nest/.translations/it.json index a1ac11c17fcd..2e567a27ce10 100644 --- a/homeassistant/components/nest/.translations/it.json +++ b/homeassistant/components/nest/.translations/it.json @@ -28,6 +28,5 @@ "title": "Collega un account Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ko.json b/homeassistant/components/nest/.translations/ko.json index 33336623be33..2d65458665f5 100644 --- a/homeassistant/components/nest/.translations/ko.json +++ b/homeassistant/components/nest/.translations/ko.json @@ -28,6 +28,5 @@ "title": "Nest \uacc4\uc815 \uc5f0\uacb0" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/lb.json b/homeassistant/components/nest/.translations/lb.json index b8a8fc3e3481..526c258bb261 100644 --- a/homeassistant/components/nest/.translations/lb.json +++ b/homeassistant/components/nest/.translations/lb.json @@ -28,6 +28,5 @@ "title": "Nest Kont verbannen" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/nl.json b/homeassistant/components/nest/.translations/nl.json index 9cdea36d2082..85775d06e214 100644 --- a/homeassistant/components/nest/.translations/nl.json +++ b/homeassistant/components/nest/.translations/nl.json @@ -28,6 +28,5 @@ "title": "Koppel Nest-account" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/nn.json b/homeassistant/components/nest/.translations/nn.json index 4af3f8dcc700..a70720a33275 100644 --- a/homeassistant/components/nest/.translations/nn.json +++ b/homeassistant/components/nest/.translations/nn.json @@ -28,6 +28,5 @@ "title": "Link Nestkonto" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/no.json b/homeassistant/components/nest/.translations/no.json index b60e3c4e9553..0adab5dcdcdf 100644 --- a/homeassistant/components/nest/.translations/no.json +++ b/homeassistant/components/nest/.translations/no.json @@ -28,6 +28,5 @@ "title": "Koble til Nest konto" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pl.json b/homeassistant/components/nest/.translations/pl.json index 19382fadb47f..b5953decc6bf 100644 --- a/homeassistant/components/nest/.translations/pl.json +++ b/homeassistant/components/nest/.translations/pl.json @@ -28,6 +28,5 @@ "title": "Po\u0142\u0105cz z kontem Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt-BR.json b/homeassistant/components/nest/.translations/pt-BR.json index c1d04ccebe57..2594540c6eae 100644 --- a/homeassistant/components/nest/.translations/pt-BR.json +++ b/homeassistant/components/nest/.translations/pt-BR.json @@ -28,6 +28,5 @@ "title": "Link da conta Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt.json b/homeassistant/components/nest/.translations/pt.json index ea811dac9985..f0e074aca2f7 100644 --- a/homeassistant/components/nest/.translations/pt.json +++ b/homeassistant/components/nest/.translations/pt.json @@ -24,10 +24,9 @@ "data": { "code": "C\u00f3digo PIN" }, - "description": "Para associar \u00e0 sua conta Nest, [autorizar sua conta]({url}).\n\nAp\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo pin fornecido abaixo.", + "description": "Para associar \u00e0 sua conta Nest, [autorizar a sua conta]({url}).\n\nAp\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo pin fornecido abaixo.", "title": "Associar conta Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ro.json b/homeassistant/components/nest/.translations/ro.json index 2ec7dfa76708..afad668a98be 100644 --- a/homeassistant/components/nest/.translations/ro.json +++ b/homeassistant/components/nest/.translations/ro.json @@ -8,6 +8,5 @@ "title": "Leg\u0103tur\u0103 cont Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/ru.json b/homeassistant/components/nest/.translations/ru.json index 41072b296604..674a01556c5d 100644 --- a/homeassistant/components/nest/.translations/ru.json +++ b/homeassistant/components/nest/.translations/ru.json @@ -28,6 +28,5 @@ "title": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/sl.json b/homeassistant/components/nest/.translations/sl.json index bbe9a31a7cca..46b714b7299b 100644 --- a/homeassistant/components/nest/.translations/sl.json +++ b/homeassistant/components/nest/.translations/sl.json @@ -28,6 +28,5 @@ "title": "Pove\u017eite Nest ra\u010dun" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/sv.json b/homeassistant/components/nest/.translations/sv.json index ba5d2fbf0074..f5f165e37e97 100644 --- a/homeassistant/components/nest/.translations/sv.json +++ b/homeassistant/components/nest/.translations/sv.json @@ -28,6 +28,5 @@ "title": "L\u00e4nka Nest-konto" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/th.json b/homeassistant/components/nest/.translations/th.json index 8dc744fad09c..6a434860c083 100644 --- a/homeassistant/components/nest/.translations/th.json +++ b/homeassistant/components/nest/.translations/th.json @@ -10,6 +10,5 @@ } } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/vi.json b/homeassistant/components/nest/.translations/vi.json index c317e5bb464c..4eb8677762ad 100644 --- a/homeassistant/components/nest/.translations/vi.json +++ b/homeassistant/components/nest/.translations/vi.json @@ -17,6 +17,5 @@ "title": "Li\u00ean k\u1ebft t\u00e0i kho\u1ea3n Nest" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/zh-Hans.json b/homeassistant/components/nest/.translations/zh-Hans.json index 389a306a5384..ce0824075b27 100644 --- a/homeassistant/components/nest/.translations/zh-Hans.json +++ b/homeassistant/components/nest/.translations/zh-Hans.json @@ -28,6 +28,5 @@ "title": "\u5173\u8054 Nest \u8d26\u6237" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/zh-Hant.json b/homeassistant/components/nest/.translations/zh-Hant.json index ec8790d26f4d..3d8e88d2d04f 100644 --- a/homeassistant/components/nest/.translations/zh-Hant.json +++ b/homeassistant/components/nest/.translations/zh-Hant.json @@ -28,6 +28,5 @@ "title": "\u9023\u7d50 Nest \u5e33\u865f" } } - }, - "title": "Nest" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ca.json b/homeassistant/components/netatmo/.translations/ca.json index eb361bcdb29e..4cfd8e27cf7c 100644 --- a/homeassistant/components/netatmo/.translations/ca.json +++ b/homeassistant/components/netatmo/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/da.json b/homeassistant/components/netatmo/.translations/da.json index 82400e48f8b8..1f35d3466ce1 100644 --- a/homeassistant/components/netatmo/.translations/da.json +++ b/homeassistant/components/netatmo/.translations/da.json @@ -13,6 +13,5 @@ "title": "V\u00e6lg godkendelsesmetode" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/de.json b/homeassistant/components/netatmo/.translations/de.json index d962d259a1c0..0a8d187e50d5 100644 --- a/homeassistant/components/netatmo/.translations/de.json +++ b/homeassistant/components/netatmo/.translations/de.json @@ -13,6 +13,5 @@ "title": "W\u00e4hle die Authentifizierungsmethode" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/en.json b/homeassistant/components/netatmo/.translations/en.json index 62f2e05e1580..1e23982e0a9d 100644 --- a/homeassistant/components/netatmo/.translations/en.json +++ b/homeassistant/components/netatmo/.translations/en.json @@ -13,6 +13,5 @@ "title": "Pick Authentication Method" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/es.json b/homeassistant/components/netatmo/.translations/es.json index 0804fb59dfb2..d157a7460687 100644 --- a/homeassistant/components/netatmo/.translations/es.json +++ b/homeassistant/components/netatmo/.translations/es.json @@ -13,6 +13,5 @@ "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/fr.json b/homeassistant/components/netatmo/.translations/fr.json index d7c7da341e27..d2d67e0e5101 100644 --- a/homeassistant/components/netatmo/.translations/fr.json +++ b/homeassistant/components/netatmo/.translations/fr.json @@ -13,6 +13,5 @@ "title": "S\u00e9lectionner une m\u00e9thode d'authentification" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/hu.json b/homeassistant/components/netatmo/.translations/hu.json index b621bedfd176..e71b6a20b247 100644 --- a/homeassistant/components/netatmo/.translations/hu.json +++ b/homeassistant/components/netatmo/.translations/hu.json @@ -12,6 +12,5 @@ "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/it.json b/homeassistant/components/netatmo/.translations/it.json index cde5e827b164..e7d410a1d866 100644 --- a/homeassistant/components/netatmo/.translations/it.json +++ b/homeassistant/components/netatmo/.translations/it.json @@ -13,6 +13,5 @@ "title": "Scegli il metodo di autenticazione" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ko.json b/homeassistant/components/netatmo/.translations/ko.json index 39b350e0e208..f5749ebf2ca0 100644 --- a/homeassistant/components/netatmo/.translations/ko.json +++ b/homeassistant/components/netatmo/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/lb.json b/homeassistant/components/netatmo/.translations/lb.json index ecec03f6ed49..7332643a4f30 100644 --- a/homeassistant/components/netatmo/.translations/lb.json +++ b/homeassistant/components/netatmo/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Wielt Authentifikatiouns Method aus" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/nl.json b/homeassistant/components/netatmo/.translations/nl.json index b3218f473d95..dd23b6ac4292 100644 --- a/homeassistant/components/netatmo/.translations/nl.json +++ b/homeassistant/components/netatmo/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Kies een authenticatie methode" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/no.json b/homeassistant/components/netatmo/.translations/no.json index 17686771cd55..582dc1037b82 100644 --- a/homeassistant/components/netatmo/.translations/no.json +++ b/homeassistant/components/netatmo/.translations/no.json @@ -13,6 +13,5 @@ "title": "Velg autentiseringsmetode" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/pl.json b/homeassistant/components/netatmo/.translations/pl.json index 80f287cabbf1..a4d4d1b98317 100644 --- a/homeassistant/components/netatmo/.translations/pl.json +++ b/homeassistant/components/netatmo/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Wybierz metod\u0119 uwierzytelniania" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/ru.json b/homeassistant/components/netatmo/.translations/ru.json index 20860d104ed1..8de4e5bcb982 100644 --- a/homeassistant/components/netatmo/.translations/ru.json +++ b/homeassistant/components/netatmo/.translations/ru.json @@ -13,6 +13,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/sl.json b/homeassistant/components/netatmo/.translations/sl.json index 9bef8c10e384..231db98bd54f 100644 --- a/homeassistant/components/netatmo/.translations/sl.json +++ b/homeassistant/components/netatmo/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Izberite na\u010din preverjanja pristnosti" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/sv.json b/homeassistant/components/netatmo/.translations/sv.json index a0199c3819de..2557123da33c 100644 --- a/homeassistant/components/netatmo/.translations/sv.json +++ b/homeassistant/components/netatmo/.translations/sv.json @@ -13,6 +13,5 @@ "title": "V\u00e4lj autentiseringsmetod" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/netatmo/.translations/zh-Hant.json b/homeassistant/components/netatmo/.translations/zh-Hant.json index d2fbb03c9199..eba134e15666 100644 --- a/homeassistant/components/netatmo/.translations/zh-Hant.json +++ b/homeassistant/components/netatmo/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } } - }, - "title": "Netatmo" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ca.json b/homeassistant/components/nexia/.translations/ca.json index 66eebbf7c796..fcbb879548cb 100644 --- a/homeassistant/components/nexia/.translations/ca.json +++ b/homeassistant/components/nexia/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Connexi\u00f3 amb mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/de.json b/homeassistant/components/nexia/.translations/de.json index 0aeca50a0ab1..0ff4da3b2e1d 100644 --- a/homeassistant/components/nexia/.translations/de.json +++ b/homeassistant/components/nexia/.translations/de.json @@ -17,6 +17,5 @@ "title": "Stellen Sie eine Verbindung zu mynexia.com her" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/en.json b/homeassistant/components/nexia/.translations/en.json index c2871984d976..016518495dcd 100644 --- a/homeassistant/components/nexia/.translations/en.json +++ b/homeassistant/components/nexia/.translations/en.json @@ -17,6 +17,5 @@ "title": "Connect to mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/es.json b/homeassistant/components/nexia/.translations/es.json index 1aea820987ce..d2d92d1e85b8 100644 --- a/homeassistant/components/nexia/.translations/es.json +++ b/homeassistant/components/nexia/.translations/es.json @@ -17,6 +17,5 @@ "title": "Conectar con mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/fr.json b/homeassistant/components/nexia/.translations/fr.json index 20acbb6ab7c7..8082f912beda 100644 --- a/homeassistant/components/nexia/.translations/fr.json +++ b/homeassistant/components/nexia/.translations/fr.json @@ -17,6 +17,5 @@ "title": "Se connecter \u00e0 mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/it.json b/homeassistant/components/nexia/.translations/it.json index 767e73d3ed7a..034aff83ecda 100644 --- a/homeassistant/components/nexia/.translations/it.json +++ b/homeassistant/components/nexia/.translations/it.json @@ -17,6 +17,5 @@ "title": "Connettersi a mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ko.json b/homeassistant/components/nexia/.translations/ko.json index 90f01a0d8215..a918de60fe63 100644 --- a/homeassistant/components/nexia/.translations/ko.json +++ b/homeassistant/components/nexia/.translations/ko.json @@ -17,6 +17,5 @@ "title": "mynexia.com \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/lb.json b/homeassistant/components/nexia/.translations/lb.json index c6f600ef5da3..3179afd93a26 100644 --- a/homeassistant/components/nexia/.translations/lb.json +++ b/homeassistant/components/nexia/.translations/lb.json @@ -17,6 +17,5 @@ "title": "Mat mynexia.com verbannen" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/no.json b/homeassistant/components/nexia/.translations/no.json index 8860d0d0904f..335d8834ec38 100644 --- a/homeassistant/components/nexia/.translations/no.json +++ b/homeassistant/components/nexia/.translations/no.json @@ -17,6 +17,5 @@ "title": "Koble til mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/ru.json b/homeassistant/components/nexia/.translations/ru.json index 918a3b849d9b..ee8fc183b3e4 100644 --- a/homeassistant/components/nexia/.translations/ru.json +++ b/homeassistant/components/nexia/.translations/ru.json @@ -17,6 +17,5 @@ "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/sl.json b/homeassistant/components/nexia/.translations/sl.json new file mode 100644 index 000000000000..55c234fbde3b --- /dev/null +++ b/homeassistant/components/nexia/.translations/sl.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Ta Nexia dom je \u017ee nastavljen" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "title": "Pove\u017eite se z mynexia.com" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nexia/.translations/zh-Hant.json b/homeassistant/components/nexia/.translations/zh-Hant.json index 3b83ce40836b..a57dbfa7e05e 100644 --- a/homeassistant/components/nexia/.translations/zh-Hant.json +++ b/homeassistant/components/nexia/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u9023\u7dda\u81f3 mynexia.com" } } - }, - "title": "Nexia" + } } \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/af.json b/homeassistant/components/notify/.translations/af.json new file mode 100644 index 000000000000..158d5d0ea4cd --- /dev/null +++ b/homeassistant/components/notify/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Stel in kennis" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ar.json b/homeassistant/components/notify/.translations/ar.json new file mode 100644 index 000000000000..39bc6a8b2d73 --- /dev/null +++ b/homeassistant/components/notify/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0625\u0634\u0639\u0627\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/bg.json b/homeassistant/components/notify/.translations/bg.json new file mode 100644 index 000000000000..490d3242f6d7 --- /dev/null +++ b/homeassistant/components/notify/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0418\u0437\u0432\u0435\u0441\u0442\u044f\u0432\u0430\u043d\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/bs.json b/homeassistant/components/notify/.translations/bs.json new file mode 100644 index 000000000000..851833c7f707 --- /dev/null +++ b/homeassistant/components/notify/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Obavjesti" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ca.json b/homeassistant/components/notify/.translations/ca.json new file mode 100644 index 000000000000..3ecfc7048b2c --- /dev/null +++ b/homeassistant/components/notify/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Notificacions" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/cs.json b/homeassistant/components/notify/.translations/cs.json new file mode 100644 index 000000000000..fbbdd78888e3 --- /dev/null +++ b/homeassistant/components/notify/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Ozn\u00e1men\u00ed" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/cy.json b/homeassistant/components/notify/.translations/cy.json new file mode 100644 index 000000000000..53121aa8ab62 --- /dev/null +++ b/homeassistant/components/notify/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Hysbysu" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/da.json b/homeassistant/components/notify/.translations/da.json new file mode 100644 index 000000000000..f1edbe1fe58a --- /dev/null +++ b/homeassistant/components/notify/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Notifikationer" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/de.json b/homeassistant/components/notify/.translations/de.json new file mode 100644 index 000000000000..69d1f3539b10 --- /dev/null +++ b/homeassistant/components/notify/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Benachrichtigung" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/el.json b/homeassistant/components/notify/.translations/el.json new file mode 100644 index 000000000000..e95012f3183f --- /dev/null +++ b/homeassistant/components/notify/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/en.json b/homeassistant/components/notify/.translations/en.json new file mode 100644 index 000000000000..debb3433596d --- /dev/null +++ b/homeassistant/components/notify/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Notifications" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/es-419.json b/homeassistant/components/notify/.translations/es-419.json new file mode 100644 index 000000000000..d92f73d4a77d --- /dev/null +++ b/homeassistant/components/notify/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Notificar" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/es.json b/homeassistant/components/notify/.translations/es.json new file mode 100644 index 000000000000..d92f73d4a77d --- /dev/null +++ b/homeassistant/components/notify/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Notificar" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/et.json b/homeassistant/components/notify/.translations/et.json new file mode 100644 index 000000000000..d2c08643c068 --- /dev/null +++ b/homeassistant/components/notify/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Teata" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/eu.json b/homeassistant/components/notify/.translations/eu.json new file mode 100644 index 000000000000..29392867d860 --- /dev/null +++ b/homeassistant/components/notify/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Jakinarazi" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/fi.json b/homeassistant/components/notify/.translations/fi.json new file mode 100644 index 000000000000..7c4a993c7cdb --- /dev/null +++ b/homeassistant/components/notify/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Ilmoita" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/fr.json b/homeassistant/components/notify/.translations/fr.json new file mode 100644 index 000000000000..bfcad73e8e61 --- /dev/null +++ b/homeassistant/components/notify/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Notifier" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/he.json b/homeassistant/components/notify/.translations/he.json new file mode 100644 index 000000000000..5d7a44ad4715 --- /dev/null +++ b/homeassistant/components/notify/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d4\u05ea\u05e8\u05d0\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/hi.json b/homeassistant/components/notify/.translations/hi.json new file mode 100644 index 000000000000..6e872e1492dd --- /dev/null +++ b/homeassistant/components/notify/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u0942\u091a\u093f\u0924" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/hr.json b/homeassistant/components/notify/.translations/hr.json new file mode 100644 index 000000000000..0fbda59731bc --- /dev/null +++ b/homeassistant/components/notify/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Obavijestiti" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/hu.json b/homeassistant/components/notify/.translations/hu.json new file mode 100644 index 000000000000..b5c88047f66c --- /dev/null +++ b/homeassistant/components/notify/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "\u00c9rtes\u00edt" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/hy.json b/homeassistant/components/notify/.translations/hy.json new file mode 100644 index 000000000000..7bb60b0986cd --- /dev/null +++ b/homeassistant/components/notify/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u053e\u0561\u0576\u0578\u0582\u0581\u0578\u0582\u0574" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/id.json b/homeassistant/components/notify/.translations/id.json new file mode 100644 index 000000000000..723b49fe6af4 --- /dev/null +++ b/homeassistant/components/notify/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Pemberitahuan" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/is.json b/homeassistant/components/notify/.translations/is.json new file mode 100644 index 000000000000..bc22e65d2d07 --- /dev/null +++ b/homeassistant/components/notify/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Tilkynna" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/it.json b/homeassistant/components/notify/.translations/it.json new file mode 100644 index 000000000000..389e5751581d --- /dev/null +++ b/homeassistant/components/notify/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Notifica" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ja.json b/homeassistant/components/notify/.translations/ja.json new file mode 100644 index 000000000000..b09c72c410c4 --- /dev/null +++ b/homeassistant/components/notify/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u901a\u77e5" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ko.json b/homeassistant/components/notify/.translations/ko.json new file mode 100644 index 000000000000..8d34274c2380 --- /dev/null +++ b/homeassistant/components/notify/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc54c\ub9bc" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/lb.json b/homeassistant/components/notify/.translations/lb.json new file mode 100644 index 000000000000..622c197876c1 --- /dev/null +++ b/homeassistant/components/notify/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Notifikatioun" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/lv.json b/homeassistant/components/notify/.translations/lv.json new file mode 100644 index 000000000000..397eb6b08804 --- /dev/null +++ b/homeassistant/components/notify/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Pazi\u0146ot" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/nb.json b/homeassistant/components/notify/.translations/nb.json new file mode 100644 index 000000000000..d475109f2fac --- /dev/null +++ b/homeassistant/components/notify/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Varsle" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/nl.json b/homeassistant/components/notify/.translations/nl.json new file mode 100644 index 000000000000..409692f72277 --- /dev/null +++ b/homeassistant/components/notify/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Notificeer" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/nn.json b/homeassistant/components/notify/.translations/nn.json new file mode 100644 index 000000000000..d475109f2fac --- /dev/null +++ b/homeassistant/components/notify/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Varsle" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/pl.json b/homeassistant/components/notify/.translations/pl.json new file mode 100644 index 000000000000..61c214981be8 --- /dev/null +++ b/homeassistant/components/notify/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Powiadomienia" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/pt-BR.json b/homeassistant/components/notify/.translations/pt-BR.json new file mode 100644 index 000000000000..d92f73d4a77d --- /dev/null +++ b/homeassistant/components/notify/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Notificar" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/pt.json b/homeassistant/components/notify/.translations/pt.json new file mode 100644 index 000000000000..d92f73d4a77d --- /dev/null +++ b/homeassistant/components/notify/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Notificar" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ro.json b/homeassistant/components/notify/.translations/ro.json new file mode 100644 index 000000000000..389e5751581d --- /dev/null +++ b/homeassistant/components/notify/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Notifica" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ru.json b/homeassistant/components/notify/.translations/ru.json new file mode 100644 index 000000000000..b3126e52f892 --- /dev/null +++ b/homeassistant/components/notify/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/sk.json b/homeassistant/components/notify/.translations/sk.json new file mode 100644 index 000000000000..cef031d505cb --- /dev/null +++ b/homeassistant/components/notify/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Upozornenie" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/sl.json b/homeassistant/components/notify/.translations/sl.json new file mode 100644 index 000000000000..13770eba67fb --- /dev/null +++ b/homeassistant/components/notify/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Obvesti" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/sv.json b/homeassistant/components/notify/.translations/sv.json new file mode 100644 index 000000000000..737e068fd365 --- /dev/null +++ b/homeassistant/components/notify/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Meddela" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/ta.json b/homeassistant/components/notify/.translations/ta.json new file mode 100644 index 000000000000..dbf23121794d --- /dev/null +++ b/homeassistant/components/notify/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0ba4\u0bc6\u0bb0\u0bbf\u0bb5\u0bbf" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/te.json b/homeassistant/components/notify/.translations/te.json new file mode 100644 index 000000000000..254e99451c71 --- /dev/null +++ b/homeassistant/components/notify/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c24\u0c46\u0c32\u0c3f\u0c2f\u0c1c\u0c47\u0c2f\u0c3f" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/th.json b/homeassistant/components/notify/.translations/th.json new file mode 100644 index 000000000000..7339ffe3ebdd --- /dev/null +++ b/homeassistant/components/notify/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e41\u0e08\u0e49\u0e07" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/tr.json b/homeassistant/components/notify/.translations/tr.json new file mode 100644 index 000000000000..3f10d1f6c195 --- /dev/null +++ b/homeassistant/components/notify/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Bildir" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/uk.json b/homeassistant/components/notify/.translations/uk.json new file mode 100644 index 000000000000..86821a3e50f7 --- /dev/null +++ b/homeassistant/components/notify/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/vi.json b/homeassistant/components/notify/.translations/vi.json new file mode 100644 index 000000000000..a9769af907e5 --- /dev/null +++ b/homeassistant/components/notify/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Th\u00f4ng b\u00e1o" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/zh-Hans.json b/homeassistant/components/notify/.translations/zh-Hans.json new file mode 100644 index 000000000000..b09c72c410c4 --- /dev/null +++ b/homeassistant/components/notify/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u901a\u77e5" +} \ No newline at end of file diff --git a/homeassistant/components/notify/.translations/zh-Hant.json b/homeassistant/components/notify/.translations/zh-Hant.json new file mode 100644 index 000000000000..b09c72c410c4 --- /dev/null +++ b/homeassistant/components/notify/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u901a\u77e5" +} \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/bg.json b/homeassistant/components/notion/.translations/bg.json index 4df9b3ef11cb..dcb76f65acd3 100644 --- a/homeassistant/components/notion/.translations/bg.json +++ b/homeassistant/components/notion/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ca.json b/homeassistant/components/notion/.translations/ca.json index 04b3a1ed0835..7a4831517f03 100644 --- a/homeassistant/components/notion/.translations/ca.json +++ b/homeassistant/components/notion/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Introdueix la teva informaci\u00f3" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/cy.json b/homeassistant/components/notion/.translations/cy.json index 755ce131b2d5..26e37c64b788 100644 --- a/homeassistant/components/notion/.translations/cy.json +++ b/homeassistant/components/notion/.translations/cy.json @@ -9,6 +9,5 @@ "title": "Llenwch eich gwybodaeth" } } - }, - "title": "Syniad" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/da.json b/homeassistant/components/notion/.translations/da.json index ed75e5b1f042..8d0e0d37c4b8 100644 --- a/homeassistant/components/notion/.translations/da.json +++ b/homeassistant/components/notion/.translations/da.json @@ -16,6 +16,5 @@ "title": "Udfyld dine oplysninger" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/de.json b/homeassistant/components/notion/.translations/de.json index 359f3250f603..4d587ba2e559 100644 --- a/homeassistant/components/notion/.translations/de.json +++ b/homeassistant/components/notion/.translations/de.json @@ -16,6 +16,5 @@ "title": "Informationen eingeben" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/en.json b/homeassistant/components/notion/.translations/en.json index 96dddf9ba316..7537482ce5e0 100644 --- a/homeassistant/components/notion/.translations/en.json +++ b/homeassistant/components/notion/.translations/en.json @@ -16,6 +16,5 @@ "title": "Fill in your information" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/es-419.json b/homeassistant/components/notion/.translations/es-419.json index 36fee5bb3665..6e0e7eb538f9 100644 --- a/homeassistant/components/notion/.translations/es-419.json +++ b/homeassistant/components/notion/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Complete su informaci\u00f3n" } } - }, - "title": "Noci\u00f3n" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/es.json b/homeassistant/components/notion/.translations/es.json index 7c5eab0fa5f2..ca40862f475d 100644 --- a/homeassistant/components/notion/.translations/es.json +++ b/homeassistant/components/notion/.translations/es.json @@ -16,6 +16,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "Noci\u00f3n" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/fr.json b/homeassistant/components/notion/.translations/fr.json index 8a841ce0575d..c9bb0d6fa629 100644 --- a/homeassistant/components/notion/.translations/fr.json +++ b/homeassistant/components/notion/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Veuillez saisir vos informations" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/hr.json b/homeassistant/components/notion/.translations/hr.json index 8b502fd37eed..1c9cabbf74a4 100644 --- a/homeassistant/components/notion/.translations/hr.json +++ b/homeassistant/components/notion/.translations/hr.json @@ -13,6 +13,5 @@ "title": "Ispunite svoje podatke" } } - }, - "title": "Pojam" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/it.json b/homeassistant/components/notion/.translations/it.json index dbd1c8fd7dbf..b60cdeb60f04 100644 --- a/homeassistant/components/notion/.translations/it.json +++ b/homeassistant/components/notion/.translations/it.json @@ -16,6 +16,5 @@ "title": "Inserisci le tue informazioni" } } - }, - "title": "Nozione" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ko.json b/homeassistant/components/notion/.translations/ko.json index da4daa0fa579..84d55f51efc4 100644 --- a/homeassistant/components/notion/.translations/ko.json +++ b/homeassistant/components/notion/.translations/ko.json @@ -16,6 +16,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/lb.json b/homeassistant/components/notion/.translations/lb.json index bfa3ad3834ae..c19a53619fed 100644 --- a/homeassistant/components/notion/.translations/lb.json +++ b/homeassistant/components/notion/.translations/lb.json @@ -16,6 +16,5 @@ "title": "F\u00ebllt \u00e4r Informatiounen aus" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/nl.json b/homeassistant/components/notion/.translations/nl.json index 70f155cebf3c..b6a28495692a 100644 --- a/homeassistant/components/notion/.translations/nl.json +++ b/homeassistant/components/notion/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Vul uw gegevens informatie" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/no.json b/homeassistant/components/notion/.translations/no.json index d9f369a6406b..750906af83d9 100644 --- a/homeassistant/components/notion/.translations/no.json +++ b/homeassistant/components/notion/.translations/no.json @@ -16,6 +16,5 @@ "title": "Fyll ut informasjonen din" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/pl.json b/homeassistant/components/notion/.translations/pl.json index 3a946a222999..45e48d8ad334 100644 --- a/homeassistant/components/notion/.translations/pl.json +++ b/homeassistant/components/notion/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Wprowad\u017a dane" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/pt-BR.json b/homeassistant/components/notion/.translations/pt-BR.json index ee74ca275014..ee87b78aa90d 100644 --- a/homeassistant/components/notion/.translations/pt-BR.json +++ b/homeassistant/components/notion/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Preencha suas informa\u00e7\u00f5es" } } - }, - "title": "No\u00e7\u00e3o" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/ru.json b/homeassistant/components/notion/.translations/ru.json index 04941b762709..9ae52b9c7970 100644 --- a/homeassistant/components/notion/.translations/ru.json +++ b/homeassistant/components/notion/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Notion" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/sl.json b/homeassistant/components/notion/.translations/sl.json index 13d8dc69fd5c..7d76bcc9ed9d 100644 --- a/homeassistant/components/notion/.translations/sl.json +++ b/homeassistant/components/notion/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Izpolnite svoje podatke" } } - }, - "title": "Pojem" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/sv.json b/homeassistant/components/notion/.translations/sv.json index 705bea205c60..6f9ab3bac1c4 100644 --- a/homeassistant/components/notion/.translations/sv.json +++ b/homeassistant/components/notion/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Fyll i dina uppgifter" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/zh-Hans.json b/homeassistant/components/notion/.translations/zh-Hans.json index 6d73fbba8dd9..736e9620ce5c 100644 --- a/homeassistant/components/notion/.translations/zh-Hans.json +++ b/homeassistant/components/notion/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } } - }, - "title": "\u6982\u5ff5" + } } \ No newline at end of file diff --git a/homeassistant/components/notion/.translations/zh-Hant.json b/homeassistant/components/notion/.translations/zh-Hant.json index b346e92c2170..ae6e6c8a6195 100644 --- a/homeassistant/components/notion/.translations/zh-Hant.json +++ b/homeassistant/components/notion/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u586b\u5beb\u8cc7\u8a0a" } } - }, - "title": "Notion" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ca.json b/homeassistant/components/nuheat/.translations/ca.json index 75cf013e696b..165d889dbdc2 100644 --- a/homeassistant/components/nuheat/.translations/ca.json +++ b/homeassistant/components/nuheat/.translations/ca.json @@ -20,6 +20,5 @@ "title": "Connexi\u00f3 amb NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/de.json b/homeassistant/components/nuheat/.translations/de.json index 8b56d89b74d6..52c30681efca 100644 --- a/homeassistant/components/nuheat/.translations/de.json +++ b/homeassistant/components/nuheat/.translations/de.json @@ -20,6 +20,5 @@ "title": "Stellen Sie eine Verbindung zu NuHeat her" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/en.json b/homeassistant/components/nuheat/.translations/en.json index c89411168dd6..d7b2697d5e05 100644 --- a/homeassistant/components/nuheat/.translations/en.json +++ b/homeassistant/components/nuheat/.translations/en.json @@ -20,6 +20,5 @@ "title": "Connect to the NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/es.json b/homeassistant/components/nuheat/.translations/es.json index d3ec784e3f9f..6b11fe395002 100644 --- a/homeassistant/components/nuheat/.translations/es.json +++ b/homeassistant/components/nuheat/.translations/es.json @@ -20,6 +20,5 @@ "title": "ConectarNuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/fr.json b/homeassistant/components/nuheat/.translations/fr.json index 6ec527da6c6f..da5c3260f2a4 100644 --- a/homeassistant/components/nuheat/.translations/fr.json +++ b/homeassistant/components/nuheat/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Connectez-vous au NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/it.json b/homeassistant/components/nuheat/.translations/it.json index f7cfce0fd61a..973ff695acbf 100644 --- a/homeassistant/components/nuheat/.translations/it.json +++ b/homeassistant/components/nuheat/.translations/it.json @@ -20,6 +20,5 @@ "title": "Connettersi al NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ko.json b/homeassistant/components/nuheat/.translations/ko.json index 6b02df2045ad..1476e8beb0da 100644 --- a/homeassistant/components/nuheat/.translations/ko.json +++ b/homeassistant/components/nuheat/.translations/ko.json @@ -20,6 +20,5 @@ "title": "NuHeat \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/lb.json b/homeassistant/components/nuheat/.translations/lb.json index 93194bdcab30..0f8f81b44383 100644 --- a/homeassistant/components/nuheat/.translations/lb.json +++ b/homeassistant/components/nuheat/.translations/lb.json @@ -20,6 +20,5 @@ "title": "Mat NuHeat verbannen" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/no.json b/homeassistant/components/nuheat/.translations/no.json index a3f4861ea892..7ea083a36692 100644 --- a/homeassistant/components/nuheat/.translations/no.json +++ b/homeassistant/components/nuheat/.translations/no.json @@ -20,6 +20,5 @@ "title": "Koble til NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/ru.json b/homeassistant/components/nuheat/.translations/ru.json index d2e8c68d85fe..f4d06e8eca64 100644 --- a/homeassistant/components/nuheat/.translations/ru.json +++ b/homeassistant/components/nuheat/.translations/ru.json @@ -20,6 +20,5 @@ "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/sl.json b/homeassistant/components/nuheat/.translations/sl.json new file mode 100644 index 000000000000..e64f7d1d3818 --- /dev/null +++ b/homeassistant/components/nuheat/.translations/sl.json @@ -0,0 +1,24 @@ +{ + "config": { + "abort": { + "already_configured": "Termostat je \u017ee konfiguriran" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "invalid_thermostat": "Serijska \u0161tevilka termostata ni veljavna.", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "password": "Geslo", + "serial_number": "Serijska \u0161tevilka termostata.", + "username": "Uporabni\u0161ko ime" + }, + "description": "\u0160tevil\u010dno serijsko \u0161tevilko ali ID termostata boste morali pridobiti tako, da se prijavite na https://MyNuHeat.com in izberete svoje termostate.", + "title": "Pove\u017eite se z NuHeat-om" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nuheat/.translations/zh-Hant.json b/homeassistant/components/nuheat/.translations/zh-Hant.json index 700a062b8c3d..f912b81f4c4d 100644 --- a/homeassistant/components/nuheat/.translations/zh-Hant.json +++ b/homeassistant/components/nuheat/.translations/zh-Hant.json @@ -20,6 +20,5 @@ "title": "\u9023\u7dda\u81f3 NuHeat" } } - }, - "title": "NuHeat" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ca.json b/homeassistant/components/nut/.translations/ca.json index 0830995a6a83..d00f3d081852 100644 --- a/homeassistant/components/nut/.translations/ca.json +++ b/homeassistant/components/nut/.translations/ca.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "\u00c0lies", "host": "Amfitri\u00f3", - "name": "Nom", "password": "Contrasenya", "port": "Port", - "resources": "Recursos", "username": "Nom d'usuari" }, - "description": "Si m\u00faltiples SAI (UPS) connectats al servidor NUT, introdueix el nom UPS per consultar al camp 'Alies'.", "title": "No s'ha pogut connectar amb el servidor NUT" } } @@ -46,6 +42,5 @@ "description": "Selecciona els recursos del sensor" } } - }, - "title": "Eines de xarxa UPS (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/de.json b/homeassistant/components/nut/.translations/de.json index 68651936a632..5cddc5b08283 100644 --- a/homeassistant/components/nut/.translations/de.json +++ b/homeassistant/components/nut/.translations/de.json @@ -22,12 +22,9 @@ }, "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Name", "password": "Passwort", "port": "Port", - "resources": "Ressourcen", "username": "Benutzername" }, "title": "Stellen Sie eine Verbindung zum NUT-Server her" diff --git a/homeassistant/components/nut/.translations/en.json b/homeassistant/components/nut/.translations/en.json index 7e73d5873fcb..f698ad9287aa 100644 --- a/homeassistant/components/nut/.translations/en.json +++ b/homeassistant/components/nut/.translations/en.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Name", "password": "Password", "port": "Port", - "resources": "Resources", "username": "Username" }, - "description": "If there are multiple UPSs attached to the NUT server, enter the name UPS to query in the 'Alias' field.", "title": "Connect to the NUT server" } } @@ -46,6 +42,5 @@ "description": "Choose Sensor Resources." } } - }, - "title": "Network UPS Tools (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/es.json b/homeassistant/components/nut/.translations/es.json index 536a3a137c6d..81b0f9c8b714 100644 --- a/homeassistant/components/nut/.translations/es.json +++ b/homeassistant/components/nut/.translations/es.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Nombre", "password": "Contrase\u00f1a", "port": "Puerto", - "resources": "Recursos", "username": "Usuario" }, - "description": "Si hay varios UPS conectados al servidor NUT, introduzca el nombre UPS a buscar en el campo 'Alias'.", "title": "Conectar con el servidor NUT" } } @@ -46,6 +42,5 @@ "description": "Elegir Recursos del Sensor" } } - }, - "title": "Herramientas de UPS de red (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/it.json b/homeassistant/components/nut/.translations/it.json index b3841ba87c39..177fd72067e1 100644 --- a/homeassistant/components/nut/.translations/it.json +++ b/homeassistant/components/nut/.translations/it.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Nome", "password": "Password", "port": "Porta", - "resources": "Risorse", "username": "Nome utente" }, - "description": "Se al server NUT sono collegati pi\u00f9 UPS, inserire il nome UPS da interrogare nel campo 'Alias'.", "title": "Connessione al server NUT" } } @@ -46,6 +42,5 @@ "description": "Scegliere le Risorse del Sensore." } } - }, - "title": "Strumenti UPS di rete (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ko.json b/homeassistant/components/nut/.translations/ko.json index 60a6a2695754..74d1e6981b99 100644 --- a/homeassistant/components/nut/.translations/ko.json +++ b/homeassistant/components/nut/.translations/ko.json @@ -10,15 +10,11 @@ "step": { "user": { "data": { - "alias": "\ubcc4\uba85", "host": "\ud638\uc2a4\ud2b8", - "name": "\uc774\ub984", "password": "\ube44\ubc00\ubc88\ud638", "port": "\ud3ec\ud2b8", - "resources": "\ub9ac\uc18c\uc2a4", "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" }, - "description": "NUT \uc11c\ubc84\uc5d0 UPS \uac00 \uc5ec\ub7ec \uac1c \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 '\ubcc4\uba85' \uc785\ub825\ub780\uc5d0 \uc870\ud68c\ud560 UPS \uc774\ub984\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "NUT \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud558\uae30" } } @@ -32,6 +28,5 @@ "description": "\uc13c\uc11c \ub9ac\uc18c\uc2a4 \uc120\ud0dd" } } - }, - "title": "\ub124\ud2b8\uc6cc\ud06c UPS \ub3c4\uad6c (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/lb.json b/homeassistant/components/nut/.translations/lb.json index a84b260dbf3c..f04c585bd239 100644 --- a/homeassistant/components/nut/.translations/lb.json +++ b/homeassistant/components/nut/.translations/lb.json @@ -10,15 +10,11 @@ "step": { "user": { "data": { - "alias": "Alias", "host": "Apparat", - "name": "Numm", "password": "Passwuert", "port": "Port", - "resources": "Ressourcen", "username": "Benotzernumm" }, - "description": "Falls m\u00e9i w\u00e9i een UPS mat deem NUT Server verbonnen ass, g\u00e8eff den UPS Numm am 'Alias' Feld un fir ze sichen.", "title": "Mam NUT Server verbannen" } } @@ -32,6 +28,5 @@ "description": "Sensor Ressourcen auswielen" } } - }, - "title": "Network UPS Tools (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/nl.json b/homeassistant/components/nut/.translations/nl.json index 2f8562da23f2..2eaad319712d 100644 --- a/homeassistant/components/nut/.translations/nl.json +++ b/homeassistant/components/nut/.translations/nl.json @@ -9,12 +9,9 @@ }, "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Naam", "password": "Wachtwoord", "port": "Poort", - "resources": "Bronnen", "username": "Gebruikersnaam" }, "title": "Verbind met NUT-server" @@ -29,6 +26,5 @@ } } } - }, - "title": "Network UPS Tools (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/no.json b/homeassistant/components/nut/.translations/no.json index d018a59ebae6..5464e0342446 100644 --- a/homeassistant/components/nut/.translations/no.json +++ b/homeassistant/components/nut/.translations/no.json @@ -8,17 +8,26 @@ "unknown": "Uventet feil" }, "step": { - "user": { + "resources": { + "data": { + "resources": "Ressurser" + }, + "title": "Velg ressurser som skal overv\u00e5kes" + }, + "ups": { "data": { "alias": "Alias", + "resources": "Ressurser" + }, + "title": "Velg UPS som skal overv\u00e5kes" + }, + "user": { + "data": { "host": "Vert", - "name": "Navn", "password": "Passord", "port": "Port", - "resources": "Ressurser", "username": "Brukernavn" }, - "description": "Hvis det er flere UPS-er knyttet til NUT-serveren, angir du navnet UPS for \u00e5 sp\u00f8rre i 'Alias' -feltet.", "title": "Koble til NUT-serveren" } } @@ -33,6 +42,5 @@ "description": "Velg Sensor Ressurser." } } - }, - "title": "Nettverk UPS-verkt\u00f8y (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/pl.json b/homeassistant/components/nut/.translations/pl.json index 94b0b467c838..47139616e951 100644 --- a/homeassistant/components/nut/.translations/pl.json +++ b/homeassistant/components/nut/.translations/pl.json @@ -10,15 +10,11 @@ "step": { "user": { "data": { - "alias": "Alias", "host": "Host", - "name": "Nazwa", "password": "Has\u0142o", "port": "Port", - "resources": "Zasoby", "username": "Nazwa u\u017cytkownika" }, - "description": "Je\u015bli do serwera NUT pod\u0142\u0105czonych jest wiele zasilaczy UPS, wprowad\u017a w polu Alias nazw\u0119 zasilacza UPS, kt\u00f3rego dotyczy zapytanie.", "title": "Po\u0142\u0105cz z serwerem NUT" } } @@ -32,6 +28,5 @@ "description": "Wybierz zasoby sensor\u00f3w" } } - }, - "title": "Sieciowe narz\u0119dzia UPS (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/ru.json b/homeassistant/components/nut/.translations/ru.json index f31cff7d7473..012ac2ae568f 100644 --- a/homeassistant/components/nut/.translations/ru.json +++ b/homeassistant/components/nut/.translations/ru.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c", "host": "\u0425\u043e\u0441\u0442", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", "password": "\u041f\u0430\u0440\u043e\u043b\u044c", "port": "\u041f\u043e\u0440\u0442", - "resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b", "username": "\u041b\u043e\u0433\u0438\u043d" }, - "description": "\u0415\u0441\u043b\u0438 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0418\u0411\u041f, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0418\u0411\u041f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043f\u043e\u043b\u0435 '\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c'.", "title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NUT" } } @@ -46,6 +42,5 @@ "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432." } } - }, - "title": "Network UPS Tools (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/sl.json b/homeassistant/components/nut/.translations/sl.json new file mode 100644 index 000000000000..1f0b269562d2 --- /dev/null +++ b/homeassistant/components/nut/.translations/sl.json @@ -0,0 +1,46 @@ +{ + "config": { + "abort": { + "already_configured": "Naprava je \u017ee nastavljena" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "resources": { + "data": { + "resources": "Viri" + }, + "title": "Izberite vire za spremljanje" + }, + "ups": { + "data": { + "alias": "Vzdevek", + "resources": "Viri" + }, + "title": "Izberite UPS za spremljanje" + }, + "user": { + "data": { + "host": "Gostitelj", + "password": "Geslo", + "port": "Vrata", + "username": "Uporabni\u0161ko ime" + }, + "title": "Pove\u017eite se s stre\u017enikom NUT" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "resources": "Viri", + "scan_interval": "Interval skeniranja (sekunde)" + }, + "description": "Izberite vire senzorja." + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nut/.translations/zh-Hant.json b/homeassistant/components/nut/.translations/zh-Hant.json index 5b72d9a2019a..35cd266854f0 100644 --- a/homeassistant/components/nut/.translations/zh-Hant.json +++ b/homeassistant/components/nut/.translations/zh-Hant.json @@ -23,15 +23,11 @@ }, "user": { "data": { - "alias": "\u5225\u540d", "host": "\u4e3b\u6a5f\u7aef", - "name": "\u540d\u7a31", "password": "\u5bc6\u78bc", "port": "\u901a\u8a0a\u57e0", - "resources": "\u8cc7\u6e90", "username": "\u4f7f\u7528\u8005\u540d\u7a31" }, - "description": "\u5047\u5982 NUT \u4f3a\u670d\u5668\u4e0b\u64c1\u6709\u591a\u7d44 UPS\uff0c\u65bc\u300c\u5225\u540d\u300d\u6b04\u4f4d\u8f38\u5165 UPS \u540d\u7a31\u3002", "title": "\u9023\u7dda\u81f3 NUT \u4f3a\u670d\u5668" } } @@ -46,6 +42,5 @@ "description": "\u9078\u64c7\u50b3\u611f\u5668\u8cc7\u6e90\u3002" } } - }, - "title": "Network UPS Tools (NUT)" + } } \ No newline at end of file diff --git a/homeassistant/components/nws/.translations/en.json b/homeassistant/components/nws/.translations/en.json index dd91b04bedce..929281f736d7 100644 --- a/homeassistant/components/nws/.translations/en.json +++ b/homeassistant/components/nws/.translations/en.json @@ -19,6 +19,5 @@ "title": "Connect to the National Weather Service" } } - }, - "title": "National Weather Service (NWS)" + } } \ No newline at end of file diff --git a/homeassistant/components/nws/.translations/it.json b/homeassistant/components/nws/.translations/it.json new file mode 100644 index 000000000000..f4b110f857f3 --- /dev/null +++ b/homeassistant/components/nws/.translations/it.json @@ -0,0 +1,23 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi, si prega di riprovare", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "api_key": "Chiave API (email)", + "latitude": "Latitudine", + "longitude": "Logitudine", + "station": "Codice stazione METAR" + }, + "description": "Se non viene specificato un codice di stazione METAR, la latitudine e la longitudine verranno utilizzate per trovare la stazione pi\u00f9 vicina.", + "title": "Collegati al Servizio Meteorologico Nazionale" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nws/.translations/pt.json b/homeassistant/components/nws/.translations/pt.json new file mode 100644 index 000000000000..2447be7ee673 --- /dev/null +++ b/homeassistant/components/nws/.translations/pt.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "O dispositivo j\u00e1 est\u00e1 configurado" + }, + "error": { + "cannot_connect": "Falha ao conectar, tente novamente", + "unknown": "Erro inesperado" + }, + "step": { + "user": { + "data": { + "api_key": "Chave da API (email)", + "latitude": "Latitude", + "longitude": "Longitude" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nws/.translations/ru.json b/homeassistant/components/nws/.translations/ru.json new file mode 100644 index 000000000000..a5808a43f123 --- /dev/null +++ b/homeassistant/components/nws/.translations/ru.json @@ -0,0 +1,23 @@ +{ + "config": { + "abort": { + "already_configured": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\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, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "api_key": "\u041a\u043b\u044e\u0447 API (\u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b)", + "latitude": "\u0428\u0438\u0440\u043e\u0442\u0430", + "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430", + "station": "\u041a\u043e\u0434 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 METAR" + }, + "description": "\u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 METAR \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430.", + "title": "National Weather Service" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nws/.translations/zh-Hant.json b/homeassistant/components/nws/.translations/zh-Hant.json new file mode 100644 index 000000000000..1b614a752d98 --- /dev/null +++ b/homeassistant/components/nws/.translations/zh-Hant.json @@ -0,0 +1,23 @@ +{ + "config": { + "abort": { + "already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "api_key": "API \u5bc6\u9470\uff08\u90f5\u4ef6\uff09", + "latitude": "\u7def\u5ea6", + "longitude": "\u7d93\u5ea6", + "station": "METAR \u6a5f\u5834\u4ee3\u78bc" + }, + "description": "\u5047\u5982\u672a\u6307\u5b9a METAR \u6a5f\u5834\u4ee3\u78bc\uff0c\u5c07\u6703\u4f7f\u7528\u7d93\u7def\u5ea6\u8cc7\u8a0a\u5c0b\u627e\u6700\u8fd1\u7684\u6a5f\u5834\u3002", + "title": "\u9023\u7dda\u81f3\u7f8e\u570b\u570b\u5bb6\u6c23\u8c61\u5c40\u670d\u52d9" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/bg.json b/homeassistant/components/opentherm_gw/.translations/bg.json index d524e1a770c3..5d23794c07b7 100644 --- a/homeassistant/components/opentherm_gw/.translations/bg.json +++ b/homeassistant/components/opentherm_gw/.translations/bg.json @@ -27,6 +27,5 @@ "description": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ca.json b/homeassistant/components/opentherm_gw/.translations/ca.json index def09ea4b69f..41a155b147f8 100644 --- a/homeassistant/components/opentherm_gw/.translations/ca.json +++ b/homeassistant/components/opentherm_gw/.translations/ca.json @@ -27,6 +27,5 @@ "description": "Opcions del la passarel\u00b7la d'enlla\u00e7 d\u2019OpenTherm" } } - }, - "title": "Passarel\u00b7la d'OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/da.json b/homeassistant/components/opentherm_gw/.translations/da.json index 525b5b00fa8d..25006b481b19 100644 --- a/homeassistant/components/opentherm_gw/.translations/da.json +++ b/homeassistant/components/opentherm_gw/.translations/da.json @@ -27,6 +27,5 @@ "description": "Indstillinger for OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/de.json b/homeassistant/components/opentherm_gw/.translations/de.json index 3b835faa2b55..1533e5865144 100644 --- a/homeassistant/components/opentherm_gw/.translations/de.json +++ b/homeassistant/components/opentherm_gw/.translations/de.json @@ -27,6 +27,5 @@ "description": "Optionen f\u00fcr das OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/en.json b/homeassistant/components/opentherm_gw/.translations/en.json index baec16255eed..17d259ad1d1e 100644 --- a/homeassistant/components/opentherm_gw/.translations/en.json +++ b/homeassistant/components/opentherm_gw/.translations/en.json @@ -27,6 +27,5 @@ "description": "Options for the OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/es.json b/homeassistant/components/opentherm_gw/.translations/es.json index 959621e364c7..73918a9e8a9a 100644 --- a/homeassistant/components/opentherm_gw/.translations/es.json +++ b/homeassistant/components/opentherm_gw/.translations/es.json @@ -27,6 +27,5 @@ "description": "Opciones para OpenTherm Gateway" } } - }, - "title": "Gateway OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/fr.json b/homeassistant/components/opentherm_gw/.translations/fr.json index c208eb3295c0..11cce45dcd7a 100644 --- a/homeassistant/components/opentherm_gw/.translations/fr.json +++ b/homeassistant/components/opentherm_gw/.translations/fr.json @@ -27,6 +27,5 @@ "description": "Options pour la passerelle OpenTherm" } } - }, - "title": "Passerelle OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/hu.json b/homeassistant/components/opentherm_gw/.translations/hu.json index 8b1beebdc7d5..6ccdae6437cf 100644 --- a/homeassistant/components/opentherm_gw/.translations/hu.json +++ b/homeassistant/components/opentherm_gw/.translations/hu.json @@ -26,6 +26,5 @@ } } } - }, - "title": "OpenTherm \u00e1tj\u00e1r\u00f3" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/it.json b/homeassistant/components/opentherm_gw/.translations/it.json index 6128361f85f9..f26e79985670 100644 --- a/homeassistant/components/opentherm_gw/.translations/it.json +++ b/homeassistant/components/opentherm_gw/.translations/it.json @@ -27,6 +27,5 @@ "description": "Opzioni per OpenTherm Gateway" } } - }, - "title": "Gateway OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ko.json b/homeassistant/components/opentherm_gw/.translations/ko.json index 266315f66061..27b3fd1cbd85 100644 --- a/homeassistant/components/opentherm_gw/.translations/ko.json +++ b/homeassistant/components/opentherm_gw/.translations/ko.json @@ -27,6 +27,5 @@ "description": "OpenTherm Gateway \uc635\uc158" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/lb.json b/homeassistant/components/opentherm_gw/.translations/lb.json index 703a675f287e..1ce0a275f1c0 100644 --- a/homeassistant/components/opentherm_gw/.translations/lb.json +++ b/homeassistant/components/opentherm_gw/.translations/lb.json @@ -27,6 +27,5 @@ "description": "Optioune fir OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/nl.json b/homeassistant/components/opentherm_gw/.translations/nl.json index b0b21e3c2d2d..4b5fea8f3128 100644 --- a/homeassistant/components/opentherm_gw/.translations/nl.json +++ b/homeassistant/components/opentherm_gw/.translations/nl.json @@ -27,6 +27,5 @@ "description": "Opties voor de OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/no.json b/homeassistant/components/opentherm_gw/.translations/no.json index 3d73199cbffe..07cc2f56ed69 100644 --- a/homeassistant/components/opentherm_gw/.translations/no.json +++ b/homeassistant/components/opentherm_gw/.translations/no.json @@ -27,6 +27,5 @@ "description": "Alternativer for OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/pl.json b/homeassistant/components/opentherm_gw/.translations/pl.json index aaaee5d1ad79..8eea281729a0 100644 --- a/homeassistant/components/opentherm_gw/.translations/pl.json +++ b/homeassistant/components/opentherm_gw/.translations/pl.json @@ -27,6 +27,5 @@ "description": "Opcje dla bramki OpenTherm" } } - }, - "title": "Bramka OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/ru.json b/homeassistant/components/opentherm_gw/.translations/ru.json index c2190ceba578..b81fe14497a5 100644 --- a/homeassistant/components/opentherm_gw/.translations/ru.json +++ b/homeassistant/components/opentherm_gw/.translations/ru.json @@ -27,6 +27,5 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0448\u043b\u044e\u0437\u0430 Opentherm" } } - }, - "title": "OpenTherm" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/sl.json b/homeassistant/components/opentherm_gw/.translations/sl.json index c554b062417c..5ab4b0145b0e 100644 --- a/homeassistant/components/opentherm_gw/.translations/sl.json +++ b/homeassistant/components/opentherm_gw/.translations/sl.json @@ -27,6 +27,5 @@ "description": "Mo\u017enosti za prehod OpenTherm" } } - }, - "title": "OpenTherm Prehod" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/sv.json b/homeassistant/components/opentherm_gw/.translations/sv.json index 2360e81a4ac7..3b8cbf12ea02 100644 --- a/homeassistant/components/opentherm_gw/.translations/sv.json +++ b/homeassistant/components/opentherm_gw/.translations/sv.json @@ -27,6 +27,5 @@ "description": "Alternativ f\u00f6r OpenTherm Gateway" } } - }, - "title": "OpenTherm Gateway" + } } \ No newline at end of file diff --git a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json index 55bd70077ce1..c938db307dbd 100644 --- a/homeassistant/components/opentherm_gw/.translations/zh-Hant.json +++ b/homeassistant/components/opentherm_gw/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "description": "OpenTherm \u9598\u9053\u5668\u9078\u9805" } } - }, - "title": "OpenTherm \u9598\u9053\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/bg.json b/homeassistant/components/openuv/.translations/bg.json index 0ae08cf66b4e..9677642266f3 100644 --- a/homeassistant/components/openuv/.translations/bg.json +++ b/homeassistant/components/openuv/.translations/bg.json @@ -15,6 +15,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ca.json b/homeassistant/components/openuv/.translations/ca.json index 929ded46fbbf..e09ec648ee36 100644 --- a/homeassistant/components/openuv/.translations/ca.json +++ b/homeassistant/components/openuv/.translations/ca.json @@ -15,6 +15,5 @@ "title": "Introdueix la teva informaci\u00f3" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/cs.json b/homeassistant/components/openuv/.translations/cs.json index b6e3120f3656..4a4776dc82c4 100644 --- a/homeassistant/components/openuv/.translations/cs.json +++ b/homeassistant/components/openuv/.translations/cs.json @@ -15,6 +15,5 @@ "title": "Vypl\u0148te va\u0161e \u00fadaje" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/da.json b/homeassistant/components/openuv/.translations/da.json index 1c1f80cc6e74..6ff9546167e2 100644 --- a/homeassistant/components/openuv/.translations/da.json +++ b/homeassistant/components/openuv/.translations/da.json @@ -15,6 +15,5 @@ "title": "Udfyld dine oplysninger" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/de.json b/homeassistant/components/openuv/.translations/de.json index 134771d6c960..d26ca0726b7e 100644 --- a/homeassistant/components/openuv/.translations/de.json +++ b/homeassistant/components/openuv/.translations/de.json @@ -15,6 +15,5 @@ "title": "Gib deine Informationen ein" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/en.json b/homeassistant/components/openuv/.translations/en.json index 5cd75240de95..c493a15b05a0 100644 --- a/homeassistant/components/openuv/.translations/en.json +++ b/homeassistant/components/openuv/.translations/en.json @@ -15,6 +15,5 @@ "title": "Fill in your information" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/es-419.json b/homeassistant/components/openuv/.translations/es-419.json index 2d28462243e5..158bb08b25d2 100644 --- a/homeassistant/components/openuv/.translations/es-419.json +++ b/homeassistant/components/openuv/.translations/es-419.json @@ -15,6 +15,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/es.json b/homeassistant/components/openuv/.translations/es.json index 0dedcaa8b037..3c87781d2c5f 100644 --- a/homeassistant/components/openuv/.translations/es.json +++ b/homeassistant/components/openuv/.translations/es.json @@ -15,6 +15,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/fr.json b/homeassistant/components/openuv/.translations/fr.json index 6b6b32675601..a22b01f9488c 100644 --- a/homeassistant/components/openuv/.translations/fr.json +++ b/homeassistant/components/openuv/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Veuillez saisir vos informations" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/he.json b/homeassistant/components/openuv/.translations/he.json index 7a9716f76cbb..6c253be78559 100644 --- a/homeassistant/components/openuv/.translations/he.json +++ b/homeassistant/components/openuv/.translations/he.json @@ -15,6 +15,5 @@ "title": "\u05de\u05dc\u05d0 \u05d0\u05ea \u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05dc\u05da" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/hu.json b/homeassistant/components/openuv/.translations/hu.json index a6188bb18c30..6d7e4e99e265 100644 --- a/homeassistant/components/openuv/.translations/hu.json +++ b/homeassistant/components/openuv/.translations/hu.json @@ -15,6 +15,5 @@ "title": "T\u00f6ltsd ki az adataid" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/id.json b/homeassistant/components/openuv/.translations/id.json index 53b6fcd6b3ea..bb396d8329a2 100644 --- a/homeassistant/components/openuv/.translations/id.json +++ b/homeassistant/components/openuv/.translations/id.json @@ -15,6 +15,5 @@ "title": "Isi informasi Anda" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/it.json b/homeassistant/components/openuv/.translations/it.json index b7550430aa09..89d80216fd59 100644 --- a/homeassistant/components/openuv/.translations/it.json +++ b/homeassistant/components/openuv/.translations/it.json @@ -15,6 +15,5 @@ "title": "Inserisci i tuoi dati" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ko.json b/homeassistant/components/openuv/.translations/ko.json index 6abc49e8aa3a..77f87a19e0cc 100644 --- a/homeassistant/components/openuv/.translations/ko.json +++ b/homeassistant/components/openuv/.translations/ko.json @@ -15,6 +15,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/lb.json b/homeassistant/components/openuv/.translations/lb.json index 4d941d736195..ebb09f2ded66 100644 --- a/homeassistant/components/openuv/.translations/lb.json +++ b/homeassistant/components/openuv/.translations/lb.json @@ -15,6 +15,5 @@ "title": "F\u00ebllt \u00e4r Informatiounen aus" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/nl.json b/homeassistant/components/openuv/.translations/nl.json index 4d408ef525c9..c4f7834ff89e 100644 --- a/homeassistant/components/openuv/.translations/nl.json +++ b/homeassistant/components/openuv/.translations/nl.json @@ -15,6 +15,5 @@ "title": "Vul uw gegevens in" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/nn.json b/homeassistant/components/openuv/.translations/nn.json index dd7fef44ef7b..284285af65c9 100644 --- a/homeassistant/components/openuv/.translations/nn.json +++ b/homeassistant/components/openuv/.translations/nn.json @@ -15,6 +15,5 @@ "title": "Fyll ut informasjonen din" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/no.json b/homeassistant/components/openuv/.translations/no.json index 790819bbe3c6..4152b732a7b8 100644 --- a/homeassistant/components/openuv/.translations/no.json +++ b/homeassistant/components/openuv/.translations/no.json @@ -15,6 +15,5 @@ "title": "Fyll ut informasjonen din" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pl.json b/homeassistant/components/openuv/.translations/pl.json index 859b9e72f9eb..7e8691ebf26d 100644 --- a/homeassistant/components/openuv/.translations/pl.json +++ b/homeassistant/components/openuv/.translations/pl.json @@ -15,6 +15,5 @@ "title": "Wprowad\u017a dane" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pt-BR.json b/homeassistant/components/openuv/.translations/pt-BR.json index 5181c87f3b04..b3e40ae29bd3 100644 --- a/homeassistant/components/openuv/.translations/pt-BR.json +++ b/homeassistant/components/openuv/.translations/pt-BR.json @@ -15,6 +15,5 @@ "title": "Preencha suas informa\u00e7\u00f5es" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/pt.json b/homeassistant/components/openuv/.translations/pt.json index 2a2e2ec65124..92ecaad74c18 100644 --- a/homeassistant/components/openuv/.translations/pt.json +++ b/homeassistant/components/openuv/.translations/pt.json @@ -15,6 +15,5 @@ "title": "Preencha com as suas informa\u00e7\u00f5es" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ro.json b/homeassistant/components/openuv/.translations/ro.json index d52cd1906a6f..9e6e01c427a4 100644 --- a/homeassistant/components/openuv/.translations/ro.json +++ b/homeassistant/components/openuv/.translations/ro.json @@ -15,6 +15,5 @@ "title": "Completa\u021bi informa\u021biile dvs." } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/ru.json b/homeassistant/components/openuv/.translations/ru.json index 846425ec4210..5b4ce86e9636 100644 --- a/homeassistant/components/openuv/.translations/ru.json +++ b/homeassistant/components/openuv/.translations/ru.json @@ -15,6 +15,5 @@ "title": "OpenUV" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/sl.json b/homeassistant/components/openuv/.translations/sl.json index fe95bee06163..f95723b6d43c 100644 --- a/homeassistant/components/openuv/.translations/sl.json +++ b/homeassistant/components/openuv/.translations/sl.json @@ -15,6 +15,5 @@ "title": "Izpolnite svoje podatke" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/sv.json b/homeassistant/components/openuv/.translations/sv.json index 399ecfc0459c..7c7f26b43282 100644 --- a/homeassistant/components/openuv/.translations/sv.json +++ b/homeassistant/components/openuv/.translations/sv.json @@ -15,6 +15,5 @@ "title": "Fyll i dina uppgifter" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/zh-Hans.json b/homeassistant/components/openuv/.translations/zh-Hans.json index 3e6a5820ed86..d960e2d93b4a 100644 --- a/homeassistant/components/openuv/.translations/zh-Hans.json +++ b/homeassistant/components/openuv/.translations/zh-Hans.json @@ -15,6 +15,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/openuv/.translations/zh-Hant.json b/homeassistant/components/openuv/.translations/zh-Hant.json index 552ec1b7da1a..faba0c7f6e54 100644 --- a/homeassistant/components/openuv/.translations/zh-Hant.json +++ b/homeassistant/components/openuv/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "\u586b\u5beb\u8cc7\u8a0a" } } - }, - "title": "OpenUV" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/bg.json b/homeassistant/components/owntracks/.translations/bg.json index d3abe40bf939..5e86cd92b4b1 100644 --- a/homeassistant/components/owntracks/.translations/bg.json +++ b/homeassistant/components/owntracks/.translations/bg.json @@ -12,6 +12,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ca.json b/homeassistant/components/owntracks/.translations/ca.json index 4a828e919e55..4082c2a24abc 100644 --- a/homeassistant/components/owntracks/.translations/ca.json +++ b/homeassistant/components/owntracks/.translations/ca.json @@ -12,6 +12,5 @@ "title": "Configuraci\u00f3 d'OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/cs.json b/homeassistant/components/owntracks/.translations/cs.json index 274cd02bf750..451ab397ea57 100644 --- a/homeassistant/components/owntracks/.translations/cs.json +++ b/homeassistant/components/owntracks/.translations/cs.json @@ -12,6 +12,5 @@ "title": "Nastavit OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/da.json b/homeassistant/components/owntracks/.translations/da.json index a52c2e030023..83e99a166cd7 100644 --- a/homeassistant/components/owntracks/.translations/da.json +++ b/homeassistant/components/owntracks/.translations/da.json @@ -12,6 +12,5 @@ "title": "Konfigurer OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/de.json b/homeassistant/components/owntracks/.translations/de.json index d83a34ba9d05..bdfd4e559376 100644 --- a/homeassistant/components/owntracks/.translations/de.json +++ b/homeassistant/components/owntracks/.translations/de.json @@ -12,6 +12,5 @@ "title": "OwnTracks einrichten" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/en.json b/homeassistant/components/owntracks/.translations/en.json index 77a9bbf2c01e..25dd4fab31fb 100644 --- a/homeassistant/components/owntracks/.translations/en.json +++ b/homeassistant/components/owntracks/.translations/en.json @@ -12,6 +12,5 @@ "title": "Set up OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/es-419.json b/homeassistant/components/owntracks/.translations/es-419.json index c7036e93162e..35ad23896930 100644 --- a/homeassistant/components/owntracks/.translations/es-419.json +++ b/homeassistant/components/owntracks/.translations/es-419.json @@ -12,6 +12,5 @@ "title": "Configurar OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/es.json b/homeassistant/components/owntracks/.translations/es.json index 8da0aad2733b..bb79fca2c940 100644 --- a/homeassistant/components/owntracks/.translations/es.json +++ b/homeassistant/components/owntracks/.translations/es.json @@ -12,6 +12,5 @@ "title": "Configurar OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/fr.json b/homeassistant/components/owntracks/.translations/fr.json index ffe8501b584c..69f36504051c 100644 --- a/homeassistant/components/owntracks/.translations/fr.json +++ b/homeassistant/components/owntracks/.translations/fr.json @@ -12,6 +12,5 @@ "title": "Configurer OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/hu.json b/homeassistant/components/owntracks/.translations/hu.json index 2bf02b8cdf49..ab6cc91324af 100644 --- a/homeassistant/components/owntracks/.translations/hu.json +++ b/homeassistant/components/owntracks/.translations/hu.json @@ -12,6 +12,5 @@ "title": "Owntracks be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/it.json b/homeassistant/components/owntracks/.translations/it.json index 0e86684c610e..1c2af9e8d734 100644 --- a/homeassistant/components/owntracks/.translations/it.json +++ b/homeassistant/components/owntracks/.translations/it.json @@ -12,6 +12,5 @@ "title": "Configura OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ko.json b/homeassistant/components/owntracks/.translations/ko.json index 4161597a7e71..72001c7de854 100644 --- a/homeassistant/components/owntracks/.translations/ko.json +++ b/homeassistant/components/owntracks/.translations/ko.json @@ -12,6 +12,5 @@ "title": "OwnTracks \uc124\uc815" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/lb.json b/homeassistant/components/owntracks/.translations/lb.json index f62821fbf085..4504ca6a74a7 100644 --- a/homeassistant/components/owntracks/.translations/lb.json +++ b/homeassistant/components/owntracks/.translations/lb.json @@ -12,6 +12,5 @@ "title": "OwnTracks ariichten" } } - }, - "title": "Owntracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/nl.json b/homeassistant/components/owntracks/.translations/nl.json index c3400352263f..00d2840e2f2d 100644 --- a/homeassistant/components/owntracks/.translations/nl.json +++ b/homeassistant/components/owntracks/.translations/nl.json @@ -12,6 +12,5 @@ "title": "Stel OwnTracks in" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/no.json b/homeassistant/components/owntracks/.translations/no.json index 08154069b3f4..d03ee6889cd7 100644 --- a/homeassistant/components/owntracks/.translations/no.json +++ b/homeassistant/components/owntracks/.translations/no.json @@ -12,6 +12,5 @@ "title": "Sett opp OwnTracks" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pl.json b/homeassistant/components/owntracks/.translations/pl.json index 882cd328f864..f27d6a35c4d8 100644 --- a/homeassistant/components/owntracks/.translations/pl.json +++ b/homeassistant/components/owntracks/.translations/pl.json @@ -12,6 +12,5 @@ "title": "Konfiguracja OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pt-BR.json b/homeassistant/components/owntracks/.translations/pt-BR.json index 3a6be91a9943..e8d19233bbd6 100644 --- a/homeassistant/components/owntracks/.translations/pt-BR.json +++ b/homeassistant/components/owntracks/.translations/pt-BR.json @@ -12,6 +12,5 @@ "title": "Configurar OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/pt.json b/homeassistant/components/owntracks/.translations/pt.json index 317c4932e1c2..8aa3b52e9cc7 100644 --- a/homeassistant/components/owntracks/.translations/pt.json +++ b/homeassistant/components/owntracks/.translations/pt.json @@ -12,6 +12,5 @@ "title": "Configurar OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/ru.json b/homeassistant/components/owntracks/.translations/ru.json index 8e4944772c4f..816f2c860874 100644 --- a/homeassistant/components/owntracks/.translations/ru.json +++ b/homeassistant/components/owntracks/.translations/ru.json @@ -12,6 +12,5 @@ "title": "OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/sl.json b/homeassistant/components/owntracks/.translations/sl.json index 0f35269d006c..f3909591bef8 100644 --- a/homeassistant/components/owntracks/.translations/sl.json +++ b/homeassistant/components/owntracks/.translations/sl.json @@ -12,6 +12,5 @@ "title": "Nastavite OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/sv.json b/homeassistant/components/owntracks/.translations/sv.json index 7f765d5a931a..de605d6b52f7 100644 --- a/homeassistant/components/owntracks/.translations/sv.json +++ b/homeassistant/components/owntracks/.translations/sv.json @@ -12,6 +12,5 @@ "title": "Konfigurera OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/zh-Hans.json b/homeassistant/components/owntracks/.translations/zh-Hans.json index a5066e0ca3fe..fe1dc22d92fa 100644 --- a/homeassistant/components/owntracks/.translations/zh-Hans.json +++ b/homeassistant/components/owntracks/.translations/zh-Hans.json @@ -12,6 +12,5 @@ "title": "\u8bbe\u7f6e OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/owntracks/.translations/zh-Hant.json b/homeassistant/components/owntracks/.translations/zh-Hant.json index 98ff43014f74..d86a5376d077 100644 --- a/homeassistant/components/owntracks/.translations/zh-Hant.json +++ b/homeassistant/components/owntracks/.translations/zh-Hant.json @@ -12,6 +12,5 @@ "title": "\u8a2d\u5b9a OwnTracks" } } - }, - "title": "OwnTracks" + } } \ No newline at end of file diff --git a/homeassistant/components/person/.translations/af.json b/homeassistant/components/person/.translations/af.json new file mode 100644 index 000000000000..17a9898a6a65 --- /dev/null +++ b/homeassistant/components/person/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Persoon" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/ar.json b/homeassistant/components/person/.translations/ar.json new file mode 100644 index 000000000000..3e24c371eb72 --- /dev/null +++ b/homeassistant/components/person/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0634\u062e\u0635" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/bg.json b/homeassistant/components/person/.translations/bg.json new file mode 100644 index 000000000000..64231ae84914 --- /dev/null +++ b/homeassistant/components/person/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0427\u043e\u0432\u0435\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/ca.json b/homeassistant/components/person/.translations/ca.json new file mode 100644 index 000000000000..50c6d2977235 --- /dev/null +++ b/homeassistant/components/person/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Persona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/cs.json b/homeassistant/components/person/.translations/cs.json new file mode 100644 index 000000000000..3cab1ead0637 --- /dev/null +++ b/homeassistant/components/person/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Osoba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/cy.json b/homeassistant/components/person/.translations/cy.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/da.json b/homeassistant/components/person/.translations/da.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/de.json b/homeassistant/components/person/.translations/de.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/el.json b/homeassistant/components/person/.translations/el.json new file mode 100644 index 000000000000..0a7edb3fc4a3 --- /dev/null +++ b/homeassistant/components/person/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0386\u03c4\u03bf\u03bc\u03bf" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/en.json b/homeassistant/components/person/.translations/en.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/es-419.json b/homeassistant/components/person/.translations/es-419.json new file mode 100644 index 000000000000..50c6d2977235 --- /dev/null +++ b/homeassistant/components/person/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Persona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/es.json b/homeassistant/components/person/.translations/es.json new file mode 100644 index 000000000000..50c6d2977235 --- /dev/null +++ b/homeassistant/components/person/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Persona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/et.json b/homeassistant/components/person/.translations/et.json new file mode 100644 index 000000000000..1e1b86c7275d --- /dev/null +++ b/homeassistant/components/person/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Isik" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/eu.json b/homeassistant/components/person/.translations/eu.json new file mode 100644 index 000000000000..5c6dc94faa5c --- /dev/null +++ b/homeassistant/components/person/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Pertsona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/fa.json b/homeassistant/components/person/.translations/fa.json new file mode 100644 index 000000000000..017a0a475fae --- /dev/null +++ b/homeassistant/components/person/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0641\u0631\u062f" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/fi.json b/homeassistant/components/person/.translations/fi.json new file mode 100644 index 000000000000..eb19d67df392 --- /dev/null +++ b/homeassistant/components/person/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Henkil\u00f6" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/fr.json b/homeassistant/components/person/.translations/fr.json new file mode 100644 index 000000000000..b274386c76d5 --- /dev/null +++ b/homeassistant/components/person/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Personne" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/he.json b/homeassistant/components/person/.translations/he.json new file mode 100644 index 000000000000..124f9bc98ce8 --- /dev/null +++ b/homeassistant/components/person/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d0\u05d3\u05dd" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/hr.json b/homeassistant/components/person/.translations/hr.json new file mode 100644 index 000000000000..3cab1ead0637 --- /dev/null +++ b/homeassistant/components/person/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Osoba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/hu.json b/homeassistant/components/person/.translations/hu.json new file mode 100644 index 000000000000..360c50904c36 --- /dev/null +++ b/homeassistant/components/person/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Szem\u00e9ly" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/hy.json b/homeassistant/components/person/.translations/hy.json new file mode 100644 index 000000000000..53fdb6259ed6 --- /dev/null +++ b/homeassistant/components/person/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0531\u0576\u0571\u0568" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/id.json b/homeassistant/components/person/.translations/id.json new file mode 100644 index 000000000000..ae23fa734b75 --- /dev/null +++ b/homeassistant/components/person/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Orang" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/is.json b/homeassistant/components/person/.translations/is.json new file mode 100644 index 000000000000..63a76067d83a --- /dev/null +++ b/homeassistant/components/person/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Pers\u00f3na" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/it.json b/homeassistant/components/person/.translations/it.json new file mode 100644 index 000000000000..50c6d2977235 --- /dev/null +++ b/homeassistant/components/person/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Persona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/ko.json b/homeassistant/components/person/.translations/ko.json new file mode 100644 index 000000000000..c610af6a48d6 --- /dev/null +++ b/homeassistant/components/person/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uad6c\uc131\uc6d0" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/lb.json b/homeassistant/components/person/.translations/lb.json new file mode 100644 index 000000000000..1aef1ab0e9c0 --- /dev/null +++ b/homeassistant/components/person/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Persoun" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/lt.json b/homeassistant/components/person/.translations/lt.json new file mode 100644 index 000000000000..035a864fd755 --- /dev/null +++ b/homeassistant/components/person/.translations/lt.json @@ -0,0 +1,3 @@ +{ + "title": "Asmuo" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/lv.json b/homeassistant/components/person/.translations/lv.json new file mode 100644 index 000000000000..50c6d2977235 --- /dev/null +++ b/homeassistant/components/person/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Persona" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/nb.json b/homeassistant/components/person/.translations/nb.json new file mode 100644 index 000000000000..d8a4c4530151 --- /dev/null +++ b/homeassistant/components/person/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/nl.json b/homeassistant/components/person/.translations/nl.json new file mode 100644 index 000000000000..17a9898a6a65 --- /dev/null +++ b/homeassistant/components/person/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Persoon" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/nn.json b/homeassistant/components/person/.translations/nn.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/pl.json b/homeassistant/components/person/.translations/pl.json new file mode 100644 index 000000000000..3cab1ead0637 --- /dev/null +++ b/homeassistant/components/person/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Osoba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/pt-BR.json b/homeassistant/components/person/.translations/pt-BR.json new file mode 100644 index 000000000000..3e5f0c035be3 --- /dev/null +++ b/homeassistant/components/person/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Pessoa" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/pt.json b/homeassistant/components/person/.translations/pt.json new file mode 100644 index 000000000000..3e5f0c035be3 --- /dev/null +++ b/homeassistant/components/person/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Pessoa" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/ro.json b/homeassistant/components/person/.translations/ro.json new file mode 100644 index 000000000000..f35a370b2c53 --- /dev/null +++ b/homeassistant/components/person/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Persoan\u0103" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/ru.json b/homeassistant/components/person/.translations/ru.json new file mode 100644 index 000000000000..c4925cda1d05 --- /dev/null +++ b/homeassistant/components/person/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041b\u044e\u0434\u0438" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/sk.json b/homeassistant/components/person/.translations/sk.json new file mode 100644 index 000000000000..3cab1ead0637 --- /dev/null +++ b/homeassistant/components/person/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Osoba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/sl.json b/homeassistant/components/person/.translations/sl.json new file mode 100644 index 000000000000..97bbbf11efd8 --- /dev/null +++ b/homeassistant/components/person/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Oseba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/sr.json b/homeassistant/components/person/.translations/sr.json new file mode 100644 index 000000000000..c3b0c189d7dc --- /dev/null +++ b/homeassistant/components/person/.translations/sr.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0441\u043e\u0431\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/sv.json b/homeassistant/components/person/.translations/sv.json new file mode 100644 index 000000000000..10115f789a6b --- /dev/null +++ b/homeassistant/components/person/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Person" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/th.json b/homeassistant/components/person/.translations/th.json new file mode 100644 index 000000000000..166b76408d71 --- /dev/null +++ b/homeassistant/components/person/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1a\u0e38\u0e04\u0e04\u0e25" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/tr.json b/homeassistant/components/person/.translations/tr.json new file mode 100644 index 000000000000..6cf6b85da641 --- /dev/null +++ b/homeassistant/components/person/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Ki\u015fi" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/uk.json b/homeassistant/components/person/.translations/uk.json new file mode 100644 index 000000000000..b8dcc73c978b --- /dev/null +++ b/homeassistant/components/person/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041b\u044e\u0434\u0438\u043d\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/vi.json b/homeassistant/components/person/.translations/vi.json new file mode 100644 index 000000000000..877ae81ffcf5 --- /dev/null +++ b/homeassistant/components/person/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Ng\u01b0\u1eddi" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/zh-Hans.json b/homeassistant/components/person/.translations/zh-Hans.json new file mode 100644 index 000000000000..504c447610d9 --- /dev/null +++ b/homeassistant/components/person/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u4e2a\u4eba" +} \ No newline at end of file diff --git a/homeassistant/components/person/.translations/zh-Hant.json b/homeassistant/components/person/.translations/zh-Hant.json new file mode 100644 index 000000000000..93c00b920e36 --- /dev/null +++ b/homeassistant/components/person/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u500b\u4eba" +} \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/bg.json b/homeassistant/components/plaato/.translations/bg.json index 8a217c57a6d8..d8339e1100a6 100644 --- a/homeassistant/components/plaato/.translations/bg.json +++ b/homeassistant/components/plaato/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ca.json b/homeassistant/components/plaato/.translations/ca.json index 005175c5bf92..a0e610e45279 100644 --- a/homeassistant/components/plaato/.translations/ca.json +++ b/homeassistant/components/plaato/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Plaato" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/da.json b/homeassistant/components/plaato/.translations/da.json index 5114b578c3f1..88b047a2a452 100644 --- a/homeassistant/components/plaato/.translations/da.json +++ b/homeassistant/components/plaato/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/de.json b/homeassistant/components/plaato/.translations/de.json index 5c104c9399ec..ec4c3b87d9c0 100644 --- a/homeassistant/components/plaato/.translations/de.json +++ b/homeassistant/components/plaato/.translations/de.json @@ -13,6 +13,5 @@ "title": "Plaato Webhook einrichten" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/en.json b/homeassistant/components/plaato/.translations/en.json index 5a41facb5056..42d37f042fb0 100644 --- a/homeassistant/components/plaato/.translations/en.json +++ b/homeassistant/components/plaato/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/es-419.json b/homeassistant/components/plaato/.translations/es-419.json index 40cca942a8bc..96dae84b8536 100644 --- a/homeassistant/components/plaato/.translations/es-419.json +++ b/homeassistant/components/plaato/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Plaato" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/es.json b/homeassistant/components/plaato/.translations/es.json index af1305b00e82..e52a80be9863 100644 --- a/homeassistant/components/plaato/.translations/es.json +++ b/homeassistant/components/plaato/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el webhook de Plaato" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/fr.json b/homeassistant/components/plaato/.translations/fr.json index 849913b40bf0..79ea8c05b499 100644 --- a/homeassistant/components/plaato/.translations/fr.json +++ b/homeassistant/components/plaato/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook Plaato" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/hr.json b/homeassistant/components/plaato/.translations/hr.json index 03963cb15a95..b1ab00551e47 100644 --- a/homeassistant/components/plaato/.translations/hr.json +++ b/homeassistant/components/plaato/.translations/hr.json @@ -13,6 +13,5 @@ "title": "Postavljanje Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/it.json b/homeassistant/components/plaato/.translations/it.json index 5d769289d2cd..2c6235cf17c8 100644 --- a/homeassistant/components/plaato/.translations/it.json +++ b/homeassistant/components/plaato/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Plaato" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ko.json b/homeassistant/components/plaato/.translations/ko.json index 1591d0f31139..4cb94a81a728 100644 --- a/homeassistant/components/plaato/.translations/ko.json +++ b/homeassistant/components/plaato/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Plaato Webhook \uc124\uc815" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/lb.json b/homeassistant/components/plaato/.translations/lb.json index 441fbef41d84..5bded3676dbf 100644 --- a/homeassistant/components/plaato/.translations/lb.json +++ b/homeassistant/components/plaato/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Plaato Webhook ariichten" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/nl.json b/homeassistant/components/plaato/.translations/nl.json index 0ae305c76ec3..4d46fb9265c1 100644 --- a/homeassistant/components/plaato/.translations/nl.json +++ b/homeassistant/components/plaato/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de Plaato Webhook in" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/no.json b/homeassistant/components/plaato/.translations/no.json index c0abea57bcd6..4f771b7b963e 100644 --- a/homeassistant/components/plaato/.translations/no.json +++ b/homeassistant/components/plaato/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/pl.json b/homeassistant/components/plaato/.translations/pl.json index a902c3d4d044..4edc54e357ed 100644 --- a/homeassistant/components/plaato/.translations/pl.json +++ b/homeassistant/components/plaato/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/pt-BR.json b/homeassistant/components/plaato/.translations/pt-BR.json index 1d6ebea298de..d03486ceb31f 100644 --- a/homeassistant/components/plaato/.translations/pt-BR.json +++ b/homeassistant/components/plaato/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/ru.json b/homeassistant/components/plaato/.translations/ru.json index b74ad363658e..2e6e876e8968 100644 --- a/homeassistant/components/plaato/.translations/ru.json +++ b/homeassistant/components/plaato/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Plaato Airlock" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/sl.json b/homeassistant/components/plaato/.translations/sl.json index 85d744b252c3..63707d54c6cd 100644 --- a/homeassistant/components/plaato/.translations/sl.json +++ b/homeassistant/components/plaato/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/sv.json b/homeassistant/components/plaato/.translations/sv.json index 8c2fc19bdbce..e349d5fba287 100644 --- a/homeassistant/components/plaato/.translations/sv.json +++ b/homeassistant/components/plaato/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plaato/.translations/zh-Hant.json b/homeassistant/components/plaato/.translations/zh-Hant.json index f07766c88de0..4ad08ae68059 100644 --- a/homeassistant/components/plaato/.translations/zh-Hant.json +++ b/homeassistant/components/plaato/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Plaato Webhook" } } - }, - "title": "Plaato Airlock" + } } \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/af.json b/homeassistant/components/plant/.translations/af.json new file mode 100644 index 000000000000..dc3b3e99d4b2 --- /dev/null +++ b/homeassistant/components/plant/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Plant" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/ar.json b/homeassistant/components/plant/.translations/ar.json new file mode 100644 index 000000000000..269f050ca4ef --- /dev/null +++ b/homeassistant/components/plant/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0646\u0628\u062a\u0629" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/bg.json b/homeassistant/components/plant/.translations/bg.json new file mode 100644 index 000000000000..6d46e23214b3 --- /dev/null +++ b/homeassistant/components/plant/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u0430\u0441\u0442\u0435\u043d\u0438\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/bs.json b/homeassistant/components/plant/.translations/bs.json new file mode 100644 index 000000000000..febaa038f694 --- /dev/null +++ b/homeassistant/components/plant/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Biljka" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/ca.json b/homeassistant/components/plant/.translations/ca.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/cs.json b/homeassistant/components/plant/.translations/cs.json new file mode 100644 index 000000000000..8248f17c1807 --- /dev/null +++ b/homeassistant/components/plant/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Rostlina" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/cy.json b/homeassistant/components/plant/.translations/cy.json new file mode 100644 index 000000000000..93c8d3fea84f --- /dev/null +++ b/homeassistant/components/plant/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Planhigion" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/da.json b/homeassistant/components/plant/.translations/da.json new file mode 100644 index 000000000000..b882d5b95ac9 --- /dev/null +++ b/homeassistant/components/plant/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Plante" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/de.json b/homeassistant/components/plant/.translations/de.json new file mode 100644 index 000000000000..27e6172cd5ee --- /dev/null +++ b/homeassistant/components/plant/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Pflanze" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/el.json b/homeassistant/components/plant/.translations/el.json new file mode 100644 index 000000000000..781ae4a3834b --- /dev/null +++ b/homeassistant/components/plant/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a7\u03bb\u03c9\u03c1\u03af\u03b4\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/en.json b/homeassistant/components/plant/.translations/en.json new file mode 100644 index 000000000000..41e2c9387bc4 --- /dev/null +++ b/homeassistant/components/plant/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Plant Monitor" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/es-419.json b/homeassistant/components/plant/.translations/es-419.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/es.json b/homeassistant/components/plant/.translations/es.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/et.json b/homeassistant/components/plant/.translations/et.json new file mode 100644 index 000000000000..cc5b0927e590 --- /dev/null +++ b/homeassistant/components/plant/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Taim" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/eu.json b/homeassistant/components/plant/.translations/eu.json new file mode 100644 index 000000000000..c371e20d82e4 --- /dev/null +++ b/homeassistant/components/plant/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Landarea" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/fi.json b/homeassistant/components/plant/.translations/fi.json new file mode 100644 index 000000000000..285be78528de --- /dev/null +++ b/homeassistant/components/plant/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kasvi" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/fr.json b/homeassistant/components/plant/.translations/fr.json new file mode 100644 index 000000000000..b882d5b95ac9 --- /dev/null +++ b/homeassistant/components/plant/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Plante" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/gsw.json b/homeassistant/components/plant/.translations/gsw.json new file mode 100644 index 000000000000..27e6172cd5ee --- /dev/null +++ b/homeassistant/components/plant/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Pflanze" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/he.json b/homeassistant/components/plant/.translations/he.json new file mode 100644 index 000000000000..5604e8e8ec96 --- /dev/null +++ b/homeassistant/components/plant/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e6\u05de\u05d7" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/hr.json b/homeassistant/components/plant/.translations/hr.json new file mode 100644 index 000000000000..febaa038f694 --- /dev/null +++ b/homeassistant/components/plant/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Biljka" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/hu.json b/homeassistant/components/plant/.translations/hu.json new file mode 100644 index 000000000000..46523c815972 --- /dev/null +++ b/homeassistant/components/plant/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00f6v\u00e9ny" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/hy.json b/homeassistant/components/plant/.translations/hy.json new file mode 100644 index 000000000000..903ba4609d77 --- /dev/null +++ b/homeassistant/components/plant/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0533\u0578\u0580\u056e\u0561\u0580\u0561\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/id.json b/homeassistant/components/plant/.translations/id.json new file mode 100644 index 000000000000..8e80040716cc --- /dev/null +++ b/homeassistant/components/plant/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Tanaman" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/is.json b/homeassistant/components/plant/.translations/is.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/it.json b/homeassistant/components/plant/.translations/it.json new file mode 100644 index 000000000000..783b2fc3a055 --- /dev/null +++ b/homeassistant/components/plant/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Pianta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/ko.json b/homeassistant/components/plant/.translations/ko.json new file mode 100644 index 000000000000..89db16e8afca --- /dev/null +++ b/homeassistant/components/plant/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc2dd\ubb3c" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/lb.json b/homeassistant/components/plant/.translations/lb.json new file mode 100644 index 000000000000..78fda836cb42 --- /dev/null +++ b/homeassistant/components/plant/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Planz" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/lv.json b/homeassistant/components/plant/.translations/lv.json new file mode 100644 index 000000000000..98a9a93b1c4d --- /dev/null +++ b/homeassistant/components/plant/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Augs" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/nb.json b/homeassistant/components/plant/.translations/nb.json new file mode 100644 index 000000000000..b882d5b95ac9 --- /dev/null +++ b/homeassistant/components/plant/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Plante" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/nl.json b/homeassistant/components/plant/.translations/nl.json new file mode 100644 index 000000000000..dc3b3e99d4b2 --- /dev/null +++ b/homeassistant/components/plant/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Plant" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/nn.json b/homeassistant/components/plant/.translations/nn.json new file mode 100644 index 000000000000..b882d5b95ac9 --- /dev/null +++ b/homeassistant/components/plant/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Plante" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/pl.json b/homeassistant/components/plant/.translations/pl.json new file mode 100644 index 000000000000..6c3395eac485 --- /dev/null +++ b/homeassistant/components/plant/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Ro\u015blina" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/pt-BR.json b/homeassistant/components/plant/.translations/pt-BR.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/pt.json b/homeassistant/components/plant/.translations/pt.json new file mode 100644 index 000000000000..9a3593e0799d --- /dev/null +++ b/homeassistant/components/plant/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Planta" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/ro.json b/homeassistant/components/plant/.translations/ro.json new file mode 100644 index 000000000000..8429efc17348 --- /dev/null +++ b/homeassistant/components/plant/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Plant\u0103" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/ru.json b/homeassistant/components/plant/.translations/ru.json new file mode 100644 index 000000000000..6d46e23214b3 --- /dev/null +++ b/homeassistant/components/plant/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u0430\u0441\u0442\u0435\u043d\u0438\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/sk.json b/homeassistant/components/plant/.translations/sk.json new file mode 100644 index 000000000000..11dc6de70340 --- /dev/null +++ b/homeassistant/components/plant/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Rastlina" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/sl.json b/homeassistant/components/plant/.translations/sl.json new file mode 100644 index 000000000000..dc3b3e99d4b2 --- /dev/null +++ b/homeassistant/components/plant/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Plant" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/sv.json b/homeassistant/components/plant/.translations/sv.json new file mode 100644 index 000000000000..0133f8931995 --- /dev/null +++ b/homeassistant/components/plant/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "V\u00e4xt" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/te.json b/homeassistant/components/plant/.translations/te.json new file mode 100644 index 000000000000..73e0b31dbe73 --- /dev/null +++ b/homeassistant/components/plant/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c2e\u0c4a\u0c15\u0c4d\u0c15" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/th.json b/homeassistant/components/plant/.translations/th.json new file mode 100644 index 000000000000..b0abb2165c3c --- /dev/null +++ b/homeassistant/components/plant/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e1e\u0e37\u0e0a" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/tr.json b/homeassistant/components/plant/.translations/tr.json new file mode 100644 index 000000000000..7f8902dbf792 --- /dev/null +++ b/homeassistant/components/plant/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Bitki" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/uk.json b/homeassistant/components/plant/.translations/uk.json new file mode 100644 index 000000000000..df25afb9fdf0 --- /dev/null +++ b/homeassistant/components/plant/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u043e\u0441\u043b\u0438\u043d\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/vi.json b/homeassistant/components/plant/.translations/vi.json new file mode 100644 index 000000000000..310b7f9cc7e2 --- /dev/null +++ b/homeassistant/components/plant/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00e2y tr\u1ed3ng" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/zh-Hans.json b/homeassistant/components/plant/.translations/zh-Hans.json new file mode 100644 index 000000000000..5842ec092ea3 --- /dev/null +++ b/homeassistant/components/plant/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u690d\u7269" +} \ No newline at end of file diff --git a/homeassistant/components/plant/.translations/zh-Hant.json b/homeassistant/components/plant/.translations/zh-Hant.json new file mode 100644 index 000000000000..5842ec092ea3 --- /dev/null +++ b/homeassistant/components/plant/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u690d\u7269" +} \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/bg.json b/homeassistant/components/plex/.translations/bg.json index ee2534fa7766..fabb44dc9ead 100644 --- a/homeassistant/components/plex/.translations/bg.json +++ b/homeassistant/components/plex/.translations/bg.json @@ -37,6 +37,5 @@ "description": "\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Plex Media Players" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ca.json b/homeassistant/components/plex/.translations/ca.json index e11634c2d8e1..250f1a3b2f2a 100644 --- a/homeassistant/components/plex/.translations/ca.json +++ b/homeassistant/components/plex/.translations/ca.json @@ -39,6 +39,5 @@ "description": "Opcions dels reproductors multim\u00e8dia Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/da.json b/homeassistant/components/plex/.translations/da.json index 5558a73aa7ce..06b40f1b1ad8 100644 --- a/homeassistant/components/plex/.translations/da.json +++ b/homeassistant/components/plex/.translations/da.json @@ -39,6 +39,5 @@ "description": "Indstillinger for Plex-medieafspillere" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/de.json b/homeassistant/components/plex/.translations/de.json index 15b7a823a91b..e8aea9921c7f 100644 --- a/homeassistant/components/plex/.translations/de.json +++ b/homeassistant/components/plex/.translations/de.json @@ -39,6 +39,5 @@ "description": "Optionen f\u00fcr Plex-Media-Player" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/en.json b/homeassistant/components/plex/.translations/en.json index 8383a6a3491c..731e95915cad 100644 --- a/homeassistant/components/plex/.translations/en.json +++ b/homeassistant/components/plex/.translations/en.json @@ -39,6 +39,5 @@ "description": "Options for Plex Media Players" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/es-419.json b/homeassistant/components/plex/.translations/es-419.json index dfddaf027420..8fa797aec89b 100644 --- a/homeassistant/components/plex/.translations/es-419.json +++ b/homeassistant/components/plex/.translations/es-419.json @@ -29,6 +29,5 @@ "description": "Opciones para reproductores multimedia Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/es.json b/homeassistant/components/plex/.translations/es.json index 6190c0a52ac3..b26c6a4b3816 100644 --- a/homeassistant/components/plex/.translations/es.json +++ b/homeassistant/components/plex/.translations/es.json @@ -39,6 +39,5 @@ "description": "Opciones para reproductores multimedia Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/fr.json b/homeassistant/components/plex/.translations/fr.json index edbbe2d4d943..6950a0de170c 100644 --- a/homeassistant/components/plex/.translations/fr.json +++ b/homeassistant/components/plex/.translations/fr.json @@ -39,6 +39,5 @@ "description": "Options pour lecteurs multim\u00e9dia Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/hu.json b/homeassistant/components/plex/.translations/hu.json index cdf95c701734..5296b208e78f 100644 --- a/homeassistant/components/plex/.translations/hu.json +++ b/homeassistant/components/plex/.translations/hu.json @@ -37,6 +37,5 @@ "description": "Plex media lej\u00e1tsz\u00f3k be\u00e1ll\u00edt\u00e1sai" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/it.json b/homeassistant/components/plex/.translations/it.json index 5db92410f146..503cfcbd1103 100644 --- a/homeassistant/components/plex/.translations/it.json +++ b/homeassistant/components/plex/.translations/it.json @@ -39,6 +39,5 @@ "description": "Opzioni per i lettori multimediali Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ko.json b/homeassistant/components/plex/.translations/ko.json index 47d5bfcf9cec..1c8e51f9f1c5 100644 --- a/homeassistant/components/plex/.translations/ko.json +++ b/homeassistant/components/plex/.translations/ko.json @@ -39,6 +39,5 @@ "description": "Plex \ubbf8\ub514\uc5b4 \ud50c\ub808\uc774\uc5b4 \uc635\uc158" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/lb.json b/homeassistant/components/plex/.translations/lb.json index 94b0d55afb1e..563d2282058e 100644 --- a/homeassistant/components/plex/.translations/lb.json +++ b/homeassistant/components/plex/.translations/lb.json @@ -39,6 +39,5 @@ "description": "Optioune fir Plex Medie Spiller" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/nl.json b/homeassistant/components/plex/.translations/nl.json index 21235032c3c8..6938bdea5f5d 100644 --- a/homeassistant/components/plex/.translations/nl.json +++ b/homeassistant/components/plex/.translations/nl.json @@ -37,6 +37,5 @@ "description": "Opties voor Plex-mediaspelers" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/no.json b/homeassistant/components/plex/.translations/no.json index 1e3285a628fb..f3743bd0ffb9 100644 --- a/homeassistant/components/plex/.translations/no.json +++ b/homeassistant/components/plex/.translations/no.json @@ -39,6 +39,5 @@ "description": "Alternativer for Plex Media Players" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/pl.json b/homeassistant/components/plex/.translations/pl.json index f3a9bbbc7dbd..53f80db934d3 100644 --- a/homeassistant/components/plex/.translations/pl.json +++ b/homeassistant/components/plex/.translations/pl.json @@ -39,6 +39,5 @@ "description": "Opcje dla odtwarzaczy multimedialnych Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/ru.json b/homeassistant/components/plex/.translations/ru.json index d28ee5a2e458..44de2e39554d 100644 --- a/homeassistant/components/plex/.translations/ru.json +++ b/homeassistant/components/plex/.translations/ru.json @@ -39,6 +39,5 @@ "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/sl.json b/homeassistant/components/plex/.translations/sl.json index a208aa3fda93..3ae1885e76e9 100644 --- a/homeassistant/components/plex/.translations/sl.json +++ b/homeassistant/components/plex/.translations/sl.json @@ -39,6 +39,5 @@ "description": "Mo\u017enosti za predvajalnike Plex" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/sv.json b/homeassistant/components/plex/.translations/sv.json index d8f5e4be158e..ba35af1b326b 100644 --- a/homeassistant/components/plex/.translations/sv.json +++ b/homeassistant/components/plex/.translations/sv.json @@ -37,6 +37,5 @@ "description": "Alternativ f\u00f6r Plex-mediaspelare" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/plex/.translations/zh-Hant.json b/homeassistant/components/plex/.translations/zh-Hant.json index 27e7cd47e091..da8f675a6578 100644 --- a/homeassistant/components/plex/.translations/zh-Hant.json +++ b/homeassistant/components/plex/.translations/zh-Hant.json @@ -39,6 +39,5 @@ "description": "Plex \u64ad\u653e\u5668\u9078\u9805" } } - }, - "title": "Plex" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/bg.json b/homeassistant/components/point/.translations/bg.json index a67d24239805..9a52ca8ad520 100644 --- a/homeassistant/components/point/.translations/bg.json +++ b/homeassistant/components/point/.translations/bg.json @@ -27,6 +27,5 @@ "title": "\u0414\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ca.json b/homeassistant/components/point/.translations/ca.json index e834de8ae0b5..6ff775a8a0e2 100644 --- a/homeassistant/components/point/.translations/ca.json +++ b/homeassistant/components/point/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Prove\u00efdor d'autenticaci\u00f3" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/cs.json b/homeassistant/components/point/.translations/cs.json index c39cec0c7376..f9c802c26125 100644 --- a/homeassistant/components/point/.translations/cs.json +++ b/homeassistant/components/point/.translations/cs.json @@ -26,6 +26,5 @@ "title": "Poskytovatel ov\u011b\u0159en\u00ed" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/da.json b/homeassistant/components/point/.translations/da.json index 8692c4c02cbf..4530705a8b25 100644 --- a/homeassistant/components/point/.translations/da.json +++ b/homeassistant/components/point/.translations/da.json @@ -27,6 +27,5 @@ "title": "Godkendelsesudbyder" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/de.json b/homeassistant/components/point/.translations/de.json index 53b2f2f664d3..b505df4ec254 100644 --- a/homeassistant/components/point/.translations/de.json +++ b/homeassistant/components/point/.translations/de.json @@ -27,6 +27,5 @@ "title": "Authentifizierungsanbieter" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/en.json b/homeassistant/components/point/.translations/en.json index c53605865ffe..e55bb54da466 100644 --- a/homeassistant/components/point/.translations/en.json +++ b/homeassistant/components/point/.translations/en.json @@ -27,6 +27,5 @@ "title": "Authentication Provider" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/es-419.json b/homeassistant/components/point/.translations/es-419.json index fec1cb0b40df..2b6e51ba4a9e 100644 --- a/homeassistant/components/point/.translations/es-419.json +++ b/homeassistant/components/point/.translations/es-419.json @@ -21,6 +21,5 @@ "title": "Proveedor de autenticaci\u00f3n" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/es.json b/homeassistant/components/point/.translations/es.json index 7488d527ecff..0589f7c8468f 100644 --- a/homeassistant/components/point/.translations/es.json +++ b/homeassistant/components/point/.translations/es.json @@ -27,6 +27,5 @@ "title": "Proveedor de autenticaci\u00f3n" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/fr.json b/homeassistant/components/point/.translations/fr.json index eda0c666b62f..75f7a252102d 100644 --- a/homeassistant/components/point/.translations/fr.json +++ b/homeassistant/components/point/.translations/fr.json @@ -27,6 +27,5 @@ "title": "Fournisseur d'authentification" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/hu.json b/homeassistant/components/point/.translations/hu.json index e6a90325e0f0..d63879b3b5e4 100644 --- a/homeassistant/components/point/.translations/hu.json +++ b/homeassistant/components/point/.translations/hu.json @@ -21,6 +21,5 @@ "title": "Hiteles\u00edt\u00e9si Szolg\u00e1ltat\u00f3" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/it.json b/homeassistant/components/point/.translations/it.json index 507b42331445..62225188d8af 100644 --- a/homeassistant/components/point/.translations/it.json +++ b/homeassistant/components/point/.translations/it.json @@ -27,6 +27,5 @@ "title": "Provider di autenticazione" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ko.json b/homeassistant/components/point/.translations/ko.json index 1b54d0ca3b6a..1f8ca1cc107b 100644 --- a/homeassistant/components/point/.translations/ko.json +++ b/homeassistant/components/point/.translations/ko.json @@ -27,6 +27,5 @@ "title": "\uc778\uc99d \uacf5\uae09\uc790" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/lb.json b/homeassistant/components/point/.translations/lb.json index 3090a8cb164b..9262a271fb1b 100644 --- a/homeassistant/components/point/.translations/lb.json +++ b/homeassistant/components/point/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Authentifikatioun Ubidder" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/nl.json b/homeassistant/components/point/.translations/nl.json index bc107a24a994..a257ba3e1115 100644 --- a/homeassistant/components/point/.translations/nl.json +++ b/homeassistant/components/point/.translations/nl.json @@ -27,6 +27,5 @@ "title": "Authenticatieleverancier" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/no.json b/homeassistant/components/point/.translations/no.json index 85e383be7129..e275d0f231e4 100644 --- a/homeassistant/components/point/.translations/no.json +++ b/homeassistant/components/point/.translations/no.json @@ -27,6 +27,5 @@ "title": "Godkjenningsleverand\u00f8r" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pl.json b/homeassistant/components/point/.translations/pl.json index 0aad75fc4ff9..d13d32015464 100644 --- a/homeassistant/components/point/.translations/pl.json +++ b/homeassistant/components/point/.translations/pl.json @@ -27,6 +27,5 @@ "title": "Dostawca uwierzytelnienia" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pt-BR.json b/homeassistant/components/point/.translations/pt-BR.json index 99d65227b2b9..5816f1a0bcd4 100644 --- a/homeassistant/components/point/.translations/pt-BR.json +++ b/homeassistant/components/point/.translations/pt-BR.json @@ -27,6 +27,5 @@ "title": "Provedor de Autentica\u00e7\u00e3o" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/pt.json b/homeassistant/components/point/.translations/pt.json index ea087c1af755..609209738e87 100644 --- a/homeassistant/components/point/.translations/pt.json +++ b/homeassistant/components/point/.translations/pt.json @@ -27,6 +27,5 @@ "title": "Fornecedor de Autentica\u00e7\u00e3o" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/ru.json b/homeassistant/components/point/.translations/ru.json index fb49b3e7fbeb..972a232036ef 100644 --- a/homeassistant/components/point/.translations/ru.json +++ b/homeassistant/components/point/.translations/ru.json @@ -27,6 +27,5 @@ "title": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/sl.json b/homeassistant/components/point/.translations/sl.json index 7f97ee23f982..2fd65bb972e0 100644 --- a/homeassistant/components/point/.translations/sl.json +++ b/homeassistant/components/point/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Ponudnik za preverjanje pristnosti" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/sv.json b/homeassistant/components/point/.translations/sv.json index 26c208ef9aa2..f7050c2c2557 100644 --- a/homeassistant/components/point/.translations/sv.json +++ b/homeassistant/components/point/.translations/sv.json @@ -27,6 +27,5 @@ "title": "Autentiseringsleverant\u00f6r" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/zh-Hans.json b/homeassistant/components/point/.translations/zh-Hans.json index 9ce14cc2ffaa..ecefc3b656c5 100644 --- a/homeassistant/components/point/.translations/zh-Hans.json +++ b/homeassistant/components/point/.translations/zh-Hans.json @@ -27,6 +27,5 @@ "title": "\u6388\u6743\u63d0\u4f9b\u8005" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/point/.translations/zh-Hant.json b/homeassistant/components/point/.translations/zh-Hant.json index 5de597897971..0337dad22efe 100644 --- a/homeassistant/components/point/.translations/zh-Hant.json +++ b/homeassistant/components/point/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "\u8a8d\u8b49\u63d0\u4f9b\u8005" } } - }, - "title": "Minut Point" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ca.json b/homeassistant/components/powerwall/.translations/ca.json index 490938462611..f2a598770a51 100644 --- a/homeassistant/components/powerwall/.translations/ca.json +++ b/homeassistant/components/powerwall/.translations/ca.json @@ -15,6 +15,5 @@ "title": "Connexi\u00f3 amb el Powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/de.json b/homeassistant/components/powerwall/.translations/de.json index 4e032a709572..f5317e3046ae 100644 --- a/homeassistant/components/powerwall/.translations/de.json +++ b/homeassistant/components/powerwall/.translations/de.json @@ -15,6 +15,5 @@ "title": "Stellen Sie eine Verbindung zur Powerwall her" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/en.json b/homeassistant/components/powerwall/.translations/en.json index ec46be861bf2..378abf486ad7 100644 --- a/homeassistant/components/powerwall/.translations/en.json +++ b/homeassistant/components/powerwall/.translations/en.json @@ -15,6 +15,5 @@ "title": "Connect to the powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/es.json b/homeassistant/components/powerwall/.translations/es.json index 9e98e4a94962..0489feb27095 100644 --- a/homeassistant/components/powerwall/.translations/es.json +++ b/homeassistant/components/powerwall/.translations/es.json @@ -15,6 +15,5 @@ "title": "Conectarse al powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/fr.json b/homeassistant/components/powerwall/.translations/fr.json index 376e8751505e..d7e0c759bbfe 100644 --- a/homeassistant/components/powerwall/.translations/fr.json +++ b/homeassistant/components/powerwall/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Connectez-vous au Powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/it.json b/homeassistant/components/powerwall/.translations/it.json index dbbaf1c372f7..09d103c6f60d 100644 --- a/homeassistant/components/powerwall/.translations/it.json +++ b/homeassistant/components/powerwall/.translations/it.json @@ -15,6 +15,5 @@ "title": "Connessione al Powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ko.json b/homeassistant/components/powerwall/.translations/ko.json index 43c3560df99c..7922a11845cf 100644 --- a/homeassistant/components/powerwall/.translations/ko.json +++ b/homeassistant/components/powerwall/.translations/ko.json @@ -15,6 +15,5 @@ "title": "powerwall \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/lb.json b/homeassistant/components/powerwall/.translations/lb.json index 8be90459f713..9f1e0670d643 100644 --- a/homeassistant/components/powerwall/.translations/lb.json +++ b/homeassistant/components/powerwall/.translations/lb.json @@ -15,6 +15,5 @@ "title": "Mat der Powerwall verbannen" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/no.json b/homeassistant/components/powerwall/.translations/no.json index 7f5b3e382001..0c105f261686 100644 --- a/homeassistant/components/powerwall/.translations/no.json +++ b/homeassistant/components/powerwall/.translations/no.json @@ -15,6 +15,5 @@ "title": "Koble til powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/ru.json b/homeassistant/components/powerwall/.translations/ru.json index cfe47b199fdd..4f5f75dc6444 100644 --- a/homeassistant/components/powerwall/.translations/ru.json +++ b/homeassistant/components/powerwall/.translations/ru.json @@ -15,6 +15,5 @@ "title": "Tesla Powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/sl.json b/homeassistant/components/powerwall/.translations/sl.json new file mode 100644 index 000000000000..122d8bcfd027 --- /dev/null +++ b/homeassistant/components/powerwall/.translations/sl.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "Powerwall je \u017ee nastavljen" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "ip_address": "IP naslov" + }, + "title": "Pove\u017eite se s powerwall-om" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/powerwall/.translations/zh-Hant.json b/homeassistant/components/powerwall/.translations/zh-Hant.json index 8e80584957b7..91bb4b618010 100644 --- a/homeassistant/components/powerwall/.translations/zh-Hant.json +++ b/homeassistant/components/powerwall/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "\u9023\u7dda\u81f3 Powerwall" } } - }, - "title": "Tesla Powerwall" + } } \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/af.json b/homeassistant/components/proximity/.translations/af.json new file mode 100644 index 000000000000..b53d6013fa96 --- /dev/null +++ b/homeassistant/components/proximity/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Nabyheid" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/ar.json b/homeassistant/components/proximity/.translations/ar.json new file mode 100644 index 000000000000..ed1cef3d9f75 --- /dev/null +++ b/homeassistant/components/proximity/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0642\u0631\u0628" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/bg.json b/homeassistant/components/proximity/.translations/bg.json new file mode 100644 index 000000000000..ee1630232e5d --- /dev/null +++ b/homeassistant/components/proximity/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0411\u043b\u0438\u0437\u043e\u0441\u0442" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/bs.json b/homeassistant/components/proximity/.translations/bs.json new file mode 100644 index 000000000000..0981324d7952 --- /dev/null +++ b/homeassistant/components/proximity/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Udaljenost" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/ca.json b/homeassistant/components/proximity/.translations/ca.json new file mode 100644 index 000000000000..cd24bb9b58dd --- /dev/null +++ b/homeassistant/components/proximity/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Proximitat" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/cs.json b/homeassistant/components/proximity/.translations/cs.json new file mode 100644 index 000000000000..a7b2b73ad2bf --- /dev/null +++ b/homeassistant/components/proximity/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "P\u0159ibl\u00ed\u017een\u00ed" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/cy.json b/homeassistant/components/proximity/.translations/cy.json new file mode 100644 index 000000000000..5f1a1c66ded1 --- /dev/null +++ b/homeassistant/components/proximity/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Agosrwydd" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/da.json b/homeassistant/components/proximity/.translations/da.json new file mode 100644 index 000000000000..bad36c8d192b --- /dev/null +++ b/homeassistant/components/proximity/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e6rhed" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/de.json b/homeassistant/components/proximity/.translations/de.json new file mode 100644 index 000000000000..4561b1ff4126 --- /dev/null +++ b/homeassistant/components/proximity/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e4he" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/el.json b/homeassistant/components/proximity/.translations/el.json new file mode 100644 index 000000000000..e74809417736 --- /dev/null +++ b/homeassistant/components/proximity/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03b3\u03b3\u03cd\u03c4\u03b7\u03c4\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/en.json b/homeassistant/components/proximity/.translations/en.json new file mode 100644 index 000000000000..3a5a4259f579 --- /dev/null +++ b/homeassistant/components/proximity/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Proximity" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/es-419.json b/homeassistant/components/proximity/.translations/es-419.json new file mode 100644 index 000000000000..3ed10dfad9c0 --- /dev/null +++ b/homeassistant/components/proximity/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Proximidad" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/es.json b/homeassistant/components/proximity/.translations/es.json new file mode 100644 index 000000000000..3ed10dfad9c0 --- /dev/null +++ b/homeassistant/components/proximity/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Proximidad" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/et.json b/homeassistant/components/proximity/.translations/et.json new file mode 100644 index 000000000000..aef8891a168f --- /dev/null +++ b/homeassistant/components/proximity/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00e4hedus" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/eu.json b/homeassistant/components/proximity/.translations/eu.json new file mode 100644 index 000000000000..ab40939b84e5 --- /dev/null +++ b/homeassistant/components/proximity/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Gertutasuna" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/fi.json b/homeassistant/components/proximity/.translations/fi.json new file mode 100644 index 000000000000..7b798759704c --- /dev/null +++ b/homeassistant/components/proximity/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00e4heisyys" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/fr.json b/homeassistant/components/proximity/.translations/fr.json new file mode 100644 index 000000000000..97bbf34c7d02 --- /dev/null +++ b/homeassistant/components/proximity/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Proximit\u00e9" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/he.json b/homeassistant/components/proximity/.translations/he.json new file mode 100644 index 000000000000..1e840a5f52e3 --- /dev/null +++ b/homeassistant/components/proximity/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e7\u05b4\u05e8\u05d1\u05b8\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/hi.json b/homeassistant/components/proximity/.translations/hi.json new file mode 100644 index 000000000000..e8ffb6331734 --- /dev/null +++ b/homeassistant/components/proximity/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0928\u093f\u0915\u091f\u0924\u093e" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/hr.json b/homeassistant/components/proximity/.translations/hr.json new file mode 100644 index 000000000000..0a64f65abd82 --- /dev/null +++ b/homeassistant/components/proximity/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Blizina" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/hu.json b/homeassistant/components/proximity/.translations/hu.json new file mode 100644 index 000000000000..1e80961119d8 --- /dev/null +++ b/homeassistant/components/proximity/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "K\u00f6zels\u00e9g" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/hy.json b/homeassistant/components/proximity/.translations/hy.json new file mode 100644 index 000000000000..f243ae9516ec --- /dev/null +++ b/homeassistant/components/proximity/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0540\u0561\u0580\u0587\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/id.json b/homeassistant/components/proximity/.translations/id.json new file mode 100644 index 000000000000..0b0eddc0f75b --- /dev/null +++ b/homeassistant/components/proximity/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Kedekatan" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/is.json b/homeassistant/components/proximity/.translations/is.json new file mode 100644 index 000000000000..dd8036a9ec75 --- /dev/null +++ b/homeassistant/components/proximity/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e1l\u00e6g\u00f0" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/it.json b/homeassistant/components/proximity/.translations/it.json new file mode 100644 index 000000000000..5ea121f977ae --- /dev/null +++ b/homeassistant/components/proximity/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Prossimit\u00e0" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/ko.json b/homeassistant/components/proximity/.translations/ko.json new file mode 100644 index 000000000000..ef881ed0af3f --- /dev/null +++ b/homeassistant/components/proximity/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uadfc\uc811" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/lb.json b/homeassistant/components/proximity/.translations/lb.json new file mode 100644 index 000000000000..a27e9b403957 --- /dev/null +++ b/homeassistant/components/proximity/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "\u00cbmg\u00e9igend" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/lv.json b/homeassistant/components/proximity/.translations/lv.json new file mode 100644 index 000000000000..54bd5b092f38 --- /dev/null +++ b/homeassistant/components/proximity/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Tuvums" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/nb.json b/homeassistant/components/proximity/.translations/nb.json new file mode 100644 index 000000000000..7c47e31401af --- /dev/null +++ b/homeassistant/components/proximity/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e6rhet" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/nl.json b/homeassistant/components/proximity/.translations/nl.json new file mode 100644 index 000000000000..2712cef60fde --- /dev/null +++ b/homeassistant/components/proximity/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Nabijheid" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/nn.json b/homeassistant/components/proximity/.translations/nn.json new file mode 100644 index 000000000000..011c91def778 --- /dev/null +++ b/homeassistant/components/proximity/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e6rleik" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/pl.json b/homeassistant/components/proximity/.translations/pl.json new file mode 100644 index 000000000000..1e3280d0ca54 --- /dev/null +++ b/homeassistant/components/proximity/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Zbli\u017cenie" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/pt-BR.json b/homeassistant/components/proximity/.translations/pt-BR.json new file mode 100644 index 000000000000..d051dc791aed --- /dev/null +++ b/homeassistant/components/proximity/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Proximidade" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/pt.json b/homeassistant/components/proximity/.translations/pt.json new file mode 100644 index 000000000000..d051dc791aed --- /dev/null +++ b/homeassistant/components/proximity/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Proximidade" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/ro.json b/homeassistant/components/proximity/.translations/ro.json new file mode 100644 index 000000000000..ce4664e8c42a --- /dev/null +++ b/homeassistant/components/proximity/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Proximitate" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/ru.json b/homeassistant/components/proximity/.translations/ru.json new file mode 100644 index 000000000000..7e2fb36b69a2 --- /dev/null +++ b/homeassistant/components/proximity/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/sk.json b/homeassistant/components/proximity/.translations/sk.json new file mode 100644 index 000000000000..96f9e2528250 --- /dev/null +++ b/homeassistant/components/proximity/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Bl\u00edzkos\u0165" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/sl.json b/homeassistant/components/proximity/.translations/sl.json new file mode 100644 index 000000000000..b7977354c8e2 --- /dev/null +++ b/homeassistant/components/proximity/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Bli\u017eina" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/sv.json b/homeassistant/components/proximity/.translations/sv.json new file mode 100644 index 000000000000..a73730742406 --- /dev/null +++ b/homeassistant/components/proximity/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "N\u00e4rhet" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/te.json b/homeassistant/components/proximity/.translations/te.json new file mode 100644 index 000000000000..935a5a4a4faf --- /dev/null +++ b/homeassistant/components/proximity/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c3e\u0c2e\u0c40\u0c2a\u0c4d\u0c2f\u0c24" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/th.json b/homeassistant/components/proximity/.translations/th.json new file mode 100644 index 000000000000..a23d1446e84f --- /dev/null +++ b/homeassistant/components/proximity/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e43\u0e01\u0e25\u0e49\u0e0a\u0e34\u0e14" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/tr.json b/homeassistant/components/proximity/.translations/tr.json new file mode 100644 index 000000000000..dca2f176b5f1 --- /dev/null +++ b/homeassistant/components/proximity/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Yak\u0131nl\u0131k" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/uk.json b/homeassistant/components/proximity/.translations/uk.json new file mode 100644 index 000000000000..2090978108fd --- /dev/null +++ b/homeassistant/components/proximity/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/vi.json b/homeassistant/components/proximity/.translations/vi.json new file mode 100644 index 000000000000..ec3b08eab1a4 --- /dev/null +++ b/homeassistant/components/proximity/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Ti\u1ec7m c\u1eadn" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/zh-Hans.json b/homeassistant/components/proximity/.translations/zh-Hans.json new file mode 100644 index 000000000000..962f435cc3db --- /dev/null +++ b/homeassistant/components/proximity/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u8ddd\u79bb" +} \ No newline at end of file diff --git a/homeassistant/components/proximity/.translations/zh-Hant.json b/homeassistant/components/proximity/.translations/zh-Hant.json new file mode 100644 index 000000000000..1cc79a165649 --- /dev/null +++ b/homeassistant/components/proximity/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8ddd\u96e2" +} \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/bg.json b/homeassistant/components/ps4/.translations/bg.json index 78a52d908727..7d453374b9de 100644 --- a/homeassistant/components/ps4/.translations/bg.json +++ b/homeassistant/components/ps4/.translations/bg.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ca.json b/homeassistant/components/ps4/.translations/ca.json index a00f8930d5d2..09b41d00587d 100644 --- a/homeassistant/components/ps4/.translations/ca.json +++ b/homeassistant/components/ps4/.translations/ca.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/cs.json b/homeassistant/components/ps4/.translations/cs.json index 31c94851158f..d61911f012d7 100644 --- a/homeassistant/components/ps4/.translations/cs.json +++ b/homeassistant/components/ps4/.translations/cs.json @@ -8,6 +8,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/da.json b/homeassistant/components/ps4/.translations/da.json index 2b97431b1a4b..353edb079ae0 100644 --- a/homeassistant/components/ps4/.translations/da.json +++ b/homeassistant/components/ps4/.translations/da.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/de.json b/homeassistant/components/ps4/.translations/de.json index 53c357fa8f52..73fe6e8926f1 100644 --- a/homeassistant/components/ps4/.translations/de.json +++ b/homeassistant/components/ps4/.translations/de.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/en.json b/homeassistant/components/ps4/.translations/en.json index 242fbfe890fd..a7c67304a769 100644 --- a/homeassistant/components/ps4/.translations/en.json +++ b/homeassistant/components/ps4/.translations/en.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/es-419.json b/homeassistant/components/ps4/.translations/es-419.json index 340d4742baa4..eabbc340cc8c 100644 --- a/homeassistant/components/ps4/.translations/es-419.json +++ b/homeassistant/components/ps4/.translations/es-419.json @@ -33,6 +33,5 @@ "title": "Playstation 4" } } - }, - "title": "Playstation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/es.json b/homeassistant/components/ps4/.translations/es.json index 45af82bfb841..d9d410b11d8c 100644 --- a/homeassistant/components/ps4/.translations/es.json +++ b/homeassistant/components/ps4/.translations/es.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/fr.json b/homeassistant/components/ps4/.translations/fr.json index 0ce8b77e7e12..ca152e727c80 100644 --- a/homeassistant/components/ps4/.translations/fr.json +++ b/homeassistant/components/ps4/.translations/fr.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/he.json b/homeassistant/components/ps4/.translations/he.json index 4b25ffa00501..7513b5be12d3 100644 --- a/homeassistant/components/ps4/.translations/he.json +++ b/homeassistant/components/ps4/.translations/he.json @@ -20,6 +20,5 @@ "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" } } - }, - "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/it.json b/homeassistant/components/ps4/.translations/it.json index a9afe10984bf..dc73362280e0 100644 --- a/homeassistant/components/ps4/.translations/it.json +++ b/homeassistant/components/ps4/.translations/it.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ko.json b/homeassistant/components/ps4/.translations/ko.json index 23f58ad5bdb2..7285ffb97bfc 100644 --- a/homeassistant/components/ps4/.translations/ko.json +++ b/homeassistant/components/ps4/.translations/ko.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/lb.json b/homeassistant/components/ps4/.translations/lb.json index 9cb8c51d98f9..4295422780ed 100644 --- a/homeassistant/components/ps4/.translations/lb.json +++ b/homeassistant/components/ps4/.translations/lb.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/nl.json b/homeassistant/components/ps4/.translations/nl.json index 3f239306ec37..9b010ce28877 100644 --- a/homeassistant/components/ps4/.translations/nl.json +++ b/homeassistant/components/ps4/.translations/nl.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/nn.json b/homeassistant/components/ps4/.translations/nn.json index d8a7fb302200..a9b44db3731d 100644 --- a/homeassistant/components/ps4/.translations/nn.json +++ b/homeassistant/components/ps4/.translations/nn.json @@ -19,6 +19,5 @@ "title": "Playstation 4" } } - }, - "title": "Playstation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/no.json b/homeassistant/components/ps4/.translations/no.json index b56efa60ac47..cd9b80175ad6 100644 --- a/homeassistant/components/ps4/.translations/no.json +++ b/homeassistant/components/ps4/.translations/no.json @@ -37,6 +37,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pl.json b/homeassistant/components/ps4/.translations/pl.json index e9d7481bb6c0..f13c5b00bb57 100644 --- a/homeassistant/components/ps4/.translations/pl.json +++ b/homeassistant/components/ps4/.translations/pl.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pt-BR.json b/homeassistant/components/ps4/.translations/pt-BR.json index ceab0e65a32f..593ecd19f9a6 100644 --- a/homeassistant/components/ps4/.translations/pt-BR.json +++ b/homeassistant/components/ps4/.translations/pt-BR.json @@ -37,6 +37,5 @@ "title": "Playstation 4" } } - }, - "title": "Playstation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/pt.json b/homeassistant/components/ps4/.translations/pt.json index 774e6a269530..9250f5a37568 100644 --- a/homeassistant/components/ps4/.translations/pt.json +++ b/homeassistant/components/ps4/.translations/pt.json @@ -1,5 +1,13 @@ { "config": { + "abort": { + "devices_configured": "Todos os dispositivos encontrados j\u00e1 est\u00e3o configurados.", + "no_devices_found": "N\u00e3o foram encontrados dispositivos PlayStation 4 na rede." + }, + "error": { + "login_failed": "Falha ao emparelhar com a PlayStation 4. Verifique se o PIN est\u00e1 correto.", + "not_ready": "A PlayStation 4 n\u00e3o est\u00e1 ligada ou ligada \u00e0 rede." + }, "step": { "creds": { "title": "PlayStation 4" @@ -17,6 +25,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/ru.json b/homeassistant/components/ps4/.translations/ru.json index 3d0fbad5b5f9..f2a85e2c3e74 100644 --- a/homeassistant/components/ps4/.translations/ru.json +++ b/homeassistant/components/ps4/.translations/ru.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/sl.json b/homeassistant/components/ps4/.translations/sl.json index f28083fd726f..13dfc6c21471 100644 --- a/homeassistant/components/ps4/.translations/sl.json +++ b/homeassistant/components/ps4/.translations/sl.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/sv.json b/homeassistant/components/ps4/.translations/sv.json index da010884620c..3ed8a3765fc2 100644 --- a/homeassistant/components/ps4/.translations/sv.json +++ b/homeassistant/components/ps4/.translations/sv.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/th.json b/homeassistant/components/ps4/.translations/th.json index beba04478d56..2ffe2fb805a2 100644 --- a/homeassistant/components/ps4/.translations/th.json +++ b/homeassistant/components/ps4/.translations/th.json @@ -17,6 +17,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/zh-Hans.json b/homeassistant/components/ps4/.translations/zh-Hans.json index 53660148d65d..821cb0ed0568 100644 --- a/homeassistant/components/ps4/.translations/zh-Hans.json +++ b/homeassistant/components/ps4/.translations/zh-Hans.json @@ -27,6 +27,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/ps4/.translations/zh-Hant.json b/homeassistant/components/ps4/.translations/zh-Hant.json index 5d98c8370870..80efe98c4b6c 100644 --- a/homeassistant/components/ps4/.translations/zh-Hant.json +++ b/homeassistant/components/ps4/.translations/zh-Hant.json @@ -37,6 +37,5 @@ "title": "PlayStation 4" } } - }, - "title": "PlayStation 4" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json index 9e3e80533928..a96fa3b584bd 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Selecci\u00f3 de tarifa" } } - }, - "title": "Preu per hora de l'electricitat a Espanya (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/de.json b/homeassistant/components/pvpc_hourly_pricing/.translations/de.json index 341fb1afcaa5..8e3e9b68e42b 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/de.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/de.json @@ -13,6 +13,5 @@ "title": "Tarifauswahl" } } - }, - "title": "St\u00fcndlicher Strompreis in Spanien (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/en.json b/homeassistant/components/pvpc_hourly_pricing/.translations/en.json index 0dac2ae5dc2e..7716dab8ad7c 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/en.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/en.json @@ -13,6 +13,5 @@ "title": "Tariff selection" } } - }, - "title": "Hourly price of electricity in Spain (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/es.json b/homeassistant/components/pvpc_hourly_pricing/.translations/es.json index 396082c057ec..ee7192f6f874 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/es.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/es.json @@ -13,6 +13,5 @@ "title": "Selecci\u00f3n de tarifa" } } - }, - "title": "Precio por hora de la electricidad en Espa\u00f1a (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/it.json b/homeassistant/components/pvpc_hourly_pricing/.translations/it.json index cd97e4aaa3ee..84f2fddcb833 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/it.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/it.json @@ -13,6 +13,5 @@ "title": "Selezione della tariffa" } } - }, - "title": "Prezzo orario dell'elettricit\u00e0 in Spagna (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json index d9b547e8fe71..35ac17a8bb8f 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\uc694\uae08\uc81c \uc120\ud0dd" } } - }, - "title": "\uc2a4\ud398\uc778 \uc2dc\uac04\ub2f9 \uc804\uae30\uc694\uae08 (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json b/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json index 32871a64c306..d176bc4ab6e6 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Auswiel vum Tarif" } } - }, - "title": "Stonne Pr\u00e4is fir Elektrizit\u00e9it a Spuenien (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/no.json b/homeassistant/components/pvpc_hourly_pricing/.translations/no.json index 04cb6dc6ee61..d27b78615cf4 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/no.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/no.json @@ -13,6 +13,5 @@ "title": "Tariffvalg" } } - }, - "title": "Timepris p\u00e5 elektrisitet i Spania (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json b/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json index e8911d78e930..4a2f4440a2a0 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/ru.json @@ -13,6 +13,5 @@ "title": "\u0412\u044b\u0431\u043e\u0440 \u0442\u0430\u0440\u0438\u0444\u0430" } } - }, - "title": "\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0432 \u0418\u0441\u043f\u0430\u043d\u0438\u0438 (PVPC)" + } } \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/sl.json b/homeassistant/components/pvpc_hourly_pricing/.translations/sl.json new file mode 100644 index 000000000000..c6765575c07e --- /dev/null +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/sl.json @@ -0,0 +1,17 @@ +{ + "config": { + "abort": { + "already_configured": "Integracija je \u017ee konfigurirana z obstoje\u010dim senzorjem s to tarifo" + }, + "step": { + "user": { + "data": { + "name": "Ime tipala", + "tariff": "Pogodbena tarifa (1, 2 ali 3 obdobja)" + }, + "description": "Ta senzor uporablja uradni API za [urno dolo\u010danje cen elektri\u010dne energije (PVPC)] (https://www.esios.ree.es/es/pvpc) v \u0160paniji. \n Za natan\u010dnej\u0161o razlago obi\u0161\u010dite [integracijski dokumenti] (https://www.home-assistant.io/integrations/pvpc_hourly_pricing/). \n\n Izberite pogodbeno tarifo glede na \u0161tevilo obra\u010dunskih obdobij na dan: \n - 1 obdobje: normalno \n - 2 obdobji: diskriminacija (no\u010dna cena) \n - 3 obdobja: elektri\u010dni avtomobil (no\u010dna cena 3 obdobja)", + "title": "Izbira tarife" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json b/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json index e31ee2373a4d..7203356ab6a0 100644 --- a/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json +++ b/homeassistant/components/pvpc_hourly_pricing/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8cbb\u7387\u9078\u64c7" } } - }, - "title": "\u897f\u73ed\u7259\u6642\u8a08\u96fb\u50f9\uff08PVPC\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ca.json b/homeassistant/components/rachio/.translations/ca.json index d638cf5e54a9..8d4f9aa7245f 100644 --- a/homeassistant/components/rachio/.translations/ca.json +++ b/homeassistant/components/rachio/.translations/ca.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/de.json b/homeassistant/components/rachio/.translations/de.json index 523e2fc025fd..f3545c119a1a 100644 --- a/homeassistant/components/rachio/.translations/de.json +++ b/homeassistant/components/rachio/.translations/de.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/en.json b/homeassistant/components/rachio/.translations/en.json index d02d1a45d184..364ca15b03f5 100644 --- a/homeassistant/components/rachio/.translations/en.json +++ b/homeassistant/components/rachio/.translations/en.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/es.json b/homeassistant/components/rachio/.translations/es.json index 05c291e9d13d..ee7bdfeb26d8 100644 --- a/homeassistant/components/rachio/.translations/es.json +++ b/homeassistant/components/rachio/.translations/es.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/fr.json b/homeassistant/components/rachio/.translations/fr.json index ea2b760cb9ce..2278c7d3e1b7 100644 --- a/homeassistant/components/rachio/.translations/fr.json +++ b/homeassistant/components/rachio/.translations/fr.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/it.json b/homeassistant/components/rachio/.translations/it.json index 96d6cec104f1..5a9c7618b006 100644 --- a/homeassistant/components/rachio/.translations/it.json +++ b/homeassistant/components/rachio/.translations/it.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ko.json b/homeassistant/components/rachio/.translations/ko.json index 373a30c435a2..1c3c8120d3b5 100644 --- a/homeassistant/components/rachio/.translations/ko.json +++ b/homeassistant/components/rachio/.translations/ko.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/lb.json b/homeassistant/components/rachio/.translations/lb.json index b2abd3fb201e..1fbe2c7c1542 100644 --- a/homeassistant/components/rachio/.translations/lb.json +++ b/homeassistant/components/rachio/.translations/lb.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/no.json b/homeassistant/components/rachio/.translations/no.json index 06fe7d4117ed..84872e894340 100644 --- a/homeassistant/components/rachio/.translations/no.json +++ b/homeassistant/components/rachio/.translations/no.json @@ -26,6 +26,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/pl.json b/homeassistant/components/rachio/.translations/pl.json index 789893b5974d..9d68b88d0151 100644 --- a/homeassistant/components/rachio/.translations/pl.json +++ b/homeassistant/components/rachio/.translations/pl.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/ru.json b/homeassistant/components/rachio/.translations/ru.json index 6d51f68a4d31..fce3d6d3a146 100644 --- a/homeassistant/components/rachio/.translations/ru.json +++ b/homeassistant/components/rachio/.translations/ru.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/sl.json b/homeassistant/components/rachio/.translations/sl.json index f7a6b7ea6269..a7febddee051 100644 --- a/homeassistant/components/rachio/.translations/sl.json +++ b/homeassistant/components/rachio/.translations/sl.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rachio/.translations/zh-Hant.json b/homeassistant/components/rachio/.translations/zh-Hant.json index ac162b546f4c..59e5115e2e64 100644 --- a/homeassistant/components/rachio/.translations/zh-Hant.json +++ b/homeassistant/components/rachio/.translations/zh-Hant.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Rachio" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/bg.json b/homeassistant/components/rainmachine/.translations/bg.json index 6aecb4703dca..a31785cad00a 100644 --- a/homeassistant/components/rainmachine/.translations/bg.json +++ b/homeassistant/components/rainmachine/.translations/bg.json @@ -14,6 +14,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ca.json b/homeassistant/components/rainmachine/.translations/ca.json index f21909d21cb8..37d842355c0f 100644 --- a/homeassistant/components/rainmachine/.translations/ca.json +++ b/homeassistant/components/rainmachine/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Introdueix la teva informaci\u00f3" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/cs.json b/homeassistant/components/rainmachine/.translations/cs.json index 010dc5ca95ad..2b63decf0c3b 100644 --- a/homeassistant/components/rainmachine/.translations/cs.json +++ b/homeassistant/components/rainmachine/.translations/cs.json @@ -14,6 +14,5 @@ "title": "Vypl\u0148te va\u0161e \u00fadaje" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/da.json b/homeassistant/components/rainmachine/.translations/da.json index 3fd8027fabad..a9b2fcedd2f0 100644 --- a/homeassistant/components/rainmachine/.translations/da.json +++ b/homeassistant/components/rainmachine/.translations/da.json @@ -17,6 +17,5 @@ "title": "Udfyld dine oplysninger" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/de.json b/homeassistant/components/rainmachine/.translations/de.json index 385fae5edd5c..35cd1d1bbf50 100644 --- a/homeassistant/components/rainmachine/.translations/de.json +++ b/homeassistant/components/rainmachine/.translations/de.json @@ -17,6 +17,5 @@ "title": "Informationen eingeben" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/en.json b/homeassistant/components/rainmachine/.translations/en.json index a753548a77e1..aabe3d352935 100644 --- a/homeassistant/components/rainmachine/.translations/en.json +++ b/homeassistant/components/rainmachine/.translations/en.json @@ -17,6 +17,5 @@ "title": "Fill in your information" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/es-419.json b/homeassistant/components/rainmachine/.translations/es-419.json index 793069852005..73da8c7c1d4f 100644 --- a/homeassistant/components/rainmachine/.translations/es-419.json +++ b/homeassistant/components/rainmachine/.translations/es-419.json @@ -14,6 +14,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/es.json b/homeassistant/components/rainmachine/.translations/es.json index 8375483af063..0767c509bf9b 100644 --- a/homeassistant/components/rainmachine/.translations/es.json +++ b/homeassistant/components/rainmachine/.translations/es.json @@ -17,6 +17,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/fr.json b/homeassistant/components/rainmachine/.translations/fr.json index b5918917e330..34c769faac79 100644 --- a/homeassistant/components/rainmachine/.translations/fr.json +++ b/homeassistant/components/rainmachine/.translations/fr.json @@ -17,6 +17,5 @@ "title": "Veuillez saisir vos informations" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/hu.json b/homeassistant/components/rainmachine/.translations/hu.json index fda712f0ba91..8f5b985bfe9c 100644 --- a/homeassistant/components/rainmachine/.translations/hu.json +++ b/homeassistant/components/rainmachine/.translations/hu.json @@ -14,6 +14,5 @@ "title": "T\u00f6ltsd ki az adataid" } } - }, - "title": "Rainmachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/it.json b/homeassistant/components/rainmachine/.translations/it.json index a8f1a65a3661..5ec522c9c24a 100644 --- a/homeassistant/components/rainmachine/.translations/it.json +++ b/homeassistant/components/rainmachine/.translations/it.json @@ -17,6 +17,5 @@ "title": "Inserisci i tuoi dati" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ko.json b/homeassistant/components/rainmachine/.translations/ko.json index 121d885c9fa3..30d7fc109799 100644 --- a/homeassistant/components/rainmachine/.translations/ko.json +++ b/homeassistant/components/rainmachine/.translations/ko.json @@ -17,6 +17,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc785\ub825" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/lb.json b/homeassistant/components/rainmachine/.translations/lb.json index 6debf4ffb847..fe0b3bc00912 100644 --- a/homeassistant/components/rainmachine/.translations/lb.json +++ b/homeassistant/components/rainmachine/.translations/lb.json @@ -17,6 +17,5 @@ "title": "F\u00ebllt \u00e4r Informatiounen aus" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/nl.json b/homeassistant/components/rainmachine/.translations/nl.json index 2f6e4e14bf80..545d0ded4659 100644 --- a/homeassistant/components/rainmachine/.translations/nl.json +++ b/homeassistant/components/rainmachine/.translations/nl.json @@ -14,6 +14,5 @@ "title": "Vul uw gegevens in" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/no.json b/homeassistant/components/rainmachine/.translations/no.json index 7e36e6dd4f1b..bc80cdedb310 100644 --- a/homeassistant/components/rainmachine/.translations/no.json +++ b/homeassistant/components/rainmachine/.translations/no.json @@ -17,6 +17,5 @@ "title": "Fyll ut informasjonen din" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pl.json b/homeassistant/components/rainmachine/.translations/pl.json index 01e43f011cda..8ea3ab6dbc46 100644 --- a/homeassistant/components/rainmachine/.translations/pl.json +++ b/homeassistant/components/rainmachine/.translations/pl.json @@ -17,6 +17,5 @@ "title": "Wprowad\u017a dane" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pt-BR.json b/homeassistant/components/rainmachine/.translations/pt-BR.json index 1654b40f9b93..8b78ef25eb3a 100644 --- a/homeassistant/components/rainmachine/.translations/pt-BR.json +++ b/homeassistant/components/rainmachine/.translations/pt-BR.json @@ -14,6 +14,5 @@ "title": "Preencha suas informa\u00e7\u00f5es" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/pt.json b/homeassistant/components/rainmachine/.translations/pt.json index 6dc636f9af59..3bd58fccc2fa 100644 --- a/homeassistant/components/rainmachine/.translations/pt.json +++ b/homeassistant/components/rainmachine/.translations/pt.json @@ -14,6 +14,5 @@ "title": "Preencha as suas informa\u00e7\u00f5es" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/ru.json b/homeassistant/components/rainmachine/.translations/ru.json index 229db9e6b1ee..cd5e3d85d50c 100644 --- a/homeassistant/components/rainmachine/.translations/ru.json +++ b/homeassistant/components/rainmachine/.translations/ru.json @@ -17,6 +17,5 @@ "title": "RainMachine" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/sl.json b/homeassistant/components/rainmachine/.translations/sl.json index ae13a03b08b8..e34b14b2a979 100644 --- a/homeassistant/components/rainmachine/.translations/sl.json +++ b/homeassistant/components/rainmachine/.translations/sl.json @@ -17,6 +17,5 @@ "title": "Izpolnite svoje podatke" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/sv.json b/homeassistant/components/rainmachine/.translations/sv.json index 985f2cbfce1d..a41d65fd09f3 100644 --- a/homeassistant/components/rainmachine/.translations/sv.json +++ b/homeassistant/components/rainmachine/.translations/sv.json @@ -17,6 +17,5 @@ "title": "Fyll i dina uppgifter" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/zh-Hans.json b/homeassistant/components/rainmachine/.translations/zh-Hans.json index ac2a895f7b42..e7171ca28672 100644 --- a/homeassistant/components/rainmachine/.translations/zh-Hans.json +++ b/homeassistant/components/rainmachine/.translations/zh-Hans.json @@ -14,6 +14,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/rainmachine/.translations/zh-Hant.json b/homeassistant/components/rainmachine/.translations/zh-Hant.json index 9c27fa443a4f..d6c022cd5ce5 100644 --- a/homeassistant/components/rainmachine/.translations/zh-Hant.json +++ b/homeassistant/components/rainmachine/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u586b\u5beb\u8cc7\u8a0a" } } - }, - "title": "RainMachine" + } } \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/af.json b/homeassistant/components/remote/.translations/af.json new file mode 100644 index 000000000000..f09523e44314 --- /dev/null +++ b/homeassistant/components/remote/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Afgele\u00eb" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ar.json b/homeassistant/components/remote/.translations/ar.json new file mode 100644 index 000000000000..be3fa50d1af2 --- /dev/null +++ b/homeassistant/components/remote/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062a\u062d\u0643\u0645 \u0639\u0646 \u0628\u0639\u062f" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/bg.json b/homeassistant/components/remote/.translations/bg.json new file mode 100644 index 000000000000..a2c975707626 --- /dev/null +++ b/homeassistant/components/remote/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0414\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u043e\u043d\u043d\u043e" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/bs.json b/homeassistant/components/remote/.translations/bs.json new file mode 100644 index 000000000000..4ba22a7ea8d4 --- /dev/null +++ b/homeassistant/components/remote/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Daljinski" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ca.json b/homeassistant/components/remote/.translations/ca.json new file mode 100644 index 000000000000..6435b122f04b --- /dev/null +++ b/homeassistant/components/remote/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Comandaments" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/cs.json b/homeassistant/components/remote/.translations/cs.json new file mode 100644 index 000000000000..57b03d575354 --- /dev/null +++ b/homeassistant/components/remote/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "D\u00e1lkov\u00e9" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/cy.json b/homeassistant/components/remote/.translations/cy.json new file mode 100644 index 000000000000..f353bce2db7d --- /dev/null +++ b/homeassistant/components/remote/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Symudol" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/da.json b/homeassistant/components/remote/.translations/da.json new file mode 100644 index 000000000000..57ff8549367f --- /dev/null +++ b/homeassistant/components/remote/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Fjernbetjening" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/de.json b/homeassistant/components/remote/.translations/de.json new file mode 100644 index 000000000000..ae5de70d8977 --- /dev/null +++ b/homeassistant/components/remote/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Fernbedienung" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/el.json b/homeassistant/components/remote/.translations/el.json new file mode 100644 index 000000000000..343216914542 --- /dev/null +++ b/homeassistant/components/remote/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a4\u03b7\u03bb\u03b5\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/en.json b/homeassistant/components/remote/.translations/en.json new file mode 100644 index 000000000000..3e199a8d15d1 --- /dev/null +++ b/homeassistant/components/remote/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Remote" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/es-419.json b/homeassistant/components/remote/.translations/es-419.json new file mode 100644 index 000000000000..cca90650a6d7 --- /dev/null +++ b/homeassistant/components/remote/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Remoto" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/es.json b/homeassistant/components/remote/.translations/es.json new file mode 100644 index 000000000000..cca90650a6d7 --- /dev/null +++ b/homeassistant/components/remote/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Remoto" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/et.json b/homeassistant/components/remote/.translations/et.json new file mode 100644 index 000000000000..a66a0f1b241f --- /dev/null +++ b/homeassistant/components/remote/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Kaugjuhtimispult" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/eu.json b/homeassistant/components/remote/.translations/eu.json new file mode 100644 index 000000000000..2fc0fdcf3f97 --- /dev/null +++ b/homeassistant/components/remote/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Urrunekoa" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/fi.json b/homeassistant/components/remote/.translations/fi.json new file mode 100644 index 000000000000..ce40f1ee1f34 --- /dev/null +++ b/homeassistant/components/remote/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kauko-ohjaus" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/fr.json b/homeassistant/components/remote/.translations/fr.json new file mode 100644 index 000000000000..3764168ba27d --- /dev/null +++ b/homeassistant/components/remote/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "T\u00e9l\u00e9commande" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/gsw.json b/homeassistant/components/remote/.translations/gsw.json new file mode 100644 index 000000000000..f9d426a199ea --- /dev/null +++ b/homeassistant/components/remote/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Entfernt" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/he.json b/homeassistant/components/remote/.translations/he.json new file mode 100644 index 000000000000..50a8171d5c9c --- /dev/null +++ b/homeassistant/components/remote/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05b0\u05e8\u05d5\u05bc\u05d7\u05b8\u05e7" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/hi.json b/homeassistant/components/remote/.translations/hi.json new file mode 100644 index 000000000000..b0226f8670bc --- /dev/null +++ b/homeassistant/components/remote/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0930\u093f\u092e\u094b\u091f" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/hr.json b/homeassistant/components/remote/.translations/hr.json new file mode 100644 index 000000000000..4ba22a7ea8d4 --- /dev/null +++ b/homeassistant/components/remote/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Daljinski" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/hu.json b/homeassistant/components/remote/.translations/hu.json new file mode 100644 index 000000000000..e18f1aa76855 --- /dev/null +++ b/homeassistant/components/remote/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "T\u00e1vir\u00e1ny\u00edt\u00e1s" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/hy.json b/homeassistant/components/remote/.translations/hy.json new file mode 100644 index 000000000000..6a7c57de12d6 --- /dev/null +++ b/homeassistant/components/remote/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0540\u0565\u057c\u0561\u057e\u0561\u0580" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/id.json b/homeassistant/components/remote/.translations/id.json new file mode 100644 index 000000000000..b16c336d26c6 --- /dev/null +++ b/homeassistant/components/remote/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Daring" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/is.json b/homeassistant/components/remote/.translations/is.json new file mode 100644 index 000000000000..689006c69915 --- /dev/null +++ b/homeassistant/components/remote/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Fjarst\u00fdring" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/it.json b/homeassistant/components/remote/.translations/it.json new file mode 100644 index 000000000000..1ff748a07a83 --- /dev/null +++ b/homeassistant/components/remote/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Telecomando" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ko.json b/homeassistant/components/remote/.translations/ko.json new file mode 100644 index 000000000000..ba603764304d --- /dev/null +++ b/homeassistant/components/remote/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc6d0\uaca9" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/lb.json b/homeassistant/components/remote/.translations/lb.json new file mode 100644 index 000000000000..3764168ba27d --- /dev/null +++ b/homeassistant/components/remote/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "T\u00e9l\u00e9commande" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/lv.json b/homeassistant/components/remote/.translations/lv.json new file mode 100644 index 000000000000..504763d0b106 --- /dev/null +++ b/homeassistant/components/remote/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "T\u0101lvad\u012bba" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/nb.json b/homeassistant/components/remote/.translations/nb.json new file mode 100644 index 000000000000..ad3dec70b8fa --- /dev/null +++ b/homeassistant/components/remote/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Fjernkontroll" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/nl.json b/homeassistant/components/remote/.translations/nl.json new file mode 100644 index 000000000000..fe18f264f7be --- /dev/null +++ b/homeassistant/components/remote/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Afstandsbediening" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/nn.json b/homeassistant/components/remote/.translations/nn.json new file mode 100644 index 000000000000..ad3dec70b8fa --- /dev/null +++ b/homeassistant/components/remote/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Fjernkontroll" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/pl.json b/homeassistant/components/remote/.translations/pl.json new file mode 100644 index 000000000000..2bb901f00311 --- /dev/null +++ b/homeassistant/components/remote/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Pilot" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/pt-BR.json b/homeassistant/components/remote/.translations/pt-BR.json new file mode 100644 index 000000000000..cca90650a6d7 --- /dev/null +++ b/homeassistant/components/remote/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Remoto" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/pt.json b/homeassistant/components/remote/.translations/pt.json new file mode 100644 index 000000000000..cca90650a6d7 --- /dev/null +++ b/homeassistant/components/remote/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Remoto" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ro.json b/homeassistant/components/remote/.translations/ro.json new file mode 100644 index 000000000000..8fbd1e5bf05a --- /dev/null +++ b/homeassistant/components/remote/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "La distan\u0163\u0103" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ru.json b/homeassistant/components/remote/.translations/ru.json new file mode 100644 index 000000000000..189ff4a1c7a2 --- /dev/null +++ b/homeassistant/components/remote/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0443\u043b\u044c\u0442 \u0414\u0423" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/sk.json b/homeassistant/components/remote/.translations/sk.json new file mode 100644 index 000000000000..ece8b289ff66 --- /dev/null +++ b/homeassistant/components/remote/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Dia\u013ekov\u00e9 ovl\u00e1danie" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/sl.json b/homeassistant/components/remote/.translations/sl.json new file mode 100644 index 000000000000..09ff45911e75 --- /dev/null +++ b/homeassistant/components/remote/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Oddaljeno" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/sv.json b/homeassistant/components/remote/.translations/sv.json new file mode 100644 index 000000000000..1779baf7a07a --- /dev/null +++ b/homeassistant/components/remote/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Fj\u00e4rrkontroll" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/ta.json b/homeassistant/components/remote/.translations/ta.json new file mode 100644 index 000000000000..b61dddc90081 --- /dev/null +++ b/homeassistant/components/remote/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0bb0\u0bbf\u0bae\u0bc7\u0bbe\u0b9f\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/te.json b/homeassistant/components/remote/.translations/te.json new file mode 100644 index 000000000000..ef3632cfd7bd --- /dev/null +++ b/homeassistant/components/remote/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c30\u0c3f\u0c2e\u0c4b\u0c1f\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/th.json b/homeassistant/components/remote/.translations/th.json new file mode 100644 index 000000000000..8158c0b8fbb9 --- /dev/null +++ b/homeassistant/components/remote/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e23\u0e35\u0e42\u0e21\u0e15" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/tr.json b/homeassistant/components/remote/.translations/tr.json new file mode 100644 index 000000000000..969bc6825b7e --- /dev/null +++ b/homeassistant/components/remote/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Uzaktan Kumanda" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/uk.json b/homeassistant/components/remote/.translations/uk.json new file mode 100644 index 000000000000..189ff4a1c7a2 --- /dev/null +++ b/homeassistant/components/remote/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0443\u043b\u044c\u0442 \u0414\u0423" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/vi.json b/homeassistant/components/remote/.translations/vi.json new file mode 100644 index 000000000000..94a0d38c1bf8 --- /dev/null +++ b/homeassistant/components/remote/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0110K T\u1eeb xa" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/zh-Hans.json b/homeassistant/components/remote/.translations/zh-Hans.json new file mode 100644 index 000000000000..6db6e92c4722 --- /dev/null +++ b/homeassistant/components/remote/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u9065\u63a7" +} \ No newline at end of file diff --git a/homeassistant/components/remote/.translations/zh-Hant.json b/homeassistant/components/remote/.translations/zh-Hant.json new file mode 100644 index 000000000000..842392580adc --- /dev/null +++ b/homeassistant/components/remote/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u9059\u63a7" +} \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ca.json b/homeassistant/components/ring/.translations/ca.json index 77e8a7db602b..bcd3bd43af4f 100644 --- a/homeassistant/components/ring/.translations/ca.json +++ b/homeassistant/components/ring/.translations/ca.json @@ -22,6 +22,5 @@ "title": "Inici de sessi\u00f3 amb un compte de Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/da.json b/homeassistant/components/ring/.translations/da.json index 983bdf0a802d..297e8b4037bc 100644 --- a/homeassistant/components/ring/.translations/da.json +++ b/homeassistant/components/ring/.translations/da.json @@ -22,6 +22,5 @@ "title": "Log ind med Ring-konto" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/de.json b/homeassistant/components/ring/.translations/de.json index ce7938ac7051..70463961dd6e 100644 --- a/homeassistant/components/ring/.translations/de.json +++ b/homeassistant/components/ring/.translations/de.json @@ -22,6 +22,5 @@ "title": "Anmeldung mit Ring-Konto" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/en.json b/homeassistant/components/ring/.translations/en.json index b30711c49c59..79323e41bbee 100644 --- a/homeassistant/components/ring/.translations/en.json +++ b/homeassistant/components/ring/.translations/en.json @@ -22,6 +22,5 @@ "title": "Sign-in with Ring account" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/es.json b/homeassistant/components/ring/.translations/es.json index e9133de022fe..0b5d31869cea 100644 --- a/homeassistant/components/ring/.translations/es.json +++ b/homeassistant/components/ring/.translations/es.json @@ -22,6 +22,5 @@ "title": "Iniciar sesi\u00f3n con cuenta de Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/fr.json b/homeassistant/components/ring/.translations/fr.json index bd53ba0d4802..01bbd6587c37 100644 --- a/homeassistant/components/ring/.translations/fr.json +++ b/homeassistant/components/ring/.translations/fr.json @@ -22,6 +22,5 @@ "title": "Connectez-vous avec votre compte Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/hu.json b/homeassistant/components/ring/.translations/hu.json index 08d8ed78d2cc..fba6b944222a 100644 --- a/homeassistant/components/ring/.translations/hu.json +++ b/homeassistant/components/ring/.translations/hu.json @@ -22,6 +22,5 @@ "title": "Bejelentkez\u00e9s a Ring fi\u00f3kkal" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/it.json b/homeassistant/components/ring/.translations/it.json index 8ea41520343f..a511f696f895 100644 --- a/homeassistant/components/ring/.translations/it.json +++ b/homeassistant/components/ring/.translations/it.json @@ -22,6 +22,5 @@ "title": "Accedi con l'account Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ko.json b/homeassistant/components/ring/.translations/ko.json index c894277abd0d..caf6d824d0d0 100644 --- a/homeassistant/components/ring/.translations/ko.json +++ b/homeassistant/components/ring/.translations/ko.json @@ -22,6 +22,5 @@ "title": "Ring \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/lb.json b/homeassistant/components/ring/.translations/lb.json index 42267f3b8fc1..17b1edda6b64 100644 --- a/homeassistant/components/ring/.translations/lb.json +++ b/homeassistant/components/ring/.translations/lb.json @@ -22,6 +22,5 @@ "title": "Mam Ring Kont verbannen" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/nl.json b/homeassistant/components/ring/.translations/nl.json index 2091ed0b96a9..08919a056089 100644 --- a/homeassistant/components/ring/.translations/nl.json +++ b/homeassistant/components/ring/.translations/nl.json @@ -22,6 +22,5 @@ "title": "Aanmelden met Ring-account" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/no.json b/homeassistant/components/ring/.translations/no.json index 8bf764ef2240..1a64f0268a6c 100644 --- a/homeassistant/components/ring/.translations/no.json +++ b/homeassistant/components/ring/.translations/no.json @@ -22,6 +22,5 @@ "title": "Logg p\u00e5 med din Ring-konto" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/pl.json b/homeassistant/components/ring/.translations/pl.json index b44d707b476c..319348aa8a27 100644 --- a/homeassistant/components/ring/.translations/pl.json +++ b/homeassistant/components/ring/.translations/pl.json @@ -22,6 +22,5 @@ "title": "Zaloguj si\u0119 do konta Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/ru.json b/homeassistant/components/ring/.translations/ru.json index 82d6644c449b..aa3b383bbce1 100644 --- a/homeassistant/components/ring/.translations/ru.json +++ b/homeassistant/components/ring/.translations/ru.json @@ -22,6 +22,5 @@ "title": "Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/sl.json b/homeassistant/components/ring/.translations/sl.json index d69f926bb014..7a6ae4b2ad76 100644 --- a/homeassistant/components/ring/.translations/sl.json +++ b/homeassistant/components/ring/.translations/sl.json @@ -22,6 +22,5 @@ "title": "Prijava s ra\u010dunom Ring" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/sv.json b/homeassistant/components/ring/.translations/sv.json index a31cbc42b7ec..ecb09354f0d2 100644 --- a/homeassistant/components/ring/.translations/sv.json +++ b/homeassistant/components/ring/.translations/sv.json @@ -22,6 +22,5 @@ "title": "Logga in med Ring-konto" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/ring/.translations/zh-Hant.json b/homeassistant/components/ring/.translations/zh-Hant.json index 05b83631a916..b9a66540c3b4 100644 --- a/homeassistant/components/ring/.translations/zh-Hant.json +++ b/homeassistant/components/ring/.translations/zh-Hant.json @@ -22,6 +22,5 @@ "title": "\u4ee5 Ring \u5e33\u865f\u767b\u5165" } } - }, - "title": "Ring" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ca.json b/homeassistant/components/roku/.translations/ca.json index 4ea988465bf2..60382ca137a2 100644 --- a/homeassistant/components/roku/.translations/ca.json +++ b/homeassistant/components/roku/.translations/ca.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/de.json b/homeassistant/components/roku/.translations/de.json index 7f30d92a63ff..90b30dfafdff 100644 --- a/homeassistant/components/roku/.translations/de.json +++ b/homeassistant/components/roku/.translations/de.json @@ -25,6 +25,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/en.json b/homeassistant/components/roku/.translations/en.json index c3b79973c7b0..07414cc2b3a9 100644 --- a/homeassistant/components/roku/.translations/en.json +++ b/homeassistant/components/roku/.translations/en.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/es.json b/homeassistant/components/roku/.translations/es.json index f6bc4cbd438d..3f190d413312 100644 --- a/homeassistant/components/roku/.translations/es.json +++ b/homeassistant/components/roku/.translations/es.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/fr.json b/homeassistant/components/roku/.translations/fr.json index 073efa65f46f..64c3abf5d1f3 100644 --- a/homeassistant/components/roku/.translations/fr.json +++ b/homeassistant/components/roku/.translations/fr.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/it.json b/homeassistant/components/roku/.translations/it.json index 710f8a003d75..0192c848e097 100644 --- a/homeassistant/components/roku/.translations/it.json +++ b/homeassistant/components/roku/.translations/it.json @@ -25,6 +25,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ko.json b/homeassistant/components/roku/.translations/ko.json index b41e1a3d8b72..7420611936fd 100644 --- a/homeassistant/components/roku/.translations/ko.json +++ b/homeassistant/components/roku/.translations/ko.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/lb.json b/homeassistant/components/roku/.translations/lb.json index 2130d13031fa..8674c6802be9 100644 --- a/homeassistant/components/roku/.translations/lb.json +++ b/homeassistant/components/roku/.translations/lb.json @@ -25,6 +25,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/no.json b/homeassistant/components/roku/.translations/no.json index e9254635a3f8..0f126e6decdc 100644 --- a/homeassistant/components/roku/.translations/no.json +++ b/homeassistant/components/roku/.translations/no.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/pl.json b/homeassistant/components/roku/.translations/pl.json index 92e7bbd796b9..ba81c5b3e7a9 100644 --- a/homeassistant/components/roku/.translations/pl.json +++ b/homeassistant/components/roku/.translations/pl.json @@ -26,6 +26,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/ru.json b/homeassistant/components/roku/.translations/ru.json index 991882ac875a..52a33805e638 100644 --- a/homeassistant/components/roku/.translations/ru.json +++ b/homeassistant/components/roku/.translations/ru.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/sl.json b/homeassistant/components/roku/.translations/sl.json index ce43bbbcd208..fd442881b818 100644 --- a/homeassistant/components/roku/.translations/sl.json +++ b/homeassistant/components/roku/.translations/sl.json @@ -27,6 +27,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roku/.translations/zh-Hant.json b/homeassistant/components/roku/.translations/zh-Hant.json index 1dd9688b332c..5b310b20b634 100644 --- a/homeassistant/components/roku/.translations/zh-Hant.json +++ b/homeassistant/components/roku/.translations/zh-Hant.json @@ -21,6 +21,5 @@ "title": "Roku" } } - }, - "title": "Roku" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/ca.json b/homeassistant/components/roomba/.translations/ca.json index da9de46dc935..a133139a8e94 100644 --- a/homeassistant/components/roomba/.translations/ca.json +++ b/homeassistant/components/roomba/.translations/ca.json @@ -28,6 +28,5 @@ } } } - }, - "title": "Roomba iRobot" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/de.json b/homeassistant/components/roomba/.translations/de.json index 1c85587acc82..a1069936c3e7 100644 --- a/homeassistant/components/roomba/.translations/de.json +++ b/homeassistant/components/roomba/.translations/de.json @@ -27,6 +27,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/en.json b/homeassistant/components/roomba/.translations/en.json index 5d6d5200569a..2a9dcc9973a2 100644 --- a/homeassistant/components/roomba/.translations/en.json +++ b/homeassistant/components/roomba/.translations/en.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/es.json b/homeassistant/components/roomba/.translations/es.json index 2c51f1d15c15..28539c8fd5f5 100644 --- a/homeassistant/components/roomba/.translations/es.json +++ b/homeassistant/components/roomba/.translations/es.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/it.json b/homeassistant/components/roomba/.translations/it.json index fa58cfde3c19..042959a67c44 100644 --- a/homeassistant/components/roomba/.translations/it.json +++ b/homeassistant/components/roomba/.translations/it.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/no.json b/homeassistant/components/roomba/.translations/no.json index 5217518cdf0c..c145637a6561 100644 --- a/homeassistant/components/roomba/.translations/no.json +++ b/homeassistant/components/roomba/.translations/no.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/pt.json b/homeassistant/components/roomba/.translations/pt.json new file mode 100644 index 000000000000..b063d57eb397 --- /dev/null +++ b/homeassistant/components/roomba/.translations/pt.json @@ -0,0 +1,30 @@ +{ + "config": { + "error": { + "cannot_connect": "Falha ao conectar, tente novamente", + "unknown": "Erro inesperado" + }, + "step": { + "user": { + "data": { + "certificate": "Certificado", + "continuous": "Cont\u00ednuo", + "delay": "Atraso", + "host": "Nome servidor ou endere\u00e7o IP", + "password": "Palavra-passe" + }, + "title": "Conectar ao dispositivo" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Cont\u00ednuo", + "delay": "Atraso" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/ru.json b/homeassistant/components/roomba/.translations/ru.json index 1ac6ad5996ec..2eaab685d201 100644 --- a/homeassistant/components/roomba/.translations/ru.json +++ b/homeassistant/components/roomba/.translations/ru.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/sl.json b/homeassistant/components/roomba/.translations/sl.json new file mode 100644 index 000000000000..4b834d05fc88 --- /dev/null +++ b/homeassistant/components/roomba/.translations/sl.json @@ -0,0 +1,32 @@ +{ + "config": { + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "blid": "BLID", + "certificate": "Potrdilo", + "continuous": "Nenehno", + "delay": "Zamik", + "host": "Ime gostitelja ali naslov IP", + "password": "Geslo" + }, + "description": "Trenutno je pridobivanje BLID-a in gesla ro\u010dni postopek. Upo\u0161tevajte korake opisane v dokumentaciji na: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", + "title": "Pove\u017eite se z napravo" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "continuous": "Nenehno", + "delay": "Zamik" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/roomba/.translations/zh-Hant.json b/homeassistant/components/roomba/.translations/zh-Hant.json index 2caa4455a91a..b06d7d53f2ab 100644 --- a/homeassistant/components/roomba/.translations/zh-Hant.json +++ b/homeassistant/components/roomba/.translations/zh-Hant.json @@ -28,6 +28,5 @@ } } } - }, - "title": "iRobot Roomba" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ca.json b/homeassistant/components/samsungtv/.translations/ca.json index 0506560e61cc..1a0311d08005 100644 --- a/homeassistant/components/samsungtv/.translations/ca.json +++ b/homeassistant/components/samsungtv/.translations/ca.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/da.json b/homeassistant/components/samsungtv/.translations/da.json index 9b20b711554f..ec83db6aab89 100644 --- a/homeassistant/components/samsungtv/.translations/da.json +++ b/homeassistant/components/samsungtv/.translations/da.json @@ -22,6 +22,5 @@ "title": "Samsung-tv" } } - }, - "title": "Samsung-tv" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/de.json b/homeassistant/components/samsungtv/.translations/de.json index 5c8a491f6a75..026f00a8cb2d 100644 --- a/homeassistant/components/samsungtv/.translations/de.json +++ b/homeassistant/components/samsungtv/.translations/de.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/en.json b/homeassistant/components/samsungtv/.translations/en.json index 55fc24154f04..53a5cd4d0617 100644 --- a/homeassistant/components/samsungtv/.translations/en.json +++ b/homeassistant/components/samsungtv/.translations/en.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/es.json b/homeassistant/components/samsungtv/.translations/es.json index e23c5cdbbab2..fc997b4974d1 100644 --- a/homeassistant/components/samsungtv/.translations/es.json +++ b/homeassistant/components/samsungtv/.translations/es.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/fr.json b/homeassistant/components/samsungtv/.translations/fr.json index 344110ed1a91..e37b3104b1c7 100644 --- a/homeassistant/components/samsungtv/.translations/fr.json +++ b/homeassistant/components/samsungtv/.translations/fr.json @@ -22,6 +22,5 @@ "title": "TV Samsung" } } - }, - "title": "TV Samsung" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/hu.json b/homeassistant/components/samsungtv/.translations/hu.json index 5fd2f8b768b2..f6f09dab4eed 100644 --- a/homeassistant/components/samsungtv/.translations/hu.json +++ b/homeassistant/components/samsungtv/.translations/hu.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/it.json b/homeassistant/components/samsungtv/.translations/it.json index 6b4548ba4fcb..7b62a48e62fc 100644 --- a/homeassistant/components/samsungtv/.translations/it.json +++ b/homeassistant/components/samsungtv/.translations/it.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ko.json b/homeassistant/components/samsungtv/.translations/ko.json index 3ab32508ce3d..228c8b1f71e5 100644 --- a/homeassistant/components/samsungtv/.translations/ko.json +++ b/homeassistant/components/samsungtv/.translations/ko.json @@ -22,6 +22,5 @@ "title": "\uc0bc\uc131 TV" } } - }, - "title": "\uc0bc\uc131 TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/lb.json b/homeassistant/components/samsungtv/.translations/lb.json index dfce3978ad6f..8e54495a1b8a 100644 --- a/homeassistant/components/samsungtv/.translations/lb.json +++ b/homeassistant/components/samsungtv/.translations/lb.json @@ -22,6 +22,5 @@ "title": "Samsnung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/nl.json b/homeassistant/components/samsungtv/.translations/nl.json index 4b2049023896..2760ec7a1810 100644 --- a/homeassistant/components/samsungtv/.translations/nl.json +++ b/homeassistant/components/samsungtv/.translations/nl.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/no.json b/homeassistant/components/samsungtv/.translations/no.json index 5218982315ed..9240842ff978 100644 --- a/homeassistant/components/samsungtv/.translations/no.json +++ b/homeassistant/components/samsungtv/.translations/no.json @@ -22,6 +22,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/pl.json b/homeassistant/components/samsungtv/.translations/pl.json index d0e2e0f6171e..1124b5335a89 100644 --- a/homeassistant/components/samsungtv/.translations/pl.json +++ b/homeassistant/components/samsungtv/.translations/pl.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/ru.json b/homeassistant/components/samsungtv/.translations/ru.json index 15e05bd376ea..ab1135498cf5 100644 --- a/homeassistant/components/samsungtv/.translations/ru.json +++ b/homeassistant/components/samsungtv/.translations/ru.json @@ -22,6 +22,5 @@ "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Samsung" } } - }, - "title": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 Samsung" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/sl.json b/homeassistant/components/samsungtv/.translations/sl.json index 0de30aa5ffd7..f147edad4d9b 100644 --- a/homeassistant/components/samsungtv/.translations/sl.json +++ b/homeassistant/components/samsungtv/.translations/sl.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/sv.json b/homeassistant/components/samsungtv/.translations/sv.json index 619dbf8dc801..ce75d775f143 100644 --- a/homeassistant/components/samsungtv/.translations/sv.json +++ b/homeassistant/components/samsungtv/.translations/sv.json @@ -22,6 +22,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/tr.json b/homeassistant/components/samsungtv/.translations/tr.json index fb9a6399c6ff..3246b833382c 100644 --- a/homeassistant/components/samsungtv/.translations/tr.json +++ b/homeassistant/components/samsungtv/.translations/tr.json @@ -18,6 +18,5 @@ "title": "Samsung TV" } } - }, - "title": "Samsung TV" + } } \ No newline at end of file diff --git a/homeassistant/components/samsungtv/.translations/zh-Hant.json b/homeassistant/components/samsungtv/.translations/zh-Hant.json index a44be6c5d7e9..ac440b1225c3 100644 --- a/homeassistant/components/samsungtv/.translations/zh-Hant.json +++ b/homeassistant/components/samsungtv/.translations/zh-Hant.json @@ -22,6 +22,5 @@ "title": "\u4e09\u661f\u96fb\u8996" } } - }, - "title": "\u4e09\u661f\u96fb\u8996" + } } \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/af.json b/homeassistant/components/scene/.translations/af.json new file mode 100644 index 000000000000..c200e2866080 --- /dev/null +++ b/homeassistant/components/scene/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Toneel" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ar.json b/homeassistant/components/scene/.translations/ar.json new file mode 100644 index 000000000000..c5f684d24cef --- /dev/null +++ b/homeassistant/components/scene/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0634\u0647\u062f" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/bg.json b/homeassistant/components/scene/.translations/bg.json new file mode 100644 index 000000000000..41f87cddbce1 --- /dev/null +++ b/homeassistant/components/scene/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0446\u0435\u043d\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/bs.json b/homeassistant/components/scene/.translations/bs.json new file mode 100644 index 000000000000..5f89ee79ab94 --- /dev/null +++ b/homeassistant/components/scene/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Scena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ca.json b/homeassistant/components/scene/.translations/ca.json new file mode 100644 index 000000000000..744d02a54b25 --- /dev/null +++ b/homeassistant/components/scene/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Escenes" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/cs.json b/homeassistant/components/scene/.translations/cs.json new file mode 100644 index 000000000000..b0c79f52277f --- /dev/null +++ b/homeassistant/components/scene/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Sc\u00e9na" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/cy.json b/homeassistant/components/scene/.translations/cy.json new file mode 100644 index 000000000000..5c3577c5ec0d --- /dev/null +++ b/homeassistant/components/scene/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Golygfa" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/da.json b/homeassistant/components/scene/.translations/da.json new file mode 100644 index 000000000000..827c0c81f380 --- /dev/null +++ b/homeassistant/components/scene/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Scene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/de.json b/homeassistant/components/scene/.translations/de.json new file mode 100644 index 000000000000..2130b6acd809 --- /dev/null +++ b/homeassistant/components/scene/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Szene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/el.json b/homeassistant/components/scene/.translations/el.json new file mode 100644 index 000000000000..8f639975a713 --- /dev/null +++ b/homeassistant/components/scene/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a3\u03ba\u03b7\u03bd\u03ae" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/en.json b/homeassistant/components/scene/.translations/en.json new file mode 100644 index 000000000000..827c0c81f380 --- /dev/null +++ b/homeassistant/components/scene/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Scene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/es-419.json b/homeassistant/components/scene/.translations/es-419.json new file mode 100644 index 000000000000..92aa6caa0993 --- /dev/null +++ b/homeassistant/components/scene/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Escena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/es.json b/homeassistant/components/scene/.translations/es.json new file mode 100644 index 000000000000..92aa6caa0993 --- /dev/null +++ b/homeassistant/components/scene/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Escena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/et.json b/homeassistant/components/scene/.translations/et.json new file mode 100644 index 000000000000..8f5f2b4ad540 --- /dev/null +++ b/homeassistant/components/scene/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Stseen" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/eu.json b/homeassistant/components/scene/.translations/eu.json new file mode 100644 index 000000000000..cb6365c8bb07 --- /dev/null +++ b/homeassistant/components/scene/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Eszena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/fa.json b/homeassistant/components/scene/.translations/fa.json new file mode 100644 index 000000000000..de5c94387a4d --- /dev/null +++ b/homeassistant/components/scene/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0635\u062d\u0646\u0647" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/fi.json b/homeassistant/components/scene/.translations/fi.json new file mode 100644 index 000000000000..7ad8bb6b9f2c --- /dev/null +++ b/homeassistant/components/scene/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Skene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/fr.json b/homeassistant/components/scene/.translations/fr.json new file mode 100644 index 000000000000..3f93fa351935 --- /dev/null +++ b/homeassistant/components/scene/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Sc\u00e8ne" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/gsw.json b/homeassistant/components/scene/.translations/gsw.json new file mode 100644 index 000000000000..2130b6acd809 --- /dev/null +++ b/homeassistant/components/scene/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Szene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/he.json b/homeassistant/components/scene/.translations/he.json new file mode 100644 index 000000000000..569260601dcc --- /dev/null +++ b/homeassistant/components/scene/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e1\u05e6\u05e0\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/hi.json b/homeassistant/components/scene/.translations/hi.json new file mode 100644 index 000000000000..daf2ad0558d7 --- /dev/null +++ b/homeassistant/components/scene/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0926\u0943\u0936\u094d\u092f" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/hr.json b/homeassistant/components/scene/.translations/hr.json new file mode 100644 index 000000000000..5f89ee79ab94 --- /dev/null +++ b/homeassistant/components/scene/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Scena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/hu.json b/homeassistant/components/scene/.translations/hu.json new file mode 100644 index 000000000000..11082f7da452 --- /dev/null +++ b/homeassistant/components/scene/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Jelenet" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/hy.json b/homeassistant/components/scene/.translations/hy.json new file mode 100644 index 000000000000..61c147c0657e --- /dev/null +++ b/homeassistant/components/scene/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054f\u0565\u057d\u0561\u0580\u0561\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/id.json b/homeassistant/components/scene/.translations/id.json new file mode 100644 index 000000000000..65f2adf73253 --- /dev/null +++ b/homeassistant/components/scene/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Adegan" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/is.json b/homeassistant/components/scene/.translations/is.json new file mode 100644 index 000000000000..e52751789ed4 --- /dev/null +++ b/homeassistant/components/scene/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Sena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/it.json b/homeassistant/components/scene/.translations/it.json new file mode 100644 index 000000000000..5f89ee79ab94 --- /dev/null +++ b/homeassistant/components/scene/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Scena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ko.json b/homeassistant/components/scene/.translations/ko.json new file mode 100644 index 000000000000..a5e3ad224870 --- /dev/null +++ b/homeassistant/components/scene/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc52c" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/lb.json b/homeassistant/components/scene/.translations/lb.json new file mode 100644 index 000000000000..8fdfc4c97f23 --- /dev/null +++ b/homeassistant/components/scene/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Zeen" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/lv.json b/homeassistant/components/scene/.translations/lv.json new file mode 100644 index 000000000000..e2d73434c3d3 --- /dev/null +++ b/homeassistant/components/scene/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Si\u017eets" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/nb.json b/homeassistant/components/scene/.translations/nb.json new file mode 100644 index 000000000000..827c0c81f380 --- /dev/null +++ b/homeassistant/components/scene/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Scene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/nl.json b/homeassistant/components/scene/.translations/nl.json new file mode 100644 index 000000000000..3f93fa351935 --- /dev/null +++ b/homeassistant/components/scene/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Sc\u00e8ne" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/nn.json b/homeassistant/components/scene/.translations/nn.json new file mode 100644 index 000000000000..827c0c81f380 --- /dev/null +++ b/homeassistant/components/scene/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Scene" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/pl.json b/homeassistant/components/scene/.translations/pl.json new file mode 100644 index 000000000000..5f89ee79ab94 --- /dev/null +++ b/homeassistant/components/scene/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Scena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/pt-BR.json b/homeassistant/components/scene/.translations/pt-BR.json new file mode 100644 index 000000000000..372fcc493b76 --- /dev/null +++ b/homeassistant/components/scene/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Cena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/pt.json b/homeassistant/components/scene/.translations/pt.json new file mode 100644 index 000000000000..372fcc493b76 --- /dev/null +++ b/homeassistant/components/scene/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Cena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ro.json b/homeassistant/components/scene/.translations/ro.json new file mode 100644 index 000000000000..c9251c3ad260 --- /dev/null +++ b/homeassistant/components/scene/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Scen\u0103" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ru.json b/homeassistant/components/scene/.translations/ru.json new file mode 100644 index 000000000000..41f87cddbce1 --- /dev/null +++ b/homeassistant/components/scene/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0446\u0435\u043d\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/sk.json b/homeassistant/components/scene/.translations/sk.json new file mode 100644 index 000000000000..b0c79f52277f --- /dev/null +++ b/homeassistant/components/scene/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Sc\u00e9na" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/sl.json b/homeassistant/components/scene/.translations/sl.json new file mode 100644 index 000000000000..5f89ee79ab94 --- /dev/null +++ b/homeassistant/components/scene/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Scena" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/sv.json b/homeassistant/components/scene/.translations/sv.json new file mode 100644 index 000000000000..15a1f9b15423 --- /dev/null +++ b/homeassistant/components/scene/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Scenario" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/ta.json b/homeassistant/components/scene/.translations/ta.json new file mode 100644 index 000000000000..9669feac1142 --- /dev/null +++ b/homeassistant/components/scene/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b95\u0bbe\u0b9f\u0bcd\u0b9a\u0bbf" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/te.json b/homeassistant/components/scene/.translations/te.json new file mode 100644 index 000000000000..ec57d754113f --- /dev/null +++ b/homeassistant/components/scene/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c26\u0c43\u0c36\u0c4d\u0c2f\u0c02" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/th.json b/homeassistant/components/scene/.translations/th.json new file mode 100644 index 000000000000..493d0700ee12 --- /dev/null +++ b/homeassistant/components/scene/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e09\u0e32\u0e01" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/tr.json b/homeassistant/components/scene/.translations/tr.json new file mode 100644 index 000000000000..05cedace9011 --- /dev/null +++ b/homeassistant/components/scene/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Senaryo" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/uk.json b/homeassistant/components/scene/.translations/uk.json new file mode 100644 index 000000000000..41f87cddbce1 --- /dev/null +++ b/homeassistant/components/scene/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0446\u0435\u043d\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/vi.json b/homeassistant/components/scene/.translations/vi.json new file mode 100644 index 000000000000..74aadbed7179 --- /dev/null +++ b/homeassistant/components/scene/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "B\u1ed1i c\u1ea3nh" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/zh-Hans.json b/homeassistant/components/scene/.translations/zh-Hans.json new file mode 100644 index 000000000000..07f890d41de1 --- /dev/null +++ b/homeassistant/components/scene/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u573a\u666f" +} \ No newline at end of file diff --git a/homeassistant/components/scene/.translations/zh-Hant.json b/homeassistant/components/scene/.translations/zh-Hant.json new file mode 100644 index 000000000000..b05878668ab8 --- /dev/null +++ b/homeassistant/components/scene/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u5834\u666f" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/af.json b/homeassistant/components/script/.translations/af.json new file mode 100644 index 000000000000..af1125a367c8 --- /dev/null +++ b/homeassistant/components/script/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Skrip" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ar.json b/homeassistant/components/script/.translations/ar.json new file mode 100644 index 000000000000..9caee964226b --- /dev/null +++ b/homeassistant/components/script/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0646\u0635 \u0622\u0644\u064a" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/bg.json b/homeassistant/components/script/.translations/bg.json new file mode 100644 index 000000000000..986bddec9987 --- /dev/null +++ b/homeassistant/components/script/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u043a\u0440\u0438\u043f\u0442" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/bs.json b/homeassistant/components/script/.translations/bs.json new file mode 100644 index 000000000000..a884d82d265c --- /dev/null +++ b/homeassistant/components/script/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Skripta" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ca.json b/homeassistant/components/script/.translations/ca.json new file mode 100644 index 000000000000..703522827818 --- /dev/null +++ b/homeassistant/components/script/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Programes (scripts)" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/cs.json b/homeassistant/components/script/.translations/cs.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/cy.json b/homeassistant/components/script/.translations/cy.json new file mode 100644 index 000000000000..181420eb11b6 --- /dev/null +++ b/homeassistant/components/script/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Sgript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/da.json b/homeassistant/components/script/.translations/da.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/de.json b/homeassistant/components/script/.translations/de.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/el.json b/homeassistant/components/script/.translations/el.json new file mode 100644 index 000000000000..ebc54ba093bb --- /dev/null +++ b/homeassistant/components/script/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0394\u03ad\u03c3\u03bc\u03b7 \u03b5\u03bd\u03b5\u03c1\u03b3\u03b5\u03b9\u03ce\u03bd" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/en.json b/homeassistant/components/script/.translations/en.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/es-419.json b/homeassistant/components/script/.translations/es-419.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/es.json b/homeassistant/components/script/.translations/es.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/et.json b/homeassistant/components/script/.translations/et.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/eu.json b/homeassistant/components/script/.translations/eu.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/fa.json b/homeassistant/components/script/.translations/fa.json new file mode 100644 index 000000000000..43eab1daf87e --- /dev/null +++ b/homeassistant/components/script/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/fi.json b/homeassistant/components/script/.translations/fi.json new file mode 100644 index 000000000000..9ec9fbec9fef --- /dev/null +++ b/homeassistant/components/script/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Skripti" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/fr.json b/homeassistant/components/script/.translations/fr.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/gsw.json b/homeassistant/components/script/.translations/gsw.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/he.json b/homeassistant/components/script/.translations/he.json new file mode 100644 index 000000000000..6ea4199b38ca --- /dev/null +++ b/homeassistant/components/script/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05ea\u05b7\u05e1\u05e8\u05b4\u05d9\u05d8" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/hi.json b/homeassistant/components/script/.translations/hi.json new file mode 100644 index 000000000000..06ec52a4c019 --- /dev/null +++ b/homeassistant/components/script/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u094d\u0915\u094d\u0930\u093f\u092a\u094d\u091f" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/hr.json b/homeassistant/components/script/.translations/hr.json new file mode 100644 index 000000000000..a884d82d265c --- /dev/null +++ b/homeassistant/components/script/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Skripta" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/hu.json b/homeassistant/components/script/.translations/hu.json new file mode 100644 index 000000000000..72bd266fcf17 --- /dev/null +++ b/homeassistant/components/script/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Szkript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/hy.json b/homeassistant/components/script/.translations/hy.json new file mode 100644 index 000000000000..48d4e047f057 --- /dev/null +++ b/homeassistant/components/script/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054d\u0581\u0565\u0576\u0561\u0580" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/id.json b/homeassistant/components/script/.translations/id.json new file mode 100644 index 000000000000..af1125a367c8 --- /dev/null +++ b/homeassistant/components/script/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Skrip" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/is.json b/homeassistant/components/script/.translations/is.json new file mode 100644 index 000000000000..15ff39db1d18 --- /dev/null +++ b/homeassistant/components/script/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Skrifta" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/it.json b/homeassistant/components/script/.translations/it.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ja.json b/homeassistant/components/script/.translations/ja.json new file mode 100644 index 000000000000..635c0cd83114 --- /dev/null +++ b/homeassistant/components/script/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30b9\u30af\u30ea\u30d7\u30c8" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ko.json b/homeassistant/components/script/.translations/ko.json new file mode 100644 index 000000000000..6325d0c475e4 --- /dev/null +++ b/homeassistant/components/script/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc2a4\ud06c\ub9bd\ud2b8" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/lb.json b/homeassistant/components/script/.translations/lb.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/lv.json b/homeassistant/components/script/.translations/lv.json new file mode 100644 index 000000000000..70a0ee575764 --- /dev/null +++ b/homeassistant/components/script/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Skripts" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/nb.json b/homeassistant/components/script/.translations/nb.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/nl.json b/homeassistant/components/script/.translations/nl.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/nn.json b/homeassistant/components/script/.translations/nn.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/pl.json b/homeassistant/components/script/.translations/pl.json new file mode 100644 index 000000000000..18e80a08f741 --- /dev/null +++ b/homeassistant/components/script/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Skrypt" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/pt-BR.json b/homeassistant/components/script/.translations/pt-BR.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/pt.json b/homeassistant/components/script/.translations/pt.json new file mode 100644 index 000000000000..caeaf751b81b --- /dev/null +++ b/homeassistant/components/script/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Script" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ro.json b/homeassistant/components/script/.translations/ro.json new file mode 100644 index 000000000000..c15efcf2c02c --- /dev/null +++ b/homeassistant/components/script/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Scenariu" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ru.json b/homeassistant/components/script/.translations/ru.json new file mode 100644 index 000000000000..3a0ec791375a --- /dev/null +++ b/homeassistant/components/script/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/sk.json b/homeassistant/components/script/.translations/sk.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/sl.json b/homeassistant/components/script/.translations/sl.json new file mode 100644 index 000000000000..a884d82d265c --- /dev/null +++ b/homeassistant/components/script/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Skripta" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/sv.json b/homeassistant/components/script/.translations/sv.json new file mode 100644 index 000000000000..5a85cb524ac8 --- /dev/null +++ b/homeassistant/components/script/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Skript" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/ta.json b/homeassistant/components/script/.translations/ta.json new file mode 100644 index 000000000000..f36754b197d4 --- /dev/null +++ b/homeassistant/components/script/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0bb8\u0bcd\u0b95\u0bbf\u0bb0\u0bbf\u0baa\u0bcd\u0b9f\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/te.json b/homeassistant/components/script/.translations/te.json new file mode 100644 index 000000000000..4ea1d180c5d2 --- /dev/null +++ b/homeassistant/components/script/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c4d\u0c15\u0c4d\u0c30\u0c3f\u0c2a\u0c4d\u0c1f\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/th.json b/homeassistant/components/script/.translations/th.json new file mode 100644 index 000000000000..741c377a8494 --- /dev/null +++ b/homeassistant/components/script/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e2a\u0e04\u0e23\u0e34\u0e1b\u0e15\u0e4c" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/tr.json b/homeassistant/components/script/.translations/tr.json new file mode 100644 index 000000000000..05cedace9011 --- /dev/null +++ b/homeassistant/components/script/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Senaryo" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/uk.json b/homeassistant/components/script/.translations/uk.json new file mode 100644 index 000000000000..23ef9b1243d6 --- /dev/null +++ b/homeassistant/components/script/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0446\u0435\u043d\u0430\u0440\u0456\u0439" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/vi.json b/homeassistant/components/script/.translations/vi.json new file mode 100644 index 000000000000..cdc70067941b --- /dev/null +++ b/homeassistant/components/script/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "K\u1ecbch b\u1ea3n" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/zh-Hans.json b/homeassistant/components/script/.translations/zh-Hans.json new file mode 100644 index 000000000000..ae63e4f89e52 --- /dev/null +++ b/homeassistant/components/script/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u811a\u672c" +} \ No newline at end of file diff --git a/homeassistant/components/script/.translations/zh-Hant.json b/homeassistant/components/script/.translations/zh-Hant.json new file mode 100644 index 000000000000..97d4c5820e2c --- /dev/null +++ b/homeassistant/components/script/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u8173\u672c" +} \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ca.json b/homeassistant/components/sense/.translations/ca.json index c9e0b2fd48ba..4b1035607d60 100644 --- a/homeassistant/components/sense/.translations/ca.json +++ b/homeassistant/components/sense/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Connexi\u00f3 amb Sense Energy Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/de.json b/homeassistant/components/sense/.translations/de.json index c448010e5b5d..de9e6877f25a 100644 --- a/homeassistant/components/sense/.translations/de.json +++ b/homeassistant/components/sense/.translations/de.json @@ -17,6 +17,5 @@ "title": "Stellen Sie eine Verbindung zu Ihrem Sense Energy Monitor her" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/en.json b/homeassistant/components/sense/.translations/en.json index fd4b1f4af3bc..a5915ae2ced9 100644 --- a/homeassistant/components/sense/.translations/en.json +++ b/homeassistant/components/sense/.translations/en.json @@ -17,6 +17,5 @@ "title": "Connect to your Sense Energy Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/es.json b/homeassistant/components/sense/.translations/es.json index 057596e5cb0b..f80a5da1d44e 100644 --- a/homeassistant/components/sense/.translations/es.json +++ b/homeassistant/components/sense/.translations/es.json @@ -17,6 +17,5 @@ "title": "Conectar a tu Sense Energy Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/fr.json b/homeassistant/components/sense/.translations/fr.json index 73cf00b355fd..11759880108d 100644 --- a/homeassistant/components/sense/.translations/fr.json +++ b/homeassistant/components/sense/.translations/fr.json @@ -16,6 +16,5 @@ "title": "Connectez-vous \u00e0 votre moniteur d'\u00e9nergie Sense" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/it.json b/homeassistant/components/sense/.translations/it.json index c0760337f062..2320eef1a9b1 100644 --- a/homeassistant/components/sense/.translations/it.json +++ b/homeassistant/components/sense/.translations/it.json @@ -17,6 +17,5 @@ "title": "Connettiti al tuo Sense Energy Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ko.json b/homeassistant/components/sense/.translations/ko.json index d97d32c89672..154094ae9715 100644 --- a/homeassistant/components/sense/.translations/ko.json +++ b/homeassistant/components/sense/.translations/ko.json @@ -17,6 +17,5 @@ "title": "Sense Energy Monitor \uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/lb.json b/homeassistant/components/sense/.translations/lb.json index fd4c93730105..3627eb72dab4 100644 --- a/homeassistant/components/sense/.translations/lb.json +++ b/homeassistant/components/sense/.translations/lb.json @@ -17,6 +17,5 @@ "title": "Verbann d\u00e4in Sense Energie Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/no.json b/homeassistant/components/sense/.translations/no.json index 798048479cda..fdddc6de82db 100644 --- a/homeassistant/components/sense/.translations/no.json +++ b/homeassistant/components/sense/.translations/no.json @@ -17,6 +17,5 @@ "title": "Koble til din Sense Energi Monitor" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/ru.json b/homeassistant/components/sense/.translations/ru.json index d1d527c030f3..163af6cb512a 100644 --- a/homeassistant/components/sense/.translations/ru.json +++ b/homeassistant/components/sense/.translations/ru.json @@ -17,6 +17,5 @@ "title": "Sense Energy Monitor" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/sl.json b/homeassistant/components/sense/.translations/sl.json index 5fcf42caab09..8720f80a2c56 100644 --- a/homeassistant/components/sense/.translations/sl.json +++ b/homeassistant/components/sense/.translations/sl.json @@ -17,6 +17,5 @@ "title": "Pove\u017eite se s svojim Sense Energy monitor-jem" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sense/.translations/zh-Hant.json b/homeassistant/components/sense/.translations/zh-Hant.json index 5b3b13f9b685..474634692e4e 100644 --- a/homeassistant/components/sense/.translations/zh-Hant.json +++ b/homeassistant/components/sense/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u9023\u7dda\u81f3 Sense \u80fd\u6e90\u76e3\u63a7" } } - }, - "title": "Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/af.json b/homeassistant/components/sensor/.translations/af.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ar.json b/homeassistant/components/sensor/.translations/ar.json new file mode 100644 index 000000000000..315e85405814 --- /dev/null +++ b/homeassistant/components/sensor/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0627\u0633\u062a\u0634\u0639\u0627\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/bg.json b/homeassistant/components/sensor/.translations/bg.json index fec708034863..d77c6bc105b0 100644 --- a/homeassistant/components/sensor/.translations/bg.json +++ b/homeassistant/components/sensor/.translations/bg.json @@ -22,5 +22,6 @@ "timestamp": "\u0432\u0440\u0435\u043c\u0435\u0442\u043e \u043d\u0430 {entity_name} \u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438", "value": "\u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442\u0442\u0430 \u043d\u0430 {entity_name} \u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438" } - } + }, + "title": "\u0421\u0435\u043d\u0437\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/bs.json b/homeassistant/components/sensor/.translations/bs.json new file mode 100644 index 000000000000..67b14f6ce888 --- /dev/null +++ b/homeassistant/components/sensor/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Senzor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ca.json b/homeassistant/components/sensor/.translations/ca.json index 94d95e7ddf84..5057bf6e27b2 100644 --- a/homeassistant/components/sensor/.translations/ca.json +++ b/homeassistant/components/sensor/.translations/ca.json @@ -22,5 +22,6 @@ "timestamp": "Marca de temps de {entity_name}", "value": "Valor de {entity_name}" } - } + }, + "title": "Sensors" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/cs.json b/homeassistant/components/sensor/.translations/cs.json index 1b2dbad1a4c8..ada081f4d5df 100644 --- a/homeassistant/components/sensor/.translations/cs.json +++ b/homeassistant/components/sensor/.translations/cs.json @@ -22,5 +22,6 @@ "timestamp": "\u010dasov\u00e9 raz\u00edtko {entity_name} se zm\u011bn\u00ed", "value": "hodnota {entity_name} se zm\u011bn\u00ed" } - } + }, + "title": "Senzor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/cy.json b/homeassistant/components/sensor/.translations/cy.json new file mode 100644 index 000000000000..5612ae88a9d5 --- /dev/null +++ b/homeassistant/components/sensor/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Synhwyrydd" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/da.json b/homeassistant/components/sensor/.translations/da.json index 3febed8ac09b..4992516ac03a 100644 --- a/homeassistant/components/sensor/.translations/da.json +++ b/homeassistant/components/sensor/.translations/da.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} tidsstempel \u00e6ndres", "value": "{entity_name} v\u00e6rdi \u00e6ndres" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/de.json b/homeassistant/components/sensor/.translations/de.json index 0680bab7b482..5962e6e13378 100644 --- a/homeassistant/components/sensor/.translations/de.json +++ b/homeassistant/components/sensor/.translations/de.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} Zeitstempel\u00e4nderungen", "value": "{entity_name} Wert\u00e4nderungen" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/el.json b/homeassistant/components/sensor/.translations/el.json new file mode 100644 index 000000000000..6896e08393b5 --- /dev/null +++ b/homeassistant/components/sensor/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0391\u03b9\u03c3\u03b8\u03b7\u03c4\u03ae\u03c1\u03b1\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/en.json b/homeassistant/components/sensor/.translations/en.json index 07411b885b81..2025754e0ee0 100644 --- a/homeassistant/components/sensor/.translations/en.json +++ b/homeassistant/components/sensor/.translations/en.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} timestamp changes", "value": "{entity_name} value changes" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/es-419.json b/homeassistant/components/sensor/.translations/es-419.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/es.json b/homeassistant/components/sensor/.translations/es.json index 3c957c715d97..ae0f51132f4b 100644 --- a/homeassistant/components/sensor/.translations/es.json +++ b/homeassistant/components/sensor/.translations/es.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} cambios de fecha y hora", "value": "Cambios de valor de la {entity_name}" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/et.json b/homeassistant/components/sensor/.translations/et.json new file mode 100644 index 000000000000..edccbf249821 --- /dev/null +++ b/homeassistant/components/sensor/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Andur" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/eu.json b/homeassistant/components/sensor/.translations/eu.json new file mode 100644 index 000000000000..9e8213f6e25f --- /dev/null +++ b/homeassistant/components/sensor/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Sentsorea" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/fa.json b/homeassistant/components/sensor/.translations/fa.json new file mode 100644 index 000000000000..9414fee722b8 --- /dev/null +++ b/homeassistant/components/sensor/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0633\u0646\u0633\u0648\u0631" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/fi.json b/homeassistant/components/sensor/.translations/fi.json new file mode 100644 index 000000000000..a4ef0bdade27 --- /dev/null +++ b/homeassistant/components/sensor/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Sensori" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/fr.json b/homeassistant/components/sensor/.translations/fr.json index cc35f93cb51e..1d6dcb072ebc 100644 --- a/homeassistant/components/sensor/.translations/fr.json +++ b/homeassistant/components/sensor/.translations/fr.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} modification d'horodatage", "value": "Changements de valeur de {entity_name}" } - } + }, + "title": "Capteur" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/gsw.json b/homeassistant/components/sensor/.translations/gsw.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/he.json b/homeassistant/components/sensor/.translations/he.json new file mode 100644 index 000000000000..d4853732bc0e --- /dev/null +++ b/homeassistant/components/sensor/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d7\u05d9\u05d9\u05e9\u05df" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/hi.json b/homeassistant/components/sensor/.translations/hi.json new file mode 100644 index 000000000000..37033396da86 --- /dev/null +++ b/homeassistant/components/sensor/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u0947\u0902\u0938\u0930" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/hr.json b/homeassistant/components/sensor/.translations/hr.json new file mode 100644 index 000000000000..67b14f6ce888 --- /dev/null +++ b/homeassistant/components/sensor/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Senzor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/hu.json b/homeassistant/components/sensor/.translations/hu.json index a83db67b3e15..1bbdb6e01d7d 100644 --- a/homeassistant/components/sensor/.translations/hu.json +++ b/homeassistant/components/sensor/.translations/hu.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} id\u0151b\u00e9lyege v\u00e1ltozik", "value": "{entity_name} \u00e9rt\u00e9ke v\u00e1ltozik" } - } + }, + "title": "\u00c9rz\u00e9kel\u0151" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/hy.json b/homeassistant/components/sensor/.translations/hy.json new file mode 100644 index 000000000000..552e130db72a --- /dev/null +++ b/homeassistant/components/sensor/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054d\u0565\u0576\u057d\u0578\u0580" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/id.json b/homeassistant/components/sensor/.translations/id.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/is.json b/homeassistant/components/sensor/.translations/is.json new file mode 100644 index 000000000000..3fa2ac386245 --- /dev/null +++ b/homeassistant/components/sensor/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Skynjari" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/it.json b/homeassistant/components/sensor/.translations/it.json index 0a1b0d13cb08..8683b6c0a42f 100644 --- a/homeassistant/components/sensor/.translations/it.json +++ b/homeassistant/components/sensor/.translations/it.json @@ -22,5 +22,6 @@ "timestamp": "variazioni di data e ora di {entity_name}", "value": "{entity_name} valori cambiati" } - } + }, + "title": "Sensore" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ja.json b/homeassistant/components/sensor/.translations/ja.json new file mode 100644 index 000000000000..54d8d581d55c --- /dev/null +++ b/homeassistant/components/sensor/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30bb\u30f3\u30b5\u30fc" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ko.json b/homeassistant/components/sensor/.translations/ko.json index 7716cc016c34..1213d5dbcb53 100644 --- a/homeassistant/components/sensor/.translations/ko.json +++ b/homeassistant/components/sensor/.translations/ko.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} \uc2dc\uac01\uc774 \ubc14\ub014 \ub54c", "value": "{entity_name} \uac12\uc774 \ubc14\ub014 \ub54c" } - } + }, + "title": "\uc13c\uc11c" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/lb.json b/homeassistant/components/sensor/.translations/lb.json index f999e3c16f0a..331317e62838 100644 --- a/homeassistant/components/sensor/.translations/lb.json +++ b/homeassistant/components/sensor/.translations/lb.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} Z\u00e4itstempel \u00e4nnert", "value": "{entity_name} W\u00e4ert \u00e4nnert" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/lv.json b/homeassistant/components/sensor/.translations/lv.json new file mode 100644 index 000000000000..d49a5a889b4a --- /dev/null +++ b/homeassistant/components/sensor/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Sensors" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/nb.json b/homeassistant/components/sensor/.translations/nb.json new file mode 100644 index 000000000000..d8a4c4530151 --- /dev/null +++ b/homeassistant/components/sensor/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/nl.json b/homeassistant/components/sensor/.translations/nl.json index 03eff2a7f6d7..829392289afb 100644 --- a/homeassistant/components/sensor/.translations/nl.json +++ b/homeassistant/components/sensor/.translations/nl.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} tijdstip gewijzigd", "value": "{entity_name} waarde gewijzigd" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/nn.json b/homeassistant/components/sensor/.translations/nn.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/pl.json b/homeassistant/components/sensor/.translations/pl.json index 7ef982e0d130..62b5e39e03b7 100644 --- a/homeassistant/components/sensor/.translations/pl.json +++ b/homeassistant/components/sensor/.translations/pl.json @@ -22,5 +22,6 @@ "timestamp": "zmieni si\u0119 znacznik czasu {entity_name}", "value": "zmieni si\u0119 warto\u015b\u0107 {entity_name}" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/pt-BR.json b/homeassistant/components/sensor/.translations/pt-BR.json new file mode 100644 index 000000000000..4caec1811ad9 --- /dev/null +++ b/homeassistant/components/sensor/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Sensor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/pt.json b/homeassistant/components/sensor/.translations/pt.json index 032d88e02d9e..8c4525e7dbd0 100644 --- a/homeassistant/components/sensor/.translations/pt.json +++ b/homeassistant/components/sensor/.translations/pt.json @@ -22,5 +22,6 @@ "timestamp": "momento temporal de {entity_name}", "value": "valor {entity_name}" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ro.json b/homeassistant/components/sensor/.translations/ro.json new file mode 100644 index 000000000000..67b14f6ce888 --- /dev/null +++ b/homeassistant/components/sensor/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Senzor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ru.json b/homeassistant/components/sensor/.translations/ru.json index 0f2c1bc0e4e3..61b0790dee9b 100644 --- a/homeassistant/components/sensor/.translations/ru.json +++ b/homeassistant/components/sensor/.translations/ru.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435", "value": "{entity_name} \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435" } - } + }, + "title": "\u0421\u0435\u043d\u0441\u043e\u0440" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/sk.json b/homeassistant/components/sensor/.translations/sk.json new file mode 100644 index 000000000000..67b14f6ce888 --- /dev/null +++ b/homeassistant/components/sensor/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Senzor" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/sl.json b/homeassistant/components/sensor/.translations/sl.json index 3f29b62e6658..bbaf85cd532a 100644 --- a/homeassistant/components/sensor/.translations/sl.json +++ b/homeassistant/components/sensor/.translations/sl.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} spremembe \u010dasovnega \u017eiga", "value": "{entity_name} spremembe vrednosti" } - } + }, + "title": "Senzor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/sv.json b/homeassistant/components/sensor/.translations/sv.json index 90001148f127..25fd376ecaf4 100644 --- a/homeassistant/components/sensor/.translations/sv.json +++ b/homeassistant/components/sensor/.translations/sv.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} tidst\u00e4mpel \u00e4ndras", "value": "{entity_name} v\u00e4rde \u00e4ndras" } - } + }, + "title": "Sensor" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/ta.json b/homeassistant/components/sensor/.translations/ta.json new file mode 100644 index 000000000000..65e6eda7f43d --- /dev/null +++ b/homeassistant/components/sensor/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b9a\u0bc6\u0ba9\u0bcd\u0b9a\u0bbe\u0bb0\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/te.json b/homeassistant/components/sensor/.translations/te.json new file mode 100644 index 000000000000..9c887e8da75c --- /dev/null +++ b/homeassistant/components/sensor/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c46\u0c28\u0c4d\u0c38\u0c30\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/th.json b/homeassistant/components/sensor/.translations/th.json new file mode 100644 index 000000000000..95806a05334d --- /dev/null +++ b/homeassistant/components/sensor/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/tr.json b/homeassistant/components/sensor/.translations/tr.json new file mode 100644 index 000000000000..12b7e8eac3ca --- /dev/null +++ b/homeassistant/components/sensor/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Sens\u00f6r" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/uk.json b/homeassistant/components/sensor/.translations/uk.json new file mode 100644 index 000000000000..96cee87c350e --- /dev/null +++ b/homeassistant/components/sensor/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0414\u0430\u0442\u0447\u0438\u043a" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/vi.json b/homeassistant/components/sensor/.translations/vi.json new file mode 100644 index 000000000000..f66041ad6ee0 --- /dev/null +++ b/homeassistant/components/sensor/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "C\u1ea3m bi\u1ebfn" +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/zh-Hans.json b/homeassistant/components/sensor/.translations/zh-Hans.json index 12059aa6b1bb..aef79f766cdd 100644 --- a/homeassistant/components/sensor/.translations/zh-Hans.json +++ b/homeassistant/components/sensor/.translations/zh-Hans.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name} \u7684\u65f6\u95f4\u6233\u53d8\u5316", "value": "{entity_name} \u7684\u503c\u53d8\u5316" } - } + }, + "title": "\u4f20\u611f\u5668" } \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/zh-Hant.json b/homeassistant/components/sensor/.translations/zh-Hant.json index 9bf8abc82307..d17cdbcf7d71 100644 --- a/homeassistant/components/sensor/.translations/zh-Hant.json +++ b/homeassistant/components/sensor/.translations/zh-Hant.json @@ -22,5 +22,6 @@ "timestamp": "{entity_name}\u6642\u9593\u6a19\u8a18\u8b8a\u66f4", "value": "{entity_name}\u503c\u8b8a\u66f4" } - } + }, + "title": "\u50b3\u611f\u5668" } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/af.json b/homeassistant/components/sentry/.translations/af.json index ec498ebe3b47..7db651b6b96c 100644 --- a/homeassistant/components/sentry/.translations/af.json +++ b/homeassistant/components/sentry/.translations/af.json @@ -5,6 +5,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ca.json b/homeassistant/components/sentry/.translations/ca.json index 2121153a600a..43302714b97a 100644 --- a/homeassistant/components/sentry/.translations/ca.json +++ b/homeassistant/components/sentry/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/da.json b/homeassistant/components/sentry/.translations/da.json index ecd3d4d25253..c84a80d0ccb2 100644 --- a/homeassistant/components/sentry/.translations/da.json +++ b/homeassistant/components/sentry/.translations/da.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/de.json b/homeassistant/components/sentry/.translations/de.json index 956c640379af..5d6e27bd7378 100644 --- a/homeassistant/components/sentry/.translations/de.json +++ b/homeassistant/components/sentry/.translations/de.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/en.json b/homeassistant/components/sentry/.translations/en.json index 74ec441a2480..13387488ea6f 100644 --- a/homeassistant/components/sentry/.translations/en.json +++ b/homeassistant/components/sentry/.translations/en.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/es.json b/homeassistant/components/sentry/.translations/es.json index 965453fe405a..445d7566240f 100644 --- a/homeassistant/components/sentry/.translations/es.json +++ b/homeassistant/components/sentry/.translations/es.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/fr.json b/homeassistant/components/sentry/.translations/fr.json index 9d58589d7f4a..fce57ec4b9ca 100644 --- a/homeassistant/components/sentry/.translations/fr.json +++ b/homeassistant/components/sentry/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/hu.json b/homeassistant/components/sentry/.translations/hu.json index c472cc5806e4..d79de976a837 100644 --- a/homeassistant/components/sentry/.translations/hu.json +++ b/homeassistant/components/sentry/.translations/hu.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/it.json b/homeassistant/components/sentry/.translations/it.json index 03cecbfb349a..44090de0b623 100644 --- a/homeassistant/components/sentry/.translations/it.json +++ b/homeassistant/components/sentry/.translations/it.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ko.json b/homeassistant/components/sentry/.translations/ko.json index 48b3ddb0488b..7e60891e1660 100644 --- a/homeassistant/components/sentry/.translations/ko.json +++ b/homeassistant/components/sentry/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/lb.json b/homeassistant/components/sentry/.translations/lb.json index 1c0988cee332..92baa5502d77 100644 --- a/homeassistant/components/sentry/.translations/lb.json +++ b/homeassistant/components/sentry/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/nl.json b/homeassistant/components/sentry/.translations/nl.json index 3eb2582b6152..a3aae1382324 100644 --- a/homeassistant/components/sentry/.translations/nl.json +++ b/homeassistant/components/sentry/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/no.json b/homeassistant/components/sentry/.translations/no.json index 83f2a11a8b06..26a469ce341f 100644 --- a/homeassistant/components/sentry/.translations/no.json +++ b/homeassistant/components/sentry/.translations/no.json @@ -13,6 +13,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/pl.json b/homeassistant/components/sentry/.translations/pl.json index 1115cc97ab20..e9bf022b12c0 100644 --- a/homeassistant/components/sentry/.translations/pl.json +++ b/homeassistant/components/sentry/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/ru.json b/homeassistant/components/sentry/.translations/ru.json index 7b7a840b94a4..29ae44ca9eb7 100644 --- a/homeassistant/components/sentry/.translations/ru.json +++ b/homeassistant/components/sentry/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/sl.json b/homeassistant/components/sentry/.translations/sl.json index 6306e1ab2ffd..114eaa6c9f9a 100644 --- a/homeassistant/components/sentry/.translations/sl.json +++ b/homeassistant/components/sentry/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/sv.json b/homeassistant/components/sentry/.translations/sv.json index 135779d6901a..1d07a82818c1 100644 --- a/homeassistant/components/sentry/.translations/sv.json +++ b/homeassistant/components/sentry/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/sentry/.translations/zh-Hant.json b/homeassistant/components/sentry/.translations/zh-Hant.json index 4a2c446f3d7a..277bff66dcb2 100644 --- a/homeassistant/components/sentry/.translations/zh-Hant.json +++ b/homeassistant/components/sentry/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "Sentry" } } - }, - "title": "Sentry" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/bg.json b/homeassistant/components/simplisafe/.translations/bg.json index 7b1e2a3f350f..9d9f60d309c4 100644 --- a/homeassistant/components/simplisafe/.translations/bg.json +++ b/homeassistant/components/simplisafe/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u0438" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ca.json b/homeassistant/components/simplisafe/.translations/ca.json index 34d86a4b46e4..32ff418a7bd2 100644 --- a/homeassistant/components/simplisafe/.translations/ca.json +++ b/homeassistant/components/simplisafe/.translations/ca.json @@ -26,6 +26,5 @@ "title": "Configuraci\u00f3 de SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/cs.json b/homeassistant/components/simplisafe/.translations/cs.json index 793de99a32a4..c2bc5447d162 100644 --- a/homeassistant/components/simplisafe/.translations/cs.json +++ b/homeassistant/components/simplisafe/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Vypl\u0148te va\u0161e \u00fadaje" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/da.json b/homeassistant/components/simplisafe/.translations/da.json index 862ca6f28e4b..eca91f39a40f 100644 --- a/homeassistant/components/simplisafe/.translations/da.json +++ b/homeassistant/components/simplisafe/.translations/da.json @@ -16,6 +16,5 @@ "title": "Udfyld dine oplysninger" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/de.json b/homeassistant/components/simplisafe/.translations/de.json index c48ca23d27de..2c5a0d0971c0 100644 --- a/homeassistant/components/simplisafe/.translations/de.json +++ b/homeassistant/components/simplisafe/.translations/de.json @@ -26,6 +26,5 @@ "title": "Konfigurieren Sie SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/en.json b/homeassistant/components/simplisafe/.translations/en.json index d753a54b6935..1cbaeffe958d 100644 --- a/homeassistant/components/simplisafe/.translations/en.json +++ b/homeassistant/components/simplisafe/.translations/en.json @@ -26,6 +26,5 @@ "title": "Configure SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/es-419.json b/homeassistant/components/simplisafe/.translations/es-419.json index 34b0f198b507..135e9f843e97 100644 --- a/homeassistant/components/simplisafe/.translations/es-419.json +++ b/homeassistant/components/simplisafe/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Completa tu informaci\u00f3n" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/es.json b/homeassistant/components/simplisafe/.translations/es.json index 84d0bf9e84ee..8ffd687b2283 100644 --- a/homeassistant/components/simplisafe/.translations/es.json +++ b/homeassistant/components/simplisafe/.translations/es.json @@ -26,6 +26,5 @@ "title": "Configurar SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/fr.json b/homeassistant/components/simplisafe/.translations/fr.json index 471a6a0cf686..4454c82c8f8f 100644 --- a/homeassistant/components/simplisafe/.translations/fr.json +++ b/homeassistant/components/simplisafe/.translations/fr.json @@ -26,6 +26,5 @@ "title": "Configurer SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/hu.json b/homeassistant/components/simplisafe/.translations/hu.json index 3345d7882c07..95331d8c8d26 100644 --- a/homeassistant/components/simplisafe/.translations/hu.json +++ b/homeassistant/components/simplisafe/.translations/hu.json @@ -13,6 +13,5 @@ "title": "T\u00f6ltsd ki az adataid" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/it.json b/homeassistant/components/simplisafe/.translations/it.json index 1ab01c14b4a4..c30d967d012f 100644 --- a/homeassistant/components/simplisafe/.translations/it.json +++ b/homeassistant/components/simplisafe/.translations/it.json @@ -26,6 +26,5 @@ "title": "Configurare SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ko.json b/homeassistant/components/simplisafe/.translations/ko.json index 9db028011dca..97da5ac4e8b8 100644 --- a/homeassistant/components/simplisafe/.translations/ko.json +++ b/homeassistant/components/simplisafe/.translations/ko.json @@ -26,6 +26,5 @@ "title": "SimpliSafe \uad6c\uc131" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/lb.json b/homeassistant/components/simplisafe/.translations/lb.json index 3c0c165aa538..8e460289ef31 100644 --- a/homeassistant/components/simplisafe/.translations/lb.json +++ b/homeassistant/components/simplisafe/.translations/lb.json @@ -26,6 +26,5 @@ "title": "Simplisafe konfigur\u00e9ieren" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/nl.json b/homeassistant/components/simplisafe/.translations/nl.json index 8c9da14a6037..0aeb9cb1d95a 100644 --- a/homeassistant/components/simplisafe/.translations/nl.json +++ b/homeassistant/components/simplisafe/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Vul uw gegevens in" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/no.json b/homeassistant/components/simplisafe/.translations/no.json index 7ba23b7b0c63..8fcc86ffb828 100644 --- a/homeassistant/components/simplisafe/.translations/no.json +++ b/homeassistant/components/simplisafe/.translations/no.json @@ -26,6 +26,5 @@ "title": "Konfigurer SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pl.json b/homeassistant/components/simplisafe/.translations/pl.json index d278c5d6f19b..6bfc6ce60379 100644 --- a/homeassistant/components/simplisafe/.translations/pl.json +++ b/homeassistant/components/simplisafe/.translations/pl.json @@ -26,6 +26,5 @@ "title": "Konfiguracja SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pt-BR.json b/homeassistant/components/simplisafe/.translations/pt-BR.json index a732debc0436..800ac719ca92 100644 --- a/homeassistant/components/simplisafe/.translations/pt-BR.json +++ b/homeassistant/components/simplisafe/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Preencha suas informa\u00e7\u00f5es" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/pt.json b/homeassistant/components/simplisafe/.translations/pt.json index 097c6fe3b71e..d5234ea3011b 100644 --- a/homeassistant/components/simplisafe/.translations/pt.json +++ b/homeassistant/components/simplisafe/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Preencha as suas informa\u00e7\u00f5es" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ro.json b/homeassistant/components/simplisafe/.translations/ro.json index a84e80f9d04f..7046b0992b15 100644 --- a/homeassistant/components/simplisafe/.translations/ro.json +++ b/homeassistant/components/simplisafe/.translations/ro.json @@ -13,6 +13,5 @@ "title": "Completa\u021bi informa\u021biile dvs." } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/ru.json b/homeassistant/components/simplisafe/.translations/ru.json index 7e116f62923d..4f0b9bf4ee30 100644 --- a/homeassistant/components/simplisafe/.translations/ru.json +++ b/homeassistant/components/simplisafe/.translations/ru.json @@ -26,6 +26,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/sl.json b/homeassistant/components/simplisafe/.translations/sl.json index 81be13f879a2..5b10cd96808c 100644 --- a/homeassistant/components/simplisafe/.translations/sl.json +++ b/homeassistant/components/simplisafe/.translations/sl.json @@ -26,6 +26,5 @@ "title": "Konfigurirajte SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/sv.json b/homeassistant/components/simplisafe/.translations/sv.json index 81c7db754c24..48744428b1da 100644 --- a/homeassistant/components/simplisafe/.translations/sv.json +++ b/homeassistant/components/simplisafe/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Fyll i din information" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/zh-Hans.json b/homeassistant/components/simplisafe/.translations/zh-Hans.json index 5014ee44be7c..721ce3a94f4e 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hans.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4fe1\u606f" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/simplisafe/.translations/zh-Hant.json b/homeassistant/components/simplisafe/.translations/zh-Hant.json index dcb235d247ae..975c863d95de 100644 --- a/homeassistant/components/simplisafe/.translations/zh-Hant.json +++ b/homeassistant/components/simplisafe/.translations/zh-Hant.json @@ -26,6 +26,5 @@ "title": "\u8a2d\u5b9a SimpliSafe" } } - }, - "title": "SimpliSafe" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/bg.json b/homeassistant/components/smartthings/.translations/bg.json index bdbea8983e50..9def747bbb4f 100644 --- a/homeassistant/components/smartthings/.translations/bg.json +++ b/homeassistant/components/smartthings/.translations/bg.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "\u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043b\u0438 \u0438 \u043e\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0430\u043b\u0438 HomeAmistant SmartApp \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e.", "app_setup_error": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 SmartApp. \u041c\u043e\u043b\u044f \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e.", - "base_url_not_https": "`base_url` \u0437\u0430 `http` \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d \u0438 \u0434\u0430 \u0437\u0430\u043f\u043e\u0447\u0432\u0430 \u0441 `https://`", - "token_already_setup": "\u041a\u043e\u0434\u044a\u0442 \u0432\u0435\u0447\u0435 \u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d.", "token_forbidden": "\u041a\u043e\u0434\u044a\u0442 \u043d\u044f\u043c\u0430 \u0438\u0437\u0438\u0441\u043a\u0443\u0435\u043c\u0438\u0442\u0435 OAuth \u043f\u0440\u0430\u0432\u0430.", "token_invalid_format": "\u041a\u043e\u0434\u044a\u0442 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u0432\u044a\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 UID/GUID", "token_unauthorized": "\u041a\u043e\u0434\u044a\u0442 \u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d \u0438\u043b\u0438 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u043e\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0430\u043d.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "\u041a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f" - }, "description": "\u041c\u043e\u043b\u044f, \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 SmartThings [Personal Access Token] ( {token_url} ), \u043a\u043e\u0439\u0442\u043e \u0435 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u043d \u0441\u043f\u043e\u0440\u0435\u0434 [\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0442\u0430] ( {component_url} ).", "title": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f (Personal Access Token)" - }, - "wait_install": { - "description": "\u041c\u043e\u043b\u044f, \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0439\u0442\u0435 Home Assistant SmartApp \u043f\u043e\u043d\u0435 \u043d\u0430 \u0435\u0434\u043d\u043e \u043c\u044f\u0441\u0442\u043e \u0438 \u043a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443 \u0417\u0430\u043f\u0430\u0437\u0432\u0430\u043d\u0435.", - "title": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0439\u0442\u0435 SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ca.json b/homeassistant/components/smartthings/.translations/ca.json index 9b1d0cc00b62..d41236a7f5ed 100644 --- a/homeassistant/components/smartthings/.translations/ca.json +++ b/homeassistant/components/smartthings/.translations/ca.json @@ -1,28 +1,30 @@ { "config": { + "abort": { + "invalid_webhook_url": "Home Assistant not est\u00e0 configurat correctament per a rebre actualitzacions de SmartThings.\nEl seg\u00fcent URL webhook no \u00e9s v\u00e0lid:\n> {webhook_url}\n\nActualitza la teva configuraci\u00f3 segons les [instruccions]({component_url}), reinicia Home Assistant i torna-ho a provar.", + "no_available_locations": "No hi ha ubicacions SmartThings configurables amb Home Assistant." + }, "error": { - "app_not_installed": "Assegura't que has instal\u00b7lat i autoritzat l'aplicaci\u00f3 SmartApp de Home Assistant i torna-ho a provar.", "app_setup_error": "No s'ha pogut configurar SmartApp. Siusplau, torna-ho a provar.", - "base_url_not_https": "L'`base_url` per al component `http` ha d'estar configurat i comen\u00e7ar amb `https://`.", - "token_already_setup": "El testimoni d'autenticaci\u00f3 ja ha estat configurat.", "token_forbidden": "El testimoni d'autenticaci\u00f3 no t\u00e9 cont\u00e9 els apartats OAuth obligatoris.", "token_invalid_format": "El testimoni d'autenticaci\u00f3 ha d'estar en format UID/GUID", "token_unauthorized": "El testimoni d'autenticaci\u00f3 no \u00e9s v\u00e0lid o ja no t\u00e9 autoritzaci\u00f3.", "webhook_error": "SmartThings no ha pogut validar l'adre\u00e7a final configurada a `base_url`. Revisa els requisits del component." }, "step": { - "user": { - "data": { - "access_token": "Testimoni d'acc\u00e9s" - }, - "description": "Introdueix un [testimoni d'acc\u00e9s personal]({token_url}) de SmartThings que s'ha creat a trav\u00e9s les [instruccions]({component_url}).", - "title": "Introdueix el testimoni d'autenticaci\u00f3 personal" + "authorize": { + "title": "Autoritzaci\u00f3 de Home Assistant" }, - "wait_install": { - "description": "Instal\u00b7la l'SmartApp de Home Assistant en almenys una ubicaci\u00f3 i prem a Envia.", - "title": "Instal\u00b7laci\u00f3 de SmartApp" + "select_location": { + "data": { + "location_id": "Ubicaci\u00f3" + }, + "title": "Selecci\u00f3 d'ubicaci\u00f3" + }, + "user": { + "description": "SmartThings es configurar\u00e0 per a enviar actualitzacions push a Home Assistant a:\n> {webhook_url}\n\nSi no \u00e9s correcte, actualitza la teva configuraci\u00f3, reinicia Home Assistant i torna-ho a provar.", + "title": "Introdueix el testimoni d'autenticaci\u00f3 personal" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/cs.json b/homeassistant/components/smartthings/.translations/cs.json index f0d55c50b266..60a0ba0e1583 100644 --- a/homeassistant/components/smartthings/.translations/cs.json +++ b/homeassistant/components/smartthings/.translations/cs.json @@ -1,21 +1,11 @@ { "config": { "error": { - "app_not_installed": "Zkontrolujte, zda jste nainstalovali a autorizovali aplikaci Home Assistant SmartApp a zkuste to znovu.", "app_setup_error": "Nelze nastavit SmartApp. Pros\u00edm zkuste to znovu.", - "base_url_not_https": "' Base_url ' pro komponentu ' http ' mus\u00ed b\u00fdt nakonfigurov\u00e1na a za\u010d\u00ednat ' https://'.", - "token_already_setup": "Token ji\u017e byl nastaven.", "token_forbidden": "Token nem\u00e1 po\u017eadovan\u00e9 rozsahy OAuth.", "token_invalid_format": "Token mus\u00ed b\u00fdt ve form\u00e1tu UID/GUID.", "token_unauthorized": "Token je neplatn\u00fd nebo ji\u017e nen\u00ed autorizov\u00e1n.", "webhook_error": "SmartThings nemohly ov\u011b\u0159it koncov\u00fd bod nakonfigurovan\u00fd v `base_url`. P\u0159e\u010dt\u011bte si pros\u00edm po\u017eadavky na komponenty." - }, - "step": { - "user": { - "data": { - "access_token": "P\u0159\u00edstupov\u00fd token" - } - } } } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/da.json b/homeassistant/components/smartthings/.translations/da.json index 636943d119e4..ccddbe6cefff 100644 --- a/homeassistant/components/smartthings/.translations/da.json +++ b/homeassistant/components/smartthings/.translations/da.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "S\u00f8rg for, at du har installeret og godkendt Home Assistant SmartApp, og pr\u00f8v igen.", "app_setup_error": "SmartApp kunne ikke konfigureres. Pr\u00f8v igen.", - "base_url_not_https": "`base_url` til `http`-komponenten skal konfigureres og starte med `https://`.", - "token_already_setup": "Token er allerede konfigureret.", "token_forbidden": "Adgangstoken er ikke indenfor OAuth", "token_invalid_format": "Adgangstoken skal v\u00e6re i UID/GUID format", "token_unauthorized": "Adgangstoken er ugyldigt eller ikke l\u00e6ngere godkendt.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Adgangstoken" - }, "description": "Indtast venligst en SmartThings [Personal Access Token]({token_url}), som er oprettet if\u00f8lge [instruktionerne]({component_url}).", "title": "Indtast personlig adgangstoken" - }, - "wait_install": { - "description": "Installer Home Assistant SmartApp mindst et sted og klik p\u00e5 send.", - "title": "Installer SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/de.json b/homeassistant/components/smartthings/.translations/de.json index dfe406db41ad..95cd3aee0f7c 100644 --- a/homeassistant/components/smartthings/.translations/de.json +++ b/homeassistant/components/smartthings/.translations/de.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Stelle sicher, dass du die Home Assistant SmartApp installiert und autorisiert hast, und versuche es erneut.", "app_setup_error": "SmartApp kann nicht eingerichtet werden. Bitte versuche es erneut.", - "base_url_not_https": "Die `base_url` f\u00fcr die` http`-Komponente muss konfiguriert sein und mit `https://` beginnen.", - "token_already_setup": "Das Token wurde bereits eingerichtet.", "token_forbidden": "Das Token verf\u00fcgt nicht \u00fcber die erforderlichen OAuth-Bereiche.", "token_invalid_format": "Das Token muss im UID/GUID-Format vorliegen.", "token_unauthorized": "Das Token ist ung\u00fcltig oder nicht mehr autorisiert.", @@ -27,17 +24,9 @@ "title": "Standort ausw\u00e4hlen" }, "user": { - "data": { - "access_token": "Zugangstoken" - }, "description": "SmartThings wird so konfiguriert, dass Push-Updates an Home Assistant gesendet werden an die URL: \n > {webhook_url} \n\nWenn dies nicht korrekt ist, aktualisieren Sie bitte Ihre Konfiguration, starten Sie Home Assistant neu und versuchen Sie es erneut.", "title": "R\u00fcckruf-URL best\u00e4tigen" - }, - "wait_install": { - "description": "Installiere die Home-Assistent SmartApp an mindestens einer Stelle, und klicke auf Absenden.", - "title": "SmartApp installieren" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/en.json b/homeassistant/components/smartthings/.translations/en.json index 9c1b9ae6248d..ded899ad4aa3 100644 --- a/homeassistant/components/smartthings/.translations/en.json +++ b/homeassistant/components/smartthings/.translations/en.json @@ -5,10 +5,7 @@ "no_available_locations": "There are no available SmartThings Locations to setup in Home Assistant." }, "error": { - "app_not_installed": "Please ensure you have installed and authorized the Home Assistant SmartApp and try again.", "app_setup_error": "Unable to setup the SmartApp. Please try again.", - "base_url_not_https": "The `base_url` for the `http` component must be configured and start with `https://`.", - "token_already_setup": "The token has already been setup.", "token_forbidden": "The token does not have the required OAuth scopes.", "token_invalid_format": "The token must be in the UID/GUID format", "token_unauthorized": "The token is invalid or no longer authorized.", @@ -33,17 +30,9 @@ "title": "Select Location" }, "user": { - "data": { - "access_token": "Access Token" - }, "description": "SmartThings will be configured to send push updates to Home Assistant at:\n> {webhook_url}\n\nIf this is not correct, please update your configuration, restart Home Assistant, and try again.", "title": "Confirm Callback URL" - }, - "wait_install": { - "description": "Please install the Home Assistant SmartApp in at least one location and click submit.", - "title": "Install SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/es-419.json b/homeassistant/components/smartthings/.translations/es-419.json index 1ff1554fa2fb..d5446773700a 100644 --- a/homeassistant/components/smartthings/.translations/es-419.json +++ b/homeassistant/components/smartthings/.translations/es-419.json @@ -2,24 +2,14 @@ "config": { "error": { "app_setup_error": "No se puede configurar el SmartApp. Por favor, int\u00e9ntelo de nuevo.", - "base_url_not_https": "El `base_url` para el componente `http` debe estar configurado y empezar por `https://`.", - "token_already_setup": "El token ya ha sido configurado.", "token_invalid_format": "El token debe estar en formato UID/GUID", "token_unauthorized": "El token no es v\u00e1lido o ya no est\u00e1 autorizado.", "webhook_error": "SmartThings no pudo validar el endpoint configurado en `base_url`. Por favor, revise los requisitos de los componentes." }, "step": { "user": { - "data": { - "access_token": "Token de acceso" - }, "title": "Ingresar token de acceso personal" - }, - "wait_install": { - "description": "Instale la SmartApp de Home Assistant en al menos una ubicaci\u00f3n y haga clic en enviar.", - "title": "Instalar SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/es.json b/homeassistant/components/smartthings/.translations/es.json index 59c2f79d8584..148fb6dfc1bd 100644 --- a/homeassistant/components/smartthings/.translations/es.json +++ b/homeassistant/components/smartthings/.translations/es.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Aseg\u00farate de haber instalado y autorizado la SmartApp de Home Assistant y vuelve a intentarlo.", "app_setup_error": "No se pudo configurar el SmartApp. Por favor, int\u00e9ntelo de nuevo.", - "base_url_not_https": "La 'base_url' del componente 'http' debe empezar por 'https://'.", - "token_already_setup": "El token ya ha sido configurado.", "token_forbidden": "El token no tiene los \u00e1mbitos de OAuth necesarios.", "token_invalid_format": "El token debe estar en formato UID/GUID", "token_unauthorized": "El token no es v\u00e1lido o ya no est\u00e1 autorizado.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Token de acceso" - }, "description": "Por favor, introduce el [token de acceso personal]({token_url}) de SmartThings que se haya creado seg\u00fan las [instrucciones]({component_url}).", "title": "Introduce el token de acceso personal" - }, - "wait_install": { - "description": "Por favor, instala Home Assistant SmartApp en al menos una ubicaci\u00f3n y pulsa en enviar.", - "title": "Instalar SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/fr.json b/homeassistant/components/smartthings/.translations/fr.json index 1fd32fd1be5a..8e0acaaaa0f0 100644 --- a/homeassistant/components/smartthings/.translations/fr.json +++ b/homeassistant/components/smartthings/.translations/fr.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Assurez-vous d'avoir install\u00e9 et autoris\u00e9 l'application Home Assistant SmartApp, puis r\u00e9essayez.", "app_setup_error": "Impossible de configurer la SmartApp. Veuillez r\u00e9essayer.", - "base_url_not_https": "Le param\u00e8tre `base_url` du composant` http` doit \u00eatre configur\u00e9 et commencer par `https: //`.", - "token_already_setup": "Le jeton a d\u00e9j\u00e0 \u00e9t\u00e9 configur\u00e9.", "token_forbidden": "Le jeton n'a pas les port\u00e9es OAuth requises.", "token_invalid_format": "Le jeton doit \u00eatre au format UID / GUID", "token_unauthorized": "Le jeton est invalide ou n'est plus autoris\u00e9.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Jeton d'acc\u00e8s" - }, "description": "Veuillez entrer un [jeton d'acc\u00e8s personnel SmartThings] ( {token_url} ) cr\u00e9\u00e9 selon les [instructions] ( {component_url} ).", "title": "Entrer un jeton d'acc\u00e8s personnel" - }, - "wait_install": { - "description": "Veuillez installer la SmartApp de Home Assistant dans au moins un emplacement et cliquez sur Soumettre.", - "title": "Installer SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/he.json b/homeassistant/components/smartthings/.translations/he.json index adebe4b8a735..5cb63393be8b 100644 --- a/homeassistant/components/smartthings/.translations/he.json +++ b/homeassistant/components/smartthings/.translations/he.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "\u05d0\u05e0\u05d0 \u05d5\u05d3\u05d0 \u05e9\u05d4\u05ea\u05e7\u05e0\u05ea \u05d0\u05d9\u05e9\u05e8\u05ea \u05d0\u05ea Home Assistant SmartApp \u05d5\u05dc\u05e0\u05e1\u05d5\u05ea \u05e9\u05d5\u05d1.", "app_setup_error": "\u05d0\u05d9\u05df \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea SmartApp. \u05e0\u05d0 \u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1.", - "base_url_not_https": "\u05d9\u05e9 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05d4- `base_url` \u05e2\u05d1\u05d5\u05e8 \u05e8\u05db\u05d9\u05d1` http` \u05d5\u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05d1- `https: //.", - "token_already_setup": "\u05d4\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05db\u05d1\u05e8 \u05d4\u05d5\u05d2\u05d3\u05e8.", "token_forbidden": "\u05dc\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d9\u05df \u05d0\u05ea \u05d8\u05d5\u05d5\u05d7\u05d9 OAuth \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd.", "token_invalid_format": "\u05d4\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e4\u05d5\u05e8\u05de\u05d8 UID / GUID", "token_unauthorized": "\u05d4\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05d7\u05d5\u05e7\u05d9 \u05d0\u05d5 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e8\u05e9\u05d4 \u05e2\u05d5\u05d3.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4" - }, "description": "\u05d4\u05d6\u05df SmartThings [\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4 \u05d0\u05d9\u05e9\u05d9\u05ea] ( {token_url} ) \u05e9\u05e0\u05d5\u05e6\u05e8 \u05dc\u05e4\u05d9 [\u05d4\u05d5\u05e8\u05d0\u05d5\u05ea] ( {component_url} ).", "title": "\u05d4\u05d6\u05df \u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4 \u05d0\u05d9\u05e9 " - }, - "wait_install": { - "description": "\u05d4\u05ea\u05e7\u05df \u05d0\u05ea \u05d4- Home Assistant SmartApp \u05dc\u05e4\u05d7\u05d5\u05ea \u05d1\u05de\u05d9\u05e7\u05d5\u05dd \u05d0\u05d7\u05d3 \u05d5\u05dc\u05d7\u05e5 \u05e2\u05dc \u05e9\u05dc\u05d7.", - "title": "\u05d4\u05ea\u05e7\u05df \u05d0\u05ea SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/hu.json b/homeassistant/components/smartthings/.translations/hu.json index 56c29638be04..d71e29e01714 100644 --- a/homeassistant/components/smartthings/.translations/hu.json +++ b/homeassistant/components/smartthings/.translations/hu.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Gy\u0151z\u0151dj meg r\u00f3la, hogy telep\u00edtetted \u00e9s enged\u00e9lyezted a SmartApp Home Assistant alkalmaz\u00e1st, \u00e9s pr\u00f3b\u00e1lkozz \u00fajra.", "app_setup_error": "A SmartApp be\u00e1ll\u00edt\u00e1sa nem siker\u00fclt. K\u00e9rlek pr\u00f3b\u00e1ld \u00fajra.", - "base_url_not_https": "A `http` \u00f6sszetev\u0151 `base_url` be\u00e1ll\u00edt\u00e1s\u00e1t konfigur\u00e1lni kell, \u00e9s `https: //` -vel kell kezdeni.", - "token_already_setup": "A tokent m\u00e1r be\u00e1ll\u00edtottuk.", "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.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Hozz\u00e1f\u00e9r\u00e9s a Tokenhez" - }, "description": "K\u00e9rlek add meg a SmartThings [Personal Access Tokent]({token_url}), amit az [instrukci\u00f3k] ({component_url}) alapj\u00e1n hozt\u00e1l l\u00e9tre.", "title": "Adja meg a szem\u00e9lyes hozz\u00e1f\u00e9r\u00e9si Tokent" - }, - "wait_install": { - "description": "K\u00e9rj\u00fck, telep\u00edtse a Home Assistant SmartAppot legal\u00e1bb egy helyre, \u00e9s kattintson a K\u00fcld\u00e9s gombra.", - "title": "A SmartApp telep\u00edt\u00e9se" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/it.json b/homeassistant/components/smartthings/.translations/it.json index a4148036eb57..248ea85eb3fa 100644 --- a/homeassistant/components/smartthings/.translations/it.json +++ b/homeassistant/components/smartthings/.translations/it.json @@ -5,10 +5,7 @@ "no_available_locations": "Non ci sono posizioni SmartThings disponibili da configurare in Home Assistant." }, "error": { - "app_not_installed": "Assicurati di avere installato ed autorizzato la SmartApp Home Assistant e riprova.", "app_setup_error": "Impossibile configurare SmartApp. Riprovare.", - "base_url_not_https": "Il `base_url` per il componente `http` deve essere configurato e deve iniziare con `https://`.", - "token_already_setup": "Il token \u00e8 gi\u00e0 stato configurato.", "token_forbidden": "Il token non dispone degli ambiti OAuth necessari.", "token_invalid_format": "Il token deve essere nel formato UID/GUID", "token_unauthorized": "Il token non \u00e8 valido o non \u00e8 pi\u00f9 autorizzato.", @@ -33,17 +30,9 @@ "title": "Seleziona posizione" }, "user": { - "data": { - "access_token": "Token di accesso" - }, "description": "SmartThings sar\u00e0 configurato per inviare aggiornamenti push a Home Assistant su: \n > {webhook_url} \n\nSe ci\u00f2 non fosse corretto, aggiornare la configurazione, riavviare Home Assistant e riprovare.", "title": "Confermare l'URL di richiamo" - }, - "wait_install": { - "description": "Si prega di installare l'Home Assistant SmartApp in almeno una posizione e fare clic su Invia.", - "title": "Installa SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ko.json b/homeassistant/components/smartthings/.translations/ko.json index 804cce848622..9c5734765112 100644 --- a/homeassistant/components/smartthings/.translations/ko.json +++ b/homeassistant/components/smartthings/.translations/ko.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Home Assistant SmartApp \uc744 \uc124\uce58\ud558\uace0 \uc778\uc99d\ud588\ub294\uc9c0 \ud655\uc778\ud558\uace0 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", "app_setup_error": "SmartApp \uc744 \uc124\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", - "base_url_not_https": "`http` \uad6c\uc131\uc694\uc18c\uc758 `base_url` \uc740 \ubc18\ub4dc\uc2dc `https://`\ub85c \uc2dc\uc791\ud558\ub3c4\ub85d \uad6c\uc131\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.", - "token_already_setup": "\ud1a0\ud070\uc774 \uc774\ubbf8 \uc124\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", "token_forbidden": "\ud1a0\ud070\uc5d0 \ud544\uc694\ud55c OAuth \ubc94\uc704\ubaa9\ub85d\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.", "token_invalid_format": "\ud1a0\ud070\uc740 UID/GUID \ud615\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4", "token_unauthorized": "\ud1a0\ud070\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uac70\ub098 \uc2b9\uc778\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070" - }, "description": "[\uc548\ub0b4]({component_url}) \uc5d0 \ub530\ub77c \uc0dd\uc131 \ub41c SmartThings [\uac1c\uc778 \uc561\uc138\uc2a4 \ud1a0\ud070]({token_url}) \uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", "title": "\uac1c\uc778 \uc561\uc138\uc2a4 \ud1a0\ud070 \uc785\ub825" - }, - "wait_install": { - "description": "\ud558\ub098 \uc774\uc0c1\uc758 \uc704\uce58\uc5d0 Home Assistant SmartApp \uc744 \uc124\uce58\ud558\uace0 submit \uc744 \ud074\ub9ad\ud574\uc8fc\uc138\uc694.", - "title": "SmartApp \uc124\uce58" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/lb.json b/homeassistant/components/smartthings/.translations/lb.json index 2fb6b10a7704..e04c296dc8b3 100644 --- a/homeassistant/components/smartthings/.translations/lb.json +++ b/homeassistant/components/smartthings/.translations/lb.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Stellt w.e.g s\u00e9cher dass d'Home Assistant SmartApp install\u00e9iert an autoris\u00e9iert ass, a prob\u00e9iert nach emol.", "app_setup_error": "Kann SmartApp net install\u00e9ieren. Prob\u00e9iert w.e.g. nach emol.", - "base_url_not_https": "`base_url` fir den `http` Komponent muss konfigur\u00e9iert sinn a mat `https://`uf\u00e4nken.", - "token_already_setup": "Den Jeton gouf schonn ageriicht.", "token_forbidden": "De Jeton huet net d\u00e9i n\u00e9ideg OAuth M\u00e9iglechkeeten.", "token_invalid_format": "De Jeton muss am UID/GUID Format sinn", "token_unauthorized": "De Jeton ass ong\u00eblteg oder net m\u00e9i autoris\u00e9iert.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Acc\u00e8ss Jeton" - }, "description": "Gitt w.e.g. ee [Pers\u00e9inlechen Acc\u00e8s Jeton]({token_url}) vu SmartThings an dee via [d'Instruktiounen] ({component_url}) erstallt gouf.", "title": "Pers\u00e9inlechen Acc\u00e8ss Jeton uginn" - }, - "wait_install": { - "description": "Install\u00e9iert d'Home Assistant SmartApp op mannst ee mol a klickt op Ofsch\u00e9cken.", - "title": "SmartApp install\u00e9ieren" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/nl.json b/homeassistant/components/smartthings/.translations/nl.json index 2ba0e1f3467a..7e65645928e4 100644 --- a/homeassistant/components/smartthings/.translations/nl.json +++ b/homeassistant/components/smartthings/.translations/nl.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Zorg ervoor dat u de Home Assistant SmartApp heeft ge\u00efnstalleerd en geautoriseerd en probeer het opnieuw.", "app_setup_error": "Instellen van SmartApp mislukt. Probeer het opnieuw.", - "base_url_not_https": "De `base_url` voor het `http` component moet worden geconfigureerd en beginnen met `https://`.", - "token_already_setup": "Het token is al ingesteld.", "token_forbidden": "Het token heeft niet de vereiste OAuth-scopes.", "token_invalid_format": "Het token moet de UID/GUID-indeling hebben", "token_unauthorized": "Het token is ongeldig of niet langer geautoriseerd.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Toegangstoken" - }, "description": "Voer een SmartThings [Personal Access Token]({token_url}) in die is aangemaakt volgens de [instructies]({component_url}).", "title": "Persoonlijk toegangstoken invoeren" - }, - "wait_install": { - "description": "Installeer de Home Assistant SmartApp in tenminste \u00e9\u00e9n locatie en klik Verzenden.", - "title": "Installeer SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/no.json b/homeassistant/components/smartthings/.translations/no.json index 051fcb5e6d79..7f843bfd7da0 100644 --- a/homeassistant/components/smartthings/.translations/no.json +++ b/homeassistant/components/smartthings/.translations/no.json @@ -5,10 +5,7 @@ "no_available_locations": "Det er ingen tilgjengelige SmartThings-lokasjoner \u00e5 konfigurere i Home Assistant." }, "error": { - "app_not_installed": "V\u00e6r sikker p\u00e5 at du har installert og autorisert Home Assistant SmartApp og pr\u00f8v igjen.", "app_setup_error": "Kan ikke konfigurere SmartApp. Vennligst pr\u00f8v p\u00e5 nytt.", - "base_url_not_https": "`base_url` for `http` komponenten m\u00e5 konfigureres og starte med `https://`.", - "token_already_setup": "Token har allerede blitt satt opp.", "token_forbidden": "Tokenet har ikke de n\u00f8dvendige OAuth-omfangene.", "token_invalid_format": "Token m\u00e5 v\u00e6re i UID/GUID format", "token_unauthorized": "Tollet er ugyldig eller ikke lenger autorisert.", @@ -33,17 +30,9 @@ "title": "Velg Posisjon" }, "user": { - "data": { - "access_token": "Tilgangstoken" - }, "description": "SmartThings konfigureres til \u00e5 sende push-oppdateringer til Home Assistant p\u00e5:\n\" {webhook_url}\n\nHvis dette ikke er riktig, m\u00e5 du oppdatere konfigurasjonen, starte Home Assistant p\u00e5 nytt og pr\u00f8ve p\u00e5 nytt.", "title": "Bekreft URL-adresse for tilbakeringing" - }, - "wait_install": { - "description": "Vennligst installer Home Assistant SmartApp p\u00e5 minst ett sted og klikk p\u00e5 send.", - "title": "Installer SmartApp" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pl.json b/homeassistant/components/smartthings/.translations/pl.json index 7bbce699274f..0b6f347873c6 100644 --- a/homeassistant/components/smartthings/.translations/pl.json +++ b/homeassistant/components/smartthings/.translations/pl.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Upewnij si\u0119, \u017ce zainstalowa\u0142e\u015b i autoryzowa\u0142e\u015b Home Assistant SmartApp i spr\u00f3buj ponownie.", "app_setup_error": "Nie mo\u017cna skonfigurowa\u0107 SmartApp. Spr\u00f3buj ponownie.", - "base_url_not_https": "Parametr `base_url` dla komponentu `http` musi by\u0107 skonfigurowany i rozpoczyna\u0107 si\u0119 od `https://`.", - "token_already_setup": "Token zosta\u0142 ju\u017c skonfigurowany.", "token_forbidden": "Token nie ma wymaganych zakres\u00f3w OAuth.", "token_invalid_format": "Token musi by\u0107 w formacie UID/GUID", "token_unauthorized": "Token jest niewa\u017cny lub nie ma ju\u017c autoryzacji.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Token dost\u0119pu" - }, "description": "Wprowad\u017a [token dost\u0119pu osobistego]({token_url}) SmartThings, kt\u00f3ry zosta\u0142 utworzony zgodnie z [instrukcj\u0105]({component_url}).", "title": "Wprowad\u017a osobisty token dost\u0119pu" - }, - "wait_install": { - "description": "Prosz\u0119 zainstalowa\u0107 Home Assistant SmartApp w co najmniej jednej lokalizacji i klikn\u0105\u0107 przycisk Wy\u015blij.", - "title": "Zainstaluj SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pt-BR.json b/homeassistant/components/smartthings/.translations/pt-BR.json index dba578def936..a28daf34acce 100644 --- a/homeassistant/components/smartthings/.translations/pt-BR.json +++ b/homeassistant/components/smartthings/.translations/pt-BR.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "Por favor, certifique-se de ter instalado e autorizado o Home Assistant SmartApp e tente novamente.", "app_setup_error": "N\u00e3o \u00e9 poss\u00edvel configurar o SmartApp. Por favor, tente novamente.", - "base_url_not_https": "O `base_url` para o componente` http` deve ser configurado e iniciar com `https: //`.", - "token_already_setup": "O token j\u00e1 foi configurado.", "token_forbidden": "O token n\u00e3o possui os escopos necess\u00e1rios do OAuth.", "token_invalid_format": "O token deve estar no formato UID / GUID", "token_unauthorized": "O token \u00e9 inv\u00e1lido ou n\u00e3o est\u00e1 mais autorizado.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "Token de Acesso" - }, "description": "Por favor, insira um SmartThings [Personal Access Token] ( {token_url} ) que foi criado de acordo com as [instru\u00e7\u00f5es] ( {component_url} ).", "title": "Digite o token de acesso pessoal" - }, - "wait_install": { - "description": "Por favor, instale o Home Assistant SmartApp em pelo menos um local e clique em enviar.", - "title": "Instalar o SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/pt.json b/homeassistant/components/smartthings/.translations/pt.json index 0b8a9f88e819..9f2ed5a4b909 100644 --- a/homeassistant/components/smartthings/.translations/pt.json +++ b/homeassistant/components/smartthings/.translations/pt.json @@ -1,27 +1,36 @@ { "config": { + "abort": { + "no_available_locations": "N\u00e3o h\u00e1 localiza\u00e7\u00f5es SmartThings dispon\u00edveis para configura\u00e7\u00e3o no Home Assistant." + }, "error": { - "app_not_installed": "Por favor, instale o Home Assistant SmartApp em pelo menos um local e tente de novo.", "app_setup_error": "N\u00e3o \u00e9 poss\u00edvel configurar o SmartApp. Por favor, tente novamente.", - "base_url_not_https": "O `base_url` para o componente` http` deve ser configurado e iniciar com `https://`.", - "token_already_setup": "O token j\u00e1 foi configurado.", "token_forbidden": "O token n\u00e3o tem tem a cobertura OAuth necess\u00e1ria.", "token_invalid_format": "O token deve estar no formato UID/GUID", - "token_unauthorized": "O token \u00e9 inv\u00e1lido ou ja n\u00e3o est\u00e1 autorizado." + "token_unauthorized": "O token \u00e9 inv\u00e1lido ou ja n\u00e3o est\u00e1 autorizado.", + "webhook_error": "O SmartThings n\u00e3o p\u00f4de validar o URL do webhook. Verifique se o URL do webhook est\u00e1 acess\u00edvel pela Internet e tente novamente." }, "step": { - "user": { + "authorize": { + "title": "Autorizar o Home Assistant" + }, + "pat": { "data": { "access_token": "Token de Acesso" }, - "description": "Por favor, insira um SmartThings [Personal Access Token]({token_url} ) que foi criado de acordo com as [instru\u00e7\u00f5es]({component_url}).", "title": "Insira o Token de acesso pessoal" }, - "wait_install": { - "description": "Por favor, instale o Home Assistant SmartApp em pelo menos um local e clique em enviar.", - "title": "Instalar SmartApp" + "select_location": { + "data": { + "location_id": "Localiza\u00e7\u00e3o" + }, + "description": "Por favor, selecione a localiza\u00e7\u00e3o do SmartThings que voc\u00ea deseja adicionar ao Home Assistant. Em seguida, abriremos uma nova janela e solicitaremos que voc\u00ea fa\u00e7a o login e autorize a instala\u00e7\u00e3o da integra\u00e7\u00e3o do Home Assistant na localiza\u00e7\u00e3o selecionada.", + "title": "Selecionar Localiza\u00e7\u00e3o" + }, + "user": { + "description": "Por favor, insira um SmartThings [Personal Access Token]({token_url} ) que foi criado de acordo com as [instru\u00e7\u00f5es]({component_url}).", + "title": "Insira o Token de acesso pessoal" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/ru.json b/homeassistant/components/smartthings/.translations/ru.json index 19051f906fa4..5087506fc828 100644 --- a/homeassistant/components/smartthings/.translations/ru.json +++ b/homeassistant/components/smartthings/.translations/ru.json @@ -5,10 +5,7 @@ "no_available_locations": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 SmartThings." }, "error": { - "app_not_installed": "\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0412\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u0438 SmartApp 'Home Assistant' \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", "app_setup_error": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c SmartApp. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.", - "base_url_not_https": "\u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 `http` \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 `base_url`, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441 `https://`.", - "token_already_setup": "\u0422\u043e\u043a\u0435\u043d \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d.", "token_forbidden": "\u0422\u043e\u043a\u0435\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f OAuth.", "token_invalid_format": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 UID / GUID.", "token_unauthorized": "\u0422\u043e\u043a\u0435\u043d \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d.", @@ -33,17 +30,9 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" }, "user": { - "data": { - "access_token": "\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430" - }, "description": "SmartThings \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 push-\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: \n> {webhook_url} \n\n\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Home Assistant \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", "title": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 Callback URL" - }, - "wait_install": { - "description": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 SmartApp 'Home Assistant' \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 **\u041f\u041e\u0414\u0422\u0412\u0415\u0420\u0414\u0418\u0422\u042c**.", - "title": "SmartThings" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/sl.json b/homeassistant/components/smartthings/.translations/sl.json index ea7c3b801210..b2959577adcb 100644 --- a/homeassistant/components/smartthings/.translations/sl.json +++ b/homeassistant/components/smartthings/.translations/sl.json @@ -1,28 +1,38 @@ { "config": { + "abort": { + "invalid_webhook_url": "Home Assistant ni pravilno konfiguriran za sprejemanje posodobitev SmartThings. URL webhook-a je neveljaven: \n > {webhook_url} \n\n Posodobite konfiguracijo po [navodilih] ({component_url}), nato znova za\u017eenite Home Assistant-a in poskusite znova.", + "no_available_locations": "Na voljo ni nobenih lokacij SmartThings, ki bi jih bilo mogo\u010de nastaviti v programu Home Assistant." + }, "error": { - "app_not_installed": "Prepri\u010dajte se, da ste namestili in pooblastili Home Assistant SmartApp in poskusite znova.", "app_setup_error": "SmartApp ni mogo\u010de nastaviti. Prosim poskusite ponovno.", - "base_url_not_https": "`Base_url` za` http 'komponento je treba konfigurirati in za\u010deti z `https: //`.", - "token_already_setup": "\u017deton je \u017ee nastavljen.", "token_forbidden": "\u017deton nima zahtevanih OAuth obsegov.", "token_invalid_format": "\u017deton mora biti v formatu UID / GUID", "token_unauthorized": "\u017deton ni veljaven ali ni ve\u010d poobla\u0161\u010den.", - "webhook_error": "SmartThings ni mogel potrditi kon\u010dne to\u010dke nastavljene v 'base_url`. Prosimo, preglejte zahteve komponente." + "webhook_error": "SmartThings ni mogel preveriti URL-ja spletnega koda. Prepri\u010dajte se, da je spletni brskalnik dosegljiv iz interneta in poskusite znova." }, "step": { - "user": { + "authorize": { + "title": "Pooblastite Home Assistant" + }, + "pat": { "data": { "access_token": "\u017deton za dostop" }, - "description": "Prosimo vnesite Smartthings [\u017deton za osebni dostop]({token_url}) ki je bil kreiran v skladu z [navodili]({component_url}).", + "description": "Vnesite SmartThings [\u017deton osebnega dostopa] ({token_url}), ki je bil ustvarjen po [navodilih] ({component_url}). To bo uporabljeno za ustvarjanje integracije Home Assistant v va\u0161em ra\u010dunu SmartThings.", "title": "Vnesite \u017eeton za osebni dostop" }, - "wait_install": { - "description": "Prosimo, namestite Home Assistant SmartApp v vsaj eni lokaciji in kliknite po\u0161lji.", - "title": "Namesti SmartApp" + "select_location": { + "data": { + "location_id": "Lokacija" + }, + "description": "Izberite lokacijo SmartThings, ki jo \u017eelite dodati v Home Assistant. Nato odpremo novo okno in vas prosimo, da se prijavite in pooblastite namestitev integracije Home Assistant na izbrano lokacijo.", + "title": "Izberite Lokacijo" + }, + "user": { + "description": "SmartThings bo konfiguriran za po\u0161iljanje push posodobitev na Home Assistant na: \n > {webhook_url} \n\n \u010ce to ni pravilno, posodobite konfiguracijo, znova za\u017eenite Home Assistant in poskusite znova.", + "title": "Potrdite URL za povratni klic" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/sv.json b/homeassistant/components/smartthings/.translations/sv.json index 5cf7b43851e3..a02483baa476 100644 --- a/homeassistant/components/smartthings/.translations/sv.json +++ b/homeassistant/components/smartthings/.translations/sv.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "V\u00e4nligen se till att du har installerat och auktoriserad Home Assistant SmartApp och f\u00f6rs\u00f6k igen.", "app_setup_error": "Det gick inte att installera Home Assistant SmartApp. V\u00e4nligen f\u00f6rs\u00f6k igen.", - "base_url_not_https": "Den `base_url`f\u00f6r `http` komponenten m\u00e5ste konfigureras och b\u00f6rja med `https://`.", - "token_already_setup": "Token har redan installerats.", "token_forbidden": "Token har inte det som kr\u00e4vs inom omf\u00e5ng f\u00f6r OAuth.", "token_invalid_format": "Token m\u00e5ste vara i UID/GUID-format", "token_unauthorized": "Denna token \u00e4r ogiltig eller inte l\u00e4ngre auktoriserad.", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "\u00c5tkomstnyckel" - }, "description": "V\u00e4nligen ange en [personlig \u00e5tkomsttoken]({token_url}) f\u00f6r SmartThings som har skapats enligt [instruktionerna]({component_url}).", "title": "Ange personlig \u00e5tkomsttoken" - }, - "wait_install": { - "description": "Installera Home Assistant SmartApp p\u00e5 minst en plats och klicka p\u00e5 Skicka.", - "title": "Installera SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/zh-Hans.json b/homeassistant/components/smartthings/.translations/zh-Hans.json index 7acf1e34318b..849d69d55e59 100644 --- a/homeassistant/components/smartthings/.translations/zh-Hans.json +++ b/homeassistant/components/smartthings/.translations/zh-Hans.json @@ -1,10 +1,7 @@ { "config": { "error": { - "app_not_installed": "\u8bf7\u786e\u4fdd\u60a8\u5df2\u5b89\u88c5\u5e76\u6388\u6743 Home Assistant SmartApp\uff0c\u7136\u540e\u518d\u8bd5\u4e00\u6b21\u3002", "app_setup_error": "\u65e0\u6cd5\u8bbe\u7f6e SmartApp\u3002\u8bf7\u518d\u8bd5\u4e00\u6b21\u3002", - "base_url_not_https": "\u5fc5\u987b\u914d\u7f6e `http` \u7ec4\u4ef6\u7684 `base_url` \u5e76\u4ee5 `https://` \u5f00\u5934\u3002", - "token_already_setup": "\u4ee4\u724c\u5df2\u7ecf\u8bbe\u7f6e\u3002", "token_forbidden": "\u4ee4\u724c\u6ca1\u6709\u6240\u9700\u7684 OAuth \u4f5c\u7528\u57df\u3002", "token_invalid_format": "\u4ee4\u724c\u5fc5\u987b\u7b26\u5408 UID/GUID \u683c\u5f0f", "token_unauthorized": "\u4ee4\u724c\u65e0\u6548\u6216\u5df2\u5931\u6548\u3002", @@ -12,17 +9,9 @@ }, "step": { "user": { - "data": { - "access_token": "\u8bbf\u95ee\u4ee4\u724c" - }, "description": "\u8bf7\u8f93\u5165\u6309\u7167[\u8bf4\u660e]({component_url})\u521b\u5efa\u7684 SmartThings [\u4e2a\u4eba\u8bbf\u95ee\u4ee4\u724c]({token_url})\u3002", "title": "\u8f93\u5165\u4e2a\u4eba\u8bbf\u95ee\u4ee4\u724c" - }, - "wait_install": { - "description": "\u8bf7\u81f3\u5c11\u5728\u4e00\u4e2a\u4f4d\u7f6e\u5b89\u88c5 Home Assistant SmartApp\uff0c\u7136\u540e\u70b9\u51fb\u201c\u63d0\u4ea4\u201d\u3002", - "title": "\u5b89\u88c5 SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smartthings/.translations/zh-Hant.json b/homeassistant/components/smartthings/.translations/zh-Hant.json index b6164bcd3b43..8a8735a80770 100644 --- a/homeassistant/components/smartthings/.translations/zh-Hant.json +++ b/homeassistant/components/smartthings/.translations/zh-Hant.json @@ -5,10 +5,7 @@ "no_available_locations": "\u6c92\u6709\u53ef\u7528 SmartThings \u4f4d\u7f6e\u4ee5\u8a2d\u5b9a Home Assistant\u3002" }, "error": { - "app_not_installed": "\u8acb\u78ba\u8a8d\u5df2\u7d93\u5b89\u88dd\u4e26\u6388\u6b0a Home Assistant Smartapp \u5f8c\u518d\u8a66\u4e00\u6b21\u3002", "app_setup_error": "\u7121\u6cd5\u8a2d\u5b9a SmartApp\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002", - "base_url_not_https": "\u5fc5\u9808\u8a2d\u5b9a\u300chttp\u300d\u5143\u4ef6\u4e4b\u300cbase_url\u300d\uff0c\u4e26\u4ee5\u300chttps://\u300d\u70ba\u958b\u982d\u3002", - "token_already_setup": "\u5bc6\u9470\u5df2\u8a2d\u5b9a\u904e\u3002", "token_forbidden": "\u5bc6\u9470\u4e0d\u5177\u6240\u9700\u7684 OAuth \u7bc4\u570d\u3002", "token_invalid_format": "\u5bc6\u9470\u5fc5\u9808\u70ba UID/GUID \u683c\u5f0f", "token_unauthorized": "\u5bc6\u9470\u7121\u6548\u6216\u4e0d\u518d\u5177\u6709\u6388\u6b0a\u3002", @@ -33,17 +30,9 @@ "title": "\u9078\u64c7\u4f4d\u7f6e" }, "user": { - "data": { - "access_token": "\u5b58\u53d6\u5bc6\u9470" - }, "description": "SmartThings \u9700\u8981\u9032\u884c\u8a2d\u5b9a\u4ee5\u50b3\u9001\u63a8\u64a5\u66f4\u65b0\u81f3 Home Assistant\uff0c\u8a2d\u5b9a\u4f4d\u5740\uff1a\n> {webhook_url}\n\n\u5047\u5982\u8cc7\u8a0a\u4e0d\u6b63\u78ba\uff0c\u8acb\u66f4\u65b0\u8a2d\u5b9a\u3001\u91cd\u65b0\u555f\u52d5 Home Assistant \u5f8c\u3001\u518d\u8a66\u4e00\u6b21\u3002", "title": "\u78ba\u8a8d Callback URL" - }, - "wait_install": { - "description": "\u8acb\u81f3\u5c11\u65bc\u4e00\u500b\u4f4d\u7f6e\u4e2d\u5b89\u88dd Home Assistant Smartapp\uff0c\u4e26\u9ede\u9078\u50b3\u9001\u3002", - "title": "\u5b89\u88dd SmartApp" } } - }, - "title": "SmartThings" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/bg.json b/homeassistant/components/smhi/.translations/bg.json index 2167553ce66e..85ccdf9abcaf 100644 --- a/homeassistant/components/smhi/.translations/bg.json +++ b/homeassistant/components/smhi/.translations/bg.json @@ -14,6 +14,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0428\u0432\u0435\u0446\u0438\u044f" } } - }, - "title": "\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ca.json b/homeassistant/components/smhi/.translations/ca.json index 0ee1284a341a..11fe5675d5d7 100644 --- a/homeassistant/components/smhi/.translations/ca.json +++ b/homeassistant/components/smhi/.translations/ca.json @@ -14,6 +14,5 @@ "title": "Ubicaci\u00f3 a Su\u00e8cia" } } - }, - "title": "Servei meteorol\u00f2gic suec (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/cs.json b/homeassistant/components/smhi/.translations/cs.json index 1e4ccb679426..437c2105e733 100644 --- a/homeassistant/components/smhi/.translations/cs.json +++ b/homeassistant/components/smhi/.translations/cs.json @@ -14,6 +14,5 @@ "title": "Lokalita ve \u0160v\u00e9dsku" } } - }, - "title": "\u0160v\u00e9dsk\u00e1 meteorologick\u00e1 slu\u017eba (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/da.json b/homeassistant/components/smhi/.translations/da.json index 66e56e73bf98..979f4b0f7b68 100644 --- a/homeassistant/components/smhi/.translations/da.json +++ b/homeassistant/components/smhi/.translations/da.json @@ -14,6 +14,5 @@ "title": "Lokalitet i Sverige" } } - }, - "title": "Svensk vejr service (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/de.json b/homeassistant/components/smhi/.translations/de.json index dc12b0b2aec2..d17d577bfed6 100644 --- a/homeassistant/components/smhi/.translations/de.json +++ b/homeassistant/components/smhi/.translations/de.json @@ -14,6 +14,5 @@ "title": "Standort in Schweden" } } - }, - "title": "Schwedischer Wetterdienst (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/en.json b/homeassistant/components/smhi/.translations/en.json index 725e95cee0c9..904ade6ef0a7 100644 --- a/homeassistant/components/smhi/.translations/en.json +++ b/homeassistant/components/smhi/.translations/en.json @@ -14,6 +14,5 @@ "title": "Location in Sweden" } } - }, - "title": "Swedish weather service (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/es-419.json b/homeassistant/components/smhi/.translations/es-419.json index e4524f4dcc38..3db65a34ad9d 100644 --- a/homeassistant/components/smhi/.translations/es-419.json +++ b/homeassistant/components/smhi/.translations/es-419.json @@ -14,6 +14,5 @@ "title": "Ubicaci\u00f3n en Suecia" } } - }, - "title": "Servicio meteorol\u00f3gico sueco (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/es.json b/homeassistant/components/smhi/.translations/es.json index 5cfefc80793b..d9902ba7d083 100644 --- a/homeassistant/components/smhi/.translations/es.json +++ b/homeassistant/components/smhi/.translations/es.json @@ -14,6 +14,5 @@ "title": "Ubicaci\u00f3n en Suecia" } } - }, - "title": "Servicio meteorol\u00f3gico sueco (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/fr.json b/homeassistant/components/smhi/.translations/fr.json index bd0ad0266152..ec5350903487 100644 --- a/homeassistant/components/smhi/.translations/fr.json +++ b/homeassistant/components/smhi/.translations/fr.json @@ -14,6 +14,5 @@ "title": "Localisation en Su\u00e8de" } } - }, - "title": "Service m\u00e9t\u00e9orologique su\u00e9dois (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/hu.json b/homeassistant/components/smhi/.translations/hu.json index bd39f4cff725..425cf927631e 100644 --- a/homeassistant/components/smhi/.translations/hu.json +++ b/homeassistant/components/smhi/.translations/hu.json @@ -14,6 +14,5 @@ "title": "Helysz\u00edn Sv\u00e9dorsz\u00e1gban" } } - }, - "title": "Sv\u00e9d Meteorol\u00f3giai Szolg\u00e1lat (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/it.json b/homeassistant/components/smhi/.translations/it.json index b3b4155a556b..b45b60babfe8 100644 --- a/homeassistant/components/smhi/.translations/it.json +++ b/homeassistant/components/smhi/.translations/it.json @@ -14,6 +14,5 @@ "title": "Localit\u00e0 in Svezia" } } - }, - "title": "Servizio meteo svedese (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ko.json b/homeassistant/components/smhi/.translations/ko.json index 3e3ab1e2ac71..dac6c9018b2e 100644 --- a/homeassistant/components/smhi/.translations/ko.json +++ b/homeassistant/components/smhi/.translations/ko.json @@ -14,6 +14,5 @@ "title": "\uc2a4\uc6e8\ub374 \uc9c0\uc5ed \uc704\uce58" } } - }, - "title": "\uc2a4\uc6e8\ub374 \uae30\uc0c1 \uc11c\ube44\uc2a4 (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/lb.json b/homeassistant/components/smhi/.translations/lb.json index b70a3059be06..9444569c4a15 100644 --- a/homeassistant/components/smhi/.translations/lb.json +++ b/homeassistant/components/smhi/.translations/lb.json @@ -14,6 +14,5 @@ "title": "Uertschaft an Schweden" } } - }, - "title": "Schwedeschen Wieder D\u00e9ngscht (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/nl.json b/homeassistant/components/smhi/.translations/nl.json index 7227ff139b07..06ce8442ad24 100644 --- a/homeassistant/components/smhi/.translations/nl.json +++ b/homeassistant/components/smhi/.translations/nl.json @@ -14,6 +14,5 @@ "title": "Locatie in Zweden" } } - }, - "title": "Zweedse weerdienst (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/no.json b/homeassistant/components/smhi/.translations/no.json index 223150f2cd55..952e98b6481f 100644 --- a/homeassistant/components/smhi/.translations/no.json +++ b/homeassistant/components/smhi/.translations/no.json @@ -14,6 +14,5 @@ "title": "Plassering i Sverige" } } - }, - "title": "Sveriges Meteorologiske og Hydrologiske Institut (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pl.json b/homeassistant/components/smhi/.translations/pl.json index 5bfd1d487f17..612d12e77173 100644 --- a/homeassistant/components/smhi/.translations/pl.json +++ b/homeassistant/components/smhi/.translations/pl.json @@ -14,6 +14,5 @@ "title": "Lokalizacja w Szwecji" } } - }, - "title": "Szwedzka us\u0142uga pogodowa (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pt-BR.json b/homeassistant/components/smhi/.translations/pt-BR.json index 6e888f6d5c80..0bc966fdd6cb 100644 --- a/homeassistant/components/smhi/.translations/pt-BR.json +++ b/homeassistant/components/smhi/.translations/pt-BR.json @@ -14,6 +14,5 @@ "title": "Localiza\u00e7\u00e3o na Su\u00e9cia" } } - }, - "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/pt.json b/homeassistant/components/smhi/.translations/pt.json index 3272cd00908d..c23a33b6e192 100644 --- a/homeassistant/components/smhi/.translations/pt.json +++ b/homeassistant/components/smhi/.translations/pt.json @@ -14,6 +14,5 @@ "title": "Localiza\u00e7\u00e3o na Su\u00e9cia" } } - }, - "title": "Servi\u00e7o meteorol\u00f3gico sueco (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ro.json b/homeassistant/components/smhi/.translations/ro.json index 0ed6fd4d1402..0261289fd31d 100644 --- a/homeassistant/components/smhi/.translations/ro.json +++ b/homeassistant/components/smhi/.translations/ro.json @@ -14,6 +14,5 @@ "title": "Loca\u021bie \u00een Suedia" } } - }, - "title": "Serviciul meteorologic suedez (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/ru.json b/homeassistant/components/smhi/.translations/ru.json index 6096d9b7f932..35c182455dab 100644 --- a/homeassistant/components/smhi/.translations/ru.json +++ b/homeassistant/components/smhi/.translations/ru.json @@ -14,6 +14,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0428\u0432\u0435\u0446\u0438\u0438" } } - }, - "title": "\u041c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u0428\u0432\u0435\u0446\u0438\u0438 (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/sl.json b/homeassistant/components/smhi/.translations/sl.json index 3dc7f769cd25..91fe7d8375ff 100644 --- a/homeassistant/components/smhi/.translations/sl.json +++ b/homeassistant/components/smhi/.translations/sl.json @@ -14,6 +14,5 @@ "title": "Lokacija na \u0160vedskem" } } - }, - "title": "\u0160vedska vremenska slu\u017eba (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/sv.json b/homeassistant/components/smhi/.translations/sv.json index f79a28314389..b6afc479b70a 100644 --- a/homeassistant/components/smhi/.translations/sv.json +++ b/homeassistant/components/smhi/.translations/sv.json @@ -14,6 +14,5 @@ "title": "Plats i Sverige" } } - }, - "title": "Svensk v\u00e4derservice (SMHI)" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/zh-Hans.json b/homeassistant/components/smhi/.translations/zh-Hans.json index 964bb4942ec4..b2ddc3aa1d7a 100644 --- a/homeassistant/components/smhi/.translations/zh-Hans.json +++ b/homeassistant/components/smhi/.translations/zh-Hans.json @@ -14,6 +14,5 @@ "title": "\u5728\u745e\u5178\u7684\u4f4d\u7f6e" } } - }, - "title": "\u745e\u5178\u6c14\u8c61\u670d\u52a1\uff08SMHI\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/smhi/.translations/zh-Hant.json b/homeassistant/components/smhi/.translations/zh-Hant.json index 281726861a87..a37d47cd1500 100644 --- a/homeassistant/components/smhi/.translations/zh-Hant.json +++ b/homeassistant/components/smhi/.translations/zh-Hant.json @@ -14,6 +14,5 @@ "title": "\u745e\u5178\u5ea7\u6a19" } } - }, - "title": "\u745e\u5178\u6c23\u8c61\u670d\u52d9\uff08SMHI\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/bg.json b/homeassistant/components/solaredge/.translations/bg.json index 41154732530c..72f1ad2a4c75 100644 --- a/homeassistant/components/solaredge/.translations/bg.json +++ b/homeassistant/components/solaredge/.translations/bg.json @@ -16,6 +16,5 @@ "title": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (API) \u0437\u0430 \u0442\u0430\u0437\u0438 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u044f" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ca.json b/homeassistant/components/solaredge/.translations/ca.json index 84b05f3a26ac..56e1633e3a14 100644 --- a/homeassistant/components/solaredge/.translations/ca.json +++ b/homeassistant/components/solaredge/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Configuraci\u00f3 dels par\u00e0metres de l'API per aquesta instal\u00b7laci\u00f3" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/da.json b/homeassistant/components/solaredge/.translations/da.json index 978bacfbec45..ed452d2c9a8d 100644 --- a/homeassistant/components/solaredge/.translations/da.json +++ b/homeassistant/components/solaredge/.translations/da.json @@ -16,6 +16,5 @@ "title": "Definer API-parametre til denne installation" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/de.json b/homeassistant/components/solaredge/.translations/de.json index f75a9af1b668..236ff724a06c 100644 --- a/homeassistant/components/solaredge/.translations/de.json +++ b/homeassistant/components/solaredge/.translations/de.json @@ -16,6 +16,5 @@ "title": "Definiere die API-Parameter f\u00fcr diese Installation" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/en.json b/homeassistant/components/solaredge/.translations/en.json index d9345e42fdca..75ce6f536128 100644 --- a/homeassistant/components/solaredge/.translations/en.json +++ b/homeassistant/components/solaredge/.translations/en.json @@ -16,6 +16,5 @@ "title": "Define the API parameters for this installation" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/es.json b/homeassistant/components/solaredge/.translations/es.json index 458ba0436a22..f3a97d29f50b 100644 --- a/homeassistant/components/solaredge/.translations/es.json +++ b/homeassistant/components/solaredge/.translations/es.json @@ -16,6 +16,5 @@ "title": "Definir los par\u00e1metros de la API para esta instalaci\u00f3n" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/fr.json b/homeassistant/components/solaredge/.translations/fr.json index f2d4e623fcfd..b03a29ad2e18 100644 --- a/homeassistant/components/solaredge/.translations/fr.json +++ b/homeassistant/components/solaredge/.translations/fr.json @@ -16,6 +16,5 @@ "title": "D\u00e9finir les param\u00e8tres de l'API pour cette installation" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/hu.json b/homeassistant/components/solaredge/.translations/hu.json index 22d7727637aa..ed1826717091 100644 --- a/homeassistant/components/solaredge/.translations/hu.json +++ b/homeassistant/components/solaredge/.translations/hu.json @@ -8,6 +8,5 @@ "title": "Az API param\u00e9terek megad\u00e1sa ehhez a telep\u00edt\u00e9shez" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/it.json b/homeassistant/components/solaredge/.translations/it.json index 483edab97b4b..eeac06cee2da 100644 --- a/homeassistant/components/solaredge/.translations/it.json +++ b/homeassistant/components/solaredge/.translations/it.json @@ -16,6 +16,5 @@ "title": "Definire i parametri API per questa installazione" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ko.json b/homeassistant/components/solaredge/.translations/ko.json index ff2e4b1e97a6..be49825c8fbb 100644 --- a/homeassistant/components/solaredge/.translations/ko.json +++ b/homeassistant/components/solaredge/.translations/ko.json @@ -16,6 +16,5 @@ "title": "\uc774 \uc124\uce58\uc5d0 \ub300\ud55c API \ub9e4\uac1c\ubcc0\uc218\ub97c \uc815\uc758\ud574\uc8fc\uc138\uc694" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/lb.json b/homeassistant/components/solaredge/.translations/lb.json index 76d928833a6c..eec29815f644 100644 --- a/homeassistant/components/solaredge/.translations/lb.json +++ b/homeassistant/components/solaredge/.translations/lb.json @@ -16,6 +16,5 @@ "title": "API Parameter fir d\u00ebs Installatioun d\u00e9fin\u00e9ieren" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/nl.json b/homeassistant/components/solaredge/.translations/nl.json index 15cf27984b77..4b4682184106 100644 --- a/homeassistant/components/solaredge/.translations/nl.json +++ b/homeassistant/components/solaredge/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Definieer de API-parameters voor deze installatie" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/no.json b/homeassistant/components/solaredge/.translations/no.json index 6f41bfe0a2b4..f2c380ca30dd 100644 --- a/homeassistant/components/solaredge/.translations/no.json +++ b/homeassistant/components/solaredge/.translations/no.json @@ -16,6 +16,5 @@ "title": "Definer API-parametrene for denne installasjonen" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/pl.json b/homeassistant/components/solaredge/.translations/pl.json index 53370bac086f..afef3401cad8 100644 --- a/homeassistant/components/solaredge/.translations/pl.json +++ b/homeassistant/components/solaredge/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Zdefiniuj parametry API dla tej instalacji" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/ru.json b/homeassistant/components/solaredge/.translations/ru.json index 491072a841bb..1dadfbf94ee8 100644 --- a/homeassistant/components/solaredge/.translations/ru.json +++ b/homeassistant/components/solaredge/.translations/ru.json @@ -16,6 +16,5 @@ "title": "SolarEdge" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/sl.json b/homeassistant/components/solaredge/.translations/sl.json index 4ac26d670b88..3f6e78fd3b42 100644 --- a/homeassistant/components/solaredge/.translations/sl.json +++ b/homeassistant/components/solaredge/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Dolo\u010dite parametre API za to namestitev" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/sv.json b/homeassistant/components/solaredge/.translations/sv.json index 42a2c217051b..01c52eb7fb4b 100644 --- a/homeassistant/components/solaredge/.translations/sv.json +++ b/homeassistant/components/solaredge/.translations/sv.json @@ -16,6 +16,5 @@ "title": "Definiera API-parametrarna f\u00f6r den h\u00e4r installationen" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solaredge/.translations/zh-Hant.json b/homeassistant/components/solaredge/.translations/zh-Hant.json index f3802963243f..a63485cf300e 100644 --- a/homeassistant/components/solaredge/.translations/zh-Hant.json +++ b/homeassistant/components/solaredge/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u8a2d\u5b9a API \u53c3\u6578" } } - }, - "title": "SolarEdge" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/bg.json b/homeassistant/components/solarlog/.translations/bg.json index 7c730cbba473..bf4d97de5058 100644 --- a/homeassistant/components/solarlog/.translations/bg.json +++ b/homeassistant/components/solarlog/.translations/bg.json @@ -16,6 +16,5 @@ "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0441\u0438 \u0441\u044a\u0441 Solar-log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ca.json b/homeassistant/components/solarlog/.translations/ca.json index 699eebac65c9..a159dd1f6e31 100644 --- a/homeassistant/components/solarlog/.translations/ca.json +++ b/homeassistant/components/solarlog/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Configuraci\u00f3 de la connexi\u00f3 amb Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/cs.json b/homeassistant/components/solarlog/.translations/cs.json index 2930048d59d4..1c4afe266624 100644 --- a/homeassistant/components/solarlog/.translations/cs.json +++ b/homeassistant/components/solarlog/.translations/cs.json @@ -16,6 +16,5 @@ "title": "Definujte sv\u00e9 p\u0159ipojen\u00ed Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/da.json b/homeassistant/components/solarlog/.translations/da.json index 1ce3bc44de50..8d02a79a5aea 100644 --- a/homeassistant/components/solarlog/.translations/da.json +++ b/homeassistant/components/solarlog/.translations/da.json @@ -16,6 +16,5 @@ "title": "Angiv dit Solar-Log forbindelse" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/de.json b/homeassistant/components/solarlog/.translations/de.json index 621bd13ee1bd..8b10d00e538a 100644 --- a/homeassistant/components/solarlog/.translations/de.json +++ b/homeassistant/components/solarlog/.translations/de.json @@ -16,6 +16,5 @@ "title": "Definiere deine Solar-Log-Verbindung" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/en.json b/homeassistant/components/solarlog/.translations/en.json index 136ef6fe14e6..72c1acf7bd11 100644 --- a/homeassistant/components/solarlog/.translations/en.json +++ b/homeassistant/components/solarlog/.translations/en.json @@ -16,6 +16,5 @@ "title": "Define your Solar-Log connection" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/es.json b/homeassistant/components/solarlog/.translations/es.json index 4e171b99df6f..fcf2b0c58bb8 100644 --- a/homeassistant/components/solarlog/.translations/es.json +++ b/homeassistant/components/solarlog/.translations/es.json @@ -16,6 +16,5 @@ "title": "Defina su conexi\u00f3n Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/fr.json b/homeassistant/components/solarlog/.translations/fr.json index d9a6a482e885..2de03d82c314 100644 --- a/homeassistant/components/solarlog/.translations/fr.json +++ b/homeassistant/components/solarlog/.translations/fr.json @@ -16,6 +16,5 @@ "title": "D\u00e9finissez votre connexion Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/it.json b/homeassistant/components/solarlog/.translations/it.json index 81ac10aad54b..046faae52f71 100644 --- a/homeassistant/components/solarlog/.translations/it.json +++ b/homeassistant/components/solarlog/.translations/it.json @@ -16,6 +16,5 @@ "title": "Definire la connessione Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ko.json b/homeassistant/components/solarlog/.translations/ko.json index 64c56cb37d32..058f9ac9a9c8 100644 --- a/homeassistant/components/solarlog/.translations/ko.json +++ b/homeassistant/components/solarlog/.translations/ko.json @@ -16,6 +16,5 @@ "title": "Solar-Log \uc5f0\uacb0 \uc815\uc758" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/lb.json b/homeassistant/components/solarlog/.translations/lb.json index 5d835341b6cc..e0008dcb4cd6 100644 --- a/homeassistant/components/solarlog/.translations/lb.json +++ b/homeassistant/components/solarlog/.translations/lb.json @@ -16,6 +16,5 @@ "title": "D\u00e9fin\u00e9iert \u00e4r Solar-Log Verbindung" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/nl.json b/homeassistant/components/solarlog/.translations/nl.json index 36ccf94c22d1..8ccf5e626c76 100644 --- a/homeassistant/components/solarlog/.translations/nl.json +++ b/homeassistant/components/solarlog/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Definieer uw Solar-Log verbinding" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/no.json b/homeassistant/components/solarlog/.translations/no.json index 5963c62bd487..5b7f2e43e3be 100644 --- a/homeassistant/components/solarlog/.translations/no.json +++ b/homeassistant/components/solarlog/.translations/no.json @@ -16,6 +16,5 @@ "title": "Definer din Solar-Log tilkobling" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/pl.json b/homeassistant/components/solarlog/.translations/pl.json index 00d2f264b293..a61257b6d16b 100644 --- a/homeassistant/components/solarlog/.translations/pl.json +++ b/homeassistant/components/solarlog/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Zdefiniuj po\u0142\u0105czenie z Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/ru.json b/homeassistant/components/solarlog/.translations/ru.json index 5f9497d48f81..ecaaee01aef4 100644 --- a/homeassistant/components/solarlog/.translations/ru.json +++ b/homeassistant/components/solarlog/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/sl.json b/homeassistant/components/solarlog/.translations/sl.json index 8024236963c1..8f2682b3fb19 100644 --- a/homeassistant/components/solarlog/.translations/sl.json +++ b/homeassistant/components/solarlog/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Dolo\u010dite povezavo Solar-Log" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/sv.json b/homeassistant/components/solarlog/.translations/sv.json index 9942533798bd..5522840f1891 100644 --- a/homeassistant/components/solarlog/.translations/sv.json +++ b/homeassistant/components/solarlog/.translations/sv.json @@ -16,6 +16,5 @@ "title": "Definiera din Solar-Log-anslutning" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/solarlog/.translations/zh-Hant.json b/homeassistant/components/solarlog/.translations/zh-Hant.json index 580418df94b5..435b7564bcc4 100644 --- a/homeassistant/components/solarlog/.translations/zh-Hant.json +++ b/homeassistant/components/solarlog/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u5b9a\u7fa9 Solar-Log \u9023\u7dda" } } - }, - "title": "Solar-Log" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/bg.json b/homeassistant/components/soma/.translations/bg.json index 064da5cedf3f..bfdebd385a62 100644 --- a/homeassistant/components/soma/.translations/bg.json +++ b/homeassistant/components/soma/.translations/bg.json @@ -18,6 +18,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ca.json b/homeassistant/components/soma/.translations/ca.json index b08beffb16c3..3d79c8d744d8 100644 --- a/homeassistant/components/soma/.translations/ca.json +++ b/homeassistant/components/soma/.translations/ca.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/da.json b/homeassistant/components/soma/.translations/da.json index b13fb51aa50b..2f582b0826d7 100644 --- a/homeassistant/components/soma/.translations/da.json +++ b/homeassistant/components/soma/.translations/da.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/de.json b/homeassistant/components/soma/.translations/de.json index 75a19c6a208b..79cd15df3be9 100644 --- a/homeassistant/components/soma/.translations/de.json +++ b/homeassistant/components/soma/.translations/de.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/en.json b/homeassistant/components/soma/.translations/en.json index 46b2f34b7a26..6f28ee53ae26 100644 --- a/homeassistant/components/soma/.translations/en.json +++ b/homeassistant/components/soma/.translations/en.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/es.json b/homeassistant/components/soma/.translations/es.json index 420cf8fbb493..008404df5991 100644 --- a/homeassistant/components/soma/.translations/es.json +++ b/homeassistant/components/soma/.translations/es.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/fr.json b/homeassistant/components/soma/.translations/fr.json index 69f98c185043..b0a287b1708f 100644 --- a/homeassistant/components/soma/.translations/fr.json +++ b/homeassistant/components/soma/.translations/fr.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/hu.json b/homeassistant/components/soma/.translations/hu.json index 9c63ecc36650..357ff2ac170c 100644 --- a/homeassistant/components/soma/.translations/hu.json +++ b/homeassistant/components/soma/.translations/hu.json @@ -18,6 +18,5 @@ "title": "SOMA csatlakoz\u00e1s" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/it.json b/homeassistant/components/soma/.translations/it.json index 6bd93ee7bfdc..0119fca7388e 100644 --- a/homeassistant/components/soma/.translations/it.json +++ b/homeassistant/components/soma/.translations/it.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ko.json b/homeassistant/components/soma/.translations/ko.json index 4a1cca9e5399..ff241531ecf9 100644 --- a/homeassistant/components/soma/.translations/ko.json +++ b/homeassistant/components/soma/.translations/ko.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/lb.json b/homeassistant/components/soma/.translations/lb.json index b484d5925a5a..af48b1ab8c81 100644 --- a/homeassistant/components/soma/.translations/lb.json +++ b/homeassistant/components/soma/.translations/lb.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/nl.json b/homeassistant/components/soma/.translations/nl.json index 823ee6c75314..fad7efdf398a 100644 --- a/homeassistant/components/soma/.translations/nl.json +++ b/homeassistant/components/soma/.translations/nl.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/no.json b/homeassistant/components/soma/.translations/no.json index 43109352dff6..e71dd3c4ea5a 100644 --- a/homeassistant/components/soma/.translations/no.json +++ b/homeassistant/components/soma/.translations/no.json @@ -20,6 +20,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/pl.json b/homeassistant/components/soma/.translations/pl.json index c77ebb5369f3..8d83b05e736f 100644 --- a/homeassistant/components/soma/.translations/pl.json +++ b/homeassistant/components/soma/.translations/pl.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/ru.json b/homeassistant/components/soma/.translations/ru.json index cb9786da233b..119bd828c60f 100644 --- a/homeassistant/components/soma/.translations/ru.json +++ b/homeassistant/components/soma/.translations/ru.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/sl.json b/homeassistant/components/soma/.translations/sl.json index c8ea22517588..4b68d5dd42f4 100644 --- a/homeassistant/components/soma/.translations/sl.json +++ b/homeassistant/components/soma/.translations/sl.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/sv.json b/homeassistant/components/soma/.translations/sv.json index ece81ba345b2..e71d816b4120 100644 --- a/homeassistant/components/soma/.translations/sv.json +++ b/homeassistant/components/soma/.translations/sv.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/soma/.translations/zh-Hant.json b/homeassistant/components/soma/.translations/zh-Hant.json index e3882a4fc2dc..16659304045b 100644 --- a/homeassistant/components/soma/.translations/zh-Hant.json +++ b/homeassistant/components/soma/.translations/zh-Hant.json @@ -20,6 +20,5 @@ "title": "SOMA Connect" } } - }, - "title": "Soma" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/bg.json b/homeassistant/components/somfy/.translations/bg.json index 043f37e52f83..f115865a2b82 100644 --- a/homeassistant/components/somfy/.translations/bg.json +++ b/homeassistant/components/somfy/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u0418\u0437\u0431\u043e\u0440 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ca.json b/homeassistant/components/somfy/.translations/ca.json index 4c917794ca96..d3e2f7b16aac 100644 --- a/homeassistant/components/somfy/.translations/ca.json +++ b/homeassistant/components/somfy/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/da.json b/homeassistant/components/somfy/.translations/da.json index 0cd23e6a11b5..be7d8e941932 100644 --- a/homeassistant/components/somfy/.translations/da.json +++ b/homeassistant/components/somfy/.translations/da.json @@ -13,6 +13,5 @@ "title": "V\u00e6lg godkendelsesmetode" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/de.json b/homeassistant/components/somfy/.translations/de.json index 9db0ccb35057..b2f27a8fccaa 100644 --- a/homeassistant/components/somfy/.translations/de.json +++ b/homeassistant/components/somfy/.translations/de.json @@ -13,6 +13,5 @@ "title": "W\u00e4hle die Authentifizierungsmethode" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/en.json b/homeassistant/components/somfy/.translations/en.json index 54c6e3b8336e..da7890f959b4 100644 --- a/homeassistant/components/somfy/.translations/en.json +++ b/homeassistant/components/somfy/.translations/en.json @@ -13,6 +13,5 @@ "title": "Pick Authentication Method" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/es.json b/homeassistant/components/somfy/.translations/es.json index ce2614b9989d..bbb1cedad98f 100644 --- a/homeassistant/components/somfy/.translations/es.json +++ b/homeassistant/components/somfy/.translations/es.json @@ -13,6 +13,5 @@ "title": "Seleccione el m\u00e9todo de autenticaci\u00f3n" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/fr.json b/homeassistant/components/somfy/.translations/fr.json index 70cf906841a3..5df01fe951be 100644 --- a/homeassistant/components/somfy/.translations/fr.json +++ b/homeassistant/components/somfy/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Choisir la m\u00e9thode d'authentification" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/hr.json b/homeassistant/components/somfy/.translations/hr.json index b9dad43c44e0..a601eb2b9bf6 100644 --- a/homeassistant/components/somfy/.translations/hr.json +++ b/homeassistant/components/somfy/.translations/hr.json @@ -3,6 +3,5 @@ "create_entry": { "default": "Uspje\u0161no autentificirano sa Somfy." } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/it.json b/homeassistant/components/somfy/.translations/it.json index 0c0ccf25a124..7e1a15cbde82 100644 --- a/homeassistant/components/somfy/.translations/it.json +++ b/homeassistant/components/somfy/.translations/it.json @@ -13,6 +13,5 @@ "title": "Seleziona il metodo di autenticazione" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ko.json b/homeassistant/components/somfy/.translations/ko.json index 1ce59e3dbc5d..a77d66c02f8c 100644 --- a/homeassistant/components/somfy/.translations/ko.json +++ b/homeassistant/components/somfy/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/lb.json b/homeassistant/components/somfy/.translations/lb.json index 8ed84338a1e0..f34c07efd06c 100644 --- a/homeassistant/components/somfy/.translations/lb.json +++ b/homeassistant/components/somfy/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Wielt Authentifikatiouns Method aus" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/nl.json b/homeassistant/components/somfy/.translations/nl.json index 4d764b0dab64..b0afb6ef168c 100644 --- a/homeassistant/components/somfy/.translations/nl.json +++ b/homeassistant/components/somfy/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Kies de authenticatie methode" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/no.json b/homeassistant/components/somfy/.translations/no.json index 3a28194f6e00..64bd20acf946 100644 --- a/homeassistant/components/somfy/.translations/no.json +++ b/homeassistant/components/somfy/.translations/no.json @@ -13,6 +13,5 @@ "title": "Velg autentiseringsmetode" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/pl.json b/homeassistant/components/somfy/.translations/pl.json index d9a7fd5307ea..0f062f65faa6 100644 --- a/homeassistant/components/somfy/.translations/pl.json +++ b/homeassistant/components/somfy/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Wybierz metod\u0119 uwierzytelniania" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/pt-BR.json b/homeassistant/components/somfy/.translations/pt-BR.json index 2f3a55fc9112..81c0de81e70c 100644 --- a/homeassistant/components/somfy/.translations/pt-BR.json +++ b/homeassistant/components/somfy/.translations/pt-BR.json @@ -8,6 +8,5 @@ "create_entry": { "default": "Autenticado com sucesso pela Somfy." } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/ru.json b/homeassistant/components/somfy/.translations/ru.json index 8b9244c5d9f4..cc1fe4c17d9f 100644 --- a/homeassistant/components/somfy/.translations/ru.json +++ b/homeassistant/components/somfy/.translations/ru.json @@ -13,6 +13,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/sl.json b/homeassistant/components/somfy/.translations/sl.json index cc8be9303412..b86ea9b33cbf 100644 --- a/homeassistant/components/somfy/.translations/sl.json +++ b/homeassistant/components/somfy/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Izberite na\u010din preverjanja pristnosti" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/sv.json b/homeassistant/components/somfy/.translations/sv.json index 4fa8975523ec..6f3d15206eb2 100644 --- a/homeassistant/components/somfy/.translations/sv.json +++ b/homeassistant/components/somfy/.translations/sv.json @@ -13,6 +13,5 @@ "title": "V\u00e4lj autentiseringsmetod" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/somfy/.translations/zh-Hant.json b/homeassistant/components/somfy/.translations/zh-Hant.json index 1fbff59337be..b5875aaf088a 100644 --- a/homeassistant/components/somfy/.translations/zh-Hant.json +++ b/homeassistant/components/somfy/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } } - }, - "title": "Somfy" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/bg.json b/homeassistant/components/sonos/.translations/bg.json index c1f87cd9a702..0c9d9a8d8e50 100644 --- a/homeassistant/components/sonos/.translations/bg.json +++ b/homeassistant/components/sonos/.translations/bg.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ca.json b/homeassistant/components/sonos/.translations/ca.json index ef651375e51e..683149c6fd84 100644 --- a/homeassistant/components/sonos/.translations/ca.json +++ b/homeassistant/components/sonos/.translations/ca.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/cs.json b/homeassistant/components/sonos/.translations/cs.json index 945519c859e5..9f87f719b5ef 100644 --- a/homeassistant/components/sonos/.translations/cs.json +++ b/homeassistant/components/sonos/.translations/cs.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/da.json b/homeassistant/components/sonos/.translations/da.json index 20cb32c9c0b7..5c8c3cdeb3e1 100644 --- a/homeassistant/components/sonos/.translations/da.json +++ b/homeassistant/components/sonos/.translations/da.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/de.json b/homeassistant/components/sonos/.translations/de.json index 423684442e5a..b08900034ede 100644 --- a/homeassistant/components/sonos/.translations/de.json +++ b/homeassistant/components/sonos/.translations/de.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/en.json b/homeassistant/components/sonos/.translations/en.json index 14f85bae3204..69b8bd6c3b87 100644 --- a/homeassistant/components/sonos/.translations/en.json +++ b/homeassistant/components/sonos/.translations/en.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/es-419.json b/homeassistant/components/sonos/.translations/es-419.json index b260aa210808..ba7503234262 100644 --- a/homeassistant/components/sonos/.translations/es-419.json +++ b/homeassistant/components/sonos/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/es.json b/homeassistant/components/sonos/.translations/es.json index 4a1321bfda14..296dc3f222e5 100644 --- a/homeassistant/components/sonos/.translations/es.json +++ b/homeassistant/components/sonos/.translations/es.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/et.json b/homeassistant/components/sonos/.translations/et.json index a98a23c7f0bd..0e652624ef61 100644 --- a/homeassistant/components/sonos/.translations/et.json +++ b/homeassistant/components/sonos/.translations/et.json @@ -5,6 +5,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/fr.json b/homeassistant/components/sonos/.translations/fr.json index 5891a80dfcd3..d15390fdcf08 100644 --- a/homeassistant/components/sonos/.translations/fr.json +++ b/homeassistant/components/sonos/.translations/fr.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/he.json b/homeassistant/components/sonos/.translations/he.json index 51e4c1139467..609cc3747be7 100644 --- a/homeassistant/components/sonos/.translations/he.json +++ b/homeassistant/components/sonos/.translations/he.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/hr.json b/homeassistant/components/sonos/.translations/hr.json index 835f113ba2f1..213ae1e4bce5 100644 --- a/homeassistant/components/sonos/.translations/hr.json +++ b/homeassistant/components/sonos/.translations/hr.json @@ -5,6 +5,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/hu.json b/homeassistant/components/sonos/.translations/hu.json index 5c85ca259480..771f48d1d9bb 100644 --- a/homeassistant/components/sonos/.translations/hu.json +++ b/homeassistant/components/sonos/.translations/hu.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/id.json b/homeassistant/components/sonos/.translations/id.json index f9ba72d2013c..b5b421d2d799 100644 --- a/homeassistant/components/sonos/.translations/id.json +++ b/homeassistant/components/sonos/.translations/id.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/it.json b/homeassistant/components/sonos/.translations/it.json index 60c93f7b4291..1307f4cfe7ba 100644 --- a/homeassistant/components/sonos/.translations/it.json +++ b/homeassistant/components/sonos/.translations/it.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ko.json b/homeassistant/components/sonos/.translations/ko.json index 8bf0b347b9de..8ae4c30e1566 100644 --- a/homeassistant/components/sonos/.translations/ko.json +++ b/homeassistant/components/sonos/.translations/ko.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/lb.json b/homeassistant/components/sonos/.translations/lb.json index d39a4d544f5d..f2c1675a14c1 100644 --- a/homeassistant/components/sonos/.translations/lb.json +++ b/homeassistant/components/sonos/.translations/lb.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/nl.json b/homeassistant/components/sonos/.translations/nl.json index d47b5648538e..5efd65b1c798 100644 --- a/homeassistant/components/sonos/.translations/nl.json +++ b/homeassistant/components/sonos/.translations/nl.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/nn.json b/homeassistant/components/sonos/.translations/nn.json index a3540b0e294b..cb08944d26bd 100644 --- a/homeassistant/components/sonos/.translations/nn.json +++ b/homeassistant/components/sonos/.translations/nn.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/no.json b/homeassistant/components/sonos/.translations/no.json index 32780cecfbdc..5e6560a294a2 100644 --- a/homeassistant/components/sonos/.translations/no.json +++ b/homeassistant/components/sonos/.translations/no.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pl.json b/homeassistant/components/sonos/.translations/pl.json index 2ebe0e5d3f3f..56a0e6d53418 100644 --- a/homeassistant/components/sonos/.translations/pl.json +++ b/homeassistant/components/sonos/.translations/pl.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pt-BR.json b/homeassistant/components/sonos/.translations/pt-BR.json index c761b08c6027..77e2c75540a6 100644 --- a/homeassistant/components/sonos/.translations/pt-BR.json +++ b/homeassistant/components/sonos/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pt.json b/homeassistant/components/sonos/.translations/pt.json index 7296efb6879e..765d5803675e 100644 --- a/homeassistant/components/sonos/.translations/pt.json +++ b/homeassistant/components/sonos/.translations/pt.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ro.json b/homeassistant/components/sonos/.translations/ro.json index c2e4899b5d5a..338539bf25bd 100644 --- a/homeassistant/components/sonos/.translations/ro.json +++ b/homeassistant/components/sonos/.translations/ro.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ru.json b/homeassistant/components/sonos/.translations/ru.json index 5389beaec722..fd5f3f6ef09d 100644 --- a/homeassistant/components/sonos/.translations/ru.json +++ b/homeassistant/components/sonos/.translations/ru.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/sl.json b/homeassistant/components/sonos/.translations/sl.json index e4fb004456fb..b3d4cc352f50 100644 --- a/homeassistant/components/sonos/.translations/sl.json +++ b/homeassistant/components/sonos/.translations/sl.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/sv.json b/homeassistant/components/sonos/.translations/sv.json index 439e9aca7901..789c9b84a65e 100644 --- a/homeassistant/components/sonos/.translations/sv.json +++ b/homeassistant/components/sonos/.translations/sv.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/vi.json b/homeassistant/components/sonos/.translations/vi.json index 5ff26dea4987..b047e636eea2 100644 --- a/homeassistant/components/sonos/.translations/vi.json +++ b/homeassistant/components/sonos/.translations/vi.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/zh-Hans.json b/homeassistant/components/sonos/.translations/zh-Hans.json index 4a29360e2cb7..7ea329dc9034 100644 --- a/homeassistant/components/sonos/.translations/zh-Hans.json +++ b/homeassistant/components/sonos/.translations/zh-Hans.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/zh-Hant.json b/homeassistant/components/sonos/.translations/zh-Hant.json index d118212e77b1..3b56f9ece6b4 100644 --- a/homeassistant/components/sonos/.translations/zh-Hant.json +++ b/homeassistant/components/sonos/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "Sonos" } } - }, - "title": "Sonos" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ca.json b/homeassistant/components/spotify/.translations/ca.json index c4aacd2700db..887d3b7236cc 100644 --- a/homeassistant/components/spotify/.translations/ca.json +++ b/homeassistant/components/spotify/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Selecci\u00f3 del m\u00e8tode d'autenticaci\u00f3" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/cs.json b/homeassistant/components/spotify/.translations/cs.json index 7e0f58ad78d7..10c58c119aa1 100644 --- a/homeassistant/components/spotify/.translations/cs.json +++ b/homeassistant/components/spotify/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Vyberte metodu ov\u011b\u0159en\u00ed" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/da.json b/homeassistant/components/spotify/.translations/da.json index b9cf4cb2eff9..1b6611c4cb62 100644 --- a/homeassistant/components/spotify/.translations/da.json +++ b/homeassistant/components/spotify/.translations/da.json @@ -13,6 +13,5 @@ "title": "V\u00e6lg godkendelsesmetode" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/de.json b/homeassistant/components/spotify/.translations/de.json index 8d16fbf7f991..ff17a3ada82c 100644 --- a/homeassistant/components/spotify/.translations/de.json +++ b/homeassistant/components/spotify/.translations/de.json @@ -13,6 +13,5 @@ "title": "Authentifizierungsmethode ausw\u00e4hlen" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/en.json b/homeassistant/components/spotify/.translations/en.json index 6400bfcd7dce..c869d06cab35 100644 --- a/homeassistant/components/spotify/.translations/en.json +++ b/homeassistant/components/spotify/.translations/en.json @@ -13,6 +13,5 @@ "title": "Pick Authentication Method" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/es.json b/homeassistant/components/spotify/.translations/es.json index 6da10f785f9f..78b71486b712 100644 --- a/homeassistant/components/spotify/.translations/es.json +++ b/homeassistant/components/spotify/.translations/es.json @@ -13,6 +13,5 @@ "title": "Elija el m\u00e9todo de autenticaci\u00f3n" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/fr.json b/homeassistant/components/spotify/.translations/fr.json index 7fa73eb02cd5..d4adbe155fec 100644 --- a/homeassistant/components/spotify/.translations/fr.json +++ b/homeassistant/components/spotify/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Choisissez la m\u00e9thode d'authentification" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/hu.json b/homeassistant/components/spotify/.translations/hu.json index a51a4fb2583f..48ebf35a97f7 100644 --- a/homeassistant/components/spotify/.translations/hu.json +++ b/homeassistant/components/spotify/.translations/hu.json @@ -13,6 +13,5 @@ "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9si m\u00f3dszert" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/it.json b/homeassistant/components/spotify/.translations/it.json index 893d33225f21..c3bfaa47f32f 100644 --- a/homeassistant/components/spotify/.translations/it.json +++ b/homeassistant/components/spotify/.translations/it.json @@ -13,6 +13,5 @@ "title": "Scegli il metodo di autenticazione" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ko.json b/homeassistant/components/spotify/.translations/ko.json index 9ebb4c70d859..ce1bba1bb5d8 100644 --- a/homeassistant/components/spotify/.translations/ko.json +++ b/homeassistant/components/spotify/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/lb.json b/homeassistant/components/spotify/.translations/lb.json index 556c5d559b12..fedaff526a62 100644 --- a/homeassistant/components/spotify/.translations/lb.json +++ b/homeassistant/components/spotify/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Wielt Authentifikatiouns Method aus" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/nl.json b/homeassistant/components/spotify/.translations/nl.json index 357d307bc26c..82b255120017 100644 --- a/homeassistant/components/spotify/.translations/nl.json +++ b/homeassistant/components/spotify/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Kies Authenticatiemethode" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/no.json b/homeassistant/components/spotify/.translations/no.json index 4dc334c6bddd..35b3e4c45f5e 100644 --- a/homeassistant/components/spotify/.translations/no.json +++ b/homeassistant/components/spotify/.translations/no.json @@ -13,6 +13,5 @@ "title": "Velg autentiseringsmetode" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/pl.json b/homeassistant/components/spotify/.translations/pl.json index 339f86f80a6d..ca93393c779e 100644 --- a/homeassistant/components/spotify/.translations/pl.json +++ b/homeassistant/components/spotify/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Wybierz metod\u0119 uwierzytelnienia" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/ru.json b/homeassistant/components/spotify/.translations/ru.json index d0985024f139..aa14f158300f 100644 --- a/homeassistant/components/spotify/.translations/ru.json +++ b/homeassistant/components/spotify/.translations/ru.json @@ -13,6 +13,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/sl.json b/homeassistant/components/spotify/.translations/sl.json index c1067de1d6ac..5a996e475479 100644 --- a/homeassistant/components/spotify/.translations/sl.json +++ b/homeassistant/components/spotify/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Izberite na\u010din preverjanja pristnosti" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/sv.json b/homeassistant/components/spotify/.translations/sv.json index 525ebde7c6a9..25daba13b873 100644 --- a/homeassistant/components/spotify/.translations/sv.json +++ b/homeassistant/components/spotify/.translations/sv.json @@ -13,6 +13,5 @@ "title": "V\u00e4lj autentiseringsmetod." } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/tr.json b/homeassistant/components/spotify/.translations/tr.json index f8f224d2cda3..29641464f57d 100644 --- a/homeassistant/components/spotify/.translations/tr.json +++ b/homeassistant/components/spotify/.translations/tr.json @@ -13,6 +13,5 @@ "title": "Kimlik Do\u011frulama Y\u00f6ntemini Se\u00e7" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/spotify/.translations/zh-Hant.json b/homeassistant/components/spotify/.translations/zh-Hant.json index 688f406a67ea..33efd72a6d85 100644 --- a/homeassistant/components/spotify/.translations/zh-Hant.json +++ b/homeassistant/components/spotify/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" } } - }, - "title": "Spotify" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/bg.json b/homeassistant/components/starline/.translations/bg.json index d2ae496f350f..1f3fb32b8e30 100644 --- a/homeassistant/components/starline/.translations/bg.json +++ b/homeassistant/components/starline/.translations/bg.json @@ -37,6 +37,5 @@ "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0438 \u0434\u0430\u043d\u043d\u0438" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ca.json b/homeassistant/components/starline/.translations/ca.json index b6d7d072e5c8..d8c768564803 100644 --- a/homeassistant/components/starline/.translations/ca.json +++ b/homeassistant/components/starline/.translations/ca.json @@ -37,6 +37,5 @@ "title": "Credencials d\u2019usuari" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/da.json b/homeassistant/components/starline/.translations/da.json index 3be1164d19a5..d891baee8220 100644 --- a/homeassistant/components/starline/.translations/da.json +++ b/homeassistant/components/starline/.translations/da.json @@ -37,6 +37,5 @@ "title": "Brugeroplysninger" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/de.json b/homeassistant/components/starline/.translations/de.json index 1c845e1c594d..5788b570eba4 100644 --- a/homeassistant/components/starline/.translations/de.json +++ b/homeassistant/components/starline/.translations/de.json @@ -37,6 +37,5 @@ "title": "Anmeldeinformationen" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/en.json b/homeassistant/components/starline/.translations/en.json index f93f6d3ff44f..cf71829bf29b 100644 --- a/homeassistant/components/starline/.translations/en.json +++ b/homeassistant/components/starline/.translations/en.json @@ -37,6 +37,5 @@ "title": "User credentials" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/es.json b/homeassistant/components/starline/.translations/es.json index 9263a8c3ff76..6df1cdf8f01e 100644 --- a/homeassistant/components/starline/.translations/es.json +++ b/homeassistant/components/starline/.translations/es.json @@ -37,6 +37,5 @@ "title": "Credenciales de usuario" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/fr.json b/homeassistant/components/starline/.translations/fr.json index 8854ec470d57..3720cf102110 100644 --- a/homeassistant/components/starline/.translations/fr.json +++ b/homeassistant/components/starline/.translations/fr.json @@ -37,6 +37,5 @@ "title": "Informations d'identification de l'utilisateur" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/hu.json b/homeassistant/components/starline/.translations/hu.json index 54d000ff614d..9d544eb03378 100644 --- a/homeassistant/components/starline/.translations/hu.json +++ b/homeassistant/components/starline/.translations/hu.json @@ -37,6 +37,5 @@ "title": "Felhaszn\u00e1l\u00f3i hiteles\u00edt\u0151 adatok" } } - }, - "title": "Starline" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/it.json b/homeassistant/components/starline/.translations/it.json index 6828cffbf7c1..01364b9c3ce1 100644 --- a/homeassistant/components/starline/.translations/it.json +++ b/homeassistant/components/starline/.translations/it.json @@ -37,6 +37,5 @@ "title": "Credenziali utente" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ko.json b/homeassistant/components/starline/.translations/ko.json index 8dcd6526865e..6d9e06c5a3dd 100644 --- a/homeassistant/components/starline/.translations/ko.json +++ b/homeassistant/components/starline/.translations/ko.json @@ -37,6 +37,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc790\uaca9 \uc99d\uba85" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/lb.json b/homeassistant/components/starline/.translations/lb.json index 6a917bb17b58..dce368d62d7c 100644 --- a/homeassistant/components/starline/.translations/lb.json +++ b/homeassistant/components/starline/.translations/lb.json @@ -37,6 +37,5 @@ "title": "Login Informatiounen" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/nl.json b/homeassistant/components/starline/.translations/nl.json index c5d7905c5ba8..e92372f3d864 100644 --- a/homeassistant/components/starline/.translations/nl.json +++ b/homeassistant/components/starline/.translations/nl.json @@ -37,6 +37,5 @@ "title": "Gebruikersgegevens" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/nn.json b/homeassistant/components/starline/.translations/nn.json index cb69fa9c8d8a..c682de447b0c 100644 --- a/homeassistant/components/starline/.translations/nn.json +++ b/homeassistant/components/starline/.translations/nn.json @@ -5,6 +5,5 @@ "description": "{captcha_img}" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/no.json b/homeassistant/components/starline/.translations/no.json index c7e3a1fee38f..e17bd9ad95ed 100644 --- a/homeassistant/components/starline/.translations/no.json +++ b/homeassistant/components/starline/.translations/no.json @@ -37,6 +37,5 @@ "title": "Brukerlegitimasjon" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/pl.json b/homeassistant/components/starline/.translations/pl.json index f0b94eef383e..5e5a293fc82a 100644 --- a/homeassistant/components/starline/.translations/pl.json +++ b/homeassistant/components/starline/.translations/pl.json @@ -37,6 +37,5 @@ "title": "Po\u015bwiadczenia u\u017cytkownika" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/ru.json b/homeassistant/components/starline/.translations/ru.json index 5555158828a8..156f7fb82629 100644 --- a/homeassistant/components/starline/.translations/ru.json +++ b/homeassistant/components/starline/.translations/ru.json @@ -37,6 +37,5 @@ "title": "\u0423\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/sl.json b/homeassistant/components/starline/.translations/sl.json index a2e3728ea715..e73585c2e0ae 100644 --- a/homeassistant/components/starline/.translations/sl.json +++ b/homeassistant/components/starline/.translations/sl.json @@ -37,6 +37,5 @@ "title": "Uporabni\u0161ke poverilnice" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/sv.json b/homeassistant/components/starline/.translations/sv.json index 205088154da7..36d627645cd8 100644 --- a/homeassistant/components/starline/.translations/sv.json +++ b/homeassistant/components/starline/.translations/sv.json @@ -37,6 +37,5 @@ "title": "Anv\u00e4ndaruppgifter" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/starline/.translations/zh-Hant.json b/homeassistant/components/starline/.translations/zh-Hant.json index f6b7ba833087..d1635d0bc27f 100644 --- a/homeassistant/components/starline/.translations/zh-Hant.json +++ b/homeassistant/components/starline/.translations/zh-Hant.json @@ -37,6 +37,5 @@ "title": "\u4f7f\u7528\u8005\u6191\u8b49" } } - }, - "title": "StarLine" + } } \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/af.json b/homeassistant/components/sun/.translations/af.json new file mode 100644 index 000000000000..b608241352ac --- /dev/null +++ b/homeassistant/components/sun/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Son" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ar.json b/homeassistant/components/sun/.translations/ar.json new file mode 100644 index 000000000000..73db65d91c7e --- /dev/null +++ b/homeassistant/components/sun/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0627\u0644\u0634\u0645\u0633" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/bg.json b/homeassistant/components/sun/.translations/bg.json new file mode 100644 index 000000000000..80ac8acf1fa2 --- /dev/null +++ b/homeassistant/components/sun/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u043b\u044a\u043d\u0446\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/bs.json b/homeassistant/components/sun/.translations/bs.json new file mode 100644 index 000000000000..fd8ab8bd9b71 --- /dev/null +++ b/homeassistant/components/sun/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Sunce" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ca.json b/homeassistant/components/sun/.translations/ca.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/cs.json b/homeassistant/components/sun/.translations/cs.json new file mode 100644 index 000000000000..0fe94354e455 --- /dev/null +++ b/homeassistant/components/sun/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Slunce" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/cy.json b/homeassistant/components/sun/.translations/cy.json new file mode 100644 index 000000000000..2f45910186ae --- /dev/null +++ b/homeassistant/components/sun/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Haul" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/da.json b/homeassistant/components/sun/.translations/da.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/de.json b/homeassistant/components/sun/.translations/de.json new file mode 100644 index 000000000000..e0b7194b1af3 --- /dev/null +++ b/homeassistant/components/sun/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Sonne" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/el.json b/homeassistant/components/sun/.translations/el.json new file mode 100644 index 000000000000..5714f19ac8a3 --- /dev/null +++ b/homeassistant/components/sun/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0389\u03bb\u03b9\u03bf\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/en.json b/homeassistant/components/sun/.translations/en.json new file mode 100644 index 000000000000..f83cf683d4b1 --- /dev/null +++ b/homeassistant/components/sun/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Sun" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/es-419.json b/homeassistant/components/sun/.translations/es-419.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/es.json b/homeassistant/components/sun/.translations/es.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/et.json b/homeassistant/components/sun/.translations/et.json new file mode 100644 index 000000000000..3f34ffd9a645 --- /dev/null +++ b/homeassistant/components/sun/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "P\u00e4ike" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/eu.json b/homeassistant/components/sun/.translations/eu.json new file mode 100644 index 000000000000..118e1c11ec0a --- /dev/null +++ b/homeassistant/components/sun/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Eguzkia" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/fa.json b/homeassistant/components/sun/.translations/fa.json new file mode 100644 index 000000000000..6728f8773313 --- /dev/null +++ b/homeassistant/components/sun/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0622\u0641\u062a\u0627\u0628" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/fi.json b/homeassistant/components/sun/.translations/fi.json new file mode 100644 index 000000000000..f62abeeb2dbb --- /dev/null +++ b/homeassistant/components/sun/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Aurinko" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/fr.json b/homeassistant/components/sun/.translations/fr.json new file mode 100644 index 000000000000..5ebfae8e5a41 --- /dev/null +++ b/homeassistant/components/sun/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Soleil" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/gsw.json b/homeassistant/components/sun/.translations/gsw.json new file mode 100644 index 000000000000..95dceb8a09ba --- /dev/null +++ b/homeassistant/components/sun/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Sunne" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/he.json b/homeassistant/components/sun/.translations/he.json new file mode 100644 index 000000000000..e100747234a7 --- /dev/null +++ b/homeassistant/components/sun/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e9\u05de\u05e9" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/hi.json b/homeassistant/components/sun/.translations/hi.json new file mode 100644 index 000000000000..1f2784bb5eb2 --- /dev/null +++ b/homeassistant/components/sun/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u0942\u0930\u091c" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/hr.json b/homeassistant/components/sun/.translations/hr.json new file mode 100644 index 000000000000..fd8ab8bd9b71 --- /dev/null +++ b/homeassistant/components/sun/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Sunce" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/hu.json b/homeassistant/components/sun/.translations/hu.json new file mode 100644 index 000000000000..fa6cfbafc5a3 --- /dev/null +++ b/homeassistant/components/sun/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Nap" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/hy.json b/homeassistant/components/sun/.translations/hy.json new file mode 100644 index 000000000000..3efc65292671 --- /dev/null +++ b/homeassistant/components/sun/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0531\u0580\u0587" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/id.json b/homeassistant/components/sun/.translations/id.json new file mode 100644 index 000000000000..fad79695ef72 --- /dev/null +++ b/homeassistant/components/sun/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Matahari" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/is.json b/homeassistant/components/sun/.translations/is.json new file mode 100644 index 000000000000..0322b9a93054 --- /dev/null +++ b/homeassistant/components/sun/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "S\u00f3l" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/it.json b/homeassistant/components/sun/.translations/it.json new file mode 100644 index 000000000000..23122478d121 --- /dev/null +++ b/homeassistant/components/sun/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Sole" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ja.json b/homeassistant/components/sun/.translations/ja.json new file mode 100644 index 000000000000..53c53fca0397 --- /dev/null +++ b/homeassistant/components/sun/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u592a\u967d" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ko.json b/homeassistant/components/sun/.translations/ko.json new file mode 100644 index 000000000000..062a7be486b5 --- /dev/null +++ b/homeassistant/components/sun/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\ud0dc\uc591" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/lb.json b/homeassistant/components/sun/.translations/lb.json new file mode 100644 index 000000000000..c2881207f1d8 --- /dev/null +++ b/homeassistant/components/sun/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Sonn" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/lv.json b/homeassistant/components/sun/.translations/lv.json new file mode 100644 index 000000000000..52d78df421f9 --- /dev/null +++ b/homeassistant/components/sun/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Saule" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/nb.json b/homeassistant/components/sun/.translations/nb.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/nl.json b/homeassistant/components/sun/.translations/nl.json new file mode 100644 index 000000000000..5878a8e9d22f --- /dev/null +++ b/homeassistant/components/sun/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Zon" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/nn.json b/homeassistant/components/sun/.translations/nn.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/pl.json b/homeassistant/components/sun/.translations/pl.json new file mode 100644 index 000000000000..258be2c25242 --- /dev/null +++ b/homeassistant/components/sun/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "S\u0142o\u0144ce" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/pt-BR.json b/homeassistant/components/sun/.translations/pt-BR.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/pt.json b/homeassistant/components/sun/.translations/pt.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ro.json b/homeassistant/components/sun/.translations/ro.json new file mode 100644 index 000000000000..cfe2dcec5040 --- /dev/null +++ b/homeassistant/components/sun/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Soare" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ru.json b/homeassistant/components/sun/.translations/ru.json new file mode 100644 index 000000000000..64fb11610be6 --- /dev/null +++ b/homeassistant/components/sun/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u043e\u043b\u043d\u0446\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/sk.json b/homeassistant/components/sun/.translations/sk.json new file mode 100644 index 000000000000..fb7ea87ecf28 --- /dev/null +++ b/homeassistant/components/sun/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Slnko" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/sl.json b/homeassistant/components/sun/.translations/sl.json new file mode 100644 index 000000000000..8620ef5082fc --- /dev/null +++ b/homeassistant/components/sun/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Sonce" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/sv.json b/homeassistant/components/sun/.translations/sv.json new file mode 100644 index 000000000000..de709024d221 --- /dev/null +++ b/homeassistant/components/sun/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Sol" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/ta.json b/homeassistant/components/sun/.translations/ta.json new file mode 100644 index 000000000000..b36e176b29af --- /dev/null +++ b/homeassistant/components/sun/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b9a\u0bc2\u0bb0\u0bbf\u0baf\u0ba9\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/te.json b/homeassistant/components/sun/.translations/te.json new file mode 100644 index 000000000000..d3f1f5b2cd11 --- /dev/null +++ b/homeassistant/components/sun/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c42\u0c30\u0c4d\u0c2f\u0c41\u0c21\u0c41" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/th.json b/homeassistant/components/sun/.translations/th.json new file mode 100644 index 000000000000..646aa5fde8a7 --- /dev/null +++ b/homeassistant/components/sun/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e14\u0e27\u0e07\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/tr.json b/homeassistant/components/sun/.translations/tr.json new file mode 100644 index 000000000000..8d990cfcc2c6 --- /dev/null +++ b/homeassistant/components/sun/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "G\u00fcne\u015f" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/uk.json b/homeassistant/components/sun/.translations/uk.json new file mode 100644 index 000000000000..746b44763c29 --- /dev/null +++ b/homeassistant/components/sun/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u043e\u043d\u0446\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/vi.json b/homeassistant/components/sun/.translations/vi.json new file mode 100644 index 000000000000..7aaf05058a6a --- /dev/null +++ b/homeassistant/components/sun/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "M\u1eb7t tr\u1eddi" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/zh-Hans.json b/homeassistant/components/sun/.translations/zh-Hans.json new file mode 100644 index 000000000000..8bcf83d8c39f --- /dev/null +++ b/homeassistant/components/sun/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u592a\u9633" +} \ No newline at end of file diff --git a/homeassistant/components/sun/.translations/zh-Hant.json b/homeassistant/components/sun/.translations/zh-Hant.json new file mode 100644 index 000000000000..53c53fca0397 --- /dev/null +++ b/homeassistant/components/sun/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u592a\u967d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/af.json b/homeassistant/components/switch/.translations/af.json new file mode 100644 index 000000000000..9991aa0b500d --- /dev/null +++ b/homeassistant/components/switch/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Skakelaar" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ar.json b/homeassistant/components/switch/.translations/ar.json new file mode 100644 index 000000000000..de7bc64f9e80 --- /dev/null +++ b/homeassistant/components/switch/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0641\u062a\u0627\u062d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/bg.json b/homeassistant/components/switch/.translations/bg.json index 19a853dba974..db6e10558447 100644 --- a/homeassistant/components/switch/.translations/bg.json +++ b/homeassistant/components/switch/.translations/bg.json @@ -13,5 +13,6 @@ "turned_off": "\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 {entity_name}", "turned_on": "\u0412\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 {entity_name}" } - } + }, + "title": "\u041a\u043b\u044e\u0447" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/bs.json b/homeassistant/components/switch/.translations/bs.json new file mode 100644 index 000000000000..d9e1638a4441 --- /dev/null +++ b/homeassistant/components/switch/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Prekida\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ca.json b/homeassistant/components/switch/.translations/ca.json index 0f1101eca75c..607acd07cf80 100644 --- a/homeassistant/components/switch/.translations/ca.json +++ b/homeassistant/components/switch/.translations/ca.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} desactivat", "turned_on": "{entity_name} activat" } - } + }, + "title": "Interruptors" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/cs.json b/homeassistant/components/switch/.translations/cs.json new file mode 100644 index 000000000000..ac76f94ff723 --- /dev/null +++ b/homeassistant/components/switch/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Sp\u00edna\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/cy.json b/homeassistant/components/switch/.translations/cy.json new file mode 100644 index 000000000000..3f5bd81e833e --- /dev/null +++ b/homeassistant/components/switch/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Newid" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/da.json b/homeassistant/components/switch/.translations/da.json index eefa1e8bb6e1..0690811d2cd7 100644 --- a/homeassistant/components/switch/.translations/da.json +++ b/homeassistant/components/switch/.translations/da.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} slukkede", "turned_on": "{entity_name} t\u00e6ndte" } - } + }, + "title": "Kontakt" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/de.json b/homeassistant/components/switch/.translations/de.json index 76496da6dc84..e28718a31726 100644 --- a/homeassistant/components/switch/.translations/de.json +++ b/homeassistant/components/switch/.translations/de.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} ausgeschaltet", "turned_on": "{entity_name} eingeschaltet" } - } + }, + "title": "Schalter" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/el.json b/homeassistant/components/switch/.translations/el.json new file mode 100644 index 000000000000..75fd8d7d5d9f --- /dev/null +++ b/homeassistant/components/switch/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0394\u03b9\u03b1\u03ba\u03cc\u03c0\u03c4\u03b7\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/en.json b/homeassistant/components/switch/.translations/en.json index 3f37de5331e3..22b1436a4045 100644 --- a/homeassistant/components/switch/.translations/en.json +++ b/homeassistant/components/switch/.translations/en.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} turned off", "turned_on": "{entity_name} turned on" } - } + }, + "title": "Switch" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/es-419.json b/homeassistant/components/switch/.translations/es-419.json index b42b2ce56fa0..2491d701abaf 100644 --- a/homeassistant/components/switch/.translations/es-419.json +++ b/homeassistant/components/switch/.translations/es-419.json @@ -12,5 +12,6 @@ "turned_off": "{entity_name} apagado", "turned_on": "{entity_name} encendido" } - } + }, + "title": "Interruptor" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/es.json b/homeassistant/components/switch/.translations/es.json index c6790619182c..7e27a969b127 100644 --- a/homeassistant/components/switch/.translations/es.json +++ b/homeassistant/components/switch/.translations/es.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} apagado", "turned_on": "{entity_name} encendido" } - } + }, + "title": "Interruptor" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/et.json b/homeassistant/components/switch/.translations/et.json new file mode 100644 index 000000000000..96ffc87e9ee2 --- /dev/null +++ b/homeassistant/components/switch/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "L\u00fcliti" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/fa.json b/homeassistant/components/switch/.translations/fa.json new file mode 100644 index 000000000000..b48601ced7c7 --- /dev/null +++ b/homeassistant/components/switch/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0633\u0648\u0626\u06cc\u0686" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/fi.json b/homeassistant/components/switch/.translations/fi.json new file mode 100644 index 000000000000..15e59d0543b2 --- /dev/null +++ b/homeassistant/components/switch/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Kytkin" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/fr.json b/homeassistant/components/switch/.translations/fr.json index adc91477a232..c6c95c1f16e0 100644 --- a/homeassistant/components/switch/.translations/fr.json +++ b/homeassistant/components/switch/.translations/fr.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} \u00e9teint", "turned_on": "{entity_name} allum\u00e9" } - } + }, + "title": "Interrupteur" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/gsw.json b/homeassistant/components/switch/.translations/gsw.json new file mode 100644 index 000000000000..9d853c4bd9a8 --- /dev/null +++ b/homeassistant/components/switch/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Schauter" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/he.json b/homeassistant/components/switch/.translations/he.json new file mode 100644 index 000000000000..cdeba216a999 --- /dev/null +++ b/homeassistant/components/switch/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05de\u05ea\u05d2" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/hi.json b/homeassistant/components/switch/.translations/hi.json new file mode 100644 index 000000000000..0778d0435ff0 --- /dev/null +++ b/homeassistant/components/switch/.translations/hi.json @@ -0,0 +1,3 @@ +{ + "title": "\u0938\u094d\u0935\u093f\u091a" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/hr.json b/homeassistant/components/switch/.translations/hr.json new file mode 100644 index 000000000000..d9e1638a4441 --- /dev/null +++ b/homeassistant/components/switch/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Prekida\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/hu.json b/homeassistant/components/switch/.translations/hu.json index 3fba61a48486..cbea232428a5 100644 --- a/homeassistant/components/switch/.translations/hu.json +++ b/homeassistant/components/switch/.translations/hu.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} ki lett kapcsolva", "turned_on": "{entity_name} be lett kapcsolva" } - } + }, + "title": "Kapcsol\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/hy.json b/homeassistant/components/switch/.translations/hy.json new file mode 100644 index 000000000000..ea492ee159b9 --- /dev/null +++ b/homeassistant/components/switch/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0531\u0576\u057b\u0561\u057f\u056b\u0579" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/id.json b/homeassistant/components/switch/.translations/id.json new file mode 100644 index 000000000000..1cf5d2d9a50a --- /dev/null +++ b/homeassistant/components/switch/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Sakelar" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/is.json b/homeassistant/components/switch/.translations/is.json new file mode 100644 index 000000000000..3828c6435a1c --- /dev/null +++ b/homeassistant/components/switch/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Rofi" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/it.json b/homeassistant/components/switch/.translations/it.json index 32f479b8b5c6..39d630bbaab7 100644 --- a/homeassistant/components/switch/.translations/it.json +++ b/homeassistant/components/switch/.translations/it.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} disattivato", "turned_on": "{entity_name} attivato" } - } + }, + "title": "Interruttore" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ja.json b/homeassistant/components/switch/.translations/ja.json new file mode 100644 index 000000000000..a41b3d1ad4c2 --- /dev/null +++ b/homeassistant/components/switch/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30b9\u30a4\u30c3\u30c1" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ko.json b/homeassistant/components/switch/.translations/ko.json index b923fdb210e6..8f80a81e6426 100644 --- a/homeassistant/components/switch/.translations/ko.json +++ b/homeassistant/components/switch/.translations/ko.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} \uc774(\uac00) \uaebc\uc9c8 \ub54c", "turned_on": "{entity_name} \uc774(\uac00) \ucf1c\uc9c8 \ub54c" } - } + }, + "title": "\uc2a4\uc704\uce58" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/lb.json b/homeassistant/components/switch/.translations/lb.json index a7f807e8dcda..3035e8837439 100644 --- a/homeassistant/components/switch/.translations/lb.json +++ b/homeassistant/components/switch/.translations/lb.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} gouf ausgeschalt", "turned_on": "{entity_name} gouf ugeschalt" } - } + }, + "title": "Schalter" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/lv.json b/homeassistant/components/switch/.translations/lv.json index 7668dfa5ac86..b5b1f9df3860 100644 --- a/homeassistant/components/switch/.translations/lv.json +++ b/homeassistant/components/switch/.translations/lv.json @@ -4,5 +4,6 @@ "turned_off": "{entity_name} tika izsl\u0113gta", "turned_on": "{entity_name} tika iesl\u0113gta" } - } + }, + "title": "Sl\u0113dzis" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/nb.json b/homeassistant/components/switch/.translations/nb.json new file mode 100644 index 000000000000..261ac09a4850 --- /dev/null +++ b/homeassistant/components/switch/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Bryter" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/nl.json b/homeassistant/components/switch/.translations/nl.json index 905ad4130904..9c1906baa2f0 100644 --- a/homeassistant/components/switch/.translations/nl.json +++ b/homeassistant/components/switch/.translations/nl.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} uitgeschakeld", "turned_on": "{entity_name} ingeschakeld" } - } + }, + "title": "Schakelaar" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/nn.json b/homeassistant/components/switch/.translations/nn.json new file mode 100644 index 000000000000..e773f3454b57 --- /dev/null +++ b/homeassistant/components/switch/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Brytar" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/pl.json b/homeassistant/components/switch/.translations/pl.json index 930694de8ca8..8b65ed602d68 100644 --- a/homeassistant/components/switch/.translations/pl.json +++ b/homeassistant/components/switch/.translations/pl.json @@ -13,5 +13,6 @@ "turned_off": "nast\u0105pi wy\u0142\u0105czenie {entity_name}", "turned_on": "nast\u0105pi w\u0142\u0105czenie {entity_name}" } - } + }, + "title": "Prze\u0142\u0105cznik" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/pt-BR.json b/homeassistant/components/switch/.translations/pt-BR.json new file mode 100644 index 000000000000..e027676dce9d --- /dev/null +++ b/homeassistant/components/switch/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Interruptor" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/pt.json b/homeassistant/components/switch/.translations/pt.json new file mode 100644 index 000000000000..e027676dce9d --- /dev/null +++ b/homeassistant/components/switch/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Interruptor" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ro.json b/homeassistant/components/switch/.translations/ro.json new file mode 100644 index 000000000000..b1e3ec7b1b1c --- /dev/null +++ b/homeassistant/components/switch/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Comutator" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ru.json b/homeassistant/components/switch/.translations/ru.json index 8ca964606ae8..49b7d22ca574 100644 --- a/homeassistant/components/switch/.translations/ru.json +++ b/homeassistant/components/switch/.translations/ru.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f", "turned_on": "{entity_name} \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f" } - } + }, + "title": "\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/sk.json b/homeassistant/components/switch/.translations/sk.json new file mode 100644 index 000000000000..0b619898896b --- /dev/null +++ b/homeassistant/components/switch/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Prep\u00edna\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/sl.json b/homeassistant/components/switch/.translations/sl.json index bef4f1583b6b..472ca853827b 100644 --- a/homeassistant/components/switch/.translations/sl.json +++ b/homeassistant/components/switch/.translations/sl.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} izklopljen", "turned_on": "{entity_name} vklopljen" } - } + }, + "title": "Stikalo" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/sv.json b/homeassistant/components/switch/.translations/sv.json index ed5367e0013a..bb92b37fd525 100644 --- a/homeassistant/components/switch/.translations/sv.json +++ b/homeassistant/components/switch/.translations/sv.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name} st\u00e4ngdes av", "turned_on": "{entity_name} slogs p\u00e5" } - } + }, + "title": "Kontakt" } \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/ta.json b/homeassistant/components/switch/.translations/ta.json new file mode 100644 index 000000000000..f97ed0d09de3 --- /dev/null +++ b/homeassistant/components/switch/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0bb8\u0bcd\u0bb5\u0bbf\u0b9f\u0bcd\u0b9a\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/te.json b/homeassistant/components/switch/.translations/te.json new file mode 100644 index 000000000000..4f7a2ab5b975 --- /dev/null +++ b/homeassistant/components/switch/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "\u0c38\u0c4d\u0c35\u0c3f\u0c1a\u0c4d" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/th.json b/homeassistant/components/switch/.translations/th.json new file mode 100644 index 000000000000..0f13bad4a013 --- /dev/null +++ b/homeassistant/components/switch/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e2a\u0e27\u0e34\u0e15\u0e0b\u0e4c" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/tr.json b/homeassistant/components/switch/.translations/tr.json new file mode 100644 index 000000000000..fbac402530ec --- /dev/null +++ b/homeassistant/components/switch/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Anahtar" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/uk.json b/homeassistant/components/switch/.translations/uk.json new file mode 100644 index 000000000000..ed53fcf510f1 --- /dev/null +++ b/homeassistant/components/switch/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0435\u0440\u0435\u043c\u0438\u043a\u0430\u0447" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/vi.json b/homeassistant/components/switch/.translations/vi.json new file mode 100644 index 000000000000..e5160fb87378 --- /dev/null +++ b/homeassistant/components/switch/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "C\u00f4ng t\u1eafc" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/zh-Hans.json b/homeassistant/components/switch/.translations/zh-Hans.json new file mode 100644 index 000000000000..71a7e0a9208e --- /dev/null +++ b/homeassistant/components/switch/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u5f00\u5173" +} \ No newline at end of file diff --git a/homeassistant/components/switch/.translations/zh-Hant.json b/homeassistant/components/switch/.translations/zh-Hant.json index d8bda90de857..42612eaba9e7 100644 --- a/homeassistant/components/switch/.translations/zh-Hant.json +++ b/homeassistant/components/switch/.translations/zh-Hant.json @@ -13,5 +13,6 @@ "turned_off": "{entity_name}\u5df2\u95dc\u9589", "turned_on": "{entity_name}\u5df2\u958b\u555f" } - } + }, + "title": "\u958b\u95dc" } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ca.json b/homeassistant/components/synology_dsm/.translations/ca.json index 1e3f7b573c35..18080db554a9 100644 --- a/homeassistant/components/synology_dsm/.translations/ca.json +++ b/homeassistant/components/synology_dsm/.translations/ca.json @@ -24,7 +24,6 @@ "data": { "api_version": "Versi\u00f3 DSM", "host": "Amfitri\u00f3", - "name": "Nom", "password": "Contrasenya", "port": "Port", "ssl": "Utilitza SSL/TLS per connectar-te al servidor NAS", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/de.json b/homeassistant/components/synology_dsm/.translations/de.json index c9b127fecf29..70a2bf7e4903 100644 --- a/homeassistant/components/synology_dsm/.translations/de.json +++ b/homeassistant/components/synology_dsm/.translations/de.json @@ -23,7 +23,6 @@ "data": { "api_version": "DSM-Version", "host": "Host", - "name": "Name", "password": "Passwort", "port": "Port (optional)", "username": "Benutzername" @@ -31,6 +30,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/en.json b/homeassistant/components/synology_dsm/.translations/en.json index f3ffdb997ea8..10bdb14870de 100644 --- a/homeassistant/components/synology_dsm/.translations/en.json +++ b/homeassistant/components/synology_dsm/.translations/en.json @@ -24,7 +24,6 @@ "data": { "api_version": "DSM version", "host": "Host", - "name": "Name", "password": "Password", "port": "Port (Optional)", "ssl": "Use SSL/TLS to connect to your NAS", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/es.json b/homeassistant/components/synology_dsm/.translations/es.json index 80b55da4b634..f5e4094839ea 100644 --- a/homeassistant/components/synology_dsm/.translations/es.json +++ b/homeassistant/components/synology_dsm/.translations/es.json @@ -24,7 +24,6 @@ "data": { "api_version": "Versi\u00f3n del DSM", "host": "Host", - "name": "Nombre", "password": "Contrase\u00f1a", "port": "Puerto", "ssl": "Usar SSL/TLS para conectar con tu NAS", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/fr.json b/homeassistant/components/synology_dsm/.translations/fr.json index 3caf51812bed..828d7feeb5e7 100644 --- a/homeassistant/components/synology_dsm/.translations/fr.json +++ b/homeassistant/components/synology_dsm/.translations/fr.json @@ -24,7 +24,6 @@ "data": { "api_version": "Version du DSM", "host": "H\u00f4te", - "name": "Nom", "password": "Mot de passe", "port": "Port (facultatif)" } diff --git a/homeassistant/components/synology_dsm/.translations/it.json b/homeassistant/components/synology_dsm/.translations/it.json index 98a78e17d86a..18e87d7c70ec 100644 --- a/homeassistant/components/synology_dsm/.translations/it.json +++ b/homeassistant/components/synology_dsm/.translations/it.json @@ -24,7 +24,6 @@ "data": { "api_version": "Versione DSM", "host": "Host", - "name": "Nome", "password": "Password", "port": "Porta (opzionale)", "ssl": "Utilizzare SSL/TLS per connettersi al NAS", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/ko.json b/homeassistant/components/synology_dsm/.translations/ko.json index 6d73cc6fc9af..86b0db95c7cf 100644 --- a/homeassistant/components/synology_dsm/.translations/ko.json +++ b/homeassistant/components/synology_dsm/.translations/ko.json @@ -12,7 +12,6 @@ "data": { "api_version": "DSM \ubc84\uc804", "host": "\ud638\uc2a4\ud2b8", - "name": "\uc774\ub984", "password": "\ube44\ubc00\ubc88\ud638", "port": "\ud3ec\ud2b8", "ssl": "SSL/TLS \ub97c \uc0ac\uc6a9\ud558\uc5ec NAS \uc5d0 \uc5f0\uacb0", @@ -21,6 +20,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/lb.json b/homeassistant/components/synology_dsm/.translations/lb.json index cc5343589a21..8c8844797cb9 100644 --- a/homeassistant/components/synology_dsm/.translations/lb.json +++ b/homeassistant/components/synology_dsm/.translations/lb.json @@ -24,7 +24,6 @@ "data": { "api_version": "DSM Versioun", "host": "Apparat", - "name": "Numm", "password": "Passwuert", "port": "Port (Optionell)", "ssl": "Benotzt SSL/TLS fir sech mam NAS ze verbannen", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/nl.json b/homeassistant/components/synology_dsm/.translations/nl.json index f5fe2bc17a7b..3859617fbbda 100644 --- a/homeassistant/components/synology_dsm/.translations/nl.json +++ b/homeassistant/components/synology_dsm/.translations/nl.json @@ -23,7 +23,6 @@ "data": { "api_version": "DSM-versie", "host": "Host", - "name": "Naam", "password": "Wachtwoord", "port": "Poort (optioneel)", "ssl": "Gebruik SSL/TLS om verbinding te maken met uw NAS", @@ -32,6 +31,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/no.json b/homeassistant/components/synology_dsm/.translations/no.json index 998080b1ca9c..4778c51d52c7 100644 --- a/homeassistant/components/synology_dsm/.translations/no.json +++ b/homeassistant/components/synology_dsm/.translations/no.json @@ -1,10 +1,35 @@ { "config": { + "abort": { + "already_configured": "Verten er allerede konfigurert" + }, + "error": { + "login": "P\u00e5loggingsfeil: Vennligst sjekk brukernavnet ditt og passordet ditt", + "unknown": "Ukjent feil: pr\u00f8v p\u00e5 nytt senere eller en annen konfigurasjon" + }, + "flow_title": "Synology DSM {name} ( {host} )", "step": { + "link": { + "data": { + "api_version": "DSM-versjon", + "password": "Passord", + "port": "Port (valgfritt)", + "ssl": "Bruk SSL/TLS til \u00e5 koble til NAS-en", + "username": "Brukernavn" + }, + "description": "Vil du konfigurere {name} ({host})?", + "title": "Synology DSM" + }, "user": { "data": { - "port": "Port (valgfritt)" - } + "api_version": "DSM-versjon", + "host": "Vert", + "password": "Passord", + "port": "Port (valgfritt)", + "ssl": "Bruk SSL/TLS til \u00e5 koble til NAS-en", + "username": "Brukernavn" + }, + "title": "Synology DSM" } } } diff --git a/homeassistant/components/synology_dsm/.translations/ru.json b/homeassistant/components/synology_dsm/.translations/ru.json index a850db0f7323..5dabd3a0d261 100644 --- a/homeassistant/components/synology_dsm/.translations/ru.json +++ b/homeassistant/components/synology_dsm/.translations/ru.json @@ -24,7 +24,6 @@ "data": { "api_version": "\u0412\u0435\u0440\u0441\u0438\u044f DSM", "host": "\u0425\u043e\u0441\u0442", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", "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\u043e\u0432\u0430\u0442\u044c SSL / TLS \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", @@ -33,6 +32,5 @@ "title": "Synology DSM" } } - }, - "title": "Synology DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/sl.json b/homeassistant/components/synology_dsm/.translations/sl.json new file mode 100644 index 000000000000..97cf89463c7f --- /dev/null +++ b/homeassistant/components/synology_dsm/.translations/sl.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Gostitelj je \u017ee konfiguriran" + }, + "error": { + "login": "Napaka pri prijavi: preverite svoje uporabni\u0161ko ime in geslo", + "unknown": "Neznana napaka: poskusite pozneje ali z drugo konfiguracijo" + }, + "flow_title": "Synology DSM {name} ({host})", + "step": { + "link": { + "data": { + "api_version": "Razli\u010dica DSM", + "password": "Geslo", + "port": "Vrata (Izbirno)", + "ssl": "Uporabite SSL/TLS za povezavo z va\u0161im NAS-om", + "username": "Uporabni\u0161ko ime" + }, + "description": "Ali \u017eelite nastaviti {name} ({host})?", + "title": "Synology DSM" + }, + "user": { + "data": { + "api_version": "Razli\u010dica DSM", + "host": "Gostitelj", + "password": "Geslo", + "port": "Vrata (Izbirno)", + "ssl": "Uporabite SSL/TLS za povezavo z va\u0161im NAS-om", + "username": "Uporabni\u0161ko ime" + }, + "title": "Synology DSM" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/synology_dsm/.translations/zh-Hant.json b/homeassistant/components/synology_dsm/.translations/zh-Hant.json index f7e1a9d22356..f86c4268e06c 100644 --- a/homeassistant/components/synology_dsm/.translations/zh-Hant.json +++ b/homeassistant/components/synology_dsm/.translations/zh-Hant.json @@ -24,7 +24,6 @@ "data": { "api_version": "DSM \u7248\u672c", "host": "\u4e3b\u6a5f\u7aef", - "name": "\u540d\u7a31", "password": "\u5bc6\u78bc", "port": "\u901a\u8a0a\u57e0\uff08\u9078\u9805\uff09", "ssl": "\u4f7f\u7528 SSL/TLS \u9023\u7dda\u81f3 NAS", @@ -33,6 +32,5 @@ "title": "\u7fa4\u6689 DSM" } } - }, - "title": "\u7fa4\u6689 DSM" + } } \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/af.json b/homeassistant/components/system_health/.translations/af.json new file mode 100644 index 000000000000..3f92fabd3d85 --- /dev/null +++ b/homeassistant/components/system_health/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Stelsel Gesondheid" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/bg.json b/homeassistant/components/system_health/.translations/bg.json new file mode 100644 index 000000000000..d7b359e0d6dd --- /dev/null +++ b/homeassistant/components/system_health/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u0417\u0434\u0440\u0430\u0432\u0435 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/ca.json b/homeassistant/components/system_health/.translations/ca.json new file mode 100644 index 000000000000..80cddceda2d0 --- /dev/null +++ b/homeassistant/components/system_health/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Estat del Sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/cs.json b/homeassistant/components/system_health/.translations/cs.json new file mode 100644 index 000000000000..4bc9bb8858e8 --- /dev/null +++ b/homeassistant/components/system_health/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Kondice syst\u00e9mu" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/cy.json b/homeassistant/components/system_health/.translations/cy.json new file mode 100644 index 000000000000..11f8a8d2f0b6 --- /dev/null +++ b/homeassistant/components/system_health/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Iechyd System" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/da.json b/homeassistant/components/system_health/.translations/da.json new file mode 100644 index 000000000000..5eddff89b501 --- /dev/null +++ b/homeassistant/components/system_health/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Systemsundhed" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/de.json b/homeassistant/components/system_health/.translations/de.json new file mode 100644 index 000000000000..607a7eaa8cff --- /dev/null +++ b/homeassistant/components/system_health/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Systemzustand" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/el.json b/homeassistant/components/system_health/.translations/el.json new file mode 100644 index 000000000000..e0c4c7043f5c --- /dev/null +++ b/homeassistant/components/system_health/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u03a5\u03b3\u03b5\u03af\u03b1 \u03a3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/en.json b/homeassistant/components/system_health/.translations/en.json new file mode 100644 index 000000000000..1c75d04a7167 --- /dev/null +++ b/homeassistant/components/system_health/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "System Health" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/es-419.json b/homeassistant/components/system_health/.translations/es-419.json new file mode 100644 index 000000000000..ada0964a3584 --- /dev/null +++ b/homeassistant/components/system_health/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Estado del sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/es.json b/homeassistant/components/system_health/.translations/es.json new file mode 100644 index 000000000000..11ee35782b18 --- /dev/null +++ b/homeassistant/components/system_health/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Estado del Sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/et.json b/homeassistant/components/system_health/.translations/et.json new file mode 100644 index 000000000000..e517d9331aa8 --- /dev/null +++ b/homeassistant/components/system_health/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "S\u00fcsteemi tervis" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/eu.json b/homeassistant/components/system_health/.translations/eu.json new file mode 100644 index 000000000000..5f21851b67e0 --- /dev/null +++ b/homeassistant/components/system_health/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Sistemaren Osasuna" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/fa.json b/homeassistant/components/system_health/.translations/fa.json new file mode 100644 index 000000000000..c91e442617d6 --- /dev/null +++ b/homeassistant/components/system_health/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0633\u0644\u0627\u0645\u062a \u0633\u06cc\u0633\u062a\u0645" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/fi.json b/homeassistant/components/system_health/.translations/fi.json new file mode 100644 index 000000000000..576e66ba6b5e --- /dev/null +++ b/homeassistant/components/system_health/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "J\u00e4rjestelm\u00e4n kunto" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/fr.json b/homeassistant/components/system_health/.translations/fr.json new file mode 100644 index 000000000000..819c35ac3d61 --- /dev/null +++ b/homeassistant/components/system_health/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Sant\u00e9 du syst\u00e8me" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/he.json b/homeassistant/components/system_health/.translations/he.json new file mode 100644 index 000000000000..2c46fb48c7d5 --- /dev/null +++ b/homeassistant/components/system_health/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d1\u05e8\u05d9\u05d0\u05d5\u05ea \u05de\u05e2\u05e8\u05db\u05ea" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/hr.json b/homeassistant/components/system_health/.translations/hr.json new file mode 100644 index 000000000000..5aed0b89255d --- /dev/null +++ b/homeassistant/components/system_health/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Zdravlje sustava" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/hu.json b/homeassistant/components/system_health/.translations/hu.json new file mode 100644 index 000000000000..721dce2501e9 --- /dev/null +++ b/homeassistant/components/system_health/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Rendszer\u00e1llapot" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/hy.json b/homeassistant/components/system_health/.translations/hy.json new file mode 100644 index 000000000000..a8de004c3ad4 --- /dev/null +++ b/homeassistant/components/system_health/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0540\u0561\u0574\u0561\u056f\u0561\u0580\u0563\u056b \u0561\u057c\u0578\u0572\u057b\u0578\u0582\u0569\u0575\u0578\u0582\u0576" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/is.json b/homeassistant/components/system_health/.translations/is.json new file mode 100644 index 000000000000..5d798b7cd841 --- /dev/null +++ b/homeassistant/components/system_health/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Heilbrig\u00f0i kerfis" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/it.json b/homeassistant/components/system_health/.translations/it.json new file mode 100644 index 000000000000..38c65ccd8f99 --- /dev/null +++ b/homeassistant/components/system_health/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Salute del sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/ja.json b/homeassistant/components/system_health/.translations/ja.json new file mode 100644 index 000000000000..09ddfeaf5c62 --- /dev/null +++ b/homeassistant/components/system_health/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30b7\u30b9\u30c6\u30e0\u306e\u6b63\u5e38\u6027" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/ko.json b/homeassistant/components/system_health/.translations/ko.json new file mode 100644 index 000000000000..3424269bfba1 --- /dev/null +++ b/homeassistant/components/system_health/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc2dc\uc2a4\ud15c \uc0c1\ud0dc" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/lb.json b/homeassistant/components/system_health/.translations/lb.json new file mode 100644 index 000000000000..f9982152d87b --- /dev/null +++ b/homeassistant/components/system_health/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "System Zoustand" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/lt.json b/homeassistant/components/system_health/.translations/lt.json new file mode 100644 index 000000000000..1f10e34d6f9c --- /dev/null +++ b/homeassistant/components/system_health/.translations/lt.json @@ -0,0 +1,3 @@ +{ + "title": "Sistemos sveikata" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/nb.json b/homeassistant/components/system_health/.translations/nb.json new file mode 100644 index 000000000000..e0e6b2fb228f --- /dev/null +++ b/homeassistant/components/system_health/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Systemhelse" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/nl.json b/homeassistant/components/system_health/.translations/nl.json new file mode 100644 index 000000000000..3da64e71c197 --- /dev/null +++ b/homeassistant/components/system_health/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Systeemstatus" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/nn.json b/homeassistant/components/system_health/.translations/nn.json new file mode 100644 index 000000000000..e0e6b2fb228f --- /dev/null +++ b/homeassistant/components/system_health/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Systemhelse" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/pl.json b/homeassistant/components/system_health/.translations/pl.json new file mode 100644 index 000000000000..f6fdab9cc897 --- /dev/null +++ b/homeassistant/components/system_health/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Kondycja systemu" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/pt-BR.json b/homeassistant/components/system_health/.translations/pt-BR.json new file mode 100644 index 000000000000..eb6f66e8784e --- /dev/null +++ b/homeassistant/components/system_health/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Integridade Do Sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/pt.json b/homeassistant/components/system_health/.translations/pt.json new file mode 100644 index 000000000000..15f9774cb169 --- /dev/null +++ b/homeassistant/components/system_health/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Integridade do Sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/ro.json b/homeassistant/components/system_health/.translations/ro.json new file mode 100644 index 000000000000..538cdd3cbdc5 --- /dev/null +++ b/homeassistant/components/system_health/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Stare Sistem" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/ru.json b/homeassistant/components/system_health/.translations/ru.json new file mode 100644 index 000000000000..e9169fedf57f --- /dev/null +++ b/homeassistant/components/system_health/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/sk.json b/homeassistant/components/system_health/.translations/sk.json new file mode 100644 index 000000000000..726f9d917a59 --- /dev/null +++ b/homeassistant/components/system_health/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Stav syst\u00e9mu" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/sl.json b/homeassistant/components/system_health/.translations/sl.json new file mode 100644 index 000000000000..96c2bfe66017 --- /dev/null +++ b/homeassistant/components/system_health/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Zdravje sistema" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/sv.json b/homeassistant/components/system_health/.translations/sv.json new file mode 100644 index 000000000000..9d0ff4c10e2e --- /dev/null +++ b/homeassistant/components/system_health/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Systemh\u00e4lsa" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/th.json b/homeassistant/components/system_health/.translations/th.json new file mode 100644 index 000000000000..ffe94d564699 --- /dev/null +++ b/homeassistant/components/system_health/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e02\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e1a" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/tr.json b/homeassistant/components/system_health/.translations/tr.json new file mode 100644 index 000000000000..1ff23478201c --- /dev/null +++ b/homeassistant/components/system_health/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Sistem Sa\u011fl\u0131\u011f\u0131" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/uk.json b/homeassistant/components/system_health/.translations/uk.json new file mode 100644 index 000000000000..267fcb83a616 --- /dev/null +++ b/homeassistant/components/system_health/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u0411\u0435\u0437\u043f\u0435\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0438" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/vi.json b/homeassistant/components/system_health/.translations/vi.json new file mode 100644 index 000000000000..fb787ad6a0a7 --- /dev/null +++ b/homeassistant/components/system_health/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "S\u1ee9c kh\u1ecfe h\u1ec7 th\u1ed1ng" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/zh-Hans.json b/homeassistant/components/system_health/.translations/zh-Hans.json new file mode 100644 index 000000000000..8bd2f9f04108 --- /dev/null +++ b/homeassistant/components/system_health/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u7cfb\u7edf\u72b6\u6001" +} \ No newline at end of file diff --git a/homeassistant/components/system_health/.translations/zh-Hant.json b/homeassistant/components/system_health/.translations/zh-Hant.json new file mode 100644 index 000000000000..fc4734b2f310 --- /dev/null +++ b/homeassistant/components/system_health/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u7cfb\u7d71\u5065\u5eb7\u72c0\u614b" +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/ca.json b/homeassistant/components/tado/.translations/ca.json new file mode 100644 index 000000000000..4dcac2924a98 --- /dev/null +++ b/homeassistant/components/tado/.translations/ca.json @@ -0,0 +1,29 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat" + }, + "error": { + "cannot_connect": "No s'ha pogut connectar, torna-ho a provar", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "no_homes": "No hi ha cases enlla\u00e7ades a aquest compte Tado.", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "password": "Contrasenya", + "username": "Nom d'usuari" + }, + "title": "Connexi\u00f3 amb compte Tado" + } + } + }, + "options": { + "step": { + "init": { + "title": "Ajusta les opcions de Tado" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/de.json b/homeassistant/components/tado/.translations/de.json index 0acac0df43b9..96a39ea4de4e 100644 --- a/homeassistant/components/tado/.translations/de.json +++ b/homeassistant/components/tado/.translations/de.json @@ -26,8 +26,6 @@ }, "title": "Passen Sie die Tado-Optionen an." } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/en.json b/homeassistant/components/tado/.translations/en.json index 4eb4d59e6420..d6f28c43cb21 100644 --- a/homeassistant/components/tado/.translations/en.json +++ b/homeassistant/components/tado/.translations/en.json @@ -28,8 +28,6 @@ "description": "Fallback mode will switch to Smart Schedule at next schedule switch after manually adjusting a zone.", "title": "Adjust Tado options." } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/es.json b/homeassistant/components/tado/.translations/es.json index 68178af768dd..fec4e4481824 100644 --- a/homeassistant/components/tado/.translations/es.json +++ b/homeassistant/components/tado/.translations/es.json @@ -28,8 +28,6 @@ "description": "El modo de salvaguarda volver\u00e1 a la Planificaci\u00f3n Inteligente en el siguiente cambio de programaci\u00f3n despu\u00e9s de ajustar manualmente una zona.", "title": "Ajustar las opciones de Tado" } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/it.json b/homeassistant/components/tado/.translations/it.json index 6fbabbc13bb1..775ef702b849 100644 --- a/homeassistant/components/tado/.translations/it.json +++ b/homeassistant/components/tado/.translations/it.json @@ -28,8 +28,6 @@ "description": "La modalit\u00e0 di fallback passer\u00e0 a Smart Schedule al prossimo cambio di programma dopo aver regolato manualmente una zona.", "title": "Regolare le opzioni di Tado." } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/no.json b/homeassistant/components/tado/.translations/no.json index 5d2a003e5eb5..594084c6571a 100644 --- a/homeassistant/components/tado/.translations/no.json +++ b/homeassistant/components/tado/.translations/no.json @@ -8,15 +8,26 @@ "invalid_auth": "Ugyldig godkjenning", "no_homes": "Det er ingen hjem knyttet til denne tado-kontoen.", "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "password": "Passord", + "username": "Brukernavn" + }, + "title": "Koble til Tado-kontoen din" + } } }, "options": { "step": { "init": { + "data": { + "fallback": "Aktiver tilbakefallsmodus." + }, "description": "Fallback-modus bytter til Smart Schedule ved neste planbryter etter manuell justering av en sone.", "title": "Juster Tado-alternativene." } - }, - "title": "Tado" + } } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/ru.json b/homeassistant/components/tado/.translations/ru.json index a2ae32f5aa96..04d1a0d95457 100644 --- a/homeassistant/components/tado/.translations/ru.json +++ b/homeassistant/components/tado/.translations/ru.json @@ -28,8 +28,6 @@ "description": "\u0420\u0435\u0436\u0438\u043c Fallback \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043d\u0430 Smart Schedule \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u043e\u043d\u044b.", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Tado" } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/sl.json b/homeassistant/components/tado/.translations/sl.json new file mode 100644 index 000000000000..061e511eb528 --- /dev/null +++ b/homeassistant/components/tado/.translations/sl.json @@ -0,0 +1,33 @@ +{ + "config": { + "abort": { + "already_configured": "Naprava je \u017ee konfigurirana" + }, + "error": { + "cannot_connect": "Povezava ni uspela, poskusite znova", + "invalid_auth": "Neveljavna avtentikacija", + "no_homes": "Ni domov, povezanih s tem Tado ra\u010dunom.", + "unknown": "Nepri\u010dakovana napaka" + }, + "step": { + "user": { + "data": { + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "title": "Pove\u017eite se s svojim ra\u010dunom Tado" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "fallback": "Omogo\u010di rezervni na\u010din." + }, + "description": "Rezervni na\u010din bo preklopili na pametni urnik ob naslednjem preklopnem stikalu po ro\u010dni prilagoditvi obmo\u010dja.", + "title": "Prilagodite Tado mo\u017enosti." + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tado/.translations/zh-Hant.json b/homeassistant/components/tado/.translations/zh-Hant.json index 054c4464922f..911520065fce 100644 --- a/homeassistant/components/tado/.translations/zh-Hant.json +++ b/homeassistant/components/tado/.translations/zh-Hant.json @@ -28,8 +28,6 @@ "description": "\u5f8c\u964d\u6a21\u5f0f\u5c07\u6703\u65bc\u624b\u52d5\u8abf\u6574\u5340\u57df\u5f8c\uff0c\u4e0b\u4e00\u6b21\u898f\u5283\u5207\u63db\u6642\u3001\u5207\u63db\u5230\u667a\u80fd\u884c\u7a0b\u3002", "title": "\u8abf\u6574 Tado \u9078\u9805\u3002" } - }, - "title": "Tado" - }, - "title": "Tado" + } + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/bg.json b/homeassistant/components/tellduslive/.translations/bg.json index 96beb3141c5d..eef994a608e0 100644 --- a/homeassistant/components/tellduslive/.translations/bg.json +++ b/homeassistant/components/tellduslive/.translations/bg.json @@ -21,6 +21,5 @@ "title": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043a\u0440\u0430\u0439\u043d\u0430 \u0442\u043e\u0447\u043a\u0430." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ca.json b/homeassistant/components/tellduslive/.translations/ca.json index 933ad3cf7da0..7a467844c75c 100644 --- a/homeassistant/components/tellduslive/.translations/ca.json +++ b/homeassistant/components/tellduslive/.translations/ca.json @@ -22,6 +22,5 @@ "title": "Selecci\u00f3 extrem" } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/da.json b/homeassistant/components/tellduslive/.translations/da.json index c85251a0e137..2ceb78b6bd05 100644 --- a/homeassistant/components/tellduslive/.translations/da.json +++ b/homeassistant/components/tellduslive/.translations/da.json @@ -22,6 +22,5 @@ "title": "V\u00e6lg slutpunkt." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/de.json b/homeassistant/components/tellduslive/.translations/de.json index e58c69931796..7d2ab21d81f7 100644 --- a/homeassistant/components/tellduslive/.translations/de.json +++ b/homeassistant/components/tellduslive/.translations/de.json @@ -22,6 +22,5 @@ "title": "Endpunkt ausw\u00e4hlen." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/en.json b/homeassistant/components/tellduslive/.translations/en.json index 601c83d31e05..fb7a76de1061 100644 --- a/homeassistant/components/tellduslive/.translations/en.json +++ b/homeassistant/components/tellduslive/.translations/en.json @@ -21,6 +21,5 @@ "title": "Pick endpoint." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/es-419.json b/homeassistant/components/tellduslive/.translations/es-419.json index 3b8cdff3985d..36b358192be4 100644 --- a/homeassistant/components/tellduslive/.translations/es-419.json +++ b/homeassistant/components/tellduslive/.translations/es-419.json @@ -19,6 +19,5 @@ } } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/es.json b/homeassistant/components/tellduslive/.translations/es.json index b760f25a47dd..37b1c15f896d 100644 --- a/homeassistant/components/tellduslive/.translations/es.json +++ b/homeassistant/components/tellduslive/.translations/es.json @@ -22,6 +22,5 @@ "title": "Elige el punto final." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/fr.json b/homeassistant/components/tellduslive/.translations/fr.json index f5c7efb4cd44..236f682184aa 100644 --- a/homeassistant/components/tellduslive/.translations/fr.json +++ b/homeassistant/components/tellduslive/.translations/fr.json @@ -22,6 +22,5 @@ "title": "Choisissez le point de terminaison." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/hu.json b/homeassistant/components/tellduslive/.translations/hu.json index 823b50fa869b..ace432f6a3f9 100644 --- a/homeassistant/components/tellduslive/.translations/hu.json +++ b/homeassistant/components/tellduslive/.translations/hu.json @@ -18,6 +18,5 @@ "title": "V\u00e1lassz v\u00e9gpontot." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/it.json b/homeassistant/components/tellduslive/.translations/it.json index 414286efdb00..7776c23dbaac 100644 --- a/homeassistant/components/tellduslive/.translations/it.json +++ b/homeassistant/components/tellduslive/.translations/it.json @@ -22,6 +22,5 @@ "title": "Scegli l'endpoint." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ko.json b/homeassistant/components/tellduslive/.translations/ko.json index 5790bc6d7a64..7851f9d64bf6 100644 --- a/homeassistant/components/tellduslive/.translations/ko.json +++ b/homeassistant/components/tellduslive/.translations/ko.json @@ -22,6 +22,5 @@ "title": "\uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uc120\ud0dd" } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/lb.json b/homeassistant/components/tellduslive/.translations/lb.json index 3437a73f6a4f..f9191fe7866c 100644 --- a/homeassistant/components/tellduslive/.translations/lb.json +++ b/homeassistant/components/tellduslive/.translations/lb.json @@ -22,6 +22,5 @@ "title": "Endpoint auswielen" } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/nl.json b/homeassistant/components/tellduslive/.translations/nl.json index 905653b70159..d17637e7c2cb 100644 --- a/homeassistant/components/tellduslive/.translations/nl.json +++ b/homeassistant/components/tellduslive/.translations/nl.json @@ -22,6 +22,5 @@ "title": "Kies eindpunt." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/no.json b/homeassistant/components/tellduslive/.translations/no.json index 854b7fb562c6..9eb459e53e6b 100644 --- a/homeassistant/components/tellduslive/.translations/no.json +++ b/homeassistant/components/tellduslive/.translations/no.json @@ -22,6 +22,5 @@ "title": "Velg endepunkt." } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pl.json b/homeassistant/components/tellduslive/.translations/pl.json index 5565fb21111a..3ee83236d7e6 100644 --- a/homeassistant/components/tellduslive/.translations/pl.json +++ b/homeassistant/components/tellduslive/.translations/pl.json @@ -22,6 +22,5 @@ "title": "Wybierz punkt ko\u0144cowy." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pt-BR.json b/homeassistant/components/tellduslive/.translations/pt-BR.json index e0066a271dcd..a1114965a4bf 100644 --- a/homeassistant/components/tellduslive/.translations/pt-BR.json +++ b/homeassistant/components/tellduslive/.translations/pt-BR.json @@ -22,6 +22,5 @@ "title": "Escolha o ponto final." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/pt.json b/homeassistant/components/tellduslive/.translations/pt.json index e4f8bf05563c..549fa406253d 100644 --- a/homeassistant/components/tellduslive/.translations/pt.json +++ b/homeassistant/components/tellduslive/.translations/pt.json @@ -22,6 +22,5 @@ "title": "Escolher endpoint." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/ru.json b/homeassistant/components/tellduslive/.translations/ru.json index 71204c886021..2fb298f781c1 100644 --- a/homeassistant/components/tellduslive/.translations/ru.json +++ b/homeassistant/components/tellduslive/.translations/ru.json @@ -22,6 +22,5 @@ "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/sl.json b/homeassistant/components/tellduslive/.translations/sl.json index 0ee0c4b6ac7e..0775e47f6944 100644 --- a/homeassistant/components/tellduslive/.translations/sl.json +++ b/homeassistant/components/tellduslive/.translations/sl.json @@ -22,6 +22,5 @@ "title": "Izberite kon\u010dno to\u010dko." } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/sv.json b/homeassistant/components/tellduslive/.translations/sv.json index a7692f2a68e3..1a8affa7c313 100644 --- a/homeassistant/components/tellduslive/.translations/sv.json +++ b/homeassistant/components/tellduslive/.translations/sv.json @@ -22,6 +22,5 @@ "title": "V\u00e4lj endpoint." } } - }, - "title": "Telldus Live!" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/zh-Hans.json b/homeassistant/components/tellduslive/.translations/zh-Hans.json index a9449ad999f7..f28bb62b10a8 100644 --- a/homeassistant/components/tellduslive/.translations/zh-Hans.json +++ b/homeassistant/components/tellduslive/.translations/zh-Hans.json @@ -22,6 +22,5 @@ "title": "\u9009\u62e9 endpoint\u3002" } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tellduslive/.translations/zh-Hant.json b/homeassistant/components/tellduslive/.translations/zh-Hant.json index 959e1744082c..0901d927a2bf 100644 --- a/homeassistant/components/tellduslive/.translations/zh-Hant.json +++ b/homeassistant/components/tellduslive/.translations/zh-Hant.json @@ -22,6 +22,5 @@ "title": "\u9078\u64c7\u7aef\u9ede\u3002" } } - }, - "title": "Telldus Live" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ca.json b/homeassistant/components/tesla/.translations/ca.json index ad1ae6935d2a..35169f70245c 100644 --- a/homeassistant/components/tesla/.translations/ca.json +++ b/homeassistant/components/tesla/.translations/ca.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/da.json b/homeassistant/components/tesla/.translations/da.json index a6036e479846..da4d71058bc1 100644 --- a/homeassistant/components/tesla/.translations/da.json +++ b/homeassistant/components/tesla/.translations/da.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/de.json b/homeassistant/components/tesla/.translations/de.json index 4c458f06bce0..c6c2bc115f44 100644 --- a/homeassistant/components/tesla/.translations/de.json +++ b/homeassistant/components/tesla/.translations/de.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/en.json b/homeassistant/components/tesla/.translations/en.json index 67d91759e249..34fdb66c0987 100644 --- a/homeassistant/components/tesla/.translations/en.json +++ b/homeassistant/components/tesla/.translations/en.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/es.json b/homeassistant/components/tesla/.translations/es.json index 465d76689812..e0f5f81e5aed 100644 --- a/homeassistant/components/tesla/.translations/es.json +++ b/homeassistant/components/tesla/.translations/es.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/fr.json b/homeassistant/components/tesla/.translations/fr.json index 9712f1f780dd..638557f10350 100644 --- a/homeassistant/components/tesla/.translations/fr.json +++ b/homeassistant/components/tesla/.translations/fr.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/hu.json b/homeassistant/components/tesla/.translations/hu.json index 976de89687bd..0b9dbbf06a7b 100644 --- a/homeassistant/components/tesla/.translations/hu.json +++ b/homeassistant/components/tesla/.translations/hu.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/it.json b/homeassistant/components/tesla/.translations/it.json index dc7350982e5a..3a77ce669ebf 100644 --- a/homeassistant/components/tesla/.translations/it.json +++ b/homeassistant/components/tesla/.translations/it.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ko.json b/homeassistant/components/tesla/.translations/ko.json index 4879d5ce9fe1..24cb45a5c45f 100644 --- a/homeassistant/components/tesla/.translations/ko.json +++ b/homeassistant/components/tesla/.translations/ko.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/lb.json b/homeassistant/components/tesla/.translations/lb.json index 9d5e030900e7..4d8fde97eaf6 100644 --- a/homeassistant/components/tesla/.translations/lb.json +++ b/homeassistant/components/tesla/.translations/lb.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/nl.json b/homeassistant/components/tesla/.translations/nl.json index 618ec9382086..02bbd32e417f 100644 --- a/homeassistant/components/tesla/.translations/nl.json +++ b/homeassistant/components/tesla/.translations/nl.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/no.json b/homeassistant/components/tesla/.translations/no.json index e46a184ac449..1593319c8e1d 100644 --- a/homeassistant/components/tesla/.translations/no.json +++ b/homeassistant/components/tesla/.translations/no.json @@ -26,6 +26,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/pl.json b/homeassistant/components/tesla/.translations/pl.json index eac0ef77433f..b961d12e5a88 100644 --- a/homeassistant/components/tesla/.translations/pl.json +++ b/homeassistant/components/tesla/.translations/pl.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/pt-BR.json b/homeassistant/components/tesla/.translations/pt-BR.json index c8a1b1bd2404..c06b4fabf99c 100644 --- a/homeassistant/components/tesla/.translations/pt-BR.json +++ b/homeassistant/components/tesla/.translations/pt-BR.json @@ -16,6 +16,5 @@ "title": "Tesla - Configura\u00e7\u00e3o" } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/ru.json b/homeassistant/components/tesla/.translations/ru.json index 4dd852403d05..dae30a669b32 100644 --- a/homeassistant/components/tesla/.translations/ru.json +++ b/homeassistant/components/tesla/.translations/ru.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/sl.json b/homeassistant/components/tesla/.translations/sl.json index 6260a5bcb22c..76890e749d72 100644 --- a/homeassistant/components/tesla/.translations/sl.json +++ b/homeassistant/components/tesla/.translations/sl.json @@ -21,10 +21,10 @@ "step": { "init": { "data": { + "enable_wake_on_start": "Vsili zbujanje avtomobila ob zagonu", "scan_interval": "Sekund med skeniranjem" } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/sv.json b/homeassistant/components/tesla/.translations/sv.json index ec2763d01f78..5eebeef1553d 100644 --- a/homeassistant/components/tesla/.translations/sv.json +++ b/homeassistant/components/tesla/.translations/sv.json @@ -25,6 +25,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/tesla/.translations/zh-Hant.json b/homeassistant/components/tesla/.translations/zh-Hant.json index f302a4fdb904..522b42dd5008 100644 --- a/homeassistant/components/tesla/.translations/zh-Hant.json +++ b/homeassistant/components/tesla/.translations/zh-Hant.json @@ -26,6 +26,5 @@ } } } - }, - "title": "Tesla" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/bg.json b/homeassistant/components/toon/.translations/bg.json index 187595724396..0108f532d6ab 100644 --- a/homeassistant/components/toon/.translations/bg.json +++ b/homeassistant/components/toon/.translations/bg.json @@ -29,6 +29,5 @@ "title": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u0439" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/ca.json b/homeassistant/components/toon/.translations/ca.json index 3830c131650b..1ff63331f52b 100644 --- a/homeassistant/components/toon/.translations/ca.json +++ b/homeassistant/components/toon/.translations/ca.json @@ -29,6 +29,5 @@ "title": "Selecci\u00f3 de pantalla" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/da.json b/homeassistant/components/toon/.translations/da.json index fe588e01439e..73d18f22911f 100644 --- a/homeassistant/components/toon/.translations/da.json +++ b/homeassistant/components/toon/.translations/da.json @@ -29,6 +29,5 @@ "title": "V\u00e6lg sk\u00e6rm" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/de.json b/homeassistant/components/toon/.translations/de.json index 938b86add170..0c4aee8cdbf6 100644 --- a/homeassistant/components/toon/.translations/de.json +++ b/homeassistant/components/toon/.translations/de.json @@ -29,6 +29,5 @@ "title": "Anzeige ausw\u00e4hlen" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/en.json b/homeassistant/components/toon/.translations/en.json index c43e8079ec02..8d8b837e9876 100644 --- a/homeassistant/components/toon/.translations/en.json +++ b/homeassistant/components/toon/.translations/en.json @@ -29,6 +29,5 @@ "title": "Select display" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/es-419.json b/homeassistant/components/toon/.translations/es-419.json index 800e9a1a18a2..6fa63e591a31 100644 --- a/homeassistant/components/toon/.translations/es-419.json +++ b/homeassistant/components/toon/.translations/es-419.json @@ -24,6 +24,5 @@ "title": "Seleccionar pantalla" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/es.json b/homeassistant/components/toon/.translations/es.json index e37995b0aabc..737cc1d06125 100644 --- a/homeassistant/components/toon/.translations/es.json +++ b/homeassistant/components/toon/.translations/es.json @@ -29,6 +29,5 @@ "title": "Seleccionar pantalla" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/fr.json b/homeassistant/components/toon/.translations/fr.json index d711a2edfc32..9da12e7aeaa5 100644 --- a/homeassistant/components/toon/.translations/fr.json +++ b/homeassistant/components/toon/.translations/fr.json @@ -29,6 +29,5 @@ "title": "S\u00e9lectionnez l'affichage" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/it.json b/homeassistant/components/toon/.translations/it.json index 3793aa76404b..62f4031660d2 100644 --- a/homeassistant/components/toon/.translations/it.json +++ b/homeassistant/components/toon/.translations/it.json @@ -29,6 +29,5 @@ "title": "Seleziona il display" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/ko.json b/homeassistant/components/toon/.translations/ko.json index 079f6eddb6f7..6940f8ca33ff 100644 --- a/homeassistant/components/toon/.translations/ko.json +++ b/homeassistant/components/toon/.translations/ko.json @@ -29,6 +29,5 @@ "title": "\ub514\uc2a4\ud50c\ub808\uc774 \uc120\ud0dd" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/lb.json b/homeassistant/components/toon/.translations/lb.json index 4bf599b598b9..57837479d4cd 100644 --- a/homeassistant/components/toon/.translations/lb.json +++ b/homeassistant/components/toon/.translations/lb.json @@ -29,6 +29,5 @@ "title": "Ecran auswielen" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/nl.json b/homeassistant/components/toon/.translations/nl.json index 32df22700737..bcced85e29d1 100644 --- a/homeassistant/components/toon/.translations/nl.json +++ b/homeassistant/components/toon/.translations/nl.json @@ -29,6 +29,5 @@ "title": "Kies scherm" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/nn.json b/homeassistant/components/toon/.translations/nn.json index 0dcee9de5885..b9bb31d468b3 100644 --- a/homeassistant/components/toon/.translations/nn.json +++ b/homeassistant/components/toon/.translations/nn.json @@ -7,6 +7,5 @@ } } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/no.json b/homeassistant/components/toon/.translations/no.json index aa65b65dc8ef..a41438b332a2 100644 --- a/homeassistant/components/toon/.translations/no.json +++ b/homeassistant/components/toon/.translations/no.json @@ -29,6 +29,5 @@ "title": "Velg skjerm" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/pl.json b/homeassistant/components/toon/.translations/pl.json index bdc98c5e2ce4..c3d783a90346 100644 --- a/homeassistant/components/toon/.translations/pl.json +++ b/homeassistant/components/toon/.translations/pl.json @@ -29,6 +29,5 @@ "title": "Wybierz wy\u015bwietlacz" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/pt-BR.json b/homeassistant/components/toon/.translations/pt-BR.json index 1b819056273b..3e6829f65968 100644 --- a/homeassistant/components/toon/.translations/pt-BR.json +++ b/homeassistant/components/toon/.translations/pt-BR.json @@ -29,6 +29,5 @@ "title": "Selecione a exibi\u00e7\u00e3o" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/pt.json b/homeassistant/components/toon/.translations/pt.json index ebec0df356fd..a4b601f78990 100644 --- a/homeassistant/components/toon/.translations/pt.json +++ b/homeassistant/components/toon/.translations/pt.json @@ -1,5 +1,13 @@ { "config": { + "abort": { + "client_id": "O ID do cliente da configura\u00e7\u00e3o \u00e9 inv\u00e1lido.", + "client_secret": "O segredo do cliente da configura\u00e7\u00e3o \u00e9 inv\u00e1lido.", + "unknown_auth_fail": "Ocorreu um erro inesperado durante a autentica\u00e7\u00e3o." + }, + "error": { + "credentials": "As credenciais fornecidas s\u00e3o inv\u00e1lidas." + }, "step": { "authenticate": { "data": { diff --git a/homeassistant/components/toon/.translations/ru.json b/homeassistant/components/toon/.translations/ru.json index e9f1b919680b..afa734674793 100644 --- a/homeassistant/components/toon/.translations/ru.json +++ b/homeassistant/components/toon/.translations/ru.json @@ -29,6 +29,5 @@ "title": "Toon" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/sl.json b/homeassistant/components/toon/.translations/sl.json index 8de052d911a1..f86289d5a08d 100644 --- a/homeassistant/components/toon/.translations/sl.json +++ b/homeassistant/components/toon/.translations/sl.json @@ -29,6 +29,5 @@ "title": "Izberite zaslon" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/sv.json b/homeassistant/components/toon/.translations/sv.json index b38d0fb8f85b..bb1c89e1e3cd 100644 --- a/homeassistant/components/toon/.translations/sv.json +++ b/homeassistant/components/toon/.translations/sv.json @@ -29,6 +29,5 @@ "title": "V\u00e4lj sk\u00e4rm" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/toon/.translations/zh-Hant.json b/homeassistant/components/toon/.translations/zh-Hant.json index 888015973968..618a3a5fd007 100644 --- a/homeassistant/components/toon/.translations/zh-Hant.json +++ b/homeassistant/components/toon/.translations/zh-Hant.json @@ -29,6 +29,5 @@ "title": "\u9078\u64c7\u8a2d\u5099" } } - }, - "title": "Toon" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/ca.json b/homeassistant/components/totalconnect/.translations/ca.json new file mode 100644 index 000000000000..19106050c6d0 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/ca.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "El compte ja ha estat configurat" + }, + "error": { + "login": "Error d\u2019inici de sessi\u00f3: comprova el nom d'usuari i la contrasenya" + }, + "step": { + "user": { + "data": { + "password": "Contrasenya", + "username": "Nom d'usuari" + }, + "title": "Total Connect" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/de.json b/homeassistant/components/totalconnect/.translations/de.json index 6a34670b9dbd..d3130bd7e80b 100644 --- a/homeassistant/components/totalconnect/.translations/de.json +++ b/homeassistant/components/totalconnect/.translations/de.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/en.json b/homeassistant/components/totalconnect/.translations/en.json index 797bf3c55a71..3486d42ae3d9 100644 --- a/homeassistant/components/totalconnect/.translations/en.json +++ b/homeassistant/components/totalconnect/.translations/en.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/es.json b/homeassistant/components/totalconnect/.translations/es.json index 361e22534c48..18b45f390b2b 100644 --- a/homeassistant/components/totalconnect/.translations/es.json +++ b/homeassistant/components/totalconnect/.translations/es.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/it.json b/homeassistant/components/totalconnect/.translations/it.json index f4d91ccc3520..455b8a7967fe 100644 --- a/homeassistant/components/totalconnect/.translations/it.json +++ b/homeassistant/components/totalconnect/.translations/it.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/no.json b/homeassistant/components/totalconnect/.translations/no.json index 1f04e414991a..f93f2cc4748e 100644 --- a/homeassistant/components/totalconnect/.translations/no.json +++ b/homeassistant/components/totalconnect/.translations/no.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/pt.json b/homeassistant/components/totalconnect/.translations/pt.json new file mode 100644 index 000000000000..de29ebd0489e --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/pt.json @@ -0,0 +1,18 @@ +{ + "config": { + "abort": { + "already_configured": "Conta j\u00e1 configurada" + }, + "error": { + "login": "Erro de login: verifique seu nome de utilizador e palavra-passe" + }, + "step": { + "user": { + "data": { + "password": "Palavra-passe", + "username": "Nome de Utilizador" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/ru.json b/homeassistant/components/totalconnect/.translations/ru.json index 8eecf7a087a3..b2ccada9e63c 100644 --- a/homeassistant/components/totalconnect/.translations/ru.json +++ b/homeassistant/components/totalconnect/.translations/ru.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/sl.json b/homeassistant/components/totalconnect/.translations/sl.json new file mode 100644 index 000000000000..80127b053d62 --- /dev/null +++ b/homeassistant/components/totalconnect/.translations/sl.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "Ra\u010dun \u017ee nastavljen" + }, + "error": { + "login": "Napaka pri prijavi: preverite svoje uporabni\u0161ko ime in geslo" + }, + "step": { + "user": { + "data": { + "password": "Geslo", + "username": "Uporabni\u0161ko ime" + }, + "title": "Total Connect" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/totalconnect/.translations/zh-Hant.json b/homeassistant/components/totalconnect/.translations/zh-Hant.json index dfc201734e9f..0424db3cdc3c 100644 --- a/homeassistant/components/totalconnect/.translations/zh-Hant.json +++ b/homeassistant/components/totalconnect/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "Total Connect" } } - }, - "title": "Total Connect" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/bg.json b/homeassistant/components/tplink/.translations/bg.json index 8ee618ee6eff..288ae9de6708 100644 --- a/homeassistant/components/tplink/.translations/bg.json +++ b/homeassistant/components/tplink/.translations/bg.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ca.json b/homeassistant/components/tplink/.translations/ca.json index 3beb6170ca25..41470c2bd6a6 100644 --- a/homeassistant/components/tplink/.translations/ca.json +++ b/homeassistant/components/tplink/.translations/ca.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/cs.json b/homeassistant/components/tplink/.translations/cs.json index 12b54c61ff39..bc9be34a83e0 100644 --- a/homeassistant/components/tplink/.translations/cs.json +++ b/homeassistant/components/tplink/.translations/cs.json @@ -5,6 +5,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/da.json b/homeassistant/components/tplink/.translations/da.json index 6a81b59c4377..fa55b4ff92f8 100644 --- a/homeassistant/components/tplink/.translations/da.json +++ b/homeassistant/components/tplink/.translations/da.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/de.json b/homeassistant/components/tplink/.translations/de.json index d96ea151ce3e..bd391ed762cd 100644 --- a/homeassistant/components/tplink/.translations/de.json +++ b/homeassistant/components/tplink/.translations/de.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/en.json b/homeassistant/components/tplink/.translations/en.json index 339c0bf6e658..49c7f40d4ade 100644 --- a/homeassistant/components/tplink/.translations/en.json +++ b/homeassistant/components/tplink/.translations/en.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/es-419.json b/homeassistant/components/tplink/.translations/es-419.json index 51de23bec32c..c349c3957334 100644 --- a/homeassistant/components/tplink/.translations/es-419.json +++ b/homeassistant/components/tplink/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/es.json b/homeassistant/components/tplink/.translations/es.json index 4559384383a7..6fa2fd5fd169 100644 --- a/homeassistant/components/tplink/.translations/es.json +++ b/homeassistant/components/tplink/.translations/es.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/fr.json b/homeassistant/components/tplink/.translations/fr.json index 87e3f7203654..b67464cb97c4 100644 --- a/homeassistant/components/tplink/.translations/fr.json +++ b/homeassistant/components/tplink/.translations/fr.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/he.json b/homeassistant/components/tplink/.translations/he.json index b8a8c59f58ce..f947ce87933b 100644 --- a/homeassistant/components/tplink/.translations/he.json +++ b/homeassistant/components/tplink/.translations/he.json @@ -10,6 +10,5 @@ "title": "\u05d1\u05d9\u05ea \u05d7\u05db\u05dd \u05e9\u05dc TP-Link" } } - }, - "title": "\u05d1\u05d9\u05ea \u05d7\u05db\u05dd \u05e9\u05dc TP-Link" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/it.json b/homeassistant/components/tplink/.translations/it.json index 0d591c0850c7..fd46e40d33f2 100644 --- a/homeassistant/components/tplink/.translations/it.json +++ b/homeassistant/components/tplink/.translations/it.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ko.json b/homeassistant/components/tplink/.translations/ko.json index c442ad2387b5..0d4f83366d9c 100644 --- a/homeassistant/components/tplink/.translations/ko.json +++ b/homeassistant/components/tplink/.translations/ko.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/lb.json b/homeassistant/components/tplink/.translations/lb.json index 3a40495a18a3..740b1684d6e0 100644 --- a/homeassistant/components/tplink/.translations/lb.json +++ b/homeassistant/components/tplink/.translations/lb.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/nl.json b/homeassistant/components/tplink/.translations/nl.json index 6fdce954a961..0d6ace9da782 100644 --- a/homeassistant/components/tplink/.translations/nl.json +++ b/homeassistant/components/tplink/.translations/nl.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/nn.json b/homeassistant/components/tplink/.translations/nn.json index 12b54c61ff39..bc9be34a83e0 100644 --- a/homeassistant/components/tplink/.translations/nn.json +++ b/homeassistant/components/tplink/.translations/nn.json @@ -5,6 +5,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/no.json b/homeassistant/components/tplink/.translations/no.json index 38578dafc89a..f2ba20859187 100644 --- a/homeassistant/components/tplink/.translations/no.json +++ b/homeassistant/components/tplink/.translations/no.json @@ -10,6 +10,5 @@ "title": "" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pl.json b/homeassistant/components/tplink/.translations/pl.json index 40839e8f4cc9..33b963e98136 100644 --- a/homeassistant/components/tplink/.translations/pl.json +++ b/homeassistant/components/tplink/.translations/pl.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pt-BR.json b/homeassistant/components/tplink/.translations/pt-BR.json index ce12d35086a5..f86d5d5b2a22 100644 --- a/homeassistant/components/tplink/.translations/pt-BR.json +++ b/homeassistant/components/tplink/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/pt.json b/homeassistant/components/tplink/.translations/pt.json index 12b54c61ff39..27c9fd6fbb11 100644 --- a/homeassistant/components/tplink/.translations/pt.json +++ b/homeassistant/components/tplink/.translations/pt.json @@ -1,10 +1,14 @@ { "config": { + "abort": { + "no_devices_found": "Nenhum dispositivo TP-Link encontrado na rede.", + "single_instance_allowed": "S\u00f3 \u00e9 necess\u00e1ria uma \u00fanica configura\u00e7\u00e3o." + }, "step": { "confirm": { + "description": "Deseja configurar os dispositivos inteligentes TP-Link?", "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/ru.json b/homeassistant/components/tplink/.translations/ru.json index b22057ca71ec..5797fb63bd74 100644 --- a/homeassistant/components/tplink/.translations/ru.json +++ b/homeassistant/components/tplink/.translations/ru.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/sl.json b/homeassistant/components/tplink/.translations/sl.json index 3f35a246054c..9bbf88cae156 100644 --- a/homeassistant/components/tplink/.translations/sl.json +++ b/homeassistant/components/tplink/.translations/sl.json @@ -10,6 +10,5 @@ "title": "TP-Link Pametni Dom" } } - }, - "title": "TP-Link Pametni Dom" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/sv.json b/homeassistant/components/tplink/.translations/sv.json index 6ab2cf93a9b9..c60162e6e31f 100644 --- a/homeassistant/components/tplink/.translations/sv.json +++ b/homeassistant/components/tplink/.translations/sv.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/zh-Hans.json b/homeassistant/components/tplink/.translations/zh-Hans.json index 81f264ce16ee..22ff788e9bb6 100644 --- a/homeassistant/components/tplink/.translations/zh-Hans.json +++ b/homeassistant/components/tplink/.translations/zh-Hans.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/tplink/.translations/zh-Hant.json b/homeassistant/components/tplink/.translations/zh-Hant.json index d8ff1e977663..08a4779e5931 100644 --- a/homeassistant/components/tplink/.translations/zh-Hant.json +++ b/homeassistant/components/tplink/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "TP-Link Smart Home" } } - }, - "title": "TP-Link Smart Home" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/bg.json b/homeassistant/components/traccar/.translations/bg.json index 68c2b1d11abb..19faba846402 100644 --- a/homeassistant/components/traccar/.translations/bg.json +++ b/homeassistant/components/traccar/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430 Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ca.json b/homeassistant/components/traccar/.translations/ca.json index 52d5b776d5d1..2fa936905539 100644 --- a/homeassistant/components/traccar/.translations/ca.json +++ b/homeassistant/components/traccar/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configura Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/da.json b/homeassistant/components/traccar/.translations/da.json index 2159542b8023..e836d84aea77 100644 --- a/homeassistant/components/traccar/.translations/da.json +++ b/homeassistant/components/traccar/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/de.json b/homeassistant/components/traccar/.translations/de.json index 6cf78485ada2..b4488c854f82 100644 --- a/homeassistant/components/traccar/.translations/de.json +++ b/homeassistant/components/traccar/.translations/de.json @@ -13,6 +13,5 @@ "title": "Traccar einrichten" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/en.json b/homeassistant/components/traccar/.translations/en.json index 99bfc2f0ef6d..1e6b286def2f 100644 --- a/homeassistant/components/traccar/.translations/en.json +++ b/homeassistant/components/traccar/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/es.json b/homeassistant/components/traccar/.translations/es.json index 294ffd96bef4..b0b65a10c83c 100644 --- a/homeassistant/components/traccar/.translations/es.json +++ b/homeassistant/components/traccar/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/fr.json b/homeassistant/components/traccar/.translations/fr.json index 0fea457b5b10..faf64359f0d1 100644 --- a/homeassistant/components/traccar/.translations/fr.json +++ b/homeassistant/components/traccar/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/it.json b/homeassistant/components/traccar/.translations/it.json index ce56480f01be..54e46e8d31d2 100644 --- a/homeassistant/components/traccar/.translations/it.json +++ b/homeassistant/components/traccar/.translations/it.json @@ -13,6 +13,5 @@ "title": "Imposta Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ko.json b/homeassistant/components/traccar/.translations/ko.json index 07199c7cffe3..4d4282dc4c1f 100644 --- a/homeassistant/components/traccar/.translations/ko.json +++ b/homeassistant/components/traccar/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Traccar \uc124\uc815" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/lb.json b/homeassistant/components/traccar/.translations/lb.json index 156fdcc6c4e0..a4d1da866e03 100644 --- a/homeassistant/components/traccar/.translations/lb.json +++ b/homeassistant/components/traccar/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Traccar ariichten" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/nl.json b/homeassistant/components/traccar/.translations/nl.json index 61295f3d90b0..fd238b09bd98 100644 --- a/homeassistant/components/traccar/.translations/nl.json +++ b/homeassistant/components/traccar/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Traccar instellen" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/no.json b/homeassistant/components/traccar/.translations/no.json index f9ae3236a1aa..41a05ac1c6fa 100644 --- a/homeassistant/components/traccar/.translations/no.json +++ b/homeassistant/components/traccar/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/pl.json b/homeassistant/components/traccar/.translations/pl.json index 85527af7d61d..5b1ad10c74de 100644 --- a/homeassistant/components/traccar/.translations/pl.json +++ b/homeassistant/components/traccar/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/pt-BR.json b/homeassistant/components/traccar/.translations/pt-BR.json index b7ad0024d65b..2a7afb382688 100644 --- a/homeassistant/components/traccar/.translations/pt-BR.json +++ b/homeassistant/components/traccar/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/ru.json b/homeassistant/components/traccar/.translations/ru.json index e1d7aa08392b..a2979379e18a 100644 --- a/homeassistant/components/traccar/.translations/ru.json +++ b/homeassistant/components/traccar/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/sl.json b/homeassistant/components/traccar/.translations/sl.json index c6cdc90aa4e8..016f3bbbeb2a 100644 --- a/homeassistant/components/traccar/.translations/sl.json +++ b/homeassistant/components/traccar/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/sv.json b/homeassistant/components/traccar/.translations/sv.json index 8a67cb2db080..ce32171eba5d 100644 --- a/homeassistant/components/traccar/.translations/sv.json +++ b/homeassistant/components/traccar/.translations/sv.json @@ -13,6 +13,5 @@ "title": "St\u00e4ll in Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/tr.json b/homeassistant/components/traccar/.translations/tr.json index f1f50d847319..7d044949a6ed 100644 --- a/homeassistant/components/traccar/.translations/tr.json +++ b/homeassistant/components/traccar/.translations/tr.json @@ -5,6 +5,5 @@ "title": "Traccar'\u0131 kur" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/traccar/.translations/zh-Hant.json b/homeassistant/components/traccar/.translations/zh-Hant.json index adb7da378db7..c469020aef68 100644 --- a/homeassistant/components/traccar/.translations/zh-Hant.json +++ b/homeassistant/components/traccar/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Traccar" } } - }, - "title": "Traccar" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/bg.json b/homeassistant/components/tradfri/.translations/bg.json index 74abca0ce08c..c9732c24fef9 100644 --- a/homeassistant/components/tradfri/.translations/bg.json +++ b/homeassistant/components/tradfri/.translations/bg.json @@ -19,6 +19,5 @@ "title": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043a\u043e\u0434 \u0437\u0430 \u0441\u0438\u0433\u0443\u0440\u043d\u043e\u0441\u0442" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ca.json b/homeassistant/components/tradfri/.translations/ca.json index ee5e2de904ea..cee54ccca79e 100644 --- a/homeassistant/components/tradfri/.translations/ca.json +++ b/homeassistant/components/tradfri/.translations/ca.json @@ -19,6 +19,5 @@ "title": "Introdueix el codi de seguretat" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/cs.json b/homeassistant/components/tradfri/.translations/cs.json index f7270ed94447..e4c328c30206 100644 --- a/homeassistant/components/tradfri/.translations/cs.json +++ b/homeassistant/components/tradfri/.translations/cs.json @@ -18,6 +18,5 @@ "title": "Zadejte bezpe\u010dnostn\u00ed k\u00f3d" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/da.json b/homeassistant/components/tradfri/.translations/da.json index bf6bcb094e24..6f68e6a6a738 100644 --- a/homeassistant/components/tradfri/.translations/da.json +++ b/homeassistant/components/tradfri/.translations/da.json @@ -19,6 +19,5 @@ "title": "Indtast sikkerhedskode" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/de.json b/homeassistant/components/tradfri/.translations/de.json index 7b38a1ca3424..181631047eaf 100644 --- a/homeassistant/components/tradfri/.translations/de.json +++ b/homeassistant/components/tradfri/.translations/de.json @@ -19,6 +19,5 @@ "title": "Sicherheitscode eingeben" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/en.json b/homeassistant/components/tradfri/.translations/en.json index b66cfb8d446b..f1ee9b9238a8 100644 --- a/homeassistant/components/tradfri/.translations/en.json +++ b/homeassistant/components/tradfri/.translations/en.json @@ -19,6 +19,5 @@ "title": "Enter security code" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/es-419.json b/homeassistant/components/tradfri/.translations/es-419.json index 6387813915f7..9ab753bab379 100644 --- a/homeassistant/components/tradfri/.translations/es-419.json +++ b/homeassistant/components/tradfri/.translations/es-419.json @@ -19,6 +19,5 @@ "title": "Ingrese el c\u00f3digo de seguridad" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/es.json b/homeassistant/components/tradfri/.translations/es.json index 151f7e8fd28a..1c66cca87b62 100644 --- a/homeassistant/components/tradfri/.translations/es.json +++ b/homeassistant/components/tradfri/.translations/es.json @@ -19,6 +19,5 @@ "title": "Introduzca el c\u00f3digo de seguridad" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/fr.json b/homeassistant/components/tradfri/.translations/fr.json index 4f8c26088530..ebafa93b07fd 100644 --- a/homeassistant/components/tradfri/.translations/fr.json +++ b/homeassistant/components/tradfri/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Entrer le code de s\u00e9curit\u00e9" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/he.json b/homeassistant/components/tradfri/.translations/he.json index 6d704b37d804..f1731579816f 100644 --- a/homeassistant/components/tradfri/.translations/he.json +++ b/homeassistant/components/tradfri/.translations/he.json @@ -18,6 +18,5 @@ "title": "\u05d4\u05d6\u05df \u05e7\u05d5\u05d3 \u05d0\u05d1\u05d8\u05d7\u05d4" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/hr.json b/homeassistant/components/tradfri/.translations/hr.json index 38a496e40df6..bb242ca60f08 100644 --- a/homeassistant/components/tradfri/.translations/hr.json +++ b/homeassistant/components/tradfri/.translations/hr.json @@ -10,6 +10,5 @@ } } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/hu.json b/homeassistant/components/tradfri/.translations/hu.json index 158524d93251..8be065fe7971 100644 --- a/homeassistant/components/tradfri/.translations/hu.json +++ b/homeassistant/components/tradfri/.translations/hu.json @@ -18,6 +18,5 @@ "title": "Add meg a biztons\u00e1gi k\u00f3dot" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/id.json b/homeassistant/components/tradfri/.translations/id.json index d10183877aab..0671b162e1c7 100644 --- a/homeassistant/components/tradfri/.translations/id.json +++ b/homeassistant/components/tradfri/.translations/id.json @@ -18,6 +18,5 @@ "title": "Masukkan kode keamanan" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/it.json b/homeassistant/components/tradfri/.translations/it.json index 6a1d26cb75b0..4fe9b2a7c9c8 100644 --- a/homeassistant/components/tradfri/.translations/it.json +++ b/homeassistant/components/tradfri/.translations/it.json @@ -19,6 +19,5 @@ "title": "Inserisci il codice di sicurezza" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ko.json b/homeassistant/components/tradfri/.translations/ko.json index f551eff52436..a7fe2522c70a 100644 --- a/homeassistant/components/tradfri/.translations/ko.json +++ b/homeassistant/components/tradfri/.translations/ko.json @@ -19,6 +19,5 @@ "title": "\ubcf4\uc548 \ucf54\ub4dc \uc785\ub825" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/lb.json b/homeassistant/components/tradfri/.translations/lb.json index 0acf3a310a8f..c86016fa0b6f 100644 --- a/homeassistant/components/tradfri/.translations/lb.json +++ b/homeassistant/components/tradfri/.translations/lb.json @@ -19,6 +19,5 @@ "title": "Gitt de S\u00e9cherheets Code an" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/nl.json b/homeassistant/components/tradfri/.translations/nl.json index 951a8419dd10..1d0453704d06 100644 --- a/homeassistant/components/tradfri/.translations/nl.json +++ b/homeassistant/components/tradfri/.translations/nl.json @@ -19,6 +19,5 @@ "title": "Voer beveiligingscode in" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/nn.json b/homeassistant/components/tradfri/.translations/nn.json index e60a9efa5e4a..2d02081f6b38 100644 --- a/homeassistant/components/tradfri/.translations/nn.json +++ b/homeassistant/components/tradfri/.translations/nn.json @@ -18,6 +18,5 @@ "title": "Skriv inn sikkerheitskode" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/no.json b/homeassistant/components/tradfri/.translations/no.json index ebbe5da4877e..aed5dd1032ba 100644 --- a/homeassistant/components/tradfri/.translations/no.json +++ b/homeassistant/components/tradfri/.translations/no.json @@ -19,6 +19,5 @@ "title": "Skriv inn sikkerhetskode" } } - }, - "title": "Ikea Tr\u00e5dfri" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pl.json b/homeassistant/components/tradfri/.translations/pl.json index caa4291b881a..379a554e0c35 100644 --- a/homeassistant/components/tradfri/.translations/pl.json +++ b/homeassistant/components/tradfri/.translations/pl.json @@ -19,6 +19,5 @@ "title": "Wprowad\u017a kod bezpiecze\u0144stwa" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pt-BR.json b/homeassistant/components/tradfri/.translations/pt-BR.json index 0ba666cee11d..b1c853f5f2b0 100644 --- a/homeassistant/components/tradfri/.translations/pt-BR.json +++ b/homeassistant/components/tradfri/.translations/pt-BR.json @@ -19,6 +19,5 @@ "title": "Digite o c\u00f3digo de seguran\u00e7a" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/pt.json b/homeassistant/components/tradfri/.translations/pt.json index f4ea78179908..e4cf0e978794 100644 --- a/homeassistant/components/tradfri/.translations/pt.json +++ b/homeassistant/components/tradfri/.translations/pt.json @@ -18,6 +18,5 @@ "title": "Introduzir c\u00f3digo de seguran\u00e7a" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ro.json b/homeassistant/components/tradfri/.translations/ro.json index bc5444e7b0c4..9641c63dfa0e 100644 --- a/homeassistant/components/tradfri/.translations/ro.json +++ b/homeassistant/components/tradfri/.translations/ro.json @@ -18,6 +18,5 @@ "title": "Introduce\u021bi codul de securitate" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/ru.json b/homeassistant/components/tradfri/.translations/ru.json index 90902691e1fc..03077907aab0 100644 --- a/homeassistant/components/tradfri/.translations/ru.json +++ b/homeassistant/components/tradfri/.translations/ru.json @@ -19,6 +19,5 @@ "title": "IKEA TR\u00c5DFRI" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/sl.json b/homeassistant/components/tradfri/.translations/sl.json index 7b3e1fc2de1c..47714ea31b34 100644 --- a/homeassistant/components/tradfri/.translations/sl.json +++ b/homeassistant/components/tradfri/.translations/sl.json @@ -19,6 +19,5 @@ "title": "Vnesite varnostno kodo" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/sv.json b/homeassistant/components/tradfri/.translations/sv.json index 4959b35d8972..69d7f7ba3c50 100644 --- a/homeassistant/components/tradfri/.translations/sv.json +++ b/homeassistant/components/tradfri/.translations/sv.json @@ -19,6 +19,5 @@ "title": "Ange s\u00e4kerhetskod" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/zh-Hans.json b/homeassistant/components/tradfri/.translations/zh-Hans.json index f98e4d2ea6ea..85c9d4251ed5 100644 --- a/homeassistant/components/tradfri/.translations/zh-Hans.json +++ b/homeassistant/components/tradfri/.translations/zh-Hans.json @@ -19,6 +19,5 @@ "title": "\u8f93\u5165\u5b89\u5168\u7801" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/tradfri/.translations/zh-Hant.json b/homeassistant/components/tradfri/.translations/zh-Hant.json index cac431bd450e..adbb0e148f45 100644 --- a/homeassistant/components/tradfri/.translations/zh-Hant.json +++ b/homeassistant/components/tradfri/.translations/zh-Hant.json @@ -19,6 +19,5 @@ "title": "\u8f38\u5165\u5b89\u5168\u78bc" } } - }, - "title": "IKEA TR\u00c5DFRI" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/bg.json b/homeassistant/components/transmission/.translations/bg.json index 6a04b7a166f5..d817129e11ac 100644 --- a/homeassistant/components/transmission/.translations/bg.json +++ b/homeassistant/components/transmission/.translations/bg.json @@ -30,6 +30,5 @@ "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043e\u043f\u0446\u0438\u0438\u0442\u0435 \u0437\u0430 Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ca.json b/homeassistant/components/transmission/.translations/ca.json index ba0b48429eb0..837766ba6eda 100644 --- a/homeassistant/components/transmission/.translations/ca.json +++ b/homeassistant/components/transmission/.translations/ca.json @@ -30,6 +30,5 @@ "title": "Opcions de configuraci\u00f3 de Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/da.json b/homeassistant/components/transmission/.translations/da.json index 4b9712967c55..469c9ba6ff64 100644 --- a/homeassistant/components/transmission/.translations/da.json +++ b/homeassistant/components/transmission/.translations/da.json @@ -30,6 +30,5 @@ "title": "Konfigurationsindstillinger for Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/de.json b/homeassistant/components/transmission/.translations/de.json index 716e4ad239f9..4d2b3d6acd89 100644 --- a/homeassistant/components/transmission/.translations/de.json +++ b/homeassistant/components/transmission/.translations/de.json @@ -30,6 +30,5 @@ "title": "Konfiguriere die Optionen f\u00fcr die \u00dcbertragung" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/en.json b/homeassistant/components/transmission/.translations/en.json index 9f9a3e423052..702fda2dcd50 100644 --- a/homeassistant/components/transmission/.translations/en.json +++ b/homeassistant/components/transmission/.translations/en.json @@ -30,6 +30,5 @@ "title": "Configure options for Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/es.json b/homeassistant/components/transmission/.translations/es.json index b6b4423f6297..9626b5bd8636 100644 --- a/homeassistant/components/transmission/.translations/es.json +++ b/homeassistant/components/transmission/.translations/es.json @@ -30,6 +30,5 @@ "title": "Configurar opciones para la transmisi\u00f3n" } } - }, - "title": "Transmisi\u00f3n" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/fr.json b/homeassistant/components/transmission/.translations/fr.json index f63c0a3ee54c..3e5c87b79629 100644 --- a/homeassistant/components/transmission/.translations/fr.json +++ b/homeassistant/components/transmission/.translations/fr.json @@ -30,6 +30,5 @@ "title": "Configurer les options pour Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/it.json b/homeassistant/components/transmission/.translations/it.json index b20145b7c4d4..7c19cf4bc06f 100644 --- a/homeassistant/components/transmission/.translations/it.json +++ b/homeassistant/components/transmission/.translations/it.json @@ -30,6 +30,5 @@ "title": "Configurare le opzioni per Transmission" } } - }, - "title": "Trasmissione" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ko.json b/homeassistant/components/transmission/.translations/ko.json index fa1582daa730..b82e80a342da 100644 --- a/homeassistant/components/transmission/.translations/ko.json +++ b/homeassistant/components/transmission/.translations/ko.json @@ -30,6 +30,5 @@ "title": "Transmission \uc635\uc158 \uc124\uc815" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/lb.json b/homeassistant/components/transmission/.translations/lb.json index a32c2e539d4f..e1301cd2df19 100644 --- a/homeassistant/components/transmission/.translations/lb.json +++ b/homeassistant/components/transmission/.translations/lb.json @@ -30,6 +30,5 @@ "title": "Optioune fir Transmission konfigur\u00e9ieren" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/nl.json b/homeassistant/components/transmission/.translations/nl.json index 526851425265..3f6fba583c0e 100644 --- a/homeassistant/components/transmission/.translations/nl.json +++ b/homeassistant/components/transmission/.translations/nl.json @@ -30,6 +30,5 @@ "title": "Configureer de opties voor Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/no.json b/homeassistant/components/transmission/.translations/no.json index 413fe69560af..33bd4d3bff4b 100644 --- a/homeassistant/components/transmission/.translations/no.json +++ b/homeassistant/components/transmission/.translations/no.json @@ -30,6 +30,5 @@ "title": "Konfigurer alternativer for Transmission" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/pl.json b/homeassistant/components/transmission/.translations/pl.json index 0805a5a7ff79..20b4f8e55a9e 100644 --- a/homeassistant/components/transmission/.translations/pl.json +++ b/homeassistant/components/transmission/.translations/pl.json @@ -30,6 +30,5 @@ "title": "Konfiguracja opcji dla Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/pt-BR.json b/homeassistant/components/transmission/.translations/pt-BR.json index 1e927c081bb5..92921d345126 100644 --- a/homeassistant/components/transmission/.translations/pt-BR.json +++ b/homeassistant/components/transmission/.translations/pt-BR.json @@ -30,6 +30,5 @@ "title": "Configurar op\u00e7\u00f5es para Transmission" } } - }, - "title": "Transmiss\u00e3o" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/ru.json b/homeassistant/components/transmission/.translations/ru.json index b0445528e400..17868c1e39e2 100644 --- a/homeassistant/components/transmission/.translations/ru.json +++ b/homeassistant/components/transmission/.translations/ru.json @@ -30,6 +30,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/sl.json b/homeassistant/components/transmission/.translations/sl.json index da77960f288a..90ae364c97b0 100644 --- a/homeassistant/components/transmission/.translations/sl.json +++ b/homeassistant/components/transmission/.translations/sl.json @@ -30,6 +30,5 @@ "title": "Nastavite mo\u017enosti za Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/sv.json b/homeassistant/components/transmission/.translations/sv.json index da20997d7334..84023ea7c9c0 100644 --- a/homeassistant/components/transmission/.translations/sv.json +++ b/homeassistant/components/transmission/.translations/sv.json @@ -30,6 +30,5 @@ "title": "Konfigurera alternativ f\u00f6r Transmission" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/transmission/.translations/zh-Hant.json b/homeassistant/components/transmission/.translations/zh-Hant.json index b05e458f5cef..b8b30ab41596 100644 --- a/homeassistant/components/transmission/.translations/zh-Hant.json +++ b/homeassistant/components/transmission/.translations/zh-Hant.json @@ -30,6 +30,5 @@ "title": "Transmission \u8a2d\u5b9a\u9078\u9805" } } - }, - "title": "Transmission" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/bg.json b/homeassistant/components/twentemilieu/.translations/bg.json index 2ef1a75001d5..bff7e40f8ce0 100644 --- a/homeassistant/components/twentemilieu/.translations/bg.json +++ b/homeassistant/components/twentemilieu/.translations/bg.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ca.json b/homeassistant/components/twentemilieu/.translations/ca.json index caadb8b4da1c..4c5e1ffeee7e 100644 --- a/homeassistant/components/twentemilieu/.translations/ca.json +++ b/homeassistant/components/twentemilieu/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/da.json b/homeassistant/components/twentemilieu/.translations/da.json index 2d60ef39d883..23dfbb372edd 100644 --- a/homeassistant/components/twentemilieu/.translations/da.json +++ b/homeassistant/components/twentemilieu/.translations/da.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/de.json b/homeassistant/components/twentemilieu/.translations/de.json index e01a5a40ff66..8a1bf4039403 100644 --- a/homeassistant/components/twentemilieu/.translations/de.json +++ b/homeassistant/components/twentemilieu/.translations/de.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/en.json b/homeassistant/components/twentemilieu/.translations/en.json index a747845c18f6..bc48832db9d7 100644 --- a/homeassistant/components/twentemilieu/.translations/en.json +++ b/homeassistant/components/twentemilieu/.translations/en.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/es-419.json b/homeassistant/components/twentemilieu/.translations/es-419.json index c61566312848..ed333bb9b515 100644 --- a/homeassistant/components/twentemilieu/.translations/es-419.json +++ b/homeassistant/components/twentemilieu/.translations/es-419.json @@ -5,6 +5,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/es.json b/homeassistant/components/twentemilieu/.translations/es.json index 7402843f7aaa..d336c5ec1057 100644 --- a/homeassistant/components/twentemilieu/.translations/es.json +++ b/homeassistant/components/twentemilieu/.translations/es.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/fr.json b/homeassistant/components/twentemilieu/.translations/fr.json index 6f45ff67feff..bbdd8f92d7b1 100644 --- a/homeassistant/components/twentemilieu/.translations/fr.json +++ b/homeassistant/components/twentemilieu/.translations/fr.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/it.json b/homeassistant/components/twentemilieu/.translations/it.json index 6fb69db04232..a429a565beb6 100644 --- a/homeassistant/components/twentemilieu/.translations/it.json +++ b/homeassistant/components/twentemilieu/.translations/it.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ko.json b/homeassistant/components/twentemilieu/.translations/ko.json index 1a9c683614d7..1f3359ca1843 100644 --- a/homeassistant/components/twentemilieu/.translations/ko.json +++ b/homeassistant/components/twentemilieu/.translations/ko.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/lb.json b/homeassistant/components/twentemilieu/.translations/lb.json index 186f6f687dca..8af5df35f1d9 100644 --- a/homeassistant/components/twentemilieu/.translations/lb.json +++ b/homeassistant/components/twentemilieu/.translations/lb.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/nl.json b/homeassistant/components/twentemilieu/.translations/nl.json index c376709b628f..32177d590f4e 100644 --- a/homeassistant/components/twentemilieu/.translations/nl.json +++ b/homeassistant/components/twentemilieu/.translations/nl.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/nn.json b/homeassistant/components/twentemilieu/.translations/nn.json index c61566312848..ed333bb9b515 100644 --- a/homeassistant/components/twentemilieu/.translations/nn.json +++ b/homeassistant/components/twentemilieu/.translations/nn.json @@ -5,6 +5,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/no.json b/homeassistant/components/twentemilieu/.translations/no.json index e9e341c8b03f..84fe87eda046 100644 --- a/homeassistant/components/twentemilieu/.translations/no.json +++ b/homeassistant/components/twentemilieu/.translations/no.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/pl.json b/homeassistant/components/twentemilieu/.translations/pl.json index 0025a9a995c1..bfa38f9ef8a5 100644 --- a/homeassistant/components/twentemilieu/.translations/pl.json +++ b/homeassistant/components/twentemilieu/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/pt-BR.json b/homeassistant/components/twentemilieu/.translations/pt-BR.json index 15590dabc314..127f0241a3f8 100644 --- a/homeassistant/components/twentemilieu/.translations/pt-BR.json +++ b/homeassistant/components/twentemilieu/.translations/pt-BR.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/ru.json b/homeassistant/components/twentemilieu/.translations/ru.json index 6d975fc20374..4f470da8385b 100644 --- a/homeassistant/components/twentemilieu/.translations/ru.json +++ b/homeassistant/components/twentemilieu/.translations/ru.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/sl.json b/homeassistant/components/twentemilieu/.translations/sl.json index 3ccf19e22f7f..00c8a01e3b94 100644 --- a/homeassistant/components/twentemilieu/.translations/sl.json +++ b/homeassistant/components/twentemilieu/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/sv.json b/homeassistant/components/twentemilieu/.translations/sv.json index edbd77699fa6..f3a60a56c998 100644 --- a/homeassistant/components/twentemilieu/.translations/sv.json +++ b/homeassistant/components/twentemilieu/.translations/sv.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twentemilieu/.translations/zh-Hant.json b/homeassistant/components/twentemilieu/.translations/zh-Hant.json index 46685b2b74de..7ee372b14d23 100644 --- a/homeassistant/components/twentemilieu/.translations/zh-Hant.json +++ b/homeassistant/components/twentemilieu/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "Twente Milieu" } } - }, - "title": "Twente Milieu" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/bg.json b/homeassistant/components/twilio/.translations/bg.json index 5cc940b6d9a5..0bf90ce427be 100644 --- a/homeassistant/components/twilio/.translations/bg.json +++ b/homeassistant/components/twilio/.translations/bg.json @@ -13,6 +13,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ca.json b/homeassistant/components/twilio/.translations/ca.json index e945154a9277..591124fda286 100644 --- a/homeassistant/components/twilio/.translations/ca.json +++ b/homeassistant/components/twilio/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Configuraci\u00f3 del Webhook de Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/cs.json b/homeassistant/components/twilio/.translations/cs.json index da50d02bf8d8..073aab126c18 100644 --- a/homeassistant/components/twilio/.translations/cs.json +++ b/homeassistant/components/twilio/.translations/cs.json @@ -13,6 +13,5 @@ "title": "Nastaven\u00ed Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/da.json b/homeassistant/components/twilio/.translations/da.json index 4c3e69c3d87e..0e89342bb0e3 100644 --- a/homeassistant/components/twilio/.translations/da.json +++ b/homeassistant/components/twilio/.translations/da.json @@ -13,6 +13,5 @@ "title": "Konfigurer Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/de.json b/homeassistant/components/twilio/.translations/de.json index 5c69717cdf95..078604567545 100644 --- a/homeassistant/components/twilio/.translations/de.json +++ b/homeassistant/components/twilio/.translations/de.json @@ -13,6 +13,5 @@ "title": "Twilio-Webhook einrichten" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/en.json b/homeassistant/components/twilio/.translations/en.json index cfc522ba8eb2..32df9de104da 100644 --- a/homeassistant/components/twilio/.translations/en.json +++ b/homeassistant/components/twilio/.translations/en.json @@ -13,6 +13,5 @@ "title": "Set up the Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/es-419.json b/homeassistant/components/twilio/.translations/es-419.json index 81721c85bda9..f27723831045 100644 --- a/homeassistant/components/twilio/.translations/es-419.json +++ b/homeassistant/components/twilio/.translations/es-419.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/es.json b/homeassistant/components/twilio/.translations/es.json index 253878789156..943a91fa7ee0 100644 --- a/homeassistant/components/twilio/.translations/es.json +++ b/homeassistant/components/twilio/.translations/es.json @@ -13,6 +13,5 @@ "title": "Configurar el Webhook de Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/fr.json b/homeassistant/components/twilio/.translations/fr.json index 869520ee9562..2144fdd1d484 100644 --- a/homeassistant/components/twilio/.translations/fr.json +++ b/homeassistant/components/twilio/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Configurer le Webhook Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/hu.json b/homeassistant/components/twilio/.translations/hu.json index 26e66e7d584b..92e797917ed4 100644 --- a/homeassistant/components/twilio/.translations/hu.json +++ b/homeassistant/components/twilio/.translations/hu.json @@ -10,6 +10,5 @@ "title": "A Twilio Webhook be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/it.json b/homeassistant/components/twilio/.translations/it.json index 80b740b62d9c..b50d82bfeb1d 100644 --- a/homeassistant/components/twilio/.translations/it.json +++ b/homeassistant/components/twilio/.translations/it.json @@ -13,6 +13,5 @@ "title": "Configura il webhook di Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ko.json b/homeassistant/components/twilio/.translations/ko.json index b42fcbf4e275..63859a000d06 100644 --- a/homeassistant/components/twilio/.translations/ko.json +++ b/homeassistant/components/twilio/.translations/ko.json @@ -13,6 +13,5 @@ "title": "Twilio Webhook \uc124\uc815" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/lb.json b/homeassistant/components/twilio/.translations/lb.json index c1329c0aee90..8f7414090592 100644 --- a/homeassistant/components/twilio/.translations/lb.json +++ b/homeassistant/components/twilio/.translations/lb.json @@ -13,6 +13,5 @@ "title": "Twilio Webhook ariichten" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/nl.json b/homeassistant/components/twilio/.translations/nl.json index b0b021be457e..0af84ebb1729 100644 --- a/homeassistant/components/twilio/.translations/nl.json +++ b/homeassistant/components/twilio/.translations/nl.json @@ -13,6 +13,5 @@ "title": "Stel de Twilio Webhook in" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/no.json b/homeassistant/components/twilio/.translations/no.json index 3da622c7f515..98b2575d6918 100644 --- a/homeassistant/components/twilio/.translations/no.json +++ b/homeassistant/components/twilio/.translations/no.json @@ -13,6 +13,5 @@ "title": "Sett opp Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pl.json b/homeassistant/components/twilio/.translations/pl.json index 7191eba4a5ca..8d2f02ade2aa 100644 --- a/homeassistant/components/twilio/.translations/pl.json +++ b/homeassistant/components/twilio/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Konfiguracja Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pt-BR.json b/homeassistant/components/twilio/.translations/pt-BR.json index f715e1d5711a..0b377b5ab24a 100644 --- a/homeassistant/components/twilio/.translations/pt-BR.json +++ b/homeassistant/components/twilio/.translations/pt-BR.json @@ -13,6 +13,5 @@ "title": "Configurar o Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/pt.json b/homeassistant/components/twilio/.translations/pt.json index 8327206773e0..27f0f3d4888c 100644 --- a/homeassistant/components/twilio/.translations/pt.json +++ b/homeassistant/components/twilio/.translations/pt.json @@ -13,6 +13,5 @@ "title": "Configurar o Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/ru.json b/homeassistant/components/twilio/.translations/ru.json index 34fdd4145de1..cdb9377cd998 100644 --- a/homeassistant/components/twilio/.translations/ru.json +++ b/homeassistant/components/twilio/.translations/ru.json @@ -13,6 +13,5 @@ "title": "Twilio" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/sl.json b/homeassistant/components/twilio/.translations/sl.json index 9da6470144ef..a0ce124c69aa 100644 --- a/homeassistant/components/twilio/.translations/sl.json +++ b/homeassistant/components/twilio/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Nastavite Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/sv.json b/homeassistant/components/twilio/.translations/sv.json index b3863083cf64..47c7bc15be75 100644 --- a/homeassistant/components/twilio/.translations/sv.json +++ b/homeassistant/components/twilio/.translations/sv.json @@ -13,6 +13,5 @@ "title": "Konfigurera Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/zh-Hans.json b/homeassistant/components/twilio/.translations/zh-Hans.json index 35ccf1ecfbbd..0f769fecb5eb 100644 --- a/homeassistant/components/twilio/.translations/zh-Hans.json +++ b/homeassistant/components/twilio/.translations/zh-Hans.json @@ -13,6 +13,5 @@ "title": "\u8bbe\u7f6e Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/twilio/.translations/zh-Hant.json b/homeassistant/components/twilio/.translations/zh-Hant.json index c5ffa00dd5c7..8cb926fe259a 100644 --- a/homeassistant/components/twilio/.translations/zh-Hant.json +++ b/homeassistant/components/twilio/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u8a2d\u5b9a Twilio Webhook" } } - }, - "title": "Twilio" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/bg.json b/homeassistant/components/unifi/.translations/bg.json index 527b1a7a3746..f99f5ed67e5b 100644 --- a/homeassistant/components/unifi/.translations/bg.json +++ b/homeassistant/components/unifi/.translations/bg.json @@ -38,6 +38,5 @@ } } } - }, - "title": "UniFi \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ca.json b/homeassistant/components/unifi/.translations/ca.json index 786bd871ff45..6d8b395f2b07 100644 --- a/homeassistant/components/unifi/.translations/ca.json +++ b/homeassistant/components/unifi/.translations/ca.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "No hi ha cap client disponible a UniFi en aquesta adre\u00e7a MAC" - }, "options": { "step": { "client_control": { @@ -56,6 +53,5 @@ "title": "Opcions d'UniFi" } } - }, - "title": "Controlador UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/cs.json b/homeassistant/components/unifi/.translations/cs.json index 0d7da884aba4..c28ca26919cc 100644 --- a/homeassistant/components/unifi/.translations/cs.json +++ b/homeassistant/components/unifi/.translations/cs.json @@ -30,6 +30,5 @@ } } } - }, - "title": "UniFi \u0159adi\u010d" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/da.json b/homeassistant/components/unifi/.translations/da.json index 8f2f33868e46..a15d25a283dd 100644 --- a/homeassistant/components/unifi/.translations/da.json +++ b/homeassistant/components/unifi/.translations/da.json @@ -49,6 +49,5 @@ "title": "UniFi-indstillinger" } } - }, - "title": "UniFi Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/de.json b/homeassistant/components/unifi/.translations/de.json index db7cf1b6ab21..0683f3da5941 100644 --- a/homeassistant/components/unifi/.translations/de.json +++ b/homeassistant/components/unifi/.translations/de.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Unter dieser MAC-Adresse ist in UniFi kein Client verf\u00fcgbar" - }, "options": { "step": { "client_control": { @@ -62,6 +59,5 @@ "title": "UniFi-Optionen 3/3" } } - }, - "title": "UniFi-Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index 4b83deb174ff..289e0a6dacdd 100644 --- a/homeassistant/components/unifi/.translations/en.json +++ b/homeassistant/components/unifi/.translations/en.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "No client available in UniFi on that MAC address" - }, "options": { "step": { "client_control": { @@ -56,6 +53,5 @@ "title": "UniFi options 3/3" } } - }, - "title": "UniFi Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/es-419.json b/homeassistant/components/unifi/.translations/es-419.json index 515e5fbe9641..ac50051b6c8e 100644 --- a/homeassistant/components/unifi/.translations/es-419.json +++ b/homeassistant/components/unifi/.translations/es-419.json @@ -21,6 +21,5 @@ "title": "Configurar el controlador UniFi" } } - }, - "title": "Controlador UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/es.json b/homeassistant/components/unifi/.translations/es.json index 87b64e7809d2..9776f893e1e1 100644 --- a/homeassistant/components/unifi/.translations/es.json +++ b/homeassistant/components/unifi/.translations/es.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Ning\u00fan cliente disponible en UniFi en esa direcci\u00f3n MAC" - }, "options": { "step": { "client_control": { @@ -62,6 +59,5 @@ "title": "Opciones UniFi 3/3" } } - }, - "title": "Controlador UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/fr.json b/homeassistant/components/unifi/.translations/fr.json index 71930db04f24..007f06b1c8ea 100644 --- a/homeassistant/components/unifi/.translations/fr.json +++ b/homeassistant/components/unifi/.translations/fr.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Aucun client disponible dans UniFi sur cette adresse MAC" - }, "options": { "step": { "client_control": { @@ -59,6 +56,5 @@ "title": "Options UniFi 3/3" } } - }, - "title": "Contr\u00f4leur UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/hu.json b/homeassistant/components/unifi/.translations/hu.json index 6a5f30913aed..49bab5225d9d 100644 --- a/homeassistant/components/unifi/.translations/hu.json +++ b/homeassistant/components/unifi/.translations/hu.json @@ -29,6 +29,5 @@ } } } - }, - "title": "UniFi Vez\u00e9rl\u0151" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/it.json b/homeassistant/components/unifi/.translations/it.json index d959589644ee..87ebe6dbf9b6 100644 --- a/homeassistant/components/unifi/.translations/it.json +++ b/homeassistant/components/unifi/.translations/it.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Nessun client disponibile in UniFi su quell'indirizzo MAC" - }, "options": { "step": { "client_control": { @@ -62,6 +59,5 @@ "title": "Opzioni UniFi 3/3" } } - }, - "title": "UniFi Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ko.json b/homeassistant/components/unifi/.translations/ko.json index 730f11189f08..020a5807f300 100644 --- a/homeassistant/components/unifi/.translations/ko.json +++ b/homeassistant/components/unifi/.translations/ko.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "\ud574\ub2f9 MAC \uc8fc\uc18c\uc758 UniFi \uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4." - }, "options": { "step": { "client_control": { @@ -56,6 +53,5 @@ "title": "UniFi \uc635\uc158 3/3" } } - }, - "title": "UniFi \ucee8\ud2b8\ub864\ub7ec" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/lb.json b/homeassistant/components/unifi/.translations/lb.json index b82c0036c7a7..f6e9a6c2c4b3 100644 --- a/homeassistant/components/unifi/.translations/lb.json +++ b/homeassistant/components/unifi/.translations/lb.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Kee Client am Unifi disponibel mat der MAC Adress" - }, "options": { "step": { "client_control": { @@ -62,6 +59,5 @@ "title": "UniFi Optiounen 3/3" } } - }, - "title": "Unifi Kontroller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/nl.json b/homeassistant/components/unifi/.translations/nl.json index 7e03a1314ab4..e55ae8fd493a 100644 --- a/homeassistant/components/unifi/.translations/nl.json +++ b/homeassistant/components/unifi/.translations/nl.json @@ -49,6 +49,5 @@ } } } - }, - "title": "UniFi-controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/no.json b/homeassistant/components/unifi/.translations/no.json index 5085372747aa..c0913a097d51 100644 --- a/homeassistant/components/unifi/.translations/no.json +++ b/homeassistant/components/unifi/.translations/no.json @@ -23,15 +23,13 @@ } } }, - "error": { - "unknown_client_mac": "Ingen klient tilgjengelig i UniFi p\u00e5 den MAC-adressen" - }, "options": { "step": { "client_control": { "data": { "block_client": "Nettverkskontrollerte klienter", - "new_client": "Legg til ny klient for nettverkstilgangskontroll" + "new_client": "Legg til ny klient for nettverkstilgangskontroll", + "poe_clients": "Tillat POE-kontroll av klienter" }, "description": "Konfigurere klient-kontroller\n\nOpprette brytere for serienumre du \u00f8nsker \u00e5 kontrollere tilgang til nettverk for.", "title": "UniFi-alternativ 2/3" @@ -55,6 +53,5 @@ "title": "UniFi-alternativ 3/3" } } - }, - "title": "UniFi kontroller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pl.json b/homeassistant/components/unifi/.translations/pl.json index b02484e18270..bc7466a32dba 100644 --- a/homeassistant/components/unifi/.translations/pl.json +++ b/homeassistant/components/unifi/.translations/pl.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "Brak klienta w UniFi z tym adresem MAC" - }, "options": { "step": { "client_control": { @@ -63,6 +60,5 @@ "title": "Opcje UniFi" } } - }, - "title": "Kontroler UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pt-BR.json b/homeassistant/components/unifi/.translations/pt-BR.json index d60b4b5275b4..6372ed941dba 100644 --- a/homeassistant/components/unifi/.translations/pt-BR.json +++ b/homeassistant/components/unifi/.translations/pt-BR.json @@ -39,6 +39,5 @@ } } } - }, - "title": "Controlador UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/pt.json b/homeassistant/components/unifi/.translations/pt.json index 6044aa4fa6fd..3c1bfdbd8bef 100644 --- a/homeassistant/components/unifi/.translations/pt.json +++ b/homeassistant/components/unifi/.translations/pt.json @@ -44,6 +44,5 @@ } } } - }, - "title": "Controlador UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ro.json b/homeassistant/components/unifi/.translations/ro.json index 8b1c55af0891..090aeab1a7cd 100644 --- a/homeassistant/components/unifi/.translations/ro.json +++ b/homeassistant/components/unifi/.translations/ro.json @@ -19,6 +19,5 @@ "title": "Configura\u021bi un controler UniFi" } } - }, - "title": "Controler UniFi" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/ru.json b/homeassistant/components/unifi/.translations/ru.json index 2850f91efb87..de3bc97e2a3b 100644 --- a/homeassistant/components/unifi/.translations/ru.json +++ b/homeassistant/components/unifi/.translations/ru.json @@ -60,6 +60,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 UniFi. \u0428\u0430\u0433 3" } } - }, - "title": "UniFi Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/sl.json b/homeassistant/components/unifi/.translations/sl.json index 6606175b9dfd..ec5a1869423d 100644 --- a/homeassistant/components/unifi/.translations/sl.json +++ b/homeassistant/components/unifi/.translations/sl.json @@ -23,15 +23,13 @@ } } }, - "error": { - "unknown_client_mac": "V UniFi na tem naslovu MAC ni na voljo nobenega odjemalca" - }, "options": { "step": { "client_control": { "data": { "block_client": "Odjemalci pod nadzorom dostopa do omre\u017eja", - "new_client": "Dodajte novega odjemalca za nadzor dostopa do omre\u017eja" + "new_client": "Dodajte novega odjemalca za nadzor dostopa do omre\u017eja", + "poe_clients": "Dovoli POE nadzor strank" }, "description": "Konfigurirajte nadzor odjemalcev \n\n Ustvarite stikala za serijske \u0161tevilke, za katere \u017eelite nadzirati dostop do omre\u017eja.", "title": "Mo\u017enosti UniFi 2/3" @@ -63,6 +61,5 @@ "title": "Mo\u017enosti UniFi 3/3" } } - }, - "title": "UniFi Krmilnik" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/sv.json b/homeassistant/components/unifi/.translations/sv.json index c1ea81e01d36..a41503b5ea2c 100644 --- a/homeassistant/components/unifi/.translations/sv.json +++ b/homeassistant/components/unifi/.translations/sv.json @@ -44,6 +44,5 @@ } } } - }, - "title": "UniFi Controller" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/zh-Hans.json b/homeassistant/components/unifi/.translations/zh-Hans.json index 86855859961f..402d8277bc75 100644 --- a/homeassistant/components/unifi/.translations/zh-Hans.json +++ b/homeassistant/components/unifi/.translations/zh-Hans.json @@ -40,6 +40,5 @@ "title": "UniFi \u9009\u9879" } } - }, - "title": "UniFi \u63a7\u5236\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/unifi/.translations/zh-Hant.json b/homeassistant/components/unifi/.translations/zh-Hant.json index df4ecc4a05e6..c8d48dc5064f 100644 --- a/homeassistant/components/unifi/.translations/zh-Hant.json +++ b/homeassistant/components/unifi/.translations/zh-Hant.json @@ -23,9 +23,6 @@ } } }, - "error": { - "unknown_client_mac": "\u8a72 Mac \u4f4d\u5740\u7121\u53ef\u7528 UniFi \u5ba2\u6236\u7aef" - }, "options": { "step": { "client_control": { @@ -56,6 +53,5 @@ "title": "UniFi \u9078\u9805 3/3" } } - }, - "title": "UniFi \u63a7\u5236\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/af.json b/homeassistant/components/updater/.translations/af.json new file mode 100644 index 000000000000..bf9cb9c98f45 --- /dev/null +++ b/homeassistant/components/updater/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Opdateerder" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ar.json b/homeassistant/components/updater/.translations/ar.json new file mode 100644 index 000000000000..9aecb4b83dc4 --- /dev/null +++ b/homeassistant/components/updater/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u062a\u062d\u062f\u064a\u062b" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/bg.json b/homeassistant/components/updater/.translations/bg.json new file mode 100644 index 000000000000..ce1bddc104fd --- /dev/null +++ b/homeassistant/components/updater/.translations/bg.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/bs.json b/homeassistant/components/updater/.translations/bs.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/bs.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ca.json b/homeassistant/components/updater/.translations/ca.json new file mode 100644 index 000000000000..419215d32b67 --- /dev/null +++ b/homeassistant/components/updater/.translations/ca.json @@ -0,0 +1,3 @@ +{ + "title": "Actualitzador" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/cs.json b/homeassistant/components/updater/.translations/cs.json new file mode 100644 index 000000000000..9d25158400b6 --- /dev/null +++ b/homeassistant/components/updater/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Aktualiz\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/cy.json b/homeassistant/components/updater/.translations/cy.json new file mode 100644 index 000000000000..b3ef0dcb85fe --- /dev/null +++ b/homeassistant/components/updater/.translations/cy.json @@ -0,0 +1,3 @@ +{ + "title": "Diweddarwr" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/da.json b/homeassistant/components/updater/.translations/da.json new file mode 100644 index 000000000000..bc9b108c3ec7 --- /dev/null +++ b/homeassistant/components/updater/.translations/da.json @@ -0,0 +1,3 @@ +{ + "title": "Opdater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/de.json b/homeassistant/components/updater/.translations/de.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/de.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/el.json b/homeassistant/components/updater/.translations/el.json new file mode 100644 index 000000000000..b3ae655e0253 --- /dev/null +++ b/homeassistant/components/updater/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03c0\u03b9\u03ba\u03b1\u03b9\u03c1\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03ae\u03c2" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/en.json b/homeassistant/components/updater/.translations/en.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/en.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/es-419.json b/homeassistant/components/updater/.translations/es-419.json new file mode 100644 index 000000000000..a822ffbd0a92 --- /dev/null +++ b/homeassistant/components/updater/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Actualizador" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/es.json b/homeassistant/components/updater/.translations/es.json new file mode 100644 index 000000000000..a822ffbd0a92 --- /dev/null +++ b/homeassistant/components/updater/.translations/es.json @@ -0,0 +1,3 @@ +{ + "title": "Actualizador" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/et.json b/homeassistant/components/updater/.translations/et.json new file mode 100644 index 000000000000..8d36316f0116 --- /dev/null +++ b/homeassistant/components/updater/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "Uuendaja" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/eu.json b/homeassistant/components/updater/.translations/eu.json new file mode 100644 index 000000000000..cec08736bae8 --- /dev/null +++ b/homeassistant/components/updater/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Eguneratzailea" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/fa.json b/homeassistant/components/updater/.translations/fa.json new file mode 100644 index 000000000000..d32b1e212c2d --- /dev/null +++ b/homeassistant/components/updater/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/fi.json b/homeassistant/components/updater/.translations/fi.json new file mode 100644 index 000000000000..48f9aa81b721 --- /dev/null +++ b/homeassistant/components/updater/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "P\u00e4ivitys" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/fr.json b/homeassistant/components/updater/.translations/fr.json new file mode 100644 index 000000000000..228912f95a83 --- /dev/null +++ b/homeassistant/components/updater/.translations/fr.json @@ -0,0 +1,3 @@ +{ + "title": "Mise \u00e0 jour" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/gsw.json b/homeassistant/components/updater/.translations/gsw.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/he.json b/homeassistant/components/updater/.translations/he.json new file mode 100644 index 000000000000..de8c2468f90c --- /dev/null +++ b/homeassistant/components/updater/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d4\u05de\u05e2\u05d3\u05db\u05df" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/hr.json b/homeassistant/components/updater/.translations/hr.json new file mode 100644 index 000000000000..21d0438f9cbb --- /dev/null +++ b/homeassistant/components/updater/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "A\u017euriranje" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/hu.json b/homeassistant/components/updater/.translations/hu.json new file mode 100644 index 000000000000..52b2c972559a --- /dev/null +++ b/homeassistant/components/updater/.translations/hu.json @@ -0,0 +1,3 @@ +{ + "title": "Friss\u00edt\u00e9sek" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/hy.json b/homeassistant/components/updater/.translations/hy.json new file mode 100644 index 000000000000..78c67fb89500 --- /dev/null +++ b/homeassistant/components/updater/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u0539\u0561\u0580\u0574\u0561\u0581\u0576\u0578\u0572" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/id.json b/homeassistant/components/updater/.translations/id.json new file mode 100644 index 000000000000..1ab6aa58946f --- /dev/null +++ b/homeassistant/components/updater/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Pembaru" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/is.json b/homeassistant/components/updater/.translations/is.json new file mode 100644 index 000000000000..e0f7536fd1a9 --- /dev/null +++ b/homeassistant/components/updater/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Uppf\u00e6rslu\u00e1lfur" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/it.json b/homeassistant/components/updater/.translations/it.json new file mode 100644 index 000000000000..539f0bb4294c --- /dev/null +++ b/homeassistant/components/updater/.translations/it.json @@ -0,0 +1,3 @@ +{ + "title": "Aggiornamento" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ja.json b/homeassistant/components/updater/.translations/ja.json new file mode 100644 index 000000000000..2a34917b9095 --- /dev/null +++ b/homeassistant/components/updater/.translations/ja.json @@ -0,0 +1,3 @@ +{ + "title": "\u30a2\u30c3\u30d7\u30c7\u30fc\u30bf\u30fc" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ko.json b/homeassistant/components/updater/.translations/ko.json new file mode 100644 index 000000000000..14137569e1bc --- /dev/null +++ b/homeassistant/components/updater/.translations/ko.json @@ -0,0 +1,3 @@ +{ + "title": "\uc5c5\ub370\uc774\ud130" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/lb.json b/homeassistant/components/updater/.translations/lb.json new file mode 100644 index 000000000000..375f8fa7bc6d --- /dev/null +++ b/homeassistant/components/updater/.translations/lb.json @@ -0,0 +1,3 @@ +{ + "title": "Aktualis\u00e9ierung" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/lv.json b/homeassistant/components/updater/.translations/lv.json new file mode 100644 index 000000000000..15d29e35a069 --- /dev/null +++ b/homeassistant/components/updater/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Atjaunin\u0101t\u0101js" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/nb.json b/homeassistant/components/updater/.translations/nb.json new file mode 100644 index 000000000000..e98d60ab4fc4 --- /dev/null +++ b/homeassistant/components/updater/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "Oppdater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/nl.json b/homeassistant/components/updater/.translations/nl.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/nl.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/nn.json b/homeassistant/components/updater/.translations/nn.json new file mode 100644 index 000000000000..7eb98bdd2c12 --- /dev/null +++ b/homeassistant/components/updater/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "Oppdateringar" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/pl.json b/homeassistant/components/updater/.translations/pl.json new file mode 100644 index 000000000000..21a3703bba95 --- /dev/null +++ b/homeassistant/components/updater/.translations/pl.json @@ -0,0 +1,3 @@ +{ + "title": "Aktualizator" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/pt-BR.json b/homeassistant/components/updater/.translations/pt-BR.json new file mode 100644 index 000000000000..7d07ec8da096 --- /dev/null +++ b/homeassistant/components/updater/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Atualizador" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/pt.json b/homeassistant/components/updater/.translations/pt.json new file mode 100644 index 000000000000..7d07ec8da096 --- /dev/null +++ b/homeassistant/components/updater/.translations/pt.json @@ -0,0 +1,3 @@ +{ + "title": "Atualizador" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ro.json b/homeassistant/components/updater/.translations/ro.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ru.json b/homeassistant/components/updater/.translations/ru.json new file mode 100644 index 000000000000..a2ee79efd158 --- /dev/null +++ b/homeassistant/components/updater/.translations/ru.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/sk.json b/homeassistant/components/updater/.translations/sk.json new file mode 100644 index 000000000000..9d25158400b6 --- /dev/null +++ b/homeassistant/components/updater/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Aktualiz\u00e1tor" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/sl.json b/homeassistant/components/updater/.translations/sl.json new file mode 100644 index 000000000000..ac2a2cab3f82 --- /dev/null +++ b/homeassistant/components/updater/.translations/sl.json @@ -0,0 +1,3 @@ +{ + "title": "Posodobitelj" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/sv.json b/homeassistant/components/updater/.translations/sv.json new file mode 100644 index 000000000000..78ef7d2df204 --- /dev/null +++ b/homeassistant/components/updater/.translations/sv.json @@ -0,0 +1,3 @@ +{ + "title": "Uppdaterare" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/ta.json b/homeassistant/components/updater/.translations/ta.json new file mode 100644 index 000000000000..74f9398fbcb0 --- /dev/null +++ b/homeassistant/components/updater/.translations/ta.json @@ -0,0 +1,3 @@ +{ + "title": "\u0b85\u0baa\u0bcd\u0b9f\u0bc7\u0b9f\u0bcd\u0b9f\u0bb0\u0bcd" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/te.json b/homeassistant/components/updater/.translations/te.json new file mode 100644 index 000000000000..43859eedc5a3 --- /dev/null +++ b/homeassistant/components/updater/.translations/te.json @@ -0,0 +1,3 @@ +{ + "title": "Updater" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/th.json b/homeassistant/components/updater/.translations/th.json new file mode 100644 index 000000000000..d825a885d68a --- /dev/null +++ b/homeassistant/components/updater/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e2d\u0e31\u0e1e\u0e40\u0e14\u0e15" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/tr.json b/homeassistant/components/updater/.translations/tr.json new file mode 100644 index 000000000000..7034ef0d79ec --- /dev/null +++ b/homeassistant/components/updater/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "G\u00fcncelleyici" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/uk.json b/homeassistant/components/updater/.translations/uk.json new file mode 100644 index 000000000000..e98d67fc2061 --- /dev/null +++ b/homeassistant/components/updater/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/vi.json b/homeassistant/components/updater/.translations/vi.json new file mode 100644 index 000000000000..0e2783d6f213 --- /dev/null +++ b/homeassistant/components/updater/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Tr\u00ecnh c\u1eadp nh\u1eadt" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/zh-Hans.json b/homeassistant/components/updater/.translations/zh-Hans.json new file mode 100644 index 000000000000..154ab2b812bd --- /dev/null +++ b/homeassistant/components/updater/.translations/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "title": "\u66f4\u65b0\u63d0\u793a" +} \ No newline at end of file diff --git a/homeassistant/components/updater/.translations/zh-Hant.json b/homeassistant/components/updater/.translations/zh-Hant.json new file mode 100644 index 000000000000..31188faa1356 --- /dev/null +++ b/homeassistant/components/updater/.translations/zh-Hant.json @@ -0,0 +1,3 @@ +{ + "title": "\u66f4\u65b0\u7248\u672c" +} \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/bg.json b/homeassistant/components/upnp/.translations/bg.json index 66847b1a6ca5..d99458ca4e7b 100644 --- a/homeassistant/components/upnp/.translations/bg.json +++ b/homeassistant/components/upnp/.translations/bg.json @@ -29,6 +29,5 @@ "title": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0438 \u043e\u043f\u0446\u0438\u0438 \u0437\u0430 UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ca.json b/homeassistant/components/upnp/.translations/ca.json index 7d75b1481482..f58069ea9079 100644 --- a/homeassistant/components/upnp/.translations/ca.json +++ b/homeassistant/components/upnp/.translations/ca.json @@ -29,6 +29,5 @@ "title": "Opcions de configuraci\u00f3 d'UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/cs.json b/homeassistant/components/upnp/.translations/cs.json index 8f5a1a2cfc01..745b136bd5d3 100644 --- a/homeassistant/components/upnp/.translations/cs.json +++ b/homeassistant/components/upnp/.translations/cs.json @@ -25,6 +25,5 @@ "title": "Mo\u017enosti konfigurace pro UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/da.json b/homeassistant/components/upnp/.translations/da.json index 334641b30595..7f75272b2409 100644 --- a/homeassistant/components/upnp/.translations/da.json +++ b/homeassistant/components/upnp/.translations/da.json @@ -29,6 +29,5 @@ "title": "Konfigurationsindstillinger for UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/de.json b/homeassistant/components/upnp/.translations/de.json index c195c8a7c7b7..6dc104d71df2 100644 --- a/homeassistant/components/upnp/.translations/de.json +++ b/homeassistant/components/upnp/.translations/de.json @@ -29,6 +29,5 @@ "title": "Konfigurationsoptionen f\u00fcr UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/en.json b/homeassistant/components/upnp/.translations/en.json index a913ee054c65..a23a0fc74667 100644 --- a/homeassistant/components/upnp/.translations/en.json +++ b/homeassistant/components/upnp/.translations/en.json @@ -25,6 +25,5 @@ "title": "Configuration options for the UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/es-419.json b/homeassistant/components/upnp/.translations/es-419.json index e8098013fb5d..00d43221727e 100644 --- a/homeassistant/components/upnp/.translations/es-419.json +++ b/homeassistant/components/upnp/.translations/es-419.json @@ -25,6 +25,5 @@ "title": "Opciones de configuraci\u00f3n para UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/es.json b/homeassistant/components/upnp/.translations/es.json index eb8695eb8ea3..cf07aac4bde5 100644 --- a/homeassistant/components/upnp/.translations/es.json +++ b/homeassistant/components/upnp/.translations/es.json @@ -29,6 +29,5 @@ "title": "Opciones de configuraci\u00f3n para UPnP/IGD" } } - }, - "title": "UPnP / IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/et.json b/homeassistant/components/upnp/.translations/et.json index 91834ec81bb1..bfbd2137298f 100644 --- a/homeassistant/components/upnp/.translations/et.json +++ b/homeassistant/components/upnp/.translations/et.json @@ -10,6 +10,5 @@ } } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/fr.json b/homeassistant/components/upnp/.translations/fr.json index da06ae079399..8b46143bedaf 100644 --- a/homeassistant/components/upnp/.translations/fr.json +++ b/homeassistant/components/upnp/.translations/fr.json @@ -29,6 +29,5 @@ "title": "Options de configuration pour UPnP / IGD" } } - }, - "title": "UPnP / IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/hu.json b/homeassistant/components/upnp/.translations/hu.json index a4caa11a0eed..e44afa53a65a 100644 --- a/homeassistant/components/upnp/.translations/hu.json +++ b/homeassistant/components/upnp/.translations/hu.json @@ -28,6 +28,5 @@ "title": "Az UPnP/IGD be\u00e1ll\u00edt\u00e1si lehet\u0151s\u00e9gei" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/it.json b/homeassistant/components/upnp/.translations/it.json index 99c9cd2366fe..06c40aa95a79 100644 --- a/homeassistant/components/upnp/.translations/it.json +++ b/homeassistant/components/upnp/.translations/it.json @@ -29,6 +29,5 @@ "title": "Opzioni di configurazione per UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ko.json b/homeassistant/components/upnp/.translations/ko.json index 4ce12cfbe3ab..4cf59263fed3 100644 --- a/homeassistant/components/upnp/.translations/ko.json +++ b/homeassistant/components/upnp/.translations/ko.json @@ -25,6 +25,5 @@ "title": "UPnP/IGD \uc758 \uad6c\uc131 \uc635\uc158" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/lb.json b/homeassistant/components/upnp/.translations/lb.json index 4304a5e7954f..3e9ef97585b3 100644 --- a/homeassistant/components/upnp/.translations/lb.json +++ b/homeassistant/components/upnp/.translations/lb.json @@ -29,6 +29,5 @@ "title": "Konfiguratiouns Optiounen fir UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/nl.json b/homeassistant/components/upnp/.translations/nl.json index 522a42ec1723..f86eb49e0c4a 100644 --- a/homeassistant/components/upnp/.translations/nl.json +++ b/homeassistant/components/upnp/.translations/nl.json @@ -29,6 +29,5 @@ "title": "Configuratiemogelijkheden voor de UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/nn.json b/homeassistant/components/upnp/.translations/nn.json index ed6238dd83ae..b947ce87ff5c 100644 --- a/homeassistant/components/upnp/.translations/nn.json +++ b/homeassistant/components/upnp/.translations/nn.json @@ -20,6 +20,5 @@ } } } - }, - "title": "UPnP / IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/no.json b/homeassistant/components/upnp/.translations/no.json index 9b45ea7965a6..3004ab40ee7f 100644 --- a/homeassistant/components/upnp/.translations/no.json +++ b/homeassistant/components/upnp/.translations/no.json @@ -33,6 +33,5 @@ "title": "Konfigurasjonsalternativer for UPnP / IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pl.json b/homeassistant/components/upnp/.translations/pl.json index 084ecfa1371c..a4370672a960 100644 --- a/homeassistant/components/upnp/.translations/pl.json +++ b/homeassistant/components/upnp/.translations/pl.json @@ -31,6 +31,5 @@ "title": "Opcje konfiguracji dla UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pt-BR.json b/homeassistant/components/upnp/.translations/pt-BR.json index 443bb933900a..25804bab983b 100644 --- a/homeassistant/components/upnp/.translations/pt-BR.json +++ b/homeassistant/components/upnp/.translations/pt-BR.json @@ -25,6 +25,5 @@ "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o para o UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/pt.json b/homeassistant/components/upnp/.translations/pt.json index f05f025ff823..1dbbc34ab0bf 100644 --- a/homeassistant/components/upnp/.translations/pt.json +++ b/homeassistant/components/upnp/.translations/pt.json @@ -29,6 +29,5 @@ "title": "Op\u00e7\u00f5es de configura\u00e7\u00e3o para o UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ro.json b/homeassistant/components/upnp/.translations/ro.json index 406d1e964f34..7c8401569f1a 100644 --- a/homeassistant/components/upnp/.translations/ro.json +++ b/homeassistant/components/upnp/.translations/ro.json @@ -22,6 +22,5 @@ "title": "Op\u021biuni de configurare pentru UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/ru.json b/homeassistant/components/upnp/.translations/ru.json index 358f589dd470..2e8a3ac3b45d 100644 --- a/homeassistant/components/upnp/.translations/ru.json +++ b/homeassistant/components/upnp/.translations/ru.json @@ -31,6 +31,5 @@ "title": "UPnP / IGD" } } - }, - "title": "UPnP / IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/sl.json b/homeassistant/components/upnp/.translations/sl.json index 38fd6134baef..2ff0acc208cf 100644 --- a/homeassistant/components/upnp/.translations/sl.json +++ b/homeassistant/components/upnp/.translations/sl.json @@ -31,6 +31,5 @@ "title": "Mo\u017enosti konfiguracije za UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/sv.json b/homeassistant/components/upnp/.translations/sv.json index c5232db59daa..67584ed2f346 100644 --- a/homeassistant/components/upnp/.translations/sv.json +++ b/homeassistant/components/upnp/.translations/sv.json @@ -29,6 +29,5 @@ "title": "Konfigurationsalternativ f\u00f6r UPnP/IGD" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/zh-Hans.json b/homeassistant/components/upnp/.translations/zh-Hans.json index 3a0942e91569..2c367a3e88f0 100644 --- a/homeassistant/components/upnp/.translations/zh-Hans.json +++ b/homeassistant/components/upnp/.translations/zh-Hans.json @@ -25,6 +25,5 @@ "title": "UPnP/IGD \u7684\u914d\u7f6e\u9009\u9879" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/upnp/.translations/zh-Hant.json b/homeassistant/components/upnp/.translations/zh-Hant.json index 490b0c218df6..74911d92d048 100644 --- a/homeassistant/components/upnp/.translations/zh-Hant.json +++ b/homeassistant/components/upnp/.translations/zh-Hant.json @@ -25,6 +25,5 @@ "title": "UPnP/IGD \u8a2d\u5b9a\u9078\u9805" } } - }, - "title": "UPnP/IGD" + } } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/af.json b/homeassistant/components/vacuum/.translations/af.json new file mode 100644 index 000000000000..7a312d1dcf81 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/af.json @@ -0,0 +1,3 @@ +{ + "title": "Vakuum" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/ar.json b/homeassistant/components/vacuum/.translations/ar.json new file mode 100644 index 000000000000..885c52086060 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/ar.json @@ -0,0 +1,3 @@ +{ + "title": "\u0645\u0643\u0646\u0633\u0629 \u0643\u0647\u0631\u0628\u0627\u0621" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/bg.json b/homeassistant/components/vacuum/.translations/bg.json index 1ab7fce7abe2..7c72d55540df 100644 --- a/homeassistant/components/vacuum/.translations/bg.json +++ b/homeassistant/components/vacuum/.translations/bg.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} \u0437\u0430\u043f\u043e\u0447\u043d\u0430 \u043f\u043e\u0447\u0438\u0441\u0442\u0432\u0430\u043d\u0435", "docked": "{entity_name} \u0432 \u0431\u0430\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044f" } - } + }, + "title": "\u041f\u0440\u0430\u0445\u043e\u0441\u043c\u0443\u043a\u0430\u0447\u043a\u0430" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/ca.json b/homeassistant/components/vacuum/.translations/ca.json index b3cdbb2f6c72..5157fecbbe18 100644 --- a/homeassistant/components/vacuum/.translations/ca.json +++ b/homeassistant/components/vacuum/.translations/ca.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} ha comen\u00e7at a netejar", "docked": "{entity_name} acoblada" } - } + }, + "title": "Aspirador" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/cs.json b/homeassistant/components/vacuum/.translations/cs.json new file mode 100644 index 000000000000..d9d58baff09b --- /dev/null +++ b/homeassistant/components/vacuum/.translations/cs.json @@ -0,0 +1,3 @@ +{ + "title": "Vysava\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/da.json b/homeassistant/components/vacuum/.translations/da.json index fac748ca464a..4213f532623d 100644 --- a/homeassistant/components/vacuum/.translations/da.json +++ b/homeassistant/components/vacuum/.translations/da.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} begyndte at reng\u00f8re", "docked": "{entity_name} er i dock" } - } + }, + "title": "St\u00f8vsuger" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/de.json b/homeassistant/components/vacuum/.translations/de.json index 3fe2d57eb014..62238436eb69 100644 --- a/homeassistant/components/vacuum/.translations/de.json +++ b/homeassistant/components/vacuum/.translations/de.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} hat mit der Reinigung begonnen", "docked": "{entity_name} angedockt" } - } + }, + "title": "Staubsauger" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/el.json b/homeassistant/components/vacuum/.translations/el.json new file mode 100644 index 000000000000..02ad200a9693 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03ba\u03ba\u03ad\u03bd\u03c9\u03c3\u03b7" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/en.json b/homeassistant/components/vacuum/.translations/en.json index 3feb8eada729..0c47bbbe6615 100644 --- a/homeassistant/components/vacuum/.translations/en.json +++ b/homeassistant/components/vacuum/.translations/en.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} started cleaning", "docked": "{entity_name} docked" } - } + }, + "title": "Vacuum" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/es-419.json b/homeassistant/components/vacuum/.translations/es-419.json new file mode 100644 index 000000000000..0b4a5a74c1ac --- /dev/null +++ b/homeassistant/components/vacuum/.translations/es-419.json @@ -0,0 +1,3 @@ +{ + "title": "Aspiradora" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/es.json b/homeassistant/components/vacuum/.translations/es.json index 376058faafa4..c7e657e69084 100644 --- a/homeassistant/components/vacuum/.translations/es.json +++ b/homeassistant/components/vacuum/.translations/es.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} empez\u00f3 a limpiar", "docked": "{entity_name} en la base" } - } + }, + "title": "Aspiradora" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/et.json b/homeassistant/components/vacuum/.translations/et.json new file mode 100644 index 000000000000..2bdf5b9033be --- /dev/null +++ b/homeassistant/components/vacuum/.translations/et.json @@ -0,0 +1,3 @@ +{ + "title": "T\u00fchjenda" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/eu.json b/homeassistant/components/vacuum/.translations/eu.json new file mode 100644 index 000000000000..fb018340d95a --- /dev/null +++ b/homeassistant/components/vacuum/.translations/eu.json @@ -0,0 +1,3 @@ +{ + "title": "Xurgagailua" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/fa.json b/homeassistant/components/vacuum/.translations/fa.json new file mode 100644 index 000000000000..1d91c657c540 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/fa.json @@ -0,0 +1,3 @@ +{ + "title": "\u062e\u0644\u0627\u0621" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/fi.json b/homeassistant/components/vacuum/.translations/fi.json new file mode 100644 index 000000000000..513ba245c5dc --- /dev/null +++ b/homeassistant/components/vacuum/.translations/fi.json @@ -0,0 +1,3 @@ +{ + "title": "Imuri" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/fr.json b/homeassistant/components/vacuum/.translations/fr.json index 84d5e17bda15..6df6eed17de5 100644 --- a/homeassistant/components/vacuum/.translations/fr.json +++ b/homeassistant/components/vacuum/.translations/fr.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} commence \u00e0 nettoyer", "docked": "{entity_name} connect\u00e9" } - } + }, + "title": "Aspirateur" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/gsw.json b/homeassistant/components/vacuum/.translations/gsw.json new file mode 100644 index 000000000000..9465fe55946c --- /dev/null +++ b/homeassistant/components/vacuum/.translations/gsw.json @@ -0,0 +1,3 @@ +{ + "title": "Stoubsuger" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/he.json b/homeassistant/components/vacuum/.translations/he.json new file mode 100644 index 000000000000..a14c77f6869a --- /dev/null +++ b/homeassistant/components/vacuum/.translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05e9\u05d5\u05d0\u05d1 \u05d0\u05d1\u05e7" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/hr.json b/homeassistant/components/vacuum/.translations/hr.json new file mode 100644 index 000000000000..7a312d1dcf81 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/hr.json @@ -0,0 +1,3 @@ +{ + "title": "Vakuum" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/hu.json b/homeassistant/components/vacuum/.translations/hu.json index 81a39802c550..eecd3a2ba355 100644 --- a/homeassistant/components/vacuum/.translations/hu.json +++ b/homeassistant/components/vacuum/.translations/hu.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} elkezdett takar\u00edtani", "docked": "{entity_name} dokkolt" } - } + }, + "title": "Porsz\u00edv\u00f3" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/hy.json b/homeassistant/components/vacuum/.translations/hy.json new file mode 100644 index 000000000000..277929cc2eb9 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/hy.json @@ -0,0 +1,3 @@ +{ + "title": "\u054e\u0561\u056f\u0578\u0582\u0574" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/id.json b/homeassistant/components/vacuum/.translations/id.json new file mode 100644 index 000000000000..ba14508ad007 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/id.json @@ -0,0 +1,3 @@ +{ + "title": "Vakum" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/is.json b/homeassistant/components/vacuum/.translations/is.json new file mode 100644 index 000000000000..1fc83dd075e6 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/is.json @@ -0,0 +1,3 @@ +{ + "title": "Ryksuga" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/it.json b/homeassistant/components/vacuum/.translations/it.json index 32ecd1e0377c..b589d8f5d4af 100644 --- a/homeassistant/components/vacuum/.translations/it.json +++ b/homeassistant/components/vacuum/.translations/it.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} ha iniziato la pulizia", "docked": "{entity_name} agganciato" } - } + }, + "title": "Aspirapolvere" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/ko.json b/homeassistant/components/vacuum/.translations/ko.json index 0197329abda0..5f9d6ca4620a 100644 --- a/homeassistant/components/vacuum/.translations/ko.json +++ b/homeassistant/components/vacuum/.translations/ko.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} \uc774(\uac00) \uccad\uc18c\ub97c \uc2dc\uc791\ud560 \ub54c", "docked": "{entity_name} \uc774(\uac00) \ub3c4\ud0b9\ub420 \ub54c" } - } + }, + "title": "\uccad\uc18c\uae30" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/lb.json b/homeassistant/components/vacuum/.translations/lb.json index d6776ccd6192..478f97f2b69e 100644 --- a/homeassistant/components/vacuum/.translations/lb.json +++ b/homeassistant/components/vacuum/.translations/lb.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} huet ugefaange mam botzen", "docked": "{entity_name} an der Statioun" } - } + }, + "title": "Staubsauger" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/lv.json b/homeassistant/components/vacuum/.translations/lv.json new file mode 100644 index 000000000000..f4fee01aef44 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/lv.json @@ -0,0 +1,3 @@ +{ + "title": "Putek\u013cs\u016bc\u0113js" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/nb.json b/homeassistant/components/vacuum/.translations/nb.json new file mode 100644 index 000000000000..e1edf6878fca --- /dev/null +++ b/homeassistant/components/vacuum/.translations/nb.json @@ -0,0 +1,3 @@ +{ + "title": "St\u00f8vsuger" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/nl.json b/homeassistant/components/vacuum/.translations/nl.json index 8ef0588796c4..cee2c501b73b 100644 --- a/homeassistant/components/vacuum/.translations/nl.json +++ b/homeassistant/components/vacuum/.translations/nl.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} begon met schoonmaken", "docked": "{entity_name} is bij basisstation" } - } + }, + "title": "Stofzuigen" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/nn.json b/homeassistant/components/vacuum/.translations/nn.json new file mode 100644 index 000000000000..0fb34a863334 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/nn.json @@ -0,0 +1,3 @@ +{ + "title": "St\u00f8vsugar" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/pl.json b/homeassistant/components/vacuum/.translations/pl.json index 09eef23ac9a2..287b95e51e26 100644 --- a/homeassistant/components/vacuum/.translations/pl.json +++ b/homeassistant/components/vacuum/.translations/pl.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} zacznie sprz\u0105ta\u0107", "docked": "{entity_name} wr\u00f3ci do bazy" } - } + }, + "title": "Odkurzacz" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/pt-BR.json b/homeassistant/components/vacuum/.translations/pt-BR.json new file mode 100644 index 000000000000..38a0b869b3fb --- /dev/null +++ b/homeassistant/components/vacuum/.translations/pt-BR.json @@ -0,0 +1,3 @@ +{ + "title": "Aspirando" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/pt.json b/homeassistant/components/vacuum/.translations/pt.json index 15b8ac3fd198..83a9328e4a97 100644 --- a/homeassistant/components/vacuum/.translations/pt.json +++ b/homeassistant/components/vacuum/.translations/pt.json @@ -6,5 +6,6 @@ "condition_type": { "is_cleaning": "{entity_name} est\u00e1 a limpar" } - } + }, + "title": "Aspira\u00e7\u00e3o" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/ro.json b/homeassistant/components/vacuum/.translations/ro.json new file mode 100644 index 000000000000..22b48f1e3786 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/ro.json @@ -0,0 +1,3 @@ +{ + "title": "Aspirator" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/ru.json b/homeassistant/components/vacuum/.translations/ru.json index c42f0310fae8..08067272d71e 100644 --- a/homeassistant/components/vacuum/.translations/ru.json +++ b/homeassistant/components/vacuum/.translations/ru.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u0431\u043e\u0440\u043a\u0443", "docked": "{entity_name} \u0441\u0442\u044b\u043a\u0443\u0435\u0442\u0441\u044f \u0441 \u0434\u043e\u043a-\u0441\u0442\u0430\u043d\u0446\u0438\u0435\u0439" } - } + }, + "title": "\u041f\u044b\u043b\u0435\u0441\u043e\u0441" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/sk.json b/homeassistant/components/vacuum/.translations/sk.json new file mode 100644 index 000000000000..554fc68624f6 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/sk.json @@ -0,0 +1,3 @@ +{ + "title": "Vys\u00e1va\u010d" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/sl.json b/homeassistant/components/vacuum/.translations/sl.json index c594c4f1bdde..4b0806b531a8 100644 --- a/homeassistant/components/vacuum/.translations/sl.json +++ b/homeassistant/components/vacuum/.translations/sl.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} za\u010del \u010di\u0161\u010denje", "docked": "{entity_name} priklju\u010den" } - } + }, + "title": "Sesam" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/sv.json b/homeassistant/components/vacuum/.translations/sv.json index 38b7f72ab9bf..cf1356a36295 100644 --- a/homeassistant/components/vacuum/.translations/sv.json +++ b/homeassistant/components/vacuum/.translations/sv.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name} b\u00f6rjade st\u00e4da", "docked": "{entity_name} dockad" } - } + }, + "title": "Dammsugare" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/th.json b/homeassistant/components/vacuum/.translations/th.json new file mode 100644 index 000000000000..4ecaec474890 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/th.json @@ -0,0 +1,3 @@ +{ + "title": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e14\u0e39\u0e14\u0e1d\u0e38\u0e48\u0e19" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/tr.json b/homeassistant/components/vacuum/.translations/tr.json new file mode 100644 index 000000000000..2cbb7ebf3558 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/tr.json @@ -0,0 +1,3 @@ +{ + "title": "Elektrikli s\u00fcp\u00fcrge" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/uk.json b/homeassistant/components/vacuum/.translations/uk.json new file mode 100644 index 000000000000..63eb940dec03 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/uk.json @@ -0,0 +1,3 @@ +{ + "title": "\u041f\u0438\u043b\u043e\u0441\u043e\u0441" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/vi.json b/homeassistant/components/vacuum/.translations/vi.json new file mode 100644 index 000000000000..846b3b7f1d92 --- /dev/null +++ b/homeassistant/components/vacuum/.translations/vi.json @@ -0,0 +1,3 @@ +{ + "title": "Vacuum" +} \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/zh-Hans.json b/homeassistant/components/vacuum/.translations/zh-Hans.json index b676cc7be9dd..f9ef4339e0ba 100644 --- a/homeassistant/components/vacuum/.translations/zh-Hans.json +++ b/homeassistant/components/vacuum/.translations/zh-Hans.json @@ -11,5 +11,6 @@ "cleaning": "{entity_name} \u5f00\u59cb\u6e05\u626b", "docked": "{entity_name} \u8fd4\u56de\u5e95\u5ea7" } - } + }, + "title": "\u626b\u5730\u673a" } \ No newline at end of file diff --git a/homeassistant/components/vacuum/.translations/zh-Hant.json b/homeassistant/components/vacuum/.translations/zh-Hant.json index b108a2a6a444..5b51028772dc 100644 --- a/homeassistant/components/vacuum/.translations/zh-Hant.json +++ b/homeassistant/components/vacuum/.translations/zh-Hant.json @@ -12,5 +12,6 @@ "cleaning": "{entity_name}\u958b\u59cb\u6e05\u6383", "docked": "{entity_name}\u5df2\u56de\u5145\u96fb\u7ad9" } - } + }, + "title": "\u5438\u5875\u5668" } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/bg.json b/homeassistant/components/velbus/.translations/bg.json index 283a24ea2260..b22803cfb279 100644 --- a/homeassistant/components/velbus/.translations/bg.json +++ b/homeassistant/components/velbus/.translations/bg.json @@ -16,6 +16,5 @@ "title": "\u0414\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0442\u0438\u043f\u0430 \u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0441 velbus" } } - }, - "title": "Velbus \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ca.json b/homeassistant/components/velbus/.translations/ca.json index 3a9be7d213e4..4738e236fff7 100644 --- a/homeassistant/components/velbus/.translations/ca.json +++ b/homeassistant/components/velbus/.translations/ca.json @@ -16,6 +16,5 @@ "title": "Tipus de connexi\u00f3 Velbus" } } - }, - "title": "Interf\u00edcie Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/da.json b/homeassistant/components/velbus/.translations/da.json index 6d70f7c3d60b..6bb58f5871a3 100644 --- a/homeassistant/components/velbus/.translations/da.json +++ b/homeassistant/components/velbus/.translations/da.json @@ -16,6 +16,5 @@ "title": "Definer velbus forbindelsestypen" } } - }, - "title": "Velbus-interface" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/de.json b/homeassistant/components/velbus/.translations/de.json index 48f23aa0cf88..8b0a2ab6c9e4 100644 --- a/homeassistant/components/velbus/.translations/de.json +++ b/homeassistant/components/velbus/.translations/de.json @@ -16,6 +16,5 @@ "title": "Definieren des Velbus-Verbindungstyps" } } - }, - "title": "Velbus-Schnittstelle" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/en.json b/homeassistant/components/velbus/.translations/en.json index b28088efa6a7..ab4554428911 100644 --- a/homeassistant/components/velbus/.translations/en.json +++ b/homeassistant/components/velbus/.translations/en.json @@ -16,6 +16,5 @@ "title": "Define the velbus connection type" } } - }, - "title": "Velbus interface" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/es-419.json b/homeassistant/components/velbus/.translations/es-419.json index 197bff064b02..1bde7176eaf3 100644 --- a/homeassistant/components/velbus/.translations/es-419.json +++ b/homeassistant/components/velbus/.translations/es-419.json @@ -16,6 +16,5 @@ "title": "Definir el tipo de conexi\u00f3n velbus" } } - }, - "title": "Interfaz Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/es.json b/homeassistant/components/velbus/.translations/es.json index 197bff064b02..1bde7176eaf3 100644 --- a/homeassistant/components/velbus/.translations/es.json +++ b/homeassistant/components/velbus/.translations/es.json @@ -16,6 +16,5 @@ "title": "Definir el tipo de conexi\u00f3n velbus" } } - }, - "title": "Interfaz Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/fr.json b/homeassistant/components/velbus/.translations/fr.json index 95987d48a301..ab2e8d756e66 100644 --- a/homeassistant/components/velbus/.translations/fr.json +++ b/homeassistant/components/velbus/.translations/fr.json @@ -16,6 +16,5 @@ "title": "D\u00e9finir le type de connexion velbus" } } - }, - "title": "Interface Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/it.json b/homeassistant/components/velbus/.translations/it.json index d1b74e9ec22a..bf24ff11336d 100644 --- a/homeassistant/components/velbus/.translations/it.json +++ b/homeassistant/components/velbus/.translations/it.json @@ -16,6 +16,5 @@ "title": "Definire il tipo di connessione Velbus" } } - }, - "title": "Interfaccia Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ko.json b/homeassistant/components/velbus/.translations/ko.json index 06ca9a058e3d..0d8e003472ad 100644 --- a/homeassistant/components/velbus/.translations/ko.json +++ b/homeassistant/components/velbus/.translations/ko.json @@ -16,6 +16,5 @@ "title": "Velbus \uc5f0\uacb0 \uc720\ud615 \uc815\uc758" } } - }, - "title": "Velbus \uc778\ud130\ud398\uc774\uc2a4" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/lb.json b/homeassistant/components/velbus/.translations/lb.json index b902843ae46f..5bb18bc5fa49 100644 --- a/homeassistant/components/velbus/.translations/lb.json +++ b/homeassistant/components/velbus/.translations/lb.json @@ -16,6 +16,5 @@ "title": "D\u00e9fin\u00e9iert den Typ vun der Velbus Verbindung" } } - }, - "title": "Velbus Interface" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/nl.json b/homeassistant/components/velbus/.translations/nl.json index 03d979827576..81991bfff0e7 100644 --- a/homeassistant/components/velbus/.translations/nl.json +++ b/homeassistant/components/velbus/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Definieer de velbus-verbindingstype" } } - }, - "title": "Velbus interface" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/no.json b/homeassistant/components/velbus/.translations/no.json index 99a3706cf137..0cc2f475820c 100644 --- a/homeassistant/components/velbus/.translations/no.json +++ b/homeassistant/components/velbus/.translations/no.json @@ -16,6 +16,5 @@ "title": "Definer tilkoblingstype for velbus" } } - }, - "title": "Velbus-grensesnitt" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/pl.json b/homeassistant/components/velbus/.translations/pl.json index a412d583fa4a..c3f06b312f45 100644 --- a/homeassistant/components/velbus/.translations/pl.json +++ b/homeassistant/components/velbus/.translations/pl.json @@ -16,6 +16,5 @@ "title": "Zdefiniuj typ po\u0142\u0105czenia Velbus" } } - }, - "title": "Interfejs Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/ru.json b/homeassistant/components/velbus/.translations/ru.json index ab07c0f6183e..e88f6209eeeb 100644 --- a/homeassistant/components/velbus/.translations/ru.json +++ b/homeassistant/components/velbus/.translations/ru.json @@ -16,6 +16,5 @@ "title": "Velbus" } } - }, - "title": "Velbus" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/sl.json b/homeassistant/components/velbus/.translations/sl.json index 2e1cf68cf266..311919186e9b 100644 --- a/homeassistant/components/velbus/.translations/sl.json +++ b/homeassistant/components/velbus/.translations/sl.json @@ -16,6 +16,5 @@ "title": "Dolo\u010dite vrsto povezave z velbusom" } } - }, - "title": "Velbus vmesnik" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/sv.json b/homeassistant/components/velbus/.translations/sv.json index 528c6143279b..e7a56c52cd62 100644 --- a/homeassistant/components/velbus/.translations/sv.json +++ b/homeassistant/components/velbus/.translations/sv.json @@ -16,6 +16,5 @@ "title": "Definiera velbus-anslutningstypen" } } - }, - "title": "Velbus-gr\u00e4nssnitt" + } } \ No newline at end of file diff --git a/homeassistant/components/velbus/.translations/zh-Hant.json b/homeassistant/components/velbus/.translations/zh-Hant.json index 5916b339ddd4..48f9ef5919b9 100644 --- a/homeassistant/components/velbus/.translations/zh-Hant.json +++ b/homeassistant/components/velbus/.translations/zh-Hant.json @@ -16,6 +16,5 @@ "title": "\u5b9a\u7fa9 Velbus \u9023\u7dda\u985e\u578b" } } - }, - "title": "Velbus \u4ecb\u9762" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ca.json b/homeassistant/components/vera/.translations/ca.json index 9749a468b09a..ff972c70530f 100644 --- a/homeassistant/components/vera/.translations/ca.json +++ b/homeassistant/components/vera/.translations/ca.json @@ -27,6 +27,5 @@ "title": "Opcions del controlador Vera" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/de.json b/homeassistant/components/vera/.translations/de.json index c10e24321e63..16230142fba1 100644 --- a/homeassistant/components/vera/.translations/de.json +++ b/homeassistant/components/vera/.translations/de.json @@ -26,6 +26,5 @@ "title": "Vera Controller Optionen" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/en.json b/homeassistant/components/vera/.translations/en.json index 898c533f1e0f..18b8c64f52ae 100644 --- a/homeassistant/components/vera/.translations/en.json +++ b/homeassistant/components/vera/.translations/en.json @@ -27,6 +27,5 @@ "title": "Vera controller options" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/es.json b/homeassistant/components/vera/.translations/es.json index 347fb5ce5690..8acd0d0f611f 100644 --- a/homeassistant/components/vera/.translations/es.json +++ b/homeassistant/components/vera/.translations/es.json @@ -27,6 +27,5 @@ "title": "Opciones del controlador Vera" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/it.json b/homeassistant/components/vera/.translations/it.json index 56d69efe360f..875e32fbb0c9 100644 --- a/homeassistant/components/vera/.translations/it.json +++ b/homeassistant/components/vera/.translations/it.json @@ -27,6 +27,5 @@ "title": "Opzioni controller Vera" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ko.json b/homeassistant/components/vera/.translations/ko.json index 4ebd3f804a21..6572570916b4 100644 --- a/homeassistant/components/vera/.translations/ko.json +++ b/homeassistant/components/vera/.translations/ko.json @@ -27,6 +27,5 @@ "title": "Vera \ucee8\ud2b8\ub864\ub7ec \uc635\uc158" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/lb.json b/homeassistant/components/vera/.translations/lb.json index c3c769ef7b4b..c78ab909b967 100644 --- a/homeassistant/components/vera/.translations/lb.json +++ b/homeassistant/components/vera/.translations/lb.json @@ -27,6 +27,5 @@ "title": "Vera Kontroller Optiounen" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/no.json b/homeassistant/components/vera/.translations/no.json new file mode 100644 index 000000000000..dbc6bca13658 --- /dev/null +++ b/homeassistant/components/vera/.translations/no.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "En kontroller er allerede konfigurert.", + "cannot_connect": "Kunne ikke koble til kontrolleren med url {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "Vera-enhets-ID-er som skal ekskluderes fra Home Assistant.", + "lights": "Vera bytter enhets-ID-er for \u00e5 behandle som lys i Home Assistant.", + "vera_controller_url": "URL-adresse for kontroller" + }, + "description": "Oppgi en Vera-kontroller-url nedenfor. Det skal se slik ut: http://192.168.1.161:3480.", + "title": "Oppsett Vera-kontroller" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "Vera-enhets-ID-er som skal ekskluderes fra Home Assistant.", + "lights": "Vera bytter enhets-ID-er for \u00e5 behandle som lys i Home Assistant." + }, + "description": "Se vera dokumentasjonen for detaljer om valgfrie parametere: https://www.home-assistant.io/integrations/vera/. Merk: Eventuelle endringer her vil trenge en omstart til home assistant-serveren. For \u00e5 fjerne verdier, gi et rom.", + "title": "Alternativer for Vera-kontroller" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/ru.json b/homeassistant/components/vera/.translations/ru.json index 6dece462ef08..99095dffdfcc 100644 --- a/homeassistant/components/vera/.translations/ru.json +++ b/homeassistant/components/vera/.translations/ru.json @@ -27,6 +27,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Vera" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/sl.json b/homeassistant/components/vera/.translations/sl.json new file mode 100644 index 000000000000..01e5234bc788 --- /dev/null +++ b/homeassistant/components/vera/.translations/sl.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "Krmilnik je \u017ee konfiguriran.", + "cannot_connect": "Ni mogo\u010de vzpostaviti povezave s krmilnikom z URL-jem {base_url}" + }, + "step": { + "user": { + "data": { + "exclude": "ID-ji naprav Vera, ki jih \u017eelite izklju\u010diti iz programa Home Assistant.", + "lights": "ID-ji stikal Vera, ki naj jih Home Assistant tretira kot lu\u010di.", + "vera_controller_url": "URL krmilnika" + }, + "description": "Spodaj navedite URL krmilnika Vera. Izgledati bi moral takole: http://192.168.1.161:3480.", + "title": "Nastavite krmilnik Vera" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "exclude": "ID-ji naprav Vera, ki jih \u017eelite izklju\u010diti iz programa Home Assistant.", + "lights": "ID-ji stikal Vera, ki naj jih Home Assistant tretira kot lu\u010di." + }, + "description": "Podrobnosti o izbirnih parametrih najdete v vera dokumentaciji: https://www.home-assistant.io/integrations/vera/. Opomba: Za vse spremembe tukaj bo potreben ponovni zagon stre\u017enika Home Assistant. \u010ce \u017eelite po\u010distiti vrednosti, vnesite presledek.", + "title": "Mo\u017enosti krmilnika vera" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/.translations/zh-Hant.json b/homeassistant/components/vera/.translations/zh-Hant.json index 521b3fb9eba7..0d4b067c5ae5 100644 --- a/homeassistant/components/vera/.translations/zh-Hant.json +++ b/homeassistant/components/vera/.translations/zh-Hant.json @@ -27,6 +27,5 @@ "title": "Vera \u63a7\u5236\u5668\u9078\u9805" } } - }, - "title": "Vera" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/bg.json b/homeassistant/components/vesync/.translations/bg.json index 95cc2f4406a9..612b2028b38f 100644 --- a/homeassistant/components/vesync/.translations/bg.json +++ b/homeassistant/components/vesync/.translations/bg.json @@ -15,6 +15,5 @@ "title": "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u0430" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ca.json b/homeassistant/components/vesync/.translations/ca.json index 96f991c0560f..6dbf41d9ef2d 100644 --- a/homeassistant/components/vesync/.translations/ca.json +++ b/homeassistant/components/vesync/.translations/ca.json @@ -15,6 +15,5 @@ "title": "Introdueix el nom d\u2019usuari i contrasenya" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/da.json b/homeassistant/components/vesync/.translations/da.json index 69f8b7452904..2fe09c51860f 100644 --- a/homeassistant/components/vesync/.translations/da.json +++ b/homeassistant/components/vesync/.translations/da.json @@ -15,6 +15,5 @@ "title": "Indtast brugernavn og adgangskode" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/de.json b/homeassistant/components/vesync/.translations/de.json index 357309448110..3db70384d8b9 100644 --- a/homeassistant/components/vesync/.translations/de.json +++ b/homeassistant/components/vesync/.translations/de.json @@ -15,6 +15,5 @@ "title": "Benutzername und Passwort eingeben" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/en.json b/homeassistant/components/vesync/.translations/en.json index 664721c2fd33..c109a81aa2f5 100644 --- a/homeassistant/components/vesync/.translations/en.json +++ b/homeassistant/components/vesync/.translations/en.json @@ -15,6 +15,5 @@ "title": "Enter Username and Password" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/es-419.json b/homeassistant/components/vesync/.translations/es-419.json index 2ed046a81539..7c6f344104a6 100644 --- a/homeassistant/components/vesync/.translations/es-419.json +++ b/homeassistant/components/vesync/.translations/es-419.json @@ -15,6 +15,5 @@ "title": "Ingrese nombre de usuario y contrase\u00f1a" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/es.json b/homeassistant/components/vesync/.translations/es.json index a11d7b0a12a4..9eac2f6155d1 100644 --- a/homeassistant/components/vesync/.translations/es.json +++ b/homeassistant/components/vesync/.translations/es.json @@ -15,6 +15,5 @@ "title": "Introduzca el nombre de usuario y la contrase\u00f1a" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/fr.json b/homeassistant/components/vesync/.translations/fr.json index 4382525752f3..6db0922e684f 100644 --- a/homeassistant/components/vesync/.translations/fr.json +++ b/homeassistant/components/vesync/.translations/fr.json @@ -15,6 +15,5 @@ "title": "Entrez vos identifiants" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/it.json b/homeassistant/components/vesync/.translations/it.json index 1d59a36e6a4a..42e5b1bb1e4b 100644 --- a/homeassistant/components/vesync/.translations/it.json +++ b/homeassistant/components/vesync/.translations/it.json @@ -15,6 +15,5 @@ "title": "Immettere nome utente e password" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ko.json b/homeassistant/components/vesync/.translations/ko.json index 2d6cbb52020c..20672e018f7b 100644 --- a/homeassistant/components/vesync/.translations/ko.json +++ b/homeassistant/components/vesync/.translations/ko.json @@ -15,6 +15,5 @@ "title": "\uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/lb.json b/homeassistant/components/vesync/.translations/lb.json index 7fb25b588535..a3793c66f8d1 100644 --- a/homeassistant/components/vesync/.translations/lb.json +++ b/homeassistant/components/vesync/.translations/lb.json @@ -15,6 +15,5 @@ "title": "Benotzernumm a Passwuert aginn" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/nl.json b/homeassistant/components/vesync/.translations/nl.json index c47e27f22c7d..3624fd2b3f41 100644 --- a/homeassistant/components/vesync/.translations/nl.json +++ b/homeassistant/components/vesync/.translations/nl.json @@ -15,6 +15,5 @@ "title": "Voer gebruikersnaam en wachtwoord in" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/no.json b/homeassistant/components/vesync/.translations/no.json index f97fee03c5a2..75cfb04b9db5 100644 --- a/homeassistant/components/vesync/.translations/no.json +++ b/homeassistant/components/vesync/.translations/no.json @@ -15,6 +15,5 @@ "title": "Skriv inn brukernavn og passord" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/pl.json b/homeassistant/components/vesync/.translations/pl.json index 62c280748084..aa5d4dc587ff 100644 --- a/homeassistant/components/vesync/.translations/pl.json +++ b/homeassistant/components/vesync/.translations/pl.json @@ -15,6 +15,5 @@ "title": "Wprowad\u017a nazw\u0119 u\u017cytkownika i has\u0142o." } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/ru.json b/homeassistant/components/vesync/.translations/ru.json index 47fb6fc50452..4b18d353aa9d 100644 --- a/homeassistant/components/vesync/.translations/ru.json +++ b/homeassistant/components/vesync/.translations/ru.json @@ -15,6 +15,5 @@ "title": "VeSync" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/sl.json b/homeassistant/components/vesync/.translations/sl.json index 02307dd7e505..f766224af1e2 100644 --- a/homeassistant/components/vesync/.translations/sl.json +++ b/homeassistant/components/vesync/.translations/sl.json @@ -15,6 +15,5 @@ "title": "Vnesite uporabni\u0161ko Ime in Geslo" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/sv.json b/homeassistant/components/vesync/.translations/sv.json index 64f413a78b08..3845e194bf3d 100644 --- a/homeassistant/components/vesync/.translations/sv.json +++ b/homeassistant/components/vesync/.translations/sv.json @@ -15,6 +15,5 @@ "title": "Ange anv\u00e4ndarnamn och l\u00f6senord" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vesync/.translations/zh-Hant.json b/homeassistant/components/vesync/.translations/zh-Hant.json index 72b340ec88e6..cd7cc7ea91be 100644 --- a/homeassistant/components/vesync/.translations/zh-Hant.json +++ b/homeassistant/components/vesync/.translations/zh-Hant.json @@ -15,6 +15,5 @@ "title": "\u8acb\u8f38\u5165\u4f7f\u7528\u8005\u540d\u7a31\u8207\u5bc6\u78bc" } } - }, - "title": "VeSync" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ca.json b/homeassistant/components/vilfo/.translations/ca.json index 522a2db1a929..5b8c12bab6ce 100644 --- a/homeassistant/components/vilfo/.translations/ca.json +++ b/homeassistant/components/vilfo/.translations/ca.json @@ -18,6 +18,5 @@ "title": "Connexi\u00f3 amb l'encaminador Vilfo" } } - }, - "title": "Encaminador Vilfo" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/da.json b/homeassistant/components/vilfo/.translations/da.json index 2ff2ad7f97cd..0ef9c619c914 100644 --- a/homeassistant/components/vilfo/.translations/da.json +++ b/homeassistant/components/vilfo/.translations/da.json @@ -18,6 +18,5 @@ "title": "Opret forbindelse til Vilfo-router" } } - }, - "title": "Vilfo-router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/de.json b/homeassistant/components/vilfo/.translations/de.json index b36990d9a534..d4b68d04c935 100644 --- a/homeassistant/components/vilfo/.translations/de.json +++ b/homeassistant/components/vilfo/.translations/de.json @@ -18,6 +18,5 @@ "title": "Stellen Sie eine Verbindung zum Vilfo Router her" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/en.json b/homeassistant/components/vilfo/.translations/en.json index 1941c399b78e..49a944144036 100644 --- a/homeassistant/components/vilfo/.translations/en.json +++ b/homeassistant/components/vilfo/.translations/en.json @@ -18,6 +18,5 @@ "title": "Connect to the Vilfo Router" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/es.json b/homeassistant/components/vilfo/.translations/es.json index f555647e8a99..97f4b8d417ef 100644 --- a/homeassistant/components/vilfo/.translations/es.json +++ b/homeassistant/components/vilfo/.translations/es.json @@ -18,6 +18,5 @@ "title": "Conectar con el Router Vilfo" } } - }, - "title": "Router Vilfo" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/fr.json b/homeassistant/components/vilfo/.translations/fr.json index 3c6643bf0e03..272711789d89 100644 --- a/homeassistant/components/vilfo/.translations/fr.json +++ b/homeassistant/components/vilfo/.translations/fr.json @@ -5,6 +5,5 @@ "title": "Connectez-vous au routeur Vilfo" } } - }, - "title": "Routeur Vilfo" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/hu.json b/homeassistant/components/vilfo/.translations/hu.json index d7d9b1695dcf..0368349f75aa 100644 --- a/homeassistant/components/vilfo/.translations/hu.json +++ b/homeassistant/components/vilfo/.translations/hu.json @@ -8,6 +8,5 @@ "title": "Csatlakoz\u00e1s a Vilfo routerhez" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/it.json b/homeassistant/components/vilfo/.translations/it.json index 2ea2434ac85c..2f39499260e2 100644 --- a/homeassistant/components/vilfo/.translations/it.json +++ b/homeassistant/components/vilfo/.translations/it.json @@ -18,6 +18,5 @@ "title": "Collegamento al Vilfo Router" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ko.json b/homeassistant/components/vilfo/.translations/ko.json index c5b66f873936..f0b96eb77b7a 100644 --- a/homeassistant/components/vilfo/.translations/ko.json +++ b/homeassistant/components/vilfo/.translations/ko.json @@ -18,6 +18,5 @@ "title": "Vilfo \ub77c\uc6b0\ud130\uc5d0 \uc5f0\uacb0\ud558\uae30" } } - }, - "title": "Vilfo \ub77c\uc6b0\ud130" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/lb.json b/homeassistant/components/vilfo/.translations/lb.json index a02cd1362aa7..88964aedc9bd 100644 --- a/homeassistant/components/vilfo/.translations/lb.json +++ b/homeassistant/components/vilfo/.translations/lb.json @@ -18,6 +18,5 @@ "title": "Mam Vilfo Router verbannen" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/nl.json b/homeassistant/components/vilfo/.translations/nl.json index c7c30ca0fd1d..1901be6fd1a4 100644 --- a/homeassistant/components/vilfo/.translations/nl.json +++ b/homeassistant/components/vilfo/.translations/nl.json @@ -16,6 +16,5 @@ "title": "Maak verbinding met de Vilfo Router" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/no.json b/homeassistant/components/vilfo/.translations/no.json index 840098abd695..36c6e79989ba 100644 --- a/homeassistant/components/vilfo/.translations/no.json +++ b/homeassistant/components/vilfo/.translations/no.json @@ -18,6 +18,5 @@ "title": "Koble til Vilfo Ruteren" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/pl.json b/homeassistant/components/vilfo/.translations/pl.json index 6868f1f79036..4cff9fb6fea1 100644 --- a/homeassistant/components/vilfo/.translations/pl.json +++ b/homeassistant/components/vilfo/.translations/pl.json @@ -18,6 +18,5 @@ "title": "Po\u0142\u0105czenie z routerem Vilfo" } } - }, - "title": "Router Vilfo" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/ru.json b/homeassistant/components/vilfo/.translations/ru.json index 1863076baf5d..372c9750410d 100644 --- a/homeassistant/components/vilfo/.translations/ru.json +++ b/homeassistant/components/vilfo/.translations/ru.json @@ -18,6 +18,5 @@ "title": "Vilfo Router" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/sl.json b/homeassistant/components/vilfo/.translations/sl.json index 84ccb05ece6e..c815698099f7 100644 --- a/homeassistant/components/vilfo/.translations/sl.json +++ b/homeassistant/components/vilfo/.translations/sl.json @@ -18,6 +18,5 @@ "title": "Pove\u017eite se z usmerjevalnikom Vilfo" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/sv.json b/homeassistant/components/vilfo/.translations/sv.json index 5e2b3a1f6e5d..7192f91ee1a1 100644 --- a/homeassistant/components/vilfo/.translations/sv.json +++ b/homeassistant/components/vilfo/.translations/sv.json @@ -18,6 +18,5 @@ "title": "Anslut till Vilfo-routern" } } - }, - "title": "Vilfo Router" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/zh-Hans.json b/homeassistant/components/vilfo/.translations/zh-Hans.json index 7ad772ae8952..f3fec441d4c7 100644 --- a/homeassistant/components/vilfo/.translations/zh-Hans.json +++ b/homeassistant/components/vilfo/.translations/zh-Hans.json @@ -14,6 +14,5 @@ "title": "\u8fde\u63a5\u5230 Vilfo \u8def\u7531\u5668" } } - }, - "title": "Vilfo \u8def\u7531\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/vilfo/.translations/zh-Hant.json b/homeassistant/components/vilfo/.translations/zh-Hant.json index bdc14bb4f96f..665474e2d763 100644 --- a/homeassistant/components/vilfo/.translations/zh-Hant.json +++ b/homeassistant/components/vilfo/.translations/zh-Hant.json @@ -18,6 +18,5 @@ "title": "\u9023\u7dda\u81f3 Vilfo \u8def\u7531\u5668" } } - }, - "title": "Vilfo \u8def\u7531\u5668" + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ca.json b/homeassistant/components/vizio/.translations/ca.json index fc103b734216..d2f3ed3dd709 100644 --- a/homeassistant/components/vizio/.translations/ca.json +++ b/homeassistant/components/vizio/.translations/ca.json @@ -49,8 +49,6 @@ "description": "Si tens una Smart TV, pots filtrar de manera opcional la teva llista de canals escollint quines aplicacions vols incloure o excloure de la llista.", "title": "Actualitzaci\u00f3 de les opcions de Vizo SmartCast" } - }, - "title": "Actualitzaci\u00f3 de les opcions de Vizo SmartCast" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/da.json b/homeassistant/components/vizio/.translations/da.json index 83e5c363f4ec..6de25c240dee 100644 --- a/homeassistant/components/vizio/.translations/da.json +++ b/homeassistant/components/vizio/.translations/da.json @@ -29,8 +29,6 @@ }, "title": "Opdater Vizo SmartCast-indstillinger" } - }, - "title": "Opdater Vizo SmartCast-indstillinger" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/de.json b/homeassistant/components/vizio/.translations/de.json index 97cddfb44ba8..b5e8a5acc603 100644 --- a/homeassistant/components/vizio/.translations/de.json +++ b/homeassistant/components/vizio/.translations/de.json @@ -49,8 +49,6 @@ "description": "Wenn Sie \u00fcber ein Smart-TV-Ger\u00e4t verf\u00fcgen, k\u00f6nnen Sie Ihre Quellliste optional filtern, indem Sie ausw\u00e4hlen, welche Apps in Ihre Quellliste aufgenommen oder ausgeschlossen werden sollen.", "title": "Aktualisieren Sie die VIZIO SmartCast-Optionen" } - }, - "title": "Aktualisieren Sie die VIZIO SmartCast-Optionen" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/en.json b/homeassistant/components/vizio/.translations/en.json index 7e8ab7057051..d160356cb07a 100644 --- a/homeassistant/components/vizio/.translations/en.json +++ b/homeassistant/components/vizio/.translations/en.json @@ -49,8 +49,6 @@ "description": "If you have a Smart TV, you can optionally filter your source list by choosing which apps to include or exclude in your source list.", "title": "Update VIZIO SmartCast Options" } - }, - "title": "Update VIZIO SmartCast Options" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/es.json b/homeassistant/components/vizio/.translations/es.json index 44c732e49486..f6cf42ebe990 100644 --- a/homeassistant/components/vizio/.translations/es.json +++ b/homeassistant/components/vizio/.translations/es.json @@ -49,8 +49,6 @@ "description": "Si tienes un Smart TV, opcionalmente puedes filtrar su lista de fuentes eligiendo qu\u00e9 aplicaciones incluir o excluir en su lista de fuentes.", "title": "Actualizar las opciones de SmartCast de Vizo" } - }, - "title": "Actualizar las opciones de SmartCast de Vizo" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/fr.json b/homeassistant/components/vizio/.translations/fr.json index 81e38391a19f..043a33734dc6 100644 --- a/homeassistant/components/vizio/.translations/fr.json +++ b/homeassistant/components/vizio/.translations/fr.json @@ -47,8 +47,6 @@ "description": "Si vous avez une Smart TV, vous pouvez \u00e9ventuellement filtrer votre liste de sources en choisissant les applications \u00e0 inclure ou \u00e0 exclure dans votre liste de sources.", "title": "Mettre \u00e0 jour les options de Vizo SmartCast" } - }, - "title": "Mettre \u00e0 jour les options de Vizo SmartCast" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/hu.json b/homeassistant/components/vizio/.translations/hu.json index e47abb0d57cb..37ef8b3740f2 100644 --- a/homeassistant/components/vizio/.translations/hu.json +++ b/homeassistant/components/vizio/.translations/hu.json @@ -28,8 +28,6 @@ }, "title": "Friss\u00edtse a Vizo SmartCast be\u00e1ll\u00edt\u00e1sokat" } - }, - "title": "Friss\u00edtse a Vizo SmartCast be\u00e1ll\u00edt\u00e1sokat" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/it.json b/homeassistant/components/vizio/.translations/it.json index 5b19b4ed66f8..3bfc872f0e49 100644 --- a/homeassistant/components/vizio/.translations/it.json +++ b/homeassistant/components/vizio/.translations/it.json @@ -49,8 +49,6 @@ "description": "Se si dispone di una Smart TV, \u00e8 possibile filtrare l'elenco di origine scegliendo le app da includere o escludere in esso.", "title": "Aggiornamento delle opzioni di VIZIO SmartCast" } - }, - "title": "Aggiornamento delle opzioni di VIZIO SmartCast" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ko.json b/homeassistant/components/vizio/.translations/ko.json index 48c91c86a1e1..16ad1884294d 100644 --- a/homeassistant/components/vizio/.translations/ko.json +++ b/homeassistant/components/vizio/.translations/ko.json @@ -49,8 +49,6 @@ "description": "\uc2a4\ub9c8\ud2b8 TV \uac00 \uc788\ub294 \uacbd\uc6b0 \uc120\ud0dd\uc0ac\ud56d\uc73c\ub85c \uc18c\uc2a4 \ubaa9\ub85d\uc5d0 \ud3ec\ud568 \ub610\ub294 \uc81c\uc678\ud560 \uc571\uc744 \uc120\ud0dd\ud558\uc5ec \uc18c\uc2a4 \ubaa9\ub85d\uc744 \ud544\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", "title": "Vizo SmartCast \uc635\uc158 \uc5c5\ub370\uc774\ud2b8" } - }, - "title": "Vizo SmartCast \uc635\uc158 \uc5c5\ub370\uc774\ud2b8" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/lb.json b/homeassistant/components/vizio/.translations/lb.json index 6301e8f18627..3cd7c1526eeb 100644 --- a/homeassistant/components/vizio/.translations/lb.json +++ b/homeassistant/components/vizio/.translations/lb.json @@ -49,8 +49,6 @@ "description": "Falls du ee Smart TV hues kanns du d'Quelle L\u00ebscht optionell filteren andeems du d'Apps auswiels d\u00e9i soll mat abegraff oder ausgeschloss ginn.", "title": "Vizo Smartcast Optiounen aktualis\u00e9ieren" } - }, - "title": "Vizo Smartcast Optiounen aktualis\u00e9ieren" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/nl.json b/homeassistant/components/vizio/.translations/nl.json index c16c99a455e0..e1789347bf2f 100644 --- a/homeassistant/components/vizio/.translations/nl.json +++ b/homeassistant/components/vizio/.translations/nl.json @@ -29,8 +29,6 @@ }, "title": "Update Vizo SmartCast Opties" } - }, - "title": "Update Vizo SmartCast Opties" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/no.json b/homeassistant/components/vizio/.translations/no.json index 0f79faa0e1cd..16a8c6c392e5 100644 --- a/homeassistant/components/vizio/.translations/no.json +++ b/homeassistant/components/vizio/.translations/no.json @@ -7,8 +7,8 @@ "error": { "cant_connect": "Kunne ikke koble til enheten. [Se gjennom dokumentene] (https://www.home-assistant.io/integrations/vizio/) og bekreft at: \n - Enheten er sl\u00e5tt p\u00e5 \n - Enheten er koblet til nettverket \n - Verdiene du fylte ut er n\u00f8yaktige \n f\u00f8r du pr\u00f8ver \u00e5 sende inn p\u00e5 nytt.", "complete_pairing failed": "Kan ikke fullf\u00f8re sammenkoblingen. Forsikre deg om at PIN-koden du oppga er riktig, og at TV-en fortsatt er p\u00e5 og tilkoblet nettverket f\u00f8r du sender inn p\u00e5 nytt.", - "host_exists": "Vizio-enhet med spesifisert vert allerede konfigurert.", - "name_exists": "Vizio-enhet med spesifisert navn allerede konfigurert." + "host_exists": "VIZIO-enhet med spesifisert vert allerede konfigurert.", + "name_exists": "VIZIO-enhet med spesifisert navn allerede konfigurert." }, "step": { "pair_tv": { @@ -49,8 +49,6 @@ "description": "Hvis du har en Smart-TV, kan du eventuelt filtrere kildelisten ved \u00e5 velge hvilke apper som skal inkluderes eller utelates i kildelisten.", "title": "Oppdater VIZIO SmartCast-alternativer" } - }, - "title": "Oppdater VIZIO SmartCast-alternativer" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/pl.json b/homeassistant/components/vizio/.translations/pl.json index ebd99d088269..392ae0f47f3d 100644 --- a/homeassistant/components/vizio/.translations/pl.json +++ b/homeassistant/components/vizio/.translations/pl.json @@ -43,8 +43,6 @@ "description": "Je\u015bli telewizor obs\u0142uguje aplikacje, mo\u017cesz opcjonalnie filtrowa\u0107 aplikacje, kt\u00f3re maj\u0105 zosta\u0107 uwzgl\u0119dnione lub wykluczone z listy \u017ar\u00f3de\u0142. Mo\u017cesz pomin\u0105\u0107 ten krok dla telewizor\u00f3w, kt\u00f3re nie obs\u0142uguj\u0105 aplikacji.", "title": "Aktualizacja opcji Vizo SmartCast" } - }, - "title": "Aktualizuj opcje Vizo SmartCast" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/ru.json b/homeassistant/components/vizio/.translations/ru.json index 5dcf65435a1f..62b75b4714a8 100644 --- a/homeassistant/components/vizio/.translations/ru.json +++ b/homeassistant/components/vizio/.translations/ru.json @@ -49,8 +49,6 @@ "description": "\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Smart TV, \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.", "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 VIZIO SmartCast" } - }, - "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 VIZIO SmartCast" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/sl.json b/homeassistant/components/vizio/.translations/sl.json index bf38cdb24e0d..e64c3b6cc86e 100644 --- a/homeassistant/components/vizio/.translations/sl.json +++ b/homeassistant/components/vizio/.translations/sl.json @@ -23,7 +23,7 @@ "title": "Seznanjanje je kon\u010dano" }, "pairing_complete_import": { - "description": "Va\u0161 VIZIO SmartCast TV je zdaj priklju\u010den na Home Assistant.\n\n\u017deton za dostop je '**{access_token}**'.", + "description": "Va\u0161 VIZIO SmartCast TV je zdaj povezan s Home Assistant-om.\n\n\u017deton za dostop je '**{access_token}**'.", "title": "Seznanjanje je kon\u010dano" }, "user": { @@ -34,7 +34,7 @@ "name": "Ime" }, "description": "Dostopni \u017eeton je potreben samo za televizorje. \u010ce konfigurirate televizor in \u0161e nimate \u017eetona za dostop, ga pustite prazno in boste \u0161li, da bo \u0161el skozi postopek seznanjanja.", - "title": "Namestite Vizio SmartCast napravo" + "title": "Nastavite napravo VIZIO SmartCast" } } }, @@ -47,10 +47,8 @@ "volume_step": "Velikost koraka glasnosti" }, "description": "\u010ce imate pametni TV, lahko po izbiri filtrirate seznam virov tako, da izberete, katere aplikacije \u017eelite vklju\u010diti ali izklju\u010diti na seznamu virov.", - "title": "Posodobite mo\u017enosti Vizo SmartCast" + "title": "Posodobite mo\u017enosti VIZIO SmartCast" } - }, - "title": "Posodobite mo\u017enosti Vizo SmartCast" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/sv.json b/homeassistant/components/vizio/.translations/sv.json index a435fc1fc60b..5c5a25dd1297 100644 --- a/homeassistant/components/vizio/.translations/sv.json +++ b/homeassistant/components/vizio/.translations/sv.json @@ -29,8 +29,6 @@ }, "title": "Uppdatera Vizo SmartCast-alternativ" } - }, - "title": "Uppdatera Vizo SmartCast-alternativ" - }, - "title": "Vizio SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/vizio/.translations/zh-Hant.json b/homeassistant/components/vizio/.translations/zh-Hant.json index ed40c4105d7d..db2f4ca94472 100644 --- a/homeassistant/components/vizio/.translations/zh-Hant.json +++ b/homeassistant/components/vizio/.translations/zh-Hant.json @@ -49,8 +49,6 @@ "description": "\u5047\u5982\u60a8\u64c1\u6709 Smart TV\u3001\u53ef\u7531\u4f86\u6e90\u5217\u8868\u4e2d\u9078\u64c7\u6240\u8981\u904e\u6ffe\u5305\u542b\u6216\u6392\u9664\u7684 App\u3002\u3002", "title": "\u66f4\u65b0 VIZIO SmartCast \u9078\u9805" } - }, - "title": "\u66f4\u65b0 VIZIO SmartCast \u9078\u9805" - }, - "title": "VIZIO SmartCast" + } + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/bg.json b/homeassistant/components/wemo/.translations/bg.json index 0c853a79a3f5..19f2121f42ae 100644 --- a/homeassistant/components/wemo/.translations/bg.json +++ b/homeassistant/components/wemo/.translations/bg.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ca.json b/homeassistant/components/wemo/.translations/ca.json index f27fc576dcdc..36ce61537960 100644 --- a/homeassistant/components/wemo/.translations/ca.json +++ b/homeassistant/components/wemo/.translations/ca.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/da.json b/homeassistant/components/wemo/.translations/da.json index 72b322178c3b..d2192d85f4b5 100644 --- a/homeassistant/components/wemo/.translations/da.json +++ b/homeassistant/components/wemo/.translations/da.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/de.json b/homeassistant/components/wemo/.translations/de.json index b9c4d698da4c..a0d4465796d9 100644 --- a/homeassistant/components/wemo/.translations/de.json +++ b/homeassistant/components/wemo/.translations/de.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/en.json b/homeassistant/components/wemo/.translations/en.json index fa785558c663..ef86613ea79f 100644 --- a/homeassistant/components/wemo/.translations/en.json +++ b/homeassistant/components/wemo/.translations/en.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/es-419.json b/homeassistant/components/wemo/.translations/es-419.json index 196d1833bab8..3010cfed63b2 100644 --- a/homeassistant/components/wemo/.translations/es-419.json +++ b/homeassistant/components/wemo/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/es.json b/homeassistant/components/wemo/.translations/es.json index 5f4664dae9a4..c8c45bb10832 100644 --- a/homeassistant/components/wemo/.translations/es.json +++ b/homeassistant/components/wemo/.translations/es.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/fr.json b/homeassistant/components/wemo/.translations/fr.json index 444d4b93c15e..47b7d0e6b741 100644 --- a/homeassistant/components/wemo/.translations/fr.json +++ b/homeassistant/components/wemo/.translations/fr.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/it.json b/homeassistant/components/wemo/.translations/it.json index 0974a312f9cd..a14a47a459b9 100644 --- a/homeassistant/components/wemo/.translations/it.json +++ b/homeassistant/components/wemo/.translations/it.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ko.json b/homeassistant/components/wemo/.translations/ko.json index ece4f091b0d7..52f4ba34e323 100644 --- a/homeassistant/components/wemo/.translations/ko.json +++ b/homeassistant/components/wemo/.translations/ko.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/lb.json b/homeassistant/components/wemo/.translations/lb.json index cc2cce56d0b5..8602a1adcbf2 100644 --- a/homeassistant/components/wemo/.translations/lb.json +++ b/homeassistant/components/wemo/.translations/lb.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/nl.json b/homeassistant/components/wemo/.translations/nl.json index 86e0418be342..dc40fd0d66b6 100644 --- a/homeassistant/components/wemo/.translations/nl.json +++ b/homeassistant/components/wemo/.translations/nl.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/nn.json b/homeassistant/components/wemo/.translations/nn.json index e9bdca8ffe88..afce1415ba7e 100644 --- a/homeassistant/components/wemo/.translations/nn.json +++ b/homeassistant/components/wemo/.translations/nn.json @@ -5,6 +5,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/no.json b/homeassistant/components/wemo/.translations/no.json index 9e6edf3b8ab5..1aecf403a4c6 100644 --- a/homeassistant/components/wemo/.translations/no.json +++ b/homeassistant/components/wemo/.translations/no.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/pl.json b/homeassistant/components/wemo/.translations/pl.json index 18161cb7d995..c1c7d9746d55 100644 --- a/homeassistant/components/wemo/.translations/pl.json +++ b/homeassistant/components/wemo/.translations/pl.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/pt-BR.json b/homeassistant/components/wemo/.translations/pt-BR.json index 0a6c90a15b1a..a4fb8960af99 100644 --- a/homeassistant/components/wemo/.translations/pt-BR.json +++ b/homeassistant/components/wemo/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/ru.json b/homeassistant/components/wemo/.translations/ru.json index d220fa7fb63f..5f5c43805865 100644 --- a/homeassistant/components/wemo/.translations/ru.json +++ b/homeassistant/components/wemo/.translations/ru.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/sl.json b/homeassistant/components/wemo/.translations/sl.json index ccd298e262a1..8f754b309be5 100644 --- a/homeassistant/components/wemo/.translations/sl.json +++ b/homeassistant/components/wemo/.translations/sl.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/sv.json b/homeassistant/components/wemo/.translations/sv.json index f39ee5e11eb7..8476f17077c8 100644 --- a/homeassistant/components/wemo/.translations/sv.json +++ b/homeassistant/components/wemo/.translations/sv.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/wemo/.translations/zh-Hant.json b/homeassistant/components/wemo/.translations/zh-Hant.json index a7680b677156..b3845e0df578 100644 --- a/homeassistant/components/wemo/.translations/zh-Hant.json +++ b/homeassistant/components/wemo/.translations/zh-Hant.json @@ -10,6 +10,5 @@ "title": "Wemo" } } - }, - "title": "Wemo" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/bg.json b/homeassistant/components/withings/.translations/bg.json index 4994ffddbb6b..de34abbeed0a 100644 --- a/homeassistant/components/withings/.translations/bg.json +++ b/homeassistant/components/withings/.translations/bg.json @@ -12,6 +12,5 @@ "title": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ca.json b/homeassistant/components/withings/.translations/ca.json index 7c72068b93cd..3b2ee2eff9b1 100644 --- a/homeassistant/components/withings/.translations/ca.json +++ b/homeassistant/components/withings/.translations/ca.json @@ -19,6 +19,5 @@ "title": "Perfil d'usuari." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/da.json b/homeassistant/components/withings/.translations/da.json index 57ae3d10fc43..bee4c6b9757f 100644 --- a/homeassistant/components/withings/.translations/da.json +++ b/homeassistant/components/withings/.translations/da.json @@ -19,6 +19,5 @@ "title": "Brugerprofil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/de.json b/homeassistant/components/withings/.translations/de.json index c214bd3215cd..d217640e44b8 100644 --- a/homeassistant/components/withings/.translations/de.json +++ b/homeassistant/components/withings/.translations/de.json @@ -19,6 +19,5 @@ "title": "Benutzerprofil" } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/en.json b/homeassistant/components/withings/.translations/en.json index 668927f2805c..734a23bc5e0c 100644 --- a/homeassistant/components/withings/.translations/en.json +++ b/homeassistant/components/withings/.translations/en.json @@ -19,6 +19,5 @@ "title": "User Profile." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/es-419.json b/homeassistant/components/withings/.translations/es-419.json index 3fe3b06bf9e7..4fc2dec0ac20 100644 --- a/homeassistant/components/withings/.translations/es-419.json +++ b/homeassistant/components/withings/.translations/es-419.json @@ -3,6 +3,5 @@ "create_entry": { "default": "Autenticado correctamente con Withings para el perfil seleccionado." } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/es.json b/homeassistant/components/withings/.translations/es.json index b2ec33e67c01..19376d363cb9 100644 --- a/homeassistant/components/withings/.translations/es.json +++ b/homeassistant/components/withings/.translations/es.json @@ -19,6 +19,5 @@ "title": "Perfil de usuario." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/fr.json b/homeassistant/components/withings/.translations/fr.json index d201fe70ab51..d9941443f1c4 100644 --- a/homeassistant/components/withings/.translations/fr.json +++ b/homeassistant/components/withings/.translations/fr.json @@ -19,6 +19,5 @@ "title": "Profil utilisateur" } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/hu.json b/homeassistant/components/withings/.translations/hu.json index 177662c6f183..ed0cc9cdc1b1 100644 --- a/homeassistant/components/withings/.translations/hu.json +++ b/homeassistant/components/withings/.translations/hu.json @@ -19,6 +19,5 @@ "title": "Felhaszn\u00e1l\u00f3i profil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/it.json b/homeassistant/components/withings/.translations/it.json index edc03010a5ea..f1d45416988a 100644 --- a/homeassistant/components/withings/.translations/it.json +++ b/homeassistant/components/withings/.translations/it.json @@ -19,6 +19,5 @@ "title": "Profilo utente." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ko.json b/homeassistant/components/withings/.translations/ko.json index 5e4287caa667..f15cfc1a2de3 100644 --- a/homeassistant/components/withings/.translations/ko.json +++ b/homeassistant/components/withings/.translations/ko.json @@ -19,6 +19,5 @@ "title": "\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/lb.json b/homeassistant/components/withings/.translations/lb.json index ed2c1a7d8252..38bd29b96e47 100644 --- a/homeassistant/components/withings/.translations/lb.json +++ b/homeassistant/components/withings/.translations/lb.json @@ -19,6 +19,5 @@ "title": "Benotzer Profil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/nl.json b/homeassistant/components/withings/.translations/nl.json index 286550aafb10..0fe8153cbe4d 100644 --- a/homeassistant/components/withings/.translations/nl.json +++ b/homeassistant/components/withings/.translations/nl.json @@ -19,6 +19,5 @@ "title": "Gebruikersprofiel." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/no.json b/homeassistant/components/withings/.translations/no.json index 0ec8d9d85466..0922f1b3344f 100644 --- a/homeassistant/components/withings/.translations/no.json +++ b/homeassistant/components/withings/.translations/no.json @@ -19,6 +19,5 @@ "title": "Brukerprofil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/pl.json b/homeassistant/components/withings/.translations/pl.json index 1b3c2a17d83b..a45141ff50be 100644 --- a/homeassistant/components/withings/.translations/pl.json +++ b/homeassistant/components/withings/.translations/pl.json @@ -19,6 +19,5 @@ "title": "Profil u\u017cytkownika" } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/ru.json b/homeassistant/components/withings/.translations/ru.json index ddbf61d9e3e2..f99071a2615a 100644 --- a/homeassistant/components/withings/.translations/ru.json +++ b/homeassistant/components/withings/.translations/ru.json @@ -19,6 +19,5 @@ "title": "Withings" } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/sl.json b/homeassistant/components/withings/.translations/sl.json index 8c204171e5b7..0b1ef34bf7c6 100644 --- a/homeassistant/components/withings/.translations/sl.json +++ b/homeassistant/components/withings/.translations/sl.json @@ -19,6 +19,5 @@ "title": "Uporabni\u0161ki profil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/sv.json b/homeassistant/components/withings/.translations/sv.json index 02f627e07b37..c5b6b0fddab5 100644 --- a/homeassistant/components/withings/.translations/sv.json +++ b/homeassistant/components/withings/.translations/sv.json @@ -19,6 +19,5 @@ "title": "Anv\u00e4ndarprofil." } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/withings/.translations/zh-Hant.json b/homeassistant/components/withings/.translations/zh-Hant.json index b4eca4629bee..ac644d264188 100644 --- a/homeassistant/components/withings/.translations/zh-Hant.json +++ b/homeassistant/components/withings/.translations/zh-Hant.json @@ -19,6 +19,5 @@ "title": "\u500b\u4eba\u8a2d\u5b9a\u3002" } } - }, - "title": "Withings" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/af.json b/homeassistant/components/wled/.translations/af.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/af.json +++ b/homeassistant/components/wled/.translations/af.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/ar.json b/homeassistant/components/wled/.translations/ar.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/ar.json +++ b/homeassistant/components/wled/.translations/ar.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/bg.json b/homeassistant/components/wled/.translations/bg.json index 52a707a050f3..8e091a7eacef 100644 --- a/homeassistant/components/wled/.translations/bg.json +++ b/homeassistant/components/wled/.translations/bg.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "\u0410\u0434\u0440\u0435\u0441" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/bs.json b/homeassistant/components/wled/.translations/bs.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/bs.json +++ b/homeassistant/components/wled/.translations/bs.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/ca.json b/homeassistant/components/wled/.translations/ca.json index 305684b3f161..ac47147207e1 100644 --- a/homeassistant/components/wled/.translations/ca.json +++ b/homeassistant/components/wled/.translations/ca.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Aquest dispositiu WLED ja est\u00e0 configurat.", + "connection_error": "No s'ha pogut connectar amb el dispositiu WLED." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "No s'ha pogut connectar amb el dispositiu WLED." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "Amfitri\u00f3 o adre\u00e7a IP" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Configura el teu WLED per integrar-lo amb Home Assistant.", + "title": "Enlla\u00e7 amb WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Vols afegir el WLED `{name}` a Home Assistant?", + "title": "Dispositiu WLED descobert" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/cs.json b/homeassistant/components/wled/.translations/cs.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/cs.json +++ b/homeassistant/components/wled/.translations/cs.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/cy.json b/homeassistant/components/wled/.translations/cy.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/cy.json +++ b/homeassistant/components/wled/.translations/cy.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/da.json b/homeassistant/components/wled/.translations/da.json index bd6feaf1019c..739a9befa828 100644 --- a/homeassistant/components/wled/.translations/da.json +++ b/homeassistant/components/wled/.translations/da.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "V\u00e6rt eller IP-adresse" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/de.json b/homeassistant/components/wled/.translations/de.json index 421ade359263..697fa1acf525 100644 --- a/homeassistant/components/wled/.translations/de.json +++ b/homeassistant/components/wled/.translations/de.json @@ -21,6 +21,5 @@ "title": "WLED-Ger\u00e4t entdeckt" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/el.json b/homeassistant/components/wled/.translations/el.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/el.json +++ b/homeassistant/components/wled/.translations/el.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/en.json b/homeassistant/components/wled/.translations/en.json index 74d981fa2e90..7c63779d5ac9 100644 --- a/homeassistant/components/wled/.translations/en.json +++ b/homeassistant/components/wled/.translations/en.json @@ -21,6 +21,5 @@ "title": "Discovered WLED device" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/eo.json b/homeassistant/components/wled/.translations/eo.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/eo.json +++ b/homeassistant/components/wled/.translations/eo.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/es-419.json b/homeassistant/components/wled/.translations/es-419.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/es-419.json +++ b/homeassistant/components/wled/.translations/es-419.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/es.json b/homeassistant/components/wled/.translations/es.json index c1bfc9596b18..b5973638373b 100644 --- a/homeassistant/components/wled/.translations/es.json +++ b/homeassistant/components/wled/.translations/es.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Host o direcci\u00f3n IP" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/et.json b/homeassistant/components/wled/.translations/et.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/et.json +++ b/homeassistant/components/wled/.translations/et.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/eu.json b/homeassistant/components/wled/.translations/eu.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/eu.json +++ b/homeassistant/components/wled/.translations/eu.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/fa.json b/homeassistant/components/wled/.translations/fa.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/fa.json +++ b/homeassistant/components/wled/.translations/fa.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/fi.json b/homeassistant/components/wled/.translations/fi.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/fi.json +++ b/homeassistant/components/wled/.translations/fi.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/fr.json b/homeassistant/components/wled/.translations/fr.json index a39efca5fa87..ded950bdf695 100644 --- a/homeassistant/components/wled/.translations/fr.json +++ b/homeassistant/components/wled/.translations/fr.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "H\u00f4te ou adresse IP" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/gsw.json b/homeassistant/components/wled/.translations/gsw.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/gsw.json +++ b/homeassistant/components/wled/.translations/gsw.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/he.json b/homeassistant/components/wled/.translations/he.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/he.json +++ b/homeassistant/components/wled/.translations/he.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/hi.json b/homeassistant/components/wled/.translations/hi.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/hi.json +++ b/homeassistant/components/wled/.translations/hi.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/hr.json b/homeassistant/components/wled/.translations/hr.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/hr.json +++ b/homeassistant/components/wled/.translations/hr.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/hu.json b/homeassistant/components/wled/.translations/hu.json index d179d634143f..45f939cb855a 100644 --- a/homeassistant/components/wled/.translations/hu.json +++ b/homeassistant/components/wled/.translations/hu.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Hosztn\u00e9v vagy IP c\u00edm" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/iba.json b/homeassistant/components/wled/.translations/iba.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/iba.json +++ b/homeassistant/components/wled/.translations/iba.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/id.json b/homeassistant/components/wled/.translations/id.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/id.json +++ b/homeassistant/components/wled/.translations/id.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/is.json b/homeassistant/components/wled/.translations/is.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/is.json +++ b/homeassistant/components/wled/.translations/is.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/it.json b/homeassistant/components/wled/.translations/it.json index 97cf128fc38e..60a896c34d14 100644 --- a/homeassistant/components/wled/.translations/it.json +++ b/homeassistant/components/wled/.translations/it.json @@ -21,6 +21,5 @@ "title": "Dispositivo WLED rilevato" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ja.json b/homeassistant/components/wled/.translations/ja.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/ja.json +++ b/homeassistant/components/wled/.translations/ja.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/ko.json b/homeassistant/components/wled/.translations/ko.json index cb70263e07cd..b811023e88e0 100644 --- a/homeassistant/components/wled/.translations/ko.json +++ b/homeassistant/components/wled/.translations/ko.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "\ud638\uc2a4\ud2b8 \ub610\ub294 IP \uc8fc\uc18c" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/lb.json b/homeassistant/components/wled/.translations/lb.json index acd10f5794ea..13cfb7bc9119 100644 --- a/homeassistant/components/wled/.translations/lb.json +++ b/homeassistant/components/wled/.translations/lb.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Numm oder IP Adresse" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/lt.json b/homeassistant/components/wled/.translations/lt.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/lt.json +++ b/homeassistant/components/wled/.translations/lt.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/lv.json b/homeassistant/components/wled/.translations/lv.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/lv.json +++ b/homeassistant/components/wled/.translations/lv.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/nl.json b/homeassistant/components/wled/.translations/nl.json index 6258ab61cf16..5b78cbd791b9 100644 --- a/homeassistant/components/wled/.translations/nl.json +++ b/homeassistant/components/wled/.translations/nl.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Hostnaam of IP-adres" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/nn.json b/homeassistant/components/wled/.translations/nn.json index e3edb991fb43..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/nn.json +++ b/homeassistant/components/wled/.translations/nn.json @@ -1,23 +1,22 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/no.json b/homeassistant/components/wled/.translations/no.json index 252b87e1e1a9..34c645e98029 100644 --- a/homeassistant/components/wled/.translations/no.json +++ b/homeassistant/components/wled/.translations/no.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Denne WLED-enheten er allerede konfigurert.", + "connection_error": "Kunne ikke koble til WLED-enheten." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Kunne ikke koble til WLED-enheten." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "Vert eller IP-adresse" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Konfigurer WLED til \u00e5 integreres med Home Assistant.", + "title": "Linken din WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Vil du legge til WLED med navnet ' {name} ' i Home Assistant?", + "title": "Oppdaget WLED-enhet" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/pl.json b/homeassistant/components/wled/.translations/pl.json index 94c4f91abea8..8e4d8cec4921 100644 --- a/homeassistant/components/wled/.translations/pl.json +++ b/homeassistant/components/wled/.translations/pl.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Nazwa hosta lub adres IP" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/pt-BR.json b/homeassistant/components/wled/.translations/pt-BR.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/pt-BR.json +++ b/homeassistant/components/wled/.translations/pt-BR.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/pt.json b/homeassistant/components/wled/.translations/pt.json index 996f5823a5d8..356c842839e2 100644 --- a/homeassistant/components/wled/.translations/pt.json +++ b/homeassistant/components/wled/.translations/pt.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie [VOID]", - "connection_error": "Wykryto urz\u0105dzenie [VOID]" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie [VOID]" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie [VOID]", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "Nome servidor ou endere\u00e7o IP" }, - "description": "Wykryto urz\u0105dzenie [VOID]", - "title": "Wykryto urz\u0105dzenie [VOID]" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie [VOID]", - "title": "Wykryto urz\u0105dzenie [VOID]" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ro.json b/homeassistant/components/wled/.translations/ro.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/ro.json +++ b/homeassistant/components/wled/.translations/ro.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/ru.json b/homeassistant/components/wled/.translations/ru.json index 4fc85c40103c..21b5282eb6db 100644 --- a/homeassistant/components/wled/.translations/ru.json +++ b/homeassistant/components/wled/.translations/ru.json @@ -21,6 +21,5 @@ "title": "WLED" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sk.json b/homeassistant/components/wled/.translations/sk.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/sk.json +++ b/homeassistant/components/wled/.translations/sk.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/sl.json b/homeassistant/components/wled/.translations/sl.json index 3eaf52e8a862..e0f4b187e541 100644 --- a/homeassistant/components/wled/.translations/sl.json +++ b/homeassistant/components/wled/.translations/sl.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Ta naprava WLED je \u017ee konfigurirana.", + "connection_error": "Povezava z napravo WLED ni uspela." }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Povezava z napravo WLED ni uspela." }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED: {name}", "step": { "user": { "data": { "host": "Gostitelj ali IP naslov" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Nastavite svoj WLED za integracijo s Home Assistant.", + "title": "Pove\u017eite svoj WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Ali \u017eelite dodati WLED z imenom `{name}` v Home Assistant?", + "title": "Odkrite WLED naprave" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/sr-Latn.json b/homeassistant/components/wled/.translations/sr-Latn.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/sr-Latn.json +++ b/homeassistant/components/wled/.translations/sr-Latn.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/sr.json b/homeassistant/components/wled/.translations/sr.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/sr.json +++ b/homeassistant/components/wled/.translations/sr.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/sv.json b/homeassistant/components/wled/.translations/sv.json index 4b2af95ccc53..a348c0d55721 100644 --- a/homeassistant/components/wled/.translations/sv.json +++ b/homeassistant/components/wled/.translations/sv.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { "data": { "host": "V\u00e4rd eller IP-adress" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wled/.translations/ta.json b/homeassistant/components/wled/.translations/ta.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/ta.json +++ b/homeassistant/components/wled/.translations/ta.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/te.json b/homeassistant/components/wled/.translations/te.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/te.json +++ b/homeassistant/components/wled/.translations/te.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/th.json b/homeassistant/components/wled/.translations/th.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/th.json +++ b/homeassistant/components/wled/.translations/th.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/tr.json b/homeassistant/components/wled/.translations/tr.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/tr.json +++ b/homeassistant/components/wled/.translations/tr.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/uk.json b/homeassistant/components/wled/.translations/uk.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/uk.json +++ b/homeassistant/components/wled/.translations/uk.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/ur.json b/homeassistant/components/wled/.translations/ur.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/ur.json +++ b/homeassistant/components/wled/.translations/ur.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/vi.json b/homeassistant/components/wled/.translations/vi.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/vi.json +++ b/homeassistant/components/wled/.translations/vi.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/zh-Hans.json b/homeassistant/components/wled/.translations/zh-Hans.json index 6e5a8c9293d5..a9107341e379 100644 --- a/homeassistant/components/wled/.translations/zh-Hans.json +++ b/homeassistant/components/wled/.translations/zh-Hans.json @@ -1,21 +1,21 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie ", - "connection_error": "Wykryto urz\u0105dzenie " + "already_configured": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie " + "connection_error": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, - "flow_title": "Wykryto urz\u0105dzenie ", + "flow_title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", "step": { "user": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie ", - "title": "Wykryto urz\u0105dzenie " + "description": "Wykryto urz\u0105dzenie [%key:component::wled::title%]", + "title": "Wykryto urz\u0105dzenie [%key:component::wled::title%]" } } } diff --git a/homeassistant/components/wled/.translations/zh-Hant.json b/homeassistant/components/wled/.translations/zh-Hant.json index 311a6fc2c633..1b3b3f9fb2aa 100644 --- a/homeassistant/components/wled/.translations/zh-Hant.json +++ b/homeassistant/components/wled/.translations/zh-Hant.json @@ -1,26 +1,25 @@ { "config": { "abort": { - "already_configured": "Wykryto urz\u0105dzenie WLED", - "connection_error": "Wykryto urz\u0105dzenie WLED" + "already_configured": "WLED \u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "connection_error": "WLED \u8a2d\u5099\u9023\u7dda\u5931\u6557\u3002" }, "error": { - "connection_error": "Wykryto urz\u0105dzenie WLED" + "connection_error": "WLED \u8a2d\u5099\u9023\u7dda\u5931\u6557\u3002" }, - "flow_title": "Wykryto urz\u0105dzenie WLED", + "flow_title": "WLED\uff1a{name}", "step": { "user": { "data": { "host": "\u4e3b\u6a5f\u6216 IP \u4f4d\u5740" }, - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "\u8a2d\u5b9a WLED \u4ee5\u6574\u5408\u81f3 Home Assistant\u3002", + "title": "\u9023\u7d50 WLED" }, "zeroconf_confirm": { - "description": "Wykryto urz\u0105dzenie WLED", - "title": "Wykryto urz\u0105dzenie WLED" + "description": "\u662f\u5426\u8981\u65b0\u589e WLED \u540d\u7a31\u300c{name}\u300d\u8a2d\u5099\u81f3 Home Assistant\uff1f", + "title": "\u81ea\u52d5\u63a2\u7d22\u5230 WLED \u8a2d\u5099" } } - }, - "title": "WLED" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/bg.json b/homeassistant/components/wwlln/.translations/bg.json index b7effeac9a52..cd39935f171f 100644 --- a/homeassistant/components/wwlln/.translations/bg.json +++ b/homeassistant/components/wwlln/.translations/bg.json @@ -10,6 +10,5 @@ "title": "\u041f\u043e\u043f\u044a\u043b\u043d\u0435\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0441\u0438." } } - }, - "title": "\u0421\u0432\u0435\u0442\u043e\u0432\u043d\u0430 \u043c\u0440\u0435\u0436\u0430 \u0437\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u044a\u043b\u043d\u0438\u044f (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ca.json b/homeassistant/components/wwlln/.translations/ca.json index 28772b25c47f..b6e915aa35ed 100644 --- a/homeassistant/components/wwlln/.translations/ca.json +++ b/homeassistant/components/wwlln/.translations/ca.json @@ -13,6 +13,5 @@ "title": "Introdueix la teva informaci\u00f3 d'ubicaci\u00f3." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/cy.json b/homeassistant/components/wwlln/.translations/cy.json index 7127066c1297..f9c36f4e72ac 100644 --- a/homeassistant/components/wwlln/.translations/cy.json +++ b/homeassistant/components/wwlln/.translations/cy.json @@ -10,6 +10,5 @@ "title": "Cwblhewch gwybodaeth eich lleoliad" } } - }, - "title": "Rhwydwaith Lleoliad Golau Byd-eang (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/da.json b/homeassistant/components/wwlln/.translations/da.json index 6370a98d6fd4..b87d9af14f37 100644 --- a/homeassistant/components/wwlln/.translations/da.json +++ b/homeassistant/components/wwlln/.translations/da.json @@ -10,6 +10,5 @@ "title": "Udfyld dine lokalitetsoplysninger." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/de.json b/homeassistant/components/wwlln/.translations/de.json index f16a8cc40579..2f59ea2d38c0 100644 --- a/homeassistant/components/wwlln/.translations/de.json +++ b/homeassistant/components/wwlln/.translations/de.json @@ -13,6 +13,5 @@ "title": "Gib deine Standortinformationen ein." } } - }, - "title": "Weltweites Blitzlokalisierungsnetzwerk (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/en.json b/homeassistant/components/wwlln/.translations/en.json index c62cccaf4902..936c64c2a771 100644 --- a/homeassistant/components/wwlln/.translations/en.json +++ b/homeassistant/components/wwlln/.translations/en.json @@ -13,6 +13,5 @@ "title": "Fill in your location information." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/es-419.json b/homeassistant/components/wwlln/.translations/es-419.json index 6b753642e841..1732a5b43bc2 100644 --- a/homeassistant/components/wwlln/.translations/es-419.json +++ b/homeassistant/components/wwlln/.translations/es-419.json @@ -10,6 +10,5 @@ "title": "Complete su informaci\u00f3n de ubicaci\u00f3n." } } - }, - "title": "Red Mundial de Localizaci\u00f3n de Rayos (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/es.json b/homeassistant/components/wwlln/.translations/es.json index ebee314c56a2..16b3b461ad1b 100644 --- a/homeassistant/components/wwlln/.translations/es.json +++ b/homeassistant/components/wwlln/.translations/es.json @@ -13,6 +13,5 @@ "title": "Completa la informaci\u00f3n de tu ubicaci\u00f3n." } } - }, - "title": "Red mundial de localizaci\u00f3n de rayos (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/fr.json b/homeassistant/components/wwlln/.translations/fr.json index 06439ef5cf47..d4fad7f01609 100644 --- a/homeassistant/components/wwlln/.translations/fr.json +++ b/homeassistant/components/wwlln/.translations/fr.json @@ -13,6 +13,5 @@ "title": "Veuillez saisir vos informations d'emplacement." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/hr.json b/homeassistant/components/wwlln/.translations/hr.json index 6d4d31e01346..43af25b90471 100644 --- a/homeassistant/components/wwlln/.translations/hr.json +++ b/homeassistant/components/wwlln/.translations/hr.json @@ -10,6 +10,5 @@ "title": "Ispunite podatke o lokaciji." } } - }, - "title": "Svjetska mre\u017ea lokacija munje (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/it.json b/homeassistant/components/wwlln/.translations/it.json index 0e4ef8640755..4193ccab8902 100644 --- a/homeassistant/components/wwlln/.translations/it.json +++ b/homeassistant/components/wwlln/.translations/it.json @@ -13,6 +13,5 @@ "title": "Inserisci le informazioni sulla tua posizione." } } - }, - "title": "Rete mondiale di localizzazione dei fulmini (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ko.json b/homeassistant/components/wwlln/.translations/ko.json index db7dd9852c87..5ddf4f051849 100644 --- a/homeassistant/components/wwlln/.translations/ko.json +++ b/homeassistant/components/wwlln/.translations/ko.json @@ -13,6 +13,5 @@ "title": "\uc704\uce58 \uc815\ubcf4\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694." } } - }, - "title": "\uc138\uacc4 \ub099\ub8b0 \uc704\uce58\ub9dd (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/lb.json b/homeassistant/components/wwlln/.translations/lb.json index 6fab54213730..dcdc2becf061 100644 --- a/homeassistant/components/wwlln/.translations/lb.json +++ b/homeassistant/components/wwlln/.translations/lb.json @@ -13,6 +13,5 @@ "title": "F\u00ebllt \u00e4r Informatiounen aus." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/nl.json b/homeassistant/components/wwlln/.translations/nl.json index af00e027a8cf..442420b1c5d6 100644 --- a/homeassistant/components/wwlln/.translations/nl.json +++ b/homeassistant/components/wwlln/.translations/nl.json @@ -10,6 +10,5 @@ "title": "Vul uw locatiegegevens in." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/no.json b/homeassistant/components/wwlln/.translations/no.json index 00704aad5234..4ce9b99b7384 100644 --- a/homeassistant/components/wwlln/.translations/no.json +++ b/homeassistant/components/wwlln/.translations/no.json @@ -13,6 +13,5 @@ "title": "Fyll ut posisjonsinformasjonen din." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/pl.json b/homeassistant/components/wwlln/.translations/pl.json index 5ba66970d3ae..04071c31cb15 100644 --- a/homeassistant/components/wwlln/.translations/pl.json +++ b/homeassistant/components/wwlln/.translations/pl.json @@ -13,6 +13,5 @@ "title": "Wprowad\u017a informacje o lokalizacji." } } - }, - "title": "\u015awiatowa sie\u0107 lokalizacji wy\u0142adowa\u0144 atmosferycznych (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/pt-BR.json b/homeassistant/components/wwlln/.translations/pt-BR.json index f948b11007f8..9119d281dd58 100644 --- a/homeassistant/components/wwlln/.translations/pt-BR.json +++ b/homeassistant/components/wwlln/.translations/pt-BR.json @@ -10,6 +10,5 @@ "title": "Preencha suas informa\u00e7\u00f5es de localiza\u00e7\u00e3o." } } - }, - "title": "Rede mundial de localiza\u00e7\u00e3o de rel\u00e2mpagos (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/ru.json b/homeassistant/components/wwlln/.translations/ru.json index ad4b78ae5631..007704bf406f 100644 --- a/homeassistant/components/wwlln/.translations/ru.json +++ b/homeassistant/components/wwlln/.translations/ru.json @@ -13,6 +13,5 @@ "title": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" } } - }, - "title": "\u0412\u0441\u0435\u043c\u0438\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u043b\u043d\u0438\u0439 (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/sl.json b/homeassistant/components/wwlln/.translations/sl.json index a001deee547f..55712fd85903 100644 --- a/homeassistant/components/wwlln/.translations/sl.json +++ b/homeassistant/components/wwlln/.translations/sl.json @@ -13,6 +13,5 @@ "title": "Izpolnite podatke o va\u0161i lokaciji." } } - }, - "title": "Svetovna mre\u017ea za lokacije strel (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/sv.json b/homeassistant/components/wwlln/.translations/sv.json index ad738c2131bd..22a91d7dfccc 100644 --- a/homeassistant/components/wwlln/.translations/sv.json +++ b/homeassistant/components/wwlln/.translations/sv.json @@ -10,6 +10,5 @@ "title": "Fyll i platsinformation." } } - }, - "title": "World Wide Lightning Location Network (WWLLN)" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/zh-Hans.json b/homeassistant/components/wwlln/.translations/zh-Hans.json index 3e13c944a335..5346a777cd6f 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hans.json +++ b/homeassistant/components/wwlln/.translations/zh-Hans.json @@ -10,6 +10,5 @@ "title": "\u586b\u5199\u60a8\u7684\u4f4d\u7f6e\u4fe1\u606f\u3002" } } - }, - "title": "\u5168\u7403\u95ea\u7535\u5b9a\u4f4d\u7f51\u7edc\uff08WWLLN\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/wwlln/.translations/zh-Hant.json b/homeassistant/components/wwlln/.translations/zh-Hant.json index 47180cf070f3..7b4bfaa1c08b 100644 --- a/homeassistant/components/wwlln/.translations/zh-Hant.json +++ b/homeassistant/components/wwlln/.translations/zh-Hant.json @@ -13,6 +13,5 @@ "title": "\u586b\u5beb\u5ea7\u6a19\u8cc7\u8a0a\u3002" } } - }, - "title": "\u5168\u7403\u9583\u96fb\u5b9a\u4f4d\u7db2\uff08WWLLN\uff09" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/bg.json b/homeassistant/components/zha/.translations/bg.json index 634e1f3b6d07..ec7bad9997b2 100644 --- a/homeassistant/components/zha/.translations/bg.json +++ b/homeassistant/components/zha/.translations/bg.json @@ -62,6 +62,5 @@ "remote_button_short_release": "\"{subtype}\" \u0431\u0443\u0442\u043e\u043d\u044a\u0442 \u0431\u0435\u0448\u0435 \u043e\u0442\u043f\u0443\u0441\u043d\u0430\u0442", "remote_button_triple_press": "\"{subtype}\" \u0431\u0443\u0442\u043e\u043d\u044a\u0442 \u0431\u0435\u0448\u0435 \u043d\u0430\u0442\u0438\u0441\u043d\u0430\u0442 \u0442\u0440\u0438\u043a\u0440\u0430\u0442\u043d\u043e" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ca.json b/homeassistant/components/zha/.translations/ca.json index 2b4edb07c295..7102410aed45 100644 --- a/homeassistant/components/zha/.translations/ca.json +++ b/homeassistant/components/zha/.translations/ca.json @@ -70,6 +70,5 @@ "remote_button_short_release": "Bot\u00f3 \"{subtype}\" alliberat", "remote_button_triple_press": "Bot\u00f3 \"{subtype}\" clicat tres vegades" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/da.json b/homeassistant/components/zha/.translations/da.json index 60f9c60e8b59..43477e1189e9 100644 --- a/homeassistant/components/zha/.translations/da.json +++ b/homeassistant/components/zha/.translations/da.json @@ -62,6 +62,5 @@ "remote_button_short_release": "\"{subtype}\"-knappen frigivet", "remote_button_triple_press": "\"{subtype}\"-knappen tredobbeltklikkes" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/de.json b/homeassistant/components/zha/.translations/de.json index d61ab9ce4347..c5ef6071dd74 100644 --- a/homeassistant/components/zha/.translations/de.json +++ b/homeassistant/components/zha/.translations/de.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" Taste losgelassen", "remote_button_triple_press": "\"{subtype}\" Taste dreimal geklickt" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/en.json b/homeassistant/components/zha/.translations/en.json index 803d058e0c20..d8db817507dd 100644 --- a/homeassistant/components/zha/.translations/en.json +++ b/homeassistant/components/zha/.translations/en.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" button released", "remote_button_triple_press": "\"{subtype}\" button triple clicked" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/es-419.json b/homeassistant/components/zha/.translations/es-419.json index eb02c27d7483..81803aa8cf4d 100644 --- a/homeassistant/components/zha/.translations/es-419.json +++ b/homeassistant/components/zha/.translations/es-419.json @@ -33,6 +33,5 @@ "device_slid": "Dispositivo deslizado \"{subtype}\"", "device_tilted": "Dispositivo inclinado" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/es.json b/homeassistant/components/zha/.translations/es.json index 32aa48328bd7..19767b7662fe 100644 --- a/homeassistant/components/zha/.translations/es.json +++ b/homeassistant/components/zha/.translations/es.json @@ -70,6 +70,5 @@ "remote_button_short_release": "Bot\u00f3n \"{subtype}\" soltado", "remote_button_triple_press": "Bot\u00f3n \"{subtype}\" triple pulsaci\u00f3n" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/fr.json b/homeassistant/components/zha/.translations/fr.json index 3e22c7cba55d..d3ca58546f10 100644 --- a/homeassistant/components/zha/.translations/fr.json +++ b/homeassistant/components/zha/.translations/fr.json @@ -62,6 +62,5 @@ "remote_button_short_release": "Bouton \" {subtype} \" est rel\u00e2ch\u00e9", "remote_button_triple_press": "Bouton \"{subtype}\" \u00e0 trois clics" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/hu.json b/homeassistant/components/zha/.translations/hu.json index df10e978d72b..0f1d39859237 100644 --- a/homeassistant/components/zha/.translations/hu.json +++ b/homeassistant/components/zha/.translations/hu.json @@ -15,6 +15,5 @@ "title": "ZHA" } } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/it.json b/homeassistant/components/zha/.translations/it.json index 70ab49a8017f..05d429701f06 100644 --- a/homeassistant/components/zha/.translations/it.json +++ b/homeassistant/components/zha/.translations/it.json @@ -70,6 +70,5 @@ "remote_button_short_release": "Pulsante \"{subtype}\" rilasciato", "remote_button_triple_press": "Pulsante \"{subtype}\" cliccato tre volte" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ko.json b/homeassistant/components/zha/.translations/ko.json index 2ea67ece4a50..ecd936975bf3 100644 --- a/homeassistant/components/zha/.translations/ko.json +++ b/homeassistant/components/zha/.translations/ko.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c", "remote_button_triple_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \uc138 \ubc88 \ub20c\ub9b4 \ub54c" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/lb.json b/homeassistant/components/zha/.translations/lb.json index b447c2e44b46..3c84a7e6d5dc 100644 --- a/homeassistant/components/zha/.translations/lb.json +++ b/homeassistant/components/zha/.translations/lb.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss", "remote_button_triple_press": "\"{subtype}\" Kn\u00e4ppche dr\u00e4imol gedr\u00e9ckt" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/nl.json b/homeassistant/components/zha/.translations/nl.json index 64a6d760d452..c82271a9ffb2 100644 --- a/homeassistant/components/zha/.translations/nl.json +++ b/homeassistant/components/zha/.translations/nl.json @@ -62,6 +62,5 @@ "remote_button_short_release": "\"{subtype}\" knop losgelaten", "remote_button_triple_press": "\" {subtype} \" knop driemaal geklikt" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/nn.json b/homeassistant/components/zha/.translations/nn.json index d5a8a89ff60c..2e607435b7ea 100644 --- a/homeassistant/components/zha/.translations/nn.json +++ b/homeassistant/components/zha/.translations/nn.json @@ -10,6 +10,5 @@ "action_type": { "squawk": "Squawk" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/no.json b/homeassistant/components/zha/.translations/no.json index 096164e72918..c36bd66304bc 100644 --- a/homeassistant/components/zha/.translations/no.json +++ b/homeassistant/components/zha/.translations/no.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\"-knappen sluppet", "remote_button_triple_press": "\"{subtype}\"-knappen ble trippelklikket" } - }, - "title": "" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pl.json b/homeassistant/components/zha/.translations/pl.json index fc5b04e10384..164d1b1a730c 100644 --- a/homeassistant/components/zha/.translations/pl.json +++ b/homeassistant/components/zha/.translations/pl.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" zostanie zwolniony", "remote_button_triple_press": "\"{subtype}\" zostanie trzykrotnie naci\u015bni\u0119ty" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pt-BR.json b/homeassistant/components/zha/.translations/pt-BR.json index 02db7d60823b..60d9f681be05 100644 --- a/homeassistant/components/zha/.translations/pt-BR.json +++ b/homeassistant/components/zha/.translations/pt-BR.json @@ -21,6 +21,5 @@ "squawk": "Squawk", "warn": "Aviso" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/pt.json b/homeassistant/components/zha/.translations/pt.json index 4883c7643201..42221f7ae838 100644 --- a/homeassistant/components/zha/.translations/pt.json +++ b/homeassistant/components/zha/.translations/pt.json @@ -23,6 +23,5 @@ "trigger_subtype": { "left": "Esquerda" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/ru.json b/homeassistant/components/zha/.translations/ru.json index 54ed72d674e5..acf619e79b7f 100644 --- a/homeassistant/components/zha/.translations/ru.json +++ b/homeassistant/components/zha/.translations/ru.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430", "remote_button_triple_press": "\"{subtype}\" \u043d\u0430\u0436\u0430\u0442\u0430 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430" } - }, - "title": "Zigbee Home Automation (ZHA)" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/sl.json b/homeassistant/components/zha/.translations/sl.json index 2d6c9c687d83..bfaf0757ea4d 100644 --- a/homeassistant/components/zha/.translations/sl.json +++ b/homeassistant/components/zha/.translations/sl.json @@ -70,6 +70,5 @@ "remote_button_short_release": "Gumb \"{subtype}\" spro\u0161\u010den", "remote_button_triple_press": "Gumb \"{subtype}\" trikrat kliknjen" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/sv.json b/homeassistant/components/zha/.translations/sv.json index e9887441c00f..84ae9155b37e 100644 --- a/homeassistant/components/zha/.translations/sv.json +++ b/homeassistant/components/zha/.translations/sv.json @@ -62,6 +62,5 @@ "remote_button_short_release": "\"{subtype}\"-knappen sl\u00e4ppt", "remote_button_triple_press": "\"{subtype}\"-knappen trippelklickades" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/zh-Hans.json b/homeassistant/components/zha/.translations/zh-Hans.json index 22a0152b73b6..72756d78a650 100644 --- a/homeassistant/components/zha/.translations/zh-Hans.json +++ b/homeassistant/components/zha/.translations/zh-Hans.json @@ -15,6 +15,5 @@ "title": "ZHA" } } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zha/.translations/zh-Hant.json b/homeassistant/components/zha/.translations/zh-Hant.json index 6f042345407d..6171f68a0813 100644 --- a/homeassistant/components/zha/.translations/zh-Hant.json +++ b/homeassistant/components/zha/.translations/zh-Hant.json @@ -70,6 +70,5 @@ "remote_button_short_release": "\"{subtype}\" \u6309\u9215\u5df2\u91cb\u653e", "remote_button_triple_press": "\"{subtype}\" \u6309\u9215\u4e09\u9023\u64ca" } - }, - "title": "ZHA" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/bg.json b/homeassistant/components/zwave/.translations/bg.json index 77ec3bc45dd8..6b9691723aec 100644 --- a/homeassistant/components/zwave/.translations/bg.json +++ b/homeassistant/components/zwave/.translations/bg.json @@ -17,6 +17,5 @@ "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ca.json b/homeassistant/components/zwave/.translations/ca.json index cb6c71f06ec1..dde9a2e9ae9b 100644 --- a/homeassistant/components/zwave/.translations/ca.json +++ b/homeassistant/components/zwave/.translations/ca.json @@ -17,6 +17,5 @@ "title": "Configuraci\u00f3 de Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/cs.json b/homeassistant/components/zwave/.translations/cs.json index 90aad3286bc0..4e9044f24cb8 100644 --- a/homeassistant/components/zwave/.translations/cs.json +++ b/homeassistant/components/zwave/.translations/cs.json @@ -17,6 +17,5 @@ "title": "Nastavit Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/da.json b/homeassistant/components/zwave/.translations/da.json index 52ba1fe06f09..bf7641d6bf0c 100644 --- a/homeassistant/components/zwave/.translations/da.json +++ b/homeassistant/components/zwave/.translations/da.json @@ -17,6 +17,5 @@ "title": "Ops\u00e6t Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/de.json b/homeassistant/components/zwave/.translations/de.json index c245e010ded9..df745a1ab2f5 100644 --- a/homeassistant/components/zwave/.translations/de.json +++ b/homeassistant/components/zwave/.translations/de.json @@ -17,6 +17,5 @@ "title": "Z-Wave einrichten" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/en.json b/homeassistant/components/zwave/.translations/en.json index bb35af63373c..8afa9b632f2b 100644 --- a/homeassistant/components/zwave/.translations/en.json +++ b/homeassistant/components/zwave/.translations/en.json @@ -17,6 +17,5 @@ "title": "Set up Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/es-419.json b/homeassistant/components/zwave/.translations/es-419.json index 5e44c2612d88..474c194c06c5 100644 --- a/homeassistant/components/zwave/.translations/es-419.json +++ b/homeassistant/components/zwave/.translations/es-419.json @@ -17,6 +17,5 @@ "title": "Configurar Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/es.json b/homeassistant/components/zwave/.translations/es.json index bef69802ba92..e9f3dbc98868 100644 --- a/homeassistant/components/zwave/.translations/es.json +++ b/homeassistant/components/zwave/.translations/es.json @@ -17,6 +17,5 @@ "title": "Configurar Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/fr.json b/homeassistant/components/zwave/.translations/fr.json index 7f4ba7ac899d..a16deae968a8 100644 --- a/homeassistant/components/zwave/.translations/fr.json +++ b/homeassistant/components/zwave/.translations/fr.json @@ -17,6 +17,5 @@ "title": "Configurer Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/hu.json b/homeassistant/components/zwave/.translations/hu.json index e067002ca89b..a4d0986bdd39 100644 --- a/homeassistant/components/zwave/.translations/hu.json +++ b/homeassistant/components/zwave/.translations/hu.json @@ -17,6 +17,5 @@ "title": "Z-Wave be\u00e1ll\u00edt\u00e1sa" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/it.json b/homeassistant/components/zwave/.translations/it.json index 2e73c109e57e..22720fa8d7ea 100644 --- a/homeassistant/components/zwave/.translations/it.json +++ b/homeassistant/components/zwave/.translations/it.json @@ -17,6 +17,5 @@ "title": "Configura Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ko.json b/homeassistant/components/zwave/.translations/ko.json index 93d8e43553a4..c453d6ea6083 100644 --- a/homeassistant/components/zwave/.translations/ko.json +++ b/homeassistant/components/zwave/.translations/ko.json @@ -17,6 +17,5 @@ "title": "Z-Wave \uc124\uc815" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/lb.json b/homeassistant/components/zwave/.translations/lb.json index 0747ed4514a3..4a9463ff0056 100644 --- a/homeassistant/components/zwave/.translations/lb.json +++ b/homeassistant/components/zwave/.translations/lb.json @@ -17,6 +17,5 @@ "title": "Z-Wave konfigur\u00e9ieren" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/nl.json b/homeassistant/components/zwave/.translations/nl.json index db03b4af231f..12781109edeb 100644 --- a/homeassistant/components/zwave/.translations/nl.json +++ b/homeassistant/components/zwave/.translations/nl.json @@ -17,6 +17,5 @@ "title": "Stel Z-Wave in" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/nn.json b/homeassistant/components/zwave/.translations/nn.json index 98d65a2d2433..ebd9d44796c7 100644 --- a/homeassistant/components/zwave/.translations/nn.json +++ b/homeassistant/components/zwave/.translations/nn.json @@ -5,6 +5,5 @@ "description": "Sj\u00e5 [www.home-assistant.io/docs/z-wave/installation/](https://www.home-assistant.io/docs/z-wave/installation/) for informasjon om konfigurasjonsvariablene." } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/no.json b/homeassistant/components/zwave/.translations/no.json index bc890e9715cf..bbb03d853b63 100644 --- a/homeassistant/components/zwave/.translations/no.json +++ b/homeassistant/components/zwave/.translations/no.json @@ -17,6 +17,5 @@ "title": "Sett opp Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pl.json b/homeassistant/components/zwave/.translations/pl.json index de31220ac5cb..9f2252f4f87f 100644 --- a/homeassistant/components/zwave/.translations/pl.json +++ b/homeassistant/components/zwave/.translations/pl.json @@ -17,6 +17,5 @@ "title": "Konfiguracja Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pt-BR.json b/homeassistant/components/zwave/.translations/pt-BR.json index b069a5f0f83a..3a467eee1297 100644 --- a/homeassistant/components/zwave/.translations/pt-BR.json +++ b/homeassistant/components/zwave/.translations/pt-BR.json @@ -17,6 +17,5 @@ "title": "Configurar o Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/pt.json b/homeassistant/components/zwave/.translations/pt.json index 4b82173125a7..1e8aa31b627b 100644 --- a/homeassistant/components/zwave/.translations/pt.json +++ b/homeassistant/components/zwave/.translations/pt.json @@ -17,6 +17,5 @@ "title": "Configurar o Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ro.json b/homeassistant/components/zwave/.translations/ro.json index 79f6b986252b..cf7d63007ffe 100644 --- a/homeassistant/components/zwave/.translations/ro.json +++ b/homeassistant/components/zwave/.translations/ro.json @@ -17,6 +17,5 @@ "title": "Configura\u021bi Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/ru.json b/homeassistant/components/zwave/.translations/ru.json index 50b4e4bc70ab..96b69da67e68 100644 --- a/homeassistant/components/zwave/.translations/ru.json +++ b/homeassistant/components/zwave/.translations/ru.json @@ -17,6 +17,5 @@ "title": "Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/sl.json b/homeassistant/components/zwave/.translations/sl.json index cb718668daaa..6b7545c183cd 100644 --- a/homeassistant/components/zwave/.translations/sl.json +++ b/homeassistant/components/zwave/.translations/sl.json @@ -17,6 +17,5 @@ "title": "Nastavite Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/sv.json b/homeassistant/components/zwave/.translations/sv.json index 9296127a38c7..251823db3dd7 100644 --- a/homeassistant/components/zwave/.translations/sv.json +++ b/homeassistant/components/zwave/.translations/sv.json @@ -17,6 +17,5 @@ "title": "St\u00e4lla in Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/zh-Hans.json b/homeassistant/components/zwave/.translations/zh-Hans.json index 929968941289..ab9995610df0 100644 --- a/homeassistant/components/zwave/.translations/zh-Hans.json +++ b/homeassistant/components/zwave/.translations/zh-Hans.json @@ -17,6 +17,5 @@ "title": "\u8bbe\u7f6e Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/homeassistant/components/zwave/.translations/zh-Hant.json b/homeassistant/components/zwave/.translations/zh-Hant.json index c7ef7f65875a..29719129e81a 100644 --- a/homeassistant/components/zwave/.translations/zh-Hant.json +++ b/homeassistant/components/zwave/.translations/zh-Hant.json @@ -17,6 +17,5 @@ "title": "\u8a2d\u5b9a Z-Wave" } } - }, - "title": "Z-Wave" + } } \ No newline at end of file diff --git a/script/translations/clean.py b/script/translations/clean.py index 57e23bee9dfb..805000b2e929 100644 --- a/script/translations/clean.py +++ b/script/translations/clean.py @@ -47,26 +47,26 @@ def run(): if not missing_keys: print("No missing translations!") - return + return 0 lokalise = get_api() - to_delete = [] + key_data = lokalise.keys_list( + {"filter_keys": ",".join(missing_keys), "limit": 1000} + ) + if len(key_data) != len(missing_keys): + print( + f"Lookin up key in Lokalise returns {len(key_data)} results, expected {len(missing_keys)}" + ) + return 1 + print(f"Deleting {len(missing_keys)} keys:") for key in missing_keys: - print("Processing", key) - key_data = lokalise.keys_list({"filter_keys": key}) - if len(key_data) != 1: - print( - f"Lookin up key in Lokalise returns {len(key_data)} results, expected 1" - ) - continue - to_delete.append(key_data[0]["key_id"]) - + print(" -", key) + print() while input("Type YES to delete these keys: ") != "YES": pass - print("Deleting keys:", ", ".join(map(str, to_delete))) - print(lokalise.keys_delete_multiple(to_delete)) + print(lokalise.keys_delete_multiple([key["key_id"] for key in key_data])) return 0 From ab352c3bc9e1353c1e4b3b9ed99d660b4ce0a4b4 Mon Sep 17 00:00:00 2001 From: Kit Klein <33464407+kit-klein@users.noreply.github.com> Date: Thu, 16 Apr 2020 17:08:50 -0400 Subject: [PATCH 450/653] Ensure konnected unsubscribes during entry unloads (#34291) --- homeassistant/components/konnected/__init__.py | 13 +++++++++++-- homeassistant/components/konnected/const.py | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/konnected/__init__.py b/homeassistant/components/konnected/__init__.py index ae50e14d40ae..56ab439aee37 100644 --- a/homeassistant/components/konnected/__init__.py +++ b/homeassistant/components/konnected/__init__.py @@ -58,6 +58,7 @@ from .const import ( PIN_TO_ZONE, STATE_HIGH, STATE_LOW, + UNDO_UPDATE_LISTENER, UPDATE_ENDPOINT, ZONE_TO_PIN, ZONES, @@ -254,7 +255,7 @@ async def async_setup(hass: HomeAssistant, config: dict): async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): """Set up panel from a config entry.""" client = AlarmPanel(hass, entry) - # create a data store in hass.data[DOMAIN][CONF_DEVICES] + # creates a panel data store in hass.data[DOMAIN][CONF_DEVICES] await client.async_save_data() try: @@ -267,7 +268,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, component) ) - entry.add_update_listener(async_entry_updated) + + # config entry specific data to enable unload + hass.data[DOMAIN][entry.entry_id] = { + UNDO_UPDATE_LISTENER: entry.add_update_listener(async_entry_updated) + } return True @@ -281,8 +286,12 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): ] ) ) + + hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENER]() + if unload_ok: hass.data[DOMAIN][CONF_DEVICES].pop(entry.data[CONF_ID]) + hass.data[DOMAIN].pop(entry.entry_id) return unload_ok diff --git a/homeassistant/components/konnected/const.py b/homeassistant/components/konnected/const.py index 7cb0ffc5f802..c1e7d6b6f269 100644 --- a/homeassistant/components/konnected/const.py +++ b/homeassistant/components/konnected/const.py @@ -47,3 +47,5 @@ ZONE_TO_PIN = {zone: pin for pin, zone in PIN_TO_ZONE.items()} ENDPOINT_ROOT = "/api/konnected" UPDATE_ENDPOINT = ENDPOINT_ROOT + r"/device/{device_id:[a-zA-Z0-9]+}" SIGNAL_DS18B20_NEW = "konnected.ds18b20.new" + +UNDO_UPDATE_LISTENER = "undo_update_listener" From ede432ba71a4a6b13ee7aa9eb20193ae5a28a777 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 16 Apr 2020 16:11:00 -0500 Subject: [PATCH 451/653] Improve Sonarr Upcoming Time Handling (#34224) --- CODEOWNERS | 1 + homeassistant/components/sonarr/manifest.json | 2 +- homeassistant/components/sonarr/sensor.py | 39 ++++++++----------- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index bdf3bbbbe523..070aafd42db2 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -352,6 +352,7 @@ homeassistant/components/solarlog/* @Ernst79 homeassistant/components/solax/* @squishykid homeassistant/components/soma/* @ratsept homeassistant/components/somfy/* @tetienne +homeassistant/components/sonarr/* @ctalkington homeassistant/components/songpal/* @rytilahti homeassistant/components/sonos/* @amelchio homeassistant/components/spaceapi/* @fabaff diff --git a/homeassistant/components/sonarr/manifest.json b/homeassistant/components/sonarr/manifest.json index 26a5c0095e40..2fe375fb1df6 100644 --- a/homeassistant/components/sonarr/manifest.json +++ b/homeassistant/components/sonarr/manifest.json @@ -2,5 +2,5 @@ "domain": "sonarr", "name": "Sonarr", "documentation": "https://www.home-assistant.io/integrations/sonarr", - "codeowners": [] + "codeowners": ["@ctalkington"] } diff --git a/homeassistant/components/sonarr/sensor.py b/homeassistant/components/sonarr/sensor.py index d7298b2abeb9..c0350353b4ca 100644 --- a/homeassistant/components/sonarr/sensor.py +++ b/homeassistant/components/sonarr/sensor.py @@ -1,9 +1,7 @@ """Support for Sonarr.""" -from datetime import datetime +from datetime import timedelta import logging -import time -from pytz import timezone import requests import voluptuous as vol @@ -27,6 +25,7 @@ from homeassistant.const import ( ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity +import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) @@ -93,13 +92,13 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Sonarr platform.""" conditions = config.get(CONF_MONITORED_CONDITIONS) - add_entities([SonarrSensor(hass, config, sensor) for sensor in conditions], True) + add_entities([SonarrSensor(config, sensor) for sensor in conditions], True) class SonarrSensor(Entity): """Implementation of the Sonarr sensor.""" - def __init__(self, hass, conf, sensor_type): + def __init__(self, conf, sensor_type): """Create Sonarr entity.""" self.conf = conf @@ -114,7 +113,6 @@ class SonarrSensor(Entity): self.ssl = "https" if conf.get(CONF_SSL) else "http" self._state = None self.data = [] - self._tz = timezone(str(hass.config.time_zone)) self.type = sensor_type self._name = SENSOR_TYPES[self.type][0] if self.type == "diskspace": @@ -150,6 +148,9 @@ class SonarrSensor(Entity): attributes = {} if self.type == "upcoming": for show in self.data: + if show["series"]["title"] in attributes: + continue + attributes[show["series"]["title"]] = "S{:02d}E{:02d}".format( show["seasonNumber"], show["episodeNumber"] ) @@ -205,12 +206,17 @@ class SonarrSensor(Entity): def update(self): """Update the data for the sensor.""" - start = get_date(self._tz) - end = get_date(self._tz, self.days) + start = dt_util.utcnow().replace(microsecond=0) + end = start + timedelta(days=self.days) try: res = requests.get( ENDPOINTS[self.type].format( - self.ssl, self.host, self.port, self.urlbase, start, end + self.ssl, + self.host, + self.port, + self.urlbase, + start.isoformat().replace("+00:00", "Z"), + end.isoformat().replace("+00:00", "Z"), ), headers={"X-Api-Key": self.apikey}, timeout=10, @@ -223,14 +229,7 @@ class SonarrSensor(Entity): if res.status_code == HTTP_OK: if self.type in ["upcoming", "queue", "series", "commands"]: - if self.days == 1 and self.type == "upcoming": - # Sonarr API returns an empty array if start and end dates - # are the same, so we need to filter to just today - self.data = list( - filter(lambda x: x["airDate"] == str(start), res.json()) - ) - else: - self.data = res.json() + self.data = res.json() self._state = len(self.data) elif self.type == "wanted": data = res.json() @@ -264,12 +263,6 @@ class SonarrSensor(Entity): self._available = True -def get_date(zone, offset=0): - """Get date based on timezone and offset of days.""" - day = 60 * 60 * 24 - return datetime.date(datetime.fromtimestamp(time.time() + day * offset, tz=zone)) - - def to_unit(value, unit): """Convert bytes to give unit.""" return value / 1024 ** BYTE_SIZES.index(unit) From 9d794b820a50f403b84b1e7f68f9be416904a3a9 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 16 Apr 2020 16:12:26 -0500 Subject: [PATCH 452/653] Improve IPP Config Flow (#34212) --- homeassistant/components/ipp/__init__.py | 12 ++++- homeassistant/components/ipp/config_flow.py | 53 +++++++++++++++------ homeassistant/components/ipp/const.py | 1 + homeassistant/components/ipp/sensor.py | 8 +++- tests/components/ipp/__init__.py | 2 +- tests/components/ipp/test_config_flow.py | 29 ++++++++--- 6 files changed, 79 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/ipp/__init__.py b/homeassistant/components/ipp/__init__.py index 81d77b27a3ec..5979caa37dbd 100644 --- a/homeassistant/components/ipp/__init__.py +++ b/homeassistant/components/ipp/__init__.py @@ -134,13 +134,18 @@ class IPPEntity(Entity): enabled_default: bool = True, ) -> None: """Initialize the IPP entity.""" + self._device_id = None self._enabled_default = enabled_default self._entry_id = entry_id self._icon = icon self._name = name - self._unsub_dispatcher = None self.coordinator = coordinator + if coordinator.data.info.uuid is not None: + self._device_id = coordinator.data.info.uuid + elif coordinator.data.info.serial is not None: + self._device_id = coordinator.data.info.serial + @property def name(self) -> str: """Return the name of the entity.""" @@ -179,8 +184,11 @@ class IPPEntity(Entity): @property def device_info(self) -> Dict[str, Any]: """Return device information about this IPP device.""" + if self._device_id is None: + return None + return { - ATTR_IDENTIFIERS: {(DOMAIN, self.coordinator.data.info.uuid)}, + ATTR_IDENTIFIERS: {(DOMAIN, self._device_id)}, ATTR_NAME: self.coordinator.data.info.name, ATTR_MANUFACTURER: self.coordinator.data.info.manufacturer, ATTR_MODEL: self.coordinator.data.info.model, diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index 32474881a870..7d1c3d1b1b80 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -24,7 +24,7 @@ from homeassistant.const import ( from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.typing import ConfigType, HomeAssistantType -from .const import CONF_BASE_PATH, CONF_UUID +from .const import CONF_BASE_PATH, CONF_SERIAL, CONF_UUID from .const import DOMAIN # pylint: disable=unused-import _LOGGER = logging.getLogger(__name__) @@ -47,7 +47,7 @@ async def validate_input(hass: HomeAssistantType, data: dict) -> Dict[str, Any]: printer = await ipp.printer() - return {CONF_UUID: printer.info.uuid} + return {CONF_SERIAL: printer.info.serial, CONF_UUID: printer.info.uuid} class IPPFlowHandler(ConfigFlow, domain=DOMAIN): @@ -83,20 +83,28 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): _LOGGER.debug("IPP Error", exc_info=True) return self.async_abort(reason="ipp_error") - user_input[CONF_UUID] = info[CONF_UUID] + unique_id = user_input[CONF_UUID] = info[CONF_UUID] - await self.async_set_unique_id(user_input[CONF_UUID]) + if unique_id is None and info[CONF_SERIAL] is not None: + _LOGGER.debug( + "Printer UUID is missing from IPP response. Falling back to IPP serial number" + ) + unique_id = info[CONF_SERIAL] + elif unique_id is None: + _LOGGER.debug("Unable to determine unique id from IPP response") + + await self.async_set_unique_id(unique_id) self._abort_if_unique_id_configured(updates={CONF_HOST: user_input[CONF_HOST]}) return self.async_create_entry(title=user_input[CONF_HOST], data=user_input) async def async_step_zeroconf(self, discovery_info: ConfigType) -> Dict[str, Any]: """Handle zeroconf discovery.""" - # Hostname is format: EPSON123456.local. - host = discovery_info["hostname"].rstrip(".") - port = discovery_info["port"] - name, _ = host.rsplit(".") - tls = discovery_info["type"] == "_ipps._tcp.local." + port = discovery_info[CONF_PORT] + zctype = discovery_info["type"] + name = discovery_info[CONF_NAME].replace(f".{zctype}", "") + tls = zctype == "_ipps._tcp.local." + base_path = discovery_info["properties"].get("rp", "ipp/print") # pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167 self.context.update({"title_placeholders": {"name": name}}) @@ -107,8 +115,7 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): CONF_PORT: port, CONF_SSL: tls, CONF_VERIFY_SSL: False, - CONF_BASE_PATH: "/" - + discovery_info["properties"].get("rp", "ipp/print"), + CONF_BASE_PATH: f"/{base_path}", CONF_NAME: name, CONF_UUID: discovery_info["properties"].get("UUID"), } @@ -130,12 +137,28 @@ class IPPFlowHandler(ConfigFlow, domain=DOMAIN): _LOGGER.debug("IPP Error", exc_info=True) return self.async_abort(reason="ipp_error") - if info[CONF_UUID] is not None: - self.discovery_info[CONF_UUID] = info[CONF_UUID] + unique_id = self.discovery_info[CONF_UUID] + if unique_id is None and info[CONF_UUID] is not None: + _LOGGER.debug( + "Printer UUID is missing from discovery info. Falling back to IPP UUID" + ) + unique_id = self.discovery_info[CONF_UUID] = info[CONF_UUID] + elif unique_id is None and info[CONF_SERIAL] is not None: + _LOGGER.debug( + "Printer UUID is missing from discovery info and IPP response. Falling back to IPP serial number" + ) + unique_id = info[CONF_SERIAL] + elif unique_id is None: + _LOGGER.debug( + "Unable to determine unique id from discovery info and IPP response" + ) - await self.async_set_unique_id(self.discovery_info[CONF_UUID]) + await self.async_set_unique_id(unique_id) self._abort_if_unique_id_configured( - updates={CONF_HOST: self.discovery_info[CONF_HOST]} + updates={ + CONF_HOST: self.discovery_info[CONF_HOST], + CONF_NAME: self.discovery_info[CONF_NAME], + }, ) return await self.async_step_zeroconf_confirm() diff --git a/homeassistant/components/ipp/const.py b/homeassistant/components/ipp/const.py index 7caf60b7edd4..a5345f4145e0 100644 --- a/homeassistant/components/ipp/const.py +++ b/homeassistant/components/ipp/const.py @@ -21,5 +21,6 @@ ATTR_URI_SUPPORTED = "uri_supported" # Config Keys CONF_BASE_PATH = "base_path" +CONF_SERIAL = "serial" CONF_TLS = "tls" CONF_UUID = "uuid" diff --git a/homeassistant/components/ipp/sensor.py b/homeassistant/components/ipp/sensor.py index fd278d3df2ef..5c29be09d94e 100644 --- a/homeassistant/components/ipp/sensor.py +++ b/homeassistant/components/ipp/sensor.py @@ -60,6 +60,12 @@ class IPPSensor(IPPEntity): """Initialize IPP sensor.""" self._unit_of_measurement = unit_of_measurement self._key = key + self._unique_id = None + + if coordinator.data.info.uuid is not None: + self._unique_id = f"{coordinator.data.info.uuid}_{key}" + elif coordinator.data.info.serial is not None: + self._unique_id = f"{coordinator.data.info.serial}_{key}" super().__init__( entry_id=entry_id, @@ -72,7 +78,7 @@ class IPPSensor(IPPEntity): @property def unique_id(self) -> str: """Return the unique ID for this sensor.""" - return f"{self.coordinator.data.info.uuid}_{self._key}" + return self._unique_id @property def unit_of_measurement(self) -> str: diff --git a/tests/components/ipp/__init__.py b/tests/components/ipp/__init__.py index 1c52c557024b..a8c793244945 100644 --- a/tests/components/ipp/__init__.py +++ b/tests/components/ipp/__init__.py @@ -21,7 +21,7 @@ ATTR_PROPERTIES = "properties" IPP_ZEROCONF_SERVICE_TYPE = "_ipp._tcp.local." IPPS_ZEROCONF_SERVICE_TYPE = "_ipps._tcp.local." -ZEROCONF_NAME = "EPSON123456" +ZEROCONF_NAME = "EPSON XP-6000 Series" ZEROCONF_HOST = "192.168.1.31" ZEROCONF_HOSTNAME = "EPSON123456.local." ZEROCONF_PORT = 631 diff --git a/tests/components/ipp/test_config_flow.py b/tests/components/ipp/test_config_flow.py index 5229881fbf40..fb75ba9caefc 100644 --- a/tests/components/ipp/test_config_flow.py +++ b/tests/components/ipp/test_config_flow.py @@ -50,7 +50,7 @@ async def test_show_zeroconf_form( assert result["step_id"] == "zeroconf_confirm" assert result["type"] == RESULT_TYPE_FORM - assert result["description_placeholders"] == {CONF_NAME: "EPSON123456"} + assert result["description_placeholders"] == {CONF_NAME: "EPSON XP-6000 Series"} async def test_connection_error( @@ -276,8 +276,13 @@ async def test_zeroconf_with_uuid_device_exists_abort( """Test we abort zeroconf flow if printer already configured.""" await init_integration(hass, aioclient_mock) - discovery_info = MOCK_ZEROCONF_IPP_SERVICE_INFO.copy() - discovery_info["properties"]["UUID"] = "cfe92100-67c4-11d4-a45f-f8d027761251" + discovery_info = { + **MOCK_ZEROCONF_IPP_SERVICE_INFO, + "properties": { + **MOCK_ZEROCONF_IPP_SERVICE_INFO["properties"], + "UUID": "cfe92100-67c4-11d4-a45f-f8d027761251", + }, + } result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info, ) @@ -315,6 +320,9 @@ async def test_full_user_flow_implementation( assert result["data"][CONF_HOST] == "192.168.1.31" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" + assert result["result"] + assert result["result"].unique_id == "cfe92100-67c4-11d4-a45f-f8d027761251" + async def test_full_zeroconf_flow_implementation( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker @@ -339,13 +347,17 @@ async def test_full_zeroconf_flow_implementation( ) assert result["type"] == RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "EPSON123456" + assert result["title"] == "EPSON XP-6000 Series" assert result["data"] assert result["data"][CONF_HOST] == "192.168.1.31" + assert result["data"][CONF_NAME] == "EPSON XP-6000 Series" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" assert not result["data"][CONF_SSL] + assert result["result"] + assert result["result"].unique_id == "cfe92100-67c4-11d4-a45f-f8d027761251" + async def test_full_zeroconf_tls_flow_implementation( hass: HomeAssistant, aioclient_mock: AiohttpClientMocker @@ -364,17 +376,20 @@ async def test_full_zeroconf_tls_flow_implementation( assert result["step_id"] == "zeroconf_confirm" assert result["type"] == RESULT_TYPE_FORM - assert result["description_placeholders"] == {CONF_NAME: "EPSON123456"} + assert result["description_placeholders"] == {CONF_NAME: "EPSON XP-6000 Series"} result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={} ) assert result["type"] == RESULT_TYPE_CREATE_ENTRY - assert result["title"] == "EPSON123456" + assert result["title"] == "EPSON XP-6000 Series" assert result["data"] assert result["data"][CONF_HOST] == "192.168.1.31" - assert result["data"][CONF_NAME] == "EPSON123456" + assert result["data"][CONF_NAME] == "EPSON XP-6000 Series" assert result["data"][CONF_UUID] == "cfe92100-67c4-11d4-a45f-f8d027761251" assert result["data"][CONF_SSL] + + assert result["result"] + assert result["result"].unique_id == "cfe92100-67c4-11d4-a45f-f8d027761251" From 5dcac36b78cf69b83955c4068016c371a5273008 Mon Sep 17 00:00:00 2001 From: Save me Date: Thu, 16 Apr 2020 23:14:57 +0200 Subject: [PATCH 453/653] Add Friends of Hue Switch - Model FOHSWITCH (ZGPSWITCH) (#34195) --- .../components/hue/.translations/en.json | 8 +++++-- .../components/hue/device_trigger.py | 23 ++++++++++++++++++- homeassistant/components/hue/strings.json | 6 ++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/hue/.translations/en.json b/homeassistant/components/hue/.translations/en.json index e250da7627ff..c80074459e55 100644 --- a/homeassistant/components/hue/.translations/en.json +++ b/homeassistant/components/hue/.translations/en.json @@ -33,6 +33,8 @@ "button_2": "Second button", "button_3": "Third button", "button_4": "Fourth button", + "double_buttons_1_3": "First and Third buttons", + "double_buttons_2_4": "Second and Fourth buttons", "dim_down": "Dim down", "dim_up": "Dim up", "turn_off": "Turn off", @@ -41,7 +43,9 @@ "trigger_type": { "remote_button_long_release": "\"{subtype}\" button released after long press", "remote_button_short_press": "\"{subtype}\" button pressed", - "remote_button_short_release": "\"{subtype}\" button released" + "remote_button_short_release": "\"{subtype}\" button released", + "remote_double_button_long_press": "Both \"{subtype}\" released after long press", + "remote_double_button_short_press": "Both \"{subtype}\" released" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/hue/device_trigger.py b/homeassistant/components/hue/device_trigger.py index 818776547467..0c90c29f4c75 100644 --- a/homeassistant/components/hue/device_trigger.py +++ b/homeassistant/components/hue/device_trigger.py @@ -26,6 +26,8 @@ CONF_SUBTYPE = "subtype" CONF_SHORT_PRESS = "remote_button_short_press" CONF_SHORT_RELEASE = "remote_button_short_release" CONF_LONG_RELEASE = "remote_button_long_release" +CONF_DOUBLE_SHORT_RELEASE = "remote_double_button_short_press" +CONF_DOUBLE_LONG_RELEASE = "remote_double_button_long_press" CONF_TURN_ON = "turn_on" CONF_TURN_OFF = "turn_off" @@ -35,7 +37,8 @@ CONF_BUTTON_1 = "button_1" CONF_BUTTON_2 = "button_2" CONF_BUTTON_3 = "button_3" CONF_BUTTON_4 = "button_4" - +CONF_DOUBLE_BUTTON_1 = "double_buttons_1_3" +CONF_DOUBLE_BUTTON_2 = "double_buttons_2_4" HUE_DIMMER_REMOTE_MODEL = "Hue dimmer switch" # RWL020/021 HUE_DIMMER_REMOTE = { @@ -57,9 +60,27 @@ HUE_TAP_REMOTE = { (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 18}, } +HUE_FOHSWITCH_REMOTE_MODEL = "Friends of Hue Switch" # ZGPSWITCH +HUE_FOHSWITCH_REMOTE = { + (CONF_SHORT_PRESS, CONF_BUTTON_1): {CONF_EVENT: 20}, + (CONF_LONG_RELEASE, CONF_BUTTON_1): {CONF_EVENT: 16}, + (CONF_SHORT_PRESS, CONF_BUTTON_2): {CONF_EVENT: 21}, + (CONF_LONG_RELEASE, CONF_BUTTON_2): {CONF_EVENT: 17}, + (CONF_SHORT_PRESS, CONF_BUTTON_3): {CONF_EVENT: 23}, + (CONF_LONG_RELEASE, CONF_BUTTON_3): {CONF_EVENT: 19}, + (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 22}, + (CONF_LONG_RELEASE, CONF_BUTTON_4): {CONF_EVENT: 18}, + (CONF_DOUBLE_SHORT_RELEASE, CONF_DOUBLE_BUTTON_1): {CONF_EVENT: 101}, + (CONF_DOUBLE_LONG_RELEASE, CONF_DOUBLE_BUTTON_1): {CONF_EVENT: 100}, + (CONF_DOUBLE_SHORT_RELEASE, CONF_DOUBLE_BUTTON_2): {CONF_EVENT: 99}, + (CONF_DOUBLE_LONG_RELEASE, CONF_DOUBLE_BUTTON_2): {CONF_EVENT: 98}, +} + + REMOTES = { HUE_DIMMER_REMOTE_MODEL: HUE_DIMMER_REMOTE, HUE_TAP_REMOTE_MODEL: HUE_TAP_REMOTE, + HUE_FOHSWITCH_REMOTE_MODEL: HUE_FOHSWITCH_REMOTE, } TRIGGER_SCHEMA = TRIGGER_BASE_SCHEMA.extend( diff --git a/homeassistant/components/hue/strings.json b/homeassistant/components/hue/strings.json index 498a96058337..c912e9f7f0da 100644 --- a/homeassistant/components/hue/strings.json +++ b/homeassistant/components/hue/strings.json @@ -33,6 +33,8 @@ "button_2": "Second button", "button_3": "Third button", "button_4": "Fourth button", + "double_buttons_1_3": "First and Third buttons", + "double_buttons_2_4": "Second and Fourth buttons", "dim_down": "Dim down", "dim_up": "Dim up", "turn_off": "Turn off", @@ -41,7 +43,9 @@ "trigger_type": { "remote_button_long_release": "\"{subtype}\" button released after long press", "remote_button_short_press": "\"{subtype}\" button pressed", - "remote_button_short_release": "\"{subtype}\" button released" + "remote_button_short_release": "\"{subtype}\" button released", + "remote_double_button_long_press": "Both \"{subtype}\" released after long press", + "remote_double_button_short_press": "Both \"{subtype}\" released" } } } From 8825561a993374038dad30d2877c35fa4b6e3e5e Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 16 Apr 2020 17:52:43 -0400 Subject: [PATCH 454/653] Refactor vizio media_player tests to remove conditional statements from helper function (#33615) --- tests/components/vizio/test_media_player.py | 363 +++++++++++--------- 1 file changed, 204 insertions(+), 159 deletions(-) diff --git a/tests/components/vizio/test_media_player.py b/tests/components/vizio/test_media_player.py index 7678712db515..1f6abf105637 100644 --- a/tests/components/vizio/test_media_player.py +++ b/tests/components/vizio/test_media_player.py @@ -1,7 +1,8 @@ """Tests for Vizio config flow.""" +from contextlib import asynccontextmanager from datetime import timedelta import logging -from typing import Any, Dict, Optional +from typing import Any, Dict, List, Optional from unittest.mock import call from asynctest import patch @@ -44,14 +45,7 @@ from homeassistant.components.vizio.const import ( DOMAIN, VIZIO_SCHEMA, ) -from homeassistant.const import ( - ATTR_ENTITY_ID, - CONF_EXCLUDE, - CONF_INCLUDE, - STATE_OFF, - STATE_ON, - STATE_UNAVAILABLE, -) +from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, STATE_UNAVAILABLE from homeassistant.helpers.typing import HomeAssistantType from homeassistant.util import dt as dt_util @@ -85,154 +79,161 @@ from tests.common import MockConfigEntry, async_fire_time_changed _LOGGER = logging.getLogger(__name__) -async def _test_setup( - hass: HomeAssistantType, ha_device_class: str, vizio_power_state: Optional[bool] +async def _add_config_entry_to_hass( + hass: HomeAssistantType, config_entry: MockConfigEntry ) -> None: - """Test Vizio Device entity setup.""" + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + +def _get_ha_power_state(vizio_power_state: Optional[bool]) -> str: + """Return HA power state given Vizio power state.""" if vizio_power_state: - ha_power_state = STATE_ON - elif vizio_power_state is False: - ha_power_state = STATE_OFF - else: - ha_power_state = STATE_UNAVAILABLE + return STATE_ON - if ha_device_class == DEVICE_CLASS_SPEAKER: - vizio_device_class = VIZIO_DEVICE_CLASS_SPEAKER - config_entry = MockConfigEntry( - domain=DOMAIN, - data=vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG), - unique_id=UNIQUE_ID, - ) - dict_to_return = { - "volume": int(MAX_VOLUME[vizio_device_class] / 2), - "mute": "Off", - "eq": CURRENT_EQ, - } - else: - vizio_device_class = VIZIO_DEVICE_CLASS_TV - config_entry = MockConfigEntry( - domain=DOMAIN, - data=vol.Schema(VIZIO_SCHEMA)(MOCK_USER_VALID_TV_CONFIG), - unique_id=UNIQUE_ID, - ) - dict_to_return = { - "volume": int(MAX_VOLUME[vizio_device_class] / 2), - "mute": "Off", - } + if vizio_power_state is False: + return STATE_OFF + return STATE_UNAVAILABLE + + +def _assert_sources_and_volume(attr: Dict[str, Any], vizio_device_class: str) -> None: + """Assert source list, source, and volume level based on attr dict and device class.""" + assert attr["source_list"] == INPUT_LIST + assert attr["source"] == CURRENT_INPUT + assert ( + attr["volume_level"] + == float(int(MAX_VOLUME[vizio_device_class] / 2)) + / MAX_VOLUME[vizio_device_class] + ) + + +def _get_attr_and_assert_base_attr( + hass: HomeAssistantType, device_class: str, power_state: str +) -> Dict[str, Any]: + """Return entity attributes after asserting name, device class, and power state.""" + attr = hass.states.get(ENTITY_ID).attributes + assert attr["friendly_name"] == NAME + assert attr["device_class"] == device_class + + assert hass.states.get(ENTITY_ID).state == power_state + return attr + + +@asynccontextmanager +async def _cm_for_test_setup_without_apps( + all_settings: Dict[str, Any], vizio_power_state: Optional[bool] +) -> None: + """Context manager to setup test for Vizio devices without including app specific patches.""" with patch( "homeassistant.components.vizio.media_player.VizioAsync.get_all_settings", - return_value=dict_to_return, + return_value=all_settings, ), patch( "homeassistant.components.vizio.media_player.VizioAsync.get_setting_options", return_value=EQ_LIST, ), patch( "homeassistant.components.vizio.media_player.VizioAsync.get_power_state", return_value=vizio_power_state, - ), patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_current_app_config", - ) as service_call: - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + ): + yield - attr = hass.states.get(ENTITY_ID).attributes - assert attr["friendly_name"] == NAME - assert attr["device_class"] == ha_device_class - assert hass.states.get(ENTITY_ID).state == ha_power_state +async def _test_setup_tv( + hass: HomeAssistantType, vizio_power_state: Optional[bool] +) -> None: + """Test Vizio TV entity setup.""" + ha_power_state = _get_ha_power_state(vizio_power_state) + + config_entry = MockConfigEntry( + domain=DOMAIN, + data=vol.Schema(VIZIO_SCHEMA)(MOCK_USER_VALID_TV_CONFIG), + unique_id=UNIQUE_ID, + ) + + async with _cm_for_test_setup_without_apps( + {"volume": int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2), "mute": "Off"}, + vizio_power_state, + ): + await _add_config_entry_to_hass(hass, config_entry) + + attr = _get_attr_and_assert_base_attr(hass, DEVICE_CLASS_TV, ha_power_state) if ha_power_state == STATE_ON: - assert attr["source_list"] == INPUT_LIST - assert attr["source"] == CURRENT_INPUT - if ha_device_class == DEVICE_CLASS_SPEAKER: + _assert_sources_and_volume(attr, VIZIO_DEVICE_CLASS_TV) + assert "sound_mode" not in attr + + +async def _test_setup_speaker( + hass: HomeAssistantType, vizio_power_state: Optional[bool] +) -> None: + """Test Vizio Speaker entity setup.""" + ha_power_state = _get_ha_power_state(vizio_power_state) + + config_entry = MockConfigEntry( + domain=DOMAIN, + data=vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG), + unique_id=UNIQUE_ID, + ) + + async with _cm_for_test_setup_without_apps( + { + "volume": int(MAX_VOLUME[VIZIO_DEVICE_CLASS_SPEAKER] / 2), + "mute": "Off", + "eq": CURRENT_EQ, + }, + vizio_power_state, + ): + with patch( + "homeassistant.components.vizio.media_player.VizioAsync.get_current_app_config", + ) as service_call: + await _add_config_entry_to_hass(hass, config_entry) + + attr = _get_attr_and_assert_base_attr( + hass, DEVICE_CLASS_SPEAKER, ha_power_state + ) + if ha_power_state == STATE_ON: + _assert_sources_and_volume(attr, VIZIO_DEVICE_CLASS_SPEAKER) assert not service_call.called assert "sound_mode" in attr - else: - assert "sound_mode" not in attr - assert ( - attr["volume_level"] - == float(int(MAX_VOLUME[vizio_device_class] / 2)) - / MAX_VOLUME[vizio_device_class] - ) -async def _test_setup_with_apps( - hass: HomeAssistantType, - device_config: Dict[str, Any], - app: Optional[str], - app_config: Dict[str, Any], +@asynccontextmanager +async def _cm_for_test_setup_tv_with_apps( + hass: HomeAssistantType, device_config: Dict[str, Any], app_config: Dict[str, Any] ) -> None: - """Test Vizio Device with apps entity setup.""" + """Context manager to setup test for Vizio TV with support for apps.""" config_entry = MockConfigEntry( domain=DOMAIN, data=vol.Schema(VIZIO_SCHEMA)(device_config), unique_id=UNIQUE_ID ) - with patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_all_settings", - return_value={ - "volume": int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2), - "mute": "Off", - }, - ), patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_power_state", - return_value=True, - ), patch( - "homeassistant.components.vizio.media_player.VizioAsync.get_current_app_config", - return_value=AppConfig(**app_config), + async with _cm_for_test_setup_without_apps( + {"volume": int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2), "mute": "Off"}, True, ): - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + with patch( + "homeassistant.components.vizio.media_player.VizioAsync.get_current_app_config", + return_value=AppConfig(**app_config), + ): + await _add_config_entry_to_hass(hass, config_entry) - attr = hass.states.get(ENTITY_ID).attributes - assert attr["friendly_name"] == NAME - assert attr["device_class"] == DEVICE_CLASS_TV - assert hass.states.get(ENTITY_ID).state == STATE_ON - - if device_config.get(CONF_APPS, {}).get(CONF_INCLUDE) or device_config.get( - CONF_APPS, {} - ).get(CONF_EXCLUDE): - list_to_test = list(INPUT_LIST_WITH_APPS + [CURRENT_APP]) - elif device_config.get(CONF_APPS, {}).get(CONF_ADDITIONAL_CONFIGS): - list_to_test = list( - INPUT_LIST_WITH_APPS - + APP_LIST - + [ - app["name"] - for app in device_config[CONF_APPS][CONF_ADDITIONAL_CONFIGS] - if app["name"] not in APP_LIST - ] + attr = _get_attr_and_assert_base_attr(hass, DEVICE_CLASS_TV, STATE_ON) + assert ( + attr["volume_level"] + == float(int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2)) + / MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] ) - else: - list_to_test = list(INPUT_LIST_WITH_APPS + APP_LIST) - if CONF_ADDITIONAL_CONFIGS in device_config.get(CONF_APPS, {}): - assert attr["source_list"].count(CURRENT_APP) == 1 + yield - for app_to_remove in INPUT_APPS: - if app_to_remove in list_to_test: - list_to_test.remove(app_to_remove) - assert attr["source_list"] == list_to_test +def _assert_source_list_with_apps( + list_to_test: List[str], attr: Dict[str, Any] +) -> None: + """Assert source list matches list_to_test after removing INPUT_APPS from list.""" + for app_to_remove in INPUT_APPS: + if app_to_remove in list_to_test: + list_to_test.remove(app_to_remove) - if app: - assert app in attr["source_list"] or app == UNKNOWN_APP - assert attr["source"] == app - assert attr["app_name"] == app - if app == UNKNOWN_APP: - assert attr["app_id"] == app_config - else: - assert "app_id" not in attr - else: - assert attr["source"] == "CAST" - assert "app_id" not in attr - assert "app_name" not in attr - - assert ( - attr["volume_level"] - == float(int(MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] / 2)) - / MAX_VOLUME[VIZIO_DEVICE_CLASS_TV] - ) + assert attr["source_list"] == list_to_test async def _test_setup_failure(hass: HomeAssistantType, config: str) -> None: @@ -242,9 +243,7 @@ async def _test_setup_failure(hass: HomeAssistantType, config: str) -> None: return_value=False, ): config_entry = MockConfigEntry(domain=DOMAIN, data=config, unique_id=UNIQUE_ID) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + await _add_config_entry_to_hass(hass, config_entry) assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 0 @@ -279,7 +278,7 @@ async def test_speaker_on( vizio_update: pytest.fixture, ) -> None: """Test Vizio Speaker entity setup when on.""" - await _test_setup(hass, DEVICE_CLASS_SPEAKER, True) + await _test_setup_speaker(hass, True) async def test_speaker_off( @@ -288,7 +287,7 @@ async def test_speaker_off( vizio_update: pytest.fixture, ) -> None: """Test Vizio Speaker entity setup when off.""" - await _test_setup(hass, DEVICE_CLASS_SPEAKER, False) + await _test_setup_speaker(hass, False) async def test_speaker_unavailable( @@ -297,7 +296,7 @@ async def test_speaker_unavailable( vizio_update: pytest.fixture, ) -> None: """Test Vizio Speaker entity setup when unavailable.""" - await _test_setup(hass, DEVICE_CLASS_SPEAKER, None) + await _test_setup_speaker(hass, None) async def test_init_tv_on( @@ -306,7 +305,7 @@ async def test_init_tv_on( vizio_update: pytest.fixture, ) -> None: """Test Vizio TV entity setup when on.""" - await _test_setup(hass, DEVICE_CLASS_TV, True) + await _test_setup_tv(hass, True) async def test_init_tv_off( @@ -315,7 +314,7 @@ async def test_init_tv_off( vizio_update: pytest.fixture, ) -> None: """Test Vizio TV entity setup when off.""" - await _test_setup(hass, DEVICE_CLASS_TV, False) + await _test_setup_tv(hass, False) async def test_init_tv_unavailable( @@ -324,7 +323,7 @@ async def test_init_tv_unavailable( vizio_update: pytest.fixture, ) -> None: """Test Vizio TV entity setup when unavailable.""" - await _test_setup(hass, DEVICE_CLASS_TV, None) + await _test_setup_tv(hass, None) async def test_setup_failure_speaker( @@ -347,7 +346,7 @@ async def test_services( vizio_update: pytest.fixture, ) -> None: """Test all Vizio media player entity services.""" - await _test_setup(hass, DEVICE_CLASS_TV, True) + await _test_setup_tv(hass, True) await _test_service(hass, "pow_on", SERVICE_TURN_ON, None) await _test_service(hass, "pow_off", SERVICE_TURN_OFF, None) @@ -381,7 +380,7 @@ async def test_options_update( vizio_update: pytest.fixture, ) -> None: """Test when config entry update event fires.""" - await _test_setup(hass, DEVICE_CLASS_SPEAKER, True) + await _test_setup_speaker(hass, True) config_entry = hass.config_entries.async_entries(DOMAIN)[0] assert config_entry.options new_options = config_entry.options.copy() @@ -405,7 +404,7 @@ async def _test_update_availability_switch( # Setup device as if time is right now with patch("homeassistant.util.dt.utcnow", return_value=now): - await _test_setup(hass, DEVICE_CLASS_SPEAKER, initial_power_state) + await _test_setup_speaker(hass, initial_power_state) # Clear captured logs so that only availability state changes are captured for # future assertion @@ -464,9 +463,16 @@ async def test_setup_with_apps( caplog: pytest.fixture, ) -> None: """Test device setup with apps.""" - await _test_setup_with_apps( - hass, MOCK_USER_VALID_TV_CONFIG, CURRENT_APP, CURRENT_APP_CONFIG - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_USER_VALID_TV_CONFIG, CURRENT_APP_CONFIG + ): + attr = hass.states.get(ENTITY_ID).attributes + _assert_source_list_with_apps(list(INPUT_LIST_WITH_APPS + APP_LIST), attr) + assert CURRENT_APP in attr["source_list"] + assert attr["source"] == CURRENT_APP + assert attr["app_name"] == CURRENT_APP + assert "app_id" not in attr + await _test_service( hass, "launch_app", @@ -483,9 +489,15 @@ async def test_setup_with_apps_include( caplog: pytest.fixture, ) -> None: """Test device setup with apps and apps["include"] in config.""" - await _test_setup_with_apps( - hass, MOCK_TV_WITH_INCLUDE_CONFIG, CURRENT_APP, CURRENT_APP_CONFIG - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_TV_WITH_INCLUDE_CONFIG, CURRENT_APP_CONFIG + ): + attr = hass.states.get(ENTITY_ID).attributes + _assert_source_list_with_apps(list(INPUT_LIST_WITH_APPS + [CURRENT_APP]), attr) + assert CURRENT_APP in attr["source_list"] + assert attr["source"] == CURRENT_APP + assert attr["app_name"] == CURRENT_APP + assert "app_id" not in attr async def test_setup_with_apps_exclude( @@ -495,9 +507,15 @@ async def test_setup_with_apps_exclude( caplog: pytest.fixture, ) -> None: """Test device setup with apps and apps["exclude"] in config.""" - await _test_setup_with_apps( - hass, MOCK_TV_WITH_EXCLUDE_CONFIG, CURRENT_APP, CURRENT_APP_CONFIG - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_TV_WITH_EXCLUDE_CONFIG, CURRENT_APP_CONFIG + ): + attr = hass.states.get(ENTITY_ID).attributes + _assert_source_list_with_apps(list(INPUT_LIST_WITH_APPS + [CURRENT_APP]), attr) + assert CURRENT_APP in attr["source_list"] + assert attr["source"] == CURRENT_APP + assert attr["app_name"] == CURRENT_APP + assert "app_id" not in attr async def test_setup_with_apps_additional_apps_config( @@ -507,12 +525,29 @@ async def test_setup_with_apps_additional_apps_config( caplog: pytest.fixture, ) -> None: """Test device setup with apps and apps["additional_configs"] in config.""" - await _test_setup_with_apps( - hass, - MOCK_TV_WITH_ADDITIONAL_APPS_CONFIG, - ADDITIONAL_APP_CONFIG["name"], - ADDITIONAL_APP_CONFIG["config"], - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_TV_WITH_ADDITIONAL_APPS_CONFIG, ADDITIONAL_APP_CONFIG["config"], + ): + attr = hass.states.get(ENTITY_ID).attributes + assert attr["source_list"].count(CURRENT_APP) == 1 + _assert_source_list_with_apps( + list( + INPUT_LIST_WITH_APPS + + APP_LIST + + [ + app["name"] + for app in MOCK_TV_WITH_ADDITIONAL_APPS_CONFIG[CONF_APPS][ + CONF_ADDITIONAL_CONFIGS + ] + if app["name"] not in APP_LIST + ] + ), + attr, + ) + assert ADDITIONAL_APP_CONFIG["name"] in attr["source_list"] + assert attr["source"] == ADDITIONAL_APP_CONFIG["name"] + assert attr["app_name"] == ADDITIONAL_APP_CONFIG["name"] + assert "app_id" not in attr await _test_service( hass, @@ -561,9 +596,14 @@ async def test_setup_with_unknown_app_config( caplog: pytest.fixture, ) -> None: """Test device setup with apps where app config returned is unknown.""" - await _test_setup_with_apps( - hass, MOCK_USER_VALID_TV_CONFIG, UNKNOWN_APP, UNKNOWN_APP_CONFIG - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_USER_VALID_TV_CONFIG, UNKNOWN_APP_CONFIG + ): + attr = hass.states.get(ENTITY_ID).attributes + _assert_source_list_with_apps(list(INPUT_LIST_WITH_APPS + APP_LIST), attr) + assert attr["source"] == UNKNOWN_APP + assert attr["app_name"] == UNKNOWN_APP + assert attr["app_id"] == UNKNOWN_APP_CONFIG async def test_setup_with_no_running_app( @@ -573,6 +613,11 @@ async def test_setup_with_no_running_app( caplog: pytest.fixture, ) -> None: """Test device setup with apps where no app is running.""" - await _test_setup_with_apps( - hass, MOCK_USER_VALID_TV_CONFIG, None, vars(AppConfig()) - ) + async with _cm_for_test_setup_tv_with_apps( + hass, MOCK_USER_VALID_TV_CONFIG, vars(AppConfig()) + ): + attr = hass.states.get(ENTITY_ID).attributes + _assert_source_list_with_apps(list(INPUT_LIST_WITH_APPS + APP_LIST), attr) + assert attr["source"] == "CAST" + assert "app_id" not in attr + assert "app_name" not in attr From ca67fd9faaef454ee0e455417e8effc3b35c20d4 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 16 Apr 2020 17:53:34 -0400 Subject: [PATCH 455/653] Skip ignored hosts when checking existing config entries in config flow (#34280) --- homeassistant/components/vizio/config_flow.py | 20 ++++- tests/components/vizio/test_config_flow.py | 73 ++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/vizio/config_flow.py b/homeassistant/components/vizio/config_flow.py index 51f00ad98bbf..eac6df85f437 100644 --- a/homeassistant/components/vizio/config_flow.py +++ b/homeassistant/components/vizio/config_flow.py @@ -8,7 +8,12 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.components.media_player import DEVICE_CLASS_SPEAKER, DEVICE_CLASS_TV -from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_ZEROCONF, ConfigEntry +from homeassistant.config_entries import ( + SOURCE_IGNORE, + SOURCE_IMPORT, + SOURCE_ZEROCONF, + ConfigEntry, +) from homeassistant.const import ( CONF_ACCESS_TOKEN, CONF_DEVICE_CLASS, @@ -198,8 +203,13 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): # Check if new config entry matches any existing config entries for entry in self.hass.config_entries.async_entries(DOMAIN): + # If source is ignore bypass host and name check and continue through loop + if entry.source == SOURCE_IGNORE: + continue + if _host_is_same(entry.data[CONF_HOST], user_input[CONF_HOST]): errors[CONF_HOST] = "host_exists" + if entry.data[CONF_NAME] == user_input[CONF_NAME]: errors[CONF_NAME] = "name_exists" @@ -270,6 +280,10 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Import a config entry from configuration.yaml.""" # Check if new config entry matches any existing config entries for entry in self.hass.config_entries.async_entries(DOMAIN): + # If source is ignore bypass host check and continue through loop + if entry.source == SOURCE_IGNORE: + continue + if _host_is_same(entry.data[CONF_HOST], import_config[CONF_HOST]): updated_options = {} updated_data = {} @@ -334,6 +348,10 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): # Check if new config entry matches any existing config entries and abort if so for entry in self.hass.config_entries.async_entries(DOMAIN): + # If source is ignore bypass host check and continue through loop + if entry.source == SOURCE_IGNORE: + continue + if _host_is_same(entry.data[CONF_HOST], discovery_info[CONF_HOST]): return self.async_abort(reason="already_setup") diff --git a/tests/components/vizio/test_config_flow.py b/tests/components/vizio/test_config_flow.py index b5b10534759f..3cb22a225417 100644 --- a/tests/components/vizio/test_config_flow.py +++ b/tests/components/vizio/test_config_flow.py @@ -17,7 +17,12 @@ from homeassistant.components.vizio.const import ( DOMAIN, VIZIO_SCHEMA, ) -from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER, SOURCE_ZEROCONF +from homeassistant.config_entries import ( + SOURCE_IGNORE, + SOURCE_IMPORT, + SOURCE_USER, + SOURCE_ZEROCONF, +) from homeassistant.const import ( CONF_ACCESS_TOKEN, CONF_DEVICE_CLASS, @@ -383,6 +388,26 @@ async def test_user_invalid_pin( assert result["errors"] == {CONF_PIN: "complete_pairing_failed"} +async def test_user_ignore( + hass: HomeAssistantType, + vizio_connect: pytest.fixture, + vizio_bypass_setup: pytest.fixture, +) -> None: + """Test user config flow doesn't throw an error when there's an existing ignored source.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=MOCK_SPEAKER_CONFIG, + options={CONF_VOLUME_STEP: VOLUME_STEP}, + source=SOURCE_IGNORE, + ) + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=MOCK_SPEAKER_CONFIG + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + + async def test_import_flow_minimum_fields( hass: HomeAssistantType, vizio_connect: pytest.fixture, @@ -679,6 +704,29 @@ async def test_import_error( assert len(vizio_log_list) == 1 +async def test_import_ignore( + hass: HomeAssistantType, + vizio_connect: pytest.fixture, + vizio_bypass_setup: pytest.fixture, +) -> None: + """Test import config flow doesn't throw an error when there's an existing ignored source.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=MOCK_SPEAKER_CONFIG, + options={CONF_VOLUME_STEP: VOLUME_STEP}, + source=SOURCE_IGNORE, + ) + entry.add_to_hass(hass) + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_IMPORT}, + data=vol.Schema(VIZIO_SCHEMA)(MOCK_SPEAKER_CONFIG), + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + + async def test_zeroconf_flow( hass: HomeAssistantType, vizio_connect: pytest.fixture, @@ -756,3 +804,26 @@ async def test_zeroconf_dupe_fail( # Flow should abort because device is already setup assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "already_in_progress" + + +async def test_zeroconf_ignore( + hass: HomeAssistantType, + vizio_connect: pytest.fixture, + vizio_bypass_setup: pytest.fixture, + vizio_guess_device_type: pytest.fixture, +) -> None: + """Test zeroconf discovery doesn't throw an error when there's an existing ignored source.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=MOCK_SPEAKER_CONFIG, + options={CONF_VOLUME_STEP: VOLUME_STEP}, + source=SOURCE_IGNORE, + ) + entry.add_to_hass(hass) + + discovery_info = MOCK_ZEROCONF_SERVICE_INFO.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM From 8bd0fca751ad30ebfa0191e4e368b735d856529a Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Thu, 16 Apr 2020 23:54:39 +0200 Subject: [PATCH 456/653] Pass an argument to kef.update_dsp for async_track_time_interval (#34310) --- homeassistant/components/kef/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/kef/media_player.py b/homeassistant/components/kef/media_player.py index 14e6e6b406f0..d888b30a3b93 100644 --- a/homeassistant/components/kef/media_player.py +++ b/homeassistant/components/kef/media_player.py @@ -357,7 +357,7 @@ class KefMediaPlayer(MediaPlayerDevice): """Send next track command.""" await self._speaker.next_track() - async def update_dsp(self) -> None: + async def update_dsp(self, _=None) -> None: """Update the DSP settings.""" if self._speaker_type == "LS50" and self._state == STATE_OFF: # The LSX is able to respond when off the LS50 has to be on. From abae48c287a0dd0dfee8c94bbf895f268dd04ba2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 16 Apr 2020 16:59:30 -0500 Subject: [PATCH 457/653] Use config entry id for unique id if serial number is missing (#34154) --- homeassistant/components/nut/__init__.py | 7 ++++- tests/components/nut/test_sensor.py | 40 +++++++++++++----------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/homeassistant/components/nut/__init__.py b/homeassistant/components/nut/__init__.py index b98522feb4e2..99563ca65d43 100644 --- a/homeassistant/components/nut/__init__.py +++ b/homeassistant/components/nut/__init__.py @@ -83,10 +83,15 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): undo_listener = entry.add_update_listener(_async_update_listener) + unique_id = _unique_id_from_status(status) + + if unique_id is None: + unique_id = entry.entry_id + hass.data[DOMAIN][entry.entry_id] = { COORDINATOR: coordinator, PYNUT_DATA: data, - PYNUT_UNIQUE_ID: _unique_id_from_status(status), + PYNUT_UNIQUE_ID: unique_id, PYNUT_MANUFACTURER: _manufacturer_from_status(status), PYNUT_MODEL: _model_from_status(status), PYNUT_FIRMWARE: _firmware_from_status(status), diff --git a/tests/components/nut/test_sensor.py b/tests/components/nut/test_sensor.py index 645855389484..0c6887288b96 100644 --- a/tests/components/nut/test_sensor.py +++ b/tests/components/nut/test_sensor.py @@ -33,11 +33,12 @@ async def test_pr3000rt2u(hass): async def test_cp1350c(hass): """Test creation of CP1350C sensors.""" - await async_init_integration(hass, "CP1350C", ["battery.charge"]) + config_entry = await async_init_integration(hass, "CP1350C", ["battery.charge"]) + registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -58,11 +59,11 @@ async def test_cp1350c(hass): async def test_5e850i(hass): """Test creation of 5E850I sensors.""" - await async_init_integration(hass, "5E850I", ["battery.charge"]) + config_entry = await async_init_integration(hass, "5E850I", ["battery.charge"]) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -83,11 +84,11 @@ async def test_5e850i(hass): async def test_5e650i(hass): """Test creation of 5E650I sensors.""" - await async_init_integration(hass, "5E650I", ["battery.charge"]) + config_entry = await async_init_integration(hass, "5E650I", ["battery.charge"]) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -111,7 +112,6 @@ async def test_backupsses600m1(hass): await async_init_integration(hass, "BACKUPSES600M1", ["battery.charge"]) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry assert entry assert ( entry.unique_id @@ -137,11 +137,13 @@ async def test_backupsses600m1(hass): async def test_cp1500pfclcd(hass): """Test creation of CP1500PFCLCD sensors.""" - await async_init_integration(hass, "CP1500PFCLCD", ["battery.charge"]) + config_entry = await async_init_integration( + hass, "CP1500PFCLCD", ["battery.charge"] + ) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -162,11 +164,11 @@ async def test_cp1500pfclcd(hass): async def test_dl650elcd(hass): """Test creation of DL650ELCD sensors.""" - await async_init_integration(hass, "DL650ELCD", ["battery.charge"]) + config_entry = await async_init_integration(hass, "DL650ELCD", ["battery.charge"]) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" @@ -187,11 +189,11 @@ async def test_dl650elcd(hass): async def test_blazer_usb(hass): """Test creation of blazer_usb sensors.""" - await async_init_integration(hass, "blazer_usb", ["battery.charge"]) + config_entry = await async_init_integration(hass, "blazer_usb", ["battery.charge"]) registry = await hass.helpers.entity_registry.async_get_registry() entry = registry.async_get("sensor.ups1_battery_charge") - # No unique id, no registry entry - assert not entry + assert entry + assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" state = hass.states.get("sensor.ups1_battery_charge") assert state.state == "100" From 374fe478094d1fad0e533bf6e3f09bb2ce2104bc Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 17 Apr 2020 00:08:53 +0200 Subject: [PATCH 458/653] UniFi - Support automatic removal of clients (#34307) --- homeassistant/components/unifi/controller.py | 29 +++++++++--- .../components/unifi/device_tracker.py | 41 +++++++++++------ homeassistant/components/unifi/manifest.json | 10 ++--- homeassistant/components/unifi/sensor.py | 36 +++++++++++---- homeassistant/components/unifi/switch.py | 36 +++++++++++---- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/unifi/test_controller.py | 3 +- tests/components/unifi/test_device_tracker.py | 33 +++++++++++++- tests/components/unifi/test_sensor.py | 44 +++++++++++++++++++ tests/components/unifi/test_switch.py | 37 ++++++++++++++++ 11 files changed, 227 insertions(+), 46 deletions(-) diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index 864d131d287f..3f4944fafa9f 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -5,7 +5,14 @@ import ssl from aiohttp import CookieJar import aiounifi -from aiounifi.controller import SIGNAL_CONNECTION_STATE +from aiounifi.controller import ( + DATA_CLIENT, + DATA_CLIENT_REMOVED, + DATA_DEVICE, + DATA_EVENT, + SIGNAL_CONNECTION_STATE, + SIGNAL_DATA, +) from aiounifi.events import WIRELESS_CLIENT_CONNECTED, WIRELESS_GUEST_CONNECTED from aiounifi.websocket import STATE_DISCONNECTED, STATE_RUNNING import async_timeout @@ -161,16 +168,23 @@ class UniFiController: if not self.available: self.hass.loop.call_later(RETRY_TIMER, self.reconnect) - elif signal == "new_data" and data: - if "event" in data: - if data["event"].event in ( + elif signal == SIGNAL_DATA and data: + + if DATA_EVENT in data: + if data[DATA_EVENT].event in ( WIRELESS_CLIENT_CONNECTED, WIRELESS_GUEST_CONNECTED, ): self.update_wireless_clients() - elif "clients" in data or "devices" in data: + + elif DATA_CLIENT in data or DATA_DEVICE in data: async_dispatcher_send(self.hass, self.signal_update) + elif DATA_CLIENT_REMOVED in data: + async_dispatcher_send( + self.hass, self.signal_remove, data[DATA_CLIENT_REMOVED] + ) + @property def signal_reachable(self) -> str: """Integration specific event to signal a change in connection status.""" @@ -181,6 +195,11 @@ class UniFiController: """Event specific per UniFi entry to signal new data.""" return f"unifi-update-{self.controller_id}" + @property + def signal_remove(self): + """Event specific per UniFi entry to signal removal of entities.""" + return f"unifi-remove-{self.controller_id}" + @property def signal_options_update(self): """Event specific per UniFi entry to signal new options.""" diff --git a/homeassistant/components/unifi/device_tracker.py b/homeassistant/components/unifi/device_tracker.py index c5aa74706a1c..3f2eaf698b94 100644 --- a/homeassistant/components/unifi/device_tracker.py +++ b/homeassistant/components/unifi/device_tracker.py @@ -49,10 +49,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities): option_track_wired_clients = controller.option_track_wired_clients option_ssid_filter = controller.option_ssid_filter - registry = await hass.helpers.entity_registry.async_get_registry() + entity_registry = await hass.helpers.entity_registry.async_get_registry() # Restore clients that is not a part of active clients list. - for entity in registry.entities.values(): + for entity in entity_registry.entities.values(): if ( entity.config_entry_id == config_entry.entry_id @@ -69,7 +69,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): controller.api.clients.process_raw([client.raw]) @callback - def update_controller(): + def items_added(): """Update the values of the controller.""" nonlocal option_track_clients nonlocal option_track_devices @@ -80,7 +80,16 @@ async def async_setup_entry(hass, config_entry, async_add_entities): add_entities(controller, async_add_entities, tracked) controller.listeners.append( - async_dispatcher_connect(hass, controller.signal_update, update_controller) + async_dispatcher_connect(hass, controller.signal_update, items_added) + ) + + @callback + def items_removed(mac_addresses: set) -> None: + """Items have been removed from the controller.""" + remove_entities(controller, mac_addresses, tracked, entity_registry) + + controller.listeners.append( + async_dispatcher_connect(hass, controller.signal_remove, items_removed) ) @callback @@ -136,16 +145,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities): option_track_devices = controller.option_track_devices option_track_wired_clients = controller.option_track_wired_clients - for mac in remove: - entity = tracked.pop(mac) - - if registry.async_is_registered(entity.entity_id): - registry.async_remove(entity.entity_id) - - hass.async_create_task(entity.async_remove()) + remove_entities(controller, remove, tracked, entity_registry) if update: - update_controller() + items_added() controller.listeners.append( async_dispatcher_connect( @@ -153,7 +156,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) ) - update_controller() + items_added() @callback @@ -193,6 +196,18 @@ def add_entities(controller, async_add_entities, tracked): async_add_entities(new_tracked) +@callback +def remove_entities(controller, mac_addresses, tracked, entity_registry): + """Remove select tracked entities.""" + for mac in mac_addresses: + + if mac not in tracked: + continue + + entity = tracked.pop(mac) + controller.hass.async_create_task(entity.async_remove()) + + class UniFiClientTracker(UniFiClient, ScannerEntity): """Representation of a network client.""" diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index a58bcd6fa7aa..0a5ba84cdb3c 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,11 +3,7 @@ "name": "Ubiquiti UniFi", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": [ - "aiounifi==17" - ], - "codeowners": [ - "@kane610" - ], + "requirements": ["aiounifi==18"], + "codeowners": ["@kane610"], "quality_scale": "platinum" -} \ No newline at end of file +} diff --git a/homeassistant/components/unifi/sensor.py b/homeassistant/components/unifi/sensor.py index 2e82ecb4f6f8..2777d21cac7a 100644 --- a/homeassistant/components/unifi/sensor.py +++ b/homeassistant/components/unifi/sensor.py @@ -25,7 +25,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): entity_registry = await hass.helpers.entity_registry.async_get_registry() @callback - def update_controller(): + def items_added(): """Update the values of the controller.""" nonlocal option_allow_bandwidth_sensors @@ -35,7 +35,16 @@ async def async_setup_entry(hass, config_entry, async_add_entities): add_entities(controller, async_add_entities, sensors) controller.listeners.append( - async_dispatcher_connect(hass, controller.signal_update, update_controller) + async_dispatcher_connect(hass, controller.signal_update, items_added) + ) + + @callback + def items_removed(mac_addresses: set) -> None: + """Items have been removed from the controller.""" + remove_entities(controller, mac_addresses, sensors, entity_registry) + + controller.listeners.append( + async_dispatcher_connect(hass, controller.signal_remove, items_removed) ) @callback @@ -47,14 +56,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities): option_allow_bandwidth_sensors = controller.option_allow_bandwidth_sensors if option_allow_bandwidth_sensors: - update_controller() + items_added() else: for sensor in sensors.values(): - - if entity_registry.async_is_registered(sensor.entity_id): - entity_registry.async_remove(sensor.entity_id) - hass.async_create_task(sensor.async_remove()) sensors.clear() @@ -65,7 +70,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) ) - update_controller() + items_added() @callback @@ -92,6 +97,21 @@ def add_entities(controller, async_add_entities, sensors): async_add_entities(new_sensors) +@callback +def remove_entities(controller, mac_addresses, sensors, entity_registry): + """Remove select sensor entities.""" + for mac in mac_addresses: + + for direction in ("rx", "tx"): + item_id = f"{direction}-{mac}" + + if item_id not in sensors: + continue + + entity = sensors.pop(item_id) + controller.hass.async_create_task(entity.async_remove()) + + class UniFiRxBandwidthSensor(UniFiClient): """Receiving bandwidth sensor.""" diff --git a/homeassistant/components/unifi/switch.py b/homeassistant/components/unifi/switch.py index 0547e35f064b..a0b7d865a1b0 100644 --- a/homeassistant/components/unifi/switch.py +++ b/homeassistant/components/unifi/switch.py @@ -55,12 +55,21 @@ async def async_setup_entry(hass, config_entry, async_add_entities): continue @callback - def update_controller(): + def items_added(): """Update the values of the controller.""" add_entities(controller, async_add_entities, switches, switches_off) controller.listeners.append( - async_dispatcher_connect(hass, controller.signal_update, update_controller) + async_dispatcher_connect(hass, controller.signal_update, items_added) + ) + + @callback + def items_removed(mac_addresses: set) -> None: + """Items have been removed from the controller.""" + remove_entities(controller, mac_addresses, switches, entity_registry) + + controller.listeners.append( + async_dispatcher_connect(hass, controller.signal_remove, items_removed) ) @callback @@ -96,14 +105,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities): for client_id in remove: entity = switches.pop(client_id) - - if entity_registry.async_is_registered(entity.entity_id): - entity_registry.async_remove(entity.entity_id) - hass.async_create_task(entity.async_remove()) if len(update) != len(option_block_clients): - update_controller() + items_added() controller.listeners.append( async_dispatcher_connect( @@ -111,7 +116,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) ) - update_controller() + items_added() switches_off.clear() @@ -189,6 +194,21 @@ def add_entities(controller, async_add_entities, switches, switches_off): async_add_entities(new_switches) +@callback +def remove_entities(controller, mac_addresses, switches, entity_registry): + """Remove select switch entities.""" + for mac in mac_addresses: + + for switch_type in ("block", "poe"): + item_id = f"{switch_type}-{mac}" + + if item_id not in switches: + continue + + entity = switches.pop(item_id) + controller.hass.async_create_task(entity.async_remove()) + + class UniFiPOEClientSwitch(UniFiClient, SwitchDevice, RestoreEntity): """Representation of a client that uses POE.""" diff --git a/requirements_all.txt b/requirements_all.txt index 7cd4accf59ed..ce58b1780c86 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -211,7 +211,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==17 +aiounifi==18 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 92351e401082..789c23f21def 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -94,7 +94,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==17 +aiounifi==18 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/tests/components/unifi/test_controller.py b/tests/components/unifi/test_controller.py index ad334f848ba7..d78947f31345 100644 --- a/tests/components/unifi/test_controller.py +++ b/tests/components/unifi/test_controller.py @@ -177,6 +177,7 @@ async def test_controller_setup(hass): assert controller.mac is None assert controller.signal_update == "unifi-update-1.2.3.4-site_id" + assert controller.signal_remove == "unifi-remove-1.2.3.4-site_id" assert controller.signal_options_update == "unifi-options-1.2.3.4-site_id" @@ -206,7 +207,7 @@ async def test_reset_after_successful_setup(hass): """Calling reset when the entry has been setup.""" controller = await setup_unifi_integration(hass) - assert len(controller.listeners) == 6 + assert len(controller.listeners) == 9 result = await controller.async_reset() await hass.async_block_till_done() diff --git a/tests/components/unifi/test_device_tracker.py b/tests/components/unifi/test_device_tracker.py index cfb4637a6c4f..84085f8711a2 100644 --- a/tests/components/unifi/test_device_tracker.py +++ b/tests/components/unifi/test_device_tracker.py @@ -2,8 +2,8 @@ from copy import copy from datetime import timedelta -from aiounifi.controller import SIGNAL_CONNECTION_STATE -from aiounifi.websocket import STATE_DISCONNECTED, STATE_RUNNING +from aiounifi.controller import MESSAGE_CLIENT_REMOVED, SIGNAL_CONNECTION_STATE +from aiounifi.websocket import SIGNAL_DATA, STATE_DISCONNECTED, STATE_RUNNING from asynctest import patch from homeassistant import config_entries @@ -180,6 +180,35 @@ async def test_tracked_devices(hass): assert device_1.state == STATE_UNAVAILABLE +async def test_remove_clients(hass): + """Test the remove_items function with some clients.""" + controller = await setup_unifi_integration( + hass, clients_response=[CLIENT_1, CLIENT_2] + ) + assert len(hass.states.async_entity_ids("device_tracker")) == 2 + + client_1 = hass.states.get("device_tracker.client_1") + assert client_1 is not None + + wired_client = hass.states.get("device_tracker.wired_client") + assert wired_client is not None + + controller.api.websocket._data = { + "meta": {"message": MESSAGE_CLIENT_REMOVED}, + "data": [CLIENT_1], + } + controller.api.session_handler(SIGNAL_DATA) + await hass.async_block_till_done() + + assert len(hass.states.async_entity_ids("device_tracker")) == 1 + + client_1 = hass.states.get("device_tracker.client_1") + assert client_1 is None + + wired_client = hass.states.get("device_tracker.wired_client") + assert wired_client is not None + + async def test_controller_state_change(hass): """Verify entities state reflect on controller becoming unavailable.""" controller = await setup_unifi_integration( diff --git a/tests/components/unifi/test_sensor.py b/tests/components/unifi/test_sensor.py index 91531a9ee38f..3c8014742355 100644 --- a/tests/components/unifi/test_sensor.py +++ b/tests/components/unifi/test_sensor.py @@ -1,6 +1,9 @@ """UniFi sensor platform tests.""" from copy import deepcopy +from aiounifi.controller import MESSAGE_CLIENT_REMOVED +from aiounifi.websocket import SIGNAL_DATA + from homeassistant.components import unifi import homeassistant.components.sensor as sensor from homeassistant.setup import async_setup_component @@ -123,3 +126,44 @@ async def test_sensors(hass): wireless_client_tx = hass.states.get("sensor.wireless_client_name_tx") assert wireless_client_tx.state == "6789.0" + + +async def test_remove_sensors(hass): + """Test the remove_items function with some clients.""" + controller = await setup_unifi_integration( + hass, + options={unifi.const.CONF_ALLOW_BANDWIDTH_SENSORS: True}, + clients_response=CLIENTS, + ) + assert len(hass.states.async_entity_ids("sensor")) == 4 + assert len(hass.states.async_entity_ids("device_tracker")) == 2 + + wired_client_rx = hass.states.get("sensor.wired_client_name_rx") + assert wired_client_rx is not None + wired_client_tx = hass.states.get("sensor.wired_client_name_tx") + assert wired_client_tx is not None + + wireless_client_rx = hass.states.get("sensor.wireless_client_name_rx") + assert wireless_client_rx is not None + wireless_client_tx = hass.states.get("sensor.wireless_client_name_tx") + assert wireless_client_tx is not None + + controller.api.websocket._data = { + "meta": {"message": MESSAGE_CLIENT_REMOVED}, + "data": [CLIENTS[0]], + } + controller.api.session_handler(SIGNAL_DATA) + await hass.async_block_till_done() + + assert len(hass.states.async_entity_ids("sensor")) == 2 + assert len(hass.states.async_entity_ids("device_tracker")) == 1 + + wired_client_rx = hass.states.get("sensor.wired_client_name_rx") + assert wired_client_rx is None + wired_client_tx = hass.states.get("sensor.wired_client_name_tx") + assert wired_client_tx is None + + wireless_client_rx = hass.states.get("sensor.wireless_client_name_rx") + assert wireless_client_rx is not None + wireless_client_tx = hass.states.get("sensor.wireless_client_name_tx") + assert wireless_client_tx is not None diff --git a/tests/components/unifi/test_switch.py b/tests/components/unifi/test_switch.py index cc777b8ad7f0..5ea764727396 100644 --- a/tests/components/unifi/test_switch.py +++ b/tests/components/unifi/test_switch.py @@ -1,6 +1,9 @@ """UniFi POE control platform tests.""" from copy import deepcopy +from aiounifi.controller import MESSAGE_CLIENT_REMOVED +from aiounifi.websocket import SIGNAL_DATA + from homeassistant import config_entries from homeassistant.components import unifi import homeassistant.components.switch as switch @@ -173,6 +176,7 @@ BLOCKED = { "ip": "10.0.0.1", "is_guest": False, "is_wired": False, + "last_seen": 1562600145, "mac": "00:00:00:00:01:01", "name": "Block Client 1", "noted": True, @@ -184,6 +188,7 @@ UNBLOCKED = { "ip": "10.0.0.2", "is_guest": False, "is_wired": True, + "last_seen": 1562600145, "mac": "00:00:00:00:01:02", "name": "Block Client 2", "noted": True, @@ -300,6 +305,38 @@ async def test_switches(hass): } +async def test_remove_switches(hass): + """Test the update_items function with some clients.""" + controller = await setup_unifi_integration( + hass, + options={CONF_BLOCK_CLIENT: [UNBLOCKED["mac"]]}, + clients_response=[CLIENT_1, UNBLOCKED], + devices_response=[DEVICE_1], + ) + assert len(hass.states.async_entity_ids("switch")) == 2 + + poe_switch = hass.states.get("switch.poe_client_1") + assert poe_switch is not None + + block_switch = hass.states.get("switch.block_client_2") + assert block_switch is not None + + controller.api.websocket._data = { + "meta": {"message": MESSAGE_CLIENT_REMOVED}, + "data": [CLIENT_1, UNBLOCKED], + } + controller.api.session_handler(SIGNAL_DATA) + await hass.async_block_till_done() + + assert len(hass.states.async_entity_ids("switch")) == 0 + + poe_switch = hass.states.get("switch.poe_client_1") + assert poe_switch is None + + block_switch = hass.states.get("switch.block_client_2") + assert block_switch is None + + async def test_new_client_discovered_on_block_control(hass): """Test if 2nd update has a new client.""" controller = await setup_unifi_integration( From 6e2cf9663a67d356d489369403bbbe83fbd9aa0d Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 17 Apr 2020 00:11:36 +0200 Subject: [PATCH 459/653] Purge recorder database at night (#33646) --- homeassistant/components/recorder/__init__.py | 78 +++++++++---------- tests/components/recorder/test_init.py | 34 +++++++- tests/components/recorder/test_migrate.py | 5 +- 3 files changed, 71 insertions(+), 46 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index ad160a1ba8fe..cb5d1f4499fb 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -2,7 +2,7 @@ import asyncio from collections import namedtuple import concurrent.futures -from datetime import datetime, timedelta +from datetime import datetime import logging import queue import threading @@ -62,6 +62,7 @@ DEFAULT_DB_MAX_RETRIES = 10 DEFAULT_DB_RETRY_WAIT = 3 KEEPALIVE_TIME = 30 +CONF_AUTO_PURGE = "auto_purge" CONF_DB_URL = "db_url" CONF_DB_MAX_RETRIES = "db_max_retries" CONF_DB_RETRY_WAIT = "db_retry_wait" @@ -90,25 +91,29 @@ FILTER_SCHEMA = vol.Schema( CONFIG_SCHEMA = vol.Schema( { - vol.Optional(DOMAIN, default=dict): FILTER_SCHEMA.extend( - { - vol.Optional(CONF_PURGE_KEEP_DAYS, default=10): vol.All( - vol.Coerce(int), vol.Range(min=1) - ), - vol.Optional(CONF_PURGE_INTERVAL, default=1): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), - vol.Optional(CONF_DB_URL): cv.string, - vol.Optional(CONF_COMMIT_INTERVAL, default=1): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), - vol.Optional( - CONF_DB_MAX_RETRIES, default=DEFAULT_DB_MAX_RETRIES - ): cv.positive_int, - vol.Optional( - CONF_DB_RETRY_WAIT, default=DEFAULT_DB_RETRY_WAIT - ): cv.positive_int, - } + vol.Optional(DOMAIN, default=dict): vol.All( + cv.deprecated(CONF_PURGE_INTERVAL), + FILTER_SCHEMA.extend( + { + vol.Optional(CONF_AUTO_PURGE, default=True): cv.boolean, + vol.Optional(CONF_PURGE_KEEP_DAYS, default=10): vol.All( + vol.Coerce(int), vol.Range(min=1) + ), + vol.Optional(CONF_PURGE_INTERVAL, default=1): vol.All( + vol.Coerce(int), vol.Range(min=0) + ), + vol.Optional(CONF_DB_URL): cv.string, + vol.Optional(CONF_COMMIT_INTERVAL, default=1): vol.All( + vol.Coerce(int), vol.Range(min=0) + ), + vol.Optional( + CONF_DB_MAX_RETRIES, default=DEFAULT_DB_MAX_RETRIES + ): cv.positive_int, + vol.Optional( + CONF_DB_RETRY_WAIT, default=DEFAULT_DB_RETRY_WAIT + ): cv.positive_int, + } + ), ) }, extra=vol.ALLOW_EXTRA, @@ -143,8 +148,8 @@ def run_information(hass, point_in_time: Optional[datetime] = None): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the recorder.""" conf = config[DOMAIN] - keep_days = conf.get(CONF_PURGE_KEEP_DAYS) - purge_interval = conf.get(CONF_PURGE_INTERVAL) + auto_purge = conf[CONF_AUTO_PURGE] + keep_days = conf[CONF_PURGE_KEEP_DAYS] commit_interval = conf[CONF_COMMIT_INTERVAL] db_max_retries = conf[CONF_DB_MAX_RETRIES] db_retry_wait = conf[CONF_DB_RETRY_WAIT] @@ -157,8 +162,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: exclude = conf.get(CONF_EXCLUDE, {}) instance = hass.data[DATA_INSTANCE] = Recorder( hass=hass, + auto_purge=auto_purge, keep_days=keep_days, - purge_interval=purge_interval, commit_interval=commit_interval, uri=db_url, db_max_retries=db_max_retries, @@ -189,8 +194,8 @@ class Recorder(threading.Thread): def __init__( self, hass: HomeAssistant, + auto_purge: bool, keep_days: int, - purge_interval: int, commit_interval: int, uri: str, db_max_retries: int, @@ -202,8 +207,8 @@ class Recorder(threading.Thread): threading.Thread.__init__(self, name="Recorder") self.hass = hass + self.auto_purge = auto_purge self.keep_days = keep_days - self.purge_interval = purge_interval self.commit_interval = commit_interval self.queue: Any = queue.Queue() self.recording_start = dt_util.utcnow() @@ -314,28 +319,17 @@ class Recorder(threading.Thread): return # Start periodic purge - if self.keep_days and self.purge_interval: + if self.auto_purge: @callback def async_purge(now): - """Trigger the purge and schedule the next run.""" + """Trigger the purge.""" self.queue.put(PurgeTask(self.keep_days, repack=False)) - self.hass.helpers.event.async_track_point_in_time( - async_purge, now + timedelta(days=self.purge_interval) - ) - earliest = dt_util.utcnow() + timedelta(minutes=30) - run = latest = dt_util.utcnow() + timedelta(days=self.purge_interval) - with session_scope(session=self.get_session()) as session: - event = session.query(Events).first() - if event is not None: - session.expunge(event) - run = dt_util.as_utc(event.time_fired) + timedelta( - days=self.keep_days + self.purge_interval - ) - run = min(latest, max(run, earliest)) - - self.hass.helpers.event.track_point_in_time(async_purge, run) + # Purge every night at 4:12am + self.hass.helpers.event.track_time_change( + async_purge, hour=4, minute=12, second=0 + ) self.event_session = self.get_session() # Use a session for the event read loop diff --git a/tests/components/recorder/test_init.py b/tests/components/recorder/test_init.py index 6b826d8c29bb..34e0231d75ac 100644 --- a/tests/components/recorder/test_init.py +++ b/tests/components/recorder/test_init.py @@ -1,5 +1,6 @@ """The tests for the Recorder component.""" # pylint: disable=protected-access +from datetime import datetime, timedelta import unittest from unittest.mock import patch @@ -10,8 +11,9 @@ from homeassistant.components.recorder.const import DATA_INSTANCE from homeassistant.components.recorder.models import Events, States from homeassistant.components.recorder.util import session_scope from homeassistant.const import MATCH_ALL -from homeassistant.core import callback +from homeassistant.core import ATTR_NOW, EVENT_TIME_CHANGED, callback from homeassistant.setup import async_setup_component +from homeassistant.util import dt as dt_util from .common import wait_recording_done @@ -198,8 +200,8 @@ def test_recorder_setup_failure(): setup.side_effect = ImportError("driver not found") rec = Recorder( hass, + auto_purge=True, keep_days=7, - purge_interval=2, commit_interval=1, uri="sqlite://", db_max_retries=10, @@ -227,5 +229,31 @@ async def test_defaults_set(hass): assert await async_setup_component(hass, "history", {}) assert recorder_config is not None + assert recorder_config["auto_purge"] assert recorder_config["purge_keep_days"] == 10 - assert recorder_config["purge_interval"] == 1 + + +def test_auto_purge(hass_recorder): + """Test saving and restoring a state.""" + hass = hass_recorder() + + original_tz = dt_util.DEFAULT_TIME_ZONE + + tz = dt_util.get_time_zone("Europe/Copenhagen") + dt_util.set_default_time_zone(tz) + + test_time = tz.localize(datetime(2020, 1, 1, 4, 12, 0)) + + with patch( + "homeassistant.components.recorder.purge.purge_old_data" + ) as purge_old_data: + for delta in (-1, 0, 1): + hass.bus.fire( + EVENT_TIME_CHANGED, {ATTR_NOW: test_time + timedelta(seconds=delta)} + ) + hass.block_till_done() + hass.data[DATA_INSTANCE].block_till_done() + + assert len(purge_old_data.mock_calls) == 1 + + dt_util.set_default_time_zone(original_tz) diff --git a/tests/components/recorder/test_migrate.py b/tests/components/recorder/test_migrate.py index 7947ba5ccef0..d10dad43d751 100644 --- a/tests/components/recorder/test_migrate.py +++ b/tests/components/recorder/test_migrate.py @@ -26,7 +26,10 @@ async def test_schema_update_calls(hass): """Test that schema migrations occur in correct order.""" with patch( "homeassistant.components.recorder.create_engine", new=create_engine_test - ), patch("homeassistant.components.recorder.migration._apply_update") as update: + ), patch( + "homeassistant.components.recorder.migration._apply_update", + wraps=migration._apply_update, + ) as update: await async_setup_component( hass, "recorder", {"recorder": {"db_url": "sqlite://"}} ) From cd3fc7c76d533b6ce673b9d281776a583995468b Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 17 Apr 2020 00:16:18 +0200 Subject: [PATCH 460/653] Fixes for Sonos media titles (#34311) --- .../components/sonos/media_player.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 33ca62655520..634952dcfdcd 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -419,7 +419,7 @@ class SonosEntity(MediaPlayerDevice): if self._status in ("PAUSED_PLAYBACK", "STOPPED",): # Sonos can consider itself "paused" but without having media loaded # (happens if playing Spotify and via Spotify app you pick another device to play on) - if self._media_title is None: + if self.media_title is None: return STATE_IDLE return STATE_PAUSED if self._status in ("PLAYING", "TRANSITIONING"): @@ -614,12 +614,19 @@ class SonosEntity(MediaPlayerDevice): except (TypeError, KeyError, AttributeError): pass - # Radios without tagging can have part of the radio URI as title. - # Non-playing radios will not have a current title. In these cases we - # try to use the radio name instead. + # Non-playing radios will not have a current title. Radios without tagging + # can have part of the radio URI as title. In these cases we try to use the + # radio name instead. try: - if self._media_title in self._uri or self.state != STATE_PLAYING: - self._media_title = variables["enqueued_transport_uri_meta_data"].title + uri_meta_data = variables["enqueued_transport_uri_meta_data"] + if isinstance( + uri_meta_data, pysonos.data_structures.DidlAudioBroadcast + ) and ( + self.state != STATE_PLAYING + or self.soco.is_radio_uri(self._media_title) + or self._media_title in self._uri + ): + self._media_title = uri_meta_data.title except (TypeError, KeyError, AttributeError): pass From 97609576cb9918d250f451799a89c6491277c731 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 16 Apr 2020 17:18:41 -0500 Subject: [PATCH 461/653] Fix default elkm1 temp units (#34274) --- homeassistant/components/elkm1/__init__.py | 15 +++++++++++++-- homeassistant/components/elkm1/climate.py | 4 ++-- homeassistant/components/elkm1/config_flow.py | 6 +++++- homeassistant/components/elkm1/const.py | 3 +++ tests/components/elkm1/test_config_flow.py | 16 ++++++++-------- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py index 5c6fbf717388..946e40b7e236 100644 --- a/homeassistant/components/elkm1/__init__.py +++ b/homeassistant/components/elkm1/__init__.py @@ -15,6 +15,8 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_TEMPERATURE_UNIT, CONF_USERNAME, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, ) from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import ConfigEntryNotReady @@ -23,6 +25,8 @@ from homeassistant.helpers.entity import Entity from homeassistant.helpers.typing import ConfigType from .const import ( + BARE_TEMP_CELSIUS, + BARE_TEMP_FAHRENHEIT, CONF_AREA, CONF_AUTO_CONFIGURE, CONF_COUNTER, @@ -119,7 +123,10 @@ DEVICE_SCHEMA = vol.Schema( vol.Optional(CONF_USERNAME, default=""): cv.string, vol.Optional(CONF_PASSWORD, default=""): cv.string, vol.Optional(CONF_AUTO_CONFIGURE, default=False): cv.boolean, - vol.Optional(CONF_TEMPERATURE_UNIT, default="F"): cv.temperature_unit, + # cv.temperature_unit will mutate 'C' -> '°C' and 'F' -> '°F' + vol.Optional( + CONF_TEMPERATURE_UNIT, default=BARE_TEMP_FAHRENHEIT + ): cv.temperature_unit, vol.Optional(CONF_AREA, default={}): DEVICE_SCHEMA_SUBDOMAIN, vol.Optional(CONF_COUNTER, default={}): DEVICE_SCHEMA_SUBDOMAIN, vol.Optional(CONF_KEYPAD, default={}): DEVICE_SCHEMA_SUBDOMAIN, @@ -187,7 +194,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): _LOGGER.debug("Setting up elkm1 %s", conf["host"]) - config = {"temperature_unit": conf[CONF_TEMPERATURE_UNIT]} + temperature_unit = TEMP_FAHRENHEIT + if conf[CONF_TEMPERATURE_UNIT] in (BARE_TEMP_CELSIUS, TEMP_CELSIUS): + temperature_unit = TEMP_CELSIUS + + config = {"temperature_unit": temperature_unit} if not conf[CONF_AUTO_CONFIGURE]: # With elkm1-lib==0.7.16 and later auto configure is available diff --git a/homeassistant/components/elkm1/climate.py b/homeassistant/components/elkm1/climate.py index 3c5c70b2bd02..baaf3d44eb2e 100644 --- a/homeassistant/components/elkm1/climate.py +++ b/homeassistant/components/elkm1/climate.py @@ -14,7 +14,7 @@ from homeassistant.components.climate.const import ( SUPPORT_FAN_MODE, SUPPORT_TARGET_TEMPERATURE_RANGE, ) -from homeassistant.const import PRECISION_WHOLE, STATE_ON, TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.const import PRECISION_WHOLE, STATE_ON from . import ElkEntity, create_elk_entities from .const import DOMAIN @@ -55,7 +55,7 @@ class ElkThermostat(ElkEntity, ClimateDevice): @property def temperature_unit(self): """Return the temperature unit.""" - return TEMP_FAHRENHEIT if self._temperature_unit == "F" else TEMP_CELSIUS + return self._temperature_unit @property def current_temperature(self): diff --git a/homeassistant/components/elkm1/config_flow.py b/homeassistant/components/elkm1/config_flow.py index c96e6e549c05..419e4df75521 100644 --- a/homeassistant/components/elkm1/config_flow.py +++ b/homeassistant/components/elkm1/config_flow.py @@ -13,6 +13,8 @@ from homeassistant.const import ( CONF_PROTOCOL, CONF_TEMPERATURE_UNIT, CONF_USERNAME, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, ) from homeassistant.util import slugify @@ -33,7 +35,9 @@ DATA_SCHEMA = vol.Schema( vol.Optional(CONF_USERNAME, default=""): str, vol.Optional(CONF_PASSWORD, default=""): str, vol.Optional(CONF_PREFIX, default=""): str, - vol.Optional(CONF_TEMPERATURE_UNIT, default="F"): vol.In(["F", "C"]), + vol.Optional(CONF_TEMPERATURE_UNIT, default=TEMP_FAHRENHEIT): vol.In( + [TEMP_FAHRENHEIT, TEMP_CELSIUS] + ), } ) diff --git a/homeassistant/components/elkm1/const.py b/homeassistant/components/elkm1/const.py index 21cd6aaa97a3..27b6445a4c10 100644 --- a/homeassistant/components/elkm1/const.py +++ b/homeassistant/components/elkm1/const.py @@ -18,6 +18,9 @@ CONF_ZONE = "zone" CONF_PREFIX = "prefix" +BARE_TEMP_FAHRENHEIT = "F" +BARE_TEMP_CELSIUS = "C" + ELK_ELEMENTS = { CONF_AREA: Max.AREAS.value, CONF_COUNTER: Max.COUNTERS.value, diff --git a/tests/components/elkm1/test_config_flow.py b/tests/components/elkm1/test_config_flow.py index 02e3fd7fce9a..2f701a2e1469 100644 --- a/tests/components/elkm1/test_config_flow.py +++ b/tests/components/elkm1/test_config_flow.py @@ -39,7 +39,7 @@ async def test_form_user_with_secure_elk(hass): "address": "1.2.3.4", "username": "test-username", "password": "test-password", - "temperature_unit": "F", + "temperature_unit": "°F", "prefix": "", }, ) @@ -51,7 +51,7 @@ async def test_form_user_with_secure_elk(hass): "host": "elks://1.2.3.4", "password": "test-password", "prefix": "", - "temperature_unit": "F", + "temperature_unit": "°F", "username": "test-username", } await hass.async_block_till_done() @@ -82,7 +82,7 @@ async def test_form_user_with_non_secure_elk(hass): { "protocol": "non-secure", "address": "1.2.3.4", - "temperature_unit": "F", + "temperature_unit": "°F", "prefix": "guest_house", }, ) @@ -95,7 +95,7 @@ async def test_form_user_with_non_secure_elk(hass): "prefix": "guest_house", "username": "", "password": "", - "temperature_unit": "F", + "temperature_unit": "°F", } await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 @@ -125,7 +125,7 @@ async def test_form_user_with_serial_elk(hass): { "protocol": "serial", "address": "/dev/ttyS0:115200", - "temperature_unit": "F", + "temperature_unit": "°C", "prefix": "", }, ) @@ -138,7 +138,7 @@ async def test_form_user_with_serial_elk(hass): "prefix": "", "username": "", "password": "", - "temperature_unit": "F", + "temperature_unit": "°C", } await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 @@ -166,7 +166,7 @@ async def test_form_cannot_connect(hass): "address": "1.2.3.4", "username": "test-username", "password": "test-password", - "temperature_unit": "F", + "temperature_unit": "°F", "prefix": "", }, ) @@ -193,7 +193,7 @@ async def test_form_invalid_auth(hass): "address": "1.2.3.4", "username": "test-username", "password": "test-password", - "temperature_unit": "F", + "temperature_unit": "°F", "prefix": "", }, ) From b87b618c940ebdf01ddc48a0da3a69c5f45d7fc5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 16 Apr 2020 18:15:37 -0500 Subject: [PATCH 462/653] Resolve homekit not updating motion sensors (#34282) Co-Authored-By: Paulus Schoutsen --- .../components/homekit/type_sensors.py | 28 ++++++----- tests/components/homekit/test_type_sensors.py | 47 ++++++++++++++++++- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/homekit/type_sensors.py b/homeassistant/components/homekit/type_sensors.py index 78cb21bc88ac..5bdf9a07f04a 100644 --- a/homeassistant/components/homekit/type_sensors.py +++ b/homeassistant/components/homekit/type_sensors.py @@ -60,16 +60,16 @@ from .util import convert_to_float, density_to_air_quality, temperature_to_homek _LOGGER = logging.getLogger(__name__) BINARY_SENSOR_SERVICE_MAP = { - DEVICE_CLASS_CO2: (SERV_CARBON_DIOXIDE_SENSOR, CHAR_CARBON_DIOXIDE_DETECTED), - DEVICE_CLASS_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE), - DEVICE_CLASS_GARAGE_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE), - DEVICE_CLASS_GAS: (SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED), - DEVICE_CLASS_MOISTURE: (SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED), - DEVICE_CLASS_MOTION: (SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED), - DEVICE_CLASS_OCCUPANCY: (SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED), - DEVICE_CLASS_OPENING: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE), - DEVICE_CLASS_SMOKE: (SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED), - DEVICE_CLASS_WINDOW: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE), + DEVICE_CLASS_CO2: (SERV_CARBON_DIOXIDE_SENSOR, CHAR_CARBON_DIOXIDE_DETECTED, int), + DEVICE_CLASS_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int), + DEVICE_CLASS_GARAGE_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int), + DEVICE_CLASS_GAS: (SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED, int), + DEVICE_CLASS_MOISTURE: (SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED, int), + DEVICE_CLASS_MOTION: (SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED, bool), + DEVICE_CLASS_OCCUPANCY: (SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED, int), + DEVICE_CLASS_OPENING: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int), + DEVICE_CLASS_SMOKE: (SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED, int), + DEVICE_CLASS_WINDOW: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int), } @@ -274,8 +274,12 @@ class BinarySensor(HomeAccessory): else BINARY_SENSOR_SERVICE_MAP[DEVICE_CLASS_OCCUPANCY] ) + self.format = service_char[2] service = self.add_preload_service(service_char[0]) - self.char_detected = service.configure_char(service_char[1], value=0) + initial_value = False if self.format is bool else 0 + self.char_detected = service.configure_char( + service_char[1], value=initial_value + ) # Set the state so it is in sync on initial # GET to avoid an event storm after homekit startup self.update_state(state) @@ -283,7 +287,7 @@ class BinarySensor(HomeAccessory): def update_state(self, new_state): """Update accessory after state change.""" state = new_state.state - detected = state in (STATE_ON, STATE_HOME) + detected = self.format(state in (STATE_ON, STATE_HOME)) if self.char_detected.value != detected: self.char_detected.set_value(detected) _LOGGER.debug("%s: Set to %d", self.entity_id, detected) diff --git a/tests/components/homekit/test_type_sensors.py b/tests/components/homekit/test_type_sensors.py index b6bab174962d..8eb993ab6f70 100644 --- a/tests/components/homekit/test_type_sensors.py +++ b/tests/components/homekit/test_type_sensors.py @@ -1,6 +1,7 @@ """Test different accessory types: Sensors.""" from homeassistant.components.homekit import get_accessory from homeassistant.components.homekit.const import ( + DEVICE_CLASS_MOTION, PROP_CELSIUS, THRESHOLD_CO, THRESHOLD_CO2, @@ -256,11 +257,55 @@ async def test_binary(hass, hk_driver): assert acc.char_detected.value == 0 +async def test_motion_uses_bool(hass, hk_driver): + """Test if accessory is updated after state change.""" + entity_id = "binary_sensor.motion" + + hass.states.async_set( + entity_id, STATE_UNKNOWN, {ATTR_DEVICE_CLASS: DEVICE_CLASS_MOTION} + ) + await hass.async_block_till_done() + + acc = BinarySensor(hass, hk_driver, "Motion Sensor", entity_id, 2, None) + await acc.run_handler() + + assert acc.aid == 2 + assert acc.category == 10 # Sensor + + assert acc.char_detected.value is False + + hass.states.async_set(entity_id, STATE_ON, {ATTR_DEVICE_CLASS: DEVICE_CLASS_MOTION}) + await hass.async_block_till_done() + assert acc.char_detected.value is True + + hass.states.async_set( + entity_id, STATE_OFF, {ATTR_DEVICE_CLASS: DEVICE_CLASS_MOTION} + ) + await hass.async_block_till_done() + assert acc.char_detected.value is False + + hass.states.async_set( + entity_id, STATE_HOME, {ATTR_DEVICE_CLASS: DEVICE_CLASS_MOTION} + ) + await hass.async_block_till_done() + assert acc.char_detected.value is True + + hass.states.async_set( + entity_id, STATE_NOT_HOME, {ATTR_DEVICE_CLASS: DEVICE_CLASS_MOTION} + ) + await hass.async_block_till_done() + assert acc.char_detected.value is False + + hass.states.async_remove(entity_id) + await hass.async_block_till_done() + assert acc.char_detected.value is False + + async def test_binary_device_classes(hass, hk_driver): """Test if services and characteristics are assigned correctly.""" entity_id = "binary_sensor.demo" - for device_class, (service, char) in BINARY_SENSOR_SERVICE_MAP.items(): + for device_class, (service, char, _) in BINARY_SENSOR_SERVICE_MAP.items(): hass.states.async_set(entity_id, STATE_OFF, {ATTR_DEVICE_CLASS: device_class}) await hass.async_block_till_done() From c9cc024e9b8f6ba464a24fc03869abff98dc30c3 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 16 Apr 2020 19:16:35 -0400 Subject: [PATCH 463/653] Abort vizio zeroconf config flow if unique ID is already configured (#34313) --- homeassistant/components/vizio/config_flow.py | 1 + tests/components/vizio/const.py | 1 + tests/components/vizio/test_config_flow.py | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/homeassistant/components/vizio/config_flow.py b/homeassistant/components/vizio/config_flow.py index eac6df85f437..379f6c48ace0 100644 --- a/homeassistant/components/vizio/config_flow.py +++ b/homeassistant/components/vizio/config_flow.py @@ -341,6 +341,7 @@ class VizioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): await self.async_set_unique_id( unique_id=discovery_info[CONF_HOST].split(":")[0], raise_on_progress=True ) + self._abort_if_unique_id_configured() discovery_info[ CONF_HOST diff --git a/tests/components/vizio/const.py b/tests/components/vizio/const.py index e3d09977c1f0..43605de67ad0 100644 --- a/tests/components/vizio/const.py +++ b/tests/components/vizio/const.py @@ -177,6 +177,7 @@ MOCK_INCLUDE_APPS = { CONF_INCLUDE_OR_EXCLUDE: CONF_INCLUDE.title(), CONF_APPS_TO_INCLUDE_OR_EXCLUDE: [CURRENT_APP], } + MOCK_INCLUDE_NO_APPS = { CONF_INCLUDE_OR_EXCLUDE: CONF_INCLUDE.title(), CONF_APPS_TO_INCLUDE_OR_EXCLUDE: [], diff --git a/tests/components/vizio/test_config_flow.py b/tests/components/vizio/test_config_flow.py index 3cb22a225417..0c057ba1a714 100644 --- a/tests/components/vizio/test_config_flow.py +++ b/tests/components/vizio/test_config_flow.py @@ -51,6 +51,7 @@ from .const import ( NAME2, UNIQUE_ID, VOLUME_STEP, + ZEROCONF_HOST, ) from tests.common import MockConfigEntry @@ -827,3 +828,28 @@ async def test_zeroconf_ignore( ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + + +async def test_zeroconf_abort_when_ignored( + hass: HomeAssistantType, + vizio_connect: pytest.fixture, + vizio_bypass_setup: pytest.fixture, + vizio_guess_device_type: pytest.fixture, +) -> None: + """Test zeroconf discovery aborts when the same host has been ignored.""" + entry = MockConfigEntry( + domain=DOMAIN, + data=MOCK_SPEAKER_CONFIG, + options={CONF_VOLUME_STEP: VOLUME_STEP}, + source=SOURCE_IGNORE, + unique_id=ZEROCONF_HOST, + ) + entry.add_to_hass(hass) + + discovery_info = MOCK_ZEROCONF_SERVICE_INFO.copy() + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_ZEROCONF}, data=discovery_info + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "already_configured" From ff469cb59262d30fd2cb03755bb96164c45ecd1a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 16:44:14 -0700 Subject: [PATCH 464/653] Update Coordinator: Only schedule a refresh if listenerrs (#34317) --- homeassistant/helpers/update_coordinator.py | 3 ++- tests/helpers/test_update_coordinator.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/helpers/update_coordinator.py b/homeassistant/helpers/update_coordinator.py index d9a79d6555c1..7fb96fdf7c84 100644 --- a/homeassistant/helpers/update_coordinator.py +++ b/homeassistant/helpers/update_coordinator.py @@ -170,7 +170,8 @@ class DataUpdateCoordinator: self.name, monotonic() - start, ) - self._schedule_refresh() + if self._listeners: + self._schedule_refresh() for update_callback in self._listeners: update_callback() diff --git a/tests/helpers/test_update_coordinator.py b/tests/helpers/test_update_coordinator.py index 17caa1f74786..897367619ed4 100644 --- a/tests/helpers/test_update_coordinator.py +++ b/tests/helpers/test_update_coordinator.py @@ -41,6 +41,8 @@ async def test_async_refresh(crd): await crd.async_refresh() assert crd.data == 1 assert crd.last_update_success is True + # Make sure we didn't schedule a refresh because we have 0 listeners + assert crd._unsub_refresh is None updates = [] @@ -50,6 +52,7 @@ async def test_async_refresh(crd): unsub = crd.async_add_listener(update_callback) await crd.async_refresh() assert updates == [2] + assert crd._unsub_refresh is not None # Test unsubscribing through function unsub() From f757ca6b11512921475590b2051f031ee29452bb Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Fri, 17 Apr 2020 01:59:10 +0200 Subject: [PATCH 465/653] Update pyhomematic to 0.1.66 (#34314) --- homeassistant/components/homematic/manifest.json | 2 +- homeassistant/components/homematic/services.yaml | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/homematic/manifest.json b/homeassistant/components/homematic/manifest.json index 9e1bf043f541..31b26bbd511c 100644 --- a/homeassistant/components/homematic/manifest.json +++ b/homeassistant/components/homematic/manifest.json @@ -2,6 +2,6 @@ "domain": "homematic", "name": "Homematic", "documentation": "https://www.home-assistant.io/integrations/homematic", - "requirements": ["pyhomematic==0.1.65"], + "requirements": ["pyhomematic==0.1.66"], "codeowners": ["@pvizeli", "@danielperna84"] } diff --git a/homeassistant/components/homematic/services.yaml b/homeassistant/components/homematic/services.yaml index 5d52f13f39e5..d2a14101666a 100644 --- a/homeassistant/components/homematic/services.yaml +++ b/homeassistant/components/homematic/services.yaml @@ -75,7 +75,7 @@ put_paramset: example: wireless address: description: Address of Homematic device - example: LEQ3948571 + example: LEQ3948571:0 paramset_key: description: The paramset_key argument to putParamset example: MASTER diff --git a/requirements_all.txt b/requirements_all.txt index ce58b1780c86..3cf11736cfc7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1326,7 +1326,7 @@ pyhik==0.2.7 pyhiveapi==0.2.20.1 # homeassistant.components.homematic -pyhomematic==0.1.65 +pyhomematic==0.1.66 # homeassistant.components.homeworks pyhomeworks==0.0.6 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 789c23f21def..8f07c7bf6a43 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -521,7 +521,7 @@ pyhaversion==3.3.0 pyheos==0.6.0 # homeassistant.components.homematic -pyhomematic==0.1.65 +pyhomematic==0.1.66 # homeassistant.components.icloud pyicloud==0.9.6.1 From a6e993323601bdaa204fdbe245b273f0e68a0689 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 17 Apr 2020 00:09:03 +0000 Subject: [PATCH 466/653] [ci skip] Translation update --- homeassistant/components/hue/.translations/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/hue/.translations/en.json b/homeassistant/components/hue/.translations/en.json index c80074459e55..553dc5bac83e 100644 --- a/homeassistant/components/hue/.translations/en.json +++ b/homeassistant/components/hue/.translations/en.json @@ -33,10 +33,10 @@ "button_2": "Second button", "button_3": "Third button", "button_4": "Fourth button", - "double_buttons_1_3": "First and Third buttons", - "double_buttons_2_4": "Second and Fourth buttons", "dim_down": "Dim down", "dim_up": "Dim up", + "double_buttons_1_3": "First and Third buttons", + "double_buttons_2_4": "Second and Fourth buttons", "turn_off": "Turn off", "turn_on": "Turn on" }, @@ -48,4 +48,4 @@ "remote_double_button_short_press": "Both \"{subtype}\" released" } } -} +} \ No newline at end of file From eaa73ef0c7275a4e0894b70bf12428559fb3b19f Mon Sep 17 00:00:00 2001 From: James Nimmo Date: Fri, 17 Apr 2020 12:13:12 +1200 Subject: [PATCH 467/653] Bump to pyIntesisHome 1.7.4 (#34319) --- homeassistant/components/intesishome/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/intesishome/manifest.json b/homeassistant/components/intesishome/manifest.json index ab52f2b23ae3..b6170225320c 100644 --- a/homeassistant/components/intesishome/manifest.json +++ b/homeassistant/components/intesishome/manifest.json @@ -3,5 +3,5 @@ "name": "IntesisHome", "documentation": "https://www.home-assistant.io/integrations/intesishome", "codeowners": ["@jnimmo"], - "requirements": ["pyintesishome==1.7.3"] + "requirements": ["pyintesishome==1.7.4"] } diff --git a/requirements_all.txt b/requirements_all.txt index 3cf11736cfc7..ccf443d08609 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1338,7 +1338,7 @@ pyialarm==0.3 pyicloud==0.9.6.1 # homeassistant.components.intesishome -pyintesishome==1.7.3 +pyintesishome==1.7.4 # homeassistant.components.ipma pyipma==2.0.5 From b9e882fd5e6c7b82e5c4958aaa13b4faae4ce8ae Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 16 Apr 2020 19:26:34 -0500 Subject: [PATCH 468/653] Restore isy light brightness after off (#34320) --- homeassistant/components/isy994/light.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/homeassistant/components/isy994/light.py b/homeassistant/components/isy994/light.py index be94f8dd27a1..a8c302206378 100644 --- a/homeassistant/components/isy994/light.py +++ b/homeassistant/components/isy994/light.py @@ -24,6 +24,11 @@ def setup_platform( class ISYLightDevice(ISYDevice, Light): """Representation of an ISY994 light device.""" + def __init__(self, node) -> None: + """Initialize the ISY994 light device.""" + super().__init__(node) + self._last_brightness = self.brightness + @property def is_on(self) -> bool: """Get whether the ISY994 light is on.""" @@ -38,12 +43,21 @@ class ISYLightDevice(ISYDevice, Light): def turn_off(self, **kwargs) -> None: """Send the turn off command to the ISY994 light device.""" + self._last_brightness = self.brightness if not self._node.off(): _LOGGER.debug("Unable to turn off light") + def on_update(self, event: object) -> None: + """Save brightness in the update event from the ISY994 Node.""" + if not self.is_unknown() and self.value != 0: + self._last_brightness = self.value + super().on_update(event) + # pylint: disable=arguments-differ def turn_on(self, brightness=None, **kwargs) -> None: """Send the turn on command to the ISY994 light device.""" + if brightness is None and self._last_brightness is not None: + brightness = self._last_brightness if not self._node.on(val=brightness): _LOGGER.debug("Unable to turn on light") From 2326a2941e086f5b0dc4f4af2fde9b7f07d2e947 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Apr 2020 18:00:30 -0700 Subject: [PATCH 469/653] Improve error message when people have not moved config flow title yet (#34321) --- script/hassfest/__main__.py | 28 ++++++-- script/hassfest/model.py | 5 ++ script/hassfest/translations.py | 124 ++++++++++++++++++++++---------- 3 files changed, 114 insertions(+), 43 deletions(-) diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index 00fd30b5278c..aec1fd34b155 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -125,18 +125,22 @@ def main(): general_errors = config.errors invalid_itg = [itg for itg in integrations.values() if itg.errors] + warnings_itg = [itg for itg in integrations.values() if itg.warnings] + print() print("Integrations:", len(integrations)) print("Invalid integrations:", len(invalid_itg)) + print() if not invalid_itg and not general_errors: + print_integrations_status(config, warnings_itg, show_fixable_errors=False) + if config.action == "generate": for plugin in plugins: if hasattr(plugin, "generate"): plugin.generate(integrations, config) return 0 - print() if config.action == "generate": print("Found errors. Generating files canceled.") print() @@ -147,15 +151,25 @@ def main(): print("*", error) print() - for integration in sorted(invalid_itg, key=lambda itg: itg.domain): - extra = f" - {integration.path}" if config.specific_integrations else "" - print(f"Integration {integration.domain}{extra}:") - for error in integration.errors: - print("*", error) - print() + invalid_itg.extend(itg for itg in warnings_itg if itg not in invalid_itg) + + print_integrations_status(config, invalid_itg, show_fixable_errors=False) return 1 +def print_integrations_status(config, integrations, *, show_fixable_errors=True): + """Print integration status.""" + for integration in sorted(integrations, key=lambda itg: itg.domain): + extra = f" - {integration.path}" if config.specific_integrations else "" + print(f"Integration {integration.domain}{extra}:") + for error in integration.errors: + if show_fixable_errors or not error.fixable: + print("*", error) + for warning in integration.warnings: + print("*", "[WARNING]", warning) + print() + + if __name__ == "__main__": sys.exit(main()) diff --git a/script/hassfest/model.py b/script/hassfest/model.py index a03bc3ebd00a..e90a08f69fea 100644 --- a/script/hassfest/model.py +++ b/script/hassfest/model.py @@ -66,6 +66,7 @@ class Integration: path = attr.ib(type=pathlib.Path) manifest = attr.ib(type=dict, default=None) errors = attr.ib(type=List[Error], factory=list) + warnings = attr.ib(type=List[Error], factory=list) @property def domain(self) -> str: @@ -86,6 +87,10 @@ class Integration: """Add an error.""" self.errors.append(Error(*args, **kwargs)) + def add_warning(self, *args, **kwargs): + """Add an warning.""" + self.warnings.append(Error(*args, **kwargs)) + def load_manifest(self) -> None: """Load manifest.""" manifest_path = self.path / "manifest.json" diff --git a/script/hassfest/translations.py b/script/hassfest/translations.py index f55e793ad923..1287e82885f4 100644 --- a/script/hassfest/translations.py +++ b/script/hassfest/translations.py @@ -1,17 +1,48 @@ """Validate integration translation files.""" +from functools import partial import json +import logging from typing import Dict import voluptuous as vol from voluptuous.humanize import humanize_error -from .model import Integration +from .model import Config, Integration + +_LOGGER = logging.getLogger(__name__) + +UNDEFINED = 0 +REQUIRED = 1 +REMOVED = 2 + +REMOVED_TITLE_MSG = ( + "config.title key has been moved out of config and into the root of strings.json. " + "Starting Home Assistant 0.109 you only need to define this key in the root " + "if the title needs to be different than the name of your integration in the " + "manifest." +) -def data_entry_schema(*, require_title: bool, require_step_title: bool): +def removed_title_validator(config, integration, value): + """Mark removed title.""" + if not config.specific_integrations: + raise vol.Invalid(REMOVED_TITLE_MSG) + + # Don't mark it as an error yet for custom components to allow backwards compat. + integration.add_warning("translations", REMOVED_TITLE_MSG) + return value + + +def gen_data_entry_schema( + *, + config: Config, + integration: Integration, + flow_title: int, + require_step_title: bool, +): """Generate a data entry schema.""" step_title_class = vol.Required if require_step_title else vol.Optional - data_entry_schema = { + schema = { vol.Optional("flow_title"): str, vol.Required("step"): { str: { @@ -24,43 +55,64 @@ def data_entry_schema(*, require_title: bool, require_step_title: bool): vol.Optional("abort"): {str: str}, vol.Optional("create_entry"): {str: str}, } - if require_title: - data_entry_schema[vol.Required("title")] = str + if flow_title == REQUIRED: + schema[vol.Required("title")] = str + elif flow_title == REMOVED: + schema[vol.Optional("title", msg=REMOVED_TITLE_MSG)] = partial( + removed_title_validator, config, integration + ) - return data_entry_schema + return schema -STRINGS_SCHEMA = vol.Schema( - { - vol.Optional("title"): str, - vol.Optional("config"): data_entry_schema( - require_title=False, require_step_title=True - ), - vol.Optional("options"): data_entry_schema( - require_title=False, require_step_title=False - ), - vol.Optional("device_automation"): { - vol.Optional("action_type"): {str: str}, - vol.Optional("condition_type"): {str: str}, - vol.Optional("trigger_type"): {str: str}, - vol.Optional("trigger_subtype"): {str: str}, - }, - vol.Optional("state"): {str: str}, - } -) - -AUTH_SCHEMA = vol.Schema( - { - vol.Optional("mfa_setup"): { - str: data_entry_schema(require_title=True, require_step_title=True) +def gen_strings_schema(config: Config, integration: Integration): + """Generate a strings schema.""" + return vol.Schema( + { + vol.Optional("title"): str, + vol.Optional("config"): gen_data_entry_schema( + config=config, + integration=integration, + flow_title=REMOVED, + require_step_title=True, + ), + vol.Optional("options"): gen_data_entry_schema( + config=config, + integration=integration, + flow_title=UNDEFINED, + require_step_title=False, + ), + vol.Optional("device_automation"): { + vol.Optional("action_type"): {str: str}, + vol.Optional("condition_type"): {str: str}, + vol.Optional("trigger_type"): {str: str}, + vol.Optional("trigger_subtype"): {str: str}, + }, + vol.Optional("state"): {str: str}, } - } -) + ) + + +def gen_auth_schema(config: Config, integration: Integration): + """Generate auth schema.""" + return vol.Schema( + { + vol.Optional("mfa_setup"): { + str: gen_data_entry_schema( + config=config, + integration=integration, + flow_title=REQUIRED, + require_step_title=True, + ) + } + } + ) + ONBOARDING_SCHEMA = vol.Schema({vol.Required("area"): {str: str}}) -def validate_translation_file(integration: Integration): +def validate_translation_file(config: Config, integration: Integration): """Validate translation files for integration.""" strings_file = integration.path / "strings.json" @@ -70,11 +122,11 @@ def validate_translation_file(integration: Integration): strings = json.loads(strings_file.read_text()) if integration.domain == "auth": - schema = AUTH_SCHEMA + schema = gen_auth_schema(config, integration) elif integration.domain == "onboarding": schema = ONBOARDING_SCHEMA else: - schema = STRINGS_SCHEMA + schema = gen_strings_schema(config, integration) try: schema(strings) @@ -84,7 +136,7 @@ def validate_translation_file(integration: Integration): ) -def validate(integrations: Dict[str, Integration], config): +def validate(integrations: Dict[str, Integration], config: Config): """Handle JSON files inside integrations.""" for integration in integrations.values(): - validate_translation_file(integration) + validate_translation_file(config, integration) From 465eeab5531a0d863c2a86e58849e0518f50de40 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 17 Apr 2020 08:39:01 +0200 Subject: [PATCH 470/653] UniFi - Allow tracking of clients connected to third party APs (#34067) * Allow disable wired bug work around * Move small improvements from closed PR #34065 * Fix failing test * Add new test * Some extra logging * Harmonize log outputs * Add config flow string * Fix Balloobs comments --- .../components/unifi/.translations/en.json | 1 + homeassistant/components/unifi/__init__.py | 4 +- homeassistant/components/unifi/config_flow.py | 5 ++ homeassistant/components/unifi/const.py | 2 + homeassistant/components/unifi/controller.py | 71 +++++++++++-------- .../components/unifi/device_tracker.py | 29 ++++---- homeassistant/components/unifi/sensor.py | 4 +- homeassistant/components/unifi/strings.json | 3 +- .../components/unifi/unifi_client.py | 26 ++++--- tests/components/unifi/test_config_flow.py | 6 +- tests/components/unifi/test_device_tracker.py | 56 +++++++++++++-- 11 files changed, 144 insertions(+), 63 deletions(-) diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index 289e0a6dacdd..618c393b7aa5 100644 --- a/homeassistant/components/unifi/.translations/en.json +++ b/homeassistant/components/unifi/.translations/en.json @@ -37,6 +37,7 @@ "device_tracker": { "data": { "detection_time": "Time in seconds from last seen until considered away", + "ignore_wired_bug": "Disable UniFi wired bug logic", "ssid_filter": "Select SSIDs to track wireless clients on", "track_clients": "Track network clients", "track_devices": "Track network devices (Ubiquiti devices)", diff --git a/homeassistant/components/unifi/__init__.py b/homeassistant/components/unifi/__init__.py index e9f534360d72..e3225a2d2109 100644 --- a/homeassistant/components/unifi/__init__.py +++ b/homeassistant/components/unifi/__init__.py @@ -7,7 +7,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC from .config_flow import get_controller_id_from_config_entry -from .const import ATTR_MANUFACTURER, DOMAIN, UNIFI_WIRELESS_CLIENTS +from .const import ATTR_MANUFACTURER, DOMAIN, LOGGER, UNIFI_WIRELESS_CLIENTS from .controller import UniFiController SAVE_DELAY = 10 @@ -42,6 +42,8 @@ async def async_setup_entry(hass, config_entry): hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, controller.shutdown) + LOGGER.debug("UniFi config options %s", config_entry.options) + if controller.mac is None: return True diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 781fcdeae828..78389c6a2d1b 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -19,6 +19,7 @@ from .const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_IGNORE_WIRED_BUG, CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, @@ -216,6 +217,10 @@ class UnifiOptionsFlowHandler(config_entries.OptionsFlow): self.controller.option_detection_time.total_seconds() ), ): int, + vol.Optional( + CONF_IGNORE_WIRED_BUG, + default=self.controller.option_ignore_wired_bug, + ): bool, } ), ) diff --git a/homeassistant/components/unifi/const.py b/homeassistant/components/unifi/const.py index 4acf75fbdd9f..803a892647fe 100644 --- a/homeassistant/components/unifi/const.py +++ b/homeassistant/components/unifi/const.py @@ -14,6 +14,7 @@ UNIFI_WIRELESS_CLIENTS = "unifi_wireless_clients" CONF_ALLOW_BANDWIDTH_SENSORS = "allow_bandwidth_sensors" CONF_BLOCK_CLIENT = "block_client" CONF_DETECTION_TIME = "detection_time" +CONF_IGNORE_WIRED_BUG = "ignore_wired_bug" CONF_POE_CLIENTS = "poe_clients" CONF_TRACK_CLIENTS = "track_clients" CONF_TRACK_DEVICES = "track_devices" @@ -21,6 +22,7 @@ CONF_TRACK_WIRED_CLIENTS = "track_wired_clients" CONF_SSID_FILTER = "ssid_filter" DEFAULT_ALLOW_BANDWIDTH_SENSORS = False +DEFAULT_IGNORE_WIRED_BUG = False DEFAULT_POE_CLIENTS = True DEFAULT_TRACK_CLIENTS = True DEFAULT_TRACK_DEVICES = True diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index 3f4944fafa9f..f2fd57604713 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -31,6 +31,7 @@ from .const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_IGNORE_WIRED_BUG, CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, @@ -40,6 +41,7 @@ from .const import ( CONTROLLER_ID, DEFAULT_ALLOW_BANDWIDTH_SENSORS, DEFAULT_DETECTION_TIME, + DEFAULT_IGNORE_WIRED_BUG, DEFAULT_POE_CLIENTS, DEFAULT_TRACK_CLIENTS, DEFAULT_TRACK_DEVICES, @@ -96,32 +98,20 @@ class UniFiController: return self._site_role @property - def option_allow_bandwidth_sensors(self): - """Config entry option to allow bandwidth sensors.""" - return self.config_entry.options.get( - CONF_ALLOW_BANDWIDTH_SENSORS, DEFAULT_ALLOW_BANDWIDTH_SENSORS - ) + def mac(self): + """Return the mac address of this controller.""" + for client in self.api.clients.values(): + if self.host == client.ip: + return client.mac + return None - @property - def option_block_clients(self): - """Config entry option with list of clients to control network access.""" - return self.config_entry.options.get(CONF_BLOCK_CLIENT, []) - - @property - def option_poe_clients(self): - """Config entry option to control poe clients.""" - return self.config_entry.options.get(CONF_POE_CLIENTS, DEFAULT_POE_CLIENTS) + # Device tracker options @property def option_track_clients(self): """Config entry option to not track clients.""" return self.config_entry.options.get(CONF_TRACK_CLIENTS, DEFAULT_TRACK_CLIENTS) - @property - def option_track_devices(self): - """Config entry option to not track devices.""" - return self.config_entry.options.get(CONF_TRACK_DEVICES, DEFAULT_TRACK_DEVICES) - @property def option_track_wired_clients(self): """Config entry option to not track wired clients.""" @@ -129,6 +119,16 @@ class UniFiController: CONF_TRACK_WIRED_CLIENTS, DEFAULT_TRACK_WIRED_CLIENTS ) + @property + def option_track_devices(self): + """Config entry option to not track devices.""" + return self.config_entry.options.get(CONF_TRACK_DEVICES, DEFAULT_TRACK_DEVICES) + + @property + def option_ssid_filter(self): + """Config entry option listing what SSIDs are being used to track clients.""" + return self.config_entry.options.get(CONF_SSID_FILTER, []) + @property def option_detection_time(self): """Config entry option defining number of seconds from last seen to away.""" @@ -139,17 +139,32 @@ class UniFiController: ) @property - def option_ssid_filter(self): - """Config entry option listing what SSIDs are being used to track clients.""" - return self.config_entry.options.get(CONF_SSID_FILTER, []) + def option_ignore_wired_bug(self): + """Config entry option to ignore wired bug.""" + return self.config_entry.options.get( + CONF_IGNORE_WIRED_BUG, DEFAULT_IGNORE_WIRED_BUG + ) + + # Client control options @property - def mac(self): - """Return the mac address of this controller.""" - for client in self.api.clients.values(): - if self.host == client.ip: - return client.mac - return None + def option_poe_clients(self): + """Config entry option to control poe clients.""" + return self.config_entry.options.get(CONF_POE_CLIENTS, DEFAULT_POE_CLIENTS) + + @property + def option_block_clients(self): + """Config entry option with list of clients to control network access.""" + return self.config_entry.options.get(CONF_BLOCK_CLIENT, []) + + # Statistics sensor options + + @property + def option_allow_bandwidth_sensors(self): + """Config entry option to allow bandwidth sensors.""" + return self.config_entry.options.get( + CONF_ALLOW_BANDWIDTH_SENSORS, DEFAULT_ALLOW_BANDWIDTH_SENSORS + ) @callback def async_unifi_signalling_callback(self, signal, data): diff --git a/homeassistant/components/unifi/device_tracker.py b/homeassistant/components/unifi/device_tracker.py index 3f2eaf698b94..5e50a75409f3 100644 --- a/homeassistant/components/unifi/device_tracker.py +++ b/homeassistant/components/unifi/device_tracker.py @@ -67,6 +67,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): client = controller.api.clients_all[mac] controller.api.clients.process_raw([client.raw]) + LOGGER.debug( + "Restore disconnected client %s (%s)", entity.entity_id, client.mac, + ) @callback def items_added(): @@ -130,20 +133,21 @@ async def async_setup_entry(hass, config_entry, async_add_entities): remove.add(mac) if option_ssid_filter != controller.option_ssid_filter: - option_ssid_filter = controller.option_ssid_filter update = True - for mac, entity in tracked.items(): - if ( - isinstance(entity, UniFiClientTracker) - and not entity.is_wired - and entity.client.essid not in option_ssid_filter - ): - remove.add(mac) + if controller.option_ssid_filter: + for mac, entity in tracked.items(): + if ( + isinstance(entity, UniFiClientTracker) + and not entity.is_wired + and entity.client.essid not in controller.option_ssid_filter + ): + remove.add(mac) option_track_clients = controller.option_track_clients option_track_devices = controller.option_track_devices option_track_wired_clients = controller.option_track_wired_clients + option_ssid_filter = controller.option_ssid_filter remove_entities(controller, remove, tracked, entity_registry) @@ -319,13 +323,12 @@ class UniFiDeviceTracker(ScannerEntity): """Set up tracked device.""" self.device = device self.controller = controller - self.listeners = [] async def async_added_to_hass(self): """Subscribe to device events.""" - LOGGER.debug("New UniFi device tracker %s (%s)", self.name, self.device.mac) + LOGGER.debug("New device %s (%s)", self.entity_id, self.device.mac) self.device.register_callback(self.async_update_callback) - self.listeners.append( + self.async_on_remove( async_dispatcher_connect( self.hass, self.controller.signal_reachable, self.async_update_callback ) @@ -334,13 +337,11 @@ class UniFiDeviceTracker(ScannerEntity): async def async_will_remove_from_hass(self) -> None: """Disconnect device object when removed.""" self.device.remove_callback(self.async_update_callback) - for unsub_dispatcher in self.listeners: - unsub_dispatcher() @callback def async_update_callback(self): """Update the sensor's state.""" - LOGGER.debug("Updating UniFi tracked device %s", self.entity_id) + LOGGER.debug("Updating device %s (%s)", self.entity_id, self.device.mac) self.async_write_ha_state() diff --git a/homeassistant/components/unifi/sensor.py b/homeassistant/components/unifi/sensor.py index 2777d21cac7a..0eff1eeea355 100644 --- a/homeassistant/components/unifi/sensor.py +++ b/homeassistant/components/unifi/sensor.py @@ -118,7 +118,7 @@ class UniFiRxBandwidthSensor(UniFiClient): @property def state(self): """Return the state of the sensor.""" - if self.is_wired: + if self._is_wired: return self.client.wired_rx_bytes / 1000000 return self.client.raw.get("rx_bytes", 0) / 1000000 @@ -145,7 +145,7 @@ class UniFiTxBandwidthSensor(UniFiRxBandwidthSensor): @property def state(self): """Return the state of the sensor.""" - if self.is_wired: + if self._is_wired: return self.client.wired_tx_bytes / 1000000 return self.client.raw.get("tx_bytes", 0) / 1000000 diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index 40f4e1f50086..f436a86c6b3a 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -29,6 +29,7 @@ "device_tracker": { "data": { "detection_time": "Time in seconds from last seen until considered away", + "ignore_wired_bug": "Disable UniFi wired bug logic", "ssid_filter": "Select SSIDs to track wireless clients on", "track_clients": "Track network clients", "track_devices": "Track network devices (Ubiquiti devices)", @@ -55,4 +56,4 @@ } } } -} +} \ No newline at end of file diff --git a/homeassistant/components/unifi/unifi_client.py b/homeassistant/components/unifi/unifi_client.py index 644b0856bb49..a30dc21854df 100644 --- a/homeassistant/components/unifi/unifi_client.py +++ b/homeassistant/components/unifi/unifi_client.py @@ -39,18 +39,17 @@ class UniFiClient(Entity): """Set up client.""" self.client = client self.controller = controller - self.listeners = [] - self.is_wired = self.client.mac not in controller.wireless_clients + self._is_wired = self.client.mac not in controller.wireless_clients self.is_blocked = self.client.blocked self.wired_connection = None self.wireless_connection = None async def async_added_to_hass(self) -> None: """Client entity created.""" - LOGGER.debug("New UniFi client %s (%s)", self.name, self.client.mac) + LOGGER.debug("New client %s (%s)", self.entity_id, self.client.mac) self.client.register_callback(self.async_update_callback) - self.listeners.append( + self.async_on_remove( async_dispatcher_connect( self.hass, self.controller.signal_reachable, self.async_update_callback ) @@ -59,17 +58,14 @@ class UniFiClient(Entity): async def async_will_remove_from_hass(self) -> None: """Disconnect client object when removed.""" self.client.remove_callback(self.async_update_callback) - for unsub_dispatcher in self.listeners: - unsub_dispatcher() @callback def async_update_callback(self) -> None: """Update the clients state.""" - if self.is_wired and self.client.mac in self.controller.wireless_clients: - self.is_wired = False + if self._is_wired and self.client.mac in self.controller.wireless_clients: + self._is_wired = False if self.client.last_updated == SOURCE_EVENT: - if self.client.event.event in WIRELESS_CLIENT: self.wireless_connection = self.client.event.event in ( WIRELESS_CLIENT_CONNECTED, @@ -84,9 +80,19 @@ class UniFiClient(Entity): elif self.client.event.event in CLIENT_BLOCKED + CLIENT_UNBLOCKED: self.is_blocked = self.client.event.event in CLIENT_BLOCKED - LOGGER.debug("Updating client %s %s", self.entity_id, self.client.mac) + LOGGER.debug("Updating client %s (%s)", self.entity_id, self.client.mac) self.async_write_ha_state() + @property + def is_wired(self): + """Return if the client is wired. + + Allows disabling logic to keep track of clients affected by UniFi wired bug marking wireless devices as wired. This is useful when running a network not only containing UniFi APs. + """ + if self.controller.option_ignore_wired_bug: + return self.client.is_wired + return self._is_wired + @property def name(self) -> str: """Return the name of the client.""" diff --git a/tests/components/unifi/test_config_flow.py b/tests/components/unifi/test_config_flow.py index 3366ec1641d1..09b16440f947 100644 --- a/tests/components/unifi/test_config_flow.py +++ b/tests/components/unifi/test_config_flow.py @@ -11,6 +11,7 @@ from homeassistant.components.unifi.const import ( CONF_BLOCK_CLIENT, CONF_CONTROLLER, CONF_DETECTION_TIME, + CONF_IGNORE_WIRED_BUG, CONF_POE_CLIENTS, CONF_SITE_ID, CONF_SSID_FILTER, @@ -338,9 +339,10 @@ async def test_option_flow(hass): CONF_TRACK_CLIENTS: False, CONF_TRACK_WIRED_CLIENTS: False, CONF_TRACK_DEVICES: False, - CONF_DETECTION_TIME: 100, CONF_SSID_FILTER: ["SSID 1"], - CONF_BLOCK_CLIENT: ["00:00:00:00:00:01"], + CONF_DETECTION_TIME: 100, + CONF_IGNORE_WIRED_BUG: False, CONF_POE_CLIENTS: False, + CONF_BLOCK_CLIENT: ["00:00:00:00:00:01"], CONF_ALLOW_BANDWIDTH_SENSORS: True, } diff --git a/tests/components/unifi/test_device_tracker.py b/tests/components/unifi/test_device_tracker.py index 84085f8711a2..c204c75a1229 100644 --- a/tests/components/unifi/test_device_tracker.py +++ b/tests/components/unifi/test_device_tracker.py @@ -11,6 +11,7 @@ from homeassistant.components import unifi import homeassistant.components.device_tracker as device_tracker from homeassistant.components.unifi.const import ( CONF_BLOCK_CLIENT, + CONF_IGNORE_WIRED_BUG, CONF_SSID_FILTER, CONF_TRACK_CLIENTS, CONF_TRACK_DEVICES, @@ -376,12 +377,18 @@ async def test_option_track_devices(hass): async def test_option_ssid_filter(hass): """Test the SSID filter works.""" - controller = await setup_unifi_integration( - hass, options={CONF_SSID_FILTER: ["ssid"]}, clients_response=[CLIENT_3], + controller = await setup_unifi_integration(hass, clients_response=[CLIENT_3]) + assert len(hass.states.async_entity_ids("device_tracker")) == 1 + + client_3 = hass.states.get("device_tracker.client_3") + assert client_3 + + # Set SSID filter + hass.config_entries.async_update_entry( + controller.config_entry, options={CONF_SSID_FILTER: ["ssid"]}, ) - assert len(hass.states.async_entity_ids("device_tracker")) == 0 + await hass.async_block_till_done() - # SSID filter active client_3 = hass.states.get("device_tracker.client_3") assert not client_3 @@ -403,7 +410,6 @@ async def test_option_ssid_filter(hass): controller.api.message_handler(event) await hass.async_block_till_done() - # SSID no longer filtered client_3 = hass.states.get("device_tracker.client_3") assert client_3.state == "home" @@ -422,6 +428,7 @@ async def test_wireless_client_go_wired_issue(hass): client_1 = hass.states.get("device_tracker.client_1") assert client_1 is not None assert client_1.state == "home" + assert client_1.attributes["is_wired"] is False client_1_client["is_wired"] = True client_1_client["last_seen"] = dt_util.as_timestamp(dt_util.utcnow()) @@ -431,6 +438,7 @@ async def test_wireless_client_go_wired_issue(hass): client_1 = hass.states.get("device_tracker.client_1") assert client_1.state == "home" + assert client_1.attributes["is_wired"] is False with patch.object( unifi.device_tracker.dt_util, @@ -443,6 +451,7 @@ async def test_wireless_client_go_wired_issue(hass): client_1 = hass.states.get("device_tracker.client_1") assert client_1.state == "not_home" + assert client_1.attributes["is_wired"] is False client_1_client["is_wired"] = False client_1_client["last_seen"] = dt_util.as_timestamp(dt_util.utcnow()) @@ -452,6 +461,43 @@ async def test_wireless_client_go_wired_issue(hass): client_1 = hass.states.get("device_tracker.client_1") assert client_1.state == "home" + assert client_1.attributes["is_wired"] is False + + +async def test_option_ignore_wired_bug(hass): + """Test option to ignore wired bug.""" + client_1_client = copy(CLIENT_1) + client_1_client["last_seen"] = dt_util.as_timestamp(dt_util.utcnow()) + + controller = await setup_unifi_integration( + hass, options={CONF_IGNORE_WIRED_BUG: True}, clients_response=[client_1_client] + ) + assert len(hass.states.async_entity_ids("device_tracker")) == 1 + + client_1 = hass.states.get("device_tracker.client_1") + assert client_1 is not None + assert client_1.state == "home" + assert client_1.attributes["is_wired"] is False + + client_1_client["is_wired"] = True + client_1_client["last_seen"] = dt_util.as_timestamp(dt_util.utcnow()) + event = {"meta": {"message": "sta:sync"}, "data": [client_1_client]} + controller.api.message_handler(event) + await hass.async_block_till_done() + + client_1 = hass.states.get("device_tracker.client_1") + assert client_1.state == "home" + assert client_1.attributes["is_wired"] is True + + client_1_client["is_wired"] = False + client_1_client["last_seen"] = dt_util.as_timestamp(dt_util.utcnow()) + event = {"meta": {"message": "sta:sync"}, "data": [client_1_client]} + controller.api.message_handler(event) + await hass.async_block_till_done() + + client_1 = hass.states.get("device_tracker.client_1") + assert client_1.state == "home" + assert client_1.attributes["is_wired"] is False async def test_restoring_client(hass): From 9aee91b98c6548c73730e96a63b8b68a2b4e7c43 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 17 Apr 2020 00:08:21 -0700 Subject: [PATCH 471/653] Remove two more titles from strings.json (#34324) --- homeassistant/components/axis/strings.json | 1 - homeassistant/components/homekit_controller/strings.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/axis/strings.json b/homeassistant/components/axis/strings.json index 4479e269e873..67a3bb0a49ea 100644 --- a/homeassistant/components/axis/strings.json +++ b/homeassistant/components/axis/strings.json @@ -1,5 +1,4 @@ { - "title": "Axis device", "config": { "flow_title": "Axis device: {name} ({host})", "step": { diff --git a/homeassistant/components/homekit_controller/strings.json b/homeassistant/components/homekit_controller/strings.json index 4d55ff328b86..118c3bf7f8a9 100644 --- a/homeassistant/components/homekit_controller/strings.json +++ b/homeassistant/components/homekit_controller/strings.json @@ -1,5 +1,5 @@ { - "title": "HomeKit Accessory", + "title": "HomeKit Controller", "config": { "flow_title": "HomeKit Accessory: {name}", "step": { From 8277ebcbe10d787854d3a82fe4eb2c3940ed6eaf Mon Sep 17 00:00:00 2001 From: jan iversen Date: Fri, 17 Apr 2020 09:55:57 +0200 Subject: [PATCH 472/653] Rollback modbus to version 0.107.7 keep new functionality (#34287) * Rollback modbus to version 0.107.7 Update manifest to not use async. Rollback entities to sync version. Keep newer modifications apart from async. Rollback __init__ to sync version but keep the new functionality. add async sub directory Adding the current (not working) version in a sub directory, to allow easy sharing with a few alfa testers. The async version are to be updated to use the serial/tcp already available instead of the flaky pymodbus version. pymodbus is still needed to encode/decode the messagess. Update test cases to reflect sync implementation, but keep the new functionality like e.g. conftest.py. * do not publish async version The async version will be made available in a forked repo, until it is ready to replace the production code. --- homeassistant/components/modbus/__init__.py | 217 +++++++----------- .../components/modbus/binary_sensor.py | 20 +- homeassistant/components/modbus/climate.py | 47 ++-- homeassistant/components/modbus/manifest.json | 3 +- homeassistant/components/modbus/sensor.py | 30 +-- homeassistant/components/modbus/switch.py | 76 +++--- requirements_all.txt | 1 - requirements_test_all.txt | 4 - tests/components/modbus/conftest.py | 12 +- 9 files changed, 180 insertions(+), 230 deletions(-) diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index ad0330b56a0a..34a396758cb5 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -1,23 +1,9 @@ """Support for Modbus.""" -import asyncio import logging +import threading -from async_timeout import timeout -from pymodbus.client.asynchronous.asyncio import ( - AsyncioModbusSerialClient, - ModbusClientProtocol, - init_tcp_client, - init_udp_client, -) -from pymodbus.exceptions import ModbusException -from pymodbus.factory import ClientDecoder -from pymodbus.pdu import ExceptionResponse -from pymodbus.transaction import ( - ModbusAsciiFramer, - ModbusBinaryFramer, - ModbusRtuFramer, - ModbusSocketFramer, -) +from pymodbus.client.sync import ModbusSerialClient, ModbusTcpClient, ModbusUdpClient +from pymodbus.transaction import ModbusRtuFramer import voluptuous as vol from homeassistant.const import ( @@ -50,6 +36,7 @@ from .const import ( _LOGGER = logging.getLogger(__name__) + BASE_SCHEMA = vol.Schema({vol.Optional(CONF_NAME, default=DEFAULT_HUB): cv.string}) SERIAL_SCHEMA = BASE_SCHEMA.extend( @@ -101,57 +88,55 @@ SERVICE_WRITE_COIL_SCHEMA = vol.Schema( ) -async def async_setup(hass, config): +def setup(hass, config): """Set up Modbus component.""" hass.data[DOMAIN] = hub_collect = {} for client_config in config[DOMAIN]: - hub_collect[client_config[CONF_NAME]] = ModbusHub(client_config, hass.loop) + hub_collect[client_config[CONF_NAME]] = ModbusHub(client_config) def stop_modbus(event): """Stop Modbus service.""" for client in hub_collect.values(): - del client + client.close() - async def write_register(service): + def write_register(service): """Write Modbus registers.""" unit = int(float(service.data[ATTR_UNIT])) address = int(float(service.data[ATTR_ADDRESS])) value = service.data[ATTR_VALUE] client_name = service.data[ATTR_HUB] if isinstance(value, list): - await hub_collect[client_name].write_registers( + hub_collect[client_name].write_registers( unit, address, [int(float(i)) for i in value] ) else: - await hub_collect[client_name].write_register( - unit, address, int(float(value)) - ) + hub_collect[client_name].write_register(unit, address, int(float(value))) - async def write_coil(service): + def write_coil(service): """Write Modbus coil.""" unit = service.data[ATTR_UNIT] address = service.data[ATTR_ADDRESS] state = service.data[ATTR_STATE] client_name = service.data[ATTR_HUB] - await hub_collect[client_name].write_coil(unit, address, state) + hub_collect[client_name].write_coil(unit, address, state) # do not wait for EVENT_HOMEASSISTANT_START, activate pymodbus now for client in hub_collect.values(): - await client.setup(hass) + client.setup() # register function to gracefully stop modbus hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) # Register services for modbus - hass.services.async_register( + hass.services.register( DOMAIN, SERVICE_WRITE_REGISTER, write_register, schema=SERVICE_WRITE_REGISTER_SCHEMA, ) - hass.services.async_register( - DOMAIN, SERVICE_WRITE_COIL, write_coil, schema=SERVICE_WRITE_COIL_SCHEMA, + hass.services.register( + DOMAIN, SERVICE_WRITE_COIL, write_coil, schema=SERVICE_WRITE_COIL_SCHEMA ) return True @@ -159,13 +144,12 @@ async def async_setup(hass, config): class ModbusHub: """Thread safe wrapper class for pymodbus.""" - def __init__(self, client_config, main_loop): + def __init__(self, client_config): """Initialize the Modbus hub.""" # generic configuration - self._loop = main_loop self._client = None - self._lock = asyncio.Lock() + self._lock = threading.Lock() self._config_name = client_config[CONF_NAME] self._config_type = client_config[CONF_TYPE] self._config_port = client_config[CONF_PORT] @@ -183,144 +167,101 @@ class ModbusHub: # network configuration self._config_host = client_config[CONF_HOST] self._config_delay = client_config[CONF_DELAY] + if self._config_delay > 0: + _LOGGER.warning( + "Parameter delay is accepted but not used in this version" + ) @property def name(self): """Return the name of this hub.""" return self._config_name - async def _connect_delay(self): - if self._config_delay > 0: - await asyncio.sleep(self._config_delay) - self._config_delay = 0 - - @staticmethod - def _framer(method): - if method == "ascii": - framer = ModbusAsciiFramer(ClientDecoder()) - elif method == "rtu": - framer = ModbusRtuFramer(ClientDecoder()) - elif method == "binary": - framer = ModbusBinaryFramer(ClientDecoder()) - elif method == "socket": - framer = ModbusSocketFramer(ClientDecoder()) - else: - framer = None - return framer - - async def setup(self, hass): + def setup(self): """Set up pymodbus client.""" if self._config_type == "serial": - # reconnect ?? - framer = self._framer(self._config_method) - - # just a class creation no IO or other slow items - self._client = AsyncioModbusSerialClient( - self._config_port, - protocol_class=ModbusClientProtocol, - framer=framer, - loop=self._loop, + self._client = ModbusSerialClient( + method=self._config_method, + port=self._config_port, baudrate=self._config_baudrate, + stopbits=self._config_stopbits, bytesize=self._config_bytesize, parity=self._config_parity, - stopbits=self._config_stopbits, + timeout=self._config_timeout, ) - await self._client.connect() elif self._config_type == "rtuovertcp": - # framer ModbusRtuFramer ?? - # timeout ?? - self._client = await init_tcp_client( - None, self._loop, self._config_host, self._config_port + self._client = ModbusTcpClient( + host=self._config_host, + port=self._config_port, + framer=ModbusRtuFramer, + timeout=self._config_timeout, ) elif self._config_type == "tcp": - # framer ?? - # timeout ?? - self._client = await init_tcp_client( - None, self._loop, self._config_host, self._config_port + self._client = ModbusTcpClient( + host=self._config_host, + port=self._config_port, + timeout=self._config_timeout, ) elif self._config_type == "udp": - # framer ?? - # timeout ?? - self._client = await init_udp_client( - None, self._loop, self._config_host, self._config_port + self._client = ModbusUdpClient( + host=self._config_host, + port=self._config_port, + timeout=self._config_timeout, ) else: assert False - async def _read(self, unit, address, count, func): - """Read generic with error handling.""" - await self._connect_delay() - async with self._lock: - kwargs = {"unit": unit} if unit else {} - try: - async with timeout(self._config_timeout): - result = await func(address, count, **kwargs) - except asyncio.TimeoutError: - result = None + # Connect device + self.connect() - if isinstance(result, (ModbusException, ExceptionResponse)): - _LOGGER.error("Hub %s Exception (%s)", self._config_name, result) - return result + def close(self): + """Disconnect client.""" + with self._lock: + self._client.close() - async def _write(self, unit, address, value, func): - """Read generic with error handling.""" - await self._connect_delay() - async with self._lock: - kwargs = {"unit": unit} if unit else {} - try: - async with timeout(self._config_timeout): - func(address, value, **kwargs) - except asyncio.TimeoutError: - return + def connect(self): + """Connect client.""" + with self._lock: + self._client.connect() - async def read_coils(self, unit, address, count): + def read_coils(self, unit, address, count): """Read coils.""" - if self._client.protocol is None: - return None - return await self._read(unit, address, count, self._client.protocol.read_coils) + with self._lock: + kwargs = {"unit": unit} if unit else {} + return self._client.read_coils(address, count, **kwargs) - async def read_discrete_inputs(self, unit, address, count): + def read_discrete_inputs(self, unit, address, count): """Read discrete inputs.""" - if self._client.protocol is None: - return None - return await self._read( - unit, address, count, self._client.protocol.read_discrete_inputs - ) + with self._lock: + kwargs = {"unit": unit} if unit else {} + return self._client.read_discrete_inputs(address, count, **kwargs) - async def read_input_registers(self, unit, address, count): + def read_input_registers(self, unit, address, count): """Read input registers.""" - if self._client.protocol is None: - return None - return await self._read( - unit, address, count, self._client.protocol.read_input_registers - ) + with self._lock: + kwargs = {"unit": unit} if unit else {} + return self._client.read_input_registers(address, count, **kwargs) - async def read_holding_registers(self, unit, address, count): + def read_holding_registers(self, unit, address, count): """Read holding registers.""" - if self._client.protocol is None: - return None - return await self._read( - unit, address, count, self._client.protocol.read_holding_registers - ) + with self._lock: + kwargs = {"unit": unit} if unit else {} + return self._client.read_holding_registers(address, count, **kwargs) - async def write_coil(self, unit, address, value): + def write_coil(self, unit, address, value): """Write coil.""" - if self._client.protocol is None: - return None - return await self._write(unit, address, value, self._client.protocol.write_coil) + with self._lock: + kwargs = {"unit": unit} if unit else {} + self._client.write_coil(address, value, **kwargs) - async def write_register(self, unit, address, value): + def write_register(self, unit, address, value): """Write register.""" - if self._client.protocol is None: - return None - return await self._write( - unit, address, value, self._client.protocol.write_register - ) + with self._lock: + kwargs = {"unit": unit} if unit else {} + self._client.write_register(address, value, **kwargs) - async def write_registers(self, unit, address, values): + def write_registers(self, unit, address, values): """Write registers.""" - if self._client.protocol is None: - return None - return await self._write( - unit, address, values, self._client.protocol.write_registers - ) + with self._lock: + kwargs = {"unit": unit} if unit else {} + self._client.write_registers(address, values, **kwargs) diff --git a/homeassistant/components/modbus/binary_sensor.py b/homeassistant/components/modbus/binary_sensor.py index 9989b9d530ac..5f80813d108b 100644 --- a/homeassistant/components/modbus/binary_sensor.py +++ b/homeassistant/components/modbus/binary_sensor.py @@ -2,7 +2,7 @@ import logging from typing import Optional -from pymodbus.exceptions import ModbusException +from pymodbus.exceptions import ConnectionException, ModbusException from pymodbus.pdu import ExceptionResponse import voluptuous as vol @@ -54,7 +54,7 @@ PLATFORM_SCHEMA = vol.All( ) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Modbus binary sensors.""" sensors = [] for entry in config[CONF_INPUTS]: @@ -70,7 +70,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) ) - async_add_entities(sensors) + add_entities(sensors) class ModbusBinarySensor(BinarySensorDevice): @@ -107,15 +107,17 @@ class ModbusBinarySensor(BinarySensorDevice): """Return True if entity is available.""" return self._available - async def async_update(self): + def update(self): """Update the state of the sensor.""" - if self._input_type == CALL_TYPE_COIL: - result = await self._hub.read_coils(self._slave, self._address, 1) - else: - result = await self._hub.read_discrete_inputs(self._slave, self._address, 1) - if result is None: + try: + if self._input_type == CALL_TYPE_COIL: + result = self._hub.read_coils(self._slave, self._address, 1) + else: + result = self._hub.read_discrete_inputs(self._slave, self._address, 1) + except ConnectionException: self._available = False return + if isinstance(result, (ModbusException, ExceptionResponse)): self._available = False return diff --git a/homeassistant/components/modbus/climate.py b/homeassistant/components/modbus/climate.py index e5fbcf4d4217..5cfd9c36967c 100644 --- a/homeassistant/components/modbus/climate.py +++ b/homeassistant/components/modbus/climate.py @@ -3,7 +3,7 @@ import logging import struct from typing import Optional -from pymodbus.exceptions import ModbusException +from pymodbus.exceptions import ConnectionException, ModbusException from pymodbus.pdu import ExceptionResponse import voluptuous as vol @@ -72,7 +72,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Modbus Thermostat Platform.""" name = config[CONF_NAME] modbus_slave = config[CONF_SLAVE] @@ -91,7 +91,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= hub_name = config[CONF_HUB] hub = hass.data[MODBUS_DOMAIN][hub_name] - async_add_entities( + add_entities( [ ModbusThermostat( hub, @@ -170,12 +170,12 @@ class ModbusThermostat(ClimateDevice): """Return the list of supported features.""" return SUPPORT_TARGET_TEMPERATURE - async def async_update(self): + def update(self): """Update Target & Current Temperature.""" - self._target_temperature = await self._read_register( + self._target_temperature = self._read_register( CALL_TYPE_REGISTER_HOLDING, self._target_temperature_register ) - self._current_temperature = await self._read_register( + self._current_temperature = self._read_register( self._current_temperature_register_type, self._current_temperature_register ) @@ -224,7 +224,7 @@ class ModbusThermostat(ClimateDevice): """Return the supported step of target temperature.""" return self._temp_step - async def set_temperature(self, **kwargs): + def set_temperature(self, **kwargs): """Set new target temperature.""" target_temperature = int( (kwargs.get(ATTR_TEMPERATURE) - self._offset) / self._scale @@ -233,26 +233,28 @@ class ModbusThermostat(ClimateDevice): return byte_string = struct.pack(self._structure, target_temperature) register_value = struct.unpack(">h", byte_string[0:2])[0] - await self._write_register(self._target_temperature_register, register_value) + self._write_register(self._target_temperature_register, register_value) @property def available(self) -> bool: """Return True if entity is available.""" return self._available - async def _read_register(self, register_type, register) -> Optional[float]: + def _read_register(self, register_type, register) -> Optional[float]: """Read register using the Modbus hub slave.""" - if register_type == CALL_TYPE_REGISTER_INPUT: - result = await self._hub.read_input_registers( - self._slave, register, self._count - ) - else: - result = await self._hub.read_holding_registers( - self._slave, register, self._count - ) - if result is None: + try: + if register_type == CALL_TYPE_REGISTER_INPUT: + result = self._hub.read_input_registers( + self._slave, register, self._count + ) + else: + result = self._hub.read_holding_registers( + self._slave, register, self._count + ) + except ConnectionException: self._available = False return + if isinstance(result, (ModbusException, ExceptionResponse)): self._available = False return @@ -269,7 +271,12 @@ class ModbusThermostat(ClimateDevice): return register_value - async def _write_register(self, register, value): + def _write_register(self, register, value): """Write holding register using the Modbus hub slave.""" - await self._hub.write_registers(self._slave, register, [value, 0]) + try: + self._hub.write_registers(self._slave, register, [value, 0]) + except ConnectionException: + self._available = False + return + self._available = True diff --git a/homeassistant/components/modbus/manifest.json b/homeassistant/components/modbus/manifest.json index 2cdc8fe027cf..a9155c7b628d 100644 --- a/homeassistant/components/modbus/manifest.json +++ b/homeassistant/components/modbus/manifest.json @@ -2,7 +2,6 @@ "domain": "modbus", "name": "Modbus", "documentation": "https://www.home-assistant.io/integrations/modbus", - "requirements": ["pymodbus==2.3.0", - "pyserial-asyncio==0.4"], + "requirements": ["pymodbus==2.3.0"], "codeowners": ["@adamchengtkc", "@janiversen"] } diff --git a/homeassistant/components/modbus/sensor.py b/homeassistant/components/modbus/sensor.py index be3bc4c52c6c..8c475a114eb4 100644 --- a/homeassistant/components/modbus/sensor.py +++ b/homeassistant/components/modbus/sensor.py @@ -3,7 +3,7 @@ import logging import struct from typing import Any, Optional, Union -from pymodbus.exceptions import ModbusException +from pymodbus.exceptions import ConnectionException, ModbusException from pymodbus.pdu import ExceptionResponse import voluptuous as vol @@ -89,7 +89,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Modbus sensors.""" sensors = [] data_types = {DATA_TYPE_INT: {1: "h", 2: "i", 4: "q"}} @@ -148,7 +148,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= if not sensors: return False - async_add_entities(sensors) + add_entities(sensors) class ModbusRegisterSensor(RestoreEntity): @@ -219,19 +219,21 @@ class ModbusRegisterSensor(RestoreEntity): """Return True if entity is available.""" return self._available - async def async_update(self): + def update(self): """Update the state of the sensor.""" - if self._register_type == CALL_TYPE_REGISTER_INPUT: - result = await self._hub.read_input_registers( - self._slave, self._register, self._count - ) - else: - result = await self._hub.read_holding_registers( - self._slave, self._register, self._count - ) - if result is None: + try: + if self._register_type == CALL_TYPE_REGISTER_INPUT: + result = self._hub.read_input_registers( + self._slave, self._register, self._count + ) + else: + result = self._hub.read_holding_registers( + self._slave, self._register, self._count + ) + except ConnectionException: self._available = False return + if isinstance(result, (ModbusException, ExceptionResponse)): self._available = False return @@ -246,7 +248,7 @@ class ModbusRegisterSensor(RestoreEntity): if isinstance(val, int): self._value = str(val) if self._precision > 0: - self._value += f".{'0' * self._precision}" + self._value += "." + "0" * self._precision else: self._value = f"{val:.{self._precision}f}" diff --git a/homeassistant/components/modbus/switch.py b/homeassistant/components/modbus/switch.py index e4ec6a004fbc..97a5d00a30f4 100644 --- a/homeassistant/components/modbus/switch.py +++ b/homeassistant/components/modbus/switch.py @@ -2,7 +2,7 @@ import logging from typing import Optional -from pymodbus.exceptions import ModbusException +from pymodbus.exceptions import ConnectionException, ModbusException from pymodbus.pdu import ExceptionResponse import voluptuous as vol @@ -76,7 +76,7 @@ PLATFORM_SCHEMA = vol.All( ) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +def setup_platform(hass, config, add_entities, discovery_info=None): """Read configuration and create Modbus devices.""" switches = [] if CONF_COILS in config: @@ -109,7 +109,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) ) - async_add_entities(switches) + add_entities(switches) class ModbusCoilSwitch(ToggleEntity, RestoreEntity): @@ -146,24 +146,26 @@ class ModbusCoilSwitch(ToggleEntity, RestoreEntity): """Return True if entity is available.""" return self._available - async def turn_on(self, **kwargs): + def turn_on(self, **kwargs): """Set switch on.""" - await self._write_coil(self._coil, True) + self._write_coil(self._coil, True) - async def turn_off(self, **kwargs): + def turn_off(self, **kwargs): """Set switch off.""" - await self._write_coil(self._coil, False) + self._write_coil(self._coil, False) - async def async_update(self): + def update(self): """Update the state of the switch.""" - self._is_on = await self._read_coil(self._coil) + self._is_on = self._read_coil(self._coil) - async def _read_coil(self, coil) -> Optional[bool]: + def _read_coil(self, coil) -> Optional[bool]: """Read coil using the Modbus hub slave.""" - result = await self._hub.read_coils(self._slave, coil, 1) - if result is None: + try: + result = self._hub.read_coils(self._slave, coil, 1) + except ConnectionException: self._available = False return + if isinstance(result, (ModbusException, ExceptionResponse)): self._available = False return @@ -173,9 +175,14 @@ class ModbusCoilSwitch(ToggleEntity, RestoreEntity): return value - async def _write_coil(self, coil, value): + def _write_coil(self, coil, value): """Write coil using the Modbus hub slave.""" - await self._hub.write_coil(self._slave, coil, value) + try: + self._hub.write_coil(self._slave, coil, value) + except ConnectionException: + self._available = False + return + self._available = True @@ -221,21 +228,21 @@ class ModbusRegisterSwitch(ModbusCoilSwitch): self._is_on = None - async def turn_on(self, **kwargs): + def turn_on(self, **kwargs): """Set switch on.""" # Only holding register is writable if self._register_type == CALL_TYPE_REGISTER_HOLDING: - await self._write_register(self._command_on) + self._write_register(self._command_on) if not self._verify_state: self._is_on = True - async def turn_off(self, **kwargs): + def turn_off(self, **kwargs): """Set switch off.""" # Only holding register is writable if self._register_type == CALL_TYPE_REGISTER_HOLDING: - await self._write_register(self._command_off) + self._write_register(self._command_off) if not self._verify_state: self._is_on = False @@ -244,12 +251,12 @@ class ModbusRegisterSwitch(ModbusCoilSwitch): """Return True if entity is available.""" return self._available - async def async_update(self): + def update(self): """Update the state of the switch.""" if not self._verify_state: return - value = await self._read_register() + value = self._read_register() if value == self._state_on: self._is_on = True elif value == self._state_off: @@ -263,18 +270,18 @@ class ModbusRegisterSwitch(ModbusCoilSwitch): value, ) - async def _read_register(self) -> Optional[int]: - if self._register_type == CALL_TYPE_REGISTER_INPUT: - result = await self._hub.read_input_registers( - self._slave, self._register, 1 - ) - else: - result = await self._hub.read_holding_registers( - self._slave, self._register, 1 - ) - if result is None: + def _read_register(self) -> Optional[int]: + try: + if self._register_type == CALL_TYPE_REGISTER_INPUT: + result = self._hub.read_input_registers(self._slave, self._register, 1) + else: + result = self._hub.read_holding_registers( + self._slave, self._register, 1 + ) + except ConnectionException: self._available = False return + if isinstance(result, (ModbusException, ExceptionResponse)): self._available = False return @@ -284,7 +291,12 @@ class ModbusRegisterSwitch(ModbusCoilSwitch): return value - async def _write_register(self, value): + def _write_register(self, value): """Write holding register using the Modbus hub slave.""" - await self._hub.write_register(self._slave, self._register, value) + try: + self._hub.write_register(self._slave, self._register, value) + except ConnectionException: + self._available = False + return + self._available = True diff --git a/requirements_all.txt b/requirements_all.txt index ccf443d08609..f25a7b25505d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1531,7 +1531,6 @@ pysdcp==1 # homeassistant.components.sensibo pysensibo==1.0.3 -# homeassistant.components.modbus # homeassistant.components.serial pyserial-asyncio==0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8f07c7bf6a43..aa49dc935e7d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -600,10 +600,6 @@ pyps4-2ndscreen==1.0.7 # homeassistant.components.qwikswitch pyqwikswitch==0.93 -# homeassistant.components.modbus -# homeassistant.components.serial -pyserial-asyncio==0.4 - # homeassistant.components.signal_messenger pysignalclirestapi==0.2.4 diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py index d9cd62313b47..814e59e5571f 100644 --- a/tests/components/modbus/conftest.py +++ b/tests/components/modbus/conftest.py @@ -40,19 +40,11 @@ class ReadResult: self.registers = register_words -read_result = None - - async def run_test( hass, use_mock_hub, register_config, entity_domain, register_words, expected ): """Run test for given config and check that sensor outputs expected result.""" - async def simulate_read_registers(unit, address, count): - """Simulate modbus register read.""" - del unit, address, count # not used in simulation, but in real connection - return read_result - # Full sensor configuration sensor_name = "modbus_test_sensor" scan_interval = 5 @@ -69,9 +61,9 @@ async def run_test( # Setup inputs for the sensor read_result = ReadResult(register_words) if register_config.get(CONF_REGISTER_TYPE) == CALL_TYPE_REGISTER_INPUT: - use_mock_hub.read_input_registers = simulate_read_registers + use_mock_hub.read_input_registers.return_value = read_result else: - use_mock_hub.read_holding_registers = simulate_read_registers + use_mock_hub.read_holding_registers.return_value = read_result # Initialize sensor now = dt_util.utcnow() From a2b280f342eeae0be9ce43c001b2e5326282ef12 Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Fri, 17 Apr 2020 11:25:31 +0300 Subject: [PATCH 473/653] Fix uncaught exceptions in ios (#34119) * verify that the config in hass is not empty * changed to use MockConfigEntry * Update tests/components/ios/test_init.py Co-Authored-By: Martin Hjelmare * Update tests/components/ios/test_init.py Co-Authored-By: Martin Hjelmare * changed the test per suggestions Co-authored-by: Martin Hjelmare --- tests/components/ios/test_init.py | 14 ++------------ tests/ignore_uncaught_exceptions.py | 2 -- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/tests/components/ios/test_init.py b/tests/components/ios/test_init.py index 31eb43fc611b..5fe796bae20e 100644 --- a/tests/components/ios/test_init.py +++ b/tests/components/ios/test_init.py @@ -3,7 +3,6 @@ from unittest.mock import patch import pytest -from homeassistant import config_entries, data_entry_flow from homeassistant.components import ios from homeassistant.setup import async_setup_component @@ -30,16 +29,7 @@ async def test_creating_entry_sets_up_sensor(hass): "homeassistant.components.ios.sensor.async_setup_entry", return_value=mock_coro(True), ) as mock_setup: - result = await hass.config_entries.flow.async_init( - ios.DOMAIN, context={"source": config_entries.SOURCE_USER} - ) - - # Confirmation form - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - - result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - + assert await async_setup_component(hass, ios.DOMAIN, {ios.DOMAIN: {}}) await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 @@ -61,7 +51,7 @@ async def test_not_configuring_ios_not_creates_entry(hass): with patch( "homeassistant.components.ios.async_setup_entry", return_value=mock_coro(True) ) as mock_setup: - await async_setup_component(hass, ios.DOMAIN, {}) + await async_setup_component(hass, ios.DOMAIN, {"foo": "bar"}) await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 0 diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py index 8e6004d362e1..d8734ab73163 100644 --- a/tests/ignore_uncaught_exceptions.py +++ b/tests/ignore_uncaught_exceptions.py @@ -1,7 +1,5 @@ """List of modules that have uncaught exceptions today. Will be shrunk over time.""" IGNORE_UNCAUGHT_EXCEPTIONS = [ - ("tests.components.ios.test_init", "test_creating_entry_sets_up_sensor"), - ("tests.components.ios.test_init", "test_not_configuring_ios_not_creates_entry"), ("tests.components.local_file.test_camera", "test_file_not_readable"), ] From 1259979204437235359c0b7cee6dbd7e1ef2f41f Mon Sep 17 00:00:00 2001 From: Ziv <16467659+ziv1234@users.noreply.github.com> Date: Fri, 17 Apr 2020 14:10:48 +0300 Subject: [PATCH 474/653] Fix uncaught exception in local_file (#34312) * remove ignore from localfile * added mock_registry * since there are no more exceptions, infra to ignore them is redundant --- tests/components/local_file/test_camera.py | 2 ++ tests/conftest.py | 17 ----------------- tests/ignore_uncaught_exceptions.py | 6 ------ 3 files changed, 2 insertions(+), 23 deletions(-) delete mode 100644 tests/ignore_uncaught_exceptions.py diff --git a/tests/components/local_file/test_camera.py b/tests/components/local_file/test_camera.py index 92650715e5d9..ea2b3c3252e9 100644 --- a/tests/components/local_file/test_camera.py +++ b/tests/components/local_file/test_camera.py @@ -41,6 +41,8 @@ async def test_loading_file(hass, hass_client): async def test_file_not_readable(hass, caplog): """Test a warning is shown setup when file is not readable.""" + mock_registry(hass) + with mock.patch("os.path.isfile", mock.Mock(return_value=True)), mock.patch( "os.access", mock.Mock(return_value=False) ): diff --git a/tests/conftest.py b/tests/conftest.py index 89a3065bcec8..700240bf6276 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,11 +19,6 @@ from homeassistant.exceptions import ServiceNotFound from homeassistant.setup import async_setup_component from homeassistant.util import location -from tests.ignore_uncaught_exceptions import ( - IGNORE_UNCAUGHT_EXCEPTIONS, - IGNORE_UNCAUGHT_JSON_EXCEPTIONS, -) - pytest.register_assert_rewrite("tests.common") from tests.common import ( # noqa: E402, isort:skip @@ -100,20 +95,8 @@ def hass(loop, hass_storage, request): loop.run_until_complete(hass.async_stop(force=True)) for ex in exceptions: - if ( - request.module.__name__, - request.function.__name__, - ) in IGNORE_UNCAUGHT_EXCEPTIONS: - continue if isinstance(ex, ServiceNotFound): continue - if ( - isinstance(ex, TypeError) - and "is not JSON serializable" in str(ex) - and (request.module.__name__, request.function.__name__) - in IGNORE_UNCAUGHT_JSON_EXCEPTIONS - ): - continue raise ex diff --git a/tests/ignore_uncaught_exceptions.py b/tests/ignore_uncaught_exceptions.py deleted file mode 100644 index d8734ab73163..000000000000 --- a/tests/ignore_uncaught_exceptions.py +++ /dev/null @@ -1,6 +0,0 @@ -"""List of modules that have uncaught exceptions today. Will be shrunk over time.""" -IGNORE_UNCAUGHT_EXCEPTIONS = [ - ("tests.components.local_file.test_camera", "test_file_not_readable"), -] - -IGNORE_UNCAUGHT_JSON_EXCEPTIONS = [] From ced59e599f24a3820e100327fd536c023245d44e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 17 Apr 2020 13:12:25 +0200 Subject: [PATCH 475/653] Upgrade yamllint to 1.23.0 (#34337) --- .pre-commit-config.yaml | 2 +- requirements_test_pre_commit.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5ec14e9ab6a4..e491637ea651 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: - --branch=master - --branch=rc - repo: https://github.com/adrienverge/yamllint.git - rev: v1.22.0 + rev: v1.23.0 hooks: - id: yamllint - repo: https://github.com/prettier/prettier diff --git a/requirements_test_pre_commit.txt b/requirements_test_pre_commit.txt index 663d5dd89e37..a52927ed4977 100644 --- a/requirements_test_pre_commit.txt +++ b/requirements_test_pre_commit.txt @@ -8,4 +8,4 @@ flake8==3.7.9 isort==4.3.21 pydocstyle==5.0.2 pyupgrade==2.1.0 -yamllint==1.22.0 +yamllint==1.23.0 From d672eed3319a3a2e8073d5bc2702da47f1ee4d15 Mon Sep 17 00:00:00 2001 From: tubalainen Date: Fri, 17 Apr 2020 17:15:04 +0200 Subject: [PATCH 476/653] Add rflink binary_sensor allon and alloff commands (#32411) * added "allon" and "alloff" to the binary_sensor Ref to the issue: https://github.com/home-assistant/core/issues/32399 * Cosmetic fix * Fix format * Update test Co-authored-by: Erik Montnemery --- homeassistant/components/rflink/binary_sensor.py | 4 ++-- tests/components/rflink/test_binary_sensor.py | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/rflink/binary_sensor.py b/homeassistant/components/rflink/binary_sensor.py index ab50e6dcc4b3..c3600da40517 100644 --- a/homeassistant/components/rflink/binary_sensor.py +++ b/homeassistant/components/rflink/binary_sensor.py @@ -73,9 +73,9 @@ class RflinkBinarySensor(RflinkDevice, BinarySensorDevice): def _handle_event(self, event): """Domain specific event handler.""" command = event["command"] - if command == "on": + if command in ["on", "allon"]: self._state = True - elif command == "off": + elif command in ["off", "alloff"]: self._state = False if self._state and self._off_delay is not None: diff --git a/tests/components/rflink/test_binary_sensor.py b/tests/components/rflink/test_binary_sensor.py index 2a67cf5348de..788e6d4981f7 100644 --- a/tests/components/rflink/test_binary_sensor.py +++ b/tests/components/rflink/test_binary_sensor.py @@ -56,18 +56,30 @@ async def test_default_setup(hass, monkeypatch): assert config_sensor.state == STATE_OFF assert config_sensor.attributes["device_class"] == "door" - # test event for config sensor + # test on event for config sensor event_callback({"id": "test", "command": "on"}) await hass.async_block_till_done() assert hass.states.get("binary_sensor.test").state == STATE_ON - # test event for config sensor + # test off event for config sensor event_callback({"id": "test", "command": "off"}) await hass.async_block_till_done() assert hass.states.get("binary_sensor.test").state == STATE_OFF + # test allon event for config sensor + event_callback({"id": "test", "command": "allon"}) + await hass.async_block_till_done() + + assert hass.states.get("binary_sensor.test").state == STATE_ON + + # test alloff event for config sensor + event_callback({"id": "test", "command": "alloff"}) + await hass.async_block_till_done() + + assert hass.states.get("binary_sensor.test").state == STATE_OFF + async def test_entity_availability(hass, monkeypatch): """If Rflink device is disconnected, entities should become unavailable.""" From 660b1dc1e4ee3ed708a94624e2d5ac47b6046519 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 17 Apr 2020 10:55:04 -0500 Subject: [PATCH 477/653] Ensure nexia state file is in a writable location (#34325) * bump nexia to 0.9.2 --- homeassistant/components/nexia/__init__.py | 3 +++ homeassistant/components/nexia/config_flow.py | 3 +++ homeassistant/components/nexia/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nexia/__init__.py b/homeassistant/components/nexia/__init__.py index 9a595ab7a94a..122f00f7b597 100644 --- a/homeassistant/components/nexia/__init__.py +++ b/homeassistant/components/nexia/__init__.py @@ -65,6 +65,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): username = conf[CONF_USERNAME] password = conf[CONF_PASSWORD] + state_file = hass.config.path(f"nexia_config_{username}.conf") + try: nexia_home = await hass.async_add_executor_job( partial( @@ -72,6 +74,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): username=username, password=password, device_name=hass.config.location_name, + state_file=state_file, ) ) except ConnectTimeout as ex: diff --git a/homeassistant/components/nexia/config_flow.py b/homeassistant/components/nexia/config_flow.py index d99be94aaf9a..c26e42a22d2b 100644 --- a/homeassistant/components/nexia/config_flow.py +++ b/homeassistant/components/nexia/config_flow.py @@ -25,6 +25,8 @@ async def validate_input(hass: core.HomeAssistant, data): Data has the keys from DATA_SCHEMA with values provided by the user. """ + + state_file = hass.config.path(f"nexia_config_{data[CONF_USERNAME]}.conf") try: nexia_home = NexiaHome( username=data[CONF_USERNAME], @@ -32,6 +34,7 @@ async def validate_input(hass: core.HomeAssistant, data): auto_login=False, auto_update=False, device_name=hass.config.location_name, + state_file=state_file, ) await hass.async_add_executor_job(nexia_home.login) except ConnectTimeout as ex: diff --git a/homeassistant/components/nexia/manifest.json b/homeassistant/components/nexia/manifest.json index a58330ad2279..f09d4d1a4d19 100644 --- a/homeassistant/components/nexia/manifest.json +++ b/homeassistant/components/nexia/manifest.json @@ -1,7 +1,7 @@ { "domain": "nexia", "name": "Nexia", - "requirements": ["nexia==0.9.1"], + "requirements": ["nexia==0.9.2"], "codeowners": ["@ryannazaretian", "@bdraco"], "documentation": "https://www.home-assistant.io/integrations/nexia", "config_flow": true diff --git a/requirements_all.txt b/requirements_all.txt index f25a7b25505d..5ca56644cef3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -924,7 +924,7 @@ netdisco==2.6.0 neurio==0.3.1 # homeassistant.components.nexia -nexia==0.9.1 +nexia==0.9.2 # homeassistant.components.nextcloud nextcloudmonitor==1.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index aa49dc935e7d..39ce1127659f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -359,7 +359,7 @@ nessclient==0.9.15 netdisco==2.6.0 # homeassistant.components.nexia -nexia==0.9.1 +nexia==0.9.2 # homeassistant.components.nsw_fuel_station nsw-fuel-api-client==1.0.10 From 55af2ab4dc5005e548540a5e580a9dd014c1ac3c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 17 Apr 2020 09:47:49 -0700 Subject: [PATCH 478/653] Add a script to clean the frontend translations (#34309) --- script/translations/clean.py | 46 +++++++++++++++++++++++++++++++----- script/translations/const.py | 1 + script/translations/util.py | 2 +- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/script/translations/clean.py b/script/translations/clean.py index 805000b2e929..7d8d127e64f3 100644 --- a/script/translations/clean.py +++ b/script/translations/clean.py @@ -1,8 +1,20 @@ """Find translation keys that are in Lokalise but no longer defined in source.""" +import argparse import json -from .const import INTEGRATIONS_DIR +from .const import CORE_PROJECT_ID, FRONTEND_DIR, FRONTEND_PROJECT_ID, INTEGRATIONS_DIR +from .error import ExitApp from .lokalise import get_api +from .util import get_base_arg_parser + + +def get_arguments() -> argparse.Namespace: + """Get parsed passed in arguments.""" + parser = get_base_arg_parser() + parser.add_argument( + "--target", type=str, default="core", choices=["core", "frontend"], + ) + return parser.parse_args() def find_extra(base, translations, path_prefix, missing_keys): @@ -19,8 +31,8 @@ def find_extra(base, translations, path_prefix, missing_keys): missing_keys.append(cur_path) -def find(): - """Find all missing keys.""" +def find_core(): + """Find all missing keys in core.""" missing_keys = [] for int_dir in INTEGRATIONS_DIR.iterdir(): @@ -41,16 +53,38 @@ def find(): return missing_keys +def find_frontend(): + """Find all missing keys in frontend.""" + if not FRONTEND_DIR.is_dir(): + raise ExitApp(f"Unable to find frontend at {FRONTEND_DIR}") + + source = FRONTEND_DIR / "src/translations/en.json" + translated = FRONTEND_DIR / "translations/en.json" + + missing_keys = [] + find_extra( + json.loads(source.read_text()), + json.loads(translated.read_text()), + "", + missing_keys, + ) + return missing_keys + + def run(): """Clean translations.""" - missing_keys = find() + args = get_arguments() + if args.target == "frontend": + missing_keys = find_frontend() + lokalise = get_api(FRONTEND_PROJECT_ID) + else: + missing_keys = find_core() + lokalise = get_api(CORE_PROJECT_ID) if not missing_keys: print("No missing translations!") return 0 - lokalise = get_api() - key_data = lokalise.keys_list( {"filter_keys": ",".join(missing_keys), "limit": 1000} ) diff --git a/script/translations/const.py b/script/translations/const.py index 3d9126610a39..ddb753ef1ca9 100644 --- a/script/translations/const.py +++ b/script/translations/const.py @@ -5,3 +5,4 @@ CORE_PROJECT_ID = "130246255a974bd3b5e8a1.51616605" FRONTEND_PROJECT_ID = "3420425759f6d6d241f598.13594006" DOCKER_IMAGE = "b8329d20280263cad04f65b843e54b9e8e6909a348a678eac959550b5ef5c75f" INTEGRATIONS_DIR = pathlib.Path("homeassistant/components") +FRONTEND_DIR = pathlib.Path("../frontend") diff --git a/script/translations/util.py b/script/translations/util.py index ad415481e8e5..2cc7dfff6891 100644 --- a/script/translations/util.py +++ b/script/translations/util.py @@ -7,7 +7,7 @@ import subprocess from .error import ExitApp -def get_base_arg_parser(): +def get_base_arg_parser() -> argparse.ArgumentParser: """Get a base argument parser.""" parser = argparse.ArgumentParser(description="Home Assistant Translations") parser.add_argument( From 813f8dd63fb4b2ef31094acfef40ff651d69839b Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Fri, 17 Apr 2020 18:48:36 +0200 Subject: [PATCH 479/653] Fix missing events for hue remotes (#34340) --- homeassistant/components/hue/hue_event.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/hue/hue_event.py b/homeassistant/components/hue/hue_event.py index a588f68ea4e6..d3d81a6a7af8 100644 --- a/homeassistant/components/hue/hue_event.py +++ b/homeassistant/components/hue/hue_event.py @@ -31,8 +31,8 @@ class HueEvent(GenericHueDevice): self.device_registry_id = None self.event_id = slugify(self.sensor.name) - # Use the 'lastupdated' string to detect new remote presses - self._last_updated = self.sensor.lastupdated + # Use the aiohue sensor 'state' dict to detect new remote presses + self._last_state = dict(self.sensor.state) # Register callback in coordinator and add job to remove it on bridge reset. self.bridge.reset_jobs.append( @@ -45,7 +45,7 @@ class HueEvent(GenericHueDevice): @callback def async_update_callback(self): """Fire the event if reason is that state is updated.""" - if self.sensor.lastupdated == self._last_updated: + if self.sensor.state == self._last_state: return # Extract the press code as state @@ -54,7 +54,7 @@ class HueEvent(GenericHueDevice): else: state = self.sensor.buttonevent - self._last_updated = self.sensor.lastupdated + self._last_state = dict(self.sensor.state) # Fire event data = { From 23f278e090641c2e33f3da5b12e8a7667c43c355 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 17 Apr 2020 11:59:27 -0500 Subject: [PATCH 480/653] Fix emulated_hue brightness off by one (#34185) * Fix emulated_hue brightness off by one Hue uses a max brightness of 254, Home Assistant uses a max brightness of 255. Values > 127 were off by one. * use constant * fix test * add debug * Revert "add debug" This reverts commit 242220a02e8d8e9ec5e21930470b2adb97c75e2b. --- .../components/emulated_hue/hue_api.py | 36 +++++++---- tests/components/emulated_hue/test_hue_api.py | 62 ++++++++++++++++--- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index ecb0241c724b..9637b0fb3718 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -367,7 +367,7 @@ class HueOneLightChangeView(HomeAssistantView): cover.DOMAIN, climate.DOMAIN, ]: - # Convert 0-255 to 0-100 + # Convert 0-254 to 0-100 level = (parsed[STATE_BRIGHTNESS] / HUE_API_STATE_BRI_MAX) * 100 parsed[STATE_BRIGHTNESS] = round(level) parsed[STATE_ON] = True @@ -390,7 +390,9 @@ class HueOneLightChangeView(HomeAssistantView): if parsed[STATE_ON]: if entity_features & SUPPORT_BRIGHTNESS: if parsed[STATE_BRIGHTNESS] is not None: - data[ATTR_BRIGHTNESS] = parsed[STATE_BRIGHTNESS] + data[ATTR_BRIGHTNESS] = hue_brightness_to_hass( + parsed[STATE_BRIGHTNESS] + ) if entity_features & SUPPORT_COLOR: if any((parsed[STATE_HUE], parsed[STATE_SATURATION])): @@ -536,7 +538,9 @@ def get_entity_state(config, entity): data[STATE_ON] = entity.state != STATE_OFF if data[STATE_ON]: - data[STATE_BRIGHTNESS] = entity.attributes.get(ATTR_BRIGHTNESS, 0) + data[STATE_BRIGHTNESS] = hass_to_hue_brightness( + entity.attributes.get(ATTR_BRIGHTNESS, 0) + ) hue_sat = entity.attributes.get(ATTR_HS_COLOR) if hue_sat is not None: hue = hue_sat[0] @@ -563,32 +567,32 @@ def get_entity_state(config, entity): pass elif entity.domain == climate.DOMAIN: temperature = entity.attributes.get(ATTR_TEMPERATURE, 0) - # Convert 0-100 to 0-255 - data[STATE_BRIGHTNESS] = round(temperature * 255 / 100) + # Convert 0-100 to 0-254 + data[STATE_BRIGHTNESS] = round(temperature * HUE_API_STATE_BRI_MAX / 100) elif entity.domain == media_player.DOMAIN: level = entity.attributes.get( ATTR_MEDIA_VOLUME_LEVEL, 1.0 if data[STATE_ON] else 0.0 ) - # Convert 0.0-1.0 to 0-255 - data[STATE_BRIGHTNESS] = round(min(1.0, level) * 255) + # Convert 0.0-1.0 to 0-254 + data[STATE_BRIGHTNESS] = round(min(1.0, level) * HUE_API_STATE_BRI_MAX) elif entity.domain == fan.DOMAIN: speed = entity.attributes.get(ATTR_SPEED, 0) - # Convert 0.0-1.0 to 0-255 + # Convert 0.0-1.0 to 0-254 data[STATE_BRIGHTNESS] = 0 if speed == SPEED_LOW: data[STATE_BRIGHTNESS] = 85 elif speed == SPEED_MEDIUM: data[STATE_BRIGHTNESS] = 170 elif speed == SPEED_HIGH: - data[STATE_BRIGHTNESS] = 255 + data[STATE_BRIGHTNESS] = HUE_API_STATE_BRI_MAX elif entity.domain == cover.DOMAIN: level = entity.attributes.get(ATTR_CURRENT_POSITION, 0) - data[STATE_BRIGHTNESS] = round(level / 100 * 255) + data[STATE_BRIGHTNESS] = round(level / 100 * HUE_API_STATE_BRI_MAX) else: data = cached_state # Make sure brightness is valid if data[STATE_BRIGHTNESS] is None: - data[STATE_BRIGHTNESS] = 255 if data[STATE_ON] else 0 + data[STATE_BRIGHTNESS] = HUE_API_STATE_BRI_MAX if data[STATE_ON] else 0 # Make sure hue/saturation are valid if (data[STATE_HUE] is None) or (data[STATE_SATURATION] is None): @@ -723,3 +727,13 @@ def create_list_of_entities(config, request): json_response[number] = entity_to_json(config, entity) return json_response + + +def hue_brightness_to_hass(value): + """Convert hue brightness 1..254 to hass format 0..255.""" + return min(255, round((value / HUE_API_STATE_BRI_MAX) * 255)) + + +def hass_to_hue_brightness(value): + """Convert hass brightness 0..255 to hue 1..254 scale.""" + return max(1, round((value / 255) * HUE_API_STATE_BRI_MAX)) diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index a6b4113e3140..052228e7aabf 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -384,7 +384,7 @@ async def test_get_light_state(hass_hue, hue_client): await perform_get_light_state(hue_client, "light.kitchen_lights", 401) -async def test_put_light_state(hass_hue, hue_client): +async def test_put_light_state(hass, hass_hue, hue_client): """Test the setting of light states.""" await perform_put_test_on_ceiling_lights(hass_hue, hue_client) @@ -400,6 +400,21 @@ async def test_put_light_state(hass_hue, hue_client): assert ceiling_lights.state == STATE_ON assert ceiling_lights.attributes[light.ATTR_BRIGHTNESS] == 153 + # update light state through api + await perform_put_light_state( + hass_hue, + hue_client, + "light.ceiling_lights", + True, + hue=4369, + saturation=127, + brightness=128, + ) + + assert ( + hass.states.get("light.ceiling_lights").attributes[light.ATTR_BRIGHTNESS] == 129 + ) + # update light state through api await perform_put_light_state( hass_hue, @@ -411,6 +426,10 @@ async def test_put_light_state(hass_hue, hue_client): brightness=123, ) + assert ( + hass.states.get("light.ceiling_lights").attributes[light.ATTR_BRIGHTNESS] == 123 + ) + # go through api to get the state back ceiling_json = await perform_get_light_state( hue_client, "light.ceiling_lights", 200 @@ -419,6 +438,25 @@ async def test_put_light_state(hass_hue, hue_client): assert ceiling_json["state"][HUE_API_STATE_HUE] == 4369 assert ceiling_json["state"][HUE_API_STATE_SAT] == 127 + # update light state through api + await perform_put_light_state( + hass_hue, + hue_client, + "light.ceiling_lights", + True, + hue=4369, + saturation=127, + brightness=255, + ) + + # go through api to get the state back + ceiling_json = await perform_get_light_state( + hue_client, "light.ceiling_lights", 200 + ) + assert ceiling_json["state"][HUE_API_STATE_BRI] == 254 + assert ceiling_json["state"][HUE_API_STATE_HUE] == 4369 + assert ceiling_json["state"][HUE_API_STATE_SAT] == 127 + # Go through the API to turn it off ceiling_result = await perform_put_light_state( hass_hue, hue_client, "light.ceiling_lights", False @@ -454,7 +492,7 @@ async def test_put_light_state(hass_hue, hue_client): assert kitchen_result.status == HTTP_NOT_FOUND -async def test_put_light_state_script(hass_hue, hue_client): +async def test_put_light_state_script(hass, hass_hue, hue_client): """Test the setting of script variables.""" # Turn the kitchen light off first await hass_hue.services.async_call( @@ -464,9 +502,9 @@ async def test_put_light_state_script(hass_hue, hue_client): blocking=True, ) - # Emulated hue converts 0-100% to 0-255. + # Emulated hue converts 0-100% to 0-254. level = 23 - brightness = round(level * 255 / 100) + brightness = round(level * 254 / 100) script_result = await perform_put_light_state( hass_hue, hue_client, "script.set_kitchen_light", True, brightness @@ -481,11 +519,15 @@ async def test_put_light_state_script(hass_hue, hue_client): assert kitchen_light.state == "on" assert kitchen_light.attributes[light.ATTR_BRIGHTNESS] == level + assert ( + hass.states.get("light.kitchen_lights").attributes[light.ATTR_BRIGHTNESS] == 23 + ) + async def test_put_light_state_climate_set_temperature(hass_hue, hue_client): """Test setting climate temperature.""" brightness = 19 - temperature = round(brightness / 255 * 100) + temperature = round(brightness / 254 * 100) hvac_result = await perform_put_light_state( hass_hue, hue_client, "climate.hvac", True, brightness @@ -517,9 +559,9 @@ async def test_put_light_state_media_player(hass_hue, hue_client): blocking=True, ) - # Emulated hue converts 0.0-1.0 to 0-255. + # Emulated hue converts 0.0-1.0 to 0-254. level = 0.25 - brightness = round(level * 255) + brightness = round(level * 254) mp_result = await perform_put_light_state( hass_hue, hue_client, "media_player.walkman", True, brightness @@ -602,7 +644,7 @@ async def test_set_position_cover(hass_hue, hue_client): assert cover_test.state == "closed" level = 20 - brightness = round(level / 100 * 255) + brightness = round(level / 100 * 254) # Go through the API to open cover_result = await perform_put_light_state( @@ -644,9 +686,9 @@ async def test_put_light_state_fan(hass_hue, hue_client): blocking=True, ) - # Emulated hue converts 0-100% to 0-255. + # Emulated hue converts 0-100% to 0-254. level = 43 - brightness = round(level * 255 / 100) + brightness = round(level * 254 / 100) fan_result = await perform_put_light_state( hass_hue, hue_client, "fan.living_room_fan", True, brightness From 1637a49442cec0a2359e6f7614cbddd7cd760275 Mon Sep 17 00:00:00 2001 From: Olivier B Date: Fri, 17 Apr 2020 20:08:09 +0200 Subject: [PATCH 481/653] Add trunk and frunk locks to Tesla integration (#34343) --- homeassistant/components/tesla/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/tesla/manifest.json b/homeassistant/components/tesla/manifest.json index ec100733a53a..3d21fbae9603 100644 --- a/homeassistant/components/tesla/manifest.json +++ b/homeassistant/components/tesla/manifest.json @@ -3,6 +3,6 @@ "name": "Tesla", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tesla", - "requirements": ["teslajsonpy==0.7.0"], + "requirements": ["teslajsonpy==0.8.0"], "codeowners": ["@zabuldon", "@alandtse"] } diff --git a/requirements_all.txt b/requirements_all.txt index 5ca56644cef3..4fb558c1c8d7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2022,7 +2022,7 @@ temperusb==1.5.3 tesla-powerwall==0.2.3 # homeassistant.components.tesla -teslajsonpy==0.7.0 +teslajsonpy==0.8.0 # homeassistant.components.thermoworks_smoke thermoworks_smoke==0.1.8 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 39ce1127659f..c4717c45c69c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -755,7 +755,7 @@ tellduslive==0.10.10 tesla-powerwall==0.2.3 # homeassistant.components.tesla -teslajsonpy==0.7.0 +teslajsonpy==0.8.0 # homeassistant.components.toon toonapilib==3.2.4 From f04be61f6f9ceb0e97cc7657bf6d429ab4eba767 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 17 Apr 2020 20:12:26 +0200 Subject: [PATCH 482/653] Bump zeroconf to 0.25.1 (#34341) --- 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 3171b8e953bc..241cf4432441 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.25.0"], + "requirements": ["zeroconf==0.25.1"], "dependencies": ["api"], "codeowners": ["@robbiet480", "@Kane610"], "quality_scale": "internal" diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index fa33b0315c7b..dc6197c8c85f 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -25,7 +25,7 @@ ruamel.yaml==0.15.100 sqlalchemy==1.3.16 voluptuous-serialize==2.3.0 voluptuous==0.11.7 -zeroconf==0.25.0 +zeroconf==0.25.1 pycryptodome>=3.6.6 diff --git a/requirements_all.txt b/requirements_all.txt index 4fb558c1c8d7..1d047db6c774 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2181,7 +2181,7 @@ youtube_dl==2020.03.24 zengge==0.2 # homeassistant.components.zeroconf -zeroconf==0.25.0 +zeroconf==0.25.1 # homeassistant.components.zha zha-quirks==0.0.38 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c4717c45c69c..7af679856330 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -818,7 +818,7 @@ ya_ma==0.3.8 yahooweather==0.10 # homeassistant.components.zeroconf -zeroconf==0.25.0 +zeroconf==0.25.1 # homeassistant.components.zha zha-quirks==0.0.38 From 267d98b5eb3620a2c29c3f1c225b078ef19dd635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Fri, 17 Apr 2020 21:33:58 +0300 Subject: [PATCH 483/653] Type hint improvements (#33082) --- homeassistant/core.py | 18 +++---- homeassistant/helpers/condition.py | 32 +++++------- homeassistant/helpers/discovery.py | 49 ++++++++++++++---- homeassistant/helpers/entity.py | 2 +- homeassistant/helpers/entity_component.py | 2 +- homeassistant/helpers/service.py | 60 +++++++++++++++++------ homeassistant/helpers/template.py | 26 +++++----- homeassistant/util/async_.py | 8 +-- 8 files changed, 124 insertions(+), 73 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 2553dbea74ea..c8c5fc4d4993 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -486,7 +486,7 @@ class Event: def __init__( self, event_type: str, - data: Optional[Dict] = None, + data: Optional[Dict[str, Any]] = None, origin: EventOrigin = EventOrigin.local, time_fired: Optional[int] = None, context: Optional[Context] = None, @@ -550,9 +550,7 @@ class EventBus: @property def listeners(self) -> Dict[str, int]: """Return dictionary with events and the number of listeners.""" - return run_callback_threadsafe( # type: ignore - self._hass.loop, self.async_listeners - ).result() + return run_callback_threadsafe(self._hass.loop, self.async_listeners).result() def fire( self, @@ -852,7 +850,7 @@ class StateMachine: future = run_callback_threadsafe( self._loop, self.async_entity_ids, domain_filter ) - return future.result() # type: ignore + return future.result() @callback def async_entity_ids(self, domain_filter: Optional[str] = None) -> List[str]: @@ -873,9 +871,7 @@ class StateMachine: def all(self) -> List[State]: """Create a list of all states.""" - return run_callback_threadsafe( # type: ignore - self._loop, self.async_all - ).result() + return run_callback_threadsafe(self._loop, self.async_all).result() @callback def async_all(self) -> List[State]: @@ -905,7 +901,7 @@ class StateMachine: Returns boolean to indicate if an entity was removed. """ - return run_callback_threadsafe( # type: ignore + return run_callback_threadsafe( self._loop, self.async_remove, entity_id ).result() @@ -1064,9 +1060,7 @@ class ServiceRegistry: @property def services(self) -> Dict[str, Dict[str, Service]]: """Return dictionary with per domain a list of available services.""" - return run_callback_threadsafe( # type: ignore - self._hass.loop, self.async_services - ).result() + return run_callback_threadsafe(self._hass.loop, self.async_services).result() @callback def async_services(self) -> Dict[str, Dict[str, Service]]: diff --git a/homeassistant/helpers/condition.py b/homeassistant/helpers/condition.py index 3500a3a4e3d7..363d33b14ea2 100644 --- a/homeassistant/helpers/condition.py +++ b/homeassistant/helpers/condition.py @@ -146,19 +146,16 @@ def numeric_state( variables: TemplateVarsType = None, ) -> bool: """Test a numeric state condition.""" - return cast( - bool, - run_callback_threadsafe( - hass.loop, - async_numeric_state, - hass, - entity, - below, - above, - value_template, - variables, - ).result(), - ) + return run_callback_threadsafe( + hass.loop, + async_numeric_state, + hass, + entity, + below, + above, + value_template, + variables, + ).result() def async_numeric_state( @@ -353,12 +350,9 @@ def template( hass: HomeAssistant, value_template: Template, variables: TemplateVarsType = None ) -> bool: """Test if template condition matches.""" - return cast( - bool, - run_callback_threadsafe( - hass.loop, async_template, hass, value_template, variables - ).result(), - ) + return run_callback_threadsafe( + hass.loop, async_template, hass, value_template, variables + ).result() def async_template( diff --git a/homeassistant/helpers/discovery.py b/homeassistant/helpers/discovery.py index ea20d8c9216a..11663672bb24 100644 --- a/homeassistant/helpers/discovery.py +++ b/homeassistant/helpers/discovery.py @@ -10,11 +10,10 @@ from typing import Any, Callable, Collection, Dict, Optional, Union from homeassistant import core, setup from homeassistant.const import ATTR_DISCOVERED, ATTR_SERVICE, EVENT_PLATFORM_DISCOVERED from homeassistant.exceptions import HomeAssistantError +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.loader import DEPENDENCY_BLACKLIST, bind_hass from homeassistant.util.async_ import run_callback_threadsafe -# mypy: allow-untyped-defs, no-check-untyped-defs - EVENT_LOAD_PLATFORM = "load_platform.{}" ATTR_PLATFORM = "platform" @@ -56,13 +55,29 @@ def async_listen( @bind_hass -def discover(hass, service, discovered, component, hass_config): +def discover( + hass: core.HomeAssistant, + service: str, + discovered: DiscoveryInfoType, + component: str, + hass_config: ConfigType, +) -> None: """Fire discovery event. Can ensure a component is loaded.""" - hass.add_job(async_discover(hass, service, discovered, component, hass_config)) + hass.add_job( + async_discover( # type: ignore + hass, service, discovered, component, hass_config + ) + ) @bind_hass -async def async_discover(hass, service, discovered, component, hass_config): +async def async_discover( + hass: core.HomeAssistant, + service: str, + discovered: Optional[DiscoveryInfoType], + component: Optional[str], + hass_config: ConfigType, +) -> None: """Fire discovery event. Can ensure a component is loaded.""" if component in DEPENDENCY_BLACKLIST: raise HomeAssistantError(f"Cannot discover the {component} component.") @@ -70,7 +85,7 @@ async def async_discover(hass, service, discovered, component, hass_config): if component is not None and component not in hass.config.components: await setup.async_setup_component(hass, component, hass_config) - data = {ATTR_SERVICE: service} + data: Dict[str, Any] = {ATTR_SERVICE: service} if discovered is not None: data[ATTR_DISCOVERED] = discovered @@ -117,7 +132,13 @@ def async_listen_platform( @bind_hass -def load_platform(hass, component, platform, discovered, hass_config): +def load_platform( + hass: core.HomeAssistant, + component: str, + platform: str, + discovered: DiscoveryInfoType, + hass_config: ConfigType, +) -> None: """Load a component and platform dynamically. Target components will be loaded and an EVENT_PLATFORM_DISCOVERED will be @@ -129,12 +150,20 @@ def load_platform(hass, component, platform, discovered, hass_config): Use `listen_platform` to register a callback for these events. """ hass.add_job( - async_load_platform(hass, component, platform, discovered, hass_config) + async_load_platform( # type: ignore + hass, component, platform, discovered, hass_config + ) ) @bind_hass -async def async_load_platform(hass, component, platform, discovered, hass_config): +async def async_load_platform( + hass: core.HomeAssistant, + component: str, + platform: str, + discovered: DiscoveryInfoType, + hass_config: ConfigType, +) -> None: """Load a component and platform dynamically. Target components will be loaded and an EVENT_PLATFORM_DISCOVERED will be @@ -164,7 +193,7 @@ async def async_load_platform(hass, component, platform, discovered, hass_config if not setup_success: return - data = { + data: Dict[str, Any] = { ATTR_SERVICE: EVENT_LOAD_PLATFORM.format(component), ATTR_PLATFORM: platform, } diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 7a3e1e8d52ad..738b49f4c543 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -35,7 +35,7 @@ from homeassistant.helpers.entity_registry import ( from homeassistant.util import dt as dt_util, ensure_unique_string, slugify from homeassistant.util.async_ import run_callback_threadsafe -# mypy: allow-untyped-defs, no-check-untyped-defs, no-warn-return-any +# mypy: allow-untyped-defs, no-check-untyped-defs _LOGGER = logging.getLogger(__name__) SLOW_UPDATE_WARNING = 10 diff --git a/homeassistant/helpers/entity_component.py b/homeassistant/helpers/entity_component.py index 76c2cb9889e4..4c30457b62c2 100644 --- a/homeassistant/helpers/entity_component.py +++ b/homeassistant/helpers/entity_component.py @@ -191,7 +191,7 @@ class EntityComponent: This method must be run in the event loop. """ - return await service.async_extract_entities( # type: ignore + return await service.async_extract_entities( self.hass, self.entities, service_call, expand_group ) diff --git a/homeassistant/helpers/service.py b/homeassistant/helpers/service.py index 7a352b4e8d14..77c436d212e7 100644 --- a/homeassistant/helpers/service.py +++ b/homeassistant/helpers/service.py @@ -2,7 +2,7 @@ import asyncio from functools import partial, wraps import logging -from typing import Callable +from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Tuple import voluptuous as vol @@ -22,9 +22,10 @@ from homeassistant.exceptions import ( Unauthorized, UnknownUser, ) -from homeassistant.helpers import template, typing +from homeassistant.helpers import template import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.typing import HomeAssistantType +from homeassistant.helpers.entity import Entity +from homeassistant.helpers.typing import ConfigType, HomeAssistantType, TemplateVarsType from homeassistant.loader import async_get_integration, bind_hass from homeassistant.util.yaml import load_yaml from homeassistant.util.yaml.loader import JSON_TYPE @@ -42,8 +43,12 @@ SERVICE_DESCRIPTION_CACHE = "service_description_cache" @bind_hass def call_from_config( - hass, config, blocking=False, variables=None, validate_config=True -): + hass: HomeAssistantType, + config: ConfigType, + blocking: bool = False, + variables: TemplateVarsType = None, + validate_config: bool = True, +) -> None: """Call a service based on a config hash.""" asyncio.run_coroutine_threadsafe( async_call_from_config(hass, config, blocking, variables, validate_config), @@ -53,8 +58,13 @@ def call_from_config( @bind_hass async def async_call_from_config( - hass, config, blocking=False, variables=None, validate_config=True, context=None -): + hass: HomeAssistantType, + config: ConfigType, + blocking: bool = False, + variables: TemplateVarsType = None, + validate_config: bool = True, + context: Optional[ha.Context] = None, +) -> None: """Call a service based on a config hash.""" try: parms = async_prepare_call_from_config(hass, config, variables, validate_config) @@ -68,7 +78,12 @@ async def async_call_from_config( @ha.callback @bind_hass -def async_prepare_call_from_config(hass, config, variables=None, validate_config=False): +def async_prepare_call_from_config( + hass: HomeAssistantType, + config: ConfigType, + variables: TemplateVarsType = None, + validate_config: bool = False, +) -> Tuple[str, str, Dict[str, Any]]: """Prepare to call a service based on a config hash.""" if validate_config: try: @@ -113,7 +128,9 @@ def async_prepare_call_from_config(hass, config, variables=None, validate_config @bind_hass -def extract_entity_ids(hass, service_call, expand_group=True): +def extract_entity_ids( + hass: HomeAssistantType, service_call: ha.ServiceCall, expand_group: bool = True +) -> Set[str]: """Extract a list of entity ids from a service call. Will convert group entity ids to the entity ids it represents. @@ -124,7 +141,12 @@ def extract_entity_ids(hass, service_call, expand_group=True): @bind_hass -async def async_extract_entities(hass, entities, service_call, expand_group=True): +async def async_extract_entities( + hass: HomeAssistantType, + entities: Iterable[Entity], + service_call: ha.ServiceCall, + expand_group: bool = True, +) -> List[Entity]: """Extract a list of entity objects from a service call. Will convert group entity ids to the entity ids it represents. @@ -158,7 +180,9 @@ async def async_extract_entities(hass, entities, service_call, expand_group=True @bind_hass -async def async_extract_entity_ids(hass, service_call, expand_group=True): +async def async_extract_entity_ids( + hass: HomeAssistantType, service_call: ha.ServiceCall, expand_group: bool = True +) -> Set[str]: """Extract a list of entity ids from a service call. Will convert group entity ids to the entity ids it represents. @@ -166,7 +190,7 @@ async def async_extract_entity_ids(hass, service_call, expand_group=True): entity_ids = service_call.data.get(ATTR_ENTITY_ID) area_ids = service_call.data.get(ATTR_AREA_ID) - extracted = set() + extracted: Set[str] = set() if entity_ids in (None, ENTITY_MATCH_NONE) and area_ids in ( None, @@ -226,7 +250,9 @@ async def _load_services_file(hass: HomeAssistantType, domain: str) -> JSON_TYPE @bind_hass -async def async_get_all_descriptions(hass): +async def async_get_all_descriptions( + hass: HomeAssistantType, +) -> Dict[str, Dict[str, Any]]: """Return descriptions (i.e. user documentation) for all service calls.""" descriptions_cache = hass.data.setdefault(SERVICE_DESCRIPTION_CACHE, {}) format_cache_key = "{}.{}".format @@ -253,7 +279,7 @@ async def async_get_all_descriptions(hass): loaded[domain] = content # Build response - descriptions = {} + descriptions: Dict[str, Dict[str, Any]] = {} for domain in services: descriptions[domain] = {} @@ -281,7 +307,9 @@ async def async_get_all_descriptions(hass): @ha.callback @bind_hass -def async_set_service_schema(hass, domain, service, schema): +def async_set_service_schema( + hass: HomeAssistantType, domain: str, service: str, schema: Dict[str, Any] +) -> None: """Register a description for a service.""" hass.data.setdefault(SERVICE_DESCRIPTION_CACHE, {}) @@ -454,7 +482,7 @@ async def _handle_entity_call(hass, entity, func, data, context): @bind_hass @ha.callback def async_register_admin_service( - hass: typing.HomeAssistantType, + hass: HomeAssistantType, domain: str, service: str, service_func: Callable, diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index b6c59604b74d..06bbf10a8ea9 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -51,7 +51,7 @@ _RE_JINJA_DELIMITERS = re.compile(r"\{%|\{\{") @bind_hass -def attach(hass, obj): +def attach(hass: HomeAssistantType, obj: Any) -> None: """Recursively attach hass to all template instances in list and dict.""" if isinstance(obj, list): for child in obj: @@ -63,7 +63,7 @@ def attach(hass, obj): obj.hass = hass -def render_complex(value, variables=None): +def render_complex(value: Any, variables: TemplateVarsType = None) -> Any: """Recursive template creator helper function.""" if isinstance(value, list): return [render_complex(item, variables) for item in value] @@ -307,11 +307,11 @@ class Template: and self.hass == other.hass ) - def __hash__(self): + def __hash__(self) -> int: """Hash code for template.""" return hash(self.template) - def __repr__(self): + def __repr__(self) -> str: """Representation of Template.""" return 'Template("' + self.template + '")' @@ -333,7 +333,7 @@ class AllStates: raise TemplateError(f"Invalid domain name '{name}'") return DomainStates(self._hass, name) - def _collect_all(self): + def _collect_all(self) -> None: render_info = self._hass.data.get(_RENDER_INFO) if render_info is not None: # pylint: disable=protected-access @@ -349,7 +349,7 @@ class AllStates: ) ) - def __len__(self): + def __len__(self) -> int: """Return number of states.""" self._collect_all() return len(self._hass.states.async_entity_ids()) @@ -359,7 +359,7 @@ class AllStates: state = _get_state(self._hass, entity_id) return STATE_UNKNOWN if state is None else state.state - def __repr__(self): + def __repr__(self) -> str: """Representation of All States.""" return "